From 7e9a987422da6b39323b6948c77b8a5f1fe2f5da Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 4 Oct 2016 14:44:15 +0200 Subject: [PATCH 001/461] Add ability to load a specific PSL section The `PublicSuffixListManager` class is updated to enable its `getList` method to return a `PublicSuffixList` object containing a specific section of the PSL To avoid BC break, the following constants are added to the class: - `PublicSuffixListManager::ICANN_SECTION` to load the ICANN section - `PublicSuffixListManager::ICANN_PSL_PHP_FILE` to cache the ICANN section - `PublicSuffixListManager::PRIVATE_SECTION` to load the PRIVATE section - `PublicSuffixListManager::PRIVATE_PSL_PHP_FILE` to cache the PRIVATE section An optional parameter is added to `PublicSuffixListManager::getList` to enable loading a specific section. To avoild BC break if an invalid section name is provided the method will return the full list. The method `PublicSuffixListManager::refreshPublicSuffixList` is updated to manage creating and updating each section cache list. --- data/icann-public-suffix-list.php | 21983 ++++++++++++++++ data/private-public-suffix-list.php | 2778 ++ data/public-suffix-list.php | 816 +- data/public-suffix-list.txt | 870 +- src/Pdp/PublicSuffixListManager.php | 132 +- tests/src/Pdp/PublicSuffixListManagerTest.php | 16 + 6 files changed, 26265 insertions(+), 330 deletions(-) create mode 100644 data/icann-public-suffix-list.php create mode 100644 data/private-public-suffix-list.php diff --git a/data/icann-public-suffix-list.php b/data/icann-public-suffix-list.php new file mode 100644 index 00000000..a6f119f7 --- /dev/null +++ b/data/icann-public-suffix-list.php @@ -0,0 +1,21983 @@ + + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'net' => + array ( + ), + 'mil' => + array ( + ), + 'org' => + array ( + ), + ), + 'ad' => + array ( + 'nom' => + array ( + ), + ), + 'ae' => + array ( + 'co' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'sch' => + array ( + ), + 'ac' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => + array ( + ), + ), + 'aero' => + array ( + 'accident-investigation' => + array ( + ), + 'accident-prevention' => + array ( + ), + 'aerobatic' => + array ( + ), + 'aeroclub' => + array ( + ), + 'aerodrome' => + array ( + ), + 'agents' => + array ( + ), + 'aircraft' => + array ( + ), + 'airline' => + array ( + ), + 'airport' => + array ( + ), + 'air-surveillance' => + array ( + ), + 'airtraffic' => + array ( + ), + 'air-traffic-control' => + array ( + ), + 'ambulance' => + array ( + ), + 'amusement' => + array ( + ), + 'association' => + array ( + ), + 'author' => + array ( + ), + 'ballooning' => + array ( + ), + 'broker' => + array ( + ), + 'caa' => + array ( + ), + 'cargo' => + array ( + ), + 'catering' => + array ( + ), + 'certification' => + array ( + ), + 'championship' => + array ( + ), + 'charter' => + array ( + ), + 'civilaviation' => + array ( + ), + 'club' => + array ( + ), + 'conference' => + array ( + ), + 'consultant' => + array ( + ), + 'consulting' => + array ( + ), + 'control' => + array ( + ), + 'council' => + array ( + ), + 'crew' => + array ( + ), + 'design' => + array ( + ), + 'dgca' => + array ( + ), + 'educator' => + array ( + ), + 'emergency' => + array ( + ), + 'engine' => + array ( + ), + 'engineer' => + array ( + ), + 'entertainment' => + array ( + ), + 'equipment' => + array ( + ), + 'exchange' => + array ( + ), + 'express' => + array ( + ), + 'federation' => + array ( + ), + 'flight' => + array ( + ), + 'freight' => + array ( + ), + 'fuel' => + array ( + ), + 'gliding' => + array ( + ), + 'government' => + array ( + ), + 'groundhandling' => + array ( + ), + 'group' => + array ( + ), + 'hanggliding' => + array ( + ), + 'homebuilt' => + array ( + ), + 'insurance' => + array ( + ), + 'journal' => + array ( + ), + 'journalist' => + array ( + ), + 'leasing' => + array ( + ), + 'logistics' => + array ( + ), + 'magazine' => + array ( + ), + 'maintenance' => + array ( + ), + 'media' => + array ( + ), + 'microlight' => + array ( + ), + 'modelling' => + array ( + ), + 'navigation' => + array ( + ), + 'parachuting' => + array ( + ), + 'paragliding' => + array ( + ), + 'passenger-association' => + array ( + ), + 'pilot' => + array ( + ), + 'press' => + array ( + ), + 'production' => + array ( + ), + 'recreation' => + array ( + ), + 'repbody' => + array ( + ), + 'res' => + array ( + ), + 'research' => + array ( + ), + 'rotorcraft' => + array ( + ), + 'safety' => + array ( + ), + 'scientist' => + array ( + ), + 'services' => + array ( + ), + 'show' => + array ( + ), + 'skydiving' => + array ( + ), + 'software' => + array ( + ), + 'student' => + array ( + ), + 'trader' => + array ( + ), + 'trading' => + array ( + ), + 'trainer' => + array ( + ), + 'union' => + array ( + ), + 'workinggroup' => + array ( + ), + 'works' => + array ( + ), + ), + 'af' => + array ( + 'gov' => + array ( + ), + 'com' => + array ( + ), + 'org' => + array ( + ), + 'net' => + array ( + ), + 'edu' => + array ( + ), + ), + 'ag' => + array ( + 'com' => + array ( + ), + 'org' => + array ( + ), + 'net' => + array ( + ), + 'co' => + array ( + ), + 'nom' => + array ( + ), + ), + 'ai' => + array ( + 'off' => + array ( + ), + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'al' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'am' => + array ( + ), + 'ao' => + array ( + 'ed' => + array ( + ), + 'gv' => + array ( + ), + 'og' => + array ( + ), + 'co' => + array ( + ), + 'pb' => + array ( + ), + 'it' => + array ( + ), + ), + 'aq' => + array ( + ), + 'ar' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gob' => + array ( + ), + 'gov' => + array ( + ), + 'int' => + array ( + ), + 'mil' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'tur' => + array ( + ), + ), + 'arpa' => + array ( + 'e164' => + array ( + ), + 'in-addr' => + array ( + ), + 'ip6' => + array ( + ), + 'iris' => + array ( + ), + 'uri' => + array ( + ), + 'urn' => + array ( + ), + ), + 'as' => + array ( + 'gov' => + array ( + ), + ), + 'asia' => + array ( + ), + 'at' => + array ( + 'ac' => + array ( + ), + 'co' => + array ( + ), + 'gv' => + array ( + ), + 'or' => + array ( + ), + ), + 'au' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'edu' => + array ( + 'act' => + array ( + ), + 'nsw' => + array ( + ), + 'nt' => + array ( + ), + 'qld' => + array ( + ), + 'sa' => + array ( + ), + 'tas' => + array ( + ), + 'vic' => + array ( + ), + 'wa' => + array ( + ), + ), + 'gov' => + array ( + 'qld' => + array ( + ), + 'sa' => + array ( + ), + 'tas' => + array ( + ), + 'vic' => + array ( + ), + 'wa' => + array ( + ), + ), + 'asn' => + array ( + ), + 'id' => + array ( + ), + 'info' => + array ( + ), + 'conf' => + array ( + ), + 'oz' => + array ( + ), + 'act' => + array ( + ), + 'nsw' => + array ( + ), + 'nt' => + array ( + ), + 'qld' => + array ( + ), + 'sa' => + array ( + ), + 'tas' => + array ( + ), + 'vic' => + array ( + ), + 'wa' => + array ( + ), + ), + 'aw' => + array ( + 'com' => + array ( + ), + ), + 'ax' => + array ( + ), + 'az' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'int' => + array ( + ), + 'gov' => + array ( + ), + 'org' => + array ( + ), + 'edu' => + array ( + ), + 'info' => + array ( + ), + 'pp' => + array ( + ), + 'mil' => + array ( + ), + 'name' => + array ( + ), + 'pro' => + array ( + ), + 'biz' => + array ( + ), + ), + 'ba' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'bb' => + array ( + 'biz' => + array ( + ), + 'co' => + array ( + ), + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'info' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'store' => + array ( + ), + 'tv' => + array ( + ), + ), + 'bd' => + array ( + '*' => + array ( + ), + ), + 'be' => + array ( + 'ac' => + array ( + ), + ), + 'bf' => + array ( + 'gov' => + array ( + ), + ), + 'bg' => + array ( + 'a' => + array ( + ), + 'b' => + array ( + ), + 'c' => + array ( + ), + 'd' => + array ( + ), + 'e' => + array ( + ), + 'f' => + array ( + ), + 'g' => + array ( + ), + 'h' => + array ( + ), + 'i' => + array ( + ), + 'j' => + array ( + ), + 'k' => + array ( + ), + 'l' => + array ( + ), + 'm' => + array ( + ), + 'n' => + array ( + ), + 'o' => + array ( + ), + 'p' => + array ( + ), + 'q' => + array ( + ), + 'r' => + array ( + ), + 's' => + array ( + ), + 't' => + array ( + ), + 'u' => + array ( + ), + 'v' => + array ( + ), + 'w' => + array ( + ), + 'x' => + array ( + ), + 'y' => + array ( + ), + 'z' => + array ( + ), + 0 => + array ( + ), + 1 => + array ( + ), + 2 => + array ( + ), + 3 => + array ( + ), + 4 => + array ( + ), + 5 => + array ( + ), + 6 => + array ( + ), + 7 => + array ( + ), + 8 => + array ( + ), + 9 => + array ( + ), + ), + 'bh' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'gov' => + array ( + ), + ), + 'bi' => + array ( + 'co' => + array ( + ), + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'or' => + array ( + ), + 'org' => + array ( + ), + ), + 'biz' => + array ( + ), + 'bj' => + array ( + 'asso' => + array ( + ), + 'barreau' => + array ( + ), + 'gouv' => + array ( + ), + ), + 'bm' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'bn' => + array ( + '*' => + array ( + ), + ), + 'bo' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'gob' => + array ( + ), + 'int' => + array ( + ), + 'org' => + array ( + ), + 'net' => + array ( + ), + 'mil' => + array ( + ), + 'tv' => + array ( + ), + ), + 'br' => + array ( + 'adm' => + array ( + ), + 'adv' => + array ( + ), + 'agr' => + array ( + ), + 'am' => + array ( + ), + 'arq' => + array ( + ), + 'art' => + array ( + ), + 'ato' => + array ( + ), + 'b' => + array ( + ), + 'bio' => + array ( + ), + 'blog' => + array ( + ), + 'bmd' => + array ( + ), + 'cim' => + array ( + ), + 'cng' => + array ( + ), + 'cnt' => + array ( + ), + 'com' => + array ( + ), + 'coop' => + array ( + ), + 'ecn' => + array ( + ), + 'eco' => + array ( + ), + 'edu' => + array ( + ), + 'emp' => + array ( + ), + 'eng' => + array ( + ), + 'esp' => + array ( + ), + 'etc' => + array ( + ), + 'eti' => + array ( + ), + 'far' => + array ( + ), + 'flog' => + array ( + ), + 'fm' => + array ( + ), + 'fnd' => + array ( + ), + 'fot' => + array ( + ), + 'fst' => + array ( + ), + 'g12' => + array ( + ), + 'ggf' => + array ( + ), + 'gov' => + array ( + ), + 'imb' => + array ( + ), + 'ind' => + array ( + ), + 'inf' => + array ( + ), + 'jor' => + array ( + ), + 'jus' => + array ( + ), + 'leg' => + array ( + ), + 'lel' => + array ( + ), + 'mat' => + array ( + ), + 'med' => + array ( + ), + 'mil' => + array ( + ), + 'mp' => + array ( + ), + 'mus' => + array ( + ), + 'net' => + array ( + ), + 'nom' => + array ( + '*' => + array ( + ), + ), + 'not' => + array ( + ), + 'ntr' => + array ( + ), + 'odo' => + array ( + ), + 'org' => + array ( + ), + 'ppg' => + array ( + ), + 'pro' => + array ( + ), + 'psc' => + array ( + ), + 'psi' => + array ( + ), + 'qsl' => + array ( + ), + 'radio' => + array ( + ), + 'rec' => + array ( + ), + 'slg' => + array ( + ), + 'srv' => + array ( + ), + 'taxi' => + array ( + ), + 'teo' => + array ( + ), + 'tmp' => + array ( + ), + 'trd' => + array ( + ), + 'tur' => + array ( + ), + 'tv' => + array ( + ), + 'vet' => + array ( + ), + 'vlog' => + array ( + ), + 'wiki' => + array ( + ), + 'zlg' => + array ( + ), + ), + 'bs' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + ), + 'bt' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'bv' => + array ( + ), + 'bw' => + array ( + 'co' => + array ( + ), + 'org' => + array ( + ), + ), + 'by' => + array ( + 'gov' => + array ( + ), + 'mil' => + array ( + ), + 'com' => + array ( + ), + 'of' => + array ( + ), + ), + 'bz' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + ), + 'ca' => + array ( + 'ab' => + array ( + ), + 'bc' => + array ( + ), + 'mb' => + array ( + ), + 'nb' => + array ( + ), + 'nf' => + array ( + ), + 'nl' => + array ( + ), + 'ns' => + array ( + ), + 'nt' => + array ( + ), + 'nu' => + array ( + ), + 'on' => + array ( + ), + 'pe' => + array ( + ), + 'qc' => + array ( + ), + 'sk' => + array ( + ), + 'yk' => + array ( + ), + 'gc' => + array ( + ), + ), + 'cat' => + array ( + ), + 'cc' => + array ( + ), + 'cd' => + array ( + 'gov' => + array ( + ), + ), + 'cf' => + array ( + ), + 'cg' => + array ( + ), + 'ch' => + array ( + ), + 'ci' => + array ( + 'org' => + array ( + ), + 'or' => + array ( + ), + 'com' => + array ( + ), + 'co' => + array ( + ), + 'edu' => + array ( + ), + 'ed' => + array ( + ), + 'ac' => + array ( + ), + 'net' => + array ( + ), + 'go' => + array ( + ), + 'asso' => + array ( + ), + 'xn--aroport-bya' => + array ( + ), + 'int' => + array ( + ), + 'presse' => + array ( + ), + 'md' => + array ( + ), + 'gouv' => + array ( + ), + ), + 'ck' => + array ( + '*' => + array ( + ), + 'www' => + array ( + '!' => '', + ), + ), + 'cl' => + array ( + 'gov' => + array ( + ), + 'gob' => + array ( + ), + 'co' => + array ( + ), + 'mil' => + array ( + ), + ), + 'cm' => + array ( + 'co' => + array ( + ), + 'com' => + array ( + ), + 'gov' => + array ( + ), + 'net' => + array ( + ), + ), + 'cn' => + array ( + 'ac' => + array ( + ), + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'mil' => + array ( + ), + 'xn--55qx5d' => + array ( + ), + 'xn--io0a7i' => + array ( + ), + 'xn--od0alg' => + array ( + ), + 'ah' => + array ( + ), + 'bj' => + array ( + ), + 'cq' => + array ( + ), + 'fj' => + array ( + ), + 'gd' => + array ( + ), + 'gs' => + array ( + ), + 'gz' => + array ( + ), + 'gx' => + array ( + ), + 'ha' => + array ( + ), + 'hb' => + array ( + ), + 'he' => + array ( + ), + 'hi' => + array ( + ), + 'hl' => + array ( + ), + 'hn' => + array ( + ), + 'jl' => + array ( + ), + 'js' => + array ( + ), + 'jx' => + array ( + ), + 'ln' => + array ( + ), + 'nm' => + array ( + ), + 'nx' => + array ( + ), + 'qh' => + array ( + ), + 'sc' => + array ( + ), + 'sd' => + array ( + ), + 'sh' => + array ( + ), + 'sn' => + array ( + ), + 'sx' => + array ( + ), + 'tj' => + array ( + ), + 'xj' => + array ( + ), + 'xz' => + array ( + ), + 'yn' => + array ( + ), + 'zj' => + array ( + ), + 'hk' => + array ( + ), + 'mo' => + array ( + ), + 'tw' => + array ( + ), + ), + 'co' => + array ( + 'arts' => + array ( + ), + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'firm' => + array ( + ), + 'gov' => + array ( + ), + 'info' => + array ( + ), + 'int' => + array ( + ), + 'mil' => + array ( + ), + 'net' => + array ( + ), + 'nom' => + array ( + ), + 'org' => + array ( + ), + 'rec' => + array ( + ), + 'web' => + array ( + ), + ), + 'com' => + array ( + ), + 'coop' => + array ( + ), + 'cr' => + array ( + 'ac' => + array ( + ), + 'co' => + array ( + ), + 'ed' => + array ( + ), + 'fi' => + array ( + ), + 'go' => + array ( + ), + 'or' => + array ( + ), + 'sa' => + array ( + ), + ), + 'cu' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'org' => + array ( + ), + 'net' => + array ( + ), + 'gov' => + array ( + ), + 'inf' => + array ( + ), + ), + 'cv' => + array ( + ), + 'cw' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'cx' => + array ( + 'gov' => + array ( + ), + ), + 'cy' => + array ( + 'ac' => + array ( + ), + 'biz' => + array ( + ), + 'com' => + array ( + ), + 'ekloges' => + array ( + ), + 'gov' => + array ( + ), + 'ltd' => + array ( + ), + 'name' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'parliament' => + array ( + ), + 'press' => + array ( + ), + 'pro' => + array ( + ), + 'tm' => + array ( + ), + ), + 'cz' => + array ( + ), + 'de' => + array ( + ), + 'dj' => + array ( + ), + 'dk' => + array ( + ), + 'dm' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + ), + 'do' => + array ( + 'art' => + array ( + ), + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gob' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'sld' => + array ( + ), + 'web' => + array ( + ), + ), + 'dz' => + array ( + 'com' => + array ( + ), + 'org' => + array ( + ), + 'net' => + array ( + ), + 'gov' => + array ( + ), + 'edu' => + array ( + ), + 'asso' => + array ( + ), + 'pol' => + array ( + ), + 'art' => + array ( + ), + ), + 'ec' => + array ( + 'com' => + array ( + ), + 'info' => + array ( + ), + 'net' => + array ( + ), + 'fin' => + array ( + ), + 'k12' => + array ( + ), + 'med' => + array ( + ), + 'pro' => + array ( + ), + 'org' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'gob' => + array ( + ), + 'mil' => + array ( + ), + ), + 'edu' => + array ( + ), + 'ee' => + array ( + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'riik' => + array ( + ), + 'lib' => + array ( + ), + 'med' => + array ( + ), + 'com' => + array ( + ), + 'pri' => + array ( + ), + 'aip' => + array ( + ), + 'org' => + array ( + ), + 'fie' => + array ( + ), + ), + 'eg' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'eun' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => + array ( + ), + 'name' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'sci' => + array ( + ), + ), + 'er' => + array ( + '*' => + array ( + ), + ), + 'es' => + array ( + 'com' => + array ( + ), + 'nom' => + array ( + ), + 'org' => + array ( + ), + 'gob' => + array ( + ), + 'edu' => + array ( + ), + ), + 'et' => + array ( + 'com' => + array ( + ), + 'gov' => + array ( + ), + 'org' => + array ( + ), + 'edu' => + array ( + ), + 'biz' => + array ( + ), + 'name' => + array ( + ), + 'info' => + array ( + ), + 'net' => + array ( + ), + ), + 'eu' => + array ( + ), + 'fi' => + array ( + 'aland' => + array ( + ), + ), + 'fj' => + array ( + '*' => + array ( + ), + ), + 'fk' => + array ( + '*' => + array ( + ), + ), + 'fm' => + array ( + ), + 'fo' => + array ( + ), + 'fr' => + array ( + 'com' => + array ( + ), + 'asso' => + array ( + ), + 'nom' => + array ( + ), + 'prd' => + array ( + ), + 'presse' => + array ( + ), + 'tm' => + array ( + ), + 'aeroport' => + array ( + ), + 'assedic' => + array ( + ), + 'avocat' => + array ( + ), + 'avoues' => + array ( + ), + 'cci' => + array ( + ), + 'chambagri' => + array ( + ), + 'chirurgiens-dentistes' => + array ( + ), + 'experts-comptables' => + array ( + ), + 'geometre-expert' => + array ( + ), + 'gouv' => + array ( + ), + 'greta' => + array ( + ), + 'huissier-justice' => + array ( + ), + 'medecin' => + array ( + ), + 'notaires' => + array ( + ), + 'pharmacien' => + array ( + ), + 'port' => + array ( + ), + 'veterinaire' => + array ( + ), + ), + 'ga' => + array ( + ), + 'gb' => + array ( + ), + 'gd' => + array ( + ), + 'ge' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'org' => + array ( + ), + 'mil' => + array ( + ), + 'net' => + array ( + ), + 'pvt' => + array ( + ), + ), + 'gf' => + array ( + ), + 'gg' => + array ( + 'co' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'gh' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'org' => + array ( + ), + 'mil' => + array ( + ), + ), + 'gi' => + array ( + 'com' => + array ( + ), + 'ltd' => + array ( + ), + 'gov' => + array ( + ), + 'mod' => + array ( + ), + 'edu' => + array ( + ), + 'org' => + array ( + ), + ), + 'gl' => + array ( + 'co' => + array ( + ), + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'gm' => + array ( + ), + 'gn' => + array ( + 'ac' => + array ( + ), + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'org' => + array ( + ), + 'net' => + array ( + ), + ), + 'gov' => + array ( + ), + 'gp' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'mobi' => + array ( + ), + 'edu' => + array ( + ), + 'org' => + array ( + ), + 'asso' => + array ( + ), + ), + 'gq' => + array ( + ), + 'gr' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'gov' => + array ( + ), + ), + 'gs' => + array ( + ), + 'gt' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gob' => + array ( + ), + 'ind' => + array ( + ), + 'mil' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'gu' => + array ( + '*' => + array ( + ), + ), + 'gw' => + array ( + ), + 'gy' => + array ( + 'co' => + array ( + ), + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'hk' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'idv' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'xn--55qx5d' => + array ( + ), + 'xn--wcvs22d' => + array ( + ), + 'xn--lcvr32d' => + array ( + ), + 'xn--mxtq1m' => + array ( + ), + 'xn--gmqw5a' => + array ( + ), + 'xn--ciqpn' => + array ( + ), + 'xn--gmq050i' => + array ( + ), + 'xn--zf0avx' => + array ( + ), + 'xn--io0a7i' => + array ( + ), + 'xn--mk0axi' => + array ( + ), + 'xn--od0alg' => + array ( + ), + 'xn--od0aq3b' => + array ( + ), + 'xn--tn0ag' => + array ( + ), + 'xn--uc0atv' => + array ( + ), + 'xn--uc0ay4a' => + array ( + ), + ), + 'hm' => + array ( + ), + 'hn' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'org' => + array ( + ), + 'net' => + array ( + ), + 'mil' => + array ( + ), + 'gob' => + array ( + ), + ), + 'hr' => + array ( + 'iz' => + array ( + ), + 'from' => + array ( + ), + 'name' => + array ( + ), + 'com' => + array ( + ), + ), + 'ht' => + array ( + 'com' => + array ( + ), + 'shop' => + array ( + ), + 'firm' => + array ( + ), + 'info' => + array ( + ), + 'adult' => + array ( + ), + 'net' => + array ( + ), + 'pro' => + array ( + ), + 'org' => + array ( + ), + 'med' => + array ( + ), + 'art' => + array ( + ), + 'coop' => + array ( + ), + 'pol' => + array ( + ), + 'asso' => + array ( + ), + 'edu' => + array ( + ), + 'rel' => + array ( + ), + 'gouv' => + array ( + ), + 'perso' => + array ( + ), + ), + 'hu' => + array ( + 'co' => + array ( + ), + 'info' => + array ( + ), + 'org' => + array ( + ), + 'priv' => + array ( + ), + 'sport' => + array ( + ), + 'tm' => + array ( + ), + 2000 => + array ( + ), + 'agrar' => + array ( + ), + 'bolt' => + array ( + ), + 'casino' => + array ( + ), + 'city' => + array ( + ), + 'erotica' => + array ( + ), + 'erotika' => + array ( + ), + 'film' => + array ( + ), + 'forum' => + array ( + ), + 'games' => + array ( + ), + 'hotel' => + array ( + ), + 'ingatlan' => + array ( + ), + 'jogasz' => + array ( + ), + 'konyvelo' => + array ( + ), + 'lakas' => + array ( + ), + 'media' => + array ( + ), + 'news' => + array ( + ), + 'reklam' => + array ( + ), + 'sex' => + array ( + ), + 'shop' => + array ( + ), + 'suli' => + array ( + ), + 'szex' => + array ( + ), + 'tozsde' => + array ( + ), + 'utazas' => + array ( + ), + 'video' => + array ( + ), + ), + 'id' => + array ( + 'ac' => + array ( + ), + 'biz' => + array ( + ), + 'co' => + array ( + ), + 'desa' => + array ( + ), + 'go' => + array ( + ), + 'mil' => + array ( + ), + 'my' => + array ( + ), + 'net' => + array ( + ), + 'or' => + array ( + ), + 'sch' => + array ( + ), + 'web' => + array ( + ), + ), + 'ie' => + array ( + 'gov' => + array ( + ), + ), + 'il' => + array ( + 'ac' => + array ( + ), + 'co' => + array ( + ), + 'gov' => + array ( + ), + 'idf' => + array ( + ), + 'k12' => + array ( + ), + 'muni' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'im' => + array ( + 'ac' => + array ( + ), + 'co' => + array ( + 'ltd' => + array ( + ), + 'plc' => + array ( + ), + ), + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'tt' => + array ( + ), + 'tv' => + array ( + ), + ), + 'in' => + array ( + 'co' => + array ( + ), + 'firm' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'gen' => + array ( + ), + 'ind' => + array ( + ), + 'nic' => + array ( + ), + 'ac' => + array ( + ), + 'edu' => + array ( + ), + 'res' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => + array ( + ), + ), + 'info' => + array ( + ), + 'int' => + array ( + 'eu' => + array ( + ), + ), + 'io' => + array ( + 'com' => + array ( + ), + ), + 'iq' => + array ( + 'gov' => + array ( + ), + 'edu' => + array ( + ), + 'mil' => + array ( + ), + 'com' => + array ( + ), + 'org' => + array ( + ), + 'net' => + array ( + ), + ), + 'ir' => + array ( + 'ac' => + array ( + ), + 'co' => + array ( + ), + 'gov' => + array ( + ), + 'id' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'sch' => + array ( + ), + 'xn--mgba3a4f16a' => + array ( + ), + 'xn--mgba3a4fra' => + array ( + ), + ), + 'is' => + array ( + 'net' => + array ( + ), + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'org' => + array ( + ), + 'int' => + array ( + ), + ), + 'it' => + array ( + 'gov' => + array ( + ), + 'edu' => + array ( + ), + 'abr' => + array ( + ), + 'abruzzo' => + array ( + ), + 'aosta-valley' => + array ( + ), + 'aostavalley' => + array ( + ), + 'bas' => + array ( + ), + 'basilicata' => + array ( + ), + 'cal' => + array ( + ), + 'calabria' => + array ( + ), + 'cam' => + array ( + ), + 'campania' => + array ( + ), + 'emilia-romagna' => + array ( + ), + 'emiliaromagna' => + array ( + ), + 'emr' => + array ( + ), + 'friuli-v-giulia' => + array ( + ), + 'friuli-ve-giulia' => + array ( + ), + 'friuli-vegiulia' => + array ( + ), + 'friuli-venezia-giulia' => + array ( + ), + 'friuli-veneziagiulia' => + array ( + ), + 'friuli-vgiulia' => + array ( + ), + 'friuliv-giulia' => + array ( + ), + 'friulive-giulia' => + array ( + ), + 'friulivegiulia' => + array ( + ), + 'friulivenezia-giulia' => + array ( + ), + 'friuliveneziagiulia' => + array ( + ), + 'friulivgiulia' => + array ( + ), + 'fvg' => + array ( + ), + 'laz' => + array ( + ), + 'lazio' => + array ( + ), + 'lig' => + array ( + ), + 'liguria' => + array ( + ), + 'lom' => + array ( + ), + 'lombardia' => + array ( + ), + 'lombardy' => + array ( + ), + 'lucania' => + array ( + ), + 'mar' => + array ( + ), + 'marche' => + array ( + ), + 'mol' => + array ( + ), + 'molise' => + array ( + ), + 'piedmont' => + array ( + ), + 'piemonte' => + array ( + ), + 'pmn' => + array ( + ), + 'pug' => + array ( + ), + 'puglia' => + array ( + ), + 'sar' => + array ( + ), + 'sardegna' => + array ( + ), + 'sardinia' => + array ( + ), + 'sic' => + array ( + ), + 'sicilia' => + array ( + ), + 'sicily' => + array ( + ), + 'taa' => + array ( + ), + 'tos' => + array ( + ), + 'toscana' => + array ( + ), + 'trentino-a-adige' => + array ( + ), + 'trentino-aadige' => + array ( + ), + 'trentino-alto-adige' => + array ( + ), + 'trentino-altoadige' => + array ( + ), + 'trentino-s-tirol' => + array ( + ), + 'trentino-stirol' => + array ( + ), + 'trentino-sud-tirol' => + array ( + ), + 'trentino-sudtirol' => + array ( + ), + 'trentino-sued-tirol' => + array ( + ), + 'trentino-suedtirol' => + array ( + ), + 'trentinoa-adige' => + array ( + ), + 'trentinoaadige' => + array ( + ), + 'trentinoalto-adige' => + array ( + ), + 'trentinoaltoadige' => + array ( + ), + 'trentinos-tirol' => + array ( + ), + 'trentinostirol' => + array ( + ), + 'trentinosud-tirol' => + array ( + ), + 'trentinosudtirol' => + array ( + ), + 'trentinosued-tirol' => + array ( + ), + 'trentinosuedtirol' => + array ( + ), + 'tuscany' => + array ( + ), + 'umb' => + array ( + ), + 'umbria' => + array ( + ), + 'val-d-aosta' => + array ( + ), + 'val-daosta' => + array ( + ), + 'vald-aosta' => + array ( + ), + 'valdaosta' => + array ( + ), + 'valle-aosta' => + array ( + ), + 'valle-d-aosta' => + array ( + ), + 'valle-daosta' => + array ( + ), + 'valleaosta' => + array ( + ), + 'valled-aosta' => + array ( + ), + 'valledaosta' => + array ( + ), + 'vallee-aoste' => + array ( + ), + 'valleeaoste' => + array ( + ), + 'vao' => + array ( + ), + 'vda' => + array ( + ), + 'ven' => + array ( + ), + 'veneto' => + array ( + ), + 'ag' => + array ( + ), + 'agrigento' => + array ( + ), + 'al' => + array ( + ), + 'alessandria' => + array ( + ), + 'alto-adige' => + array ( + ), + 'altoadige' => + array ( + ), + 'an' => + array ( + ), + 'ancona' => + array ( + ), + 'andria-barletta-trani' => + array ( + ), + 'andria-trani-barletta' => + array ( + ), + 'andriabarlettatrani' => + array ( + ), + 'andriatranibarletta' => + array ( + ), + 'ao' => + array ( + ), + 'aosta' => + array ( + ), + 'aoste' => + array ( + ), + 'ap' => + array ( + ), + 'aq' => + array ( + ), + 'aquila' => + array ( + ), + 'ar' => + array ( + ), + 'arezzo' => + array ( + ), + 'ascoli-piceno' => + array ( + ), + 'ascolipiceno' => + array ( + ), + 'asti' => + array ( + ), + 'at' => + array ( + ), + 'av' => + array ( + ), + 'avellino' => + array ( + ), + 'ba' => + array ( + ), + 'balsan' => + array ( + ), + 'bari' => + array ( + ), + 'barletta-trani-andria' => + array ( + ), + 'barlettatraniandria' => + array ( + ), + 'belluno' => + array ( + ), + 'benevento' => + array ( + ), + 'bergamo' => + array ( + ), + 'bg' => + array ( + ), + 'bi' => + array ( + ), + 'biella' => + array ( + ), + 'bl' => + array ( + ), + 'bn' => + array ( + ), + 'bo' => + array ( + ), + 'bologna' => + array ( + ), + 'bolzano' => + array ( + ), + 'bozen' => + array ( + ), + 'br' => + array ( + ), + 'brescia' => + array ( + ), + 'brindisi' => + array ( + ), + 'bs' => + array ( + ), + 'bt' => + array ( + ), + 'bz' => + array ( + ), + 'ca' => + array ( + ), + 'cagliari' => + array ( + ), + 'caltanissetta' => + array ( + ), + 'campidano-medio' => + array ( + ), + 'campidanomedio' => + array ( + ), + 'campobasso' => + array ( + ), + 'carbonia-iglesias' => + array ( + ), + 'carboniaiglesias' => + array ( + ), + 'carrara-massa' => + array ( + ), + 'carraramassa' => + array ( + ), + 'caserta' => + array ( + ), + 'catania' => + array ( + ), + 'catanzaro' => + array ( + ), + 'cb' => + array ( + ), + 'ce' => + array ( + ), + 'cesena-forli' => + array ( + ), + 'cesenaforli' => + array ( + ), + 'ch' => + array ( + ), + 'chieti' => + array ( + ), + 'ci' => + array ( + ), + 'cl' => + array ( + ), + 'cn' => + array ( + ), + 'co' => + array ( + ), + 'como' => + array ( + ), + 'cosenza' => + array ( + ), + 'cr' => + array ( + ), + 'cremona' => + array ( + ), + 'crotone' => + array ( + ), + 'cs' => + array ( + ), + 'ct' => + array ( + ), + 'cuneo' => + array ( + ), + 'cz' => + array ( + ), + 'dell-ogliastra' => + array ( + ), + 'dellogliastra' => + array ( + ), + 'en' => + array ( + ), + 'enna' => + array ( + ), + 'fc' => + array ( + ), + 'fe' => + array ( + ), + 'fermo' => + array ( + ), + 'ferrara' => + array ( + ), + 'fg' => + array ( + ), + 'fi' => + array ( + ), + 'firenze' => + array ( + ), + 'florence' => + array ( + ), + 'fm' => + array ( + ), + 'foggia' => + array ( + ), + 'forli-cesena' => + array ( + ), + 'forlicesena' => + array ( + ), + 'fr' => + array ( + ), + 'frosinone' => + array ( + ), + 'ge' => + array ( + ), + 'genoa' => + array ( + ), + 'genova' => + array ( + ), + 'go' => + array ( + ), + 'gorizia' => + array ( + ), + 'gr' => + array ( + ), + 'grosseto' => + array ( + ), + 'iglesias-carbonia' => + array ( + ), + 'iglesiascarbonia' => + array ( + ), + 'im' => + array ( + ), + 'imperia' => + array ( + ), + 'is' => + array ( + ), + 'isernia' => + array ( + ), + 'kr' => + array ( + ), + 'la-spezia' => + array ( + ), + 'laquila' => + array ( + ), + 'laspezia' => + array ( + ), + 'latina' => + array ( + ), + 'lc' => + array ( + ), + 'le' => + array ( + ), + 'lecce' => + array ( + ), + 'lecco' => + array ( + ), + 'li' => + array ( + ), + 'livorno' => + array ( + ), + 'lo' => + array ( + ), + 'lodi' => + array ( + ), + 'lt' => + array ( + ), + 'lu' => + array ( + ), + 'lucca' => + array ( + ), + 'macerata' => + array ( + ), + 'mantova' => + array ( + ), + 'massa-carrara' => + array ( + ), + 'massacarrara' => + array ( + ), + 'matera' => + array ( + ), + 'mb' => + array ( + ), + 'mc' => + array ( + ), + 'me' => + array ( + ), + 'medio-campidano' => + array ( + ), + 'mediocampidano' => + array ( + ), + 'messina' => + array ( + ), + 'mi' => + array ( + ), + 'milan' => + array ( + ), + 'milano' => + array ( + ), + 'mn' => + array ( + ), + 'mo' => + array ( + ), + 'modena' => + array ( + ), + 'monza-brianza' => + array ( + ), + 'monza-e-della-brianza' => + array ( + ), + 'monza' => + array ( + ), + 'monzabrianza' => + array ( + ), + 'monzaebrianza' => + array ( + ), + 'monzaedellabrianza' => + array ( + ), + 'ms' => + array ( + ), + 'mt' => + array ( + ), + 'na' => + array ( + ), + 'naples' => + array ( + ), + 'napoli' => + array ( + ), + 'no' => + array ( + ), + 'novara' => + array ( + ), + 'nu' => + array ( + ), + 'nuoro' => + array ( + ), + 'og' => + array ( + ), + 'ogliastra' => + array ( + ), + 'olbia-tempio' => + array ( + ), + 'olbiatempio' => + array ( + ), + 'or' => + array ( + ), + 'oristano' => + array ( + ), + 'ot' => + array ( + ), + 'pa' => + array ( + ), + 'padova' => + array ( + ), + 'padua' => + array ( + ), + 'palermo' => + array ( + ), + 'parma' => + array ( + ), + 'pavia' => + array ( + ), + 'pc' => + array ( + ), + 'pd' => + array ( + ), + 'pe' => + array ( + ), + 'perugia' => + array ( + ), + 'pesaro-urbino' => + array ( + ), + 'pesarourbino' => + array ( + ), + 'pescara' => + array ( + ), + 'pg' => + array ( + ), + 'pi' => + array ( + ), + 'piacenza' => + array ( + ), + 'pisa' => + array ( + ), + 'pistoia' => + array ( + ), + 'pn' => + array ( + ), + 'po' => + array ( + ), + 'pordenone' => + array ( + ), + 'potenza' => + array ( + ), + 'pr' => + array ( + ), + 'prato' => + array ( + ), + 'pt' => + array ( + ), + 'pu' => + array ( + ), + 'pv' => + array ( + ), + 'pz' => + array ( + ), + 'ra' => + array ( + ), + 'ragusa' => + array ( + ), + 'ravenna' => + array ( + ), + 'rc' => + array ( + ), + 're' => + array ( + ), + 'reggio-calabria' => + array ( + ), + 'reggio-emilia' => + array ( + ), + 'reggiocalabria' => + array ( + ), + 'reggioemilia' => + array ( + ), + 'rg' => + array ( + ), + 'ri' => + array ( + ), + 'rieti' => + array ( + ), + 'rimini' => + array ( + ), + 'rm' => + array ( + ), + 'rn' => + array ( + ), + 'ro' => + array ( + ), + 'roma' => + array ( + ), + 'rome' => + array ( + ), + 'rovigo' => + array ( + ), + 'sa' => + array ( + ), + 'salerno' => + array ( + ), + 'sassari' => + array ( + ), + 'savona' => + array ( + ), + 'si' => + array ( + ), + 'siena' => + array ( + ), + 'siracusa' => + array ( + ), + 'so' => + array ( + ), + 'sondrio' => + array ( + ), + 'sp' => + array ( + ), + 'sr' => + array ( + ), + 'ss' => + array ( + ), + 'suedtirol' => + array ( + ), + 'sv' => + array ( + ), + 'ta' => + array ( + ), + 'taranto' => + array ( + ), + 'te' => + array ( + ), + 'tempio-olbia' => + array ( + ), + 'tempioolbia' => + array ( + ), + 'teramo' => + array ( + ), + 'terni' => + array ( + ), + 'tn' => + array ( + ), + 'to' => + array ( + ), + 'torino' => + array ( + ), + 'tp' => + array ( + ), + 'tr' => + array ( + ), + 'trani-andria-barletta' => + array ( + ), + 'trani-barletta-andria' => + array ( + ), + 'traniandriabarletta' => + array ( + ), + 'tranibarlettaandria' => + array ( + ), + 'trapani' => + array ( + ), + 'trentino' => + array ( + ), + 'trento' => + array ( + ), + 'treviso' => + array ( + ), + 'trieste' => + array ( + ), + 'ts' => + array ( + ), + 'turin' => + array ( + ), + 'tv' => + array ( + ), + 'ud' => + array ( + ), + 'udine' => + array ( + ), + 'urbino-pesaro' => + array ( + ), + 'urbinopesaro' => + array ( + ), + 'va' => + array ( + ), + 'varese' => + array ( + ), + 'vb' => + array ( + ), + 'vc' => + array ( + ), + 've' => + array ( + ), + 'venezia' => + array ( + ), + 'venice' => + array ( + ), + 'verbania' => + array ( + ), + 'vercelli' => + array ( + ), + 'verona' => + array ( + ), + 'vi' => + array ( + ), + 'vibo-valentia' => + array ( + ), + 'vibovalentia' => + array ( + ), + 'vicenza' => + array ( + ), + 'viterbo' => + array ( + ), + 'vr' => + array ( + ), + 'vs' => + array ( + ), + 'vt' => + array ( + ), + 'vv' => + array ( + ), + ), + 'je' => + array ( + 'co' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'jm' => + array ( + '*' => + array ( + ), + ), + 'jo' => + array ( + 'com' => + array ( + ), + 'org' => + array ( + ), + 'net' => + array ( + ), + 'edu' => + array ( + ), + 'sch' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => + array ( + ), + 'name' => + array ( + ), + ), + 'jobs' => + array ( + ), + 'jp' => + array ( + 'ac' => + array ( + ), + 'ad' => + array ( + ), + 'co' => + array ( + ), + 'ed' => + array ( + ), + 'go' => + array ( + ), + 'gr' => + array ( + ), + 'lg' => + array ( + ), + 'ne' => + array ( + ), + 'or' => + array ( + ), + 'aichi' => + array ( + 'aisai' => + array ( + ), + 'ama' => + array ( + ), + 'anjo' => + array ( + ), + 'asuke' => + array ( + ), + 'chiryu' => + array ( + ), + 'chita' => + array ( + ), + 'fuso' => + array ( + ), + 'gamagori' => + array ( + ), + 'handa' => + array ( + ), + 'hazu' => + array ( + ), + 'hekinan' => + array ( + ), + 'higashiura' => + array ( + ), + 'ichinomiya' => + array ( + ), + 'inazawa' => + array ( + ), + 'inuyama' => + array ( + ), + 'isshiki' => + array ( + ), + 'iwakura' => + array ( + ), + 'kanie' => + array ( + ), + 'kariya' => + array ( + ), + 'kasugai' => + array ( + ), + 'kira' => + array ( + ), + 'kiyosu' => + array ( + ), + 'komaki' => + array ( + ), + 'konan' => + array ( + ), + 'kota' => + array ( + ), + 'mihama' => + array ( + ), + 'miyoshi' => + array ( + ), + 'nishio' => + array ( + ), + 'nisshin' => + array ( + ), + 'obu' => + array ( + ), + 'oguchi' => + array ( + ), + 'oharu' => + array ( + ), + 'okazaki' => + array ( + ), + 'owariasahi' => + array ( + ), + 'seto' => + array ( + ), + 'shikatsu' => + array ( + ), + 'shinshiro' => + array ( + ), + 'shitara' => + array ( + ), + 'tahara' => + array ( + ), + 'takahama' => + array ( + ), + 'tobishima' => + array ( + ), + 'toei' => + array ( + ), + 'togo' => + array ( + ), + 'tokai' => + array ( + ), + 'tokoname' => + array ( + ), + 'toyoake' => + array ( + ), + 'toyohashi' => + array ( + ), + 'toyokawa' => + array ( + ), + 'toyone' => + array ( + ), + 'toyota' => + array ( + ), + 'tsushima' => + array ( + ), + 'yatomi' => + array ( + ), + ), + 'akita' => + array ( + 'akita' => + array ( + ), + 'daisen' => + array ( + ), + 'fujisato' => + array ( + ), + 'gojome' => + array ( + ), + 'hachirogata' => + array ( + ), + 'happou' => + array ( + ), + 'higashinaruse' => + array ( + ), + 'honjo' => + array ( + ), + 'honjyo' => + array ( + ), + 'ikawa' => + array ( + ), + 'kamikoani' => + array ( + ), + 'kamioka' => + array ( + ), + 'katagami' => + array ( + ), + 'kazuno' => + array ( + ), + 'kitaakita' => + array ( + ), + 'kosaka' => + array ( + ), + 'kyowa' => + array ( + ), + 'misato' => + array ( + ), + 'mitane' => + array ( + ), + 'moriyoshi' => + array ( + ), + 'nikaho' => + array ( + ), + 'noshiro' => + array ( + ), + 'odate' => + array ( + ), + 'oga' => + array ( + ), + 'ogata' => + array ( + ), + 'semboku' => + array ( + ), + 'yokote' => + array ( + ), + 'yurihonjo' => + array ( + ), + ), + 'aomori' => + array ( + 'aomori' => + array ( + ), + 'gonohe' => + array ( + ), + 'hachinohe' => + array ( + ), + 'hashikami' => + array ( + ), + 'hiranai' => + array ( + ), + 'hirosaki' => + array ( + ), + 'itayanagi' => + array ( + ), + 'kuroishi' => + array ( + ), + 'misawa' => + array ( + ), + 'mutsu' => + array ( + ), + 'nakadomari' => + array ( + ), + 'noheji' => + array ( + ), + 'oirase' => + array ( + ), + 'owani' => + array ( + ), + 'rokunohe' => + array ( + ), + 'sannohe' => + array ( + ), + 'shichinohe' => + array ( + ), + 'shingo' => + array ( + ), + 'takko' => + array ( + ), + 'towada' => + array ( + ), + 'tsugaru' => + array ( + ), + 'tsuruta' => + array ( + ), + ), + 'chiba' => + array ( + 'abiko' => + array ( + ), + 'asahi' => + array ( + ), + 'chonan' => + array ( + ), + 'chosei' => + array ( + ), + 'choshi' => + array ( + ), + 'chuo' => + array ( + ), + 'funabashi' => + array ( + ), + 'futtsu' => + array ( + ), + 'hanamigawa' => + array ( + ), + 'ichihara' => + array ( + ), + 'ichikawa' => + array ( + ), + 'ichinomiya' => + array ( + ), + 'inzai' => + array ( + ), + 'isumi' => + array ( + ), + 'kamagaya' => + array ( + ), + 'kamogawa' => + array ( + ), + 'kashiwa' => + array ( + ), + 'katori' => + array ( + ), + 'katsuura' => + array ( + ), + 'kimitsu' => + array ( + ), + 'kisarazu' => + array ( + ), + 'kozaki' => + array ( + ), + 'kujukuri' => + array ( + ), + 'kyonan' => + array ( + ), + 'matsudo' => + array ( + ), + 'midori' => + array ( + ), + 'mihama' => + array ( + ), + 'minamiboso' => + array ( + ), + 'mobara' => + array ( + ), + 'mutsuzawa' => + array ( + ), + 'nagara' => + array ( + ), + 'nagareyama' => + array ( + ), + 'narashino' => + array ( + ), + 'narita' => + array ( + ), + 'noda' => + array ( + ), + 'oamishirasato' => + array ( + ), + 'omigawa' => + array ( + ), + 'onjuku' => + array ( + ), + 'otaki' => + array ( + ), + 'sakae' => + array ( + ), + 'sakura' => + array ( + ), + 'shimofusa' => + array ( + ), + 'shirako' => + array ( + ), + 'shiroi' => + array ( + ), + 'shisui' => + array ( + ), + 'sodegaura' => + array ( + ), + 'sosa' => + array ( + ), + 'tako' => + array ( + ), + 'tateyama' => + array ( + ), + 'togane' => + array ( + ), + 'tohnosho' => + array ( + ), + 'tomisato' => + array ( + ), + 'urayasu' => + array ( + ), + 'yachimata' => + array ( + ), + 'yachiyo' => + array ( + ), + 'yokaichiba' => + array ( + ), + 'yokoshibahikari' => + array ( + ), + 'yotsukaido' => + array ( + ), + ), + 'ehime' => + array ( + 'ainan' => + array ( + ), + 'honai' => + array ( + ), + 'ikata' => + array ( + ), + 'imabari' => + array ( + ), + 'iyo' => + array ( + ), + 'kamijima' => + array ( + ), + 'kihoku' => + array ( + ), + 'kumakogen' => + array ( + ), + 'masaki' => + array ( + ), + 'matsuno' => + array ( + ), + 'matsuyama' => + array ( + ), + 'namikata' => + array ( + ), + 'niihama' => + array ( + ), + 'ozu' => + array ( + ), + 'saijo' => + array ( + ), + 'seiyo' => + array ( + ), + 'shikokuchuo' => + array ( + ), + 'tobe' => + array ( + ), + 'toon' => + array ( + ), + 'uchiko' => + array ( + ), + 'uwajima' => + array ( + ), + 'yawatahama' => + array ( + ), + ), + 'fukui' => + array ( + 'echizen' => + array ( + ), + 'eiheiji' => + array ( + ), + 'fukui' => + array ( + ), + 'ikeda' => + array ( + ), + 'katsuyama' => + array ( + ), + 'mihama' => + array ( + ), + 'minamiechizen' => + array ( + ), + 'obama' => + array ( + ), + 'ohi' => + array ( + ), + 'ono' => + array ( + ), + 'sabae' => + array ( + ), + 'sakai' => + array ( + ), + 'takahama' => + array ( + ), + 'tsuruga' => + array ( + ), + 'wakasa' => + array ( + ), + ), + 'fukuoka' => + array ( + 'ashiya' => + array ( + ), + 'buzen' => + array ( + ), + 'chikugo' => + array ( + ), + 'chikuho' => + array ( + ), + 'chikujo' => + array ( + ), + 'chikushino' => + array ( + ), + 'chikuzen' => + array ( + ), + 'chuo' => + array ( + ), + 'dazaifu' => + array ( + ), + 'fukuchi' => + array ( + ), + 'hakata' => + array ( + ), + 'higashi' => + array ( + ), + 'hirokawa' => + array ( + ), + 'hisayama' => + array ( + ), + 'iizuka' => + array ( + ), + 'inatsuki' => + array ( + ), + 'kaho' => + array ( + ), + 'kasuga' => + array ( + ), + 'kasuya' => + array ( + ), + 'kawara' => + array ( + ), + 'keisen' => + array ( + ), + 'koga' => + array ( + ), + 'kurate' => + array ( + ), + 'kurogi' => + array ( + ), + 'kurume' => + array ( + ), + 'minami' => + array ( + ), + 'miyako' => + array ( + ), + 'miyama' => + array ( + ), + 'miyawaka' => + array ( + ), + 'mizumaki' => + array ( + ), + 'munakata' => + array ( + ), + 'nakagawa' => + array ( + ), + 'nakama' => + array ( + ), + 'nishi' => + array ( + ), + 'nogata' => + array ( + ), + 'ogori' => + array ( + ), + 'okagaki' => + array ( + ), + 'okawa' => + array ( + ), + 'oki' => + array ( + ), + 'omuta' => + array ( + ), + 'onga' => + array ( + ), + 'onojo' => + array ( + ), + 'oto' => + array ( + ), + 'saigawa' => + array ( + ), + 'sasaguri' => + array ( + ), + 'shingu' => + array ( + ), + 'shinyoshitomi' => + array ( + ), + 'shonai' => + array ( + ), + 'soeda' => + array ( + ), + 'sue' => + array ( + ), + 'tachiarai' => + array ( + ), + 'tagawa' => + array ( + ), + 'takata' => + array ( + ), + 'toho' => + array ( + ), + 'toyotsu' => + array ( + ), + 'tsuiki' => + array ( + ), + 'ukiha' => + array ( + ), + 'umi' => + array ( + ), + 'usui' => + array ( + ), + 'yamada' => + array ( + ), + 'yame' => + array ( + ), + 'yanagawa' => + array ( + ), + 'yukuhashi' => + array ( + ), + ), + 'fukushima' => + array ( + 'aizubange' => + array ( + ), + 'aizumisato' => + array ( + ), + 'aizuwakamatsu' => + array ( + ), + 'asakawa' => + array ( + ), + 'bandai' => + array ( + ), + 'date' => + array ( + ), + 'fukushima' => + array ( + ), + 'furudono' => + array ( + ), + 'futaba' => + array ( + ), + 'hanawa' => + array ( + ), + 'higashi' => + array ( + ), + 'hirata' => + array ( + ), + 'hirono' => + array ( + ), + 'iitate' => + array ( + ), + 'inawashiro' => + array ( + ), + 'ishikawa' => + array ( + ), + 'iwaki' => + array ( + ), + 'izumizaki' => + array ( + ), + 'kagamiishi' => + array ( + ), + 'kaneyama' => + array ( + ), + 'kawamata' => + array ( + ), + 'kitakata' => + array ( + ), + 'kitashiobara' => + array ( + ), + 'koori' => + array ( + ), + 'koriyama' => + array ( + ), + 'kunimi' => + array ( + ), + 'miharu' => + array ( + ), + 'mishima' => + array ( + ), + 'namie' => + array ( + ), + 'nango' => + array ( + ), + 'nishiaizu' => + array ( + ), + 'nishigo' => + array ( + ), + 'okuma' => + array ( + ), + 'omotego' => + array ( + ), + 'ono' => + array ( + ), + 'otama' => + array ( + ), + 'samegawa' => + array ( + ), + 'shimogo' => + array ( + ), + 'shirakawa' => + array ( + ), + 'showa' => + array ( + ), + 'soma' => + array ( + ), + 'sukagawa' => + array ( + ), + 'taishin' => + array ( + ), + 'tamakawa' => + array ( + ), + 'tanagura' => + array ( + ), + 'tenei' => + array ( + ), + 'yabuki' => + array ( + ), + 'yamato' => + array ( + ), + 'yamatsuri' => + array ( + ), + 'yanaizu' => + array ( + ), + 'yugawa' => + array ( + ), + ), + 'gifu' => + array ( + 'anpachi' => + array ( + ), + 'ena' => + array ( + ), + 'gifu' => + array ( + ), + 'ginan' => + array ( + ), + 'godo' => + array ( + ), + 'gujo' => + array ( + ), + 'hashima' => + array ( + ), + 'hichiso' => + array ( + ), + 'hida' => + array ( + ), + 'higashishirakawa' => + array ( + ), + 'ibigawa' => + array ( + ), + 'ikeda' => + array ( + ), + 'kakamigahara' => + array ( + ), + 'kani' => + array ( + ), + 'kasahara' => + array ( + ), + 'kasamatsu' => + array ( + ), + 'kawaue' => + array ( + ), + 'kitagata' => + array ( + ), + 'mino' => + array ( + ), + 'minokamo' => + array ( + ), + 'mitake' => + array ( + ), + 'mizunami' => + array ( + ), + 'motosu' => + array ( + ), + 'nakatsugawa' => + array ( + ), + 'ogaki' => + array ( + ), + 'sakahogi' => + array ( + ), + 'seki' => + array ( + ), + 'sekigahara' => + array ( + ), + 'shirakawa' => + array ( + ), + 'tajimi' => + array ( + ), + 'takayama' => + array ( + ), + 'tarui' => + array ( + ), + 'toki' => + array ( + ), + 'tomika' => + array ( + ), + 'wanouchi' => + array ( + ), + 'yamagata' => + array ( + ), + 'yaotsu' => + array ( + ), + 'yoro' => + array ( + ), + ), + 'gunma' => + array ( + 'annaka' => + array ( + ), + 'chiyoda' => + array ( + ), + 'fujioka' => + array ( + ), + 'higashiagatsuma' => + array ( + ), + 'isesaki' => + array ( + ), + 'itakura' => + array ( + ), + 'kanna' => + array ( + ), + 'kanra' => + array ( + ), + 'katashina' => + array ( + ), + 'kawaba' => + array ( + ), + 'kiryu' => + array ( + ), + 'kusatsu' => + array ( + ), + 'maebashi' => + array ( + ), + 'meiwa' => + array ( + ), + 'midori' => + array ( + ), + 'minakami' => + array ( + ), + 'naganohara' => + array ( + ), + 'nakanojo' => + array ( + ), + 'nanmoku' => + array ( + ), + 'numata' => + array ( + ), + 'oizumi' => + array ( + ), + 'ora' => + array ( + ), + 'ota' => + array ( + ), + 'shibukawa' => + array ( + ), + 'shimonita' => + array ( + ), + 'shinto' => + array ( + ), + 'showa' => + array ( + ), + 'takasaki' => + array ( + ), + 'takayama' => + array ( + ), + 'tamamura' => + array ( + ), + 'tatebayashi' => + array ( + ), + 'tomioka' => + array ( + ), + 'tsukiyono' => + array ( + ), + 'tsumagoi' => + array ( + ), + 'ueno' => + array ( + ), + 'yoshioka' => + array ( + ), + ), + 'hiroshima' => + array ( + 'asaminami' => + array ( + ), + 'daiwa' => + array ( + ), + 'etajima' => + array ( + ), + 'fuchu' => + array ( + ), + 'fukuyama' => + array ( + ), + 'hatsukaichi' => + array ( + ), + 'higashihiroshima' => + array ( + ), + 'hongo' => + array ( + ), + 'jinsekikogen' => + array ( + ), + 'kaita' => + array ( + ), + 'kui' => + array ( + ), + 'kumano' => + array ( + ), + 'kure' => + array ( + ), + 'mihara' => + array ( + ), + 'miyoshi' => + array ( + ), + 'naka' => + array ( + ), + 'onomichi' => + array ( + ), + 'osakikamijima' => + array ( + ), + 'otake' => + array ( + ), + 'saka' => + array ( + ), + 'sera' => + array ( + ), + 'seranishi' => + array ( + ), + 'shinichi' => + array ( + ), + 'shobara' => + array ( + ), + 'takehara' => + array ( + ), + ), + 'hokkaido' => + array ( + 'abashiri' => + array ( + ), + 'abira' => + array ( + ), + 'aibetsu' => + array ( + ), + 'akabira' => + array ( + ), + 'akkeshi' => + array ( + ), + 'asahikawa' => + array ( + ), + 'ashibetsu' => + array ( + ), + 'ashoro' => + array ( + ), + 'assabu' => + array ( + ), + 'atsuma' => + array ( + ), + 'bibai' => + array ( + ), + 'biei' => + array ( + ), + 'bifuka' => + array ( + ), + 'bihoro' => + array ( + ), + 'biratori' => + array ( + ), + 'chippubetsu' => + array ( + ), + 'chitose' => + array ( + ), + 'date' => + array ( + ), + 'ebetsu' => + array ( + ), + 'embetsu' => + array ( + ), + 'eniwa' => + array ( + ), + 'erimo' => + array ( + ), + 'esan' => + array ( + ), + 'esashi' => + array ( + ), + 'fukagawa' => + array ( + ), + 'fukushima' => + array ( + ), + 'furano' => + array ( + ), + 'furubira' => + array ( + ), + 'haboro' => + array ( + ), + 'hakodate' => + array ( + ), + 'hamatonbetsu' => + array ( + ), + 'hidaka' => + array ( + ), + 'higashikagura' => + array ( + ), + 'higashikawa' => + array ( + ), + 'hiroo' => + array ( + ), + 'hokuryu' => + array ( + ), + 'hokuto' => + array ( + ), + 'honbetsu' => + array ( + ), + 'horokanai' => + array ( + ), + 'horonobe' => + array ( + ), + 'ikeda' => + array ( + ), + 'imakane' => + array ( + ), + 'ishikari' => + array ( + ), + 'iwamizawa' => + array ( + ), + 'iwanai' => + array ( + ), + 'kamifurano' => + array ( + ), + 'kamikawa' => + array ( + ), + 'kamishihoro' => + array ( + ), + 'kamisunagawa' => + array ( + ), + 'kamoenai' => + array ( + ), + 'kayabe' => + array ( + ), + 'kembuchi' => + array ( + ), + 'kikonai' => + array ( + ), + 'kimobetsu' => + array ( + ), + 'kitahiroshima' => + array ( + ), + 'kitami' => + array ( + ), + 'kiyosato' => + array ( + ), + 'koshimizu' => + array ( + ), + 'kunneppu' => + array ( + ), + 'kuriyama' => + array ( + ), + 'kuromatsunai' => + array ( + ), + 'kushiro' => + array ( + ), + 'kutchan' => + array ( + ), + 'kyowa' => + array ( + ), + 'mashike' => + array ( + ), + 'matsumae' => + array ( + ), + 'mikasa' => + array ( + ), + 'minamifurano' => + array ( + ), + 'mombetsu' => + array ( + ), + 'moseushi' => + array ( + ), + 'mukawa' => + array ( + ), + 'muroran' => + array ( + ), + 'naie' => + array ( + ), + 'nakagawa' => + array ( + ), + 'nakasatsunai' => + array ( + ), + 'nakatombetsu' => + array ( + ), + 'nanae' => + array ( + ), + 'nanporo' => + array ( + ), + 'nayoro' => + array ( + ), + 'nemuro' => + array ( + ), + 'niikappu' => + array ( + ), + 'niki' => + array ( + ), + 'nishiokoppe' => + array ( + ), + 'noboribetsu' => + array ( + ), + 'numata' => + array ( + ), + 'obihiro' => + array ( + ), + 'obira' => + array ( + ), + 'oketo' => + array ( + ), + 'okoppe' => + array ( + ), + 'otaru' => + array ( + ), + 'otobe' => + array ( + ), + 'otofuke' => + array ( + ), + 'otoineppu' => + array ( + ), + 'oumu' => + array ( + ), + 'ozora' => + array ( + ), + 'pippu' => + array ( + ), + 'rankoshi' => + array ( + ), + 'rebun' => + array ( + ), + 'rikubetsu' => + array ( + ), + 'rishiri' => + array ( + ), + 'rishirifuji' => + array ( + ), + 'saroma' => + array ( + ), + 'sarufutsu' => + array ( + ), + 'shakotan' => + array ( + ), + 'shari' => + array ( + ), + 'shibecha' => + array ( + ), + 'shibetsu' => + array ( + ), + 'shikabe' => + array ( + ), + 'shikaoi' => + array ( + ), + 'shimamaki' => + array ( + ), + 'shimizu' => + array ( + ), + 'shimokawa' => + array ( + ), + 'shinshinotsu' => + array ( + ), + 'shintoku' => + array ( + ), + 'shiranuka' => + array ( + ), + 'shiraoi' => + array ( + ), + 'shiriuchi' => + array ( + ), + 'sobetsu' => + array ( + ), + 'sunagawa' => + array ( + ), + 'taiki' => + array ( + ), + 'takasu' => + array ( + ), + 'takikawa' => + array ( + ), + 'takinoue' => + array ( + ), + 'teshikaga' => + array ( + ), + 'tobetsu' => + array ( + ), + 'tohma' => + array ( + ), + 'tomakomai' => + array ( + ), + 'tomari' => + array ( + ), + 'toya' => + array ( + ), + 'toyako' => + array ( + ), + 'toyotomi' => + array ( + ), + 'toyoura' => + array ( + ), + 'tsubetsu' => + array ( + ), + 'tsukigata' => + array ( + ), + 'urakawa' => + array ( + ), + 'urausu' => + array ( + ), + 'uryu' => + array ( + ), + 'utashinai' => + array ( + ), + 'wakkanai' => + array ( + ), + 'wassamu' => + array ( + ), + 'yakumo' => + array ( + ), + 'yoichi' => + array ( + ), + ), + 'hyogo' => + array ( + 'aioi' => + array ( + ), + 'akashi' => + array ( + ), + 'ako' => + array ( + ), + 'amagasaki' => + array ( + ), + 'aogaki' => + array ( + ), + 'asago' => + array ( + ), + 'ashiya' => + array ( + ), + 'awaji' => + array ( + ), + 'fukusaki' => + array ( + ), + 'goshiki' => + array ( + ), + 'harima' => + array ( + ), + 'himeji' => + array ( + ), + 'ichikawa' => + array ( + ), + 'inagawa' => + array ( + ), + 'itami' => + array ( + ), + 'kakogawa' => + array ( + ), + 'kamigori' => + array ( + ), + 'kamikawa' => + array ( + ), + 'kasai' => + array ( + ), + 'kasuga' => + array ( + ), + 'kawanishi' => + array ( + ), + 'miki' => + array ( + ), + 'minamiawaji' => + array ( + ), + 'nishinomiya' => + array ( + ), + 'nishiwaki' => + array ( + ), + 'ono' => + array ( + ), + 'sanda' => + array ( + ), + 'sannan' => + array ( + ), + 'sasayama' => + array ( + ), + 'sayo' => + array ( + ), + 'shingu' => + array ( + ), + 'shinonsen' => + array ( + ), + 'shiso' => + array ( + ), + 'sumoto' => + array ( + ), + 'taishi' => + array ( + ), + 'taka' => + array ( + ), + 'takarazuka' => + array ( + ), + 'takasago' => + array ( + ), + 'takino' => + array ( + ), + 'tamba' => + array ( + ), + 'tatsuno' => + array ( + ), + 'toyooka' => + array ( + ), + 'yabu' => + array ( + ), + 'yashiro' => + array ( + ), + 'yoka' => + array ( + ), + 'yokawa' => + array ( + ), + ), + 'ibaraki' => + array ( + 'ami' => + array ( + ), + 'asahi' => + array ( + ), + 'bando' => + array ( + ), + 'chikusei' => + array ( + ), + 'daigo' => + array ( + ), + 'fujishiro' => + array ( + ), + 'hitachi' => + array ( + ), + 'hitachinaka' => + array ( + ), + 'hitachiomiya' => + array ( + ), + 'hitachiota' => + array ( + ), + 'ibaraki' => + array ( + ), + 'ina' => + array ( + ), + 'inashiki' => + array ( + ), + 'itako' => + array ( + ), + 'iwama' => + array ( + ), + 'joso' => + array ( + ), + 'kamisu' => + array ( + ), + 'kasama' => + array ( + ), + 'kashima' => + array ( + ), + 'kasumigaura' => + array ( + ), + 'koga' => + array ( + ), + 'miho' => + array ( + ), + 'mito' => + array ( + ), + 'moriya' => + array ( + ), + 'naka' => + array ( + ), + 'namegata' => + array ( + ), + 'oarai' => + array ( + ), + 'ogawa' => + array ( + ), + 'omitama' => + array ( + ), + 'ryugasaki' => + array ( + ), + 'sakai' => + array ( + ), + 'sakuragawa' => + array ( + ), + 'shimodate' => + array ( + ), + 'shimotsuma' => + array ( + ), + 'shirosato' => + array ( + ), + 'sowa' => + array ( + ), + 'suifu' => + array ( + ), + 'takahagi' => + array ( + ), + 'tamatsukuri' => + array ( + ), + 'tokai' => + array ( + ), + 'tomobe' => + array ( + ), + 'tone' => + array ( + ), + 'toride' => + array ( + ), + 'tsuchiura' => + array ( + ), + 'tsukuba' => + array ( + ), + 'uchihara' => + array ( + ), + 'ushiku' => + array ( + ), + 'yachiyo' => + array ( + ), + 'yamagata' => + array ( + ), + 'yawara' => + array ( + ), + 'yuki' => + array ( + ), + ), + 'ishikawa' => + array ( + 'anamizu' => + array ( + ), + 'hakui' => + array ( + ), + 'hakusan' => + array ( + ), + 'kaga' => + array ( + ), + 'kahoku' => + array ( + ), + 'kanazawa' => + array ( + ), + 'kawakita' => + array ( + ), + 'komatsu' => + array ( + ), + 'nakanoto' => + array ( + ), + 'nanao' => + array ( + ), + 'nomi' => + array ( + ), + 'nonoichi' => + array ( + ), + 'noto' => + array ( + ), + 'shika' => + array ( + ), + 'suzu' => + array ( + ), + 'tsubata' => + array ( + ), + 'tsurugi' => + array ( + ), + 'uchinada' => + array ( + ), + 'wajima' => + array ( + ), + ), + 'iwate' => + array ( + 'fudai' => + array ( + ), + 'fujisawa' => + array ( + ), + 'hanamaki' => + array ( + ), + 'hiraizumi' => + array ( + ), + 'hirono' => + array ( + ), + 'ichinohe' => + array ( + ), + 'ichinoseki' => + array ( + ), + 'iwaizumi' => + array ( + ), + 'iwate' => + array ( + ), + 'joboji' => + array ( + ), + 'kamaishi' => + array ( + ), + 'kanegasaki' => + array ( + ), + 'karumai' => + array ( + ), + 'kawai' => + array ( + ), + 'kitakami' => + array ( + ), + 'kuji' => + array ( + ), + 'kunohe' => + array ( + ), + 'kuzumaki' => + array ( + ), + 'miyako' => + array ( + ), + 'mizusawa' => + array ( + ), + 'morioka' => + array ( + ), + 'ninohe' => + array ( + ), + 'noda' => + array ( + ), + 'ofunato' => + array ( + ), + 'oshu' => + array ( + ), + 'otsuchi' => + array ( + ), + 'rikuzentakata' => + array ( + ), + 'shiwa' => + array ( + ), + 'shizukuishi' => + array ( + ), + 'sumita' => + array ( + ), + 'tanohata' => + array ( + ), + 'tono' => + array ( + ), + 'yahaba' => + array ( + ), + 'yamada' => + array ( + ), + ), + 'kagawa' => + array ( + 'ayagawa' => + array ( + ), + 'higashikagawa' => + array ( + ), + 'kanonji' => + array ( + ), + 'kotohira' => + array ( + ), + 'manno' => + array ( + ), + 'marugame' => + array ( + ), + 'mitoyo' => + array ( + ), + 'naoshima' => + array ( + ), + 'sanuki' => + array ( + ), + 'tadotsu' => + array ( + ), + 'takamatsu' => + array ( + ), + 'tonosho' => + array ( + ), + 'uchinomi' => + array ( + ), + 'utazu' => + array ( + ), + 'zentsuji' => + array ( + ), + ), + 'kagoshima' => + array ( + 'akune' => + array ( + ), + 'amami' => + array ( + ), + 'hioki' => + array ( + ), + 'isa' => + array ( + ), + 'isen' => + array ( + ), + 'izumi' => + array ( + ), + 'kagoshima' => + array ( + ), + 'kanoya' => + array ( + ), + 'kawanabe' => + array ( + ), + 'kinko' => + array ( + ), + 'kouyama' => + array ( + ), + 'makurazaki' => + array ( + ), + 'matsumoto' => + array ( + ), + 'minamitane' => + array ( + ), + 'nakatane' => + array ( + ), + 'nishinoomote' => + array ( + ), + 'satsumasendai' => + array ( + ), + 'soo' => + array ( + ), + 'tarumizu' => + array ( + ), + 'yusui' => + array ( + ), + ), + 'kanagawa' => + array ( + 'aikawa' => + array ( + ), + 'atsugi' => + array ( + ), + 'ayase' => + array ( + ), + 'chigasaki' => + array ( + ), + 'ebina' => + array ( + ), + 'fujisawa' => + array ( + ), + 'hadano' => + array ( + ), + 'hakone' => + array ( + ), + 'hiratsuka' => + array ( + ), + 'isehara' => + array ( + ), + 'kaisei' => + array ( + ), + 'kamakura' => + array ( + ), + 'kiyokawa' => + array ( + ), + 'matsuda' => + array ( + ), + 'minamiashigara' => + array ( + ), + 'miura' => + array ( + ), + 'nakai' => + array ( + ), + 'ninomiya' => + array ( + ), + 'odawara' => + array ( + ), + 'oi' => + array ( + ), + 'oiso' => + array ( + ), + 'sagamihara' => + array ( + ), + 'samukawa' => + array ( + ), + 'tsukui' => + array ( + ), + 'yamakita' => + array ( + ), + 'yamato' => + array ( + ), + 'yokosuka' => + array ( + ), + 'yugawara' => + array ( + ), + 'zama' => + array ( + ), + 'zushi' => + array ( + ), + ), + 'kochi' => + array ( + 'aki' => + array ( + ), + 'geisei' => + array ( + ), + 'hidaka' => + array ( + ), + 'higashitsuno' => + array ( + ), + 'ino' => + array ( + ), + 'kagami' => + array ( + ), + 'kami' => + array ( + ), + 'kitagawa' => + array ( + ), + 'kochi' => + array ( + ), + 'mihara' => + array ( + ), + 'motoyama' => + array ( + ), + 'muroto' => + array ( + ), + 'nahari' => + array ( + ), + 'nakamura' => + array ( + ), + 'nankoku' => + array ( + ), + 'nishitosa' => + array ( + ), + 'niyodogawa' => + array ( + ), + 'ochi' => + array ( + ), + 'okawa' => + array ( + ), + 'otoyo' => + array ( + ), + 'otsuki' => + array ( + ), + 'sakawa' => + array ( + ), + 'sukumo' => + array ( + ), + 'susaki' => + array ( + ), + 'tosa' => + array ( + ), + 'tosashimizu' => + array ( + ), + 'toyo' => + array ( + ), + 'tsuno' => + array ( + ), + 'umaji' => + array ( + ), + 'yasuda' => + array ( + ), + 'yusuhara' => + array ( + ), + ), + 'kumamoto' => + array ( + 'amakusa' => + array ( + ), + 'arao' => + array ( + ), + 'aso' => + array ( + ), + 'choyo' => + array ( + ), + 'gyokuto' => + array ( + ), + 'hitoyoshi' => + array ( + ), + 'kamiamakusa' => + array ( + ), + 'kashima' => + array ( + ), + 'kikuchi' => + array ( + ), + 'kumamoto' => + array ( + ), + 'mashiki' => + array ( + ), + 'mifune' => + array ( + ), + 'minamata' => + array ( + ), + 'minamioguni' => + array ( + ), + 'nagasu' => + array ( + ), + 'nishihara' => + array ( + ), + 'oguni' => + array ( + ), + 'ozu' => + array ( + ), + 'sumoto' => + array ( + ), + 'takamori' => + array ( + ), + 'uki' => + array ( + ), + 'uto' => + array ( + ), + 'yamaga' => + array ( + ), + 'yamato' => + array ( + ), + 'yatsushiro' => + array ( + ), + ), + 'kyoto' => + array ( + 'ayabe' => + array ( + ), + 'fukuchiyama' => + array ( + ), + 'higashiyama' => + array ( + ), + 'ide' => + array ( + ), + 'ine' => + array ( + ), + 'joyo' => + array ( + ), + 'kameoka' => + array ( + ), + 'kamo' => + array ( + ), + 'kita' => + array ( + ), + 'kizu' => + array ( + ), + 'kumiyama' => + array ( + ), + 'kyotamba' => + array ( + ), + 'kyotanabe' => + array ( + ), + 'kyotango' => + array ( + ), + 'maizuru' => + array ( + ), + 'minami' => + array ( + ), + 'minamiyamashiro' => + array ( + ), + 'miyazu' => + array ( + ), + 'muko' => + array ( + ), + 'nagaokakyo' => + array ( + ), + 'nakagyo' => + array ( + ), + 'nantan' => + array ( + ), + 'oyamazaki' => + array ( + ), + 'sakyo' => + array ( + ), + 'seika' => + array ( + ), + 'tanabe' => + array ( + ), + 'uji' => + array ( + ), + 'ujitawara' => + array ( + ), + 'wazuka' => + array ( + ), + 'yamashina' => + array ( + ), + 'yawata' => + array ( + ), + ), + 'mie' => + array ( + 'asahi' => + array ( + ), + 'inabe' => + array ( + ), + 'ise' => + array ( + ), + 'kameyama' => + array ( + ), + 'kawagoe' => + array ( + ), + 'kiho' => + array ( + ), + 'kisosaki' => + array ( + ), + 'kiwa' => + array ( + ), + 'komono' => + array ( + ), + 'kumano' => + array ( + ), + 'kuwana' => + array ( + ), + 'matsusaka' => + array ( + ), + 'meiwa' => + array ( + ), + 'mihama' => + array ( + ), + 'minamiise' => + array ( + ), + 'misugi' => + array ( + ), + 'miyama' => + array ( + ), + 'nabari' => + array ( + ), + 'shima' => + array ( + ), + 'suzuka' => + array ( + ), + 'tado' => + array ( + ), + 'taiki' => + array ( + ), + 'taki' => + array ( + ), + 'tamaki' => + array ( + ), + 'toba' => + array ( + ), + 'tsu' => + array ( + ), + 'udono' => + array ( + ), + 'ureshino' => + array ( + ), + 'watarai' => + array ( + ), + 'yokkaichi' => + array ( + ), + ), + 'miyagi' => + array ( + 'furukawa' => + array ( + ), + 'higashimatsushima' => + array ( + ), + 'ishinomaki' => + array ( + ), + 'iwanuma' => + array ( + ), + 'kakuda' => + array ( + ), + 'kami' => + array ( + ), + 'kawasaki' => + array ( + ), + 'marumori' => + array ( + ), + 'matsushima' => + array ( + ), + 'minamisanriku' => + array ( + ), + 'misato' => + array ( + ), + 'murata' => + array ( + ), + 'natori' => + array ( + ), + 'ogawara' => + array ( + ), + 'ohira' => + array ( + ), + 'onagawa' => + array ( + ), + 'osaki' => + array ( + ), + 'rifu' => + array ( + ), + 'semine' => + array ( + ), + 'shibata' => + array ( + ), + 'shichikashuku' => + array ( + ), + 'shikama' => + array ( + ), + 'shiogama' => + array ( + ), + 'shiroishi' => + array ( + ), + 'tagajo' => + array ( + ), + 'taiwa' => + array ( + ), + 'tome' => + array ( + ), + 'tomiya' => + array ( + ), + 'wakuya' => + array ( + ), + 'watari' => + array ( + ), + 'yamamoto' => + array ( + ), + 'zao' => + array ( + ), + ), + 'miyazaki' => + array ( + 'aya' => + array ( + ), + 'ebino' => + array ( + ), + 'gokase' => + array ( + ), + 'hyuga' => + array ( + ), + 'kadogawa' => + array ( + ), + 'kawaminami' => + array ( + ), + 'kijo' => + array ( + ), + 'kitagawa' => + array ( + ), + 'kitakata' => + array ( + ), + 'kitaura' => + array ( + ), + 'kobayashi' => + array ( + ), + 'kunitomi' => + array ( + ), + 'kushima' => + array ( + ), + 'mimata' => + array ( + ), + 'miyakonojo' => + array ( + ), + 'miyazaki' => + array ( + ), + 'morotsuka' => + array ( + ), + 'nichinan' => + array ( + ), + 'nishimera' => + array ( + ), + 'nobeoka' => + array ( + ), + 'saito' => + array ( + ), + 'shiiba' => + array ( + ), + 'shintomi' => + array ( + ), + 'takaharu' => + array ( + ), + 'takanabe' => + array ( + ), + 'takazaki' => + array ( + ), + 'tsuno' => + array ( + ), + ), + 'nagano' => + array ( + 'achi' => + array ( + ), + 'agematsu' => + array ( + ), + 'anan' => + array ( + ), + 'aoki' => + array ( + ), + 'asahi' => + array ( + ), + 'azumino' => + array ( + ), + 'chikuhoku' => + array ( + ), + 'chikuma' => + array ( + ), + 'chino' => + array ( + ), + 'fujimi' => + array ( + ), + 'hakuba' => + array ( + ), + 'hara' => + array ( + ), + 'hiraya' => + array ( + ), + 'iida' => + array ( + ), + 'iijima' => + array ( + ), + 'iiyama' => + array ( + ), + 'iizuna' => + array ( + ), + 'ikeda' => + array ( + ), + 'ikusaka' => + array ( + ), + 'ina' => + array ( + ), + 'karuizawa' => + array ( + ), + 'kawakami' => + array ( + ), + 'kiso' => + array ( + ), + 'kisofukushima' => + array ( + ), + 'kitaaiki' => + array ( + ), + 'komagane' => + array ( + ), + 'komoro' => + array ( + ), + 'matsukawa' => + array ( + ), + 'matsumoto' => + array ( + ), + 'miasa' => + array ( + ), + 'minamiaiki' => + array ( + ), + 'minamimaki' => + array ( + ), + 'minamiminowa' => + array ( + ), + 'minowa' => + array ( + ), + 'miyada' => + array ( + ), + 'miyota' => + array ( + ), + 'mochizuki' => + array ( + ), + 'nagano' => + array ( + ), + 'nagawa' => + array ( + ), + 'nagiso' => + array ( + ), + 'nakagawa' => + array ( + ), + 'nakano' => + array ( + ), + 'nozawaonsen' => + array ( + ), + 'obuse' => + array ( + ), + 'ogawa' => + array ( + ), + 'okaya' => + array ( + ), + 'omachi' => + array ( + ), + 'omi' => + array ( + ), + 'ookuwa' => + array ( + ), + 'ooshika' => + array ( + ), + 'otaki' => + array ( + ), + 'otari' => + array ( + ), + 'sakae' => + array ( + ), + 'sakaki' => + array ( + ), + 'saku' => + array ( + ), + 'sakuho' => + array ( + ), + 'shimosuwa' => + array ( + ), + 'shinanomachi' => + array ( + ), + 'shiojiri' => + array ( + ), + 'suwa' => + array ( + ), + 'suzaka' => + array ( + ), + 'takagi' => + array ( + ), + 'takamori' => + array ( + ), + 'takayama' => + array ( + ), + 'tateshina' => + array ( + ), + 'tatsuno' => + array ( + ), + 'togakushi' => + array ( + ), + 'togura' => + array ( + ), + 'tomi' => + array ( + ), + 'ueda' => + array ( + ), + 'wada' => + array ( + ), + 'yamagata' => + array ( + ), + 'yamanouchi' => + array ( + ), + 'yasaka' => + array ( + ), + 'yasuoka' => + array ( + ), + ), + 'nagasaki' => + array ( + 'chijiwa' => + array ( + ), + 'futsu' => + array ( + ), + 'goto' => + array ( + ), + 'hasami' => + array ( + ), + 'hirado' => + array ( + ), + 'iki' => + array ( + ), + 'isahaya' => + array ( + ), + 'kawatana' => + array ( + ), + 'kuchinotsu' => + array ( + ), + 'matsuura' => + array ( + ), + 'nagasaki' => + array ( + ), + 'obama' => + array ( + ), + 'omura' => + array ( + ), + 'oseto' => + array ( + ), + 'saikai' => + array ( + ), + 'sasebo' => + array ( + ), + 'seihi' => + array ( + ), + 'shimabara' => + array ( + ), + 'shinkamigoto' => + array ( + ), + 'togitsu' => + array ( + ), + 'tsushima' => + array ( + ), + 'unzen' => + array ( + ), + ), + 'nara' => + array ( + 'ando' => + array ( + ), + 'gose' => + array ( + ), + 'heguri' => + array ( + ), + 'higashiyoshino' => + array ( + ), + 'ikaruga' => + array ( + ), + 'ikoma' => + array ( + ), + 'kamikitayama' => + array ( + ), + 'kanmaki' => + array ( + ), + 'kashiba' => + array ( + ), + 'kashihara' => + array ( + ), + 'katsuragi' => + array ( + ), + 'kawai' => + array ( + ), + 'kawakami' => + array ( + ), + 'kawanishi' => + array ( + ), + 'koryo' => + array ( + ), + 'kurotaki' => + array ( + ), + 'mitsue' => + array ( + ), + 'miyake' => + array ( + ), + 'nara' => + array ( + ), + 'nosegawa' => + array ( + ), + 'oji' => + array ( + ), + 'ouda' => + array ( + ), + 'oyodo' => + array ( + ), + 'sakurai' => + array ( + ), + 'sango' => + array ( + ), + 'shimoichi' => + array ( + ), + 'shimokitayama' => + array ( + ), + 'shinjo' => + array ( + ), + 'soni' => + array ( + ), + 'takatori' => + array ( + ), + 'tawaramoto' => + array ( + ), + 'tenkawa' => + array ( + ), + 'tenri' => + array ( + ), + 'uda' => + array ( + ), + 'yamatokoriyama' => + array ( + ), + 'yamatotakada' => + array ( + ), + 'yamazoe' => + array ( + ), + 'yoshino' => + array ( + ), + ), + 'niigata' => + array ( + 'aga' => + array ( + ), + 'agano' => + array ( + ), + 'gosen' => + array ( + ), + 'itoigawa' => + array ( + ), + 'izumozaki' => + array ( + ), + 'joetsu' => + array ( + ), + 'kamo' => + array ( + ), + 'kariwa' => + array ( + ), + 'kashiwazaki' => + array ( + ), + 'minamiuonuma' => + array ( + ), + 'mitsuke' => + array ( + ), + 'muika' => + array ( + ), + 'murakami' => + array ( + ), + 'myoko' => + array ( + ), + 'nagaoka' => + array ( + ), + 'niigata' => + array ( + ), + 'ojiya' => + array ( + ), + 'omi' => + array ( + ), + 'sado' => + array ( + ), + 'sanjo' => + array ( + ), + 'seiro' => + array ( + ), + 'seirou' => + array ( + ), + 'sekikawa' => + array ( + ), + 'shibata' => + array ( + ), + 'tagami' => + array ( + ), + 'tainai' => + array ( + ), + 'tochio' => + array ( + ), + 'tokamachi' => + array ( + ), + 'tsubame' => + array ( + ), + 'tsunan' => + array ( + ), + 'uonuma' => + array ( + ), + 'yahiko' => + array ( + ), + 'yoita' => + array ( + ), + 'yuzawa' => + array ( + ), + ), + 'oita' => + array ( + 'beppu' => + array ( + ), + 'bungoono' => + array ( + ), + 'bungotakada' => + array ( + ), + 'hasama' => + array ( + ), + 'hiji' => + array ( + ), + 'himeshima' => + array ( + ), + 'hita' => + array ( + ), + 'kamitsue' => + array ( + ), + 'kokonoe' => + array ( + ), + 'kuju' => + array ( + ), + 'kunisaki' => + array ( + ), + 'kusu' => + array ( + ), + 'oita' => + array ( + ), + 'saiki' => + array ( + ), + 'taketa' => + array ( + ), + 'tsukumi' => + array ( + ), + 'usa' => + array ( + ), + 'usuki' => + array ( + ), + 'yufu' => + array ( + ), + ), + 'okayama' => + array ( + 'akaiwa' => + array ( + ), + 'asakuchi' => + array ( + ), + 'bizen' => + array ( + ), + 'hayashima' => + array ( + ), + 'ibara' => + array ( + ), + 'kagamino' => + array ( + ), + 'kasaoka' => + array ( + ), + 'kibichuo' => + array ( + ), + 'kumenan' => + array ( + ), + 'kurashiki' => + array ( + ), + 'maniwa' => + array ( + ), + 'misaki' => + array ( + ), + 'nagi' => + array ( + ), + 'niimi' => + array ( + ), + 'nishiawakura' => + array ( + ), + 'okayama' => + array ( + ), + 'satosho' => + array ( + ), + 'setouchi' => + array ( + ), + 'shinjo' => + array ( + ), + 'shoo' => + array ( + ), + 'soja' => + array ( + ), + 'takahashi' => + array ( + ), + 'tamano' => + array ( + ), + 'tsuyama' => + array ( + ), + 'wake' => + array ( + ), + 'yakage' => + array ( + ), + ), + 'okinawa' => + array ( + 'aguni' => + array ( + ), + 'ginowan' => + array ( + ), + 'ginoza' => + array ( + ), + 'gushikami' => + array ( + ), + 'haebaru' => + array ( + ), + 'higashi' => + array ( + ), + 'hirara' => + array ( + ), + 'iheya' => + array ( + ), + 'ishigaki' => + array ( + ), + 'ishikawa' => + array ( + ), + 'itoman' => + array ( + ), + 'izena' => + array ( + ), + 'kadena' => + array ( + ), + 'kin' => + array ( + ), + 'kitadaito' => + array ( + ), + 'kitanakagusuku' => + array ( + ), + 'kumejima' => + array ( + ), + 'kunigami' => + array ( + ), + 'minamidaito' => + array ( + ), + 'motobu' => + array ( + ), + 'nago' => + array ( + ), + 'naha' => + array ( + ), + 'nakagusuku' => + array ( + ), + 'nakijin' => + array ( + ), + 'nanjo' => + array ( + ), + 'nishihara' => + array ( + ), + 'ogimi' => + array ( + ), + 'okinawa' => + array ( + ), + 'onna' => + array ( + ), + 'shimoji' => + array ( + ), + 'taketomi' => + array ( + ), + 'tarama' => + array ( + ), + 'tokashiki' => + array ( + ), + 'tomigusuku' => + array ( + ), + 'tonaki' => + array ( + ), + 'urasoe' => + array ( + ), + 'uruma' => + array ( + ), + 'yaese' => + array ( + ), + 'yomitan' => + array ( + ), + 'yonabaru' => + array ( + ), + 'yonaguni' => + array ( + ), + 'zamami' => + array ( + ), + ), + 'osaka' => + array ( + 'abeno' => + array ( + ), + 'chihayaakasaka' => + array ( + ), + 'chuo' => + array ( + ), + 'daito' => + array ( + ), + 'fujiidera' => + array ( + ), + 'habikino' => + array ( + ), + 'hannan' => + array ( + ), + 'higashiosaka' => + array ( + ), + 'higashisumiyoshi' => + array ( + ), + 'higashiyodogawa' => + array ( + ), + 'hirakata' => + array ( + ), + 'ibaraki' => + array ( + ), + 'ikeda' => + array ( + ), + 'izumi' => + array ( + ), + 'izumiotsu' => + array ( + ), + 'izumisano' => + array ( + ), + 'kadoma' => + array ( + ), + 'kaizuka' => + array ( + ), + 'kanan' => + array ( + ), + 'kashiwara' => + array ( + ), + 'katano' => + array ( + ), + 'kawachinagano' => + array ( + ), + 'kishiwada' => + array ( + ), + 'kita' => + array ( + ), + 'kumatori' => + array ( + ), + 'matsubara' => + array ( + ), + 'minato' => + array ( + ), + 'minoh' => + array ( + ), + 'misaki' => + array ( + ), + 'moriguchi' => + array ( + ), + 'neyagawa' => + array ( + ), + 'nishi' => + array ( + ), + 'nose' => + array ( + ), + 'osakasayama' => + array ( + ), + 'sakai' => + array ( + ), + 'sayama' => + array ( + ), + 'sennan' => + array ( + ), + 'settsu' => + array ( + ), + 'shijonawate' => + array ( + ), + 'shimamoto' => + array ( + ), + 'suita' => + array ( + ), + 'tadaoka' => + array ( + ), + 'taishi' => + array ( + ), + 'tajiri' => + array ( + ), + 'takaishi' => + array ( + ), + 'takatsuki' => + array ( + ), + 'tondabayashi' => + array ( + ), + 'toyonaka' => + array ( + ), + 'toyono' => + array ( + ), + 'yao' => + array ( + ), + ), + 'saga' => + array ( + 'ariake' => + array ( + ), + 'arita' => + array ( + ), + 'fukudomi' => + array ( + ), + 'genkai' => + array ( + ), + 'hamatama' => + array ( + ), + 'hizen' => + array ( + ), + 'imari' => + array ( + ), + 'kamimine' => + array ( + ), + 'kanzaki' => + array ( + ), + 'karatsu' => + array ( + ), + 'kashima' => + array ( + ), + 'kitagata' => + array ( + ), + 'kitahata' => + array ( + ), + 'kiyama' => + array ( + ), + 'kouhoku' => + array ( + ), + 'kyuragi' => + array ( + ), + 'nishiarita' => + array ( + ), + 'ogi' => + array ( + ), + 'omachi' => + array ( + ), + 'ouchi' => + array ( + ), + 'saga' => + array ( + ), + 'shiroishi' => + array ( + ), + 'taku' => + array ( + ), + 'tara' => + array ( + ), + 'tosu' => + array ( + ), + 'yoshinogari' => + array ( + ), + ), + 'saitama' => + array ( + 'arakawa' => + array ( + ), + 'asaka' => + array ( + ), + 'chichibu' => + array ( + ), + 'fujimi' => + array ( + ), + 'fujimino' => + array ( + ), + 'fukaya' => + array ( + ), + 'hanno' => + array ( + ), + 'hanyu' => + array ( + ), + 'hasuda' => + array ( + ), + 'hatogaya' => + array ( + ), + 'hatoyama' => + array ( + ), + 'hidaka' => + array ( + ), + 'higashichichibu' => + array ( + ), + 'higashimatsuyama' => + array ( + ), + 'honjo' => + array ( + ), + 'ina' => + array ( + ), + 'iruma' => + array ( + ), + 'iwatsuki' => + array ( + ), + 'kamiizumi' => + array ( + ), + 'kamikawa' => + array ( + ), + 'kamisato' => + array ( + ), + 'kasukabe' => + array ( + ), + 'kawagoe' => + array ( + ), + 'kawaguchi' => + array ( + ), + 'kawajima' => + array ( + ), + 'kazo' => + array ( + ), + 'kitamoto' => + array ( + ), + 'koshigaya' => + array ( + ), + 'kounosu' => + array ( + ), + 'kuki' => + array ( + ), + 'kumagaya' => + array ( + ), + 'matsubushi' => + array ( + ), + 'minano' => + array ( + ), + 'misato' => + array ( + ), + 'miyashiro' => + array ( + ), + 'miyoshi' => + array ( + ), + 'moroyama' => + array ( + ), + 'nagatoro' => + array ( + ), + 'namegawa' => + array ( + ), + 'niiza' => + array ( + ), + 'ogano' => + array ( + ), + 'ogawa' => + array ( + ), + 'ogose' => + array ( + ), + 'okegawa' => + array ( + ), + 'omiya' => + array ( + ), + 'otaki' => + array ( + ), + 'ranzan' => + array ( + ), + 'ryokami' => + array ( + ), + 'saitama' => + array ( + ), + 'sakado' => + array ( + ), + 'satte' => + array ( + ), + 'sayama' => + array ( + ), + 'shiki' => + array ( + ), + 'shiraoka' => + array ( + ), + 'soka' => + array ( + ), + 'sugito' => + array ( + ), + 'toda' => + array ( + ), + 'tokigawa' => + array ( + ), + 'tokorozawa' => + array ( + ), + 'tsurugashima' => + array ( + ), + 'urawa' => + array ( + ), + 'warabi' => + array ( + ), + 'yashio' => + array ( + ), + 'yokoze' => + array ( + ), + 'yono' => + array ( + ), + 'yorii' => + array ( + ), + 'yoshida' => + array ( + ), + 'yoshikawa' => + array ( + ), + 'yoshimi' => + array ( + ), + ), + 'shiga' => + array ( + 'aisho' => + array ( + ), + 'gamo' => + array ( + ), + 'higashiomi' => + array ( + ), + 'hikone' => + array ( + ), + 'koka' => + array ( + ), + 'konan' => + array ( + ), + 'kosei' => + array ( + ), + 'koto' => + array ( + ), + 'kusatsu' => + array ( + ), + 'maibara' => + array ( + ), + 'moriyama' => + array ( + ), + 'nagahama' => + array ( + ), + 'nishiazai' => + array ( + ), + 'notogawa' => + array ( + ), + 'omihachiman' => + array ( + ), + 'otsu' => + array ( + ), + 'ritto' => + array ( + ), + 'ryuoh' => + array ( + ), + 'takashima' => + array ( + ), + 'takatsuki' => + array ( + ), + 'torahime' => + array ( + ), + 'toyosato' => + array ( + ), + 'yasu' => + array ( + ), + ), + 'shimane' => + array ( + 'akagi' => + array ( + ), + 'ama' => + array ( + ), + 'gotsu' => + array ( + ), + 'hamada' => + array ( + ), + 'higashiizumo' => + array ( + ), + 'hikawa' => + array ( + ), + 'hikimi' => + array ( + ), + 'izumo' => + array ( + ), + 'kakinoki' => + array ( + ), + 'masuda' => + array ( + ), + 'matsue' => + array ( + ), + 'misato' => + array ( + ), + 'nishinoshima' => + array ( + ), + 'ohda' => + array ( + ), + 'okinoshima' => + array ( + ), + 'okuizumo' => + array ( + ), + 'shimane' => + array ( + ), + 'tamayu' => + array ( + ), + 'tsuwano' => + array ( + ), + 'unnan' => + array ( + ), + 'yakumo' => + array ( + ), + 'yasugi' => + array ( + ), + 'yatsuka' => + array ( + ), + ), + 'shizuoka' => + array ( + 'arai' => + array ( + ), + 'atami' => + array ( + ), + 'fuji' => + array ( + ), + 'fujieda' => + array ( + ), + 'fujikawa' => + array ( + ), + 'fujinomiya' => + array ( + ), + 'fukuroi' => + array ( + ), + 'gotemba' => + array ( + ), + 'haibara' => + array ( + ), + 'hamamatsu' => + array ( + ), + 'higashiizu' => + array ( + ), + 'ito' => + array ( + ), + 'iwata' => + array ( + ), + 'izu' => + array ( + ), + 'izunokuni' => + array ( + ), + 'kakegawa' => + array ( + ), + 'kannami' => + array ( + ), + 'kawanehon' => + array ( + ), + 'kawazu' => + array ( + ), + 'kikugawa' => + array ( + ), + 'kosai' => + array ( + ), + 'makinohara' => + array ( + ), + 'matsuzaki' => + array ( + ), + 'minamiizu' => + array ( + ), + 'mishima' => + array ( + ), + 'morimachi' => + array ( + ), + 'nishiizu' => + array ( + ), + 'numazu' => + array ( + ), + 'omaezaki' => + array ( + ), + 'shimada' => + array ( + ), + 'shimizu' => + array ( + ), + 'shimoda' => + array ( + ), + 'shizuoka' => + array ( + ), + 'susono' => + array ( + ), + 'yaizu' => + array ( + ), + 'yoshida' => + array ( + ), + ), + 'tochigi' => + array ( + 'ashikaga' => + array ( + ), + 'bato' => + array ( + ), + 'haga' => + array ( + ), + 'ichikai' => + array ( + ), + 'iwafune' => + array ( + ), + 'kaminokawa' => + array ( + ), + 'kanuma' => + array ( + ), + 'karasuyama' => + array ( + ), + 'kuroiso' => + array ( + ), + 'mashiko' => + array ( + ), + 'mibu' => + array ( + ), + 'moka' => + array ( + ), + 'motegi' => + array ( + ), + 'nasu' => + array ( + ), + 'nasushiobara' => + array ( + ), + 'nikko' => + array ( + ), + 'nishikata' => + array ( + ), + 'nogi' => + array ( + ), + 'ohira' => + array ( + ), + 'ohtawara' => + array ( + ), + 'oyama' => + array ( + ), + 'sakura' => + array ( + ), + 'sano' => + array ( + ), + 'shimotsuke' => + array ( + ), + 'shioya' => + array ( + ), + 'takanezawa' => + array ( + ), + 'tochigi' => + array ( + ), + 'tsuga' => + array ( + ), + 'ujiie' => + array ( + ), + 'utsunomiya' => + array ( + ), + 'yaita' => + array ( + ), + ), + 'tokushima' => + array ( + 'aizumi' => + array ( + ), + 'anan' => + array ( + ), + 'ichiba' => + array ( + ), + 'itano' => + array ( + ), + 'kainan' => + array ( + ), + 'komatsushima' => + array ( + ), + 'matsushige' => + array ( + ), + 'mima' => + array ( + ), + 'minami' => + array ( + ), + 'miyoshi' => + array ( + ), + 'mugi' => + array ( + ), + 'nakagawa' => + array ( + ), + 'naruto' => + array ( + ), + 'sanagochi' => + array ( + ), + 'shishikui' => + array ( + ), + 'tokushima' => + array ( + ), + 'wajiki' => + array ( + ), + ), + 'tokyo' => + array ( + 'adachi' => + array ( + ), + 'akiruno' => + array ( + ), + 'akishima' => + array ( + ), + 'aogashima' => + array ( + ), + 'arakawa' => + array ( + ), + 'bunkyo' => + array ( + ), + 'chiyoda' => + array ( + ), + 'chofu' => + array ( + ), + 'chuo' => + array ( + ), + 'edogawa' => + array ( + ), + 'fuchu' => + array ( + ), + 'fussa' => + array ( + ), + 'hachijo' => + array ( + ), + 'hachioji' => + array ( + ), + 'hamura' => + array ( + ), + 'higashikurume' => + array ( + ), + 'higashimurayama' => + array ( + ), + 'higashiyamato' => + array ( + ), + 'hino' => + array ( + ), + 'hinode' => + array ( + ), + 'hinohara' => + array ( + ), + 'inagi' => + array ( + ), + 'itabashi' => + array ( + ), + 'katsushika' => + array ( + ), + 'kita' => + array ( + ), + 'kiyose' => + array ( + ), + 'kodaira' => + array ( + ), + 'koganei' => + array ( + ), + 'kokubunji' => + array ( + ), + 'komae' => + array ( + ), + 'koto' => + array ( + ), + 'kouzushima' => + array ( + ), + 'kunitachi' => + array ( + ), + 'machida' => + array ( + ), + 'meguro' => + array ( + ), + 'minato' => + array ( + ), + 'mitaka' => + array ( + ), + 'mizuho' => + array ( + ), + 'musashimurayama' => + array ( + ), + 'musashino' => + array ( + ), + 'nakano' => + array ( + ), + 'nerima' => + array ( + ), + 'ogasawara' => + array ( + ), + 'okutama' => + array ( + ), + 'ome' => + array ( + ), + 'oshima' => + array ( + ), + 'ota' => + array ( + ), + 'setagaya' => + array ( + ), + 'shibuya' => + array ( + ), + 'shinagawa' => + array ( + ), + 'shinjuku' => + array ( + ), + 'suginami' => + array ( + ), + 'sumida' => + array ( + ), + 'tachikawa' => + array ( + ), + 'taito' => + array ( + ), + 'tama' => + array ( + ), + 'toshima' => + array ( + ), + ), + 'tottori' => + array ( + 'chizu' => + array ( + ), + 'hino' => + array ( + ), + 'kawahara' => + array ( + ), + 'koge' => + array ( + ), + 'kotoura' => + array ( + ), + 'misasa' => + array ( + ), + 'nanbu' => + array ( + ), + 'nichinan' => + array ( + ), + 'sakaiminato' => + array ( + ), + 'tottori' => + array ( + ), + 'wakasa' => + array ( + ), + 'yazu' => + array ( + ), + 'yonago' => + array ( + ), + ), + 'toyama' => + array ( + 'asahi' => + array ( + ), + 'fuchu' => + array ( + ), + 'fukumitsu' => + array ( + ), + 'funahashi' => + array ( + ), + 'himi' => + array ( + ), + 'imizu' => + array ( + ), + 'inami' => + array ( + ), + 'johana' => + array ( + ), + 'kamiichi' => + array ( + ), + 'kurobe' => + array ( + ), + 'nakaniikawa' => + array ( + ), + 'namerikawa' => + array ( + ), + 'nanto' => + array ( + ), + 'nyuzen' => + array ( + ), + 'oyabe' => + array ( + ), + 'taira' => + array ( + ), + 'takaoka' => + array ( + ), + 'tateyama' => + array ( + ), + 'toga' => + array ( + ), + 'tonami' => + array ( + ), + 'toyama' => + array ( + ), + 'unazuki' => + array ( + ), + 'uozu' => + array ( + ), + 'yamada' => + array ( + ), + ), + 'wakayama' => + array ( + 'arida' => + array ( + ), + 'aridagawa' => + array ( + ), + 'gobo' => + array ( + ), + 'hashimoto' => + array ( + ), + 'hidaka' => + array ( + ), + 'hirogawa' => + array ( + ), + 'inami' => + array ( + ), + 'iwade' => + array ( + ), + 'kainan' => + array ( + ), + 'kamitonda' => + array ( + ), + 'katsuragi' => + array ( + ), + 'kimino' => + array ( + ), + 'kinokawa' => + array ( + ), + 'kitayama' => + array ( + ), + 'koya' => + array ( + ), + 'koza' => + array ( + ), + 'kozagawa' => + array ( + ), + 'kudoyama' => + array ( + ), + 'kushimoto' => + array ( + ), + 'mihama' => + array ( + ), + 'misato' => + array ( + ), + 'nachikatsuura' => + array ( + ), + 'shingu' => + array ( + ), + 'shirahama' => + array ( + ), + 'taiji' => + array ( + ), + 'tanabe' => + array ( + ), + 'wakayama' => + array ( + ), + 'yuasa' => + array ( + ), + 'yura' => + array ( + ), + ), + 'yamagata' => + array ( + 'asahi' => + array ( + ), + 'funagata' => + array ( + ), + 'higashine' => + array ( + ), + 'iide' => + array ( + ), + 'kahoku' => + array ( + ), + 'kaminoyama' => + array ( + ), + 'kaneyama' => + array ( + ), + 'kawanishi' => + array ( + ), + 'mamurogawa' => + array ( + ), + 'mikawa' => + array ( + ), + 'murayama' => + array ( + ), + 'nagai' => + array ( + ), + 'nakayama' => + array ( + ), + 'nanyo' => + array ( + ), + 'nishikawa' => + array ( + ), + 'obanazawa' => + array ( + ), + 'oe' => + array ( + ), + 'oguni' => + array ( + ), + 'ohkura' => + array ( + ), + 'oishida' => + array ( + ), + 'sagae' => + array ( + ), + 'sakata' => + array ( + ), + 'sakegawa' => + array ( + ), + 'shinjo' => + array ( + ), + 'shirataka' => + array ( + ), + 'shonai' => + array ( + ), + 'takahata' => + array ( + ), + 'tendo' => + array ( + ), + 'tozawa' => + array ( + ), + 'tsuruoka' => + array ( + ), + 'yamagata' => + array ( + ), + 'yamanobe' => + array ( + ), + 'yonezawa' => + array ( + ), + 'yuza' => + array ( + ), + ), + 'yamaguchi' => + array ( + 'abu' => + array ( + ), + 'hagi' => + array ( + ), + 'hikari' => + array ( + ), + 'hofu' => + array ( + ), + 'iwakuni' => + array ( + ), + 'kudamatsu' => + array ( + ), + 'mitou' => + array ( + ), + 'nagato' => + array ( + ), + 'oshima' => + array ( + ), + 'shimonoseki' => + array ( + ), + 'shunan' => + array ( + ), + 'tabuse' => + array ( + ), + 'tokuyama' => + array ( + ), + 'toyota' => + array ( + ), + 'ube' => + array ( + ), + 'yuu' => + array ( + ), + ), + 'yamanashi' => + array ( + 'chuo' => + array ( + ), + 'doshi' => + array ( + ), + 'fuefuki' => + array ( + ), + 'fujikawa' => + array ( + ), + 'fujikawaguchiko' => + array ( + ), + 'fujiyoshida' => + array ( + ), + 'hayakawa' => + array ( + ), + 'hokuto' => + array ( + ), + 'ichikawamisato' => + array ( + ), + 'kai' => + array ( + ), + 'kofu' => + array ( + ), + 'koshu' => + array ( + ), + 'kosuge' => + array ( + ), + 'minami-alps' => + array ( + ), + 'minobu' => + array ( + ), + 'nakamichi' => + array ( + ), + 'nanbu' => + array ( + ), + 'narusawa' => + array ( + ), + 'nirasaki' => + array ( + ), + 'nishikatsura' => + array ( + ), + 'oshino' => + array ( + ), + 'otsuki' => + array ( + ), + 'showa' => + array ( + ), + 'tabayama' => + array ( + ), + 'tsuru' => + array ( + ), + 'uenohara' => + array ( + ), + 'yamanakako' => + array ( + ), + 'yamanashi' => + array ( + ), + ), + 'xn--4pvxs' => + array ( + ), + 'xn--vgu402c' => + array ( + ), + 'xn--c3s14m' => + array ( + ), + 'xn--f6qx53a' => + array ( + ), + 'xn--8pvr4u' => + array ( + ), + 'xn--uist22h' => + array ( + ), + 'xn--djrs72d6uy' => + array ( + ), + 'xn--mkru45i' => + array ( + ), + 'xn--0trq7p7nn' => + array ( + ), + 'xn--8ltr62k' => + array ( + ), + 'xn--2m4a15e' => + array ( + ), + 'xn--efvn9s' => + array ( + ), + 'xn--32vp30h' => + array ( + ), + 'xn--4it797k' => + array ( + ), + 'xn--1lqs71d' => + array ( + ), + 'xn--5rtp49c' => + array ( + ), + 'xn--5js045d' => + array ( + ), + 'xn--ehqz56n' => + array ( + ), + 'xn--1lqs03n' => + array ( + ), + 'xn--qqqt11m' => + array ( + ), + 'xn--kbrq7o' => + array ( + ), + 'xn--pssu33l' => + array ( + ), + 'xn--ntsq17g' => + array ( + ), + 'xn--uisz3g' => + array ( + ), + 'xn--6btw5a' => + array ( + ), + 'xn--1ctwo' => + array ( + ), + 'xn--6orx2r' => + array ( + ), + 'xn--rht61e' => + array ( + ), + 'xn--rht27z' => + array ( + ), + 'xn--djty4k' => + array ( + ), + 'xn--nit225k' => + array ( + ), + 'xn--rht3d' => + array ( + ), + 'xn--klty5x' => + array ( + ), + 'xn--kltx9a' => + array ( + ), + 'xn--kltp7d' => + array ( + ), + 'xn--uuwu58a' => + array ( + ), + 'xn--zbx025d' => + array ( + ), + 'xn--ntso0iqx3a' => + array ( + ), + 'xn--elqq16h' => + array ( + ), + 'xn--4it168d' => + array ( + ), + 'xn--klt787d' => + array ( + ), + 'xn--rny31h' => + array ( + ), + 'xn--7t0a264c' => + array ( + ), + 'xn--5rtq34k' => + array ( + ), + 'xn--k7yn95e' => + array ( + ), + 'xn--tor131o' => + array ( + ), + 'xn--d5qv7z876c' => + array ( + ), + 'kawasaki' => + array ( + '*' => + array ( + ), + 'city' => + array ( + '!' => '', + ), + ), + 'kitakyushu' => + array ( + '*' => + array ( + ), + 'city' => + array ( + '!' => '', + ), + ), + 'kobe' => + array ( + '*' => + array ( + ), + 'city' => + array ( + '!' => '', + ), + ), + 'nagoya' => + array ( + '*' => + array ( + ), + 'city' => + array ( + '!' => '', + ), + ), + 'sapporo' => + array ( + '*' => + array ( + ), + 'city' => + array ( + '!' => '', + ), + ), + 'sendai' => + array ( + '*' => + array ( + ), + 'city' => + array ( + '!' => '', + ), + ), + 'yokohama' => + array ( + '*' => + array ( + ), + 'city' => + array ( + '!' => '', + ), + ), + ), + 'ke' => + array ( + '*' => + array ( + ), + ), + 'kg' => + array ( + 'org' => + array ( + ), + 'net' => + array ( + ), + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => + array ( + ), + ), + 'kh' => + array ( + '*' => + array ( + ), + ), + 'ki' => + array ( + 'edu' => + array ( + ), + 'biz' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'gov' => + array ( + ), + 'info' => + array ( + ), + 'com' => + array ( + ), + ), + 'km' => + array ( + 'org' => + array ( + ), + 'nom' => + array ( + ), + 'gov' => + array ( + ), + 'prd' => + array ( + ), + 'tm' => + array ( + ), + 'edu' => + array ( + ), + 'mil' => + array ( + ), + 'ass' => + array ( + ), + 'com' => + array ( + ), + 'coop' => + array ( + ), + 'asso' => + array ( + ), + 'presse' => + array ( + ), + 'medecin' => + array ( + ), + 'notaires' => + array ( + ), + 'pharmaciens' => + array ( + ), + 'veterinaire' => + array ( + ), + 'gouv' => + array ( + ), + ), + 'kn' => + array ( + 'net' => + array ( + ), + 'org' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + ), + 'kp' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'org' => + array ( + ), + 'rep' => + array ( + ), + 'tra' => + array ( + ), + ), + 'kr' => + array ( + 'ac' => + array ( + ), + 'co' => + array ( + ), + 'es' => + array ( + ), + 'go' => + array ( + ), + 'hs' => + array ( + ), + 'kg' => + array ( + ), + 'mil' => + array ( + ), + 'ms' => + array ( + ), + 'ne' => + array ( + ), + 'or' => + array ( + ), + 'pe' => + array ( + ), + 're' => + array ( + ), + 'sc' => + array ( + ), + 'busan' => + array ( + ), + 'chungbuk' => + array ( + ), + 'chungnam' => + array ( + ), + 'daegu' => + array ( + ), + 'daejeon' => + array ( + ), + 'gangwon' => + array ( + ), + 'gwangju' => + array ( + ), + 'gyeongbuk' => + array ( + ), + 'gyeonggi' => + array ( + ), + 'gyeongnam' => + array ( + ), + 'incheon' => + array ( + ), + 'jeju' => + array ( + ), + 'jeonbuk' => + array ( + ), + 'jeonnam' => + array ( + ), + 'seoul' => + array ( + ), + 'ulsan' => + array ( + ), + ), + 'kw' => + array ( + '*' => + array ( + ), + ), + 'ky' => + array ( + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'com' => + array ( + ), + 'org' => + array ( + ), + 'net' => + array ( + ), + ), + 'kz' => + array ( + 'org' => + array ( + ), + 'edu' => + array ( + ), + 'net' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => + array ( + ), + 'com' => + array ( + ), + ), + 'la' => + array ( + 'int' => + array ( + ), + 'net' => + array ( + ), + 'info' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'per' => + array ( + ), + 'com' => + array ( + ), + 'org' => + array ( + ), + ), + 'lb' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'lc' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'co' => + array ( + ), + 'org' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + ), + 'li' => + array ( + ), + 'lk' => + array ( + 'gov' => + array ( + ), + 'sch' => + array ( + ), + 'net' => + array ( + ), + 'int' => + array ( + ), + 'com' => + array ( + ), + 'org' => + array ( + ), + 'edu' => + array ( + ), + 'ngo' => + array ( + ), + 'soc' => + array ( + ), + 'web' => + array ( + ), + 'ltd' => + array ( + ), + 'assn' => + array ( + ), + 'grp' => + array ( + ), + 'hotel' => + array ( + ), + 'ac' => + array ( + ), + ), + 'lr' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'org' => + array ( + ), + 'net' => + array ( + ), + ), + 'ls' => + array ( + 'co' => + array ( + ), + 'org' => + array ( + ), + ), + 'lt' => + array ( + 'gov' => + array ( + ), + ), + 'lu' => + array ( + ), + 'lv' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'org' => + array ( + ), + 'mil' => + array ( + ), + 'id' => + array ( + ), + 'net' => + array ( + ), + 'asn' => + array ( + ), + 'conf' => + array ( + ), + ), + 'ly' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'gov' => + array ( + ), + 'plc' => + array ( + ), + 'edu' => + array ( + ), + 'sch' => + array ( + ), + 'med' => + array ( + ), + 'org' => + array ( + ), + 'id' => + array ( + ), + ), + 'ma' => + array ( + 'co' => + array ( + ), + 'net' => + array ( + ), + 'gov' => + array ( + ), + 'org' => + array ( + ), + 'ac' => + array ( + ), + 'press' => + array ( + ), + ), + 'mc' => + array ( + 'tm' => + array ( + ), + 'asso' => + array ( + ), + ), + 'md' => + array ( + ), + 'me' => + array ( + 'co' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'edu' => + array ( + ), + 'ac' => + array ( + ), + 'gov' => + array ( + ), + 'its' => + array ( + ), + 'priv' => + array ( + ), + ), + 'mg' => + array ( + 'org' => + array ( + ), + 'nom' => + array ( + ), + 'gov' => + array ( + ), + 'prd' => + array ( + ), + 'tm' => + array ( + ), + 'edu' => + array ( + ), + 'mil' => + array ( + ), + 'com' => + array ( + ), + 'co' => + array ( + ), + ), + 'mh' => + array ( + ), + 'mil' => + array ( + ), + 'mk' => + array ( + 'com' => + array ( + ), + 'org' => + array ( + ), + 'net' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'inf' => + array ( + ), + 'name' => + array ( + ), + ), + 'ml' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gouv' => + array ( + ), + 'gov' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'presse' => + array ( + ), + ), + 'mm' => + array ( + '*' => + array ( + ), + ), + 'mn' => + array ( + 'gov' => + array ( + ), + 'edu' => + array ( + ), + 'org' => + array ( + ), + ), + 'mo' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + ), + 'mobi' => + array ( + ), + 'mp' => + array ( + ), + 'mq' => + array ( + ), + 'mr' => + array ( + 'gov' => + array ( + ), + ), + 'ms' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'mt' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'mu' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'gov' => + array ( + ), + 'ac' => + array ( + ), + 'co' => + array ( + ), + 'or' => + array ( + ), + ), + 'museum' => + array ( + 'academy' => + array ( + ), + 'agriculture' => + array ( + ), + 'air' => + array ( + ), + 'airguard' => + array ( + ), + 'alabama' => + array ( + ), + 'alaska' => + array ( + ), + 'amber' => + array ( + ), + 'ambulance' => + array ( + ), + 'american' => + array ( + ), + 'americana' => + array ( + ), + 'americanantiques' => + array ( + ), + 'americanart' => + array ( + ), + 'amsterdam' => + array ( + ), + 'and' => + array ( + ), + 'annefrank' => + array ( + ), + 'anthro' => + array ( + ), + 'anthropology' => + array ( + ), + 'antiques' => + array ( + ), + 'aquarium' => + array ( + ), + 'arboretum' => + array ( + ), + 'archaeological' => + array ( + ), + 'archaeology' => + array ( + ), + 'architecture' => + array ( + ), + 'art' => + array ( + ), + 'artanddesign' => + array ( + ), + 'artcenter' => + array ( + ), + 'artdeco' => + array ( + ), + 'arteducation' => + array ( + ), + 'artgallery' => + array ( + ), + 'arts' => + array ( + ), + 'artsandcrafts' => + array ( + ), + 'asmatart' => + array ( + ), + 'assassination' => + array ( + ), + 'assisi' => + array ( + ), + 'association' => + array ( + ), + 'astronomy' => + array ( + ), + 'atlanta' => + array ( + ), + 'austin' => + array ( + ), + 'australia' => + array ( + ), + 'automotive' => + array ( + ), + 'aviation' => + array ( + ), + 'axis' => + array ( + ), + 'badajoz' => + array ( + ), + 'baghdad' => + array ( + ), + 'bahn' => + array ( + ), + 'bale' => + array ( + ), + 'baltimore' => + array ( + ), + 'barcelona' => + array ( + ), + 'baseball' => + array ( + ), + 'basel' => + array ( + ), + 'baths' => + array ( + ), + 'bauern' => + array ( + ), + 'beauxarts' => + array ( + ), + 'beeldengeluid' => + array ( + ), + 'bellevue' => + array ( + ), + 'bergbau' => + array ( + ), + 'berkeley' => + array ( + ), + 'berlin' => + array ( + ), + 'bern' => + array ( + ), + 'bible' => + array ( + ), + 'bilbao' => + array ( + ), + 'bill' => + array ( + ), + 'birdart' => + array ( + ), + 'birthplace' => + array ( + ), + 'bonn' => + array ( + ), + 'boston' => + array ( + ), + 'botanical' => + array ( + ), + 'botanicalgarden' => + array ( + ), + 'botanicgarden' => + array ( + ), + 'botany' => + array ( + ), + 'brandywinevalley' => + array ( + ), + 'brasil' => + array ( + ), + 'bristol' => + array ( + ), + 'british' => + array ( + ), + 'britishcolumbia' => + array ( + ), + 'broadcast' => + array ( + ), + 'brunel' => + array ( + ), + 'brussel' => + array ( + ), + 'brussels' => + array ( + ), + 'bruxelles' => + array ( + ), + 'building' => + array ( + ), + 'burghof' => + array ( + ), + 'bus' => + array ( + ), + 'bushey' => + array ( + ), + 'cadaques' => + array ( + ), + 'california' => + array ( + ), + 'cambridge' => + array ( + ), + 'can' => + array ( + ), + 'canada' => + array ( + ), + 'capebreton' => + array ( + ), + 'carrier' => + array ( + ), + 'cartoonart' => + array ( + ), + 'casadelamoneda' => + array ( + ), + 'castle' => + array ( + ), + 'castres' => + array ( + ), + 'celtic' => + array ( + ), + 'center' => + array ( + ), + 'chattanooga' => + array ( + ), + 'cheltenham' => + array ( + ), + 'chesapeakebay' => + array ( + ), + 'chicago' => + array ( + ), + 'children' => + array ( + ), + 'childrens' => + array ( + ), + 'childrensgarden' => + array ( + ), + 'chiropractic' => + array ( + ), + 'chocolate' => + array ( + ), + 'christiansburg' => + array ( + ), + 'cincinnati' => + array ( + ), + 'cinema' => + array ( + ), + 'circus' => + array ( + ), + 'civilisation' => + array ( + ), + 'civilization' => + array ( + ), + 'civilwar' => + array ( + ), + 'clinton' => + array ( + ), + 'clock' => + array ( + ), + 'coal' => + array ( + ), + 'coastaldefence' => + array ( + ), + 'cody' => + array ( + ), + 'coldwar' => + array ( + ), + 'collection' => + array ( + ), + 'colonialwilliamsburg' => + array ( + ), + 'coloradoplateau' => + array ( + ), + 'columbia' => + array ( + ), + 'columbus' => + array ( + ), + 'communication' => + array ( + ), + 'communications' => + array ( + ), + 'community' => + array ( + ), + 'computer' => + array ( + ), + 'computerhistory' => + array ( + ), + 'xn--comunicaes-v6a2o' => + array ( + ), + 'contemporary' => + array ( + ), + 'contemporaryart' => + array ( + ), + 'convent' => + array ( + ), + 'copenhagen' => + array ( + ), + 'corporation' => + array ( + ), + 'xn--correios-e-telecomunicaes-ghc29a' => + array ( + ), + 'corvette' => + array ( + ), + 'costume' => + array ( + ), + 'countryestate' => + array ( + ), + 'county' => + array ( + ), + 'crafts' => + array ( + ), + 'cranbrook' => + array ( + ), + 'creation' => + array ( + ), + 'cultural' => + array ( + ), + 'culturalcenter' => + array ( + ), + 'culture' => + array ( + ), + 'cyber' => + array ( + ), + 'cymru' => + array ( + ), + 'dali' => + array ( + ), + 'dallas' => + array ( + ), + 'database' => + array ( + ), + 'ddr' => + array ( + ), + 'decorativearts' => + array ( + ), + 'delaware' => + array ( + ), + 'delmenhorst' => + array ( + ), + 'denmark' => + array ( + ), + 'depot' => + array ( + ), + 'design' => + array ( + ), + 'detroit' => + array ( + ), + 'dinosaur' => + array ( + ), + 'discovery' => + array ( + ), + 'dolls' => + array ( + ), + 'donostia' => + array ( + ), + 'durham' => + array ( + ), + 'eastafrica' => + array ( + ), + 'eastcoast' => + array ( + ), + 'education' => + array ( + ), + 'educational' => + array ( + ), + 'egyptian' => + array ( + ), + 'eisenbahn' => + array ( + ), + 'elburg' => + array ( + ), + 'elvendrell' => + array ( + ), + 'embroidery' => + array ( + ), + 'encyclopedic' => + array ( + ), + 'england' => + array ( + ), + 'entomology' => + array ( + ), + 'environment' => + array ( + ), + 'environmentalconservation' => + array ( + ), + 'epilepsy' => + array ( + ), + 'essex' => + array ( + ), + 'estate' => + array ( + ), + 'ethnology' => + array ( + ), + 'exeter' => + array ( + ), + 'exhibition' => + array ( + ), + 'family' => + array ( + ), + 'farm' => + array ( + ), + 'farmequipment' => + array ( + ), + 'farmers' => + array ( + ), + 'farmstead' => + array ( + ), + 'field' => + array ( + ), + 'figueres' => + array ( + ), + 'filatelia' => + array ( + ), + 'film' => + array ( + ), + 'fineart' => + array ( + ), + 'finearts' => + array ( + ), + 'finland' => + array ( + ), + 'flanders' => + array ( + ), + 'florida' => + array ( + ), + 'force' => + array ( + ), + 'fortmissoula' => + array ( + ), + 'fortworth' => + array ( + ), + 'foundation' => + array ( + ), + 'francaise' => + array ( + ), + 'frankfurt' => + array ( + ), + 'franziskaner' => + array ( + ), + 'freemasonry' => + array ( + ), + 'freiburg' => + array ( + ), + 'fribourg' => + array ( + ), + 'frog' => + array ( + ), + 'fundacio' => + array ( + ), + 'furniture' => + array ( + ), + 'gallery' => + array ( + ), + 'garden' => + array ( + ), + 'gateway' => + array ( + ), + 'geelvinck' => + array ( + ), + 'gemological' => + array ( + ), + 'geology' => + array ( + ), + 'georgia' => + array ( + ), + 'giessen' => + array ( + ), + 'glas' => + array ( + ), + 'glass' => + array ( + ), + 'gorge' => + array ( + ), + 'grandrapids' => + array ( + ), + 'graz' => + array ( + ), + 'guernsey' => + array ( + ), + 'halloffame' => + array ( + ), + 'hamburg' => + array ( + ), + 'handson' => + array ( + ), + 'harvestcelebration' => + array ( + ), + 'hawaii' => + array ( + ), + 'health' => + array ( + ), + 'heimatunduhren' => + array ( + ), + 'hellas' => + array ( + ), + 'helsinki' => + array ( + ), + 'hembygdsforbund' => + array ( + ), + 'heritage' => + array ( + ), + 'histoire' => + array ( + ), + 'historical' => + array ( + ), + 'historicalsociety' => + array ( + ), + 'historichouses' => + array ( + ), + 'historisch' => + array ( + ), + 'historisches' => + array ( + ), + 'history' => + array ( + ), + 'historyofscience' => + array ( + ), + 'horology' => + array ( + ), + 'house' => + array ( + ), + 'humanities' => + array ( + ), + 'illustration' => + array ( + ), + 'imageandsound' => + array ( + ), + 'indian' => + array ( + ), + 'indiana' => + array ( + ), + 'indianapolis' => + array ( + ), + 'indianmarket' => + array ( + ), + 'intelligence' => + array ( + ), + 'interactive' => + array ( + ), + 'iraq' => + array ( + ), + 'iron' => + array ( + ), + 'isleofman' => + array ( + ), + 'jamison' => + array ( + ), + 'jefferson' => + array ( + ), + 'jerusalem' => + array ( + ), + 'jewelry' => + array ( + ), + 'jewish' => + array ( + ), + 'jewishart' => + array ( + ), + 'jfk' => + array ( + ), + 'journalism' => + array ( + ), + 'judaica' => + array ( + ), + 'judygarland' => + array ( + ), + 'juedisches' => + array ( + ), + 'juif' => + array ( + ), + 'karate' => + array ( + ), + 'karikatur' => + array ( + ), + 'kids' => + array ( + ), + 'koebenhavn' => + array ( + ), + 'koeln' => + array ( + ), + 'kunst' => + array ( + ), + 'kunstsammlung' => + array ( + ), + 'kunstunddesign' => + array ( + ), + 'labor' => + array ( + ), + 'labour' => + array ( + ), + 'lajolla' => + array ( + ), + 'lancashire' => + array ( + ), + 'landes' => + array ( + ), + 'lans' => + array ( + ), + 'xn--lns-qla' => + array ( + ), + 'larsson' => + array ( + ), + 'lewismiller' => + array ( + ), + 'lincoln' => + array ( + ), + 'linz' => + array ( + ), + 'living' => + array ( + ), + 'livinghistory' => + array ( + ), + 'localhistory' => + array ( + ), + 'london' => + array ( + ), + 'losangeles' => + array ( + ), + 'louvre' => + array ( + ), + 'loyalist' => + array ( + ), + 'lucerne' => + array ( + ), + 'luxembourg' => + array ( + ), + 'luzern' => + array ( + ), + 'mad' => + array ( + ), + 'madrid' => + array ( + ), + 'mallorca' => + array ( + ), + 'manchester' => + array ( + ), + 'mansion' => + array ( + ), + 'mansions' => + array ( + ), + 'manx' => + array ( + ), + 'marburg' => + array ( + ), + 'maritime' => + array ( + ), + 'maritimo' => + array ( + ), + 'maryland' => + array ( + ), + 'marylhurst' => + array ( + ), + 'media' => + array ( + ), + 'medical' => + array ( + ), + 'medizinhistorisches' => + array ( + ), + 'meeres' => + array ( + ), + 'memorial' => + array ( + ), + 'mesaverde' => + array ( + ), + 'michigan' => + array ( + ), + 'midatlantic' => + array ( + ), + 'military' => + array ( + ), + 'mill' => + array ( + ), + 'miners' => + array ( + ), + 'mining' => + array ( + ), + 'minnesota' => + array ( + ), + 'missile' => + array ( + ), + 'missoula' => + array ( + ), + 'modern' => + array ( + ), + 'moma' => + array ( + ), + 'money' => + array ( + ), + 'monmouth' => + array ( + ), + 'monticello' => + array ( + ), + 'montreal' => + array ( + ), + 'moscow' => + array ( + ), + 'motorcycle' => + array ( + ), + 'muenchen' => + array ( + ), + 'muenster' => + array ( + ), + 'mulhouse' => + array ( + ), + 'muncie' => + array ( + ), + 'museet' => + array ( + ), + 'museumcenter' => + array ( + ), + 'museumvereniging' => + array ( + ), + 'music' => + array ( + ), + 'national' => + array ( + ), + 'nationalfirearms' => + array ( + ), + 'nationalheritage' => + array ( + ), + 'nativeamerican' => + array ( + ), + 'naturalhistory' => + array ( + ), + 'naturalhistorymuseum' => + array ( + ), + 'naturalsciences' => + array ( + ), + 'nature' => + array ( + ), + 'naturhistorisches' => + array ( + ), + 'natuurwetenschappen' => + array ( + ), + 'naumburg' => + array ( + ), + 'naval' => + array ( + ), + 'nebraska' => + array ( + ), + 'neues' => + array ( + ), + 'newhampshire' => + array ( + ), + 'newjersey' => + array ( + ), + 'newmexico' => + array ( + ), + 'newport' => + array ( + ), + 'newspaper' => + array ( + ), + 'newyork' => + array ( + ), + 'niepce' => + array ( + ), + 'norfolk' => + array ( + ), + 'north' => + array ( + ), + 'nrw' => + array ( + ), + 'nuernberg' => + array ( + ), + 'nuremberg' => + array ( + ), + 'nyc' => + array ( + ), + 'nyny' => + array ( + ), + 'oceanographic' => + array ( + ), + 'oceanographique' => + array ( + ), + 'omaha' => + array ( + ), + 'online' => + array ( + ), + 'ontario' => + array ( + ), + 'openair' => + array ( + ), + 'oregon' => + array ( + ), + 'oregontrail' => + array ( + ), + 'otago' => + array ( + ), + 'oxford' => + array ( + ), + 'pacific' => + array ( + ), + 'paderborn' => + array ( + ), + 'palace' => + array ( + ), + 'paleo' => + array ( + ), + 'palmsprings' => + array ( + ), + 'panama' => + array ( + ), + 'paris' => + array ( + ), + 'pasadena' => + array ( + ), + 'pharmacy' => + array ( + ), + 'philadelphia' => + array ( + ), + 'philadelphiaarea' => + array ( + ), + 'philately' => + array ( + ), + 'phoenix' => + array ( + ), + 'photography' => + array ( + ), + 'pilots' => + array ( + ), + 'pittsburgh' => + array ( + ), + 'planetarium' => + array ( + ), + 'plantation' => + array ( + ), + 'plants' => + array ( + ), + 'plaza' => + array ( + ), + 'portal' => + array ( + ), + 'portland' => + array ( + ), + 'portlligat' => + array ( + ), + 'posts-and-telecommunications' => + array ( + ), + 'preservation' => + array ( + ), + 'presidio' => + array ( + ), + 'press' => + array ( + ), + 'project' => + array ( + ), + 'public' => + array ( + ), + 'pubol' => + array ( + ), + 'quebec' => + array ( + ), + 'railroad' => + array ( + ), + 'railway' => + array ( + ), + 'research' => + array ( + ), + 'resistance' => + array ( + ), + 'riodejaneiro' => + array ( + ), + 'rochester' => + array ( + ), + 'rockart' => + array ( + ), + 'roma' => + array ( + ), + 'russia' => + array ( + ), + 'saintlouis' => + array ( + ), + 'salem' => + array ( + ), + 'salvadordali' => + array ( + ), + 'salzburg' => + array ( + ), + 'sandiego' => + array ( + ), + 'sanfrancisco' => + array ( + ), + 'santabarbara' => + array ( + ), + 'santacruz' => + array ( + ), + 'santafe' => + array ( + ), + 'saskatchewan' => + array ( + ), + 'satx' => + array ( + ), + 'savannahga' => + array ( + ), + 'schlesisches' => + array ( + ), + 'schoenbrunn' => + array ( + ), + 'schokoladen' => + array ( + ), + 'school' => + array ( + ), + 'schweiz' => + array ( + ), + 'science' => + array ( + ), + 'scienceandhistory' => + array ( + ), + 'scienceandindustry' => + array ( + ), + 'sciencecenter' => + array ( + ), + 'sciencecenters' => + array ( + ), + 'science-fiction' => + array ( + ), + 'sciencehistory' => + array ( + ), + 'sciences' => + array ( + ), + 'sciencesnaturelles' => + array ( + ), + 'scotland' => + array ( + ), + 'seaport' => + array ( + ), + 'settlement' => + array ( + ), + 'settlers' => + array ( + ), + 'shell' => + array ( + ), + 'sherbrooke' => + array ( + ), + 'sibenik' => + array ( + ), + 'silk' => + array ( + ), + 'ski' => + array ( + ), + 'skole' => + array ( + ), + 'society' => + array ( + ), + 'sologne' => + array ( + ), + 'soundandvision' => + array ( + ), + 'southcarolina' => + array ( + ), + 'southwest' => + array ( + ), + 'space' => + array ( + ), + 'spy' => + array ( + ), + 'square' => + array ( + ), + 'stadt' => + array ( + ), + 'stalbans' => + array ( + ), + 'starnberg' => + array ( + ), + 'state' => + array ( + ), + 'stateofdelaware' => + array ( + ), + 'station' => + array ( + ), + 'steam' => + array ( + ), + 'steiermark' => + array ( + ), + 'stjohn' => + array ( + ), + 'stockholm' => + array ( + ), + 'stpetersburg' => + array ( + ), + 'stuttgart' => + array ( + ), + 'suisse' => + array ( + ), + 'surgeonshall' => + array ( + ), + 'surrey' => + array ( + ), + 'svizzera' => + array ( + ), + 'sweden' => + array ( + ), + 'sydney' => + array ( + ), + 'tank' => + array ( + ), + 'tcm' => + array ( + ), + 'technology' => + array ( + ), + 'telekommunikation' => + array ( + ), + 'television' => + array ( + ), + 'texas' => + array ( + ), + 'textile' => + array ( + ), + 'theater' => + array ( + ), + 'time' => + array ( + ), + 'timekeeping' => + array ( + ), + 'topology' => + array ( + ), + 'torino' => + array ( + ), + 'touch' => + array ( + ), + 'town' => + array ( + ), + 'transport' => + array ( + ), + 'tree' => + array ( + ), + 'trolley' => + array ( + ), + 'trust' => + array ( + ), + 'trustee' => + array ( + ), + 'uhren' => + array ( + ), + 'ulm' => + array ( + ), + 'undersea' => + array ( + ), + 'university' => + array ( + ), + 'usa' => + array ( + ), + 'usantiques' => + array ( + ), + 'usarts' => + array ( + ), + 'uscountryestate' => + array ( + ), + 'usculture' => + array ( + ), + 'usdecorativearts' => + array ( + ), + 'usgarden' => + array ( + ), + 'ushistory' => + array ( + ), + 'ushuaia' => + array ( + ), + 'uslivinghistory' => + array ( + ), + 'utah' => + array ( + ), + 'uvic' => + array ( + ), + 'valley' => + array ( + ), + 'vantaa' => + array ( + ), + 'versailles' => + array ( + ), + 'viking' => + array ( + ), + 'village' => + array ( + ), + 'virginia' => + array ( + ), + 'virtual' => + array ( + ), + 'virtuel' => + array ( + ), + 'vlaanderen' => + array ( + ), + 'volkenkunde' => + array ( + ), + 'wales' => + array ( + ), + 'wallonie' => + array ( + ), + 'war' => + array ( + ), + 'washingtondc' => + array ( + ), + 'watchandclock' => + array ( + ), + 'watch-and-clock' => + array ( + ), + 'western' => + array ( + ), + 'westfalen' => + array ( + ), + 'whaling' => + array ( + ), + 'wildlife' => + array ( + ), + 'williamsburg' => + array ( + ), + 'windmill' => + array ( + ), + 'workshop' => + array ( + ), + 'york' => + array ( + ), + 'yorkshire' => + array ( + ), + 'yosemite' => + array ( + ), + 'youth' => + array ( + ), + 'zoological' => + array ( + ), + 'zoology' => + array ( + ), + 'xn--9dbhblg6di' => + array ( + ), + 'xn--h1aegh' => + array ( + ), + ), + 'mv' => + array ( + 'aero' => + array ( + ), + 'biz' => + array ( + ), + 'com' => + array ( + ), + 'coop' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'info' => + array ( + ), + 'int' => + array ( + ), + 'mil' => + array ( + ), + 'museum' => + array ( + ), + 'name' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'pro' => + array ( + ), + ), + 'mw' => + array ( + 'ac' => + array ( + ), + 'biz' => + array ( + ), + 'co' => + array ( + ), + 'com' => + array ( + ), + 'coop' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'int' => + array ( + ), + 'museum' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'mx' => + array ( + 'com' => + array ( + ), + 'org' => + array ( + ), + 'gob' => + array ( + ), + 'edu' => + array ( + ), + 'net' => + array ( + ), + ), + 'my' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'gov' => + array ( + ), + 'edu' => + array ( + ), + 'mil' => + array ( + ), + 'name' => + array ( + ), + ), + 'mz' => + array ( + 'ac' => + array ( + ), + 'adv' => + array ( + ), + 'co' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'na' => + array ( + 'info' => + array ( + ), + 'pro' => + array ( + ), + 'name' => + array ( + ), + 'school' => + array ( + ), + 'or' => + array ( + ), + 'dr' => + array ( + ), + 'us' => + array ( + ), + 'mx' => + array ( + ), + 'ca' => + array ( + ), + 'in' => + array ( + ), + 'cc' => + array ( + ), + 'tv' => + array ( + ), + 'ws' => + array ( + ), + 'mobi' => + array ( + ), + 'co' => + array ( + ), + 'com' => + array ( + ), + 'org' => + array ( + ), + ), + 'name' => + array ( + ), + 'nc' => + array ( + 'asso' => + array ( + ), + ), + 'ne' => + array ( + ), + 'net' => + array ( + ), + 'nf' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'per' => + array ( + ), + 'rec' => + array ( + ), + 'web' => + array ( + ), + 'arts' => + array ( + ), + 'firm' => + array ( + ), + 'info' => + array ( + ), + 'other' => + array ( + ), + 'store' => + array ( + ), + ), + 'ng' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'i' => + array ( + ), + 'mil' => + array ( + ), + 'mobi' => + array ( + ), + 'name' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'sch' => + array ( + ), + ), + 'ni' => + array ( + 'com' => + array ( + ), + 'gob' => + array ( + ), + 'edu' => + array ( + ), + 'org' => + array ( + ), + 'nom' => + array ( + ), + 'net' => + array ( + ), + 'mil' => + array ( + ), + 'co' => + array ( + ), + 'biz' => + array ( + ), + 'web' => + array ( + ), + 'int' => + array ( + ), + 'ac' => + array ( + ), + 'in' => + array ( + ), + 'info' => + array ( + ), + ), + 'nl' => + array ( + 'bv' => + array ( + ), + ), + 'no' => + array ( + 'fhs' => + array ( + ), + 'vgs' => + array ( + ), + 'fylkesbibl' => + array ( + ), + 'folkebibl' => + array ( + ), + 'museum' => + array ( + ), + 'idrett' => + array ( + ), + 'priv' => + array ( + ), + 'mil' => + array ( + ), + 'stat' => + array ( + ), + 'dep' => + array ( + ), + 'kommune' => + array ( + ), + 'herad' => + array ( + ), + 'aa' => + array ( + 'gs' => + array ( + ), + ), + 'ah' => + array ( + 'gs' => + array ( + ), + ), + 'bu' => + array ( + 'gs' => + array ( + ), + ), + 'fm' => + array ( + 'gs' => + array ( + ), + ), + 'hl' => + array ( + 'gs' => + array ( + ), + ), + 'hm' => + array ( + 'gs' => + array ( + ), + ), + 'jan-mayen' => + array ( + 'gs' => + array ( + ), + ), + 'mr' => + array ( + 'gs' => + array ( + ), + ), + 'nl' => + array ( + 'gs' => + array ( + ), + ), + 'nt' => + array ( + 'gs' => + array ( + ), + ), + 'of' => + array ( + 'gs' => + array ( + ), + ), + 'ol' => + array ( + 'gs' => + array ( + ), + ), + 'oslo' => + array ( + 'gs' => + array ( + ), + ), + 'rl' => + array ( + 'gs' => + array ( + ), + ), + 'sf' => + array ( + 'gs' => + array ( + ), + ), + 'st' => + array ( + 'gs' => + array ( + ), + ), + 'svalbard' => + array ( + 'gs' => + array ( + ), + ), + 'tm' => + array ( + 'gs' => + array ( + ), + ), + 'tr' => + array ( + 'gs' => + array ( + ), + ), + 'va' => + array ( + 'gs' => + array ( + ), + ), + 'vf' => + array ( + 'gs' => + array ( + ), + ), + 'akrehamn' => + array ( + ), + 'xn--krehamn-dxa' => + array ( + ), + 'algard' => + array ( + ), + 'xn--lgrd-poac' => + array ( + ), + 'arna' => + array ( + ), + 'brumunddal' => + array ( + ), + 'bryne' => + array ( + ), + 'bronnoysund' => + array ( + ), + 'xn--brnnysund-m8ac' => + array ( + ), + 'drobak' => + array ( + ), + 'xn--drbak-wua' => + array ( + ), + 'egersund' => + array ( + ), + 'fetsund' => + array ( + ), + 'floro' => + array ( + ), + 'xn--flor-jra' => + array ( + ), + 'fredrikstad' => + array ( + ), + 'hokksund' => + array ( + ), + 'honefoss' => + array ( + ), + 'xn--hnefoss-q1a' => + array ( + ), + 'jessheim' => + array ( + ), + 'jorpeland' => + array ( + ), + 'xn--jrpeland-54a' => + array ( + ), + 'kirkenes' => + array ( + ), + 'kopervik' => + array ( + ), + 'krokstadelva' => + array ( + ), + 'langevag' => + array ( + ), + 'xn--langevg-jxa' => + array ( + ), + 'leirvik' => + array ( + ), + 'mjondalen' => + array ( + ), + 'xn--mjndalen-64a' => + array ( + ), + 'mo-i-rana' => + array ( + ), + 'mosjoen' => + array ( + ), + 'xn--mosjen-eya' => + array ( + ), + 'nesoddtangen' => + array ( + ), + 'orkanger' => + array ( + ), + 'osoyro' => + array ( + ), + 'xn--osyro-wua' => + array ( + ), + 'raholt' => + array ( + ), + 'xn--rholt-mra' => + array ( + ), + 'sandnessjoen' => + array ( + ), + 'xn--sandnessjen-ogb' => + array ( + ), + 'skedsmokorset' => + array ( + ), + 'slattum' => + array ( + ), + 'spjelkavik' => + array ( + ), + 'stathelle' => + array ( + ), + 'stavern' => + array ( + ), + 'stjordalshalsen' => + array ( + ), + 'xn--stjrdalshalsen-sqb' => + array ( + ), + 'tananger' => + array ( + ), + 'tranby' => + array ( + ), + 'vossevangen' => + array ( + ), + 'afjord' => + array ( + ), + 'xn--fjord-lra' => + array ( + ), + 'agdenes' => + array ( + ), + 'al' => + array ( + ), + 'xn--l-1fa' => + array ( + ), + 'alesund' => + array ( + ), + 'xn--lesund-hua' => + array ( + ), + 'alstahaug' => + array ( + ), + 'alta' => + array ( + ), + 'xn--lt-liac' => + array ( + ), + 'alaheadju' => + array ( + ), + 'xn--laheadju-7ya' => + array ( + ), + 'alvdal' => + array ( + ), + 'amli' => + array ( + ), + 'xn--mli-tla' => + array ( + ), + 'amot' => + array ( + ), + 'xn--mot-tla' => + array ( + ), + 'andebu' => + array ( + ), + 'andoy' => + array ( + ), + 'xn--andy-ira' => + array ( + ), + 'andasuolo' => + array ( + ), + 'ardal' => + array ( + ), + 'xn--rdal-poa' => + array ( + ), + 'aremark' => + array ( + ), + 'arendal' => + array ( + ), + 'xn--s-1fa' => + array ( + ), + 'aseral' => + array ( + ), + 'xn--seral-lra' => + array ( + ), + 'asker' => + array ( + ), + 'askim' => + array ( + ), + 'askvoll' => + array ( + ), + 'askoy' => + array ( + ), + 'xn--asky-ira' => + array ( + ), + 'asnes' => + array ( + ), + 'xn--snes-poa' => + array ( + ), + 'audnedaln' => + array ( + ), + 'aukra' => + array ( + ), + 'aure' => + array ( + ), + 'aurland' => + array ( + ), + 'aurskog-holand' => + array ( + ), + 'xn--aurskog-hland-jnb' => + array ( + ), + 'austevoll' => + array ( + ), + 'austrheim' => + array ( + ), + 'averoy' => + array ( + ), + 'xn--avery-yua' => + array ( + ), + 'balestrand' => + array ( + ), + 'ballangen' => + array ( + ), + 'balat' => + array ( + ), + 'xn--blt-elab' => + array ( + ), + 'balsfjord' => + array ( + ), + 'bahccavuotna' => + array ( + ), + 'xn--bhccavuotna-k7a' => + array ( + ), + 'bamble' => + array ( + ), + 'bardu' => + array ( + ), + 'beardu' => + array ( + ), + 'beiarn' => + array ( + ), + 'bajddar' => + array ( + ), + 'xn--bjddar-pta' => + array ( + ), + 'baidar' => + array ( + ), + 'xn--bidr-5nac' => + array ( + ), + 'berg' => + array ( + ), + 'bergen' => + array ( + ), + 'berlevag' => + array ( + ), + 'xn--berlevg-jxa' => + array ( + ), + 'bearalvahki' => + array ( + ), + 'xn--bearalvhki-y4a' => + array ( + ), + 'bindal' => + array ( + ), + 'birkenes' => + array ( + ), + 'bjarkoy' => + array ( + ), + 'xn--bjarky-fya' => + array ( + ), + 'bjerkreim' => + array ( + ), + 'bjugn' => + array ( + ), + 'bodo' => + array ( + ), + 'xn--bod-2na' => + array ( + ), + 'badaddja' => + array ( + ), + 'xn--bdddj-mrabd' => + array ( + ), + 'budejju' => + array ( + ), + 'bokn' => + array ( + ), + 'bremanger' => + array ( + ), + 'bronnoy' => + array ( + ), + 'xn--brnny-wuac' => + array ( + ), + 'bygland' => + array ( + ), + 'bykle' => + array ( + ), + 'barum' => + array ( + ), + 'xn--brum-voa' => + array ( + ), + 'telemark' => + array ( + 'bo' => + array ( + ), + 'xn--b-5ga' => + array ( + ), + ), + 'nordland' => + array ( + 'bo' => + array ( + ), + 'xn--b-5ga' => + array ( + ), + 'heroy' => + array ( + ), + 'xn--hery-ira' => + array ( + ), + ), + 'bievat' => + array ( + ), + 'xn--bievt-0qa' => + array ( + ), + 'bomlo' => + array ( + ), + 'xn--bmlo-gra' => + array ( + ), + 'batsfjord' => + array ( + ), + 'xn--btsfjord-9za' => + array ( + ), + 'bahcavuotna' => + array ( + ), + 'xn--bhcavuotna-s4a' => + array ( + ), + 'dovre' => + array ( + ), + 'drammen' => + array ( + ), + 'drangedal' => + array ( + ), + 'dyroy' => + array ( + ), + 'xn--dyry-ira' => + array ( + ), + 'donna' => + array ( + ), + 'xn--dnna-gra' => + array ( + ), + 'eid' => + array ( + ), + 'eidfjord' => + array ( + ), + 'eidsberg' => + array ( + ), + 'eidskog' => + array ( + ), + 'eidsvoll' => + array ( + ), + 'eigersund' => + array ( + ), + 'elverum' => + array ( + ), + 'enebakk' => + array ( + ), + 'engerdal' => + array ( + ), + 'etne' => + array ( + ), + 'etnedal' => + array ( + ), + 'evenes' => + array ( + ), + 'evenassi' => + array ( + ), + 'xn--eveni-0qa01ga' => + array ( + ), + 'evje-og-hornnes' => + array ( + ), + 'farsund' => + array ( + ), + 'fauske' => + array ( + ), + 'fuossko' => + array ( + ), + 'fuoisku' => + array ( + ), + 'fedje' => + array ( + ), + 'fet' => + array ( + ), + 'finnoy' => + array ( + ), + 'xn--finny-yua' => + array ( + ), + 'fitjar' => + array ( + ), + 'fjaler' => + array ( + ), + 'fjell' => + array ( + ), + 'flakstad' => + array ( + ), + 'flatanger' => + array ( + ), + 'flekkefjord' => + array ( + ), + 'flesberg' => + array ( + ), + 'flora' => + array ( + ), + 'fla' => + array ( + ), + 'xn--fl-zia' => + array ( + ), + 'folldal' => + array ( + ), + 'forsand' => + array ( + ), + 'fosnes' => + array ( + ), + 'frei' => + array ( + ), + 'frogn' => + array ( + ), + 'froland' => + array ( + ), + 'frosta' => + array ( + ), + 'frana' => + array ( + ), + 'xn--frna-woa' => + array ( + ), + 'froya' => + array ( + ), + 'xn--frya-hra' => + array ( + ), + 'fusa' => + array ( + ), + 'fyresdal' => + array ( + ), + 'forde' => + array ( + ), + 'xn--frde-gra' => + array ( + ), + 'gamvik' => + array ( + ), + 'gangaviika' => + array ( + ), + 'xn--ggaviika-8ya47h' => + array ( + ), + 'gaular' => + array ( + ), + 'gausdal' => + array ( + ), + 'gildeskal' => + array ( + ), + 'xn--gildeskl-g0a' => + array ( + ), + 'giske' => + array ( + ), + 'gjemnes' => + array ( + ), + 'gjerdrum' => + array ( + ), + 'gjerstad' => + array ( + ), + 'gjesdal' => + array ( + ), + 'gjovik' => + array ( + ), + 'xn--gjvik-wua' => + array ( + ), + 'gloppen' => + array ( + ), + 'gol' => + array ( + ), + 'gran' => + array ( + ), + 'grane' => + array ( + ), + 'granvin' => + array ( + ), + 'gratangen' => + array ( + ), + 'grimstad' => + array ( + ), + 'grong' => + array ( + ), + 'kraanghke' => + array ( + ), + 'xn--kranghke-b0a' => + array ( + ), + 'grue' => + array ( + ), + 'gulen' => + array ( + ), + 'hadsel' => + array ( + ), + 'halden' => + array ( + ), + 'halsa' => + array ( + ), + 'hamar' => + array ( + ), + 'hamaroy' => + array ( + ), + 'habmer' => + array ( + ), + 'xn--hbmer-xqa' => + array ( + ), + 'hapmir' => + array ( + ), + 'xn--hpmir-xqa' => + array ( + ), + 'hammerfest' => + array ( + ), + 'hammarfeasta' => + array ( + ), + 'xn--hmmrfeasta-s4ac' => + array ( + ), + 'haram' => + array ( + ), + 'hareid' => + array ( + ), + 'harstad' => + array ( + ), + 'hasvik' => + array ( + ), + 'aknoluokta' => + array ( + ), + 'xn--koluokta-7ya57h' => + array ( + ), + 'hattfjelldal' => + array ( + ), + 'aarborte' => + array ( + ), + 'haugesund' => + array ( + ), + 'hemne' => + array ( + ), + 'hemnes' => + array ( + ), + 'hemsedal' => + array ( + ), + 'more-og-romsdal' => + array ( + 'heroy' => + array ( + ), + 'sande' => + array ( + ), + ), + 'xn--mre-og-romsdal-qqb' => + array ( + 'xn--hery-ira' => + array ( + ), + 'sande' => + array ( + ), + ), + 'hitra' => + array ( + ), + 'hjartdal' => + array ( + ), + 'hjelmeland' => + array ( + ), + 'hobol' => + array ( + ), + 'xn--hobl-ira' => + array ( + ), + 'hof' => + array ( + ), + 'hol' => + array ( + ), + 'hole' => + array ( + ), + 'holmestrand' => + array ( + ), + 'holtalen' => + array ( + ), + 'xn--holtlen-hxa' => + array ( + ), + 'hornindal' => + array ( + ), + 'horten' => + array ( + ), + 'hurdal' => + array ( + ), + 'hurum' => + array ( + ), + 'hvaler' => + array ( + ), + 'hyllestad' => + array ( + ), + 'hagebostad' => + array ( + ), + 'xn--hgebostad-g3a' => + array ( + ), + 'hoyanger' => + array ( + ), + 'xn--hyanger-q1a' => + array ( + ), + 'hoylandet' => + array ( + ), + 'xn--hylandet-54a' => + array ( + ), + 'ha' => + array ( + ), + 'xn--h-2fa' => + array ( + ), + 'ibestad' => + array ( + ), + 'inderoy' => + array ( + ), + 'xn--indery-fya' => + array ( + ), + 'iveland' => + array ( + ), + 'jevnaker' => + array ( + ), + 'jondal' => + array ( + ), + 'jolster' => + array ( + ), + 'xn--jlster-bya' => + array ( + ), + 'karasjok' => + array ( + ), + 'karasjohka' => + array ( + ), + 'xn--krjohka-hwab49j' => + array ( + ), + 'karlsoy' => + array ( + ), + 'galsa' => + array ( + ), + 'xn--gls-elac' => + array ( + ), + 'karmoy' => + array ( + ), + 'xn--karmy-yua' => + array ( + ), + 'kautokeino' => + array ( + ), + 'guovdageaidnu' => + array ( + ), + 'klepp' => + array ( + ), + 'klabu' => + array ( + ), + 'xn--klbu-woa' => + array ( + ), + 'kongsberg' => + array ( + ), + 'kongsvinger' => + array ( + ), + 'kragero' => + array ( + ), + 'xn--krager-gya' => + array ( + ), + 'kristiansand' => + array ( + ), + 'kristiansund' => + array ( + ), + 'krodsherad' => + array ( + ), + 'xn--krdsherad-m8a' => + array ( + ), + 'kvalsund' => + array ( + ), + 'rahkkeravju' => + array ( + ), + 'xn--rhkkervju-01af' => + array ( + ), + 'kvam' => + array ( + ), + 'kvinesdal' => + array ( + ), + 'kvinnherad' => + array ( + ), + 'kviteseid' => + array ( + ), + 'kvitsoy' => + array ( + ), + 'xn--kvitsy-fya' => + array ( + ), + 'kvafjord' => + array ( + ), + 'xn--kvfjord-nxa' => + array ( + ), + 'giehtavuoatna' => + array ( + ), + 'kvanangen' => + array ( + ), + 'xn--kvnangen-k0a' => + array ( + ), + 'navuotna' => + array ( + ), + 'xn--nvuotna-hwa' => + array ( + ), + 'kafjord' => + array ( + ), + 'xn--kfjord-iua' => + array ( + ), + 'gaivuotna' => + array ( + ), + 'xn--givuotna-8ya' => + array ( + ), + 'larvik' => + array ( + ), + 'lavangen' => + array ( + ), + 'lavagis' => + array ( + ), + 'loabat' => + array ( + ), + 'xn--loabt-0qa' => + array ( + ), + 'lebesby' => + array ( + ), + 'davvesiida' => + array ( + ), + 'leikanger' => + array ( + ), + 'leirfjord' => + array ( + ), + 'leka' => + array ( + ), + 'leksvik' => + array ( + ), + 'lenvik' => + array ( + ), + 'leangaviika' => + array ( + ), + 'xn--leagaviika-52b' => + array ( + ), + 'lesja' => + array ( + ), + 'levanger' => + array ( + ), + 'lier' => + array ( + ), + 'lierne' => + array ( + ), + 'lillehammer' => + array ( + ), + 'lillesand' => + array ( + ), + 'lindesnes' => + array ( + ), + 'lindas' => + array ( + ), + 'xn--linds-pra' => + array ( + ), + 'lom' => + array ( + ), + 'loppa' => + array ( + ), + 'lahppi' => + array ( + ), + 'xn--lhppi-xqa' => + array ( + ), + 'lund' => + array ( + ), + 'lunner' => + array ( + ), + 'luroy' => + array ( + ), + 'xn--lury-ira' => + array ( + ), + 'luster' => + array ( + ), + 'lyngdal' => + array ( + ), + 'lyngen' => + array ( + ), + 'ivgu' => + array ( + ), + 'lardal' => + array ( + ), + 'lerdal' => + array ( + ), + 'xn--lrdal-sra' => + array ( + ), + 'lodingen' => + array ( + ), + 'xn--ldingen-q1a' => + array ( + ), + 'lorenskog' => + array ( + ), + 'xn--lrenskog-54a' => + array ( + ), + 'loten' => + array ( + ), + 'xn--lten-gra' => + array ( + ), + 'malvik' => + array ( + ), + 'masoy' => + array ( + ), + 'xn--msy-ula0h' => + array ( + ), + 'muosat' => + array ( + ), + 'xn--muost-0qa' => + array ( + ), + 'mandal' => + array ( + ), + 'marker' => + array ( + ), + 'marnardal' => + array ( + ), + 'masfjorden' => + array ( + ), + 'meland' => + array ( + ), + 'meldal' => + array ( + ), + 'melhus' => + array ( + ), + 'meloy' => + array ( + ), + 'xn--mely-ira' => + array ( + ), + 'meraker' => + array ( + ), + 'xn--merker-kua' => + array ( + ), + 'moareke' => + array ( + ), + 'xn--moreke-jua' => + array ( + ), + 'midsund' => + array ( + ), + 'midtre-gauldal' => + array ( + ), + 'modalen' => + array ( + ), + 'modum' => + array ( + ), + 'molde' => + array ( + ), + 'moskenes' => + array ( + ), + 'moss' => + array ( + ), + 'mosvik' => + array ( + ), + 'malselv' => + array ( + ), + 'xn--mlselv-iua' => + array ( + ), + 'malatvuopmi' => + array ( + ), + 'xn--mlatvuopmi-s4a' => + array ( + ), + 'namdalseid' => + array ( + ), + 'aejrie' => + array ( + ), + 'namsos' => + array ( + ), + 'namsskogan' => + array ( + ), + 'naamesjevuemie' => + array ( + ), + 'xn--nmesjevuemie-tcba' => + array ( + ), + 'laakesvuemie' => + array ( + ), + 'nannestad' => + array ( + ), + 'narvik' => + array ( + ), + 'narviika' => + array ( + ), + 'naustdal' => + array ( + ), + 'nedre-eiker' => + array ( + ), + 'akershus' => + array ( + 'nes' => + array ( + ), + ), + 'buskerud' => + array ( + 'nes' => + array ( + ), + ), + 'nesna' => + array ( + ), + 'nesodden' => + array ( + ), + 'nesseby' => + array ( + ), + 'unjarga' => + array ( + ), + 'xn--unjrga-rta' => + array ( + ), + 'nesset' => + array ( + ), + 'nissedal' => + array ( + ), + 'nittedal' => + array ( + ), + 'nord-aurdal' => + array ( + ), + 'nord-fron' => + array ( + ), + 'nord-odal' => + array ( + ), + 'norddal' => + array ( + ), + 'nordkapp' => + array ( + ), + 'davvenjarga' => + array ( + ), + 'xn--davvenjrga-y4a' => + array ( + ), + 'nordre-land' => + array ( + ), + 'nordreisa' => + array ( + ), + 'raisa' => + array ( + ), + 'xn--risa-5na' => + array ( + ), + 'nore-og-uvdal' => + array ( + ), + 'notodden' => + array ( + ), + 'naroy' => + array ( + ), + 'xn--nry-yla5g' => + array ( + ), + 'notteroy' => + array ( + ), + 'xn--nttery-byae' => + array ( + ), + 'odda' => + array ( + ), + 'oksnes' => + array ( + ), + 'xn--ksnes-uua' => + array ( + ), + 'oppdal' => + array ( + ), + 'oppegard' => + array ( + ), + 'xn--oppegrd-ixa' => + array ( + ), + 'orkdal' => + array ( + ), + 'orland' => + array ( + ), + 'xn--rland-uua' => + array ( + ), + 'orskog' => + array ( + ), + 'xn--rskog-uua' => + array ( + ), + 'orsta' => + array ( + ), + 'xn--rsta-fra' => + array ( + ), + 'hedmark' => + array ( + 'os' => + array ( + ), + 'valer' => + array ( + ), + 'xn--vler-qoa' => + array ( + ), + ), + 'hordaland' => + array ( + 'os' => + array ( + ), + ), + 'osen' => + array ( + ), + 'osteroy' => + array ( + ), + 'xn--ostery-fya' => + array ( + ), + 'ostre-toten' => + array ( + ), + 'xn--stre-toten-zcb' => + array ( + ), + 'overhalla' => + array ( + ), + 'ovre-eiker' => + array ( + ), + 'xn--vre-eiker-k8a' => + array ( + ), + 'oyer' => + array ( + ), + 'xn--yer-zna' => + array ( + ), + 'oygarden' => + array ( + ), + 'xn--ygarden-p1a' => + array ( + ), + 'oystre-slidre' => + array ( + ), + 'xn--ystre-slidre-ujb' => + array ( + ), + 'porsanger' => + array ( + ), + 'porsangu' => + array ( + ), + 'xn--porsgu-sta26f' => + array ( + ), + 'porsgrunn' => + array ( + ), + 'radoy' => + array ( + ), + 'xn--rady-ira' => + array ( + ), + 'rakkestad' => + array ( + ), + 'rana' => + array ( + ), + 'ruovat' => + array ( + ), + 'randaberg' => + array ( + ), + 'rauma' => + array ( + ), + 'rendalen' => + array ( + ), + 'rennebu' => + array ( + ), + 'rennesoy' => + array ( + ), + 'xn--rennesy-v1a' => + array ( + ), + 'rindal' => + array ( + ), + 'ringebu' => + array ( + ), + 'ringerike' => + array ( + ), + 'ringsaker' => + array ( + ), + 'rissa' => + array ( + ), + 'risor' => + array ( + ), + 'xn--risr-ira' => + array ( + ), + 'roan' => + array ( + ), + 'rollag' => + array ( + ), + 'rygge' => + array ( + ), + 'ralingen' => + array ( + ), + 'xn--rlingen-mxa' => + array ( + ), + 'rodoy' => + array ( + ), + 'xn--rdy-0nab' => + array ( + ), + 'romskog' => + array ( + ), + 'xn--rmskog-bya' => + array ( + ), + 'roros' => + array ( + ), + 'xn--rros-gra' => + array ( + ), + 'rost' => + array ( + ), + 'xn--rst-0na' => + array ( + ), + 'royken' => + array ( + ), + 'xn--ryken-vua' => + array ( + ), + 'royrvik' => + array ( + ), + 'xn--ryrvik-bya' => + array ( + ), + 'rade' => + array ( + ), + 'xn--rde-ula' => + array ( + ), + 'salangen' => + array ( + ), + 'siellak' => + array ( + ), + 'saltdal' => + array ( + ), + 'salat' => + array ( + ), + 'xn--slt-elab' => + array ( + ), + 'xn--slat-5na' => + array ( + ), + 'samnanger' => + array ( + ), + 'vestfold' => + array ( + 'sande' => + array ( + ), + ), + 'sandefjord' => + array ( + ), + 'sandnes' => + array ( + ), + 'sandoy' => + array ( + ), + 'xn--sandy-yua' => + array ( + ), + 'sarpsborg' => + array ( + ), + 'sauda' => + array ( + ), + 'sauherad' => + array ( + ), + 'sel' => + array ( + ), + 'selbu' => + array ( + ), + 'selje' => + array ( + ), + 'seljord' => + array ( + ), + 'sigdal' => + array ( + ), + 'siljan' => + array ( + ), + 'sirdal' => + array ( + ), + 'skaun' => + array ( + ), + 'skedsmo' => + array ( + ), + 'ski' => + array ( + ), + 'skien' => + array ( + ), + 'skiptvet' => + array ( + ), + 'skjervoy' => + array ( + ), + 'xn--skjervy-v1a' => + array ( + ), + 'skierva' => + array ( + ), + 'xn--skierv-uta' => + array ( + ), + 'skjak' => + array ( + ), + 'xn--skjk-soa' => + array ( + ), + 'skodje' => + array ( + ), + 'skanland' => + array ( + ), + 'xn--sknland-fxa' => + array ( + ), + 'skanit' => + array ( + ), + 'xn--sknit-yqa' => + array ( + ), + 'smola' => + array ( + ), + 'xn--smla-hra' => + array ( + ), + 'snillfjord' => + array ( + ), + 'snasa' => + array ( + ), + 'xn--snsa-roa' => + array ( + ), + 'snoasa' => + array ( + ), + 'snaase' => + array ( + ), + 'xn--snase-nra' => + array ( + ), + 'sogndal' => + array ( + ), + 'sokndal' => + array ( + ), + 'sola' => + array ( + ), + 'solund' => + array ( + ), + 'songdalen' => + array ( + ), + 'sortland' => + array ( + ), + 'spydeberg' => + array ( + ), + 'stange' => + array ( + ), + 'stavanger' => + array ( + ), + 'steigen' => + array ( + ), + 'steinkjer' => + array ( + ), + 'stjordal' => + array ( + ), + 'xn--stjrdal-s1a' => + array ( + ), + 'stokke' => + array ( + ), + 'stor-elvdal' => + array ( + ), + 'stord' => + array ( + ), + 'stordal' => + array ( + ), + 'storfjord' => + array ( + ), + 'omasvuotna' => + array ( + ), + 'strand' => + array ( + ), + 'stranda' => + array ( + ), + 'stryn' => + array ( + ), + 'sula' => + array ( + ), + 'suldal' => + array ( + ), + 'sund' => + array ( + ), + 'sunndal' => + array ( + ), + 'surnadal' => + array ( + ), + 'sveio' => + array ( + ), + 'svelvik' => + array ( + ), + 'sykkylven' => + array ( + ), + 'sogne' => + array ( + ), + 'xn--sgne-gra' => + array ( + ), + 'somna' => + array ( + ), + 'xn--smna-gra' => + array ( + ), + 'sondre-land' => + array ( + ), + 'xn--sndre-land-0cb' => + array ( + ), + 'sor-aurdal' => + array ( + ), + 'xn--sr-aurdal-l8a' => + array ( + ), + 'sor-fron' => + array ( + ), + 'xn--sr-fron-q1a' => + array ( + ), + 'sor-odal' => + array ( + ), + 'xn--sr-odal-q1a' => + array ( + ), + 'sor-varanger' => + array ( + ), + 'xn--sr-varanger-ggb' => + array ( + ), + 'matta-varjjat' => + array ( + ), + 'xn--mtta-vrjjat-k7af' => + array ( + ), + 'sorfold' => + array ( + ), + 'xn--srfold-bya' => + array ( + ), + 'sorreisa' => + array ( + ), + 'xn--srreisa-q1a' => + array ( + ), + 'sorum' => + array ( + ), + 'xn--srum-gra' => + array ( + ), + 'tana' => + array ( + ), + 'deatnu' => + array ( + ), + 'time' => + array ( + ), + 'tingvoll' => + array ( + ), + 'tinn' => + array ( + ), + 'tjeldsund' => + array ( + ), + 'dielddanuorri' => + array ( + ), + 'tjome' => + array ( + ), + 'xn--tjme-hra' => + array ( + ), + 'tokke' => + array ( + ), + 'tolga' => + array ( + ), + 'torsken' => + array ( + ), + 'tranoy' => + array ( + ), + 'xn--trany-yua' => + array ( + ), + 'tromso' => + array ( + ), + 'xn--troms-zua' => + array ( + ), + 'tromsa' => + array ( + ), + 'romsa' => + array ( + ), + 'trondheim' => + array ( + ), + 'troandin' => + array ( + ), + 'trysil' => + array ( + ), + 'trana' => + array ( + ), + 'xn--trna-woa' => + array ( + ), + 'trogstad' => + array ( + ), + 'xn--trgstad-r1a' => + array ( + ), + 'tvedestrand' => + array ( + ), + 'tydal' => + array ( + ), + 'tynset' => + array ( + ), + 'tysfjord' => + array ( + ), + 'divtasvuodna' => + array ( + ), + 'divttasvuotna' => + array ( + ), + 'tysnes' => + array ( + ), + 'tysvar' => + array ( + ), + 'xn--tysvr-vra' => + array ( + ), + 'tonsberg' => + array ( + ), + 'xn--tnsberg-q1a' => + array ( + ), + 'ullensaker' => + array ( + ), + 'ullensvang' => + array ( + ), + 'ulvik' => + array ( + ), + 'utsira' => + array ( + ), + 'vadso' => + array ( + ), + 'xn--vads-jra' => + array ( + ), + 'cahcesuolo' => + array ( + ), + 'xn--hcesuolo-7ya35b' => + array ( + ), + 'vaksdal' => + array ( + ), + 'valle' => + array ( + ), + 'vang' => + array ( + ), + 'vanylven' => + array ( + ), + 'vardo' => + array ( + ), + 'xn--vard-jra' => + array ( + ), + 'varggat' => + array ( + ), + 'xn--vrggt-xqad' => + array ( + ), + 'vefsn' => + array ( + ), + 'vaapste' => + array ( + ), + 'vega' => + array ( + ), + 'vegarshei' => + array ( + ), + 'xn--vegrshei-c0a' => + array ( + ), + 'vennesla' => + array ( + ), + 'verdal' => + array ( + ), + 'verran' => + array ( + ), + 'vestby' => + array ( + ), + 'vestnes' => + array ( + ), + 'vestre-slidre' => + array ( + ), + 'vestre-toten' => + array ( + ), + 'vestvagoy' => + array ( + ), + 'xn--vestvgy-ixa6o' => + array ( + ), + 'vevelstad' => + array ( + ), + 'vik' => + array ( + ), + 'vikna' => + array ( + ), + 'vindafjord' => + array ( + ), + 'volda' => + array ( + ), + 'voss' => + array ( + ), + 'varoy' => + array ( + ), + 'xn--vry-yla5g' => + array ( + ), + 'vagan' => + array ( + ), + 'xn--vgan-qoa' => + array ( + ), + 'voagat' => + array ( + ), + 'vagsoy' => + array ( + ), + 'xn--vgsy-qoa0j' => + array ( + ), + 'vaga' => + array ( + ), + 'xn--vg-yiab' => + array ( + ), + 'ostfold' => + array ( + 'valer' => + array ( + ), + ), + 'xn--stfold-9xa' => + array ( + 'xn--vler-qoa' => + array ( + ), + ), + ), + 'np' => + array ( + '*' => + array ( + ), + ), + 'nr' => + array ( + 'biz' => + array ( + ), + 'info' => + array ( + ), + 'gov' => + array ( + ), + 'edu' => + array ( + ), + 'org' => + array ( + ), + 'net' => + array ( + ), + 'com' => + array ( + ), + ), + 'nu' => + array ( + ), + 'nz' => + array ( + 'ac' => + array ( + ), + 'co' => + array ( + ), + 'cri' => + array ( + ), + 'geek' => + array ( + ), + 'gen' => + array ( + ), + 'govt' => + array ( + ), + 'health' => + array ( + ), + 'iwi' => + array ( + ), + 'kiwi' => + array ( + ), + 'maori' => + array ( + ), + 'mil' => + array ( + ), + 'xn--mori-qsa' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'parliament' => + array ( + ), + 'school' => + array ( + ), + ), + 'om' => + array ( + 'co' => + array ( + ), + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'med' => + array ( + ), + 'museum' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'pro' => + array ( + ), + ), + 'org' => + array ( + ), + 'pa' => + array ( + 'ac' => + array ( + ), + 'gob' => + array ( + ), + 'com' => + array ( + ), + 'org' => + array ( + ), + 'sld' => + array ( + ), + 'edu' => + array ( + ), + 'net' => + array ( + ), + 'ing' => + array ( + ), + 'abo' => + array ( + ), + 'med' => + array ( + ), + 'nom' => + array ( + ), + ), + 'pe' => + array ( + 'edu' => + array ( + ), + 'gob' => + array ( + ), + 'nom' => + array ( + ), + 'mil' => + array ( + ), + 'org' => + array ( + ), + 'com' => + array ( + ), + 'net' => + array ( + ), + ), + 'pf' => + array ( + 'com' => + array ( + ), + 'org' => + array ( + ), + 'edu' => + array ( + ), + ), + 'pg' => + array ( + '*' => + array ( + ), + ), + 'ph' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'gov' => + array ( + ), + 'edu' => + array ( + ), + 'ngo' => + array ( + ), + 'mil' => + array ( + ), + 'i' => + array ( + ), + ), + 'pk' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'edu' => + array ( + ), + 'org' => + array ( + ), + 'fam' => + array ( + ), + 'biz' => + array ( + ), + 'web' => + array ( + ), + 'gov' => + array ( + ), + 'gob' => + array ( + ), + 'gok' => + array ( + ), + 'gon' => + array ( + ), + 'gop' => + array ( + ), + 'gos' => + array ( + ), + 'info' => + array ( + ), + ), + 'pl' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'aid' => + array ( + ), + 'agro' => + array ( + ), + 'atm' => + array ( + ), + 'auto' => + array ( + ), + 'biz' => + array ( + ), + 'edu' => + array ( + ), + 'gmina' => + array ( + ), + 'gsm' => + array ( + ), + 'info' => + array ( + ), + 'mail' => + array ( + ), + 'miasta' => + array ( + ), + 'media' => + array ( + ), + 'mil' => + array ( + ), + 'nieruchomosci' => + array ( + ), + 'nom' => + array ( + ), + 'pc' => + array ( + ), + 'powiat' => + array ( + ), + 'priv' => + array ( + ), + 'realestate' => + array ( + ), + 'rel' => + array ( + ), + 'sex' => + array ( + ), + 'shop' => + array ( + ), + 'sklep' => + array ( + ), + 'sos' => + array ( + ), + 'szkola' => + array ( + ), + 'targi' => + array ( + ), + 'tm' => + array ( + ), + 'tourism' => + array ( + ), + 'travel' => + array ( + ), + 'turystyka' => + array ( + ), + 'gov' => + array ( + 'ap' => + array ( + ), + 'ic' => + array ( + ), + 'is' => + array ( + ), + 'us' => + array ( + ), + 'kmpsp' => + array ( + ), + 'kppsp' => + array ( + ), + 'kwpsp' => + array ( + ), + 'psp' => + array ( + ), + 'wskr' => + array ( + ), + 'kwp' => + array ( + ), + 'mw' => + array ( + ), + 'ug' => + array ( + ), + 'um' => + array ( + ), + 'umig' => + array ( + ), + 'ugim' => + array ( + ), + 'upow' => + array ( + ), + 'uw' => + array ( + ), + 'starostwo' => + array ( + ), + 'pa' => + array ( + ), + 'po' => + array ( + ), + 'psse' => + array ( + ), + 'pup' => + array ( + ), + 'rzgw' => + array ( + ), + 'sa' => + array ( + ), + 'so' => + array ( + ), + 'sr' => + array ( + ), + 'wsa' => + array ( + ), + 'sko' => + array ( + ), + 'uzs' => + array ( + ), + 'wiih' => + array ( + ), + 'winb' => + array ( + ), + 'pinb' => + array ( + ), + 'wios' => + array ( + ), + 'witd' => + array ( + ), + 'wzmiuw' => + array ( + ), + 'piw' => + array ( + ), + 'wiw' => + array ( + ), + 'griw' => + array ( + ), + 'wif' => + array ( + ), + 'oum' => + array ( + ), + 'sdn' => + array ( + ), + 'zp' => + array ( + ), + 'uppo' => + array ( + ), + 'mup' => + array ( + ), + 'wuoz' => + array ( + ), + 'konsulat' => + array ( + ), + 'oirm' => + array ( + ), + ), + 'augustow' => + array ( + ), + 'babia-gora' => + array ( + ), + 'bedzin' => + array ( + ), + 'beskidy' => + array ( + ), + 'bialowieza' => + array ( + ), + 'bialystok' => + array ( + ), + 'bielawa' => + array ( + ), + 'bieszczady' => + array ( + ), + 'boleslawiec' => + array ( + ), + 'bydgoszcz' => + array ( + ), + 'bytom' => + array ( + ), + 'cieszyn' => + array ( + ), + 'czeladz' => + array ( + ), + 'czest' => + array ( + ), + 'dlugoleka' => + array ( + ), + 'elblag' => + array ( + ), + 'elk' => + array ( + ), + 'glogow' => + array ( + ), + 'gniezno' => + array ( + ), + 'gorlice' => + array ( + ), + 'grajewo' => + array ( + ), + 'ilawa' => + array ( + ), + 'jaworzno' => + array ( + ), + 'jelenia-gora' => + array ( + ), + 'jgora' => + array ( + ), + 'kalisz' => + array ( + ), + 'kazimierz-dolny' => + array ( + ), + 'karpacz' => + array ( + ), + 'kartuzy' => + array ( + ), + 'kaszuby' => + array ( + ), + 'katowice' => + array ( + ), + 'kepno' => + array ( + ), + 'ketrzyn' => + array ( + ), + 'klodzko' => + array ( + ), + 'kobierzyce' => + array ( + ), + 'kolobrzeg' => + array ( + ), + 'konin' => + array ( + ), + 'konskowola' => + array ( + ), + 'kutno' => + array ( + ), + 'lapy' => + array ( + ), + 'lebork' => + array ( + ), + 'legnica' => + array ( + ), + 'lezajsk' => + array ( + ), + 'limanowa' => + array ( + ), + 'lomza' => + array ( + ), + 'lowicz' => + array ( + ), + 'lubin' => + array ( + ), + 'lukow' => + array ( + ), + 'malbork' => + array ( + ), + 'malopolska' => + array ( + ), + 'mazowsze' => + array ( + ), + 'mazury' => + array ( + ), + 'mielec' => + array ( + ), + 'mielno' => + array ( + ), + 'mragowo' => + array ( + ), + 'naklo' => + array ( + ), + 'nowaruda' => + array ( + ), + 'nysa' => + array ( + ), + 'olawa' => + array ( + ), + 'olecko' => + array ( + ), + 'olkusz' => + array ( + ), + 'olsztyn' => + array ( + ), + 'opoczno' => + array ( + ), + 'opole' => + array ( + ), + 'ostroda' => + array ( + ), + 'ostroleka' => + array ( + ), + 'ostrowiec' => + array ( + ), + 'ostrowwlkp' => + array ( + ), + 'pila' => + array ( + ), + 'pisz' => + array ( + ), + 'podhale' => + array ( + ), + 'podlasie' => + array ( + ), + 'polkowice' => + array ( + ), + 'pomorze' => + array ( + ), + 'pomorskie' => + array ( + ), + 'prochowice' => + array ( + ), + 'pruszkow' => + array ( + ), + 'przeworsk' => + array ( + ), + 'pulawy' => + array ( + ), + 'radom' => + array ( + ), + 'rawa-maz' => + array ( + ), + 'rybnik' => + array ( + ), + 'rzeszow' => + array ( + ), + 'sanok' => + array ( + ), + 'sejny' => + array ( + ), + 'slask' => + array ( + ), + 'slupsk' => + array ( + ), + 'sosnowiec' => + array ( + ), + 'stalowa-wola' => + array ( + ), + 'skoczow' => + array ( + ), + 'starachowice' => + array ( + ), + 'stargard' => + array ( + ), + 'suwalki' => + array ( + ), + 'swidnica' => + array ( + ), + 'swiebodzin' => + array ( + ), + 'swinoujscie' => + array ( + ), + 'szczecin' => + array ( + ), + 'szczytno' => + array ( + ), + 'tarnobrzeg' => + array ( + ), + 'tgory' => + array ( + ), + 'turek' => + array ( + ), + 'tychy' => + array ( + ), + 'ustka' => + array ( + ), + 'walbrzych' => + array ( + ), + 'warmia' => + array ( + ), + 'warszawa' => + array ( + ), + 'waw' => + array ( + ), + 'wegrow' => + array ( + ), + 'wielun' => + array ( + ), + 'wlocl' => + array ( + ), + 'wloclawek' => + array ( + ), + 'wodzislaw' => + array ( + ), + 'wolomin' => + array ( + ), + 'wroclaw' => + array ( + ), + 'zachpomor' => + array ( + ), + 'zagan' => + array ( + ), + 'zarow' => + array ( + ), + 'zgora' => + array ( + ), + 'zgorzelec' => + array ( + ), + ), + 'pm' => + array ( + ), + 'pn' => + array ( + 'gov' => + array ( + ), + 'co' => + array ( + ), + 'org' => + array ( + ), + 'edu' => + array ( + ), + 'net' => + array ( + ), + ), + 'post' => + array ( + ), + 'pr' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'gov' => + array ( + ), + 'edu' => + array ( + ), + 'isla' => + array ( + ), + 'pro' => + array ( + ), + 'biz' => + array ( + ), + 'info' => + array ( + ), + 'name' => + array ( + ), + 'est' => + array ( + ), + 'prof' => + array ( + ), + 'ac' => + array ( + ), + ), + 'pro' => + array ( + 'aaa' => + array ( + ), + 'aca' => + array ( + ), + 'acct' => + array ( + ), + 'avocat' => + array ( + ), + 'bar' => + array ( + ), + 'cpa' => + array ( + ), + 'eng' => + array ( + ), + 'jur' => + array ( + ), + 'law' => + array ( + ), + 'med' => + array ( + ), + 'recht' => + array ( + ), + ), + 'ps' => + array ( + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'sec' => + array ( + ), + 'plo' => + array ( + ), + 'com' => + array ( + ), + 'org' => + array ( + ), + 'net' => + array ( + ), + ), + 'pt' => + array ( + 'net' => + array ( + ), + 'gov' => + array ( + ), + 'org' => + array ( + ), + 'edu' => + array ( + ), + 'int' => + array ( + ), + 'publ' => + array ( + ), + 'com' => + array ( + ), + 'nome' => + array ( + ), + ), + 'pw' => + array ( + 'co' => + array ( + ), + 'ne' => + array ( + ), + 'or' => + array ( + ), + 'ed' => + array ( + ), + 'go' => + array ( + ), + 'belau' => + array ( + ), + ), + 'py' => + array ( + 'com' => + array ( + ), + 'coop' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'qa' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => + array ( + ), + 'name' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'sch' => + array ( + ), + ), + 're' => + array ( + 'asso' => + array ( + ), + 'com' => + array ( + ), + 'nom' => + array ( + ), + ), + 'ro' => + array ( + 'arts' => + array ( + ), + 'com' => + array ( + ), + 'firm' => + array ( + ), + 'info' => + array ( + ), + 'nom' => + array ( + ), + 'nt' => + array ( + ), + 'org' => + array ( + ), + 'rec' => + array ( + ), + 'store' => + array ( + ), + 'tm' => + array ( + ), + 'www' => + array ( + ), + ), + 'rs' => + array ( + 'ac' => + array ( + ), + 'co' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'in' => + array ( + ), + 'org' => + array ( + ), + ), + 'ru' => + array ( + 'ac' => + array ( + ), + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'int' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'pp' => + array ( + ), + 'adygeya' => + array ( + ), + 'altai' => + array ( + ), + 'amur' => + array ( + ), + 'arkhangelsk' => + array ( + ), + 'astrakhan' => + array ( + ), + 'bashkiria' => + array ( + ), + 'belgorod' => + array ( + ), + 'bir' => + array ( + ), + 'bryansk' => + array ( + ), + 'buryatia' => + array ( + ), + 'cbg' => + array ( + ), + 'chel' => + array ( + ), + 'chelyabinsk' => + array ( + ), + 'chita' => + array ( + ), + 'chukotka' => + array ( + ), + 'chuvashia' => + array ( + ), + 'dagestan' => + array ( + ), + 'dudinka' => + array ( + ), + 'e-burg' => + array ( + ), + 'grozny' => + array ( + ), + 'irkutsk' => + array ( + ), + 'ivanovo' => + array ( + ), + 'izhevsk' => + array ( + ), + 'jar' => + array ( + ), + 'joshkar-ola' => + array ( + ), + 'kalmykia' => + array ( + ), + 'kaluga' => + array ( + ), + 'kamchatka' => + array ( + ), + 'karelia' => + array ( + ), + 'kazan' => + array ( + ), + 'kchr' => + array ( + ), + 'kemerovo' => + array ( + ), + 'khabarovsk' => + array ( + ), + 'khakassia' => + array ( + ), + 'khv' => + array ( + ), + 'kirov' => + array ( + ), + 'koenig' => + array ( + ), + 'komi' => + array ( + ), + 'kostroma' => + array ( + ), + 'krasnoyarsk' => + array ( + ), + 'kuban' => + array ( + ), + 'kurgan' => + array ( + ), + 'kursk' => + array ( + ), + 'lipetsk' => + array ( + ), + 'magadan' => + array ( + ), + 'mari' => + array ( + ), + 'mari-el' => + array ( + ), + 'marine' => + array ( + ), + 'mordovia' => + array ( + ), + 'msk' => + array ( + ), + 'murmansk' => + array ( + ), + 'nalchik' => + array ( + ), + 'nnov' => + array ( + ), + 'nov' => + array ( + ), + 'novosibirsk' => + array ( + ), + 'nsk' => + array ( + ), + 'omsk' => + array ( + ), + 'orenburg' => + array ( + ), + 'oryol' => + array ( + ), + 'palana' => + array ( + ), + 'penza' => + array ( + ), + 'perm' => + array ( + ), + 'ptz' => + array ( + ), + 'rnd' => + array ( + ), + 'ryazan' => + array ( + ), + 'sakhalin' => + array ( + ), + 'samara' => + array ( + ), + 'saratov' => + array ( + ), + 'simbirsk' => + array ( + ), + 'smolensk' => + array ( + ), + 'spb' => + array ( + ), + 'stavropol' => + array ( + ), + 'stv' => + array ( + ), + 'surgut' => + array ( + ), + 'tambov' => + array ( + ), + 'tatarstan' => + array ( + ), + 'tom' => + array ( + ), + 'tomsk' => + array ( + ), + 'tsaritsyn' => + array ( + ), + 'tsk' => + array ( + ), + 'tula' => + array ( + ), + 'tuva' => + array ( + ), + 'tver' => + array ( + ), + 'tyumen' => + array ( + ), + 'udm' => + array ( + ), + 'udmurtia' => + array ( + ), + 'ulan-ude' => + array ( + ), + 'vladikavkaz' => + array ( + ), + 'vladimir' => + array ( + ), + 'vladivostok' => + array ( + ), + 'volgograd' => + array ( + ), + 'vologda' => + array ( + ), + 'voronezh' => + array ( + ), + 'vrn' => + array ( + ), + 'vyatka' => + array ( + ), + 'yakutia' => + array ( + ), + 'yamal' => + array ( + ), + 'yaroslavl' => + array ( + ), + 'yekaterinburg' => + array ( + ), + 'yuzhno-sakhalinsk' => + array ( + ), + 'amursk' => + array ( + ), + 'baikal' => + array ( + ), + 'cmw' => + array ( + ), + 'fareast' => + array ( + ), + 'jamal' => + array ( + ), + 'kms' => + array ( + ), + 'k-uralsk' => + array ( + ), + 'kustanai' => + array ( + ), + 'kuzbass' => + array ( + ), + 'mytis' => + array ( + ), + 'nakhodka' => + array ( + ), + 'nkz' => + array ( + ), + 'norilsk' => + array ( + ), + 'oskol' => + array ( + ), + 'pyatigorsk' => + array ( + ), + 'rubtsovsk' => + array ( + ), + 'snz' => + array ( + ), + 'syzran' => + array ( + ), + 'vdonsk' => + array ( + ), + 'zgrad' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => + array ( + ), + 'test' => + array ( + ), + ), + 'rw' => + array ( + 'gov' => + array ( + ), + 'net' => + array ( + ), + 'edu' => + array ( + ), + 'ac' => + array ( + ), + 'com' => + array ( + ), + 'co' => + array ( + ), + 'int' => + array ( + ), + 'mil' => + array ( + ), + 'gouv' => + array ( + ), + ), + 'sa' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'gov' => + array ( + ), + 'med' => + array ( + ), + 'pub' => + array ( + ), + 'edu' => + array ( + ), + 'sch' => + array ( + ), + ), + 'sb' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'sc' => + array ( + 'com' => + array ( + ), + 'gov' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'edu' => + array ( + ), + ), + 'sd' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'edu' => + array ( + ), + 'med' => + array ( + ), + 'tv' => + array ( + ), + 'gov' => + array ( + ), + 'info' => + array ( + ), + ), + 'se' => + array ( + 'a' => + array ( + ), + 'ac' => + array ( + ), + 'b' => + array ( + ), + 'bd' => + array ( + ), + 'brand' => + array ( + ), + 'c' => + array ( + ), + 'd' => + array ( + ), + 'e' => + array ( + ), + 'f' => + array ( + ), + 'fh' => + array ( + ), + 'fhsk' => + array ( + ), + 'fhv' => + array ( + ), + 'g' => + array ( + ), + 'h' => + array ( + ), + 'i' => + array ( + ), + 'k' => + array ( + ), + 'komforb' => + array ( + ), + 'kommunalforbund' => + array ( + ), + 'komvux' => + array ( + ), + 'l' => + array ( + ), + 'lanbib' => + array ( + ), + 'm' => + array ( + ), + 'n' => + array ( + ), + 'naturbruksgymn' => + array ( + ), + 'o' => + array ( + ), + 'org' => + array ( + ), + 'p' => + array ( + ), + 'parti' => + array ( + ), + 'pp' => + array ( + ), + 'press' => + array ( + ), + 'r' => + array ( + ), + 's' => + array ( + ), + 't' => + array ( + ), + 'tm' => + array ( + ), + 'u' => + array ( + ), + 'w' => + array ( + ), + 'x' => + array ( + ), + 'y' => + array ( + ), + 'z' => + array ( + ), + ), + 'sg' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'gov' => + array ( + ), + 'edu' => + array ( + ), + 'per' => + array ( + ), + ), + 'sh' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'gov' => + array ( + ), + 'org' => + array ( + ), + 'mil' => + array ( + ), + ), + 'si' => + array ( + ), + 'sj' => + array ( + ), + 'sk' => + array ( + ), + 'sl' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'org' => + array ( + ), + ), + 'sm' => + array ( + ), + 'sn' => + array ( + 'art' => + array ( + ), + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gouv' => + array ( + ), + 'org' => + array ( + ), + 'perso' => + array ( + ), + 'univ' => + array ( + ), + ), + 'so' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'sr' => + array ( + ), + 'st' => + array ( + 'co' => + array ( + ), + 'com' => + array ( + ), + 'consulado' => + array ( + ), + 'edu' => + array ( + ), + 'embaixada' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'principe' => + array ( + ), + 'saotome' => + array ( + ), + 'store' => + array ( + ), + ), + 'su' => + array ( + 'adygeya' => + array ( + ), + 'arkhangelsk' => + array ( + ), + 'balashov' => + array ( + ), + 'bashkiria' => + array ( + ), + 'bryansk' => + array ( + ), + 'dagestan' => + array ( + ), + 'grozny' => + array ( + ), + 'ivanovo' => + array ( + ), + 'kalmykia' => + array ( + ), + 'kaluga' => + array ( + ), + 'karelia' => + array ( + ), + 'khakassia' => + array ( + ), + 'krasnodar' => + array ( + ), + 'kurgan' => + array ( + ), + 'lenug' => + array ( + ), + 'mordovia' => + array ( + ), + 'msk' => + array ( + ), + 'murmansk' => + array ( + ), + 'nalchik' => + array ( + ), + 'nov' => + array ( + ), + 'obninsk' => + array ( + ), + 'penza' => + array ( + ), + 'pokrovsk' => + array ( + ), + 'sochi' => + array ( + ), + 'spb' => + array ( + ), + 'togliatti' => + array ( + ), + 'troitsk' => + array ( + ), + 'tula' => + array ( + ), + 'tuva' => + array ( + ), + 'vladikavkaz' => + array ( + ), + 'vladimir' => + array ( + ), + 'vologda' => + array ( + ), + ), + 'sv' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gob' => + array ( + ), + 'org' => + array ( + ), + 'red' => + array ( + ), + ), + 'sx' => + array ( + 'gov' => + array ( + ), + ), + 'sy' => + array ( + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'net' => + array ( + ), + 'mil' => + array ( + ), + 'com' => + array ( + ), + 'org' => + array ( + ), + ), + 'sz' => + array ( + 'co' => + array ( + ), + 'ac' => + array ( + ), + 'org' => + array ( + ), + ), + 'tc' => + array ( + ), + 'td' => + array ( + ), + 'tel' => + array ( + ), + 'tf' => + array ( + ), + 'tg' => + array ( + ), + 'th' => + array ( + 'ac' => + array ( + ), + 'co' => + array ( + ), + 'go' => + array ( + ), + 'in' => + array ( + ), + 'mi' => + array ( + ), + 'net' => + array ( + ), + 'or' => + array ( + ), + ), + 'tj' => + array ( + 'ac' => + array ( + ), + 'biz' => + array ( + ), + 'co' => + array ( + ), + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'go' => + array ( + ), + 'gov' => + array ( + ), + 'int' => + array ( + ), + 'mil' => + array ( + ), + 'name' => + array ( + ), + 'net' => + array ( + ), + 'nic' => + array ( + ), + 'org' => + array ( + ), + 'test' => + array ( + ), + 'web' => + array ( + ), + ), + 'tk' => + array ( + ), + 'tl' => + array ( + 'gov' => + array ( + ), + ), + 'tm' => + array ( + 'com' => + array ( + ), + 'co' => + array ( + ), + 'org' => + array ( + ), + 'net' => + array ( + ), + 'nom' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => + array ( + ), + 'edu' => + array ( + ), + ), + 'tn' => + array ( + 'com' => + array ( + ), + 'ens' => + array ( + ), + 'fin' => + array ( + ), + 'gov' => + array ( + ), + 'ind' => + array ( + ), + 'intl' => + array ( + ), + 'nat' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'info' => + array ( + ), + 'perso' => + array ( + ), + 'tourism' => + array ( + ), + 'edunet' => + array ( + ), + 'rnrt' => + array ( + ), + 'rns' => + array ( + ), + 'rnu' => + array ( + ), + 'mincom' => + array ( + ), + 'agrinet' => + array ( + ), + 'defense' => + array ( + ), + 'turen' => + array ( + ), + ), + 'to' => + array ( + 'com' => + array ( + ), + 'gov' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'edu' => + array ( + ), + 'mil' => + array ( + ), + ), + 'tr' => + array ( + 'com' => + array ( + ), + 'info' => + array ( + ), + 'biz' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'web' => + array ( + ), + 'gen' => + array ( + ), + 'tv' => + array ( + ), + 'av' => + array ( + ), + 'dr' => + array ( + ), + 'bbs' => + array ( + ), + 'name' => + array ( + ), + 'tel' => + array ( + ), + 'gov' => + array ( + ), + 'bel' => + array ( + ), + 'pol' => + array ( + ), + 'mil' => + array ( + ), + 'k12' => + array ( + ), + 'edu' => + array ( + ), + 'kep' => + array ( + ), + 'nc' => + array ( + 'gov' => + array ( + ), + ), + ), + 'travel' => + array ( + ), + 'tt' => + array ( + 'co' => + array ( + ), + 'com' => + array ( + ), + 'org' => + array ( + ), + 'net' => + array ( + ), + 'biz' => + array ( + ), + 'info' => + array ( + ), + 'pro' => + array ( + ), + 'int' => + array ( + ), + 'coop' => + array ( + ), + 'jobs' => + array ( + ), + 'mobi' => + array ( + ), + 'travel' => + array ( + ), + 'museum' => + array ( + ), + 'aero' => + array ( + ), + 'name' => + array ( + ), + 'gov' => + array ( + ), + 'edu' => + array ( + ), + ), + 'tv' => + array ( + ), + 'tw' => + array ( + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => + array ( + ), + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'idv' => + array ( + ), + 'game' => + array ( + ), + 'ebiz' => + array ( + ), + 'club' => + array ( + ), + 'xn--zf0ao64a' => + array ( + ), + 'xn--uc0atv' => + array ( + ), + 'xn--czrw28b' => + array ( + ), + ), + 'tz' => + array ( + 'ac' => + array ( + ), + 'co' => + array ( + ), + 'go' => + array ( + ), + 'hotel' => + array ( + ), + 'info' => + array ( + ), + 'me' => + array ( + ), + 'mil' => + array ( + ), + 'mobi' => + array ( + ), + 'ne' => + array ( + ), + 'or' => + array ( + ), + 'sc' => + array ( + ), + 'tv' => + array ( + ), + ), + 'ua' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'in' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'cherkassy' => + array ( + ), + 'cherkasy' => + array ( + ), + 'chernigov' => + array ( + ), + 'chernihiv' => + array ( + ), + 'chernivtsi' => + array ( + ), + 'chernovtsy' => + array ( + ), + 'ck' => + array ( + ), + 'cn' => + array ( + ), + 'cr' => + array ( + ), + 'crimea' => + array ( + ), + 'cv' => + array ( + ), + 'dn' => + array ( + ), + 'dnepropetrovsk' => + array ( + ), + 'dnipropetrovsk' => + array ( + ), + 'dominic' => + array ( + ), + 'donetsk' => + array ( + ), + 'dp' => + array ( + ), + 'if' => + array ( + ), + 'ivano-frankivsk' => + array ( + ), + 'kh' => + array ( + ), + 'kharkiv' => + array ( + ), + 'kharkov' => + array ( + ), + 'kherson' => + array ( + ), + 'khmelnitskiy' => + array ( + ), + 'khmelnytskyi' => + array ( + ), + 'kiev' => + array ( + ), + 'kirovograd' => + array ( + ), + 'km' => + array ( + ), + 'kr' => + array ( + ), + 'krym' => + array ( + ), + 'ks' => + array ( + ), + 'kv' => + array ( + ), + 'kyiv' => + array ( + ), + 'lg' => + array ( + ), + 'lt' => + array ( + ), + 'lugansk' => + array ( + ), + 'lutsk' => + array ( + ), + 'lv' => + array ( + ), + 'lviv' => + array ( + ), + 'mk' => + array ( + ), + 'mykolaiv' => + array ( + ), + 'nikolaev' => + array ( + ), + 'od' => + array ( + ), + 'odesa' => + array ( + ), + 'odessa' => + array ( + ), + 'pl' => + array ( + ), + 'poltava' => + array ( + ), + 'rivne' => + array ( + ), + 'rovno' => + array ( + ), + 'rv' => + array ( + ), + 'sb' => + array ( + ), + 'sebastopol' => + array ( + ), + 'sevastopol' => + array ( + ), + 'sm' => + array ( + ), + 'sumy' => + array ( + ), + 'te' => + array ( + ), + 'ternopil' => + array ( + ), + 'uz' => + array ( + ), + 'uzhgorod' => + array ( + ), + 'vinnica' => + array ( + ), + 'vinnytsia' => + array ( + ), + 'vn' => + array ( + ), + 'volyn' => + array ( + ), + 'yalta' => + array ( + ), + 'zaporizhzhe' => + array ( + ), + 'zaporizhzhia' => + array ( + ), + 'zhitomir' => + array ( + ), + 'zhytomyr' => + array ( + ), + 'zp' => + array ( + ), + 'zt' => + array ( + ), + ), + 'ug' => + array ( + 'co' => + array ( + ), + 'or' => + array ( + ), + 'ac' => + array ( + ), + 'sc' => + array ( + ), + 'go' => + array ( + ), + 'ne' => + array ( + ), + 'com' => + array ( + ), + 'org' => + array ( + ), + ), + 'uk' => + array ( + 'ac' => + array ( + ), + 'co' => + array ( + ), + 'gov' => + array ( + ), + 'ltd' => + array ( + ), + 'me' => + array ( + ), + 'net' => + array ( + ), + 'nhs' => + array ( + ), + 'org' => + array ( + ), + 'plc' => + array ( + ), + 'police' => + array ( + ), + 'sch' => + array ( + '*' => + array ( + ), + ), + ), + 'us' => + array ( + 'dni' => + array ( + ), + 'fed' => + array ( + ), + 'isa' => + array ( + ), + 'kids' => + array ( + ), + 'nsn' => + array ( + ), + 'ak' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'al' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'ar' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'as' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'az' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'ca' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'co' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'ct' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'dc' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'de' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + ), + 'fl' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'ga' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'gu' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'hi' => + array ( + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'ia' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'id' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'il' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'in' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'ks' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'ky' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'la' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'ma' => + array ( + 'k12' => + array ( + 'pvt' => + array ( + ), + 'chtr' => + array ( + ), + 'paroch' => + array ( + ), + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'md' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'me' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'mi' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'mn' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'mo' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'ms' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'mt' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'nc' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'nd' => + array ( + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'ne' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'nh' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'nj' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'nm' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'nv' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'ny' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'oh' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'ok' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'or' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'pa' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'pr' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'ri' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'sc' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'sd' => + array ( + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'tn' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'tx' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'ut' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'vi' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'vt' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'va' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'wa' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'wi' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + 'wv' => + array ( + 'cc' => + array ( + ), + ), + 'wy' => + array ( + 'k12' => + array ( + ), + 'cc' => + array ( + ), + 'lib' => + array ( + ), + ), + ), + 'uy' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gub' => + array ( + ), + 'mil' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'uz' => + array ( + 'co' => + array ( + ), + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'va' => + array ( + ), + 'vc' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => + array ( + ), + 'edu' => + array ( + ), + ), + 've' => + array ( + 'arts' => + array ( + ), + 'co' => + array ( + ), + 'com' => + array ( + ), + 'e12' => + array ( + ), + 'edu' => + array ( + ), + 'firm' => + array ( + ), + 'gob' => + array ( + ), + 'gov' => + array ( + ), + 'info' => + array ( + ), + 'int' => + array ( + ), + 'mil' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'rec' => + array ( + ), + 'store' => + array ( + ), + 'tec' => + array ( + ), + 'web' => + array ( + ), + ), + 'vg' => + array ( + ), + 'vi' => + array ( + 'co' => + array ( + ), + 'com' => + array ( + ), + 'k12' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'vn' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'int' => + array ( + ), + 'ac' => + array ( + ), + 'biz' => + array ( + ), + 'info' => + array ( + ), + 'name' => + array ( + ), + 'pro' => + array ( + ), + 'health' => + array ( + ), + ), + 'vu' => + array ( + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + ), + 'wf' => + array ( + ), + 'ws' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'gov' => + array ( + ), + 'edu' => + array ( + ), + ), + 'yt' => + array ( + ), + 'xn--mgbaam7a8h' => + array ( + ), + 'xn--y9a3aq' => + array ( + ), + 'xn--54b7fta0cc' => + array ( + ), + 'xn--90ais' => + array ( + ), + 'xn--fiqs8s' => + array ( + ), + 'xn--fiqz9s' => + array ( + ), + 'xn--lgbbat1ad8j' => + array ( + ), + 'xn--wgbh1c' => + array ( + ), + 'xn--e1a4c' => + array ( + ), + 'xn--node' => + array ( + ), + 'xn--qxam' => + array ( + ), + 'xn--j6w193g' => + array ( + ), + 'xn--h2brj9c' => + array ( + ), + 'xn--mgbbh1a71e' => + array ( + ), + 'xn--fpcrj9c3d' => + array ( + ), + 'xn--gecrj9c' => + array ( + ), + 'xn--s9brj9c' => + array ( + ), + 'xn--45brj9c' => + array ( + ), + 'xn--xkc2dl3a5ee0h' => + array ( + ), + 'xn--mgba3a4f16a' => + array ( + ), + 'xn--mgba3a4fra' => + array ( + ), + 'xn--mgbtx2b' => + array ( + ), + 'xn--mgbayh7gpa' => + array ( + ), + 'xn--3e0b707e' => + array ( + ), + 'xn--80ao21a' => + array ( + ), + 'xn--fzc2c9e2c' => + array ( + ), + 'xn--xkc2al3hye2a' => + array ( + ), + 'xn--mgbc0a9azcg' => + array ( + ), + 'xn--d1alf' => + array ( + ), + 'xn--l1acc' => + array ( + ), + 'xn--mix891f' => + array ( + ), + 'xn--mix082f' => + array ( + ), + 'xn--mgbx4cd0ab' => + array ( + ), + 'xn--mgb9awbf' => + array ( + ), + 'xn--mgbai9azgqp6j' => + array ( + ), + 'xn--mgbai9a5eva00b' => + array ( + ), + 'xn--ygbi2ammx' => + array ( + ), + 'xn--90a3ac' => + array ( + 'xn--o1ac' => + array ( + ), + 'xn--c1avg' => + array ( + ), + 'xn--90azh' => + array ( + ), + 'xn--d1at' => + array ( + ), + 'xn--o1ach' => + array ( + ), + 'xn--80au' => + array ( + ), + ), + 'xn--p1ai' => + array ( + ), + 'xn--wgbl6a' => + array ( + ), + 'xn--mgberp4a5d4ar' => + array ( + ), + 'xn--mgberp4a5d4a87g' => + array ( + ), + 'xn--mgbqly7c0a67fbc' => + array ( + ), + 'xn--mgbqly7cvafr' => + array ( + ), + 'xn--mgbpl2fh' => + array ( + ), + 'xn--yfro4i67o' => + array ( + ), + 'xn--clchc0ea0b2g2a9gcd' => + array ( + ), + 'xn--ogbpf8fl' => + array ( + ), + 'xn--mgbtf8fl' => + array ( + ), + 'xn--o3cw4h' => + array ( + ), + 'xn--pgbs0dh' => + array ( + ), + 'xn--kpry57d' => + array ( + ), + 'xn--kprw13d' => + array ( + ), + 'xn--nnx388a' => + array ( + ), + 'xn--j1amh' => + array ( + ), + 'xn--mgb2ddes' => + array ( + ), + 'xxx' => + array ( + ), + 'ye' => + array ( + '*' => + array ( + ), + ), + 'za' => + array ( + 'ac' => + array ( + ), + 'agric' => + array ( + ), + 'alt' => + array ( + ), + 'co' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'grondar' => + array ( + ), + 'law' => + array ( + ), + 'mil' => + array ( + ), + 'net' => + array ( + ), + 'ngo' => + array ( + ), + 'nis' => + array ( + ), + 'nom' => + array ( + ), + 'org' => + array ( + ), + 'school' => + array ( + ), + 'tm' => + array ( + ), + 'web' => + array ( + ), + ), + 'zm' => + array ( + 'ac' => + array ( + ), + 'biz' => + array ( + ), + 'co' => + array ( + ), + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'info' => + array ( + ), + 'mil' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'sch' => + array ( + ), + ), + 'zw' => + array ( + '*' => + array ( + ), + ), + 'aaa' => + array ( + ), + 'aarp' => + array ( + ), + 'abarth' => + array ( + ), + 'abb' => + array ( + ), + 'abbott' => + array ( + ), + 'abbvie' => + array ( + ), + 'abc' => + array ( + ), + 'able' => + array ( + ), + 'abogado' => + array ( + ), + 'abudhabi' => + array ( + ), + 'academy' => + array ( + ), + 'accenture' => + array ( + ), + 'accountant' => + array ( + ), + 'accountants' => + array ( + ), + 'aco' => + array ( + ), + 'active' => + array ( + ), + 'actor' => + array ( + ), + 'adac' => + array ( + ), + 'ads' => + array ( + ), + 'adult' => + array ( + ), + 'aeg' => + array ( + ), + 'aetna' => + array ( + ), + 'afamilycompany' => + array ( + ), + 'afl' => + array ( + ), + 'africa' => + array ( + ), + 'agakhan' => + array ( + ), + 'agency' => + array ( + ), + 'aig' => + array ( + ), + 'aigo' => + array ( + ), + 'airbus' => + array ( + ), + 'airforce' => + array ( + ), + 'airtel' => + array ( + ), + 'akdn' => + array ( + ), + 'alfaromeo' => + array ( + ), + 'alibaba' => + array ( + ), + 'alipay' => + array ( + ), + 'allfinanz' => + array ( + ), + 'allstate' => + array ( + ), + 'ally' => + array ( + ), + 'alsace' => + array ( + ), + 'alstom' => + array ( + ), + 'americanexpress' => + array ( + ), + 'americanfamily' => + array ( + ), + 'amex' => + array ( + ), + 'amfam' => + array ( + ), + 'amica' => + array ( + ), + 'amsterdam' => + array ( + ), + 'analytics' => + array ( + ), + 'android' => + array ( + ), + 'anquan' => + array ( + ), + 'anz' => + array ( + ), + 'aol' => + array ( + ), + 'apartments' => + array ( + ), + 'app' => + array ( + ), + 'apple' => + array ( + ), + 'aquarelle' => + array ( + ), + 'arab' => + array ( + ), + 'aramco' => + array ( + ), + 'archi' => + array ( + ), + 'army' => + array ( + ), + 'art' => + array ( + ), + 'arte' => + array ( + ), + 'asda' => + array ( + ), + 'associates' => + array ( + ), + 'athleta' => + array ( + ), + 'attorney' => + array ( + ), + 'auction' => + array ( + ), + 'audi' => + array ( + ), + 'audible' => + array ( + ), + 'audio' => + array ( + ), + 'auspost' => + array ( + ), + 'author' => + array ( + ), + 'auto' => + array ( + ), + 'autos' => + array ( + ), + 'avianca' => + array ( + ), + 'aws' => + array ( + ), + 'axa' => + array ( + ), + 'azure' => + array ( + ), + 'baby' => + array ( + ), + 'baidu' => + array ( + ), + 'banamex' => + array ( + ), + 'bananarepublic' => + array ( + ), + 'band' => + array ( + ), + 'bank' => + array ( + ), + 'bar' => + array ( + ), + 'barcelona' => + array ( + ), + 'barclaycard' => + array ( + ), + 'barclays' => + array ( + ), + 'barefoot' => + array ( + ), + 'bargains' => + array ( + ), + 'baseball' => + array ( + ), + 'basketball' => + array ( + ), + 'bauhaus' => + array ( + ), + 'bayern' => + array ( + ), + 'bbc' => + array ( + ), + 'bbt' => + array ( + ), + 'bbva' => + array ( + ), + 'bcg' => + array ( + ), + 'bcn' => + array ( + ), + 'beats' => + array ( + ), + 'beauty' => + array ( + ), + 'beer' => + array ( + ), + 'bentley' => + array ( + ), + 'berlin' => + array ( + ), + 'best' => + array ( + ), + 'bestbuy' => + array ( + ), + 'bet' => + array ( + ), + 'bharti' => + array ( + ), + 'bible' => + array ( + ), + 'bid' => + array ( + ), + 'bike' => + array ( + ), + 'bing' => + array ( + ), + 'bingo' => + array ( + ), + 'bio' => + array ( + ), + 'black' => + array ( + ), + 'blackfriday' => + array ( + ), + 'blanco' => + array ( + ), + 'blockbuster' => + array ( + ), + 'blog' => + array ( + ), + 'bloomberg' => + array ( + ), + 'blue' => + array ( + ), + 'bms' => + array ( + ), + 'bmw' => + array ( + ), + 'bnl' => + array ( + ), + 'bnpparibas' => + array ( + ), + 'boats' => + array ( + ), + 'boehringer' => + array ( + ), + 'bofa' => + array ( + ), + 'bom' => + array ( + ), + 'bond' => + array ( + ), + 'boo' => + array ( + ), + 'book' => + array ( + ), + 'booking' => + array ( + ), + 'boots' => + array ( + ), + 'bosch' => + array ( + ), + 'bostik' => + array ( + ), + 'boston' => + array ( + ), + 'bot' => + array ( + ), + 'boutique' => + array ( + ), + 'box' => + array ( + ), + 'bradesco' => + array ( + ), + 'bridgestone' => + array ( + ), + 'broadway' => + array ( + ), + 'broker' => + array ( + ), + 'brother' => + array ( + ), + 'brussels' => + array ( + ), + 'budapest' => + array ( + ), + 'bugatti' => + array ( + ), + 'build' => + array ( + ), + 'builders' => + array ( + ), + 'business' => + array ( + ), + 'buy' => + array ( + ), + 'buzz' => + array ( + ), + 'bzh' => + array ( + ), + 'cab' => + array ( + ), + 'cafe' => + array ( + ), + 'cal' => + array ( + ), + 'call' => + array ( + ), + 'calvinklein' => + array ( + ), + 'cam' => + array ( + ), + 'camera' => + array ( + ), + 'camp' => + array ( + ), + 'cancerresearch' => + array ( + ), + 'canon' => + array ( + ), + 'capetown' => + array ( + ), + 'capital' => + array ( + ), + 'capitalone' => + array ( + ), + 'car' => + array ( + ), + 'caravan' => + array ( + ), + 'cards' => + array ( + ), + 'care' => + array ( + ), + 'career' => + array ( + ), + 'careers' => + array ( + ), + 'cars' => + array ( + ), + 'cartier' => + array ( + ), + 'casa' => + array ( + ), + 'case' => + array ( + ), + 'caseih' => + array ( + ), + 'cash' => + array ( + ), + 'casino' => + array ( + ), + 'catering' => + array ( + ), + 'catholic' => + array ( + ), + 'cba' => + array ( + ), + 'cbn' => + array ( + ), + 'cbre' => + array ( + ), + 'cbs' => + array ( + ), + 'ceb' => + array ( + ), + 'center' => + array ( + ), + 'ceo' => + array ( + ), + 'cern' => + array ( + ), + 'cfa' => + array ( + ), + 'cfd' => + array ( + ), + 'chanel' => + array ( + ), + 'channel' => + array ( + ), + 'chase' => + array ( + ), + 'chat' => + array ( + ), + 'cheap' => + array ( + ), + 'chintai' => + array ( + ), + 'chloe' => + array ( + ), + 'christmas' => + array ( + ), + 'chrome' => + array ( + ), + 'chrysler' => + array ( + ), + 'church' => + array ( + ), + 'cipriani' => + array ( + ), + 'circle' => + array ( + ), + 'cisco' => + array ( + ), + 'citadel' => + array ( + ), + 'citi' => + array ( + ), + 'citic' => + array ( + ), + 'city' => + array ( + ), + 'cityeats' => + array ( + ), + 'claims' => + array ( + ), + 'cleaning' => + array ( + ), + 'click' => + array ( + ), + 'clinic' => + array ( + ), + 'clinique' => + array ( + ), + 'clothing' => + array ( + ), + 'cloud' => + array ( + ), + 'club' => + array ( + ), + 'clubmed' => + array ( + ), + 'coach' => + array ( + ), + 'codes' => + array ( + ), + 'coffee' => + array ( + ), + 'college' => + array ( + ), + 'cologne' => + array ( + ), + 'comcast' => + array ( + ), + 'commbank' => + array ( + ), + 'community' => + array ( + ), + 'company' => + array ( + ), + 'compare' => + array ( + ), + 'computer' => + array ( + ), + 'comsec' => + array ( + ), + 'condos' => + array ( + ), + 'construction' => + array ( + ), + 'consulting' => + array ( + ), + 'contact' => + array ( + ), + 'contractors' => + array ( + ), + 'cooking' => + array ( + ), + 'cookingchannel' => + array ( + ), + 'cool' => + array ( + ), + 'corsica' => + array ( + ), + 'country' => + array ( + ), + 'coupon' => + array ( + ), + 'coupons' => + array ( + ), + 'courses' => + array ( + ), + 'credit' => + array ( + ), + 'creditcard' => + array ( + ), + 'creditunion' => + array ( + ), + 'cricket' => + array ( + ), + 'crown' => + array ( + ), + 'crs' => + array ( + ), + 'cruise' => + array ( + ), + 'cruises' => + array ( + ), + 'csc' => + array ( + ), + 'cuisinella' => + array ( + ), + 'cymru' => + array ( + ), + 'cyou' => + array ( + ), + 'dabur' => + array ( + ), + 'dad' => + array ( + ), + 'dance' => + array ( + ), + 'data' => + array ( + ), + 'date' => + array ( + ), + 'dating' => + array ( + ), + 'datsun' => + array ( + ), + 'day' => + array ( + ), + 'dclk' => + array ( + ), + 'dds' => + array ( + ), + 'deal' => + array ( + ), + 'dealer' => + array ( + ), + 'deals' => + array ( + ), + 'degree' => + array ( + ), + 'delivery' => + array ( + ), + 'dell' => + array ( + ), + 'deloitte' => + array ( + ), + 'delta' => + array ( + ), + 'democrat' => + array ( + ), + 'dental' => + array ( + ), + 'dentist' => + array ( + ), + 'desi' => + array ( + ), + 'design' => + array ( + ), + 'dev' => + array ( + ), + 'dhl' => + array ( + ), + 'diamonds' => + array ( + ), + 'diet' => + array ( + ), + 'digital' => + array ( + ), + 'direct' => + array ( + ), + 'directory' => + array ( + ), + 'discount' => + array ( + ), + 'discover' => + array ( + ), + 'dish' => + array ( + ), + 'diy' => + array ( + ), + 'dnp' => + array ( + ), + 'docs' => + array ( + ), + 'doctor' => + array ( + ), + 'dodge' => + array ( + ), + 'dog' => + array ( + ), + 'doha' => + array ( + ), + 'domains' => + array ( + ), + 'dot' => + array ( + ), + 'download' => + array ( + ), + 'drive' => + array ( + ), + 'dtv' => + array ( + ), + 'dubai' => + array ( + ), + 'duck' => + array ( + ), + 'dunlop' => + array ( + ), + 'duns' => + array ( + ), + 'dupont' => + array ( + ), + 'durban' => + array ( + ), + 'dvag' => + array ( + ), + 'dvr' => + array ( + ), + 'dwg' => + array ( + ), + 'earth' => + array ( + ), + 'eat' => + array ( + ), + 'eco' => + array ( + ), + 'edeka' => + array ( + ), + 'education' => + array ( + ), + 'email' => + array ( + ), + 'emerck' => + array ( + ), + 'emerson' => + array ( + ), + 'energy' => + array ( + ), + 'engineer' => + array ( + ), + 'engineering' => + array ( + ), + 'enterprises' => + array ( + ), + 'epost' => + array ( + ), + 'epson' => + array ( + ), + 'equipment' => + array ( + ), + 'ericsson' => + array ( + ), + 'erni' => + array ( + ), + 'esq' => + array ( + ), + 'estate' => + array ( + ), + 'esurance' => + array ( + ), + 'etisalat' => + array ( + ), + 'eurovision' => + array ( + ), + 'eus' => + array ( + ), + 'events' => + array ( + ), + 'everbank' => + array ( + ), + 'exchange' => + array ( + ), + 'expert' => + array ( + ), + 'exposed' => + array ( + ), + 'express' => + array ( + ), + 'extraspace' => + array ( + ), + 'fage' => + array ( + ), + 'fail' => + array ( + ), + 'fairwinds' => + array ( + ), + 'faith' => + array ( + ), + 'family' => + array ( + ), + 'fan' => + array ( + ), + 'fans' => + array ( + ), + 'farm' => + array ( + ), + 'farmers' => + array ( + ), + 'fashion' => + array ( + ), + 'fast' => + array ( + ), + 'fedex' => + array ( + ), + 'feedback' => + array ( + ), + 'ferrari' => + array ( + ), + 'ferrero' => + array ( + ), + 'fiat' => + array ( + ), + 'fidelity' => + array ( + ), + 'fido' => + array ( + ), + 'film' => + array ( + ), + 'final' => + array ( + ), + 'finance' => + array ( + ), + 'financial' => + array ( + ), + 'fire' => + array ( + ), + 'firestone' => + array ( + ), + 'firmdale' => + array ( + ), + 'fish' => + array ( + ), + 'fishing' => + array ( + ), + 'fit' => + array ( + ), + 'fitness' => + array ( + ), + 'flickr' => + array ( + ), + 'flights' => + array ( + ), + 'flir' => + array ( + ), + 'florist' => + array ( + ), + 'flowers' => + array ( + ), + 'fly' => + array ( + ), + 'foo' => + array ( + ), + 'food' => + array ( + ), + 'foodnetwork' => + array ( + ), + 'football' => + array ( + ), + 'ford' => + array ( + ), + 'forex' => + array ( + ), + 'forsale' => + array ( + ), + 'forum' => + array ( + ), + 'foundation' => + array ( + ), + 'fox' => + array ( + ), + 'free' => + array ( + ), + 'fresenius' => + array ( + ), + 'frl' => + array ( + ), + 'frogans' => + array ( + ), + 'frontdoor' => + array ( + ), + 'frontier' => + array ( + ), + 'ftr' => + array ( + ), + 'fujitsu' => + array ( + ), + 'fujixerox' => + array ( + ), + 'fun' => + array ( + ), + 'fund' => + array ( + ), + 'furniture' => + array ( + ), + 'futbol' => + array ( + ), + 'fyi' => + array ( + ), + 'gal' => + array ( + ), + 'gallery' => + array ( + ), + 'gallo' => + array ( + ), + 'gallup' => + array ( + ), + 'game' => + array ( + ), + 'games' => + array ( + ), + 'gap' => + array ( + ), + 'garden' => + array ( + ), + 'gbiz' => + array ( + ), + 'gdn' => + array ( + ), + 'gea' => + array ( + ), + 'gent' => + array ( + ), + 'genting' => + array ( + ), + 'george' => + array ( + ), + 'ggee' => + array ( + ), + 'gift' => + array ( + ), + 'gifts' => + array ( + ), + 'gives' => + array ( + ), + 'giving' => + array ( + ), + 'glade' => + array ( + ), + 'glass' => + array ( + ), + 'gle' => + array ( + ), + 'global' => + array ( + ), + 'globo' => + array ( + ), + 'gmail' => + array ( + ), + 'gmbh' => + array ( + ), + 'gmo' => + array ( + ), + 'gmx' => + array ( + ), + 'godaddy' => + array ( + ), + 'gold' => + array ( + ), + 'goldpoint' => + array ( + ), + 'golf' => + array ( + ), + 'goo' => + array ( + ), + 'goodhands' => + array ( + ), + 'goodyear' => + array ( + ), + 'goog' => + array ( + ), + 'google' => + array ( + ), + 'gop' => + array ( + ), + 'got' => + array ( + ), + 'grainger' => + array ( + ), + 'graphics' => + array ( + ), + 'gratis' => + array ( + ), + 'green' => + array ( + ), + 'gripe' => + array ( + ), + 'grocery' => + array ( + ), + 'group' => + array ( + ), + 'guardian' => + array ( + ), + 'gucci' => + array ( + ), + 'guge' => + array ( + ), + 'guide' => + array ( + ), + 'guitars' => + array ( + ), + 'guru' => + array ( + ), + 'hair' => + array ( + ), + 'hamburg' => + array ( + ), + 'hangout' => + array ( + ), + 'haus' => + array ( + ), + 'hbo' => + array ( + ), + 'hdfc' => + array ( + ), + 'hdfcbank' => + array ( + ), + 'health' => + array ( + ), + 'healthcare' => + array ( + ), + 'help' => + array ( + ), + 'helsinki' => + array ( + ), + 'here' => + array ( + ), + 'hermes' => + array ( + ), + 'hgtv' => + array ( + ), + 'hiphop' => + array ( + ), + 'hisamitsu' => + array ( + ), + 'hitachi' => + array ( + ), + 'hiv' => + array ( + ), + 'hkt' => + array ( + ), + 'hockey' => + array ( + ), + 'holdings' => + array ( + ), + 'holiday' => + array ( + ), + 'homedepot' => + array ( + ), + 'homegoods' => + array ( + ), + 'homes' => + array ( + ), + 'homesense' => + array ( + ), + 'honda' => + array ( + ), + 'honeywell' => + array ( + ), + 'horse' => + array ( + ), + 'host' => + array ( + ), + 'hosting' => + array ( + ), + 'hot' => + array ( + ), + 'hoteles' => + array ( + ), + 'hotels' => + array ( + ), + 'hotmail' => + array ( + ), + 'house' => + array ( + ), + 'how' => + array ( + ), + 'hsbc' => + array ( + ), + 'htc' => + array ( + ), + 'hughes' => + array ( + ), + 'hyatt' => + array ( + ), + 'hyundai' => + array ( + ), + 'ibm' => + array ( + ), + 'icbc' => + array ( + ), + 'ice' => + array ( + ), + 'icu' => + array ( + ), + 'ieee' => + array ( + ), + 'ifm' => + array ( + ), + 'iinet' => + array ( + ), + 'ikano' => + array ( + ), + 'imamat' => + array ( + ), + 'imdb' => + array ( + ), + 'immo' => + array ( + ), + 'immobilien' => + array ( + ), + 'industries' => + array ( + ), + 'infiniti' => + array ( + ), + 'ing' => + array ( + ), + 'ink' => + array ( + ), + 'institute' => + array ( + ), + 'insurance' => + array ( + ), + 'insure' => + array ( + ), + 'intel' => + array ( + ), + 'international' => + array ( + ), + 'intuit' => + array ( + ), + 'investments' => + array ( + ), + 'ipiranga' => + array ( + ), + 'irish' => + array ( + ), + 'iselect' => + array ( + ), + 'ismaili' => + array ( + ), + 'ist' => + array ( + ), + 'istanbul' => + array ( + ), + 'itau' => + array ( + ), + 'itv' => + array ( + ), + 'iveco' => + array ( + ), + 'iwc' => + array ( + ), + 'jaguar' => + array ( + ), + 'java' => + array ( + ), + 'jcb' => + array ( + ), + 'jcp' => + array ( + ), + 'jeep' => + array ( + ), + 'jetzt' => + array ( + ), + 'jewelry' => + array ( + ), + 'jio' => + array ( + ), + 'jlc' => + array ( + ), + 'jll' => + array ( + ), + 'jmp' => + array ( + ), + 'jnj' => + array ( + ), + 'joburg' => + array ( + ), + 'jot' => + array ( + ), + 'joy' => + array ( + ), + 'jpmorgan' => + array ( + ), + 'jprs' => + array ( + ), + 'juegos' => + array ( + ), + 'juniper' => + array ( + ), + 'kaufen' => + array ( + ), + 'kddi' => + array ( + ), + 'kerryhotels' => + array ( + ), + 'kerrylogistics' => + array ( + ), + 'kerryproperties' => + array ( + ), + 'kfh' => + array ( + ), + 'kia' => + array ( + ), + 'kim' => + array ( + ), + 'kinder' => + array ( + ), + 'kindle' => + array ( + ), + 'kitchen' => + array ( + ), + 'kiwi' => + array ( + ), + 'koeln' => + array ( + ), + 'komatsu' => + array ( + ), + 'kosher' => + array ( + ), + 'kpmg' => + array ( + ), + 'kpn' => + array ( + ), + 'krd' => + array ( + ), + 'kred' => + array ( + ), + 'kuokgroup' => + array ( + ), + 'kyoto' => + array ( + ), + 'lacaixa' => + array ( + ), + 'ladbrokes' => + array ( + ), + 'lamborghini' => + array ( + ), + 'lamer' => + array ( + ), + 'lancaster' => + array ( + ), + 'lancia' => + array ( + ), + 'lancome' => + array ( + ), + 'land' => + array ( + ), + 'landrover' => + array ( + ), + 'lanxess' => + array ( + ), + 'lasalle' => + array ( + ), + 'lat' => + array ( + ), + 'latino' => + array ( + ), + 'latrobe' => + array ( + ), + 'law' => + array ( + ), + 'lawyer' => + array ( + ), + 'lds' => + array ( + ), + 'lease' => + array ( + ), + 'leclerc' => + array ( + ), + 'lefrak' => + array ( + ), + 'legal' => + array ( + ), + 'lego' => + array ( + ), + 'lexus' => + array ( + ), + 'lgbt' => + array ( + ), + 'liaison' => + array ( + ), + 'lidl' => + array ( + ), + 'life' => + array ( + ), + 'lifeinsurance' => + array ( + ), + 'lifestyle' => + array ( + ), + 'lighting' => + array ( + ), + 'like' => + array ( + ), + 'lilly' => + array ( + ), + 'limited' => + array ( + ), + 'limo' => + array ( + ), + 'lincoln' => + array ( + ), + 'linde' => + array ( + ), + 'link' => + array ( + ), + 'lipsy' => + array ( + ), + 'live' => + array ( + ), + 'living' => + array ( + ), + 'lixil' => + array ( + ), + 'loan' => + array ( + ), + 'loans' => + array ( + ), + 'locker' => + array ( + ), + 'locus' => + array ( + ), + 'loft' => + array ( + ), + 'lol' => + array ( + ), + 'london' => + array ( + ), + 'lotte' => + array ( + ), + 'lotto' => + array ( + ), + 'love' => + array ( + ), + 'lpl' => + array ( + ), + 'lplfinancial' => + array ( + ), + 'ltd' => + array ( + ), + 'ltda' => + array ( + ), + 'lundbeck' => + array ( + ), + 'lupin' => + array ( + ), + 'luxe' => + array ( + ), + 'luxury' => + array ( + ), + 'macys' => + array ( + ), + 'madrid' => + array ( + ), + 'maif' => + array ( + ), + 'maison' => + array ( + ), + 'makeup' => + array ( + ), + 'man' => + array ( + ), + 'management' => + array ( + ), + 'mango' => + array ( + ), + 'map' => + array ( + ), + 'market' => + array ( + ), + 'marketing' => + array ( + ), + 'markets' => + array ( + ), + 'marriott' => + array ( + ), + 'marshalls' => + array ( + ), + 'maserati' => + array ( + ), + 'mattel' => + array ( + ), + 'mba' => + array ( + ), + 'mcd' => + array ( + ), + 'mcdonalds' => + array ( + ), + 'mckinsey' => + array ( + ), + 'med' => + array ( + ), + 'media' => + array ( + ), + 'meet' => + array ( + ), + 'melbourne' => + array ( + ), + 'meme' => + array ( + ), + 'memorial' => + array ( + ), + 'men' => + array ( + ), + 'menu' => + array ( + ), + 'meo' => + array ( + ), + 'merckmsd' => + array ( + ), + 'metlife' => + array ( + ), + 'miami' => + array ( + ), + 'microsoft' => + array ( + ), + 'mini' => + array ( + ), + 'mint' => + array ( + ), + 'mit' => + array ( + ), + 'mitsubishi' => + array ( + ), + 'mlb' => + array ( + ), + 'mls' => + array ( + ), + 'mma' => + array ( + ), + 'mobile' => + array ( + ), + 'mobily' => + array ( + ), + 'moda' => + array ( + ), + 'moe' => + array ( + ), + 'moi' => + array ( + ), + 'mom' => + array ( + ), + 'monash' => + array ( + ), + 'money' => + array ( + ), + 'monster' => + array ( + ), + 'montblanc' => + array ( + ), + 'mopar' => + array ( + ), + 'mormon' => + array ( + ), + 'mortgage' => + array ( + ), + 'moscow' => + array ( + ), + 'moto' => + array ( + ), + 'motorcycles' => + array ( + ), + 'mov' => + array ( + ), + 'movie' => + array ( + ), + 'movistar' => + array ( + ), + 'msd' => + array ( + ), + 'mtn' => + array ( + ), + 'mtpc' => + array ( + ), + 'mtr' => + array ( + ), + 'mutual' => + array ( + ), + 'mutuelle' => + array ( + ), + 'nab' => + array ( + ), + 'nadex' => + array ( + ), + 'nagoya' => + array ( + ), + 'nationwide' => + array ( + ), + 'natura' => + array ( + ), + 'navy' => + array ( + ), + 'nba' => + array ( + ), + 'nec' => + array ( + ), + 'netbank' => + array ( + ), + 'netflix' => + array ( + ), + 'network' => + array ( + ), + 'neustar' => + array ( + ), + 'new' => + array ( + ), + 'newholland' => + array ( + ), + 'news' => + array ( + ), + 'next' => + array ( + ), + 'nextdirect' => + array ( + ), + 'nexus' => + array ( + ), + 'nfl' => + array ( + ), + 'ngo' => + array ( + ), + 'nhk' => + array ( + ), + 'nico' => + array ( + ), + 'nike' => + array ( + ), + 'nikon' => + array ( + ), + 'ninja' => + array ( + ), + 'nissan' => + array ( + ), + 'nissay' => + array ( + ), + 'nokia' => + array ( + ), + 'northwesternmutual' => + array ( + ), + 'norton' => + array ( + ), + 'now' => + array ( + ), + 'nowruz' => + array ( + ), + 'nowtv' => + array ( + ), + 'nra' => + array ( + ), + 'nrw' => + array ( + ), + 'ntt' => + array ( + ), + 'nyc' => + array ( + ), + 'obi' => + array ( + ), + 'observer' => + array ( + ), + 'off' => + array ( + ), + 'office' => + array ( + ), + 'okinawa' => + array ( + ), + 'olayan' => + array ( + ), + 'olayangroup' => + array ( + ), + 'oldnavy' => + array ( + ), + 'ollo' => + array ( + ), + 'omega' => + array ( + ), + 'one' => + array ( + ), + 'ong' => + array ( + ), + 'onl' => + array ( + ), + 'online' => + array ( + ), + 'onyourside' => + array ( + ), + 'ooo' => + array ( + ), + 'open' => + array ( + ), + 'oracle' => + array ( + ), + 'orange' => + array ( + ), + 'organic' => + array ( + ), + 'orientexpress' => + array ( + ), + 'origins' => + array ( + ), + 'osaka' => + array ( + ), + 'otsuka' => + array ( + ), + 'ott' => + array ( + ), + 'ovh' => + array ( + ), + 'page' => + array ( + ), + 'pamperedchef' => + array ( + ), + 'panasonic' => + array ( + ), + 'panerai' => + array ( + ), + 'paris' => + array ( + ), + 'pars' => + array ( + ), + 'partners' => + array ( + ), + 'parts' => + array ( + ), + 'party' => + array ( + ), + 'passagens' => + array ( + ), + 'pay' => + array ( + ), + 'pccw' => + array ( + ), + 'pet' => + array ( + ), + 'pfizer' => + array ( + ), + 'pharmacy' => + array ( + ), + 'phd' => + array ( + ), + 'philips' => + array ( + ), + 'phone' => + array ( + ), + 'photo' => + array ( + ), + 'photography' => + array ( + ), + 'photos' => + array ( + ), + 'physio' => + array ( + ), + 'piaget' => + array ( + ), + 'pics' => + array ( + ), + 'pictet' => + array ( + ), + 'pictures' => + array ( + ), + 'pid' => + array ( + ), + 'pin' => + array ( + ), + 'ping' => + array ( + ), + 'pink' => + array ( + ), + 'pioneer' => + array ( + ), + 'pizza' => + array ( + ), + 'place' => + array ( + ), + 'play' => + array ( + ), + 'playstation' => + array ( + ), + 'plumbing' => + array ( + ), + 'plus' => + array ( + ), + 'pnc' => + array ( + ), + 'pohl' => + array ( + ), + 'poker' => + array ( + ), + 'politie' => + array ( + ), + 'porn' => + array ( + ), + 'pramerica' => + array ( + ), + 'praxi' => + array ( + ), + 'press' => + array ( + ), + 'prime' => + array ( + ), + 'prod' => + array ( + ), + 'productions' => + array ( + ), + 'prof' => + array ( + ), + 'progressive' => + array ( + ), + 'promo' => + array ( + ), + 'properties' => + array ( + ), + 'property' => + array ( + ), + 'protection' => + array ( + ), + 'pru' => + array ( + ), + 'prudential' => + array ( + ), + 'pub' => + array ( + ), + 'pwc' => + array ( + ), + 'qpon' => + array ( + ), + 'quebec' => + array ( + ), + 'quest' => + array ( + ), + 'qvc' => + array ( + ), + 'racing' => + array ( + ), + 'radio' => + array ( + ), + 'raid' => + array ( + ), + 'read' => + array ( + ), + 'realestate' => + array ( + ), + 'realtor' => + array ( + ), + 'realty' => + array ( + ), + 'recipes' => + array ( + ), + 'red' => + array ( + ), + 'redstone' => + array ( + ), + 'redumbrella' => + array ( + ), + 'rehab' => + array ( + ), + 'reise' => + array ( + ), + 'reisen' => + array ( + ), + 'reit' => + array ( + ), + 'reliance' => + array ( + ), + 'ren' => + array ( + ), + 'rent' => + array ( + ), + 'rentals' => + array ( + ), + 'repair' => + array ( + ), + 'report' => + array ( + ), + 'republican' => + array ( + ), + 'rest' => + array ( + ), + 'restaurant' => + array ( + ), + 'review' => + array ( + ), + 'reviews' => + array ( + ), + 'rexroth' => + array ( + ), + 'rich' => + array ( + ), + 'richardli' => + array ( + ), + 'ricoh' => + array ( + ), + 'rightathome' => + array ( + ), + 'ril' => + array ( + ), + 'rio' => + array ( + ), + 'rip' => + array ( + ), + 'rmit' => + array ( + ), + 'rocher' => + array ( + ), + 'rocks' => + array ( + ), + 'rodeo' => + array ( + ), + 'rogers' => + array ( + ), + 'room' => + array ( + ), + 'rsvp' => + array ( + ), + 'ruhr' => + array ( + ), + 'run' => + array ( + ), + 'rwe' => + array ( + ), + 'ryukyu' => + array ( + ), + 'saarland' => + array ( + ), + 'safe' => + array ( + ), + 'safety' => + array ( + ), + 'sakura' => + array ( + ), + 'sale' => + array ( + ), + 'salon' => + array ( + ), + 'samsclub' => + array ( + ), + 'samsung' => + array ( + ), + 'sandvik' => + array ( + ), + 'sandvikcoromant' => + array ( + ), + 'sanofi' => + array ( + ), + 'sap' => + array ( + ), + 'sapo' => + array ( + ), + 'sarl' => + array ( + ), + 'sas' => + array ( + ), + 'save' => + array ( + ), + 'saxo' => + array ( + ), + 'sbi' => + array ( + ), + 'sbs' => + array ( + ), + 'sca' => + array ( + ), + 'scb' => + array ( + ), + 'schaeffler' => + array ( + ), + 'schmidt' => + array ( + ), + 'scholarships' => + array ( + ), + 'school' => + array ( + ), + 'schule' => + array ( + ), + 'schwarz' => + array ( + ), + 'science' => + array ( + ), + 'scjohnson' => + array ( + ), + 'scor' => + array ( + ), + 'scot' => + array ( + ), + 'search' => + array ( + ), + 'seat' => + array ( + ), + 'secure' => + array ( + ), + 'security' => + array ( + ), + 'seek' => + array ( + ), + 'select' => + array ( + ), + 'sener' => + array ( + ), + 'services' => + array ( + ), + 'ses' => + array ( + ), + 'seven' => + array ( + ), + 'sew' => + array ( + ), + 'sex' => + array ( + ), + 'sexy' => + array ( + ), + 'sfr' => + array ( + ), + 'shangrila' => + array ( + ), + 'sharp' => + array ( + ), + 'shaw' => + array ( + ), + 'shell' => + array ( + ), + 'shia' => + array ( + ), + 'shiksha' => + array ( + ), + 'shoes' => + array ( + ), + 'shop' => + array ( + ), + 'shopping' => + array ( + ), + 'shouji' => + array ( + ), + 'show' => + array ( + ), + 'showtime' => + array ( + ), + 'shriram' => + array ( + ), + 'silk' => + array ( + ), + 'sina' => + array ( + ), + 'singles' => + array ( + ), + 'site' => + array ( + ), + 'ski' => + array ( + ), + 'skin' => + array ( + ), + 'sky' => + array ( + ), + 'skype' => + array ( + ), + 'sling' => + array ( + ), + 'smart' => + array ( + ), + 'smile' => + array ( + ), + 'sncf' => + array ( + ), + 'soccer' => + array ( + ), + 'social' => + array ( + ), + 'softbank' => + array ( + ), + 'software' => + array ( + ), + 'sohu' => + array ( + ), + 'solar' => + array ( + ), + 'solutions' => + array ( + ), + 'song' => + array ( + ), + 'sony' => + array ( + ), + 'soy' => + array ( + ), + 'space' => + array ( + ), + 'spiegel' => + array ( + ), + 'spot' => + array ( + ), + 'spreadbetting' => + array ( + ), + 'srl' => + array ( + ), + 'srt' => + array ( + ), + 'stada' => + array ( + ), + 'staples' => + array ( + ), + 'star' => + array ( + ), + 'starhub' => + array ( + ), + 'statebank' => + array ( + ), + 'statefarm' => + array ( + ), + 'statoil' => + array ( + ), + 'stc' => + array ( + ), + 'stcgroup' => + array ( + ), + 'stockholm' => + array ( + ), + 'storage' => + array ( + ), + 'store' => + array ( + ), + 'stream' => + array ( + ), + 'studio' => + array ( + ), + 'study' => + array ( + ), + 'style' => + array ( + ), + 'sucks' => + array ( + ), + 'supplies' => + array ( + ), + 'supply' => + array ( + ), + 'support' => + array ( + ), + 'surf' => + array ( + ), + 'surgery' => + array ( + ), + 'suzuki' => + array ( + ), + 'swatch' => + array ( + ), + 'swiftcover' => + array ( + ), + 'swiss' => + array ( + ), + 'sydney' => + array ( + ), + 'symantec' => + array ( + ), + 'systems' => + array ( + ), + 'tab' => + array ( + ), + 'taipei' => + array ( + ), + 'talk' => + array ( + ), + 'taobao' => + array ( + ), + 'target' => + array ( + ), + 'tatamotors' => + array ( + ), + 'tatar' => + array ( + ), + 'tattoo' => + array ( + ), + 'tax' => + array ( + ), + 'taxi' => + array ( + ), + 'tci' => + array ( + ), + 'tdk' => + array ( + ), + 'team' => + array ( + ), + 'tech' => + array ( + ), + 'technology' => + array ( + ), + 'telecity' => + array ( + ), + 'telefonica' => + array ( + ), + 'temasek' => + array ( + ), + 'tennis' => + array ( + ), + 'teva' => + array ( + ), + 'thd' => + array ( + ), + 'theater' => + array ( + ), + 'theatre' => + array ( + ), + 'theguardian' => + array ( + ), + 'tiaa' => + array ( + ), + 'tickets' => + array ( + ), + 'tienda' => + array ( + ), + 'tiffany' => + array ( + ), + 'tips' => + array ( + ), + 'tires' => + array ( + ), + 'tirol' => + array ( + ), + 'tjmaxx' => + array ( + ), + 'tjx' => + array ( + ), + 'tkmaxx' => + array ( + ), + 'tmall' => + array ( + ), + 'today' => + array ( + ), + 'tokyo' => + array ( + ), + 'tools' => + array ( + ), + 'top' => + array ( + ), + 'toray' => + array ( + ), + 'toshiba' => + array ( + ), + 'total' => + array ( + ), + 'tours' => + array ( + ), + 'town' => + array ( + ), + 'toyota' => + array ( + ), + 'toys' => + array ( + ), + 'trade' => + array ( + ), + 'trading' => + array ( + ), + 'training' => + array ( + ), + 'travelchannel' => + array ( + ), + 'travelers' => + array ( + ), + 'travelersinsurance' => + array ( + ), + 'trust' => + array ( + ), + 'trv' => + array ( + ), + 'tube' => + array ( + ), + 'tui' => + array ( + ), + 'tunes' => + array ( + ), + 'tushu' => + array ( + ), + 'tvs' => + array ( + ), + 'ubank' => + array ( + ), + 'ubs' => + array ( + ), + 'uconnect' => + array ( + ), + 'unicom' => + array ( + ), + 'university' => + array ( + ), + 'uno' => + array ( + ), + 'uol' => + array ( + ), + 'ups' => + array ( + ), + 'vacations' => + array ( + ), + 'vana' => + array ( + ), + 'vanguard' => + array ( + ), + 'vegas' => + array ( + ), + 'ventures' => + array ( + ), + 'verisign' => + array ( + ), + 'versicherung' => + array ( + ), + 'vet' => + array ( + ), + 'viajes' => + array ( + ), + 'video' => + array ( + ), + 'vig' => + array ( + ), + 'viking' => + array ( + ), + 'villas' => + array ( + ), + 'vin' => + array ( + ), + 'vip' => + array ( + ), + 'virgin' => + array ( + ), + 'visa' => + array ( + ), + 'vision' => + array ( + ), + 'vista' => + array ( + ), + 'vistaprint' => + array ( + ), + 'viva' => + array ( + ), + 'vivo' => + array ( + ), + 'vlaanderen' => + array ( + ), + 'vodka' => + array ( + ), + 'volkswagen' => + array ( + ), + 'volvo' => + array ( + ), + 'vote' => + array ( + ), + 'voting' => + array ( + ), + 'voto' => + array ( + ), + 'voyage' => + array ( + ), + 'vuelos' => + array ( + ), + 'wales' => + array ( + ), + 'walmart' => + array ( + ), + 'walter' => + array ( + ), + 'wang' => + array ( + ), + 'wanggou' => + array ( + ), + 'warman' => + array ( + ), + 'watch' => + array ( + ), + 'watches' => + array ( + ), + 'weather' => + array ( + ), + 'weatherchannel' => + array ( + ), + 'webcam' => + array ( + ), + 'weber' => + array ( + ), + 'website' => + array ( + ), + 'wed' => + array ( + ), + 'wedding' => + array ( + ), + 'weibo' => + array ( + ), + 'weir' => + array ( + ), + 'whoswho' => + array ( + ), + 'wien' => + array ( + ), + 'wiki' => + array ( + ), + 'williamhill' => + array ( + ), + 'win' => + array ( + ), + 'windows' => + array ( + ), + 'wine' => + array ( + ), + 'winners' => + array ( + ), + 'wme' => + array ( + ), + 'wolterskluwer' => + array ( + ), + 'woodside' => + array ( + ), + 'work' => + array ( + ), + 'works' => + array ( + ), + 'world' => + array ( + ), + 'wow' => + array ( + ), + 'wtc' => + array ( + ), + 'wtf' => + array ( + ), + 'xbox' => + array ( + ), + 'xerox' => + array ( + ), + 'xfinity' => + array ( + ), + 'xihuan' => + array ( + ), + 'xin' => + array ( + ), + 'xn--11b4c3d' => + array ( + ), + 'xn--1ck2e1b' => + array ( + ), + 'xn--1qqw23a' => + array ( + ), + 'xn--30rr7y' => + array ( + ), + 'xn--3bst00m' => + array ( + ), + 'xn--3ds443g' => + array ( + ), + 'xn--3oq18vl8pn36a' => + array ( + ), + 'xn--3pxu8k' => + array ( + ), + 'xn--42c2d9a' => + array ( + ), + 'xn--45q11c' => + array ( + ), + 'xn--4gbrim' => + array ( + ), + 'xn--4gq48lf9j' => + array ( + ), + 'xn--55qw42g' => + array ( + ), + 'xn--55qx5d' => + array ( + ), + 'xn--5su34j936bgsg' => + array ( + ), + 'xn--5tzm5g' => + array ( + ), + 'xn--6frz82g' => + array ( + ), + 'xn--6qq986b3xl' => + array ( + ), + 'xn--80adxhks' => + array ( + ), + 'xn--80aqecdr1a' => + array ( + ), + 'xn--80asehdb' => + array ( + ), + 'xn--80aswg' => + array ( + ), + 'xn--8y0a063a' => + array ( + ), + 'xn--9dbq2a' => + array ( + ), + 'xn--9et52u' => + array ( + ), + 'xn--9krt00a' => + array ( + ), + 'xn--b4w605ferd' => + array ( + ), + 'xn--bck1b9a5dre4c' => + array ( + ), + 'xn--c1avg' => + array ( + ), + 'xn--c2br7g' => + array ( + ), + 'xn--cck2b3b' => + array ( + ), + 'xn--cg4bki' => + array ( + ), + 'xn--czr694b' => + array ( + ), + 'xn--czrs0t' => + array ( + ), + 'xn--czru2d' => + array ( + ), + 'xn--d1acj3b' => + array ( + ), + 'xn--eckvdtc9d' => + array ( + ), + 'xn--efvy88h' => + array ( + ), + 'xn--estv75g' => + array ( + ), + 'xn--fct429k' => + array ( + ), + 'xn--fhbei' => + array ( + ), + 'xn--fiq228c5hs' => + array ( + ), + 'xn--fiq64b' => + array ( + ), + 'xn--fjq720a' => + array ( + ), + 'xn--flw351e' => + array ( + ), + 'xn--fzys8d69uvgm' => + array ( + ), + 'xn--g2xx48c' => + array ( + ), + 'xn--gckr3f0f' => + array ( + ), + 'xn--gk3at1e' => + array ( + ), + 'xn--hxt814e' => + array ( + ), + 'xn--i1b6b1a6a2e' => + array ( + ), + 'xn--imr513n' => + array ( + ), + 'xn--io0a7i' => + array ( + ), + 'xn--j1aef' => + array ( + ), + 'xn--jlq61u9w7b' => + array ( + ), + 'xn--jvr189m' => + array ( + ), + 'xn--kcrx77d1x4a' => + array ( + ), + 'xn--kpu716f' => + array ( + ), + 'xn--kput3i' => + array ( + ), + 'xn--mgba3a3ejt' => + array ( + ), + 'xn--mgba7c0bbn0a' => + array ( + ), + 'xn--mgbaakc7dvf' => + array ( + ), + 'xn--mgbab2bd' => + array ( + ), + 'xn--mgbb9fbpob' => + array ( + ), + 'xn--mgbca7dzdo' => + array ( + ), + 'xn--mgbi4ecexp' => + array ( + ), + 'xn--mgbt3dhd' => + array ( + ), + 'xn--mk1bu44c' => + array ( + ), + 'xn--mxtq1m' => + array ( + ), + 'xn--ngbc5azd' => + array ( + ), + 'xn--ngbe9e0a' => + array ( + ), + 'xn--ngbrx' => + array ( + ), + 'xn--nqv7f' => + array ( + ), + 'xn--nqv7fs00ema' => + array ( + ), + 'xn--nyqy26a' => + array ( + ), + 'xn--p1acf' => + array ( + ), + 'xn--pbt977c' => + array ( + ), + 'xn--pssy2u' => + array ( + ), + 'xn--q9jyb4c' => + array ( + ), + 'xn--qcka1pmc' => + array ( + ), + 'xn--rhqv96g' => + array ( + ), + 'xn--rovu88b' => + array ( + ), + 'xn--ses554g' => + array ( + ), + 'xn--t60b56a' => + array ( + ), + 'xn--tckwe' => + array ( + ), + 'xn--tiq49xqyj' => + array ( + ), + 'xn--unup4y' => + array ( + ), + 'xn--vermgensberater-ctb' => + array ( + ), + 'xn--vermgensberatung-pwb' => + array ( + ), + 'xn--vhquv' => + array ( + ), + 'xn--vuq861b' => + array ( + ), + 'xn--w4r85el8fhu5dnra' => + array ( + ), + 'xn--w4rs40l' => + array ( + ), + 'xn--xhq521b' => + array ( + ), + 'xn--zfr164b' => + array ( + ), + 'xperia' => + array ( + ), + 'xyz' => + array ( + ), + 'yachts' => + array ( + ), + 'yahoo' => + array ( + ), + 'yamaxun' => + array ( + ), + 'yandex' => + array ( + ), + 'yodobashi' => + array ( + ), + 'yoga' => + array ( + ), + 'yokohama' => + array ( + ), + 'you' => + array ( + ), + 'youtube' => + array ( + ), + 'yun' => + array ( + ), + 'zappos' => + array ( + ), + 'zara' => + array ( + ), + 'zero' => + array ( + ), + 'zip' => + array ( + ), + 'zippo' => + array ( + ), + 'zone' => + array ( + ), + 'zuerich' => + array ( + ), +); \ No newline at end of file diff --git a/data/private-public-suffix-list.php b/data/private-public-suffix-list.php new file mode 100644 index 00000000..f959ac03 --- /dev/null +++ b/data/private-public-suffix-list.php @@ -0,0 +1,2778 @@ + + array ( + 'beep' => + array ( + ), + 'co' => + array ( + ), + 'art' => + array ( + ), + 'gliwice' => + array ( + ), + 'krakow' => + array ( + ), + 'poznan' => + array ( + ), + 'wroc' => + array ( + ), + 'zakopane' => + array ( + ), + 'gda' => + array ( + ), + 'gdansk' => + array ( + ), + 'gdynia' => + array ( + ), + 'med' => + array ( + ), + 'sopot' => + array ( + ), + ), + 'estate' => + array ( + 'compute' => + array ( + '*' => + array ( + ), + ), + ), + 'network' => + array ( + 'alces' => + array ( + '*' => + array ( + ), + ), + ), + 'net' => + array ( + 'cloudfront' => + array ( + ), + 'myfritz' => + array ( + ), + 'gb' => + array ( + ), + 'hu' => + array ( + ), + 'jp' => + array ( + ), + 'se' => + array ( + ), + 'uk' => + array ( + ), + 'in' => + array ( + ), + 'cdn77-ssl' => + array ( + ), + 'cdn77' => + array ( + 'r' => + array ( + ), + ), + 'cryptonomic' => + array ( + '*' => + array ( + ), + ), + 'at-band-camp' => + array ( + ), + 'blogdns' => + array ( + ), + 'broke-it' => + array ( + ), + 'buyshouses' => + array ( + ), + 'dnsalias' => + array ( + ), + 'dnsdojo' => + array ( + ), + 'does-it' => + array ( + ), + 'dontexist' => + array ( + ), + 'dynalias' => + array ( + ), + 'dynathome' => + array ( + ), + 'endofinternet' => + array ( + ), + 'from-az' => + array ( + ), + 'from-co' => + array ( + ), + 'from-la' => + array ( + ), + 'from-ny' => + array ( + ), + 'gets-it' => + array ( + ), + 'ham-radio-op' => + array ( + ), + 'homeftp' => + array ( + ), + 'homeip' => + array ( + ), + 'homelinux' => + array ( + ), + 'homeunix' => + array ( + ), + 'in-the-band' => + array ( + ), + 'is-a-chef' => + array ( + ), + 'is-a-geek' => + array ( + ), + 'isa-geek' => + array ( + ), + 'kicks-ass' => + array ( + ), + 'office-on-the' => + array ( + ), + 'podzone' => + array ( + ), + 'scrapper-site' => + array ( + ), + 'selfip' => + array ( + ), + 'sells-it' => + array ( + ), + 'servebbs' => + array ( + ), + 'serveftp' => + array ( + ), + 'thruhere' => + array ( + ), + 'webhop' => + array ( + ), + 'dynv6' => + array ( + ), + 'fastly' => + array ( + 'ssl' => + array ( + 'a' => + array ( + ), + 'b' => + array ( + ), + 'global' => + array ( + ), + ), + 'prod' => + array ( + 'a' => + array ( + ), + 'global' => + array ( + ), + ), + ), + 'cloudfunctions' => + array ( + ), + 'azurewebsites' => + array ( + ), + 'azure-mobile' => + array ( + ), + 'cloudapp' => + array ( + ), + 'eating-organic' => + array ( + ), + 'mydissent' => + array ( + ), + 'myeffect' => + array ( + ), + 'mymediapc' => + array ( + ), + 'mypsx' => + array ( + ), + 'mysecuritycamera' => + array ( + ), + 'nhlfan' => + array ( + ), + 'no-ip' => + array ( + ), + 'pgafan' => + array ( + ), + 'privatizehealthinsurance' => + array ( + ), + 'bounceme' => + array ( + ), + 'ddns' => + array ( + ), + 'redirectme' => + array ( + ), + 'serveblog' => + array ( + ), + 'serveminecraft' => + array ( + ), + 'sytes' => + array ( + ), + 'rackmaze' => + array ( + ), + 'dsmynas' => + array ( + ), + 'familyds' => + array ( + ), + 'za' => + array ( + ), + ), + 'com' => + array ( + 'amazonaws' => + array ( + 'compute' => + array ( + 'ap-northeast-1' => + array ( + ), + 'ap-northeast-2' => + array ( + ), + 'ap-southeast-1' => + array ( + ), + 'ap-southeast-2' => + array ( + ), + 'eu-central-1' => + array ( + ), + 'eu-west-1' => + array ( + ), + 'sa-east-1' => + array ( + ), + 'us-gov-west-1' => + array ( + ), + 'us-west-1' => + array ( + ), + 'us-west-2' => + array ( + ), + ), + 'compute-1' => + array ( + 'z-1' => + array ( + ), + 'z-2' => + array ( + ), + ), + 'us-east-1' => + array ( + ), + 'elb' => + array ( + ), + 's3' => + array ( + ), + 's3-ap-northeast-1' => + array ( + ), + 's3-ap-northeast-2' => + array ( + ), + 's3-ap-southeast-1' => + array ( + ), + 's3-ap-southeast-2' => + array ( + ), + 's3-eu-central-1' => + array ( + ), + 's3-eu-west-1' => + array ( + ), + 's3-external-1' => + array ( + ), + 's3-external-2' => + array ( + ), + 's3-fips-us-gov-west-1' => + array ( + ), + 's3-sa-east-1' => + array ( + ), + 's3-us-gov-west-1' => + array ( + ), + 's3-us-west-1' => + array ( + ), + 's3-us-west-2' => + array ( + ), + 'ap-northeast-2' => + array ( + 's3' => + array ( + ), + ), + 'eu-central-1' => + array ( + 's3' => + array ( + ), + ), + ), + 'elasticbeanstalk' => + array ( + ), + 'on-aptible' => + array ( + ), + 'myasustor' => + array ( + ), + 'betainabox' => + array ( + ), + 'ar' => + array ( + ), + 'br' => + array ( + ), + 'cn' => + array ( + ), + 'de' => + array ( + ), + 'eu' => + array ( + ), + 'gb' => + array ( + ), + 'hu' => + array ( + ), + 'jpn' => + array ( + ), + 'kr' => + array ( + ), + 'mex' => + array ( + ), + 'no' => + array ( + ), + 'qc' => + array ( + ), + 'ru' => + array ( + ), + 'sa' => + array ( + ), + 'se' => + array ( + ), + 'uk' => + array ( + ), + 'us' => + array ( + ), + 'uy' => + array ( + ), + 'za' => + array ( + ), + 'africa' => + array ( + ), + 'gr' => + array ( + ), + 'co' => + array ( + ), + 'xenapponazure' => + array ( + ), + 'cloudcontrolled' => + array ( + ), + 'cloudcontrolapp' => + array ( + ), + 'dreamhosters' => + array ( + ), + 'mydrobo' => + array ( + ), + 'dyndns-at-home' => + array ( + ), + 'dyndns-at-work' => + array ( + ), + 'dyndns-blog' => + array ( + ), + 'dyndns-free' => + array ( + ), + 'dyndns-home' => + array ( + ), + 'dyndns-ip' => + array ( + ), + 'dyndns-mail' => + array ( + ), + 'dyndns-office' => + array ( + ), + 'dyndns-pics' => + array ( + ), + 'dyndns-remote' => + array ( + ), + 'dyndns-server' => + array ( + ), + 'dyndns-web' => + array ( + ), + 'dyndns-wiki' => + array ( + ), + 'dyndns-work' => + array ( + ), + 'blogdns' => + array ( + ), + 'cechire' => + array ( + ), + 'dnsalias' => + array ( + ), + 'dnsdojo' => + array ( + ), + 'doesntexist' => + array ( + ), + 'dontexist' => + array ( + ), + 'doomdns' => + array ( + ), + 'dyn-o-saur' => + array ( + ), + 'dynalias' => + array ( + ), + 'est-a-la-maison' => + array ( + ), + 'est-a-la-masion' => + array ( + ), + 'est-le-patron' => + array ( + ), + 'est-mon-blogueur' => + array ( + ), + 'from-ak' => + array ( + ), + 'from-al' => + array ( + ), + 'from-ar' => + array ( + ), + 'from-ca' => + array ( + ), + 'from-ct' => + array ( + ), + 'from-dc' => + array ( + ), + 'from-de' => + array ( + ), + 'from-fl' => + array ( + ), + 'from-ga' => + array ( + ), + 'from-hi' => + array ( + ), + 'from-ia' => + array ( + ), + 'from-id' => + array ( + ), + 'from-il' => + array ( + ), + 'from-in' => + array ( + ), + 'from-ks' => + array ( + ), + 'from-ky' => + array ( + ), + 'from-ma' => + array ( + ), + 'from-md' => + array ( + ), + 'from-mi' => + array ( + ), + 'from-mn' => + array ( + ), + 'from-mo' => + array ( + ), + 'from-ms' => + array ( + ), + 'from-mt' => + array ( + ), + 'from-nc' => + array ( + ), + 'from-nd' => + array ( + ), + 'from-ne' => + array ( + ), + 'from-nh' => + array ( + ), + 'from-nj' => + array ( + ), + 'from-nm' => + array ( + ), + 'from-nv' => + array ( + ), + 'from-oh' => + array ( + ), + 'from-ok' => + array ( + ), + 'from-or' => + array ( + ), + 'from-pa' => + array ( + ), + 'from-pr' => + array ( + ), + 'from-ri' => + array ( + ), + 'from-sc' => + array ( + ), + 'from-sd' => + array ( + ), + 'from-tn' => + array ( + ), + 'from-tx' => + array ( + ), + 'from-ut' => + array ( + ), + 'from-va' => + array ( + ), + 'from-vt' => + array ( + ), + 'from-wa' => + array ( + ), + 'from-wi' => + array ( + ), + 'from-wv' => + array ( + ), + 'from-wy' => + array ( + ), + 'getmyip' => + array ( + ), + 'gotdns' => + array ( + ), + 'hobby-site' => + array ( + ), + 'homelinux' => + array ( + ), + 'homeunix' => + array ( + ), + 'iamallama' => + array ( + ), + 'is-a-anarchist' => + array ( + ), + 'is-a-blogger' => + array ( + ), + 'is-a-bookkeeper' => + array ( + ), + 'is-a-bulls-fan' => + array ( + ), + 'is-a-caterer' => + array ( + ), + 'is-a-chef' => + array ( + ), + 'is-a-conservative' => + array ( + ), + 'is-a-cpa' => + array ( + ), + 'is-a-cubicle-slave' => + array ( + ), + 'is-a-democrat' => + array ( + ), + 'is-a-designer' => + array ( + ), + 'is-a-doctor' => + array ( + ), + 'is-a-financialadvisor' => + array ( + ), + 'is-a-geek' => + array ( + ), + 'is-a-green' => + array ( + ), + 'is-a-guru' => + array ( + ), + 'is-a-hard-worker' => + array ( + ), + 'is-a-hunter' => + array ( + ), + 'is-a-landscaper' => + array ( + ), + 'is-a-lawyer' => + array ( + ), + 'is-a-liberal' => + array ( + ), + 'is-a-libertarian' => + array ( + ), + 'is-a-llama' => + array ( + ), + 'is-a-musician' => + array ( + ), + 'is-a-nascarfan' => + array ( + ), + 'is-a-nurse' => + array ( + ), + 'is-a-painter' => + array ( + ), + 'is-a-personaltrainer' => + array ( + ), + 'is-a-photographer' => + array ( + ), + 'is-a-player' => + array ( + ), + 'is-a-republican' => + array ( + ), + 'is-a-rockstar' => + array ( + ), + 'is-a-socialist' => + array ( + ), + 'is-a-student' => + array ( + ), + 'is-a-teacher' => + array ( + ), + 'is-a-techie' => + array ( + ), + 'is-a-therapist' => + array ( + ), + 'is-an-accountant' => + array ( + ), + 'is-an-actor' => + array ( + ), + 'is-an-actress' => + array ( + ), + 'is-an-anarchist' => + array ( + ), + 'is-an-artist' => + array ( + ), + 'is-an-engineer' => + array ( + ), + 'is-an-entertainer' => + array ( + ), + 'is-certified' => + array ( + ), + 'is-gone' => + array ( + ), + 'is-into-anime' => + array ( + ), + 'is-into-cars' => + array ( + ), + 'is-into-cartoons' => + array ( + ), + 'is-into-games' => + array ( + ), + 'is-leet' => + array ( + ), + 'is-not-certified' => + array ( + ), + 'is-slick' => + array ( + ), + 'is-uberleet' => + array ( + ), + 'is-with-theband' => + array ( + ), + 'isa-geek' => + array ( + ), + 'isa-hockeynut' => + array ( + ), + 'issmarterthanyou' => + array ( + ), + 'likes-pie' => + array ( + ), + 'likescandy' => + array ( + ), + 'neat-url' => + array ( + ), + 'saves-the-whales' => + array ( + ), + 'selfip' => + array ( + ), + 'sells-for-less' => + array ( + ), + 'sells-for-u' => + array ( + ), + 'servebbs' => + array ( + ), + 'simple-url' => + array ( + ), + 'space-to-rent' => + array ( + ), + 'teaches-yoga' => + array ( + ), + 'writesthisblog' => + array ( + ), + 'evennode' => + array ( + 'eu-1' => + array ( + ), + 'eu-2' => + array ( + ), + 'us-1' => + array ( + ), + 'us-2' => + array ( + ), + ), + 'fbsbx' => + array ( + 'apps' => + array ( + ), + ), + 'firebaseapp' => + array ( + ), + 'flynnhub' => + array ( + ), + 'freebox-os' => + array ( + ), + 'freeboxos' => + array ( + ), + 'githubusercontent' => + array ( + ), + 'githubcloud' => + array ( + 'api' => + array ( + '*' => + array ( + ), + ), + 'ext' => + array ( + '*' => + array ( + ), + ), + 'gist' => + array ( + ), + ), + 'githubcloudusercontent' => + array ( + '*' => + array ( + ), + ), + 'ro' => + array ( + ), + '0emm' => + array ( + '*' => + array ( + ), + ), + 'appspot' => + array ( + ), + 'blogspot' => + array ( + ), + 'codespot' => + array ( + ), + 'googleapis' => + array ( + ), + 'googlecode' => + array ( + ), + 'pagespeedmobilizer' => + array ( + ), + 'withgoogle' => + array ( + ), + 'withyoutube' => + array ( + ), + 'herokuapp' => + array ( + ), + 'herokussl' => + array ( + ), + 'joyent' => + array ( + 'cns' => + array ( + '*' => + array ( + ), + ), + ), + 'meteorapp' => + array ( + 'eu' => + array ( + ), + ), + '4u' => + array ( + ), + 'nfshost' => + array ( + ), + 'blogsyte' => + array ( + ), + 'ciscofreak' => + array ( + ), + 'damnserver' => + array ( + ), + 'ditchyourip' => + array ( + ), + 'dnsiskinky' => + array ( + ), + 'dynns' => + array ( + ), + 'geekgalaxy' => + array ( + ), + 'health-carereform' => + array ( + ), + 'homesecuritymac' => + array ( + ), + 'homesecuritypc' => + array ( + ), + 'myactivedirectory' => + array ( + ), + 'mysecuritycamera' => + array ( + ), + 'net-freaks' => + array ( + ), + 'onthewifi' => + array ( + ), + 'point2this' => + array ( + ), + 'quicksytes' => + array ( + ), + 'securitytactics' => + array ( + ), + 'serveexchange' => + array ( + ), + 'servehumour' => + array ( + ), + 'servep2p' => + array ( + ), + 'servesarcasm' => + array ( + ), + 'stufftoread' => + array ( + ), + 'unusualperson' => + array ( + ), + 'workisboring' => + array ( + ), + '3utilities' => + array ( + ), + 'ddnsking' => + array ( + ), + 'myvnc' => + array ( + ), + 'servebeer' => + array ( + ), + 'servecounterstrike' => + array ( + ), + 'serveftp' => + array ( + ), + 'servegame' => + array ( + ), + 'servehalflife' => + array ( + ), + 'servehttp' => + array ( + ), + 'serveirc' => + array ( + ), + 'servemp3' => + array ( + ), + 'servepics' => + array ( + ), + 'servequake' => + array ( + ), + 'operaunite' => + array ( + ), + 'outsystemscloud' => + array ( + ), + 'ownprovider' => + array ( + ), + 'pgfog' => + array ( + ), + 'pagefrontapp' => + array ( + ), + 'gotpantheon' => + array ( + ), + 'prgmr' => + array ( + 'xen' => + array ( + ), + ), + 'qa2' => + array ( + ), + 'dev-myqnapcloud' => + array ( + ), + 'alpha-myqnapcloud' => + array ( + ), + 'myqnapcloud' => + array ( + ), + 'rackmaze' => + array ( + ), + 'rhcloud' => + array ( + ), + 'logoip' => + array ( + ), + 'myshopblocks' => + array ( + ), + 'sinaapp' => + array ( + ), + 'vipsinaapp' => + array ( + ), + '1kapp' => + array ( + ), + 'bounty-full' => + array ( + 'alpha' => + array ( + ), + 'beta' => + array ( + ), + ), + 'dsmynas' => + array ( + ), + 'familyds' => + array ( + ), + 'bloxcms' => + array ( + ), + 'townnews-staging' => + array ( + ), + 'hk' => + array ( + ), + 'yolasite' => + array ( + ), + ), + 'cn' => + array ( + 'com' => + array ( + 'amazonaws' => + array ( + 'compute' => + array ( + 'cn-north-1' => + array ( + ), + ), + 'cn-north-1' => + array ( + 's3' => + array ( + ), + ), + ), + ), + ), + 'org' => + array ( + 'pimienta' => + array ( + ), + 'poivron' => + array ( + ), + 'potager' => + array ( + ), + 'sweetpepper' => + array ( + ), + 'ae' => + array ( + ), + 'us' => + array ( + ), + 'certmgr' => + array ( + ), + 'cdn77' => + array ( + 'c' => + array ( + ), + 'rsc' => + array ( + ), + ), + 'cdn77-secure' => + array ( + 'origin' => + array ( + 'ssl' => + array ( + ), + ), + ), + 'duckdns' => + array ( + ), + 'tunk' => + array ( + ), + 'dyndns' => + array ( + 'go' => + array ( + ), + 'home' => + array ( + ), + ), + 'blogdns' => + array ( + ), + 'blogsite' => + array ( + ), + 'boldlygoingnowhere' => + array ( + ), + 'dnsalias' => + array ( + ), + 'dnsdojo' => + array ( + ), + 'doesntexist' => + array ( + ), + 'dontexist' => + array ( + ), + 'doomdns' => + array ( + ), + 'dvrdns' => + array ( + ), + 'dynalias' => + array ( + ), + 'endofinternet' => + array ( + ), + 'endoftheinternet' => + array ( + ), + 'from-me' => + array ( + ), + 'game-host' => + array ( + ), + 'gotdns' => + array ( + ), + 'hobby-site' => + array ( + ), + 'homedns' => + array ( + ), + 'homeftp' => + array ( + ), + 'homelinux' => + array ( + ), + 'homeunix' => + array ( + ), + 'is-a-bruinsfan' => + array ( + ), + 'is-a-candidate' => + array ( + ), + 'is-a-celticsfan' => + array ( + ), + 'is-a-chef' => + array ( + ), + 'is-a-geek' => + array ( + ), + 'is-a-knight' => + array ( + ), + 'is-a-linux-user' => + array ( + ), + 'is-a-patsfan' => + array ( + ), + 'is-a-soxfan' => + array ( + ), + 'is-found' => + array ( + ), + 'is-lost' => + array ( + ), + 'is-saved' => + array ( + ), + 'is-very-bad' => + array ( + ), + 'is-very-evil' => + array ( + ), + 'is-very-good' => + array ( + ), + 'is-very-nice' => + array ( + ), + 'is-very-sweet' => + array ( + ), + 'isa-geek' => + array ( + ), + 'kicks-ass' => + array ( + ), + 'misconfused' => + array ( + ), + 'podzone' => + array ( + ), + 'readmyblog' => + array ( + ), + 'selfip' => + array ( + ), + 'sellsyourhome' => + array ( + ), + 'servebbs' => + array ( + ), + 'serveftp' => + array ( + ), + 'servegame' => + array ( + ), + 'stuff-4-sale' => + array ( + ), + 'webhop' => + array ( + ), + 'eu' => + array ( + 'al' => + array ( + ), + 'asso' => + array ( + ), + 'at' => + array ( + ), + 'au' => + array ( + ), + 'be' => + array ( + ), + 'bg' => + array ( + ), + 'ca' => + array ( + ), + 'cd' => + array ( + ), + 'ch' => + array ( + ), + 'cn' => + array ( + ), + 'cy' => + array ( + ), + 'cz' => + array ( + ), + 'de' => + array ( + ), + 'dk' => + array ( + ), + 'edu' => + array ( + ), + 'ee' => + array ( + ), + 'es' => + array ( + ), + 'fi' => + array ( + ), + 'fr' => + array ( + ), + 'gr' => + array ( + ), + 'hr' => + array ( + ), + 'hu' => + array ( + ), + 'ie' => + array ( + ), + 'il' => + array ( + ), + 'in' => + array ( + ), + 'int' => + array ( + ), + 'is' => + array ( + ), + 'it' => + array ( + ), + 'jp' => + array ( + ), + 'kr' => + array ( + ), + 'lt' => + array ( + ), + 'lu' => + array ( + ), + 'lv' => + array ( + ), + 'mc' => + array ( + ), + 'me' => + array ( + ), + 'mk' => + array ( + ), + 'mt' => + array ( + ), + 'my' => + array ( + ), + 'net' => + array ( + ), + 'ng' => + array ( + ), + 'nl' => + array ( + ), + 'no' => + array ( + ), + 'nz' => + array ( + ), + 'paris' => + array ( + ), + 'pl' => + array ( + ), + 'pt' => + array ( + ), + 'q-a' => + array ( + ), + 'ro' => + array ( + ), + 'ru' => + array ( + ), + 'se' => + array ( + ), + 'si' => + array ( + ), + 'sk' => + array ( + ), + 'tr' => + array ( + ), + 'uk' => + array ( + ), + 'us' => + array ( + ), + ), + 'hepforge' => + array ( + ), + 'js' => + array ( + ), + 'bmoattachments' => + array ( + ), + 'cable-modem' => + array ( + ), + 'collegefan' => + array ( + ), + 'couchpotatofries' => + array ( + ), + 'mlbfan' => + array ( + ), + 'mysecuritycamera' => + array ( + ), + 'nflfan' => + array ( + ), + 'read-books' => + array ( + ), + 'ufcfan' => + array ( + ), + 'hopto' => + array ( + ), + 'myftp' => + array ( + ), + 'no-ip' => + array ( + ), + 'zapto' => + array ( + ), + 'dsmynas' => + array ( + ), + 'familyds' => + array ( + ), + 'tuxfamily' => + array ( + ), + 'hk' => + array ( + ), + 'wmflabs' => + array ( + ), + 'za' => + array ( + ), + ), + 'io' => + array ( + 'backplaneapp' => + array ( + ), + 'boxfuse' => + array ( + ), + 'browsersafetymark' => + array ( + ), + 'dedyn' => + array ( + ), + 'drud' => + array ( + ), + 'github' => + array ( + ), + 'gitlab' => + array ( + ), + 'hasura-app' => + array ( + ), + 'ngrok' => + array ( + ), + 'nid' => + array ( + ), + 'pantheonsite' => + array ( + ), + 'protonet' => + array ( + ), + 'hzc' => + array ( + ), + 'sandcats' => + array ( + ), + 'spacekit' => + array ( + ), + ), + 'la' => + array ( + 'bnr' => + array ( + ), + 'c' => + array ( + ), + ), + 'eu' => + array ( + 'mycd' => + array ( + ), + ), + 'de' => + array ( + 'com' => + array ( + ), + 'dnshome' => + array ( + ), + 'fuettertdasnetz' => + array ( + ), + 'isteingeek' => + array ( + ), + 'istmein' => + array ( + ), + 'lebtimnetz' => + array ( + ), + 'leitungsen' => + array ( + ), + 'traeumtgerade' => + array ( + ), + 'goip' => + array ( + ), + 'blogspot' => + array ( + ), + 'logoip' => + array ( + ), + ), + 'se' => + array ( + 'com' => + array ( + ), + 'blogspot' => + array ( + ), + ), + 'bz' => + array ( + 'za' => + array ( + ), + ), + 'nl' => + array ( + 'virtueeldomein' => + array ( + ), + 'co' => + array ( + ), + 'blogspot' => + array ( + ), + ), + 'ca' => + array ( + 'co' => + array ( + ), + 'blogspot' => + array ( + ), + 'no-ip' => + array ( + ), + ), + 'cz' => + array ( + 'co' => + array ( + ), + 'realm' => + array ( + ), + 'e4' => + array ( + ), + 'blogspot' => + array ( + ), + ), + 'no' => + array ( + 'co' => + array ( + ), + 'blogspot' => + array ( + ), + ), + 'sh' => + array ( + 'platform' => + array ( + '*' => + array ( + ), + ), + 'hashbang' => + array ( + ), + ), + 'is' => + array ( + 'cupcake' => + array ( + ), + 'blogspot' => + array ( + ), + ), + 'link' => + array ( + 'cyon' => + array ( + ), + 'mypep' => + array ( + ), + ), + 'site' => + array ( + 'cyon' => + array ( + ), + ), + 'me' => + array ( + 'daplie' => + array ( + ), + 'brasilia' => + array ( + ), + 'ddns' => + array ( + ), + 'dnsfor' => + array ( + ), + 'hopto' => + array ( + ), + 'loginto' => + array ( + ), + 'noip' => + array ( + ), + 'webhop' => + array ( + ), + 'diskstation' => + array ( + ), + 'dscloud' => + array ( + ), + 'i234' => + array ( + ), + 'myds' => + array ( + ), + 'synology' => + array ( + ), + ), + 'dk' => + array ( + 'biz' => + array ( + ), + 'co' => + array ( + ), + 'firm' => + array ( + ), + 'reg' => + array ( + ), + 'store' => + array ( + ), + 'blogspot' => + array ( + ), + ), + 'us' => + array ( + 'drud' => + array ( + ), + 'is-by' => + array ( + ), + 'land-4-sale' => + array ( + ), + 'stuff-4-sale' => + array ( + ), + 'golffan' => + array ( + ), + 'noip' => + array ( + ), + 'pointto' => + array ( + ), + 'de' => + array ( + 'lib' => + array ( + ), + ), + ), + 'fi' => + array ( + 'dy' => + array ( + ), + 'blogspot' => + array ( + ), + 'iki' => + array ( + ), + ), + 'biz' => + array ( + 'dyndns' => + array ( + ), + 'for-better' => + array ( + ), + 'for-more' => + array ( + ), + 'for-some' => + array ( + ), + 'for-the' => + array ( + ), + 'selfip' => + array ( + ), + 'webhop' => + array ( + ), + 'mmafan' => + array ( + ), + 'myftp' => + array ( + ), + 'no-ip' => + array ( + ), + 'dscloud' => + array ( + ), + ), + 'info' => + array ( + 'dyndns' => + array ( + ), + 'barrel-of-knowledge' => + array ( + ), + 'barrell-of-knowledge' => + array ( + ), + 'for-our' => + array ( + ), + 'groks-the' => + array ( + ), + 'groks-this' => + array ( + ), + 'here-for-more' => + array ( + ), + 'knowsitall' => + array ( + ), + 'selfip' => + array ( + ), + 'webhop' => + array ( + ), + 'nsupdate' => + array ( + ), + 'dvrcam' => + array ( + ), + 'ilovecollege' => + array ( + ), + 'no-ip' => + array ( + ), + ), + 'tv' => + array ( + 'dyndns' => + array ( + ), + 'better-than' => + array ( + ), + 'on-the-web' => + array ( + ), + 'worse-than' => + array ( + ), + ), + 'cx' => + array ( + 'ath' => + array ( + ), + ), + 'ws' => + array ( + 'dyndns' => + array ( + ), + 'mypets' => + array ( + ), + ), + 'name' => + array ( + 'her' => + array ( + 'forgot' => + array ( + ), + ), + 'his' => + array ( + 'forgot' => + array ( + ), + ), + ), + 'cc' => + array ( + 'ftpaccess' => + array ( + ), + 'game-server' => + array ( + ), + 'myphotos' => + array ( + ), + 'scrapping' => + array ( + ), + 'fantasyleague' => + array ( + ), + ), + 'nu' => + array ( + 'merseine' => + array ( + ), + 'mine' => + array ( + ), + 'shacknet' => + array ( + ), + ), + 'xyz' => + array ( + 'fhapp' => + array ( + ), + ), + 'fr' => + array ( + 'fbx-os' => + array ( + ), + 'fbxos' => + array ( + ), + 'freebox-os' => + array ( + ), + 'freeboxos' => + array ( + ), + 'blogspot' => + array ( + ), + 'chirurgiens-dentistes-en-france' => + array ( + ), + ), + 'uk' => + array ( + 'gov' => + array ( + 'service' => + array ( + ), + ), + 'co' => + array ( + 'blogspot' => + array ( + ), + 'no-ip' => + array ( + ), + ), + ), + 'im' => + array ( + 'ro' => + array ( + ), + ), + 'ro' => + array ( + 'shop' => + array ( + ), + 'blogspot' => + array ( + ), + ), + 'ae' => + array ( + 'blogspot' => + array ( + ), + ), + 'al' => + array ( + 'blogspot' => + array ( + ), + ), + 'am' => + array ( + 'blogspot' => + array ( + ), + ), + 'ba' => + array ( + 'blogspot' => + array ( + ), + ), + 'be' => + array ( + 'blogspot' => + array ( + ), + ), + 'bg' => + array ( + 'blogspot' => + array ( + ), + ), + 'bj' => + array ( + 'blogspot' => + array ( + ), + ), + 'cf' => + array ( + 'blogspot' => + array ( + ), + ), + 'ch' => + array ( + 'blogspot' => + array ( + ), + 'gotdns' => + array ( + ), + ), + 'cl' => + array ( + 'blogspot' => + array ( + ), + ), + 'at' => + array ( + 'co' => + array ( + 'blogspot' => + array ( + ), + ), + 'biz' => + array ( + ), + 'info' => + array ( + ), + 'priv' => + array ( + ), + ), + 'id' => + array ( + 'co' => + array ( + 'blogspot' => + array ( + ), + ), + ), + 'il' => + array ( + 'co' => + array ( + 'blogspot' => + array ( + ), + ), + ), + 'ke' => + array ( + 'co' => + array ( + 'blogspot' => + array ( + ), + ), + ), + 'nz' => + array ( + 'co' => + array ( + 'blogspot' => + array ( + ), + ), + ), + 'za' => + array ( + 'co' => + array ( + 'blogspot' => + array ( + ), + ), + ), + 'ar' => + array ( + 'com' => + array ( + 'blogspot' => + array ( + ), + ), + ), + 'au' => + array ( + 'com' => + array ( + 'blogspot' => + array ( + ), + ), + ), + 'br' => + array ( + 'com' => + array ( + 'blogspot' => + array ( + ), + ), + ), + 'by' => + array ( + 'com' => + array ( + 'blogspot' => + array ( + ), + ), + ), + 'co' => + array ( + 'com' => + array ( + 'blogspot' => + array ( + ), + ), + ), + 'cy' => + array ( + 'com' => + array ( + 'blogspot' => + array ( + ), + ), + ), + 'ee' => + array ( + 'com' => + array ( + 'blogspot' => + array ( + ), + ), + ), + 'eg' => + array ( + 'com' => + array ( + 'blogspot' => + array ( + ), + ), + ), + 'es' => + array ( + 'com' => + array ( + 'blogspot' => + array ( + ), + ), + ), + 'mt' => + array ( + 'com' => + array ( + 'blogspot' => + array ( + ), + ), + ), + 'ng' => + array ( + 'com' => + array ( + 'blogspot' => + array ( + ), + ), + ), + 'tr' => + array ( + 'com' => + array ( + 'blogspot' => + array ( + ), + ), + ), + 'uy' => + array ( + 'com' => + array ( + 'blogspot' => + array ( + ), + ), + ), + 'cv' => + array ( + 'blogspot' => + array ( + ), + ), + 'gr' => + array ( + 'blogspot' => + array ( + ), + ), + 'hk' => + array ( + 'blogspot' => + array ( + ), + 'ltd' => + array ( + ), + 'inc' => + array ( + ), + ), + 'hr' => + array ( + 'blogspot' => + array ( + ), + ), + 'hu' => + array ( + 'blogspot' => + array ( + ), + ), + 'ie' => + array ( + 'blogspot' => + array ( + ), + ), + 'in' => + array ( + 'blogspot' => + array ( + ), + ), + 'it' => + array ( + 'blogspot' => + array ( + ), + ), + 'jp' => + array ( + 'blogspot' => + array ( + ), + ), + 'kr' => + array ( + 'blogspot' => + array ( + ), + ), + 'li' => + array ( + 'blogspot' => + array ( + ), + ), + 'lt' => + array ( + 'blogspot' => + array ( + ), + ), + 'lu' => + array ( + 'blogspot' => + array ( + ), + ), + 'md' => + array ( + 'blogspot' => + array ( + ), + ), + 'mk' => + array ( + 'blogspot' => + array ( + ), + ), + 'mr' => + array ( + 'blogspot' => + array ( + ), + ), + 'mx' => + array ( + 'blogspot' => + array ( + ), + ), + 'my' => + array ( + 'blogspot' => + array ( + ), + ), + 'pe' => + array ( + 'blogspot' => + array ( + ), + ), + 'pt' => + array ( + 'blogspot' => + array ( + ), + ), + 'qa' => + array ( + 'blogspot' => + array ( + ), + ), + 're' => + array ( + 'blogspot' => + array ( + ), + ), + 'rs' => + array ( + 'blogspot' => + array ( + ), + ), + 'ru' => + array ( + 'blogspot' => + array ( + ), + ), + 'sg' => + array ( + 'blogspot' => + array ( + ), + ), + 'si' => + array ( + 'blogspot' => + array ( + ), + ), + 'sk' => + array ( + 'blogspot' => + array ( + ), + ), + 'sn' => + array ( + 'blogspot' => + array ( + ), + ), + 'td' => + array ( + 'blogspot' => + array ( + ), + ), + 'tw' => + array ( + 'blogspot' => + array ( + ), + ), + 'ug' => + array ( + 'blogspot' => + array ( + ), + ), + 'vn' => + array ( + 'blogspot' => + array ( + ), + ), + 'zone' => + array ( + 'triton' => + array ( + '*' => + array ( + ), + ), + ), + 'krd' => + array ( + 'co' => + array ( + ), + 'edu' => + array ( + ), + ), + 'cloud' => + array ( + 'magentosite' => + array ( + '*' => + array ( + ), + ), + ), + 'ovh' => + array ( + 'nerdpol' => + array ( + ), + ), + 'mn' => + array ( + 'nyc' => + array ( + ), + ), + 'lc' => + array ( + 'oy' => + array ( + ), + ), + 'ua' => + array ( + 'biz' => + array ( + ), + 'co' => + array ( + ), + 'pp' => + array ( + ), + ), + 'land' => + array ( + 'static' => + array ( + 'dev' => + array ( + ), + 'sites' => + array ( + ), + ), + ), + 'space' => + array ( + 'stackspace' => + array ( + ), + ), + 'mobi' => + array ( + 'dscloud' => + array ( + ), + ), + 'management' => + array ( + 'router' => + array ( + ), + ), +); \ No newline at end of file diff --git a/data/public-suffix-list.php b/data/public-suffix-list.php index 49e02d86..18ffe391 100644 --- a/data/public-suffix-list.php +++ b/data/public-suffix-list.php @@ -662,10 +662,7 @@ ), 'ba' => array ( - 'org' => - array ( - ), - 'net' => + 'com' => array ( ), 'edu' => @@ -677,19 +674,10 @@ 'mil' => array ( ), - 'unsa' => - array ( - ), - 'unbi' => - array ( - ), - 'co' => - array ( - ), - 'com' => + 'net' => array ( ), - 'rs' => + 'org' => array ( ), 'blogspot' => @@ -923,6 +911,15 @@ 'webhop' => array ( ), + 'mmafan' => + array ( + ), + 'myftp' => + array ( + ), + 'no-ip' => + array ( + ), 'dscloud' => array ( ), @@ -1355,6 +1352,9 @@ 'blogspot' => array ( ), + 'no-ip' => + array ( + ), ), 'cat' => array ( @@ -1373,6 +1373,9 @@ 'scrapping' => array ( ), + 'fantasyleague' => + array ( + ), ), 'cd' => array ( @@ -1394,6 +1397,9 @@ 'blogspot' => array ( ), + 'gotdns' => + array ( + ), ), 'ci' => array ( @@ -1495,6 +1501,12 @@ array ( 'amazonaws' => array ( + 'compute' => + array ( + 'cn-north-1' => + array ( + ), + ), 'cn-north-1' => array ( 's3' => @@ -1629,15 +1641,6 @@ 'tw' => array ( ), - 'amazonaws' => - array ( - 'compute' => - array ( - 'cn-north-1' => - array ( - ), - ), - ), ), 'co' => array ( @@ -1693,16 +1696,19 @@ 'ap-northeast-1' => array ( ), + 'ap-northeast-2' => + array ( + ), 'ap-southeast-1' => array ( ), 'ap-southeast-2' => array ( ), - 'eu-west-1' => + 'eu-central-1' => array ( ), - 'eu-central-1' => + 'eu-west-1' => array ( ), 'sa-east-1' => @@ -1739,25 +1745,28 @@ 's3-ap-northeast-1' => array ( ), + 's3-ap-northeast-2' => + array ( + ), 's3-ap-southeast-1' => array ( ), 's3-ap-southeast-2' => array ( ), - 's3-external-1' => + 's3-eu-central-1' => array ( ), - 's3-external-2' => + 's3-eu-west-1' => array ( ), - 's3-fips-us-gov-west-1' => + 's3-external-1' => array ( ), - 's3-eu-central-1' => + 's3-external-2' => array ( ), - 's3-eu-west-1' => + 's3-fips-us-gov-west-1' => array ( ), 's3-sa-east-1' => @@ -1772,6 +1781,12 @@ 's3-us-west-2' => array ( ), + 'ap-northeast-2' => + array ( + 's3' => + array ( + ), + ), 'eu-central-1' => array ( 's3' => @@ -1782,6 +1797,12 @@ 'elasticbeanstalk' => array ( ), + 'on-aptible' => + array ( + ), + 'myasustor' => + array ( + ), 'betainabox' => array ( ), @@ -1851,6 +1872,9 @@ 'co' => array ( ), + 'xenapponazure' => + array ( + ), 'cloudcontrolled' => array ( ), @@ -2313,18 +2337,75 @@ 'writesthisblog' => array ( ), + 'evennode' => + array ( + 'eu-1' => + array ( + ), + 'eu-2' => + array ( + ), + 'us-1' => + array ( + ), + 'us-2' => + array ( + ), + ), + 'fbsbx' => + array ( + 'apps' => + array ( + ), + ), 'firebaseapp' => array ( ), 'flynnhub' => array ( ), + 'freebox-os' => + array ( + ), + 'freeboxos' => + array ( + ), 'githubusercontent' => array ( ), + 'githubcloud' => + array ( + 'api' => + array ( + '*' => + array ( + ), + ), + 'ext' => + array ( + '*' => + array ( + ), + ), + 'gist' => + array ( + ), + ), + 'githubcloudusercontent' => + array ( + '*' => + array ( + ), + ), 'ro' => array ( ), + '0emm' => + array ( + '*' => + array ( + ), + ), 'appspot' => array ( ), @@ -2355,18 +2436,150 @@ 'herokussl' => array ( ), + 'joyent' => + array ( + 'cns' => + array ( + '*' => + array ( + ), + ), + ), + 'meteorapp' => + array ( + 'eu' => + array ( + ), + ), '4u' => array ( ), 'nfshost' => array ( ), + 'blogsyte' => + array ( + ), + 'ciscofreak' => + array ( + ), + 'damnserver' => + array ( + ), + 'ditchyourip' => + array ( + ), + 'dnsiskinky' => + array ( + ), + 'dynns' => + array ( + ), + 'geekgalaxy' => + array ( + ), + 'health-carereform' => + array ( + ), + 'homesecuritymac' => + array ( + ), + 'homesecuritypc' => + array ( + ), + 'myactivedirectory' => + array ( + ), + 'mysecuritycamera' => + array ( + ), + 'net-freaks' => + array ( + ), + 'onthewifi' => + array ( + ), + 'point2this' => + array ( + ), + 'quicksytes' => + array ( + ), + 'securitytactics' => + array ( + ), + 'serveexchange' => + array ( + ), + 'servehumour' => + array ( + ), + 'servep2p' => + array ( + ), + 'servesarcasm' => + array ( + ), + 'stufftoread' => + array ( + ), + 'unusualperson' => + array ( + ), + 'workisboring' => + array ( + ), + '3utilities' => + array ( + ), + 'ddnsking' => + array ( + ), + 'myvnc' => + array ( + ), + 'servebeer' => + array ( + ), + 'servecounterstrike' => + array ( + ), + 'serveftp' => + array ( + ), + 'servegame' => + array ( + ), + 'servehalflife' => + array ( + ), + 'servehttp' => + array ( + ), + 'serveirc' => + array ( + ), + 'servemp3' => + array ( + ), + 'servepics' => + array ( + ), + 'servequake' => + array ( + ), 'operaunite' => array ( ), 'outsystemscloud' => array ( ), + 'ownprovider' => + array ( + ), + 'pgfog' => + array ( + ), 'pagefrontapp' => array ( ), @@ -2382,12 +2595,27 @@ 'qa2' => array ( ), + 'dev-myqnapcloud' => + array ( + ), + 'alpha-myqnapcloud' => + array ( + ), + 'myqnapcloud' => + array ( + ), 'rackmaze' => array ( ), 'rhcloud' => array ( ), + 'logoip' => + array ( + ), + 'myshopblocks' => + array ( + ), 'sinaapp' => array ( ), @@ -2397,12 +2625,27 @@ '1kapp' => array ( ), + 'bounty-full' => + array ( + 'alpha' => + array ( + ), + 'beta' => + array ( + ), + ), 'dsmynas' => array ( ), 'familyds' => array ( ), + 'bloxcms' => + array ( + ), + 'townnews-staging' => + array ( + ), 'hk' => array ( ), @@ -2538,6 +2781,12 @@ 'co' => array ( ), + 'realm' => + array ( + ), + 'e4' => + array ( + ), 'blogspot' => array ( ), @@ -2547,6 +2796,9 @@ 'com' => array ( ), + 'dnshome' => + array ( + ), 'fuettertdasnetz' => array ( ), @@ -2565,15 +2817,36 @@ 'traeumtgerade' => array ( ), + 'goip' => + array ( + ), 'blogspot' => array ( ), + 'logoip' => + array ( + ), ), 'dj' => array ( ), 'dk' => array ( + 'biz' => + array ( + ), + 'co' => + array ( + ), + 'firm' => + array ( + ), + 'reg' => + array ( + ), + 'store' => + array ( + ), 'blogspot' => array ( ), @@ -2823,12 +3096,18 @@ ), 'eu' => array ( + 'mycd' => + array ( + ), ), 'fi' => array ( 'aland' => array ( ), + 'dy' => + array ( + ), 'blogspot' => array ( ), @@ -2925,9 +3204,24 @@ 'veterinaire' => array ( ), + 'fbx-os' => + array ( + ), + 'fbxos' => + array ( + ), + 'freebox-os' => + array ( + ), + 'freeboxos' => + array ( + ), 'blogspot' => array ( ), + 'chirurgiens-dentistes-en-france' => + array ( + ), ), 'ga' => array ( @@ -3540,6 +3834,9 @@ 'tv' => array ( ), + 'ro' => + array ( + ), ), 'in' => array ( @@ -3615,6 +3912,18 @@ 'webhop' => array ( ), + 'nsupdate' => + array ( + ), + 'dvrcam' => + array ( + ), + 'ilovecollege' => + array ( + ), + 'no-ip' => + array ( + ), ), 'int' => array ( @@ -3627,21 +3936,51 @@ 'com' => array ( ), + 'backplaneapp' => + array ( + ), + 'boxfuse' => + array ( + ), + 'browsersafetymark' => + array ( + ), + 'dedyn' => + array ( + ), + 'drud' => + array ( + ), 'github' => array ( ), + 'gitlab' => + array ( + ), + 'hasura-app' => + array ( + ), 'ngrok' => array ( ), 'nid' => array ( ), - 'pantheon' => + 'pantheonsite' => + array ( + ), + 'protonet' => + array ( + ), + 'hzc' => array ( ), 'sandcats' => array ( ), + 'spacekit' => + array ( + ), ), 'iq' => array ( @@ -7391,9 +7730,6 @@ 'kikuchi' => array ( ), - 'kosa' => - array ( - ), 'kumamoto' => array ( ), @@ -7655,9 +7991,6 @@ 'kawasaki' => array ( ), - 'kesennuma' => - array ( - ), 'marumori' => array ( ), @@ -10612,6 +10945,9 @@ 'org' => array ( ), + 'bnr' => + array ( + ), 'c' => array ( ), @@ -10654,6 +10990,9 @@ 'gov' => array ( ), + 'oy' => + array ( + ), ), 'li' => array ( @@ -10873,6 +11212,30 @@ 'priv' => array ( ), + 'daplie' => + array ( + ), + 'brasilia' => + array ( + ), + 'ddns' => + array ( + ), + 'dnsfor' => + array ( + ), + 'hopto' => + array ( + ), + 'loginto' => + array ( + ), + 'noip' => + array ( + ), + 'webhop' => + array ( + ), 'diskstation' => array ( ), @@ -12874,12 +13237,29 @@ ), 'mz' => array ( - '*' => + 'ac' => array ( ), - 'teledata' => + 'adv' => + array ( + ), + 'co' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => + array ( + ), + 'net' => + array ( + ), + 'org' => array ( - '!' => '', ), ), 'na' => @@ -12965,6 +13345,9 @@ 'cloudfront' => array ( ), + 'myfritz' => + array ( + ), 'gb' => array ( ), @@ -12992,6 +13375,12 @@ array ( ), ), + 'cryptonomic' => + array ( + '*' => + array ( + ), + ), 'at-band-camp' => array ( ), @@ -13097,6 +13486,9 @@ 'webhop' => array ( ), + 'dynv6' => + array ( + ), 'fastly' => array ( 'ssl' => @@ -13133,6 +13525,54 @@ 'cloudapp' => array ( ), + 'eating-organic' => + array ( + ), + 'mydissent' => + array ( + ), + 'myeffect' => + array ( + ), + 'mymediapc' => + array ( + ), + 'mypsx' => + array ( + ), + 'mysecuritycamera' => + array ( + ), + 'nhlfan' => + array ( + ), + 'no-ip' => + array ( + ), + 'pgafan' => + array ( + ), + 'privatizehealthinsurance' => + array ( + ), + 'bounceme' => + array ( + ), + 'ddns' => + array ( + ), + 'redirectme' => + array ( + ), + 'serveblog' => + array ( + ), + 'serveminecraft' => + array ( + ), + 'sytes' => + array ( + ), 'rackmaze' => array ( ), @@ -13265,6 +13705,9 @@ 'bv' => array ( ), + 'virtueeldomein' => + array ( + ), 'co' => array ( ), @@ -15701,12 +16144,27 @@ ), 'org' => array ( + 'pimienta' => + array ( + ), + 'poivron' => + array ( + ), + 'potager' => + array ( + ), + 'sweetpepper' => + array ( + ), 'ae' => array ( ), 'us' => array ( ), + 'certmgr' => + array ( + ), 'cdn77' => array ( 'c' => @@ -15728,6 +16186,9 @@ 'duckdns' => array ( ), + 'tunk' => + array ( + ), 'dyndns' => array ( 'go' => @@ -16052,18 +16513,66 @@ array ( ), ), + 'hepforge' => + array ( + ), + 'js' => + array ( + ), 'bmoattachments' => array ( ), + 'cable-modem' => + array ( + ), + 'collegefan' => + array ( + ), + 'couchpotatofries' => + array ( + ), + 'mlbfan' => + array ( + ), + 'mysecuritycamera' => + array ( + ), + 'nflfan' => + array ( + ), + 'read-books' => + array ( + ), + 'ufcfan' => + array ( + ), + 'hopto' => + array ( + ), + 'myftp' => + array ( + ), + 'no-ip' => + array ( + ), + 'zapto' => + array ( + ), 'dsmynas' => array ( ), 'familyds' => array ( ), + 'tuxfamily' => + array ( + ), 'hk' => array ( ), + 'wmflabs' => + array ( + ), 'za' => array ( ), @@ -16823,6 +17332,9 @@ 'zgorzelec' => array ( ), + 'beep' => + array ( + ), 'co' => array ( ), @@ -16928,15 +17440,27 @@ ), 'pro' => array ( + 'aaa' => + array ( + ), 'aca' => array ( ), + 'acct' => + array ( + ), + 'avocat' => + array ( + ), 'bar' => array ( ), 'cpa' => array ( ), + 'eng' => + array ( + ), 'jur' => array ( ), @@ -16946,7 +17470,7 @@ 'med' => array ( ), - 'eng' => + 'recht' => array ( ), ), @@ -17129,6 +17653,9 @@ 'www' => array ( ), + 'shop' => + array ( + ), 'blogspot' => array ( ), @@ -18841,6 +19368,9 @@ 'blogspot' => array ( ), + 'no-ip' => + array ( + ), ), 'gov' => array ( @@ -19547,6 +20077,9 @@ array ( ), ), + 'drud' => + array ( + ), 'is-by' => array ( ), @@ -19556,6 +20089,15 @@ 'stuff-4-sale' => array ( ), + 'golffan' => + array ( + ), + 'noip' => + array ( + ), + 'pointto' => + array ( + ), ), 'uy' => array ( @@ -19806,6 +20348,9 @@ 'xn--wgbh1c' => array ( ), + 'xn--e1a4c' => + array ( + ), 'xn--node' => array ( ), @@ -20033,7 +20578,37 @@ ), 'zm' => array ( - '*' => + 'ac' => + array ( + ), + 'biz' => + array ( + ), + 'co' => + array ( + ), + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'info' => + array ( + ), + 'mil' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'sch' => array ( ), ), @@ -20118,9 +20693,6 @@ 'africa' => array ( ), - 'africamagic' => - array ( - ), 'agakhan' => array ( ), @@ -20226,6 +20798,9 @@ 'army' => array ( ), + 'art' => + array ( + ), 'arte' => array ( ), @@ -20520,6 +21095,9 @@ 'calvinklein' => array ( ), + 'cam' => + array ( + ), 'camera' => array ( ), @@ -20693,6 +21271,12 @@ ), 'cloud' => array ( + 'magentosite' => + array ( + '*' => + array ( + ), + ), ), 'club' => array ( @@ -20820,6 +21404,9 @@ 'dance' => array ( ), + 'data' => + array ( + ), 'date' => array ( ), @@ -20916,6 +21503,9 @@ 'docs' => array ( ), + 'doctor' => + array ( + ), 'dodge' => array ( ), @@ -20928,9 +21518,6 @@ 'domains' => array ( ), - 'doosan' => - array ( - ), 'dot' => array ( ), @@ -20940,9 +21527,6 @@ 'drive' => array ( ), - 'dstv' => - array ( - ), 'dtv' => array ( ), @@ -20967,6 +21551,9 @@ 'dvag' => array ( ), + 'dvr' => + array ( + ), 'dwg' => array ( ), @@ -20976,6 +21563,9 @@ 'eat' => array ( ), + 'eco' => + array ( + ), 'edeka' => array ( ), @@ -21023,6 +21613,12 @@ ), 'estate' => array ( + 'compute' => + array ( + '*' => + array ( + ), + ), ), 'esurance' => array ( @@ -21159,15 +21755,15 @@ 'flowers' => array ( ), - 'flsmidth' => - array ( - ), 'fly' => array ( ), 'foo' => array ( ), + 'food' => + array ( + ), 'foodnetwork' => array ( ), @@ -21219,6 +21815,9 @@ 'fujixerox' => array ( ), + 'fun' => + array ( + ), 'fund' => array ( ), @@ -21306,6 +21905,9 @@ 'gmail' => array ( ), + 'gmbh' => + array ( + ), 'gmo' => array ( ), @@ -21345,9 +21947,6 @@ 'got' => array ( ), - 'gotv' => - array ( - ), 'grainger' => array ( ), @@ -21363,6 +21962,9 @@ 'gripe' => array ( ), + 'grocery' => + array ( + ), 'group' => array ( ), @@ -21483,6 +22085,9 @@ 'hoteles' => array ( ), + 'hotels' => + array ( + ), 'hotmail' => array ( ), @@ -21716,6 +22321,12 @@ ), 'krd' => array ( + 'co' => + array ( + ), + 'edu' => + array ( + ), ), 'kred' => array ( @@ -21723,9 +22334,6 @@ 'kuokgroup' => array ( ), - 'kyknet' => - array ( - ), 'kyoto' => array ( ), @@ -21752,6 +22360,15 @@ ), 'land' => array ( + 'static' => + array ( + 'dev' => + array ( + ), + 'sites' => + array ( + ), + ), ), 'landrover' => array ( @@ -21839,6 +22456,12 @@ ), 'link' => array ( + 'cyon' => + array ( + ), + 'mypep' => + array ( + ), ), 'lipsy' => array ( @@ -21926,10 +22549,16 @@ ), 'management' => array ( + 'router' => + array ( + ), ), 'mango' => array ( ), + 'map' => + array ( + ), 'market' => array ( ), @@ -21990,6 +22619,9 @@ 'meo' => array ( ), + 'merckmsd' => + array ( + ), 'metlife' => array ( ), @@ -22020,7 +22652,7 @@ 'mma' => array ( ), - 'mnet' => + 'mobile' => array ( ), 'mobily' => @@ -22089,18 +22721,12 @@ 'mtr' => array ( ), - 'multichoice' => - array ( - ), 'mutual' => array ( ), 'mutuelle' => array ( ), - 'mzansimagic' => - array ( - ), 'nab' => array ( ), @@ -22110,9 +22736,6 @@ 'nagoya' => array ( ), - 'naspers' => - array ( - ), 'nationwide' => array ( ), @@ -22136,6 +22759,12 @@ ), 'network' => array ( + 'alces' => + array ( + '*' => + array ( + ), + ), ), 'neustar' => array ( @@ -22292,6 +22921,9 @@ ), 'ovh' => array ( + 'nerdpol' => + array ( + ), ), 'page' => array ( @@ -22326,9 +22958,6 @@ 'pay' => array ( ), - 'payu' => - array ( - ), 'pccw' => array ( ), @@ -22341,9 +22970,15 @@ 'pharmacy' => array ( ), + 'phd' => + array ( + ), 'philips' => array ( ), + 'phone' => + array ( + ), 'photo' => array ( ), @@ -22479,6 +23114,9 @@ 'racing' => array ( ), + 'radio' => + array ( + ), 'raid' => array ( ), @@ -22701,6 +23339,9 @@ 'scot' => array ( ), + 'search' => + array ( + ), 'seat' => array ( ), @@ -22761,6 +23402,12 @@ 'shoes' => array ( ), + 'shop' => + array ( + ), + 'shopping' => + array ( + ), 'shouji' => array ( ), @@ -22784,6 +23431,9 @@ ), 'site' => array ( + 'cyon' => + array ( + ), ), 'ski' => array ( @@ -22841,6 +23491,9 @@ ), 'space' => array ( + 'stackspace' => + array ( + ), ), 'spiegel' => array ( @@ -22893,6 +23546,9 @@ 'store' => array ( ), + 'stream' => + array ( + ), 'studio' => array ( ), @@ -22905,9 +23561,6 @@ 'sucks' => array ( ), - 'supersport' => - array ( - ), 'supplies' => array ( ), @@ -23645,6 +24298,9 @@ ), 'xyz' => array ( + 'fhapp' => + array ( + ), ), 'yachts' => array ( @@ -23693,6 +24349,12 @@ ), 'zone' => array ( + 'triton' => + array ( + '*' => + array ( + ), + ), ), 'zuerich' => array ( diff --git a/data/public-suffix-list.txt b/data/public-suffix-list.txt index ee0269c3..db4ecd6d 100644 --- a/data/public-suffix-list.txt +++ b/data/public-suffix-list.txt @@ -1,10 +1,15 @@ // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +// Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat, +// rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported. + +// Instructions on pulling and using this list can be found at https://publicsuffix.org/list/. // ===BEGIN ICANN DOMAINS=== -// ac : http://en.wikipedia.org/wiki/.ac +// ac : https://en.wikipedia.org/wiki/.ac ac com.ac edu.ac @@ -13,11 +18,11 @@ net.ac mil.ac org.ac -// ad : http://en.wikipedia.org/wiki/.ad +// ad : https://en.wikipedia.org/wiki/.ad ad nom.ad -// ae : http://en.wikipedia.org/wiki/.ae +// ae : https://en.wikipedia.org/wiki/.ae // see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php ae co.ae @@ -28,7 +33,7 @@ ac.ae gov.ae mil.ae -// aero : see http://www.information.aero/index.php?id=66 +// aero : see https://www.information.aero/index.php?id=66 aero accident-investigation.aero accident-prevention.aero @@ -150,10 +155,10 @@ mil.al net.al org.al -// am : http://en.wikipedia.org/wiki/.am +// am : https://en.wikipedia.org/wiki/.am am -// ao : http://en.wikipedia.org/wiki/.ao +// ao : https://en.wikipedia.org/wiki/.ao // http://www.dns.ao/REGISTR.DOC ao ed.ao @@ -163,7 +168,7 @@ co.ao pb.ao it.ao -// aq : http://en.wikipedia.org/wiki/.aq +// aq : https://en.wikipedia.org/wiki/.aq aq // ar : https://nic.ar/normativa-vigente.xhtml @@ -178,7 +183,7 @@ net.ar org.ar tur.ar -// arpa : http://en.wikipedia.org/wiki/.arpa +// arpa : https://en.wikipedia.org/wiki/.arpa // Confirmed by registry 2008-06-18 arpa e164.arpa @@ -188,14 +193,14 @@ iris.arpa uri.arpa urn.arpa -// as : http://en.wikipedia.org/wiki/.as +// as : https://en.wikipedia.org/wiki/.as as gov.as -// asia : http://en.wikipedia.org/wiki/.asia +// asia : https://en.wikipedia.org/wiki/.asia asia -// at : http://en.wikipedia.org/wiki/.at +// at : https://en.wikipedia.org/wiki/.at // Confirmed by registry 2008-06-17 at ac.at @@ -203,7 +208,7 @@ co.at gv.at or.at -// au : http://en.wikipedia.org/wiki/.au +// au : https://en.wikipedia.org/wiki/.au // http://www.auda.org.au/ au // 2LDs @@ -245,14 +250,14 @@ tas.gov.au vic.gov.au wa.gov.au -// aw : http://en.wikipedia.org/wiki/.aw +// aw : https://en.wikipedia.org/wiki/.aw aw com.aw -// ax : http://en.wikipedia.org/wiki/.ax +// ax : https://en.wikipedia.org/wiki/.ax ax -// az : http://en.wikipedia.org/wiki/.az +// az : https://en.wikipedia.org/wiki/.az az com.az net.az @@ -267,20 +272,16 @@ name.az pro.az biz.az -// ba : http://en.wikipedia.org/wiki/.ba +// ba : http://nic.ba/users_data/files/pravilnik_o_registraciji.pdf ba -org.ba -net.ba +com.ba edu.ba gov.ba mil.ba -unsa.ba -unbi.ba -co.ba -com.ba -rs.ba +net.ba +org.ba -// bb : http://en.wikipedia.org/wiki/.bb +// bb : https://en.wikipedia.org/wiki/.bb bb biz.bb co.bb @@ -293,19 +294,19 @@ org.bb store.bb tv.bb -// bd : http://en.wikipedia.org/wiki/.bd +// bd : https://en.wikipedia.org/wiki/.bd *.bd -// be : http://en.wikipedia.org/wiki/.be +// be : https://en.wikipedia.org/wiki/.be // Confirmed by registry 2008-06-08 be ac.be -// bf : http://en.wikipedia.org/wiki/.bf +// bf : https://en.wikipedia.org/wiki/.bf bf gov.bf -// bg : http://en.wikipedia.org/wiki/.bg +// bg : https://en.wikipedia.org/wiki/.bg // https://www.register.bg/user/static/rules/en/index.html bg a.bg @@ -345,7 +346,7 @@ z.bg 8.bg 9.bg -// bh : http://en.wikipedia.org/wiki/.bh +// bh : https://en.wikipedia.org/wiki/.bh bh com.bh edu.bh @@ -353,7 +354,7 @@ net.bh org.bh gov.bh -// bi : http://en.wikipedia.org/wiki/.bi +// bi : https://en.wikipedia.org/wiki/.bi // http://whois.nic.bi/ bi co.bi @@ -362,10 +363,10 @@ edu.bi or.bi org.bi -// biz : http://en.wikipedia.org/wiki/.biz +// biz : https://en.wikipedia.org/wiki/.biz biz -// bj : http://en.wikipedia.org/wiki/.bj +// bj : https://en.wikipedia.org/wiki/.bj bj asso.bj barreau.bj @@ -379,7 +380,7 @@ gov.bm net.bm org.bm -// bn : http://en.wikipedia.org/wiki/.bn +// bn : https://en.wikipedia.org/wiki/.bn *.bn // bo : http://www.nic.bo/ @@ -476,7 +477,7 @@ org.bs edu.bs gov.bs -// bt : http://en.wikipedia.org/wiki/.bt +// bt : https://en.wikipedia.org/wiki/.bt bt com.bt edu.bt @@ -488,14 +489,14 @@ org.bt // Submitted by registry bv -// bw : http://en.wikipedia.org/wiki/.bw +// bw : https://en.wikipedia.org/wiki/.bw // http://www.gobin.info/domainname/bw.doc // list of other 2nd level tlds ? bw co.bw org.bw -// by : http://en.wikipedia.org/wiki/.by +// by : https://en.wikipedia.org/wiki/.by // http://tld.by/rules_2006_en.html // list of other 2nd level tlds ? by @@ -509,7 +510,7 @@ com.by // http://hoster.by/ of.by -// bz : http://en.wikipedia.org/wiki/.bz +// bz : https://en.wikipedia.org/wiki/.bz // http://www.belizenic.bz/ bz com.bz @@ -518,7 +519,7 @@ org.bz edu.bz gov.bz -// ca : http://en.wikipedia.org/wiki/.ca +// ca : https://en.wikipedia.org/wiki/.ca ca // ca geographical names ab.ca @@ -535,31 +536,31 @@ pe.ca qc.ca sk.ca yk.ca -// gc.ca: http://en.wikipedia.org/wiki/.gc.ca +// gc.ca: https://en.wikipedia.org/wiki/.gc.ca // see also: http://registry.gc.ca/en/SubdomainFAQ gc.ca -// cat : http://en.wikipedia.org/wiki/.cat +// cat : https://en.wikipedia.org/wiki/.cat cat -// cc : http://en.wikipedia.org/wiki/.cc +// cc : https://en.wikipedia.org/wiki/.cc cc -// cd : http://en.wikipedia.org/wiki/.cd +// cd : https://en.wikipedia.org/wiki/.cd // see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 cd gov.cd -// cf : http://en.wikipedia.org/wiki/.cf +// cf : https://en.wikipedia.org/wiki/.cf cf -// cg : http://en.wikipedia.org/wiki/.cg +// cg : https://en.wikipedia.org/wiki/.cg cg -// ch : http://en.wikipedia.org/wiki/.ch +// ch : https://en.wikipedia.org/wiki/.ch ch -// ci : http://en.wikipedia.org/wiki/.ci +// ci : https://en.wikipedia.org/wiki/.ci // http://www.nic.ci/index.php?page=charte ci org.ci @@ -578,25 +579,25 @@ presse.ci md.ci gouv.ci -// ck : http://en.wikipedia.org/wiki/.ck +// ck : https://en.wikipedia.org/wiki/.ck *.ck !www.ck -// cl : http://en.wikipedia.org/wiki/.cl +// cl : https://en.wikipedia.org/wiki/.cl cl gov.cl gob.cl co.cl mil.cl -// cm : http://en.wikipedia.org/wiki/.cm plus bug 981927 +// cm : https://en.wikipedia.org/wiki/.cm plus bug 981927 cm co.cm com.cm gov.cm net.cm -// cn : http://en.wikipedia.org/wiki/.cn +// cn : https://en.wikipedia.org/wiki/.cn // Submitted by registry cn ac.cn @@ -645,7 +646,7 @@ hk.cn mo.cn tw.cn -// co : http://en.wikipedia.org/wiki/.co +// co : https://en.wikipedia.org/wiki/.co // Submitted by registry co arts.co @@ -662,10 +663,10 @@ org.co rec.co web.co -// com : http://en.wikipedia.org/wiki/.com +// com : https://en.wikipedia.org/wiki/.com com -// coop : http://en.wikipedia.org/wiki/.coop +// coop : https://en.wikipedia.org/wiki/.coop coop // cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do @@ -678,7 +679,7 @@ go.cr or.cr sa.cr -// cu : http://en.wikipedia.org/wiki/.cu +// cu : https://en.wikipedia.org/wiki/.cu cu com.cu edu.cu @@ -687,7 +688,7 @@ net.cu gov.cu inf.cu -// cv : http://en.wikipedia.org/wiki/.cv +// cv : https://en.wikipedia.org/wiki/.cv cv // cw : http://www.una.cw/cw_registry/ @@ -698,12 +699,12 @@ edu.cw net.cw org.cw -// cx : http://en.wikipedia.org/wiki/.cx +// cx : https://en.wikipedia.org/wiki/.cx // list of other 2nd level tlds ? cx gov.cx -// cy : http://en.wikipedia.org/wiki/.cy +// cy : https://en.wikipedia.org/wiki/.cy ac.cy biz.cy com.cy @@ -718,22 +719,22 @@ press.cy pro.cy tm.cy -// cz : http://en.wikipedia.org/wiki/.cz +// cz : https://en.wikipedia.org/wiki/.cz cz -// de : http://en.wikipedia.org/wiki/.de +// de : https://en.wikipedia.org/wiki/.de // Confirmed by registry (with technical // reservations) 2008-07-01 de -// dj : http://en.wikipedia.org/wiki/.dj +// dj : https://en.wikipedia.org/wiki/.dj dj -// dk : http://en.wikipedia.org/wiki/.dk +// dk : https://en.wikipedia.org/wiki/.dk // Confirmed by registry 2008-06-17 dk -// dm : http://en.wikipedia.org/wiki/.dm +// dm : https://en.wikipedia.org/wiki/.dm dm com.dm net.dm @@ -741,7 +742,7 @@ org.dm edu.dm gov.dm -// do : http://en.wikipedia.org/wiki/.do +// do : https://en.wikipedia.org/wiki/.do do art.do com.do @@ -754,7 +755,7 @@ org.do sld.do web.do -// dz : http://en.wikipedia.org/wiki/.dz +// dz : https://en.wikipedia.org/wiki/.dz dz com.dz org.dz @@ -781,7 +782,7 @@ gov.ec gob.ec mil.ec -// edu : http://en.wikipedia.org/wiki/.edu +// edu : https://en.wikipedia.org/wiki/.edu edu // ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B @@ -797,7 +798,7 @@ aip.ee org.ee fie.ee -// eg : http://en.wikipedia.org/wiki/.eg +// eg : https://en.wikipedia.org/wiki/.eg eg com.eg edu.eg @@ -809,7 +810,7 @@ net.eg org.eg sci.eg -// er : http://en.wikipedia.org/wiki/.er +// er : https://en.wikipedia.org/wiki/.er *.er // es : https://www.nic.es/site_ingles/ingles/dominios/index.html @@ -820,7 +821,7 @@ org.es gob.es edu.es -// et : http://en.wikipedia.org/wiki/.et +// et : https://en.wikipedia.org/wiki/.et et com.et gov.et @@ -831,28 +832,28 @@ name.et info.et net.et -// eu : http://en.wikipedia.org/wiki/.eu +// eu : https://en.wikipedia.org/wiki/.eu eu -// fi : http://en.wikipedia.org/wiki/.fi +// fi : https://en.wikipedia.org/wiki/.fi fi -// aland.fi : http://en.wikipedia.org/wiki/.ax +// aland.fi : https://en.wikipedia.org/wiki/.ax // This domain is being phased out in favor of .ax. As there are still many // domains under aland.fi, we still keep it on the list until aland.fi is // completely removed. // TODO: Check for updates (expected to be phased out around Q1/2009) aland.fi -// fj : http://en.wikipedia.org/wiki/.fj +// fj : https://en.wikipedia.org/wiki/.fj *.fj -// fk : http://en.wikipedia.org/wiki/.fk +// fk : https://en.wikipedia.org/wiki/.fk *.fk -// fm : http://en.wikipedia.org/wiki/.fm +// fm : https://en.wikipedia.org/wiki/.fm fm -// fo : http://en.wikipedia.org/wiki/.fo +// fo : https://en.wikipedia.org/wiki/.fo fo // fr : http://www.afnic.fr/ @@ -883,14 +884,14 @@ pharmacien.fr port.fr veterinaire.fr -// ga : http://en.wikipedia.org/wiki/.ga +// ga : https://en.wikipedia.org/wiki/.ga ga // gb : This registry is effectively dormant // Submitted by registry gb -// gd : http://en.wikipedia.org/wiki/.gd +// gd : https://en.wikipedia.org/wiki/.gd gd // ge : http://www.nic.net.ge/policy_en.pdf @@ -903,7 +904,7 @@ mil.ge net.ge pvt.ge -// gf : http://en.wikipedia.org/wiki/.gf +// gf : https://en.wikipedia.org/wiki/.gf gf // gg : http://www.channelisles.net/register-domains/ @@ -913,7 +914,7 @@ co.gg net.gg org.gg -// gh : http://en.wikipedia.org/wiki/.gh +// gh : https://en.wikipedia.org/wiki/.gh // see also: http://www.nic.gh/reg_now.php // Although domains directly at second level are not possible at the moment, // they have been possible for some time and may come back. @@ -933,7 +934,7 @@ mod.gi edu.gi org.gi -// gl : http://en.wikipedia.org/wiki/.gl +// gl : https://en.wikipedia.org/wiki/.gl // http://nic.gl gl co.gl @@ -955,7 +956,7 @@ gov.gn org.gn net.gn -// gov : http://en.wikipedia.org/wiki/.gov +// gov : https://en.wikipedia.org/wiki/.gov gov // gp : http://www.nic.gp/index.php?lang=en @@ -967,7 +968,7 @@ edu.gp org.gp asso.gp -// gq : http://en.wikipedia.org/wiki/.gq +// gq : https://en.wikipedia.org/wiki/.gq gq // gr : https://grweb.ics.forth.gr/english/1617-B-2005.html @@ -979,7 +980,7 @@ net.gr org.gr gov.gr -// gs : http://en.wikipedia.org/wiki/.gs +// gs : https://en.wikipedia.org/wiki/.gs gs // gt : http://www.gt/politicas_de_registro.html @@ -995,10 +996,10 @@ org.gt // gu : http://gadao.gov.gu/registration.txt *.gu -// gw : http://en.wikipedia.org/wiki/.gw +// gw : https://en.wikipedia.org/wiki/.gw gw -// gy : http://en.wikipedia.org/wiki/.gy +// gy : https://en.wikipedia.org/wiki/.gy // http://registry.gy/ gy co.gy @@ -1033,7 +1034,7 @@ org.hk 組織.hk 組织.hk -// hm : http://en.wikipedia.org/wiki/.hm +// hm : https://en.wikipedia.org/wiki/.hm hm // hn : http://www.nic.hn/politicas/ps02,,05.html @@ -1121,7 +1122,7 @@ or.id sch.id web.id -// ie : http://en.wikipedia.org/wiki/.ie +// ie : https://en.wikipedia.org/wiki/.ie ie gov.ie @@ -1149,7 +1150,7 @@ plc.co.im tt.im tv.im -// in : http://en.wikipedia.org/wiki/.in +// in : https://en.wikipedia.org/wiki/.in // see also: https://registry.in/Policies // Please note, that nic.in is not an official eTLD, but used by most // government institutions. @@ -1167,10 +1168,10 @@ res.in gov.in mil.in -// info : http://en.wikipedia.org/wiki/.info +// info : https://en.wikipedia.org/wiki/.info info -// int : http://en.wikipedia.org/wiki/.int +// int : https://en.wikipedia.org/wiki/.int // Confirmed by registry 2008-06-18 int eu.int @@ -1215,7 +1216,7 @@ gov.is org.is int.is -// it : http://en.wikipedia.org/wiki/.it +// it : https://en.wikipedia.org/wiki/.it it gov.it edu.it @@ -1613,10 +1614,10 @@ gov.jo mil.jo name.jo -// jobs : http://en.wikipedia.org/wiki/.jobs +// jobs : https://en.wikipedia.org/wiki/.jobs jobs -// jp : http://en.wikipedia.org/wiki/.jp +// jp : https://en.wikipedia.org/wiki/.jp // http://jprs.co.jp/en/jpdomain.html // Submitted by registry jp @@ -2549,7 +2550,6 @@ hitoyoshi.kumamoto.jp kamiamakusa.kumamoto.jp kashima.kumamoto.jp kikuchi.kumamoto.jp -kosa.kumamoto.jp kumamoto.kumamoto.jp mashiki.kumamoto.jp mifune.kumamoto.jp @@ -2634,7 +2634,6 @@ iwanuma.miyagi.jp kakuda.miyagi.jp kami.miyagi.jp kawasaki.miyagi.jp -kesennuma.miyagi.jp marumori.miyagi.jp matsushima.miyagi.jp minamisanriku.miyagi.jp @@ -3445,7 +3444,7 @@ gov.ki info.ki com.ki -// km : http://en.wikipedia.org/wiki/.km +// km : https://en.wikipedia.org/wiki/.km // http://www.domaine.km/documents/charte.doc km org.km @@ -3458,7 +3457,7 @@ mil.km ass.km com.km // These are only mentioned as proposed suggestions at domaine.km, but -// http://en.wikipedia.org/wiki/.km says they're available for registration: +// https://en.wikipedia.org/wiki/.km says they're available for registration: coop.km asso.km presse.km @@ -3468,7 +3467,7 @@ pharmaciens.km veterinaire.km gouv.km -// kn : http://en.wikipedia.org/wiki/.kn +// kn : https://en.wikipedia.org/wiki/.kn // http://www.dot.kn/domainRules.html kn net.kn @@ -3485,7 +3484,7 @@ org.kp rep.kp tra.kp -// kr : http://en.wikipedia.org/wiki/.kr +// kr : https://en.wikipedia.org/wiki/.kr // see also: http://domain.nida.or.kr/eng/registration.jsp kr ac.kr @@ -3519,7 +3518,7 @@ jeonnam.kr seoul.kr ulsan.kr -// kw : http://en.wikipedia.org/wiki/.kw +// kw : https://en.wikipedia.org/wiki/.kw *.kw // ky : http://www.icta.ky/da_ky_reg_dom.php @@ -3531,7 +3530,7 @@ com.ky org.ky net.ky -// kz : http://en.wikipedia.org/wiki/.kz +// kz : https://en.wikipedia.org/wiki/.kz // see also: http://www.nic.kz/rules/index.jsp kz org.kz @@ -3541,7 +3540,7 @@ gov.kz mil.kz com.kz -// la : http://en.wikipedia.org/wiki/.la +// la : https://en.wikipedia.org/wiki/.la // Submitted by registry la int.la @@ -3553,7 +3552,7 @@ per.la com.la org.la -// lb : http://en.wikipedia.org/wiki/.lb +// lb : https://en.wikipedia.org/wiki/.lb // Submitted by registry lb com.lb @@ -3562,7 +3561,7 @@ gov.lb net.lb org.lb -// lc : http://en.wikipedia.org/wiki/.lc +// lc : https://en.wikipedia.org/wiki/.lc // see also: http://www.nic.lc/rules.htm lc com.lc @@ -3572,7 +3571,7 @@ org.lc edu.lc gov.lc -// li : http://en.wikipedia.org/wiki/.li +// li : https://en.wikipedia.org/wiki/.li li // lk : http://www.nic.lk/seclevpr.html @@ -3602,12 +3601,12 @@ gov.lr org.lr net.lr -// ls : http://en.wikipedia.org/wiki/.ls +// ls : https://en.wikipedia.org/wiki/.ls ls co.ls org.ls -// lt : http://en.wikipedia.org/wiki/.lt +// lt : https://en.wikipedia.org/wiki/.lt lt // gov.lt : http://www.gov.lt/index_en.php gov.lt @@ -3639,7 +3638,7 @@ med.ly org.ly id.ly -// ma : http://en.wikipedia.org/wiki/.ma +// ma : https://en.wikipedia.org/wiki/.ma // http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf ma co.ma @@ -3654,10 +3653,10 @@ mc tm.mc asso.mc -// md : http://en.wikipedia.org/wiki/.md +// md : https://en.wikipedia.org/wiki/.md md -// me : http://en.wikipedia.org/wiki/.me +// me : https://en.wikipedia.org/wiki/.me me co.me net.me @@ -3680,13 +3679,13 @@ mil.mg com.mg co.mg -// mh : http://en.wikipedia.org/wiki/.mh +// mh : https://en.wikipedia.org/wiki/.mh mh -// mil : http://en.wikipedia.org/wiki/.mil +// mil : https://en.wikipedia.org/wiki/.mil mil -// mk : http://en.wikipedia.org/wiki/.mk +// mk : https://en.wikipedia.org/wiki/.mk // see also: http://dns.marnet.net.mk/postapka.php mk com.mk @@ -3698,7 +3697,7 @@ inf.mk name.mk // ml : http://www.gobin.info/domainname/ml-template.doc -// see also: http://en.wikipedia.org/wiki/.ml +// see also: https://en.wikipedia.org/wiki/.ml ml com.ml edu.ml @@ -3708,10 +3707,10 @@ net.ml org.ml presse.ml -// mm : http://en.wikipedia.org/wiki/.mm +// mm : https://en.wikipedia.org/wiki/.mm *.mm -// mn : http://en.wikipedia.org/wiki/.mn +// mn : https://en.wikipedia.org/wiki/.mn mn gov.mn edu.mn @@ -3725,17 +3724,17 @@ org.mo edu.mo gov.mo -// mobi : http://en.wikipedia.org/wiki/.mobi +// mobi : https://en.wikipedia.org/wiki/.mobi mobi // mp : http://www.dot.mp/ // Confirmed by registry 2008-06-17 mp -// mq : http://en.wikipedia.org/wiki/.mq +// mq : https://en.wikipedia.org/wiki/.mq mq -// mr : http://en.wikipedia.org/wiki/.mr +// mr : https://en.wikipedia.org/wiki/.mr mr gov.mr @@ -3755,7 +3754,7 @@ edu.mt net.mt org.mt -// mu : http://en.wikipedia.org/wiki/.mu +// mu : https://en.wikipedia.org/wiki/.mu mu com.mu net.mu @@ -4317,7 +4316,7 @@ zoology.museum ירושלים.museum иком.museum -// mv : http://en.wikipedia.org/wiki/.mv +// mv : https://en.wikipedia.org/wiki/.mv // "mv" included because, contra Wikipedia, google.mv exists. mv aero.mv @@ -4368,9 +4367,17 @@ edu.my mil.my name.my -// mz : http://www.gobin.info/domainname/mz-template.doc -*.mz -!teledata.mz +// mz : http://www.uem.mz/ +// Submitted by registry +mz +ac.mz +adv.mz +co.mz +edu.mz +gov.mz +mil.mz +net.mz +org.mz // na : http://www.na-nic.com.na/ // http://www.info.na/domain/ @@ -4400,13 +4407,13 @@ name nc asso.nc -// ne : http://en.wikipedia.org/wiki/.ne +// ne : https://en.wikipedia.org/wiki/.ne ne -// net : http://en.wikipedia.org/wiki/.net +// net : https://en.wikipedia.org/wiki/.net net -// nf : http://en.wikipedia.org/wiki/.nf +// nf : https://en.wikipedia.org/wiki/.nf nf com.nf net.nf @@ -4448,7 +4455,7 @@ ac.ni in.ni info.ni -// nl : http://en.wikipedia.org/wiki/.nl +// nl : https://en.wikipedia.org/wiki/.nl // https://www.sidn.nl/ // ccTLD for the Netherlands nl @@ -5237,10 +5244,10 @@ org.nr net.nr com.nr -// nu : http://en.wikipedia.org/wiki/.nu +// nu : https://en.wikipedia.org/wiki/.nu nu -// nz : http://en.wikipedia.org/wiki/.nz +// nz : https://en.wikipedia.org/wiki/.nz // Submitted by registry nz ac.nz @@ -5260,7 +5267,7 @@ org.nz parliament.nz school.nz -// om : http://en.wikipedia.org/wiki/.om +// om : https://en.wikipedia.org/wiki/.om om co.om com.om @@ -5272,7 +5279,7 @@ net.om org.om pro.om -// org : http://en.wikipedia.org/wiki/.org +// org : https://en.wikipedia.org/wiki/.org org // pa : http://www.nic.pa/ @@ -5307,7 +5314,7 @@ com.pf org.pf edu.pf -// pg : http://en.wikipedia.org/wiki/.pg +// pg : https://en.wikipedia.org/wiki/.pg *.pg // ph : http://www.domains.ph/FAQ2.asp @@ -5557,7 +5564,7 @@ org.pn edu.pn net.pn -// post : http://en.wikipedia.org/wiki/.post +// post : https://en.wikipedia.org/wiki/.post post // pr : http://www.nic.pr/index.asp?f=1 @@ -5572,22 +5579,26 @@ pro.pr biz.pr info.pr name.pr -// these aren't mentioned on nic.pr, but on http://en.wikipedia.org/wiki/.pr +// these aren't mentioned on nic.pr, but on https://en.wikipedia.org/wiki/.pr est.pr prof.pr ac.pr -// pro : http://www.nic.pro/support_faq.htm +// pro : http://registry.pro/get-pro pro +aaa.pro aca.pro +acct.pro +avocat.pro bar.pro cpa.pro +eng.pro jur.pro law.pro med.pro -eng.pro +recht.pro -// ps : http://en.wikipedia.org/wiki/.ps +// ps : https://en.wikipedia.org/wiki/.ps // http://www.nic.ps/registration/policy.html#reg ps edu.ps @@ -5609,7 +5620,7 @@ publ.pt com.pt nome.pt -// pw : http://en.wikipedia.org/wiki/.pw +// pw : https://en.wikipedia.org/wiki/.pw pw co.pw ne.pw @@ -5860,7 +5871,7 @@ tv.sd gov.sd info.sd -// se : http://en.wikipedia.org/wiki/.se +// se : https://en.wikipedia.org/wiki/.se // Submitted by registry se a.se @@ -5920,14 +5931,14 @@ gov.sh org.sh mil.sh -// si : http://en.wikipedia.org/wiki/.si +// si : https://en.wikipedia.org/wiki/.si si // sj : No registrations at this time. // Submitted by registry sj -// sk : http://en.wikipedia.org/wiki/.sk +// sk : https://en.wikipedia.org/wiki/.sk // list of 2nd level domains ? sk @@ -5940,10 +5951,10 @@ edu.sl gov.sl org.sl -// sm : http://en.wikipedia.org/wiki/.sm +// sm : https://en.wikipedia.org/wiki/.sm sm -// sn : http://en.wikipedia.org/wiki/.sn +// sn : https://en.wikipedia.org/wiki/.sn sn art.sn com.sn @@ -5959,7 +5970,7 @@ com.so net.so org.so -// sr : http://en.wikipedia.org/wiki/.sr +// sr : https://en.wikipedia.org/wiki/.sr sr // st : http://www.nic.st/html/policyrules/ @@ -5977,7 +5988,7 @@ principe.st saotome.st store.st -// su : http://en.wikipedia.org/wiki/.su +// su : https://en.wikipedia.org/wiki/.su su adygeya.su arkhangelsk.su @@ -6020,12 +6031,12 @@ gob.sv org.sv red.sv -// sx : http://en.wikipedia.org/wiki/.sx +// sx : https://en.wikipedia.org/wiki/.sx // Submitted by registry sx gov.sx -// sy : http://en.wikipedia.org/wiki/.sy +// sy : https://en.wikipedia.org/wiki/.sy // see also: http://www.gobin.info/domainname/sy.doc sy edu.sy @@ -6035,31 +6046,31 @@ mil.sy com.sy org.sy -// sz : http://en.wikipedia.org/wiki/.sz +// sz : https://en.wikipedia.org/wiki/.sz // http://www.sispa.org.sz/ sz co.sz ac.sz org.sz -// tc : http://en.wikipedia.org/wiki/.tc +// tc : https://en.wikipedia.org/wiki/.tc tc -// td : http://en.wikipedia.org/wiki/.td +// td : https://en.wikipedia.org/wiki/.td td -// tel: http://en.wikipedia.org/wiki/.tel +// tel: https://en.wikipedia.org/wiki/.tel // http://www.telnic.org/ tel -// tf : http://en.wikipedia.org/wiki/.tf +// tf : https://en.wikipedia.org/wiki/.tf tf -// tg : http://en.wikipedia.org/wiki/.tg +// tg : https://en.wikipedia.org/wiki/.tg // http://www.nic.tg/ tg -// th : http://en.wikipedia.org/wiki/.th +// th : https://en.wikipedia.org/wiki/.th // Submitted by registry th ac.th @@ -6088,10 +6099,10 @@ org.tj test.tj web.tj -// tk : http://en.wikipedia.org/wiki/.tk +// tk : https://en.wikipedia.org/wiki/.tk tk -// tl : http://en.wikipedia.org/wiki/.tl +// tl : https://en.wikipedia.org/wiki/.tl tl gov.tl @@ -6106,7 +6117,7 @@ gov.tm mil.tm edu.tm -// tn : http://en.wikipedia.org/wiki/.tn +// tn : https://en.wikipedia.org/wiki/.tn // http://whois.ati.tn/ tn com.tn @@ -6130,7 +6141,7 @@ agrinet.tn defense.tn turen.tn -// to : http://en.wikipedia.org/wiki/.to +// to : https://en.wikipedia.org/wiki/.to // Submitted by registry to com.to @@ -6171,7 +6182,7 @@ nc.tr // Used by government agencies of Northern Cyprus gov.nc.tr -// travel : http://en.wikipedia.org/wiki/.travel +// travel : https://en.wikipedia.org/wiki/.travel travel // tt : http://www.nic.tt/ @@ -6194,12 +6205,12 @@ name.tt gov.tt edu.tt -// tv : http://en.wikipedia.org/wiki/.tv +// tv : https://en.wikipedia.org/wiki/.tv // Not listing any 2LDs as reserved since none seem to exist in practice, // Wikipedia notwithstanding. tv -// tw : http://en.wikipedia.org/wiki/.tw +// tw : https://en.wikipedia.org/wiki/.tw tw edu.tw gov.tw @@ -6325,7 +6336,7 @@ ne.ug com.ug org.ug -// uk : http://en.wikipedia.org/wiki/.uk +// uk : https://en.wikipedia.org/wiki/.uk // Submitted by registry uk ac.uk @@ -6340,7 +6351,7 @@ plc.uk police.uk *.sch.uk -// us : http://en.wikipedia.org/wiki/.us +// us : https://en.wikipedia.org/wiki/.us us dni.us fed.us @@ -6528,7 +6539,7 @@ lib.ca.us lib.co.us lib.ct.us lib.dc.us -lib.de.us +// lib.de.us Issue #243 - Moved to Private section at request of Ed Moore lib.fl.us lib.ga.us lib.gu.us @@ -6598,10 +6609,10 @@ com.uz net.uz org.uz -// va : http://en.wikipedia.org/wiki/.va +// va : https://en.wikipedia.org/wiki/.va va -// vc : http://en.wikipedia.org/wiki/.vc +// vc : https://en.wikipedia.org/wiki/.vc // Submitted by registry vc com.vc @@ -6632,7 +6643,7 @@ store.ve tec.ve web.ve -// vg : http://en.wikipedia.org/wiki/.vg +// vg : https://en.wikipedia.org/wiki/.vg vg // vi : http://www.nic.vi/newdomainform.htm @@ -6661,7 +6672,7 @@ name.vn pro.vn health.vn -// vu : http://en.wikipedia.org/wiki/.vu +// vu : https://en.wikipedia.org/wiki/.vu // http://www.vunic.vu/ vu com.vu @@ -6672,7 +6683,7 @@ org.vu // wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf wf -// ws : http://en.wikipedia.org/wiki/.ws +// ws : https://en.wikipedia.org/wiki/.ws // http://samoanic.ws/index.dhtml ws com.ws @@ -6723,6 +6734,9 @@ yt // http://www.dotmasr.eg/ مصر +// xn--e1a4c ("eu", Cyrillic) : EU +ею + // xn--node ("ge", Georgian Mkhedruli) : GE გე @@ -6922,14 +6936,26 @@ school.za tm.za web.za -// zm : http://en.wikipedia.org/wiki/.zm -*.zm - -// zw : http://en.wikipedia.org/wiki/.zw +// zm : https://zicta.zm/ +// Submitted by registry +zm +ac.zm +biz.zm +co.zm +com.zm +edu.zm +gov.zm +info.zm +mil.zm +net.zm +org.zm +sch.zm + +// zw : https://en.wikipedia.org/wiki/.zw *.zw -// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2016-01-04T22:39:54Z +// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2016-08-17T00:17:46Z // aaa : 2015-02-26 American Automobile Association, Inc. aaa @@ -7006,9 +7032,6 @@ afl // africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa africa -// africamagic : 2015-03-05 Electronic Media Network (Pty) Ltd -africamagic - // agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) agakhan @@ -7114,6 +7137,9 @@ archi // army : 2014-03-06 United TLD Holdco Ltd. army +// art : 2016-03-24 UK Creative Ideas Limited +art + // arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E. arte @@ -7285,7 +7311,7 @@ blanco // blockbuster : 2015-07-30 Dish DBS Corporation blockbuster -// blog : 2015-05-14 PRIMER NIVEL S.A. +// blog : 2015-05-14 blog // bloomberg : 2014-07-17 Bloomberg IP Holdings LLC @@ -7408,6 +7434,9 @@ call // calvinklein : 2015-07-30 PVH gTLD Holdings LLC calvinklein +// cam : 2016-04-21 AC Webconnecting Holding B.V. +cam + // camera : 2013-08-27 Atomic Maple, LLC camera @@ -7708,6 +7737,9 @@ dad // dance : 2013-10-24 United TLD Holdco Ltd. dance +// data : 2016-06-02 Dish DBS Corporation +data + // date : 2014-11-20 dot Date Limited date @@ -7804,6 +7836,9 @@ dnp // docs : 2014-10-16 Charleston Road Registry Inc. docs +// doctor : 2016-06-02 Brice Trail, LLC +doctor + // dodge : 2015-07-30 FCA US LLC. dodge @@ -7816,9 +7851,6 @@ doha // domains : 2013-10-17 Sugar Cross, LLC domains -// doosan : 2014-04-03 Doosan Corporation -doosan - // dot : 2015-05-21 Dish DBS Corporation dot @@ -7828,9 +7860,6 @@ download // drive : 2015-03-05 Charleston Road Registry Inc. drive -// dstv : 2015-03-12 MultiChoice (Proprietary) Limited -dstv - // dtv : 2015-06-04 Dish DBS Corporation dtv @@ -7846,7 +7875,7 @@ dunlop // duns : 2015-08-06 The Dun & Bradstreet Corporation duns -// dupont : 2015-06-25 E.I. du Pont de Nemours and Company +// dupont : 2015-06-25 E. I. du Pont de Nemours and Company dupont // durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry @@ -7855,6 +7884,9 @@ durban // dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG dvag +// dvr : 2016-05-26 Hughes Satellite Systems Corporation +dvr + // dwg : 2015-07-23 Autodesk, Inc. dwg @@ -7864,6 +7896,9 @@ earth // eat : 2014-01-23 Charleston Road Registry Inc. eat +// eco : 2016-07-08 Big Room Inc. +eco + // edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. edeka @@ -8047,15 +8082,15 @@ florist // flowers : 2014-10-09 Uniregistry, Corp. flowers -// flsmidth : 2014-07-24 FLSmidth A/S -flsmidth - // fly : 2014-05-08 Charleston Road Registry Inc. fly // foo : 2014-01-23 Charleston Road Registry Inc. foo +// food : 2016-04-21 Lifestyle Domain Holdings, Inc. +food + // foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc. foodnetwork @@ -8107,6 +8142,9 @@ fujitsu // fujixerox : 2015-07-23 Xerox DNHC LLC fujixerox +// fun : 2016-01-14 Oriental Trading Company, Inc. +fun + // fund : 2014-03-20 John Castle, LLC fund @@ -8134,7 +8172,7 @@ gallup // game : 2015-05-28 Uniregistry, Corp. game -// games : 2015-05-28 Foggy Beach, LLC +// games : 2015-05-28 games // gap : 2015-07-31 The Gap, Inc. @@ -8194,6 +8232,9 @@ globo // gmail : 2014-05-01 Charleston Road Registry Inc. gmail +// gmbh : 2016-01-29 Extra Dynamite, LLC +gmbh + // gmo : 2014-01-09 GMO Internet, Inc. gmo @@ -8233,9 +8274,6 @@ gop // got : 2014-12-18 Amazon EU S.à r.l. got -// gotv : 2015-03-12 MultiChoice (Proprietary) Limited -gotv - // grainger : 2015-05-07 Grainger Registry Services, LLC grainger @@ -8251,6 +8289,9 @@ green // gripe : 2014-03-06 Corn Sunset, LLC gripe +// grocery : 2016-06-16 Wal-Mart Stores, Inc. +grocery + // group : 2014-08-15 Romeo Town, LLC group @@ -8371,6 +8412,9 @@ hot // hoteles : 2015-03-05 Travel Reservations SRL hoteles +// hotels : 2016-04-07 Booking.com B.V. +hotels + // hotmail : 2014-12-18 Microsoft Corporation hotmail @@ -8509,7 +8553,7 @@ jcp // jeep : 2015-07-30 FCA US LLC. jeep -// jetzt : 2014-01-09 New TLD Company AB +// jetzt : 2014-01-09 jetzt // jewelry : 2015-03-05 Wild Bloom, LLC @@ -8611,9 +8655,6 @@ kred // kuokgroup : 2015-04-09 Kerry Trading Co. Limited kuokgroup -// kyknet : 2015-03-05 Electronic Media Network (Pty) Ltd -kyknet - // kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen kyoto @@ -8818,6 +8859,9 @@ management // mango : 2013-10-24 PUNTO FA S.L. mango +// map : 2016-06-09 Charleston Road Registry Inc. +map + // market : 2014-03-06 market @@ -8878,6 +8922,9 @@ menu // meo : 2014-11-07 PT Comunicacoes S.A. meo +// merckmsd : 2016-07-14 MSD Registry Holdings, Inc. +merckmsd + // metlife : 2015-05-07 MetLife Services and Solutions, LLC metlife @@ -8908,8 +8955,8 @@ mls // mma : 2014-11-07 MMA IARD mma -// mnet : 2015-03-05 Electronic Media Network (Pty) Ltd -mnet +// mobile : 2016-06-02 Dish DBS Corporation +mobile // mobily : 2014-12-18 GreenTech Consultancy Company W.L.L. mobily @@ -8977,18 +9024,12 @@ mtpc // mtr : 2015-03-12 MTR Corporation Limited mtr -// multichoice : 2015-03-12 MultiChoice (Proprietary) Limited -multichoice - // mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC mutual // mutuelle : 2015-06-18 Fédération Nationale de la Mutualité Française mutuelle -// mzansimagic : 2015-03-05 Electronic Media Network (Pty) Ltd -mzansimagic - // nab : 2015-08-20 National Australia Bank Limited nab @@ -8998,9 +9039,6 @@ nadex // nagoya : 2013-10-24 GMO Registry, Inc. nagoya -// naspers : 2015-02-12 Intelprop (Proprietary) Limited -naspers - // nationwide : 2015-07-23 Nationwide Mutual Insurance Company nationwide @@ -9163,7 +9201,7 @@ orange // organic : 2014-03-27 Afilias Limited organic -// orientexpress : 2015-02-05 Belmond Ltd. +// orientexpress : 2015-02-05 orientexpress // origins : 2015-10-01 The Estée Lauder Companies Inc. @@ -9214,9 +9252,6 @@ passagens // pay : 2015-08-27 Amazon EU S.à r.l. pay -// payu : 2015-02-12 MIH PayU B.V. -payu - // pccw : 2015-05-14 PCCW Enterprises Limited pccw @@ -9229,9 +9264,15 @@ pfizer // pharmacy : 2014-06-19 National Association of Boards of Pharmacy pharmacy +// phd : 2016-07-28 Charleston Road Registry Inc. +phd + // philips : 2014-11-07 Koninklijke Philips N.V. philips +// phone : 2016-06-02 Dish DBS Corporation +phone + // photo : 2013-11-14 Uniregistry, Corp. photo @@ -9367,6 +9408,9 @@ qvc // racing : 2014-12-04 Premier Registry Limited racing +// radio : 2016-07-21 European Broadcasting Union (EBU) +radio + // raid : 2015-07-23 Johnson Shareholdings, Inc. raid @@ -9589,6 +9633,9 @@ scor // scot : 2014-01-23 Dot Scot Registry Limited scot +// search : 2016-06-09 Charleston Road Registry Inc. +search + // seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) seat @@ -9649,6 +9696,12 @@ shiksha // shoes : 2013-10-02 Binky Galley, LLC shoes +// shop : 2016-04-08 GMO Registry, Inc. +shop + +// shopping : 2016-03-31 +shopping + // shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. shouji @@ -9781,6 +9834,9 @@ storage // store : 2015-04-09 DotStore Inc. store +// stream : 2016-01-08 dot Stream Limited +stream + // studio : 2015-02-11 studio @@ -9793,9 +9849,6 @@ style // sucks : 2014-12-22 Vox Populi Registry Inc. sucks -// supersport : 2015-03-05 SuperSport International Holdings Proprietary Limited -supersport - // supplies : 2013-12-19 Atomic Fields, LLC supplies @@ -10590,28 +10643,38 @@ zuerich // ===BEGIN PRIVATE DOMAINS=== // (Note: these are in alphabetical order by company name) +// Agnat sp. z o.o. : https://domena.pl +// Submitted by Przemyslaw Plewa +beep.pl + +// Alces Software Ltd : http://alces-software.com +// Submitted by Mark J. Titorenko +*.compute.estate +*.alces.network + // Amazon CloudFront : https://aws.amazon.com/cloudfront/ // Submitted by Donavan Miller cloudfront.net // Amazon Elastic Compute Cloud: https://aws.amazon.com/ec2/ -// Submitted by Osman Surkatty +// Submitted by Philip Allchin +compute.amazonaws.com ap-northeast-1.compute.amazonaws.com +ap-northeast-2.compute.amazonaws.com ap-southeast-1.compute.amazonaws.com ap-southeast-2.compute.amazonaws.com -cn-north-1.compute.amazonaws.cn -compute.amazonaws.cn -compute.amazonaws.com -compute-1.amazonaws.com -eu-west-1.compute.amazonaws.com eu-central-1.compute.amazonaws.com +eu-west-1.compute.amazonaws.com sa-east-1.compute.amazonaws.com -us-east-1.amazonaws.com us-gov-west-1.compute.amazonaws.com us-west-1.compute.amazonaws.com us-west-2.compute.amazonaws.com +compute-1.amazonaws.com z-1.compute-1.amazonaws.com z-2.compute-1.amazonaws.com +us-east-1.amazonaws.com +compute.amazonaws.com.cn +cn-north-1.compute.amazonaws.com.cn // Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ // Submitted by Adam Stein @@ -10622,27 +10685,68 @@ elasticbeanstalk.com elb.amazonaws.com // Amazon S3 : https://aws.amazon.com/s3/ -// Submitted by Eric Kinolik +// Submitted by Luke Wells s3.amazonaws.com s3-ap-northeast-1.amazonaws.com +s3-ap-northeast-2.amazonaws.com s3-ap-southeast-1.amazonaws.com s3-ap-southeast-2.amazonaws.com +s3-eu-central-1.amazonaws.com +s3-eu-west-1.amazonaws.com s3-external-1.amazonaws.com s3-external-2.amazonaws.com s3-fips-us-gov-west-1.amazonaws.com -s3-eu-central-1.amazonaws.com -s3-eu-west-1.amazonaws.com s3-sa-east-1.amazonaws.com s3-us-gov-west-1.amazonaws.com s3-us-west-1.amazonaws.com s3-us-west-2.amazonaws.com +s3.ap-northeast-2.amazonaws.com s3.cn-north-1.amazonaws.com.cn s3.eu-central-1.amazonaws.com +// Aptible : https://www.aptible.com/ +// Submitted by Thomas Orozco +on-aptible.com + +// Association potager.org : https://potager.org/ +// Submitted by Lunar +pimienta.org +poivron.org +potager.org +sweetpepper.org + +// ASUSTOR Inc. : http://www.asustor.com +// Submitted by Vincent Tseng +myasustor.com + +// AVM : https://avm.de +// Submitted by Andreas Weise +myfritz.net + +// backplane : https://www.backplane.io +// Submitted by Anthony Voutas +backplaneapp.io + // BetaInABox // Submitted by Adrian betainabox.com +// BinaryLane : http://www.binarylane.com +// Submitted by Nathan O'Sullivan +bnr.la + +// Boxfuse : https://boxfuse.com +// Submitted by Axel Fontaine +boxfuse.io + +// BrowserSafetyMark +// Submitted by Dave Tharp +browsersafetymark.io + +// callidomus: https://www.callidomus.com/ +// Submitted by Marcus Popp +mycd.eu + // CentralNic : http://www.centralnic.com/names/domains // Submitted by registry ae.org @@ -10697,6 +10801,18 @@ co.com // c.la : http://www.c.la/ c.la +// certmgr.org : https://certmgr.org +// Submitted by B. Blechschmidt +certmgr.org + +// Citrix : https://citrix.com +// Submitted by Alex Stoddard +xenapponazure.com + +// ClearVox : http://www.clearvox.nl/ +// Submitted by Leon Rowland +virtueeldomein.nl + // cloudControl : https://www.cloudcontrol.com/ // Submitted by Tobias Wilken cloudcontrolled.com @@ -10725,10 +10841,43 @@ co.no // Submitted by Damien Tournoud *.platform.sh +// Craynic, s.r.o. : http://www.craynic.com/ +// Submitted by Ales Krajnik +realm.cz + +// Cryptonomic : https://cryptonomic.net/ +// Submitted by Andrew Cady +*.cryptonomic.net + // Cupcake : https://cupcake.io/ // Submitted by Jonathan Rudenberg cupcake.is +// cyon GmbH : https://www.cyon.ch/ +// Submitted by Dominic Luechinger +cyon.link +cyon.site + +// Daplie, Inc : https://daplie.com +// Submitted by AJ ONeal +daplie.me + +// Dansk.net : http://www.dansk.net/ +// Submitted by Anani Voule +biz.dk +co.dk +firm.dk +reg.dk +store.dk + +// deSEC : https://desec.io/ +// Submitted by Peter Thomassen +dedyn.io + +// DNShome : https://www.dnshome.de/ +// Submitted by Norbert Auler +dnshome.de + // DreamHost : http://www.dreamhost.com/ // Submitted by Andrew Farmer dreamhosters.com @@ -10737,10 +10886,20 @@ dreamhosters.com // Submitted by Ricardo Padilha mydrobo.com +// Drud Holdings, LLC. : https://www.drud.com/ +// Submitted by Kevin Bridges +drud.io +drud.us + // DuckDNS : http://www.duckdns.org/ // Submitted by Richard Harper duckdns.org +// dy.fi : http://dy.fi/ +// Submitted by Heikki Hannikainen +dy.fi +tunk.org + // DynDNS.com : http://www.dyndns.com/services/dns/dyndns/ dyndns-at-home.com dyndns-at-work.com @@ -11022,6 +11181,14 @@ webhop.org worse-than.tv writesthisblog.com +// dynv6 : https://dynv6.com +// Submitted by Dominik Menke 2016-01-18 +dynv6.net + +// E4YOU spol. s.r.o. : https://e4you.cz/ +// Submitted by Vladimir Dudr +e4.cz + // EU.org https://eu.org/ // Submitted by Pierre Beyssac eu.org @@ -11081,6 +11248,17 @@ tr.eu.org uk.eu.org us.eu.org +// Evennode : http://www.evennode.com/ +// Submitted by Michal Kralik +eu-1.evennode.com +eu-2.evennode.com +us-1.evennode.com +us-2.evennode.com + +// Facebook, Inc. +// Submitted by Peter Ruibal +apps.fbsbx.com + // Fastly Inc. http://www.fastly.com/ // Submitted by Vladimir Vuksan a.ssl.fastly.net @@ -11089,6 +11267,10 @@ global.ssl.fastly.net a.prod.fastly.net global.prod.fastly.net +// Featherhead : https://featherhead.xyz/ +// Submitted by Simon Menke +fhapp.xyz + // Firebase, Inc. // Submitted by Chris Raynor firebaseapp.com @@ -11097,21 +11279,46 @@ firebaseapp.com // Submitted by Jonathan Rudenberg flynnhub.com +// Freebox : http://www.freebox.fr +// Submitted by Romain Fliedel +freebox-os.com +freeboxos.com +fbx-os.fr +fbxos.fr +freebox-os.fr +freeboxos.fr + // GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains // Submitted by David Illsley service.gov.uk // GitHub, Inc. -// Submitted by Ben Toews +// Submitted by Patrick Toomey github.io githubusercontent.com +githubcloud.com +*.api.githubcloud.com +*.ext.githubcloud.com +gist.githubcloud.com +*.githubcloudusercontent.com + +// GitLab, Inc. +// Submitted by Alex Hanselka +gitlab.io // GlobeHosting, Inc. // Submitted by Zoltan Egresi ro.com +ro.im +shop.ro + +// GoIP DNS Services : http://www.goip.de +// Submitted by Christian Poulter +goip.de // Google, Inc. // Submitted by Eduardo Vela +*.0emm.com appspot.com blogspot.ae blogspot.al @@ -11198,6 +11405,14 @@ withyoutube.com // Hashbang : https://hashbang.sh hashbang.sh +// Hasura : https://hasura.io +// Submitted by Shahidh K Muhammed +hasura-app.io + +// Hepforge : https://www.hepforge.org +// Submitted by David Grellscheid +hepforge.org + // Heroku : https://www.heroku.com/ // Submitted by Tom Maher herokuapp.com @@ -11211,6 +11426,28 @@ iki.fi biz.at info.at +// Joyent : https://www.joyent.com/ +// Submitted by Brian Bennett +*.triton.zone +*.cns.joyent.com + +// JS.ORG : http://dns.js.org +// Submitted by Stefan Keim +js.org + +// .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf +co.krd +edu.krd + +// Magento Commerce +// Submitted by Damien Tournoud +*.magentosite.cloud + +// Meteor Development Group : https://www.meteor.com/hosting +// Submitted by Pierre Carrier +meteorapp.com +eu.meteorapp.com + // Michau Enterprises Limited : http://www.co.pl/ co.pl @@ -11236,6 +11473,99 @@ ngrok.io // Submitted by Jeff Wheelhouse nfshost.com +// nsupdate.info : https://www.nsupdate.info/ +// Submitted by Thomas Waldmann +nsupdate.info +nerdpol.ovh + +// No-IP.com : https://noip.com/ +// Submitted by Deven Reza +blogsyte.com +brasilia.me +cable-modem.org +ciscofreak.com +collegefan.org +couchpotatofries.org +damnserver.com +ddns.me +ditchyourip.com +dnsfor.me +dnsiskinky.com +dvrcam.info +dynns.com +eating-organic.net +fantasyleague.cc +geekgalaxy.com +golffan.us +health-carereform.com +homesecuritymac.com +homesecuritypc.com +hopto.me +ilovecollege.info +loginto.me +mlbfan.org +mmafan.biz +myactivedirectory.com +mydissent.net +myeffect.net +mymediapc.net +mypsx.net +mysecuritycamera.com +mysecuritycamera.net +mysecuritycamera.org +net-freaks.com +nflfan.org +nhlfan.net +no-ip.ca +no-ip.co.uk +no-ip.net +noip.us +onthewifi.com +pgafan.net +point2this.com +pointto.us +privatizehealthinsurance.net +quicksytes.com +read-books.org +securitytactics.com +serveexchange.com +servehumour.com +servep2p.com +servesarcasm.com +stufftoread.com +ufcfan.org +unusualperson.com +workisboring.com +3utilities.com +bounceme.net +ddns.net +ddnsking.com +gotdns.ch +hopto.org +myftp.biz +myftp.org +myvnc.com +no-ip.biz +no-ip.info +no-ip.org +noip.me +redirectme.net +servebeer.com +serveblog.net +servecounterstrike.com +serveftp.com +servegame.com +servehalflife.com +servehttp.com +serveirc.com +serveminecraft.net +servemp3.com +servepics.com +servequake.com +sytes.net +webhop.me +zapto.org + // NYC.mn : http://www.information.nyc.mn // Submitted by Matthew Brown nyc.mn @@ -11252,6 +11582,18 @@ operaunite.com // Submitted by Duarte Santos outsystemscloud.com +// OwnProvider : http://www.ownprovider.com +// Submitted by Jan Moennich +ownprovider.com + +// oy.lc +// Submitted by Charly Coste +oy.lc + +// Pagefog : https://pagefog.com/ +// Submitted by Derek Myers +pgfog.com + // Pagefront : https://www.pagefronthq.com/ // Submitted by Jason Kriss pagefrontapp.com @@ -11266,9 +11608,13 @@ zakopane.pl // Pantheon Systems, Inc. : https://pantheon.io/ // Submitted by Gary Dylina -pantheon.io +pantheonsite.io gotpantheon.com +// Peplink | Pepwave : http://peplink.com/ +// Submitted by Steve Leung +mypep.link + // prgmr.com : https://prgmr.com/ // Submitted by Sarah Newman xen.prgmr.com @@ -11277,10 +11623,24 @@ xen.prgmr.com // Submitted by registry priv.at +// Protonet GmbH : http://protonet.io +// Submitted by Martin Meier +protonet.io + +// Publication Presse Communication SARL : https://ppcom.fr +// Submitted by Yaacov Akiba Slama +chirurgiens-dentistes-en-france.fr + // QA2 // Submitted by Daniel Dent (https://www.danieldent.com/) qa2.com +// QNAP System Inc : https://www.qnap.com +// Submitted by Nick Chang +dev-myqnapcloud.com +alpha-myqnapcloud.com +myqnapcloud.com + // Rackmaze LLC : https://www.rackmaze.com // Submitted by Kirill Pertsev rackmaze.com @@ -11290,22 +11650,55 @@ rackmaze.net // Submitted by Tim Kramer rhcloud.com +// RethinkDB : https://www.rethinkdb.com/ +// Submitted by Chris Kastorff +hzc.io + // Sandstorm Development Group, Inc. : https://sandcats.io/ // Submitted by Asheesh Laroia sandcats.io +// SBE network solutions GmbH : https://www.sbe.de/ +// Submitted by Norman Meilick +logoip.de +logoip.com + // Service Online LLC : http://drs.ua/ // Submitted by Serhii Bulakh biz.ua co.ua pp.ua +// Shopblocks : http://www.shopblocks.com/ +// Submitted by Alex Bowers +myshopblocks.com + // SinaAppEngine : http://sae.sina.com.cn/ // Submitted by SinaAppEngine sinaapp.com vipsinaapp.com 1kapp.com +// Skyhat : http://www.skyhat.io +// Submitted by Shante Adam +bounty-full.com +alpha.bounty-full.com +beta.bounty-full.com + +// staticland : https://static.land +// Submitted by Seth Vincent +static.land +dev.static.land +sites.static.land + +// SpaceKit : https://www.spacekit.io/ +// Submitted by Reza Akhavan +spacekit.io + +// Stackspace : https://www.stackspace.io/ +// Submitted by Lina He +stackspace.space + // Synology, Inc. : https://www.synology.com/ // Submitted by Rony Weng diskstation.me @@ -11329,6 +11722,15 @@ gdynia.pl med.pl sopot.pl +// TownNews.com : http://www.townnews.com +// Submitted by Dustin Ward +bloxcms.com +townnews-staging.com + +// TuxFamily : http://tuxfamily.org +// Submitted by TuxFamily administrators +tuxfamily.org + // UDR Limited : http://www.udr.hk.com // Submitted by registry hk.com @@ -11336,6 +11738,18 @@ hk.org ltd.hk inc.hk +// .US +// Submitted by Ed Moore +lib.de.us + +// Viprinet Europe GmbH : http://www.viprinet.com +// Submitted by Simon Kissel +router.management + +// Wikimedia Labs : https://wikitech.wikimedia.org +// Submitted by Yuvi Panda +wmflabs.org + // Yola : https://www.yola.com/ // Submitted by Stefano Rivera yolasite.com diff --git a/src/Pdp/PublicSuffixListManager.php b/src/Pdp/PublicSuffixListManager.php index c29027b6..543d0a40 100644 --- a/src/Pdp/PublicSuffixListManager.php +++ b/src/Pdp/PublicSuffixListManager.php @@ -20,6 +20,13 @@ class PublicSuffixListManager { const PDP_PSL_TEXT_FILE = 'public-suffix-list.txt'; const PDP_PSL_PHP_FILE = 'public-suffix-list.php'; + + const ICANN_SECTION = 'ICANN'; + const ICANN_PSL_PHP_FILE = 'icann-public-suffix-list.php'; + + const PRIVATE_SECTION = 'PRIVATE'; + const PRIVATE_PSL_PHP_FILE = 'private-public-suffix-list.php'; + /** * @var string Public Suffix List URL */ @@ -63,10 +70,22 @@ public function __construct($cacheDir = null) public function refreshPublicSuffixList() { $this->fetchListFromSource(); - $publicSuffixListArray = $this->parseListToArray( - $this->cacheDir . '/' . self::PDP_PSL_TEXT_FILE + $cacheFile = $this->cacheDir . '/' . self::PDP_PSL_TEXT_FILE; + + $this->varExportToFile( + self::PDP_PSL_PHP_FILE, + $this->parseListToArray($cacheFile) + ); + + $this->varExportToFile( + self::ICANN_PSL_PHP_FILE, + $this->parseSectionToArray(self::ICANN_SECTION, $cacheFile) + ); + + $this->varExportToFile( + self::PRIVATE_PSL_PHP_FILE, + $this->parseSectionToArray(self::PRIVATE_SECTION, $cacheFile) ); - $this->writePhpCache($publicSuffixListArray); } /** @@ -98,18 +117,30 @@ public function fetchListFromSource() */ public function parseListToArray($textFile) { - $data = file( - $textFile, - FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES - ); - - $data = array_filter($data, function ($line) { - return strstr($line, '//') === false; - }); + return $this->parseSectionToArray('', $textFile); + } + /** + * Parses text representation of the Public suffix list to associative, multidimensional array. + * + * This method is based heavily on the code found in generateEffectiveTLDs.php + * + * @link https://github.com/usrflo/registered-domain-libs/blob/master/generateEffectiveTLDs.php + * A copy of the Apache License, Version 2.0, is provided with this + * distribution + * + * @param string $section Public Suffix List section name + * @param string $textFile Public Suffix List text filename + * + * @return array Associative, multidimensional array representation of the + * public suffx list + */ + protected function parseSectionToArray($section, $textFile) + { $publicSuffixListArray = array(); - - foreach ($data as $line) { + $data = file($textFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + $filter = $this->getLineFilter($section); + foreach (array_filter($data, $filter) as $line) { $ruleParts = explode('.', $line); $this->buildArray($publicSuffixListArray, $ruleParts); } @@ -117,6 +148,34 @@ public function parseListToArray($textFile) return $publicSuffixListArray; } + /** + * Return the PSL line filter. + * + * @param string $section Public Suffix List section name + * + * @return Closure + */ + protected function getLineFilter($section) + { + $section = trim($section); + $add = empty($section); + if ($add) { + return function ($line) { + return strstr($line, '//') === false; + }; + } + + return function ($line) use (&$add, $section) { + if (!$add && 0 === strpos($line, '// ===BEGIN ' . $section . ' DOMAINS===')) { + $add = true; + } elseif ($add && 0 === strpos($line, '// ===END ' . $section . ' DOMAINS===')) { + $add = false; + } + + return $add && strstr($line, '//') === false; + }; + } + /** * Recursive method to build the array representation of the Public Suffix List. * @@ -170,25 +229,45 @@ public function buildArray(array &$publicSuffixListArray, array $ruleParts) */ public function writePhpCache(array $publicSuffixList) { - $data = 'varExportToFile(self::PDP_PSL_PHP_FILE, $publicSuffixList); + } - return $this->write(self::PDP_PSL_PHP_FILE, $data); + /** + * Writes php array representation to disk. + * + * @param string $basename file path + * @param array $input input data + * + * @return int Number of bytes that were written to the file + */ + protected function varExportToFile($basename, array $input) + { + $data = 'write($basename, $data); } /** * Gets Public Suffix List. * + * @param string|null $section the Public Suffix List type + * * @return PublicSuffixList Instance of Public Suffix List */ - public function getList() + public function getList($section = null) { - if (!file_exists($this->cacheDir . '/' . self::PDP_PSL_PHP_FILE)) { + $sectionList = array( + self::ICANN_SECTION => self::ICANN_PSL_PHP_FILE, + self::PRIVATE_SECTION => self::PRIVATE_PSL_PHP_FILE, + ); + + $cacheBasename = isset($sectionList[$section]) ? $sectionList[$section] : self::PDP_PSL_PHP_FILE; + $psl_php_file = $this->cacheDir . '/' . $cacheBasename; + if (!file_exists($psl_php_file)) { $this->refreshPublicSuffixList(); } - $this->list = new PublicSuffixList( - include $this->cacheDir . '/' . self::PDP_PSL_PHP_FILE - ); + $this->list = new PublicSuffixList($psl_php_file); return $this->list; } @@ -205,13 +284,16 @@ public function getList() */ protected function write($filename, $data) { - $result = @file_put_contents($this->cacheDir . '/' . $filename, $data); - - if ($result === false) { - throw new \Exception("Cannot write '" . $this->cacheDir . '/' . "$filename'"); + $path = $this->cacheDir . '/' . $filename; + $level = error_reporting(0); + $result = file_put_contents($path, $data); + error_reporting($level); + if ($result !== false) { + return $result; } + $error = error_get_last(); - return $result; + throw new \Exception(sprintf("Cannot write '%s' : %s", $path, $error['message'])); } /** diff --git a/tests/src/Pdp/PublicSuffixListManagerTest.php b/tests/src/Pdp/PublicSuffixListManagerTest.php index cd46102b..0168e84d 100644 --- a/tests/src/Pdp/PublicSuffixListManagerTest.php +++ b/tests/src/Pdp/PublicSuffixListManagerTest.php @@ -214,4 +214,20 @@ public function testGetProvidedListFromDefaultCacheDir() $this->assertTrue(array_key_exists('stuff-4-sale', $publicSuffixList['org']) !== false); $this->assertTrue(array_key_exists('net', $publicSuffixList['ac']) !== false); } + + public function testGetDifferentPublicList() + { + $listManager = new PublicSuffixListManager(); + $publicSuffixList = $listManager->getList(); + $icannSuffixList = $listManager->getList(PublicSuffixListManager::ICANN_SECTION); + $privateSuffixList = $listManager->getList(PublicSuffixListManager::PRIVATE_SECTION); + $invalidSuffixList = $listManager->getList('invalid type'); + $this->assertInstanceOf('\Pdp\PublicSuffixList', $icannSuffixList); + $this->assertInstanceOf('\Pdp\PublicSuffixList', $privateSuffixList); + $this->assertInstanceOf('\Pdp\PublicSuffixList', $invalidSuffixList); + $this->assertEquals($invalidSuffixList, $publicSuffixList); + $this->assertNotEquals($privateSuffixList, $icannSuffixList); + $this->assertNotEquals($publicSuffixList, $icannSuffixList); + $this->assertNotEquals($publicSuffixList, $privateSuffixList); + } } From 058dda254fb6ad9a9afa422dbc0d83753c2e240c Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 12 Oct 2016 11:12:31 +0200 Subject: [PATCH 002/461] Improve the Pull Request - Changed constants suffix from `_SECTION` to `_DOMAINS` - Added `ALL_DOMAINS` constant to refer to the full PSL - `PublicSuffixListMananger::getList` optional parameter default value is now `PublicSuffixListMananger::ALL_DOMAINS` - Removed `PublicSuffixListMananger::$list` protected property - Marked as deprecated `PublicSuffixListMananger::parseListToArray` - Refactored PSL parsing to generate the 3 cache files with only one round - Reverted `PublicSuffixListMananger::write` changes because this is out of scope for this PR. --- src/Pdp/PublicSuffixListManager.php | 190 +++++++++++------- tests/src/Pdp/PublicSuffixListManagerTest.php | 30 ++- 2 files changed, 133 insertions(+), 87 deletions(-) diff --git a/src/Pdp/PublicSuffixListManager.php b/src/Pdp/PublicSuffixListManager.php index 543d0a40..edbd7a0f 100644 --- a/src/Pdp/PublicSuffixListManager.php +++ b/src/Pdp/PublicSuffixListManager.php @@ -10,6 +10,8 @@ */ namespace Pdp; +use SplFileObject; + /** * Public Suffix List Manager. * @@ -18,13 +20,14 @@ */ class PublicSuffixListManager { + const ALL_DOMAINS = 'ALL'; const PDP_PSL_TEXT_FILE = 'public-suffix-list.txt'; const PDP_PSL_PHP_FILE = 'public-suffix-list.php'; - const ICANN_SECTION = 'ICANN'; + const ICANN_DOMAINS = 'ICANN'; const ICANN_PSL_PHP_FILE = 'icann-public-suffix-list.php'; - const PRIVATE_SECTION = 'PRIVATE'; + const PRIVATE_DOMAINS = 'PRIVATE'; const PRIVATE_PSL_PHP_FILE = 'private-public-suffix-list.php'; /** @@ -40,7 +43,11 @@ class PublicSuffixListManager /** * @var PublicSuffixList Public Suffix List */ - protected $list; + protected static $domainList = array( + self::ALL_DOMAINS => self::PDP_PSL_PHP_FILE, + self::ICANN_DOMAINS => self::ICANN_PSL_PHP_FILE, + self::PRIVATE_DOMAINS => self::PRIVATE_PSL_PHP_FILE, + ); /** * @var \Pdp\HttpAdapter\HttpAdapterInterface Http adapter @@ -71,21 +78,10 @@ public function refreshPublicSuffixList() { $this->fetchListFromSource(); $cacheFile = $this->cacheDir . '/' . self::PDP_PSL_TEXT_FILE; - - $this->varExportToFile( - self::PDP_PSL_PHP_FILE, - $this->parseListToArray($cacheFile) - ); - - $this->varExportToFile( - self::ICANN_PSL_PHP_FILE, - $this->parseSectionToArray(self::ICANN_SECTION, $cacheFile) - ); - - $this->varExportToFile( - self::PRIVATE_PSL_PHP_FILE, - $this->parseSectionToArray(self::PRIVATE_SECTION, $cacheFile) - ); + $publicSuffixListArray = $this->convertListToArray($cacheFile); + foreach ($publicSuffixListArray as $domain => $data) { + $this->varExportToFile(self::$domainList[$domain], $data); + } } /** @@ -104,42 +100,122 @@ public function fetchListFromSource() /** * Parses text representation of list to associative, multidimensional array. * - * This method is based heavily on the code found in generateEffectiveTLDs.php + * @param string $textFile Public Suffix List text filename * - * @link https://github.com/usrflo/registered-domain-libs/blob/master/generateEffectiveTLDs.php - * A copy of the Apache License, Version 2.0, is provided with this - * distribution + * @return array Associative, multidimensional array representation of the + * public suffx list + */ + protected function convertListToArray($textFile) + { + $addDomain = array( + self::ICANN_DOMAINS => false, + self::PRIVATE_DOMAINS => false, + ); + + $publicSuffixListArray = array( + self::ALL_DOMAINS => array(), + self::ICANN_DOMAINS => array(), + self::PRIVATE_DOMAINS => array(), + ); + + $data = new SplFileObject($textFile); + $data->setFlags(SplFileObject::DROP_NEW_LINE | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY); + foreach ($data as $line) { + $addDomain = $this->validateDomainAddition($line, $addDomain); + if (strstr($line, '//') !== false) { + continue; + } + $publicSuffixListArray = $this->convertLineToArray($line, $publicSuffixListArray, $addDomain); + } + + return $publicSuffixListArray; + } + + /** + * Update the addition status for a given line against the domain list (ICANN and PRIVATE). * - * @param string $textFile Public Suffix List text filename + * @param string $line the current file line + * @param array $addDomain the domain addition status + */ + protected function validateDomainAddition($line, array $addDomain) + { + foreach ($addDomain as $section => $status) { + $addDomain[$section] = $this->isValidSection($status, $line, $section); + } + + return $addDomain; + } + + /** + * Tell whether the line can be converted for a given domain. + * + * @param bool $previousStatus the previous status + * @param string $line the current file line + * @param string $section the section to be considered + * + * @return bool + */ + protected function isValidSection($previousStatus, $line, $section) + { + if (!$previousStatus && 0 === strpos($line, '// ===BEGIN ' . $section . ' DOMAINS===')) { + return true; + } + + if ($previousStatus && 0 === strpos($line, '// ===END ' . $section . ' DOMAINS===')) { + return false; + } + + return $previousStatus; + } + + /** + * Convert a line from the Public Suffix list. + * + * @param string $textLine Public Suffix List text line + * @param array $publicSuffixListArray Associative, multidimensional array representation of the + * public suffx list + * @param array $addDomain Tell which section should be converted * * @return array Associative, multidimensional array representation of the * public suffx list */ - public function parseListToArray($textFile) + protected function convertLineToArray($textLine, array $publicSuffixListArray, array $addDomain) { - return $this->parseSectionToArray('', $textFile); + $ruleParts = explode('.', $textLine); + $this->buildArray($publicSuffixListArray[self::ALL_DOMAINS], $ruleParts); + $domainNames = array_keys(array_filter($addDomain)); + foreach ($domainNames as $domainName) { + $this->buildArray($publicSuffixListArray[$domainName], $ruleParts); + } + + return $publicSuffixListArray; } /** - * Parses text representation of the Public suffix list to associative, multidimensional array. + * Parses text representation of list to associative, multidimensional array. * * This method is based heavily on the code found in generateEffectiveTLDs.php * + * DEPRECATION WARNING! This method will be removed in the next major point release + * + * @deprecated deprecated since version 3.1.0 * @link https://github.com/usrflo/registered-domain-libs/blob/master/generateEffectiveTLDs.php * A copy of the Apache License, Version 2.0, is provided with this * distribution * - * @param string $section Public Suffix List section name * @param string $textFile Public Suffix List text filename * * @return array Associative, multidimensional array representation of the * public suffx list */ - protected function parseSectionToArray($section, $textFile) + public function parseListToArray($textFile) { - $publicSuffixListArray = array(); $data = file($textFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); - $filter = $this->getLineFilter($section); + $filter = function ($line) { + return strstr($line, '//') === false; + }; + + $publicSuffixListArray = array(); foreach (array_filter($data, $filter) as $line) { $ruleParts = explode('.', $line); $this->buildArray($publicSuffixListArray, $ruleParts); @@ -148,34 +224,6 @@ protected function parseSectionToArray($section, $textFile) return $publicSuffixListArray; } - /** - * Return the PSL line filter. - * - * @param string $section Public Suffix List section name - * - * @return Closure - */ - protected function getLineFilter($section) - { - $section = trim($section); - $add = empty($section); - if ($add) { - return function ($line) { - return strstr($line, '//') === false; - }; - } - - return function ($line) use (&$add, $section) { - if (!$add && 0 === strpos($line, '// ===BEGIN ' . $section . ' DOMAINS===')) { - $add = true; - } elseif ($add && 0 === strpos($line, '// ===END ' . $section . ' DOMAINS===')) { - $add = false; - } - - return $add && strstr($line, '//') === false; - }; - } - /** * Recursive method to build the array representation of the Public Suffix List. * @@ -250,26 +298,19 @@ protected function varExportToFile($basename, array $input) /** * Gets Public Suffix List. * - * @param string|null $section the Public Suffix List type + * @param string $list the Public Suffix List type * * @return PublicSuffixList Instance of Public Suffix List */ - public function getList($section = null) + public function getList($list = self::ALL_DOMAINS) { - $sectionList = array( - self::ICANN_SECTION => self::ICANN_PSL_PHP_FILE, - self::PRIVATE_SECTION => self::PRIVATE_PSL_PHP_FILE, - ); - - $cacheBasename = isset($sectionList[$section]) ? $sectionList[$section] : self::PDP_PSL_PHP_FILE; - $psl_php_file = $this->cacheDir . '/' . $cacheBasename; - if (!file_exists($psl_php_file)) { + $cacheBasename = isset(self::$domainList[$list]) ? self::$domainList[$list] : self::PDP_PSL_PHP_FILE; + $cacheFile = $this->cacheDir . '/' . $cacheBasename; + if (!file_exists($cacheFile)) { $this->refreshPublicSuffixList(); } - $this->list = new PublicSuffixList($psl_php_file); - - return $this->list; + return new PublicSuffixList($cacheFile); } /** @@ -285,15 +326,12 @@ public function getList($section = null) protected function write($filename, $data) { $path = $this->cacheDir . '/' . $filename; - $level = error_reporting(0); - $result = file_put_contents($path, $data); - error_reporting($level); + $result = @file_put_contents($path, $data); if ($result !== false) { return $result; } - $error = error_get_last(); - throw new \Exception(sprintf("Cannot write '%s' : %s", $path, $error['message'])); + throw new \Exception(sprintf("Cannot write '%s'", $path)); } /** diff --git a/tests/src/Pdp/PublicSuffixListManagerTest.php b/tests/src/Pdp/PublicSuffixListManagerTest.php index 0168e84d..7dab1add 100644 --- a/tests/src/Pdp/PublicSuffixListManagerTest.php +++ b/tests/src/Pdp/PublicSuffixListManagerTest.php @@ -218,16 +218,24 @@ public function testGetProvidedListFromDefaultCacheDir() public function testGetDifferentPublicList() { $listManager = new PublicSuffixListManager(); - $publicSuffixList = $listManager->getList(); - $icannSuffixList = $listManager->getList(PublicSuffixListManager::ICANN_SECTION); - $privateSuffixList = $listManager->getList(PublicSuffixListManager::PRIVATE_SECTION); - $invalidSuffixList = $listManager->getList('invalid type'); - $this->assertInstanceOf('\Pdp\PublicSuffixList', $icannSuffixList); - $this->assertInstanceOf('\Pdp\PublicSuffixList', $privateSuffixList); - $this->assertInstanceOf('\Pdp\PublicSuffixList', $invalidSuffixList); - $this->assertEquals($invalidSuffixList, $publicSuffixList); - $this->assertNotEquals($privateSuffixList, $icannSuffixList); - $this->assertNotEquals($publicSuffixList, $icannSuffixList); - $this->assertNotEquals($publicSuffixList, $privateSuffixList); + $publicList = $listManager->getList(); + $invalidList = $listManager->getList('invalid type'); + $this->assertEquals($publicList, $invalidList); + } + + public function testParserWithDifferentPublicList() + { + $listManager = new PublicSuffixListManager(); + $icannList = $listManager->getList(PublicSuffixListManager::ICANN_DOMAINS); + $privateList = $listManager->getList(PublicSuffixListManager::PRIVATE_DOMAINS); + $host = 'thephpleague.github.io'; + + $icannParser = new Parser($icannList); + $icannSubdomain = $icannParser->parseHost($host)->getSubdomain(); + $this->assertSame('thephpleague', $icannSubdomain); + + $privateParser = new Parser($privateList); + $privateSubdomain = $privateParser->parseHost($host)->getSubdomain(); + $this->assertSame(null, $privateSubdomain); } } From f7cd5c20c152ffb62e76a42a961b168c253bbbcf Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Fri, 9 Jun 2017 08:05:05 -0500 Subject: [PATCH 003/461] Use Trusty, add PHP 7.1 and nightly --- .travis.yml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0e690e7b..53ea7acb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,15 @@ language: php +sudo: required +dist: trusty php: - - 5.3 - - 5.4 - - 5.5 - - 5.6 - - 7.0 + - '5.4' + - '5.5' + - '5.6' + - '7.0' + - '7.1' - hhvm + - nightly script: phpunit From 6fb78de8ae0935c9298630eb06debe8940758435 Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Wed, 9 Aug 2017 13:35:57 -0500 Subject: [PATCH 004/461] Sudo false --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 53ea7acb..8f4fdc61 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: php -sudo: required +sudo: false dist: trusty php: From 85a4cde098ed68a4311465ad4f008799979faeac Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Wed, 9 Aug 2017 13:40:43 -0500 Subject: [PATCH 005/461] Remove hhvm --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8f4fdc61..77f24f3c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,6 @@ php: - '5.6' - '7.0' - '7.1' - - hhvm - nightly script: phpunit From 2ea53883e068b41d9a9b80221500008d3e33089c Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Wed, 9 Aug 2017 13:56:14 -0500 Subject: [PATCH 006/461] Remove nightly --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 77f24f3c..f0a29ad3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,6 @@ php: - '5.6' - '7.0' - '7.1' - - nightly script: phpunit From 19369186ebf8018525d6d6ef793696ec217fff06 Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Wed, 9 Aug 2017 14:03:41 -0500 Subject: [PATCH 007/461] Add nightly --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index f0a29ad3..77f24f3c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,7 @@ php: - '5.6' - '7.0' - '7.1' + - nightly script: phpunit From 5a80282a0f579d71888c1d8e700ab6cf03281db1 Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Wed, 9 Aug 2017 14:03:51 -0500 Subject: [PATCH 008/461] Do not use deprecated variant --- src/Pdp/Parser.php | 2 +- src/Pdp/PublicSuffixListManager.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Pdp/Parser.php b/src/Pdp/Parser.php index 71bf8a22..b98a5a0b 100644 --- a/src/Pdp/Parser.php +++ b/src/Pdp/Parser.php @@ -303,7 +303,7 @@ protected function normalize($part) $punycoded = (strpos($part, 'xn--') !== false); if ($punycoded === false) { - $part = idn_to_ascii($part); + $part = idn_to_ascii($part, 0, INTL_IDNA_VARIANT_UTS46); $this->isNormalized = true; } diff --git a/src/Pdp/PublicSuffixListManager.php b/src/Pdp/PublicSuffixListManager.php index c29027b6..e03d4238 100644 --- a/src/Pdp/PublicSuffixListManager.php +++ b/src/Pdp/PublicSuffixListManager.php @@ -141,7 +141,7 @@ public function buildArray(array &$publicSuffixListArray, array $ruleParts) // of https://publicsuffix.org/list/ // "The domain and all rules must be canonicalized in the normal way // for hostnames - lower-case, Punycode (RFC 3492)." - $part = idn_to_ascii($part); + $part = idn_to_ascii($part, 0, INTL_IDNA_VARIANT_UTS46); if (strpos($part, '!') === 0) { $part = substr($part, 1); From 29a12cf1495c6e9a11048db107adfb2449e77f7d Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 21 Aug 2017 16:09:21 +0700 Subject: [PATCH 009/461] only use INTL_IDNA_VARIANT_UTS46 constant only when exists --- src/Pdp/Parser.php | 6 +++++- src/Pdp/PublicSuffixListManager.php | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Pdp/Parser.php b/src/Pdp/Parser.php index b98a5a0b..ae10acf3 100644 --- a/src/Pdp/Parser.php +++ b/src/Pdp/Parser.php @@ -303,7 +303,11 @@ protected function normalize($part) $punycoded = (strpos($part, 'xn--') !== false); if ($punycoded === false) { - $part = idn_to_ascii($part, 0, INTL_IDNA_VARIANT_UTS46); + if (defined('INTL_IDNA_VARIANT_UTS46')) { + $part = idn_to_ascii($part, 0, INTL_IDNA_VARIANT_UTS46); + } else { + $part = idn_to_ascii($part); + } $this->isNormalized = true; } diff --git a/src/Pdp/PublicSuffixListManager.php b/src/Pdp/PublicSuffixListManager.php index e03d4238..b385033e 100644 --- a/src/Pdp/PublicSuffixListManager.php +++ b/src/Pdp/PublicSuffixListManager.php @@ -141,7 +141,11 @@ public function buildArray(array &$publicSuffixListArray, array $ruleParts) // of https://publicsuffix.org/list/ // "The domain and all rules must be canonicalized in the normal way // for hostnames - lower-case, Punycode (RFC 3492)." - $part = idn_to_ascii($part, 0, INTL_IDNA_VARIANT_UTS46); + if (defined('INTL_IDNA_VARIANT_UTS46')) { + $part = idn_to_ascii($part, 0, INTL_IDNA_VARIANT_UTS46); + } else { + $part = idn_to_ascii($part); + } if (strpos($part, '!') === 0) { $part = substr($part, 1); From e3a81618b1b54512ce17dda772fdc26c4804d090 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 28 Sep 2017 17:20:33 +0200 Subject: [PATCH 010/461] Adding registrableDomain alias to avoid BC Break --- src/Pdp/Parser.php | 12 ++++++++++++ src/Pdp/Uri/Url/Host.php | 15 ++++++++++++++- tests/src/Pdp/ParserTest.php | 5 ++++- tests/src/Pdp/Uri/Url/HostTest.php | 1 + 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/Pdp/Parser.php b/src/Pdp/Parser.php index ae10acf3..ec16c85a 100644 --- a/src/Pdp/Parser.php +++ b/src/Pdp/Parser.php @@ -263,6 +263,18 @@ public function getRegistrableDomain($host) return implode('.', array_reverse($registrableDomainParts)); } + /** + * @see Parser::getRegistrableDomain + * + * @param string $host host + * + * @return string|null registrable domain + */ + public function getRegisterableDomain($host) + { + return $this->getRegistrableDomain($host); + } + /** * Returns the subdomain portion of provided host. * diff --git a/src/Pdp/Uri/Url/Host.php b/src/Pdp/Uri/Url/Host.php index ec611998..6df9a17f 100644 --- a/src/Pdp/Uri/Url/Host.php +++ b/src/Pdp/Uri/Url/Host.php @@ -69,6 +69,16 @@ public function getRegistrableDomain() return $this->registrableDomain; } + /** + * @see Host::getRegistrableDomain + * + * @return string + */ + public function getRegisterableDomain() + { + return $this->getRegistrableDomain(); + } + /** * Get Public suffix. * @@ -116,9 +126,12 @@ public function __toString() */ public function toArray() { + $registrableDomain = $this->getRegistrableDomain(); + return array( 'subdomain' => $this->getSubdomain(), - 'registrableDomain' => $this->getRegistrableDomain(), + 'registrableDomain' => $registrableDomain, + 'registerableDomain' => $registrableDomain, 'publicSuffix' => $this->getPublicSuffix(), 'host' => $this->getHost(), ); diff --git a/tests/src/Pdp/ParserTest.php b/tests/src/Pdp/ParserTest.php index 5949c6f7..9ccab13c 100644 --- a/tests/src/Pdp/ParserTest.php +++ b/tests/src/Pdp/ParserTest.php @@ -150,6 +150,7 @@ public function testGetPublicSuffixHandlesWrongCaseProperly() /** * @covers Pdp\Parser::parseUrl() * @covers Pdp\Parser::getRegistrableDomain() + * @covers Pdp\Parser::getRegisterableDomain() * @dataProvider parseDataProvider * * @param $url @@ -162,7 +163,9 @@ public function testGetRegistrableDomain($url, $publicSuffix, $registrableDomain { $pdpUrl = $this->parser->parseUrl($url); $this->assertSame($registrableDomain, $pdpUrl->getHost()->getRegistrableDomain()); - $this->assertSame($registrableDomain, $this->parser->getRegistrableDomain($hostPart)); + $this->assertSame($registrableDomain, $this->parser->getRegisterableDomain($hostPart)); + $this->assertSame($registrableDomain, $pdpUrl->getHost()->getRegistrableDomain()); + $this->assertSame($registrableDomain, $this->parser->getRegisterableDomain($hostPart)); } /** diff --git a/tests/src/Pdp/Uri/Url/HostTest.php b/tests/src/Pdp/Uri/Url/HostTest.php index f2df8ea2..f1d320bb 100644 --- a/tests/src/Pdp/Uri/Url/HostTest.php +++ b/tests/src/Pdp/Uri/Url/HostTest.php @@ -48,6 +48,7 @@ public function testToArray($publicSuffix, $registrableDomain, $subdomain, $host $parts = array( 'subdomain' => $subdomain, 'registrableDomain' => $registrableDomain, + 'registerableDomain' => $registrableDomain, 'publicSuffix' => $publicSuffix, 'host' => $hostPart, ); From 195cde3f6207e07c29ae425badb38dd7bc0113d8 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 28 Sep 2017 17:41:07 +0200 Subject: [PATCH 011/461] patchin idn_to_utf8 --- src/Pdp/Parser.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Pdp/Parser.php b/src/Pdp/Parser.php index ec16c85a..4de6cb0b 100644 --- a/src/Pdp/Parser.php +++ b/src/Pdp/Parser.php @@ -337,7 +337,11 @@ protected function normalize($part) protected function denormalize($part) { if ($this->isNormalized === true) { - $part = idn_to_utf8($part); + if (defined('INTL_IDNA_VARIANT_UTS46')) { + $part = idn_to_utf8($part, 0, INTL_IDNA_VARIANT_UTS46); + } else { + $part = idn_to_utf8($part); + } $this->isNormalized = false; } From 1184f10eb2271697cda703cb77f81345a5644789 Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Tue, 3 Oct 2017 21:59:11 -0500 Subject: [PATCH 012/461] Remove the parse bin file --- bin/parse | 37 ------------------------------------- 1 file changed, 37 deletions(-) delete mode 100755 bin/parse diff --git a/bin/parse b/bin/parse deleted file mode 100755 index 45640392..00000000 --- a/bin/parse +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env php -getList()); - $url = $parser->parseUrl($domain); - $suffixValid = ($parser->isSuffixValid((string) $url->getHost())) ? 'IS' : 'IS NOT'; - - print_r($url->toArray()); - echo sprintf('Host: %s', $url) . PHP_EOL; - echo sprintf( - "'%s' %s a valid public suffix.", - $url->getHost()->getPublicSuffix(), - $suffixValid - ) . PHP_EOL; -} catch (\Exception $e) { - die($e->getMessage() . PHP_EOL); -} From 8391a2b9d1f595832d7e65179428bd719f07c867 Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Tue, 3 Oct 2017 22:33:37 -0500 Subject: [PATCH 013/461] Remove unused classes Behavior has either been removed or refactored into other classes. --- src/Pdp/Parser.php | 378 ----------------------------- src/Pdp/Uri/Url.php | 252 ------------------- src/Pdp/Uri/Url/Host.php | 139 ----------- tests/src/Pdp/ParserTest.php | 311 ------------------------ tests/src/Pdp/Uri/Url/HostTest.php | 78 ------ tests/src/Pdp/Uri/UrlTest.php | 175 ------------- 6 files changed, 1333 deletions(-) delete mode 100644 src/Pdp/Parser.php delete mode 100644 src/Pdp/Uri/Url.php delete mode 100644 src/Pdp/Uri/Url/Host.php delete mode 100644 tests/src/Pdp/ParserTest.php delete mode 100644 tests/src/Pdp/Uri/Url/HostTest.php delete mode 100644 tests/src/Pdp/Uri/UrlTest.php diff --git a/src/Pdp/Parser.php b/src/Pdp/Parser.php deleted file mode 100644 index 4de6cb0b..00000000 --- a/src/Pdp/Parser.php +++ /dev/null @@ -1,378 +0,0 @@ -publicSuffixList = $publicSuffixList; - } - - /** - * Parses url. - * - * @param string $url Url to parse - * - * @return Url Object representation of url - */ - public function parseUrl($url) - { - $rawUrl = $url; - $elem = array( - 'scheme' => null, - 'user' => null, - 'pass' => null, - 'host' => null, - 'port' => null, - 'path' => null, - 'query' => null, - 'fragment' => null, - ); - - if (preg_match(self::SCHEME_PATTERN, $url) === 0) { - // Wacky scheme required to overcome parse_url behavior in PHP lt 5.4.7 - // See https://github.com/jeremykendall/php-domain-parser/issues/49 - $url = 'php-lt-5.4.7-hack://' . preg_replace('#^//#', '', $url, 1); - } - - $parts = pdp_parse_url($url); - - if ($parts === false) { - throw new SeriouslyMalformedUrlException($rawUrl); - } - - if ($parts['scheme'] === 'php-lt-5.4.7-hack') { - // Remove wacky scheme required to overcome parse_url behavior in PHP lt 5.4.7 - // See https://github.com/jeremykendall/php-domain-parser/issues/49 - $parts['scheme'] = null; - } - - $elem = (array) $parts + $elem; - - $host = $this->parseHost($parts['host']); - - return new Url( - $elem['scheme'], - $elem['user'], - $elem['pass'], - $host, - $elem['port'], - $elem['path'], - $elem['query'], - $elem['fragment'] - ); - } - - /** - * Parses host part of url. - * - * @param string $host Host part of url - * - * @return Host Object representation of host portion of url - */ - public function parseHost($host) - { - $host = mb_strtolower($host, 'UTF-8'); - - return new Host( - $this->getSubdomain($host), - $this->getRegistrableDomain($host), - $this->getPublicSuffix($host), - $host - ); - } - - /** - * Get the raw public suffix based on the cached public suffix list file. - * Return false if the provided suffix is not included in the PSL. - * - * @param string $host The host to process - * - * @return string|false The suffix or false if suffix not included in the PSL - */ - protected function getRawPublicSuffix($host) - { - $host = $this->normalize($host); - - $parts = array_reverse(explode('.', $host)); - $publicSuffix = array(); - $publicSuffixList = $this->publicSuffixList; - - foreach ($parts as $part) { - if (array_key_exists($part, $publicSuffixList) - && array_key_exists('!', $publicSuffixList[$part])) { - break; - } - - if (array_key_exists($part, $publicSuffixList)) { - array_unshift($publicSuffix, $part); - $publicSuffixList = $publicSuffixList[$part]; - continue; - } - - if (array_key_exists('*', $publicSuffixList)) { - array_unshift($publicSuffix, $part); - $publicSuffixList = $publicSuffixList['*']; - continue; - } - - // Avoids improper parsing when $host's subdomain + public suffix === - // a valid public suffix (e.g. host 'us.example.com' and public suffix 'us.com') - // - // Added by @goodhabit in https://github.com/jeremykendall/php-domain-parser/pull/15 - // Resolves https://github.com/jeremykendall/php-domain-parser/issues/16 - break; - } - - // If empty, then the suffix is not included in the PSL and is - // considered "invalid". This also triggers algorithm rule #2: If no - // rules match, the prevailing rule is "*". - if (empty($publicSuffix)) { - return false; - } - - $suffix = implode('.', array_filter($publicSuffix, 'strlen')); - - return $this->denormalize($suffix); - } - - /** - * Returns the public suffix portion of provided host. - * - * @param string $host host - * - * @return string|null public suffix or null if host does not contain a public suffix - */ - public function getPublicSuffix($host) - { - if (strpos($host, '.') === 0) { - return; - } - - // Fixes #22: If a single label domain makes it this far (e.g., - // localhost, foo, etc.), this stops it from incorrectly being set as - // the public suffix. - if (!$this->isMultiLabelDomain($host)) { - return; - } - - // Fixes #43 - if ($this->isIpv4Address($host)) { - return; - } - - $suffix = $this->getRawPublicSuffix($host); - - // Apply algorithm rule #2: If no rules match, the prevailing rule is "*". - if (false === $suffix) { - $parts = array_reverse(explode('.', $host)); - $suffix = array_shift($parts); - } - - return $suffix; - } - - /** - * Is suffix valid? - * - * Validity determined by whether or not the suffix is included in the PSL. - * - * @param string $host Host part - * - * @return bool True is suffix is valid, false otherwise - */ - public function isSuffixValid($host) - { - return $this->getRawPublicSuffix($host) !== false; - } - - /** - * Returns registrable domain portion of provided host. - * - * Per the test cases provided by Mozilla - * (http://mxr.mozilla.org/mozilla-central/source/netwerk/test/unit/data/test_psl.txt?raw=1), - * this method should return null if the domain provided is a public suffix. - * - * @param string $host host - * - * @return string|null registrable domain - */ - public function getRegistrableDomain($host) - { - if (!$this->isMultiLabelDomain($host)) { - return; - } - - $publicSuffix = $this->getPublicSuffix($host); - - if ($publicSuffix === null || $host == $publicSuffix) { - return; - } - - $publicSuffixParts = array_reverse(explode('.', $publicSuffix)); - $hostParts = array_reverse(explode('.', $host)); - $registrableDomainParts = $publicSuffixParts + array_slice($hostParts, 0, count($publicSuffixParts) + 1); - - return implode('.', array_reverse($registrableDomainParts)); - } - - /** - * @see Parser::getRegistrableDomain - * - * @param string $host host - * - * @return string|null registrable domain - */ - public function getRegisterableDomain($host) - { - return $this->getRegistrableDomain($host); - } - - /** - * Returns the subdomain portion of provided host. - * - * @param string $host host - * - * @return string|null subdomain - */ - public function getSubdomain($host) - { - $registrableDomain = $this->getRegistrableDomain($host); - - if ($registrableDomain === null || $host === $registrableDomain) { - return; - } - - $registrableDomainParts = array_reverse(explode('.', $registrableDomain)); - - $host = $this->normalize($host); - - $hostParts = array_reverse(explode('.', $host)); - $subdomainParts = array_slice($hostParts, count($registrableDomainParts)); - - $subdomain = implode('.', array_reverse($subdomainParts)); - - return $this->denormalize($subdomain); - } - - /** - * If a URL is not punycoded, then it may be an IDNA URL, so it must be - * converted to ASCII. Performs conversion and sets flag. - * - * @param string $part Host part - * - * @return string Host part, transformed if not punycoded - */ - protected function normalize($part) - { - $punycoded = (strpos($part, 'xn--') !== false); - - if ($punycoded === false) { - if (defined('INTL_IDNA_VARIANT_UTS46')) { - $part = idn_to_ascii($part, 0, INTL_IDNA_VARIANT_UTS46); - } else { - $part = idn_to_ascii($part); - } - $this->isNormalized = true; - } - - return strtolower($part); - } - - /** - * Converts any normalized part back to IDNA. Performs conversion and - * resets flag. - * - * @param string $part Host part - * - * @return string Denormalized host part - */ - protected function denormalize($part) - { - if ($this->isNormalized === true) { - if (defined('INTL_IDNA_VARIANT_UTS46')) { - $part = idn_to_utf8($part, 0, INTL_IDNA_VARIANT_UTS46); - } else { - $part = idn_to_utf8($part); - } - $this->isNormalized = false; - } - - return $part; - } - - /** - * Tests host for presence of '.'. - * - * Related to #22 - * - * @param string $host Host part of url - * - * @return bool True if multi-label domain, false otherwise - */ - protected function isMultiLabelDomain($host) - { - return strpos($host, '.') !== false; - } - - /** - * Tests host to determine if it is an IP address. - * - * Related to #43 - * - * @param string $host Host part of url - * - * @return bool True if host is an ip address, false otherwise - */ - protected function isIpv4Address($host) - { - return preg_match(self::IP_ADDRESS_PATTERN, $host) === 1; - } -} diff --git a/src/Pdp/Uri/Url.php b/src/Pdp/Uri/Url.php deleted file mode 100644 index 78d5a94a..00000000 --- a/src/Pdp/Uri/Url.php +++ /dev/null @@ -1,252 +0,0 @@ -scheme = mb_strtolower($scheme, 'UTF-8') ?: null; - $this->user = $user; - $this->pass = $pass; - $this->host = $host; - $this->port = $port; - $this->path = $path; - $this->query = $query; - $this->fragment = $fragment; - } - - /** - * Gets schemeless url. - * - * @return string Url without scheme - */ - public function getSchemeless() - { - return preg_replace(Parser::SCHEME_PATTERN, '//', $this->__toString(), 1); - } - - /** - * Converts the URI object to a string and returns it. - * - * @return string The full URI this object represents. - */ - public function __toString() - { - $url = null; - - if ($this->scheme) { - $url .= $this->scheme . '://'; - } - - if ($this->user) { - $url .= urlencode($this->user); - if ($this->pass) { - $url .= ':' . urlencode($this->pass); - } - $url .= '@'; - } - - $host = $this->host->__toString(); - - if ($host) { - $url .= $host; - } - - if ($this->port) { - $url .= ':' . (int) $this->port; - } - - if ($this->path) { - $url .= $this->path; - } - - if ($this->query) { - $url .= '?' . $this->query; - } - - if ($this->fragment) { - $url .= '#' . urlencode($this->fragment); - } - - return $url; - } - - /** - * Converts the URI object to an array and returns it. - * - * @return array Array of URI component parts - */ - public function toArray() - { - return array( - 'scheme' => $this->getScheme(), - 'user' => $this->getUser(), - 'pass' => $this->getPass(), - 'host' => $this->getHost()->__toString(), - 'subdomain' => $this->getHost()->getSubdomain(), - 'registrableDomain' => $this->getHost()->getRegistrableDomain(), - 'publicSuffix' => $this->getHost()->getPublicSuffix(), - 'port' => $this->getPort(), - 'path' => $this->getPath(), - 'query' => $this->getQuery(), - 'fragment' => $this->getFragment(), - ); - } - - /** - * Get Scheme. - * - * @return string - */ - public function getScheme() - { - return $this->scheme; - } - - /** - * Get User. - * - * @return string - */ - public function getUser() - { - return $this->user; - } - - /** - * Get Pass. - * - * @return string - */ - public function getPass() - { - return $this->pass; - } - - /** - * Get Host object. - * - * @return Host - */ - public function getHost() - { - return $this->host; - } - - /** - * Get Port. - * - * @return int - */ - public function getPort() - { - return $this->port; - } - - /** - * Get Path. - * - * @return string - */ - public function getPath() - { - return $this->path; - } - - /** - * Get Query. - * - * @return string - */ - public function getQuery() - { - return $this->query; - } - - /** - * Get Fragment. - * - * @return string - */ - public function getFragment() - { - return $this->fragment; - } -} diff --git a/src/Pdp/Uri/Url/Host.php b/src/Pdp/Uri/Url/Host.php deleted file mode 100644 index 6df9a17f..00000000 --- a/src/Pdp/Uri/Url/Host.php +++ /dev/null @@ -1,139 +0,0 @@ -subdomain = $subdomain; - $this->registrableDomain = $registrableDomain; - $this->publicSuffix = $publicSuffix; - $this->host = $host; - } - - /** - * Get Subdomain. - * - * @return string|null - */ - public function getSubdomain() - { - return $this->subdomain; - } - - /** - * @return string - */ - public function getRegistrableDomain() - { - return $this->registrableDomain; - } - - /** - * @see Host::getRegistrableDomain - * - * @return string - */ - public function getRegisterableDomain() - { - return $this->getRegistrableDomain(); - } - - /** - * Get Public suffix. - * - * @return string|null - */ - public function getPublicSuffix() - { - return $this->publicSuffix; - } - - /** - * Get Entire host part. - * - * @return string|null - */ - public function getHost() - { - return $this->host; - } - - /** - * Get string representation of host. - * - * @return string String representation of host - */ - public function __toString() - { - if ($this->host !== null) { - return $this->host; - } - - // retain only the elements that are not empty - $str = array_filter( - array($this->subdomain, $this->registrableDomain), - 'strlen' - ); - - return implode('.', $str); - } - - /** - * Get array representation of host. - * - * @return array Array representation of host - */ - public function toArray() - { - $registrableDomain = $this->getRegistrableDomain(); - - return array( - 'subdomain' => $this->getSubdomain(), - 'registrableDomain' => $registrableDomain, - 'registerableDomain' => $registrableDomain, - 'publicSuffix' => $this->getPublicSuffix(), - 'host' => $this->getHost(), - ); - } -} diff --git a/tests/src/Pdp/ParserTest.php b/tests/src/Pdp/ParserTest.php deleted file mode 100644 index 9ccab13c..00000000 --- a/tests/src/Pdp/ParserTest.php +++ /dev/null @@ -1,311 +0,0 @@ -parser = new Parser( - new PublicSuffixList($file) - ); - } - - protected function tearDown() - { - $this->parser = null; - parent::tearDown(); - } - - /** - * @covers Pdp\Parser::isSuffixValid() - */ - public function testIsSuffixValidFalse() - { - $this->assertFalse($this->parser->isSuffixValid('www.example.faketld')); - $this->assertFalse($this->parser->isSuffixValid('example.example')); - } - - /** - * @covers Pdp\Parser::isSuffixValid() - */ - public function testIsSuffixValidTrue() - { - $this->assertTrue($this->parser->isSuffixValid('www.example.com')); - $this->assertTrue($this->parser->isSuffixValid('www.example.co.uk')); - $this->assertTrue($this->parser->isSuffixValid('www.example.рф')); - $this->assertTrue($this->parser->isSuffixValid('example.com.au')); - } - - /** - * @covers Pdp\Parser::parseUrl() - * @covers ::pdp_parse_url - */ - public function testParseBadUrlThrowsInvalidArgumentException() - { - $url = 'http:///example.com'; - - $this->setExpectedException( - 'Pdp\Exception\SeriouslyMalformedUrlException', - sprintf('"%s" is one seriously malformed url.', $url) - ); - - $this->parser->parseUrl($url); - } - - /** - * If an empty string is passed to the parser then the hacky scheme from - * issue 49 should not appear in the Exception message. - * - * @group issue54 - * - * @see https://github.com/jeremykendall/php-domain-parser/issues/54 - * - * @covers Pdp\Parser::parseUrl() - * @covers ::pdp_parse_url - */ - public function testParseEmptyStringThrowsInvalidArgumentExceptionWithoutWackySchemeInMessage() - { - $this->setExpectedException( - 'Pdp\Exception\SeriouslyMalformedUrlException', - '"" is one seriously malformed url.' - ); - - $this->parser->parseUrl(''); - } - - /** - * @covers Pdp\Parser::parseUrl() - * @dataProvider parseDataProvider - * - * @param $url - * @param $publicSuffix - * @param $registrableDomain - * @param $subdomain - * @param $hostPart - */ - public function testParseUrl($url, $publicSuffix, $registrableDomain, $subdomain, $hostPart) - { - $pdpUrl = $this->parser->parseUrl($url); - $this->assertInstanceOf('\Pdp\Uri\Url', $pdpUrl); - } - - /** - * @covers Pdp\Parser::parseUrl() - * @covers Pdp\Parser::parseHost() - * @dataProvider parseDataProvider - * - * @param $url - * @param $publicSuffix - * @param $registrableDomain - * @param $subdomain - * @param $hostPart - */ - public function testParseHost($url, $publicSuffix, $registrableDomain, $subdomain, $hostPart) - { - $pdpUrl = $this->parser->parseUrl($url); - $this->assertEquals($hostPart, $pdpUrl->getHost()); - - $pdpHost = $this->parser->parseHost($hostPart); - $this->assertInstanceOf('\Pdp\Uri\Url\Host', $pdpHost); - $this->assertEquals($hostPart, $pdpHost->__toString()); - } - - /** - * @covers Pdp\Parser::parseUrl() - * @covers Pdp\Parser::getPublicSuffix() - * @dataProvider parseDataProvider - * - * @param $url - * @param $publicSuffix - * @param $registrableDomain - * @param $subdomain - * @param $hostPart - */ - public function testGetPublicSuffix($url, $publicSuffix, $registrableDomain, $subdomain, $hostPart) - { - $pdpUrl = $this->parser->parseUrl($url); - $this->assertSame($publicSuffix, $pdpUrl->getHost()->getPublicSuffix()); - $this->assertSame($publicSuffix, $this->parser->getPublicSuffix($hostPart)); - } - - /** - * @covers Pdp\Parser::getPublicSuffix() - */ - public function testGetPublicSuffixHandlesWrongCaseProperly() - { - $publicSuffix = 'рф'; - $hostPart = 'Яндекс.РФ'; - - $this->assertSame($publicSuffix, $this->parser->getPublicSuffix($hostPart)); - } - - /** - * @covers Pdp\Parser::parseUrl() - * @covers Pdp\Parser::getRegistrableDomain() - * @covers Pdp\Parser::getRegisterableDomain() - * @dataProvider parseDataProvider - * - * @param $url - * @param $publicSuffix - * @param $registrableDomain - * @param $subdomain - * @param $hostPart - */ - public function testGetRegistrableDomain($url, $publicSuffix, $registrableDomain, $subdomain, $hostPart) - { - $pdpUrl = $this->parser->parseUrl($url); - $this->assertSame($registrableDomain, $pdpUrl->getHost()->getRegistrableDomain()); - $this->assertSame($registrableDomain, $this->parser->getRegisterableDomain($hostPart)); - $this->assertSame($registrableDomain, $pdpUrl->getHost()->getRegistrableDomain()); - $this->assertSame($registrableDomain, $this->parser->getRegisterableDomain($hostPart)); - } - - /** - * @covers Pdp\Parser::parseUrl() - * @covers Pdp\Parser::getSubdomain() - * @dataProvider parseDataProvider - * - * @param $url - * @param $publicSuffix - * @param $registrableDomain - * @param $subdomain - * @param $hostPart - */ - public function testGetSubdomain($url, $publicSuffix, $registrableDomain, $subdomain, $hostPart) - { - $pdpUrl = $this->parser->parseUrl($url); - $this->assertSame($subdomain, $pdpUrl->getHost()->getSubdomain()); - $this->assertSame($subdomain, $this->parser->getSubdomain($hostPart)); - } - - /** - * @covers Pdp\Parser::getSubdomain() - */ - public function testGetSubdomainHandlesWrongCaseProperly() - { - $url = 'http://WWW.example.COM'; - $hostPart = 'WWW.example.com'; - $subdomain = 'www'; - $pdpUrl = $this->parser->parseUrl($url); - - $this->assertSame($subdomain, $pdpUrl->getHost()->getSubdomain()); - $this->assertSame($subdomain, $this->parser->getSubdomain($hostPart)); - } - - /** - * @dataProvider parseDataProvider - * @covers ::pdp_parse_url - * - * @param $url - * @param $publicSuffix - * @param $registrableDomain - * @param $subdomain - * @param $hostPart - */ - public function testpdp_parse_urlCanReturnCorrectHost($url, $publicSuffix, $registrableDomain, $subdomain, $hostPart) - { - $this->assertEquals( - $hostPart, - pdp_parse_url('http://' . $hostPart, PHP_URL_HOST) - ); - } - - /** - * @group issue46 - * @group issue49 - * - * Don't add a scheme to schemeless URLs - * - * @see https://github.com/jeremykendall/php-domain-parser/issues/46 - * @see https://github.com/jeremykendall/php-domain-parser/issues/49 - */ - public function testDoNotPrependSchemeToSchemelessUrls() - { - $schemeless = 'www.graphstory.com'; - $expected = 'www.graphstory.com'; - $url = $this->parser->parseUrl($schemeless); - $actual = $url->__toString(); - - $this->assertEquals($expected, $actual); - - $schemeless = '//www.graphstory.com'; - $expected = 'www.graphstory.com'; - $url = $this->parser->parseUrl($schemeless); - $actual = $url->__toString(); - - $this->assertEquals($expected, $actual); - } - - public function parseDataProvider() - { - return array( - // url, public suffix, registrable domain, subdomain, host part - array('http://www.waxaudio.com.au/audio/albums/the_mashening', 'com.au', 'waxaudio.com.au', 'www', 'www.waxaudio.com.au'), - array('example.COM', 'com', 'example.com', null, 'example.com'), - array('giant.yyyy', 'yyyy', 'giant.yyyy', null, 'giant.yyyy'), - array('cea-law.co.il', 'co.il', 'cea-law.co.il', null, 'cea-law.co.il'), - array('http://edition.cnn.com/WORLD/', 'com', 'cnn.com', 'edition', 'edition.cnn.com'), - array('http://en.wikipedia.org/', 'org', 'wikipedia.org', 'en', 'en.wikipedia.org'), - array('a.b.c.mm', 'c.mm', 'b.c.mm', 'a', 'a.b.c.mm'), - array('https://test.k12.ak.us', 'k12.ak.us', 'test.k12.ak.us', null, 'test.k12.ak.us'), - array('www.scottwills.co.uk', 'co.uk', 'scottwills.co.uk', 'www', 'www.scottwills.co.uk'), - array('b.ide.kyoto.jp', 'ide.kyoto.jp', 'b.ide.kyoto.jp', null, 'b.ide.kyoto.jp'), - array('a.b.example.uk.com', 'uk.com', 'example.uk.com', 'a.b', 'a.b.example.uk.com'), - array('test.nic.ar', 'ar', 'nic.ar', 'test', 'test.nic.ar'), - array('a.b.test.ck', 'test.ck', 'b.test.ck', 'a', 'a.b.test.ck'), - array('baez.songfest.om', 'om', 'songfest.om', 'baez', 'baez.songfest.om'), - array('politics.news.omanpost.om', 'om', 'omanpost.om', 'politics.news', 'politics.news.omanpost.om'), - // BEGIN https://github.com/jeremykendall/php-domain-parser/issues/16 - array('us.example.com', 'com', 'example.com', 'us', 'us.example.com'), - array('us.example.na', 'na', 'example.na', 'us', 'us.example.na'), - array('www.example.us.na', 'us.na', 'example.us.na', 'www', 'www.example.us.na'), - array('us.example.org', 'org', 'example.org', 'us', 'us.example.org'), - array('webhop.broken.biz', 'biz', 'broken.biz', 'webhop', 'webhop.broken.biz'), - array('www.broken.webhop.biz', 'webhop.biz', 'broken.webhop.biz', 'www', 'www.broken.webhop.biz'), - // END https://github.com/jeremykendall/php-domain-parser/issues/16 - // Test schemeless url - array('//www.broken.webhop.biz', 'webhop.biz', 'broken.webhop.biz', 'www', 'www.broken.webhop.biz'), - // Test ftp support - https://github.com/jeremykendall/php-domain-parser/issues/18 - array('ftp://www.waxaudio.com.au/audio/albums/the_mashening', 'com.au', 'waxaudio.com.au', 'www', 'www.waxaudio.com.au'), - array('ftps://test.k12.ak.us', 'k12.ak.us', 'test.k12.ak.us', null, 'test.k12.ak.us'), - // Test support for RFC 3986 compliant schemes - // https://github.com/jeremykendall/php-domain-parser/issues/46 - array('fake-scheme+RFC-3986.compliant://example.com', 'com', 'example.com', null, 'example.com'), - array('http://localhost', null, null, null, 'localhost'), - array('test.museum', 'museum', 'test.museum', null, 'test.museum'), - array('bob.smith.name', 'name', 'smith.name', 'bob', 'bob.smith.name'), - array('tons.of.info', 'info', 'of.info', 'tons', 'tons.of.info'), - // Test IDN parsing - // BEGIN https://github.com/jeremykendall/php-domain-parser/issues/29 - array('http://Яндекс.РФ', 'рф', 'яндекс.рф', null, 'яндекс.рф'), - // END https://github.com/jeremykendall/php-domain-parser/issues/29 - array('www.食狮.中国', '中国', '食狮.中国', 'www', 'www.食狮.中国'), - array('食狮.com.cn', 'com.cn', '食狮.com.cn', null, '食狮.com.cn'), - // Test punycode URLs - array('www.xn--85x722f.xn--fiqs8s', 'xn--fiqs8s', 'xn--85x722f.xn--fiqs8s', 'www', 'www.xn--85x722f.xn--fiqs8s'), - array('xn--85x722f.com.cn', 'com.cn', 'xn--85x722f.com.cn', null, 'xn--85x722f.com.cn'), - // Test ipv6 URL - array('http://[::1]/', null, null, null, '[::1]'), - array('http://[2001:db8:85a3:8d3:1319:8a2e:370:7348]/', null, null, null, '[2001:db8:85a3:8d3:1319:8a2e:370:7348]'), - array('https://[2001:db8:85a3:8d3:1319:8a2e:370:7348]:443/', null, null, null, '[2001:db8:85a3:8d3:1319:8a2e:370:7348]'), - // Test IP address: Fixes #43 - array('http://192.168.1.2/', null, null, null, '192.168.1.2'), - array('http://127.0.0.1:443', null, null, null, '127.0.0.1'), - array('http://67.196.2.34/whois-archive/latest.php?page=2479', null, null, null, '67.196.2.34'), - // Link-local addresses and zone indices - array('http://[fe80::3%25eth0]', null, null, null, '[fe80::3%25eth0]'), - array('http://[fe80::1%2511]', null, null, null, '[fe80::1%2511]'), - array('http://www.example.dev', 'dev', 'example.dev', 'www', 'www.example.dev'), - array('http://example.faketld', 'faketld', 'example.faketld', null, 'example.faketld'), - // url, public suffix, registrable domain, subdomain, host part - ); - } -} diff --git a/tests/src/Pdp/Uri/Url/HostTest.php b/tests/src/Pdp/Uri/Url/HostTest.php deleted file mode 100644 index f1d320bb..00000000 --- a/tests/src/Pdp/Uri/Url/HostTest.php +++ /dev/null @@ -1,78 +0,0 @@ -assertEquals($hostPart, $host->__toString()); - } - - public function test__toStringWhenHostPartIsNull() - { - $host = new Host( - 'www', - 'example.com', - 'com' - ); - - $this->assertEquals('www.example.com', $host->__toString()); - } - - /** - * @dataProvider hostDataProvider - * - * @param $publicSuffix - * @param $registrableDomain - * @param $subdomain - * @param $hostPart - */ - public function testToArray($publicSuffix, $registrableDomain, $subdomain, $hostPart) - { - $parts = array( - 'subdomain' => $subdomain, - 'registrableDomain' => $registrableDomain, - 'registerableDomain' => $registrableDomain, - 'publicSuffix' => $publicSuffix, - 'host' => $hostPart, - ); - - $host = new Host( - $parts['subdomain'], - $parts['registrableDomain'], - $parts['publicSuffix'], - $parts['host'] - ); - - $this->assertEquals($parts, $host->toArray()); - } - - public function hostDataProvider() - { - // $publicSuffix, $registrableDomain, $subdomain, $hostPart - return array( - array('com.au', 'waxaudio.com.au', 'www', 'www.waxaudio.com.au'), - array('com', 'example.com', null, 'example.com'), - array('com', 'cnn.com', 'edition', 'edition.cnn.com'), - array('org', 'wikipedia.org', 'en', 'en.wikipedia.org'), - array('uk.com', 'example.uk.com', 'a.b', 'a.b.example.uk.com'), - array(null, null, null, 'localhost'), - ); - } -} diff --git a/tests/src/Pdp/Uri/UrlTest.php b/tests/src/Pdp/Uri/UrlTest.php deleted file mode 100644 index 8e48cf10..00000000 --- a/tests/src/Pdp/Uri/UrlTest.php +++ /dev/null @@ -1,175 +0,0 @@ -parser = new Parser($psl); - $this->url = $this->parser->parseUrl($this->spec); - } - - protected function tearDown() - { - parent::tearDown(); - } - - public function test__construct() - { - $url = new Url( - 'http', - 'anonymous', - 'guest', - new Host( - null, - 'example.com', - 'com' - ), - null, - '/path/to/index.php/foo/bar.xml', - 'baz=dib', - 'anchor' - ); - - $this->assertInstanceOf('Pdp\Uri\Url', $url); - } - - public function test__toString() - { - $this->assertEquals($this->spec, $this->url->__toString()); - } - - public function testGetSchemeless() - { - $schemeless = substr_replace($this->spec, '', 0, 5); - $this->assertEquals($schemeless, $this->url->getSchemeless()); - } - - public function testToArray() - { - $expected = array( - 'scheme' => 'http', - 'user' => 'anonymous', - 'pass' => 'guest', - 'host' => 'example.com', - 'subdomain' => null, - 'registrableDomain' => 'example.com', - 'publicSuffix' => 'com', - 'port' => 8080, - 'path' => '/path/to/index.php/foo/bar.xml', - 'query' => 'baz=dib', - 'fragment' => 'anchor', - ); - - $this->assertEquals($expected, $this->url->toArray()); - } - - /** - * @group issue18 - * - * @see https://github.com/jeremykendall/php-domain-parser/issues/18 - */ - public function testFtpUrlToString() - { - $ftpUrl = 'ftp://ftp.somewhere.com'; - $url = $this->parser->parseUrl($ftpUrl); - $this->assertEquals($ftpUrl, $url->__toString()); - } - - /** - * This test fixes #29. It has been updated due to a change suggested in #46. - * The original $expected value was 'http://яндекс.рф', as parsing would add - * 'http://' to URLs that did not have a scheme. That behavior has been removed. - * The new $expected result is 'яндекс.рф'. - * - * @group issue29 - * @group issue46 - * - * @see https://github.com/jeremykendall/php-domain-parser/issues/29 - * @see https://github.com/jeremykendall/php-domain-parser/issues/46 - */ - public function testIdnToAscii() - { - $idn = 'Яндекс.РФ'; - $expected = 'яндекс.рф'; - $url = $this->parser->parseUrl($idn); - $actual = $url->__toString(); - - $this->assertEquals($expected, $actual); - } - - /** - * Scheme should not be URL encoded. - * - * @group issue46 - * @group issue51 - * - * @see https://tools.ietf.org/html/rfc3986#section-3.1 - */ - public function test__toStringDoesNotUrlEncodeScheme() - { - // The '+' should not be URL encoded when output to string - $spec = 'fake-scheme+RFC-3986.compliant://www.graphstory.com'; - $expected = 'fake-scheme+rfc-3986.compliant://www.graphstory.com'; - $url = $this->parser->parseUrl($spec); - $this->assertEquals($expected, $url->__toString()); - } - - /** - * Scheme should be output in lowercase regardless of case of original arg. - * - * @group issue51 - * - * @see https://tools.ietf.org/html/rfc3986#section-3.1 - */ - public function testSchemeAlwaysConvertedToLowerCasePerRFC3986() - { - $spec = 'HttPS://www.google.com'; - $expected = 'https://www.google.com'; - $url = $this->parser->parseUrl($spec); - $this->assertEquals($expected, $url->__toString()); - } - - /** - * Scheme should return null when scheme is not provided. - * - * @group issue53 - * - * @see https://github.com/jeremykendall/php-domain-parser/issues/53 - */ - public function testSchemeReturnsNullIfNotProvidedToParser() - { - $spec = 'google.com'; - $url = $this->parser->parseUrl($spec); - $this->assertNull($url->getScheme()); - } -} From 57ade956e07120d56187bd3b1a01ba47c7569f43 Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Tue, 3 Oct 2017 22:34:21 -0500 Subject: [PATCH 014/461] Update config for new version of php-cs-fixer --- .php_cs | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/.php_cs b/.php_cs index 033074dd..602ff979 100644 --- a/.php_cs +++ b/.php_cs @@ -1,18 +1,28 @@ in('src/') - ->in('tests/'); +$finder = PhpCsFixer\Finder::create() + ->in('src') + ->in('tests'); -return \Symfony\CS\Config\Config::create() +return PhpCsFixer\Config::create() + ->setRiskyAllowed(true) ->setUsingCache(true) - ->fixers([ - '-pre_increment', - '-concat_without_spaces', - 'concat_with_spaces', - 'ordered_use', - 'long_array_syntax', + ->setRules([ + '@PSR2' => true, + '@Symfony' => true, + 'array_syntax' => ['syntax' => 'short'], + 'concat_space' => ['spacing' => 'one'], + 'yoda_style' => false, + 'is_null' => true, + 'modernize_types_casting' => true, + 'no_alias_functions' => true, + 'ordered_imports' => true, + 'phpdoc_order' => true, + 'pre_increment' => false, + 'psr4' => true, + 'random_api_migration' => true, + 'single_blank_line_before_namespace' => false, ]) - ->finder($finder); + ->setFinder($finder); From d109c3442186d88e0514ac725cbfcdfbb60ac6ff Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Tue, 3 Oct 2017 22:34:33 -0500 Subject: [PATCH 015/461] Remove unsupported versions of PHP --- .travis.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 77f24f3c..ae93f8a5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,9 +3,6 @@ sudo: false dist: trusty php: - - '5.4' - - '5.5' - - '5.6' - '7.0' - '7.1' - nightly From 7e3f45bd765ce6fa8e0ccfb189f4d408ab159fa6 Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Tue, 3 Oct 2017 22:43:15 -0500 Subject: [PATCH 016/461] Remove bin/parse from composer --- composer.json | 1 - 1 file changed, 1 deletion(-) diff --git a/composer.json b/composer.json index 73823c4b..a24a2e46 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,6 @@ } ], "bin": [ - "bin/parse", "bin/update-psl" ], "keywords": [ From 3d96751a6aae10c20fd1d86c23c5af3a0dd8da2e Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Tue, 3 Oct 2017 22:43:32 -0500 Subject: [PATCH 017/461] Update require and require-dev --- composer.json | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index a24a2e46..55e7187d 100644 --- a/composer.json +++ b/composer.json @@ -27,17 +27,13 @@ "url parsing" ], "require": { - "php": ">=5.3.0", + "php": ">=7.0", "ext-curl": "*", - "ext-intl": "*", - "ext-mbstring": "*" + "ext-intl": "*" }, "require-dev": { - "mikey179/vfsStream": "~1.6", - "phpunit/phpunit": "~4.8", - "jeremykendall/debug-die": "0.0.1.*", - "phing/phing": "^2.13", - "fabpot/php-cs-fixer": "^1.11" + "phpunit/phpunit": "^6.3", + "mikey179/vfsStream": "^1.6" }, "autoload": { "psr-0": { From 18a67e01a99d1116a637bca01c66d227e3b87a99 Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Tue, 3 Oct 2017 22:46:09 -0500 Subject: [PATCH 018/461] Update tests for PHPUnit 6 --- tests/src/Pdp/CheckPublicSuffixTest.php | 18 ++++------ .../SeriouslyMalformedUrlExceptionTest.php | 12 +++---- .../Pdp/HttpAdapter/CurlHttpAdapterTest.php | 4 ++- tests/src/Pdp/PublicSuffixListManagerTest.php | 36 +++++++++++-------- 4 files changed, 38 insertions(+), 32 deletions(-) diff --git a/tests/src/Pdp/CheckPublicSuffixTest.php b/tests/src/Pdp/CheckPublicSuffixTest.php index a8f1bbeb..8a2fe6ea 100644 --- a/tests/src/Pdp/CheckPublicSuffixTest.php +++ b/tests/src/Pdp/CheckPublicSuffixTest.php @@ -2,6 +2,8 @@ namespace Pdp; +use PHPUnit\Framework\TestCase; + /** * This test case is based on the test data linked at * http://publicsuffix.org/list/ and provided by Rob Strading of Comodo. @@ -9,22 +11,16 @@ * @link * http://mxr.mozilla.org/mozilla-central/source/netwerk/test/unit/data/test_psl.txt?raw=1 */ -class CheckPublicSuffixTest extends \PHPUnit_Framework_TestCase +class CheckPublicSuffixTest extends TestCase { /** - * @var Parser + * @var PublicSuffixList */ - protected $parser; + private $list; protected function setUp() { - $file = realpath(dirname(__DIR__) . '/../../data/public-suffix-list.php'); - $this->parser = new Parser(new PublicSuffixList($file)); - } - - protected function tearDown() - { - $this->parser = null; + $this->list = new PublicSuffixList(); } public function testPublicSuffixSpec() @@ -142,6 +138,6 @@ public function testPublicSuffixSpec() */ public function checkPublicSuffix($input, $expected) { - $this->assertSame($expected, $this->parser->getRegistrableDomain($input)); + $this->assertSame($expected, $this->list->query($input)->getRegistrableDomain()); } } diff --git a/tests/src/Pdp/Exception/SeriouslyMalformedUrlExceptionTest.php b/tests/src/Pdp/Exception/SeriouslyMalformedUrlExceptionTest.php index 569a8806..fc4ab6cf 100644 --- a/tests/src/Pdp/Exception/SeriouslyMalformedUrlExceptionTest.php +++ b/tests/src/Pdp/Exception/SeriouslyMalformedUrlExceptionTest.php @@ -2,12 +2,14 @@ namespace Pdp\Exception; -class SeriouslyMalformedUrlExceptionTest extends \PHPUnit_Framework_TestCase +use PHPUnit\Framework\TestCase; + +class SeriouslyMalformedUrlExceptionTest extends TestCase { public function testInstanceOfPdpException() { $this->assertInstanceOf( - 'Pdp\Exception\PdpException', + PdpException::class, new SeriouslyMalformedUrlException() ); } @@ -23,10 +25,8 @@ public function testInstanceOfInvalidArgumentException() public function testMessage() { $url = 'http:///example.com'; - $this->setExpectedException( - 'Pdp\Exception\SeriouslyMalformedUrlException', - sprintf('"%s" is one seriously malformed url.', $url) - ); + $this->expectException(SeriouslyMalformedUrlException::class); + $this->expectExceptionMessage(sprintf('"%s" is one seriously malformed url.', $url)); throw new SeriouslyMalformedUrlException($url); } diff --git a/tests/src/Pdp/HttpAdapter/CurlHttpAdapterTest.php b/tests/src/Pdp/HttpAdapter/CurlHttpAdapterTest.php index fad2b634..4706555e 100644 --- a/tests/src/Pdp/HttpAdapter/CurlHttpAdapterTest.php +++ b/tests/src/Pdp/HttpAdapter/CurlHttpAdapterTest.php @@ -2,10 +2,12 @@ namespace Pdp\HttpAdapter; +use PHPUnit\Framework\TestCase; + /** * @group internet */ -class CurlHttpAdapterTest extends \PHPUnit_Framework_TestCase +class CurlHttpAdapterTest extends TestCase { /** * @var HttpAdapterInterface diff --git a/tests/src/Pdp/PublicSuffixListManagerTest.php b/tests/src/Pdp/PublicSuffixListManagerTest.php index cd46102b..4b88d241 100644 --- a/tests/src/Pdp/PublicSuffixListManagerTest.php +++ b/tests/src/Pdp/PublicSuffixListManagerTest.php @@ -4,8 +4,9 @@ use org\bovigo\vfs\vfsStream; use org\bovigo\vfs\vfsStreamDirectory; +use PHPUnit\Framework\TestCase; -class PublicSuffixListManagerTest extends \PHPUnit_Framework_TestCase +class PublicSuffixListManagerTest extends TestCase { /** * @var PublicSuffixListManager List manager @@ -146,7 +147,8 @@ public function testWritePhpCache() public function testWriteThrowsExceptionIfCanNotWrite() { - $this->setExpectedException('\Exception', "Cannot write '/does/not/exist/public-suffix-list.php'"); + $this->expectException(\Exception::class); + $this->expectExceptionMessage("Cannot write '/does/not/exist/public-suffix-list.php'"); $manager = new PublicSuffixListManager('/does/not/exist'); $manager->writePhpCache(array()); } @@ -169,10 +171,10 @@ public function testGetList() $this->cacheDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE ); $publicSuffixList = $this->listManager->getList(); - $this->assertInstanceOf('\Pdp\PublicSuffixList', $publicSuffixList); + $this->assertInstanceOf(PublicSuffixList::class, $publicSuffixList); $this->assertGreaterThanOrEqual(300, count($publicSuffixList)); - $this->assertTrue(array_key_exists('stuff-4-sale', $publicSuffixList['org']) !== false); - $this->assertTrue(array_key_exists('net', $publicSuffixList['ac']) !== false); + $this->assertTrue(array_key_exists('stuff-4-sale', $publicSuffixList->getRules()['org']) !== false); + $this->assertTrue(array_key_exists('net', $publicSuffixList->getRules()['ac']) !== false); } public function testGetListWithoutCache() @@ -182,11 +184,10 @@ public function testGetListWithoutCache() ); /** @var PublicSuffixListManager $listManager */ - $listManager = $this->getMock( - '\Pdp\PublicSuffixListManager', - array('refreshPublicSuffixList'), - array($this->cacheDir) - ); + $listManager = $this->getMockBuilder(PublicSuffixListManager::class) + ->setConstructorArgs([$this->cacheDir]) + ->setMethods(['refreshPublicSuffixList']) + ->getMock(); $dataDir = $this->dataDir; $cacheDir = $this->cacheDir; @@ -201,7 +202,7 @@ public function testGetListWithoutCache() })); $publicSuffixList = $listManager->getList(); - $this->assertInstanceOf('\Pdp\PublicSuffixList', $publicSuffixList); + $this->assertInstanceOf(PublicSuffixList::class, $publicSuffixList); } public function testGetProvidedListFromDefaultCacheDir() @@ -209,9 +210,16 @@ public function testGetProvidedListFromDefaultCacheDir() // By not providing cache I'm forcing use of default cache dir $listManager = new PublicSuffixListManager(); $publicSuffixList = $listManager->getList(); - $this->assertInstanceOf('\Pdp\PublicSuffixList', $publicSuffixList); + $this->assertInstanceOf(PublicSuffixList::class, $publicSuffixList); $this->assertGreaterThanOrEqual(300, count($publicSuffixList)); - $this->assertTrue(array_key_exists('stuff-4-sale', $publicSuffixList['org']) !== false); - $this->assertTrue(array_key_exists('net', $publicSuffixList['ac']) !== false); + $this->assertTrue(array_key_exists('stuff-4-sale', $publicSuffixList->getRules()['org']) !== false); + $this->assertTrue(array_key_exists('net', $publicSuffixList->getRules()['ac']) !== false); + } + + private function getMock(string $class) + { + return $this->getMockBuilder($class) + ->disableOriginalConstructor() + ->getMock(); } } From d972f37c5c96fbd394dce92bdda80870654bf809 Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Tue, 3 Oct 2017 22:46:25 -0500 Subject: [PATCH 019/461] New version of PublicSuffixList --- src/Pdp/PublicSuffixList.php | 188 +++++++++++++++++++-- tests/src/Pdp/PublicSuffixListTest.php | 219 +++++++++++++++++++++++++ 2 files changed, 393 insertions(+), 14 deletions(-) create mode 100644 tests/src/Pdp/PublicSuffixListTest.php diff --git a/src/Pdp/PublicSuffixList.php b/src/Pdp/PublicSuffixList.php index d05687e4..5341ad28 100644 --- a/src/Pdp/PublicSuffixList.php +++ b/src/Pdp/PublicSuffixList.php @@ -1,31 +1,191 @@ rules = include $rules; + } + + if ($rules === null) { + $this->rules = include dirname(__DIR__, 2) . '/data/public-suffix-list.php'; + } + + if (is_array($rules)) { + $this->rules = $rules; + } + $this->rules = $rules ?? include dirname(__DIR__, 2) . '/data/public-suffix-list.php'; + } + + public function query(string $domain = null): Domain + { + if (!$this->isMatchable($domain)) { + return new NullDomain(); + } + + $input = $domain; + $domain = $this->normalize($domain); + $matchingLabels = $this->findMatchingLabels($this->getLabelsReverse($domain), $this->rules); + $publicSuffix = empty($matchingLabels) ? $this->handleNoMatches($domain) : $this->processMatches($matchingLabels); + + if ($this->isPunycoded($input) === false) { + $publicSuffix = idn_to_utf8($publicSuffix, 0, INTL_IDNA_VARIANT_UTS46); + } + + if (count($matchingLabels) > 0) { + return new MatchedDomain($input, $publicSuffix, true); + } + + return new UnmatchedDomain($input, $publicSuffix, false); + } + + public function getRules(): array + { + return $this->rules; + } + + /** + * @TODO: Remove. Bandaid to fix failing test. + * + * @return int + */ + public function count(): int + { + return count($this->rules); + } + + private function isMatchable($domain): bool + { + if ($domain === null) { + return false; + } + + if ($this->hasLeadingDot($domain)) { + return false; + } + + if ($this->isSingleLabelDomain($domain)) { + return false; + } + + if ($this->isIpAddress($domain)) { + return false; + } + + return true; + } + /** - * Public constructor. + * Normalize domain. * - * @param mixed $list Array representing Public Suffix List or PHP Public Suffix List file + * "The domain must be canonicalized in the normal way for hostnames - lower-case, Punycode." + * + * @see http://www.ietf.org/rfc/rfc3492.txt + * + * @param string $domain + * + * @return string */ - public function __construct($list) + private function normalize(string $domain): string { - if (!is_array($list)) { - $list = include $list; + return strtolower(idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46)); + } + + private function findMatchingLabels(array $labels, array $rules): array + { + $matches = []; + + foreach ($labels as $label) { + if ($this->isExceptionRule($label, $rules)) { + break; + } + + if ($this->isWildcardRule($rules)) { + array_unshift($matches, $label); + break; + } + + if ($this->matchExists($label, $rules)) { + array_unshift($matches, $label); + $rules = $rules[$label]; + continue; + } + + // Avoids improper parsing when $domain's subdomain + public suffix === + // a valid public suffix (e.g. domain 'us.example.com' and public suffix 'us.com') + // + // Added by @goodhabit in https://github.com/jeremykendall/php-domain-parser/pull/15 + // Resolves https://github.com/jeremykendall/php-domain-parser/issues/16 + break; } - parent::__construct($list); + return $matches; + } + + private function processMatches(array $matches): string + { + return implode('.', array_filter($matches, 'strlen')); + } + + private function isIpAddress(string $domain): bool + { + return filter_var($domain, FILTER_VALIDATE_IP) !== false; + } + + private function isExceptionRule(string $label, array $rules): bool + { + return $this->matchExists($label, $rules) + && array_key_exists('!', $rules[$label]); + } + + private function isWildcardRule(array $rules): bool + { + return array_key_exists('*', $rules); + } + + private function matchExists(string $label, array $rules): bool + { + return array_key_exists($label, $rules); + } + + private function handleNoMatches(string $domain): string + { + $labels = $this->getLabels($domain); + + return array_pop($labels); + } + + private function isPunycoded(string $input): bool + { + return strpos($input, 'xn--') !== false; + } + + private function hasLeadingDot($domain): bool + { + return strpos($domain, '.') === 0; } } diff --git a/tests/src/Pdp/PublicSuffixListTest.php b/tests/src/Pdp/PublicSuffixListTest.php new file mode 100644 index 00000000..3d27f539 --- /dev/null +++ b/tests/src/Pdp/PublicSuffixListTest.php @@ -0,0 +1,219 @@ +list = new PublicSuffixList(); + } + + public function testNullWillReturnNullDomain() + { + $domain = $this->list->query('COM'); + $this->assertFalse($domain->isValid()); + $this->assertInstanceOf(NullDomain::class, $domain); + } + + public function testIsSuffixValidFalse() + { + $domain = $this->list->query('www.example.faketld'); + $this->assertFalse($domain->isValid()); + $this->assertInstanceOf(UnmatchedDomain::class, $domain); + } + + public function testIsSuffixValidTrue() + { + $domain = $this->list->query('www.example.com'); + $this->assertTrue($domain->isValid()); + $this->assertInstanceOf(MatchedDomain::class, $domain); + } + + /** + * @dataProvider parseDataProvider + */ + public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $domain) + { + $this->assertSame($registrableDomain, $this->list->query($domain)->getRegistrableDomain()); + } + + /** + * @dataProvider parseDataProvider + */ + public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain) + { + $this->assertSame($publicSuffix, $this->list->query($domain)->getPublicSuffix()); + } + + public function testGetPublicSuffixHandlesWrongCaseProperly() + { + $publicSuffix = 'рф'; + $domain = 'Яндекс.РФ'; + + $this->assertSame($publicSuffix, $this->list->query($domain)->getPublicSuffix()); + } + + public function testPublicSuffixSpec() + { + // Test data from Rob Stradling at Comodo + // http://mxr.mozilla.org/mozilla-central/source/netwerk/test/unit/data/test_psl.txt?raw=1 + // Any copyright is dedicated to the Public Domain. + // http://creativecommons.org/publicdomain/zero/1.0/ + + // null input. + $this->checkPublicSuffix(null, null); + // Mixed case. + $this->checkPublicSuffix('COM', null); + $this->checkPublicSuffix('example.COM', 'example.com'); + $this->checkPublicSuffix('WwW.example.COM', 'example.com'); + // Leading dot. + $this->checkPublicSuffix('.com', null); + $this->checkPublicSuffix('.example', null); + $this->checkPublicSuffix('.example.com', null); + $this->checkPublicSuffix('.example.example', null); + // Unlisted TLD. + // Addresses algorithm rule #2: If no rules match, the prevailing rule is "*". + $this->checkPublicSuffix('example', null); + $this->checkPublicSuffix('example.example', 'example.example'); + $this->checkPublicSuffix('b.example.example', 'example.example'); + $this->checkPublicSuffix('a.b.example.example', 'example.example'); + // TLD with only 1 rule. + $this->checkPublicSuffix('biz', null); + $this->checkPublicSuffix('domain.biz', 'domain.biz'); + $this->checkPublicSuffix('b.domain.biz', 'domain.biz'); + $this->checkPublicSuffix('a.b.domain.biz', 'domain.biz'); + // TLD with some 2-level rules. + $this->checkPublicSuffix('com', null); + $this->checkPublicSuffix('example.com', 'example.com'); + $this->checkPublicSuffix('b.example.com', 'example.com'); + $this->checkPublicSuffix('a.b.example.com', 'example.com'); + $this->checkPublicSuffix('uk.com', null); + $this->checkPublicSuffix('example.uk.com', 'example.uk.com'); + $this->checkPublicSuffix('b.example.uk.com', 'example.uk.com'); + $this->checkPublicSuffix('a.b.example.uk.com', 'example.uk.com'); + $this->checkPublicSuffix('test.ac', 'test.ac'); + // TLD with only 1 (wildcard) rule. + $this->checkPublicSuffix('mm', null); + $this->checkPublicSuffix('c.mm', null); + $this->checkPublicSuffix('b.c.mm', 'b.c.mm'); + $this->checkPublicSuffix('a.b.c.mm', 'b.c.mm'); + // More complex TLD. + $this->checkPublicSuffix('jp', null); + $this->checkPublicSuffix('test.jp', 'test.jp'); + $this->checkPublicSuffix('www.test.jp', 'test.jp'); + $this->checkPublicSuffix('ac.jp', null); + $this->checkPublicSuffix('test.ac.jp', 'test.ac.jp'); + $this->checkPublicSuffix('www.test.ac.jp', 'test.ac.jp'); + $this->checkPublicSuffix('kyoto.jp', null); + $this->checkPublicSuffix('test.kyoto.jp', 'test.kyoto.jp'); + $this->checkPublicSuffix('ide.kyoto.jp', null); + $this->checkPublicSuffix('b.ide.kyoto.jp', 'b.ide.kyoto.jp'); + $this->checkPublicSuffix('a.b.ide.kyoto.jp', 'b.ide.kyoto.jp'); + $this->checkPublicSuffix('c.kobe.jp', null); + $this->checkPublicSuffix('b.c.kobe.jp', 'b.c.kobe.jp'); + $this->checkPublicSuffix('a.b.c.kobe.jp', 'b.c.kobe.jp'); + $this->checkPublicSuffix('city.kobe.jp', 'city.kobe.jp'); + $this->checkPublicSuffix('www.city.kobe.jp', 'city.kobe.jp'); + // TLD with a wildcard rule and exceptions. + $this->checkPublicSuffix('ck', null); + $this->checkPublicSuffix('test.ck', null); + $this->checkPublicSuffix('b.test.ck', 'b.test.ck'); + $this->checkPublicSuffix('a.b.test.ck', 'b.test.ck'); + $this->checkPublicSuffix('www.ck', 'www.ck'); + $this->checkPublicSuffix('www.www.ck', 'www.ck'); + // US K12. + $this->checkPublicSuffix('us', null); + $this->checkPublicSuffix('test.us', 'test.us'); + $this->checkPublicSuffix('www.test.us', 'test.us'); + $this->checkPublicSuffix('ak.us', null); + $this->checkPublicSuffix('test.ak.us', 'test.ak.us'); + $this->checkPublicSuffix('www.test.ak.us', 'test.ak.us'); + $this->checkPublicSuffix('k12.ak.us', null); + $this->checkPublicSuffix('test.k12.ak.us', 'test.k12.ak.us'); + $this->checkPublicSuffix('www.test.k12.ak.us', 'test.k12.ak.us'); + // IDN labels. + $this->checkPublicSuffix('食狮.com.cn', '食狮.com.cn'); + $this->checkPublicSuffix('食狮.公司.cn', '食狮.公司.cn'); + $this->checkPublicSuffix('www.食狮.公司.cn', '食狮.公司.cn'); + $this->checkPublicSuffix('shishi.公司.cn', 'shishi.公司.cn'); + $this->checkPublicSuffix('公司.cn', null); + $this->checkPublicSuffix('食狮.中国', '食狮.中国'); + $this->checkPublicSuffix('www.食狮.中国', '食狮.中国'); + $this->checkPublicSuffix('shishi.中国', 'shishi.中国'); + $this->checkPublicSuffix('中国', null); + // Same as above, but punycoded. + $this->checkPublicSuffix('xn--85x722f.com.cn', 'xn--85x722f.com.cn'); + $this->checkPublicSuffix('xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn'); + $this->checkPublicSuffix('www.xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn'); + $this->checkPublicSuffix('shishi.xn--55qx5d.cn', 'shishi.xn--55qx5d.cn'); + $this->checkPublicSuffix('xn--55qx5d.cn', null); + $this->checkPublicSuffix('xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s'); + $this->checkPublicSuffix('www.xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s'); + $this->checkPublicSuffix('shishi.xn--fiqs8s', 'shishi.xn--fiqs8s'); + $this->checkPublicSuffix('xn--fiqs8s', null); + } + + public function parseDataProvider() + { + return [ + // public suffix, registrable domain, domain + // BEGIN https://github.com/jeremykendall/php-domain-parser/issues/16 + ['com', 'example.com', 'us.example.com'], + ['na', 'example.na', 'us.example.na'], + ['us.na', 'example.us.na', 'www.example.us.na'], + ['org', 'example.org', 'us.example.org'], + ['biz', 'broken.biz', 'webhop.broken.biz'], + ['webhop.biz', 'broken.webhop.biz', 'www.broken.webhop.biz'], + // END https://github.com/jeremykendall/php-domain-parser/issues/16 + // Test ipv6 URL + [null, null, '[::1]'], + [null, null, '[2001:db8:85a3:8d3:1319:8a2e:370:7348]'], + [null, null, '[2001:db8:85a3:8d3:1319:8a2e:370:7348]'], + // Test IP address: Fixes #43 + [null, null, '192.168.1.2'], + // Link-local addresses and zone indices + [null, null, '[fe80::3%25eth0]'], + [null, null, '[fe80::1%2511]'], + ['faketld', 'example.faketld', 'example.faketld'], + ]; + } + + /** + * Checks PublicSuffixList can return proper registrable domain. + * + * "You will need to define a checkPublicSuffix() function which takes as a + * parameter a domain name and the public suffix, runs your implementation + * on the domain name and checks the result is the public suffix expected." + * + * @see http://publicsuffix.org/list/ + * + * @param string $domain + * @param string $expected + */ + private function checkPublicSuffix($domain, $expected) + { + $this->assertSame( + $expected, + $this->list->query($domain)->getRegistrableDomain() + ); + } +} From 89eb5fe89d7def61c59b53a809eef90653f4a31c Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Tue, 3 Oct 2017 22:46:40 -0500 Subject: [PATCH 020/461] Value objects and trait --- src/Pdp/Domain.php | 59 +++++++++++++++++++++++++ src/Pdp/LabelsTrait.php | 36 ++++++++++++++++ src/Pdp/MatchedDomain.php | 84 ++++++++++++++++++++++++++++++++++++ src/Pdp/NullDomain.php | 72 +++++++++++++++++++++++++++++++ src/Pdp/UnmatchedDomain.php | 85 +++++++++++++++++++++++++++++++++++++ 5 files changed, 336 insertions(+) create mode 100644 src/Pdp/Domain.php create mode 100644 src/Pdp/LabelsTrait.php create mode 100644 src/Pdp/MatchedDomain.php create mode 100644 src/Pdp/NullDomain.php create mode 100644 src/Pdp/UnmatchedDomain.php diff --git a/src/Pdp/Domain.php b/src/Pdp/Domain.php new file mode 100644 index 00000000..e5a81e38 --- /dev/null +++ b/src/Pdp/Domain.php @@ -0,0 +1,59 @@ +getLabels($input)); + } + + private function hasLabels(string $input): bool + { + return strpos($input, '.') !== false; + } + + private function isSingleLabelDomain(string $domain): bool + { + return !$this->hasLabels($domain); + } +} diff --git a/src/Pdp/MatchedDomain.php b/src/Pdp/MatchedDomain.php new file mode 100644 index 00000000..64c1c160 --- /dev/null +++ b/src/Pdp/MatchedDomain.php @@ -0,0 +1,84 @@ +domain = $domain; + $this->publicSuffix = $publicSuffix; + $this->isValid = $isValid; + } + + public function getDomain() + { + return $this->domain; + } + + public function getPublicSuffix() + { + return $this->publicSuffix; + } + + public function isValid(): bool + { + return $this->isValid; + } + + public function getRegistrableDomain() + { + if ($this->hasRegistrableDomain($this->publicSuffix) === false) { + return null; + } + + $publicSuffixLabels = $this->getLabels($this->publicSuffix); + $domainLabels = $this->getLabels($this->domain); + $additionalLabel = $this->getAdditionalLabel($domainLabels, $publicSuffixLabels); + + return implode('.', array_merge($additionalLabel, $publicSuffixLabels)); + } + + private function hasRegistrableDomain($publicSuffix): bool + { + return !($publicSuffix === null || $this->domain === $publicSuffix || !$this->hasLabels($this->domain)); + } + + private function getAdditionalLabel($domainLabels, $publicSuffixLabels): array + { + $additionalLabel = array_slice( + $domainLabels, + count($domainLabels) - count($publicSuffixLabels) - 1, + 1 + ); + + return $additionalLabel; + } +} diff --git a/src/Pdp/NullDomain.php b/src/Pdp/NullDomain.php new file mode 100644 index 00000000..ed85a6a6 --- /dev/null +++ b/src/Pdp/NullDomain.php @@ -0,0 +1,72 @@ +domain = $domain; + $this->publicSuffix = $publicSuffix; + $this->isValid = $isValid; + } + + public function getDomain() + { + return $this->domain; + } + + public function getPublicSuffix() + { + return $this->publicSuffix; + } + + public function isValid(): bool + { + return $this->isValid; + } + + public function getRegistrableDomain() + { + if ($this->hasRegistrableDomain($this->publicSuffix) === false) { + return null; + } + + $publicSuffixLabels = $this->getLabels($this->publicSuffix); + $domainLabels = $this->getLabels($this->domain); + $additionalLabel = $this->getAdditionalLabel($domainLabels, $publicSuffixLabels); + + return implode('.', array_merge($additionalLabel, $publicSuffixLabels)); + } + + private function hasRegistrableDomain($publicSuffix): bool + { + return !($publicSuffix === null || $this->domain === $publicSuffix || !$this->hasLabels($this->domain)); + } + + private function getAdditionalLabel($domainLabels, $publicSuffixLabels): array + { + $additionalLabel = array_slice( + $domainLabels, + count($domainLabels) - count($publicSuffixLabels) - 1, + 1 + ); + + return $additionalLabel; + } +} \ No newline at end of file From 0704aea245b37d2fd25474b465cbe5cf34efcd76 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 5 Oct 2017 13:17:14 +0200 Subject: [PATCH 021/461] Adding v5 docblock (#197) * Improve Test Suite - adding tests to cover all new Object and methods - improve docblocks - normalize class file headers - improve classes typehint and return type * typo fix between repo * bugfix files credits * Improve PublicSuffixList * Improve PublicSuffixList * Improve test suite - better covers for UnmatchedDomain and Matched - improve PublicSuffixList::query method - improve hasRegistrableDomain to look like isMatchable method - removed deprecated feature (parse_url and associated files and classes) --- composer.json | 5 +- example.php | 45 ---- phpunit.xml.dist | 20 +- src/Pdp/Domain.php | 9 +- src/Pdp/Exception/PdpException.php | 15 -- .../SeriouslyMalformedUrlException.php | 35 --- src/Pdp/HttpAdapter/CurlHttpAdapter.php | 9 +- src/Pdp/HttpAdapter/HttpAdapterInterface.php | 9 +- src/Pdp/LabelsTrait.php | 43 +++- src/Pdp/MatchedDomain.php | 71 ++++-- src/Pdp/NullDomain.php | 43 +--- src/Pdp/PublicSuffixList.php | 210 +++++++++++++----- src/Pdp/PublicSuffixListManager.php | 121 ++++------ src/Pdp/UnmatchedDomain.php | 70 ++++-- src/pdp-parse-url.php | 62 ------ tests/src/Pdp/CheckPublicSuffixTest.php | 36 +-- tests/src/Pdp/DomainTest.php | 53 +++++ .../SeriouslyMalformedUrlExceptionTest.php | 33 --- .../Pdp/HttpAdapter/CurlHttpAdapterTest.php | 2 +- tests/src/Pdp/PublicSuffixListManagerTest.php | 13 +- tests/src/Pdp/PublicSuffixListTest.php | 193 +++++----------- 21 files changed, 511 insertions(+), 586 deletions(-) delete mode 100644 example.php delete mode 100644 src/Pdp/Exception/PdpException.php delete mode 100644 src/Pdp/Exception/SeriouslyMalformedUrlException.php delete mode 100644 src/pdp-parse-url.php create mode 100644 tests/src/Pdp/DomainTest.php delete mode 100644 tests/src/Pdp/Exception/SeriouslyMalformedUrlExceptionTest.php diff --git a/composer.json b/composer.json index 55e7187d..730da157 100644 --- a/composer.json +++ b/composer.json @@ -38,10 +38,7 @@ "autoload": { "psr-0": { "Pdp\\": "src/" - }, - "files": [ - "src/pdp-parse-url.php" - ] + } }, "scripts": { "post-install-cmd": "php bin/update-psl" diff --git a/example.php b/example.php deleted file mode 100644 index d8fdce00..00000000 --- a/example.php +++ /dev/null @@ -1,45 +0,0 @@ -getList()); - -// Parse a URL -$url = $parser->parseUrl('http://user:pass@www.pref.okinawa.jp:8080/path/to/page.html?query=string#fragment'); - -// Accessing elements of the URL -var_dump($url); -var_dump($url->__toString()); -var_dump($url->getPath()); -var_dump($url->getFragment()); - -// Getting the Host object from the URL -$host = $url->getHost(); - -// Accessing elements of the Host -var_dump($host); -var_dump($host->__toString()); -var_dump($host->getSubdomain()); -var_dump($host->getRegistrableDomain()); -var_dump($host->getPublicSuffix()); - -// It's possible to parse a host only, if you prefer -$host = $parser->parseHost('a.b.c.cy'); - -// Accessing elements of the Host -var_dump($host); -var_dump($host->__toString()); -var_dump($host->getSubdomain()); -var_dump($host->getRegistrableDomain()); -var_dump($host->getPublicSuffix()); - -// If you just need to know subdomain/registrable domain/public suffix info -// about a host, there are public methods available for that in the Parser -var_dump($parser->getSubdomain('www.scottwills.co.uk')); -var_dump($parser->getRegistrableDomain('www.scottwills.co.uk')); -var_dump($parser->getPublicSuffix('www.scottwills.co.uk')); diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 6f91249b..c7cb89e9 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,8 +1,8 @@ - @@ -16,14 +16,18 @@ - + + + - + + diff --git a/src/Pdp/Domain.php b/src/Pdp/Domain.php index e5a81e38..b2310cf8 100644 --- a/src/Pdp/Domain.php +++ b/src/Pdp/Domain.php @@ -1,14 +1,13 @@ getLabels($input)); } - private function hasLabels(string $input): bool + /** + * Tells whether the domain contains multiple labels + * + * @param string $domain + * + * @return bool + */ + private function hasLabels(string $domain): bool { - return strpos($input, '.') !== false; + return strpos($domain, '.') !== false; } + /** + * Tells whether the domain contains one single label + * + * @param string $domain + * + * @return bool + */ private function isSingleLabelDomain(string $domain): bool { return !$this->hasLabels($domain); diff --git a/src/Pdp/MatchedDomain.php b/src/Pdp/MatchedDomain.php index 64c1c160..f63cdbbc 100644 --- a/src/Pdp/MatchedDomain.php +++ b/src/Pdp/MatchedDomain.php @@ -1,15 +1,14 @@ domain = $domain; $this->publicSuffix = $publicSuffix; $this->isValid = $isValid; } + /** + * @inheritdoc + */ public function getDomain() { return $this->domain; } + /** + * @inheritdoc + */ public function getPublicSuffix() { return $this->publicSuffix; } + /** + * @inheritdoc + */ public function isValid(): bool { return $this->isValid; } + /** + * @inheritdoc + */ public function getRegistrableDomain() { - if ($this->hasRegistrableDomain($this->publicSuffix) === false) { + if (!$this->hasRegistrableDomain()) { return null; } @@ -66,19 +84,38 @@ public function getRegistrableDomain() return implode('.', array_merge($additionalLabel, $publicSuffixLabels)); } - private function hasRegistrableDomain($publicSuffix): bool + /** + * Tells whether the domain has a registrable domain part + * + * @return bool + */ + private function hasRegistrableDomain(): bool { - return !($publicSuffix === null || $this->domain === $publicSuffix || !$this->hasLabels($this->domain)); + if (!$this->hasLabels($this->domain)) { + return false; + } + + if ($this->publicSuffix === null) { + return false; + } + + if ($this->publicSuffix === $this->domain) { + return false; + } + + return true; } + /** + * Returns the additional label to generate the registrable domain + * + * @param string[] $domainLabels + * @param string[] $publicSuffixLabels + * + * @return string[] + */ private function getAdditionalLabel($domainLabels, $publicSuffixLabels): array { - $additionalLabel = array_slice( - $domainLabels, - count($domainLabels) - count($publicSuffixLabels) - 1, - 1 - ); - - return $additionalLabel; + return array_slice($domainLabels, count($domainLabels) - count($publicSuffixLabels) - 1, 1); } } diff --git a/src/Pdp/NullDomain.php b/src/Pdp/NullDomain.php index ed85a6a6..5cb53392 100644 --- a/src/Pdp/NullDomain.php +++ b/src/Pdp/NullDomain.php @@ -1,22 +1,20 @@ rules = include $rules; - } + $this->rules = $this->filterRules($rules); + } + /** + * Filter the rules parameter + * + * @param array|string|null $rules + * + * @throws TypeError if the $rules is not an array, a string or null + * @throws InvalidArgumentException if path does not exist or is not readable + * + * @return array + */ + private function filterRules($rules): array + { if ($rules === null) { - $this->rules = include dirname(__DIR__, 2) . '/data/public-suffix-list.php'; + return include dirname(__DIR__, 2) . '/data/public-suffix-list.php'; } if (is_array($rules)) { - $this->rules = $rules; + return $rules; } - $this->rules = $rules ?? include dirname(__DIR__, 2) . '/data/public-suffix-list.php'; - } - public function query(string $domain = null): Domain - { - if (!$this->isMatchable($domain)) { - return new NullDomain(); + if (!is_string($rules)) { + throw new TypeError(sprintf('Expected rules to be an array, a file path or null; received "%s"', is_object($rules) ? get_class($rules) : gettype($rules))); } - $input = $domain; - $domain = $this->normalize($domain); - $matchingLabels = $this->findMatchingLabels($this->getLabelsReverse($domain), $this->rules); - $publicSuffix = empty($matchingLabels) ? $this->handleNoMatches($domain) : $this->processMatches($matchingLabels); - - if ($this->isPunycoded($input) === false) { - $publicSuffix = idn_to_utf8($publicSuffix, 0, INTL_IDNA_VARIANT_UTS46); - } - - if (count($matchingLabels) > 0) { - return new MatchedDomain($input, $publicSuffix, true); + if (!is_readable($rules)) { + throw new InvalidArgumentException(sprintf('File path is not readable "%s"', $rules)); } - return new UnmatchedDomain($input, $publicSuffix, false); + return include $rules; } + /** + * Returns PSL rules + * + * @return array + */ public function getRules(): array { return $this->rules; } /** - * @TODO: Remove. Bandaid to fix failing test. + * Returns PSL public info for a given domain * - * @return int + * @param string|null $domain + * + * @return Domain */ - public function count(): int + public function query(string $domain = null): Domain { - return count($this->rules); + if (!$this->isMatchable($domain)) { + return new NullDomain(); + } + + $normalizedDomain = $this->normalize($domain); + $publicSuffix = $this->findPublicSuffix($this->getLabelsReverse($normalizedDomain)); + if ($publicSuffix === null) { + return $this->handleNoMatches($domain); + } + + return $this->handleMatches($domain, $publicSuffix); } + /** + * Tells whether the given domain is valid + * + * @param string|null $domain + * + * @return bool + */ private function isMatchable($domain): bool { if ($domain === null) { @@ -99,6 +124,30 @@ private function isMatchable($domain): bool return true; } + /** + * Tells whether the domain starts with a dot character + * + * @param string $domain + * + * @return bool + */ + private function hasLeadingDot($domain): bool + { + return strpos($domain, '.') === 0; + } + + /** + * Tells whether the submitted domain is an IP address + * + * @param string $domain + * + * @return bool + */ + private function isIpAddress(string $domain): bool + { + return filter_var($domain, FILTER_VALIDATE_IP) !== false; + } + /** * Normalize domain. * @@ -115,10 +164,18 @@ private function normalize(string $domain): string return strtolower(idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46)); } - private function findMatchingLabels(array $labels, array $rules): array + /** + * Returns the matched public suffix or null + * if none found + * + * @param array $labels + * + * @return string|null + */ + private function findPublicSuffix(array $labels) { $matches = []; - + $rules = $this->rules; foreach ($labels as $label) { if ($this->isExceptionRule($label, $rules)) { break; @@ -143,49 +200,92 @@ private function findMatchingLabels(array $labels, array $rules): array break; } - return $matches; - } - - private function processMatches(array $matches): string - { - return implode('.', array_filter($matches, 'strlen')); - } - - private function isIpAddress(string $domain): bool - { - return filter_var($domain, FILTER_VALIDATE_IP) !== false; + return empty($matches) ? null : implode('.', array_filter($matches, 'strlen')); } + /** + * Tells whether a PSL exception rule is found + * + * @param string $label + * @param array $rules + * + * @return bool + */ private function isExceptionRule(string $label, array $rules): bool { return $this->matchExists($label, $rules) && array_key_exists('!', $rules[$label]); } + /** + * Tells whether a PSL wildcard rule is found + * + * @param array $rules + * + * @return bool + */ private function isWildcardRule(array $rules): bool { return array_key_exists('*', $rules); } + /** + * Tells whether a PSL label matches the given domain label + * + * @param string $label + * @param array $rules + * + * @return bool + */ private function matchExists(string $label, array $rules): bool { return array_key_exists($label, $rules); } - private function handleNoMatches(string $domain): string + /** + * Returns the MatchedDomain value object + * + * @param string $domain + * @param string $publicSuffix + * + * @return MatchedDomain + */ + private function handleMatches(string $domain, string $publicSuffix): MatchedDomain { - $labels = $this->getLabels($domain); + if (!$this->isPunycoded($domain)) { + $publicSuffix = idn_to_utf8($publicSuffix, 0, INTL_IDNA_VARIANT_UTS46); + } - return array_pop($labels); + return new MatchedDomain($domain, $publicSuffix); } - private function isPunycoded(string $input): bool + /** + * Tells whether the domain is punycoded + * + * @param string $domain + * + * @return bool + */ + private function isPunycoded(string $domain): bool { - return strpos($input, 'xn--') !== false; + return strpos($domain, 'xn--') !== false; } - private function hasLeadingDot($domain): bool + /** + * Returns the UnmatchedDomain value object + * + * @param string $domain + * + * @return UnmatchedDomain + */ + private function handleNoMatches(string $domain): UnmatchedDomain { - return strpos($domain, '.') === 0; + $labels = $this->getLabels($domain); + $publicSuffix = array_pop($labels); + if (!$this->isPunycoded($domain) && $publicSuffix !== null) { + $publicSuffix = idn_to_utf8($publicSuffix, 0, INTL_IDNA_VARIANT_UTS46); + } + + return new UnmatchedDomain($domain, $publicSuffix); } } diff --git a/src/Pdp/PublicSuffixListManager.php b/src/Pdp/PublicSuffixListManager.php index b385033e..35a5f0aa 100644 --- a/src/Pdp/PublicSuffixListManager.php +++ b/src/Pdp/PublicSuffixListManager.php @@ -1,21 +1,20 @@ cacheDir = $cacheDir; + $this->cacheDir = $cacheDir ?? realpath(dirname(__DIR__, 2) . DIRECTORY_SEPARATOR . 'data'); } /** @@ -63,9 +51,7 @@ public function __construct($cacheDir = null) public function refreshPublicSuffixList() { $this->fetchListFromSource(); - $publicSuffixListArray = $this->parseListToArray( - $this->cacheDir . '/' . self::PDP_PSL_TEXT_FILE - ); + $publicSuffixListArray = $this->parseListToArray($this->cacheDir . '/' . self::PDP_PSL_TEXT_FILE); $this->writePhpCache($publicSuffixListArray); } @@ -74,10 +60,9 @@ public function refreshPublicSuffixList() * * @return int Number of bytes that were written to the file */ - public function fetchListFromSource() + public function fetchListFromSource(): int { - $publicSuffixList = $this->getHttpAdapter() - ->getContent($this->publicSuffixListUrl); + $publicSuffixList = $this->getHttpAdapter()->getContent($this->publicSuffixListUrl); return $this->write(self::PDP_PSL_TEXT_FILE, $publicSuffixList); } @@ -96,25 +81,21 @@ public function fetchListFromSource() * @return array Associative, multidimensional array representation of the * public suffx list */ - public function parseListToArray($textFile) + public function parseListToArray(string $textFile): array { - $data = file( - $textFile, - FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES - ); - + $data = file($textFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $data = array_filter($data, function ($line) { return strstr($line, '//') === false; }); - $publicSuffixListArray = array(); + $list = []; foreach ($data as $line) { $ruleParts = explode('.', $line); - $this->buildArray($publicSuffixListArray, $ruleParts); + $this->buildArray($list, $ruleParts); } - return $publicSuffixListArray; + return $list; } /** @@ -126,12 +107,12 @@ public function parseListToArray($textFile) * A copy of the Apache License, Version 2.0, is provided with this * distribution * - * @param array $publicSuffixListArray Initially an empty array, this eventually - * becomes the array representation of the Public Suffix List - * @param array $ruleParts One line (rule) from the Public Suffix List - * exploded on '.', or the remaining portion of that array during recursion + * @param array $publicSuffixList Initially an empty array, this eventually + * becomes the array representation of the Public Suffix List + * @param array $ruleParts One line (rule) from the Public Suffix List + * exploded on '.', or the remaining portion of that array during recursion */ - public function buildArray(array &$publicSuffixListArray, array $ruleParts) + public function buildArray(array &$publicSuffixList, array $ruleParts) { $isDomain = true; @@ -141,27 +122,19 @@ public function buildArray(array &$publicSuffixListArray, array $ruleParts) // of https://publicsuffix.org/list/ // "The domain and all rules must be canonicalized in the normal way // for hostnames - lower-case, Punycode (RFC 3492)." - if (defined('INTL_IDNA_VARIANT_UTS46')) { - $part = idn_to_ascii($part, 0, INTL_IDNA_VARIANT_UTS46); - } else { - $part = idn_to_ascii($part); - } + $part = idn_to_ascii($part, 0, INTL_IDNA_VARIANT_UTS46); if (strpos($part, '!') === 0) { $part = substr($part, 1); $isDomain = false; } - if (!array_key_exists($part, $publicSuffixListArray)) { - if ($isDomain) { - $publicSuffixListArray[$part] = array(); - } else { - $publicSuffixListArray[$part] = array('!' => ''); - } + if (!array_key_exists($part, $publicSuffixList)) { + $publicSuffixList[$part] = $isDomain ? [] : ['!' => '']; } - if ($isDomain && count($ruleParts) > 0) { - $this->buildArray($publicSuffixListArray[$part], $ruleParts); + if ($isDomain && !empty($ruleParts)) { + $this->buildArray($publicSuffixList[$part], $ruleParts); } } @@ -172,7 +145,7 @@ public function buildArray(array &$publicSuffixListArray, array $ruleParts) * * @return int Number of bytes that were written to the file */ - public function writePhpCache(array $publicSuffixList) + public function writePhpCache(array $publicSuffixList): int { $data = 'cacheDir . '/' . self::PDP_PSL_PHP_FILE)) { + $cachePath = $this->cacheDir . '/' . self::PDP_PSL_PHP_FILE; + if (!file_exists($cachePath)) { $this->refreshPublicSuffixList(); } - $this->list = new PublicSuffixList( - include $this->cacheDir . '/' . self::PDP_PSL_PHP_FILE - ); - - return $this->list; + return new PublicSuffixList(include $cachePath); } /** @@ -205,14 +175,13 @@ public function getList() * * @return int Number of bytes that were written to the file * - * @throws \Exception Throws \Exception if unable to write file + * @throws Exception if unable to write file */ - protected function write($filename, $data) + protected function write($filename, $data): int { - $result = @file_put_contents($this->cacheDir . '/' . $filename, $data); - - if ($result === false) { - throw new \Exception("Cannot write '" . $this->cacheDir . '/' . "$filename'"); + $path = $this->cacheDir . '/' . $filename; + if (($result = @file_put_contents($path, $data)) === false) { + throw new Exception(sprintf("Cannot write '%s'", $path)); } return $result; @@ -221,13 +190,11 @@ protected function write($filename, $data) /** * Returns http adapter. Returns default http adapter if one is not set. * - * @return \Pdp\HttpAdapter\HttpAdapterInterface Http adapter + * @return HttpAdapterInterface */ - public function getHttpAdapter() + public function getHttpAdapter(): HttpAdapterInterface { - if ($this->httpAdapter === null) { - $this->httpAdapter = new HttpAdapter\CurlHttpAdapter(); - } + $this->httpAdapter = $this->httpAdapter ?? new CurlHttpAdapter(); return $this->httpAdapter; } @@ -235,9 +202,9 @@ public function getHttpAdapter() /** * Sets http adapter. * - * @param \Pdp\HttpAdapter\HttpAdapterInterface $httpAdapter + * @param HttpAdapterInterface $httpAdapter */ - public function setHttpAdapter(HttpAdapter\HttpAdapterInterface $httpAdapter) + public function setHttpAdapter(HttpAdapterInterface $httpAdapter) { $this->httpAdapter = $httpAdapter; } diff --git a/src/Pdp/UnmatchedDomain.php b/src/Pdp/UnmatchedDomain.php index 574f072b..4e7f8053 100644 --- a/src/Pdp/UnmatchedDomain.php +++ b/src/Pdp/UnmatchedDomain.php @@ -1,19 +1,17 @@ domain = $domain; @@ -39,24 +44,36 @@ public function __construct(string $domain = null, string $publicSuffix = null, $this->isValid = $isValid; } + /** + * @inheritdoc + */ public function getDomain() { return $this->domain; } + /** + * @inheritdoc + */ public function getPublicSuffix() { return $this->publicSuffix; } + /** + * @inheritdoc + */ public function isValid(): bool { return $this->isValid; } + /** + * @inheritdoc + */ public function getRegistrableDomain() { - if ($this->hasRegistrableDomain($this->publicSuffix) === false) { + if (!$this->hasRegistrableDomain()) { return null; } @@ -67,19 +84,38 @@ public function getRegistrableDomain() return implode('.', array_merge($additionalLabel, $publicSuffixLabels)); } - private function hasRegistrableDomain($publicSuffix): bool + /** + * Tells whether the domain has a registrable domain part + * + * @return bool + */ + private function hasRegistrableDomain(): bool { - return !($publicSuffix === null || $this->domain === $publicSuffix || !$this->hasLabels($this->domain)); + if (!$this->hasLabels($this->domain)) { + return false; + } + + if ($this->publicSuffix === null) { + return false; + } + + if ($this->publicSuffix === $this->domain) { + return false; + } + + return true; } + /** + * Returns the additional label to generate the registrable domain + * + * @param string[] $domainLabels + * @param string[] $publicSuffixLabels + * + * @return string[] + */ private function getAdditionalLabel($domainLabels, $publicSuffixLabels): array { - $additionalLabel = array_slice( - $domainLabels, - count($domainLabels) - count($publicSuffixLabels) - 1, - 1 - ); - - return $additionalLabel; + return array_slice($domainLabels, count($domainLabels) - count($publicSuffixLabels) - 1, 1); } } \ No newline at end of file diff --git a/src/pdp-parse-url.php b/src/pdp-parse-url.php deleted file mode 100644 index 11ff60f9..00000000 --- a/src/pdp-parse-url.php +++ /dev/null @@ -1,62 +0,0 @@ - $value) { - if ($name === 'scheme') { - continue; - } - - $parts[$name] = urldecode($value); - } - } else { - $parts = urldecode($parts); - } - - return $parts; - } - } -} diff --git a/tests/src/Pdp/CheckPublicSuffixTest.php b/tests/src/Pdp/CheckPublicSuffixTest.php index 8a2fe6ea..70bc0c16 100644 --- a/tests/src/Pdp/CheckPublicSuffixTest.php +++ b/tests/src/Pdp/CheckPublicSuffixTest.php @@ -23,6 +23,24 @@ protected function setUp() $this->list = new PublicSuffixList(); } + /** + * This is my version of the checkPublicSuffix function referred to in the + * test instructions at the Public Suffix List project. + * + * "You will need to define a checkPublicSuffix() function which takes as a + * parameter a domain name and the public suffix, runs your implementation + * on the domain name and checks the result is the public suffix expected." + * + * @link http://publicsuffix.org/list/ + * + * @param string $input Domain and public suffix + * @param string $expected Expected result + */ + public function checkPublicSuffix($input, $expected) + { + $this->assertSame($expected, $this->list->query($input)->getRegistrableDomain()); + } + public function testPublicSuffixSpec() { // Test data from Rob Stradling at Comodo @@ -122,22 +140,4 @@ public function testPublicSuffixSpec() $this->checkPublicSuffix('shishi.xn--fiqs8s', 'shishi.xn--fiqs8s'); $this->checkPublicSuffix('xn--fiqs8s', null); } - - /** - * This is my version of the checkPublicSuffix function referred to in the - * test instructions at the Public Suffix List project. - * - * "You will need to define a checkPublicSuffix() function which takes as a - * parameter a domain name and the public suffix, runs your implementation - * on the domain name and checks the result is the public suffix expected." - * - * @link http://publicsuffix.org/list/ - * - * @param string $input Domain and public suffix - * @param string $expected Expected result - */ - public function checkPublicSuffix($input, $expected) - { - $this->assertSame($expected, $this->list->query($input)->getRegistrableDomain()); - } } diff --git a/tests/src/Pdp/DomainTest.php b/tests/src/Pdp/DomainTest.php new file mode 100644 index 00000000..7fafe86a --- /dev/null +++ b/tests/src/Pdp/DomainTest.php @@ -0,0 +1,53 @@ +assertNull($domain->getRegistrableDomain()); + } + + public function invalidRegistrableDomainProvider() + { + return [ + 'domain and suffix are the same' => ['co.uk', 'co.uk'], + 'publicSuffix is null' => ['example.faketld', null], + 'domain has no labels' => ['faketld', 'faketld'], + ]; + } + + /** + * @dataProvider invalidRegistrableDomainProvider + * + * @param string $domain + * @param string|null $publicSuffix + */ + public function testRegistrableDomainIsNullWithUnMatchedDomain(string $domain, $publicSuffix) + { + $domain = new UnmatchedDomain($domain, $publicSuffix); + $this->assertNull($domain->getRegistrableDomain()); + } +} diff --git a/tests/src/Pdp/Exception/SeriouslyMalformedUrlExceptionTest.php b/tests/src/Pdp/Exception/SeriouslyMalformedUrlExceptionTest.php deleted file mode 100644 index fc4ab6cf..00000000 --- a/tests/src/Pdp/Exception/SeriouslyMalformedUrlExceptionTest.php +++ /dev/null @@ -1,33 +0,0 @@ -assertInstanceOf( - PdpException::class, - new SeriouslyMalformedUrlException() - ); - } - - public function testInstanceOfInvalidArgumentException() - { - $this->assertInstanceOf( - 'InvalidArgumentException', - new SeriouslyMalformedUrlException() - ); - } - - public function testMessage() - { - $url = 'http:///example.com'; - $this->expectException(SeriouslyMalformedUrlException::class); - $this->expectExceptionMessage(sprintf('"%s" is one seriously malformed url.', $url)); - - throw new SeriouslyMalformedUrlException($url); - } -} diff --git a/tests/src/Pdp/HttpAdapter/CurlHttpAdapterTest.php b/tests/src/Pdp/HttpAdapter/CurlHttpAdapterTest.php index 4706555e..f3adc12f 100644 --- a/tests/src/Pdp/HttpAdapter/CurlHttpAdapterTest.php +++ b/tests/src/Pdp/HttpAdapter/CurlHttpAdapterTest.php @@ -30,7 +30,7 @@ protected function tearDown() public function testGetContent() { - $content = $this->adapter->getContent('http://www.google.com'); + $content = $this->adapter->getContent('https://www.google.com'); $this->assertNotNull($content); $this->assertContains('google', $content); } diff --git a/tests/src/Pdp/PublicSuffixListManagerTest.php b/tests/src/Pdp/PublicSuffixListManagerTest.php index 4b88d241..2e88b5e5 100644 --- a/tests/src/Pdp/PublicSuffixListManagerTest.php +++ b/tests/src/Pdp/PublicSuffixListManagerTest.php @@ -5,6 +5,8 @@ use org\bovigo\vfs\vfsStream; use org\bovigo\vfs\vfsStreamDirectory; use PHPUnit\Framework\TestCase; +use Pdp\HttpAdapter\CurlHttpAdapter; +use Pdp\HttpAdapter\HttpAdapterInterface; class PublicSuffixListManagerTest extends TestCase { @@ -60,7 +62,7 @@ protected function setUp() $this->listManager = new PublicSuffixListManager($this->cacheDir); - $this->httpAdapter = $this->getMock('\Pdp\HttpAdapter\HttpAdapterInterface'); + $this->httpAdapter = $this->getMock(HttpAdapterInterface::class); $this->listManager->setHttpAdapter($this->httpAdapter); } @@ -120,10 +122,7 @@ public function testFetchListFromSource() public function testGetHttpAdapterReturnsDefaultCurlAdapterIfAdapterNotSet() { $listManager = new PublicSuffixListManager($this->cacheDir); - $this->assertInstanceOf( - '\Pdp\HttpAdapter\CurlHttpAdapter', - $listManager->getHttpAdapter() - ); + $this->assertInstanceOf(CurlHttpAdapter::class, $listManager->getHttpAdapter()); } public function testWritePhpCache() @@ -172,7 +171,7 @@ public function testGetList() ); $publicSuffixList = $this->listManager->getList(); $this->assertInstanceOf(PublicSuffixList::class, $publicSuffixList); - $this->assertGreaterThanOrEqual(300, count($publicSuffixList)); + $this->assertGreaterThanOrEqual(300, count($publicSuffixList->getRules())); $this->assertTrue(array_key_exists('stuff-4-sale', $publicSuffixList->getRules()['org']) !== false); $this->assertTrue(array_key_exists('net', $publicSuffixList->getRules()['ac']) !== false); } @@ -211,7 +210,7 @@ public function testGetProvidedListFromDefaultCacheDir() $listManager = new PublicSuffixListManager(); $publicSuffixList = $listManager->getList(); $this->assertInstanceOf(PublicSuffixList::class, $publicSuffixList); - $this->assertGreaterThanOrEqual(300, count($publicSuffixList)); + $this->assertGreaterThanOrEqual(300, count($publicSuffixList->getRules())); $this->assertTrue(array_key_exists('stuff-4-sale', $publicSuffixList->getRules()['org']) !== false); $this->assertTrue(array_key_exists('net', $publicSuffixList->getRules()['ac']) !== false); } diff --git a/tests/src/Pdp/PublicSuffixListTest.php b/tests/src/Pdp/PublicSuffixListTest.php index 3d27f539..ee444a91 100644 --- a/tests/src/Pdp/PublicSuffixListTest.php +++ b/tests/src/Pdp/PublicSuffixListTest.php @@ -12,7 +12,10 @@ */ namespace Pdp; +use InvalidArgumentException; +use Pdp\PublicSuffixListManager; use PHPUnit\Framework\TestCase; +use TypeError; class PublicSuffixListTest extends TestCase { @@ -21,10 +24,30 @@ class PublicSuffixListTest extends TestCase */ private $list; + private $dataDir; + protected function setUp() { parent::setUp(); $this->list = new PublicSuffixList(); + $this->dataDir = realpath(dirname(__DIR__) . '/../../data'); + } + + public function testConstructorThrowsTypeError() + { + $this->expectException(TypeError::class); + new PublicSuffixList(new \stdClass); + } + + public function testConstructorThrowsInvalidArgumentException() + { + $this->expectException(InvalidArgumentException::class); + new PublicSuffixList('/usr/bin/foo/bar'); + } + + public function testConstructorWithFilePath() + { + $this->assertEquals($this->list, new PublicSuffixList($this->dataDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE)); } public function testNullWillReturnNullDomain() @@ -48,10 +71,18 @@ public function testIsSuffixValidTrue() $this->assertInstanceOf(MatchedDomain::class, $domain); } + public function testIsSuffixValidFalseWithPunycoded() + { + $domain = $this->list->query('www.example.xn--85x722f'); + $this->assertFalse($domain->isValid()); + $this->assertInstanceOf(UnmatchedDomain::class, $domain); + $this->assertSame('xn--85x722f', $domain->getPublicSuffix()); + } + /** * @dataProvider parseDataProvider */ - public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $domain) + public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) { $this->assertSame($registrableDomain, $this->list->query($domain)->getRegistrableDomain()); } @@ -59,117 +90,17 @@ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $dom /** * @dataProvider parseDataProvider */ - public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain) + public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, $expectedDomain) { $this->assertSame($publicSuffix, $this->list->query($domain)->getPublicSuffix()); } - public function testGetPublicSuffixHandlesWrongCaseProperly() - { - $publicSuffix = 'рф'; - $domain = 'Яндекс.РФ'; - - $this->assertSame($publicSuffix, $this->list->query($domain)->getPublicSuffix()); - } - - public function testPublicSuffixSpec() + /** + * @dataProvider parseDataProvider + */ + public function testGetDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) { - // Test data from Rob Stradling at Comodo - // http://mxr.mozilla.org/mozilla-central/source/netwerk/test/unit/data/test_psl.txt?raw=1 - // Any copyright is dedicated to the Public Domain. - // http://creativecommons.org/publicdomain/zero/1.0/ - - // null input. - $this->checkPublicSuffix(null, null); - // Mixed case. - $this->checkPublicSuffix('COM', null); - $this->checkPublicSuffix('example.COM', 'example.com'); - $this->checkPublicSuffix('WwW.example.COM', 'example.com'); - // Leading dot. - $this->checkPublicSuffix('.com', null); - $this->checkPublicSuffix('.example', null); - $this->checkPublicSuffix('.example.com', null); - $this->checkPublicSuffix('.example.example', null); - // Unlisted TLD. - // Addresses algorithm rule #2: If no rules match, the prevailing rule is "*". - $this->checkPublicSuffix('example', null); - $this->checkPublicSuffix('example.example', 'example.example'); - $this->checkPublicSuffix('b.example.example', 'example.example'); - $this->checkPublicSuffix('a.b.example.example', 'example.example'); - // TLD with only 1 rule. - $this->checkPublicSuffix('biz', null); - $this->checkPublicSuffix('domain.biz', 'domain.biz'); - $this->checkPublicSuffix('b.domain.biz', 'domain.biz'); - $this->checkPublicSuffix('a.b.domain.biz', 'domain.biz'); - // TLD with some 2-level rules. - $this->checkPublicSuffix('com', null); - $this->checkPublicSuffix('example.com', 'example.com'); - $this->checkPublicSuffix('b.example.com', 'example.com'); - $this->checkPublicSuffix('a.b.example.com', 'example.com'); - $this->checkPublicSuffix('uk.com', null); - $this->checkPublicSuffix('example.uk.com', 'example.uk.com'); - $this->checkPublicSuffix('b.example.uk.com', 'example.uk.com'); - $this->checkPublicSuffix('a.b.example.uk.com', 'example.uk.com'); - $this->checkPublicSuffix('test.ac', 'test.ac'); - // TLD with only 1 (wildcard) rule. - $this->checkPublicSuffix('mm', null); - $this->checkPublicSuffix('c.mm', null); - $this->checkPublicSuffix('b.c.mm', 'b.c.mm'); - $this->checkPublicSuffix('a.b.c.mm', 'b.c.mm'); - // More complex TLD. - $this->checkPublicSuffix('jp', null); - $this->checkPublicSuffix('test.jp', 'test.jp'); - $this->checkPublicSuffix('www.test.jp', 'test.jp'); - $this->checkPublicSuffix('ac.jp', null); - $this->checkPublicSuffix('test.ac.jp', 'test.ac.jp'); - $this->checkPublicSuffix('www.test.ac.jp', 'test.ac.jp'); - $this->checkPublicSuffix('kyoto.jp', null); - $this->checkPublicSuffix('test.kyoto.jp', 'test.kyoto.jp'); - $this->checkPublicSuffix('ide.kyoto.jp', null); - $this->checkPublicSuffix('b.ide.kyoto.jp', 'b.ide.kyoto.jp'); - $this->checkPublicSuffix('a.b.ide.kyoto.jp', 'b.ide.kyoto.jp'); - $this->checkPublicSuffix('c.kobe.jp', null); - $this->checkPublicSuffix('b.c.kobe.jp', 'b.c.kobe.jp'); - $this->checkPublicSuffix('a.b.c.kobe.jp', 'b.c.kobe.jp'); - $this->checkPublicSuffix('city.kobe.jp', 'city.kobe.jp'); - $this->checkPublicSuffix('www.city.kobe.jp', 'city.kobe.jp'); - // TLD with a wildcard rule and exceptions. - $this->checkPublicSuffix('ck', null); - $this->checkPublicSuffix('test.ck', null); - $this->checkPublicSuffix('b.test.ck', 'b.test.ck'); - $this->checkPublicSuffix('a.b.test.ck', 'b.test.ck'); - $this->checkPublicSuffix('www.ck', 'www.ck'); - $this->checkPublicSuffix('www.www.ck', 'www.ck'); - // US K12. - $this->checkPublicSuffix('us', null); - $this->checkPublicSuffix('test.us', 'test.us'); - $this->checkPublicSuffix('www.test.us', 'test.us'); - $this->checkPublicSuffix('ak.us', null); - $this->checkPublicSuffix('test.ak.us', 'test.ak.us'); - $this->checkPublicSuffix('www.test.ak.us', 'test.ak.us'); - $this->checkPublicSuffix('k12.ak.us', null); - $this->checkPublicSuffix('test.k12.ak.us', 'test.k12.ak.us'); - $this->checkPublicSuffix('www.test.k12.ak.us', 'test.k12.ak.us'); - // IDN labels. - $this->checkPublicSuffix('食狮.com.cn', '食狮.com.cn'); - $this->checkPublicSuffix('食狮.公司.cn', '食狮.公司.cn'); - $this->checkPublicSuffix('www.食狮.公司.cn', '食狮.公司.cn'); - $this->checkPublicSuffix('shishi.公司.cn', 'shishi.公司.cn'); - $this->checkPublicSuffix('公司.cn', null); - $this->checkPublicSuffix('食狮.中国', '食狮.中国'); - $this->checkPublicSuffix('www.食狮.中国', '食狮.中国'); - $this->checkPublicSuffix('shishi.中国', 'shishi.中国'); - $this->checkPublicSuffix('中国', null); - // Same as above, but punycoded. - $this->checkPublicSuffix('xn--85x722f.com.cn', 'xn--85x722f.com.cn'); - $this->checkPublicSuffix('xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn'); - $this->checkPublicSuffix('www.xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn'); - $this->checkPublicSuffix('shishi.xn--55qx5d.cn', 'shishi.xn--55qx5d.cn'); - $this->checkPublicSuffix('xn--55qx5d.cn', null); - $this->checkPublicSuffix('xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s'); - $this->checkPublicSuffix('www.xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s'); - $this->checkPublicSuffix('shishi.xn--fiqs8s', 'shishi.xn--fiqs8s'); - $this->checkPublicSuffix('xn--fiqs8s', null); + $this->assertSame($expectedDomain, $this->list->query($domain)->getDomain()); } public function parseDataProvider() @@ -177,43 +108,31 @@ public function parseDataProvider() return [ // public suffix, registrable domain, domain // BEGIN https://github.com/jeremykendall/php-domain-parser/issues/16 - ['com', 'example.com', 'us.example.com'], - ['na', 'example.na', 'us.example.na'], - ['us.na', 'example.us.na', 'www.example.us.na'], - ['org', 'example.org', 'us.example.org'], - ['biz', 'broken.biz', 'webhop.broken.biz'], - ['webhop.biz', 'broken.webhop.biz', 'www.broken.webhop.biz'], + 'com tld' => ['com', 'example.com', 'us.example.com', 'us.example.com'], + 'na tld' => ['na', 'example.na', 'us.example.na', 'us.example.na'], + 'us.na tld' => ['us.na', 'example.us.na', 'www.example.us.na', 'www.example.us.na'], + 'org tld' => ['org', 'example.org', 'us.example.org', 'us.example.org'], + 'biz tld (1)' => ['biz', 'broken.biz', 'webhop.broken.biz', 'webhop.broken.biz'], + 'biz tld (2)' => ['webhop.biz', 'broken.webhop.biz', 'www.broken.webhop.biz', 'www.broken.webhop.biz'], // END https://github.com/jeremykendall/php-domain-parser/issues/16 // Test ipv6 URL - [null, null, '[::1]'], - [null, null, '[2001:db8:85a3:8d3:1319:8a2e:370:7348]'], - [null, null, '[2001:db8:85a3:8d3:1319:8a2e:370:7348]'], + 'IP (1)' => [null, null, '[::1]', null], + 'IP (2)' => [null, null, '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', null], + 'IP (3)' => [null, null, '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', null], // Test IP address: Fixes #43 - [null, null, '192.168.1.2'], + 'IP (4)' => [null, null, '192.168.1.2', null], // Link-local addresses and zone indices - [null, null, '[fe80::3%25eth0]'], - [null, null, '[fe80::1%2511]'], - ['faketld', 'example.faketld', 'example.faketld'], + 'IP (5)' => [null, null, '[fe80::3%25eth0]', null], + 'IP (6)' => [null, null, '[fe80::1%2511]', null], + 'fake tld' => ['faketld', 'example.faketld', 'example.faketld', 'example.faketld'], ]; } - /** - * Checks PublicSuffixList can return proper registrable domain. - * - * "You will need to define a checkPublicSuffix() function which takes as a - * parameter a domain name and the public suffix, runs your implementation - * on the domain name and checks the result is the public suffix expected." - * - * @see http://publicsuffix.org/list/ - * - * @param string $domain - * @param string $expected - */ - private function checkPublicSuffix($domain, $expected) + public function testGetPublicSuffixHandlesWrongCaseProperly() { - $this->assertSame( - $expected, - $this->list->query($domain)->getRegistrableDomain() - ); + $publicSuffix = 'рф'; + $domain = 'Яндекс.РФ'; + + $this->assertSame($publicSuffix, $this->list->query($domain)->getPublicSuffix()); } } From 4c666606024f3c3b8691b7911727b61ddabb383a Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Thu, 5 Oct 2017 06:25:52 -0500 Subject: [PATCH 022/461] Fix git stash pop conflict, update assertions --- tests/src/Pdp/PublicSuffixListManagerTest.php | 29 ++++++------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/tests/src/Pdp/PublicSuffixListManagerTest.php b/tests/src/Pdp/PublicSuffixListManagerTest.php index 2e88b5e5..89bb7f91 100644 --- a/tests/src/Pdp/PublicSuffixListManagerTest.php +++ b/tests/src/Pdp/PublicSuffixListManagerTest.php @@ -4,9 +4,9 @@ use org\bovigo\vfs\vfsStream; use org\bovigo\vfs\vfsStreamDirectory; -use PHPUnit\Framework\TestCase; use Pdp\HttpAdapter\CurlHttpAdapter; use Pdp\HttpAdapter\HttpAdapterInterface; +use PHPUnit\Framework\TestCase; class PublicSuffixListManagerTest extends TestCase { @@ -46,7 +46,7 @@ class PublicSuffixListManagerTest extends TestCase protected $publicSuffixListUrl = 'https://publicsuffix.org/list/effective_tld_names.dat'; /** - * @var \Pdp\HttpAdapter\HttpAdapterInterface Http adapter + * @var HttpAdapterInterface|\PHPUnit_Framework_MockObject_MockObject Http adapter */ protected $httpAdapter; @@ -54,10 +54,10 @@ protected function setUp() { parent::setUp(); - $this->dataDir = realpath(dirname(__DIR__) . '/../../data'); + $this->dataDir = dirname(__DIR__, 3) . '/data'; $this->root = vfsStream::setup('pdp'); - vfsStream::create(array('cache' => array()), $this->root); + vfsStream::create(['cache' => []], $this->root); $this->cacheDir = vfsStream::url('pdp/cache'); $this->listManager = new PublicSuffixListManager($this->cacheDir); @@ -134,14 +134,6 @@ public function testWritePhpCache() $this->dataDir . '/' . PublicSuffixListManager::PDP_PSL_TEXT_FILE ); $this->assertGreaterThanOrEqual(230000, $this->listManager->writePhpCache($array)); - $this->assertFileExists( - $this->cacheDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE - ); - $publicSuffixList = include $this->cacheDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE; - $this->assertInternalType('array', $publicSuffixList); - $this->assertGreaterThanOrEqual(300, count($publicSuffixList)); - $this->assertTrue(array_key_exists('stuff-4-sale', $publicSuffixList['org']) !== false); - $this->assertTrue(array_key_exists('net', $publicSuffixList['ac']) !== false); } public function testWriteThrowsExceptionIfCanNotWrite() @@ -149,7 +141,7 @@ public function testWriteThrowsExceptionIfCanNotWrite() $this->expectException(\Exception::class); $this->expectExceptionMessage("Cannot write '/does/not/exist/public-suffix-list.php'"); $manager = new PublicSuffixListManager('/does/not/exist'); - $manager->writePhpCache(array()); + $manager->writePhpCache([]); } public function testParseListToArray() @@ -172,8 +164,8 @@ public function testGetList() $publicSuffixList = $this->listManager->getList(); $this->assertInstanceOf(PublicSuffixList::class, $publicSuffixList); $this->assertGreaterThanOrEqual(300, count($publicSuffixList->getRules())); - $this->assertTrue(array_key_exists('stuff-4-sale', $publicSuffixList->getRules()['org']) !== false); - $this->assertTrue(array_key_exists('net', $publicSuffixList->getRules()['ac']) !== false); + $this->assertArrayHasKey('stuff-4-sale', $publicSuffixList->getRules()['org']); + $this->assertArrayHasKey('net', $publicSuffixList->getRules()['ac']); } public function testGetListWithoutCache() @@ -182,7 +174,7 @@ public function testGetListWithoutCache() $this->cacheDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE ); - /** @var PublicSuffixListManager $listManager */ + /** @var PublicSuffixListManager|\PHPUnit_Framework_MockObject_MockObject $listManager */ $listManager = $this->getMockBuilder(PublicSuffixListManager::class) ->setConstructorArgs([$this->cacheDir]) ->setMethods(['refreshPublicSuffixList']) @@ -209,10 +201,7 @@ public function testGetProvidedListFromDefaultCacheDir() // By not providing cache I'm forcing use of default cache dir $listManager = new PublicSuffixListManager(); $publicSuffixList = $listManager->getList(); - $this->assertInstanceOf(PublicSuffixList::class, $publicSuffixList); - $this->assertGreaterThanOrEqual(300, count($publicSuffixList->getRules())); - $this->assertTrue(array_key_exists('stuff-4-sale', $publicSuffixList->getRules()['org']) !== false); - $this->assertTrue(array_key_exists('net', $publicSuffixList->getRules()['ac']) !== false); + $this->assertGreaterThanOrEqual(300, count($publicSuffixList)); } private function getMock(string $class) From eb2f6562d8bef3f6c24f43a183d8eafad3ddc94b Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Thu, 5 Oct 2017 06:29:37 -0500 Subject: [PATCH 023/461] CS fixes from php-cs-fixer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ``` jeremykendall@orgrimmar  ~/dev/jeremykendall/php-domain-parser   v5 ●✚  php-cs-fixer fix --verbose Loaded config default from "/Users/jeremykendall/dev/jeremykendall/php-domain-parser/.php_cs". Using cache file ".php_cs.cache". FFFFFFFFF.FF.FF Legend: ?-unknown, I-invalid file syntax, file ignored, S-Skipped, .-no changes, F-fixed, E-error 1) src/Pdp/Domain.php (single_blank_line_at_eof) 2) src/Pdp/HttpAdapter/CurlHttpAdapter.php (phpdoc_no_alias_tag) 3) src/Pdp/HttpAdapter/HttpAdapterInterface.php (phpdoc_no_alias_tag) 4) src/Pdp/LabelsTrait.php (phpdoc_summary) 5) src/Pdp/MatchedDomain.php (phpdoc_inline_tag, phpdoc_summary) 6) src/Pdp/NullDomain.php (phpdoc_inline_tag, single_blank_line_at_eof) 7) src/Pdp/PublicSuffixList.php (phpdoc_summary, phpdoc_align) 8) src/Pdp/PublicSuffixListManager.php (phpdoc_no_alias_tag, phpdoc_order, phpdoc_separation, phpdoc_trim, braces) 9) src/Pdp/UnmatchedDomain.php (phpdoc_inline_tag, phpdoc_summary, single_blank_line_at_eof) 10) tests/src/Pdp/CheckPublicSuffixTest.php (phpdoc_no_alias_tag) 11) tests/src/Pdp/DomainTest.php (no_unused_imports) 12) tests/src/Pdp/PublicSuffixListManagerTest.php (no_spaces_inside_parenthesis, array_syntax, method_argument_space, ordered_imports) 13) tests/src/Pdp/PublicSuffixListTest.php (new_with_braces, no_unused_imports) ``` --- src/Pdp/Domain.php | 2 +- src/Pdp/HttpAdapter/CurlHttpAdapter.php | 2 +- src/Pdp/HttpAdapter/HttpAdapterInterface.php | 2 +- src/Pdp/LabelsTrait.php | 8 +++--- src/Pdp/MatchedDomain.php | 14 ++++----- src/Pdp/NullDomain.php | 10 +++---- src/Pdp/PublicSuffixList.php | 30 ++++++++++---------- src/Pdp/PublicSuffixListManager.php | 10 +++---- src/Pdp/UnmatchedDomain.php | 16 +++++------ tests/src/Pdp/CheckPublicSuffixTest.php | 4 +-- tests/src/Pdp/DomainTest.php | 2 -- tests/src/Pdp/PublicSuffixListTest.php | 3 +- 12 files changed, 50 insertions(+), 53 deletions(-) diff --git a/src/Pdp/Domain.php b/src/Pdp/Domain.php index b2310cf8..32ceefa3 100644 --- a/src/Pdp/Domain.php +++ b/src/Pdp/Domain.php @@ -55,4 +55,4 @@ public function getRegistrableDomain(); * @return bool */ public function isValid(): bool; -} \ No newline at end of file +} diff --git a/src/Pdp/HttpAdapter/CurlHttpAdapter.php b/src/Pdp/HttpAdapter/CurlHttpAdapter.php index b2229c34..146196f8 100644 --- a/src/Pdp/HttpAdapter/CurlHttpAdapter.php +++ b/src/Pdp/HttpAdapter/CurlHttpAdapter.php @@ -17,7 +17,7 @@ * Lifted pretty much completely from William Durand's excellent Geocoder * project * - * @link https://github.com/willdurand/Geocoder Geocoder on GitHub + * @see https://github.com/willdurand/Geocoder Geocoder on GitHub * * @author William Durand * @author Jeremy Kendall diff --git a/src/Pdp/HttpAdapter/HttpAdapterInterface.php b/src/Pdp/HttpAdapter/HttpAdapterInterface.php index 867863e2..c3e44384 100644 --- a/src/Pdp/HttpAdapter/HttpAdapterInterface.php +++ b/src/Pdp/HttpAdapter/HttpAdapterInterface.php @@ -17,7 +17,7 @@ * Lifted pretty much completely from William Durand's excellent Geocoder * project * - * @link https://github.com/willdurand/Geocoder Geocoder on GitHub + * @see https://github.com/willdurand/Geocoder Geocoder on GitHub * * @author William Durand * @author Jeremy Kendall diff --git a/src/Pdp/LabelsTrait.php b/src/Pdp/LabelsTrait.php index fdf44cfa..68a2664c 100644 --- a/src/Pdp/LabelsTrait.php +++ b/src/Pdp/LabelsTrait.php @@ -14,7 +14,7 @@ trait LabelsTrait { /** - * Returns labels from input + * Returns labels from input. * * @param string $input * @@ -26,7 +26,7 @@ private function getLabels(string $input): array } /** - * Returns labels from input in reverse + * Returns labels from input in reverse. * * @param string $input * @@ -38,7 +38,7 @@ private function getLabelsReverse(string $input): array } /** - * Tells whether the domain contains multiple labels + * Tells whether the domain contains multiple labels. * * @param string $domain * @@ -50,7 +50,7 @@ private function hasLabels(string $domain): bool } /** - * Tells whether the domain contains one single label + * Tells whether the domain contains one single label. * * @param string $domain * diff --git a/src/Pdp/MatchedDomain.php b/src/Pdp/MatchedDomain.php index f63cdbbc..f0ba5502 100644 --- a/src/Pdp/MatchedDomain.php +++ b/src/Pdp/MatchedDomain.php @@ -31,7 +31,7 @@ final class MatchedDomain implements Domain private $isValid; /** - * New instance + * New instance. * * @param string|null $domain * @param string|null $publicSuffix @@ -45,7 +45,7 @@ public function __construct(string $domain = null, string $publicSuffix = null, } /** - * @inheritdoc + * {@inheritdoc} */ public function getDomain() { @@ -53,7 +53,7 @@ public function getDomain() } /** - * @inheritdoc + * {@inheritdoc} */ public function getPublicSuffix() { @@ -61,7 +61,7 @@ public function getPublicSuffix() } /** - * @inheritdoc + * {@inheritdoc} */ public function isValid(): bool { @@ -69,7 +69,7 @@ public function isValid(): bool } /** - * @inheritdoc + * {@inheritdoc} */ public function getRegistrableDomain() { @@ -85,7 +85,7 @@ public function getRegistrableDomain() } /** - * Tells whether the domain has a registrable domain part + * Tells whether the domain has a registrable domain part. * * @return bool */ @@ -107,7 +107,7 @@ private function hasRegistrableDomain(): bool } /** - * Returns the additional label to generate the registrable domain + * Returns the additional label to generate the registrable domain. * * @param string[] $domainLabels * @param string[] $publicSuffixLabels diff --git a/src/Pdp/NullDomain.php b/src/Pdp/NullDomain.php index 5cb53392..52ec66da 100644 --- a/src/Pdp/NullDomain.php +++ b/src/Pdp/NullDomain.php @@ -14,7 +14,7 @@ final class NullDomain implements Domain { /** - * @inheritdoc + * {@inheritdoc} */ public function getDomain() { @@ -22,7 +22,7 @@ public function getDomain() } /** - * @inheritdoc + * {@inheritdoc} */ public function getPublicSuffix() { @@ -30,7 +30,7 @@ public function getPublicSuffix() } /** - * @inheritdoc + * {@inheritdoc} */ public function getRegistrableDomain() { @@ -38,10 +38,10 @@ public function getRegistrableDomain() } /** - * @inheritdoc + * {@inheritdoc} */ public function isValid(): bool { return false; } -} \ No newline at end of file +} diff --git a/src/Pdp/PublicSuffixList.php b/src/Pdp/PublicSuffixList.php index 96338ff1..c39d6779 100644 --- a/src/Pdp/PublicSuffixList.php +++ b/src/Pdp/PublicSuffixList.php @@ -34,11 +34,11 @@ public function __construct($rules = null) } /** - * Filter the rules parameter + * Filter the rules parameter. * * @param array|string|null $rules * - * @throws TypeError if the $rules is not an array, a string or null + * @throws TypeError if the $rules is not an array, a string or null * @throws InvalidArgumentException if path does not exist or is not readable * * @return array @@ -65,7 +65,7 @@ private function filterRules($rules): array } /** - * Returns PSL rules + * Returns PSL rules. * * @return array */ @@ -75,7 +75,7 @@ public function getRules(): array } /** - * Returns PSL public info for a given domain + * Returns PSL public info for a given domain. * * @param string|null $domain * @@ -97,9 +97,9 @@ public function query(string $domain = null): Domain } /** - * Tells whether the given domain is valid + * Tells whether the given domain is valid. * - * @param string|null $domain + * @param string|null $domain * * @return bool */ @@ -125,7 +125,7 @@ private function isMatchable($domain): bool } /** - * Tells whether the domain starts with a dot character + * Tells whether the domain starts with a dot character. * * @param string $domain * @@ -137,7 +137,7 @@ private function hasLeadingDot($domain): bool } /** - * Tells whether the submitted domain is an IP address + * Tells whether the submitted domain is an IP address. * * @param string $domain * @@ -166,7 +166,7 @@ private function normalize(string $domain): string /** * Returns the matched public suffix or null - * if none found + * if none found. * * @param array $labels * @@ -204,7 +204,7 @@ private function findPublicSuffix(array $labels) } /** - * Tells whether a PSL exception rule is found + * Tells whether a PSL exception rule is found. * * @param string $label * @param array $rules @@ -218,7 +218,7 @@ private function isExceptionRule(string $label, array $rules): bool } /** - * Tells whether a PSL wildcard rule is found + * Tells whether a PSL wildcard rule is found. * * @param array $rules * @@ -230,7 +230,7 @@ private function isWildcardRule(array $rules): bool } /** - * Tells whether a PSL label matches the given domain label + * Tells whether a PSL label matches the given domain label. * * @param string $label * @param array $rules @@ -243,7 +243,7 @@ private function matchExists(string $label, array $rules): bool } /** - * Returns the MatchedDomain value object + * Returns the MatchedDomain value object. * * @param string $domain * @param string $publicSuffix @@ -260,7 +260,7 @@ private function handleMatches(string $domain, string $publicSuffix): MatchedDom } /** - * Tells whether the domain is punycoded + * Tells whether the domain is punycoded. * * @param string $domain * @@ -272,7 +272,7 @@ private function isPunycoded(string $domain): bool } /** - * Returns the UnmatchedDomain value object + * Returns the UnmatchedDomain value object. * * @param string $domain * diff --git a/src/Pdp/PublicSuffixListManager.php b/src/Pdp/PublicSuffixListManager.php index 35a5f0aa..562b1b4a 100644 --- a/src/Pdp/PublicSuffixListManager.php +++ b/src/Pdp/PublicSuffixListManager.php @@ -41,7 +41,7 @@ class PublicSuffixListManager */ public function __construct(string $cacheDir = null) { - $this->cacheDir = $cacheDir ?? realpath(dirname(__DIR__, 2) . DIRECTORY_SEPARATOR . 'data'); + $this->cacheDir = $cacheDir ?? realpath(dirname(__DIR__, 2) . DIRECTORY_SEPARATOR . 'data'); } /** @@ -72,7 +72,7 @@ public function fetchListFromSource(): int * * This method is based heavily on the code found in generateEffectiveTLDs.php * - * @link https://github.com/usrflo/registered-domain-libs/blob/master/generateEffectiveTLDs.php + * @see https://github.com/usrflo/registered-domain-libs/blob/master/generateEffectiveTLDs.php * A copy of the Apache License, Version 2.0, is provided with this * distribution * @@ -103,7 +103,7 @@ public function parseListToArray(string $textFile): array * * This method is based heavily on the code found in generateEffectiveTLDs.php * - * @link https://github.com/usrflo/registered-domain-libs/blob/master/generateEffectiveTLDs.php + * @see https://github.com/usrflo/registered-domain-libs/blob/master/generateEffectiveTLDs.php * A copy of the Apache License, Version 2.0, is provided with this * distribution * @@ -173,9 +173,9 @@ public function getList(): PublicSuffixList * @param string $filename Filename in cache dir where data will be written * @param mixed $data Data to write * - * @return int Number of bytes that were written to the file - * * @throws Exception if unable to write file + * + * @return int Number of bytes that were written to the file */ protected function write($filename, $data): int { diff --git a/src/Pdp/UnmatchedDomain.php b/src/Pdp/UnmatchedDomain.php index 4e7f8053..8b642d31 100644 --- a/src/Pdp/UnmatchedDomain.php +++ b/src/Pdp/UnmatchedDomain.php @@ -31,7 +31,7 @@ final class UnmatchedDomain implements Domain private $isValid; /** - * New instance + * New instance. * * @param string|null $domain * @param string|null $publicSuffix @@ -45,7 +45,7 @@ public function __construct(string $domain = null, string $publicSuffix = null, } /** - * @inheritdoc + * {@inheritdoc} */ public function getDomain() { @@ -53,7 +53,7 @@ public function getDomain() } /** - * @inheritdoc + * {@inheritdoc} */ public function getPublicSuffix() { @@ -61,7 +61,7 @@ public function getPublicSuffix() } /** - * @inheritdoc + * {@inheritdoc} */ public function isValid(): bool { @@ -69,7 +69,7 @@ public function isValid(): bool } /** - * @inheritdoc + * {@inheritdoc} */ public function getRegistrableDomain() { @@ -85,7 +85,7 @@ public function getRegistrableDomain() } /** - * Tells whether the domain has a registrable domain part + * Tells whether the domain has a registrable domain part. * * @return bool */ @@ -107,7 +107,7 @@ private function hasRegistrableDomain(): bool } /** - * Returns the additional label to generate the registrable domain + * Returns the additional label to generate the registrable domain. * * @param string[] $domainLabels * @param string[] $publicSuffixLabels @@ -118,4 +118,4 @@ private function getAdditionalLabel($domainLabels, $publicSuffixLabels): array { return array_slice($domainLabels, count($domainLabels) - count($publicSuffixLabels) - 1, 1); } -} \ No newline at end of file +} diff --git a/tests/src/Pdp/CheckPublicSuffixTest.php b/tests/src/Pdp/CheckPublicSuffixTest.php index 70bc0c16..8f07eebe 100644 --- a/tests/src/Pdp/CheckPublicSuffixTest.php +++ b/tests/src/Pdp/CheckPublicSuffixTest.php @@ -8,7 +8,7 @@ * This test case is based on the test data linked at * http://publicsuffix.org/list/ and provided by Rob Strading of Comodo. * - * @link + * @see * http://mxr.mozilla.org/mozilla-central/source/netwerk/test/unit/data/test_psl.txt?raw=1 */ class CheckPublicSuffixTest extends TestCase @@ -31,7 +31,7 @@ protected function setUp() * parameter a domain name and the public suffix, runs your implementation * on the domain name and checks the result is the public suffix expected." * - * @link http://publicsuffix.org/list/ + * @see http://publicsuffix.org/list/ * * @param string $input Domain and public suffix * @param string $expected Expected result diff --git a/tests/src/Pdp/DomainTest.php b/tests/src/Pdp/DomainTest.php index 7fafe86a..5c88f478 100644 --- a/tests/src/Pdp/DomainTest.php +++ b/tests/src/Pdp/DomainTest.php @@ -12,8 +12,6 @@ */ namespace Pdp; -use Pdp\MatchedDomain; -use Pdp\UnmatchedDomain; use PHPUnit\Framework\TestCase; class DomainTest extends TestCase diff --git a/tests/src/Pdp/PublicSuffixListTest.php b/tests/src/Pdp/PublicSuffixListTest.php index ee444a91..a0e56d70 100644 --- a/tests/src/Pdp/PublicSuffixListTest.php +++ b/tests/src/Pdp/PublicSuffixListTest.php @@ -13,7 +13,6 @@ namespace Pdp; use InvalidArgumentException; -use Pdp\PublicSuffixListManager; use PHPUnit\Framework\TestCase; use TypeError; @@ -36,7 +35,7 @@ protected function setUp() public function testConstructorThrowsTypeError() { $this->expectException(TypeError::class); - new PublicSuffixList(new \stdClass); + new PublicSuffixList(new \stdClass()); } public function testConstructorThrowsInvalidArgumentException() From 809aecb1c3ab6a6bf77609570b7f2e3106d00efc Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Thu, 5 Oct 2017 06:31:18 -0500 Subject: [PATCH 024/461] Latest version of PSL --- data/public-suffix-list.php | 2870 ++++++++++++++++++++++++++++------- data/public-suffix-list.txt | 1851 ++++++++++++++++------ 2 files changed, 3698 insertions(+), 1023 deletions(-) diff --git a/data/public-suffix-list.php b/data/public-suffix-list.php index 49e02d86..d63dbabf 100644 --- a/data/public-suffix-list.php +++ b/data/public-suffix-list.php @@ -53,6 +53,9 @@ 'blogspot' => array ( ), + 'nom' => + array ( + ), ), 'aero' => array ( @@ -368,6 +371,9 @@ 'org' => array ( ), + 'nom' => + array ( + ), ), 'al' => array ( @@ -392,6 +398,9 @@ 'blogspot' => array ( ), + 'nom' => + array ( + ), ), 'am' => array ( @@ -446,6 +455,9 @@ 'mil' => array ( ), + 'musica' => + array ( + ), 'net' => array ( ), @@ -485,6 +497,9 @@ ), 'asia' => array ( + 'cloudns' => + array ( + ), ), 'at' => array ( @@ -503,6 +518,33 @@ 'or' => array ( ), + 'futurecms' => + array ( + '*' => + array ( + ), + ), + 'futurehosting' => + array ( + ), + 'futuremailing' => + array ( + ), + 'ortsinfo' => + array ( + 'ex' => + array ( + '*' => + array ( + ), + ), + 'kunden' => + array ( + '*' => + array ( + ), + ), + ), 'biz' => array ( ), @@ -512,6 +554,18 @@ 'priv' => array ( ), + '12hp' => + array ( + ), + '2ix' => + array ( + ), + '4lima' => + array ( + ), + 'lima-city' => + array ( + ), ), 'au' => array ( @@ -662,10 +716,7 @@ ), 'ba' => array ( - 'org' => - array ( - ), - 'net' => + 'com' => array ( ), 'edu' => @@ -677,19 +728,10 @@ 'mil' => array ( ), - 'unsa' => - array ( - ), - 'unbi' => - array ( - ), - 'co' => - array ( - ), - 'com' => + 'net' => array ( ), - 'rs' => + 'org' => array ( ), 'blogspot' => @@ -743,6 +785,12 @@ 'blogspot' => array ( ), + 'transurl' => + array ( + '*' => + array ( + ), + ), ), 'bf' => array ( @@ -863,6 +911,9 @@ 'blogspot' => array ( ), + 'barsy' => + array ( + ), ), 'bh' => array ( @@ -902,6 +953,9 @@ ), 'biz' => array ( + 'cloudns' => + array ( + ), 'dyndns' => array ( ), @@ -923,6 +977,15 @@ 'webhop' => array ( ), + 'mmafan' => + array ( + ), + 'myftp' => + array ( + ), + 'no-ip' => + array ( + ), 'dscloud' => array ( ), @@ -998,6 +1061,9 @@ ), 'br' => array ( + 'abc' => + array ( + ), 'adm' => array ( ), @@ -1007,9 +1073,15 @@ 'agr' => array ( ), + 'aju' => + array ( + ), 'am' => array ( ), + 'aparecida' => + array ( + ), 'arq' => array ( ), @@ -1022,6 +1094,9 @@ 'b' => array ( ), + 'belem' => + array ( + ), 'bio' => array ( ), @@ -1031,6 +1106,9 @@ 'bmd' => array ( ), + 'bsb' => + array ( + ), 'cim' => array ( ), @@ -1049,6 +1127,15 @@ 'coop' => array ( ), + 'cri' => + array ( + ), + 'cuiaba' => + array ( + ), + 'def' => + array ( + ), 'ecn' => array ( ), @@ -1079,6 +1166,12 @@ 'flog' => array ( ), + 'floripa' => + array ( + ), + 'fortal' => + array ( + ), 'fm' => array ( ), @@ -1098,6 +1191,90 @@ array ( ), 'gov' => + array ( + 'ac' => + array ( + ), + 'al' => + array ( + ), + 'am' => + array ( + ), + 'ap' => + array ( + ), + 'ba' => + array ( + ), + 'ce' => + array ( + ), + 'df' => + array ( + ), + 'es' => + array ( + ), + 'go' => + array ( + ), + 'ma' => + array ( + ), + 'mg' => + array ( + ), + 'ms' => + array ( + ), + 'mt' => + array ( + ), + 'pa' => + array ( + ), + 'pb' => + array ( + ), + 'pe' => + array ( + ), + 'pi' => + array ( + ), + 'pr' => + array ( + ), + 'rj' => + array ( + ), + 'rn' => + array ( + ), + 'ro' => + array ( + ), + 'rr' => + array ( + ), + 'rs' => + array ( + ), + 'sc' => + array ( + ), + 'se' => + array ( + ), + 'sp' => + array ( + ), + 'to' => + array ( + ), + ), + 'gru' => array ( ), 'imb' => @@ -1109,6 +1286,9 @@ 'inf' => array ( ), + 'jampa' => + array ( + ), 'jor' => array ( ), @@ -1117,10 +1297,100 @@ ), 'leg' => array ( + 'ac' => + array ( + ), + 'al' => + array ( + ), + 'am' => + array ( + ), + 'ap' => + array ( + ), + 'ba' => + array ( + ), + 'ce' => + array ( + ), + 'df' => + array ( + ), + 'es' => + array ( + ), + 'go' => + array ( + ), + 'ma' => + array ( + ), + 'mg' => + array ( + ), + 'ms' => + array ( + ), + 'mt' => + array ( + ), + 'pa' => + array ( + ), + 'pb' => + array ( + ), + 'pe' => + array ( + ), + 'pi' => + array ( + ), + 'pr' => + array ( + ), + 'rj' => + array ( + ), + 'rn' => + array ( + ), + 'ro' => + array ( + ), + 'rr' => + array ( + ), + 'rs' => + array ( + ), + 'sc' => + array ( + ), + 'se' => + array ( + ), + 'sp' => + array ( + ), + 'to' => + array ( + ), ), 'lel' => array ( ), + 'londrina' => + array ( + ), + 'macapa' => + array ( + ), + 'maceio' => + array ( + ), 'mat' => array ( ), @@ -1136,9 +1406,15 @@ 'mus' => array ( ), + 'natal' => + array ( + ), 'net' => array ( ), + 'niteroi' => + array ( + ), 'nom' => array ( '*' => @@ -1157,6 +1433,15 @@ 'org' => array ( ), + 'osasco' => + array ( + ), + 'palmas' => + array ( + ), + 'poa' => + array ( + ), 'ppg' => array ( ), @@ -1178,6 +1463,15 @@ 'rec' => array ( ), + 'recife' => + array ( + ), + 'riobranco' => + array ( + ), + 'sjc' => + array ( + ), 'slg' => array ( ), @@ -1202,9 +1496,15 @@ 'tv' => array ( ), + 'udi' => + array ( + ), 'vet' => array ( ), + 'vix' => + array ( + ), 'vlog' => array ( ), @@ -1232,6 +1532,9 @@ 'gov' => array ( ), + 'we' => + array ( + ), ), 'bt' => array ( @@ -1280,6 +1583,9 @@ 'of' => array ( ), + 'nym' => + array ( + ), ), 'bz' => array ( @@ -1301,6 +1607,9 @@ 'za' => array ( ), + 'nym' => + array ( + ), ), 'ca' => array ( @@ -1349,18 +1658,30 @@ 'gc' => array ( ), + 'awdev' => + array ( + '*' => + array ( + ), + ), 'co' => array ( ), 'blogspot' => array ( ), + 'no-ip' => + array ( + ), ), 'cat' => array ( ), 'cc' => array ( + 'cloudns' => + array ( + ), 'ftpaccess' => array ( ), @@ -1373,6 +1694,12 @@ 'scrapping' => array ( ), + 'twmail' => + array ( + ), + 'fantasyleague' => + array ( + ), ), 'cd' => array ( @@ -1391,9 +1718,27 @@ ), 'ch' => array ( + 'square7' => + array ( + ), 'blogspot' => array ( ), + 'gotdns' => + array ( + ), + '12hp' => + array ( + ), + '2ix' => + array ( + ), + '4lima' => + array ( + ), + 'lima-city' => + array ( + ), ), 'ci' => array ( @@ -1470,6 +1815,9 @@ 'blogspot' => array ( ), + 'nom' => + array ( + ), ), 'cm' => array ( @@ -1495,6 +1843,24 @@ array ( 'amazonaws' => array ( + 'compute' => + array ( + '*' => + array ( + ), + ), + 'eb' => + array ( + 'cn-north-1' => + array ( + ), + ), + 'elb' => + array ( + '*' => + array ( + ), + ), 'cn-north-1' => array ( 's3' => @@ -1629,15 +1995,6 @@ 'tw' => array ( ), - 'amazonaws' => - array ( - 'compute' => - array ( - 'cn-north-1' => - array ( - ), - ), - ), ), 'co' => array ( @@ -1683,6 +2040,9 @@ 'web' => array ( ), + 'nodum' => + array ( + ), ), 'com' => array ( @@ -1690,101 +2050,302 @@ array ( 'compute' => array ( - 'ap-northeast-1' => + '*' => + array ( + ), + ), + 'compute-1' => + array ( + '*' => array ( ), - 'ap-southeast-1' => + ), + 'us-east-1' => + array ( + 'dualstack' => array ( + 's3' => + array ( + ), ), - 'ap-southeast-2' => + ), + 'elb' => + array ( + '*' => array ( ), - 'eu-west-1' => + ), + 's3' => + array ( + ), + 's3-ap-northeast-1' => + array ( + ), + 's3-ap-northeast-2' => + array ( + ), + 's3-ap-south-1' => + array ( + ), + 's3-ap-southeast-1' => + array ( + ), + 's3-ap-southeast-2' => + array ( + ), + 's3-ca-central-1' => + array ( + ), + 's3-eu-central-1' => + array ( + ), + 's3-eu-west-1' => + array ( + ), + 's3-eu-west-2' => + array ( + ), + 's3-external-1' => + array ( + ), + 's3-fips-us-gov-west-1' => + array ( + ), + 's3-sa-east-1' => + array ( + ), + 's3-us-gov-west-1' => + array ( + ), + 's3-us-east-2' => + array ( + ), + 's3-us-west-1' => + array ( + ), + 's3-us-west-2' => + array ( + ), + 'ap-northeast-2' => + array ( + 's3' => array ( ), - 'eu-central-1' => + 'dualstack' => array ( + 's3' => + array ( + ), ), - 'sa-east-1' => + 's3-website' => array ( ), - 'us-gov-west-1' => + ), + 'ap-south-1' => + array ( + 's3' => array ( ), - 'us-west-1' => + 'dualstack' => array ( + 's3' => + array ( + ), ), - 'us-west-2' => + 's3-website' => array ( ), ), - 'compute-1' => + 'ca-central-1' => array ( - 'z-1' => + 's3' => + array ( + ), + 'dualstack' => array ( + 's3' => + array ( + ), ), - 'z-2' => + 's3-website' => array ( ), ), - 'us-east-1' => + 'eu-central-1' => array ( + 's3' => + array ( + ), + 'dualstack' => + array ( + 's3' => + array ( + ), + ), + 's3-website' => + array ( + ), ), - 'elb' => + 'eu-west-2' => array ( + 's3' => + array ( + ), + 'dualstack' => + array ( + 's3' => + array ( + ), + ), + 's3-website' => + array ( + ), ), - 's3' => + 'us-east-2' => array ( + 's3' => + array ( + ), + 'dualstack' => + array ( + 's3' => + array ( + ), + ), + 's3-website' => + array ( + ), ), - 's3-ap-northeast-1' => + 'ap-northeast-1' => array ( + 'dualstack' => + array ( + 's3' => + array ( + ), + ), ), - 's3-ap-southeast-1' => + 'ap-southeast-1' => array ( + 'dualstack' => + array ( + 's3' => + array ( + ), + ), ), - 's3-ap-southeast-2' => + 'ap-southeast-2' => array ( + 'dualstack' => + array ( + 's3' => + array ( + ), + ), ), - 's3-external-1' => + 'eu-west-1' => array ( + 'dualstack' => + array ( + 's3' => + array ( + ), + ), ), - 's3-external-2' => + 'sa-east-1' => array ( + 'dualstack' => + array ( + 's3' => + array ( + ), + ), ), - 's3-fips-us-gov-west-1' => + 's3-website-us-east-1' => array ( ), - 's3-eu-central-1' => + 's3-website-us-west-1' => array ( ), - 's3-eu-west-1' => + 's3-website-us-west-2' => array ( ), - 's3-sa-east-1' => + 's3-website-ap-northeast-1' => array ( ), - 's3-us-gov-west-1' => + 's3-website-ap-southeast-1' => array ( ), - 's3-us-west-1' => + 's3-website-ap-southeast-2' => array ( ), - 's3-us-west-2' => + 's3-website-eu-west-1' => array ( ), - 'eu-central-1' => + 's3-website-sa-east-1' => array ( - 's3' => - array ( - ), ), ), 'elasticbeanstalk' => + array ( + 'ap-northeast-1' => + array ( + ), + 'ap-northeast-2' => + array ( + ), + 'ap-south-1' => + array ( + ), + 'ap-southeast-1' => + array ( + ), + 'ap-southeast-2' => + array ( + ), + 'ca-central-1' => + array ( + ), + 'eu-central-1' => + array ( + ), + 'eu-west-1' => + array ( + ), + 'eu-west-2' => + array ( + ), + 'sa-east-1' => + array ( + ), + 'us-east-1' => + array ( + ), + 'us-east-2' => + array ( + ), + 'us-gov-west-1' => + array ( + ), + 'us-west-1' => + array ( + ), + 'us-west-2' => + array ( + ), + ), + 'on-aptible' => + array ( + ), + 'myasustor' => array ( ), 'betainabox' => array ( ), + 'bplaced' => + array ( + ), 'ar' => array ( ), @@ -1851,12 +2412,24 @@ 'co' => array ( ), + 'xenapponazure' => + array ( + ), + 'jdevcloud' => + array ( + ), + 'wpdevcloud' => + array ( + ), 'cloudcontrolled' => array ( ), 'cloudcontrolapp' => array ( ), + 'drayddns' => + array ( + ), 'dreamhosters' => array ( ), @@ -2313,34 +2886,106 @@ 'writesthisblog' => array ( ), - 'firebaseapp' => + 'ddnsfree' => array ( ), - 'flynnhub' => + 'ddnsgeek' => array ( ), - 'githubusercontent' => + 'giize' => array ( ), - 'ro' => + 'gleeze' => array ( ), - 'appspot' => + 'kozow' => array ( ), - 'blogspot' => + 'loseyourip' => array ( ), - 'codespot' => + 'ooguy' => array ( ), - 'googleapis' => + 'theworkpc' => array ( ), - 'googlecode' => + 'mytuleap' => array ( ), - 'pagespeedmobilizer' => + 'evennode' => + array ( + 'eu-1' => + array ( + ), + 'eu-2' => + array ( + ), + 'eu-3' => + array ( + ), + 'eu-4' => + array ( + ), + 'us-1' => + array ( + ), + 'us-2' => + array ( + ), + 'us-3' => + array ( + ), + 'us-4' => + array ( + ), + ), + 'fbsbx' => + array ( + 'apps' => + array ( + ), + ), + 'firebaseapp' => + array ( + ), + 'flynnhub' => + array ( + ), + 'freebox-os' => + array ( + ), + 'freeboxos' => + array ( + ), + 'githubusercontent' => + array ( + ), + '0emm' => + array ( + '*' => + array ( + ), + ), + 'appspot' => + array ( + ), + 'blogspot' => + array ( + ), + 'codespot' => + array ( + ), + 'googleapis' => + array ( + ), + 'googlecode' => + array ( + ), + 'pagespeedmobilizer' => + array ( + ), + 'publishproxy' => array ( ), 'withgoogle' => @@ -2355,18 +3000,162 @@ 'herokussl' => array ( ), + 'pixolino' => + array ( + ), + 'joyent' => + array ( + 'cns' => + array ( + '*' => + array ( + ), + ), + ), + 'barsyonline' => + array ( + ), + 'meteorapp' => + array ( + 'eu' => + array ( + ), + ), + 'bitballoon' => + array ( + ), + 'netlify' => + array ( + ), '4u' => array ( ), 'nfshost' => array ( ), + 'blogsyte' => + array ( + ), + 'ciscofreak' => + array ( + ), + 'damnserver' => + array ( + ), + 'ditchyourip' => + array ( + ), + 'dnsiskinky' => + array ( + ), + 'dynns' => + array ( + ), + 'geekgalaxy' => + array ( + ), + 'health-carereform' => + array ( + ), + 'homesecuritymac' => + array ( + ), + 'homesecuritypc' => + array ( + ), + 'myactivedirectory' => + array ( + ), + 'mysecuritycamera' => + array ( + ), + 'net-freaks' => + array ( + ), + 'onthewifi' => + array ( + ), + 'point2this' => + array ( + ), + 'quicksytes' => + array ( + ), + 'securitytactics' => + array ( + ), + 'serveexchange' => + array ( + ), + 'servehumour' => + array ( + ), + 'servep2p' => + array ( + ), + 'servesarcasm' => + array ( + ), + 'stufftoread' => + array ( + ), + 'unusualperson' => + array ( + ), + 'workisboring' => + array ( + ), + '3utilities' => + array ( + ), + 'ddnsking' => + array ( + ), + 'myvnc' => + array ( + ), + 'servebeer' => + array ( + ), + 'servecounterstrike' => + array ( + ), + 'serveftp' => + array ( + ), + 'servegame' => + array ( + ), + 'servehalflife' => + array ( + ), + 'servehttp' => + array ( + ), + 'serveirc' => + array ( + ), + 'servemp3' => + array ( + ), + 'servepics' => + array ( + ), + 'servequake' => + array ( + ), 'operaunite' => array ( ), 'outsystemscloud' => array ( ), + 'ownprovider' => + array ( + ), + 'pgfog' => + array ( + ), 'pagefrontapp' => array ( ), @@ -2382,19 +3171,61 @@ 'qa2' => array ( ), + 'dev-myqnapcloud' => + array ( + ), + 'alpha-myqnapcloud' => + array ( + ), + 'myqnapcloud' => + array ( + ), + 'quipelements' => + array ( + '*' => + array ( + ), + ), 'rackmaze' => array ( ), 'rhcloud' => array ( ), + 'logoip' => + array ( + ), + 'firewall-gateway' => + array ( + ), + 'myshopblocks' => + array ( + ), + '1kapp' => + array ( + ), + 'appchizi' => + array ( + ), + 'applinzi' => + array ( + ), 'sinaapp' => array ( ), 'vipsinaapp' => array ( ), - '1kapp' => + 'bounty-full' => + array ( + 'alpha' => + array ( + ), + 'beta' => + array ( + ), + ), + 'temp-dns' => array ( ), 'dsmynas' => @@ -2403,9 +3234,18 @@ 'familyds' => array ( ), + 'bloxcms' => + array ( + ), + 'townnews-staging' => + array ( + ), 'hk' => array ( ), + 'remotewd' => + array ( + ), 'yolasite' => array ( ), @@ -2487,6 +3327,9 @@ 'ath' => array ( ), + 'info' => + array ( + ), ), 'cy' => array ( @@ -2538,15 +3381,57 @@ 'co' => array ( ), + 'realm' => + array ( + ), + 'e4' => + array ( + ), 'blogspot' => array ( ), + 'metacentrum' => + array ( + 'cloud' => + array ( + ), + 'custom' => + array ( + ), + ), ), 'de' => array ( + 'bplaced' => + array ( + ), + 'square7' => + array ( + ), 'com' => array ( ), + 'cosidns' => + array ( + 'dyn' => + array ( + ), + ), + 'dynamisches-dns' => + array ( + ), + 'dnsupdater' => + array ( + ), + 'internet-dns' => + array ( + ), + 'l-o-g-i-n' => + array ( + ), + 'dnshome' => + array ( + ), 'fuettertdasnetz' => array ( ), @@ -2565,55 +3450,175 @@ 'traeumtgerade' => array ( ), - 'blogspot' => + 'ddnss' => array ( + 'dyn' => + array ( + ), + 'dyndns' => + array ( + ), ), - ), - 'dj' => - array ( - ), - 'dk' => - array ( - 'blogspot' => + 'dyndns1' => array ( ), - ), - 'dm' => - array ( - 'com' => + 'dyn-ip24' => array ( ), - 'net' => + 'home-webserver' => array ( + 'dyn' => + array ( + ), ), - 'org' => + 'myhome-server' => array ( ), - 'edu' => + 'goip' => array ( ), - 'gov' => + 'blogspot' => array ( ), - ), - 'do' => - array ( - 'art' => + 'keymachine' => array ( ), - 'com' => + 'git-repos' => array ( ), - 'edu' => + 'lcube-server' => array ( ), - 'gob' => + 'svn-repos' => array ( ), - 'gov' => + 'barsy' => array ( ), - 'mil' => + 'logoip' => + array ( + ), + 'firewall-gateway' => + array ( + ), + 'my-gateway' => + array ( + ), + 'my-router' => + array ( + ), + 'spdns' => + array ( + ), + 'taifun-dns' => + array ( + ), + '12hp' => + array ( + ), + '2ix' => + array ( + ), + '4lima' => + array ( + ), + 'lima-city' => + array ( + ), + 'dd-dns' => + array ( + ), + 'dray-dns' => + array ( + ), + 'draydns' => + array ( + ), + 'dyn-vpn' => + array ( + ), + 'dynvpn' => + array ( + ), + 'mein-vigor' => + array ( + ), + 'my-vigor' => + array ( + ), + 'my-wan' => + array ( + ), + 'syno-ds' => + array ( + ), + 'synology-diskstation' => + array ( + ), + 'synology-ds' => + array ( + ), + ), + 'dj' => + array ( + ), + 'dk' => + array ( + 'biz' => + array ( + ), + 'co' => + array ( + ), + 'firm' => + array ( + ), + 'reg' => + array ( + ), + 'store' => + array ( + ), + 'blogspot' => + array ( + ), + ), + 'dm' => + array ( + 'com' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + ), + 'do' => + array ( + 'art' => + array ( + ), + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gob' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => array ( ), 'net' => @@ -2823,12 +3828,39 @@ ), 'eu' => array ( + 'mycd' => + array ( + ), + 'cloudns' => + array ( + ), + 'barsy' => + array ( + ), + 'wellbeingzone' => + array ( + ), + 'spdns' => + array ( + ), + 'transurl' => + array ( + '*' => + array ( + ), + ), + 'diskstation' => + array ( + ), ), 'fi' => array ( 'aland' => array ( ), + 'dy' => + array ( + ), 'blogspot' => array ( ), @@ -2925,9 +3957,27 @@ 'veterinaire' => array ( ), + 'fbx-os' => + array ( + ), + 'fbxos' => + array ( + ), + 'freebox-os' => + array ( + ), + 'freeboxos' => + array ( + ), 'blogspot' => array ( ), + 'on-web' => + array ( + ), + 'chirurgiens-dentistes-en-france' => + array ( + ), ), 'ga' => array ( @@ -2937,6 +3987,9 @@ ), 'gd' => array ( + 'nom' => + array ( + ), ), 'ge' => array ( @@ -2976,6 +4029,9 @@ 'org' => array ( ), + 'cya' => + array ( + ), ), 'gh' => array ( @@ -3033,6 +4089,9 @@ 'org' => array ( ), + 'nom' => + array ( + ), ), 'gm' => array ( @@ -3105,6 +4164,9 @@ 'blogspot' => array ( ), + 'nym' => + array ( + ), ), 'gs' => array ( @@ -3132,6 +4194,9 @@ 'org' => array ( ), + 'nom' => + array ( + ), ), 'gu' => array ( @@ -3261,6 +4326,9 @@ 'gob' => array ( ), + 'nom' => + array ( + ), ), 'hr' => array ( @@ -3540,6 +4608,12 @@ 'tv' => array ( ), + 'ro' => + array ( + ), + 'nom' => + array ( + ), ), 'in' => array ( @@ -3579,12 +4653,24 @@ 'mil' => array ( ), + 'cloudns' => + array ( + ), 'blogspot' => array ( ), + 'barsy' => + array ( + ), ), 'info' => array ( + 'cloudns' => + array ( + ), + 'dynamic-dns' => + array ( + ), 'dyndns' => array ( ), @@ -3615,6 +4701,21 @@ 'webhop' => array ( ), + 'nsupdate' => + array ( + ), + 'dvrcam' => + array ( + ), + 'ilovecollege' => + array ( + ), + 'no-ip' => + array ( + ), + 'v-info' => + array ( + ), ), 'int' => array ( @@ -3627,21 +4728,117 @@ 'com' => array ( ), + 'backplaneapp' => + array ( + ), + 'boxfuse' => + array ( + ), + 'browsersafetymark' => + array ( + ), + 'dedyn' => + array ( + ), + 'drud' => + array ( + ), + 'definima' => + array ( + ), + 'enonic' => + array ( + 'customer' => + array ( + ), + ), 'github' => array ( ), + 'gitlab' => + array ( + ), + 'hasura-app' => + array ( + ), 'ngrok' => array ( ), + 'nodeart' => + array ( + 'stage' => + array ( + ), + ), + 'nodum' => + array ( + ), 'nid' => array ( ), - 'pantheon' => + 'pantheonsite' => + array ( + ), + 'protonet' => + array ( + ), + 'vaporcloud' => + array ( + ), + 'hzc' => array ( ), 'sandcats' => array ( ), + 'shiftedit' => + array ( + ), + 'lair' => + array ( + 'apps' => + array ( + ), + ), + 'stolos' => + array ( + '*' => + array ( + ), + ), + 'spacekit' => + array ( + ), + 'thingdust' => + array ( + 'dev' => + array ( + 'cust' => + array ( + ), + ), + 'disrec' => + array ( + 'cust' => + array ( + ), + ), + 'prod' => + array ( + 'cust' => + array ( + ), + ), + 'testing' => + array ( + 'cust' => + array ( + ), + ), + ), + 'wedeploy' => + array ( + ), ), 'iq' => array ( @@ -7379,21 +8576,12 @@ 'gyokuto' => array ( ), - 'hitoyoshi' => - array ( - ), 'kamiamakusa' => array ( ), - 'kashima' => - array ( - ), 'kikuchi' => array ( ), - 'kosa' => - array ( - ), 'kumamoto' => array ( ), @@ -7655,9 +8843,6 @@ 'kawasaki' => array ( ), - 'kesennuma' => - array ( - ), 'marumori' => array ( ), @@ -10585,6 +11770,9 @@ 'com' => array ( ), + 'nym' => + array ( + ), ), 'la' => array ( @@ -10612,9 +11800,15 @@ 'org' => array ( ), + 'bnr' => + array ( + ), 'c' => array ( ), + 'nym' => + array ( + ), ), 'lb' => array ( @@ -10654,12 +11848,21 @@ 'gov' => array ( ), - ), + 'oy' => + array ( + ), + ), 'li' => array ( 'blogspot' => array ( ), + 'nom' => + array ( + ), + 'nym' => + array ( + ), ), 'lk' => array ( @@ -10744,12 +11947,18 @@ 'blogspot' => array ( ), + 'nym' => + array ( + ), ), 'lu' => array ( 'blogspot' => array ( ), + 'nym' => + array ( + ), ), 'lv' => array ( @@ -10873,6 +12082,42 @@ 'priv' => array ( ), + 'c66' => + array ( + ), + 'daplie' => + array ( + 'localhost' => + array ( + ), + ), + 'filegear' => + array ( + ), + 'brasilia' => + array ( + ), + 'ddns' => + array ( + ), + 'dnsfor' => + array ( + ), + 'hopto' => + array ( + ), + 'loginto' => + array ( + ), + 'noip' => + array ( + ), + 'webhop' => + array ( + ), + 'nym' => + array ( + ), 'diskstation' => array ( ), @@ -10888,6 +12133,12 @@ 'synology' => array ( ), + 'wedeploy' => + array ( + ), + 'yombo' => + array ( + ), ), 'mg' => array ( @@ -10951,6 +12202,9 @@ 'blogspot' => array ( ), + 'nom' => + array ( + ), ), 'ml' => array ( @@ -12844,6 +14098,9 @@ 'blogspot' => array ( ), + 'nym' => + array ( + ), ), 'my' => array ( @@ -12874,12 +14131,29 @@ ), 'mz' => array ( - '*' => + 'ac' => array ( ), - 'teledata' => + 'adv' => + array ( + ), + 'co' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => + array ( + ), + 'net' => + array ( + ), + 'org' => array ( - '!' => '', ), ), 'na' => @@ -12956,15 +14230,39 @@ 'asso' => array ( ), + 'nom' => + array ( + ), ), 'ne' => array ( ), 'net' => array ( + 'alwaysdata' => + array ( + '*' => + array ( + ), + ), 'cloudfront' => array ( ), + 't3l3p0rt' => + array ( + ), + 'myfritz' => + array ( + ), + 'boomla' => + array ( + ), + 'bplaced' => + array ( + ), + 'square7' => + array ( + ), 'gb' => array ( ), @@ -12983,6 +14281,9 @@ 'in' => array ( ), + 'cloudaccess' => + array ( + ), 'cdn77-ssl' => array ( ), @@ -12992,6 +14293,24 @@ array ( ), ), + 'feste-ip' => + array ( + ), + 'knx-server' => + array ( + ), + 'static-access' => + array ( + ), + 'cryptonomic' => + array ( + '*' => + array ( + ), + ), + 'debian' => + array ( + ), 'at-band-camp' => array ( ), @@ -13097,33 +14416,78 @@ 'webhop' => array ( ), + 'definima' => + array ( + ), + 'casacam' => + array ( + ), + 'dynu' => + array ( + ), + 'dynv6' => + array ( + ), + 'twmail' => + array ( + ), + 'ru' => + array ( + ), + 'channelsdvr' => + array ( + ), + 'fastlylb' => + array ( + 'map' => + array ( + ), + ), 'fastly' => array ( - 'ssl' => + 'freetls' => + array ( + ), + 'map' => + array ( + ), + 'prod' => array ( 'a' => array ( ), - 'b' => - array ( - ), 'global' => array ( ), ), - 'prod' => + 'ssl' => array ( 'a' => array ( ), + 'b' => + array ( + ), 'global' => array ( ), ), ), + 'flynnhosting' => + array ( + ), 'cloudfunctions' => array ( ), + 'moonscale' => + array ( + ), + 'ipifony' => + array ( + ), + 'barsy' => + array ( + ), 'azurewebsites' => array ( ), @@ -13133,9 +14497,60 @@ 'cloudapp' => array ( ), + 'eating-organic' => + array ( + ), + 'mydissent' => + array ( + ), + 'myeffect' => + array ( + ), + 'mymediapc' => + array ( + ), + 'mypsx' => + array ( + ), + 'mysecuritycamera' => + array ( + ), + 'nhlfan' => + array ( + ), + 'no-ip' => + array ( + ), + 'pgafan' => + array ( + ), + 'privatizehealthinsurance' => + array ( + ), + 'bounceme' => + array ( + ), + 'ddns' => + array ( + ), + 'redirectme' => + array ( + ), + 'serveblog' => + array ( + ), + 'serveminecraft' => + array ( + ), + 'sytes' => + array ( + ), 'rackmaze' => array ( ), + 'firewall-gateway' => + array ( + ), 'dsmynas' => array ( ), @@ -13217,46 +14632,46 @@ ), 'ni' => array ( - 'com' => + 'ac' => array ( ), - 'gob' => + 'biz' => array ( ), - 'edu' => + 'co' => array ( ), - 'org' => + 'com' => array ( ), - 'nom' => + 'edu' => array ( ), - 'net' => + 'gob' => array ( ), - 'mil' => + 'in' => array ( ), - 'co' => + 'info' => array ( ), - 'biz' => + 'int' => array ( ), - 'web' => + 'mil' => array ( ), - 'int' => + 'net' => array ( ), - 'ac' => + 'nom' => array ( ), - 'in' => + 'org' => array ( ), - 'info' => + 'web' => array ( ), ), @@ -13265,12 +14680,27 @@ 'bv' => array ( ), + 'virtueeldomein' => + array ( + ), 'co' => array ( ), 'blogspot' => array ( ), + 'transurl' => + array ( + '*' => + array ( + ), + ), + 'cistron' => + array ( + ), + 'demon' => + array ( + ), ), 'no' => array ( @@ -15614,6 +17044,9 @@ 'shacknet' => array ( ), + 'nom' => + array ( + ), ), 'nz' => array ( @@ -15668,6 +17101,9 @@ 'school' => array ( ), + 'nym' => + array ( + ), ), 'om' => array ( @@ -15699,14 +17135,38 @@ array ( ), ), + 'onion' => + array ( + ), 'org' => array ( + 'amune' => + array ( + 'tele' => + array ( + ), + ), + 'pimienta' => + array ( + ), + 'poivron' => + array ( + ), + 'potager' => + array ( + ), + 'sweetpepper' => + array ( + ), 'ae' => array ( ), 'us' => array ( ), + 'certmgr' => + array ( + ), 'cdn77' => array ( 'c' => @@ -15725,9 +17185,15 @@ ), ), ), + 'cloudns' => + array ( + ), 'duckdns' => array ( ), + 'tunk' => + array ( + ), 'dyndns' => array ( 'go' => @@ -15884,6 +17350,24 @@ 'webhop' => array ( ), + 'ddnss' => + array ( + ), + 'accesscam' => + array ( + ), + 'camdvr' => + array ( + ), + 'freeddns' => + array ( + ), + 'mywire' => + array ( + ), + 'webredirect' => + array ( + ), 'eu' => array ( 'al' => @@ -16052,16 +17536,91 @@ array ( ), ), - 'bmoattachments' => + 'twmail' => array ( ), - 'dsmynas' => + 'fedorainfracloud' => array ( ), - 'familyds' => + 'fedorapeople' => array ( ), - 'hk' => + 'fedoraproject' => + array ( + 'cloud' => + array ( + ), + ), + 'hepforge' => + array ( + ), + 'js' => + array ( + ), + 'bmoattachments' => + array ( + ), + 'cable-modem' => + array ( + ), + 'collegefan' => + array ( + ), + 'couchpotatofries' => + array ( + ), + 'mlbfan' => + array ( + ), + 'mysecuritycamera' => + array ( + ), + 'nflfan' => + array ( + ), + 'read-books' => + array ( + ), + 'ufcfan' => + array ( + ), + 'hopto' => + array ( + ), + 'myftp' => + array ( + ), + 'no-ip' => + array ( + ), + 'zapto' => + array ( + ), + 'my-firewall' => + array ( + ), + 'myfirewall' => + array ( + ), + 'spdns' => + array ( + ), + 'dsmynas' => + array ( + ), + 'familyds' => + array ( + ), + 'tuxfamily' => + array ( + ), + 'diskstation' => + array ( + ), + 'hk' => + array ( + ), + 'wmflabs' => array ( ), 'za' => @@ -16130,6 +17689,9 @@ 'blogspot' => array ( ), + 'nym' => + array ( + ), ), 'pf' => array ( @@ -16823,6 +18385,9 @@ 'zgorzelec' => array ( ), + 'beep' => + array ( + ), 'co' => array ( ), @@ -16928,15 +18493,27 @@ ), 'pro' => array ( + 'aaa' => + array ( + ), 'aca' => array ( ), + 'acct' => + array ( + ), + 'avocat' => + array ( + ), 'bar' => array ( ), 'cpa' => array ( ), + 'eng' => + array ( + ), 'jur' => array ( ), @@ -16946,7 +18523,10 @@ 'med' => array ( ), - 'eng' => + 'recht' => + array ( + ), + 'cloudns' => array ( ), ), @@ -17003,6 +18583,9 @@ 'blogspot' => array ( ), + 'nym' => + array ( + ), ), 'pw' => array ( @@ -17021,535 +18604,250 @@ 'go' => array ( ), - 'belau' => - array ( - ), - ), - 'py' => - array ( - 'com' => - array ( - ), - 'coop' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'qa' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'name' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'sch' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 're' => - array ( - 'asso' => - array ( - ), - 'com' => - array ( - ), - 'nom' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'ro' => - array ( - 'arts' => - array ( - ), - 'com' => - array ( - ), - 'firm' => - array ( - ), - 'info' => - array ( - ), - 'nom' => - array ( - ), - 'nt' => - array ( - ), - 'org' => - array ( - ), - 'rec' => - array ( - ), - 'store' => - array ( - ), - 'tm' => - array ( - ), - 'www' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'rs' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'in' => - array ( - ), - 'org' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'ru' => - array ( - 'ac' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'int' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'pp' => - array ( - ), - 'adygeya' => - array ( - ), - 'altai' => - array ( - ), - 'amur' => - array ( - ), - 'arkhangelsk' => - array ( - ), - 'astrakhan' => - array ( - ), - 'bashkiria' => - array ( - ), - 'belgorod' => - array ( - ), - 'bir' => - array ( - ), - 'bryansk' => - array ( - ), - 'buryatia' => - array ( - ), - 'cbg' => - array ( - ), - 'chel' => - array ( - ), - 'chelyabinsk' => - array ( - ), - 'chita' => - array ( - ), - 'chukotka' => - array ( - ), - 'chuvashia' => - array ( - ), - 'dagestan' => - array ( - ), - 'dudinka' => - array ( - ), - 'e-burg' => - array ( - ), - 'grozny' => - array ( - ), - 'irkutsk' => - array ( - ), - 'ivanovo' => - array ( - ), - 'izhevsk' => - array ( - ), - 'jar' => - array ( - ), - 'joshkar-ola' => - array ( - ), - 'kalmykia' => - array ( - ), - 'kaluga' => - array ( - ), - 'kamchatka' => - array ( - ), - 'karelia' => - array ( - ), - 'kazan' => - array ( - ), - 'kchr' => - array ( - ), - 'kemerovo' => - array ( - ), - 'khabarovsk' => - array ( - ), - 'khakassia' => - array ( - ), - 'khv' => - array ( - ), - 'kirov' => - array ( - ), - 'koenig' => - array ( - ), - 'komi' => - array ( - ), - 'kostroma' => - array ( - ), - 'krasnoyarsk' => - array ( - ), - 'kuban' => - array ( - ), - 'kurgan' => - array ( - ), - 'kursk' => - array ( - ), - 'lipetsk' => - array ( - ), - 'magadan' => - array ( - ), - 'mari' => - array ( - ), - 'mari-el' => - array ( - ), - 'marine' => - array ( - ), - 'mordovia' => + 'belau' => array ( ), - 'msk' => + 'cloudns' => array ( ), - 'murmansk' => + 'nom' => array ( ), - 'nalchik' => + ), + 'py' => + array ( + 'com' => array ( ), - 'nnov' => + 'coop' => array ( ), - 'nov' => + 'edu' => array ( ), - 'novosibirsk' => + 'gov' => array ( ), - 'nsk' => + 'mil' => array ( ), - 'omsk' => + 'net' => array ( ), - 'orenburg' => + 'org' => array ( ), - 'oryol' => + ), + 'qa' => + array ( + 'com' => array ( ), - 'palana' => + 'edu' => array ( ), - 'penza' => + 'gov' => array ( ), - 'perm' => + 'mil' => array ( ), - 'ptz' => + 'name' => array ( ), - 'rnd' => + 'net' => array ( ), - 'ryazan' => + 'org' => array ( ), - 'sakhalin' => + 'sch' => array ( ), - 'samara' => + 'blogspot' => array ( ), - 'saratov' => + 'nom' => array ( ), - 'simbirsk' => + ), + 're' => + array ( + 'asso' => array ( ), - 'smolensk' => + 'com' => array ( ), - 'spb' => + 'nom' => array ( ), - 'stavropol' => + 'blogspot' => array ( ), - 'stv' => + ), + 'ro' => + array ( + 'arts' => array ( ), - 'surgut' => + 'com' => array ( ), - 'tambov' => + 'firm' => array ( ), - 'tatarstan' => + 'info' => array ( ), - 'tom' => + 'nom' => array ( ), - 'tomsk' => + 'nt' => array ( ), - 'tsaritsyn' => + 'org' => array ( ), - 'tsk' => + 'rec' => array ( ), - 'tula' => + 'store' => array ( ), - 'tuva' => + 'tm' => array ( ), - 'tver' => + 'www' => array ( ), - 'tyumen' => + 'shop' => array ( ), - 'udm' => + 'blogspot' => array ( ), - 'udmurtia' => + ), + 'rs' => + array ( + 'ac' => array ( ), - 'ulan-ude' => + 'co' => array ( ), - 'vladikavkaz' => + 'edu' => array ( ), - 'vladimir' => + 'gov' => array ( ), - 'vladivostok' => + 'in' => array ( ), - 'volgograd' => + 'org' => array ( ), - 'vologda' => + 'blogspot' => array ( ), - 'voronezh' => + 'nom' => array ( ), - 'vrn' => + ), + 'ru' => + array ( + 'ac' => array ( ), - 'vyatka' => + 'edu' => array ( ), - 'yakutia' => + 'gov' => array ( ), - 'yamal' => + 'int' => array ( ), - 'yaroslavl' => + 'mil' => array ( ), - 'yekaterinburg' => + 'test' => array ( ), - 'yuzhno-sakhalinsk' => + 'adygeya' => array ( ), - 'amursk' => + 'bashkiria' => array ( ), - 'baikal' => + 'bir' => array ( ), - 'cmw' => + 'cbg' => array ( ), - 'fareast' => + 'com' => array ( ), - 'jamal' => + 'dagestan' => array ( ), - 'kms' => + 'grozny' => array ( ), - 'k-uralsk' => + 'kalmykia' => array ( ), 'kustanai' => array ( ), - 'kuzbass' => + 'marine' => array ( ), - 'mytis' => + 'mordovia' => array ( ), - 'nakhodka' => + 'msk' => array ( ), - 'nkz' => + 'mytis' => array ( ), - 'norilsk' => + 'nalchik' => array ( ), - 'oskol' => + 'nov' => array ( ), 'pyatigorsk' => array ( ), - 'rubtsovsk' => - array ( - ), - 'snz' => + 'spb' => array ( ), - 'syzran' => + 'vladikavkaz' => array ( ), - 'vdonsk' => + 'vladimir' => array ( ), - 'zgrad' => + 'blogspot' => array ( ), - 'gov' => + 'cldmail' => array ( + 'hb' => + array ( + ), ), - 'mil' => + 'net' => array ( ), - 'test' => + 'org' => array ( ), - 'blogspot' => + 'pp' => array ( ), ), @@ -17840,13 +19138,19 @@ 'mil' => array ( ), + 'hashbang' => + array ( + ), 'platform' => array ( '*' => array ( ), ), - 'hashbang' => + 'wedeploy' => + array ( + ), + 'now' => array ( ), ), @@ -17855,6 +19159,9 @@ 'blogspot' => array ( ), + 'nom' => + array ( + ), ), 'sj' => array ( @@ -17864,6 +19171,9 @@ 'blogspot' => array ( ), + 'nym' => + array ( + ), ), 'sl' => array ( @@ -17969,12 +19279,27 @@ ), 'su' => array ( + 'abkhazia' => + array ( + ), 'adygeya' => array ( ), + 'aktyubinsk' => + array ( + ), 'arkhangelsk' => array ( ), + 'armenia' => + array ( + ), + 'ashgabad' => + array ( + ), + 'azerbaijan' => + array ( + ), 'balashov' => array ( ), @@ -17984,21 +19309,45 @@ 'bryansk' => array ( ), + 'bukhara' => + array ( + ), + 'chimkent' => + array ( + ), 'dagestan' => array ( ), + 'east-kazakhstan' => + array ( + ), + 'exnet' => + array ( + ), + 'georgia' => + array ( + ), 'grozny' => array ( ), 'ivanovo' => array ( ), + 'jambyl' => + array ( + ), 'kalmykia' => array ( ), 'kaluga' => array ( ), + 'karacol' => + array ( + ), + 'karaganda' => + array ( + ), 'karelia' => array ( ), @@ -18011,9 +19360,15 @@ 'kurgan' => array ( ), + 'kustanai' => + array ( + ), 'lenug' => array ( ), + 'mangyshlak' => + array ( + ), 'mordovia' => array ( ), @@ -18026,6 +19381,12 @@ 'nalchik' => array ( ), + 'navoi' => + array ( + ), + 'north-kazakhstan' => + array ( + ), 'nov' => array ( ), @@ -18044,12 +19405,21 @@ 'spb' => array ( ), + 'tashkent' => + array ( + ), + 'termez' => + array ( + ), 'togliatti' => array ( ), 'troitsk' => array ( ), + 'tselinograd' => + array ( + ), 'tula' => array ( ), @@ -18065,6 +19435,9 @@ 'vologda' => array ( ), + 'nym' => + array ( + ), ), 'sv' => array ( @@ -18089,6 +19462,9 @@ 'gov' => array ( ), + 'nym' => + array ( + ), ), 'sy' => array ( @@ -18332,6 +19708,9 @@ 'mil' => array ( ), + 'vpnplus' => + array ( + ), ), 'tr' => array ( @@ -18490,6 +19869,9 @@ ), 'com' => array ( + 'mymailer' => + array ( + ), ), 'net' => array ( @@ -18518,9 +19900,15 @@ 'xn--czrw28b' => array ( ), + 'url' => + array ( + ), 'blogspot' => array ( ), + 'nym' => + array ( + ), ), 'tz' => array ( @@ -18791,6 +20179,15 @@ 'zt' => array ( ), + 'cc' => + array ( + ), + 'inf' => + array ( + ), + 'ltd' => + array ( + ), 'biz' => array ( ), @@ -18830,6 +20227,9 @@ 'blogspot' => array ( ), + 'nom' => + array ( + ), ), 'uk' => array ( @@ -18841,12 +20241,21 @@ 'blogspot' => array ( ), + 'no-ip' => + array ( + ), + 'wellbeingzone' => + array ( + ), ), 'gov' => array ( 'service' => array ( ), + 'homeoffice' => + array ( + ), ), 'ltd' => array ( @@ -19198,6 +20607,30 @@ 'lib' => array ( ), + 'ann-arbor' => + array ( + ), + 'cog' => + array ( + ), + 'dst' => + array ( + ), + 'eaton' => + array ( + ), + 'gen' => + array ( + ), + 'mus' => + array ( + ), + 'tec' => + array ( + ), + 'washtenaw' => + array ( + ), ), 'mn' => array ( @@ -19547,6 +20980,12 @@ array ( ), ), + 'cloudns' => + array ( + ), + 'drud' => + array ( + ), 'is-by' => array ( ), @@ -19556,6 +20995,15 @@ 'stuff-4-sale' => array ( ), + 'golffan' => + array ( + ), + 'noip' => + array ( + ), + 'pointto' => + array ( + ), ), 'uy' => array ( @@ -19580,6 +21028,9 @@ 'org' => array ( ), + 'nom' => + array ( + ), ), 'uz' => array ( @@ -19619,6 +21070,9 @@ 'edu' => array ( ), + 'nom' => + array ( + ), ), 've' => array ( @@ -19676,6 +21130,9 @@ ), 'vg' => array ( + 'nom' => + array ( + ), ), 'vi' => array ( @@ -19772,6 +21229,12 @@ 'edu' => array ( ), + 'advisor' => + array ( + '*' => + array ( + ), + ), 'dyndns' => array ( ), @@ -19791,6 +21254,9 @@ 'xn--54b7fta0cc' => array ( ), + 'xn--90ae' => + array ( + ), 'xn--90ais' => array ( ), @@ -19806,6 +21272,9 @@ 'xn--wgbh1c' => array ( ), + 'xn--e1a4c' => + array ( + ), 'xn--node' => array ( ), @@ -19815,6 +21284,27 @@ 'xn--j6w193g' => array ( ), + 'xn--2scrj9c' => + array ( + ), + 'xn--3hcrj9c' => + array ( + ), + 'xn--45br5cyl' => + array ( + ), + 'xn--h2breg3eve' => + array ( + ), + 'xn--h2brj9c8c' => + array ( + ), + 'xn--mgbgu82a' => + array ( + ), + 'xn--rvc1e0am3e' => + array ( + ), 'xn--h2brj9c' => array ( ), @@ -19946,6 +21436,24 @@ ), 'xn--o3cw4h' => array ( + 'xn--12c1fe0br' => + array ( + ), + 'xn--12co0c3b4eva' => + array ( + ), + 'xn--h3cuzk1di' => + array ( + ), + 'xn--o3cyx2a' => + array ( + ), + 'xn--m3ch0j3a' => + array ( + ), + 'xn--12cfi8ixb8l' => + array ( + ), ), 'xn--pgbs0dh' => array ( @@ -20033,13 +21541,55 @@ ), 'zm' => array ( - '*' => + 'ac' => + array ( + ), + 'biz' => + array ( + ), + 'co' => + array ( + ), + 'com' => + array ( + ), + 'edu' => + array ( + ), + 'gov' => + array ( + ), + 'info' => + array ( + ), + 'mil' => + array ( + ), + 'net' => + array ( + ), + 'org' => + array ( + ), + 'sch' => array ( ), ), 'zw' => array ( - '*' => + 'ac' => + array ( + ), + 'co' => + array ( + ), + 'gov' => + array ( + ), + 'mil' => + array ( + ), + 'org' => array ( ), ), @@ -20118,9 +21668,6 @@ 'africa' => array ( ), - 'africamagic' => - array ( - ), 'agakhan' => array ( ), @@ -20226,6 +21773,9 @@ 'army' => array ( ), + 'art' => + array ( + ), 'arte' => array ( ), @@ -20520,6 +22070,9 @@ 'calvinklein' => array ( ), + 'cam' => + array ( + ), 'camera' => array ( ), @@ -20693,9 +22246,39 @@ ), 'cloud' => array ( + 'myfusion' => + array ( + ), + 'statics' => + array ( + '*' => + array ( + ), + ), + 'magentosite' => + array ( + '*' => + array ( + ), + ), + 'vapor' => + array ( + ), + 'sensiosite' => + array ( + '*' => + array ( + ), + ), + 'trafficplex' => + array ( + ), ), 'club' => array ( + 'cloudns' => + array ( + ), ), 'clubmed' => array ( @@ -20759,6 +22342,9 @@ ), 'cool' => array ( + 'de' => + array ( + ), ), 'corsica' => array ( @@ -20820,6 +22406,9 @@ 'dance' => array ( ), + 'data' => + array ( + ), 'date' => array ( ), @@ -20916,6 +22505,9 @@ 'docs' => array ( ), + 'doctor' => + array ( + ), 'dodge' => array ( ), @@ -20928,9 +22520,6 @@ 'domains' => array ( ), - 'doosan' => - array ( - ), 'dot' => array ( ), @@ -20940,9 +22529,6 @@ 'drive' => array ( ), - 'dstv' => - array ( - ), 'dtv' => array ( ), @@ -20967,7 +22553,7 @@ 'dvag' => array ( ), - 'dwg' => + 'dvr' => array ( ), 'earth' => @@ -20976,6 +22562,9 @@ 'eat' => array ( ), + 'eco' => + array ( + ), 'edeka' => array ( ), @@ -20988,9 +22577,6 @@ 'emerck' => array ( ), - 'emerson' => - array ( - ), 'energy' => array ( ), @@ -21023,6 +22609,12 @@ ), 'estate' => array ( + 'compute' => + array ( + '*' => + array ( + ), + ), ), 'esurance' => array ( @@ -21035,6 +22627,12 @@ ), 'eus' => array ( + 'party' => + array ( + 'user' => + array ( + ), + ), ), 'events' => array ( @@ -21068,6 +22666,9 @@ ), 'faith' => array ( + 'ybo' => + array ( + ), ), 'family' => array ( @@ -21080,6 +22681,9 @@ ), 'farm' => array ( + 'storj' => + array ( + ), ), 'farmers' => array ( @@ -21140,6 +22744,9 @@ ), 'fit' => array ( + 'ptplus' => + array ( + ), ), 'fitness' => array ( @@ -21159,15 +22766,15 @@ 'flowers' => array ( ), - 'flsmidth' => - array ( - ), 'fly' => array ( ), 'foo' => array ( ), + 'food' => + array ( + ), 'foodnetwork' => array ( ), @@ -21219,6 +22826,9 @@ 'fujixerox' => array ( ), + 'fun' => + array ( + ), 'fund' => array ( ), @@ -21306,6 +22916,9 @@ 'gmail' => array ( ), + 'gmbh' => + array ( + ), 'gmo' => array ( ), @@ -21335,6 +22948,9 @@ ), 'goog' => array ( + 'cloud' => + array ( + ), ), 'google' => array ( @@ -21345,9 +22961,6 @@ 'got' => array ( ), - 'gotv' => - array ( - ), 'grainger' => array ( ), @@ -21363,6 +22976,9 @@ 'gripe' => array ( ), + 'grocery' => + array ( + ), 'group' => array ( ), @@ -21471,11 +23087,23 @@ 'horse' => array ( ), + 'hospital' => + array ( + ), 'host' => array ( + 'cloudaccess' => + array ( + ), + 'freesite' => + array ( + ), ), 'hosting' => array ( + 'opencraft' => + array ( + ), ), 'hot' => array ( @@ -21483,6 +23111,9 @@ 'hoteles' => array ( ), + 'hotels' => + array ( + ), 'hotmail' => array ( ), @@ -21525,9 +23156,6 @@ 'ifm' => array ( ), - 'iinet' => - array ( - ), 'ikano' => array ( ), @@ -21716,6 +23344,12 @@ ), 'krd' => array ( + 'co' => + array ( + ), + 'edu' => + array ( + ), ), 'kred' => array ( @@ -21723,9 +23357,6 @@ 'kuokgroup' => array ( ), - 'kyknet' => - array ( - ), 'kyoto' => array ( ), @@ -21752,6 +23383,15 @@ ), 'land' => array ( + 'static' => + array ( + 'dev' => + array ( + ), + 'sites' => + array ( + ), + ), ), 'landrover' => array ( @@ -21839,6 +23479,12 @@ ), 'link' => array ( + 'cyon' => + array ( + ), + 'mypep' => + array ( + ), ), 'lipsy' => array ( @@ -21926,10 +23572,16 @@ ), 'management' => array ( + 'router' => + array ( + ), ), 'mango' => array ( ), + 'map' => + array ( + ), 'market' => array ( ), @@ -21990,6 +23642,9 @@ 'meo' => array ( ), + 'merckmsd' => + array ( + ), 'metlife' => array ( ), @@ -22020,7 +23675,7 @@ 'mma' => array ( ), - 'mnet' => + 'mobile' => array ( ), 'mobily' => @@ -22089,18 +23744,9 @@ 'mtr' => array ( ), - 'multichoice' => - array ( - ), 'mutual' => array ( ), - 'mutuelle' => - array ( - ), - 'mzansimagic' => - array ( - ), 'nab' => array ( ), @@ -22110,9 +23756,6 @@ 'nagoya' => array ( ), - 'naspers' => - array ( - ), 'nationwide' => array ( ), @@ -22136,6 +23779,12 @@ ), 'network' => array ( + 'alces' => + array ( + '*' => + array ( + ), + ), ), 'neustar' => array ( @@ -22247,6 +23896,9 @@ ), 'one' => array ( + 'homelink' => + array ( + ), ), 'ong' => array ( @@ -22256,6 +23908,9 @@ ), 'online' => array ( + 'barsy' => + array ( + ), ), 'onyourside' => array ( @@ -22275,9 +23930,6 @@ 'organic' => array ( ), - 'orientexpress' => - array ( - ), 'origins' => array ( ), @@ -22292,6 +23944,9 @@ ), 'ovh' => array ( + 'nerdpol' => + array ( + ), ), 'page' => array ( @@ -22319,6 +23974,9 @@ ), 'party' => array ( + 'ybo' => + array ( + ), ), 'passagens' => array ( @@ -22326,9 +23984,6 @@ 'pay' => array ( ), - 'payu' => - array ( - ), 'pccw' => array ( ), @@ -22341,9 +23996,15 @@ 'pharmacy' => array ( ), + 'phd' => + array ( + ), 'philips' => array ( ), + 'phone' => + array ( + ), 'photo' => array ( ), @@ -22367,6 +24028,9 @@ ), 'pictures' => array ( + 1337 => + array ( + ), ), 'pid' => array ( @@ -22479,6 +24143,9 @@ 'racing' => array ( ), + 'radio' => + array ( + ), 'raid' => array ( ), @@ -22547,6 +24214,9 @@ ), 'review' => array ( + 'ybo' => + array ( + ), ), 'reviews' => array ( @@ -22574,6 +24244,9 @@ ), 'rip' => array ( + 'clan' => + array ( + ), ), 'rmit' => array ( @@ -22583,6 +24256,15 @@ ), 'rocks' => array ( + 'myddns' => + array ( + ), + 'lima-city' => + array ( + ), + 'webspace' => + array ( + ), ), 'rodeo' => array ( @@ -22596,6 +24278,9 @@ 'rsvp' => array ( ), + 'rugby' => + array ( + ), 'ruhr' => array ( ), @@ -22691,6 +24376,9 @@ ), 'science' => array ( + 'ybo' => + array ( + ), ), 'scjohnson' => array ( @@ -22701,6 +24389,9 @@ 'scot' => array ( ), + 'search' => + array ( + ), 'seat' => array ( ), @@ -22761,6 +24452,12 @@ 'shoes' => array ( ), + 'shop' => + array ( + ), + 'shopping' => + array ( + ), 'shouji' => array ( ), @@ -22784,6 +24481,18 @@ ), 'site' => array ( + 'cyon' => + array ( + ), + 'platformsh' => + array ( + '*' => + array ( + ), + ), + 'byen' => + array ( + ), ), 'ski' => array ( @@ -22841,6 +24550,15 @@ ), 'space' => array ( + 'stackspace' => + array ( + ), + 'uber' => + array ( + ), + 'xs4all' => + array ( + ), ), 'spiegel' => array ( @@ -22893,6 +24611,9 @@ 'store' => array ( ), + 'stream' => + array ( + ), 'studio' => array ( ), @@ -22905,9 +24626,6 @@ 'sucks' => array ( ), - 'supersport' => - array ( - ), 'supplies' => array ( ), @@ -22916,6 +24634,9 @@ ), 'support' => array ( + 'barsy' => + array ( + ), ), 'surf' => array ( @@ -22943,6 +24664,9 @@ ), 'systems' => array ( + 'knightpoint' => + array ( + ), ), 'tab' => array ( @@ -23013,9 +24737,6 @@ 'theatre' => array ( ), - 'theguardian' => - array ( - ), 'tiaa' => array ( ), @@ -23084,6 +24805,9 @@ ), 'trade' => array ( + 'ybo' => + array ( + ), ), 'trading' => array ( @@ -23388,9 +25112,6 @@ 'xn--4gbrim' => array ( ), - 'xn--4gq48lf9j' => - array ( - ), 'xn--55qw42g' => array ( ), @@ -23645,6 +25366,12 @@ ), 'xyz' => array ( + 'blogsite' => + array ( + ), + 'fhapp' => + array ( + ), ), 'yachts' => array ( @@ -23693,6 +25420,15 @@ ), 'zone' => array ( + 'triton' => + array ( + '*' => + array ( + ), + ), + 'lima' => + array ( + ), ), 'zuerich' => array ( diff --git a/data/public-suffix-list.txt b/data/public-suffix-list.txt index ee0269c3..5797b164 100644 --- a/data/public-suffix-list.txt +++ b/data/public-suffix-list.txt @@ -1,10 +1,15 @@ // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +// Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat, +// rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported. + +// Instructions on pulling and using this list can be found at https://publicsuffix.org/list/. // ===BEGIN ICANN DOMAINS=== -// ac : http://en.wikipedia.org/wiki/.ac +// ac : https://en.wikipedia.org/wiki/.ac ac com.ac edu.ac @@ -13,11 +18,11 @@ net.ac mil.ac org.ac -// ad : http://en.wikipedia.org/wiki/.ad +// ad : https://en.wikipedia.org/wiki/.ad ad nom.ad -// ae : http://en.wikipedia.org/wiki/.ae +// ae : https://en.wikipedia.org/wiki/.ae // see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php ae co.ae @@ -28,7 +33,7 @@ ac.ae gov.ae mil.ae -// aero : see http://www.information.aero/index.php?id=66 +// aero : see https://www.information.aero/index.php?id=66 aero accident-investigation.aero accident-prevention.aero @@ -150,10 +155,10 @@ mil.al net.al org.al -// am : http://en.wikipedia.org/wiki/.am +// am : https://en.wikipedia.org/wiki/.am am -// ao : http://en.wikipedia.org/wiki/.ao +// ao : https://en.wikipedia.org/wiki/.ao // http://www.dns.ao/REGISTR.DOC ao ed.ao @@ -163,10 +168,10 @@ co.ao pb.ao it.ao -// aq : http://en.wikipedia.org/wiki/.aq +// aq : https://en.wikipedia.org/wiki/.aq aq -// ar : https://nic.ar/normativa-vigente.xhtml +// ar : https://nic.ar/nic-argentina/normativa-vigente ar com.ar edu.ar @@ -174,11 +179,12 @@ gob.ar gov.ar int.ar mil.ar +musica.ar net.ar org.ar tur.ar -// arpa : http://en.wikipedia.org/wiki/.arpa +// arpa : https://en.wikipedia.org/wiki/.arpa // Confirmed by registry 2008-06-18 arpa e164.arpa @@ -188,14 +194,14 @@ iris.arpa uri.arpa urn.arpa -// as : http://en.wikipedia.org/wiki/.as +// as : https://en.wikipedia.org/wiki/.as as gov.as -// asia : http://en.wikipedia.org/wiki/.asia +// asia : https://en.wikipedia.org/wiki/.asia asia -// at : http://en.wikipedia.org/wiki/.at +// at : https://en.wikipedia.org/wiki/.at // Confirmed by registry 2008-06-17 at ac.at @@ -203,7 +209,7 @@ co.at gv.at or.at -// au : http://en.wikipedia.org/wiki/.au +// au : https://en.wikipedia.org/wiki/.au // http://www.auda.org.au/ au // 2LDs @@ -245,14 +251,14 @@ tas.gov.au vic.gov.au wa.gov.au -// aw : http://en.wikipedia.org/wiki/.aw +// aw : https://en.wikipedia.org/wiki/.aw aw com.aw -// ax : http://en.wikipedia.org/wiki/.ax +// ax : https://en.wikipedia.org/wiki/.ax ax -// az : http://en.wikipedia.org/wiki/.az +// az : https://en.wikipedia.org/wiki/.az az com.az net.az @@ -267,20 +273,16 @@ name.az pro.az biz.az -// ba : http://en.wikipedia.org/wiki/.ba +// ba : http://nic.ba/users_data/files/pravilnik_o_registraciji.pdf ba -org.ba -net.ba +com.ba edu.ba gov.ba mil.ba -unsa.ba -unbi.ba -co.ba -com.ba -rs.ba +net.ba +org.ba -// bb : http://en.wikipedia.org/wiki/.bb +// bb : https://en.wikipedia.org/wiki/.bb bb biz.bb co.bb @@ -293,19 +295,19 @@ org.bb store.bb tv.bb -// bd : http://en.wikipedia.org/wiki/.bd +// bd : https://en.wikipedia.org/wiki/.bd *.bd -// be : http://en.wikipedia.org/wiki/.be +// be : https://en.wikipedia.org/wiki/.be // Confirmed by registry 2008-06-08 be ac.be -// bf : http://en.wikipedia.org/wiki/.bf +// bf : https://en.wikipedia.org/wiki/.bf bf gov.bf -// bg : http://en.wikipedia.org/wiki/.bg +// bg : https://en.wikipedia.org/wiki/.bg // https://www.register.bg/user/static/rules/en/index.html bg a.bg @@ -345,7 +347,7 @@ z.bg 8.bg 9.bg -// bh : http://en.wikipedia.org/wiki/.bh +// bh : https://en.wikipedia.org/wiki/.bh bh com.bh edu.bh @@ -353,7 +355,7 @@ net.bh org.bh gov.bh -// bi : http://en.wikipedia.org/wiki/.bi +// bi : https://en.wikipedia.org/wiki/.bi // http://whois.nic.bi/ bi co.bi @@ -362,10 +364,10 @@ edu.bi or.bi org.bi -// biz : http://en.wikipedia.org/wiki/.biz +// biz : https://en.wikipedia.org/wiki/.biz biz -// bj : http://en.wikipedia.org/wiki/.bj +// bj : https://en.wikipedia.org/wiki/.bj bj asso.bj barreau.bj @@ -379,7 +381,7 @@ gov.bm net.bm org.bm -// bn : http://en.wikipedia.org/wiki/.bn +// bn : https://en.wikipedia.org/wiki/.bn *.bn // bo : http://www.nic.bo/ @@ -397,22 +399,30 @@ tv.bo // br : http://registro.br/dominio/categoria.html // Submitted by registry br +abc.br adm.br adv.br agr.br +aju.br am.br +aparecida.br arq.br art.br ato.br b.br +belem.br bio.br blog.br bmd.br +bsb.br cim.br cng.br cnt.br com.br coop.br +cri.br +cuiaba.br +def.br ecn.br eco.br edu.br @@ -423,6 +433,8 @@ etc.br eti.br far.br flog.br +floripa.br +fortal.br fm.br fnd.br fot.br @@ -430,24 +442,62 @@ fst.br g12.br ggf.br gov.br +// gov.br 26 states + df https://en.wikipedia.org/wiki/States_of_Brazil +ac.gov.br +al.gov.br +am.gov.br +ap.gov.br +ba.gov.br +ce.gov.br +df.gov.br +es.gov.br +go.gov.br +ma.gov.br +mg.gov.br +ms.gov.br +mt.gov.br +pa.gov.br +pb.gov.br +pe.gov.br +pi.gov.br +pr.gov.br +rj.gov.br +rn.gov.br +ro.gov.br +rr.gov.br +rs.gov.br +sc.gov.br +se.gov.br +sp.gov.br +to.gov.br +gru.br imb.br ind.br inf.br +jampa.br jor.br jus.br leg.br lel.br +londrina.br +macapa.br +maceio.br mat.br med.br mil.br mp.br mus.br +natal.br net.br +niteroi.br *.nom.br not.br ntr.br odo.br org.br +osasco.br +palmas.br +poa.br ppg.br pro.br psc.br @@ -455,6 +505,9 @@ psi.br qsl.br radio.br rec.br +recife.br +riobranco.br +sjc.br slg.br srv.br taxi.br @@ -463,7 +516,9 @@ tmp.br trd.br tur.br tv.br +udi.br vet.br +vix.br vlog.br wiki.br zlg.br @@ -476,7 +531,7 @@ org.bs edu.bs gov.bs -// bt : http://en.wikipedia.org/wiki/.bt +// bt : https://en.wikipedia.org/wiki/.bt bt com.bt edu.bt @@ -488,14 +543,14 @@ org.bt // Submitted by registry bv -// bw : http://en.wikipedia.org/wiki/.bw +// bw : https://en.wikipedia.org/wiki/.bw // http://www.gobin.info/domainname/bw.doc // list of other 2nd level tlds ? bw co.bw org.bw -// by : http://en.wikipedia.org/wiki/.by +// by : https://en.wikipedia.org/wiki/.by // http://tld.by/rules_2006_en.html // list of other 2nd level tlds ? by @@ -509,7 +564,7 @@ com.by // http://hoster.by/ of.by -// bz : http://en.wikipedia.org/wiki/.bz +// bz : https://en.wikipedia.org/wiki/.bz // http://www.belizenic.bz/ bz com.bz @@ -518,7 +573,7 @@ org.bz edu.bz gov.bz -// ca : http://en.wikipedia.org/wiki/.ca +// ca : https://en.wikipedia.org/wiki/.ca ca // ca geographical names ab.ca @@ -535,31 +590,31 @@ pe.ca qc.ca sk.ca yk.ca -// gc.ca: http://en.wikipedia.org/wiki/.gc.ca +// gc.ca: https://en.wikipedia.org/wiki/.gc.ca // see also: http://registry.gc.ca/en/SubdomainFAQ gc.ca -// cat : http://en.wikipedia.org/wiki/.cat +// cat : https://en.wikipedia.org/wiki/.cat cat -// cc : http://en.wikipedia.org/wiki/.cc +// cc : https://en.wikipedia.org/wiki/.cc cc -// cd : http://en.wikipedia.org/wiki/.cd +// cd : https://en.wikipedia.org/wiki/.cd // see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 cd gov.cd -// cf : http://en.wikipedia.org/wiki/.cf +// cf : https://en.wikipedia.org/wiki/.cf cf -// cg : http://en.wikipedia.org/wiki/.cg +// cg : https://en.wikipedia.org/wiki/.cg cg -// ch : http://en.wikipedia.org/wiki/.ch +// ch : https://en.wikipedia.org/wiki/.ch ch -// ci : http://en.wikipedia.org/wiki/.ci +// ci : https://en.wikipedia.org/wiki/.ci // http://www.nic.ci/index.php?page=charte ci org.ci @@ -578,25 +633,25 @@ presse.ci md.ci gouv.ci -// ck : http://en.wikipedia.org/wiki/.ck +// ck : https://en.wikipedia.org/wiki/.ck *.ck !www.ck -// cl : http://en.wikipedia.org/wiki/.cl +// cl : https://en.wikipedia.org/wiki/.cl cl gov.cl gob.cl co.cl mil.cl -// cm : http://en.wikipedia.org/wiki/.cm plus bug 981927 +// cm : https://en.wikipedia.org/wiki/.cm plus bug 981927 cm co.cm com.cm gov.cm net.cm -// cn : http://en.wikipedia.org/wiki/.cn +// cn : https://en.wikipedia.org/wiki/.cn // Submitted by registry cn ac.cn @@ -645,7 +700,7 @@ hk.cn mo.cn tw.cn -// co : http://en.wikipedia.org/wiki/.co +// co : https://en.wikipedia.org/wiki/.co // Submitted by registry co arts.co @@ -662,10 +717,10 @@ org.co rec.co web.co -// com : http://en.wikipedia.org/wiki/.com +// com : https://en.wikipedia.org/wiki/.com com -// coop : http://en.wikipedia.org/wiki/.coop +// coop : https://en.wikipedia.org/wiki/.coop coop // cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do @@ -678,7 +733,7 @@ go.cr or.cr sa.cr -// cu : http://en.wikipedia.org/wiki/.cu +// cu : https://en.wikipedia.org/wiki/.cu cu com.cu edu.cu @@ -687,7 +742,7 @@ net.cu gov.cu inf.cu -// cv : http://en.wikipedia.org/wiki/.cv +// cv : https://en.wikipedia.org/wiki/.cv cv // cw : http://www.una.cw/cw_registry/ @@ -698,12 +753,14 @@ edu.cw net.cw org.cw -// cx : http://en.wikipedia.org/wiki/.cx +// cx : https://en.wikipedia.org/wiki/.cx // list of other 2nd level tlds ? cx gov.cx -// cy : http://en.wikipedia.org/wiki/.cy +// cy : http://www.nic.cy/ +// Submitted by registry Panayiotou Fotia +cy ac.cy biz.cy com.cy @@ -718,22 +775,22 @@ press.cy pro.cy tm.cy -// cz : http://en.wikipedia.org/wiki/.cz +// cz : https://en.wikipedia.org/wiki/.cz cz -// de : http://en.wikipedia.org/wiki/.de +// de : https://en.wikipedia.org/wiki/.de // Confirmed by registry (with technical // reservations) 2008-07-01 de -// dj : http://en.wikipedia.org/wiki/.dj +// dj : https://en.wikipedia.org/wiki/.dj dj -// dk : http://en.wikipedia.org/wiki/.dk +// dk : https://en.wikipedia.org/wiki/.dk // Confirmed by registry 2008-06-17 dk -// dm : http://en.wikipedia.org/wiki/.dm +// dm : https://en.wikipedia.org/wiki/.dm dm com.dm net.dm @@ -741,7 +798,7 @@ org.dm edu.dm gov.dm -// do : http://en.wikipedia.org/wiki/.do +// do : https://en.wikipedia.org/wiki/.do do art.do com.do @@ -754,7 +811,7 @@ org.do sld.do web.do -// dz : http://en.wikipedia.org/wiki/.dz +// dz : https://en.wikipedia.org/wiki/.dz dz com.dz org.dz @@ -781,7 +838,7 @@ gov.ec gob.ec mil.ec -// edu : http://en.wikipedia.org/wiki/.edu +// edu : https://en.wikipedia.org/wiki/.edu edu // ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B @@ -797,7 +854,7 @@ aip.ee org.ee fie.ee -// eg : http://en.wikipedia.org/wiki/.eg +// eg : https://en.wikipedia.org/wiki/.eg eg com.eg edu.eg @@ -809,7 +866,7 @@ net.eg org.eg sci.eg -// er : http://en.wikipedia.org/wiki/.er +// er : https://en.wikipedia.org/wiki/.er *.er // es : https://www.nic.es/site_ingles/ingles/dominios/index.html @@ -820,7 +877,7 @@ org.es gob.es edu.es -// et : http://en.wikipedia.org/wiki/.et +// et : https://en.wikipedia.org/wiki/.et et com.et gov.et @@ -831,28 +888,28 @@ name.et info.et net.et -// eu : http://en.wikipedia.org/wiki/.eu +// eu : https://en.wikipedia.org/wiki/.eu eu -// fi : http://en.wikipedia.org/wiki/.fi +// fi : https://en.wikipedia.org/wiki/.fi fi -// aland.fi : http://en.wikipedia.org/wiki/.ax +// aland.fi : https://en.wikipedia.org/wiki/.ax // This domain is being phased out in favor of .ax. As there are still many // domains under aland.fi, we still keep it on the list until aland.fi is // completely removed. // TODO: Check for updates (expected to be phased out around Q1/2009) aland.fi -// fj : http://en.wikipedia.org/wiki/.fj +// fj : https://en.wikipedia.org/wiki/.fj *.fj -// fk : http://en.wikipedia.org/wiki/.fk +// fk : https://en.wikipedia.org/wiki/.fk *.fk -// fm : http://en.wikipedia.org/wiki/.fm +// fm : https://en.wikipedia.org/wiki/.fm fm -// fo : http://en.wikipedia.org/wiki/.fo +// fo : https://en.wikipedia.org/wiki/.fo fo // fr : http://www.afnic.fr/ @@ -883,14 +940,14 @@ pharmacien.fr port.fr veterinaire.fr -// ga : http://en.wikipedia.org/wiki/.ga +// ga : https://en.wikipedia.org/wiki/.ga ga // gb : This registry is effectively dormant // Submitted by registry gb -// gd : http://en.wikipedia.org/wiki/.gd +// gd : https://en.wikipedia.org/wiki/.gd gd // ge : http://www.nic.net.ge/policy_en.pdf @@ -903,7 +960,7 @@ mil.ge net.ge pvt.ge -// gf : http://en.wikipedia.org/wiki/.gf +// gf : https://en.wikipedia.org/wiki/.gf gf // gg : http://www.channelisles.net/register-domains/ @@ -913,7 +970,7 @@ co.gg net.gg org.gg -// gh : http://en.wikipedia.org/wiki/.gh +// gh : https://en.wikipedia.org/wiki/.gh // see also: http://www.nic.gh/reg_now.php // Although domains directly at second level are not possible at the moment, // they have been possible for some time and may come back. @@ -933,7 +990,7 @@ mod.gi edu.gi org.gi -// gl : http://en.wikipedia.org/wiki/.gl +// gl : https://en.wikipedia.org/wiki/.gl // http://nic.gl gl co.gl @@ -955,7 +1012,7 @@ gov.gn org.gn net.gn -// gov : http://en.wikipedia.org/wiki/.gov +// gov : https://en.wikipedia.org/wiki/.gov gov // gp : http://www.nic.gp/index.php?lang=en @@ -967,7 +1024,7 @@ edu.gp org.gp asso.gp -// gq : http://en.wikipedia.org/wiki/.gq +// gq : https://en.wikipedia.org/wiki/.gq gq // gr : https://grweb.ics.forth.gr/english/1617-B-2005.html @@ -979,7 +1036,7 @@ net.gr org.gr gov.gr -// gs : http://en.wikipedia.org/wiki/.gs +// gs : https://en.wikipedia.org/wiki/.gs gs // gt : http://www.gt/politicas_de_registro.html @@ -995,10 +1052,10 @@ org.gt // gu : http://gadao.gov.gu/registration.txt *.gu -// gw : http://en.wikipedia.org/wiki/.gw +// gw : https://en.wikipedia.org/wiki/.gw gw -// gy : http://en.wikipedia.org/wiki/.gy +// gy : https://en.wikipedia.org/wiki/.gy // http://registry.gy/ gy co.gy @@ -1033,7 +1090,7 @@ org.hk 組織.hk 組织.hk -// hm : http://en.wikipedia.org/wiki/.hm +// hm : https://en.wikipedia.org/wiki/.hm hm // hn : http://www.nic.hn/politicas/ps02,,05.html @@ -1121,7 +1178,7 @@ or.id sch.id web.id -// ie : http://en.wikipedia.org/wiki/.ie +// ie : https://en.wikipedia.org/wiki/.ie ie gov.ie @@ -1149,7 +1206,7 @@ plc.co.im tt.im tv.im -// in : http://en.wikipedia.org/wiki/.in +// in : https://en.wikipedia.org/wiki/.in // see also: https://registry.in/Policies // Please note, that nic.in is not an official eTLD, but used by most // government institutions. @@ -1167,10 +1224,10 @@ res.in gov.in mil.in -// info : http://en.wikipedia.org/wiki/.info +// info : https://en.wikipedia.org/wiki/.info info -// int : http://en.wikipedia.org/wiki/.int +// int : https://en.wikipedia.org/wiki/.int // Confirmed by registry 2008-06-18 int eu.int @@ -1215,7 +1272,7 @@ gov.is org.is int.is -// it : http://en.wikipedia.org/wiki/.it +// it : https://en.wikipedia.org/wiki/.it it gov.it edu.it @@ -1613,10 +1670,10 @@ gov.jo mil.jo name.jo -// jobs : http://en.wikipedia.org/wiki/.jobs +// jobs : https://en.wikipedia.org/wiki/.jobs jobs -// jp : http://en.wikipedia.org/wiki/.jp +// jp : https://en.wikipedia.org/wiki/.jp // http://jprs.co.jp/en/jpdomain.html // Submitted by registry jp @@ -2545,11 +2602,8 @@ arao.kumamoto.jp aso.kumamoto.jp choyo.kumamoto.jp gyokuto.kumamoto.jp -hitoyoshi.kumamoto.jp kamiamakusa.kumamoto.jp -kashima.kumamoto.jp kikuchi.kumamoto.jp -kosa.kumamoto.jp kumamoto.kumamoto.jp mashiki.kumamoto.jp mifune.kumamoto.jp @@ -2634,7 +2688,6 @@ iwanuma.miyagi.jp kakuda.miyagi.jp kami.miyagi.jp kawasaki.miyagi.jp -kesennuma.miyagi.jp marumori.miyagi.jp matsushima.miyagi.jp minamisanriku.miyagi.jp @@ -3445,7 +3498,7 @@ gov.ki info.ki com.ki -// km : http://en.wikipedia.org/wiki/.km +// km : https://en.wikipedia.org/wiki/.km // http://www.domaine.km/documents/charte.doc km org.km @@ -3458,7 +3511,7 @@ mil.km ass.km com.km // These are only mentioned as proposed suggestions at domaine.km, but -// http://en.wikipedia.org/wiki/.km says they're available for registration: +// https://en.wikipedia.org/wiki/.km says they're available for registration: coop.km asso.km presse.km @@ -3468,7 +3521,7 @@ pharmaciens.km veterinaire.km gouv.km -// kn : http://en.wikipedia.org/wiki/.kn +// kn : https://en.wikipedia.org/wiki/.kn // http://www.dot.kn/domainRules.html kn net.kn @@ -3485,7 +3538,7 @@ org.kp rep.kp tra.kp -// kr : http://en.wikipedia.org/wiki/.kr +// kr : https://en.wikipedia.org/wiki/.kr // see also: http://domain.nida.or.kr/eng/registration.jsp kr ac.kr @@ -3519,7 +3572,7 @@ jeonnam.kr seoul.kr ulsan.kr -// kw : http://en.wikipedia.org/wiki/.kw +// kw : https://en.wikipedia.org/wiki/.kw *.kw // ky : http://www.icta.ky/da_ky_reg_dom.php @@ -3531,7 +3584,7 @@ com.ky org.ky net.ky -// kz : http://en.wikipedia.org/wiki/.kz +// kz : https://en.wikipedia.org/wiki/.kz // see also: http://www.nic.kz/rules/index.jsp kz org.kz @@ -3541,7 +3594,7 @@ gov.kz mil.kz com.kz -// la : http://en.wikipedia.org/wiki/.la +// la : https://en.wikipedia.org/wiki/.la // Submitted by registry la int.la @@ -3553,7 +3606,7 @@ per.la com.la org.la -// lb : http://en.wikipedia.org/wiki/.lb +// lb : https://en.wikipedia.org/wiki/.lb // Submitted by registry lb com.lb @@ -3562,7 +3615,7 @@ gov.lb net.lb org.lb -// lc : http://en.wikipedia.org/wiki/.lc +// lc : https://en.wikipedia.org/wiki/.lc // see also: http://www.nic.lc/rules.htm lc com.lc @@ -3572,7 +3625,7 @@ org.lc edu.lc gov.lc -// li : http://en.wikipedia.org/wiki/.li +// li : https://en.wikipedia.org/wiki/.li li // lk : http://www.nic.lk/seclevpr.html @@ -3602,12 +3655,12 @@ gov.lr org.lr net.lr -// ls : http://en.wikipedia.org/wiki/.ls +// ls : https://en.wikipedia.org/wiki/.ls ls co.ls org.ls -// lt : http://en.wikipedia.org/wiki/.lt +// lt : https://en.wikipedia.org/wiki/.lt lt // gov.lt : http://www.gov.lt/index_en.php gov.lt @@ -3639,7 +3692,7 @@ med.ly org.ly id.ly -// ma : http://en.wikipedia.org/wiki/.ma +// ma : https://en.wikipedia.org/wiki/.ma // http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf ma co.ma @@ -3654,10 +3707,10 @@ mc tm.mc asso.mc -// md : http://en.wikipedia.org/wiki/.md +// md : https://en.wikipedia.org/wiki/.md md -// me : http://en.wikipedia.org/wiki/.me +// me : https://en.wikipedia.org/wiki/.me me co.me net.me @@ -3680,13 +3733,13 @@ mil.mg com.mg co.mg -// mh : http://en.wikipedia.org/wiki/.mh +// mh : https://en.wikipedia.org/wiki/.mh mh -// mil : http://en.wikipedia.org/wiki/.mil +// mil : https://en.wikipedia.org/wiki/.mil mil -// mk : http://en.wikipedia.org/wiki/.mk +// mk : https://en.wikipedia.org/wiki/.mk // see also: http://dns.marnet.net.mk/postapka.php mk com.mk @@ -3698,7 +3751,7 @@ inf.mk name.mk // ml : http://www.gobin.info/domainname/ml-template.doc -// see also: http://en.wikipedia.org/wiki/.ml +// see also: https://en.wikipedia.org/wiki/.ml ml com.ml edu.ml @@ -3708,10 +3761,10 @@ net.ml org.ml presse.ml -// mm : http://en.wikipedia.org/wiki/.mm +// mm : https://en.wikipedia.org/wiki/.mm *.mm -// mn : http://en.wikipedia.org/wiki/.mn +// mn : https://en.wikipedia.org/wiki/.mn mn gov.mn edu.mn @@ -3725,17 +3778,17 @@ org.mo edu.mo gov.mo -// mobi : http://en.wikipedia.org/wiki/.mobi +// mobi : https://en.wikipedia.org/wiki/.mobi mobi // mp : http://www.dot.mp/ // Confirmed by registry 2008-06-17 mp -// mq : http://en.wikipedia.org/wiki/.mq +// mq : https://en.wikipedia.org/wiki/.mq mq -// mr : http://en.wikipedia.org/wiki/.mr +// mr : https://en.wikipedia.org/wiki/.mr mr gov.mr @@ -3755,7 +3808,7 @@ edu.mt net.mt org.mt -// mu : http://en.wikipedia.org/wiki/.mu +// mu : https://en.wikipedia.org/wiki/.mu mu com.mu net.mu @@ -4317,7 +4370,7 @@ zoology.museum ירושלים.museum иком.museum -// mv : http://en.wikipedia.org/wiki/.mv +// mv : https://en.wikipedia.org/wiki/.mv // "mv" included because, contra Wikipedia, google.mv exists. mv aero.mv @@ -4368,9 +4421,17 @@ edu.my mil.my name.my -// mz : http://www.gobin.info/domainname/mz-template.doc -*.mz -!teledata.mz +// mz : http://www.uem.mz/ +// Submitted by registry +mz +ac.mz +adv.mz +co.mz +edu.mz +gov.mz +mil.mz +net.mz +org.mz // na : http://www.na-nic.com.na/ // http://www.info.na/domain/ @@ -4399,14 +4460,15 @@ name // nc : http://www.cctld.nc/ nc asso.nc +nom.nc -// ne : http://en.wikipedia.org/wiki/.ne +// ne : https://en.wikipedia.org/wiki/.ne ne -// net : http://en.wikipedia.org/wiki/.net +// net : https://en.wikipedia.org/wiki/.net net -// nf : http://en.wikipedia.org/wiki/.nf +// nf : https://en.wikipedia.org/wiki/.nf nf com.nf net.nf @@ -4433,22 +4495,23 @@ org.ng sch.ng // ni : http://www.nic.ni/ +ni +ac.ni +biz.ni +co.ni com.ni -gob.ni edu.ni -org.ni -nom.ni -net.ni -mil.ni -co.ni -biz.ni -web.ni -int.ni -ac.ni +gob.ni in.ni info.ni +int.ni +mil.ni +net.ni +nom.ni +org.ni +web.ni -// nl : http://en.wikipedia.org/wiki/.nl +// nl : https://en.wikipedia.org/wiki/.nl // https://www.sidn.nl/ // ccTLD for the Netherlands nl @@ -5237,10 +5300,10 @@ org.nr net.nr com.nr -// nu : http://en.wikipedia.org/wiki/.nu +// nu : https://en.wikipedia.org/wiki/.nu nu -// nz : http://en.wikipedia.org/wiki/.nz +// nz : https://en.wikipedia.org/wiki/.nz // Submitted by registry nz ac.nz @@ -5260,7 +5323,7 @@ org.nz parliament.nz school.nz -// om : http://en.wikipedia.org/wiki/.om +// om : https://en.wikipedia.org/wiki/.om om co.om com.om @@ -5272,7 +5335,10 @@ net.om org.om pro.om -// org : http://en.wikipedia.org/wiki/.org +// onion : https://tools.ietf.org/html/rfc7686 +onion + +// org : https://en.wikipedia.org/wiki/.org org // pa : http://www.nic.pa/ @@ -5307,7 +5373,7 @@ com.pf org.pf edu.pf -// pg : http://en.wikipedia.org/wiki/.pg +// pg : https://en.wikipedia.org/wiki/.pg *.pg // ph : http://www.domains.ph/FAQ2.asp @@ -5557,7 +5623,7 @@ org.pn edu.pn net.pn -// post : http://en.wikipedia.org/wiki/.post +// post : https://en.wikipedia.org/wiki/.post post // pr : http://www.nic.pr/index.asp?f=1 @@ -5572,22 +5638,26 @@ pro.pr biz.pr info.pr name.pr -// these aren't mentioned on nic.pr, but on http://en.wikipedia.org/wiki/.pr +// these aren't mentioned on nic.pr, but on https://en.wikipedia.org/wiki/.pr est.pr prof.pr ac.pr -// pro : http://www.nic.pro/support_faq.htm +// pro : http://registry.pro/get-pro pro +aaa.pro aca.pro +acct.pro +avocat.pro bar.pro cpa.pro +eng.pro jur.pro law.pro med.pro -eng.pro +recht.pro -// ps : http://en.wikipedia.org/wiki/.ps +// ps : https://en.wikipedia.org/wiki/.ps // http://www.nic.ps/registration/policy.html#reg ps edu.ps @@ -5609,7 +5679,7 @@ publ.pt com.pt nome.pt -// pw : http://en.wikipedia.org/wiki/.pw +// pw : https://en.wikipedia.org/wiki/.pw pw co.pw ne.pw @@ -5669,143 +5739,13 @@ gov.rs in.rs org.rs -// ru : http://www.cctld.ru/ru/docs/aktiv_8.php -// Industry domains +// ru : https://cctld.ru/en/domains/domens_ru/reserved/ ru ac.ru -com.ru edu.ru -int.ru -net.ru -org.ru -pp.ru -// Geographical domains -adygeya.ru -altai.ru -amur.ru -arkhangelsk.ru -astrakhan.ru -bashkiria.ru -belgorod.ru -bir.ru -bryansk.ru -buryatia.ru -cbg.ru -chel.ru -chelyabinsk.ru -chita.ru -chukotka.ru -chuvashia.ru -dagestan.ru -dudinka.ru -e-burg.ru -grozny.ru -irkutsk.ru -ivanovo.ru -izhevsk.ru -jar.ru -joshkar-ola.ru -kalmykia.ru -kaluga.ru -kamchatka.ru -karelia.ru -kazan.ru -kchr.ru -kemerovo.ru -khabarovsk.ru -khakassia.ru -khv.ru -kirov.ru -koenig.ru -komi.ru -kostroma.ru -krasnoyarsk.ru -kuban.ru -kurgan.ru -kursk.ru -lipetsk.ru -magadan.ru -mari.ru -mari-el.ru -marine.ru -mordovia.ru -// mosreg.ru Bug 1090800 - removed at request of Aleksey Konstantinov -msk.ru -murmansk.ru -nalchik.ru -nnov.ru -nov.ru -novosibirsk.ru -nsk.ru -omsk.ru -orenburg.ru -oryol.ru -palana.ru -penza.ru -perm.ru -ptz.ru -rnd.ru -ryazan.ru -sakhalin.ru -samara.ru -saratov.ru -simbirsk.ru -smolensk.ru -spb.ru -stavropol.ru -stv.ru -surgut.ru -tambov.ru -tatarstan.ru -tom.ru -tomsk.ru -tsaritsyn.ru -tsk.ru -tula.ru -tuva.ru -tver.ru -tyumen.ru -udm.ru -udmurtia.ru -ulan-ude.ru -vladikavkaz.ru -vladimir.ru -vladivostok.ru -volgograd.ru -vologda.ru -voronezh.ru -vrn.ru -vyatka.ru -yakutia.ru -yamal.ru -yaroslavl.ru -yekaterinburg.ru -yuzhno-sakhalinsk.ru -// More geographical domains -amursk.ru -baikal.ru -cmw.ru -fareast.ru -jamal.ru -kms.ru -k-uralsk.ru -kustanai.ru -kuzbass.ru -mytis.ru -nakhodka.ru -nkz.ru -norilsk.ru -oskol.ru -pyatigorsk.ru -rubtsovsk.ru -snz.ru -syzran.ru -vdonsk.ru -zgrad.ru -// State domains gov.ru +int.ru mil.ru -// Technical domains test.ru // rw : http://www.nic.rw/cgi-bin/policy.pl @@ -5860,7 +5800,7 @@ tv.sd gov.sd info.sd -// se : http://en.wikipedia.org/wiki/.se +// se : https://en.wikipedia.org/wiki/.se // Submitted by registry se a.se @@ -5920,14 +5860,14 @@ gov.sh org.sh mil.sh -// si : http://en.wikipedia.org/wiki/.si +// si : https://en.wikipedia.org/wiki/.si si // sj : No registrations at this time. // Submitted by registry sj -// sk : http://en.wikipedia.org/wiki/.sk +// sk : https://en.wikipedia.org/wiki/.sk // list of 2nd level domains ? sk @@ -5940,10 +5880,10 @@ edu.sl gov.sl org.sl -// sm : http://en.wikipedia.org/wiki/.sm +// sm : https://en.wikipedia.org/wiki/.sm sm -// sn : http://en.wikipedia.org/wiki/.sn +// sn : https://en.wikipedia.org/wiki/.sn sn art.sn com.sn @@ -5959,7 +5899,7 @@ com.so net.so org.so -// sr : http://en.wikipedia.org/wiki/.sr +// sr : https://en.wikipedia.org/wiki/.sr sr // st : http://www.nic.st/html/policyrules/ @@ -5977,40 +5917,8 @@ principe.st saotome.st store.st -// su : http://en.wikipedia.org/wiki/.su +// su : https://en.wikipedia.org/wiki/.su su -adygeya.su -arkhangelsk.su -balashov.su -bashkiria.su -bryansk.su -dagestan.su -grozny.su -ivanovo.su -kalmykia.su -kaluga.su -karelia.su -khakassia.su -krasnodar.su -kurgan.su -lenug.su -mordovia.su -msk.su -murmansk.su -nalchik.su -nov.su -obninsk.su -penza.su -pokrovsk.su -sochi.su -spb.su -togliatti.su -troitsk.su -tula.su -tuva.su -vladikavkaz.su -vladimir.su -vologda.su // sv : http://www.svnet.org.sv/niveldos.pdf sv @@ -6020,12 +5928,12 @@ gob.sv org.sv red.sv -// sx : http://en.wikipedia.org/wiki/.sx +// sx : https://en.wikipedia.org/wiki/.sx // Submitted by registry sx gov.sx -// sy : http://en.wikipedia.org/wiki/.sy +// sy : https://en.wikipedia.org/wiki/.sy // see also: http://www.gobin.info/domainname/sy.doc sy edu.sy @@ -6035,31 +5943,31 @@ mil.sy com.sy org.sy -// sz : http://en.wikipedia.org/wiki/.sz +// sz : https://en.wikipedia.org/wiki/.sz // http://www.sispa.org.sz/ sz co.sz ac.sz org.sz -// tc : http://en.wikipedia.org/wiki/.tc +// tc : https://en.wikipedia.org/wiki/.tc tc -// td : http://en.wikipedia.org/wiki/.td +// td : https://en.wikipedia.org/wiki/.td td -// tel: http://en.wikipedia.org/wiki/.tel +// tel: https://en.wikipedia.org/wiki/.tel // http://www.telnic.org/ tel -// tf : http://en.wikipedia.org/wiki/.tf +// tf : https://en.wikipedia.org/wiki/.tf tf -// tg : http://en.wikipedia.org/wiki/.tg +// tg : https://en.wikipedia.org/wiki/.tg // http://www.nic.tg/ tg -// th : http://en.wikipedia.org/wiki/.th +// th : https://en.wikipedia.org/wiki/.th // Submitted by registry th ac.th @@ -6088,10 +5996,10 @@ org.tj test.tj web.tj -// tk : http://en.wikipedia.org/wiki/.tk +// tk : https://en.wikipedia.org/wiki/.tk tk -// tl : http://en.wikipedia.org/wiki/.tl +// tl : https://en.wikipedia.org/wiki/.tl tl gov.tl @@ -6106,7 +6014,7 @@ gov.tm mil.tm edu.tm -// tn : http://en.wikipedia.org/wiki/.tn +// tn : https://en.wikipedia.org/wiki/.tn // http://whois.ati.tn/ tn com.tn @@ -6130,7 +6038,7 @@ agrinet.tn defense.tn turen.tn -// to : http://en.wikipedia.org/wiki/.to +// to : https://en.wikipedia.org/wiki/.to // Submitted by registry to com.to @@ -6171,7 +6079,7 @@ nc.tr // Used by government agencies of Northern Cyprus gov.nc.tr -// travel : http://en.wikipedia.org/wiki/.travel +// travel : https://en.wikipedia.org/wiki/.travel travel // tt : http://www.nic.tt/ @@ -6194,12 +6102,12 @@ name.tt gov.tt edu.tt -// tv : http://en.wikipedia.org/wiki/.tv +// tv : https://en.wikipedia.org/wiki/.tv // Not listing any 2LDs as reserved since none seem to exist in practice, // Wikipedia notwithstanding. tv -// tw : http://en.wikipedia.org/wiki/.tw +// tw : https://en.wikipedia.org/wiki/.tw tw edu.tw gov.tw @@ -6325,7 +6233,7 @@ ne.ug com.ug org.ug -// uk : http://en.wikipedia.org/wiki/.uk +// uk : https://en.wikipedia.org/wiki/.uk // Submitted by registry uk ac.uk @@ -6340,7 +6248,7 @@ plc.uk police.uk *.sch.uk -// us : http://en.wikipedia.org/wiki/.us +// us : https://en.wikipedia.org/wiki/.us us dni.us fed.us @@ -6528,7 +6436,7 @@ lib.ca.us lib.co.us lib.ct.us lib.dc.us -lib.de.us +// lib.de.us Issue #243 - Moved to Private section at request of Ed Moore lib.fl.us lib.ga.us lib.gu.us @@ -6581,6 +6489,17 @@ lib.wy.us pvt.k12.ma.us chtr.k12.ma.us paroch.k12.ma.us +// Merit Network, Inc. maintains the registry for =~ /(k12|cc|lib).mi.us/ and the following +// see also: http://domreg.merit.edu +// see also: whois -h whois.domreg.merit.edu help +ann-arbor.mi.us +cog.mi.us +dst.mi.us +eaton.mi.us +gen.mi.us +mus.mi.us +tec.mi.us +washtenaw.mi.us // uy : http://www.nic.org.uy/ uy @@ -6598,10 +6517,10 @@ com.uz net.uz org.uz -// va : http://en.wikipedia.org/wiki/.va +// va : https://en.wikipedia.org/wiki/.va va -// vc : http://en.wikipedia.org/wiki/.vc +// vc : https://en.wikipedia.org/wiki/.vc // Submitted by registry vc com.vc @@ -6632,7 +6551,7 @@ store.ve tec.ve web.ve -// vg : http://en.wikipedia.org/wiki/.vg +// vg : https://en.wikipedia.org/wiki/.vg vg // vi : http://www.nic.vi/newdomainform.htm @@ -6661,7 +6580,7 @@ name.vn pro.vn health.vn -// vu : http://en.wikipedia.org/wiki/.vu +// vu : https://en.wikipedia.org/wiki/.vu // http://www.vunic.vu/ vu com.vu @@ -6672,7 +6591,7 @@ org.vu // wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf wf -// ws : http://en.wikipedia.org/wiki/.ws +// ws : https://en.wikipedia.org/wiki/.ws // http://samoanic.ws/index.dhtml ws com.ws @@ -6702,6 +6621,9 @@ yt // xn--54b7fta0cc ("Bangla", Bangla) : BD বাংলা +// xn--90ae ("bg", Bulgarian) : BG +бг + // xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY // Operated by .by registry бел @@ -6723,6 +6645,9 @@ yt // http://www.dotmasr.eg/ مصر +// xn--e1a4c ("eu", Cyrillic) : EU +ею + // xn--node ("ge", Georgian Mkhedruli) : GE გე @@ -6734,6 +6659,34 @@ yt // https://www2.hkirc.hk/register/rules.jsp 香港 +// xn--2scrj9c ("Bharat", Kannada) : IN +// India +ಭಾರತ + +// xn--3hcrj9c ("Bharat", Oriya) : IN +// India +ଭାରତ + +// xn--45br5cyl ("Bharatam", Assamese) : IN +// India +ভাৰত + +// xn--h2breg3eve ("Bharatam", Sanskrit) : IN +// India +भारतम् + +// xn--h2brj9c8c ("Bharot", Santali) : IN +// India +भारोत + +// xn--mgbgu82a ("Bharat", Sindhi) : IN +// India +ڀارت + +// xn--rvc1e0am3e ("Bharatam", Malayalam) : IN +// India +ഭാരതം + // xn--h2brj9c ("Bharat", Devanagari) : IN // India भारत @@ -6875,6 +6828,12 @@ yt // xn--o3cw4h ("Thai", Thai) : TH // http://www.thnic.co.th ไทย +ศึกษา.ไทย +ธุรกิจ.ไทย +รัฐบาล.ไทย +ทหาร.ไทย +เน็ต.ไทย +องค์กร.ไทย // xn--pgbs0dh ("Tunisia", Arabic) : TN // http://nic.tn @@ -6922,14 +6881,31 @@ school.za tm.za web.za -// zm : http://en.wikipedia.org/wiki/.zm -*.zm - -// zw : http://en.wikipedia.org/wiki/.zw -*.zw - - -// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2016-01-04T22:39:54Z +// zm : https://zicta.zm/ +// Submitted by registry +zm +ac.zm +biz.zm +co.zm +com.zm +edu.zm +gov.zm +info.zm +mil.zm +net.zm +org.zm +sch.zm + +// zw : https://www.potraz.gov.zw/ +// Confirmed by registry 2017-01-25 +zw +ac.zw +co.zw +gov.zw +mil.zw +org.zw + +// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2017-02-23T00:46:09Z // aaa : 2015-02-26 American Automobile Association, Inc. aaa @@ -7006,9 +6982,6 @@ afl // africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa africa -// africamagic : 2015-03-05 Electronic Media Network (Pty) Ltd -africamagic - // agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) agakhan @@ -7114,6 +7087,9 @@ archi // army : 2014-03-06 United TLD Holdco Ltd. army +// art : 2016-03-24 UK Creative Ideas Limited +art + // arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E. arte @@ -7285,7 +7261,7 @@ blanco // blockbuster : 2015-07-30 Dish DBS Corporation blockbuster -// blog : 2015-05-14 PRIMER NIVEL S.A. +// blog : 2015-05-14 blog // bloomberg : 2014-07-17 Bloomberg IP Holdings LLC @@ -7339,7 +7315,7 @@ bosch // bostik : 2015-05-28 Bostik SA bostik -// boston : 2015-12-10 Boston Globe Media Partners, LLC +// boston : 2015-12-10 boston // bot : 2014-12-18 Amazon EU S.à r.l. @@ -7408,6 +7384,9 @@ call // calvinklein : 2015-07-30 PVH gTLD Holdings LLC calvinklein +// cam : 2016-04-21 AC Webconnecting Holding B.V. +cam + // camera : 2013-08-27 Atomic Maple, LLC camera @@ -7708,6 +7687,9 @@ dad // dance : 2013-10-24 United TLD Holdco Ltd. dance +// data : 2016-06-02 Dish DBS Corporation +data + // date : 2014-11-20 dot Date Limited date @@ -7804,6 +7786,9 @@ dnp // docs : 2014-10-16 Charleston Road Registry Inc. docs +// doctor : 2016-06-02 Brice Trail, LLC +doctor + // dodge : 2015-07-30 FCA US LLC. dodge @@ -7816,9 +7801,6 @@ doha // domains : 2013-10-17 Sugar Cross, LLC domains -// doosan : 2014-04-03 Doosan Corporation -doosan - // dot : 2015-05-21 Dish DBS Corporation dot @@ -7828,9 +7810,6 @@ download // drive : 2015-03-05 Charleston Road Registry Inc. drive -// dstv : 2015-03-12 MultiChoice (Proprietary) Limited -dstv - // dtv : 2015-06-04 Dish DBS Corporation dtv @@ -7846,7 +7825,7 @@ dunlop // duns : 2015-08-06 The Dun & Bradstreet Corporation duns -// dupont : 2015-06-25 E.I. du Pont de Nemours and Company +// dupont : 2015-06-25 E. I. du Pont de Nemours and Company dupont // durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry @@ -7855,8 +7834,8 @@ durban // dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG dvag -// dwg : 2015-07-23 Autodesk, Inc. -dwg +// dvr : 2016-05-26 Hughes Satellite Systems Corporation +dvr // earth : 2014-12-04 Interlink Co., Ltd. earth @@ -7864,6 +7843,9 @@ earth // eat : 2014-01-23 Charleston Road Registry Inc. eat +// eco : 2016-07-08 Big Room Inc. +eco + // edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. edeka @@ -7876,9 +7858,6 @@ email // emerck : 2014-04-03 Merck KGaA emerck -// emerson : 2015-07-23 Emerson Electric Co. -emerson - // energy : 2014-09-11 Binky Birch, LLC energy @@ -8047,15 +8026,15 @@ florist // flowers : 2014-10-09 Uniregistry, Corp. flowers -// flsmidth : 2014-07-24 FLSmidth A/S -flsmidth - // fly : 2014-05-08 Charleston Road Registry Inc. fly // foo : 2014-01-23 Charleston Road Registry Inc. foo +// food : 2016-04-21 Lifestyle Domain Holdings, Inc. +food + // foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc. foodnetwork @@ -8107,6 +8086,9 @@ fujitsu // fujixerox : 2015-07-23 Xerox DNHC LLC fujixerox +// fun : 2016-01-14 +fun + // fund : 2014-03-20 John Castle, LLC fund @@ -8134,7 +8116,7 @@ gallup // game : 2015-05-28 Uniregistry, Corp. game -// games : 2015-05-28 Foggy Beach, LLC +// games : 2015-05-28 games // gap : 2015-07-31 The Gap, Inc. @@ -8194,6 +8176,9 @@ globo // gmail : 2014-05-01 Charleston Road Registry Inc. gmail +// gmbh : 2016-01-29 Extra Dynamite, LLC +gmbh + // gmo : 2014-01-09 GMO Internet, Inc. gmo @@ -8233,9 +8218,6 @@ gop // got : 2014-12-18 Amazon EU S.à r.l. got -// gotv : 2015-03-12 MultiChoice (Proprietary) Limited -gotv - // grainger : 2015-05-07 Grainger Registry Services, LLC grainger @@ -8251,6 +8233,9 @@ green // gripe : 2014-03-06 Corn Sunset, LLC gripe +// grocery : 2016-06-16 Wal-Mart Stores, Inc. +grocery + // group : 2014-08-15 Romeo Town, LLC group @@ -8359,6 +8344,9 @@ honeywell // horse : 2013-11-21 Top Level Domain Holdings Limited horse +// hospital : 2016-10-20 Ruby Pike, LLC +hospital + // host : 2014-04-17 DotHost Inc. host @@ -8371,6 +8359,9 @@ hot // hoteles : 2015-03-05 Travel Reservations SRL hoteles +// hotels : 2016-04-07 Booking.com B.V. +hotels + // hotmail : 2014-12-18 Microsoft Corporation hotmail @@ -8413,9 +8404,6 @@ ieee // ifm : 2014-01-30 ifm electronic gmbh ifm -// iinet : 2014-07-03 Connect West Pty. Ltd. -iinet - // ikano : 2015-07-09 Ikano S.A. ikano @@ -8509,7 +8497,7 @@ jcp // jeep : 2015-07-30 FCA US LLC. jeep -// jetzt : 2014-01-09 New TLD Company AB +// jetzt : 2014-01-09 jetzt // jewelry : 2015-03-05 Wild Bloom, LLC @@ -8611,9 +8599,6 @@ kred // kuokgroup : 2015-04-09 Kerry Trading Co. Limited kuokgroup -// kyknet : 2015-03-05 Electronic Media Network (Pty) Ltd -kyknet - // kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen kyoto @@ -8818,6 +8803,9 @@ management // mango : 2013-10-24 PUNTO FA S.L. mango +// map : 2016-06-09 Charleston Road Registry Inc. +map + // market : 2014-03-06 market @@ -8878,6 +8866,9 @@ menu // meo : 2014-11-07 PT Comunicacoes S.A. meo +// merckmsd : 2016-07-14 MSD Registry Holdings, Inc. +merckmsd + // metlife : 2015-05-07 MetLife Services and Solutions, LLC metlife @@ -8908,8 +8899,8 @@ mls // mma : 2014-11-07 MMA IARD mma -// mnet : 2015-03-05 Electronic Media Network (Pty) Ltd -mnet +// mobile : 2016-06-02 Dish DBS Corporation +mobile // mobily : 2014-12-18 GreenTech Consultancy Company W.L.L. mobily @@ -8950,7 +8941,7 @@ mortgage // moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) moscow -// moto : 2015-06-04 Charleston Road Registry Inc. +// moto : 2015-06-04 moto // motorcycles : 2014-01-09 DERMotorcycles, LLC @@ -8977,18 +8968,9 @@ mtpc // mtr : 2015-03-12 MTR Corporation Limited mtr -// multichoice : 2015-03-12 MultiChoice (Proprietary) Limited -multichoice - // mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC mutual -// mutuelle : 2015-06-18 Fédération Nationale de la Mutualité Française -mutuelle - -// mzansimagic : 2015-03-05 Electronic Media Network (Pty) Ltd -mzansimagic - // nab : 2015-08-20 National Australia Bank Limited nab @@ -8998,9 +8980,6 @@ nadex // nagoya : 2013-10-24 GMO Registry, Inc. nagoya -// naspers : 2015-02-12 Intelprop (Proprietary) Limited -naspers - // nationwide : 2015-07-23 Nationwide Mutual Insurance Company nationwide @@ -9106,7 +9085,7 @@ nyc // obi : 2014-09-25 OBI Group Holding SE & Co. KGaA obi -// observer : 2015-04-30 Guardian News and Media Limited +// observer : 2015-04-30 observer // off : 2015-07-23 Johnson Shareholdings, Inc. @@ -9163,9 +9142,6 @@ orange // organic : 2014-03-27 Afilias Limited organic -// orientexpress : 2015-02-05 Belmond Ltd. -orientexpress - // origins : 2015-10-01 The Estée Lauder Companies Inc. origins @@ -9214,9 +9190,6 @@ passagens // pay : 2015-08-27 Amazon EU S.à r.l. pay -// payu : 2015-02-12 MIH PayU B.V. -payu - // pccw : 2015-05-14 PCCW Enterprises Limited pccw @@ -9229,9 +9202,15 @@ pfizer // pharmacy : 2014-06-19 National Association of Boards of Pharmacy pharmacy +// phd : 2016-07-28 Charleston Road Registry Inc. +phd + // philips : 2014-11-07 Koninklijke Philips N.V. philips +// phone : 2016-06-02 Dish DBS Corporation +phone + // photo : 2013-11-14 Uniregistry, Corp. photo @@ -9367,6 +9346,9 @@ qvc // racing : 2014-12-04 Premier Registry Limited racing +// radio : 2016-07-21 European Broadcasting Union (EBU) +radio + // raid : 2015-07-23 Johnson Shareholdings, Inc. raid @@ -9484,6 +9466,9 @@ room // rsvp : 2014-05-08 Charleston Road Registry Inc. rsvp +// rugby : 2016-12-15 World Rugby Strategic Developments Limited +rugby + // ruhr : 2013-10-02 regiodot GmbH & Co. KG ruhr @@ -9589,6 +9574,9 @@ scor // scot : 2014-01-23 Dot Scot Registry Limited scot +// search : 2016-06-09 Charleston Road Registry Inc. +search + // seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) seat @@ -9649,6 +9637,12 @@ shiksha // shoes : 2013-10-02 Binky Galley, LLC shoes +// shop : 2016-04-08 GMO Registry, Inc. +shop + +// shopping : 2016-03-31 +shopping + // shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. shouji @@ -9781,6 +9775,9 @@ storage // store : 2015-04-09 DotStore Inc. store +// stream : 2016-01-08 dot Stream Limited +stream + // studio : 2015-02-11 studio @@ -9793,9 +9790,6 @@ style // sucks : 2014-12-22 Vox Populi Registry Inc. sucks -// supersport : 2015-03-05 SuperSport International Holdings Proprietary Limited -supersport - // supplies : 2013-12-19 Atomic Fields, LLC supplies @@ -9901,9 +9895,6 @@ theater // theatre : 2015-05-07 theatre -// theguardian : 2015-04-30 Guardian News and Media Limited -theguardian - // tiaa : 2015-07-23 Teachers Insurance and Annuity Association of America tiaa @@ -10051,7 +10042,7 @@ ventures // verisign : 2015-08-13 VeriSign, Inc. verisign -// versicherung : 2014-03-20 dotversicherung-registry GmbH +// versicherung : 2014-03-20 versicherung // vet : 2014-03-06 @@ -10276,9 +10267,6 @@ xin // xn--4gbrim : 2013-10-04 Suhub Electronic Establishment موقع -// xn--4gq48lf9j : 2015-07-31 Wal-Mart Stores, Inc. -一号店 - // xn--55qw42g : 2013-11-08 China Organizational Name Administration Center 公益 @@ -10339,7 +10327,7 @@ xin // xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD 삼성 -// xn--czr694b : 2014-01-16 HU YI GLOBAL INFORMATION RESOURCES (HOLDING) COMPANY. HONGKONG LIMITED +// xn--czr694b : 2014-01-16 Dot Trademark TLD Holding Company Limited 商标 // xn--czrs0t : 2013-12-19 Wild Island, LLC @@ -10396,7 +10384,7 @@ xin // xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry संगठन -// xn--imr513n : 2014-12-11 HU YI GLOBAL INFORMATION RESOURCES (HOLDING) COMPANY. HONGKONG LIMITED +// xn--imr513n : 2014-12-11 Dot Trademark TLD Holding Company Limited 餐厅 // xn--io0a7i : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) @@ -10590,59 +10578,184 @@ zuerich // ===BEGIN PRIVATE DOMAINS=== // (Note: these are in alphabetical order by company name) +// 1GB LLC : https://www.1gb.ua/ +// Submitted by 1GB LLC +cc.ua +inf.ua +ltd.ua + +// Agnat sp. z o.o. : https://domena.pl +// Submitted by Przemyslaw Plewa +beep.pl + +// Alces Software Ltd : http://alces-software.com +// Submitted by Mark J. Titorenko +*.compute.estate +*.alces.network + +// alwaysdata : https://www.alwaysdata.com +// Submitted by Cyril +*.alwaysdata.net + // Amazon CloudFront : https://aws.amazon.com/cloudfront/ // Submitted by Donavan Miller cloudfront.net -// Amazon Elastic Compute Cloud: https://aws.amazon.com/ec2/ -// Submitted by Osman Surkatty -ap-northeast-1.compute.amazonaws.com -ap-southeast-1.compute.amazonaws.com -ap-southeast-2.compute.amazonaws.com -cn-north-1.compute.amazonaws.cn -compute.amazonaws.cn -compute.amazonaws.com -compute-1.amazonaws.com -eu-west-1.compute.amazonaws.com -eu-central-1.compute.amazonaws.com -sa-east-1.compute.amazonaws.com +// Amazon Elastic Compute Cloud : https://aws.amazon.com/ec2/ +// Submitted by Luke Wells +*.compute.amazonaws.com +*.compute-1.amazonaws.com +*.compute.amazonaws.com.cn us-east-1.amazonaws.com -us-gov-west-1.compute.amazonaws.com -us-west-1.compute.amazonaws.com -us-west-2.compute.amazonaws.com -z-1.compute-1.amazonaws.com -z-2.compute-1.amazonaws.com // Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ -// Submitted by Adam Stein +// Submitted by Luke Wells +cn-north-1.eb.amazonaws.com.cn elasticbeanstalk.com +ap-northeast-1.elasticbeanstalk.com +ap-northeast-2.elasticbeanstalk.com +ap-south-1.elasticbeanstalk.com +ap-southeast-1.elasticbeanstalk.com +ap-southeast-2.elasticbeanstalk.com +ca-central-1.elasticbeanstalk.com +eu-central-1.elasticbeanstalk.com +eu-west-1.elasticbeanstalk.com +eu-west-2.elasticbeanstalk.com +sa-east-1.elasticbeanstalk.com +us-east-1.elasticbeanstalk.com +us-east-2.elasticbeanstalk.com +us-gov-west-1.elasticbeanstalk.com +us-west-1.elasticbeanstalk.com +us-west-2.elasticbeanstalk.com // Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/ -// Submitted by Scott Vidmar -elb.amazonaws.com +// Submitted by Luke Wells +*.elb.amazonaws.com +*.elb.amazonaws.com.cn // Amazon S3 : https://aws.amazon.com/s3/ -// Submitted by Eric Kinolik +// Submitted by Luke Wells s3.amazonaws.com s3-ap-northeast-1.amazonaws.com +s3-ap-northeast-2.amazonaws.com +s3-ap-south-1.amazonaws.com s3-ap-southeast-1.amazonaws.com s3-ap-southeast-2.amazonaws.com -s3-external-1.amazonaws.com -s3-external-2.amazonaws.com -s3-fips-us-gov-west-1.amazonaws.com +s3-ca-central-1.amazonaws.com s3-eu-central-1.amazonaws.com s3-eu-west-1.amazonaws.com +s3-eu-west-2.amazonaws.com +s3-external-1.amazonaws.com +s3-fips-us-gov-west-1.amazonaws.com s3-sa-east-1.amazonaws.com s3-us-gov-west-1.amazonaws.com +s3-us-east-2.amazonaws.com s3-us-west-1.amazonaws.com s3-us-west-2.amazonaws.com +s3.ap-northeast-2.amazonaws.com +s3.ap-south-1.amazonaws.com s3.cn-north-1.amazonaws.com.cn +s3.ca-central-1.amazonaws.com s3.eu-central-1.amazonaws.com +s3.eu-west-2.amazonaws.com +s3.us-east-2.amazonaws.com +s3.dualstack.ap-northeast-1.amazonaws.com +s3.dualstack.ap-northeast-2.amazonaws.com +s3.dualstack.ap-south-1.amazonaws.com +s3.dualstack.ap-southeast-1.amazonaws.com +s3.dualstack.ap-southeast-2.amazonaws.com +s3.dualstack.ca-central-1.amazonaws.com +s3.dualstack.eu-central-1.amazonaws.com +s3.dualstack.eu-west-1.amazonaws.com +s3.dualstack.eu-west-2.amazonaws.com +s3.dualstack.sa-east-1.amazonaws.com +s3.dualstack.us-east-1.amazonaws.com +s3.dualstack.us-east-2.amazonaws.com +s3-website-us-east-1.amazonaws.com +s3-website-us-west-1.amazonaws.com +s3-website-us-west-2.amazonaws.com +s3-website-ap-northeast-1.amazonaws.com +s3-website-ap-southeast-1.amazonaws.com +s3-website-ap-southeast-2.amazonaws.com +s3-website-eu-west-1.amazonaws.com +s3-website-sa-east-1.amazonaws.com +s3-website.ap-northeast-2.amazonaws.com +s3-website.ap-south-1.amazonaws.com +s3-website.ca-central-1.amazonaws.com +s3-website.eu-central-1.amazonaws.com +s3-website.eu-west-2.amazonaws.com +s3-website.us-east-2.amazonaws.com + +// Amune : https://amune.org/ +// Submitted by Team Amune +t3l3p0rt.net +tele.amune.org + +// Aptible : https://www.aptible.com/ +// Submitted by Thomas Orozco +on-aptible.com + +// Asociación Amigos de la Informática "Euskalamiga" : http://encounter.eus/ +// Submitted by Hector Martin +user.party.eus + +// Association potager.org : https://potager.org/ +// Submitted by Lunar +pimienta.org +poivron.org +potager.org +sweetpepper.org + +// ASUSTOR Inc. : http://www.asustor.com +// Submitted by Vincent Tseng +myasustor.com + +// AVM : https://avm.de +// Submitted by Andreas Weise +myfritz.net + +// AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com +// Submitted by James Kennedy +*.awdev.ca +*.advisor.ws + +// backplane : https://www.backplane.io +// Submitted by Anthony Voutas +backplaneapp.io // BetaInABox // Submitted by Adrian betainabox.com +// BinaryLane : http://www.binarylane.com +// Submitted by Nathan O'Sullivan +bnr.la + +// Boomla : https://boomla.com +// Submitted by Tibor Halter +boomla.net + +// Boxfuse : https://boxfuse.com +// Submitted by Axel Fontaine +boxfuse.io + +// bplaced : https://www.bplaced.net/ +// Submitted by Miroslav Bozic +square7.ch +bplaced.com +bplaced.de +square7.de +bplaced.net +square7.net + +// BrowserSafetyMark +// Submitted by Dave Tharp +browsersafetymark.io + +// callidomus : https://www.callidomus.com/ +// Submitted by Marcus Popp +mycd.eu + // CentralNic : http://www.centralnic.com/names/domains // Submitted by registry ae.org @@ -10697,6 +10810,30 @@ co.com // c.la : http://www.c.la/ c.la +// certmgr.org : https://certmgr.org +// Submitted by B. Blechschmidt +certmgr.org + +// Citrix : https://citrix.com +// Submitted by Alex Stoddard +xenapponazure.com + +// ClearVox : http://www.clearvox.nl/ +// Submitted by Leon Rowland +virtueeldomein.nl + +// Cloud66 : https://www.cloud66.com/ +// Submitted by Khash Sajadi +c66.me + +// CloudAccess.net : https://www.cloudaccess.net/ +// Submitted by Pawel Panek +jdevcloud.com +wpdevcloud.com +cloudaccess.host +freesite.host +cloudaccess.net + // cloudControl : https://www.cloudcontrol.com/ // Submitted by Tobias Wilken cloudcontrolled.com @@ -10717,18 +10854,82 @@ r.cdn77.net rsc.cdn77.org ssl.origin.cdn77-secure.org +// Cloud DNS Ltd : http://www.cloudns.net +// Submitted by Aleksander Hristov +cloudns.asia +cloudns.biz +cloudns.club +cloudns.cc +cloudns.eu +cloudns.in +cloudns.info +cloudns.org +cloudns.pro +cloudns.pw +cloudns.us + // CoDNS B.V. co.nl co.no -// Commerce Guys, SAS -// Submitted by Damien Tournoud -*.platform.sh +// COSIMO GmbH : http://www.cosimo.de +// Submitted by Rene Marticke +dyn.cosidns.de +dynamisches-dns.de +dnsupdater.de +internet-dns.de +l-o-g-i-n.de +dynamic-dns.info +feste-ip.net +knx-server.net +static-access.net + +// Craynic, s.r.o. : http://www.craynic.com/ +// Submitted by Ales Krajnik +realm.cz + +// Cryptonomic : https://cryptonomic.net/ +// Submitted by Andrew Cady +*.cryptonomic.net // Cupcake : https://cupcake.io/ // Submitted by Jonathan Rudenberg cupcake.is +// cyon GmbH : https://www.cyon.ch/ +// Submitted by Dominic Luechinger +cyon.link +cyon.site + +// Daplie, Inc : https://daplie.com +// Submitted by AJ ONeal +daplie.me +localhost.daplie.me + +// Dansk.net : http://www.dansk.net/ +// Submitted by Anani Voule +biz.dk +co.dk +firm.dk +reg.dk +store.dk + +// Debian : https://www.debian.org/ +// Submitted by Peter Palfrader / Debian Sysadmin Team +debian.net + +// deSEC : https://desec.io/ +// Submitted by Peter Thomassen +dedyn.io + +// DNShome : https://www.dnshome.de/ +// Submitted by Norbert Auler +dnshome.de + +// DrayTek Corp. : https://www.draytek.com/ +// Submitted by Paul Fang +drayddns.com + // DreamHost : http://www.dreamhost.com/ // Submitted by Andrew Farmer dreamhosters.com @@ -10737,10 +10938,20 @@ dreamhosters.com // Submitted by Ricardo Padilha mydrobo.com +// Drud Holdings, LLC. : https://www.drud.com/ +// Submitted by Kevin Bridges +drud.io +drud.us + // DuckDNS : http://www.duckdns.org/ // Submitted by Richard Harper duckdns.org +// dy.fi : http://dy.fi/ +// Submitted by Heikki Hannikainen +dy.fi +tunk.org + // DynDNS.com : http://www.dyndns.com/services/dns/dyndns/ dyndns-at-home.com dyndns-at-work.com @@ -11022,6 +11233,60 @@ webhop.org worse-than.tv writesthisblog.com +// ddnss.de : https://www.ddnss.de/ +// Submitted by Robert Niedziela +ddnss.de +dyn.ddnss.de +dyndns.ddnss.de +dyndns1.de +dyn-ip24.de +home-webserver.de +dyn.home-webserver.de +myhome-server.de +ddnss.org + +// Definima : http://www.definima.com/ +// Submitted by Maxence Bitterli +definima.net +definima.io + +// Dynu.com : https://www.dynu.com/ +// Submitted by Sue Ye +ddnsfree.com +ddnsgeek.com +giize.com +gleeze.com +kozow.com +loseyourip.com +ooguy.com +theworkpc.com +casacam.net +dynu.net +accesscam.org +camdvr.org +freeddns.org +mywire.org +webredirect.org +myddns.rocks +blogsite.xyz + +// dynv6 : https://dynv6.com +// Submitted by Dominik Menke +dynv6.net + +// E4YOU spol. s.r.o. : https://e4you.cz/ +// Submitted by Vladimir Dudr +e4.cz + +// Enalean SAS: https://www.enalean.com +// Submitted by Thomas Cottier +mytuleap.com + +// Enonic : http://enonic.com/ +// Submitted by Erik Kaareng-Sunde +enonic.io +customer.enonic.io + // EU.org https://eu.org/ // Submitted by Pierre Beyssac eu.org @@ -11081,13 +11346,134 @@ tr.eu.org uk.eu.org us.eu.org -// Fastly Inc. http://www.fastly.com/ -// Submitted by Vladimir Vuksan +// Evennode : http://www.evennode.com/ +// Submitted by Michal Kralik +eu-1.evennode.com +eu-2.evennode.com +eu-3.evennode.com +eu-4.evennode.com +us-1.evennode.com +us-2.evennode.com +us-3.evennode.com +us-4.evennode.com + +// eDirect Corp. : https://hosting.url.com.tw/ +// Submitted by C.S. chang +twmail.cc +twmail.net +twmail.org +mymailer.com.tw +url.tw + +// Facebook, Inc. +// Submitted by Peter Ruibal +apps.fbsbx.com + +// FAITID : https://faitid.org/ +// Submitted by Maxim Alzoba +// https://www.flexireg.net/stat_info +ru.net +adygeya.ru +bashkiria.ru +bir.ru +cbg.ru +com.ru +dagestan.ru +grozny.ru +kalmykia.ru +kustanai.ru +marine.ru +mordovia.ru +msk.ru +mytis.ru +nalchik.ru +nov.ru +pyatigorsk.ru +spb.ru +vladikavkaz.ru +vladimir.ru +abkhazia.su +adygeya.su +aktyubinsk.su +arkhangelsk.su +armenia.su +ashgabad.su +azerbaijan.su +balashov.su +bashkiria.su +bryansk.su +bukhara.su +chimkent.su +dagestan.su +east-kazakhstan.su +exnet.su +georgia.su +grozny.su +ivanovo.su +jambyl.su +kalmykia.su +kaluga.su +karacol.su +karaganda.su +karelia.su +khakassia.su +krasnodar.su +kurgan.su +kustanai.su +lenug.su +mangyshlak.su +mordovia.su +msk.su +murmansk.su +nalchik.su +navoi.su +north-kazakhstan.su +nov.su +obninsk.su +penza.su +pokrovsk.su +sochi.su +spb.su +tashkent.su +termez.su +togliatti.su +troitsk.su +tselinograd.su +tula.su +tuva.su +vladikavkaz.su +vladimir.su +vologda.su + +// Fancy Bits, LLC : http://getchannels.com +// Submitted by Aman Gupta +channelsdvr.net + +// Fastly Inc. : http://www.fastly.com/ +// Submitted by Fastly Security +fastlylb.net +map.fastlylb.net +freetls.fastly.net +map.fastly.net +a.prod.fastly.net +global.prod.fastly.net a.ssl.fastly.net b.ssl.fastly.net global.ssl.fastly.net -a.prod.fastly.net -global.prod.fastly.net + +// Featherhead : https://featherhead.xyz/ +// Submitted by Simon Menke +fhapp.xyz + +// Fedora : https://fedoraproject.org/ +// submitted by Patrick Uiterwijk +fedorainfracloud.org +fedorapeople.org +cloud.fedoraproject.org + +// Filegear Inc. : https://www.filegear.com +// Submitted by Jason Zhu +filegear.me // Firebase, Inc. // Submitted by Chris Raynor @@ -11096,22 +11482,59 @@ firebaseapp.com // Flynn : https://flynn.io // Submitted by Jonathan Rudenberg flynnhub.com +flynnhosting.net + +// Freebox : http://www.freebox.fr +// Submitted by Romain Fliedel +freebox-os.com +freeboxos.com +fbx-os.fr +fbxos.fr +freebox-os.fr +freeboxos.fr + +// Fusion Intranet : https://www.fusion-intranet.com +// Submitted by Matthias Burtscher +myfusion.cloud + +// Futureweb OG : http://www.futureweb.at +// Submitted by Andreas Schnederle-Wagner +*.futurecms.at +futurehosting.at +futuremailing.at +*.ex.ortsinfo.at +*.kunden.ortsinfo.at +*.statics.cloud // GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains // Submitted by David Illsley service.gov.uk // GitHub, Inc. -// Submitted by Ben Toews +// Submitted by Patrick Toomey github.io githubusercontent.com +// GitLab, Inc. +// Submitted by Alex Hanselka +gitlab.io + +// UKHomeOffice : https://www.gov.uk/government/organisations/home-office +// Submitted by Jon Shanks +homeoffice.gov.uk + // GlobeHosting, Inc. // Submitted by Zoltan Egresi -ro.com +ro.im +shop.ro + +// GoIP DNS Services : http://www.goip.de +// Submitted by Christian Poulter +goip.de // Google, Inc. // Submitted by Eduardo Vela +*.0emm.com appspot.com blogspot.ae blogspot.al @@ -11188,21 +11611,35 @@ blogspot.tw blogspot.ug blogspot.vn cloudfunctions.net +cloud.goog codespot.com googleapis.com googlecode.com pagespeedmobilizer.com +publishproxy.com withgoogle.com withyoutube.com // Hashbang : https://hashbang.sh hashbang.sh +// Hasura : https://hasura.io +// Submitted by Shahidh K Muhammed +hasura-app.io + +// Hepforge : https://www.hepforge.org +// Submitted by David Grellscheid +hepforge.org + // Heroku : https://www.heroku.com/ // Submitted by Tom Maher herokuapp.com herokussl.com +// Ici la Lune : http://www.icilalune.com/ +// Submitted by Simon Morvan +moonscale.net + // iki.fi // Submitted by Hannu Aronsson iki.fi @@ -11211,6 +11648,108 @@ iki.fi biz.at info.at +// info.cx : http://info.cx +// Submitted by Jacob Slater +info.cx + +// Interlegis : http://www.interlegis.leg.br +// Submitted by Gabriel Ferreira +ac.leg.br +al.leg.br +am.leg.br +ap.leg.br +ba.leg.br +ce.leg.br +df.leg.br +es.leg.br +go.leg.br +ma.leg.br +mg.leg.br +ms.leg.br +mt.leg.br +pa.leg.br +pb.leg.br +pe.leg.br +pi.leg.br +pr.leg.br +rj.leg.br +rn.leg.br +ro.leg.br +rr.leg.br +rs.leg.br +sc.leg.br +se.leg.br +sp.leg.br +to.leg.br + +// intermetrics GmbH : https://pixolino.com/ +// Submitted by Wolfgang Schwarz +pixolino.com + +// IPiFony Systems, Inc. : https://www.ipifony.com/ +// Submitted by Matthew Hardeman +ipifony.net + +// Joyent : https://www.joyent.com/ +// Submitted by Brian Bennett +*.triton.zone +*.cns.joyent.com + +// JS.ORG : http://dns.js.org +// Submitted by Stefan Keim +js.org + +// Keyweb AG : https://www.keyweb.de +// Submitted by Martin Dannehl +keymachine.de + +// KnightPoint Systems, LLC : http://www.knightpoint.com/ +// Submitted by Roy Keene +knightpoint.systems + +// .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf +co.krd +edu.krd + +// LCube - Professional hosting e.K. : https://www.lcube-webhosting.de +// Submitted by Lars Laehn +git-repos.de +lcube-server.de +svn-repos.de + +// LiquidNet Ltd : http://www.liquidnetlimited.com/ +// Submitted by Victor Velchev +we.bs + +// Lukanet Ltd : https://lukanet.com +// Submitted by Anton Avramov +barsy.bg +barsyonline.com +barsy.de +barsy.eu +barsy.in +barsy.net +barsy.online +barsy.support + +// Magento Commerce +// Submitted by Damien Tournoud +*.magentosite.cloud + +// Mail.Ru Group : https://hb.cldmail.ru +// Submitted by Ilya Zaretskiy +hb.cldmail.ru + +// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ +// Submitted by Zdeněk Šustr +cloud.metacentrum.cz +custom.metacentrum.cz + +// Meteor Development Group : https://www.meteor.com/hosting +// Submitted by Pierre Carrier +meteorapp.com +eu.meteorapp.com + // Michau Enterprises Limited : http://www.co.pl/ co.pl @@ -11224,6 +11763,17 @@ cloudapp.net // Submitted by glob bmoattachments.org +// MSK-IX : https://www.msk-ix.ru/ +// Submitted by Khannanov Roman +net.ru +org.ru +pp.ru + +// Netlify : https://www.netlify.com +// Submitted by Jessica Parsons +bitballoon.com +netlify.com + // Neustar Inc. // Submitted by Trung Tran 4u.com @@ -11236,14 +11786,164 @@ ngrok.io // Submitted by Jeff Wheelhouse nfshost.com +// nsupdate.info : https://www.nsupdate.info/ +// Submitted by Thomas Waldmann +nsupdate.info +nerdpol.ovh + +// No-IP.com : https://noip.com/ +// Submitted by Deven Reza +blogsyte.com +brasilia.me +cable-modem.org +ciscofreak.com +collegefan.org +couchpotatofries.org +damnserver.com +ddns.me +ditchyourip.com +dnsfor.me +dnsiskinky.com +dvrcam.info +dynns.com +eating-organic.net +fantasyleague.cc +geekgalaxy.com +golffan.us +health-carereform.com +homesecuritymac.com +homesecuritypc.com +hopto.me +ilovecollege.info +loginto.me +mlbfan.org +mmafan.biz +myactivedirectory.com +mydissent.net +myeffect.net +mymediapc.net +mypsx.net +mysecuritycamera.com +mysecuritycamera.net +mysecuritycamera.org +net-freaks.com +nflfan.org +nhlfan.net +no-ip.ca +no-ip.co.uk +no-ip.net +noip.us +onthewifi.com +pgafan.net +point2this.com +pointto.us +privatizehealthinsurance.net +quicksytes.com +read-books.org +securitytactics.com +serveexchange.com +servehumour.com +servep2p.com +servesarcasm.com +stufftoread.com +ufcfan.org +unusualperson.com +workisboring.com +3utilities.com +bounceme.net +ddns.net +ddnsking.com +gotdns.ch +hopto.org +myftp.biz +myftp.org +myvnc.com +no-ip.biz +no-ip.info +no-ip.org +noip.me +redirectme.net +servebeer.com +serveblog.net +servecounterstrike.com +serveftp.com +servegame.com +servehalflife.com +servehttp.com +serveirc.com +serveminecraft.net +servemp3.com +servepics.com +servequake.com +sytes.net +webhop.me +zapto.org + +// NodeArt : https://nodeart.io +// Submitted by Konstantin Nosov +stage.nodeart.io + +// Nodum B.V. : https://nodum.io/ +// Submitted by Wietse Wind +nodum.co +nodum.io + // NYC.mn : http://www.information.nyc.mn // Submitted by Matthew Brown nyc.mn +// NymNom : https://nymnom.com/ +// Submitted by Dave McCormack +nom.ae +nom.ai +nom.al +nym.by +nym.bz +nom.cl +nom.gd +nom.gl +nym.gr +nom.gt +nom.hn +nom.im +nym.kz +nym.la +nom.li +nym.li +nym.lt +nym.lu +nym.me +nom.mk +nym.mx +nom.nu +nym.nz +nym.pe +nym.pt +nom.pw +nom.qa +nom.rs +nom.si +nym.sk +nym.su +nym.sx +nym.tw +nom.ug +nom.uy +nom.vc +nom.vg + +// Octopodal Solutions, LLC. : https://ulterius.io/ +// Submitted by Andrew Sampson +cya.gg + // One Fold Media : http://www.onefoldmedia.com/ // Submitted by Eddie Jones nid.io +// OpenCraft GmbH : http://opencraft.com/ +// Submitted by Sven Marnach +opencraft.hosting + // Opera Software, A.S.A. // Submitted by Yngve Pettersen operaunite.com @@ -11252,6 +11952,18 @@ operaunite.com // Submitted by Duarte Santos outsystemscloud.com +// OwnProvider : http://www.ownprovider.com +// Submitted by Jan Moennich +ownprovider.com + +// oy.lc +// Submitted by Charly Coste +oy.lc + +// Pagefog : https://pagefog.com/ +// Submitted by Derek Myers +pgfog.com + // Pagefront : https://www.pagefronthq.com/ // Submitted by Jason Kriss pagefrontapp.com @@ -11266,9 +11978,22 @@ zakopane.pl // Pantheon Systems, Inc. : https://pantheon.io/ // Submitted by Gary Dylina -pantheon.io +pantheonsite.io gotpantheon.com +// Peplink | Pepwave : http://peplink.com/ +// Submitted by Steve Leung +mypep.link + +// Planet-Work : https://www.planet-work.com/ +// Submitted by Frédéric VANNIÈRE +on-web.fr + +// Platform.sh : https://platform.sh +// Submitted by Nikola Kotur +*.platform.sh +*.platformsh.site + // prgmr.com : https://prgmr.com/ // Submitted by Sarah Newman xen.prgmr.com @@ -11277,10 +12002,34 @@ xen.prgmr.com // Submitted by registry priv.at +// Protonet GmbH : http://protonet.io +// Submitted by Martin Meier +protonet.io + +// Publication Presse Communication SARL : https://ppcom.fr +// Submitted by Yaacov Akiba Slama +chirurgiens-dentistes-en-france.fr +byen.site + // QA2 // Submitted by Daniel Dent (https://www.danieldent.com/) qa2.com +// QNAP System Inc : https://www.qnap.com +// Submitted by Nick Chang +dev-myqnapcloud.com +alpha-myqnapcloud.com +myqnapcloud.com + +// Quip : https://quip.com +// Submitted by Patrick Linehan +*.quipelements.com + +// Qutheory LLC : http://qutheory.io +// Submitted by Jonas Schwartz +vapor.cloud +vaporcloud.io + // Rackmaze LLC : https://www.rackmaze.com // Submitted by Kirill Pertsev rackmaze.com @@ -11290,21 +12039,96 @@ rackmaze.net // Submitted by Tim Kramer rhcloud.com +// RethinkDB : https://www.rethinkdb.com/ +// Submitted by Chris Kastorff +hzc.io + +// Revitalised Limited : http://www.revitalised.co.uk +// Submitted by Jack Price +wellbeingzone.eu +ptplus.fit +wellbeingzone.co.uk + // Sandstorm Development Group, Inc. : https://sandcats.io/ // Submitted by Asheesh Laroia sandcats.io +// SBE network solutions GmbH : https://www.sbe.de/ +// Submitted by Norman Meilick +logoip.de +logoip.com + +// Securepoint GmbH : https://www.securepoint.de +// Submitted by Erik Anders +firewall-gateway.com +firewall-gateway.de +my-gateway.de +my-router.de +spdns.de +spdns.eu +firewall-gateway.net +my-firewall.org +myfirewall.org +spdns.org + +// SensioLabs, SAS : https://sensiolabs.com/ +// Submitted by Fabien Potencier +*.sensiosite.cloud + // Service Online LLC : http://drs.ua/ // Submitted by Serhii Bulakh biz.ua co.ua pp.ua +// ShiftEdit : https://shiftedit.net/ +// Submitted by Adam Jimenez +shiftedit.io + +// Shopblocks : http://www.shopblocks.com/ +// Submitted by Alex Bowers +myshopblocks.com + // SinaAppEngine : http://sae.sina.com.cn/ // Submitted by SinaAppEngine +1kapp.com +appchizi.com +applinzi.com sinaapp.com vipsinaapp.com -1kapp.com + +// Skyhat : http://www.skyhat.io +// Submitted by Shante Adam +bounty-full.com +alpha.bounty-full.com +beta.bounty-full.com + +// staticland : https://static.land +// Submitted by Seth Vincent +static.land +dev.static.land +sites.static.land + +// SourceLair PC : https://www.sourcelair.com +// Submitted by Antonis Kalipetis +apps.lair.io +*.stolos.io + +// SpaceKit : https://www.spacekit.io/ +// Submitted by Reza Akhavan +spacekit.io + +// Stackspace : https://www.stackspace.io/ +// Submitted by Lina He +stackspace.space + +// Storj Labs Inc. : https://storj.io/ +// Submitted by Philip Hutchins +storj.farm + +// Sub 6 Limited: http://www.sub6.com +// Submitted by Dan Miller +temp-dns.com // Synology, Inc. : https://www.synology.com/ // Submitted by Rony Weng @@ -11321,6 +12145,11 @@ familyds.org i234.me myds.me synology.me +vpnplus.to + +// TAIFUN Software AG : http://taifun-software.de +// Submitted by Bjoern Henke +taifun-dns.de // TASK geographical domains (www.task.gda.pl/uslugi/dns) gda.pl @@ -11329,6 +12158,70 @@ gdynia.pl med.pl sopot.pl +// Thingdust AG : https://thingdust.com/ +// Submitted by Adrian Imboden +cust.dev.thingdust.io +cust.disrec.thingdust.io +cust.prod.thingdust.io +cust.testing.thingdust.io + +// TownNews.com : http://www.townnews.com +// Submitted by Dustin Ward +bloxcms.com +townnews-staging.com + +// TrafficPlex GmbH : https://www.trafficplex.de/ +// Submitted by Phillipp Röll +12hp.at +2ix.at +4lima.at +lima-city.at +12hp.ch +2ix.ch +4lima.ch +lima-city.ch +trafficplex.cloud +de.cool +12hp.de +2ix.de +4lima.de +lima-city.de +1337.pictures +clan.rip +lima-city.rocks +webspace.rocks +lima.zone + +// TransIP : htts://www.transip.nl +// Submitted by Rory Breuk +*.transurl.be +*.transurl.eu +*.transurl.nl + +// TuxFamily : http://tuxfamily.org +// Submitted by TuxFamily administrators +tuxfamily.org + +// TwoDNS : https://www.twodns.de/ +// Submitted by TwoDNS-Support +dd-dns.de +diskstation.eu +diskstation.org +dray-dns.de +draydns.de +dyn-vpn.de +dynvpn.de +mein-vigor.de +my-vigor.de +my-wan.de +syno-ds.de +synology-diskstation.de +synology-ds.de + +// Uberspace : https://uberspace.de +// Submitted by Moritz Werner +uber.space + // UDR Limited : http://www.udr.hk.com // Submitted by registry hk.com @@ -11336,13 +12229,59 @@ hk.org ltd.hk inc.hk +// .US +// Submitted by Ed Moore +lib.de.us + +// Viprinet Europe GmbH : http://www.viprinet.com +// Submitted by Simon Kissel +router.management + +// Virtual-Info : https://www.virtual-info.info/ +// Submitted by Adnan RIHAN +v-info.info + +// WeDeploy by Liferay, Inc. : https://www.wedeploy.com +// Submitted by Henrique Vicente +wedeploy.io +wedeploy.me +wedeploy.sh + +// Western Digital Technologies, Inc : https://www.wdc.com +// Submitted by Jung Jin +remotewd.com + +// Wikimedia Labs : https://wikitech.wikimedia.org +// Submitted by Yuvi Panda +wmflabs.org + +// XS4ALL Internet bv : https://www.xs4all.nl/ +// Submitted by Daniel Mostertman +cistron.nl +demon.nl +xs4all.space + // Yola : https://www.yola.com/ // Submitted by Stefano Rivera yolasite.com +// Yombo : https://yombo.net +// Submitted by Mitch Schwenk +ybo.faith +yombo.me +homelink.one +ybo.party +ybo.review +ybo.science +ybo.trade + // ZaNiC : http://www.za.net/ // Submitted by registry za.net za.org +// Zeit, Inc. : https://zeit.domains/ +// Submitted by Olli Vanhoja +now.sh + // ===END PRIVATE DOMAINS=== From 0163609f5072154f014b9a1a5d1727854e035a90 Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Thu, 5 Oct 2017 06:33:37 -0500 Subject: [PATCH 025/461] Fix failing test --- tests/src/Pdp/PublicSuffixListManagerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/src/Pdp/PublicSuffixListManagerTest.php b/tests/src/Pdp/PublicSuffixListManagerTest.php index 89bb7f91..9fa48ace 100644 --- a/tests/src/Pdp/PublicSuffixListManagerTest.php +++ b/tests/src/Pdp/PublicSuffixListManagerTest.php @@ -201,7 +201,7 @@ public function testGetProvidedListFromDefaultCacheDir() // By not providing cache I'm forcing use of default cache dir $listManager = new PublicSuffixListManager(); $publicSuffixList = $listManager->getList(); - $this->assertGreaterThanOrEqual(300, count($publicSuffixList)); + $this->assertGreaterThanOrEqual(300, count($publicSuffixList->getRules())); } private function getMock(string $class) From 347f30b980c3bdfa59a9386eab0860310c2fb9e0 Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Thu, 5 Oct 2017 06:52:58 -0500 Subject: [PATCH 026/461] Update phpunit.xml.dist Add schema and remove redundant and incorrect values. --- phpunit.xml.dist | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index c7cb89e9..0534373e 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,9 +1,9 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/6.3/phpunit.xsd" + bootstrap="tests/bootstrap.php" + colors="true"> tests/src @@ -17,17 +17,11 @@ + target="build/coverage" + lowUpperBound="40" /> - - From ab1192c7a6dee2685518ac7a24aaa21995675a9f Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Thu, 5 Oct 2017 06:56:38 -0500 Subject: [PATCH 027/461] Add php-cs-fixer and composer script --- composer.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 730da157..060a4b20 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,8 @@ }, "require-dev": { "phpunit/phpunit": "^6.3", - "mikey179/vfsStream": "^1.6" + "mikey179/vfsStream": "^1.6", + "friendsofphp/php-cs-fixer": "^2.7" }, "autoload": { "psr-0": { @@ -41,6 +42,7 @@ } }, "scripts": { - "post-install-cmd": "php bin/update-psl" + "post-install-cmd": "php bin/update-psl", + "pcf": "php-cs-fixer fix --verbose" } } From 7b43d724d7b2def847faa5a9d936bd4a98b48538 Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Thu, 5 Oct 2017 07:14:35 -0500 Subject: [PATCH 028/461] Remove isValid from domain constructors --- src/Pdp/MatchedDomain.php | 11 ++--------- src/Pdp/UnmatchedDomain.php | 11 ++--------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/src/Pdp/MatchedDomain.php b/src/Pdp/MatchedDomain.php index f0ba5502..b009f20c 100644 --- a/src/Pdp/MatchedDomain.php +++ b/src/Pdp/MatchedDomain.php @@ -25,23 +25,16 @@ final class MatchedDomain implements Domain */ private $publicSuffix; - /** - * @var bool - */ - private $isValid; - /** * New instance. * * @param string|null $domain * @param string|null $publicSuffix - * @param bool $isValid */ - public function __construct(string $domain = null, string $publicSuffix = null, bool $isValid = true) + public function __construct(string $domain = null, string $publicSuffix = null) { $this->domain = $domain; $this->publicSuffix = $publicSuffix; - $this->isValid = $isValid; } /** @@ -65,7 +58,7 @@ public function getPublicSuffix() */ public function isValid(): bool { - return $this->isValid; + return true; } /** diff --git a/src/Pdp/UnmatchedDomain.php b/src/Pdp/UnmatchedDomain.php index 8b642d31..55565a00 100644 --- a/src/Pdp/UnmatchedDomain.php +++ b/src/Pdp/UnmatchedDomain.php @@ -25,23 +25,16 @@ final class UnmatchedDomain implements Domain */ private $publicSuffix; - /** - * @var bool - */ - private $isValid; - /** * New instance. * * @param string|null $domain * @param string|null $publicSuffix - * @param bool $isValid */ - public function __construct(string $domain = null, string $publicSuffix = null, bool $isValid = false) + public function __construct(string $domain = null, string $publicSuffix = null) { $this->domain = $domain; $this->publicSuffix = $publicSuffix; - $this->isValid = $isValid; } /** @@ -65,7 +58,7 @@ public function getPublicSuffix() */ public function isValid(): bool { - return $this->isValid; + return false; } /** From 750b86392ceb6387f2108abc1ab9aed2e285ca26 Mon Sep 17 00:00:00 2001 From: Jeremy Kendall Date: Thu, 5 Oct 2017 07:37:02 -0500 Subject: [PATCH 029/461] Refactor autoloading (#198) * Use PSR-4 autoloading for tests * Use PSR-4 for source --- composer.json | 7 ++++++- phpunit.xml.dist | 8 ++++++-- src/{Pdp => }/Domain.php | 0 src/{Pdp => }/HttpAdapter/CurlHttpAdapter.php | 0 src/{Pdp => }/HttpAdapter/HttpAdapterInterface.php | 0 src/{Pdp => }/LabelsTrait.php | 0 src/{Pdp => }/MatchedDomain.php | 0 src/{Pdp => }/NullDomain.php | 0 src/{Pdp => }/PublicSuffixList.php | 2 +- src/{Pdp => }/PublicSuffixListManager.php | 2 +- src/{Pdp => }/UnmatchedDomain.php | 0 tests/{src/Pdp => }/CheckPublicSuffixTest.php | 3 ++- tests/{src/Pdp => }/DomainTest.php | 4 +++- tests/{src/Pdp => }/HttpAdapter/CurlHttpAdapterTest.php | 3 ++- tests/{src/Pdp => }/PublicSuffixListManagerTest.php | 8 ++++++-- tests/{src/Pdp => }/PublicSuffixListTest.php | 9 +++++++-- tests/bootstrap.php | 9 --------- 17 files changed, 34 insertions(+), 21 deletions(-) rename src/{Pdp => }/Domain.php (100%) rename src/{Pdp => }/HttpAdapter/CurlHttpAdapter.php (100%) rename src/{Pdp => }/HttpAdapter/HttpAdapterInterface.php (100%) rename src/{Pdp => }/LabelsTrait.php (100%) rename src/{Pdp => }/MatchedDomain.php (100%) rename src/{Pdp => }/NullDomain.php (100%) rename src/{Pdp => }/PublicSuffixList.php (98%) rename src/{Pdp => }/PublicSuffixListManager.php (99%) rename src/{Pdp => }/UnmatchedDomain.php (100%) rename tests/{src/Pdp => }/CheckPublicSuffixTest.php (99%) rename tests/{src/Pdp => }/DomainTest.php (95%) rename tests/{src/Pdp => }/HttpAdapter/CurlHttpAdapterTest.php (90%) rename tests/{src/Pdp => }/PublicSuffixListManagerTest.php (97%) rename tests/{src/Pdp => }/PublicSuffixListTest.php (95%) delete mode 100644 tests/bootstrap.php diff --git a/composer.json b/composer.json index 060a4b20..37f5d38c 100644 --- a/composer.json +++ b/composer.json @@ -37,10 +37,15 @@ "friendsofphp/php-cs-fixer": "^2.7" }, "autoload": { - "psr-0": { + "psr-4": { "Pdp\\": "src/" } }, + "autoload-dev": { + "psr-4": { + "Pdp\\Tests\\": "tests/" + } + }, "scripts": { "post-install-cmd": "php bin/update-psl", "pcf": "php-cs-fixer fix --verbose" diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 0534373e..1c1ed9a0 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -2,11 +2,15 @@ + + + + - tests/src + ./tests diff --git a/src/Pdp/Domain.php b/src/Domain.php similarity index 100% rename from src/Pdp/Domain.php rename to src/Domain.php diff --git a/src/Pdp/HttpAdapter/CurlHttpAdapter.php b/src/HttpAdapter/CurlHttpAdapter.php similarity index 100% rename from src/Pdp/HttpAdapter/CurlHttpAdapter.php rename to src/HttpAdapter/CurlHttpAdapter.php diff --git a/src/Pdp/HttpAdapter/HttpAdapterInterface.php b/src/HttpAdapter/HttpAdapterInterface.php similarity index 100% rename from src/Pdp/HttpAdapter/HttpAdapterInterface.php rename to src/HttpAdapter/HttpAdapterInterface.php diff --git a/src/Pdp/LabelsTrait.php b/src/LabelsTrait.php similarity index 100% rename from src/Pdp/LabelsTrait.php rename to src/LabelsTrait.php diff --git a/src/Pdp/MatchedDomain.php b/src/MatchedDomain.php similarity index 100% rename from src/Pdp/MatchedDomain.php rename to src/MatchedDomain.php diff --git a/src/Pdp/NullDomain.php b/src/NullDomain.php similarity index 100% rename from src/Pdp/NullDomain.php rename to src/NullDomain.php diff --git a/src/Pdp/PublicSuffixList.php b/src/PublicSuffixList.php similarity index 98% rename from src/Pdp/PublicSuffixList.php rename to src/PublicSuffixList.php index c39d6779..c70a9a48 100644 --- a/src/Pdp/PublicSuffixList.php +++ b/src/PublicSuffixList.php @@ -46,7 +46,7 @@ public function __construct($rules = null) private function filterRules($rules): array { if ($rules === null) { - return include dirname(__DIR__, 2) . '/data/public-suffix-list.php'; + return include dirname(__DIR__) . '/data/public-suffix-list.php'; } if (is_array($rules)) { diff --git a/src/Pdp/PublicSuffixListManager.php b/src/PublicSuffixListManager.php similarity index 99% rename from src/Pdp/PublicSuffixListManager.php rename to src/PublicSuffixListManager.php index a06d1969..95c7c016 100644 --- a/src/Pdp/PublicSuffixListManager.php +++ b/src/PublicSuffixListManager.php @@ -65,7 +65,7 @@ class PublicSuffixListManager */ public function __construct(string $cacheDir = null) { - $this->cacheDir = $cacheDir ?? realpath(dirname(__DIR__, 2) . DIRECTORY_SEPARATOR . 'data'); + $this->cacheDir = $cacheDir ?? realpath(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'data'); } /** diff --git a/src/Pdp/UnmatchedDomain.php b/src/UnmatchedDomain.php similarity index 100% rename from src/Pdp/UnmatchedDomain.php rename to src/UnmatchedDomain.php diff --git a/tests/src/Pdp/CheckPublicSuffixTest.php b/tests/CheckPublicSuffixTest.php similarity index 99% rename from tests/src/Pdp/CheckPublicSuffixTest.php rename to tests/CheckPublicSuffixTest.php index 8f07eebe..a73a0dbf 100644 --- a/tests/src/Pdp/CheckPublicSuffixTest.php +++ b/tests/CheckPublicSuffixTest.php @@ -1,7 +1,8 @@ dataDir = dirname(__DIR__, 3) . '/data'; + $this->dataDir = dirname(__DIR__) . '/data'; $this->root = vfsStream::setup('pdp'); vfsStream::create(['cache' => []], $this->root); diff --git a/tests/src/Pdp/PublicSuffixListTest.php b/tests/PublicSuffixListTest.php similarity index 95% rename from tests/src/Pdp/PublicSuffixListTest.php rename to tests/PublicSuffixListTest.php index a0e56d70..4de77196 100644 --- a/tests/src/Pdp/PublicSuffixListTest.php +++ b/tests/PublicSuffixListTest.php @@ -10,9 +10,14 @@ * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) * @license http://github.com/jeremykendall/publicsuffixlist-php/blob/master/LICENSE MIT License */ -namespace Pdp; +namespace Pdp\Tests; use InvalidArgumentException; +use Pdp\MatchedDomain; +use Pdp\NullDomain; +use Pdp\PublicSuffixList; +use Pdp\PublicSuffixListManager; +use Pdp\UnmatchedDomain; use PHPUnit\Framework\TestCase; use TypeError; @@ -29,7 +34,7 @@ protected function setUp() { parent::setUp(); $this->list = new PublicSuffixList(); - $this->dataDir = realpath(dirname(__DIR__) . '/../../data'); + $this->dataDir = dirname(__DIR__) . '/data'; } public function testConstructorThrowsTypeError() diff --git a/tests/bootstrap.php b/tests/bootstrap.php deleted file mode 100644 index 08520f06..00000000 --- a/tests/bootstrap.php +++ /dev/null @@ -1,9 +0,0 @@ - Date: Thu, 5 Oct 2017 19:40:07 +0200 Subject: [PATCH 030/461] Improve merge (#199) * Improve merge - updated travis yaml - update composer hook - removed deprecated method from PublicSuffixListManager - improve code coverage for PublicSuffixList * update source URL * fix testsuite with new source URL * missed typehinting * protected -> private --- .travis.yml | 36 +++- composer.json | 4 +- src/PublicSuffixListManager.php | 233 +++++++++----------------- tests/PublicSuffixListManagerTest.php | 24 +-- tests/PublicSuffixListTest.php | 6 + 5 files changed, 123 insertions(+), 180 deletions(-) diff --git a/.travis.yml b/.travis.yml index ae93f8a5..9e183f9d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,14 +1,32 @@ language: php + sudo: false -dist: trusty -php: - - '7.0' - - '7.1' - - nightly +matrix: + include: + - php: 7.0 + env: VALIDATE_CODING_STYLE=true IGNORE_PLATFORMS=false + - php: 7.1 + env: VALIDATE_CODING_STYLE=true IGNORE_PLATFORMS=false + - php: master + env: VALIDATE_CODING_STYLE=false IGNORE_PLATFORMS=true + allow_failures: + - php: master + fast_finish: true + +cache: + directories: + - $HOME/.composer/cache + +before_install: + - travis_retry composer self-update + +install: + - if [ "$IGNORE_PLATFORMS" == "true" ]; then travis_retry composer update --no-interaction --prefer-source --ignore-platform-reqs; fi + - if [ "$IGNORE_PLATFORMS" == "false" ]; then travis_retry composer update --no-interaction --prefer-source; fi -script: phpunit +script: + - composer phpunit -before_script: - - composer install - - ./bin/update-psl +after_script: + - if [ "$VALIDATE_CODING_STYLE" == "true" ]; then composer phpcs; fi \ No newline at end of file diff --git a/composer.json b/composer.json index 37f5d38c..272788a3 100644 --- a/composer.json +++ b/composer.json @@ -48,6 +48,8 @@ }, "scripts": { "post-install-cmd": "php bin/update-psl", - "pcf": "php-cs-fixer fix --verbose" + "test": "phpunit --coverage-text; php-cs-fixer fix -v --diff --dry-run", + "phpunit": "phpunit --coverage-text", + "phpcs": "php-cs-fixer fix -v --diff --dry-run" } } diff --git a/src/PublicSuffixListManager.php b/src/PublicSuffixListManager.php index 95c7c016..ec359294 100644 --- a/src/PublicSuffixListManager.php +++ b/src/PublicSuffixListManager.php @@ -35,28 +35,28 @@ class PublicSuffixListManager const PRIVATE_PSL_PHP_FILE = 'private-public-suffix-list.php'; /** - * @var string Public Suffix List URL + * @var Public Suffix List Type */ - protected $publicSuffixListUrl = 'https://publicsuffix.org/list/effective_tld_names.dat'; + private static $domainList = [ + self::ALL_DOMAINS => self::PDP_PSL_PHP_FILE, + self::ICANN_DOMAINS => self::ICANN_PSL_PHP_FILE, + self::PRIVATE_DOMAINS => self::PRIVATE_PSL_PHP_FILE, + ]; /** - * @var string Directory where text and php versions of list will be cached + * @var string Public Suffix List URL */ - protected $cacheDir; + private $publicSuffixListUrl = 'https://publicsuffix.org/list/public_suffix_list.dat'; /** - * @var PublicSuffixList Public Suffix List + * @var string Directory where text and php versions of list will be cached */ - protected static $domainList = [ - self::ALL_DOMAINS => self::PDP_PSL_PHP_FILE, - self::ICANN_DOMAINS => self::ICANN_PSL_PHP_FILE, - self::PRIVATE_DOMAINS => self::PRIVATE_PSL_PHP_FILE, - ]; + private $cacheDir; /** * @var HttpAdapterInterface Http adapter */ - protected $httpAdapter; + private $httpAdapter; /** * Public constructor. @@ -68,41 +68,90 @@ public function __construct(string $cacheDir = null) $this->cacheDir = $cacheDir ?? realpath(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'data'); } + /** + * Sets http adapter. + * + * @param HttpAdapterInterface $httpAdapter + */ + public function setHttpAdapter(HttpAdapterInterface $httpAdapter) + { + $this->httpAdapter = $httpAdapter; + } + + /** + * Returns http adapter. Returns default http adapter if one is not set. + * + * @return HttpAdapterInterface + */ + public function getHttpAdapter(): HttpAdapterInterface + { + $this->httpAdapter = $this->httpAdapter ?? new CurlHttpAdapter(); + + return $this->httpAdapter; + } + + /** + * Gets Public Suffix List. + * + * @param string $list the Public Suffix List type + * + * @return PublicSuffixList + */ + public function getList($list = self::ALL_DOMAINS): PublicSuffixList + { + $cacheBasename = isset(self::$domainList[$list]) ? self::$domainList[$list] : self::PDP_PSL_PHP_FILE; + $cacheFile = $this->cacheDir . '/' . $cacheBasename; + if (!file_exists($cacheFile)) { + $this->refreshPublicSuffixList(); + } + + return new PublicSuffixList($cacheFile); + } + /** * Downloads Public Suffix List and writes text cache and PHP cache. If these files * already exist, they will be overwritten. */ public function refreshPublicSuffixList() { - $this->fetchListFromSource(); - $cacheFile = $this->cacheDir . '/' . self::PDP_PSL_TEXT_FILE; - $publicSuffixListArray = $this->convertListToArray($cacheFile); - foreach ($publicSuffixListArray as $domain => $data) { - $this->varExportToFile(self::$domainList[$domain], $data); + $publicSuffixList = $this->getHttpAdapter()->getContent($this->publicSuffixListUrl); + $this->cache(self::PDP_PSL_TEXT_FILE, $publicSuffixList); + + $publicSuffixListArray = $this->convertListToArray(); + foreach ($publicSuffixListArray as $type => $list) { + $content = 'cache(self::$domainList[$type], $content); } } /** - * Obtain Public Suffix List from its online source and write to cache dir. + * Cache content to disk. + * + * @param string $basename basename in cache dir where data will be written + * @param string $data data to write + * + * @throws Exception if unable to write file * * @return int Number of bytes that were written to the file */ - public function fetchListFromSource(): int + private function cache(string $basename, string $data): int { - $publicSuffixList = $this->getHttpAdapter()->getContent($this->publicSuffixListUrl); + $path = $this->cacheDir . '/' . $basename; + $result = @file_put_contents($path, $data); + if ($result !== false) { + return $result; + } - return $this->write(self::PDP_PSL_TEXT_FILE, $publicSuffixList); + throw new Exception(sprintf("Cannot write '%s'", $path)); } /** * Parses text representation of list to associative, multidimensional array. * - * @param string $textFile Public Suffix List text filename - * * @return array Associative, multidimensional array representation of the * public suffx list */ - protected function convertListToArray($textFile) + private function convertListToArray(): array { $addDomain = [ self::ICANN_DOMAINS => false, @@ -115,7 +164,8 @@ protected function convertListToArray($textFile) self::PRIVATE_DOMAINS => [], ]; - $data = new SplFileObject($textFile); + $path = $this->cacheDir . '/' . self::PDP_PSL_TEXT_FILE; + $data = new SplFileObject($path); $data->setFlags(SplFileObject::DROP_NEW_LINE | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY); foreach ($data as $line) { $addDomain = $this->validateDomainAddition($line, $addDomain); @@ -133,8 +183,10 @@ protected function convertListToArray($textFile) * * @param string $line the current file line * @param array $addDomain the domain addition status + * + * @return array */ - protected function validateDomainAddition($line, array $addDomain) + private function validateDomainAddition(string $line, array $addDomain): array { foreach ($addDomain as $section => $status) { $addDomain[$section] = $this->isValidSection($status, $line, $section); @@ -152,13 +204,13 @@ protected function validateDomainAddition($line, array $addDomain) * * @return bool */ - protected function isValidSection($previousStatus, $line, $section) + private function isValidSection(bool $previousStatus, string $line, string $section): bool { - if (!$previousStatus && 0 === strpos($line, '// ===BEGIN ' . $section . ' DOMAINS===')) { + if (!$previousStatus && strpos($line, '// ===BEGIN ' . $section . ' DOMAINS===') === 0) { return true; } - if ($previousStatus && 0 === strpos($line, '// ===END ' . $section . ' DOMAINS===')) { + if ($previousStatus && strpos($line, '// ===END ' . $section . ' DOMAINS===') === 0) { return false; } @@ -176,7 +228,7 @@ protected function isValidSection($previousStatus, $line, $section) * @return array Associative, multidimensional array representation of the * public suffx list */ - protected function convertLineToArray($textLine, array $publicSuffixListArray, array $addDomain) + private function convertLineToArray(string $textLine, array $publicSuffixListArray, array $addDomain): array { $ruleParts = explode('.', $textLine); $this->buildArray($publicSuffixListArray[self::ALL_DOMAINS], $ruleParts); @@ -188,39 +240,6 @@ protected function convertLineToArray($textLine, array $publicSuffixListArray, a return $publicSuffixListArray; } - /** - * Parses text representation of list to associative, multidimensional array. - * - * This method is based heavily on the code found in generateEffectiveTLDs.php - * - * DEPRECATION WARNING! This method will be removed in the next major point release - * - * @deprecated deprecated since version 3.1.0 - * @see https://github.com/usrflo/registered-domain-libs/blob/master/generateEffectiveTLDs.php - * A copy of the Apache License, Version 2.0, is provided with this - * distribution - * - * @param string $textFile Public Suffix List text filename - * - * @return array Associative, multidimensional array representation of the - * public suffx list - */ - public function parseListToArray(string $textFile): array - { - $data = file($textFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); - $filter = function ($line) { - return strstr($line, '//') === false; - }; - - $publicSuffixListArray = []; - foreach (array_filter($data, $filter) as $line) { - $ruleParts = explode('.', $line); - $this->buildArray($list, $ruleParts); - } - - return $list; - } - /** * Recursive method to build the array representation of the Public Suffix List. * @@ -235,7 +254,7 @@ public function parseListToArray(string $textFile): array * @param array $ruleParts One line (rule) from the Public Suffix List * exploded on '.', or the remaining portion of that array during recursion */ - public function buildArray(array &$publicSuffixList, array $ruleParts) + private function buildArray(array &$publicSuffixList, array $ruleParts) { $isDomain = true; @@ -260,92 +279,4 @@ public function buildArray(array &$publicSuffixList, array $ruleParts) $this->buildArray($publicSuffixList[$part], $ruleParts); } } - - /** - * Writes php array representation of the Public Suffix List to disk. - * - * @param array $publicSuffixList Array representation of the Public Suffix List - * - * @return int Number of bytes that were written to the file - */ - public function writePhpCache(array $publicSuffixList): int - { - return $this->varExportToFile(self::PDP_PSL_PHP_FILE, $publicSuffixList); - } - - /** - * Writes php array representation to disk. - * - * @param string $basename file path - * @param array $input input data - * - * @return int Number of bytes that were written to the file - */ - protected function varExportToFile($basename, array $input) - { - $data = 'write($basename, $data); - } - - /** - * Gets Public Suffix List. - * - * @param string $list the Public Suffix List type - * - * @return PublicSuffixList Instance of Public Suffix List - */ - public function getList($list = self::ALL_DOMAINS) - { - $cacheBasename = isset(self::$domainList[$list]) ? self::$domainList[$list] : self::PDP_PSL_PHP_FILE; - $cacheFile = $this->cacheDir . '/' . $cacheBasename; - if (!file_exists($cacheFile)) { - $this->refreshPublicSuffixList(); - } - - return new PublicSuffixList($cacheFile); - } - - /** - * Writes to file. - * - * @param string $filename Filename in cache dir where data will be written - * @param mixed $data Data to write - * - * @throws Exception if unable to write file - * - * @return int Number of bytes that were written to the file - */ - protected function write($filename, $data): int - { - $path = $this->cacheDir . '/' . $filename; - $result = @file_put_contents($path, $data); - if ($result !== false) { - return $result; - } - - throw new \Exception(sprintf("Cannot write '%s'", $path)); - } - - /** - * Returns http adapter. Returns default http adapter if one is not set. - * - * @return HttpAdapterInterface - */ - public function getHttpAdapter(): HttpAdapterInterface - { - $this->httpAdapter = $this->httpAdapter ?? new CurlHttpAdapter(); - - return $this->httpAdapter; - } - - /** - * Sets http adapter. - * - * @param HttpAdapterInterface $httpAdapter - */ - public function setHttpAdapter(HttpAdapterInterface $httpAdapter) - { - $this->httpAdapter = $httpAdapter; - } } diff --git a/tests/PublicSuffixListManagerTest.php b/tests/PublicSuffixListManagerTest.php index 94fb1543..fa7cd7b7 100644 --- a/tests/PublicSuffixListManagerTest.php +++ b/tests/PublicSuffixListManagerTest.php @@ -4,6 +4,7 @@ namespace Pdp\Tests; +use Exception; use org\bovigo\vfs\vfsStream; use org\bovigo\vfs\vfsStreamDirectory; use Pdp\HttpAdapter\CurlHttpAdapter; @@ -47,7 +48,7 @@ class PublicSuffixListManagerTest extends TestCase /** * @var string url */ - protected $publicSuffixListUrl = 'https://publicsuffix.org/list/effective_tld_names.dat'; + protected $publicSuffixListUrl = 'https://publicsuffix.org/list/public_suffix_list.dat'; /** * @var HttpAdapterInterface|\PHPUnit_Framework_MockObject_MockObject Http adapter @@ -108,21 +109,6 @@ public function testRefreshPublicSuffixList() ); } - public function testFetchListFromSource() - { - $content = file_get_contents( - $this->dataDir . '/' . PublicSuffixListManager::PDP_PSL_TEXT_FILE - ); - - $this->httpAdapter->expects($this->once()) - ->method('getContent') - ->with($this->publicSuffixListUrl) - ->will($this->returnValue($content)); - - $publicSuffixList = $this->listManager->fetchListFromSource(); - $this->assertGreaterThanOrEqual(100000, $publicSuffixList); - } - public function testGetHttpAdapterReturnsDefaultCurlAdapterIfAdapterNotSet() { $listManager = new PublicSuffixListManager($this->cacheDir); @@ -131,10 +117,10 @@ public function testGetHttpAdapterReturnsDefaultCurlAdapterIfAdapterNotSet() public function testWriteThrowsExceptionIfCanNotWrite() { - $this->expectException(\Exception::class); - $this->expectExceptionMessage("Cannot write '/does/not/exist/public-suffix-list.php'"); + $this->expectException(Exception::class); + $this->expectExceptionMessage("Cannot write '/does/not/exist/public-suffix-list.txt'"); $manager = new PublicSuffixListManager('/does/not/exist'); - $manager->writePhpCache([]); + $manager->refreshPublicSuffixList(); } public function testGetList() diff --git a/tests/PublicSuffixListTest.php b/tests/PublicSuffixListTest.php index 4de77196..06a325c0 100644 --- a/tests/PublicSuffixListTest.php +++ b/tests/PublicSuffixListTest.php @@ -54,6 +54,12 @@ public function testConstructorWithFilePath() $this->assertEquals($this->list, new PublicSuffixList($this->dataDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE)); } + public function testConstructorWithArray() + { + $rules = include $this->dataDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE; + $this->assertEquals($this->list, new PublicSuffixList($rules)); + } + public function testNullWillReturnNullDomain() { $domain = $this->list->query('COM'); From 92d745dc551cbcc8f0a2979876e5018d823367a2 Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Thu, 5 Oct 2017 12:48:52 -0500 Subject: [PATCH 031/461] Replace dup vars with constant --- src/PublicSuffixListManager.php | 11 ++++------- tests/PublicSuffixListManagerTest.php | 7 +------ 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/PublicSuffixListManager.php b/src/PublicSuffixListManager.php index ec359294..5638b39f 100644 --- a/src/PublicSuffixListManager.php +++ b/src/PublicSuffixListManager.php @@ -24,6 +24,8 @@ */ class PublicSuffixListManager { + const PUBLIC_SUFFIX_LIST_URL = 'https://publicsuffix.org/list/public_suffix_list.dat'; + const ALL_DOMAINS = 'ALL'; const PDP_PSL_TEXT_FILE = 'public-suffix-list.txt'; const PDP_PSL_PHP_FILE = 'public-suffix-list.php'; @@ -35,7 +37,7 @@ class PublicSuffixListManager const PRIVATE_PSL_PHP_FILE = 'private-public-suffix-list.php'; /** - * @var Public Suffix List Type + * @var array Public Suffix List Type */ private static $domainList = [ self::ALL_DOMAINS => self::PDP_PSL_PHP_FILE, @@ -43,11 +45,6 @@ class PublicSuffixListManager self::PRIVATE_DOMAINS => self::PRIVATE_PSL_PHP_FILE, ]; - /** - * @var string Public Suffix List URL - */ - private $publicSuffixListUrl = 'https://publicsuffix.org/list/public_suffix_list.dat'; - /** * @var string Directory where text and php versions of list will be cached */ @@ -114,7 +111,7 @@ public function getList($list = self::ALL_DOMAINS): PublicSuffixList */ public function refreshPublicSuffixList() { - $publicSuffixList = $this->getHttpAdapter()->getContent($this->publicSuffixListUrl); + $publicSuffixList = $this->getHttpAdapter()->getContent(self::PUBLIC_SUFFIX_LIST_URL); $this->cache(self::PDP_PSL_TEXT_FILE, $publicSuffixList); $publicSuffixListArray = $this->convertListToArray(); diff --git a/tests/PublicSuffixListManagerTest.php b/tests/PublicSuffixListManagerTest.php index fa7cd7b7..897eee7d 100644 --- a/tests/PublicSuffixListManagerTest.php +++ b/tests/PublicSuffixListManagerTest.php @@ -45,11 +45,6 @@ class PublicSuffixListManagerTest extends TestCase */ protected $dataDir; - /** - * @var string url - */ - protected $publicSuffixListUrl = 'https://publicsuffix.org/list/public_suffix_list.dat'; - /** * @var HttpAdapterInterface|\PHPUnit_Framework_MockObject_MockObject Http adapter */ @@ -89,7 +84,7 @@ public function testRefreshPublicSuffixList() $this->httpAdapter->expects($this->once()) ->method('getContent') - ->with($this->publicSuffixListUrl) + ->with(PublicSuffixListManager::PUBLIC_SUFFIX_LIST_URL) ->will($this->returnValue($content)); $this->assertFileNotExists( From 4e8ae3a120206af2200c214d29f01cc98d25b9f0 Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Thu, 5 Oct 2017 12:49:09 -0500 Subject: [PATCH 032/461] Replace local vars with instance vars --- tests/PublicSuffixListManagerTest.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/tests/PublicSuffixListManagerTest.php b/tests/PublicSuffixListManagerTest.php index 897eee7d..0a10eb9a 100644 --- a/tests/PublicSuffixListManagerTest.php +++ b/tests/PublicSuffixListManagerTest.php @@ -146,15 +146,12 @@ public function testGetListWithoutCache() ->setMethods(['refreshPublicSuffixList']) ->getMock(); - $dataDir = $this->dataDir; - $cacheDir = $this->cacheDir; - $listManager->expects($this->once()) ->method('refreshPublicSuffixList') - ->will($this->returnCallback(function () use ($dataDir, $cacheDir) { + ->will($this->returnCallback(function () { copy( - $dataDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE, - $cacheDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE + $this->dataDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE, + $this->cacheDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE ); })); From 017c87efd5c16d30b3f54f96bc5fea838f4f95f4 Mon Sep 17 00:00:00 2001 From: Jeremy Kendall Date: Thu, 5 Oct 2017 13:24:34 -0500 Subject: [PATCH 033/461] Make HttpAdapter explicit dependency for PublicSuffixListManager (#200) --- bin/update-psl | 6 +++- src/{HttpAdapter => Http}/CurlHttpAdapter.php | 4 +-- .../HttpAdapter.php} | 4 +-- src/PublicSuffixListManager.php | 33 ++++--------------- tests/HttpAdapter/CurlHttpAdapterTest.php | 2 +- tests/PublicSuffixListManagerTest.php | 25 +++++--------- 6 files changed, 25 insertions(+), 49 deletions(-) rename src/{HttpAdapter => Http}/CurlHttpAdapter.php (92%) rename src/{HttpAdapter/HttpAdapterInterface.php => Http/HttpAdapter.php} (93%) diff --git a/bin/update-psl b/bin/update-psl index ea1588a6..2705cbde 100755 --- a/bin/update-psl +++ b/bin/update-psl @@ -21,7 +21,11 @@ if ($argc == 2 && is_dir($argv[1])) { try { echo 'Updating Public Suffix List.' . PHP_EOL; - $manager = new \Pdp\PublicSuffixListManager($cacheDir); + /** + * @TODO: Having the adapter baked in with no way for the library user to provide + * their own is problematic. Fix it or leave it? No one has ever complained. + */ + $manager = new \Pdp\PublicSuffixListManager(new \Pdp\Http\CurlHttpAdapter(), $cacheDir); $manager->refreshPublicSuffixList(); echo 'Update complete.' . PHP_EOL; exit(0); diff --git a/src/HttpAdapter/CurlHttpAdapter.php b/src/Http/CurlHttpAdapter.php similarity index 92% rename from src/HttpAdapter/CurlHttpAdapter.php rename to src/Http/CurlHttpAdapter.php index 146196f8..4a0ba0ab 100644 --- a/src/HttpAdapter/CurlHttpAdapter.php +++ b/src/Http/CurlHttpAdapter.php @@ -9,7 +9,7 @@ */ declare(strict_types=1); -namespace Pdp\HttpAdapter; +namespace Pdp\Http; /** * cURL http adapter. @@ -22,7 +22,7 @@ * @author William Durand * @author Jeremy Kendall */ -class CurlHttpAdapter implements HttpAdapterInterface +class CurlHttpAdapter implements HttpAdapter { /** * {@inheritdoc} diff --git a/src/HttpAdapter/HttpAdapterInterface.php b/src/Http/HttpAdapter.php similarity index 93% rename from src/HttpAdapter/HttpAdapterInterface.php rename to src/Http/HttpAdapter.php index c3e44384..1455fdfc 100644 --- a/src/HttpAdapter/HttpAdapterInterface.php +++ b/src/Http/HttpAdapter.php @@ -9,7 +9,7 @@ */ declare(strict_types=1); -namespace Pdp\HttpAdapter; +namespace Pdp\Http; /** * Interface for http adapters. @@ -22,7 +22,7 @@ * @author William Durand * @author Jeremy Kendall */ -interface HttpAdapterInterface +interface HttpAdapter { /** * Returns the content fetched from a given URL. diff --git a/src/PublicSuffixListManager.php b/src/PublicSuffixListManager.php index 5638b39f..c3811a61 100644 --- a/src/PublicSuffixListManager.php +++ b/src/PublicSuffixListManager.php @@ -12,8 +12,7 @@ namespace Pdp; use Exception; -use Pdp\HttpAdapter\CurlHttpAdapter; -use Pdp\HttpAdapter\HttpAdapterInterface; +use Pdp\Http\HttpAdapter; use SplFileObject; /** @@ -51,42 +50,22 @@ class PublicSuffixListManager private $cacheDir; /** - * @var HttpAdapterInterface Http adapter + * @var HttpAdapter Http adapter */ private $httpAdapter; /** * Public constructor. * - * @param string $cacheDir Optional cache directory + * @param HttpAdapter $httpAdapter + * @param string $cacheDir Optional cache directory */ - public function __construct(string $cacheDir = null) + public function __construct(HttpAdapter $httpAdapter, string $cacheDir = null) { $this->cacheDir = $cacheDir ?? realpath(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'data'); - } - - /** - * Sets http adapter. - * - * @param HttpAdapterInterface $httpAdapter - */ - public function setHttpAdapter(HttpAdapterInterface $httpAdapter) - { $this->httpAdapter = $httpAdapter; } - /** - * Returns http adapter. Returns default http adapter if one is not set. - * - * @return HttpAdapterInterface - */ - public function getHttpAdapter(): HttpAdapterInterface - { - $this->httpAdapter = $this->httpAdapter ?? new CurlHttpAdapter(); - - return $this->httpAdapter; - } - /** * Gets Public Suffix List. * @@ -111,7 +90,7 @@ public function getList($list = self::ALL_DOMAINS): PublicSuffixList */ public function refreshPublicSuffixList() { - $publicSuffixList = $this->getHttpAdapter()->getContent(self::PUBLIC_SUFFIX_LIST_URL); + $publicSuffixList = $this->httpAdapter->getContent(self::PUBLIC_SUFFIX_LIST_URL); $this->cache(self::PDP_PSL_TEXT_FILE, $publicSuffixList); $publicSuffixListArray = $this->convertListToArray(); diff --git a/tests/HttpAdapter/CurlHttpAdapterTest.php b/tests/HttpAdapter/CurlHttpAdapterTest.php index 0f178dc9..7b400688 100644 --- a/tests/HttpAdapter/CurlHttpAdapterTest.php +++ b/tests/HttpAdapter/CurlHttpAdapterTest.php @@ -2,7 +2,7 @@ namespace Pdp\Tests\HttpAdapter; -use Pdp\HttpAdapter\CurlHttpAdapter; +use Pdp\Http\CurlHttpAdapter; use PHPUnit\Framework\TestCase; /** diff --git a/tests/PublicSuffixListManagerTest.php b/tests/PublicSuffixListManagerTest.php index 0a10eb9a..872f3123 100644 --- a/tests/PublicSuffixListManagerTest.php +++ b/tests/PublicSuffixListManagerTest.php @@ -7,8 +7,8 @@ use Exception; use org\bovigo\vfs\vfsStream; use org\bovigo\vfs\vfsStreamDirectory; -use Pdp\HttpAdapter\CurlHttpAdapter; -use Pdp\HttpAdapter\HttpAdapterInterface; +use Pdp\Http\CurlHttpAdapter; +use Pdp\Http\HttpAdapter; use Pdp\PublicSuffixList; use Pdp\PublicSuffixListManager; use PHPUnit\Framework\TestCase; @@ -46,7 +46,7 @@ class PublicSuffixListManagerTest extends TestCase protected $dataDir; /** - * @var HttpAdapterInterface|\PHPUnit_Framework_MockObject_MockObject Http adapter + * @var HttpAdapter|\PHPUnit_Framework_MockObject_MockObject Http adapter */ protected $httpAdapter; @@ -60,10 +60,9 @@ protected function setUp() vfsStream::create(['cache' => []], $this->root); $this->cacheDir = vfsStream::url('pdp/cache'); - $this->listManager = new PublicSuffixListManager($this->cacheDir); + $this->httpAdapter = $this->getMock(HttpAdapter::class); - $this->httpAdapter = $this->getMock(HttpAdapterInterface::class); - $this->listManager->setHttpAdapter($this->httpAdapter); + $this->listManager = new PublicSuffixListManager($this->httpAdapter, $this->cacheDir); } protected function tearDown() @@ -104,17 +103,11 @@ public function testRefreshPublicSuffixList() ); } - public function testGetHttpAdapterReturnsDefaultCurlAdapterIfAdapterNotSet() - { - $listManager = new PublicSuffixListManager($this->cacheDir); - $this->assertInstanceOf(CurlHttpAdapter::class, $listManager->getHttpAdapter()); - } - public function testWriteThrowsExceptionIfCanNotWrite() { $this->expectException(Exception::class); $this->expectExceptionMessage("Cannot write '/does/not/exist/public-suffix-list.txt'"); - $manager = new PublicSuffixListManager('/does/not/exist'); + $manager = new PublicSuffixListManager(new CurlHttpAdapter(), '/does/not/exist'); $manager->refreshPublicSuffixList(); } @@ -142,7 +135,7 @@ public function testGetListWithoutCache() /** @var PublicSuffixListManager|\PHPUnit_Framework_MockObject_MockObject $listManager */ $listManager = $this->getMockBuilder(PublicSuffixListManager::class) - ->setConstructorArgs([$this->cacheDir]) + ->setConstructorArgs([$this->httpAdapter, $this->cacheDir]) ->setMethods(['refreshPublicSuffixList']) ->getMock(); @@ -162,7 +155,7 @@ public function testGetListWithoutCache() public function testGetProvidedListFromDefaultCacheDir() { // By not providing cache I'm forcing use of default cache dir - $listManager = new PublicSuffixListManager(); + $listManager = new PublicSuffixListManager($this->httpAdapter); $publicSuffixList = $listManager->getList(); $this->assertGreaterThanOrEqual(300, count($publicSuffixList->getRules())); } @@ -176,7 +169,7 @@ private function getMock(string $class) public function testGetDifferentPublicList() { - $listManager = new PublicSuffixListManager(); + $listManager = new PublicSuffixListManager($this->httpAdapter); $publicList = $listManager->getList(); $invalidList = $listManager->getList('invalid type'); $this->assertEquals($publicList, $invalidList); From f0b1a47041aa6d1c180f64cb0a54ea92b56dc12b Mon Sep 17 00:00:00 2001 From: jeremykendall Date: Thu, 5 Oct 2017 13:30:49 -0500 Subject: [PATCH 034/461] Use github list URL --- src/PublicSuffixListManager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PublicSuffixListManager.php b/src/PublicSuffixListManager.php index c3811a61..713fd1c2 100644 --- a/src/PublicSuffixListManager.php +++ b/src/PublicSuffixListManager.php @@ -23,7 +23,7 @@ */ class PublicSuffixListManager { - const PUBLIC_SUFFIX_LIST_URL = 'https://publicsuffix.org/list/public_suffix_list.dat'; + const PUBLIC_SUFFIX_LIST_URL = 'https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat'; const ALL_DOMAINS = 'ALL'; const PDP_PSL_TEXT_FILE = 'public-suffix-list.txt'; From 5591a9c7b81931ae20819a3ee74527b84bf3e7dd Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 5 Oct 2017 23:14:34 +0200 Subject: [PATCH 035/461] Initial Cache insertion --- composer.json | 3 +- ...347ea112977e316242f2d457864041f59dfb684fc0 | 1 + ...77e1e93475af9f8761ed84ed960a467e7e01126243 | 1 + ...0249e90ffc9895458763fae6885c9ee74fdce5ec90 | 1 + ...847b7815909e864b2fd9c4ea88b00d35adb2ecdfd7 | 1 + src/Cache/FileCache.php | 366 ++++++++++++++++++ src/Cache/InvalidArgumentException.php | 19 + src/PublicSuffixList.php | 40 +- src/PublicSuffixListManager.php | 89 ++--- tests/CheckPublicSuffixTest.php | 6 +- tests/PublicSuffixListManagerTest.php | 98 +---- tests/PublicSuffixListTest.php | 34 +- 12 files changed, 449 insertions(+), 210 deletions(-) create mode 100644 data/7/1/09ec0807d8f2bd40aa93347ea112977e316242f2d457864041f59dfb684fc0 create mode 100644 data/A/A/91f9d4d1ae7f5129b52177e1e93475af9f8761ed84ed960a467e7e01126243 create mode 100644 data/A/C/0562bba4a57c6841cba10249e90ffc9895458763fae6885c9ee74fdce5ec90 create mode 100644 data/B/5/c7aed7cd2a308523e7d2847b7815909e864b2fd9c4ea88b00d35adb2ecdfd7 create mode 100644 src/Cache/FileCache.php create mode 100644 src/Cache/InvalidArgumentException.php diff --git a/composer.json b/composer.json index 272788a3..14dcfe2f 100644 --- a/composer.json +++ b/composer.json @@ -29,7 +29,8 @@ "require": { "php": ">=7.0", "ext-curl": "*", - "ext-intl": "*" + "ext-intl": "*", + "psr/simple-cache": "^1" }, "require-dev": { "phpunit/phpunit": "^6.3", diff --git a/data/7/1/09ec0807d8f2bd40aa93347ea112977e316242f2d457864041f59dfb684fc0 b/data/7/1/09ec0807d8f2bd40aa93347ea112977e316242f2d457864041f59dfb684fc0 new file mode 100644 index 00000000..7a383d3d --- /dev/null +++ b/data/7/1/09ec0807d8f2bd40aa93347ea112977e316242f2d457864041f59dfb684fc0 @@ -0,0 +1 @@ +a:146:{s:2:"ua";a:6:{s:2:"cc";a:0:{}s:3:"inf";a:0:{}s:3:"ltd";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:2:"pp";a:0:{}}s:2:"pl";a:13:{s:4:"beep";a:0:{}s:2:"co";a:0:{}s:3:"art";a:0:{}s:7:"gliwice";a:0:{}s:6:"krakow";a:0:{}s:6:"poznan";a:0:{}s:4:"wroc";a:0:{}s:8:"zakopane";a:0:{}s:3:"gda";a:0:{}s:6:"gdansk";a:0:{}s:6:"gdynia";a:0:{}s:3:"med";a:0:{}s:5:"sopot";a:0:{}}s:6:"estate";a:1:{s:7:"compute";a:1:{s:1:"*";a:0:{}}}s:7:"network";a:1:{s:5:"alces";a:1:{s:1:"*";a:0:{}}}s:3:"net";a:94:{s:10:"alwaysdata";a:1:{s:1:"*";a:0:{}}s:10:"cloudfront";a:0:{}s:8:"t3l3p0rt";a:0:{}s:7:"myfritz";a:0:{}s:6:"boomla";a:0:{}s:7:"bplaced";a:0:{}s:7:"square7";a:0:{}s:2:"gb";a:0:{}s:2:"hu";a:0:{}s:2:"jp";a:0:{}s:2:"se";a:0:{}s:2:"uk";a:0:{}s:2:"in";a:0:{}s:11:"cloudaccess";a:0:{}s:9:"cdn77-ssl";a:0:{}s:5:"cdn77";a:1:{s:1:"r";a:0:{}}s:8:"feste-ip";a:0:{}s:10:"knx-server";a:0:{}s:13:"static-access";a:0:{}s:11:"cryptonomic";a:1:{s:1:"*";a:0:{}}s:6:"debian";a:0:{}s:12:"at-band-camp";a:0:{}s:7:"blogdns";a:0:{}s:8:"broke-it";a:0:{}s:10:"buyshouses";a:0:{}s:8:"dnsalias";a:0:{}s:7:"dnsdojo";a:0:{}s:7:"does-it";a:0:{}s:9:"dontexist";a:0:{}s:8:"dynalias";a:0:{}s:9:"dynathome";a:0:{}s:13:"endofinternet";a:0:{}s:7:"from-az";a:0:{}s:7:"from-co";a:0:{}s:7:"from-la";a:0:{}s:7:"from-ny";a:0:{}s:7:"gets-it";a:0:{}s:12:"ham-radio-op";a:0:{}s:7:"homeftp";a:0:{}s:6:"homeip";a:0:{}s:9:"homelinux";a:0:{}s:8:"homeunix";a:0:{}s:11:"in-the-band";a:0:{}s:9:"is-a-chef";a:0:{}s:9:"is-a-geek";a:0:{}s:8:"isa-geek";a:0:{}s:9:"kicks-ass";a:0:{}s:13:"office-on-the";a:0:{}s:7:"podzone";a:0:{}s:13:"scrapper-site";a:0:{}s:6:"selfip";a:0:{}s:8:"sells-it";a:0:{}s:8:"servebbs";a:0:{}s:8:"serveftp";a:0:{}s:8:"thruhere";a:0:{}s:6:"webhop";a:0:{}s:8:"definima";a:0:{}s:7:"casacam";a:0:{}s:4:"dynu";a:0:{}s:5:"dynv6";a:0:{}s:6:"twmail";a:0:{}s:2:"ru";a:0:{}s:11:"channelsdvr";a:0:{}s:8:"fastlylb";a:1:{s:3:"map";a:0:{}}s:6:"fastly";a:4:{s:7:"freetls";a:0:{}s:3:"map";a:0:{}s:4:"prod";a:2:{s:1:"a";a:0:{}s:6:"global";a:0:{}}s:3:"ssl";a:3:{s:1:"a";a:0:{}s:1:"b";a:0:{}s:6:"global";a:0:{}}}s:12:"flynnhosting";a:0:{}s:14:"cloudfunctions";a:0:{}s:9:"moonscale";a:0:{}s:7:"ipifony";a:0:{}s:5:"barsy";a:0:{}s:13:"azurewebsites";a:0:{}s:12:"azure-mobile";a:0:{}s:8:"cloudapp";a:0:{}s:14:"eating-organic";a:0:{}s:9:"mydissent";a:0:{}s:8:"myeffect";a:0:{}s:9:"mymediapc";a:0:{}s:5:"mypsx";a:0:{}s:16:"mysecuritycamera";a:0:{}s:6:"nhlfan";a:0:{}s:5:"no-ip";a:0:{}s:6:"pgafan";a:0:{}s:24:"privatizehealthinsurance";a:0:{}s:8:"bounceme";a:0:{}s:4:"ddns";a:0:{}s:10:"redirectme";a:0:{}s:9:"serveblog";a:0:{}s:14:"serveminecraft";a:0:{}s:5:"sytes";a:0:{}s:8:"rackmaze";a:0:{}s:16:"firewall-gateway";a:0:{}s:7:"dsmynas";a:0:{}s:8:"familyds";a:0:{}s:2:"za";a:0:{}}s:3:"com";a:290:{s:9:"amazonaws";a:40:{s:7:"compute";a:1:{s:1:"*";a:0:{}}s:9:"compute-1";a:1:{s:1:"*";a:0:{}}s:9:"us-east-1";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:3:"elb";a:1:{s:1:"*";a:0:{}}s:2:"s3";a:0:{}s:17:"s3-ap-northeast-1";a:0:{}s:17:"s3-ap-northeast-2";a:0:{}s:13:"s3-ap-south-1";a:0:{}s:17:"s3-ap-southeast-1";a:0:{}s:17:"s3-ap-southeast-2";a:0:{}s:15:"s3-ca-central-1";a:0:{}s:15:"s3-eu-central-1";a:0:{}s:12:"s3-eu-west-1";a:0:{}s:12:"s3-eu-west-2";a:0:{}s:13:"s3-external-1";a:0:{}s:21:"s3-fips-us-gov-west-1";a:0:{}s:12:"s3-sa-east-1";a:0:{}s:16:"s3-us-gov-west-1";a:0:{}s:12:"s3-us-east-2";a:0:{}s:12:"s3-us-west-1";a:0:{}s:12:"s3-us-west-2";a:0:{}s:14:"ap-northeast-2";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:10:"ap-south-1";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:12:"ca-central-1";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:12:"eu-central-1";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:9:"eu-west-2";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:9:"us-east-2";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:14:"ap-northeast-1";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:14:"ap-southeast-1";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:14:"ap-southeast-2";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:9:"eu-west-1";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:9:"sa-east-1";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:20:"s3-website-us-east-1";a:0:{}s:20:"s3-website-us-west-1";a:0:{}s:20:"s3-website-us-west-2";a:0:{}s:25:"s3-website-ap-northeast-1";a:0:{}s:25:"s3-website-ap-southeast-1";a:0:{}s:25:"s3-website-ap-southeast-2";a:0:{}s:20:"s3-website-eu-west-1";a:0:{}s:20:"s3-website-sa-east-1";a:0:{}}s:16:"elasticbeanstalk";a:15:{s:14:"ap-northeast-1";a:0:{}s:14:"ap-northeast-2";a:0:{}s:10:"ap-south-1";a:0:{}s:14:"ap-southeast-1";a:0:{}s:14:"ap-southeast-2";a:0:{}s:12:"ca-central-1";a:0:{}s:12:"eu-central-1";a:0:{}s:9:"eu-west-1";a:0:{}s:9:"eu-west-2";a:0:{}s:9:"sa-east-1";a:0:{}s:9:"us-east-1";a:0:{}s:9:"us-east-2";a:0:{}s:13:"us-gov-west-1";a:0:{}s:9:"us-west-1";a:0:{}s:9:"us-west-2";a:0:{}}s:10:"on-aptible";a:0:{}s:9:"myasustor";a:0:{}s:10:"betainabox";a:0:{}s:7:"bplaced";a:0:{}s:2:"ar";a:0:{}s:2:"br";a:0:{}s:2:"cn";a:0:{}s:2:"de";a:0:{}s:2:"eu";a:0:{}s:2:"gb";a:0:{}s:2:"hu";a:0:{}s:3:"jpn";a:0:{}s:2:"kr";a:0:{}s:3:"mex";a:0:{}s:2:"no";a:0:{}s:2:"qc";a:0:{}s:2:"ru";a:0:{}s:2:"sa";a:0:{}s:2:"se";a:0:{}s:2:"uk";a:0:{}s:2:"us";a:0:{}s:2:"uy";a:0:{}s:2:"za";a:0:{}s:6:"africa";a:0:{}s:2:"gr";a:0:{}s:2:"co";a:0:{}s:13:"xenapponazure";a:0:{}s:9:"jdevcloud";a:0:{}s:10:"wpdevcloud";a:0:{}s:15:"cloudcontrolled";a:0:{}s:15:"cloudcontrolapp";a:0:{}s:8:"drayddns";a:0:{}s:12:"dreamhosters";a:0:{}s:7:"mydrobo";a:0:{}s:14:"dyndns-at-home";a:0:{}s:14:"dyndns-at-work";a:0:{}s:11:"dyndns-blog";a:0:{}s:11:"dyndns-free";a:0:{}s:11:"dyndns-home";a:0:{}s:9:"dyndns-ip";a:0:{}s:11:"dyndns-mail";a:0:{}s:13:"dyndns-office";a:0:{}s:11:"dyndns-pics";a:0:{}s:13:"dyndns-remote";a:0:{}s:13:"dyndns-server";a:0:{}s:10:"dyndns-web";a:0:{}s:11:"dyndns-wiki";a:0:{}s:11:"dyndns-work";a:0:{}s:7:"blogdns";a:0:{}s:7:"cechire";a:0:{}s:8:"dnsalias";a:0:{}s:7:"dnsdojo";a:0:{}s:11:"doesntexist";a:0:{}s:9:"dontexist";a:0:{}s:7:"doomdns";a:0:{}s:10:"dyn-o-saur";a:0:{}s:8:"dynalias";a:0:{}s:15:"est-a-la-maison";a:0:{}s:15:"est-a-la-masion";a:0:{}s:13:"est-le-patron";a:0:{}s:16:"est-mon-blogueur";a:0:{}s:7:"from-ak";a:0:{}s:7:"from-al";a:0:{}s:7:"from-ar";a:0:{}s:7:"from-ca";a:0:{}s:7:"from-ct";a:0:{}s:7:"from-dc";a:0:{}s:7:"from-de";a:0:{}s:7:"from-fl";a:0:{}s:7:"from-ga";a:0:{}s:7:"from-hi";a:0:{}s:7:"from-ia";a:0:{}s:7:"from-id";a:0:{}s:7:"from-il";a:0:{}s:7:"from-in";a:0:{}s:7:"from-ks";a:0:{}s:7:"from-ky";a:0:{}s:7:"from-ma";a:0:{}s:7:"from-md";a:0:{}s:7:"from-mi";a:0:{}s:7:"from-mn";a:0:{}s:7:"from-mo";a:0:{}s:7:"from-ms";a:0:{}s:7:"from-mt";a:0:{}s:7:"from-nc";a:0:{}s:7:"from-nd";a:0:{}s:7:"from-ne";a:0:{}s:7:"from-nh";a:0:{}s:7:"from-nj";a:0:{}s:7:"from-nm";a:0:{}s:7:"from-nv";a:0:{}s:7:"from-oh";a:0:{}s:7:"from-ok";a:0:{}s:7:"from-or";a:0:{}s:7:"from-pa";a:0:{}s:7:"from-pr";a:0:{}s:7:"from-ri";a:0:{}s:7:"from-sc";a:0:{}s:7:"from-sd";a:0:{}s:7:"from-tn";a:0:{}s:7:"from-tx";a:0:{}s:7:"from-ut";a:0:{}s:7:"from-va";a:0:{}s:7:"from-vt";a:0:{}s:7:"from-wa";a:0:{}s:7:"from-wi";a:0:{}s:7:"from-wv";a:0:{}s:7:"from-wy";a:0:{}s:7:"getmyip";a:0:{}s:6:"gotdns";a:0:{}s:10:"hobby-site";a:0:{}s:9:"homelinux";a:0:{}s:8:"homeunix";a:0:{}s:9:"iamallama";a:0:{}s:14:"is-a-anarchist";a:0:{}s:12:"is-a-blogger";a:0:{}s:15:"is-a-bookkeeper";a:0:{}s:14:"is-a-bulls-fan";a:0:{}s:12:"is-a-caterer";a:0:{}s:9:"is-a-chef";a:0:{}s:17:"is-a-conservative";a:0:{}s:8:"is-a-cpa";a:0:{}s:18:"is-a-cubicle-slave";a:0:{}s:13:"is-a-democrat";a:0:{}s:13:"is-a-designer";a:0:{}s:11:"is-a-doctor";a:0:{}s:21:"is-a-financialadvisor";a:0:{}s:9:"is-a-geek";a:0:{}s:10:"is-a-green";a:0:{}s:9:"is-a-guru";a:0:{}s:16:"is-a-hard-worker";a:0:{}s:11:"is-a-hunter";a:0:{}s:15:"is-a-landscaper";a:0:{}s:11:"is-a-lawyer";a:0:{}s:12:"is-a-liberal";a:0:{}s:16:"is-a-libertarian";a:0:{}s:10:"is-a-llama";a:0:{}s:13:"is-a-musician";a:0:{}s:14:"is-a-nascarfan";a:0:{}s:10:"is-a-nurse";a:0:{}s:12:"is-a-painter";a:0:{}s:20:"is-a-personaltrainer";a:0:{}s:17:"is-a-photographer";a:0:{}s:11:"is-a-player";a:0:{}s:15:"is-a-republican";a:0:{}s:13:"is-a-rockstar";a:0:{}s:14:"is-a-socialist";a:0:{}s:12:"is-a-student";a:0:{}s:12:"is-a-teacher";a:0:{}s:11:"is-a-techie";a:0:{}s:14:"is-a-therapist";a:0:{}s:16:"is-an-accountant";a:0:{}s:11:"is-an-actor";a:0:{}s:13:"is-an-actress";a:0:{}s:15:"is-an-anarchist";a:0:{}s:12:"is-an-artist";a:0:{}s:14:"is-an-engineer";a:0:{}s:17:"is-an-entertainer";a:0:{}s:12:"is-certified";a:0:{}s:7:"is-gone";a:0:{}s:13:"is-into-anime";a:0:{}s:12:"is-into-cars";a:0:{}s:16:"is-into-cartoons";a:0:{}s:13:"is-into-games";a:0:{}s:7:"is-leet";a:0:{}s:16:"is-not-certified";a:0:{}s:8:"is-slick";a:0:{}s:11:"is-uberleet";a:0:{}s:15:"is-with-theband";a:0:{}s:8:"isa-geek";a:0:{}s:13:"isa-hockeynut";a:0:{}s:16:"issmarterthanyou";a:0:{}s:9:"likes-pie";a:0:{}s:10:"likescandy";a:0:{}s:8:"neat-url";a:0:{}s:16:"saves-the-whales";a:0:{}s:6:"selfip";a:0:{}s:14:"sells-for-less";a:0:{}s:11:"sells-for-u";a:0:{}s:8:"servebbs";a:0:{}s:10:"simple-url";a:0:{}s:13:"space-to-rent";a:0:{}s:12:"teaches-yoga";a:0:{}s:14:"writesthisblog";a:0:{}s:8:"ddnsfree";a:0:{}s:8:"ddnsgeek";a:0:{}s:5:"giize";a:0:{}s:6:"gleeze";a:0:{}s:5:"kozow";a:0:{}s:10:"loseyourip";a:0:{}s:5:"ooguy";a:0:{}s:9:"theworkpc";a:0:{}s:8:"mytuleap";a:0:{}s:8:"evennode";a:8:{s:4:"eu-1";a:0:{}s:4:"eu-2";a:0:{}s:4:"eu-3";a:0:{}s:4:"eu-4";a:0:{}s:4:"us-1";a:0:{}s:4:"us-2";a:0:{}s:4:"us-3";a:0:{}s:4:"us-4";a:0:{}}s:5:"fbsbx";a:1:{s:4:"apps";a:0:{}}s:11:"firebaseapp";a:0:{}s:8:"flynnhub";a:0:{}s:10:"freebox-os";a:0:{}s:9:"freeboxos";a:0:{}s:17:"githubusercontent";a:0:{}s:4:"0emm";a:1:{s:1:"*";a:0:{}}s:7:"appspot";a:0:{}s:8:"blogspot";a:0:{}s:8:"codespot";a:0:{}s:10:"googleapis";a:0:{}s:10:"googlecode";a:0:{}s:18:"pagespeedmobilizer";a:0:{}s:12:"publishproxy";a:0:{}s:10:"withgoogle";a:0:{}s:11:"withyoutube";a:0:{}s:9:"herokuapp";a:0:{}s:9:"herokussl";a:0:{}s:8:"pixolino";a:0:{}s:6:"joyent";a:1:{s:3:"cns";a:1:{s:1:"*";a:0:{}}}s:11:"barsyonline";a:0:{}s:9:"meteorapp";a:1:{s:2:"eu";a:0:{}}s:10:"bitballoon";a:0:{}s:7:"netlify";a:0:{}s:2:"4u";a:0:{}s:7:"nfshost";a:0:{}s:8:"blogsyte";a:0:{}s:10:"ciscofreak";a:0:{}s:10:"damnserver";a:0:{}s:11:"ditchyourip";a:0:{}s:10:"dnsiskinky";a:0:{}s:5:"dynns";a:0:{}s:10:"geekgalaxy";a:0:{}s:17:"health-carereform";a:0:{}s:15:"homesecuritymac";a:0:{}s:14:"homesecuritypc";a:0:{}s:17:"myactivedirectory";a:0:{}s:16:"mysecuritycamera";a:0:{}s:10:"net-freaks";a:0:{}s:9:"onthewifi";a:0:{}s:10:"point2this";a:0:{}s:10:"quicksytes";a:0:{}s:15:"securitytactics";a:0:{}s:13:"serveexchange";a:0:{}s:11:"servehumour";a:0:{}s:8:"servep2p";a:0:{}s:12:"servesarcasm";a:0:{}s:11:"stufftoread";a:0:{}s:13:"unusualperson";a:0:{}s:12:"workisboring";a:0:{}s:10:"3utilities";a:0:{}s:8:"ddnsking";a:0:{}s:5:"myvnc";a:0:{}s:9:"servebeer";a:0:{}s:18:"servecounterstrike";a:0:{}s:8:"serveftp";a:0:{}s:9:"servegame";a:0:{}s:13:"servehalflife";a:0:{}s:9:"servehttp";a:0:{}s:8:"serveirc";a:0:{}s:8:"servemp3";a:0:{}s:9:"servepics";a:0:{}s:10:"servequake";a:0:{}s:10:"operaunite";a:0:{}s:15:"outsystemscloud";a:0:{}s:11:"ownprovider";a:0:{}s:5:"pgfog";a:0:{}s:12:"pagefrontapp";a:0:{}s:11:"gotpantheon";a:0:{}s:5:"prgmr";a:1:{s:3:"xen";a:0:{}}s:3:"qa2";a:0:{}s:15:"dev-myqnapcloud";a:0:{}s:17:"alpha-myqnapcloud";a:0:{}s:11:"myqnapcloud";a:0:{}s:12:"quipelements";a:1:{s:1:"*";a:0:{}}s:8:"rackmaze";a:0:{}s:7:"rhcloud";a:0:{}s:6:"logoip";a:0:{}s:16:"firewall-gateway";a:0:{}s:12:"myshopblocks";a:0:{}s:5:"1kapp";a:0:{}s:8:"appchizi";a:0:{}s:8:"applinzi";a:0:{}s:7:"sinaapp";a:0:{}s:10:"vipsinaapp";a:0:{}s:11:"bounty-full";a:2:{s:5:"alpha";a:0:{}s:4:"beta";a:0:{}}s:8:"temp-dns";a:0:{}s:7:"dsmynas";a:0:{}s:8:"familyds";a:0:{}s:7:"bloxcms";a:0:{}s:16:"townnews-staging";a:0:{}s:2:"hk";a:0:{}s:8:"remotewd";a:0:{}s:8:"yolasite";a:0:{}}s:2:"cn";a:1:{s:3:"com";a:1:{s:9:"amazonaws";a:4:{s:7:"compute";a:1:{s:1:"*";a:0:{}}s:2:"eb";a:1:{s:10:"cn-north-1";a:0:{}}s:3:"elb";a:1:{s:1:"*";a:0:{}}s:10:"cn-north-1";a:1:{s:2:"s3";a:0:{}}}}}s:3:"org";a:99:{s:5:"amune";a:1:{s:4:"tele";a:0:{}}s:8:"pimienta";a:0:{}s:7:"poivron";a:0:{}s:7:"potager";a:0:{}s:11:"sweetpepper";a:0:{}s:2:"ae";a:0:{}s:2:"us";a:0:{}s:7:"certmgr";a:0:{}s:5:"cdn77";a:2:{s:1:"c";a:0:{}s:3:"rsc";a:0:{}}s:12:"cdn77-secure";a:1:{s:6:"origin";a:1:{s:3:"ssl";a:0:{}}}s:7:"cloudns";a:0:{}s:7:"duckdns";a:0:{}s:4:"tunk";a:0:{}s:6:"dyndns";a:2:{s:2:"go";a:0:{}s:4:"home";a:0:{}}s:7:"blogdns";a:0:{}s:8:"blogsite";a:0:{}s:18:"boldlygoingnowhere";a:0:{}s:8:"dnsalias";a:0:{}s:7:"dnsdojo";a:0:{}s:11:"doesntexist";a:0:{}s:9:"dontexist";a:0:{}s:7:"doomdns";a:0:{}s:6:"dvrdns";a:0:{}s:8:"dynalias";a:0:{}s:13:"endofinternet";a:0:{}s:16:"endoftheinternet";a:0:{}s:7:"from-me";a:0:{}s:9:"game-host";a:0:{}s:6:"gotdns";a:0:{}s:10:"hobby-site";a:0:{}s:7:"homedns";a:0:{}s:7:"homeftp";a:0:{}s:9:"homelinux";a:0:{}s:8:"homeunix";a:0:{}s:14:"is-a-bruinsfan";a:0:{}s:14:"is-a-candidate";a:0:{}s:15:"is-a-celticsfan";a:0:{}s:9:"is-a-chef";a:0:{}s:9:"is-a-geek";a:0:{}s:11:"is-a-knight";a:0:{}s:15:"is-a-linux-user";a:0:{}s:12:"is-a-patsfan";a:0:{}s:11:"is-a-soxfan";a:0:{}s:8:"is-found";a:0:{}s:7:"is-lost";a:0:{}s:8:"is-saved";a:0:{}s:11:"is-very-bad";a:0:{}s:12:"is-very-evil";a:0:{}s:12:"is-very-good";a:0:{}s:12:"is-very-nice";a:0:{}s:13:"is-very-sweet";a:0:{}s:8:"isa-geek";a:0:{}s:9:"kicks-ass";a:0:{}s:11:"misconfused";a:0:{}s:7:"podzone";a:0:{}s:10:"readmyblog";a:0:{}s:6:"selfip";a:0:{}s:13:"sellsyourhome";a:0:{}s:8:"servebbs";a:0:{}s:8:"serveftp";a:0:{}s:9:"servegame";a:0:{}s:12:"stuff-4-sale";a:0:{}s:6:"webhop";a:0:{}s:5:"ddnss";a:0:{}s:9:"accesscam";a:0:{}s:6:"camdvr";a:0:{}s:8:"freeddns";a:0:{}s:6:"mywire";a:0:{}s:11:"webredirect";a:0:{}s:2:"eu";a:55:{s:2:"al";a:0:{}s:4:"asso";a:0:{}s:2:"at";a:0:{}s:2:"au";a:0:{}s:2:"be";a:0:{}s:2:"bg";a:0:{}s:2:"ca";a:0:{}s:2:"cd";a:0:{}s:2:"ch";a:0:{}s:2:"cn";a:0:{}s:2:"cy";a:0:{}s:2:"cz";a:0:{}s:2:"de";a:0:{}s:2:"dk";a:0:{}s:3:"edu";a:0:{}s:2:"ee";a:0:{}s:2:"es";a:0:{}s:2:"fi";a:0:{}s:2:"fr";a:0:{}s:2:"gr";a:0:{}s:2:"hr";a:0:{}s:2:"hu";a:0:{}s:2:"ie";a:0:{}s:2:"il";a:0:{}s:2:"in";a:0:{}s:3:"int";a:0:{}s:2:"is";a:0:{}s:2:"it";a:0:{}s:2:"jp";a:0:{}s:2:"kr";a:0:{}s:2:"lt";a:0:{}s:2:"lu";a:0:{}s:2:"lv";a:0:{}s:2:"mc";a:0:{}s:2:"me";a:0:{}s:2:"mk";a:0:{}s:2:"mt";a:0:{}s:2:"my";a:0:{}s:3:"net";a:0:{}s:2:"ng";a:0:{}s:2:"nl";a:0:{}s:2:"no";a:0:{}s:2:"nz";a:0:{}s:5:"paris";a:0:{}s:2:"pl";a:0:{}s:2:"pt";a:0:{}s:3:"q-a";a:0:{}s:2:"ro";a:0:{}s:2:"ru";a:0:{}s:2:"se";a:0:{}s:2:"si";a:0:{}s:2:"sk";a:0:{}s:2:"tr";a:0:{}s:2:"uk";a:0:{}s:2:"us";a:0:{}}s:6:"twmail";a:0:{}s:16:"fedorainfracloud";a:0:{}s:12:"fedorapeople";a:0:{}s:13:"fedoraproject";a:1:{s:5:"cloud";a:0:{}}s:8:"hepforge";a:0:{}s:2:"js";a:0:{}s:14:"bmoattachments";a:0:{}s:11:"cable-modem";a:0:{}s:10:"collegefan";a:0:{}s:16:"couchpotatofries";a:0:{}s:6:"mlbfan";a:0:{}s:16:"mysecuritycamera";a:0:{}s:6:"nflfan";a:0:{}s:10:"read-books";a:0:{}s:6:"ufcfan";a:0:{}s:5:"hopto";a:0:{}s:5:"myftp";a:0:{}s:5:"no-ip";a:0:{}s:5:"zapto";a:0:{}s:11:"my-firewall";a:0:{}s:10:"myfirewall";a:0:{}s:5:"spdns";a:0:{}s:7:"dsmynas";a:0:{}s:8:"familyds";a:0:{}s:9:"tuxfamily";a:0:{}s:11:"diskstation";a:0:{}s:2:"hk";a:0:{}s:7:"wmflabs";a:0:{}s:2:"za";a:0:{}}s:3:"eus";a:1:{s:5:"party";a:1:{s:4:"user";a:0:{}}}s:2:"ca";a:4:{s:5:"awdev";a:1:{s:1:"*";a:0:{}}s:2:"co";a:0:{}s:8:"blogspot";a:0:{}s:5:"no-ip";a:0:{}}s:2:"ws";a:3:{s:7:"advisor";a:1:{s:1:"*";a:0:{}}s:6:"dyndns";a:0:{}s:6:"mypets";a:0:{}}s:2:"io";a:25:{s:12:"backplaneapp";a:0:{}s:7:"boxfuse";a:0:{}s:17:"browsersafetymark";a:0:{}s:5:"dedyn";a:0:{}s:4:"drud";a:0:{}s:8:"definima";a:0:{}s:6:"enonic";a:1:{s:8:"customer";a:0:{}}s:6:"github";a:0:{}s:6:"gitlab";a:0:{}s:10:"hasura-app";a:0:{}s:5:"ngrok";a:0:{}s:7:"nodeart";a:1:{s:5:"stage";a:0:{}}s:5:"nodum";a:0:{}s:3:"nid";a:0:{}s:12:"pantheonsite";a:0:{}s:8:"protonet";a:0:{}s:10:"vaporcloud";a:0:{}s:3:"hzc";a:0:{}s:8:"sandcats";a:0:{}s:9:"shiftedit";a:0:{}s:4:"lair";a:1:{s:4:"apps";a:0:{}}s:6:"stolos";a:1:{s:1:"*";a:0:{}}s:8:"spacekit";a:0:{}s:9:"thingdust";a:4:{s:3:"dev";a:1:{s:4:"cust";a:0:{}}s:6:"disrec";a:1:{s:4:"cust";a:0:{}}s:4:"prod";a:1:{s:4:"cust";a:0:{}}s:7:"testing";a:1:{s:4:"cust";a:0:{}}}s:8:"wedeploy";a:0:{}}s:2:"la";a:3:{s:3:"bnr";a:0:{}s:1:"c";a:0:{}s:3:"nym";a:0:{}}s:2:"ch";a:7:{s:7:"square7";a:0:{}s:8:"blogspot";a:0:{}s:6:"gotdns";a:0:{}s:4:"12hp";a:0:{}s:3:"2ix";a:0:{}s:5:"4lima";a:0:{}s:9:"lima-city";a:0:{}}s:2:"de";a:48:{s:7:"bplaced";a:0:{}s:7:"square7";a:0:{}s:3:"com";a:0:{}s:7:"cosidns";a:1:{s:3:"dyn";a:0:{}}s:15:"dynamisches-dns";a:0:{}s:10:"dnsupdater";a:0:{}s:12:"internet-dns";a:0:{}s:9:"l-o-g-i-n";a:0:{}s:7:"dnshome";a:0:{}s:15:"fuettertdasnetz";a:0:{}s:10:"isteingeek";a:0:{}s:7:"istmein";a:0:{}s:10:"lebtimnetz";a:0:{}s:10:"leitungsen";a:0:{}s:13:"traeumtgerade";a:0:{}s:5:"ddnss";a:2:{s:3:"dyn";a:0:{}s:6:"dyndns";a:0:{}}s:7:"dyndns1";a:0:{}s:8:"dyn-ip24";a:0:{}s:14:"home-webserver";a:1:{s:3:"dyn";a:0:{}}s:13:"myhome-server";a:0:{}s:4:"goip";a:0:{}s:8:"blogspot";a:0:{}s:10:"keymachine";a:0:{}s:9:"git-repos";a:0:{}s:12:"lcube-server";a:0:{}s:9:"svn-repos";a:0:{}s:5:"barsy";a:0:{}s:6:"logoip";a:0:{}s:16:"firewall-gateway";a:0:{}s:10:"my-gateway";a:0:{}s:9:"my-router";a:0:{}s:5:"spdns";a:0:{}s:10:"taifun-dns";a:0:{}s:4:"12hp";a:0:{}s:3:"2ix";a:0:{}s:5:"4lima";a:0:{}s:9:"lima-city";a:0:{}s:6:"dd-dns";a:0:{}s:8:"dray-dns";a:0:{}s:7:"draydns";a:0:{}s:7:"dyn-vpn";a:0:{}s:6:"dynvpn";a:0:{}s:10:"mein-vigor";a:0:{}s:8:"my-vigor";a:0:{}s:6:"my-wan";a:0:{}s:7:"syno-ds";a:0:{}s:20:"synology-diskstation";a:0:{}s:11:"synology-ds";a:0:{}}s:2:"eu";a:7:{s:4:"mycd";a:0:{}s:7:"cloudns";a:0:{}s:5:"barsy";a:0:{}s:13:"wellbeingzone";a:0:{}s:5:"spdns";a:0:{}s:8:"transurl";a:1:{s:1:"*";a:0:{}}s:11:"diskstation";a:0:{}}s:2:"se";a:2:{s:3:"com";a:0:{}s:8:"blogspot";a:0:{}}s:2:"bz";a:2:{s:2:"za";a:0:{}s:3:"nym";a:0:{}}s:2:"nl";a:6:{s:14:"virtueeldomein";a:0:{}s:2:"co";a:0:{}s:8:"blogspot";a:0:{}s:8:"transurl";a:1:{s:1:"*";a:0:{}}s:7:"cistron";a:0:{}s:5:"demon";a:0:{}}s:2:"me";a:18:{s:3:"c66";a:0:{}s:6:"daplie";a:1:{s:9:"localhost";a:0:{}}s:8:"filegear";a:0:{}s:8:"brasilia";a:0:{}s:4:"ddns";a:0:{}s:6:"dnsfor";a:0:{}s:5:"hopto";a:0:{}s:7:"loginto";a:0:{}s:4:"noip";a:0:{}s:6:"webhop";a:0:{}s:3:"nym";a:0:{}s:11:"diskstation";a:0:{}s:7:"dscloud";a:0:{}s:4:"i234";a:0:{}s:4:"myds";a:0:{}s:8:"synology";a:0:{}s:8:"wedeploy";a:0:{}s:5:"yombo";a:0:{}}s:4:"host";a:2:{s:11:"cloudaccess";a:0:{}s:8:"freesite";a:0:{}}s:2:"cz";a:5:{s:2:"co";a:0:{}s:5:"realm";a:0:{}s:2:"e4";a:0:{}s:8:"blogspot";a:0:{}s:11:"metacentrum";a:2:{s:5:"cloud";a:0:{}s:6:"custom";a:0:{}}}s:4:"asia";a:1:{s:7:"cloudns";a:0:{}}s:3:"biz";a:12:{s:7:"cloudns";a:0:{}s:6:"dyndns";a:0:{}s:10:"for-better";a:0:{}s:8:"for-more";a:0:{}s:8:"for-some";a:0:{}s:7:"for-the";a:0:{}s:6:"selfip";a:0:{}s:6:"webhop";a:0:{}s:6:"mmafan";a:0:{}s:5:"myftp";a:0:{}s:5:"no-ip";a:0:{}s:7:"dscloud";a:0:{}}s:4:"club";a:1:{s:7:"cloudns";a:0:{}}s:2:"cc";a:7:{s:7:"cloudns";a:0:{}s:9:"ftpaccess";a:0:{}s:11:"game-server";a:0:{}s:8:"myphotos";a:0:{}s:9:"scrapping";a:0:{}s:6:"twmail";a:0:{}s:13:"fantasyleague";a:0:{}}s:2:"in";a:3:{s:7:"cloudns";a:0:{}s:8:"blogspot";a:0:{}s:5:"barsy";a:0:{}}s:4:"info";a:17:{s:7:"cloudns";a:0:{}s:11:"dynamic-dns";a:0:{}s:6:"dyndns";a:0:{}s:19:"barrel-of-knowledge";a:0:{}s:20:"barrell-of-knowledge";a:0:{}s:7:"for-our";a:0:{}s:9:"groks-the";a:0:{}s:10:"groks-this";a:0:{}s:13:"here-for-more";a:0:{}s:10:"knowsitall";a:0:{}s:6:"selfip";a:0:{}s:6:"webhop";a:0:{}s:8:"nsupdate";a:0:{}s:6:"dvrcam";a:0:{}s:12:"ilovecollege";a:0:{}s:5:"no-ip";a:0:{}s:6:"v-info";a:0:{}}s:3:"pro";a:1:{s:7:"cloudns";a:0:{}}s:2:"pw";a:2:{s:7:"cloudns";a:0:{}s:3:"nom";a:0:{}}s:2:"us";a:9:{s:7:"cloudns";a:0:{}s:4:"drud";a:0:{}s:5:"is-by";a:0:{}s:11:"land-4-sale";a:0:{}s:12:"stuff-4-sale";a:0:{}s:7:"golffan";a:0:{}s:4:"noip";a:0:{}s:7:"pointto";a:0:{}s:2:"de";a:1:{s:3:"lib";a:0:{}}}s:2:"no";a:2:{s:2:"co";a:0:{}s:8:"blogspot";a:0:{}}s:2:"is";a:2:{s:7:"cupcake";a:0:{}s:8:"blogspot";a:0:{}}s:4:"link";a:2:{s:4:"cyon";a:0:{}s:5:"mypep";a:0:{}}s:4:"site";a:3:{s:4:"cyon";a:0:{}s:10:"platformsh";a:1:{s:1:"*";a:0:{}}s:4:"byen";a:0:{}}s:2:"dk";a:6:{s:3:"biz";a:0:{}s:2:"co";a:0:{}s:4:"firm";a:0:{}s:3:"reg";a:0:{}s:5:"store";a:0:{}s:8:"blogspot";a:0:{}}s:2:"fi";a:3:{s:2:"dy";a:0:{}s:8:"blogspot";a:0:{}s:3:"iki";a:0:{}}s:2:"tv";a:4:{s:6:"dyndns";a:0:{}s:11:"better-than";a:0:{}s:10:"on-the-web";a:0:{}s:10:"worse-than";a:0:{}}s:2:"cx";a:2:{s:3:"ath";a:0:{}s:4:"info";a:0:{}}s:4:"name";a:2:{s:3:"her";a:1:{s:6:"forgot";a:0:{}}s:3:"his";a:1:{s:6:"forgot";a:0:{}}}s:2:"nu";a:4:{s:8:"merseine";a:0:{}s:4:"mine";a:0:{}s:8:"shacknet";a:0:{}s:3:"nom";a:0:{}}s:5:"rocks";a:3:{s:6:"myddns";a:0:{}s:9:"lima-city";a:0:{}s:8:"webspace";a:0:{}}s:3:"xyz";a:2:{s:8:"blogsite";a:0:{}s:5:"fhapp";a:0:{}}s:2:"tw";a:4:{s:3:"com";a:1:{s:8:"mymailer";a:0:{}}s:3:"url";a:0:{}s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"ru";a:24:{s:7:"adygeya";a:0:{}s:9:"bashkiria";a:0:{}s:3:"bir";a:0:{}s:3:"cbg";a:0:{}s:3:"com";a:0:{}s:8:"dagestan";a:0:{}s:6:"grozny";a:0:{}s:8:"kalmykia";a:0:{}s:8:"kustanai";a:0:{}s:6:"marine";a:0:{}s:8:"mordovia";a:0:{}s:3:"msk";a:0:{}s:5:"mytis";a:0:{}s:7:"nalchik";a:0:{}s:3:"nov";a:0:{}s:10:"pyatigorsk";a:0:{}s:3:"spb";a:0:{}s:11:"vladikavkaz";a:0:{}s:8:"vladimir";a:0:{}s:8:"blogspot";a:0:{}s:7:"cldmail";a:1:{s:2:"hb";a:0:{}}s:3:"net";a:0:{}s:3:"org";a:0:{}s:2:"pp";a:0:{}}s:2:"su";a:53:{s:8:"abkhazia";a:0:{}s:7:"adygeya";a:0:{}s:10:"aktyubinsk";a:0:{}s:11:"arkhangelsk";a:0:{}s:7:"armenia";a:0:{}s:8:"ashgabad";a:0:{}s:10:"azerbaijan";a:0:{}s:8:"balashov";a:0:{}s:9:"bashkiria";a:0:{}s:7:"bryansk";a:0:{}s:7:"bukhara";a:0:{}s:8:"chimkent";a:0:{}s:8:"dagestan";a:0:{}s:15:"east-kazakhstan";a:0:{}s:5:"exnet";a:0:{}s:7:"georgia";a:0:{}s:6:"grozny";a:0:{}s:7:"ivanovo";a:0:{}s:6:"jambyl";a:0:{}s:8:"kalmykia";a:0:{}s:6:"kaluga";a:0:{}s:7:"karacol";a:0:{}s:9:"karaganda";a:0:{}s:7:"karelia";a:0:{}s:9:"khakassia";a:0:{}s:9:"krasnodar";a:0:{}s:6:"kurgan";a:0:{}s:8:"kustanai";a:0:{}s:5:"lenug";a:0:{}s:10:"mangyshlak";a:0:{}s:8:"mordovia";a:0:{}s:3:"msk";a:0:{}s:8:"murmansk";a:0:{}s:7:"nalchik";a:0:{}s:5:"navoi";a:0:{}s:16:"north-kazakhstan";a:0:{}s:3:"nov";a:0:{}s:7:"obninsk";a:0:{}s:5:"penza";a:0:{}s:8:"pokrovsk";a:0:{}s:5:"sochi";a:0:{}s:3:"spb";a:0:{}s:8:"tashkent";a:0:{}s:6:"termez";a:0:{}s:9:"togliatti";a:0:{}s:7:"troitsk";a:0:{}s:11:"tselinograd";a:0:{}s:4:"tula";a:0:{}s:4:"tuva";a:0:{}s:11:"vladikavkaz";a:0:{}s:8:"vladimir";a:0:{}s:7:"vologda";a:0:{}s:3:"nym";a:0:{}}s:2:"fr";a:7:{s:6:"fbx-os";a:0:{}s:5:"fbxos";a:0:{}s:10:"freebox-os";a:0:{}s:9:"freeboxos";a:0:{}s:8:"blogspot";a:0:{}s:6:"on-web";a:0:{}s:31:"chirurgiens-dentistes-en-france";a:0:{}}s:5:"cloud";a:6:{s:8:"myfusion";a:0:{}s:7:"statics";a:1:{s:1:"*";a:0:{}}s:11:"magentosite";a:1:{s:1:"*";a:0:{}}s:5:"vapor";a:0:{}s:10:"sensiosite";a:1:{s:1:"*";a:0:{}}s:11:"trafficplex";a:0:{}}s:2:"at";a:12:{s:9:"futurecms";a:1:{s:1:"*";a:0:{}}s:13:"futurehosting";a:0:{}s:13:"futuremailing";a:0:{}s:8:"ortsinfo";a:2:{s:2:"ex";a:1:{s:1:"*";a:0:{}}s:6:"kunden";a:1:{s:1:"*";a:0:{}}}s:2:"co";a:1:{s:8:"blogspot";a:0:{}}s:3:"biz";a:0:{}s:4:"info";a:0:{}s:4:"priv";a:0:{}s:4:"12hp";a:0:{}s:3:"2ix";a:0:{}s:5:"4lima";a:0:{}s:9:"lima-city";a:0:{}}s:2:"uk";a:2:{s:3:"gov";a:2:{s:7:"service";a:0:{}s:10:"homeoffice";a:0:{}}s:2:"co";a:3:{s:8:"blogspot";a:0:{}s:5:"no-ip";a:0:{}s:13:"wellbeingzone";a:0:{}}}s:2:"im";a:2:{s:2:"ro";a:0:{}s:3:"nom";a:0:{}}s:2:"ro";a:2:{s:4:"shop";a:0:{}s:8:"blogspot";a:0:{}}s:2:"ae";a:2:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"al";a:2:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"am";a:1:{s:8:"blogspot";a:0:{}}s:2:"ba";a:1:{s:8:"blogspot";a:0:{}}s:2:"be";a:2:{s:8:"blogspot";a:0:{}s:8:"transurl";a:1:{s:1:"*";a:0:{}}}s:2:"bg";a:2:{s:8:"blogspot";a:0:{}s:5:"barsy";a:0:{}}s:2:"bj";a:1:{s:8:"blogspot";a:0:{}}s:2:"cf";a:1:{s:8:"blogspot";a:0:{}}s:2:"cl";a:2:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"id";a:1:{s:2:"co";a:1:{s:8:"blogspot";a:0:{}}}s:2:"il";a:1:{s:2:"co";a:1:{s:8:"blogspot";a:0:{}}}s:2:"ke";a:1:{s:2:"co";a:1:{s:8:"blogspot";a:0:{}}}s:2:"nz";a:2:{s:2:"co";a:1:{s:8:"blogspot";a:0:{}}s:3:"nym";a:0:{}}s:2:"za";a:1:{s:2:"co";a:1:{s:8:"blogspot";a:0:{}}}s:2:"ar";a:1:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}}s:2:"au";a:1:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}}s:2:"br";a:2:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"leg";a:27:{s:2:"ac";a:0:{}s:2:"al";a:0:{}s:2:"am";a:0:{}s:2:"ap";a:0:{}s:2:"ba";a:0:{}s:2:"ce";a:0:{}s:2:"df";a:0:{}s:2:"es";a:0:{}s:2:"go";a:0:{}s:2:"ma";a:0:{}s:2:"mg";a:0:{}s:2:"ms";a:0:{}s:2:"mt";a:0:{}s:2:"pa";a:0:{}s:2:"pb";a:0:{}s:2:"pe";a:0:{}s:2:"pi";a:0:{}s:2:"pr";a:0:{}s:2:"rj";a:0:{}s:2:"rn";a:0:{}s:2:"ro";a:0:{}s:2:"rr";a:0:{}s:2:"rs";a:0:{}s:2:"sc";a:0:{}s:2:"se";a:0:{}s:2:"sp";a:0:{}s:2:"to";a:0:{}}}s:2:"by";a:2:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"nym";a:0:{}}s:2:"co";a:2:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:5:"nodum";a:0:{}}s:2:"cy";a:1:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}}s:2:"ee";a:1:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}}s:2:"eg";a:1:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}}s:2:"es";a:1:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}}s:2:"mt";a:1:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}}s:2:"ng";a:1:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}}s:2:"tr";a:1:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}}s:2:"uy";a:2:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"nom";a:0:{}}s:2:"cv";a:1:{s:8:"blogspot";a:0:{}}s:2:"gr";a:2:{s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"hk";a:3:{s:8:"blogspot";a:0:{}s:3:"ltd";a:0:{}s:3:"inc";a:0:{}}s:2:"hr";a:1:{s:8:"blogspot";a:0:{}}s:2:"hu";a:1:{s:8:"blogspot";a:0:{}}s:2:"ie";a:1:{s:8:"blogspot";a:0:{}}s:2:"it";a:1:{s:8:"blogspot";a:0:{}}s:2:"jp";a:1:{s:8:"blogspot";a:0:{}}s:2:"kr";a:1:{s:8:"blogspot";a:0:{}}s:2:"li";a:3:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}s:3:"nym";a:0:{}}s:2:"lt";a:2:{s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"lu";a:2:{s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"md";a:1:{s:8:"blogspot";a:0:{}}s:2:"mk";a:2:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"mr";a:1:{s:8:"blogspot";a:0:{}}s:2:"mx";a:2:{s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"my";a:1:{s:8:"blogspot";a:0:{}}s:2:"pe";a:2:{s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"pt";a:2:{s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"qa";a:2:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"re";a:1:{s:8:"blogspot";a:0:{}}s:2:"rs";a:2:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"sg";a:1:{s:8:"blogspot";a:0:{}}s:2:"si";a:2:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"sk";a:2:{s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"sn";a:1:{s:8:"blogspot";a:0:{}}s:2:"td";a:1:{s:8:"blogspot";a:0:{}}s:2:"ug";a:2:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"vn";a:1:{s:8:"blogspot";a:0:{}}s:4:"goog";a:1:{s:5:"cloud";a:0:{}}s:2:"sh";a:4:{s:8:"hashbang";a:0:{}s:8:"platform";a:1:{s:1:"*";a:0:{}}s:8:"wedeploy";a:0:{}s:3:"now";a:0:{}}s:4:"zone";a:2:{s:6:"triton";a:1:{s:1:"*";a:0:{}}s:4:"lima";a:0:{}}s:7:"systems";a:1:{s:11:"knightpoint";a:0:{}}s:3:"krd";a:2:{s:2:"co";a:0:{}s:3:"edu";a:0:{}}s:2:"bs";a:1:{s:2:"we";a:0:{}}s:6:"online";a:1:{s:5:"barsy";a:0:{}}s:7:"support";a:1:{s:5:"barsy";a:0:{}}s:3:"ovh";a:1:{s:7:"nerdpol";a:0:{}}s:2:"mn";a:1:{s:3:"nyc";a:0:{}}s:2:"ai";a:1:{s:3:"nom";a:0:{}}s:2:"gd";a:1:{s:3:"nom";a:0:{}}s:2:"gl";a:1:{s:3:"nom";a:0:{}}s:2:"gt";a:1:{s:3:"nom";a:0:{}}s:2:"hn";a:1:{s:3:"nom";a:0:{}}s:2:"kz";a:1:{s:3:"nym";a:0:{}}s:2:"sx";a:1:{s:3:"nym";a:0:{}}s:2:"vc";a:1:{s:3:"nom";a:0:{}}s:2:"vg";a:1:{s:3:"nom";a:0:{}}s:2:"gg";a:1:{s:3:"cya";a:0:{}}s:7:"hosting";a:1:{s:9:"opencraft";a:0:{}}s:2:"lc";a:1:{s:2:"oy";a:0:{}}s:3:"fit";a:1:{s:6:"ptplus";a:0:{}}s:4:"land";a:1:{s:6:"static";a:2:{s:3:"dev";a:0:{}s:5:"sites";a:0:{}}}s:5:"space";a:3:{s:10:"stackspace";a:0:{}s:4:"uber";a:0:{}s:6:"xs4all";a:0:{}}s:4:"farm";a:1:{s:5:"storj";a:0:{}}s:4:"mobi";a:1:{s:7:"dscloud";a:0:{}}s:2:"to";a:1:{s:7:"vpnplus";a:0:{}}s:4:"cool";a:1:{s:2:"de";a:0:{}}s:8:"pictures";a:1:{i:1337;a:0:{}}s:3:"rip";a:1:{s:4:"clan";a:0:{}}s:10:"management";a:1:{s:6:"router";a:0:{}}s:5:"faith";a:1:{s:3:"ybo";a:0:{}}s:3:"one";a:1:{s:8:"homelink";a:0:{}}s:5:"party";a:1:{s:3:"ybo";a:0:{}}s:6:"review";a:1:{s:3:"ybo";a:0:{}}s:7:"science";a:1:{s:3:"ybo";a:0:{}}s:5:"trade";a:1:{s:3:"ybo";a:0:{}}} \ No newline at end of file diff --git a/data/A/A/91f9d4d1ae7f5129b52177e1e93475af9f8761ed84ed960a467e7e01126243 b/data/A/A/91f9d4d1ae7f5129b52177e1e93475af9f8761ed84ed960a467e7e01126243 new file mode 100644 index 00000000..f07d964c --- /dev/null +++ b/data/A/A/91f9d4d1ae7f5129b52177e1e93475af9f8761ed84ed960a467e7e01126243 @@ -0,0 +1 @@ +a:1557:{s:2:"ac";a:6:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"mil";a:0:{}s:3:"org";a:0:{}}s:2:"ad";a:1:{s:3:"nom";a:0:{}}s:2:"ae";a:7:{s:2:"co";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sch";a:0:{}s:2:"ac";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}}s:4:"aero";a:87:{s:22:"accident-investigation";a:0:{}s:19:"accident-prevention";a:0:{}s:9:"aerobatic";a:0:{}s:8:"aeroclub";a:0:{}s:9:"aerodrome";a:0:{}s:6:"agents";a:0:{}s:8:"aircraft";a:0:{}s:7:"airline";a:0:{}s:7:"airport";a:0:{}s:16:"air-surveillance";a:0:{}s:10:"airtraffic";a:0:{}s:19:"air-traffic-control";a:0:{}s:9:"ambulance";a:0:{}s:9:"amusement";a:0:{}s:11:"association";a:0:{}s:6:"author";a:0:{}s:10:"ballooning";a:0:{}s:6:"broker";a:0:{}s:3:"caa";a:0:{}s:5:"cargo";a:0:{}s:8:"catering";a:0:{}s:13:"certification";a:0:{}s:12:"championship";a:0:{}s:7:"charter";a:0:{}s:13:"civilaviation";a:0:{}s:4:"club";a:0:{}s:10:"conference";a:0:{}s:10:"consultant";a:0:{}s:10:"consulting";a:0:{}s:7:"control";a:0:{}s:7:"council";a:0:{}s:4:"crew";a:0:{}s:6:"design";a:0:{}s:4:"dgca";a:0:{}s:8:"educator";a:0:{}s:9:"emergency";a:0:{}s:6:"engine";a:0:{}s:8:"engineer";a:0:{}s:13:"entertainment";a:0:{}s:9:"equipment";a:0:{}s:8:"exchange";a:0:{}s:7:"express";a:0:{}s:10:"federation";a:0:{}s:6:"flight";a:0:{}s:7:"freight";a:0:{}s:4:"fuel";a:0:{}s:7:"gliding";a:0:{}s:10:"government";a:0:{}s:14:"groundhandling";a:0:{}s:5:"group";a:0:{}s:11:"hanggliding";a:0:{}s:9:"homebuilt";a:0:{}s:9:"insurance";a:0:{}s:7:"journal";a:0:{}s:10:"journalist";a:0:{}s:7:"leasing";a:0:{}s:9:"logistics";a:0:{}s:8:"magazine";a:0:{}s:11:"maintenance";a:0:{}s:5:"media";a:0:{}s:10:"microlight";a:0:{}s:9:"modelling";a:0:{}s:10:"navigation";a:0:{}s:11:"parachuting";a:0:{}s:11:"paragliding";a:0:{}s:21:"passenger-association";a:0:{}s:5:"pilot";a:0:{}s:5:"press";a:0:{}s:10:"production";a:0:{}s:10:"recreation";a:0:{}s:7:"repbody";a:0:{}s:3:"res";a:0:{}s:8:"research";a:0:{}s:10:"rotorcraft";a:0:{}s:6:"safety";a:0:{}s:9:"scientist";a:0:{}s:8:"services";a:0:{}s:4:"show";a:0:{}s:9:"skydiving";a:0:{}s:8:"software";a:0:{}s:7:"student";a:0:{}s:6:"trader";a:0:{}s:7:"trading";a:0:{}s:7:"trainer";a:0:{}s:5:"union";a:0:{}s:12:"workinggroup";a:0:{}s:5:"works";a:0:{}}s:2:"af";a:5:{s:3:"gov";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}}s:2:"ag";a:5:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:2:"co";a:0:{}s:3:"nom";a:0:{}}s:2:"ai";a:4:{s:3:"off";a:0:{}s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"al";a:6:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"am";a:0:{}s:2:"ao";a:6:{s:2:"ed";a:0:{}s:2:"gv";a:0:{}s:2:"og";a:0:{}s:2:"co";a:0:{}s:2:"pb";a:0:{}s:2:"it";a:0:{}}s:2:"aq";a:0:{}s:2:"ar";a:10:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:3:"gov";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:6:"musica";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"tur";a:0:{}}s:4:"arpa";a:6:{s:4:"e164";a:0:{}s:7:"in-addr";a:0:{}s:3:"ip6";a:0:{}s:4:"iris";a:0:{}s:3:"uri";a:0:{}s:3:"urn";a:0:{}}s:2:"as";a:1:{s:3:"gov";a:0:{}}s:4:"asia";a:0:{}s:2:"at";a:4:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"gv";a:0:{}s:2:"or";a:0:{}}s:2:"au";a:18:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:8:{s:3:"act";a:0:{}s:3:"nsw";a:0:{}s:2:"nt";a:0:{}s:3:"qld";a:0:{}s:2:"sa";a:0:{}s:3:"tas";a:0:{}s:3:"vic";a:0:{}s:2:"wa";a:0:{}}s:3:"gov";a:5:{s:3:"qld";a:0:{}s:2:"sa";a:0:{}s:3:"tas";a:0:{}s:3:"vic";a:0:{}s:2:"wa";a:0:{}}s:3:"asn";a:0:{}s:2:"id";a:0:{}s:4:"info";a:0:{}s:4:"conf";a:0:{}s:2:"oz";a:0:{}s:3:"act";a:0:{}s:3:"nsw";a:0:{}s:2:"nt";a:0:{}s:3:"qld";a:0:{}s:2:"sa";a:0:{}s:3:"tas";a:0:{}s:3:"vic";a:0:{}s:2:"wa";a:0:{}}s:2:"aw";a:1:{s:3:"com";a:0:{}}s:2:"ax";a:0:{}s:2:"az";a:12:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"int";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:4:"info";a:0:{}s:2:"pp";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}s:3:"pro";a:0:{}s:3:"biz";a:0:{}}s:2:"ba";a:6:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"bb";a:10:{s:3:"biz";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:5:"store";a:0:{}s:2:"tv";a:0:{}}s:2:"bd";a:1:{s:1:"*";a:0:{}}s:2:"be";a:1:{s:2:"ac";a:0:{}}s:2:"bf";a:1:{s:3:"gov";a:0:{}}s:2:"bg";a:36:{s:1:"a";a:0:{}s:1:"b";a:0:{}s:1:"c";a:0:{}s:1:"d";a:0:{}s:1:"e";a:0:{}s:1:"f";a:0:{}s:1:"g";a:0:{}s:1:"h";a:0:{}s:1:"i";a:0:{}s:1:"j";a:0:{}s:1:"k";a:0:{}s:1:"l";a:0:{}s:1:"m";a:0:{}s:1:"n";a:0:{}s:1:"o";a:0:{}s:1:"p";a:0:{}s:1:"q";a:0:{}s:1:"r";a:0:{}s:1:"s";a:0:{}s:1:"t";a:0:{}s:1:"u";a:0:{}s:1:"v";a:0:{}s:1:"w";a:0:{}s:1:"x";a:0:{}s:1:"y";a:0:{}s:1:"z";a:0:{}i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}i:3;a:0:{}i:4;a:0:{}i:5;a:0:{}i:6;a:0:{}i:7;a:0:{}i:8;a:0:{}i:9;a:0:{}}s:2:"bh";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}}s:2:"bi";a:5:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:2:"or";a:0:{}s:3:"org";a:0:{}}s:3:"biz";a:0:{}s:2:"bj";a:3:{s:4:"asso";a:0:{}s:7:"barreau";a:0:{}s:4:"gouv";a:0:{}}s:2:"bm";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"bn";a:1:{s:1:"*";a:0:{}}s:2:"bo";a:9:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"gob";a:0:{}s:3:"int";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"mil";a:0:{}s:2:"tv";a:0:{}}s:2:"br";a:95:{s:3:"abc";a:0:{}s:3:"adm";a:0:{}s:3:"adv";a:0:{}s:3:"agr";a:0:{}s:3:"aju";a:0:{}s:2:"am";a:0:{}s:9:"aparecida";a:0:{}s:3:"arq";a:0:{}s:3:"art";a:0:{}s:3:"ato";a:0:{}s:1:"b";a:0:{}s:5:"belem";a:0:{}s:3:"bio";a:0:{}s:4:"blog";a:0:{}s:3:"bmd";a:0:{}s:3:"bsb";a:0:{}s:3:"cim";a:0:{}s:3:"cng";a:0:{}s:3:"cnt";a:0:{}s:3:"com";a:0:{}s:4:"coop";a:0:{}s:3:"cri";a:0:{}s:6:"cuiaba";a:0:{}s:3:"def";a:0:{}s:3:"ecn";a:0:{}s:3:"eco";a:0:{}s:3:"edu";a:0:{}s:3:"emp";a:0:{}s:3:"eng";a:0:{}s:3:"esp";a:0:{}s:3:"etc";a:0:{}s:3:"eti";a:0:{}s:3:"far";a:0:{}s:4:"flog";a:0:{}s:7:"floripa";a:0:{}s:6:"fortal";a:0:{}s:2:"fm";a:0:{}s:3:"fnd";a:0:{}s:3:"fot";a:0:{}s:3:"fst";a:0:{}s:3:"g12";a:0:{}s:3:"ggf";a:0:{}s:3:"gov";a:27:{s:2:"ac";a:0:{}s:2:"al";a:0:{}s:2:"am";a:0:{}s:2:"ap";a:0:{}s:2:"ba";a:0:{}s:2:"ce";a:0:{}s:2:"df";a:0:{}s:2:"es";a:0:{}s:2:"go";a:0:{}s:2:"ma";a:0:{}s:2:"mg";a:0:{}s:2:"ms";a:0:{}s:2:"mt";a:0:{}s:2:"pa";a:0:{}s:2:"pb";a:0:{}s:2:"pe";a:0:{}s:2:"pi";a:0:{}s:2:"pr";a:0:{}s:2:"rj";a:0:{}s:2:"rn";a:0:{}s:2:"ro";a:0:{}s:2:"rr";a:0:{}s:2:"rs";a:0:{}s:2:"sc";a:0:{}s:2:"se";a:0:{}s:2:"sp";a:0:{}s:2:"to";a:0:{}}s:3:"gru";a:0:{}s:3:"imb";a:0:{}s:3:"ind";a:0:{}s:3:"inf";a:0:{}s:5:"jampa";a:0:{}s:3:"jor";a:0:{}s:3:"jus";a:0:{}s:3:"leg";a:0:{}s:3:"lel";a:0:{}s:8:"londrina";a:0:{}s:6:"macapa";a:0:{}s:6:"maceio";a:0:{}s:3:"mat";a:0:{}s:3:"med";a:0:{}s:3:"mil";a:0:{}s:2:"mp";a:0:{}s:3:"mus";a:0:{}s:5:"natal";a:0:{}s:3:"net";a:0:{}s:7:"niteroi";a:0:{}s:3:"nom";a:1:{s:1:"*";a:0:{}}s:3:"not";a:0:{}s:3:"ntr";a:0:{}s:3:"odo";a:0:{}s:3:"org";a:0:{}s:6:"osasco";a:0:{}s:6:"palmas";a:0:{}s:3:"poa";a:0:{}s:3:"ppg";a:0:{}s:3:"pro";a:0:{}s:3:"psc";a:0:{}s:3:"psi";a:0:{}s:3:"qsl";a:0:{}s:5:"radio";a:0:{}s:3:"rec";a:0:{}s:6:"recife";a:0:{}s:9:"riobranco";a:0:{}s:3:"sjc";a:0:{}s:3:"slg";a:0:{}s:3:"srv";a:0:{}s:4:"taxi";a:0:{}s:3:"teo";a:0:{}s:3:"tmp";a:0:{}s:3:"trd";a:0:{}s:3:"tur";a:0:{}s:2:"tv";a:0:{}s:3:"udi";a:0:{}s:3:"vet";a:0:{}s:3:"vix";a:0:{}s:4:"vlog";a:0:{}s:4:"wiki";a:0:{}s:3:"zlg";a:0:{}}s:2:"bs";a:5:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}}s:2:"bt";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"bv";a:0:{}s:2:"bw";a:2:{s:2:"co";a:0:{}s:3:"org";a:0:{}}s:2:"by";a:4:{s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:0:{}s:2:"of";a:0:{}}s:2:"bz";a:5:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}}s:2:"ca";a:15:{s:2:"ab";a:0:{}s:2:"bc";a:0:{}s:2:"mb";a:0:{}s:2:"nb";a:0:{}s:2:"nf";a:0:{}s:2:"nl";a:0:{}s:2:"ns";a:0:{}s:2:"nt";a:0:{}s:2:"nu";a:0:{}s:2:"on";a:0:{}s:2:"pe";a:0:{}s:2:"qc";a:0:{}s:2:"sk";a:0:{}s:2:"yk";a:0:{}s:2:"gc";a:0:{}}s:3:"cat";a:0:{}s:2:"cc";a:0:{}s:2:"cd";a:1:{s:3:"gov";a:0:{}}s:2:"cf";a:0:{}s:2:"cg";a:0:{}s:2:"ch";a:0:{}s:2:"ci";a:15:{s:3:"org";a:0:{}s:2:"or";a:0:{}s:3:"com";a:0:{}s:2:"co";a:0:{}s:3:"edu";a:0:{}s:2:"ed";a:0:{}s:2:"ac";a:0:{}s:3:"net";a:0:{}s:2:"go";a:0:{}s:4:"asso";a:0:{}s:15:"xn--aroport-bya";a:0:{}s:3:"int";a:0:{}s:6:"presse";a:0:{}s:2:"md";a:0:{}s:4:"gouv";a:0:{}}s:2:"ck";a:2:{s:1:"*";a:0:{}s:3:"www";a:1:{s:1:"!";s:0:"";}}s:2:"cl";a:4:{s:3:"gov";a:0:{}s:3:"gob";a:0:{}s:2:"co";a:0:{}s:3:"mil";a:0:{}}s:2:"cm";a:4:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}}s:2:"cn";a:44:{s:2:"ac";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"mil";a:0:{}s:10:"xn--55qx5d";a:0:{}s:10:"xn--io0a7i";a:0:{}s:10:"xn--od0alg";a:0:{}s:2:"ah";a:0:{}s:2:"bj";a:0:{}s:2:"cq";a:0:{}s:2:"fj";a:0:{}s:2:"gd";a:0:{}s:2:"gs";a:0:{}s:2:"gz";a:0:{}s:2:"gx";a:0:{}s:2:"ha";a:0:{}s:2:"hb";a:0:{}s:2:"he";a:0:{}s:2:"hi";a:0:{}s:2:"hl";a:0:{}s:2:"hn";a:0:{}s:2:"jl";a:0:{}s:2:"js";a:0:{}s:2:"jx";a:0:{}s:2:"ln";a:0:{}s:2:"nm";a:0:{}s:2:"nx";a:0:{}s:2:"qh";a:0:{}s:2:"sc";a:0:{}s:2:"sd";a:0:{}s:2:"sh";a:0:{}s:2:"sn";a:0:{}s:2:"sx";a:0:{}s:2:"tj";a:0:{}s:2:"xj";a:0:{}s:2:"xz";a:0:{}s:2:"yn";a:0:{}s:2:"zj";a:0:{}s:2:"hk";a:0:{}s:2:"mo";a:0:{}s:2:"tw";a:0:{}}s:2:"co";a:13:{s:4:"arts";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:4:"firm";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"nom";a:0:{}s:3:"org";a:0:{}s:3:"rec";a:0:{}s:3:"web";a:0:{}}s:3:"com";a:0:{}s:4:"coop";a:0:{}s:2:"cr";a:7:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"ed";a:0:{}s:2:"fi";a:0:{}s:2:"go";a:0:{}s:2:"or";a:0:{}s:2:"sa";a:0:{}}s:2:"cu";a:6:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"inf";a:0:{}}s:2:"cv";a:0:{}s:2:"cw";a:4:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"cx";a:1:{s:3:"gov";a:0:{}}s:2:"cy";a:13:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:3:"com";a:0:{}s:7:"ekloges";a:0:{}s:3:"gov";a:0:{}s:3:"ltd";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:10:"parliament";a:0:{}s:5:"press";a:0:{}s:3:"pro";a:0:{}s:2:"tm";a:0:{}}s:2:"cz";a:0:{}s:2:"de";a:0:{}s:2:"dj";a:0:{}s:2:"dk";a:0:{}s:2:"dm";a:5:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}}s:2:"do";a:10:{s:3:"art";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sld";a:0:{}s:3:"web";a:0:{}}s:2:"dz";a:8:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:4:"asso";a:0:{}s:3:"pol";a:0:{}s:3:"art";a:0:{}}s:2:"ec";a:12:{s:3:"com";a:0:{}s:4:"info";a:0:{}s:3:"net";a:0:{}s:3:"fin";a:0:{}s:3:"k12";a:0:{}s:3:"med";a:0:{}s:3:"pro";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"gob";a:0:{}s:3:"mil";a:0:{}}s:3:"edu";a:0:{}s:2:"ee";a:10:{s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:4:"riik";a:0:{}s:3:"lib";a:0:{}s:3:"med";a:0:{}s:3:"com";a:0:{}s:3:"pri";a:0:{}s:3:"aip";a:0:{}s:3:"org";a:0:{}s:3:"fie";a:0:{}}s:2:"eg";a:9:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"eun";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sci";a:0:{}}s:2:"er";a:1:{s:1:"*";a:0:{}}s:2:"es";a:5:{s:3:"com";a:0:{}s:3:"nom";a:0:{}s:3:"org";a:0:{}s:3:"gob";a:0:{}s:3:"edu";a:0:{}}s:2:"et";a:8:{s:3:"com";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"biz";a:0:{}s:4:"name";a:0:{}s:4:"info";a:0:{}s:3:"net";a:0:{}}s:2:"eu";a:0:{}s:2:"fi";a:1:{s:5:"aland";a:0:{}}s:2:"fj";a:1:{s:1:"*";a:0:{}}s:2:"fk";a:1:{s:1:"*";a:0:{}}s:2:"fm";a:0:{}s:2:"fo";a:0:{}s:2:"fr";a:23:{s:3:"com";a:0:{}s:4:"asso";a:0:{}s:3:"nom";a:0:{}s:3:"prd";a:0:{}s:6:"presse";a:0:{}s:2:"tm";a:0:{}s:8:"aeroport";a:0:{}s:7:"assedic";a:0:{}s:6:"avocat";a:0:{}s:6:"avoues";a:0:{}s:3:"cci";a:0:{}s:9:"chambagri";a:0:{}s:21:"chirurgiens-dentistes";a:0:{}s:18:"experts-comptables";a:0:{}s:15:"geometre-expert";a:0:{}s:4:"gouv";a:0:{}s:5:"greta";a:0:{}s:16:"huissier-justice";a:0:{}s:7:"medecin";a:0:{}s:8:"notaires";a:0:{}s:10:"pharmacien";a:0:{}s:4:"port";a:0:{}s:11:"veterinaire";a:0:{}}s:2:"ga";a:0:{}s:2:"gb";a:0:{}s:2:"gd";a:0:{}s:2:"ge";a:7:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"pvt";a:0:{}}s:2:"gf";a:0:{}s:2:"gg";a:3:{s:2:"co";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"gh";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"mil";a:0:{}}s:2:"gi";a:6:{s:3:"com";a:0:{}s:3:"ltd";a:0:{}s:3:"gov";a:0:{}s:3:"mod";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}}s:2:"gl";a:5:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"gm";a:0:{}s:2:"gn";a:6:{s:2:"ac";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}}s:3:"gov";a:0:{}s:2:"gp";a:6:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:4:"mobi";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:4:"asso";a:0:{}}s:2:"gq";a:0:{}s:2:"gr";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}}s:2:"gs";a:0:{}s:2:"gt";a:7:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:3:"ind";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"gu";a:1:{s:1:"*";a:0:{}}s:2:"gw";a:0:{}s:2:"gy";a:6:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"hk";a:21:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"idv";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:10:"xn--55qx5d";a:0:{}s:11:"xn--wcvs22d";a:0:{}s:11:"xn--lcvr32d";a:0:{}s:10:"xn--mxtq1m";a:0:{}s:10:"xn--gmqw5a";a:0:{}s:9:"xn--ciqpn";a:0:{}s:11:"xn--gmq050i";a:0:{}s:10:"xn--zf0avx";a:0:{}s:10:"xn--io0a7i";a:0:{}s:10:"xn--mk0axi";a:0:{}s:10:"xn--od0alg";a:0:{}s:11:"xn--od0aq3b";a:0:{}s:9:"xn--tn0ag";a:0:{}s:10:"xn--uc0atv";a:0:{}s:11:"xn--uc0ay4a";a:0:{}}s:2:"hm";a:0:{}s:2:"hn";a:6:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"mil";a:0:{}s:3:"gob";a:0:{}}s:2:"hr";a:4:{s:2:"iz";a:0:{}s:4:"from";a:0:{}s:4:"name";a:0:{}s:3:"com";a:0:{}}s:2:"ht";a:17:{s:3:"com";a:0:{}s:4:"shop";a:0:{}s:4:"firm";a:0:{}s:4:"info";a:0:{}s:5:"adult";a:0:{}s:3:"net";a:0:{}s:3:"pro";a:0:{}s:3:"org";a:0:{}s:3:"med";a:0:{}s:3:"art";a:0:{}s:4:"coop";a:0:{}s:3:"pol";a:0:{}s:4:"asso";a:0:{}s:3:"edu";a:0:{}s:3:"rel";a:0:{}s:4:"gouv";a:0:{}s:5:"perso";a:0:{}}s:2:"hu";a:31:{s:2:"co";a:0:{}s:4:"info";a:0:{}s:3:"org";a:0:{}s:4:"priv";a:0:{}s:5:"sport";a:0:{}s:2:"tm";a:0:{}i:2000;a:0:{}s:5:"agrar";a:0:{}s:4:"bolt";a:0:{}s:6:"casino";a:0:{}s:4:"city";a:0:{}s:7:"erotica";a:0:{}s:7:"erotika";a:0:{}s:4:"film";a:0:{}s:5:"forum";a:0:{}s:5:"games";a:0:{}s:5:"hotel";a:0:{}s:8:"ingatlan";a:0:{}s:6:"jogasz";a:0:{}s:8:"konyvelo";a:0:{}s:5:"lakas";a:0:{}s:5:"media";a:0:{}s:4:"news";a:0:{}s:6:"reklam";a:0:{}s:3:"sex";a:0:{}s:4:"shop";a:0:{}s:4:"suli";a:0:{}s:4:"szex";a:0:{}s:6:"tozsde";a:0:{}s:6:"utazas";a:0:{}s:5:"video";a:0:{}}s:2:"id";a:11:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:4:"desa";a:0:{}s:2:"go";a:0:{}s:3:"mil";a:0:{}s:2:"my";a:0:{}s:3:"net";a:0:{}s:2:"or";a:0:{}s:3:"sch";a:0:{}s:3:"web";a:0:{}}s:2:"ie";a:1:{s:3:"gov";a:0:{}}s:2:"il";a:8:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:3:"gov";a:0:{}s:3:"idf";a:0:{}s:3:"k12";a:0:{}s:4:"muni";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"im";a:7:{s:2:"ac";a:0:{}s:2:"co";a:2:{s:3:"ltd";a:0:{}s:3:"plc";a:0:{}}s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:2:"tt";a:0:{}s:2:"tv";a:0:{}}s:2:"in";a:12:{s:2:"co";a:0:{}s:4:"firm";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gen";a:0:{}s:3:"ind";a:0:{}s:3:"nic";a:0:{}s:2:"ac";a:0:{}s:3:"edu";a:0:{}s:3:"res";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}}s:4:"info";a:0:{}s:3:"int";a:1:{s:2:"eu";a:0:{}}s:2:"io";a:1:{s:3:"com";a:0:{}}s:2:"iq";a:6:{s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}}s:2:"ir";a:9:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:3:"gov";a:0:{}s:2:"id";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sch";a:0:{}s:15:"xn--mgba3a4f16a";a:0:{}s:14:"xn--mgba3a4fra";a:0:{}}s:2:"is";a:6:{s:3:"net";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"int";a:0:{}}s:2:"it";a:368:{s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"abr";a:0:{}s:7:"abruzzo";a:0:{}s:12:"aosta-valley";a:0:{}s:11:"aostavalley";a:0:{}s:3:"bas";a:0:{}s:10:"basilicata";a:0:{}s:3:"cal";a:0:{}s:8:"calabria";a:0:{}s:3:"cam";a:0:{}s:8:"campania";a:0:{}s:14:"emilia-romagna";a:0:{}s:13:"emiliaromagna";a:0:{}s:3:"emr";a:0:{}s:15:"friuli-v-giulia";a:0:{}s:16:"friuli-ve-giulia";a:0:{}s:15:"friuli-vegiulia";a:0:{}s:21:"friuli-venezia-giulia";a:0:{}s:20:"friuli-veneziagiulia";a:0:{}s:14:"friuli-vgiulia";a:0:{}s:14:"friuliv-giulia";a:0:{}s:15:"friulive-giulia";a:0:{}s:14:"friulivegiulia";a:0:{}s:20:"friulivenezia-giulia";a:0:{}s:19:"friuliveneziagiulia";a:0:{}s:13:"friulivgiulia";a:0:{}s:3:"fvg";a:0:{}s:3:"laz";a:0:{}s:5:"lazio";a:0:{}s:3:"lig";a:0:{}s:7:"liguria";a:0:{}s:3:"lom";a:0:{}s:9:"lombardia";a:0:{}s:8:"lombardy";a:0:{}s:7:"lucania";a:0:{}s:3:"mar";a:0:{}s:6:"marche";a:0:{}s:3:"mol";a:0:{}s:6:"molise";a:0:{}s:8:"piedmont";a:0:{}s:8:"piemonte";a:0:{}s:3:"pmn";a:0:{}s:3:"pug";a:0:{}s:6:"puglia";a:0:{}s:3:"sar";a:0:{}s:8:"sardegna";a:0:{}s:8:"sardinia";a:0:{}s:3:"sic";a:0:{}s:7:"sicilia";a:0:{}s:6:"sicily";a:0:{}s:3:"taa";a:0:{}s:3:"tos";a:0:{}s:7:"toscana";a:0:{}s:16:"trentino-a-adige";a:0:{}s:15:"trentino-aadige";a:0:{}s:19:"trentino-alto-adige";a:0:{}s:18:"trentino-altoadige";a:0:{}s:16:"trentino-s-tirol";a:0:{}s:15:"trentino-stirol";a:0:{}s:18:"trentino-sud-tirol";a:0:{}s:17:"trentino-sudtirol";a:0:{}s:19:"trentino-sued-tirol";a:0:{}s:18:"trentino-suedtirol";a:0:{}s:15:"trentinoa-adige";a:0:{}s:14:"trentinoaadige";a:0:{}s:18:"trentinoalto-adige";a:0:{}s:17:"trentinoaltoadige";a:0:{}s:15:"trentinos-tirol";a:0:{}s:14:"trentinostirol";a:0:{}s:17:"trentinosud-tirol";a:0:{}s:16:"trentinosudtirol";a:0:{}s:18:"trentinosued-tirol";a:0:{}s:17:"trentinosuedtirol";a:0:{}s:7:"tuscany";a:0:{}s:3:"umb";a:0:{}s:6:"umbria";a:0:{}s:11:"val-d-aosta";a:0:{}s:10:"val-daosta";a:0:{}s:10:"vald-aosta";a:0:{}s:9:"valdaosta";a:0:{}s:11:"valle-aosta";a:0:{}s:13:"valle-d-aosta";a:0:{}s:12:"valle-daosta";a:0:{}s:10:"valleaosta";a:0:{}s:12:"valled-aosta";a:0:{}s:11:"valledaosta";a:0:{}s:12:"vallee-aoste";a:0:{}s:11:"valleeaoste";a:0:{}s:3:"vao";a:0:{}s:3:"vda";a:0:{}s:3:"ven";a:0:{}s:6:"veneto";a:0:{}s:2:"ag";a:0:{}s:9:"agrigento";a:0:{}s:2:"al";a:0:{}s:11:"alessandria";a:0:{}s:10:"alto-adige";a:0:{}s:9:"altoadige";a:0:{}s:2:"an";a:0:{}s:6:"ancona";a:0:{}s:21:"andria-barletta-trani";a:0:{}s:21:"andria-trani-barletta";a:0:{}s:19:"andriabarlettatrani";a:0:{}s:19:"andriatranibarletta";a:0:{}s:2:"ao";a:0:{}s:5:"aosta";a:0:{}s:5:"aoste";a:0:{}s:2:"ap";a:0:{}s:2:"aq";a:0:{}s:6:"aquila";a:0:{}s:2:"ar";a:0:{}s:6:"arezzo";a:0:{}s:13:"ascoli-piceno";a:0:{}s:12:"ascolipiceno";a:0:{}s:4:"asti";a:0:{}s:2:"at";a:0:{}s:2:"av";a:0:{}s:8:"avellino";a:0:{}s:2:"ba";a:0:{}s:6:"balsan";a:0:{}s:4:"bari";a:0:{}s:21:"barletta-trani-andria";a:0:{}s:19:"barlettatraniandria";a:0:{}s:7:"belluno";a:0:{}s:9:"benevento";a:0:{}s:7:"bergamo";a:0:{}s:2:"bg";a:0:{}s:2:"bi";a:0:{}s:6:"biella";a:0:{}s:2:"bl";a:0:{}s:2:"bn";a:0:{}s:2:"bo";a:0:{}s:7:"bologna";a:0:{}s:7:"bolzano";a:0:{}s:5:"bozen";a:0:{}s:2:"br";a:0:{}s:7:"brescia";a:0:{}s:8:"brindisi";a:0:{}s:2:"bs";a:0:{}s:2:"bt";a:0:{}s:2:"bz";a:0:{}s:2:"ca";a:0:{}s:8:"cagliari";a:0:{}s:13:"caltanissetta";a:0:{}s:15:"campidano-medio";a:0:{}s:14:"campidanomedio";a:0:{}s:10:"campobasso";a:0:{}s:17:"carbonia-iglesias";a:0:{}s:16:"carboniaiglesias";a:0:{}s:13:"carrara-massa";a:0:{}s:12:"carraramassa";a:0:{}s:7:"caserta";a:0:{}s:7:"catania";a:0:{}s:9:"catanzaro";a:0:{}s:2:"cb";a:0:{}s:2:"ce";a:0:{}s:12:"cesena-forli";a:0:{}s:11:"cesenaforli";a:0:{}s:2:"ch";a:0:{}s:6:"chieti";a:0:{}s:2:"ci";a:0:{}s:2:"cl";a:0:{}s:2:"cn";a:0:{}s:2:"co";a:0:{}s:4:"como";a:0:{}s:7:"cosenza";a:0:{}s:2:"cr";a:0:{}s:7:"cremona";a:0:{}s:7:"crotone";a:0:{}s:2:"cs";a:0:{}s:2:"ct";a:0:{}s:5:"cuneo";a:0:{}s:2:"cz";a:0:{}s:14:"dell-ogliastra";a:0:{}s:13:"dellogliastra";a:0:{}s:2:"en";a:0:{}s:4:"enna";a:0:{}s:2:"fc";a:0:{}s:2:"fe";a:0:{}s:5:"fermo";a:0:{}s:7:"ferrara";a:0:{}s:2:"fg";a:0:{}s:2:"fi";a:0:{}s:7:"firenze";a:0:{}s:8:"florence";a:0:{}s:2:"fm";a:0:{}s:6:"foggia";a:0:{}s:12:"forli-cesena";a:0:{}s:11:"forlicesena";a:0:{}s:2:"fr";a:0:{}s:9:"frosinone";a:0:{}s:2:"ge";a:0:{}s:5:"genoa";a:0:{}s:6:"genova";a:0:{}s:2:"go";a:0:{}s:7:"gorizia";a:0:{}s:2:"gr";a:0:{}s:8:"grosseto";a:0:{}s:17:"iglesias-carbonia";a:0:{}s:16:"iglesiascarbonia";a:0:{}s:2:"im";a:0:{}s:7:"imperia";a:0:{}s:2:"is";a:0:{}s:7:"isernia";a:0:{}s:2:"kr";a:0:{}s:9:"la-spezia";a:0:{}s:7:"laquila";a:0:{}s:8:"laspezia";a:0:{}s:6:"latina";a:0:{}s:2:"lc";a:0:{}s:2:"le";a:0:{}s:5:"lecce";a:0:{}s:5:"lecco";a:0:{}s:2:"li";a:0:{}s:7:"livorno";a:0:{}s:2:"lo";a:0:{}s:4:"lodi";a:0:{}s:2:"lt";a:0:{}s:2:"lu";a:0:{}s:5:"lucca";a:0:{}s:8:"macerata";a:0:{}s:7:"mantova";a:0:{}s:13:"massa-carrara";a:0:{}s:12:"massacarrara";a:0:{}s:6:"matera";a:0:{}s:2:"mb";a:0:{}s:2:"mc";a:0:{}s:2:"me";a:0:{}s:15:"medio-campidano";a:0:{}s:14:"mediocampidano";a:0:{}s:7:"messina";a:0:{}s:2:"mi";a:0:{}s:5:"milan";a:0:{}s:6:"milano";a:0:{}s:2:"mn";a:0:{}s:2:"mo";a:0:{}s:6:"modena";a:0:{}s:13:"monza-brianza";a:0:{}s:21:"monza-e-della-brianza";a:0:{}s:5:"monza";a:0:{}s:12:"monzabrianza";a:0:{}s:13:"monzaebrianza";a:0:{}s:18:"monzaedellabrianza";a:0:{}s:2:"ms";a:0:{}s:2:"mt";a:0:{}s:2:"na";a:0:{}s:6:"naples";a:0:{}s:6:"napoli";a:0:{}s:2:"no";a:0:{}s:6:"novara";a:0:{}s:2:"nu";a:0:{}s:5:"nuoro";a:0:{}s:2:"og";a:0:{}s:9:"ogliastra";a:0:{}s:12:"olbia-tempio";a:0:{}s:11:"olbiatempio";a:0:{}s:2:"or";a:0:{}s:8:"oristano";a:0:{}s:2:"ot";a:0:{}s:2:"pa";a:0:{}s:6:"padova";a:0:{}s:5:"padua";a:0:{}s:7:"palermo";a:0:{}s:5:"parma";a:0:{}s:5:"pavia";a:0:{}s:2:"pc";a:0:{}s:2:"pd";a:0:{}s:2:"pe";a:0:{}s:7:"perugia";a:0:{}s:13:"pesaro-urbino";a:0:{}s:12:"pesarourbino";a:0:{}s:7:"pescara";a:0:{}s:2:"pg";a:0:{}s:2:"pi";a:0:{}s:8:"piacenza";a:0:{}s:4:"pisa";a:0:{}s:7:"pistoia";a:0:{}s:2:"pn";a:0:{}s:2:"po";a:0:{}s:9:"pordenone";a:0:{}s:7:"potenza";a:0:{}s:2:"pr";a:0:{}s:5:"prato";a:0:{}s:2:"pt";a:0:{}s:2:"pu";a:0:{}s:2:"pv";a:0:{}s:2:"pz";a:0:{}s:2:"ra";a:0:{}s:6:"ragusa";a:0:{}s:7:"ravenna";a:0:{}s:2:"rc";a:0:{}s:2:"re";a:0:{}s:15:"reggio-calabria";a:0:{}s:13:"reggio-emilia";a:0:{}s:14:"reggiocalabria";a:0:{}s:12:"reggioemilia";a:0:{}s:2:"rg";a:0:{}s:2:"ri";a:0:{}s:5:"rieti";a:0:{}s:6:"rimini";a:0:{}s:2:"rm";a:0:{}s:2:"rn";a:0:{}s:2:"ro";a:0:{}s:4:"roma";a:0:{}s:4:"rome";a:0:{}s:6:"rovigo";a:0:{}s:2:"sa";a:0:{}s:7:"salerno";a:0:{}s:7:"sassari";a:0:{}s:6:"savona";a:0:{}s:2:"si";a:0:{}s:5:"siena";a:0:{}s:8:"siracusa";a:0:{}s:2:"so";a:0:{}s:7:"sondrio";a:0:{}s:2:"sp";a:0:{}s:2:"sr";a:0:{}s:2:"ss";a:0:{}s:9:"suedtirol";a:0:{}s:2:"sv";a:0:{}s:2:"ta";a:0:{}s:7:"taranto";a:0:{}s:2:"te";a:0:{}s:12:"tempio-olbia";a:0:{}s:11:"tempioolbia";a:0:{}s:6:"teramo";a:0:{}s:5:"terni";a:0:{}s:2:"tn";a:0:{}s:2:"to";a:0:{}s:6:"torino";a:0:{}s:2:"tp";a:0:{}s:2:"tr";a:0:{}s:21:"trani-andria-barletta";a:0:{}s:21:"trani-barletta-andria";a:0:{}s:19:"traniandriabarletta";a:0:{}s:19:"tranibarlettaandria";a:0:{}s:7:"trapani";a:0:{}s:8:"trentino";a:0:{}s:6:"trento";a:0:{}s:7:"treviso";a:0:{}s:7:"trieste";a:0:{}s:2:"ts";a:0:{}s:5:"turin";a:0:{}s:2:"tv";a:0:{}s:2:"ud";a:0:{}s:5:"udine";a:0:{}s:13:"urbino-pesaro";a:0:{}s:12:"urbinopesaro";a:0:{}s:2:"va";a:0:{}s:6:"varese";a:0:{}s:2:"vb";a:0:{}s:2:"vc";a:0:{}s:2:"ve";a:0:{}s:7:"venezia";a:0:{}s:6:"venice";a:0:{}s:8:"verbania";a:0:{}s:8:"vercelli";a:0:{}s:6:"verona";a:0:{}s:2:"vi";a:0:{}s:13:"vibo-valentia";a:0:{}s:12:"vibovalentia";a:0:{}s:7:"vicenza";a:0:{}s:7:"viterbo";a:0:{}s:2:"vr";a:0:{}s:2:"vs";a:0:{}s:2:"vt";a:0:{}s:2:"vv";a:0:{}}s:2:"je";a:3:{s:2:"co";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"jm";a:1:{s:1:"*";a:0:{}}s:2:"jo";a:8:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}s:3:"sch";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}}s:4:"jobs";a:0:{}s:2:"jp";a:110:{s:2:"ac";a:0:{}s:2:"ad";a:0:{}s:2:"co";a:0:{}s:2:"ed";a:0:{}s:2:"go";a:0:{}s:2:"gr";a:0:{}s:2:"lg";a:0:{}s:2:"ne";a:0:{}s:2:"or";a:0:{}s:5:"aichi";a:52:{s:5:"aisai";a:0:{}s:3:"ama";a:0:{}s:4:"anjo";a:0:{}s:5:"asuke";a:0:{}s:6:"chiryu";a:0:{}s:5:"chita";a:0:{}s:4:"fuso";a:0:{}s:8:"gamagori";a:0:{}s:5:"handa";a:0:{}s:4:"hazu";a:0:{}s:7:"hekinan";a:0:{}s:10:"higashiura";a:0:{}s:10:"ichinomiya";a:0:{}s:7:"inazawa";a:0:{}s:7:"inuyama";a:0:{}s:7:"isshiki";a:0:{}s:7:"iwakura";a:0:{}s:5:"kanie";a:0:{}s:6:"kariya";a:0:{}s:7:"kasugai";a:0:{}s:4:"kira";a:0:{}s:6:"kiyosu";a:0:{}s:6:"komaki";a:0:{}s:5:"konan";a:0:{}s:4:"kota";a:0:{}s:6:"mihama";a:0:{}s:7:"miyoshi";a:0:{}s:6:"nishio";a:0:{}s:7:"nisshin";a:0:{}s:3:"obu";a:0:{}s:6:"oguchi";a:0:{}s:5:"oharu";a:0:{}s:7:"okazaki";a:0:{}s:10:"owariasahi";a:0:{}s:4:"seto";a:0:{}s:8:"shikatsu";a:0:{}s:9:"shinshiro";a:0:{}s:7:"shitara";a:0:{}s:6:"tahara";a:0:{}s:8:"takahama";a:0:{}s:9:"tobishima";a:0:{}s:4:"toei";a:0:{}s:4:"togo";a:0:{}s:5:"tokai";a:0:{}s:8:"tokoname";a:0:{}s:7:"toyoake";a:0:{}s:9:"toyohashi";a:0:{}s:8:"toyokawa";a:0:{}s:6:"toyone";a:0:{}s:6:"toyota";a:0:{}s:8:"tsushima";a:0:{}s:6:"yatomi";a:0:{}}s:5:"akita";a:28:{s:5:"akita";a:0:{}s:6:"daisen";a:0:{}s:8:"fujisato";a:0:{}s:6:"gojome";a:0:{}s:11:"hachirogata";a:0:{}s:6:"happou";a:0:{}s:13:"higashinaruse";a:0:{}s:5:"honjo";a:0:{}s:6:"honjyo";a:0:{}s:5:"ikawa";a:0:{}s:9:"kamikoani";a:0:{}s:7:"kamioka";a:0:{}s:8:"katagami";a:0:{}s:6:"kazuno";a:0:{}s:9:"kitaakita";a:0:{}s:6:"kosaka";a:0:{}s:5:"kyowa";a:0:{}s:6:"misato";a:0:{}s:6:"mitane";a:0:{}s:9:"moriyoshi";a:0:{}s:6:"nikaho";a:0:{}s:7:"noshiro";a:0:{}s:5:"odate";a:0:{}s:3:"oga";a:0:{}s:5:"ogata";a:0:{}s:7:"semboku";a:0:{}s:6:"yokote";a:0:{}s:9:"yurihonjo";a:0:{}}s:6:"aomori";a:22:{s:6:"aomori";a:0:{}s:6:"gonohe";a:0:{}s:9:"hachinohe";a:0:{}s:9:"hashikami";a:0:{}s:7:"hiranai";a:0:{}s:8:"hirosaki";a:0:{}s:9:"itayanagi";a:0:{}s:8:"kuroishi";a:0:{}s:6:"misawa";a:0:{}s:5:"mutsu";a:0:{}s:10:"nakadomari";a:0:{}s:6:"noheji";a:0:{}s:6:"oirase";a:0:{}s:5:"owani";a:0:{}s:8:"rokunohe";a:0:{}s:7:"sannohe";a:0:{}s:10:"shichinohe";a:0:{}s:6:"shingo";a:0:{}s:5:"takko";a:0:{}s:6:"towada";a:0:{}s:7:"tsugaru";a:0:{}s:7:"tsuruta";a:0:{}}s:5:"chiba";a:58:{s:5:"abiko";a:0:{}s:5:"asahi";a:0:{}s:6:"chonan";a:0:{}s:6:"chosei";a:0:{}s:6:"choshi";a:0:{}s:4:"chuo";a:0:{}s:9:"funabashi";a:0:{}s:6:"futtsu";a:0:{}s:10:"hanamigawa";a:0:{}s:8:"ichihara";a:0:{}s:8:"ichikawa";a:0:{}s:10:"ichinomiya";a:0:{}s:5:"inzai";a:0:{}s:5:"isumi";a:0:{}s:8:"kamagaya";a:0:{}s:8:"kamogawa";a:0:{}s:7:"kashiwa";a:0:{}s:6:"katori";a:0:{}s:8:"katsuura";a:0:{}s:7:"kimitsu";a:0:{}s:8:"kisarazu";a:0:{}s:6:"kozaki";a:0:{}s:8:"kujukuri";a:0:{}s:6:"kyonan";a:0:{}s:7:"matsudo";a:0:{}s:6:"midori";a:0:{}s:6:"mihama";a:0:{}s:10:"minamiboso";a:0:{}s:6:"mobara";a:0:{}s:9:"mutsuzawa";a:0:{}s:6:"nagara";a:0:{}s:10:"nagareyama";a:0:{}s:9:"narashino";a:0:{}s:6:"narita";a:0:{}s:4:"noda";a:0:{}s:13:"oamishirasato";a:0:{}s:7:"omigawa";a:0:{}s:6:"onjuku";a:0:{}s:5:"otaki";a:0:{}s:5:"sakae";a:0:{}s:6:"sakura";a:0:{}s:9:"shimofusa";a:0:{}s:7:"shirako";a:0:{}s:6:"shiroi";a:0:{}s:6:"shisui";a:0:{}s:9:"sodegaura";a:0:{}s:4:"sosa";a:0:{}s:4:"tako";a:0:{}s:8:"tateyama";a:0:{}s:6:"togane";a:0:{}s:8:"tohnosho";a:0:{}s:8:"tomisato";a:0:{}s:7:"urayasu";a:0:{}s:9:"yachimata";a:0:{}s:7:"yachiyo";a:0:{}s:10:"yokaichiba";a:0:{}s:15:"yokoshibahikari";a:0:{}s:10:"yotsukaido";a:0:{}}s:5:"ehime";a:22:{s:5:"ainan";a:0:{}s:5:"honai";a:0:{}s:5:"ikata";a:0:{}s:7:"imabari";a:0:{}s:3:"iyo";a:0:{}s:8:"kamijima";a:0:{}s:6:"kihoku";a:0:{}s:9:"kumakogen";a:0:{}s:6:"masaki";a:0:{}s:7:"matsuno";a:0:{}s:9:"matsuyama";a:0:{}s:8:"namikata";a:0:{}s:7:"niihama";a:0:{}s:3:"ozu";a:0:{}s:5:"saijo";a:0:{}s:5:"seiyo";a:0:{}s:11:"shikokuchuo";a:0:{}s:4:"tobe";a:0:{}s:4:"toon";a:0:{}s:6:"uchiko";a:0:{}s:7:"uwajima";a:0:{}s:10:"yawatahama";a:0:{}}s:5:"fukui";a:15:{s:7:"echizen";a:0:{}s:7:"eiheiji";a:0:{}s:5:"fukui";a:0:{}s:5:"ikeda";a:0:{}s:9:"katsuyama";a:0:{}s:6:"mihama";a:0:{}s:13:"minamiechizen";a:0:{}s:5:"obama";a:0:{}s:3:"ohi";a:0:{}s:3:"ono";a:0:{}s:5:"sabae";a:0:{}s:5:"sakai";a:0:{}s:8:"takahama";a:0:{}s:7:"tsuruga";a:0:{}s:6:"wakasa";a:0:{}}s:7:"fukuoka";a:63:{s:6:"ashiya";a:0:{}s:5:"buzen";a:0:{}s:7:"chikugo";a:0:{}s:7:"chikuho";a:0:{}s:7:"chikujo";a:0:{}s:10:"chikushino";a:0:{}s:8:"chikuzen";a:0:{}s:4:"chuo";a:0:{}s:7:"dazaifu";a:0:{}s:7:"fukuchi";a:0:{}s:6:"hakata";a:0:{}s:7:"higashi";a:0:{}s:8:"hirokawa";a:0:{}s:8:"hisayama";a:0:{}s:6:"iizuka";a:0:{}s:8:"inatsuki";a:0:{}s:4:"kaho";a:0:{}s:6:"kasuga";a:0:{}s:6:"kasuya";a:0:{}s:6:"kawara";a:0:{}s:6:"keisen";a:0:{}s:4:"koga";a:0:{}s:6:"kurate";a:0:{}s:6:"kurogi";a:0:{}s:6:"kurume";a:0:{}s:6:"minami";a:0:{}s:6:"miyako";a:0:{}s:6:"miyama";a:0:{}s:8:"miyawaka";a:0:{}s:8:"mizumaki";a:0:{}s:8:"munakata";a:0:{}s:8:"nakagawa";a:0:{}s:6:"nakama";a:0:{}s:5:"nishi";a:0:{}s:6:"nogata";a:0:{}s:5:"ogori";a:0:{}s:7:"okagaki";a:0:{}s:5:"okawa";a:0:{}s:3:"oki";a:0:{}s:5:"omuta";a:0:{}s:4:"onga";a:0:{}s:5:"onojo";a:0:{}s:3:"oto";a:0:{}s:7:"saigawa";a:0:{}s:8:"sasaguri";a:0:{}s:6:"shingu";a:0:{}s:13:"shinyoshitomi";a:0:{}s:6:"shonai";a:0:{}s:5:"soeda";a:0:{}s:3:"sue";a:0:{}s:9:"tachiarai";a:0:{}s:6:"tagawa";a:0:{}s:6:"takata";a:0:{}s:4:"toho";a:0:{}s:7:"toyotsu";a:0:{}s:6:"tsuiki";a:0:{}s:5:"ukiha";a:0:{}s:3:"umi";a:0:{}s:4:"usui";a:0:{}s:6:"yamada";a:0:{}s:4:"yame";a:0:{}s:8:"yanagawa";a:0:{}s:9:"yukuhashi";a:0:{}}s:9:"fukushima";a:51:{s:9:"aizubange";a:0:{}s:10:"aizumisato";a:0:{}s:13:"aizuwakamatsu";a:0:{}s:7:"asakawa";a:0:{}s:6:"bandai";a:0:{}s:4:"date";a:0:{}s:9:"fukushima";a:0:{}s:8:"furudono";a:0:{}s:6:"futaba";a:0:{}s:6:"hanawa";a:0:{}s:7:"higashi";a:0:{}s:6:"hirata";a:0:{}s:6:"hirono";a:0:{}s:6:"iitate";a:0:{}s:10:"inawashiro";a:0:{}s:8:"ishikawa";a:0:{}s:5:"iwaki";a:0:{}s:9:"izumizaki";a:0:{}s:10:"kagamiishi";a:0:{}s:8:"kaneyama";a:0:{}s:8:"kawamata";a:0:{}s:8:"kitakata";a:0:{}s:12:"kitashiobara";a:0:{}s:5:"koori";a:0:{}s:8:"koriyama";a:0:{}s:6:"kunimi";a:0:{}s:6:"miharu";a:0:{}s:7:"mishima";a:0:{}s:5:"namie";a:0:{}s:5:"nango";a:0:{}s:9:"nishiaizu";a:0:{}s:7:"nishigo";a:0:{}s:5:"okuma";a:0:{}s:7:"omotego";a:0:{}s:3:"ono";a:0:{}s:5:"otama";a:0:{}s:8:"samegawa";a:0:{}s:7:"shimogo";a:0:{}s:9:"shirakawa";a:0:{}s:5:"showa";a:0:{}s:4:"soma";a:0:{}s:8:"sukagawa";a:0:{}s:7:"taishin";a:0:{}s:8:"tamakawa";a:0:{}s:8:"tanagura";a:0:{}s:5:"tenei";a:0:{}s:6:"yabuki";a:0:{}s:6:"yamato";a:0:{}s:9:"yamatsuri";a:0:{}s:7:"yanaizu";a:0:{}s:6:"yugawa";a:0:{}}s:4:"gifu";a:38:{s:7:"anpachi";a:0:{}s:3:"ena";a:0:{}s:4:"gifu";a:0:{}s:5:"ginan";a:0:{}s:4:"godo";a:0:{}s:4:"gujo";a:0:{}s:7:"hashima";a:0:{}s:7:"hichiso";a:0:{}s:4:"hida";a:0:{}s:16:"higashishirakawa";a:0:{}s:7:"ibigawa";a:0:{}s:5:"ikeda";a:0:{}s:12:"kakamigahara";a:0:{}s:4:"kani";a:0:{}s:8:"kasahara";a:0:{}s:9:"kasamatsu";a:0:{}s:6:"kawaue";a:0:{}s:8:"kitagata";a:0:{}s:4:"mino";a:0:{}s:8:"minokamo";a:0:{}s:6:"mitake";a:0:{}s:8:"mizunami";a:0:{}s:6:"motosu";a:0:{}s:11:"nakatsugawa";a:0:{}s:5:"ogaki";a:0:{}s:8:"sakahogi";a:0:{}s:4:"seki";a:0:{}s:10:"sekigahara";a:0:{}s:9:"shirakawa";a:0:{}s:6:"tajimi";a:0:{}s:8:"takayama";a:0:{}s:5:"tarui";a:0:{}s:4:"toki";a:0:{}s:6:"tomika";a:0:{}s:8:"wanouchi";a:0:{}s:8:"yamagata";a:0:{}s:6:"yaotsu";a:0:{}s:4:"yoro";a:0:{}}s:5:"gunma";a:36:{s:6:"annaka";a:0:{}s:7:"chiyoda";a:0:{}s:7:"fujioka";a:0:{}s:15:"higashiagatsuma";a:0:{}s:7:"isesaki";a:0:{}s:7:"itakura";a:0:{}s:5:"kanna";a:0:{}s:5:"kanra";a:0:{}s:9:"katashina";a:0:{}s:6:"kawaba";a:0:{}s:5:"kiryu";a:0:{}s:7:"kusatsu";a:0:{}s:8:"maebashi";a:0:{}s:5:"meiwa";a:0:{}s:6:"midori";a:0:{}s:8:"minakami";a:0:{}s:10:"naganohara";a:0:{}s:8:"nakanojo";a:0:{}s:7:"nanmoku";a:0:{}s:6:"numata";a:0:{}s:6:"oizumi";a:0:{}s:3:"ora";a:0:{}s:3:"ota";a:0:{}s:9:"shibukawa";a:0:{}s:9:"shimonita";a:0:{}s:6:"shinto";a:0:{}s:5:"showa";a:0:{}s:8:"takasaki";a:0:{}s:8:"takayama";a:0:{}s:8:"tamamura";a:0:{}s:11:"tatebayashi";a:0:{}s:7:"tomioka";a:0:{}s:9:"tsukiyono";a:0:{}s:8:"tsumagoi";a:0:{}s:4:"ueno";a:0:{}s:8:"yoshioka";a:0:{}}s:9:"hiroshima";a:25:{s:9:"asaminami";a:0:{}s:5:"daiwa";a:0:{}s:7:"etajima";a:0:{}s:5:"fuchu";a:0:{}s:8:"fukuyama";a:0:{}s:11:"hatsukaichi";a:0:{}s:16:"higashihiroshima";a:0:{}s:5:"hongo";a:0:{}s:12:"jinsekikogen";a:0:{}s:5:"kaita";a:0:{}s:3:"kui";a:0:{}s:6:"kumano";a:0:{}s:4:"kure";a:0:{}s:6:"mihara";a:0:{}s:7:"miyoshi";a:0:{}s:4:"naka";a:0:{}s:8:"onomichi";a:0:{}s:13:"osakikamijima";a:0:{}s:5:"otake";a:0:{}s:4:"saka";a:0:{}s:4:"sera";a:0:{}s:9:"seranishi";a:0:{}s:8:"shinichi";a:0:{}s:7:"shobara";a:0:{}s:8:"takehara";a:0:{}}s:8:"hokkaido";a:142:{s:8:"abashiri";a:0:{}s:5:"abira";a:0:{}s:7:"aibetsu";a:0:{}s:7:"akabira";a:0:{}s:7:"akkeshi";a:0:{}s:9:"asahikawa";a:0:{}s:9:"ashibetsu";a:0:{}s:6:"ashoro";a:0:{}s:6:"assabu";a:0:{}s:6:"atsuma";a:0:{}s:5:"bibai";a:0:{}s:4:"biei";a:0:{}s:6:"bifuka";a:0:{}s:6:"bihoro";a:0:{}s:8:"biratori";a:0:{}s:11:"chippubetsu";a:0:{}s:7:"chitose";a:0:{}s:4:"date";a:0:{}s:6:"ebetsu";a:0:{}s:7:"embetsu";a:0:{}s:5:"eniwa";a:0:{}s:5:"erimo";a:0:{}s:4:"esan";a:0:{}s:6:"esashi";a:0:{}s:8:"fukagawa";a:0:{}s:9:"fukushima";a:0:{}s:6:"furano";a:0:{}s:8:"furubira";a:0:{}s:6:"haboro";a:0:{}s:8:"hakodate";a:0:{}s:12:"hamatonbetsu";a:0:{}s:6:"hidaka";a:0:{}s:13:"higashikagura";a:0:{}s:11:"higashikawa";a:0:{}s:5:"hiroo";a:0:{}s:7:"hokuryu";a:0:{}s:6:"hokuto";a:0:{}s:8:"honbetsu";a:0:{}s:9:"horokanai";a:0:{}s:8:"horonobe";a:0:{}s:5:"ikeda";a:0:{}s:7:"imakane";a:0:{}s:8:"ishikari";a:0:{}s:9:"iwamizawa";a:0:{}s:6:"iwanai";a:0:{}s:10:"kamifurano";a:0:{}s:8:"kamikawa";a:0:{}s:11:"kamishihoro";a:0:{}s:12:"kamisunagawa";a:0:{}s:8:"kamoenai";a:0:{}s:6:"kayabe";a:0:{}s:8:"kembuchi";a:0:{}s:7:"kikonai";a:0:{}s:9:"kimobetsu";a:0:{}s:13:"kitahiroshima";a:0:{}s:6:"kitami";a:0:{}s:8:"kiyosato";a:0:{}s:9:"koshimizu";a:0:{}s:8:"kunneppu";a:0:{}s:8:"kuriyama";a:0:{}s:12:"kuromatsunai";a:0:{}s:7:"kushiro";a:0:{}s:7:"kutchan";a:0:{}s:5:"kyowa";a:0:{}s:7:"mashike";a:0:{}s:8:"matsumae";a:0:{}s:6:"mikasa";a:0:{}s:12:"minamifurano";a:0:{}s:8:"mombetsu";a:0:{}s:8:"moseushi";a:0:{}s:6:"mukawa";a:0:{}s:7:"muroran";a:0:{}s:4:"naie";a:0:{}s:8:"nakagawa";a:0:{}s:12:"nakasatsunai";a:0:{}s:12:"nakatombetsu";a:0:{}s:5:"nanae";a:0:{}s:7:"nanporo";a:0:{}s:6:"nayoro";a:0:{}s:6:"nemuro";a:0:{}s:8:"niikappu";a:0:{}s:4:"niki";a:0:{}s:11:"nishiokoppe";a:0:{}s:11:"noboribetsu";a:0:{}s:6:"numata";a:0:{}s:7:"obihiro";a:0:{}s:5:"obira";a:0:{}s:5:"oketo";a:0:{}s:6:"okoppe";a:0:{}s:5:"otaru";a:0:{}s:5:"otobe";a:0:{}s:7:"otofuke";a:0:{}s:9:"otoineppu";a:0:{}s:4:"oumu";a:0:{}s:5:"ozora";a:0:{}s:5:"pippu";a:0:{}s:8:"rankoshi";a:0:{}s:5:"rebun";a:0:{}s:9:"rikubetsu";a:0:{}s:7:"rishiri";a:0:{}s:11:"rishirifuji";a:0:{}s:6:"saroma";a:0:{}s:9:"sarufutsu";a:0:{}s:8:"shakotan";a:0:{}s:5:"shari";a:0:{}s:8:"shibecha";a:0:{}s:8:"shibetsu";a:0:{}s:7:"shikabe";a:0:{}s:7:"shikaoi";a:0:{}s:9:"shimamaki";a:0:{}s:7:"shimizu";a:0:{}s:9:"shimokawa";a:0:{}s:12:"shinshinotsu";a:0:{}s:8:"shintoku";a:0:{}s:9:"shiranuka";a:0:{}s:7:"shiraoi";a:0:{}s:9:"shiriuchi";a:0:{}s:7:"sobetsu";a:0:{}s:8:"sunagawa";a:0:{}s:5:"taiki";a:0:{}s:6:"takasu";a:0:{}s:8:"takikawa";a:0:{}s:8:"takinoue";a:0:{}s:9:"teshikaga";a:0:{}s:7:"tobetsu";a:0:{}s:5:"tohma";a:0:{}s:9:"tomakomai";a:0:{}s:6:"tomari";a:0:{}s:4:"toya";a:0:{}s:6:"toyako";a:0:{}s:8:"toyotomi";a:0:{}s:7:"toyoura";a:0:{}s:8:"tsubetsu";a:0:{}s:9:"tsukigata";a:0:{}s:7:"urakawa";a:0:{}s:6:"urausu";a:0:{}s:4:"uryu";a:0:{}s:9:"utashinai";a:0:{}s:8:"wakkanai";a:0:{}s:7:"wassamu";a:0:{}s:6:"yakumo";a:0:{}s:6:"yoichi";a:0:{}}s:5:"hyogo";a:46:{s:4:"aioi";a:0:{}s:6:"akashi";a:0:{}s:3:"ako";a:0:{}s:9:"amagasaki";a:0:{}s:6:"aogaki";a:0:{}s:5:"asago";a:0:{}s:6:"ashiya";a:0:{}s:5:"awaji";a:0:{}s:8:"fukusaki";a:0:{}s:7:"goshiki";a:0:{}s:6:"harima";a:0:{}s:6:"himeji";a:0:{}s:8:"ichikawa";a:0:{}s:7:"inagawa";a:0:{}s:5:"itami";a:0:{}s:8:"kakogawa";a:0:{}s:8:"kamigori";a:0:{}s:8:"kamikawa";a:0:{}s:5:"kasai";a:0:{}s:6:"kasuga";a:0:{}s:9:"kawanishi";a:0:{}s:4:"miki";a:0:{}s:11:"minamiawaji";a:0:{}s:11:"nishinomiya";a:0:{}s:9:"nishiwaki";a:0:{}s:3:"ono";a:0:{}s:5:"sanda";a:0:{}s:6:"sannan";a:0:{}s:8:"sasayama";a:0:{}s:4:"sayo";a:0:{}s:6:"shingu";a:0:{}s:9:"shinonsen";a:0:{}s:5:"shiso";a:0:{}s:6:"sumoto";a:0:{}s:6:"taishi";a:0:{}s:4:"taka";a:0:{}s:10:"takarazuka";a:0:{}s:8:"takasago";a:0:{}s:6:"takino";a:0:{}s:5:"tamba";a:0:{}s:7:"tatsuno";a:0:{}s:7:"toyooka";a:0:{}s:4:"yabu";a:0:{}s:7:"yashiro";a:0:{}s:4:"yoka";a:0:{}s:6:"yokawa";a:0:{}}s:7:"ibaraki";a:51:{s:3:"ami";a:0:{}s:5:"asahi";a:0:{}s:5:"bando";a:0:{}s:8:"chikusei";a:0:{}s:5:"daigo";a:0:{}s:9:"fujishiro";a:0:{}s:7:"hitachi";a:0:{}s:11:"hitachinaka";a:0:{}s:12:"hitachiomiya";a:0:{}s:10:"hitachiota";a:0:{}s:7:"ibaraki";a:0:{}s:3:"ina";a:0:{}s:8:"inashiki";a:0:{}s:5:"itako";a:0:{}s:5:"iwama";a:0:{}s:4:"joso";a:0:{}s:6:"kamisu";a:0:{}s:6:"kasama";a:0:{}s:7:"kashima";a:0:{}s:11:"kasumigaura";a:0:{}s:4:"koga";a:0:{}s:4:"miho";a:0:{}s:4:"mito";a:0:{}s:6:"moriya";a:0:{}s:4:"naka";a:0:{}s:8:"namegata";a:0:{}s:5:"oarai";a:0:{}s:5:"ogawa";a:0:{}s:7:"omitama";a:0:{}s:9:"ryugasaki";a:0:{}s:5:"sakai";a:0:{}s:10:"sakuragawa";a:0:{}s:9:"shimodate";a:0:{}s:10:"shimotsuma";a:0:{}s:9:"shirosato";a:0:{}s:4:"sowa";a:0:{}s:5:"suifu";a:0:{}s:8:"takahagi";a:0:{}s:11:"tamatsukuri";a:0:{}s:5:"tokai";a:0:{}s:6:"tomobe";a:0:{}s:4:"tone";a:0:{}s:6:"toride";a:0:{}s:9:"tsuchiura";a:0:{}s:7:"tsukuba";a:0:{}s:8:"uchihara";a:0:{}s:6:"ushiku";a:0:{}s:7:"yachiyo";a:0:{}s:8:"yamagata";a:0:{}s:6:"yawara";a:0:{}s:4:"yuki";a:0:{}}s:8:"ishikawa";a:19:{s:7:"anamizu";a:0:{}s:5:"hakui";a:0:{}s:7:"hakusan";a:0:{}s:4:"kaga";a:0:{}s:6:"kahoku";a:0:{}s:8:"kanazawa";a:0:{}s:8:"kawakita";a:0:{}s:7:"komatsu";a:0:{}s:8:"nakanoto";a:0:{}s:5:"nanao";a:0:{}s:4:"nomi";a:0:{}s:8:"nonoichi";a:0:{}s:4:"noto";a:0:{}s:5:"shika";a:0:{}s:4:"suzu";a:0:{}s:7:"tsubata";a:0:{}s:7:"tsurugi";a:0:{}s:8:"uchinada";a:0:{}s:6:"wajima";a:0:{}}s:5:"iwate";a:34:{s:5:"fudai";a:0:{}s:8:"fujisawa";a:0:{}s:8:"hanamaki";a:0:{}s:9:"hiraizumi";a:0:{}s:6:"hirono";a:0:{}s:8:"ichinohe";a:0:{}s:10:"ichinoseki";a:0:{}s:8:"iwaizumi";a:0:{}s:5:"iwate";a:0:{}s:6:"joboji";a:0:{}s:8:"kamaishi";a:0:{}s:10:"kanegasaki";a:0:{}s:7:"karumai";a:0:{}s:5:"kawai";a:0:{}s:8:"kitakami";a:0:{}s:4:"kuji";a:0:{}s:6:"kunohe";a:0:{}s:8:"kuzumaki";a:0:{}s:6:"miyako";a:0:{}s:8:"mizusawa";a:0:{}s:7:"morioka";a:0:{}s:6:"ninohe";a:0:{}s:4:"noda";a:0:{}s:7:"ofunato";a:0:{}s:4:"oshu";a:0:{}s:7:"otsuchi";a:0:{}s:13:"rikuzentakata";a:0:{}s:5:"shiwa";a:0:{}s:11:"shizukuishi";a:0:{}s:6:"sumita";a:0:{}s:8:"tanohata";a:0:{}s:4:"tono";a:0:{}s:6:"yahaba";a:0:{}s:6:"yamada";a:0:{}}s:6:"kagawa";a:15:{s:7:"ayagawa";a:0:{}s:13:"higashikagawa";a:0:{}s:7:"kanonji";a:0:{}s:8:"kotohira";a:0:{}s:5:"manno";a:0:{}s:8:"marugame";a:0:{}s:6:"mitoyo";a:0:{}s:8:"naoshima";a:0:{}s:6:"sanuki";a:0:{}s:7:"tadotsu";a:0:{}s:9:"takamatsu";a:0:{}s:7:"tonosho";a:0:{}s:8:"uchinomi";a:0:{}s:5:"utazu";a:0:{}s:8:"zentsuji";a:0:{}}s:9:"kagoshima";a:20:{s:5:"akune";a:0:{}s:5:"amami";a:0:{}s:5:"hioki";a:0:{}s:3:"isa";a:0:{}s:4:"isen";a:0:{}s:5:"izumi";a:0:{}s:9:"kagoshima";a:0:{}s:6:"kanoya";a:0:{}s:8:"kawanabe";a:0:{}s:5:"kinko";a:0:{}s:7:"kouyama";a:0:{}s:10:"makurazaki";a:0:{}s:9:"matsumoto";a:0:{}s:10:"minamitane";a:0:{}s:8:"nakatane";a:0:{}s:12:"nishinoomote";a:0:{}s:13:"satsumasendai";a:0:{}s:3:"soo";a:0:{}s:8:"tarumizu";a:0:{}s:5:"yusui";a:0:{}}s:8:"kanagawa";a:30:{s:6:"aikawa";a:0:{}s:6:"atsugi";a:0:{}s:5:"ayase";a:0:{}s:9:"chigasaki";a:0:{}s:5:"ebina";a:0:{}s:8:"fujisawa";a:0:{}s:6:"hadano";a:0:{}s:6:"hakone";a:0:{}s:9:"hiratsuka";a:0:{}s:7:"isehara";a:0:{}s:6:"kaisei";a:0:{}s:8:"kamakura";a:0:{}s:8:"kiyokawa";a:0:{}s:7:"matsuda";a:0:{}s:14:"minamiashigara";a:0:{}s:5:"miura";a:0:{}s:5:"nakai";a:0:{}s:8:"ninomiya";a:0:{}s:7:"odawara";a:0:{}s:2:"oi";a:0:{}s:4:"oiso";a:0:{}s:10:"sagamihara";a:0:{}s:8:"samukawa";a:0:{}s:6:"tsukui";a:0:{}s:8:"yamakita";a:0:{}s:6:"yamato";a:0:{}s:8:"yokosuka";a:0:{}s:8:"yugawara";a:0:{}s:4:"zama";a:0:{}s:5:"zushi";a:0:{}}s:5:"kochi";a:31:{s:3:"aki";a:0:{}s:6:"geisei";a:0:{}s:6:"hidaka";a:0:{}s:12:"higashitsuno";a:0:{}s:3:"ino";a:0:{}s:6:"kagami";a:0:{}s:4:"kami";a:0:{}s:8:"kitagawa";a:0:{}s:5:"kochi";a:0:{}s:6:"mihara";a:0:{}s:8:"motoyama";a:0:{}s:6:"muroto";a:0:{}s:6:"nahari";a:0:{}s:8:"nakamura";a:0:{}s:7:"nankoku";a:0:{}s:9:"nishitosa";a:0:{}s:10:"niyodogawa";a:0:{}s:4:"ochi";a:0:{}s:5:"okawa";a:0:{}s:5:"otoyo";a:0:{}s:6:"otsuki";a:0:{}s:6:"sakawa";a:0:{}s:6:"sukumo";a:0:{}s:6:"susaki";a:0:{}s:4:"tosa";a:0:{}s:11:"tosashimizu";a:0:{}s:4:"toyo";a:0:{}s:5:"tsuno";a:0:{}s:5:"umaji";a:0:{}s:6:"yasuda";a:0:{}s:8:"yusuhara";a:0:{}}s:8:"kumamoto";a:23:{s:7:"amakusa";a:0:{}s:4:"arao";a:0:{}s:3:"aso";a:0:{}s:5:"choyo";a:0:{}s:7:"gyokuto";a:0:{}s:11:"kamiamakusa";a:0:{}s:7:"kikuchi";a:0:{}s:8:"kumamoto";a:0:{}s:7:"mashiki";a:0:{}s:6:"mifune";a:0:{}s:8:"minamata";a:0:{}s:11:"minamioguni";a:0:{}s:6:"nagasu";a:0:{}s:9:"nishihara";a:0:{}s:5:"oguni";a:0:{}s:3:"ozu";a:0:{}s:6:"sumoto";a:0:{}s:8:"takamori";a:0:{}s:3:"uki";a:0:{}s:3:"uto";a:0:{}s:6:"yamaga";a:0:{}s:6:"yamato";a:0:{}s:10:"yatsushiro";a:0:{}}s:5:"kyoto";a:31:{s:5:"ayabe";a:0:{}s:11:"fukuchiyama";a:0:{}s:11:"higashiyama";a:0:{}s:3:"ide";a:0:{}s:3:"ine";a:0:{}s:4:"joyo";a:0:{}s:7:"kameoka";a:0:{}s:4:"kamo";a:0:{}s:4:"kita";a:0:{}s:4:"kizu";a:0:{}s:8:"kumiyama";a:0:{}s:8:"kyotamba";a:0:{}s:9:"kyotanabe";a:0:{}s:8:"kyotango";a:0:{}s:7:"maizuru";a:0:{}s:6:"minami";a:0:{}s:15:"minamiyamashiro";a:0:{}s:6:"miyazu";a:0:{}s:4:"muko";a:0:{}s:10:"nagaokakyo";a:0:{}s:7:"nakagyo";a:0:{}s:6:"nantan";a:0:{}s:9:"oyamazaki";a:0:{}s:5:"sakyo";a:0:{}s:5:"seika";a:0:{}s:6:"tanabe";a:0:{}s:3:"uji";a:0:{}s:9:"ujitawara";a:0:{}s:6:"wazuka";a:0:{}s:9:"yamashina";a:0:{}s:6:"yawata";a:0:{}}s:3:"mie";a:30:{s:5:"asahi";a:0:{}s:5:"inabe";a:0:{}s:3:"ise";a:0:{}s:8:"kameyama";a:0:{}s:7:"kawagoe";a:0:{}s:4:"kiho";a:0:{}s:8:"kisosaki";a:0:{}s:4:"kiwa";a:0:{}s:6:"komono";a:0:{}s:6:"kumano";a:0:{}s:6:"kuwana";a:0:{}s:9:"matsusaka";a:0:{}s:5:"meiwa";a:0:{}s:6:"mihama";a:0:{}s:9:"minamiise";a:0:{}s:6:"misugi";a:0:{}s:6:"miyama";a:0:{}s:6:"nabari";a:0:{}s:5:"shima";a:0:{}s:6:"suzuka";a:0:{}s:4:"tado";a:0:{}s:5:"taiki";a:0:{}s:4:"taki";a:0:{}s:6:"tamaki";a:0:{}s:4:"toba";a:0:{}s:3:"tsu";a:0:{}s:5:"udono";a:0:{}s:8:"ureshino";a:0:{}s:7:"watarai";a:0:{}s:9:"yokkaichi";a:0:{}}s:6:"miyagi";a:32:{s:8:"furukawa";a:0:{}s:17:"higashimatsushima";a:0:{}s:10:"ishinomaki";a:0:{}s:7:"iwanuma";a:0:{}s:6:"kakuda";a:0:{}s:4:"kami";a:0:{}s:8:"kawasaki";a:0:{}s:8:"marumori";a:0:{}s:10:"matsushima";a:0:{}s:13:"minamisanriku";a:0:{}s:6:"misato";a:0:{}s:6:"murata";a:0:{}s:6:"natori";a:0:{}s:7:"ogawara";a:0:{}s:5:"ohira";a:0:{}s:7:"onagawa";a:0:{}s:5:"osaki";a:0:{}s:4:"rifu";a:0:{}s:6:"semine";a:0:{}s:7:"shibata";a:0:{}s:13:"shichikashuku";a:0:{}s:7:"shikama";a:0:{}s:8:"shiogama";a:0:{}s:9:"shiroishi";a:0:{}s:6:"tagajo";a:0:{}s:5:"taiwa";a:0:{}s:4:"tome";a:0:{}s:6:"tomiya";a:0:{}s:6:"wakuya";a:0:{}s:6:"watari";a:0:{}s:8:"yamamoto";a:0:{}s:3:"zao";a:0:{}}s:8:"miyazaki";a:27:{s:3:"aya";a:0:{}s:5:"ebino";a:0:{}s:6:"gokase";a:0:{}s:5:"hyuga";a:0:{}s:8:"kadogawa";a:0:{}s:10:"kawaminami";a:0:{}s:4:"kijo";a:0:{}s:8:"kitagawa";a:0:{}s:8:"kitakata";a:0:{}s:7:"kitaura";a:0:{}s:9:"kobayashi";a:0:{}s:8:"kunitomi";a:0:{}s:7:"kushima";a:0:{}s:6:"mimata";a:0:{}s:10:"miyakonojo";a:0:{}s:8:"miyazaki";a:0:{}s:9:"morotsuka";a:0:{}s:8:"nichinan";a:0:{}s:9:"nishimera";a:0:{}s:7:"nobeoka";a:0:{}s:5:"saito";a:0:{}s:6:"shiiba";a:0:{}s:8:"shintomi";a:0:{}s:8:"takaharu";a:0:{}s:8:"takanabe";a:0:{}s:8:"takazaki";a:0:{}s:5:"tsuno";a:0:{}}s:6:"nagano";a:75:{s:4:"achi";a:0:{}s:8:"agematsu";a:0:{}s:4:"anan";a:0:{}s:4:"aoki";a:0:{}s:5:"asahi";a:0:{}s:7:"azumino";a:0:{}s:9:"chikuhoku";a:0:{}s:7:"chikuma";a:0:{}s:5:"chino";a:0:{}s:6:"fujimi";a:0:{}s:6:"hakuba";a:0:{}s:4:"hara";a:0:{}s:6:"hiraya";a:0:{}s:4:"iida";a:0:{}s:6:"iijima";a:0:{}s:6:"iiyama";a:0:{}s:6:"iizuna";a:0:{}s:5:"ikeda";a:0:{}s:7:"ikusaka";a:0:{}s:3:"ina";a:0:{}s:9:"karuizawa";a:0:{}s:8:"kawakami";a:0:{}s:4:"kiso";a:0:{}s:13:"kisofukushima";a:0:{}s:8:"kitaaiki";a:0:{}s:8:"komagane";a:0:{}s:6:"komoro";a:0:{}s:9:"matsukawa";a:0:{}s:9:"matsumoto";a:0:{}s:5:"miasa";a:0:{}s:10:"minamiaiki";a:0:{}s:10:"minamimaki";a:0:{}s:12:"minamiminowa";a:0:{}s:6:"minowa";a:0:{}s:6:"miyada";a:0:{}s:6:"miyota";a:0:{}s:9:"mochizuki";a:0:{}s:6:"nagano";a:0:{}s:6:"nagawa";a:0:{}s:6:"nagiso";a:0:{}s:8:"nakagawa";a:0:{}s:6:"nakano";a:0:{}s:11:"nozawaonsen";a:0:{}s:5:"obuse";a:0:{}s:5:"ogawa";a:0:{}s:5:"okaya";a:0:{}s:6:"omachi";a:0:{}s:3:"omi";a:0:{}s:6:"ookuwa";a:0:{}s:7:"ooshika";a:0:{}s:5:"otaki";a:0:{}s:5:"otari";a:0:{}s:5:"sakae";a:0:{}s:6:"sakaki";a:0:{}s:4:"saku";a:0:{}s:6:"sakuho";a:0:{}s:9:"shimosuwa";a:0:{}s:12:"shinanomachi";a:0:{}s:8:"shiojiri";a:0:{}s:4:"suwa";a:0:{}s:6:"suzaka";a:0:{}s:6:"takagi";a:0:{}s:8:"takamori";a:0:{}s:8:"takayama";a:0:{}s:9:"tateshina";a:0:{}s:7:"tatsuno";a:0:{}s:9:"togakushi";a:0:{}s:6:"togura";a:0:{}s:4:"tomi";a:0:{}s:4:"ueda";a:0:{}s:4:"wada";a:0:{}s:8:"yamagata";a:0:{}s:10:"yamanouchi";a:0:{}s:6:"yasaka";a:0:{}s:7:"yasuoka";a:0:{}}s:8:"nagasaki";a:22:{s:7:"chijiwa";a:0:{}s:5:"futsu";a:0:{}s:4:"goto";a:0:{}s:6:"hasami";a:0:{}s:6:"hirado";a:0:{}s:3:"iki";a:0:{}s:7:"isahaya";a:0:{}s:8:"kawatana";a:0:{}s:10:"kuchinotsu";a:0:{}s:8:"matsuura";a:0:{}s:8:"nagasaki";a:0:{}s:5:"obama";a:0:{}s:5:"omura";a:0:{}s:5:"oseto";a:0:{}s:6:"saikai";a:0:{}s:6:"sasebo";a:0:{}s:5:"seihi";a:0:{}s:9:"shimabara";a:0:{}s:12:"shinkamigoto";a:0:{}s:7:"togitsu";a:0:{}s:8:"tsushima";a:0:{}s:5:"unzen";a:0:{}}s:4:"nara";a:38:{s:4:"ando";a:0:{}s:4:"gose";a:0:{}s:6:"heguri";a:0:{}s:14:"higashiyoshino";a:0:{}s:7:"ikaruga";a:0:{}s:5:"ikoma";a:0:{}s:12:"kamikitayama";a:0:{}s:7:"kanmaki";a:0:{}s:7:"kashiba";a:0:{}s:9:"kashihara";a:0:{}s:9:"katsuragi";a:0:{}s:5:"kawai";a:0:{}s:8:"kawakami";a:0:{}s:9:"kawanishi";a:0:{}s:5:"koryo";a:0:{}s:8:"kurotaki";a:0:{}s:6:"mitsue";a:0:{}s:6:"miyake";a:0:{}s:4:"nara";a:0:{}s:8:"nosegawa";a:0:{}s:3:"oji";a:0:{}s:4:"ouda";a:0:{}s:5:"oyodo";a:0:{}s:7:"sakurai";a:0:{}s:5:"sango";a:0:{}s:9:"shimoichi";a:0:{}s:13:"shimokitayama";a:0:{}s:6:"shinjo";a:0:{}s:4:"soni";a:0:{}s:8:"takatori";a:0:{}s:10:"tawaramoto";a:0:{}s:7:"tenkawa";a:0:{}s:5:"tenri";a:0:{}s:3:"uda";a:0:{}s:14:"yamatokoriyama";a:0:{}s:12:"yamatotakada";a:0:{}s:7:"yamazoe";a:0:{}s:7:"yoshino";a:0:{}}s:7:"niigata";a:34:{s:3:"aga";a:0:{}s:5:"agano";a:0:{}s:5:"gosen";a:0:{}s:8:"itoigawa";a:0:{}s:9:"izumozaki";a:0:{}s:6:"joetsu";a:0:{}s:4:"kamo";a:0:{}s:6:"kariwa";a:0:{}s:11:"kashiwazaki";a:0:{}s:12:"minamiuonuma";a:0:{}s:7:"mitsuke";a:0:{}s:5:"muika";a:0:{}s:8:"murakami";a:0:{}s:5:"myoko";a:0:{}s:7:"nagaoka";a:0:{}s:7:"niigata";a:0:{}s:5:"ojiya";a:0:{}s:3:"omi";a:0:{}s:4:"sado";a:0:{}s:5:"sanjo";a:0:{}s:5:"seiro";a:0:{}s:6:"seirou";a:0:{}s:8:"sekikawa";a:0:{}s:7:"shibata";a:0:{}s:6:"tagami";a:0:{}s:6:"tainai";a:0:{}s:6:"tochio";a:0:{}s:9:"tokamachi";a:0:{}s:7:"tsubame";a:0:{}s:6:"tsunan";a:0:{}s:6:"uonuma";a:0:{}s:6:"yahiko";a:0:{}s:5:"yoita";a:0:{}s:6:"yuzawa";a:0:{}}s:4:"oita";a:19:{s:5:"beppu";a:0:{}s:8:"bungoono";a:0:{}s:11:"bungotakada";a:0:{}s:6:"hasama";a:0:{}s:4:"hiji";a:0:{}s:9:"himeshima";a:0:{}s:4:"hita";a:0:{}s:8:"kamitsue";a:0:{}s:7:"kokonoe";a:0:{}s:4:"kuju";a:0:{}s:8:"kunisaki";a:0:{}s:4:"kusu";a:0:{}s:4:"oita";a:0:{}s:5:"saiki";a:0:{}s:6:"taketa";a:0:{}s:7:"tsukumi";a:0:{}s:3:"usa";a:0:{}s:5:"usuki";a:0:{}s:4:"yufu";a:0:{}}s:7:"okayama";a:26:{s:6:"akaiwa";a:0:{}s:8:"asakuchi";a:0:{}s:5:"bizen";a:0:{}s:9:"hayashima";a:0:{}s:5:"ibara";a:0:{}s:8:"kagamino";a:0:{}s:7:"kasaoka";a:0:{}s:8:"kibichuo";a:0:{}s:7:"kumenan";a:0:{}s:9:"kurashiki";a:0:{}s:6:"maniwa";a:0:{}s:6:"misaki";a:0:{}s:4:"nagi";a:0:{}s:5:"niimi";a:0:{}s:12:"nishiawakura";a:0:{}s:7:"okayama";a:0:{}s:7:"satosho";a:0:{}s:8:"setouchi";a:0:{}s:6:"shinjo";a:0:{}s:4:"shoo";a:0:{}s:4:"soja";a:0:{}s:9:"takahashi";a:0:{}s:6:"tamano";a:0:{}s:7:"tsuyama";a:0:{}s:4:"wake";a:0:{}s:6:"yakage";a:0:{}}s:7:"okinawa";a:42:{s:5:"aguni";a:0:{}s:7:"ginowan";a:0:{}s:6:"ginoza";a:0:{}s:9:"gushikami";a:0:{}s:7:"haebaru";a:0:{}s:7:"higashi";a:0:{}s:6:"hirara";a:0:{}s:5:"iheya";a:0:{}s:8:"ishigaki";a:0:{}s:8:"ishikawa";a:0:{}s:6:"itoman";a:0:{}s:5:"izena";a:0:{}s:6:"kadena";a:0:{}s:3:"kin";a:0:{}s:9:"kitadaito";a:0:{}s:14:"kitanakagusuku";a:0:{}s:8:"kumejima";a:0:{}s:8:"kunigami";a:0:{}s:11:"minamidaito";a:0:{}s:6:"motobu";a:0:{}s:4:"nago";a:0:{}s:4:"naha";a:0:{}s:10:"nakagusuku";a:0:{}s:7:"nakijin";a:0:{}s:5:"nanjo";a:0:{}s:9:"nishihara";a:0:{}s:5:"ogimi";a:0:{}s:7:"okinawa";a:0:{}s:4:"onna";a:0:{}s:7:"shimoji";a:0:{}s:8:"taketomi";a:0:{}s:6:"tarama";a:0:{}s:9:"tokashiki";a:0:{}s:10:"tomigusuku";a:0:{}s:6:"tonaki";a:0:{}s:6:"urasoe";a:0:{}s:5:"uruma";a:0:{}s:5:"yaese";a:0:{}s:7:"yomitan";a:0:{}s:8:"yonabaru";a:0:{}s:8:"yonaguni";a:0:{}s:6:"zamami";a:0:{}}s:5:"osaka";a:50:{s:5:"abeno";a:0:{}s:14:"chihayaakasaka";a:0:{}s:4:"chuo";a:0:{}s:5:"daito";a:0:{}s:9:"fujiidera";a:0:{}s:8:"habikino";a:0:{}s:6:"hannan";a:0:{}s:12:"higashiosaka";a:0:{}s:16:"higashisumiyoshi";a:0:{}s:15:"higashiyodogawa";a:0:{}s:8:"hirakata";a:0:{}s:7:"ibaraki";a:0:{}s:5:"ikeda";a:0:{}s:5:"izumi";a:0:{}s:9:"izumiotsu";a:0:{}s:9:"izumisano";a:0:{}s:6:"kadoma";a:0:{}s:7:"kaizuka";a:0:{}s:5:"kanan";a:0:{}s:9:"kashiwara";a:0:{}s:6:"katano";a:0:{}s:13:"kawachinagano";a:0:{}s:9:"kishiwada";a:0:{}s:4:"kita";a:0:{}s:8:"kumatori";a:0:{}s:9:"matsubara";a:0:{}s:6:"minato";a:0:{}s:5:"minoh";a:0:{}s:6:"misaki";a:0:{}s:9:"moriguchi";a:0:{}s:8:"neyagawa";a:0:{}s:5:"nishi";a:0:{}s:4:"nose";a:0:{}s:11:"osakasayama";a:0:{}s:5:"sakai";a:0:{}s:6:"sayama";a:0:{}s:6:"sennan";a:0:{}s:6:"settsu";a:0:{}s:11:"shijonawate";a:0:{}s:9:"shimamoto";a:0:{}s:5:"suita";a:0:{}s:7:"tadaoka";a:0:{}s:6:"taishi";a:0:{}s:6:"tajiri";a:0:{}s:8:"takaishi";a:0:{}s:9:"takatsuki";a:0:{}s:12:"tondabayashi";a:0:{}s:8:"toyonaka";a:0:{}s:6:"toyono";a:0:{}s:3:"yao";a:0:{}}s:4:"saga";a:26:{s:6:"ariake";a:0:{}s:5:"arita";a:0:{}s:8:"fukudomi";a:0:{}s:6:"genkai";a:0:{}s:8:"hamatama";a:0:{}s:5:"hizen";a:0:{}s:5:"imari";a:0:{}s:8:"kamimine";a:0:{}s:7:"kanzaki";a:0:{}s:7:"karatsu";a:0:{}s:7:"kashima";a:0:{}s:8:"kitagata";a:0:{}s:8:"kitahata";a:0:{}s:6:"kiyama";a:0:{}s:7:"kouhoku";a:0:{}s:7:"kyuragi";a:0:{}s:10:"nishiarita";a:0:{}s:3:"ogi";a:0:{}s:6:"omachi";a:0:{}s:5:"ouchi";a:0:{}s:4:"saga";a:0:{}s:9:"shiroishi";a:0:{}s:4:"taku";a:0:{}s:4:"tara";a:0:{}s:4:"tosu";a:0:{}s:11:"yoshinogari";a:0:{}}s:7:"saitama";a:69:{s:7:"arakawa";a:0:{}s:5:"asaka";a:0:{}s:8:"chichibu";a:0:{}s:6:"fujimi";a:0:{}s:8:"fujimino";a:0:{}s:6:"fukaya";a:0:{}s:5:"hanno";a:0:{}s:5:"hanyu";a:0:{}s:6:"hasuda";a:0:{}s:8:"hatogaya";a:0:{}s:8:"hatoyama";a:0:{}s:6:"hidaka";a:0:{}s:15:"higashichichibu";a:0:{}s:16:"higashimatsuyama";a:0:{}s:5:"honjo";a:0:{}s:3:"ina";a:0:{}s:5:"iruma";a:0:{}s:8:"iwatsuki";a:0:{}s:9:"kamiizumi";a:0:{}s:8:"kamikawa";a:0:{}s:8:"kamisato";a:0:{}s:8:"kasukabe";a:0:{}s:7:"kawagoe";a:0:{}s:9:"kawaguchi";a:0:{}s:8:"kawajima";a:0:{}s:4:"kazo";a:0:{}s:8:"kitamoto";a:0:{}s:9:"koshigaya";a:0:{}s:7:"kounosu";a:0:{}s:4:"kuki";a:0:{}s:8:"kumagaya";a:0:{}s:10:"matsubushi";a:0:{}s:6:"minano";a:0:{}s:6:"misato";a:0:{}s:9:"miyashiro";a:0:{}s:7:"miyoshi";a:0:{}s:8:"moroyama";a:0:{}s:8:"nagatoro";a:0:{}s:8:"namegawa";a:0:{}s:5:"niiza";a:0:{}s:5:"ogano";a:0:{}s:5:"ogawa";a:0:{}s:5:"ogose";a:0:{}s:7:"okegawa";a:0:{}s:5:"omiya";a:0:{}s:5:"otaki";a:0:{}s:6:"ranzan";a:0:{}s:7:"ryokami";a:0:{}s:7:"saitama";a:0:{}s:6:"sakado";a:0:{}s:5:"satte";a:0:{}s:6:"sayama";a:0:{}s:5:"shiki";a:0:{}s:8:"shiraoka";a:0:{}s:4:"soka";a:0:{}s:6:"sugito";a:0:{}s:4:"toda";a:0:{}s:8:"tokigawa";a:0:{}s:10:"tokorozawa";a:0:{}s:12:"tsurugashima";a:0:{}s:5:"urawa";a:0:{}s:6:"warabi";a:0:{}s:6:"yashio";a:0:{}s:6:"yokoze";a:0:{}s:4:"yono";a:0:{}s:5:"yorii";a:0:{}s:7:"yoshida";a:0:{}s:9:"yoshikawa";a:0:{}s:7:"yoshimi";a:0:{}}s:5:"shiga";a:23:{s:5:"aisho";a:0:{}s:4:"gamo";a:0:{}s:10:"higashiomi";a:0:{}s:6:"hikone";a:0:{}s:4:"koka";a:0:{}s:5:"konan";a:0:{}s:5:"kosei";a:0:{}s:4:"koto";a:0:{}s:7:"kusatsu";a:0:{}s:7:"maibara";a:0:{}s:8:"moriyama";a:0:{}s:8:"nagahama";a:0:{}s:9:"nishiazai";a:0:{}s:8:"notogawa";a:0:{}s:11:"omihachiman";a:0:{}s:4:"otsu";a:0:{}s:5:"ritto";a:0:{}s:5:"ryuoh";a:0:{}s:9:"takashima";a:0:{}s:9:"takatsuki";a:0:{}s:8:"torahime";a:0:{}s:8:"toyosato";a:0:{}s:4:"yasu";a:0:{}}s:7:"shimane";a:23:{s:5:"akagi";a:0:{}s:3:"ama";a:0:{}s:5:"gotsu";a:0:{}s:6:"hamada";a:0:{}s:12:"higashiizumo";a:0:{}s:6:"hikawa";a:0:{}s:6:"hikimi";a:0:{}s:5:"izumo";a:0:{}s:8:"kakinoki";a:0:{}s:6:"masuda";a:0:{}s:6:"matsue";a:0:{}s:6:"misato";a:0:{}s:12:"nishinoshima";a:0:{}s:4:"ohda";a:0:{}s:10:"okinoshima";a:0:{}s:8:"okuizumo";a:0:{}s:7:"shimane";a:0:{}s:6:"tamayu";a:0:{}s:7:"tsuwano";a:0:{}s:5:"unnan";a:0:{}s:6:"yakumo";a:0:{}s:6:"yasugi";a:0:{}s:7:"yatsuka";a:0:{}}s:8:"shizuoka";a:36:{s:4:"arai";a:0:{}s:5:"atami";a:0:{}s:4:"fuji";a:0:{}s:7:"fujieda";a:0:{}s:8:"fujikawa";a:0:{}s:10:"fujinomiya";a:0:{}s:7:"fukuroi";a:0:{}s:7:"gotemba";a:0:{}s:7:"haibara";a:0:{}s:9:"hamamatsu";a:0:{}s:10:"higashiizu";a:0:{}s:3:"ito";a:0:{}s:5:"iwata";a:0:{}s:3:"izu";a:0:{}s:9:"izunokuni";a:0:{}s:8:"kakegawa";a:0:{}s:7:"kannami";a:0:{}s:9:"kawanehon";a:0:{}s:6:"kawazu";a:0:{}s:8:"kikugawa";a:0:{}s:5:"kosai";a:0:{}s:10:"makinohara";a:0:{}s:9:"matsuzaki";a:0:{}s:9:"minamiizu";a:0:{}s:7:"mishima";a:0:{}s:9:"morimachi";a:0:{}s:8:"nishiizu";a:0:{}s:6:"numazu";a:0:{}s:8:"omaezaki";a:0:{}s:7:"shimada";a:0:{}s:7:"shimizu";a:0:{}s:7:"shimoda";a:0:{}s:8:"shizuoka";a:0:{}s:6:"susono";a:0:{}s:5:"yaizu";a:0:{}s:7:"yoshida";a:0:{}}s:7:"tochigi";a:31:{s:8:"ashikaga";a:0:{}s:4:"bato";a:0:{}s:4:"haga";a:0:{}s:7:"ichikai";a:0:{}s:7:"iwafune";a:0:{}s:10:"kaminokawa";a:0:{}s:6:"kanuma";a:0:{}s:10:"karasuyama";a:0:{}s:7:"kuroiso";a:0:{}s:7:"mashiko";a:0:{}s:4:"mibu";a:0:{}s:4:"moka";a:0:{}s:6:"motegi";a:0:{}s:4:"nasu";a:0:{}s:12:"nasushiobara";a:0:{}s:5:"nikko";a:0:{}s:9:"nishikata";a:0:{}s:4:"nogi";a:0:{}s:5:"ohira";a:0:{}s:8:"ohtawara";a:0:{}s:5:"oyama";a:0:{}s:6:"sakura";a:0:{}s:4:"sano";a:0:{}s:10:"shimotsuke";a:0:{}s:6:"shioya";a:0:{}s:10:"takanezawa";a:0:{}s:7:"tochigi";a:0:{}s:5:"tsuga";a:0:{}s:5:"ujiie";a:0:{}s:10:"utsunomiya";a:0:{}s:5:"yaita";a:0:{}}s:9:"tokushima";a:17:{s:6:"aizumi";a:0:{}s:4:"anan";a:0:{}s:6:"ichiba";a:0:{}s:5:"itano";a:0:{}s:6:"kainan";a:0:{}s:12:"komatsushima";a:0:{}s:10:"matsushige";a:0:{}s:4:"mima";a:0:{}s:6:"minami";a:0:{}s:7:"miyoshi";a:0:{}s:4:"mugi";a:0:{}s:8:"nakagawa";a:0:{}s:6:"naruto";a:0:{}s:9:"sanagochi";a:0:{}s:9:"shishikui";a:0:{}s:9:"tokushima";a:0:{}s:6:"wajiki";a:0:{}}s:5:"tokyo";a:57:{s:6:"adachi";a:0:{}s:7:"akiruno";a:0:{}s:8:"akishima";a:0:{}s:9:"aogashima";a:0:{}s:7:"arakawa";a:0:{}s:6:"bunkyo";a:0:{}s:7:"chiyoda";a:0:{}s:5:"chofu";a:0:{}s:4:"chuo";a:0:{}s:7:"edogawa";a:0:{}s:5:"fuchu";a:0:{}s:5:"fussa";a:0:{}s:7:"hachijo";a:0:{}s:8:"hachioji";a:0:{}s:6:"hamura";a:0:{}s:13:"higashikurume";a:0:{}s:15:"higashimurayama";a:0:{}s:13:"higashiyamato";a:0:{}s:4:"hino";a:0:{}s:6:"hinode";a:0:{}s:8:"hinohara";a:0:{}s:5:"inagi";a:0:{}s:8:"itabashi";a:0:{}s:10:"katsushika";a:0:{}s:4:"kita";a:0:{}s:6:"kiyose";a:0:{}s:7:"kodaira";a:0:{}s:7:"koganei";a:0:{}s:9:"kokubunji";a:0:{}s:5:"komae";a:0:{}s:4:"koto";a:0:{}s:10:"kouzushima";a:0:{}s:9:"kunitachi";a:0:{}s:7:"machida";a:0:{}s:6:"meguro";a:0:{}s:6:"minato";a:0:{}s:6:"mitaka";a:0:{}s:6:"mizuho";a:0:{}s:15:"musashimurayama";a:0:{}s:9:"musashino";a:0:{}s:6:"nakano";a:0:{}s:6:"nerima";a:0:{}s:9:"ogasawara";a:0:{}s:7:"okutama";a:0:{}s:3:"ome";a:0:{}s:6:"oshima";a:0:{}s:3:"ota";a:0:{}s:8:"setagaya";a:0:{}s:7:"shibuya";a:0:{}s:9:"shinagawa";a:0:{}s:8:"shinjuku";a:0:{}s:8:"suginami";a:0:{}s:6:"sumida";a:0:{}s:9:"tachikawa";a:0:{}s:5:"taito";a:0:{}s:4:"tama";a:0:{}s:7:"toshima";a:0:{}}s:7:"tottori";a:13:{s:5:"chizu";a:0:{}s:4:"hino";a:0:{}s:8:"kawahara";a:0:{}s:4:"koge";a:0:{}s:7:"kotoura";a:0:{}s:6:"misasa";a:0:{}s:5:"nanbu";a:0:{}s:8:"nichinan";a:0:{}s:11:"sakaiminato";a:0:{}s:7:"tottori";a:0:{}s:6:"wakasa";a:0:{}s:4:"yazu";a:0:{}s:6:"yonago";a:0:{}}s:6:"toyama";a:24:{s:5:"asahi";a:0:{}s:5:"fuchu";a:0:{}s:9:"fukumitsu";a:0:{}s:9:"funahashi";a:0:{}s:4:"himi";a:0:{}s:5:"imizu";a:0:{}s:5:"inami";a:0:{}s:6:"johana";a:0:{}s:8:"kamiichi";a:0:{}s:6:"kurobe";a:0:{}s:11:"nakaniikawa";a:0:{}s:10:"namerikawa";a:0:{}s:5:"nanto";a:0:{}s:6:"nyuzen";a:0:{}s:5:"oyabe";a:0:{}s:5:"taira";a:0:{}s:7:"takaoka";a:0:{}s:8:"tateyama";a:0:{}s:4:"toga";a:0:{}s:6:"tonami";a:0:{}s:6:"toyama";a:0:{}s:7:"unazuki";a:0:{}s:4:"uozu";a:0:{}s:6:"yamada";a:0:{}}s:8:"wakayama";a:29:{s:5:"arida";a:0:{}s:9:"aridagawa";a:0:{}s:4:"gobo";a:0:{}s:9:"hashimoto";a:0:{}s:6:"hidaka";a:0:{}s:8:"hirogawa";a:0:{}s:5:"inami";a:0:{}s:5:"iwade";a:0:{}s:6:"kainan";a:0:{}s:9:"kamitonda";a:0:{}s:9:"katsuragi";a:0:{}s:6:"kimino";a:0:{}s:8:"kinokawa";a:0:{}s:8:"kitayama";a:0:{}s:4:"koya";a:0:{}s:4:"koza";a:0:{}s:8:"kozagawa";a:0:{}s:8:"kudoyama";a:0:{}s:9:"kushimoto";a:0:{}s:6:"mihama";a:0:{}s:6:"misato";a:0:{}s:13:"nachikatsuura";a:0:{}s:6:"shingu";a:0:{}s:9:"shirahama";a:0:{}s:5:"taiji";a:0:{}s:6:"tanabe";a:0:{}s:8:"wakayama";a:0:{}s:5:"yuasa";a:0:{}s:4:"yura";a:0:{}}s:8:"yamagata";a:34:{s:5:"asahi";a:0:{}s:8:"funagata";a:0:{}s:9:"higashine";a:0:{}s:4:"iide";a:0:{}s:6:"kahoku";a:0:{}s:10:"kaminoyama";a:0:{}s:8:"kaneyama";a:0:{}s:9:"kawanishi";a:0:{}s:10:"mamurogawa";a:0:{}s:6:"mikawa";a:0:{}s:8:"murayama";a:0:{}s:5:"nagai";a:0:{}s:8:"nakayama";a:0:{}s:5:"nanyo";a:0:{}s:9:"nishikawa";a:0:{}s:9:"obanazawa";a:0:{}s:2:"oe";a:0:{}s:5:"oguni";a:0:{}s:6:"ohkura";a:0:{}s:7:"oishida";a:0:{}s:5:"sagae";a:0:{}s:6:"sakata";a:0:{}s:8:"sakegawa";a:0:{}s:6:"shinjo";a:0:{}s:9:"shirataka";a:0:{}s:6:"shonai";a:0:{}s:8:"takahata";a:0:{}s:5:"tendo";a:0:{}s:6:"tozawa";a:0:{}s:8:"tsuruoka";a:0:{}s:8:"yamagata";a:0:{}s:8:"yamanobe";a:0:{}s:8:"yonezawa";a:0:{}s:4:"yuza";a:0:{}}s:9:"yamaguchi";a:16:{s:3:"abu";a:0:{}s:4:"hagi";a:0:{}s:6:"hikari";a:0:{}s:4:"hofu";a:0:{}s:7:"iwakuni";a:0:{}s:9:"kudamatsu";a:0:{}s:5:"mitou";a:0:{}s:6:"nagato";a:0:{}s:6:"oshima";a:0:{}s:11:"shimonoseki";a:0:{}s:6:"shunan";a:0:{}s:6:"tabuse";a:0:{}s:8:"tokuyama";a:0:{}s:6:"toyota";a:0:{}s:3:"ube";a:0:{}s:3:"yuu";a:0:{}}s:9:"yamanashi";a:28:{s:4:"chuo";a:0:{}s:5:"doshi";a:0:{}s:7:"fuefuki";a:0:{}s:8:"fujikawa";a:0:{}s:15:"fujikawaguchiko";a:0:{}s:11:"fujiyoshida";a:0:{}s:8:"hayakawa";a:0:{}s:6:"hokuto";a:0:{}s:14:"ichikawamisato";a:0:{}s:3:"kai";a:0:{}s:4:"kofu";a:0:{}s:5:"koshu";a:0:{}s:6:"kosuge";a:0:{}s:11:"minami-alps";a:0:{}s:6:"minobu";a:0:{}s:9:"nakamichi";a:0:{}s:5:"nanbu";a:0:{}s:8:"narusawa";a:0:{}s:8:"nirasaki";a:0:{}s:12:"nishikatsura";a:0:{}s:6:"oshino";a:0:{}s:6:"otsuki";a:0:{}s:5:"showa";a:0:{}s:8:"tabayama";a:0:{}s:5:"tsuru";a:0:{}s:8:"uenohara";a:0:{}s:10:"yamanakako";a:0:{}s:9:"yamanashi";a:0:{}}s:9:"xn--4pvxs";a:0:{}s:11:"xn--vgu402c";a:0:{}s:10:"xn--c3s14m";a:0:{}s:11:"xn--f6qx53a";a:0:{}s:10:"xn--8pvr4u";a:0:{}s:11:"xn--uist22h";a:0:{}s:14:"xn--djrs72d6uy";a:0:{}s:11:"xn--mkru45i";a:0:{}s:13:"xn--0trq7p7nn";a:0:{}s:11:"xn--8ltr62k";a:0:{}s:11:"xn--2m4a15e";a:0:{}s:10:"xn--efvn9s";a:0:{}s:11:"xn--32vp30h";a:0:{}s:11:"xn--4it797k";a:0:{}s:11:"xn--1lqs71d";a:0:{}s:11:"xn--5rtp49c";a:0:{}s:11:"xn--5js045d";a:0:{}s:11:"xn--ehqz56n";a:0:{}s:11:"xn--1lqs03n";a:0:{}s:11:"xn--qqqt11m";a:0:{}s:10:"xn--kbrq7o";a:0:{}s:11:"xn--pssu33l";a:0:{}s:11:"xn--ntsq17g";a:0:{}s:10:"xn--uisz3g";a:0:{}s:10:"xn--6btw5a";a:0:{}s:9:"xn--1ctwo";a:0:{}s:10:"xn--6orx2r";a:0:{}s:10:"xn--rht61e";a:0:{}s:10:"xn--rht27z";a:0:{}s:10:"xn--djty4k";a:0:{}s:11:"xn--nit225k";a:0:{}s:9:"xn--rht3d";a:0:{}s:10:"xn--klty5x";a:0:{}s:10:"xn--kltx9a";a:0:{}s:10:"xn--kltp7d";a:0:{}s:11:"xn--uuwu58a";a:0:{}s:11:"xn--zbx025d";a:0:{}s:14:"xn--ntso0iqx3a";a:0:{}s:11:"xn--elqq16h";a:0:{}s:11:"xn--4it168d";a:0:{}s:11:"xn--klt787d";a:0:{}s:10:"xn--rny31h";a:0:{}s:12:"xn--7t0a264c";a:0:{}s:11:"xn--5rtq34k";a:0:{}s:11:"xn--k7yn95e";a:0:{}s:11:"xn--tor131o";a:0:{}s:14:"xn--d5qv7z876c";a:0:{}s:8:"kawasaki";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:10:"kitakyushu";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:4:"kobe";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:6:"nagoya";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:7:"sapporo";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:6:"sendai";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:8:"yokohama";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}}s:2:"ke";a:1:{s:1:"*";a:0:{}}s:2:"kg";a:6:{s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}}s:2:"kh";a:1:{s:1:"*";a:0:{}}s:2:"ki";a:7:{s:3:"edu";a:0:{}s:3:"biz";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"com";a:0:{}}s:2:"km";a:17:{s:3:"org";a:0:{}s:3:"nom";a:0:{}s:3:"gov";a:0:{}s:3:"prd";a:0:{}s:2:"tm";a:0:{}s:3:"edu";a:0:{}s:3:"mil";a:0:{}s:3:"ass";a:0:{}s:3:"com";a:0:{}s:4:"coop";a:0:{}s:4:"asso";a:0:{}s:6:"presse";a:0:{}s:7:"medecin";a:0:{}s:8:"notaires";a:0:{}s:11:"pharmaciens";a:0:{}s:11:"veterinaire";a:0:{}s:4:"gouv";a:0:{}}s:2:"kn";a:4:{s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}}s:2:"kp";a:6:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"rep";a:0:{}s:3:"tra";a:0:{}}s:2:"kr";a:29:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"es";a:0:{}s:2:"go";a:0:{}s:2:"hs";a:0:{}s:2:"kg";a:0:{}s:3:"mil";a:0:{}s:2:"ms";a:0:{}s:2:"ne";a:0:{}s:2:"or";a:0:{}s:2:"pe";a:0:{}s:2:"re";a:0:{}s:2:"sc";a:0:{}s:5:"busan";a:0:{}s:8:"chungbuk";a:0:{}s:8:"chungnam";a:0:{}s:5:"daegu";a:0:{}s:7:"daejeon";a:0:{}s:7:"gangwon";a:0:{}s:7:"gwangju";a:0:{}s:9:"gyeongbuk";a:0:{}s:8:"gyeonggi";a:0:{}s:9:"gyeongnam";a:0:{}s:7:"incheon";a:0:{}s:4:"jeju";a:0:{}s:7:"jeonbuk";a:0:{}s:7:"jeonnam";a:0:{}s:5:"seoul";a:0:{}s:5:"ulsan";a:0:{}}s:2:"kw";a:1:{s:1:"*";a:0:{}}s:2:"ky";a:5:{s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}}s:2:"kz";a:6:{s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:0:{}}s:2:"la";a:8:{s:3:"int";a:0:{}s:3:"net";a:0:{}s:4:"info";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"per";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}}s:2:"lb";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"lc";a:6:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:2:"co";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}}s:2:"li";a:0:{}s:2:"lk";a:15:{s:3:"gov";a:0:{}s:3:"sch";a:0:{}s:3:"net";a:0:{}s:3:"int";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"ngo";a:0:{}s:3:"soc";a:0:{}s:3:"web";a:0:{}s:3:"ltd";a:0:{}s:4:"assn";a:0:{}s:3:"grp";a:0:{}s:5:"hotel";a:0:{}s:2:"ac";a:0:{}}s:2:"lr";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}}s:2:"ls";a:2:{s:2:"co";a:0:{}s:3:"org";a:0:{}}s:2:"lt";a:1:{s:3:"gov";a:0:{}}s:2:"lu";a:0:{}s:2:"lv";a:9:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"mil";a:0:{}s:2:"id";a:0:{}s:3:"net";a:0:{}s:3:"asn";a:0:{}s:4:"conf";a:0:{}}s:2:"ly";a:9:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"plc";a:0:{}s:3:"edu";a:0:{}s:3:"sch";a:0:{}s:3:"med";a:0:{}s:3:"org";a:0:{}s:2:"id";a:0:{}}s:2:"ma";a:6:{s:2:"co";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:2:"ac";a:0:{}s:5:"press";a:0:{}}s:2:"mc";a:2:{s:2:"tm";a:0:{}s:4:"asso";a:0:{}}s:2:"md";a:0:{}s:2:"me";a:8:{s:2:"co";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:2:"ac";a:0:{}s:3:"gov";a:0:{}s:3:"its";a:0:{}s:4:"priv";a:0:{}}s:2:"mg";a:9:{s:3:"org";a:0:{}s:3:"nom";a:0:{}s:3:"gov";a:0:{}s:3:"prd";a:0:{}s:2:"tm";a:0:{}s:3:"edu";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:0:{}s:2:"co";a:0:{}}s:2:"mh";a:0:{}s:3:"mil";a:0:{}s:2:"mk";a:7:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"inf";a:0:{}s:4:"name";a:0:{}}s:2:"ml";a:7:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:4:"gouv";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:6:"presse";a:0:{}}s:2:"mm";a:1:{s:1:"*";a:0:{}}s:2:"mn";a:3:{s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}}s:2:"mo";a:5:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}}s:4:"mobi";a:0:{}s:2:"mp";a:0:{}s:2:"mq";a:0:{}s:2:"mr";a:1:{s:3:"gov";a:0:{}}s:2:"ms";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"mt";a:4:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"mu";a:7:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"or";a:0:{}}s:6:"museum";a:548:{s:7:"academy";a:0:{}s:11:"agriculture";a:0:{}s:3:"air";a:0:{}s:8:"airguard";a:0:{}s:7:"alabama";a:0:{}s:6:"alaska";a:0:{}s:5:"amber";a:0:{}s:9:"ambulance";a:0:{}s:8:"american";a:0:{}s:9:"americana";a:0:{}s:16:"americanantiques";a:0:{}s:11:"americanart";a:0:{}s:9:"amsterdam";a:0:{}s:3:"and";a:0:{}s:9:"annefrank";a:0:{}s:6:"anthro";a:0:{}s:12:"anthropology";a:0:{}s:8:"antiques";a:0:{}s:8:"aquarium";a:0:{}s:9:"arboretum";a:0:{}s:14:"archaeological";a:0:{}s:11:"archaeology";a:0:{}s:12:"architecture";a:0:{}s:3:"art";a:0:{}s:12:"artanddesign";a:0:{}s:9:"artcenter";a:0:{}s:7:"artdeco";a:0:{}s:12:"arteducation";a:0:{}s:10:"artgallery";a:0:{}s:4:"arts";a:0:{}s:13:"artsandcrafts";a:0:{}s:8:"asmatart";a:0:{}s:13:"assassination";a:0:{}s:6:"assisi";a:0:{}s:11:"association";a:0:{}s:9:"astronomy";a:0:{}s:7:"atlanta";a:0:{}s:6:"austin";a:0:{}s:9:"australia";a:0:{}s:10:"automotive";a:0:{}s:8:"aviation";a:0:{}s:4:"axis";a:0:{}s:7:"badajoz";a:0:{}s:7:"baghdad";a:0:{}s:4:"bahn";a:0:{}s:4:"bale";a:0:{}s:9:"baltimore";a:0:{}s:9:"barcelona";a:0:{}s:8:"baseball";a:0:{}s:5:"basel";a:0:{}s:5:"baths";a:0:{}s:6:"bauern";a:0:{}s:9:"beauxarts";a:0:{}s:13:"beeldengeluid";a:0:{}s:8:"bellevue";a:0:{}s:7:"bergbau";a:0:{}s:8:"berkeley";a:0:{}s:6:"berlin";a:0:{}s:4:"bern";a:0:{}s:5:"bible";a:0:{}s:6:"bilbao";a:0:{}s:4:"bill";a:0:{}s:7:"birdart";a:0:{}s:10:"birthplace";a:0:{}s:4:"bonn";a:0:{}s:6:"boston";a:0:{}s:9:"botanical";a:0:{}s:15:"botanicalgarden";a:0:{}s:13:"botanicgarden";a:0:{}s:6:"botany";a:0:{}s:16:"brandywinevalley";a:0:{}s:6:"brasil";a:0:{}s:7:"bristol";a:0:{}s:7:"british";a:0:{}s:15:"britishcolumbia";a:0:{}s:9:"broadcast";a:0:{}s:6:"brunel";a:0:{}s:7:"brussel";a:0:{}s:8:"brussels";a:0:{}s:9:"bruxelles";a:0:{}s:8:"building";a:0:{}s:7:"burghof";a:0:{}s:3:"bus";a:0:{}s:6:"bushey";a:0:{}s:8:"cadaques";a:0:{}s:10:"california";a:0:{}s:9:"cambridge";a:0:{}s:3:"can";a:0:{}s:6:"canada";a:0:{}s:10:"capebreton";a:0:{}s:7:"carrier";a:0:{}s:10:"cartoonart";a:0:{}s:14:"casadelamoneda";a:0:{}s:6:"castle";a:0:{}s:7:"castres";a:0:{}s:6:"celtic";a:0:{}s:6:"center";a:0:{}s:11:"chattanooga";a:0:{}s:10:"cheltenham";a:0:{}s:13:"chesapeakebay";a:0:{}s:7:"chicago";a:0:{}s:8:"children";a:0:{}s:9:"childrens";a:0:{}s:15:"childrensgarden";a:0:{}s:12:"chiropractic";a:0:{}s:9:"chocolate";a:0:{}s:14:"christiansburg";a:0:{}s:10:"cincinnati";a:0:{}s:6:"cinema";a:0:{}s:6:"circus";a:0:{}s:12:"civilisation";a:0:{}s:12:"civilization";a:0:{}s:8:"civilwar";a:0:{}s:7:"clinton";a:0:{}s:5:"clock";a:0:{}s:4:"coal";a:0:{}s:14:"coastaldefence";a:0:{}s:4:"cody";a:0:{}s:7:"coldwar";a:0:{}s:10:"collection";a:0:{}s:20:"colonialwilliamsburg";a:0:{}s:15:"coloradoplateau";a:0:{}s:8:"columbia";a:0:{}s:8:"columbus";a:0:{}s:13:"communication";a:0:{}s:14:"communications";a:0:{}s:9:"community";a:0:{}s:8:"computer";a:0:{}s:15:"computerhistory";a:0:{}s:20:"xn--comunicaes-v6a2o";a:0:{}s:12:"contemporary";a:0:{}s:15:"contemporaryart";a:0:{}s:7:"convent";a:0:{}s:10:"copenhagen";a:0:{}s:11:"corporation";a:0:{}s:36:"xn--correios-e-telecomunicaes-ghc29a";a:0:{}s:8:"corvette";a:0:{}s:7:"costume";a:0:{}s:13:"countryestate";a:0:{}s:6:"county";a:0:{}s:6:"crafts";a:0:{}s:9:"cranbrook";a:0:{}s:8:"creation";a:0:{}s:8:"cultural";a:0:{}s:14:"culturalcenter";a:0:{}s:7:"culture";a:0:{}s:5:"cyber";a:0:{}s:5:"cymru";a:0:{}s:4:"dali";a:0:{}s:6:"dallas";a:0:{}s:8:"database";a:0:{}s:3:"ddr";a:0:{}s:14:"decorativearts";a:0:{}s:8:"delaware";a:0:{}s:11:"delmenhorst";a:0:{}s:7:"denmark";a:0:{}s:5:"depot";a:0:{}s:6:"design";a:0:{}s:7:"detroit";a:0:{}s:8:"dinosaur";a:0:{}s:9:"discovery";a:0:{}s:5:"dolls";a:0:{}s:8:"donostia";a:0:{}s:6:"durham";a:0:{}s:10:"eastafrica";a:0:{}s:9:"eastcoast";a:0:{}s:9:"education";a:0:{}s:11:"educational";a:0:{}s:8:"egyptian";a:0:{}s:9:"eisenbahn";a:0:{}s:6:"elburg";a:0:{}s:10:"elvendrell";a:0:{}s:10:"embroidery";a:0:{}s:12:"encyclopedic";a:0:{}s:7:"england";a:0:{}s:10:"entomology";a:0:{}s:11:"environment";a:0:{}s:25:"environmentalconservation";a:0:{}s:8:"epilepsy";a:0:{}s:5:"essex";a:0:{}s:6:"estate";a:0:{}s:9:"ethnology";a:0:{}s:6:"exeter";a:0:{}s:10:"exhibition";a:0:{}s:6:"family";a:0:{}s:4:"farm";a:0:{}s:13:"farmequipment";a:0:{}s:7:"farmers";a:0:{}s:9:"farmstead";a:0:{}s:5:"field";a:0:{}s:8:"figueres";a:0:{}s:9:"filatelia";a:0:{}s:4:"film";a:0:{}s:7:"fineart";a:0:{}s:8:"finearts";a:0:{}s:7:"finland";a:0:{}s:8:"flanders";a:0:{}s:7:"florida";a:0:{}s:5:"force";a:0:{}s:12:"fortmissoula";a:0:{}s:9:"fortworth";a:0:{}s:10:"foundation";a:0:{}s:9:"francaise";a:0:{}s:9:"frankfurt";a:0:{}s:12:"franziskaner";a:0:{}s:11:"freemasonry";a:0:{}s:8:"freiburg";a:0:{}s:8:"fribourg";a:0:{}s:4:"frog";a:0:{}s:8:"fundacio";a:0:{}s:9:"furniture";a:0:{}s:7:"gallery";a:0:{}s:6:"garden";a:0:{}s:7:"gateway";a:0:{}s:9:"geelvinck";a:0:{}s:11:"gemological";a:0:{}s:7:"geology";a:0:{}s:7:"georgia";a:0:{}s:7:"giessen";a:0:{}s:4:"glas";a:0:{}s:5:"glass";a:0:{}s:5:"gorge";a:0:{}s:11:"grandrapids";a:0:{}s:4:"graz";a:0:{}s:8:"guernsey";a:0:{}s:10:"halloffame";a:0:{}s:7:"hamburg";a:0:{}s:7:"handson";a:0:{}s:18:"harvestcelebration";a:0:{}s:6:"hawaii";a:0:{}s:6:"health";a:0:{}s:14:"heimatunduhren";a:0:{}s:6:"hellas";a:0:{}s:8:"helsinki";a:0:{}s:15:"hembygdsforbund";a:0:{}s:8:"heritage";a:0:{}s:8:"histoire";a:0:{}s:10:"historical";a:0:{}s:17:"historicalsociety";a:0:{}s:14:"historichouses";a:0:{}s:10:"historisch";a:0:{}s:12:"historisches";a:0:{}s:7:"history";a:0:{}s:16:"historyofscience";a:0:{}s:8:"horology";a:0:{}s:5:"house";a:0:{}s:10:"humanities";a:0:{}s:12:"illustration";a:0:{}s:13:"imageandsound";a:0:{}s:6:"indian";a:0:{}s:7:"indiana";a:0:{}s:12:"indianapolis";a:0:{}s:12:"indianmarket";a:0:{}s:12:"intelligence";a:0:{}s:11:"interactive";a:0:{}s:4:"iraq";a:0:{}s:4:"iron";a:0:{}s:9:"isleofman";a:0:{}s:7:"jamison";a:0:{}s:9:"jefferson";a:0:{}s:9:"jerusalem";a:0:{}s:7:"jewelry";a:0:{}s:6:"jewish";a:0:{}s:9:"jewishart";a:0:{}s:3:"jfk";a:0:{}s:10:"journalism";a:0:{}s:7:"judaica";a:0:{}s:11:"judygarland";a:0:{}s:10:"juedisches";a:0:{}s:4:"juif";a:0:{}s:6:"karate";a:0:{}s:9:"karikatur";a:0:{}s:4:"kids";a:0:{}s:10:"koebenhavn";a:0:{}s:5:"koeln";a:0:{}s:5:"kunst";a:0:{}s:13:"kunstsammlung";a:0:{}s:14:"kunstunddesign";a:0:{}s:5:"labor";a:0:{}s:6:"labour";a:0:{}s:7:"lajolla";a:0:{}s:10:"lancashire";a:0:{}s:6:"landes";a:0:{}s:4:"lans";a:0:{}s:11:"xn--lns-qla";a:0:{}s:7:"larsson";a:0:{}s:11:"lewismiller";a:0:{}s:7:"lincoln";a:0:{}s:4:"linz";a:0:{}s:6:"living";a:0:{}s:13:"livinghistory";a:0:{}s:12:"localhistory";a:0:{}s:6:"london";a:0:{}s:10:"losangeles";a:0:{}s:6:"louvre";a:0:{}s:8:"loyalist";a:0:{}s:7:"lucerne";a:0:{}s:10:"luxembourg";a:0:{}s:6:"luzern";a:0:{}s:3:"mad";a:0:{}s:6:"madrid";a:0:{}s:8:"mallorca";a:0:{}s:10:"manchester";a:0:{}s:7:"mansion";a:0:{}s:8:"mansions";a:0:{}s:4:"manx";a:0:{}s:7:"marburg";a:0:{}s:8:"maritime";a:0:{}s:8:"maritimo";a:0:{}s:8:"maryland";a:0:{}s:10:"marylhurst";a:0:{}s:5:"media";a:0:{}s:7:"medical";a:0:{}s:19:"medizinhistorisches";a:0:{}s:6:"meeres";a:0:{}s:8:"memorial";a:0:{}s:9:"mesaverde";a:0:{}s:8:"michigan";a:0:{}s:11:"midatlantic";a:0:{}s:8:"military";a:0:{}s:4:"mill";a:0:{}s:6:"miners";a:0:{}s:6:"mining";a:0:{}s:9:"minnesota";a:0:{}s:7:"missile";a:0:{}s:8:"missoula";a:0:{}s:6:"modern";a:0:{}s:4:"moma";a:0:{}s:5:"money";a:0:{}s:8:"monmouth";a:0:{}s:10:"monticello";a:0:{}s:8:"montreal";a:0:{}s:6:"moscow";a:0:{}s:10:"motorcycle";a:0:{}s:8:"muenchen";a:0:{}s:8:"muenster";a:0:{}s:8:"mulhouse";a:0:{}s:6:"muncie";a:0:{}s:6:"museet";a:0:{}s:12:"museumcenter";a:0:{}s:16:"museumvereniging";a:0:{}s:5:"music";a:0:{}s:8:"national";a:0:{}s:16:"nationalfirearms";a:0:{}s:16:"nationalheritage";a:0:{}s:14:"nativeamerican";a:0:{}s:14:"naturalhistory";a:0:{}s:20:"naturalhistorymuseum";a:0:{}s:15:"naturalsciences";a:0:{}s:6:"nature";a:0:{}s:17:"naturhistorisches";a:0:{}s:19:"natuurwetenschappen";a:0:{}s:8:"naumburg";a:0:{}s:5:"naval";a:0:{}s:8:"nebraska";a:0:{}s:5:"neues";a:0:{}s:12:"newhampshire";a:0:{}s:9:"newjersey";a:0:{}s:9:"newmexico";a:0:{}s:7:"newport";a:0:{}s:9:"newspaper";a:0:{}s:7:"newyork";a:0:{}s:6:"niepce";a:0:{}s:7:"norfolk";a:0:{}s:5:"north";a:0:{}s:3:"nrw";a:0:{}s:9:"nuernberg";a:0:{}s:9:"nuremberg";a:0:{}s:3:"nyc";a:0:{}s:4:"nyny";a:0:{}s:13:"oceanographic";a:0:{}s:15:"oceanographique";a:0:{}s:5:"omaha";a:0:{}s:6:"online";a:0:{}s:7:"ontario";a:0:{}s:7:"openair";a:0:{}s:6:"oregon";a:0:{}s:11:"oregontrail";a:0:{}s:5:"otago";a:0:{}s:6:"oxford";a:0:{}s:7:"pacific";a:0:{}s:9:"paderborn";a:0:{}s:6:"palace";a:0:{}s:5:"paleo";a:0:{}s:11:"palmsprings";a:0:{}s:6:"panama";a:0:{}s:5:"paris";a:0:{}s:8:"pasadena";a:0:{}s:8:"pharmacy";a:0:{}s:12:"philadelphia";a:0:{}s:16:"philadelphiaarea";a:0:{}s:9:"philately";a:0:{}s:7:"phoenix";a:0:{}s:11:"photography";a:0:{}s:6:"pilots";a:0:{}s:10:"pittsburgh";a:0:{}s:11:"planetarium";a:0:{}s:10:"plantation";a:0:{}s:6:"plants";a:0:{}s:5:"plaza";a:0:{}s:6:"portal";a:0:{}s:8:"portland";a:0:{}s:10:"portlligat";a:0:{}s:28:"posts-and-telecommunications";a:0:{}s:12:"preservation";a:0:{}s:8:"presidio";a:0:{}s:5:"press";a:0:{}s:7:"project";a:0:{}s:6:"public";a:0:{}s:5:"pubol";a:0:{}s:6:"quebec";a:0:{}s:8:"railroad";a:0:{}s:7:"railway";a:0:{}s:8:"research";a:0:{}s:10:"resistance";a:0:{}s:12:"riodejaneiro";a:0:{}s:9:"rochester";a:0:{}s:7:"rockart";a:0:{}s:4:"roma";a:0:{}s:6:"russia";a:0:{}s:10:"saintlouis";a:0:{}s:5:"salem";a:0:{}s:12:"salvadordali";a:0:{}s:8:"salzburg";a:0:{}s:8:"sandiego";a:0:{}s:12:"sanfrancisco";a:0:{}s:12:"santabarbara";a:0:{}s:9:"santacruz";a:0:{}s:7:"santafe";a:0:{}s:12:"saskatchewan";a:0:{}s:4:"satx";a:0:{}s:10:"savannahga";a:0:{}s:12:"schlesisches";a:0:{}s:11:"schoenbrunn";a:0:{}s:11:"schokoladen";a:0:{}s:6:"school";a:0:{}s:7:"schweiz";a:0:{}s:7:"science";a:0:{}s:17:"scienceandhistory";a:0:{}s:18:"scienceandindustry";a:0:{}s:13:"sciencecenter";a:0:{}s:14:"sciencecenters";a:0:{}s:15:"science-fiction";a:0:{}s:14:"sciencehistory";a:0:{}s:8:"sciences";a:0:{}s:18:"sciencesnaturelles";a:0:{}s:8:"scotland";a:0:{}s:7:"seaport";a:0:{}s:10:"settlement";a:0:{}s:8:"settlers";a:0:{}s:5:"shell";a:0:{}s:10:"sherbrooke";a:0:{}s:7:"sibenik";a:0:{}s:4:"silk";a:0:{}s:3:"ski";a:0:{}s:5:"skole";a:0:{}s:7:"society";a:0:{}s:7:"sologne";a:0:{}s:14:"soundandvision";a:0:{}s:13:"southcarolina";a:0:{}s:9:"southwest";a:0:{}s:5:"space";a:0:{}s:3:"spy";a:0:{}s:6:"square";a:0:{}s:5:"stadt";a:0:{}s:8:"stalbans";a:0:{}s:9:"starnberg";a:0:{}s:5:"state";a:0:{}s:15:"stateofdelaware";a:0:{}s:7:"station";a:0:{}s:5:"steam";a:0:{}s:10:"steiermark";a:0:{}s:6:"stjohn";a:0:{}s:9:"stockholm";a:0:{}s:12:"stpetersburg";a:0:{}s:9:"stuttgart";a:0:{}s:6:"suisse";a:0:{}s:12:"surgeonshall";a:0:{}s:6:"surrey";a:0:{}s:8:"svizzera";a:0:{}s:6:"sweden";a:0:{}s:6:"sydney";a:0:{}s:4:"tank";a:0:{}s:3:"tcm";a:0:{}s:10:"technology";a:0:{}s:17:"telekommunikation";a:0:{}s:10:"television";a:0:{}s:5:"texas";a:0:{}s:7:"textile";a:0:{}s:7:"theater";a:0:{}s:4:"time";a:0:{}s:11:"timekeeping";a:0:{}s:8:"topology";a:0:{}s:6:"torino";a:0:{}s:5:"touch";a:0:{}s:4:"town";a:0:{}s:9:"transport";a:0:{}s:4:"tree";a:0:{}s:7:"trolley";a:0:{}s:5:"trust";a:0:{}s:7:"trustee";a:0:{}s:5:"uhren";a:0:{}s:3:"ulm";a:0:{}s:8:"undersea";a:0:{}s:10:"university";a:0:{}s:3:"usa";a:0:{}s:10:"usantiques";a:0:{}s:6:"usarts";a:0:{}s:15:"uscountryestate";a:0:{}s:9:"usculture";a:0:{}s:16:"usdecorativearts";a:0:{}s:8:"usgarden";a:0:{}s:9:"ushistory";a:0:{}s:7:"ushuaia";a:0:{}s:15:"uslivinghistory";a:0:{}s:4:"utah";a:0:{}s:4:"uvic";a:0:{}s:6:"valley";a:0:{}s:6:"vantaa";a:0:{}s:10:"versailles";a:0:{}s:6:"viking";a:0:{}s:7:"village";a:0:{}s:8:"virginia";a:0:{}s:7:"virtual";a:0:{}s:7:"virtuel";a:0:{}s:10:"vlaanderen";a:0:{}s:11:"volkenkunde";a:0:{}s:5:"wales";a:0:{}s:8:"wallonie";a:0:{}s:3:"war";a:0:{}s:12:"washingtondc";a:0:{}s:13:"watchandclock";a:0:{}s:15:"watch-and-clock";a:0:{}s:7:"western";a:0:{}s:9:"westfalen";a:0:{}s:7:"whaling";a:0:{}s:8:"wildlife";a:0:{}s:12:"williamsburg";a:0:{}s:8:"windmill";a:0:{}s:8:"workshop";a:0:{}s:4:"york";a:0:{}s:9:"yorkshire";a:0:{}s:8:"yosemite";a:0:{}s:5:"youth";a:0:{}s:10:"zoological";a:0:{}s:7:"zoology";a:0:{}s:14:"xn--9dbhblg6di";a:0:{}s:10:"xn--h1aegh";a:0:{}}s:2:"mv";a:14:{s:4:"aero";a:0:{}s:3:"biz";a:0:{}s:3:"com";a:0:{}s:4:"coop";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:6:"museum";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"pro";a:0:{}}s:2:"mw";a:11:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:4:"coop";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"int";a:0:{}s:6:"museum";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"mx";a:5:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"gob";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}}s:2:"my";a:7:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}}s:2:"mz";a:8:{s:2:"ac";a:0:{}s:3:"adv";a:0:{}s:2:"co";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"na";a:17:{s:4:"info";a:0:{}s:3:"pro";a:0:{}s:4:"name";a:0:{}s:6:"school";a:0:{}s:2:"or";a:0:{}s:2:"dr";a:0:{}s:2:"us";a:0:{}s:2:"mx";a:0:{}s:2:"ca";a:0:{}s:2:"in";a:0:{}s:2:"cc";a:0:{}s:2:"tv";a:0:{}s:2:"ws";a:0:{}s:4:"mobi";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}}s:4:"name";a:0:{}s:2:"nc";a:2:{s:4:"asso";a:0:{}s:3:"nom";a:0:{}}s:2:"ne";a:0:{}s:3:"net";a:0:{}s:2:"nf";a:10:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"per";a:0:{}s:3:"rec";a:0:{}s:3:"web";a:0:{}s:4:"arts";a:0:{}s:4:"firm";a:0:{}s:4:"info";a:0:{}s:5:"other";a:0:{}s:5:"store";a:0:{}}s:2:"ng";a:10:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:1:"i";a:0:{}s:3:"mil";a:0:{}s:4:"mobi";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sch";a:0:{}}s:2:"ni";a:14:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:2:"in";a:0:{}s:4:"info";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"nom";a:0:{}s:3:"org";a:0:{}s:3:"web";a:0:{}}s:2:"nl";a:1:{s:2:"bv";a:0:{}}s:2:"no";a:724:{s:3:"fhs";a:0:{}s:3:"vgs";a:0:{}s:10:"fylkesbibl";a:0:{}s:9:"folkebibl";a:0:{}s:6:"museum";a:0:{}s:6:"idrett";a:0:{}s:4:"priv";a:0:{}s:3:"mil";a:0:{}s:4:"stat";a:0:{}s:3:"dep";a:0:{}s:7:"kommune";a:0:{}s:5:"herad";a:0:{}s:2:"aa";a:1:{s:2:"gs";a:0:{}}s:2:"ah";a:1:{s:2:"gs";a:0:{}}s:2:"bu";a:1:{s:2:"gs";a:0:{}}s:2:"fm";a:1:{s:2:"gs";a:0:{}}s:2:"hl";a:1:{s:2:"gs";a:0:{}}s:2:"hm";a:1:{s:2:"gs";a:0:{}}s:9:"jan-mayen";a:1:{s:2:"gs";a:0:{}}s:2:"mr";a:1:{s:2:"gs";a:0:{}}s:2:"nl";a:1:{s:2:"gs";a:0:{}}s:2:"nt";a:1:{s:2:"gs";a:0:{}}s:2:"of";a:1:{s:2:"gs";a:0:{}}s:2:"ol";a:1:{s:2:"gs";a:0:{}}s:4:"oslo";a:1:{s:2:"gs";a:0:{}}s:2:"rl";a:1:{s:2:"gs";a:0:{}}s:2:"sf";a:1:{s:2:"gs";a:0:{}}s:2:"st";a:1:{s:2:"gs";a:0:{}}s:8:"svalbard";a:1:{s:2:"gs";a:0:{}}s:2:"tm";a:1:{s:2:"gs";a:0:{}}s:2:"tr";a:1:{s:2:"gs";a:0:{}}s:2:"va";a:1:{s:2:"gs";a:0:{}}s:2:"vf";a:1:{s:2:"gs";a:0:{}}s:8:"akrehamn";a:0:{}s:15:"xn--krehamn-dxa";a:0:{}s:6:"algard";a:0:{}s:13:"xn--lgrd-poac";a:0:{}s:4:"arna";a:0:{}s:10:"brumunddal";a:0:{}s:5:"bryne";a:0:{}s:11:"bronnoysund";a:0:{}s:18:"xn--brnnysund-m8ac";a:0:{}s:6:"drobak";a:0:{}s:13:"xn--drbak-wua";a:0:{}s:8:"egersund";a:0:{}s:7:"fetsund";a:0:{}s:5:"floro";a:0:{}s:12:"xn--flor-jra";a:0:{}s:11:"fredrikstad";a:0:{}s:8:"hokksund";a:0:{}s:8:"honefoss";a:0:{}s:15:"xn--hnefoss-q1a";a:0:{}s:8:"jessheim";a:0:{}s:9:"jorpeland";a:0:{}s:16:"xn--jrpeland-54a";a:0:{}s:8:"kirkenes";a:0:{}s:8:"kopervik";a:0:{}s:12:"krokstadelva";a:0:{}s:8:"langevag";a:0:{}s:15:"xn--langevg-jxa";a:0:{}s:7:"leirvik";a:0:{}s:9:"mjondalen";a:0:{}s:16:"xn--mjndalen-64a";a:0:{}s:9:"mo-i-rana";a:0:{}s:7:"mosjoen";a:0:{}s:14:"xn--mosjen-eya";a:0:{}s:12:"nesoddtangen";a:0:{}s:8:"orkanger";a:0:{}s:6:"osoyro";a:0:{}s:13:"xn--osyro-wua";a:0:{}s:6:"raholt";a:0:{}s:13:"xn--rholt-mra";a:0:{}s:12:"sandnessjoen";a:0:{}s:19:"xn--sandnessjen-ogb";a:0:{}s:13:"skedsmokorset";a:0:{}s:7:"slattum";a:0:{}s:10:"spjelkavik";a:0:{}s:9:"stathelle";a:0:{}s:7:"stavern";a:0:{}s:15:"stjordalshalsen";a:0:{}s:22:"xn--stjrdalshalsen-sqb";a:0:{}s:8:"tananger";a:0:{}s:6:"tranby";a:0:{}s:11:"vossevangen";a:0:{}s:6:"afjord";a:0:{}s:13:"xn--fjord-lra";a:0:{}s:7:"agdenes";a:0:{}s:2:"al";a:0:{}s:9:"xn--l-1fa";a:0:{}s:7:"alesund";a:0:{}s:14:"xn--lesund-hua";a:0:{}s:9:"alstahaug";a:0:{}s:4:"alta";a:0:{}s:11:"xn--lt-liac";a:0:{}s:9:"alaheadju";a:0:{}s:16:"xn--laheadju-7ya";a:0:{}s:6:"alvdal";a:0:{}s:4:"amli";a:0:{}s:11:"xn--mli-tla";a:0:{}s:4:"amot";a:0:{}s:11:"xn--mot-tla";a:0:{}s:6:"andebu";a:0:{}s:5:"andoy";a:0:{}s:12:"xn--andy-ira";a:0:{}s:9:"andasuolo";a:0:{}s:5:"ardal";a:0:{}s:12:"xn--rdal-poa";a:0:{}s:7:"aremark";a:0:{}s:7:"arendal";a:0:{}s:9:"xn--s-1fa";a:0:{}s:6:"aseral";a:0:{}s:13:"xn--seral-lra";a:0:{}s:5:"asker";a:0:{}s:5:"askim";a:0:{}s:7:"askvoll";a:0:{}s:5:"askoy";a:0:{}s:12:"xn--asky-ira";a:0:{}s:5:"asnes";a:0:{}s:12:"xn--snes-poa";a:0:{}s:9:"audnedaln";a:0:{}s:5:"aukra";a:0:{}s:4:"aure";a:0:{}s:7:"aurland";a:0:{}s:14:"aurskog-holand";a:0:{}s:21:"xn--aurskog-hland-jnb";a:0:{}s:9:"austevoll";a:0:{}s:9:"austrheim";a:0:{}s:6:"averoy";a:0:{}s:13:"xn--avery-yua";a:0:{}s:10:"balestrand";a:0:{}s:9:"ballangen";a:0:{}s:5:"balat";a:0:{}s:12:"xn--blt-elab";a:0:{}s:9:"balsfjord";a:0:{}s:12:"bahccavuotna";a:0:{}s:19:"xn--bhccavuotna-k7a";a:0:{}s:6:"bamble";a:0:{}s:5:"bardu";a:0:{}s:6:"beardu";a:0:{}s:6:"beiarn";a:0:{}s:7:"bajddar";a:0:{}s:14:"xn--bjddar-pta";a:0:{}s:6:"baidar";a:0:{}s:13:"xn--bidr-5nac";a:0:{}s:4:"berg";a:0:{}s:6:"bergen";a:0:{}s:8:"berlevag";a:0:{}s:15:"xn--berlevg-jxa";a:0:{}s:11:"bearalvahki";a:0:{}s:18:"xn--bearalvhki-y4a";a:0:{}s:6:"bindal";a:0:{}s:8:"birkenes";a:0:{}s:7:"bjarkoy";a:0:{}s:14:"xn--bjarky-fya";a:0:{}s:9:"bjerkreim";a:0:{}s:5:"bjugn";a:0:{}s:4:"bodo";a:0:{}s:11:"xn--bod-2na";a:0:{}s:8:"badaddja";a:0:{}s:15:"xn--bdddj-mrabd";a:0:{}s:7:"budejju";a:0:{}s:4:"bokn";a:0:{}s:9:"bremanger";a:0:{}s:7:"bronnoy";a:0:{}s:14:"xn--brnny-wuac";a:0:{}s:7:"bygland";a:0:{}s:5:"bykle";a:0:{}s:5:"barum";a:0:{}s:12:"xn--brum-voa";a:0:{}s:8:"telemark";a:2:{s:2:"bo";a:0:{}s:9:"xn--b-5ga";a:0:{}}s:8:"nordland";a:4:{s:2:"bo";a:0:{}s:9:"xn--b-5ga";a:0:{}s:5:"heroy";a:0:{}s:12:"xn--hery-ira";a:0:{}}s:6:"bievat";a:0:{}s:13:"xn--bievt-0qa";a:0:{}s:5:"bomlo";a:0:{}s:12:"xn--bmlo-gra";a:0:{}s:9:"batsfjord";a:0:{}s:16:"xn--btsfjord-9za";a:0:{}s:11:"bahcavuotna";a:0:{}s:18:"xn--bhcavuotna-s4a";a:0:{}s:5:"dovre";a:0:{}s:7:"drammen";a:0:{}s:9:"drangedal";a:0:{}s:5:"dyroy";a:0:{}s:12:"xn--dyry-ira";a:0:{}s:5:"donna";a:0:{}s:12:"xn--dnna-gra";a:0:{}s:3:"eid";a:0:{}s:8:"eidfjord";a:0:{}s:8:"eidsberg";a:0:{}s:7:"eidskog";a:0:{}s:8:"eidsvoll";a:0:{}s:9:"eigersund";a:0:{}s:7:"elverum";a:0:{}s:7:"enebakk";a:0:{}s:8:"engerdal";a:0:{}s:4:"etne";a:0:{}s:7:"etnedal";a:0:{}s:6:"evenes";a:0:{}s:8:"evenassi";a:0:{}s:17:"xn--eveni-0qa01ga";a:0:{}s:15:"evje-og-hornnes";a:0:{}s:7:"farsund";a:0:{}s:6:"fauske";a:0:{}s:7:"fuossko";a:0:{}s:7:"fuoisku";a:0:{}s:5:"fedje";a:0:{}s:3:"fet";a:0:{}s:6:"finnoy";a:0:{}s:13:"xn--finny-yua";a:0:{}s:6:"fitjar";a:0:{}s:6:"fjaler";a:0:{}s:5:"fjell";a:0:{}s:8:"flakstad";a:0:{}s:9:"flatanger";a:0:{}s:11:"flekkefjord";a:0:{}s:8:"flesberg";a:0:{}s:5:"flora";a:0:{}s:3:"fla";a:0:{}s:10:"xn--fl-zia";a:0:{}s:7:"folldal";a:0:{}s:7:"forsand";a:0:{}s:6:"fosnes";a:0:{}s:4:"frei";a:0:{}s:5:"frogn";a:0:{}s:7:"froland";a:0:{}s:6:"frosta";a:0:{}s:5:"frana";a:0:{}s:12:"xn--frna-woa";a:0:{}s:5:"froya";a:0:{}s:12:"xn--frya-hra";a:0:{}s:4:"fusa";a:0:{}s:8:"fyresdal";a:0:{}s:5:"forde";a:0:{}s:12:"xn--frde-gra";a:0:{}s:6:"gamvik";a:0:{}s:10:"gangaviika";a:0:{}s:19:"xn--ggaviika-8ya47h";a:0:{}s:6:"gaular";a:0:{}s:7:"gausdal";a:0:{}s:9:"gildeskal";a:0:{}s:16:"xn--gildeskl-g0a";a:0:{}s:5:"giske";a:0:{}s:7:"gjemnes";a:0:{}s:8:"gjerdrum";a:0:{}s:8:"gjerstad";a:0:{}s:7:"gjesdal";a:0:{}s:6:"gjovik";a:0:{}s:13:"xn--gjvik-wua";a:0:{}s:7:"gloppen";a:0:{}s:3:"gol";a:0:{}s:4:"gran";a:0:{}s:5:"grane";a:0:{}s:7:"granvin";a:0:{}s:9:"gratangen";a:0:{}s:8:"grimstad";a:0:{}s:5:"grong";a:0:{}s:9:"kraanghke";a:0:{}s:16:"xn--kranghke-b0a";a:0:{}s:4:"grue";a:0:{}s:5:"gulen";a:0:{}s:6:"hadsel";a:0:{}s:6:"halden";a:0:{}s:5:"halsa";a:0:{}s:5:"hamar";a:0:{}s:7:"hamaroy";a:0:{}s:6:"habmer";a:0:{}s:13:"xn--hbmer-xqa";a:0:{}s:6:"hapmir";a:0:{}s:13:"xn--hpmir-xqa";a:0:{}s:10:"hammerfest";a:0:{}s:12:"hammarfeasta";a:0:{}s:19:"xn--hmmrfeasta-s4ac";a:0:{}s:5:"haram";a:0:{}s:6:"hareid";a:0:{}s:7:"harstad";a:0:{}s:6:"hasvik";a:0:{}s:10:"aknoluokta";a:0:{}s:19:"xn--koluokta-7ya57h";a:0:{}s:12:"hattfjelldal";a:0:{}s:8:"aarborte";a:0:{}s:9:"haugesund";a:0:{}s:5:"hemne";a:0:{}s:6:"hemnes";a:0:{}s:8:"hemsedal";a:0:{}s:15:"more-og-romsdal";a:2:{s:5:"heroy";a:0:{}s:5:"sande";a:0:{}}s:22:"xn--mre-og-romsdal-qqb";a:2:{s:12:"xn--hery-ira";a:0:{}s:5:"sande";a:0:{}}s:5:"hitra";a:0:{}s:8:"hjartdal";a:0:{}s:10:"hjelmeland";a:0:{}s:5:"hobol";a:0:{}s:12:"xn--hobl-ira";a:0:{}s:3:"hof";a:0:{}s:3:"hol";a:0:{}s:4:"hole";a:0:{}s:11:"holmestrand";a:0:{}s:8:"holtalen";a:0:{}s:15:"xn--holtlen-hxa";a:0:{}s:9:"hornindal";a:0:{}s:6:"horten";a:0:{}s:6:"hurdal";a:0:{}s:5:"hurum";a:0:{}s:6:"hvaler";a:0:{}s:9:"hyllestad";a:0:{}s:10:"hagebostad";a:0:{}s:17:"xn--hgebostad-g3a";a:0:{}s:8:"hoyanger";a:0:{}s:15:"xn--hyanger-q1a";a:0:{}s:9:"hoylandet";a:0:{}s:16:"xn--hylandet-54a";a:0:{}s:2:"ha";a:0:{}s:9:"xn--h-2fa";a:0:{}s:7:"ibestad";a:0:{}s:7:"inderoy";a:0:{}s:14:"xn--indery-fya";a:0:{}s:7:"iveland";a:0:{}s:8:"jevnaker";a:0:{}s:6:"jondal";a:0:{}s:7:"jolster";a:0:{}s:14:"xn--jlster-bya";a:0:{}s:8:"karasjok";a:0:{}s:10:"karasjohka";a:0:{}s:19:"xn--krjohka-hwab49j";a:0:{}s:7:"karlsoy";a:0:{}s:5:"galsa";a:0:{}s:12:"xn--gls-elac";a:0:{}s:6:"karmoy";a:0:{}s:13:"xn--karmy-yua";a:0:{}s:10:"kautokeino";a:0:{}s:13:"guovdageaidnu";a:0:{}s:5:"klepp";a:0:{}s:5:"klabu";a:0:{}s:12:"xn--klbu-woa";a:0:{}s:9:"kongsberg";a:0:{}s:11:"kongsvinger";a:0:{}s:7:"kragero";a:0:{}s:14:"xn--krager-gya";a:0:{}s:12:"kristiansand";a:0:{}s:12:"kristiansund";a:0:{}s:10:"krodsherad";a:0:{}s:17:"xn--krdsherad-m8a";a:0:{}s:8:"kvalsund";a:0:{}s:11:"rahkkeravju";a:0:{}s:18:"xn--rhkkervju-01af";a:0:{}s:4:"kvam";a:0:{}s:9:"kvinesdal";a:0:{}s:10:"kvinnherad";a:0:{}s:9:"kviteseid";a:0:{}s:7:"kvitsoy";a:0:{}s:14:"xn--kvitsy-fya";a:0:{}s:8:"kvafjord";a:0:{}s:15:"xn--kvfjord-nxa";a:0:{}s:13:"giehtavuoatna";a:0:{}s:9:"kvanangen";a:0:{}s:16:"xn--kvnangen-k0a";a:0:{}s:8:"navuotna";a:0:{}s:15:"xn--nvuotna-hwa";a:0:{}s:7:"kafjord";a:0:{}s:14:"xn--kfjord-iua";a:0:{}s:9:"gaivuotna";a:0:{}s:16:"xn--givuotna-8ya";a:0:{}s:6:"larvik";a:0:{}s:8:"lavangen";a:0:{}s:7:"lavagis";a:0:{}s:6:"loabat";a:0:{}s:13:"xn--loabt-0qa";a:0:{}s:7:"lebesby";a:0:{}s:10:"davvesiida";a:0:{}s:9:"leikanger";a:0:{}s:9:"leirfjord";a:0:{}s:4:"leka";a:0:{}s:7:"leksvik";a:0:{}s:6:"lenvik";a:0:{}s:11:"leangaviika";a:0:{}s:18:"xn--leagaviika-52b";a:0:{}s:5:"lesja";a:0:{}s:8:"levanger";a:0:{}s:4:"lier";a:0:{}s:6:"lierne";a:0:{}s:11:"lillehammer";a:0:{}s:9:"lillesand";a:0:{}s:9:"lindesnes";a:0:{}s:6:"lindas";a:0:{}s:13:"xn--linds-pra";a:0:{}s:3:"lom";a:0:{}s:5:"loppa";a:0:{}s:6:"lahppi";a:0:{}s:13:"xn--lhppi-xqa";a:0:{}s:4:"lund";a:0:{}s:6:"lunner";a:0:{}s:5:"luroy";a:0:{}s:12:"xn--lury-ira";a:0:{}s:6:"luster";a:0:{}s:7:"lyngdal";a:0:{}s:6:"lyngen";a:0:{}s:4:"ivgu";a:0:{}s:6:"lardal";a:0:{}s:6:"lerdal";a:0:{}s:13:"xn--lrdal-sra";a:0:{}s:8:"lodingen";a:0:{}s:15:"xn--ldingen-q1a";a:0:{}s:9:"lorenskog";a:0:{}s:16:"xn--lrenskog-54a";a:0:{}s:5:"loten";a:0:{}s:12:"xn--lten-gra";a:0:{}s:6:"malvik";a:0:{}s:5:"masoy";a:0:{}s:13:"xn--msy-ula0h";a:0:{}s:6:"muosat";a:0:{}s:13:"xn--muost-0qa";a:0:{}s:6:"mandal";a:0:{}s:6:"marker";a:0:{}s:9:"marnardal";a:0:{}s:10:"masfjorden";a:0:{}s:6:"meland";a:0:{}s:6:"meldal";a:0:{}s:6:"melhus";a:0:{}s:5:"meloy";a:0:{}s:12:"xn--mely-ira";a:0:{}s:7:"meraker";a:0:{}s:14:"xn--merker-kua";a:0:{}s:7:"moareke";a:0:{}s:14:"xn--moreke-jua";a:0:{}s:7:"midsund";a:0:{}s:14:"midtre-gauldal";a:0:{}s:7:"modalen";a:0:{}s:5:"modum";a:0:{}s:5:"molde";a:0:{}s:8:"moskenes";a:0:{}s:4:"moss";a:0:{}s:6:"mosvik";a:0:{}s:7:"malselv";a:0:{}s:14:"xn--mlselv-iua";a:0:{}s:11:"malatvuopmi";a:0:{}s:18:"xn--mlatvuopmi-s4a";a:0:{}s:10:"namdalseid";a:0:{}s:6:"aejrie";a:0:{}s:6:"namsos";a:0:{}s:10:"namsskogan";a:0:{}s:14:"naamesjevuemie";a:0:{}s:21:"xn--nmesjevuemie-tcba";a:0:{}s:12:"laakesvuemie";a:0:{}s:9:"nannestad";a:0:{}s:6:"narvik";a:0:{}s:8:"narviika";a:0:{}s:8:"naustdal";a:0:{}s:11:"nedre-eiker";a:0:{}s:8:"akershus";a:1:{s:3:"nes";a:0:{}}s:8:"buskerud";a:1:{s:3:"nes";a:0:{}}s:5:"nesna";a:0:{}s:8:"nesodden";a:0:{}s:7:"nesseby";a:0:{}s:7:"unjarga";a:0:{}s:14:"xn--unjrga-rta";a:0:{}s:6:"nesset";a:0:{}s:8:"nissedal";a:0:{}s:8:"nittedal";a:0:{}s:11:"nord-aurdal";a:0:{}s:9:"nord-fron";a:0:{}s:9:"nord-odal";a:0:{}s:7:"norddal";a:0:{}s:8:"nordkapp";a:0:{}s:11:"davvenjarga";a:0:{}s:18:"xn--davvenjrga-y4a";a:0:{}s:11:"nordre-land";a:0:{}s:9:"nordreisa";a:0:{}s:5:"raisa";a:0:{}s:12:"xn--risa-5na";a:0:{}s:13:"nore-og-uvdal";a:0:{}s:8:"notodden";a:0:{}s:5:"naroy";a:0:{}s:13:"xn--nry-yla5g";a:0:{}s:8:"notteroy";a:0:{}s:15:"xn--nttery-byae";a:0:{}s:4:"odda";a:0:{}s:6:"oksnes";a:0:{}s:13:"xn--ksnes-uua";a:0:{}s:6:"oppdal";a:0:{}s:8:"oppegard";a:0:{}s:15:"xn--oppegrd-ixa";a:0:{}s:6:"orkdal";a:0:{}s:6:"orland";a:0:{}s:13:"xn--rland-uua";a:0:{}s:6:"orskog";a:0:{}s:13:"xn--rskog-uua";a:0:{}s:5:"orsta";a:0:{}s:12:"xn--rsta-fra";a:0:{}s:7:"hedmark";a:3:{s:2:"os";a:0:{}s:5:"valer";a:0:{}s:12:"xn--vler-qoa";a:0:{}}s:9:"hordaland";a:1:{s:2:"os";a:0:{}}s:4:"osen";a:0:{}s:7:"osteroy";a:0:{}s:14:"xn--ostery-fya";a:0:{}s:11:"ostre-toten";a:0:{}s:18:"xn--stre-toten-zcb";a:0:{}s:9:"overhalla";a:0:{}s:10:"ovre-eiker";a:0:{}s:17:"xn--vre-eiker-k8a";a:0:{}s:4:"oyer";a:0:{}s:11:"xn--yer-zna";a:0:{}s:8:"oygarden";a:0:{}s:15:"xn--ygarden-p1a";a:0:{}s:13:"oystre-slidre";a:0:{}s:20:"xn--ystre-slidre-ujb";a:0:{}s:9:"porsanger";a:0:{}s:8:"porsangu";a:0:{}s:17:"xn--porsgu-sta26f";a:0:{}s:9:"porsgrunn";a:0:{}s:5:"radoy";a:0:{}s:12:"xn--rady-ira";a:0:{}s:9:"rakkestad";a:0:{}s:4:"rana";a:0:{}s:6:"ruovat";a:0:{}s:9:"randaberg";a:0:{}s:5:"rauma";a:0:{}s:8:"rendalen";a:0:{}s:7:"rennebu";a:0:{}s:8:"rennesoy";a:0:{}s:15:"xn--rennesy-v1a";a:0:{}s:6:"rindal";a:0:{}s:7:"ringebu";a:0:{}s:9:"ringerike";a:0:{}s:9:"ringsaker";a:0:{}s:5:"rissa";a:0:{}s:5:"risor";a:0:{}s:12:"xn--risr-ira";a:0:{}s:4:"roan";a:0:{}s:6:"rollag";a:0:{}s:5:"rygge";a:0:{}s:8:"ralingen";a:0:{}s:15:"xn--rlingen-mxa";a:0:{}s:5:"rodoy";a:0:{}s:12:"xn--rdy-0nab";a:0:{}s:7:"romskog";a:0:{}s:14:"xn--rmskog-bya";a:0:{}s:5:"roros";a:0:{}s:12:"xn--rros-gra";a:0:{}s:4:"rost";a:0:{}s:11:"xn--rst-0na";a:0:{}s:6:"royken";a:0:{}s:13:"xn--ryken-vua";a:0:{}s:7:"royrvik";a:0:{}s:14:"xn--ryrvik-bya";a:0:{}s:4:"rade";a:0:{}s:11:"xn--rde-ula";a:0:{}s:8:"salangen";a:0:{}s:7:"siellak";a:0:{}s:7:"saltdal";a:0:{}s:5:"salat";a:0:{}s:12:"xn--slt-elab";a:0:{}s:12:"xn--slat-5na";a:0:{}s:9:"samnanger";a:0:{}s:8:"vestfold";a:1:{s:5:"sande";a:0:{}}s:10:"sandefjord";a:0:{}s:7:"sandnes";a:0:{}s:6:"sandoy";a:0:{}s:13:"xn--sandy-yua";a:0:{}s:9:"sarpsborg";a:0:{}s:5:"sauda";a:0:{}s:8:"sauherad";a:0:{}s:3:"sel";a:0:{}s:5:"selbu";a:0:{}s:5:"selje";a:0:{}s:7:"seljord";a:0:{}s:6:"sigdal";a:0:{}s:6:"siljan";a:0:{}s:6:"sirdal";a:0:{}s:5:"skaun";a:0:{}s:7:"skedsmo";a:0:{}s:3:"ski";a:0:{}s:5:"skien";a:0:{}s:8:"skiptvet";a:0:{}s:8:"skjervoy";a:0:{}s:15:"xn--skjervy-v1a";a:0:{}s:7:"skierva";a:0:{}s:14:"xn--skierv-uta";a:0:{}s:5:"skjak";a:0:{}s:12:"xn--skjk-soa";a:0:{}s:6:"skodje";a:0:{}s:8:"skanland";a:0:{}s:15:"xn--sknland-fxa";a:0:{}s:6:"skanit";a:0:{}s:13:"xn--sknit-yqa";a:0:{}s:5:"smola";a:0:{}s:12:"xn--smla-hra";a:0:{}s:10:"snillfjord";a:0:{}s:5:"snasa";a:0:{}s:12:"xn--snsa-roa";a:0:{}s:6:"snoasa";a:0:{}s:6:"snaase";a:0:{}s:13:"xn--snase-nra";a:0:{}s:7:"sogndal";a:0:{}s:7:"sokndal";a:0:{}s:4:"sola";a:0:{}s:6:"solund";a:0:{}s:9:"songdalen";a:0:{}s:8:"sortland";a:0:{}s:9:"spydeberg";a:0:{}s:6:"stange";a:0:{}s:9:"stavanger";a:0:{}s:7:"steigen";a:0:{}s:9:"steinkjer";a:0:{}s:8:"stjordal";a:0:{}s:15:"xn--stjrdal-s1a";a:0:{}s:6:"stokke";a:0:{}s:11:"stor-elvdal";a:0:{}s:5:"stord";a:0:{}s:7:"stordal";a:0:{}s:9:"storfjord";a:0:{}s:10:"omasvuotna";a:0:{}s:6:"strand";a:0:{}s:7:"stranda";a:0:{}s:5:"stryn";a:0:{}s:4:"sula";a:0:{}s:6:"suldal";a:0:{}s:4:"sund";a:0:{}s:7:"sunndal";a:0:{}s:8:"surnadal";a:0:{}s:5:"sveio";a:0:{}s:7:"svelvik";a:0:{}s:9:"sykkylven";a:0:{}s:5:"sogne";a:0:{}s:12:"xn--sgne-gra";a:0:{}s:5:"somna";a:0:{}s:12:"xn--smna-gra";a:0:{}s:11:"sondre-land";a:0:{}s:18:"xn--sndre-land-0cb";a:0:{}s:10:"sor-aurdal";a:0:{}s:17:"xn--sr-aurdal-l8a";a:0:{}s:8:"sor-fron";a:0:{}s:15:"xn--sr-fron-q1a";a:0:{}s:8:"sor-odal";a:0:{}s:15:"xn--sr-odal-q1a";a:0:{}s:12:"sor-varanger";a:0:{}s:19:"xn--sr-varanger-ggb";a:0:{}s:13:"matta-varjjat";a:0:{}s:20:"xn--mtta-vrjjat-k7af";a:0:{}s:7:"sorfold";a:0:{}s:14:"xn--srfold-bya";a:0:{}s:8:"sorreisa";a:0:{}s:15:"xn--srreisa-q1a";a:0:{}s:5:"sorum";a:0:{}s:12:"xn--srum-gra";a:0:{}s:4:"tana";a:0:{}s:6:"deatnu";a:0:{}s:4:"time";a:0:{}s:8:"tingvoll";a:0:{}s:4:"tinn";a:0:{}s:9:"tjeldsund";a:0:{}s:13:"dielddanuorri";a:0:{}s:5:"tjome";a:0:{}s:12:"xn--tjme-hra";a:0:{}s:5:"tokke";a:0:{}s:5:"tolga";a:0:{}s:7:"torsken";a:0:{}s:6:"tranoy";a:0:{}s:13:"xn--trany-yua";a:0:{}s:6:"tromso";a:0:{}s:13:"xn--troms-zua";a:0:{}s:6:"tromsa";a:0:{}s:5:"romsa";a:0:{}s:9:"trondheim";a:0:{}s:8:"troandin";a:0:{}s:6:"trysil";a:0:{}s:5:"trana";a:0:{}s:12:"xn--trna-woa";a:0:{}s:8:"trogstad";a:0:{}s:15:"xn--trgstad-r1a";a:0:{}s:11:"tvedestrand";a:0:{}s:5:"tydal";a:0:{}s:6:"tynset";a:0:{}s:8:"tysfjord";a:0:{}s:12:"divtasvuodna";a:0:{}s:13:"divttasvuotna";a:0:{}s:6:"tysnes";a:0:{}s:6:"tysvar";a:0:{}s:13:"xn--tysvr-vra";a:0:{}s:8:"tonsberg";a:0:{}s:15:"xn--tnsberg-q1a";a:0:{}s:10:"ullensaker";a:0:{}s:10:"ullensvang";a:0:{}s:5:"ulvik";a:0:{}s:6:"utsira";a:0:{}s:5:"vadso";a:0:{}s:12:"xn--vads-jra";a:0:{}s:10:"cahcesuolo";a:0:{}s:19:"xn--hcesuolo-7ya35b";a:0:{}s:7:"vaksdal";a:0:{}s:5:"valle";a:0:{}s:4:"vang";a:0:{}s:8:"vanylven";a:0:{}s:5:"vardo";a:0:{}s:12:"xn--vard-jra";a:0:{}s:7:"varggat";a:0:{}s:14:"xn--vrggt-xqad";a:0:{}s:5:"vefsn";a:0:{}s:7:"vaapste";a:0:{}s:4:"vega";a:0:{}s:9:"vegarshei";a:0:{}s:16:"xn--vegrshei-c0a";a:0:{}s:8:"vennesla";a:0:{}s:6:"verdal";a:0:{}s:6:"verran";a:0:{}s:6:"vestby";a:0:{}s:7:"vestnes";a:0:{}s:13:"vestre-slidre";a:0:{}s:12:"vestre-toten";a:0:{}s:9:"vestvagoy";a:0:{}s:17:"xn--vestvgy-ixa6o";a:0:{}s:9:"vevelstad";a:0:{}s:3:"vik";a:0:{}s:5:"vikna";a:0:{}s:10:"vindafjord";a:0:{}s:5:"volda";a:0:{}s:4:"voss";a:0:{}s:5:"varoy";a:0:{}s:13:"xn--vry-yla5g";a:0:{}s:5:"vagan";a:0:{}s:12:"xn--vgan-qoa";a:0:{}s:6:"voagat";a:0:{}s:6:"vagsoy";a:0:{}s:14:"xn--vgsy-qoa0j";a:0:{}s:4:"vaga";a:0:{}s:11:"xn--vg-yiab";a:0:{}s:7:"ostfold";a:1:{s:5:"valer";a:0:{}}s:14:"xn--stfold-9xa";a:1:{s:12:"xn--vler-qoa";a:0:{}}}s:2:"np";a:1:{s:1:"*";a:0:{}}s:2:"nr";a:7:{s:3:"biz";a:0:{}s:4:"info";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"com";a:0:{}}s:2:"nu";a:0:{}s:2:"nz";a:16:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:3:"cri";a:0:{}s:4:"geek";a:0:{}s:3:"gen";a:0:{}s:4:"govt";a:0:{}s:6:"health";a:0:{}s:3:"iwi";a:0:{}s:4:"kiwi";a:0:{}s:5:"maori";a:0:{}s:3:"mil";a:0:{}s:12:"xn--mori-qsa";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:10:"parliament";a:0:{}s:6:"school";a:0:{}}s:2:"om";a:9:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"med";a:0:{}s:6:"museum";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"pro";a:0:{}}s:5:"onion";a:0:{}s:3:"org";a:0:{}s:2:"pa";a:11:{s:2:"ac";a:0:{}s:3:"gob";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"sld";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"ing";a:0:{}s:3:"abo";a:0:{}s:3:"med";a:0:{}s:3:"nom";a:0:{}}s:2:"pe";a:7:{s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:3:"nom";a:0:{}s:3:"mil";a:0:{}s:3:"org";a:0:{}s:3:"com";a:0:{}s:3:"net";a:0:{}}s:2:"pf";a:3:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}}s:2:"pg";a:1:{s:1:"*";a:0:{}}s:2:"ph";a:8:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"ngo";a:0:{}s:3:"mil";a:0:{}s:1:"i";a:0:{}}s:2:"pk";a:14:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:3:"fam";a:0:{}s:3:"biz";a:0:{}s:3:"web";a:0:{}s:3:"gov";a:0:{}s:3:"gob";a:0:{}s:3:"gok";a:0:{}s:3:"gon";a:0:{}s:3:"gop";a:0:{}s:3:"gos";a:0:{}s:4:"info";a:0:{}}s:2:"pl";a:153:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"aid";a:0:{}s:4:"agro";a:0:{}s:3:"atm";a:0:{}s:4:"auto";a:0:{}s:3:"biz";a:0:{}s:3:"edu";a:0:{}s:5:"gmina";a:0:{}s:3:"gsm";a:0:{}s:4:"info";a:0:{}s:4:"mail";a:0:{}s:6:"miasta";a:0:{}s:5:"media";a:0:{}s:3:"mil";a:0:{}s:13:"nieruchomosci";a:0:{}s:3:"nom";a:0:{}s:2:"pc";a:0:{}s:6:"powiat";a:0:{}s:4:"priv";a:0:{}s:10:"realestate";a:0:{}s:3:"rel";a:0:{}s:3:"sex";a:0:{}s:4:"shop";a:0:{}s:5:"sklep";a:0:{}s:3:"sos";a:0:{}s:6:"szkola";a:0:{}s:5:"targi";a:0:{}s:2:"tm";a:0:{}s:7:"tourism";a:0:{}s:6:"travel";a:0:{}s:9:"turystyka";a:0:{}s:3:"gov";a:47:{s:2:"ap";a:0:{}s:2:"ic";a:0:{}s:2:"is";a:0:{}s:2:"us";a:0:{}s:5:"kmpsp";a:0:{}s:5:"kppsp";a:0:{}s:5:"kwpsp";a:0:{}s:3:"psp";a:0:{}s:4:"wskr";a:0:{}s:3:"kwp";a:0:{}s:2:"mw";a:0:{}s:2:"ug";a:0:{}s:2:"um";a:0:{}s:4:"umig";a:0:{}s:4:"ugim";a:0:{}s:4:"upow";a:0:{}s:2:"uw";a:0:{}s:9:"starostwo";a:0:{}s:2:"pa";a:0:{}s:2:"po";a:0:{}s:4:"psse";a:0:{}s:3:"pup";a:0:{}s:4:"rzgw";a:0:{}s:2:"sa";a:0:{}s:2:"so";a:0:{}s:2:"sr";a:0:{}s:3:"wsa";a:0:{}s:3:"sko";a:0:{}s:3:"uzs";a:0:{}s:4:"wiih";a:0:{}s:4:"winb";a:0:{}s:4:"pinb";a:0:{}s:4:"wios";a:0:{}s:4:"witd";a:0:{}s:6:"wzmiuw";a:0:{}s:3:"piw";a:0:{}s:3:"wiw";a:0:{}s:4:"griw";a:0:{}s:3:"wif";a:0:{}s:3:"oum";a:0:{}s:3:"sdn";a:0:{}s:2:"zp";a:0:{}s:4:"uppo";a:0:{}s:3:"mup";a:0:{}s:4:"wuoz";a:0:{}s:8:"konsulat";a:0:{}s:4:"oirm";a:0:{}}s:8:"augustow";a:0:{}s:10:"babia-gora";a:0:{}s:6:"bedzin";a:0:{}s:7:"beskidy";a:0:{}s:10:"bialowieza";a:0:{}s:9:"bialystok";a:0:{}s:7:"bielawa";a:0:{}s:10:"bieszczady";a:0:{}s:11:"boleslawiec";a:0:{}s:9:"bydgoszcz";a:0:{}s:5:"bytom";a:0:{}s:7:"cieszyn";a:0:{}s:7:"czeladz";a:0:{}s:5:"czest";a:0:{}s:9:"dlugoleka";a:0:{}s:6:"elblag";a:0:{}s:3:"elk";a:0:{}s:6:"glogow";a:0:{}s:7:"gniezno";a:0:{}s:7:"gorlice";a:0:{}s:7:"grajewo";a:0:{}s:5:"ilawa";a:0:{}s:8:"jaworzno";a:0:{}s:12:"jelenia-gora";a:0:{}s:5:"jgora";a:0:{}s:6:"kalisz";a:0:{}s:15:"kazimierz-dolny";a:0:{}s:7:"karpacz";a:0:{}s:7:"kartuzy";a:0:{}s:7:"kaszuby";a:0:{}s:8:"katowice";a:0:{}s:5:"kepno";a:0:{}s:7:"ketrzyn";a:0:{}s:7:"klodzko";a:0:{}s:10:"kobierzyce";a:0:{}s:9:"kolobrzeg";a:0:{}s:5:"konin";a:0:{}s:10:"konskowola";a:0:{}s:5:"kutno";a:0:{}s:4:"lapy";a:0:{}s:6:"lebork";a:0:{}s:7:"legnica";a:0:{}s:7:"lezajsk";a:0:{}s:8:"limanowa";a:0:{}s:5:"lomza";a:0:{}s:6:"lowicz";a:0:{}s:5:"lubin";a:0:{}s:5:"lukow";a:0:{}s:7:"malbork";a:0:{}s:10:"malopolska";a:0:{}s:8:"mazowsze";a:0:{}s:6:"mazury";a:0:{}s:6:"mielec";a:0:{}s:6:"mielno";a:0:{}s:7:"mragowo";a:0:{}s:5:"naklo";a:0:{}s:8:"nowaruda";a:0:{}s:4:"nysa";a:0:{}s:5:"olawa";a:0:{}s:6:"olecko";a:0:{}s:6:"olkusz";a:0:{}s:7:"olsztyn";a:0:{}s:7:"opoczno";a:0:{}s:5:"opole";a:0:{}s:7:"ostroda";a:0:{}s:9:"ostroleka";a:0:{}s:9:"ostrowiec";a:0:{}s:10:"ostrowwlkp";a:0:{}s:4:"pila";a:0:{}s:4:"pisz";a:0:{}s:7:"podhale";a:0:{}s:8:"podlasie";a:0:{}s:9:"polkowice";a:0:{}s:7:"pomorze";a:0:{}s:9:"pomorskie";a:0:{}s:10:"prochowice";a:0:{}s:8:"pruszkow";a:0:{}s:9:"przeworsk";a:0:{}s:6:"pulawy";a:0:{}s:5:"radom";a:0:{}s:8:"rawa-maz";a:0:{}s:6:"rybnik";a:0:{}s:7:"rzeszow";a:0:{}s:5:"sanok";a:0:{}s:5:"sejny";a:0:{}s:5:"slask";a:0:{}s:6:"slupsk";a:0:{}s:9:"sosnowiec";a:0:{}s:12:"stalowa-wola";a:0:{}s:7:"skoczow";a:0:{}s:12:"starachowice";a:0:{}s:8:"stargard";a:0:{}s:7:"suwalki";a:0:{}s:8:"swidnica";a:0:{}s:10:"swiebodzin";a:0:{}s:11:"swinoujscie";a:0:{}s:8:"szczecin";a:0:{}s:8:"szczytno";a:0:{}s:10:"tarnobrzeg";a:0:{}s:5:"tgory";a:0:{}s:5:"turek";a:0:{}s:5:"tychy";a:0:{}s:5:"ustka";a:0:{}s:9:"walbrzych";a:0:{}s:6:"warmia";a:0:{}s:8:"warszawa";a:0:{}s:3:"waw";a:0:{}s:6:"wegrow";a:0:{}s:6:"wielun";a:0:{}s:5:"wlocl";a:0:{}s:9:"wloclawek";a:0:{}s:9:"wodzislaw";a:0:{}s:7:"wolomin";a:0:{}s:7:"wroclaw";a:0:{}s:9:"zachpomor";a:0:{}s:5:"zagan";a:0:{}s:5:"zarow";a:0:{}s:5:"zgora";a:0:{}s:9:"zgorzelec";a:0:{}}s:2:"pm";a:0:{}s:2:"pn";a:5:{s:3:"gov";a:0:{}s:2:"co";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}}s:4:"post";a:0:{}s:2:"pr";a:13:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:4:"isla";a:0:{}s:3:"pro";a:0:{}s:3:"biz";a:0:{}s:4:"info";a:0:{}s:4:"name";a:0:{}s:3:"est";a:0:{}s:4:"prof";a:0:{}s:2:"ac";a:0:{}}s:3:"pro";a:11:{s:3:"aaa";a:0:{}s:3:"aca";a:0:{}s:4:"acct";a:0:{}s:6:"avocat";a:0:{}s:3:"bar";a:0:{}s:3:"cpa";a:0:{}s:3:"eng";a:0:{}s:3:"jur";a:0:{}s:3:"law";a:0:{}s:3:"med";a:0:{}s:5:"recht";a:0:{}}s:2:"ps";a:7:{s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"sec";a:0:{}s:3:"plo";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}}s:2:"pt";a:8:{s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"int";a:0:{}s:4:"publ";a:0:{}s:3:"com";a:0:{}s:4:"nome";a:0:{}}s:2:"pw";a:6:{s:2:"co";a:0:{}s:2:"ne";a:0:{}s:2:"or";a:0:{}s:2:"ed";a:0:{}s:2:"go";a:0:{}s:5:"belau";a:0:{}}s:2:"py";a:7:{s:3:"com";a:0:{}s:4:"coop";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"qa";a:8:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sch";a:0:{}}s:2:"re";a:3:{s:4:"asso";a:0:{}s:3:"com";a:0:{}s:3:"nom";a:0:{}}s:2:"ro";a:11:{s:4:"arts";a:0:{}s:3:"com";a:0:{}s:4:"firm";a:0:{}s:4:"info";a:0:{}s:3:"nom";a:0:{}s:2:"nt";a:0:{}s:3:"org";a:0:{}s:3:"rec";a:0:{}s:5:"store";a:0:{}s:2:"tm";a:0:{}s:3:"www";a:0:{}}s:2:"rs";a:6:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:2:"in";a:0:{}s:3:"org";a:0:{}}s:2:"ru";a:6:{s:2:"ac";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:4:"test";a:0:{}}s:2:"rw";a:9:{s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}s:2:"ac";a:0:{}s:3:"com";a:0:{}s:2:"co";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:4:"gouv";a:0:{}}s:2:"sa";a:8:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"med";a:0:{}s:3:"pub";a:0:{}s:3:"edu";a:0:{}s:3:"sch";a:0:{}}s:2:"sb";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"sc";a:5:{s:3:"com";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}}s:2:"sd";a:8:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"med";a:0:{}s:2:"tv";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}}s:2:"se";a:39:{s:1:"a";a:0:{}s:2:"ac";a:0:{}s:1:"b";a:0:{}s:2:"bd";a:0:{}s:5:"brand";a:0:{}s:1:"c";a:0:{}s:1:"d";a:0:{}s:1:"e";a:0:{}s:1:"f";a:0:{}s:2:"fh";a:0:{}s:4:"fhsk";a:0:{}s:3:"fhv";a:0:{}s:1:"g";a:0:{}s:1:"h";a:0:{}s:1:"i";a:0:{}s:1:"k";a:0:{}s:7:"komforb";a:0:{}s:15:"kommunalforbund";a:0:{}s:6:"komvux";a:0:{}s:1:"l";a:0:{}s:6:"lanbib";a:0:{}s:1:"m";a:0:{}s:1:"n";a:0:{}s:14:"naturbruksgymn";a:0:{}s:1:"o";a:0:{}s:3:"org";a:0:{}s:1:"p";a:0:{}s:5:"parti";a:0:{}s:2:"pp";a:0:{}s:5:"press";a:0:{}s:1:"r";a:0:{}s:1:"s";a:0:{}s:1:"t";a:0:{}s:2:"tm";a:0:{}s:1:"u";a:0:{}s:1:"w";a:0:{}s:1:"x";a:0:{}s:1:"y";a:0:{}s:1:"z";a:0:{}}s:2:"sg";a:6:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"per";a:0:{}}s:2:"sh";a:5:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"mil";a:0:{}}s:2:"si";a:0:{}s:2:"sj";a:0:{}s:2:"sk";a:0:{}s:2:"sl";a:5:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}}s:2:"sm";a:0:{}s:2:"sn";a:7:{s:3:"art";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:4:"gouv";a:0:{}s:3:"org";a:0:{}s:5:"perso";a:0:{}s:4:"univ";a:0:{}}s:2:"so";a:3:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"sr";a:0:{}s:2:"st";a:12:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:9:"consulado";a:0:{}s:3:"edu";a:0:{}s:9:"embaixada";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:8:"principe";a:0:{}s:7:"saotome";a:0:{}s:5:"store";a:0:{}}s:2:"su";a:0:{}s:2:"sv";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:3:"org";a:0:{}s:3:"red";a:0:{}}s:2:"sx";a:1:{s:3:"gov";a:0:{}}s:2:"sy";a:6:{s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}}s:2:"sz";a:3:{s:2:"co";a:0:{}s:2:"ac";a:0:{}s:3:"org";a:0:{}}s:2:"tc";a:0:{}s:2:"td";a:0:{}s:3:"tel";a:0:{}s:2:"tf";a:0:{}s:2:"tg";a:0:{}s:2:"th";a:7:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"go";a:0:{}s:2:"in";a:0:{}s:2:"mi";a:0:{}s:3:"net";a:0:{}s:2:"or";a:0:{}}s:2:"tj";a:15:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:2:"go";a:0:{}s:3:"gov";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"nic";a:0:{}s:3:"org";a:0:{}s:4:"test";a:0:{}s:3:"web";a:0:{}}s:2:"tk";a:0:{}s:2:"tl";a:1:{s:3:"gov";a:0:{}}s:2:"tm";a:8:{s:3:"com";a:0:{}s:2:"co";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"nom";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"edu";a:0:{}}s:2:"tn";a:20:{s:3:"com";a:0:{}s:3:"ens";a:0:{}s:3:"fin";a:0:{}s:3:"gov";a:0:{}s:3:"ind";a:0:{}s:4:"intl";a:0:{}s:3:"nat";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:4:"info";a:0:{}s:5:"perso";a:0:{}s:7:"tourism";a:0:{}s:6:"edunet";a:0:{}s:4:"rnrt";a:0:{}s:3:"rns";a:0:{}s:3:"rnu";a:0:{}s:6:"mincom";a:0:{}s:7:"agrinet";a:0:{}s:7:"defense";a:0:{}s:5:"turen";a:0:{}}s:2:"to";a:6:{s:3:"com";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"mil";a:0:{}}s:2:"tr";a:21:{s:3:"com";a:0:{}s:4:"info";a:0:{}s:3:"biz";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"web";a:0:{}s:3:"gen";a:0:{}s:2:"tv";a:0:{}s:2:"av";a:0:{}s:2:"dr";a:0:{}s:3:"bbs";a:0:{}s:4:"name";a:0:{}s:3:"tel";a:0:{}s:3:"gov";a:0:{}s:3:"bel";a:0:{}s:3:"pol";a:0:{}s:3:"mil";a:0:{}s:3:"k12";a:0:{}s:3:"edu";a:0:{}s:3:"kep";a:0:{}s:2:"nc";a:1:{s:3:"gov";a:0:{}}}s:6:"travel";a:0:{}s:2:"tt";a:17:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"biz";a:0:{}s:4:"info";a:0:{}s:3:"pro";a:0:{}s:3:"int";a:0:{}s:4:"coop";a:0:{}s:4:"jobs";a:0:{}s:4:"mobi";a:0:{}s:6:"travel";a:0:{}s:6:"museum";a:0:{}s:4:"aero";a:0:{}s:4:"name";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}}s:2:"tv";a:0:{}s:2:"tw";a:13:{s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"idv";a:0:{}s:4:"game";a:0:{}s:4:"ebiz";a:0:{}s:4:"club";a:0:{}s:12:"xn--zf0ao64a";a:0:{}s:10:"xn--uc0atv";a:0:{}s:11:"xn--czrw28b";a:0:{}}s:2:"tz";a:12:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"go";a:0:{}s:5:"hotel";a:0:{}s:4:"info";a:0:{}s:2:"me";a:0:{}s:3:"mil";a:0:{}s:4:"mobi";a:0:{}s:2:"ne";a:0:{}s:2:"or";a:0:{}s:2:"sc";a:0:{}s:2:"tv";a:0:{}}s:2:"ua";a:76:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:2:"in";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:9:"cherkassy";a:0:{}s:8:"cherkasy";a:0:{}s:9:"chernigov";a:0:{}s:9:"chernihiv";a:0:{}s:10:"chernivtsi";a:0:{}s:10:"chernovtsy";a:0:{}s:2:"ck";a:0:{}s:2:"cn";a:0:{}s:2:"cr";a:0:{}s:6:"crimea";a:0:{}s:2:"cv";a:0:{}s:2:"dn";a:0:{}s:14:"dnepropetrovsk";a:0:{}s:14:"dnipropetrovsk";a:0:{}s:7:"dominic";a:0:{}s:7:"donetsk";a:0:{}s:2:"dp";a:0:{}s:2:"if";a:0:{}s:15:"ivano-frankivsk";a:0:{}s:2:"kh";a:0:{}s:7:"kharkiv";a:0:{}s:7:"kharkov";a:0:{}s:7:"kherson";a:0:{}s:12:"khmelnitskiy";a:0:{}s:12:"khmelnytskyi";a:0:{}s:4:"kiev";a:0:{}s:10:"kirovograd";a:0:{}s:2:"km";a:0:{}s:2:"kr";a:0:{}s:4:"krym";a:0:{}s:2:"ks";a:0:{}s:2:"kv";a:0:{}s:4:"kyiv";a:0:{}s:2:"lg";a:0:{}s:2:"lt";a:0:{}s:7:"lugansk";a:0:{}s:5:"lutsk";a:0:{}s:2:"lv";a:0:{}s:4:"lviv";a:0:{}s:2:"mk";a:0:{}s:8:"mykolaiv";a:0:{}s:8:"nikolaev";a:0:{}s:2:"od";a:0:{}s:5:"odesa";a:0:{}s:6:"odessa";a:0:{}s:2:"pl";a:0:{}s:7:"poltava";a:0:{}s:5:"rivne";a:0:{}s:5:"rovno";a:0:{}s:2:"rv";a:0:{}s:2:"sb";a:0:{}s:10:"sebastopol";a:0:{}s:10:"sevastopol";a:0:{}s:2:"sm";a:0:{}s:4:"sumy";a:0:{}s:2:"te";a:0:{}s:8:"ternopil";a:0:{}s:2:"uz";a:0:{}s:8:"uzhgorod";a:0:{}s:7:"vinnica";a:0:{}s:9:"vinnytsia";a:0:{}s:2:"vn";a:0:{}s:5:"volyn";a:0:{}s:5:"yalta";a:0:{}s:11:"zaporizhzhe";a:0:{}s:12:"zaporizhzhia";a:0:{}s:8:"zhitomir";a:0:{}s:8:"zhytomyr";a:0:{}s:2:"zp";a:0:{}s:2:"zt";a:0:{}}s:2:"ug";a:8:{s:2:"co";a:0:{}s:2:"or";a:0:{}s:2:"ac";a:0:{}s:2:"sc";a:0:{}s:2:"go";a:0:{}s:2:"ne";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}}s:2:"uk";a:11:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:3:"gov";a:0:{}s:3:"ltd";a:0:{}s:2:"me";a:0:{}s:3:"net";a:0:{}s:3:"nhs";a:0:{}s:3:"org";a:0:{}s:3:"plc";a:0:{}s:6:"police";a:0:{}s:3:"sch";a:1:{s:1:"*";a:0:{}}}s:2:"us";a:60:{s:3:"dni";a:0:{}s:3:"fed";a:0:{}s:3:"isa";a:0:{}s:4:"kids";a:0:{}s:3:"nsn";a:0:{}s:2:"ak";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"al";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ar";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"as";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"az";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ca";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"co";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ct";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"dc";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"de";a:2:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}}s:2:"fl";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ga";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"gu";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"hi";a:2:{s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ia";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"id";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"il";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"in";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ks";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ky";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"la";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ma";a:3:{s:3:"k12";a:3:{s:3:"pvt";a:0:{}s:4:"chtr";a:0:{}s:6:"paroch";a:0:{}}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"md";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"me";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"mi";a:11:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}s:9:"ann-arbor";a:0:{}s:3:"cog";a:0:{}s:3:"dst";a:0:{}s:5:"eaton";a:0:{}s:3:"gen";a:0:{}s:3:"mus";a:0:{}s:3:"tec";a:0:{}s:9:"washtenaw";a:0:{}}s:2:"mn";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"mo";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ms";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"mt";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nc";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nd";a:2:{s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ne";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nh";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nj";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nm";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nv";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ny";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"oh";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ok";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"or";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"pa";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"pr";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ri";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"sc";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"sd";a:2:{s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"tn";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"tx";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ut";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"vi";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"vt";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"va";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"wa";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"wi";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"wv";a:1:{s:2:"cc";a:0:{}}s:2:"wy";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}}s:2:"uy";a:6:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gub";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"uz";a:4:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"va";a:0:{}s:2:"vc";a:6:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"edu";a:0:{}}s:2:"ve";a:17:{s:4:"arts";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"e12";a:0:{}s:3:"edu";a:0:{}s:4:"firm";a:0:{}s:3:"gob";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"rec";a:0:{}s:5:"store";a:0:{}s:3:"tec";a:0:{}s:3:"web";a:0:{}}s:2:"vg";a:0:{}s:2:"vi";a:5:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"k12";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"vn";a:12:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"int";a:0:{}s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:4:"info";a:0:{}s:4:"name";a:0:{}s:3:"pro";a:0:{}s:6:"health";a:0:{}}s:2:"vu";a:4:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"wf";a:0:{}s:2:"ws";a:5:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}}s:2:"yt";a:0:{}s:14:"xn--mgbaam7a8h";a:0:{}s:10:"xn--y9a3aq";a:0:{}s:14:"xn--54b7fta0cc";a:0:{}s:8:"xn--90ae";a:0:{}s:9:"xn--90ais";a:0:{}s:10:"xn--fiqs8s";a:0:{}s:10:"xn--fiqz9s";a:0:{}s:15:"xn--lgbbat1ad8j";a:0:{}s:10:"xn--wgbh1c";a:0:{}s:9:"xn--e1a4c";a:0:{}s:8:"xn--node";a:0:{}s:8:"xn--qxam";a:0:{}s:11:"xn--j6w193g";a:0:{}s:11:"xn--2scrj9c";a:0:{}s:11:"xn--3hcrj9c";a:0:{}s:12:"xn--45br5cyl";a:0:{}s:14:"xn--h2breg3eve";a:0:{}s:13:"xn--h2brj9c8c";a:0:{}s:12:"xn--mgbgu82a";a:0:{}s:14:"xn--rvc1e0am3e";a:0:{}s:11:"xn--h2brj9c";a:0:{}s:14:"xn--mgbbh1a71e";a:0:{}s:13:"xn--fpcrj9c3d";a:0:{}s:11:"xn--gecrj9c";a:0:{}s:11:"xn--s9brj9c";a:0:{}s:11:"xn--45brj9c";a:0:{}s:17:"xn--xkc2dl3a5ee0h";a:0:{}s:15:"xn--mgba3a4f16a";a:0:{}s:14:"xn--mgba3a4fra";a:0:{}s:11:"xn--mgbtx2b";a:0:{}s:14:"xn--mgbayh7gpa";a:0:{}s:12:"xn--3e0b707e";a:0:{}s:11:"xn--80ao21a";a:0:{}s:13:"xn--fzc2c9e2c";a:0:{}s:16:"xn--xkc2al3hye2a";a:0:{}s:15:"xn--mgbc0a9azcg";a:0:{}s:9:"xn--d1alf";a:0:{}s:9:"xn--l1acc";a:0:{}s:11:"xn--mix891f";a:0:{}s:11:"xn--mix082f";a:0:{}s:14:"xn--mgbx4cd0ab";a:0:{}s:12:"xn--mgb9awbf";a:0:{}s:17:"xn--mgbai9azgqp6j";a:0:{}s:18:"xn--mgbai9a5eva00b";a:0:{}s:13:"xn--ygbi2ammx";a:0:{}s:10:"xn--90a3ac";a:6:{s:8:"xn--o1ac";a:0:{}s:9:"xn--c1avg";a:0:{}s:9:"xn--90azh";a:0:{}s:8:"xn--d1at";a:0:{}s:9:"xn--o1ach";a:0:{}s:8:"xn--80au";a:0:{}}s:8:"xn--p1ai";a:0:{}s:10:"xn--wgbl6a";a:0:{}s:17:"xn--mgberp4a5d4ar";a:0:{}s:19:"xn--mgberp4a5d4a87g";a:0:{}s:19:"xn--mgbqly7c0a67fbc";a:0:{}s:16:"xn--mgbqly7cvafr";a:0:{}s:12:"xn--mgbpl2fh";a:0:{}s:13:"xn--yfro4i67o";a:0:{}s:22:"xn--clchc0ea0b2g2a9gcd";a:0:{}s:12:"xn--ogbpf8fl";a:0:{}s:12:"xn--mgbtf8fl";a:0:{}s:10:"xn--o3cw4h";a:6:{s:13:"xn--12c1fe0br";a:0:{}s:16:"xn--12co0c3b4eva";a:0:{}s:13:"xn--h3cuzk1di";a:0:{}s:11:"xn--o3cyx2a";a:0:{}s:12:"xn--m3ch0j3a";a:0:{}s:15:"xn--12cfi8ixb8l";a:0:{}}s:11:"xn--pgbs0dh";a:0:{}s:11:"xn--kpry57d";a:0:{}s:11:"xn--kprw13d";a:0:{}s:11:"xn--nnx388a";a:0:{}s:9:"xn--j1amh";a:0:{}s:12:"xn--mgb2ddes";a:0:{}s:3:"xxx";a:0:{}s:2:"ye";a:1:{s:1:"*";a:0:{}}s:2:"za";a:17:{s:2:"ac";a:0:{}s:5:"agric";a:0:{}s:3:"alt";a:0:{}s:2:"co";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:7:"grondar";a:0:{}s:3:"law";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"ngo";a:0:{}s:3:"nis";a:0:{}s:3:"nom";a:0:{}s:3:"org";a:0:{}s:6:"school";a:0:{}s:2:"tm";a:0:{}s:3:"web";a:0:{}}s:2:"zm";a:11:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sch";a:0:{}}s:2:"zw";a:5:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"org";a:0:{}}s:3:"aaa";a:0:{}s:4:"aarp";a:0:{}s:6:"abarth";a:0:{}s:3:"abb";a:0:{}s:6:"abbott";a:0:{}s:6:"abbvie";a:0:{}s:3:"abc";a:0:{}s:4:"able";a:0:{}s:7:"abogado";a:0:{}s:8:"abudhabi";a:0:{}s:7:"academy";a:0:{}s:9:"accenture";a:0:{}s:10:"accountant";a:0:{}s:11:"accountants";a:0:{}s:3:"aco";a:0:{}s:6:"active";a:0:{}s:5:"actor";a:0:{}s:4:"adac";a:0:{}s:3:"ads";a:0:{}s:5:"adult";a:0:{}s:3:"aeg";a:0:{}s:5:"aetna";a:0:{}s:14:"afamilycompany";a:0:{}s:3:"afl";a:0:{}s:6:"africa";a:0:{}s:7:"agakhan";a:0:{}s:6:"agency";a:0:{}s:3:"aig";a:0:{}s:4:"aigo";a:0:{}s:6:"airbus";a:0:{}s:8:"airforce";a:0:{}s:6:"airtel";a:0:{}s:4:"akdn";a:0:{}s:9:"alfaromeo";a:0:{}s:7:"alibaba";a:0:{}s:6:"alipay";a:0:{}s:9:"allfinanz";a:0:{}s:8:"allstate";a:0:{}s:4:"ally";a:0:{}s:6:"alsace";a:0:{}s:6:"alstom";a:0:{}s:15:"americanexpress";a:0:{}s:14:"americanfamily";a:0:{}s:4:"amex";a:0:{}s:5:"amfam";a:0:{}s:5:"amica";a:0:{}s:9:"amsterdam";a:0:{}s:9:"analytics";a:0:{}s:7:"android";a:0:{}s:6:"anquan";a:0:{}s:3:"anz";a:0:{}s:3:"aol";a:0:{}s:10:"apartments";a:0:{}s:3:"app";a:0:{}s:5:"apple";a:0:{}s:9:"aquarelle";a:0:{}s:4:"arab";a:0:{}s:6:"aramco";a:0:{}s:5:"archi";a:0:{}s:4:"army";a:0:{}s:3:"art";a:0:{}s:4:"arte";a:0:{}s:4:"asda";a:0:{}s:10:"associates";a:0:{}s:7:"athleta";a:0:{}s:8:"attorney";a:0:{}s:7:"auction";a:0:{}s:4:"audi";a:0:{}s:7:"audible";a:0:{}s:5:"audio";a:0:{}s:7:"auspost";a:0:{}s:6:"author";a:0:{}s:4:"auto";a:0:{}s:5:"autos";a:0:{}s:7:"avianca";a:0:{}s:3:"aws";a:0:{}s:3:"axa";a:0:{}s:5:"azure";a:0:{}s:4:"baby";a:0:{}s:5:"baidu";a:0:{}s:7:"banamex";a:0:{}s:14:"bananarepublic";a:0:{}s:4:"band";a:0:{}s:4:"bank";a:0:{}s:3:"bar";a:0:{}s:9:"barcelona";a:0:{}s:11:"barclaycard";a:0:{}s:8:"barclays";a:0:{}s:8:"barefoot";a:0:{}s:8:"bargains";a:0:{}s:8:"baseball";a:0:{}s:10:"basketball";a:0:{}s:7:"bauhaus";a:0:{}s:6:"bayern";a:0:{}s:3:"bbc";a:0:{}s:3:"bbt";a:0:{}s:4:"bbva";a:0:{}s:3:"bcg";a:0:{}s:3:"bcn";a:0:{}s:5:"beats";a:0:{}s:6:"beauty";a:0:{}s:4:"beer";a:0:{}s:7:"bentley";a:0:{}s:6:"berlin";a:0:{}s:4:"best";a:0:{}s:7:"bestbuy";a:0:{}s:3:"bet";a:0:{}s:6:"bharti";a:0:{}s:5:"bible";a:0:{}s:3:"bid";a:0:{}s:4:"bike";a:0:{}s:4:"bing";a:0:{}s:5:"bingo";a:0:{}s:3:"bio";a:0:{}s:5:"black";a:0:{}s:11:"blackfriday";a:0:{}s:6:"blanco";a:0:{}s:11:"blockbuster";a:0:{}s:4:"blog";a:0:{}s:9:"bloomberg";a:0:{}s:4:"blue";a:0:{}s:3:"bms";a:0:{}s:3:"bmw";a:0:{}s:3:"bnl";a:0:{}s:10:"bnpparibas";a:0:{}s:5:"boats";a:0:{}s:10:"boehringer";a:0:{}s:4:"bofa";a:0:{}s:3:"bom";a:0:{}s:4:"bond";a:0:{}s:3:"boo";a:0:{}s:4:"book";a:0:{}s:7:"booking";a:0:{}s:5:"boots";a:0:{}s:5:"bosch";a:0:{}s:6:"bostik";a:0:{}s:6:"boston";a:0:{}s:3:"bot";a:0:{}s:8:"boutique";a:0:{}s:3:"box";a:0:{}s:8:"bradesco";a:0:{}s:11:"bridgestone";a:0:{}s:8:"broadway";a:0:{}s:6:"broker";a:0:{}s:7:"brother";a:0:{}s:8:"brussels";a:0:{}s:8:"budapest";a:0:{}s:7:"bugatti";a:0:{}s:5:"build";a:0:{}s:8:"builders";a:0:{}s:8:"business";a:0:{}s:3:"buy";a:0:{}s:4:"buzz";a:0:{}s:3:"bzh";a:0:{}s:3:"cab";a:0:{}s:4:"cafe";a:0:{}s:3:"cal";a:0:{}s:4:"call";a:0:{}s:11:"calvinklein";a:0:{}s:3:"cam";a:0:{}s:6:"camera";a:0:{}s:4:"camp";a:0:{}s:14:"cancerresearch";a:0:{}s:5:"canon";a:0:{}s:8:"capetown";a:0:{}s:7:"capital";a:0:{}s:10:"capitalone";a:0:{}s:3:"car";a:0:{}s:7:"caravan";a:0:{}s:5:"cards";a:0:{}s:4:"care";a:0:{}s:6:"career";a:0:{}s:7:"careers";a:0:{}s:4:"cars";a:0:{}s:7:"cartier";a:0:{}s:4:"casa";a:0:{}s:4:"case";a:0:{}s:6:"caseih";a:0:{}s:4:"cash";a:0:{}s:6:"casino";a:0:{}s:8:"catering";a:0:{}s:8:"catholic";a:0:{}s:3:"cba";a:0:{}s:3:"cbn";a:0:{}s:4:"cbre";a:0:{}s:3:"cbs";a:0:{}s:3:"ceb";a:0:{}s:6:"center";a:0:{}s:3:"ceo";a:0:{}s:4:"cern";a:0:{}s:3:"cfa";a:0:{}s:3:"cfd";a:0:{}s:6:"chanel";a:0:{}s:7:"channel";a:0:{}s:5:"chase";a:0:{}s:4:"chat";a:0:{}s:5:"cheap";a:0:{}s:7:"chintai";a:0:{}s:5:"chloe";a:0:{}s:9:"christmas";a:0:{}s:6:"chrome";a:0:{}s:8:"chrysler";a:0:{}s:6:"church";a:0:{}s:8:"cipriani";a:0:{}s:6:"circle";a:0:{}s:5:"cisco";a:0:{}s:7:"citadel";a:0:{}s:4:"citi";a:0:{}s:5:"citic";a:0:{}s:4:"city";a:0:{}s:8:"cityeats";a:0:{}s:6:"claims";a:0:{}s:8:"cleaning";a:0:{}s:5:"click";a:0:{}s:6:"clinic";a:0:{}s:8:"clinique";a:0:{}s:8:"clothing";a:0:{}s:5:"cloud";a:0:{}s:4:"club";a:0:{}s:7:"clubmed";a:0:{}s:5:"coach";a:0:{}s:5:"codes";a:0:{}s:6:"coffee";a:0:{}s:7:"college";a:0:{}s:7:"cologne";a:0:{}s:7:"comcast";a:0:{}s:8:"commbank";a:0:{}s:9:"community";a:0:{}s:7:"company";a:0:{}s:7:"compare";a:0:{}s:8:"computer";a:0:{}s:6:"comsec";a:0:{}s:6:"condos";a:0:{}s:12:"construction";a:0:{}s:10:"consulting";a:0:{}s:7:"contact";a:0:{}s:11:"contractors";a:0:{}s:7:"cooking";a:0:{}s:14:"cookingchannel";a:0:{}s:4:"cool";a:0:{}s:7:"corsica";a:0:{}s:7:"country";a:0:{}s:6:"coupon";a:0:{}s:7:"coupons";a:0:{}s:7:"courses";a:0:{}s:6:"credit";a:0:{}s:10:"creditcard";a:0:{}s:11:"creditunion";a:0:{}s:7:"cricket";a:0:{}s:5:"crown";a:0:{}s:3:"crs";a:0:{}s:6:"cruise";a:0:{}s:7:"cruises";a:0:{}s:3:"csc";a:0:{}s:10:"cuisinella";a:0:{}s:5:"cymru";a:0:{}s:4:"cyou";a:0:{}s:5:"dabur";a:0:{}s:3:"dad";a:0:{}s:5:"dance";a:0:{}s:4:"data";a:0:{}s:4:"date";a:0:{}s:6:"dating";a:0:{}s:6:"datsun";a:0:{}s:3:"day";a:0:{}s:4:"dclk";a:0:{}s:3:"dds";a:0:{}s:4:"deal";a:0:{}s:6:"dealer";a:0:{}s:5:"deals";a:0:{}s:6:"degree";a:0:{}s:8:"delivery";a:0:{}s:4:"dell";a:0:{}s:8:"deloitte";a:0:{}s:5:"delta";a:0:{}s:8:"democrat";a:0:{}s:6:"dental";a:0:{}s:7:"dentist";a:0:{}s:4:"desi";a:0:{}s:6:"design";a:0:{}s:3:"dev";a:0:{}s:3:"dhl";a:0:{}s:8:"diamonds";a:0:{}s:4:"diet";a:0:{}s:7:"digital";a:0:{}s:6:"direct";a:0:{}s:9:"directory";a:0:{}s:8:"discount";a:0:{}s:8:"discover";a:0:{}s:4:"dish";a:0:{}s:3:"diy";a:0:{}s:3:"dnp";a:0:{}s:4:"docs";a:0:{}s:6:"doctor";a:0:{}s:5:"dodge";a:0:{}s:3:"dog";a:0:{}s:4:"doha";a:0:{}s:7:"domains";a:0:{}s:3:"dot";a:0:{}s:8:"download";a:0:{}s:5:"drive";a:0:{}s:3:"dtv";a:0:{}s:5:"dubai";a:0:{}s:4:"duck";a:0:{}s:6:"dunlop";a:0:{}s:4:"duns";a:0:{}s:6:"dupont";a:0:{}s:6:"durban";a:0:{}s:4:"dvag";a:0:{}s:3:"dvr";a:0:{}s:5:"earth";a:0:{}s:3:"eat";a:0:{}s:3:"eco";a:0:{}s:5:"edeka";a:0:{}s:9:"education";a:0:{}s:5:"email";a:0:{}s:6:"emerck";a:0:{}s:6:"energy";a:0:{}s:8:"engineer";a:0:{}s:11:"engineering";a:0:{}s:11:"enterprises";a:0:{}s:5:"epost";a:0:{}s:5:"epson";a:0:{}s:9:"equipment";a:0:{}s:8:"ericsson";a:0:{}s:4:"erni";a:0:{}s:3:"esq";a:0:{}s:6:"estate";a:0:{}s:8:"esurance";a:0:{}s:8:"etisalat";a:0:{}s:10:"eurovision";a:0:{}s:3:"eus";a:0:{}s:6:"events";a:0:{}s:8:"everbank";a:0:{}s:8:"exchange";a:0:{}s:6:"expert";a:0:{}s:7:"exposed";a:0:{}s:7:"express";a:0:{}s:10:"extraspace";a:0:{}s:4:"fage";a:0:{}s:4:"fail";a:0:{}s:9:"fairwinds";a:0:{}s:5:"faith";a:0:{}s:6:"family";a:0:{}s:3:"fan";a:0:{}s:4:"fans";a:0:{}s:4:"farm";a:0:{}s:7:"farmers";a:0:{}s:7:"fashion";a:0:{}s:4:"fast";a:0:{}s:5:"fedex";a:0:{}s:8:"feedback";a:0:{}s:7:"ferrari";a:0:{}s:7:"ferrero";a:0:{}s:4:"fiat";a:0:{}s:8:"fidelity";a:0:{}s:4:"fido";a:0:{}s:4:"film";a:0:{}s:5:"final";a:0:{}s:7:"finance";a:0:{}s:9:"financial";a:0:{}s:4:"fire";a:0:{}s:9:"firestone";a:0:{}s:8:"firmdale";a:0:{}s:4:"fish";a:0:{}s:7:"fishing";a:0:{}s:3:"fit";a:0:{}s:7:"fitness";a:0:{}s:6:"flickr";a:0:{}s:7:"flights";a:0:{}s:4:"flir";a:0:{}s:7:"florist";a:0:{}s:7:"flowers";a:0:{}s:3:"fly";a:0:{}s:3:"foo";a:0:{}s:4:"food";a:0:{}s:11:"foodnetwork";a:0:{}s:8:"football";a:0:{}s:4:"ford";a:0:{}s:5:"forex";a:0:{}s:7:"forsale";a:0:{}s:5:"forum";a:0:{}s:10:"foundation";a:0:{}s:3:"fox";a:0:{}s:4:"free";a:0:{}s:9:"fresenius";a:0:{}s:3:"frl";a:0:{}s:7:"frogans";a:0:{}s:9:"frontdoor";a:0:{}s:8:"frontier";a:0:{}s:3:"ftr";a:0:{}s:7:"fujitsu";a:0:{}s:9:"fujixerox";a:0:{}s:3:"fun";a:0:{}s:4:"fund";a:0:{}s:9:"furniture";a:0:{}s:6:"futbol";a:0:{}s:3:"fyi";a:0:{}s:3:"gal";a:0:{}s:7:"gallery";a:0:{}s:5:"gallo";a:0:{}s:6:"gallup";a:0:{}s:4:"game";a:0:{}s:5:"games";a:0:{}s:3:"gap";a:0:{}s:6:"garden";a:0:{}s:4:"gbiz";a:0:{}s:3:"gdn";a:0:{}s:3:"gea";a:0:{}s:4:"gent";a:0:{}s:7:"genting";a:0:{}s:6:"george";a:0:{}s:4:"ggee";a:0:{}s:4:"gift";a:0:{}s:5:"gifts";a:0:{}s:5:"gives";a:0:{}s:6:"giving";a:0:{}s:5:"glade";a:0:{}s:5:"glass";a:0:{}s:3:"gle";a:0:{}s:6:"global";a:0:{}s:5:"globo";a:0:{}s:5:"gmail";a:0:{}s:4:"gmbh";a:0:{}s:3:"gmo";a:0:{}s:3:"gmx";a:0:{}s:7:"godaddy";a:0:{}s:4:"gold";a:0:{}s:9:"goldpoint";a:0:{}s:4:"golf";a:0:{}s:3:"goo";a:0:{}s:9:"goodhands";a:0:{}s:8:"goodyear";a:0:{}s:4:"goog";a:0:{}s:6:"google";a:0:{}s:3:"gop";a:0:{}s:3:"got";a:0:{}s:8:"grainger";a:0:{}s:8:"graphics";a:0:{}s:6:"gratis";a:0:{}s:5:"green";a:0:{}s:5:"gripe";a:0:{}s:7:"grocery";a:0:{}s:5:"group";a:0:{}s:8:"guardian";a:0:{}s:5:"gucci";a:0:{}s:4:"guge";a:0:{}s:5:"guide";a:0:{}s:7:"guitars";a:0:{}s:4:"guru";a:0:{}s:4:"hair";a:0:{}s:7:"hamburg";a:0:{}s:7:"hangout";a:0:{}s:4:"haus";a:0:{}s:3:"hbo";a:0:{}s:4:"hdfc";a:0:{}s:8:"hdfcbank";a:0:{}s:6:"health";a:0:{}s:10:"healthcare";a:0:{}s:4:"help";a:0:{}s:8:"helsinki";a:0:{}s:4:"here";a:0:{}s:6:"hermes";a:0:{}s:4:"hgtv";a:0:{}s:6:"hiphop";a:0:{}s:9:"hisamitsu";a:0:{}s:7:"hitachi";a:0:{}s:3:"hiv";a:0:{}s:3:"hkt";a:0:{}s:6:"hockey";a:0:{}s:8:"holdings";a:0:{}s:7:"holiday";a:0:{}s:9:"homedepot";a:0:{}s:9:"homegoods";a:0:{}s:5:"homes";a:0:{}s:9:"homesense";a:0:{}s:5:"honda";a:0:{}s:9:"honeywell";a:0:{}s:5:"horse";a:0:{}s:8:"hospital";a:0:{}s:4:"host";a:0:{}s:7:"hosting";a:0:{}s:3:"hot";a:0:{}s:7:"hoteles";a:0:{}s:6:"hotels";a:0:{}s:7:"hotmail";a:0:{}s:5:"house";a:0:{}s:3:"how";a:0:{}s:4:"hsbc";a:0:{}s:3:"htc";a:0:{}s:6:"hughes";a:0:{}s:5:"hyatt";a:0:{}s:7:"hyundai";a:0:{}s:3:"ibm";a:0:{}s:4:"icbc";a:0:{}s:3:"ice";a:0:{}s:3:"icu";a:0:{}s:4:"ieee";a:0:{}s:3:"ifm";a:0:{}s:5:"ikano";a:0:{}s:6:"imamat";a:0:{}s:4:"imdb";a:0:{}s:4:"immo";a:0:{}s:10:"immobilien";a:0:{}s:10:"industries";a:0:{}s:8:"infiniti";a:0:{}s:3:"ing";a:0:{}s:3:"ink";a:0:{}s:9:"institute";a:0:{}s:9:"insurance";a:0:{}s:6:"insure";a:0:{}s:5:"intel";a:0:{}s:13:"international";a:0:{}s:6:"intuit";a:0:{}s:11:"investments";a:0:{}s:8:"ipiranga";a:0:{}s:5:"irish";a:0:{}s:7:"iselect";a:0:{}s:7:"ismaili";a:0:{}s:3:"ist";a:0:{}s:8:"istanbul";a:0:{}s:4:"itau";a:0:{}s:3:"itv";a:0:{}s:5:"iveco";a:0:{}s:3:"iwc";a:0:{}s:6:"jaguar";a:0:{}s:4:"java";a:0:{}s:3:"jcb";a:0:{}s:3:"jcp";a:0:{}s:4:"jeep";a:0:{}s:5:"jetzt";a:0:{}s:7:"jewelry";a:0:{}s:3:"jio";a:0:{}s:3:"jlc";a:0:{}s:3:"jll";a:0:{}s:3:"jmp";a:0:{}s:3:"jnj";a:0:{}s:6:"joburg";a:0:{}s:3:"jot";a:0:{}s:3:"joy";a:0:{}s:8:"jpmorgan";a:0:{}s:4:"jprs";a:0:{}s:6:"juegos";a:0:{}s:7:"juniper";a:0:{}s:6:"kaufen";a:0:{}s:4:"kddi";a:0:{}s:11:"kerryhotels";a:0:{}s:14:"kerrylogistics";a:0:{}s:15:"kerryproperties";a:0:{}s:3:"kfh";a:0:{}s:3:"kia";a:0:{}s:3:"kim";a:0:{}s:6:"kinder";a:0:{}s:6:"kindle";a:0:{}s:7:"kitchen";a:0:{}s:4:"kiwi";a:0:{}s:5:"koeln";a:0:{}s:7:"komatsu";a:0:{}s:6:"kosher";a:0:{}s:4:"kpmg";a:0:{}s:3:"kpn";a:0:{}s:3:"krd";a:0:{}s:4:"kred";a:0:{}s:9:"kuokgroup";a:0:{}s:5:"kyoto";a:0:{}s:7:"lacaixa";a:0:{}s:9:"ladbrokes";a:0:{}s:11:"lamborghini";a:0:{}s:5:"lamer";a:0:{}s:9:"lancaster";a:0:{}s:6:"lancia";a:0:{}s:7:"lancome";a:0:{}s:4:"land";a:0:{}s:9:"landrover";a:0:{}s:7:"lanxess";a:0:{}s:7:"lasalle";a:0:{}s:3:"lat";a:0:{}s:6:"latino";a:0:{}s:7:"latrobe";a:0:{}s:3:"law";a:0:{}s:6:"lawyer";a:0:{}s:3:"lds";a:0:{}s:5:"lease";a:0:{}s:7:"leclerc";a:0:{}s:6:"lefrak";a:0:{}s:5:"legal";a:0:{}s:4:"lego";a:0:{}s:5:"lexus";a:0:{}s:4:"lgbt";a:0:{}s:7:"liaison";a:0:{}s:4:"lidl";a:0:{}s:4:"life";a:0:{}s:13:"lifeinsurance";a:0:{}s:9:"lifestyle";a:0:{}s:8:"lighting";a:0:{}s:4:"like";a:0:{}s:5:"lilly";a:0:{}s:7:"limited";a:0:{}s:4:"limo";a:0:{}s:7:"lincoln";a:0:{}s:5:"linde";a:0:{}s:4:"link";a:0:{}s:5:"lipsy";a:0:{}s:4:"live";a:0:{}s:6:"living";a:0:{}s:5:"lixil";a:0:{}s:4:"loan";a:0:{}s:5:"loans";a:0:{}s:6:"locker";a:0:{}s:5:"locus";a:0:{}s:4:"loft";a:0:{}s:3:"lol";a:0:{}s:6:"london";a:0:{}s:5:"lotte";a:0:{}s:5:"lotto";a:0:{}s:4:"love";a:0:{}s:3:"lpl";a:0:{}s:12:"lplfinancial";a:0:{}s:3:"ltd";a:0:{}s:4:"ltda";a:0:{}s:8:"lundbeck";a:0:{}s:5:"lupin";a:0:{}s:4:"luxe";a:0:{}s:6:"luxury";a:0:{}s:5:"macys";a:0:{}s:6:"madrid";a:0:{}s:4:"maif";a:0:{}s:6:"maison";a:0:{}s:6:"makeup";a:0:{}s:3:"man";a:0:{}s:10:"management";a:0:{}s:5:"mango";a:0:{}s:3:"map";a:0:{}s:6:"market";a:0:{}s:9:"marketing";a:0:{}s:7:"markets";a:0:{}s:8:"marriott";a:0:{}s:9:"marshalls";a:0:{}s:8:"maserati";a:0:{}s:6:"mattel";a:0:{}s:3:"mba";a:0:{}s:3:"mcd";a:0:{}s:9:"mcdonalds";a:0:{}s:8:"mckinsey";a:0:{}s:3:"med";a:0:{}s:5:"media";a:0:{}s:4:"meet";a:0:{}s:9:"melbourne";a:0:{}s:4:"meme";a:0:{}s:8:"memorial";a:0:{}s:3:"men";a:0:{}s:4:"menu";a:0:{}s:3:"meo";a:0:{}s:8:"merckmsd";a:0:{}s:7:"metlife";a:0:{}s:5:"miami";a:0:{}s:9:"microsoft";a:0:{}s:4:"mini";a:0:{}s:4:"mint";a:0:{}s:3:"mit";a:0:{}s:10:"mitsubishi";a:0:{}s:3:"mlb";a:0:{}s:3:"mls";a:0:{}s:3:"mma";a:0:{}s:6:"mobile";a:0:{}s:6:"mobily";a:0:{}s:4:"moda";a:0:{}s:3:"moe";a:0:{}s:3:"moi";a:0:{}s:3:"mom";a:0:{}s:6:"monash";a:0:{}s:5:"money";a:0:{}s:7:"monster";a:0:{}s:9:"montblanc";a:0:{}s:5:"mopar";a:0:{}s:6:"mormon";a:0:{}s:8:"mortgage";a:0:{}s:6:"moscow";a:0:{}s:4:"moto";a:0:{}s:11:"motorcycles";a:0:{}s:3:"mov";a:0:{}s:5:"movie";a:0:{}s:8:"movistar";a:0:{}s:3:"msd";a:0:{}s:3:"mtn";a:0:{}s:4:"mtpc";a:0:{}s:3:"mtr";a:0:{}s:6:"mutual";a:0:{}s:3:"nab";a:0:{}s:5:"nadex";a:0:{}s:6:"nagoya";a:0:{}s:10:"nationwide";a:0:{}s:6:"natura";a:0:{}s:4:"navy";a:0:{}s:3:"nba";a:0:{}s:3:"nec";a:0:{}s:7:"netbank";a:0:{}s:7:"netflix";a:0:{}s:7:"network";a:0:{}s:7:"neustar";a:0:{}s:3:"new";a:0:{}s:10:"newholland";a:0:{}s:4:"news";a:0:{}s:4:"next";a:0:{}s:10:"nextdirect";a:0:{}s:5:"nexus";a:0:{}s:3:"nfl";a:0:{}s:3:"ngo";a:0:{}s:3:"nhk";a:0:{}s:4:"nico";a:0:{}s:4:"nike";a:0:{}s:5:"nikon";a:0:{}s:5:"ninja";a:0:{}s:6:"nissan";a:0:{}s:6:"nissay";a:0:{}s:5:"nokia";a:0:{}s:18:"northwesternmutual";a:0:{}s:6:"norton";a:0:{}s:3:"now";a:0:{}s:6:"nowruz";a:0:{}s:5:"nowtv";a:0:{}s:3:"nra";a:0:{}s:3:"nrw";a:0:{}s:3:"ntt";a:0:{}s:3:"nyc";a:0:{}s:3:"obi";a:0:{}s:8:"observer";a:0:{}s:3:"off";a:0:{}s:6:"office";a:0:{}s:7:"okinawa";a:0:{}s:6:"olayan";a:0:{}s:11:"olayangroup";a:0:{}s:7:"oldnavy";a:0:{}s:4:"ollo";a:0:{}s:5:"omega";a:0:{}s:3:"one";a:0:{}s:3:"ong";a:0:{}s:3:"onl";a:0:{}s:6:"online";a:0:{}s:10:"onyourside";a:0:{}s:3:"ooo";a:0:{}s:4:"open";a:0:{}s:6:"oracle";a:0:{}s:6:"orange";a:0:{}s:7:"organic";a:0:{}s:7:"origins";a:0:{}s:5:"osaka";a:0:{}s:6:"otsuka";a:0:{}s:3:"ott";a:0:{}s:3:"ovh";a:0:{}s:4:"page";a:0:{}s:12:"pamperedchef";a:0:{}s:9:"panasonic";a:0:{}s:7:"panerai";a:0:{}s:5:"paris";a:0:{}s:4:"pars";a:0:{}s:8:"partners";a:0:{}s:5:"parts";a:0:{}s:5:"party";a:0:{}s:9:"passagens";a:0:{}s:3:"pay";a:0:{}s:4:"pccw";a:0:{}s:3:"pet";a:0:{}s:6:"pfizer";a:0:{}s:8:"pharmacy";a:0:{}s:3:"phd";a:0:{}s:7:"philips";a:0:{}s:5:"phone";a:0:{}s:5:"photo";a:0:{}s:11:"photography";a:0:{}s:6:"photos";a:0:{}s:6:"physio";a:0:{}s:6:"piaget";a:0:{}s:4:"pics";a:0:{}s:6:"pictet";a:0:{}s:8:"pictures";a:0:{}s:3:"pid";a:0:{}s:3:"pin";a:0:{}s:4:"ping";a:0:{}s:4:"pink";a:0:{}s:7:"pioneer";a:0:{}s:5:"pizza";a:0:{}s:5:"place";a:0:{}s:4:"play";a:0:{}s:11:"playstation";a:0:{}s:8:"plumbing";a:0:{}s:4:"plus";a:0:{}s:3:"pnc";a:0:{}s:4:"pohl";a:0:{}s:5:"poker";a:0:{}s:7:"politie";a:0:{}s:4:"porn";a:0:{}s:9:"pramerica";a:0:{}s:5:"praxi";a:0:{}s:5:"press";a:0:{}s:5:"prime";a:0:{}s:4:"prod";a:0:{}s:11:"productions";a:0:{}s:4:"prof";a:0:{}s:11:"progressive";a:0:{}s:5:"promo";a:0:{}s:10:"properties";a:0:{}s:8:"property";a:0:{}s:10:"protection";a:0:{}s:3:"pru";a:0:{}s:10:"prudential";a:0:{}s:3:"pub";a:0:{}s:3:"pwc";a:0:{}s:4:"qpon";a:0:{}s:6:"quebec";a:0:{}s:5:"quest";a:0:{}s:3:"qvc";a:0:{}s:6:"racing";a:0:{}s:5:"radio";a:0:{}s:4:"raid";a:0:{}s:4:"read";a:0:{}s:10:"realestate";a:0:{}s:7:"realtor";a:0:{}s:6:"realty";a:0:{}s:7:"recipes";a:0:{}s:3:"red";a:0:{}s:8:"redstone";a:0:{}s:11:"redumbrella";a:0:{}s:5:"rehab";a:0:{}s:5:"reise";a:0:{}s:6:"reisen";a:0:{}s:4:"reit";a:0:{}s:8:"reliance";a:0:{}s:3:"ren";a:0:{}s:4:"rent";a:0:{}s:7:"rentals";a:0:{}s:6:"repair";a:0:{}s:6:"report";a:0:{}s:10:"republican";a:0:{}s:4:"rest";a:0:{}s:10:"restaurant";a:0:{}s:6:"review";a:0:{}s:7:"reviews";a:0:{}s:7:"rexroth";a:0:{}s:4:"rich";a:0:{}s:9:"richardli";a:0:{}s:5:"ricoh";a:0:{}s:11:"rightathome";a:0:{}s:3:"ril";a:0:{}s:3:"rio";a:0:{}s:3:"rip";a:0:{}s:4:"rmit";a:0:{}s:6:"rocher";a:0:{}s:5:"rocks";a:0:{}s:5:"rodeo";a:0:{}s:6:"rogers";a:0:{}s:4:"room";a:0:{}s:4:"rsvp";a:0:{}s:5:"rugby";a:0:{}s:4:"ruhr";a:0:{}s:3:"run";a:0:{}s:3:"rwe";a:0:{}s:6:"ryukyu";a:0:{}s:8:"saarland";a:0:{}s:4:"safe";a:0:{}s:6:"safety";a:0:{}s:6:"sakura";a:0:{}s:4:"sale";a:0:{}s:5:"salon";a:0:{}s:8:"samsclub";a:0:{}s:7:"samsung";a:0:{}s:7:"sandvik";a:0:{}s:15:"sandvikcoromant";a:0:{}s:6:"sanofi";a:0:{}s:3:"sap";a:0:{}s:4:"sapo";a:0:{}s:4:"sarl";a:0:{}s:3:"sas";a:0:{}s:4:"save";a:0:{}s:4:"saxo";a:0:{}s:3:"sbi";a:0:{}s:3:"sbs";a:0:{}s:3:"sca";a:0:{}s:3:"scb";a:0:{}s:10:"schaeffler";a:0:{}s:7:"schmidt";a:0:{}s:12:"scholarships";a:0:{}s:6:"school";a:0:{}s:6:"schule";a:0:{}s:7:"schwarz";a:0:{}s:7:"science";a:0:{}s:9:"scjohnson";a:0:{}s:4:"scor";a:0:{}s:4:"scot";a:0:{}s:6:"search";a:0:{}s:4:"seat";a:0:{}s:6:"secure";a:0:{}s:8:"security";a:0:{}s:4:"seek";a:0:{}s:6:"select";a:0:{}s:5:"sener";a:0:{}s:8:"services";a:0:{}s:3:"ses";a:0:{}s:5:"seven";a:0:{}s:3:"sew";a:0:{}s:3:"sex";a:0:{}s:4:"sexy";a:0:{}s:3:"sfr";a:0:{}s:9:"shangrila";a:0:{}s:5:"sharp";a:0:{}s:4:"shaw";a:0:{}s:5:"shell";a:0:{}s:4:"shia";a:0:{}s:7:"shiksha";a:0:{}s:5:"shoes";a:0:{}s:4:"shop";a:0:{}s:8:"shopping";a:0:{}s:6:"shouji";a:0:{}s:4:"show";a:0:{}s:8:"showtime";a:0:{}s:7:"shriram";a:0:{}s:4:"silk";a:0:{}s:4:"sina";a:0:{}s:7:"singles";a:0:{}s:4:"site";a:0:{}s:3:"ski";a:0:{}s:4:"skin";a:0:{}s:3:"sky";a:0:{}s:5:"skype";a:0:{}s:5:"sling";a:0:{}s:5:"smart";a:0:{}s:5:"smile";a:0:{}s:4:"sncf";a:0:{}s:6:"soccer";a:0:{}s:6:"social";a:0:{}s:8:"softbank";a:0:{}s:8:"software";a:0:{}s:4:"sohu";a:0:{}s:5:"solar";a:0:{}s:9:"solutions";a:0:{}s:4:"song";a:0:{}s:4:"sony";a:0:{}s:3:"soy";a:0:{}s:5:"space";a:0:{}s:7:"spiegel";a:0:{}s:4:"spot";a:0:{}s:13:"spreadbetting";a:0:{}s:3:"srl";a:0:{}s:3:"srt";a:0:{}s:5:"stada";a:0:{}s:7:"staples";a:0:{}s:4:"star";a:0:{}s:7:"starhub";a:0:{}s:9:"statebank";a:0:{}s:9:"statefarm";a:0:{}s:7:"statoil";a:0:{}s:3:"stc";a:0:{}s:8:"stcgroup";a:0:{}s:9:"stockholm";a:0:{}s:7:"storage";a:0:{}s:5:"store";a:0:{}s:6:"stream";a:0:{}s:6:"studio";a:0:{}s:5:"study";a:0:{}s:5:"style";a:0:{}s:5:"sucks";a:0:{}s:8:"supplies";a:0:{}s:6:"supply";a:0:{}s:7:"support";a:0:{}s:4:"surf";a:0:{}s:7:"surgery";a:0:{}s:6:"suzuki";a:0:{}s:6:"swatch";a:0:{}s:10:"swiftcover";a:0:{}s:5:"swiss";a:0:{}s:6:"sydney";a:0:{}s:8:"symantec";a:0:{}s:7:"systems";a:0:{}s:3:"tab";a:0:{}s:6:"taipei";a:0:{}s:4:"talk";a:0:{}s:6:"taobao";a:0:{}s:6:"target";a:0:{}s:10:"tatamotors";a:0:{}s:5:"tatar";a:0:{}s:6:"tattoo";a:0:{}s:3:"tax";a:0:{}s:4:"taxi";a:0:{}s:3:"tci";a:0:{}s:3:"tdk";a:0:{}s:4:"team";a:0:{}s:4:"tech";a:0:{}s:10:"technology";a:0:{}s:8:"telecity";a:0:{}s:10:"telefonica";a:0:{}s:7:"temasek";a:0:{}s:6:"tennis";a:0:{}s:4:"teva";a:0:{}s:3:"thd";a:0:{}s:7:"theater";a:0:{}s:7:"theatre";a:0:{}s:4:"tiaa";a:0:{}s:7:"tickets";a:0:{}s:6:"tienda";a:0:{}s:7:"tiffany";a:0:{}s:4:"tips";a:0:{}s:5:"tires";a:0:{}s:5:"tirol";a:0:{}s:6:"tjmaxx";a:0:{}s:3:"tjx";a:0:{}s:6:"tkmaxx";a:0:{}s:5:"tmall";a:0:{}s:5:"today";a:0:{}s:5:"tokyo";a:0:{}s:5:"tools";a:0:{}s:3:"top";a:0:{}s:5:"toray";a:0:{}s:7:"toshiba";a:0:{}s:5:"total";a:0:{}s:5:"tours";a:0:{}s:4:"town";a:0:{}s:6:"toyota";a:0:{}s:4:"toys";a:0:{}s:5:"trade";a:0:{}s:7:"trading";a:0:{}s:8:"training";a:0:{}s:13:"travelchannel";a:0:{}s:9:"travelers";a:0:{}s:18:"travelersinsurance";a:0:{}s:5:"trust";a:0:{}s:3:"trv";a:0:{}s:4:"tube";a:0:{}s:3:"tui";a:0:{}s:5:"tunes";a:0:{}s:5:"tushu";a:0:{}s:3:"tvs";a:0:{}s:5:"ubank";a:0:{}s:3:"ubs";a:0:{}s:8:"uconnect";a:0:{}s:6:"unicom";a:0:{}s:10:"university";a:0:{}s:3:"uno";a:0:{}s:3:"uol";a:0:{}s:3:"ups";a:0:{}s:9:"vacations";a:0:{}s:4:"vana";a:0:{}s:8:"vanguard";a:0:{}s:5:"vegas";a:0:{}s:8:"ventures";a:0:{}s:8:"verisign";a:0:{}s:12:"versicherung";a:0:{}s:3:"vet";a:0:{}s:6:"viajes";a:0:{}s:5:"video";a:0:{}s:3:"vig";a:0:{}s:6:"viking";a:0:{}s:6:"villas";a:0:{}s:3:"vin";a:0:{}s:3:"vip";a:0:{}s:6:"virgin";a:0:{}s:4:"visa";a:0:{}s:6:"vision";a:0:{}s:5:"vista";a:0:{}s:10:"vistaprint";a:0:{}s:4:"viva";a:0:{}s:4:"vivo";a:0:{}s:10:"vlaanderen";a:0:{}s:5:"vodka";a:0:{}s:10:"volkswagen";a:0:{}s:5:"volvo";a:0:{}s:4:"vote";a:0:{}s:6:"voting";a:0:{}s:4:"voto";a:0:{}s:6:"voyage";a:0:{}s:6:"vuelos";a:0:{}s:5:"wales";a:0:{}s:7:"walmart";a:0:{}s:6:"walter";a:0:{}s:4:"wang";a:0:{}s:7:"wanggou";a:0:{}s:6:"warman";a:0:{}s:5:"watch";a:0:{}s:7:"watches";a:0:{}s:7:"weather";a:0:{}s:14:"weatherchannel";a:0:{}s:6:"webcam";a:0:{}s:5:"weber";a:0:{}s:7:"website";a:0:{}s:3:"wed";a:0:{}s:7:"wedding";a:0:{}s:5:"weibo";a:0:{}s:4:"weir";a:0:{}s:7:"whoswho";a:0:{}s:4:"wien";a:0:{}s:4:"wiki";a:0:{}s:11:"williamhill";a:0:{}s:3:"win";a:0:{}s:7:"windows";a:0:{}s:4:"wine";a:0:{}s:7:"winners";a:0:{}s:3:"wme";a:0:{}s:13:"wolterskluwer";a:0:{}s:8:"woodside";a:0:{}s:4:"work";a:0:{}s:5:"works";a:0:{}s:5:"world";a:0:{}s:3:"wow";a:0:{}s:3:"wtc";a:0:{}s:3:"wtf";a:0:{}s:4:"xbox";a:0:{}s:5:"xerox";a:0:{}s:7:"xfinity";a:0:{}s:6:"xihuan";a:0:{}s:3:"xin";a:0:{}s:11:"xn--11b4c3d";a:0:{}s:11:"xn--1ck2e1b";a:0:{}s:11:"xn--1qqw23a";a:0:{}s:10:"xn--30rr7y";a:0:{}s:11:"xn--3bst00m";a:0:{}s:11:"xn--3ds443g";a:0:{}s:17:"xn--3oq18vl8pn36a";a:0:{}s:10:"xn--3pxu8k";a:0:{}s:11:"xn--42c2d9a";a:0:{}s:10:"xn--45q11c";a:0:{}s:10:"xn--4gbrim";a:0:{}s:11:"xn--55qw42g";a:0:{}s:10:"xn--55qx5d";a:0:{}s:17:"xn--5su34j936bgsg";a:0:{}s:10:"xn--5tzm5g";a:0:{}s:11:"xn--6frz82g";a:0:{}s:14:"xn--6qq986b3xl";a:0:{}s:12:"xn--80adxhks";a:0:{}s:14:"xn--80aqecdr1a";a:0:{}s:12:"xn--80asehdb";a:0:{}s:10:"xn--80aswg";a:0:{}s:12:"xn--8y0a063a";a:0:{}s:10:"xn--9dbq2a";a:0:{}s:10:"xn--9et52u";a:0:{}s:11:"xn--9krt00a";a:0:{}s:14:"xn--b4w605ferd";a:0:{}s:17:"xn--bck1b9a5dre4c";a:0:{}s:9:"xn--c1avg";a:0:{}s:10:"xn--c2br7g";a:0:{}s:11:"xn--cck2b3b";a:0:{}s:10:"xn--cg4bki";a:0:{}s:11:"xn--czr694b";a:0:{}s:10:"xn--czrs0t";a:0:{}s:10:"xn--czru2d";a:0:{}s:11:"xn--d1acj3b";a:0:{}s:13:"xn--eckvdtc9d";a:0:{}s:11:"xn--efvy88h";a:0:{}s:11:"xn--estv75g";a:0:{}s:11:"xn--fct429k";a:0:{}s:9:"xn--fhbei";a:0:{}s:14:"xn--fiq228c5hs";a:0:{}s:10:"xn--fiq64b";a:0:{}s:11:"xn--fjq720a";a:0:{}s:11:"xn--flw351e";a:0:{}s:16:"xn--fzys8d69uvgm";a:0:{}s:11:"xn--g2xx48c";a:0:{}s:12:"xn--gckr3f0f";a:0:{}s:11:"xn--gk3at1e";a:0:{}s:11:"xn--hxt814e";a:0:{}s:15:"xn--i1b6b1a6a2e";a:0:{}s:11:"xn--imr513n";a:0:{}s:10:"xn--io0a7i";a:0:{}s:9:"xn--j1aef";a:0:{}s:14:"xn--jlq61u9w7b";a:0:{}s:11:"xn--jvr189m";a:0:{}s:15:"xn--kcrx77d1x4a";a:0:{}s:11:"xn--kpu716f";a:0:{}s:10:"xn--kput3i";a:0:{}s:14:"xn--mgba3a3ejt";a:0:{}s:16:"xn--mgba7c0bbn0a";a:0:{}s:15:"xn--mgbaakc7dvf";a:0:{}s:12:"xn--mgbab2bd";a:0:{}s:14:"xn--mgbb9fbpob";a:0:{}s:14:"xn--mgbca7dzdo";a:0:{}s:14:"xn--mgbi4ecexp";a:0:{}s:12:"xn--mgbt3dhd";a:0:{}s:12:"xn--mk1bu44c";a:0:{}s:10:"xn--mxtq1m";a:0:{}s:12:"xn--ngbc5azd";a:0:{}s:12:"xn--ngbe9e0a";a:0:{}s:9:"xn--ngbrx";a:0:{}s:9:"xn--nqv7f";a:0:{}s:15:"xn--nqv7fs00ema";a:0:{}s:11:"xn--nyqy26a";a:0:{}s:9:"xn--p1acf";a:0:{}s:11:"xn--pbt977c";a:0:{}s:10:"xn--pssy2u";a:0:{}s:11:"xn--q9jyb4c";a:0:{}s:12:"xn--qcka1pmc";a:0:{}s:11:"xn--rhqv96g";a:0:{}s:11:"xn--rovu88b";a:0:{}s:11:"xn--ses554g";a:0:{}s:11:"xn--t60b56a";a:0:{}s:9:"xn--tckwe";a:0:{}s:13:"xn--tiq49xqyj";a:0:{}s:10:"xn--unup4y";a:0:{}s:23:"xn--vermgensberater-ctb";a:0:{}s:24:"xn--vermgensberatung-pwb";a:0:{}s:9:"xn--vhquv";a:0:{}s:11:"xn--vuq861b";a:0:{}s:20:"xn--w4r85el8fhu5dnra";a:0:{}s:11:"xn--w4rs40l";a:0:{}s:11:"xn--xhq521b";a:0:{}s:11:"xn--zfr164b";a:0:{}s:6:"xperia";a:0:{}s:3:"xyz";a:0:{}s:6:"yachts";a:0:{}s:5:"yahoo";a:0:{}s:7:"yamaxun";a:0:{}s:6:"yandex";a:0:{}s:9:"yodobashi";a:0:{}s:4:"yoga";a:0:{}s:8:"yokohama";a:0:{}s:3:"you";a:0:{}s:7:"youtube";a:0:{}s:3:"yun";a:0:{}s:6:"zappos";a:0:{}s:4:"zara";a:0:{}s:4:"zero";a:0:{}s:3:"zip";a:0:{}s:5:"zippo";a:0:{}s:4:"zone";a:0:{}s:7:"zuerich";a:0:{}} \ No newline at end of file diff --git a/data/A/C/0562bba4a57c6841cba10249e90ffc9895458763fae6885c9ee74fdce5ec90 b/data/A/C/0562bba4a57c6841cba10249e90ffc9895458763fae6885c9ee74fdce5ec90 new file mode 100644 index 00000000..d466acd5 --- /dev/null +++ b/data/A/C/0562bba4a57c6841cba10249e90ffc9895458763fae6885c9ee74fdce5ec90 @@ -0,0 +1 @@ +N; \ No newline at end of file diff --git a/data/B/5/c7aed7cd2a308523e7d2847b7815909e864b2fd9c4ea88b00d35adb2ecdfd7 b/data/B/5/c7aed7cd2a308523e7d2847b7815909e864b2fd9c4ea88b00d35adb2ecdfd7 new file mode 100644 index 00000000..f70ffd06 --- /dev/null +++ b/data/B/5/c7aed7cd2a308523e7d2847b7815909e864b2fd9c4ea88b00d35adb2ecdfd7 @@ -0,0 +1 @@ +a:1557:{s:2:"ac";a:6:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"mil";a:0:{}s:3:"org";a:0:{}}s:2:"ad";a:1:{s:3:"nom";a:0:{}}s:2:"ae";a:9:{s:2:"co";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sch";a:0:{}s:2:"ac";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:4:"aero";a:87:{s:22:"accident-investigation";a:0:{}s:19:"accident-prevention";a:0:{}s:9:"aerobatic";a:0:{}s:8:"aeroclub";a:0:{}s:9:"aerodrome";a:0:{}s:6:"agents";a:0:{}s:8:"aircraft";a:0:{}s:7:"airline";a:0:{}s:7:"airport";a:0:{}s:16:"air-surveillance";a:0:{}s:10:"airtraffic";a:0:{}s:19:"air-traffic-control";a:0:{}s:9:"ambulance";a:0:{}s:9:"amusement";a:0:{}s:11:"association";a:0:{}s:6:"author";a:0:{}s:10:"ballooning";a:0:{}s:6:"broker";a:0:{}s:3:"caa";a:0:{}s:5:"cargo";a:0:{}s:8:"catering";a:0:{}s:13:"certification";a:0:{}s:12:"championship";a:0:{}s:7:"charter";a:0:{}s:13:"civilaviation";a:0:{}s:4:"club";a:0:{}s:10:"conference";a:0:{}s:10:"consultant";a:0:{}s:10:"consulting";a:0:{}s:7:"control";a:0:{}s:7:"council";a:0:{}s:4:"crew";a:0:{}s:6:"design";a:0:{}s:4:"dgca";a:0:{}s:8:"educator";a:0:{}s:9:"emergency";a:0:{}s:6:"engine";a:0:{}s:8:"engineer";a:0:{}s:13:"entertainment";a:0:{}s:9:"equipment";a:0:{}s:8:"exchange";a:0:{}s:7:"express";a:0:{}s:10:"federation";a:0:{}s:6:"flight";a:0:{}s:7:"freight";a:0:{}s:4:"fuel";a:0:{}s:7:"gliding";a:0:{}s:10:"government";a:0:{}s:14:"groundhandling";a:0:{}s:5:"group";a:0:{}s:11:"hanggliding";a:0:{}s:9:"homebuilt";a:0:{}s:9:"insurance";a:0:{}s:7:"journal";a:0:{}s:10:"journalist";a:0:{}s:7:"leasing";a:0:{}s:9:"logistics";a:0:{}s:8:"magazine";a:0:{}s:11:"maintenance";a:0:{}s:5:"media";a:0:{}s:10:"microlight";a:0:{}s:9:"modelling";a:0:{}s:10:"navigation";a:0:{}s:11:"parachuting";a:0:{}s:11:"paragliding";a:0:{}s:21:"passenger-association";a:0:{}s:5:"pilot";a:0:{}s:5:"press";a:0:{}s:10:"production";a:0:{}s:10:"recreation";a:0:{}s:7:"repbody";a:0:{}s:3:"res";a:0:{}s:8:"research";a:0:{}s:10:"rotorcraft";a:0:{}s:6:"safety";a:0:{}s:9:"scientist";a:0:{}s:8:"services";a:0:{}s:4:"show";a:0:{}s:9:"skydiving";a:0:{}s:8:"software";a:0:{}s:7:"student";a:0:{}s:6:"trader";a:0:{}s:7:"trading";a:0:{}s:7:"trainer";a:0:{}s:5:"union";a:0:{}s:12:"workinggroup";a:0:{}s:5:"works";a:0:{}}s:2:"af";a:5:{s:3:"gov";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}}s:2:"ag";a:5:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:2:"co";a:0:{}s:3:"nom";a:0:{}}s:2:"ai";a:5:{s:3:"off";a:0:{}s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"nom";a:0:{}}s:2:"al";a:8:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"am";a:1:{s:8:"blogspot";a:0:{}}s:2:"ao";a:6:{s:2:"ed";a:0:{}s:2:"gv";a:0:{}s:2:"og";a:0:{}s:2:"co";a:0:{}s:2:"pb";a:0:{}s:2:"it";a:0:{}}s:2:"aq";a:0:{}s:2:"ar";a:10:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:3:"gov";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:6:"musica";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"tur";a:0:{}}s:4:"arpa";a:6:{s:4:"e164";a:0:{}s:7:"in-addr";a:0:{}s:3:"ip6";a:0:{}s:4:"iris";a:0:{}s:3:"uri";a:0:{}s:3:"urn";a:0:{}}s:2:"as";a:1:{s:3:"gov";a:0:{}}s:4:"asia";a:1:{s:7:"cloudns";a:0:{}}s:2:"at";a:15:{s:2:"ac";a:0:{}s:2:"co";a:1:{s:8:"blogspot";a:0:{}}s:2:"gv";a:0:{}s:2:"or";a:0:{}s:9:"futurecms";a:1:{s:1:"*";a:0:{}}s:13:"futurehosting";a:0:{}s:13:"futuremailing";a:0:{}s:8:"ortsinfo";a:2:{s:2:"ex";a:1:{s:1:"*";a:0:{}}s:6:"kunden";a:1:{s:1:"*";a:0:{}}}s:3:"biz";a:0:{}s:4:"info";a:0:{}s:4:"priv";a:0:{}s:4:"12hp";a:0:{}s:3:"2ix";a:0:{}s:5:"4lima";a:0:{}s:9:"lima-city";a:0:{}}s:2:"au";a:18:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:8:{s:3:"act";a:0:{}s:3:"nsw";a:0:{}s:2:"nt";a:0:{}s:3:"qld";a:0:{}s:2:"sa";a:0:{}s:3:"tas";a:0:{}s:3:"vic";a:0:{}s:2:"wa";a:0:{}}s:3:"gov";a:5:{s:3:"qld";a:0:{}s:2:"sa";a:0:{}s:3:"tas";a:0:{}s:3:"vic";a:0:{}s:2:"wa";a:0:{}}s:3:"asn";a:0:{}s:2:"id";a:0:{}s:4:"info";a:0:{}s:4:"conf";a:0:{}s:2:"oz";a:0:{}s:3:"act";a:0:{}s:3:"nsw";a:0:{}s:2:"nt";a:0:{}s:3:"qld";a:0:{}s:2:"sa";a:0:{}s:3:"tas";a:0:{}s:3:"vic";a:0:{}s:2:"wa";a:0:{}}s:2:"aw";a:1:{s:3:"com";a:0:{}}s:2:"ax";a:0:{}s:2:"az";a:12:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"int";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:4:"info";a:0:{}s:2:"pp";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}s:3:"pro";a:0:{}s:3:"biz";a:0:{}}s:2:"ba";a:7:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:8:"blogspot";a:0:{}}s:2:"bb";a:10:{s:3:"biz";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:5:"store";a:0:{}s:2:"tv";a:0:{}}s:2:"bd";a:1:{s:1:"*";a:0:{}}s:2:"be";a:3:{s:2:"ac";a:0:{}s:8:"blogspot";a:0:{}s:8:"transurl";a:1:{s:1:"*";a:0:{}}}s:2:"bf";a:1:{s:3:"gov";a:0:{}}s:2:"bg";a:38:{s:1:"a";a:0:{}s:1:"b";a:0:{}s:1:"c";a:0:{}s:1:"d";a:0:{}s:1:"e";a:0:{}s:1:"f";a:0:{}s:1:"g";a:0:{}s:1:"h";a:0:{}s:1:"i";a:0:{}s:1:"j";a:0:{}s:1:"k";a:0:{}s:1:"l";a:0:{}s:1:"m";a:0:{}s:1:"n";a:0:{}s:1:"o";a:0:{}s:1:"p";a:0:{}s:1:"q";a:0:{}s:1:"r";a:0:{}s:1:"s";a:0:{}s:1:"t";a:0:{}s:1:"u";a:0:{}s:1:"v";a:0:{}s:1:"w";a:0:{}s:1:"x";a:0:{}s:1:"y";a:0:{}s:1:"z";a:0:{}i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}i:3;a:0:{}i:4;a:0:{}i:5;a:0:{}i:6;a:0:{}i:7;a:0:{}i:8;a:0:{}i:9;a:0:{}s:8:"blogspot";a:0:{}s:5:"barsy";a:0:{}}s:2:"bh";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}}s:2:"bi";a:5:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:2:"or";a:0:{}s:3:"org";a:0:{}}s:3:"biz";a:12:{s:7:"cloudns";a:0:{}s:6:"dyndns";a:0:{}s:10:"for-better";a:0:{}s:8:"for-more";a:0:{}s:8:"for-some";a:0:{}s:7:"for-the";a:0:{}s:6:"selfip";a:0:{}s:6:"webhop";a:0:{}s:6:"mmafan";a:0:{}s:5:"myftp";a:0:{}s:5:"no-ip";a:0:{}s:7:"dscloud";a:0:{}}s:2:"bj";a:4:{s:4:"asso";a:0:{}s:7:"barreau";a:0:{}s:4:"gouv";a:0:{}s:8:"blogspot";a:0:{}}s:2:"bm";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"bn";a:1:{s:1:"*";a:0:{}}s:2:"bo";a:9:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"gob";a:0:{}s:3:"int";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"mil";a:0:{}s:2:"tv";a:0:{}}s:2:"br";a:95:{s:3:"abc";a:0:{}s:3:"adm";a:0:{}s:3:"adv";a:0:{}s:3:"agr";a:0:{}s:3:"aju";a:0:{}s:2:"am";a:0:{}s:9:"aparecida";a:0:{}s:3:"arq";a:0:{}s:3:"art";a:0:{}s:3:"ato";a:0:{}s:1:"b";a:0:{}s:5:"belem";a:0:{}s:3:"bio";a:0:{}s:4:"blog";a:0:{}s:3:"bmd";a:0:{}s:3:"bsb";a:0:{}s:3:"cim";a:0:{}s:3:"cng";a:0:{}s:3:"cnt";a:0:{}s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:4:"coop";a:0:{}s:3:"cri";a:0:{}s:6:"cuiaba";a:0:{}s:3:"def";a:0:{}s:3:"ecn";a:0:{}s:3:"eco";a:0:{}s:3:"edu";a:0:{}s:3:"emp";a:0:{}s:3:"eng";a:0:{}s:3:"esp";a:0:{}s:3:"etc";a:0:{}s:3:"eti";a:0:{}s:3:"far";a:0:{}s:4:"flog";a:0:{}s:7:"floripa";a:0:{}s:6:"fortal";a:0:{}s:2:"fm";a:0:{}s:3:"fnd";a:0:{}s:3:"fot";a:0:{}s:3:"fst";a:0:{}s:3:"g12";a:0:{}s:3:"ggf";a:0:{}s:3:"gov";a:27:{s:2:"ac";a:0:{}s:2:"al";a:0:{}s:2:"am";a:0:{}s:2:"ap";a:0:{}s:2:"ba";a:0:{}s:2:"ce";a:0:{}s:2:"df";a:0:{}s:2:"es";a:0:{}s:2:"go";a:0:{}s:2:"ma";a:0:{}s:2:"mg";a:0:{}s:2:"ms";a:0:{}s:2:"mt";a:0:{}s:2:"pa";a:0:{}s:2:"pb";a:0:{}s:2:"pe";a:0:{}s:2:"pi";a:0:{}s:2:"pr";a:0:{}s:2:"rj";a:0:{}s:2:"rn";a:0:{}s:2:"ro";a:0:{}s:2:"rr";a:0:{}s:2:"rs";a:0:{}s:2:"sc";a:0:{}s:2:"se";a:0:{}s:2:"sp";a:0:{}s:2:"to";a:0:{}}s:3:"gru";a:0:{}s:3:"imb";a:0:{}s:3:"ind";a:0:{}s:3:"inf";a:0:{}s:5:"jampa";a:0:{}s:3:"jor";a:0:{}s:3:"jus";a:0:{}s:3:"leg";a:27:{s:2:"ac";a:0:{}s:2:"al";a:0:{}s:2:"am";a:0:{}s:2:"ap";a:0:{}s:2:"ba";a:0:{}s:2:"ce";a:0:{}s:2:"df";a:0:{}s:2:"es";a:0:{}s:2:"go";a:0:{}s:2:"ma";a:0:{}s:2:"mg";a:0:{}s:2:"ms";a:0:{}s:2:"mt";a:0:{}s:2:"pa";a:0:{}s:2:"pb";a:0:{}s:2:"pe";a:0:{}s:2:"pi";a:0:{}s:2:"pr";a:0:{}s:2:"rj";a:0:{}s:2:"rn";a:0:{}s:2:"ro";a:0:{}s:2:"rr";a:0:{}s:2:"rs";a:0:{}s:2:"sc";a:0:{}s:2:"se";a:0:{}s:2:"sp";a:0:{}s:2:"to";a:0:{}}s:3:"lel";a:0:{}s:8:"londrina";a:0:{}s:6:"macapa";a:0:{}s:6:"maceio";a:0:{}s:3:"mat";a:0:{}s:3:"med";a:0:{}s:3:"mil";a:0:{}s:2:"mp";a:0:{}s:3:"mus";a:0:{}s:5:"natal";a:0:{}s:3:"net";a:0:{}s:7:"niteroi";a:0:{}s:3:"nom";a:1:{s:1:"*";a:0:{}}s:3:"not";a:0:{}s:3:"ntr";a:0:{}s:3:"odo";a:0:{}s:3:"org";a:0:{}s:6:"osasco";a:0:{}s:6:"palmas";a:0:{}s:3:"poa";a:0:{}s:3:"ppg";a:0:{}s:3:"pro";a:0:{}s:3:"psc";a:0:{}s:3:"psi";a:0:{}s:3:"qsl";a:0:{}s:5:"radio";a:0:{}s:3:"rec";a:0:{}s:6:"recife";a:0:{}s:9:"riobranco";a:0:{}s:3:"sjc";a:0:{}s:3:"slg";a:0:{}s:3:"srv";a:0:{}s:4:"taxi";a:0:{}s:3:"teo";a:0:{}s:3:"tmp";a:0:{}s:3:"trd";a:0:{}s:3:"tur";a:0:{}s:2:"tv";a:0:{}s:3:"udi";a:0:{}s:3:"vet";a:0:{}s:3:"vix";a:0:{}s:4:"vlog";a:0:{}s:4:"wiki";a:0:{}s:3:"zlg";a:0:{}}s:2:"bs";a:6:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:2:"we";a:0:{}}s:2:"bt";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"bv";a:0:{}s:2:"bw";a:2:{s:2:"co";a:0:{}s:3:"org";a:0:{}}s:2:"by";a:5:{s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:2:"of";a:0:{}s:3:"nym";a:0:{}}s:2:"bz";a:7:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:2:"za";a:0:{}s:3:"nym";a:0:{}}s:2:"ca";a:19:{s:2:"ab";a:0:{}s:2:"bc";a:0:{}s:2:"mb";a:0:{}s:2:"nb";a:0:{}s:2:"nf";a:0:{}s:2:"nl";a:0:{}s:2:"ns";a:0:{}s:2:"nt";a:0:{}s:2:"nu";a:0:{}s:2:"on";a:0:{}s:2:"pe";a:0:{}s:2:"qc";a:0:{}s:2:"sk";a:0:{}s:2:"yk";a:0:{}s:2:"gc";a:0:{}s:5:"awdev";a:1:{s:1:"*";a:0:{}}s:2:"co";a:0:{}s:8:"blogspot";a:0:{}s:5:"no-ip";a:0:{}}s:3:"cat";a:0:{}s:2:"cc";a:7:{s:7:"cloudns";a:0:{}s:9:"ftpaccess";a:0:{}s:11:"game-server";a:0:{}s:8:"myphotos";a:0:{}s:9:"scrapping";a:0:{}s:6:"twmail";a:0:{}s:13:"fantasyleague";a:0:{}}s:2:"cd";a:1:{s:3:"gov";a:0:{}}s:2:"cf";a:1:{s:8:"blogspot";a:0:{}}s:2:"cg";a:0:{}s:2:"ch";a:7:{s:7:"square7";a:0:{}s:8:"blogspot";a:0:{}s:6:"gotdns";a:0:{}s:4:"12hp";a:0:{}s:3:"2ix";a:0:{}s:5:"4lima";a:0:{}s:9:"lima-city";a:0:{}}s:2:"ci";a:15:{s:3:"org";a:0:{}s:2:"or";a:0:{}s:3:"com";a:0:{}s:2:"co";a:0:{}s:3:"edu";a:0:{}s:2:"ed";a:0:{}s:2:"ac";a:0:{}s:3:"net";a:0:{}s:2:"go";a:0:{}s:4:"asso";a:0:{}s:15:"xn--aroport-bya";a:0:{}s:3:"int";a:0:{}s:6:"presse";a:0:{}s:2:"md";a:0:{}s:4:"gouv";a:0:{}}s:2:"ck";a:2:{s:1:"*";a:0:{}s:3:"www";a:1:{s:1:"!";s:0:"";}}s:2:"cl";a:6:{s:3:"gov";a:0:{}s:3:"gob";a:0:{}s:2:"co";a:0:{}s:3:"mil";a:0:{}s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"cm";a:4:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}}s:2:"cn";a:44:{s:2:"ac";a:0:{}s:3:"com";a:1:{s:9:"amazonaws";a:4:{s:7:"compute";a:1:{s:1:"*";a:0:{}}s:2:"eb";a:1:{s:10:"cn-north-1";a:0:{}}s:3:"elb";a:1:{s:1:"*";a:0:{}}s:10:"cn-north-1";a:1:{s:2:"s3";a:0:{}}}}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"mil";a:0:{}s:10:"xn--55qx5d";a:0:{}s:10:"xn--io0a7i";a:0:{}s:10:"xn--od0alg";a:0:{}s:2:"ah";a:0:{}s:2:"bj";a:0:{}s:2:"cq";a:0:{}s:2:"fj";a:0:{}s:2:"gd";a:0:{}s:2:"gs";a:0:{}s:2:"gz";a:0:{}s:2:"gx";a:0:{}s:2:"ha";a:0:{}s:2:"hb";a:0:{}s:2:"he";a:0:{}s:2:"hi";a:0:{}s:2:"hl";a:0:{}s:2:"hn";a:0:{}s:2:"jl";a:0:{}s:2:"js";a:0:{}s:2:"jx";a:0:{}s:2:"ln";a:0:{}s:2:"nm";a:0:{}s:2:"nx";a:0:{}s:2:"qh";a:0:{}s:2:"sc";a:0:{}s:2:"sd";a:0:{}s:2:"sh";a:0:{}s:2:"sn";a:0:{}s:2:"sx";a:0:{}s:2:"tj";a:0:{}s:2:"xj";a:0:{}s:2:"xz";a:0:{}s:2:"yn";a:0:{}s:2:"zj";a:0:{}s:2:"hk";a:0:{}s:2:"mo";a:0:{}s:2:"tw";a:0:{}}s:2:"co";a:14:{s:4:"arts";a:0:{}s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"edu";a:0:{}s:4:"firm";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"nom";a:0:{}s:3:"org";a:0:{}s:3:"rec";a:0:{}s:3:"web";a:0:{}s:5:"nodum";a:0:{}}s:3:"com";a:290:{s:9:"amazonaws";a:40:{s:7:"compute";a:1:{s:1:"*";a:0:{}}s:9:"compute-1";a:1:{s:1:"*";a:0:{}}s:9:"us-east-1";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:3:"elb";a:1:{s:1:"*";a:0:{}}s:2:"s3";a:0:{}s:17:"s3-ap-northeast-1";a:0:{}s:17:"s3-ap-northeast-2";a:0:{}s:13:"s3-ap-south-1";a:0:{}s:17:"s3-ap-southeast-1";a:0:{}s:17:"s3-ap-southeast-2";a:0:{}s:15:"s3-ca-central-1";a:0:{}s:15:"s3-eu-central-1";a:0:{}s:12:"s3-eu-west-1";a:0:{}s:12:"s3-eu-west-2";a:0:{}s:13:"s3-external-1";a:0:{}s:21:"s3-fips-us-gov-west-1";a:0:{}s:12:"s3-sa-east-1";a:0:{}s:16:"s3-us-gov-west-1";a:0:{}s:12:"s3-us-east-2";a:0:{}s:12:"s3-us-west-1";a:0:{}s:12:"s3-us-west-2";a:0:{}s:14:"ap-northeast-2";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:10:"ap-south-1";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:12:"ca-central-1";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:12:"eu-central-1";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:9:"eu-west-2";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:9:"us-east-2";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:14:"ap-northeast-1";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:14:"ap-southeast-1";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:14:"ap-southeast-2";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:9:"eu-west-1";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:9:"sa-east-1";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:20:"s3-website-us-east-1";a:0:{}s:20:"s3-website-us-west-1";a:0:{}s:20:"s3-website-us-west-2";a:0:{}s:25:"s3-website-ap-northeast-1";a:0:{}s:25:"s3-website-ap-southeast-1";a:0:{}s:25:"s3-website-ap-southeast-2";a:0:{}s:20:"s3-website-eu-west-1";a:0:{}s:20:"s3-website-sa-east-1";a:0:{}}s:16:"elasticbeanstalk";a:15:{s:14:"ap-northeast-1";a:0:{}s:14:"ap-northeast-2";a:0:{}s:10:"ap-south-1";a:0:{}s:14:"ap-southeast-1";a:0:{}s:14:"ap-southeast-2";a:0:{}s:12:"ca-central-1";a:0:{}s:12:"eu-central-1";a:0:{}s:9:"eu-west-1";a:0:{}s:9:"eu-west-2";a:0:{}s:9:"sa-east-1";a:0:{}s:9:"us-east-1";a:0:{}s:9:"us-east-2";a:0:{}s:13:"us-gov-west-1";a:0:{}s:9:"us-west-1";a:0:{}s:9:"us-west-2";a:0:{}}s:10:"on-aptible";a:0:{}s:9:"myasustor";a:0:{}s:10:"betainabox";a:0:{}s:7:"bplaced";a:0:{}s:2:"ar";a:0:{}s:2:"br";a:0:{}s:2:"cn";a:0:{}s:2:"de";a:0:{}s:2:"eu";a:0:{}s:2:"gb";a:0:{}s:2:"hu";a:0:{}s:3:"jpn";a:0:{}s:2:"kr";a:0:{}s:3:"mex";a:0:{}s:2:"no";a:0:{}s:2:"qc";a:0:{}s:2:"ru";a:0:{}s:2:"sa";a:0:{}s:2:"se";a:0:{}s:2:"uk";a:0:{}s:2:"us";a:0:{}s:2:"uy";a:0:{}s:2:"za";a:0:{}s:6:"africa";a:0:{}s:2:"gr";a:0:{}s:2:"co";a:0:{}s:13:"xenapponazure";a:0:{}s:9:"jdevcloud";a:0:{}s:10:"wpdevcloud";a:0:{}s:15:"cloudcontrolled";a:0:{}s:15:"cloudcontrolapp";a:0:{}s:8:"drayddns";a:0:{}s:12:"dreamhosters";a:0:{}s:7:"mydrobo";a:0:{}s:14:"dyndns-at-home";a:0:{}s:14:"dyndns-at-work";a:0:{}s:11:"dyndns-blog";a:0:{}s:11:"dyndns-free";a:0:{}s:11:"dyndns-home";a:0:{}s:9:"dyndns-ip";a:0:{}s:11:"dyndns-mail";a:0:{}s:13:"dyndns-office";a:0:{}s:11:"dyndns-pics";a:0:{}s:13:"dyndns-remote";a:0:{}s:13:"dyndns-server";a:0:{}s:10:"dyndns-web";a:0:{}s:11:"dyndns-wiki";a:0:{}s:11:"dyndns-work";a:0:{}s:7:"blogdns";a:0:{}s:7:"cechire";a:0:{}s:8:"dnsalias";a:0:{}s:7:"dnsdojo";a:0:{}s:11:"doesntexist";a:0:{}s:9:"dontexist";a:0:{}s:7:"doomdns";a:0:{}s:10:"dyn-o-saur";a:0:{}s:8:"dynalias";a:0:{}s:15:"est-a-la-maison";a:0:{}s:15:"est-a-la-masion";a:0:{}s:13:"est-le-patron";a:0:{}s:16:"est-mon-blogueur";a:0:{}s:7:"from-ak";a:0:{}s:7:"from-al";a:0:{}s:7:"from-ar";a:0:{}s:7:"from-ca";a:0:{}s:7:"from-ct";a:0:{}s:7:"from-dc";a:0:{}s:7:"from-de";a:0:{}s:7:"from-fl";a:0:{}s:7:"from-ga";a:0:{}s:7:"from-hi";a:0:{}s:7:"from-ia";a:0:{}s:7:"from-id";a:0:{}s:7:"from-il";a:0:{}s:7:"from-in";a:0:{}s:7:"from-ks";a:0:{}s:7:"from-ky";a:0:{}s:7:"from-ma";a:0:{}s:7:"from-md";a:0:{}s:7:"from-mi";a:0:{}s:7:"from-mn";a:0:{}s:7:"from-mo";a:0:{}s:7:"from-ms";a:0:{}s:7:"from-mt";a:0:{}s:7:"from-nc";a:0:{}s:7:"from-nd";a:0:{}s:7:"from-ne";a:0:{}s:7:"from-nh";a:0:{}s:7:"from-nj";a:0:{}s:7:"from-nm";a:0:{}s:7:"from-nv";a:0:{}s:7:"from-oh";a:0:{}s:7:"from-ok";a:0:{}s:7:"from-or";a:0:{}s:7:"from-pa";a:0:{}s:7:"from-pr";a:0:{}s:7:"from-ri";a:0:{}s:7:"from-sc";a:0:{}s:7:"from-sd";a:0:{}s:7:"from-tn";a:0:{}s:7:"from-tx";a:0:{}s:7:"from-ut";a:0:{}s:7:"from-va";a:0:{}s:7:"from-vt";a:0:{}s:7:"from-wa";a:0:{}s:7:"from-wi";a:0:{}s:7:"from-wv";a:0:{}s:7:"from-wy";a:0:{}s:7:"getmyip";a:0:{}s:6:"gotdns";a:0:{}s:10:"hobby-site";a:0:{}s:9:"homelinux";a:0:{}s:8:"homeunix";a:0:{}s:9:"iamallama";a:0:{}s:14:"is-a-anarchist";a:0:{}s:12:"is-a-blogger";a:0:{}s:15:"is-a-bookkeeper";a:0:{}s:14:"is-a-bulls-fan";a:0:{}s:12:"is-a-caterer";a:0:{}s:9:"is-a-chef";a:0:{}s:17:"is-a-conservative";a:0:{}s:8:"is-a-cpa";a:0:{}s:18:"is-a-cubicle-slave";a:0:{}s:13:"is-a-democrat";a:0:{}s:13:"is-a-designer";a:0:{}s:11:"is-a-doctor";a:0:{}s:21:"is-a-financialadvisor";a:0:{}s:9:"is-a-geek";a:0:{}s:10:"is-a-green";a:0:{}s:9:"is-a-guru";a:0:{}s:16:"is-a-hard-worker";a:0:{}s:11:"is-a-hunter";a:0:{}s:15:"is-a-landscaper";a:0:{}s:11:"is-a-lawyer";a:0:{}s:12:"is-a-liberal";a:0:{}s:16:"is-a-libertarian";a:0:{}s:10:"is-a-llama";a:0:{}s:13:"is-a-musician";a:0:{}s:14:"is-a-nascarfan";a:0:{}s:10:"is-a-nurse";a:0:{}s:12:"is-a-painter";a:0:{}s:20:"is-a-personaltrainer";a:0:{}s:17:"is-a-photographer";a:0:{}s:11:"is-a-player";a:0:{}s:15:"is-a-republican";a:0:{}s:13:"is-a-rockstar";a:0:{}s:14:"is-a-socialist";a:0:{}s:12:"is-a-student";a:0:{}s:12:"is-a-teacher";a:0:{}s:11:"is-a-techie";a:0:{}s:14:"is-a-therapist";a:0:{}s:16:"is-an-accountant";a:0:{}s:11:"is-an-actor";a:0:{}s:13:"is-an-actress";a:0:{}s:15:"is-an-anarchist";a:0:{}s:12:"is-an-artist";a:0:{}s:14:"is-an-engineer";a:0:{}s:17:"is-an-entertainer";a:0:{}s:12:"is-certified";a:0:{}s:7:"is-gone";a:0:{}s:13:"is-into-anime";a:0:{}s:12:"is-into-cars";a:0:{}s:16:"is-into-cartoons";a:0:{}s:13:"is-into-games";a:0:{}s:7:"is-leet";a:0:{}s:16:"is-not-certified";a:0:{}s:8:"is-slick";a:0:{}s:11:"is-uberleet";a:0:{}s:15:"is-with-theband";a:0:{}s:8:"isa-geek";a:0:{}s:13:"isa-hockeynut";a:0:{}s:16:"issmarterthanyou";a:0:{}s:9:"likes-pie";a:0:{}s:10:"likescandy";a:0:{}s:8:"neat-url";a:0:{}s:16:"saves-the-whales";a:0:{}s:6:"selfip";a:0:{}s:14:"sells-for-less";a:0:{}s:11:"sells-for-u";a:0:{}s:8:"servebbs";a:0:{}s:10:"simple-url";a:0:{}s:13:"space-to-rent";a:0:{}s:12:"teaches-yoga";a:0:{}s:14:"writesthisblog";a:0:{}s:8:"ddnsfree";a:0:{}s:8:"ddnsgeek";a:0:{}s:5:"giize";a:0:{}s:6:"gleeze";a:0:{}s:5:"kozow";a:0:{}s:10:"loseyourip";a:0:{}s:5:"ooguy";a:0:{}s:9:"theworkpc";a:0:{}s:8:"mytuleap";a:0:{}s:8:"evennode";a:8:{s:4:"eu-1";a:0:{}s:4:"eu-2";a:0:{}s:4:"eu-3";a:0:{}s:4:"eu-4";a:0:{}s:4:"us-1";a:0:{}s:4:"us-2";a:0:{}s:4:"us-3";a:0:{}s:4:"us-4";a:0:{}}s:5:"fbsbx";a:1:{s:4:"apps";a:0:{}}s:11:"firebaseapp";a:0:{}s:8:"flynnhub";a:0:{}s:10:"freebox-os";a:0:{}s:9:"freeboxos";a:0:{}s:17:"githubusercontent";a:0:{}s:4:"0emm";a:1:{s:1:"*";a:0:{}}s:7:"appspot";a:0:{}s:8:"blogspot";a:0:{}s:8:"codespot";a:0:{}s:10:"googleapis";a:0:{}s:10:"googlecode";a:0:{}s:18:"pagespeedmobilizer";a:0:{}s:12:"publishproxy";a:0:{}s:10:"withgoogle";a:0:{}s:11:"withyoutube";a:0:{}s:9:"herokuapp";a:0:{}s:9:"herokussl";a:0:{}s:8:"pixolino";a:0:{}s:6:"joyent";a:1:{s:3:"cns";a:1:{s:1:"*";a:0:{}}}s:11:"barsyonline";a:0:{}s:9:"meteorapp";a:1:{s:2:"eu";a:0:{}}s:10:"bitballoon";a:0:{}s:7:"netlify";a:0:{}s:2:"4u";a:0:{}s:7:"nfshost";a:0:{}s:8:"blogsyte";a:0:{}s:10:"ciscofreak";a:0:{}s:10:"damnserver";a:0:{}s:11:"ditchyourip";a:0:{}s:10:"dnsiskinky";a:0:{}s:5:"dynns";a:0:{}s:10:"geekgalaxy";a:0:{}s:17:"health-carereform";a:0:{}s:15:"homesecuritymac";a:0:{}s:14:"homesecuritypc";a:0:{}s:17:"myactivedirectory";a:0:{}s:16:"mysecuritycamera";a:0:{}s:10:"net-freaks";a:0:{}s:9:"onthewifi";a:0:{}s:10:"point2this";a:0:{}s:10:"quicksytes";a:0:{}s:15:"securitytactics";a:0:{}s:13:"serveexchange";a:0:{}s:11:"servehumour";a:0:{}s:8:"servep2p";a:0:{}s:12:"servesarcasm";a:0:{}s:11:"stufftoread";a:0:{}s:13:"unusualperson";a:0:{}s:12:"workisboring";a:0:{}s:10:"3utilities";a:0:{}s:8:"ddnsking";a:0:{}s:5:"myvnc";a:0:{}s:9:"servebeer";a:0:{}s:18:"servecounterstrike";a:0:{}s:8:"serveftp";a:0:{}s:9:"servegame";a:0:{}s:13:"servehalflife";a:0:{}s:9:"servehttp";a:0:{}s:8:"serveirc";a:0:{}s:8:"servemp3";a:0:{}s:9:"servepics";a:0:{}s:10:"servequake";a:0:{}s:10:"operaunite";a:0:{}s:15:"outsystemscloud";a:0:{}s:11:"ownprovider";a:0:{}s:5:"pgfog";a:0:{}s:12:"pagefrontapp";a:0:{}s:11:"gotpantheon";a:0:{}s:5:"prgmr";a:1:{s:3:"xen";a:0:{}}s:3:"qa2";a:0:{}s:15:"dev-myqnapcloud";a:0:{}s:17:"alpha-myqnapcloud";a:0:{}s:11:"myqnapcloud";a:0:{}s:12:"quipelements";a:1:{s:1:"*";a:0:{}}s:8:"rackmaze";a:0:{}s:7:"rhcloud";a:0:{}s:6:"logoip";a:0:{}s:16:"firewall-gateway";a:0:{}s:12:"myshopblocks";a:0:{}s:5:"1kapp";a:0:{}s:8:"appchizi";a:0:{}s:8:"applinzi";a:0:{}s:7:"sinaapp";a:0:{}s:10:"vipsinaapp";a:0:{}s:11:"bounty-full";a:2:{s:5:"alpha";a:0:{}s:4:"beta";a:0:{}}s:8:"temp-dns";a:0:{}s:7:"dsmynas";a:0:{}s:8:"familyds";a:0:{}s:7:"bloxcms";a:0:{}s:16:"townnews-staging";a:0:{}s:2:"hk";a:0:{}s:8:"remotewd";a:0:{}s:8:"yolasite";a:0:{}}s:4:"coop";a:0:{}s:2:"cr";a:7:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"ed";a:0:{}s:2:"fi";a:0:{}s:2:"go";a:0:{}s:2:"or";a:0:{}s:2:"sa";a:0:{}}s:2:"cu";a:6:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"inf";a:0:{}}s:2:"cv";a:1:{s:8:"blogspot";a:0:{}}s:2:"cw";a:4:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"cx";a:3:{s:3:"gov";a:0:{}s:3:"ath";a:0:{}s:4:"info";a:0:{}}s:2:"cy";a:13:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:7:"ekloges";a:0:{}s:3:"gov";a:0:{}s:3:"ltd";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:10:"parliament";a:0:{}s:5:"press";a:0:{}s:3:"pro";a:0:{}s:2:"tm";a:0:{}}s:2:"cz";a:5:{s:2:"co";a:0:{}s:5:"realm";a:0:{}s:2:"e4";a:0:{}s:8:"blogspot";a:0:{}s:11:"metacentrum";a:2:{s:5:"cloud";a:0:{}s:6:"custom";a:0:{}}}s:2:"de";a:48:{s:7:"bplaced";a:0:{}s:7:"square7";a:0:{}s:3:"com";a:0:{}s:7:"cosidns";a:1:{s:3:"dyn";a:0:{}}s:15:"dynamisches-dns";a:0:{}s:10:"dnsupdater";a:0:{}s:12:"internet-dns";a:0:{}s:9:"l-o-g-i-n";a:0:{}s:7:"dnshome";a:0:{}s:15:"fuettertdasnetz";a:0:{}s:10:"isteingeek";a:0:{}s:7:"istmein";a:0:{}s:10:"lebtimnetz";a:0:{}s:10:"leitungsen";a:0:{}s:13:"traeumtgerade";a:0:{}s:5:"ddnss";a:2:{s:3:"dyn";a:0:{}s:6:"dyndns";a:0:{}}s:7:"dyndns1";a:0:{}s:8:"dyn-ip24";a:0:{}s:14:"home-webserver";a:1:{s:3:"dyn";a:0:{}}s:13:"myhome-server";a:0:{}s:4:"goip";a:0:{}s:8:"blogspot";a:0:{}s:10:"keymachine";a:0:{}s:9:"git-repos";a:0:{}s:12:"lcube-server";a:0:{}s:9:"svn-repos";a:0:{}s:5:"barsy";a:0:{}s:6:"logoip";a:0:{}s:16:"firewall-gateway";a:0:{}s:10:"my-gateway";a:0:{}s:9:"my-router";a:0:{}s:5:"spdns";a:0:{}s:10:"taifun-dns";a:0:{}s:4:"12hp";a:0:{}s:3:"2ix";a:0:{}s:5:"4lima";a:0:{}s:9:"lima-city";a:0:{}s:6:"dd-dns";a:0:{}s:8:"dray-dns";a:0:{}s:7:"draydns";a:0:{}s:7:"dyn-vpn";a:0:{}s:6:"dynvpn";a:0:{}s:10:"mein-vigor";a:0:{}s:8:"my-vigor";a:0:{}s:6:"my-wan";a:0:{}s:7:"syno-ds";a:0:{}s:20:"synology-diskstation";a:0:{}s:11:"synology-ds";a:0:{}}s:2:"dj";a:0:{}s:2:"dk";a:6:{s:3:"biz";a:0:{}s:2:"co";a:0:{}s:4:"firm";a:0:{}s:3:"reg";a:0:{}s:5:"store";a:0:{}s:8:"blogspot";a:0:{}}s:2:"dm";a:5:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}}s:2:"do";a:10:{s:3:"art";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sld";a:0:{}s:3:"web";a:0:{}}s:2:"dz";a:8:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:4:"asso";a:0:{}s:3:"pol";a:0:{}s:3:"art";a:0:{}}s:2:"ec";a:12:{s:3:"com";a:0:{}s:4:"info";a:0:{}s:3:"net";a:0:{}s:3:"fin";a:0:{}s:3:"k12";a:0:{}s:3:"med";a:0:{}s:3:"pro";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"gob";a:0:{}s:3:"mil";a:0:{}}s:3:"edu";a:0:{}s:2:"ee";a:10:{s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:4:"riik";a:0:{}s:3:"lib";a:0:{}s:3:"med";a:0:{}s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"pri";a:0:{}s:3:"aip";a:0:{}s:3:"org";a:0:{}s:3:"fie";a:0:{}}s:2:"eg";a:9:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"edu";a:0:{}s:3:"eun";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sci";a:0:{}}s:2:"er";a:1:{s:1:"*";a:0:{}}s:2:"es";a:5:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"nom";a:0:{}s:3:"org";a:0:{}s:3:"gob";a:0:{}s:3:"edu";a:0:{}}s:2:"et";a:8:{s:3:"com";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"biz";a:0:{}s:4:"name";a:0:{}s:4:"info";a:0:{}s:3:"net";a:0:{}}s:2:"eu";a:7:{s:4:"mycd";a:0:{}s:7:"cloudns";a:0:{}s:5:"barsy";a:0:{}s:13:"wellbeingzone";a:0:{}s:5:"spdns";a:0:{}s:8:"transurl";a:1:{s:1:"*";a:0:{}}s:11:"diskstation";a:0:{}}s:2:"fi";a:4:{s:5:"aland";a:0:{}s:2:"dy";a:0:{}s:8:"blogspot";a:0:{}s:3:"iki";a:0:{}}s:2:"fj";a:1:{s:1:"*";a:0:{}}s:2:"fk";a:1:{s:1:"*";a:0:{}}s:2:"fm";a:0:{}s:2:"fo";a:0:{}s:2:"fr";a:30:{s:3:"com";a:0:{}s:4:"asso";a:0:{}s:3:"nom";a:0:{}s:3:"prd";a:0:{}s:6:"presse";a:0:{}s:2:"tm";a:0:{}s:8:"aeroport";a:0:{}s:7:"assedic";a:0:{}s:6:"avocat";a:0:{}s:6:"avoues";a:0:{}s:3:"cci";a:0:{}s:9:"chambagri";a:0:{}s:21:"chirurgiens-dentistes";a:0:{}s:18:"experts-comptables";a:0:{}s:15:"geometre-expert";a:0:{}s:4:"gouv";a:0:{}s:5:"greta";a:0:{}s:16:"huissier-justice";a:0:{}s:7:"medecin";a:0:{}s:8:"notaires";a:0:{}s:10:"pharmacien";a:0:{}s:4:"port";a:0:{}s:11:"veterinaire";a:0:{}s:6:"fbx-os";a:0:{}s:5:"fbxos";a:0:{}s:10:"freebox-os";a:0:{}s:9:"freeboxos";a:0:{}s:8:"blogspot";a:0:{}s:6:"on-web";a:0:{}s:31:"chirurgiens-dentistes-en-france";a:0:{}}s:2:"ga";a:0:{}s:2:"gb";a:0:{}s:2:"gd";a:1:{s:3:"nom";a:0:{}}s:2:"ge";a:7:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"pvt";a:0:{}}s:2:"gf";a:0:{}s:2:"gg";a:4:{s:2:"co";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"cya";a:0:{}}s:2:"gh";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"mil";a:0:{}}s:2:"gi";a:6:{s:3:"com";a:0:{}s:3:"ltd";a:0:{}s:3:"gov";a:0:{}s:3:"mod";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}}s:2:"gl";a:6:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"nom";a:0:{}}s:2:"gm";a:0:{}s:2:"gn";a:6:{s:2:"ac";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}}s:3:"gov";a:0:{}s:2:"gp";a:6:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:4:"mobi";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:4:"asso";a:0:{}}s:2:"gq";a:0:{}s:2:"gr";a:7:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"gs";a:0:{}s:2:"gt";a:8:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:3:"ind";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"nom";a:0:{}}s:2:"gu";a:1:{s:1:"*";a:0:{}}s:2:"gw";a:0:{}s:2:"gy";a:6:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"hk";a:24:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"idv";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:10:"xn--55qx5d";a:0:{}s:11:"xn--wcvs22d";a:0:{}s:11:"xn--lcvr32d";a:0:{}s:10:"xn--mxtq1m";a:0:{}s:10:"xn--gmqw5a";a:0:{}s:9:"xn--ciqpn";a:0:{}s:11:"xn--gmq050i";a:0:{}s:10:"xn--zf0avx";a:0:{}s:10:"xn--io0a7i";a:0:{}s:10:"xn--mk0axi";a:0:{}s:10:"xn--od0alg";a:0:{}s:11:"xn--od0aq3b";a:0:{}s:9:"xn--tn0ag";a:0:{}s:10:"xn--uc0atv";a:0:{}s:11:"xn--uc0ay4a";a:0:{}s:8:"blogspot";a:0:{}s:3:"ltd";a:0:{}s:3:"inc";a:0:{}}s:2:"hm";a:0:{}s:2:"hn";a:7:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"mil";a:0:{}s:3:"gob";a:0:{}s:3:"nom";a:0:{}}s:2:"hr";a:5:{s:2:"iz";a:0:{}s:4:"from";a:0:{}s:4:"name";a:0:{}s:3:"com";a:0:{}s:8:"blogspot";a:0:{}}s:2:"ht";a:17:{s:3:"com";a:0:{}s:4:"shop";a:0:{}s:4:"firm";a:0:{}s:4:"info";a:0:{}s:5:"adult";a:0:{}s:3:"net";a:0:{}s:3:"pro";a:0:{}s:3:"org";a:0:{}s:3:"med";a:0:{}s:3:"art";a:0:{}s:4:"coop";a:0:{}s:3:"pol";a:0:{}s:4:"asso";a:0:{}s:3:"edu";a:0:{}s:3:"rel";a:0:{}s:4:"gouv";a:0:{}s:5:"perso";a:0:{}}s:2:"hu";a:32:{s:2:"co";a:0:{}s:4:"info";a:0:{}s:3:"org";a:0:{}s:4:"priv";a:0:{}s:5:"sport";a:0:{}s:2:"tm";a:0:{}i:2000;a:0:{}s:5:"agrar";a:0:{}s:4:"bolt";a:0:{}s:6:"casino";a:0:{}s:4:"city";a:0:{}s:7:"erotica";a:0:{}s:7:"erotika";a:0:{}s:4:"film";a:0:{}s:5:"forum";a:0:{}s:5:"games";a:0:{}s:5:"hotel";a:0:{}s:8:"ingatlan";a:0:{}s:6:"jogasz";a:0:{}s:8:"konyvelo";a:0:{}s:5:"lakas";a:0:{}s:5:"media";a:0:{}s:4:"news";a:0:{}s:6:"reklam";a:0:{}s:3:"sex";a:0:{}s:4:"shop";a:0:{}s:4:"suli";a:0:{}s:4:"szex";a:0:{}s:6:"tozsde";a:0:{}s:6:"utazas";a:0:{}s:5:"video";a:0:{}s:8:"blogspot";a:0:{}}s:2:"id";a:11:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:1:{s:8:"blogspot";a:0:{}}s:4:"desa";a:0:{}s:2:"go";a:0:{}s:3:"mil";a:0:{}s:2:"my";a:0:{}s:3:"net";a:0:{}s:2:"or";a:0:{}s:3:"sch";a:0:{}s:3:"web";a:0:{}}s:2:"ie";a:2:{s:3:"gov";a:0:{}s:8:"blogspot";a:0:{}}s:2:"il";a:8:{s:2:"ac";a:0:{}s:2:"co";a:1:{s:8:"blogspot";a:0:{}}s:3:"gov";a:0:{}s:3:"idf";a:0:{}s:3:"k12";a:0:{}s:4:"muni";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"im";a:9:{s:2:"ac";a:0:{}s:2:"co";a:2:{s:3:"ltd";a:0:{}s:3:"plc";a:0:{}}s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:2:"tt";a:0:{}s:2:"tv";a:0:{}s:2:"ro";a:0:{}s:3:"nom";a:0:{}}s:2:"in";a:15:{s:2:"co";a:0:{}s:4:"firm";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gen";a:0:{}s:3:"ind";a:0:{}s:3:"nic";a:0:{}s:2:"ac";a:0:{}s:3:"edu";a:0:{}s:3:"res";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:7:"cloudns";a:0:{}s:8:"blogspot";a:0:{}s:5:"barsy";a:0:{}}s:4:"info";a:17:{s:7:"cloudns";a:0:{}s:11:"dynamic-dns";a:0:{}s:6:"dyndns";a:0:{}s:19:"barrel-of-knowledge";a:0:{}s:20:"barrell-of-knowledge";a:0:{}s:7:"for-our";a:0:{}s:9:"groks-the";a:0:{}s:10:"groks-this";a:0:{}s:13:"here-for-more";a:0:{}s:10:"knowsitall";a:0:{}s:6:"selfip";a:0:{}s:6:"webhop";a:0:{}s:8:"nsupdate";a:0:{}s:6:"dvrcam";a:0:{}s:12:"ilovecollege";a:0:{}s:5:"no-ip";a:0:{}s:6:"v-info";a:0:{}}s:3:"int";a:1:{s:2:"eu";a:0:{}}s:2:"io";a:26:{s:3:"com";a:0:{}s:12:"backplaneapp";a:0:{}s:7:"boxfuse";a:0:{}s:17:"browsersafetymark";a:0:{}s:5:"dedyn";a:0:{}s:4:"drud";a:0:{}s:8:"definima";a:0:{}s:6:"enonic";a:1:{s:8:"customer";a:0:{}}s:6:"github";a:0:{}s:6:"gitlab";a:0:{}s:10:"hasura-app";a:0:{}s:5:"ngrok";a:0:{}s:7:"nodeart";a:1:{s:5:"stage";a:0:{}}s:5:"nodum";a:0:{}s:3:"nid";a:0:{}s:12:"pantheonsite";a:0:{}s:8:"protonet";a:0:{}s:10:"vaporcloud";a:0:{}s:3:"hzc";a:0:{}s:8:"sandcats";a:0:{}s:9:"shiftedit";a:0:{}s:4:"lair";a:1:{s:4:"apps";a:0:{}}s:6:"stolos";a:1:{s:1:"*";a:0:{}}s:8:"spacekit";a:0:{}s:9:"thingdust";a:4:{s:3:"dev";a:1:{s:4:"cust";a:0:{}}s:6:"disrec";a:1:{s:4:"cust";a:0:{}}s:4:"prod";a:1:{s:4:"cust";a:0:{}}s:7:"testing";a:1:{s:4:"cust";a:0:{}}}s:8:"wedeploy";a:0:{}}s:2:"iq";a:6:{s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}}s:2:"ir";a:9:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:3:"gov";a:0:{}s:2:"id";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sch";a:0:{}s:15:"xn--mgba3a4f16a";a:0:{}s:14:"xn--mgba3a4fra";a:0:{}}s:2:"is";a:8:{s:3:"net";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"int";a:0:{}s:7:"cupcake";a:0:{}s:8:"blogspot";a:0:{}}s:2:"it";a:369:{s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"abr";a:0:{}s:7:"abruzzo";a:0:{}s:12:"aosta-valley";a:0:{}s:11:"aostavalley";a:0:{}s:3:"bas";a:0:{}s:10:"basilicata";a:0:{}s:3:"cal";a:0:{}s:8:"calabria";a:0:{}s:3:"cam";a:0:{}s:8:"campania";a:0:{}s:14:"emilia-romagna";a:0:{}s:13:"emiliaromagna";a:0:{}s:3:"emr";a:0:{}s:15:"friuli-v-giulia";a:0:{}s:16:"friuli-ve-giulia";a:0:{}s:15:"friuli-vegiulia";a:0:{}s:21:"friuli-venezia-giulia";a:0:{}s:20:"friuli-veneziagiulia";a:0:{}s:14:"friuli-vgiulia";a:0:{}s:14:"friuliv-giulia";a:0:{}s:15:"friulive-giulia";a:0:{}s:14:"friulivegiulia";a:0:{}s:20:"friulivenezia-giulia";a:0:{}s:19:"friuliveneziagiulia";a:0:{}s:13:"friulivgiulia";a:0:{}s:3:"fvg";a:0:{}s:3:"laz";a:0:{}s:5:"lazio";a:0:{}s:3:"lig";a:0:{}s:7:"liguria";a:0:{}s:3:"lom";a:0:{}s:9:"lombardia";a:0:{}s:8:"lombardy";a:0:{}s:7:"lucania";a:0:{}s:3:"mar";a:0:{}s:6:"marche";a:0:{}s:3:"mol";a:0:{}s:6:"molise";a:0:{}s:8:"piedmont";a:0:{}s:8:"piemonte";a:0:{}s:3:"pmn";a:0:{}s:3:"pug";a:0:{}s:6:"puglia";a:0:{}s:3:"sar";a:0:{}s:8:"sardegna";a:0:{}s:8:"sardinia";a:0:{}s:3:"sic";a:0:{}s:7:"sicilia";a:0:{}s:6:"sicily";a:0:{}s:3:"taa";a:0:{}s:3:"tos";a:0:{}s:7:"toscana";a:0:{}s:16:"trentino-a-adige";a:0:{}s:15:"trentino-aadige";a:0:{}s:19:"trentino-alto-adige";a:0:{}s:18:"trentino-altoadige";a:0:{}s:16:"trentino-s-tirol";a:0:{}s:15:"trentino-stirol";a:0:{}s:18:"trentino-sud-tirol";a:0:{}s:17:"trentino-sudtirol";a:0:{}s:19:"trentino-sued-tirol";a:0:{}s:18:"trentino-suedtirol";a:0:{}s:15:"trentinoa-adige";a:0:{}s:14:"trentinoaadige";a:0:{}s:18:"trentinoalto-adige";a:0:{}s:17:"trentinoaltoadige";a:0:{}s:15:"trentinos-tirol";a:0:{}s:14:"trentinostirol";a:0:{}s:17:"trentinosud-tirol";a:0:{}s:16:"trentinosudtirol";a:0:{}s:18:"trentinosued-tirol";a:0:{}s:17:"trentinosuedtirol";a:0:{}s:7:"tuscany";a:0:{}s:3:"umb";a:0:{}s:6:"umbria";a:0:{}s:11:"val-d-aosta";a:0:{}s:10:"val-daosta";a:0:{}s:10:"vald-aosta";a:0:{}s:9:"valdaosta";a:0:{}s:11:"valle-aosta";a:0:{}s:13:"valle-d-aosta";a:0:{}s:12:"valle-daosta";a:0:{}s:10:"valleaosta";a:0:{}s:12:"valled-aosta";a:0:{}s:11:"valledaosta";a:0:{}s:12:"vallee-aoste";a:0:{}s:11:"valleeaoste";a:0:{}s:3:"vao";a:0:{}s:3:"vda";a:0:{}s:3:"ven";a:0:{}s:6:"veneto";a:0:{}s:2:"ag";a:0:{}s:9:"agrigento";a:0:{}s:2:"al";a:0:{}s:11:"alessandria";a:0:{}s:10:"alto-adige";a:0:{}s:9:"altoadige";a:0:{}s:2:"an";a:0:{}s:6:"ancona";a:0:{}s:21:"andria-barletta-trani";a:0:{}s:21:"andria-trani-barletta";a:0:{}s:19:"andriabarlettatrani";a:0:{}s:19:"andriatranibarletta";a:0:{}s:2:"ao";a:0:{}s:5:"aosta";a:0:{}s:5:"aoste";a:0:{}s:2:"ap";a:0:{}s:2:"aq";a:0:{}s:6:"aquila";a:0:{}s:2:"ar";a:0:{}s:6:"arezzo";a:0:{}s:13:"ascoli-piceno";a:0:{}s:12:"ascolipiceno";a:0:{}s:4:"asti";a:0:{}s:2:"at";a:0:{}s:2:"av";a:0:{}s:8:"avellino";a:0:{}s:2:"ba";a:0:{}s:6:"balsan";a:0:{}s:4:"bari";a:0:{}s:21:"barletta-trani-andria";a:0:{}s:19:"barlettatraniandria";a:0:{}s:7:"belluno";a:0:{}s:9:"benevento";a:0:{}s:7:"bergamo";a:0:{}s:2:"bg";a:0:{}s:2:"bi";a:0:{}s:6:"biella";a:0:{}s:2:"bl";a:0:{}s:2:"bn";a:0:{}s:2:"bo";a:0:{}s:7:"bologna";a:0:{}s:7:"bolzano";a:0:{}s:5:"bozen";a:0:{}s:2:"br";a:0:{}s:7:"brescia";a:0:{}s:8:"brindisi";a:0:{}s:2:"bs";a:0:{}s:2:"bt";a:0:{}s:2:"bz";a:0:{}s:2:"ca";a:0:{}s:8:"cagliari";a:0:{}s:13:"caltanissetta";a:0:{}s:15:"campidano-medio";a:0:{}s:14:"campidanomedio";a:0:{}s:10:"campobasso";a:0:{}s:17:"carbonia-iglesias";a:0:{}s:16:"carboniaiglesias";a:0:{}s:13:"carrara-massa";a:0:{}s:12:"carraramassa";a:0:{}s:7:"caserta";a:0:{}s:7:"catania";a:0:{}s:9:"catanzaro";a:0:{}s:2:"cb";a:0:{}s:2:"ce";a:0:{}s:12:"cesena-forli";a:0:{}s:11:"cesenaforli";a:0:{}s:2:"ch";a:0:{}s:6:"chieti";a:0:{}s:2:"ci";a:0:{}s:2:"cl";a:0:{}s:2:"cn";a:0:{}s:2:"co";a:0:{}s:4:"como";a:0:{}s:7:"cosenza";a:0:{}s:2:"cr";a:0:{}s:7:"cremona";a:0:{}s:7:"crotone";a:0:{}s:2:"cs";a:0:{}s:2:"ct";a:0:{}s:5:"cuneo";a:0:{}s:2:"cz";a:0:{}s:14:"dell-ogliastra";a:0:{}s:13:"dellogliastra";a:0:{}s:2:"en";a:0:{}s:4:"enna";a:0:{}s:2:"fc";a:0:{}s:2:"fe";a:0:{}s:5:"fermo";a:0:{}s:7:"ferrara";a:0:{}s:2:"fg";a:0:{}s:2:"fi";a:0:{}s:7:"firenze";a:0:{}s:8:"florence";a:0:{}s:2:"fm";a:0:{}s:6:"foggia";a:0:{}s:12:"forli-cesena";a:0:{}s:11:"forlicesena";a:0:{}s:2:"fr";a:0:{}s:9:"frosinone";a:0:{}s:2:"ge";a:0:{}s:5:"genoa";a:0:{}s:6:"genova";a:0:{}s:2:"go";a:0:{}s:7:"gorizia";a:0:{}s:2:"gr";a:0:{}s:8:"grosseto";a:0:{}s:17:"iglesias-carbonia";a:0:{}s:16:"iglesiascarbonia";a:0:{}s:2:"im";a:0:{}s:7:"imperia";a:0:{}s:2:"is";a:0:{}s:7:"isernia";a:0:{}s:2:"kr";a:0:{}s:9:"la-spezia";a:0:{}s:7:"laquila";a:0:{}s:8:"laspezia";a:0:{}s:6:"latina";a:0:{}s:2:"lc";a:0:{}s:2:"le";a:0:{}s:5:"lecce";a:0:{}s:5:"lecco";a:0:{}s:2:"li";a:0:{}s:7:"livorno";a:0:{}s:2:"lo";a:0:{}s:4:"lodi";a:0:{}s:2:"lt";a:0:{}s:2:"lu";a:0:{}s:5:"lucca";a:0:{}s:8:"macerata";a:0:{}s:7:"mantova";a:0:{}s:13:"massa-carrara";a:0:{}s:12:"massacarrara";a:0:{}s:6:"matera";a:0:{}s:2:"mb";a:0:{}s:2:"mc";a:0:{}s:2:"me";a:0:{}s:15:"medio-campidano";a:0:{}s:14:"mediocampidano";a:0:{}s:7:"messina";a:0:{}s:2:"mi";a:0:{}s:5:"milan";a:0:{}s:6:"milano";a:0:{}s:2:"mn";a:0:{}s:2:"mo";a:0:{}s:6:"modena";a:0:{}s:13:"monza-brianza";a:0:{}s:21:"monza-e-della-brianza";a:0:{}s:5:"monza";a:0:{}s:12:"monzabrianza";a:0:{}s:13:"monzaebrianza";a:0:{}s:18:"monzaedellabrianza";a:0:{}s:2:"ms";a:0:{}s:2:"mt";a:0:{}s:2:"na";a:0:{}s:6:"naples";a:0:{}s:6:"napoli";a:0:{}s:2:"no";a:0:{}s:6:"novara";a:0:{}s:2:"nu";a:0:{}s:5:"nuoro";a:0:{}s:2:"og";a:0:{}s:9:"ogliastra";a:0:{}s:12:"olbia-tempio";a:0:{}s:11:"olbiatempio";a:0:{}s:2:"or";a:0:{}s:8:"oristano";a:0:{}s:2:"ot";a:0:{}s:2:"pa";a:0:{}s:6:"padova";a:0:{}s:5:"padua";a:0:{}s:7:"palermo";a:0:{}s:5:"parma";a:0:{}s:5:"pavia";a:0:{}s:2:"pc";a:0:{}s:2:"pd";a:0:{}s:2:"pe";a:0:{}s:7:"perugia";a:0:{}s:13:"pesaro-urbino";a:0:{}s:12:"pesarourbino";a:0:{}s:7:"pescara";a:0:{}s:2:"pg";a:0:{}s:2:"pi";a:0:{}s:8:"piacenza";a:0:{}s:4:"pisa";a:0:{}s:7:"pistoia";a:0:{}s:2:"pn";a:0:{}s:2:"po";a:0:{}s:9:"pordenone";a:0:{}s:7:"potenza";a:0:{}s:2:"pr";a:0:{}s:5:"prato";a:0:{}s:2:"pt";a:0:{}s:2:"pu";a:0:{}s:2:"pv";a:0:{}s:2:"pz";a:0:{}s:2:"ra";a:0:{}s:6:"ragusa";a:0:{}s:7:"ravenna";a:0:{}s:2:"rc";a:0:{}s:2:"re";a:0:{}s:15:"reggio-calabria";a:0:{}s:13:"reggio-emilia";a:0:{}s:14:"reggiocalabria";a:0:{}s:12:"reggioemilia";a:0:{}s:2:"rg";a:0:{}s:2:"ri";a:0:{}s:5:"rieti";a:0:{}s:6:"rimini";a:0:{}s:2:"rm";a:0:{}s:2:"rn";a:0:{}s:2:"ro";a:0:{}s:4:"roma";a:0:{}s:4:"rome";a:0:{}s:6:"rovigo";a:0:{}s:2:"sa";a:0:{}s:7:"salerno";a:0:{}s:7:"sassari";a:0:{}s:6:"savona";a:0:{}s:2:"si";a:0:{}s:5:"siena";a:0:{}s:8:"siracusa";a:0:{}s:2:"so";a:0:{}s:7:"sondrio";a:0:{}s:2:"sp";a:0:{}s:2:"sr";a:0:{}s:2:"ss";a:0:{}s:9:"suedtirol";a:0:{}s:2:"sv";a:0:{}s:2:"ta";a:0:{}s:7:"taranto";a:0:{}s:2:"te";a:0:{}s:12:"tempio-olbia";a:0:{}s:11:"tempioolbia";a:0:{}s:6:"teramo";a:0:{}s:5:"terni";a:0:{}s:2:"tn";a:0:{}s:2:"to";a:0:{}s:6:"torino";a:0:{}s:2:"tp";a:0:{}s:2:"tr";a:0:{}s:21:"trani-andria-barletta";a:0:{}s:21:"trani-barletta-andria";a:0:{}s:19:"traniandriabarletta";a:0:{}s:19:"tranibarlettaandria";a:0:{}s:7:"trapani";a:0:{}s:8:"trentino";a:0:{}s:6:"trento";a:0:{}s:7:"treviso";a:0:{}s:7:"trieste";a:0:{}s:2:"ts";a:0:{}s:5:"turin";a:0:{}s:2:"tv";a:0:{}s:2:"ud";a:0:{}s:5:"udine";a:0:{}s:13:"urbino-pesaro";a:0:{}s:12:"urbinopesaro";a:0:{}s:2:"va";a:0:{}s:6:"varese";a:0:{}s:2:"vb";a:0:{}s:2:"vc";a:0:{}s:2:"ve";a:0:{}s:7:"venezia";a:0:{}s:6:"venice";a:0:{}s:8:"verbania";a:0:{}s:8:"vercelli";a:0:{}s:6:"verona";a:0:{}s:2:"vi";a:0:{}s:13:"vibo-valentia";a:0:{}s:12:"vibovalentia";a:0:{}s:7:"vicenza";a:0:{}s:7:"viterbo";a:0:{}s:2:"vr";a:0:{}s:2:"vs";a:0:{}s:2:"vt";a:0:{}s:2:"vv";a:0:{}s:8:"blogspot";a:0:{}}s:2:"je";a:3:{s:2:"co";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"jm";a:1:{s:1:"*";a:0:{}}s:2:"jo";a:8:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}s:3:"sch";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}}s:4:"jobs";a:0:{}s:2:"jp";a:111:{s:2:"ac";a:0:{}s:2:"ad";a:0:{}s:2:"co";a:0:{}s:2:"ed";a:0:{}s:2:"go";a:0:{}s:2:"gr";a:0:{}s:2:"lg";a:0:{}s:2:"ne";a:0:{}s:2:"or";a:0:{}s:5:"aichi";a:52:{s:5:"aisai";a:0:{}s:3:"ama";a:0:{}s:4:"anjo";a:0:{}s:5:"asuke";a:0:{}s:6:"chiryu";a:0:{}s:5:"chita";a:0:{}s:4:"fuso";a:0:{}s:8:"gamagori";a:0:{}s:5:"handa";a:0:{}s:4:"hazu";a:0:{}s:7:"hekinan";a:0:{}s:10:"higashiura";a:0:{}s:10:"ichinomiya";a:0:{}s:7:"inazawa";a:0:{}s:7:"inuyama";a:0:{}s:7:"isshiki";a:0:{}s:7:"iwakura";a:0:{}s:5:"kanie";a:0:{}s:6:"kariya";a:0:{}s:7:"kasugai";a:0:{}s:4:"kira";a:0:{}s:6:"kiyosu";a:0:{}s:6:"komaki";a:0:{}s:5:"konan";a:0:{}s:4:"kota";a:0:{}s:6:"mihama";a:0:{}s:7:"miyoshi";a:0:{}s:6:"nishio";a:0:{}s:7:"nisshin";a:0:{}s:3:"obu";a:0:{}s:6:"oguchi";a:0:{}s:5:"oharu";a:0:{}s:7:"okazaki";a:0:{}s:10:"owariasahi";a:0:{}s:4:"seto";a:0:{}s:8:"shikatsu";a:0:{}s:9:"shinshiro";a:0:{}s:7:"shitara";a:0:{}s:6:"tahara";a:0:{}s:8:"takahama";a:0:{}s:9:"tobishima";a:0:{}s:4:"toei";a:0:{}s:4:"togo";a:0:{}s:5:"tokai";a:0:{}s:8:"tokoname";a:0:{}s:7:"toyoake";a:0:{}s:9:"toyohashi";a:0:{}s:8:"toyokawa";a:0:{}s:6:"toyone";a:0:{}s:6:"toyota";a:0:{}s:8:"tsushima";a:0:{}s:6:"yatomi";a:0:{}}s:5:"akita";a:28:{s:5:"akita";a:0:{}s:6:"daisen";a:0:{}s:8:"fujisato";a:0:{}s:6:"gojome";a:0:{}s:11:"hachirogata";a:0:{}s:6:"happou";a:0:{}s:13:"higashinaruse";a:0:{}s:5:"honjo";a:0:{}s:6:"honjyo";a:0:{}s:5:"ikawa";a:0:{}s:9:"kamikoani";a:0:{}s:7:"kamioka";a:0:{}s:8:"katagami";a:0:{}s:6:"kazuno";a:0:{}s:9:"kitaakita";a:0:{}s:6:"kosaka";a:0:{}s:5:"kyowa";a:0:{}s:6:"misato";a:0:{}s:6:"mitane";a:0:{}s:9:"moriyoshi";a:0:{}s:6:"nikaho";a:0:{}s:7:"noshiro";a:0:{}s:5:"odate";a:0:{}s:3:"oga";a:0:{}s:5:"ogata";a:0:{}s:7:"semboku";a:0:{}s:6:"yokote";a:0:{}s:9:"yurihonjo";a:0:{}}s:6:"aomori";a:22:{s:6:"aomori";a:0:{}s:6:"gonohe";a:0:{}s:9:"hachinohe";a:0:{}s:9:"hashikami";a:0:{}s:7:"hiranai";a:0:{}s:8:"hirosaki";a:0:{}s:9:"itayanagi";a:0:{}s:8:"kuroishi";a:0:{}s:6:"misawa";a:0:{}s:5:"mutsu";a:0:{}s:10:"nakadomari";a:0:{}s:6:"noheji";a:0:{}s:6:"oirase";a:0:{}s:5:"owani";a:0:{}s:8:"rokunohe";a:0:{}s:7:"sannohe";a:0:{}s:10:"shichinohe";a:0:{}s:6:"shingo";a:0:{}s:5:"takko";a:0:{}s:6:"towada";a:0:{}s:7:"tsugaru";a:0:{}s:7:"tsuruta";a:0:{}}s:5:"chiba";a:58:{s:5:"abiko";a:0:{}s:5:"asahi";a:0:{}s:6:"chonan";a:0:{}s:6:"chosei";a:0:{}s:6:"choshi";a:0:{}s:4:"chuo";a:0:{}s:9:"funabashi";a:0:{}s:6:"futtsu";a:0:{}s:10:"hanamigawa";a:0:{}s:8:"ichihara";a:0:{}s:8:"ichikawa";a:0:{}s:10:"ichinomiya";a:0:{}s:5:"inzai";a:0:{}s:5:"isumi";a:0:{}s:8:"kamagaya";a:0:{}s:8:"kamogawa";a:0:{}s:7:"kashiwa";a:0:{}s:6:"katori";a:0:{}s:8:"katsuura";a:0:{}s:7:"kimitsu";a:0:{}s:8:"kisarazu";a:0:{}s:6:"kozaki";a:0:{}s:8:"kujukuri";a:0:{}s:6:"kyonan";a:0:{}s:7:"matsudo";a:0:{}s:6:"midori";a:0:{}s:6:"mihama";a:0:{}s:10:"minamiboso";a:0:{}s:6:"mobara";a:0:{}s:9:"mutsuzawa";a:0:{}s:6:"nagara";a:0:{}s:10:"nagareyama";a:0:{}s:9:"narashino";a:0:{}s:6:"narita";a:0:{}s:4:"noda";a:0:{}s:13:"oamishirasato";a:0:{}s:7:"omigawa";a:0:{}s:6:"onjuku";a:0:{}s:5:"otaki";a:0:{}s:5:"sakae";a:0:{}s:6:"sakura";a:0:{}s:9:"shimofusa";a:0:{}s:7:"shirako";a:0:{}s:6:"shiroi";a:0:{}s:6:"shisui";a:0:{}s:9:"sodegaura";a:0:{}s:4:"sosa";a:0:{}s:4:"tako";a:0:{}s:8:"tateyama";a:0:{}s:6:"togane";a:0:{}s:8:"tohnosho";a:0:{}s:8:"tomisato";a:0:{}s:7:"urayasu";a:0:{}s:9:"yachimata";a:0:{}s:7:"yachiyo";a:0:{}s:10:"yokaichiba";a:0:{}s:15:"yokoshibahikari";a:0:{}s:10:"yotsukaido";a:0:{}}s:5:"ehime";a:22:{s:5:"ainan";a:0:{}s:5:"honai";a:0:{}s:5:"ikata";a:0:{}s:7:"imabari";a:0:{}s:3:"iyo";a:0:{}s:8:"kamijima";a:0:{}s:6:"kihoku";a:0:{}s:9:"kumakogen";a:0:{}s:6:"masaki";a:0:{}s:7:"matsuno";a:0:{}s:9:"matsuyama";a:0:{}s:8:"namikata";a:0:{}s:7:"niihama";a:0:{}s:3:"ozu";a:0:{}s:5:"saijo";a:0:{}s:5:"seiyo";a:0:{}s:11:"shikokuchuo";a:0:{}s:4:"tobe";a:0:{}s:4:"toon";a:0:{}s:6:"uchiko";a:0:{}s:7:"uwajima";a:0:{}s:10:"yawatahama";a:0:{}}s:5:"fukui";a:15:{s:7:"echizen";a:0:{}s:7:"eiheiji";a:0:{}s:5:"fukui";a:0:{}s:5:"ikeda";a:0:{}s:9:"katsuyama";a:0:{}s:6:"mihama";a:0:{}s:13:"minamiechizen";a:0:{}s:5:"obama";a:0:{}s:3:"ohi";a:0:{}s:3:"ono";a:0:{}s:5:"sabae";a:0:{}s:5:"sakai";a:0:{}s:8:"takahama";a:0:{}s:7:"tsuruga";a:0:{}s:6:"wakasa";a:0:{}}s:7:"fukuoka";a:63:{s:6:"ashiya";a:0:{}s:5:"buzen";a:0:{}s:7:"chikugo";a:0:{}s:7:"chikuho";a:0:{}s:7:"chikujo";a:0:{}s:10:"chikushino";a:0:{}s:8:"chikuzen";a:0:{}s:4:"chuo";a:0:{}s:7:"dazaifu";a:0:{}s:7:"fukuchi";a:0:{}s:6:"hakata";a:0:{}s:7:"higashi";a:0:{}s:8:"hirokawa";a:0:{}s:8:"hisayama";a:0:{}s:6:"iizuka";a:0:{}s:8:"inatsuki";a:0:{}s:4:"kaho";a:0:{}s:6:"kasuga";a:0:{}s:6:"kasuya";a:0:{}s:6:"kawara";a:0:{}s:6:"keisen";a:0:{}s:4:"koga";a:0:{}s:6:"kurate";a:0:{}s:6:"kurogi";a:0:{}s:6:"kurume";a:0:{}s:6:"minami";a:0:{}s:6:"miyako";a:0:{}s:6:"miyama";a:0:{}s:8:"miyawaka";a:0:{}s:8:"mizumaki";a:0:{}s:8:"munakata";a:0:{}s:8:"nakagawa";a:0:{}s:6:"nakama";a:0:{}s:5:"nishi";a:0:{}s:6:"nogata";a:0:{}s:5:"ogori";a:0:{}s:7:"okagaki";a:0:{}s:5:"okawa";a:0:{}s:3:"oki";a:0:{}s:5:"omuta";a:0:{}s:4:"onga";a:0:{}s:5:"onojo";a:0:{}s:3:"oto";a:0:{}s:7:"saigawa";a:0:{}s:8:"sasaguri";a:0:{}s:6:"shingu";a:0:{}s:13:"shinyoshitomi";a:0:{}s:6:"shonai";a:0:{}s:5:"soeda";a:0:{}s:3:"sue";a:0:{}s:9:"tachiarai";a:0:{}s:6:"tagawa";a:0:{}s:6:"takata";a:0:{}s:4:"toho";a:0:{}s:7:"toyotsu";a:0:{}s:6:"tsuiki";a:0:{}s:5:"ukiha";a:0:{}s:3:"umi";a:0:{}s:4:"usui";a:0:{}s:6:"yamada";a:0:{}s:4:"yame";a:0:{}s:8:"yanagawa";a:0:{}s:9:"yukuhashi";a:0:{}}s:9:"fukushima";a:51:{s:9:"aizubange";a:0:{}s:10:"aizumisato";a:0:{}s:13:"aizuwakamatsu";a:0:{}s:7:"asakawa";a:0:{}s:6:"bandai";a:0:{}s:4:"date";a:0:{}s:9:"fukushima";a:0:{}s:8:"furudono";a:0:{}s:6:"futaba";a:0:{}s:6:"hanawa";a:0:{}s:7:"higashi";a:0:{}s:6:"hirata";a:0:{}s:6:"hirono";a:0:{}s:6:"iitate";a:0:{}s:10:"inawashiro";a:0:{}s:8:"ishikawa";a:0:{}s:5:"iwaki";a:0:{}s:9:"izumizaki";a:0:{}s:10:"kagamiishi";a:0:{}s:8:"kaneyama";a:0:{}s:8:"kawamata";a:0:{}s:8:"kitakata";a:0:{}s:12:"kitashiobara";a:0:{}s:5:"koori";a:0:{}s:8:"koriyama";a:0:{}s:6:"kunimi";a:0:{}s:6:"miharu";a:0:{}s:7:"mishima";a:0:{}s:5:"namie";a:0:{}s:5:"nango";a:0:{}s:9:"nishiaizu";a:0:{}s:7:"nishigo";a:0:{}s:5:"okuma";a:0:{}s:7:"omotego";a:0:{}s:3:"ono";a:0:{}s:5:"otama";a:0:{}s:8:"samegawa";a:0:{}s:7:"shimogo";a:0:{}s:9:"shirakawa";a:0:{}s:5:"showa";a:0:{}s:4:"soma";a:0:{}s:8:"sukagawa";a:0:{}s:7:"taishin";a:0:{}s:8:"tamakawa";a:0:{}s:8:"tanagura";a:0:{}s:5:"tenei";a:0:{}s:6:"yabuki";a:0:{}s:6:"yamato";a:0:{}s:9:"yamatsuri";a:0:{}s:7:"yanaizu";a:0:{}s:6:"yugawa";a:0:{}}s:4:"gifu";a:38:{s:7:"anpachi";a:0:{}s:3:"ena";a:0:{}s:4:"gifu";a:0:{}s:5:"ginan";a:0:{}s:4:"godo";a:0:{}s:4:"gujo";a:0:{}s:7:"hashima";a:0:{}s:7:"hichiso";a:0:{}s:4:"hida";a:0:{}s:16:"higashishirakawa";a:0:{}s:7:"ibigawa";a:0:{}s:5:"ikeda";a:0:{}s:12:"kakamigahara";a:0:{}s:4:"kani";a:0:{}s:8:"kasahara";a:0:{}s:9:"kasamatsu";a:0:{}s:6:"kawaue";a:0:{}s:8:"kitagata";a:0:{}s:4:"mino";a:0:{}s:8:"minokamo";a:0:{}s:6:"mitake";a:0:{}s:8:"mizunami";a:0:{}s:6:"motosu";a:0:{}s:11:"nakatsugawa";a:0:{}s:5:"ogaki";a:0:{}s:8:"sakahogi";a:0:{}s:4:"seki";a:0:{}s:10:"sekigahara";a:0:{}s:9:"shirakawa";a:0:{}s:6:"tajimi";a:0:{}s:8:"takayama";a:0:{}s:5:"tarui";a:0:{}s:4:"toki";a:0:{}s:6:"tomika";a:0:{}s:8:"wanouchi";a:0:{}s:8:"yamagata";a:0:{}s:6:"yaotsu";a:0:{}s:4:"yoro";a:0:{}}s:5:"gunma";a:36:{s:6:"annaka";a:0:{}s:7:"chiyoda";a:0:{}s:7:"fujioka";a:0:{}s:15:"higashiagatsuma";a:0:{}s:7:"isesaki";a:0:{}s:7:"itakura";a:0:{}s:5:"kanna";a:0:{}s:5:"kanra";a:0:{}s:9:"katashina";a:0:{}s:6:"kawaba";a:0:{}s:5:"kiryu";a:0:{}s:7:"kusatsu";a:0:{}s:8:"maebashi";a:0:{}s:5:"meiwa";a:0:{}s:6:"midori";a:0:{}s:8:"minakami";a:0:{}s:10:"naganohara";a:0:{}s:8:"nakanojo";a:0:{}s:7:"nanmoku";a:0:{}s:6:"numata";a:0:{}s:6:"oizumi";a:0:{}s:3:"ora";a:0:{}s:3:"ota";a:0:{}s:9:"shibukawa";a:0:{}s:9:"shimonita";a:0:{}s:6:"shinto";a:0:{}s:5:"showa";a:0:{}s:8:"takasaki";a:0:{}s:8:"takayama";a:0:{}s:8:"tamamura";a:0:{}s:11:"tatebayashi";a:0:{}s:7:"tomioka";a:0:{}s:9:"tsukiyono";a:0:{}s:8:"tsumagoi";a:0:{}s:4:"ueno";a:0:{}s:8:"yoshioka";a:0:{}}s:9:"hiroshima";a:25:{s:9:"asaminami";a:0:{}s:5:"daiwa";a:0:{}s:7:"etajima";a:0:{}s:5:"fuchu";a:0:{}s:8:"fukuyama";a:0:{}s:11:"hatsukaichi";a:0:{}s:16:"higashihiroshima";a:0:{}s:5:"hongo";a:0:{}s:12:"jinsekikogen";a:0:{}s:5:"kaita";a:0:{}s:3:"kui";a:0:{}s:6:"kumano";a:0:{}s:4:"kure";a:0:{}s:6:"mihara";a:0:{}s:7:"miyoshi";a:0:{}s:4:"naka";a:0:{}s:8:"onomichi";a:0:{}s:13:"osakikamijima";a:0:{}s:5:"otake";a:0:{}s:4:"saka";a:0:{}s:4:"sera";a:0:{}s:9:"seranishi";a:0:{}s:8:"shinichi";a:0:{}s:7:"shobara";a:0:{}s:8:"takehara";a:0:{}}s:8:"hokkaido";a:142:{s:8:"abashiri";a:0:{}s:5:"abira";a:0:{}s:7:"aibetsu";a:0:{}s:7:"akabira";a:0:{}s:7:"akkeshi";a:0:{}s:9:"asahikawa";a:0:{}s:9:"ashibetsu";a:0:{}s:6:"ashoro";a:0:{}s:6:"assabu";a:0:{}s:6:"atsuma";a:0:{}s:5:"bibai";a:0:{}s:4:"biei";a:0:{}s:6:"bifuka";a:0:{}s:6:"bihoro";a:0:{}s:8:"biratori";a:0:{}s:11:"chippubetsu";a:0:{}s:7:"chitose";a:0:{}s:4:"date";a:0:{}s:6:"ebetsu";a:0:{}s:7:"embetsu";a:0:{}s:5:"eniwa";a:0:{}s:5:"erimo";a:0:{}s:4:"esan";a:0:{}s:6:"esashi";a:0:{}s:8:"fukagawa";a:0:{}s:9:"fukushima";a:0:{}s:6:"furano";a:0:{}s:8:"furubira";a:0:{}s:6:"haboro";a:0:{}s:8:"hakodate";a:0:{}s:12:"hamatonbetsu";a:0:{}s:6:"hidaka";a:0:{}s:13:"higashikagura";a:0:{}s:11:"higashikawa";a:0:{}s:5:"hiroo";a:0:{}s:7:"hokuryu";a:0:{}s:6:"hokuto";a:0:{}s:8:"honbetsu";a:0:{}s:9:"horokanai";a:0:{}s:8:"horonobe";a:0:{}s:5:"ikeda";a:0:{}s:7:"imakane";a:0:{}s:8:"ishikari";a:0:{}s:9:"iwamizawa";a:0:{}s:6:"iwanai";a:0:{}s:10:"kamifurano";a:0:{}s:8:"kamikawa";a:0:{}s:11:"kamishihoro";a:0:{}s:12:"kamisunagawa";a:0:{}s:8:"kamoenai";a:0:{}s:6:"kayabe";a:0:{}s:8:"kembuchi";a:0:{}s:7:"kikonai";a:0:{}s:9:"kimobetsu";a:0:{}s:13:"kitahiroshima";a:0:{}s:6:"kitami";a:0:{}s:8:"kiyosato";a:0:{}s:9:"koshimizu";a:0:{}s:8:"kunneppu";a:0:{}s:8:"kuriyama";a:0:{}s:12:"kuromatsunai";a:0:{}s:7:"kushiro";a:0:{}s:7:"kutchan";a:0:{}s:5:"kyowa";a:0:{}s:7:"mashike";a:0:{}s:8:"matsumae";a:0:{}s:6:"mikasa";a:0:{}s:12:"minamifurano";a:0:{}s:8:"mombetsu";a:0:{}s:8:"moseushi";a:0:{}s:6:"mukawa";a:0:{}s:7:"muroran";a:0:{}s:4:"naie";a:0:{}s:8:"nakagawa";a:0:{}s:12:"nakasatsunai";a:0:{}s:12:"nakatombetsu";a:0:{}s:5:"nanae";a:0:{}s:7:"nanporo";a:0:{}s:6:"nayoro";a:0:{}s:6:"nemuro";a:0:{}s:8:"niikappu";a:0:{}s:4:"niki";a:0:{}s:11:"nishiokoppe";a:0:{}s:11:"noboribetsu";a:0:{}s:6:"numata";a:0:{}s:7:"obihiro";a:0:{}s:5:"obira";a:0:{}s:5:"oketo";a:0:{}s:6:"okoppe";a:0:{}s:5:"otaru";a:0:{}s:5:"otobe";a:0:{}s:7:"otofuke";a:0:{}s:9:"otoineppu";a:0:{}s:4:"oumu";a:0:{}s:5:"ozora";a:0:{}s:5:"pippu";a:0:{}s:8:"rankoshi";a:0:{}s:5:"rebun";a:0:{}s:9:"rikubetsu";a:0:{}s:7:"rishiri";a:0:{}s:11:"rishirifuji";a:0:{}s:6:"saroma";a:0:{}s:9:"sarufutsu";a:0:{}s:8:"shakotan";a:0:{}s:5:"shari";a:0:{}s:8:"shibecha";a:0:{}s:8:"shibetsu";a:0:{}s:7:"shikabe";a:0:{}s:7:"shikaoi";a:0:{}s:9:"shimamaki";a:0:{}s:7:"shimizu";a:0:{}s:9:"shimokawa";a:0:{}s:12:"shinshinotsu";a:0:{}s:8:"shintoku";a:0:{}s:9:"shiranuka";a:0:{}s:7:"shiraoi";a:0:{}s:9:"shiriuchi";a:0:{}s:7:"sobetsu";a:0:{}s:8:"sunagawa";a:0:{}s:5:"taiki";a:0:{}s:6:"takasu";a:0:{}s:8:"takikawa";a:0:{}s:8:"takinoue";a:0:{}s:9:"teshikaga";a:0:{}s:7:"tobetsu";a:0:{}s:5:"tohma";a:0:{}s:9:"tomakomai";a:0:{}s:6:"tomari";a:0:{}s:4:"toya";a:0:{}s:6:"toyako";a:0:{}s:8:"toyotomi";a:0:{}s:7:"toyoura";a:0:{}s:8:"tsubetsu";a:0:{}s:9:"tsukigata";a:0:{}s:7:"urakawa";a:0:{}s:6:"urausu";a:0:{}s:4:"uryu";a:0:{}s:9:"utashinai";a:0:{}s:8:"wakkanai";a:0:{}s:7:"wassamu";a:0:{}s:6:"yakumo";a:0:{}s:6:"yoichi";a:0:{}}s:5:"hyogo";a:46:{s:4:"aioi";a:0:{}s:6:"akashi";a:0:{}s:3:"ako";a:0:{}s:9:"amagasaki";a:0:{}s:6:"aogaki";a:0:{}s:5:"asago";a:0:{}s:6:"ashiya";a:0:{}s:5:"awaji";a:0:{}s:8:"fukusaki";a:0:{}s:7:"goshiki";a:0:{}s:6:"harima";a:0:{}s:6:"himeji";a:0:{}s:8:"ichikawa";a:0:{}s:7:"inagawa";a:0:{}s:5:"itami";a:0:{}s:8:"kakogawa";a:0:{}s:8:"kamigori";a:0:{}s:8:"kamikawa";a:0:{}s:5:"kasai";a:0:{}s:6:"kasuga";a:0:{}s:9:"kawanishi";a:0:{}s:4:"miki";a:0:{}s:11:"minamiawaji";a:0:{}s:11:"nishinomiya";a:0:{}s:9:"nishiwaki";a:0:{}s:3:"ono";a:0:{}s:5:"sanda";a:0:{}s:6:"sannan";a:0:{}s:8:"sasayama";a:0:{}s:4:"sayo";a:0:{}s:6:"shingu";a:0:{}s:9:"shinonsen";a:0:{}s:5:"shiso";a:0:{}s:6:"sumoto";a:0:{}s:6:"taishi";a:0:{}s:4:"taka";a:0:{}s:10:"takarazuka";a:0:{}s:8:"takasago";a:0:{}s:6:"takino";a:0:{}s:5:"tamba";a:0:{}s:7:"tatsuno";a:0:{}s:7:"toyooka";a:0:{}s:4:"yabu";a:0:{}s:7:"yashiro";a:0:{}s:4:"yoka";a:0:{}s:6:"yokawa";a:0:{}}s:7:"ibaraki";a:51:{s:3:"ami";a:0:{}s:5:"asahi";a:0:{}s:5:"bando";a:0:{}s:8:"chikusei";a:0:{}s:5:"daigo";a:0:{}s:9:"fujishiro";a:0:{}s:7:"hitachi";a:0:{}s:11:"hitachinaka";a:0:{}s:12:"hitachiomiya";a:0:{}s:10:"hitachiota";a:0:{}s:7:"ibaraki";a:0:{}s:3:"ina";a:0:{}s:8:"inashiki";a:0:{}s:5:"itako";a:0:{}s:5:"iwama";a:0:{}s:4:"joso";a:0:{}s:6:"kamisu";a:0:{}s:6:"kasama";a:0:{}s:7:"kashima";a:0:{}s:11:"kasumigaura";a:0:{}s:4:"koga";a:0:{}s:4:"miho";a:0:{}s:4:"mito";a:0:{}s:6:"moriya";a:0:{}s:4:"naka";a:0:{}s:8:"namegata";a:0:{}s:5:"oarai";a:0:{}s:5:"ogawa";a:0:{}s:7:"omitama";a:0:{}s:9:"ryugasaki";a:0:{}s:5:"sakai";a:0:{}s:10:"sakuragawa";a:0:{}s:9:"shimodate";a:0:{}s:10:"shimotsuma";a:0:{}s:9:"shirosato";a:0:{}s:4:"sowa";a:0:{}s:5:"suifu";a:0:{}s:8:"takahagi";a:0:{}s:11:"tamatsukuri";a:0:{}s:5:"tokai";a:0:{}s:6:"tomobe";a:0:{}s:4:"tone";a:0:{}s:6:"toride";a:0:{}s:9:"tsuchiura";a:0:{}s:7:"tsukuba";a:0:{}s:8:"uchihara";a:0:{}s:6:"ushiku";a:0:{}s:7:"yachiyo";a:0:{}s:8:"yamagata";a:0:{}s:6:"yawara";a:0:{}s:4:"yuki";a:0:{}}s:8:"ishikawa";a:19:{s:7:"anamizu";a:0:{}s:5:"hakui";a:0:{}s:7:"hakusan";a:0:{}s:4:"kaga";a:0:{}s:6:"kahoku";a:0:{}s:8:"kanazawa";a:0:{}s:8:"kawakita";a:0:{}s:7:"komatsu";a:0:{}s:8:"nakanoto";a:0:{}s:5:"nanao";a:0:{}s:4:"nomi";a:0:{}s:8:"nonoichi";a:0:{}s:4:"noto";a:0:{}s:5:"shika";a:0:{}s:4:"suzu";a:0:{}s:7:"tsubata";a:0:{}s:7:"tsurugi";a:0:{}s:8:"uchinada";a:0:{}s:6:"wajima";a:0:{}}s:5:"iwate";a:34:{s:5:"fudai";a:0:{}s:8:"fujisawa";a:0:{}s:8:"hanamaki";a:0:{}s:9:"hiraizumi";a:0:{}s:6:"hirono";a:0:{}s:8:"ichinohe";a:0:{}s:10:"ichinoseki";a:0:{}s:8:"iwaizumi";a:0:{}s:5:"iwate";a:0:{}s:6:"joboji";a:0:{}s:8:"kamaishi";a:0:{}s:10:"kanegasaki";a:0:{}s:7:"karumai";a:0:{}s:5:"kawai";a:0:{}s:8:"kitakami";a:0:{}s:4:"kuji";a:0:{}s:6:"kunohe";a:0:{}s:8:"kuzumaki";a:0:{}s:6:"miyako";a:0:{}s:8:"mizusawa";a:0:{}s:7:"morioka";a:0:{}s:6:"ninohe";a:0:{}s:4:"noda";a:0:{}s:7:"ofunato";a:0:{}s:4:"oshu";a:0:{}s:7:"otsuchi";a:0:{}s:13:"rikuzentakata";a:0:{}s:5:"shiwa";a:0:{}s:11:"shizukuishi";a:0:{}s:6:"sumita";a:0:{}s:8:"tanohata";a:0:{}s:4:"tono";a:0:{}s:6:"yahaba";a:0:{}s:6:"yamada";a:0:{}}s:6:"kagawa";a:15:{s:7:"ayagawa";a:0:{}s:13:"higashikagawa";a:0:{}s:7:"kanonji";a:0:{}s:8:"kotohira";a:0:{}s:5:"manno";a:0:{}s:8:"marugame";a:0:{}s:6:"mitoyo";a:0:{}s:8:"naoshima";a:0:{}s:6:"sanuki";a:0:{}s:7:"tadotsu";a:0:{}s:9:"takamatsu";a:0:{}s:7:"tonosho";a:0:{}s:8:"uchinomi";a:0:{}s:5:"utazu";a:0:{}s:8:"zentsuji";a:0:{}}s:9:"kagoshima";a:20:{s:5:"akune";a:0:{}s:5:"amami";a:0:{}s:5:"hioki";a:0:{}s:3:"isa";a:0:{}s:4:"isen";a:0:{}s:5:"izumi";a:0:{}s:9:"kagoshima";a:0:{}s:6:"kanoya";a:0:{}s:8:"kawanabe";a:0:{}s:5:"kinko";a:0:{}s:7:"kouyama";a:0:{}s:10:"makurazaki";a:0:{}s:9:"matsumoto";a:0:{}s:10:"minamitane";a:0:{}s:8:"nakatane";a:0:{}s:12:"nishinoomote";a:0:{}s:13:"satsumasendai";a:0:{}s:3:"soo";a:0:{}s:8:"tarumizu";a:0:{}s:5:"yusui";a:0:{}}s:8:"kanagawa";a:30:{s:6:"aikawa";a:0:{}s:6:"atsugi";a:0:{}s:5:"ayase";a:0:{}s:9:"chigasaki";a:0:{}s:5:"ebina";a:0:{}s:8:"fujisawa";a:0:{}s:6:"hadano";a:0:{}s:6:"hakone";a:0:{}s:9:"hiratsuka";a:0:{}s:7:"isehara";a:0:{}s:6:"kaisei";a:0:{}s:8:"kamakura";a:0:{}s:8:"kiyokawa";a:0:{}s:7:"matsuda";a:0:{}s:14:"minamiashigara";a:0:{}s:5:"miura";a:0:{}s:5:"nakai";a:0:{}s:8:"ninomiya";a:0:{}s:7:"odawara";a:0:{}s:2:"oi";a:0:{}s:4:"oiso";a:0:{}s:10:"sagamihara";a:0:{}s:8:"samukawa";a:0:{}s:6:"tsukui";a:0:{}s:8:"yamakita";a:0:{}s:6:"yamato";a:0:{}s:8:"yokosuka";a:0:{}s:8:"yugawara";a:0:{}s:4:"zama";a:0:{}s:5:"zushi";a:0:{}}s:5:"kochi";a:31:{s:3:"aki";a:0:{}s:6:"geisei";a:0:{}s:6:"hidaka";a:0:{}s:12:"higashitsuno";a:0:{}s:3:"ino";a:0:{}s:6:"kagami";a:0:{}s:4:"kami";a:0:{}s:8:"kitagawa";a:0:{}s:5:"kochi";a:0:{}s:6:"mihara";a:0:{}s:8:"motoyama";a:0:{}s:6:"muroto";a:0:{}s:6:"nahari";a:0:{}s:8:"nakamura";a:0:{}s:7:"nankoku";a:0:{}s:9:"nishitosa";a:0:{}s:10:"niyodogawa";a:0:{}s:4:"ochi";a:0:{}s:5:"okawa";a:0:{}s:5:"otoyo";a:0:{}s:6:"otsuki";a:0:{}s:6:"sakawa";a:0:{}s:6:"sukumo";a:0:{}s:6:"susaki";a:0:{}s:4:"tosa";a:0:{}s:11:"tosashimizu";a:0:{}s:4:"toyo";a:0:{}s:5:"tsuno";a:0:{}s:5:"umaji";a:0:{}s:6:"yasuda";a:0:{}s:8:"yusuhara";a:0:{}}s:8:"kumamoto";a:23:{s:7:"amakusa";a:0:{}s:4:"arao";a:0:{}s:3:"aso";a:0:{}s:5:"choyo";a:0:{}s:7:"gyokuto";a:0:{}s:11:"kamiamakusa";a:0:{}s:7:"kikuchi";a:0:{}s:8:"kumamoto";a:0:{}s:7:"mashiki";a:0:{}s:6:"mifune";a:0:{}s:8:"minamata";a:0:{}s:11:"minamioguni";a:0:{}s:6:"nagasu";a:0:{}s:9:"nishihara";a:0:{}s:5:"oguni";a:0:{}s:3:"ozu";a:0:{}s:6:"sumoto";a:0:{}s:8:"takamori";a:0:{}s:3:"uki";a:0:{}s:3:"uto";a:0:{}s:6:"yamaga";a:0:{}s:6:"yamato";a:0:{}s:10:"yatsushiro";a:0:{}}s:5:"kyoto";a:31:{s:5:"ayabe";a:0:{}s:11:"fukuchiyama";a:0:{}s:11:"higashiyama";a:0:{}s:3:"ide";a:0:{}s:3:"ine";a:0:{}s:4:"joyo";a:0:{}s:7:"kameoka";a:0:{}s:4:"kamo";a:0:{}s:4:"kita";a:0:{}s:4:"kizu";a:0:{}s:8:"kumiyama";a:0:{}s:8:"kyotamba";a:0:{}s:9:"kyotanabe";a:0:{}s:8:"kyotango";a:0:{}s:7:"maizuru";a:0:{}s:6:"minami";a:0:{}s:15:"minamiyamashiro";a:0:{}s:6:"miyazu";a:0:{}s:4:"muko";a:0:{}s:10:"nagaokakyo";a:0:{}s:7:"nakagyo";a:0:{}s:6:"nantan";a:0:{}s:9:"oyamazaki";a:0:{}s:5:"sakyo";a:0:{}s:5:"seika";a:0:{}s:6:"tanabe";a:0:{}s:3:"uji";a:0:{}s:9:"ujitawara";a:0:{}s:6:"wazuka";a:0:{}s:9:"yamashina";a:0:{}s:6:"yawata";a:0:{}}s:3:"mie";a:30:{s:5:"asahi";a:0:{}s:5:"inabe";a:0:{}s:3:"ise";a:0:{}s:8:"kameyama";a:0:{}s:7:"kawagoe";a:0:{}s:4:"kiho";a:0:{}s:8:"kisosaki";a:0:{}s:4:"kiwa";a:0:{}s:6:"komono";a:0:{}s:6:"kumano";a:0:{}s:6:"kuwana";a:0:{}s:9:"matsusaka";a:0:{}s:5:"meiwa";a:0:{}s:6:"mihama";a:0:{}s:9:"minamiise";a:0:{}s:6:"misugi";a:0:{}s:6:"miyama";a:0:{}s:6:"nabari";a:0:{}s:5:"shima";a:0:{}s:6:"suzuka";a:0:{}s:4:"tado";a:0:{}s:5:"taiki";a:0:{}s:4:"taki";a:0:{}s:6:"tamaki";a:0:{}s:4:"toba";a:0:{}s:3:"tsu";a:0:{}s:5:"udono";a:0:{}s:8:"ureshino";a:0:{}s:7:"watarai";a:0:{}s:9:"yokkaichi";a:0:{}}s:6:"miyagi";a:32:{s:8:"furukawa";a:0:{}s:17:"higashimatsushima";a:0:{}s:10:"ishinomaki";a:0:{}s:7:"iwanuma";a:0:{}s:6:"kakuda";a:0:{}s:4:"kami";a:0:{}s:8:"kawasaki";a:0:{}s:8:"marumori";a:0:{}s:10:"matsushima";a:0:{}s:13:"minamisanriku";a:0:{}s:6:"misato";a:0:{}s:6:"murata";a:0:{}s:6:"natori";a:0:{}s:7:"ogawara";a:0:{}s:5:"ohira";a:0:{}s:7:"onagawa";a:0:{}s:5:"osaki";a:0:{}s:4:"rifu";a:0:{}s:6:"semine";a:0:{}s:7:"shibata";a:0:{}s:13:"shichikashuku";a:0:{}s:7:"shikama";a:0:{}s:8:"shiogama";a:0:{}s:9:"shiroishi";a:0:{}s:6:"tagajo";a:0:{}s:5:"taiwa";a:0:{}s:4:"tome";a:0:{}s:6:"tomiya";a:0:{}s:6:"wakuya";a:0:{}s:6:"watari";a:0:{}s:8:"yamamoto";a:0:{}s:3:"zao";a:0:{}}s:8:"miyazaki";a:27:{s:3:"aya";a:0:{}s:5:"ebino";a:0:{}s:6:"gokase";a:0:{}s:5:"hyuga";a:0:{}s:8:"kadogawa";a:0:{}s:10:"kawaminami";a:0:{}s:4:"kijo";a:0:{}s:8:"kitagawa";a:0:{}s:8:"kitakata";a:0:{}s:7:"kitaura";a:0:{}s:9:"kobayashi";a:0:{}s:8:"kunitomi";a:0:{}s:7:"kushima";a:0:{}s:6:"mimata";a:0:{}s:10:"miyakonojo";a:0:{}s:8:"miyazaki";a:0:{}s:9:"morotsuka";a:0:{}s:8:"nichinan";a:0:{}s:9:"nishimera";a:0:{}s:7:"nobeoka";a:0:{}s:5:"saito";a:0:{}s:6:"shiiba";a:0:{}s:8:"shintomi";a:0:{}s:8:"takaharu";a:0:{}s:8:"takanabe";a:0:{}s:8:"takazaki";a:0:{}s:5:"tsuno";a:0:{}}s:6:"nagano";a:75:{s:4:"achi";a:0:{}s:8:"agematsu";a:0:{}s:4:"anan";a:0:{}s:4:"aoki";a:0:{}s:5:"asahi";a:0:{}s:7:"azumino";a:0:{}s:9:"chikuhoku";a:0:{}s:7:"chikuma";a:0:{}s:5:"chino";a:0:{}s:6:"fujimi";a:0:{}s:6:"hakuba";a:0:{}s:4:"hara";a:0:{}s:6:"hiraya";a:0:{}s:4:"iida";a:0:{}s:6:"iijima";a:0:{}s:6:"iiyama";a:0:{}s:6:"iizuna";a:0:{}s:5:"ikeda";a:0:{}s:7:"ikusaka";a:0:{}s:3:"ina";a:0:{}s:9:"karuizawa";a:0:{}s:8:"kawakami";a:0:{}s:4:"kiso";a:0:{}s:13:"kisofukushima";a:0:{}s:8:"kitaaiki";a:0:{}s:8:"komagane";a:0:{}s:6:"komoro";a:0:{}s:9:"matsukawa";a:0:{}s:9:"matsumoto";a:0:{}s:5:"miasa";a:0:{}s:10:"minamiaiki";a:0:{}s:10:"minamimaki";a:0:{}s:12:"minamiminowa";a:0:{}s:6:"minowa";a:0:{}s:6:"miyada";a:0:{}s:6:"miyota";a:0:{}s:9:"mochizuki";a:0:{}s:6:"nagano";a:0:{}s:6:"nagawa";a:0:{}s:6:"nagiso";a:0:{}s:8:"nakagawa";a:0:{}s:6:"nakano";a:0:{}s:11:"nozawaonsen";a:0:{}s:5:"obuse";a:0:{}s:5:"ogawa";a:0:{}s:5:"okaya";a:0:{}s:6:"omachi";a:0:{}s:3:"omi";a:0:{}s:6:"ookuwa";a:0:{}s:7:"ooshika";a:0:{}s:5:"otaki";a:0:{}s:5:"otari";a:0:{}s:5:"sakae";a:0:{}s:6:"sakaki";a:0:{}s:4:"saku";a:0:{}s:6:"sakuho";a:0:{}s:9:"shimosuwa";a:0:{}s:12:"shinanomachi";a:0:{}s:8:"shiojiri";a:0:{}s:4:"suwa";a:0:{}s:6:"suzaka";a:0:{}s:6:"takagi";a:0:{}s:8:"takamori";a:0:{}s:8:"takayama";a:0:{}s:9:"tateshina";a:0:{}s:7:"tatsuno";a:0:{}s:9:"togakushi";a:0:{}s:6:"togura";a:0:{}s:4:"tomi";a:0:{}s:4:"ueda";a:0:{}s:4:"wada";a:0:{}s:8:"yamagata";a:0:{}s:10:"yamanouchi";a:0:{}s:6:"yasaka";a:0:{}s:7:"yasuoka";a:0:{}}s:8:"nagasaki";a:22:{s:7:"chijiwa";a:0:{}s:5:"futsu";a:0:{}s:4:"goto";a:0:{}s:6:"hasami";a:0:{}s:6:"hirado";a:0:{}s:3:"iki";a:0:{}s:7:"isahaya";a:0:{}s:8:"kawatana";a:0:{}s:10:"kuchinotsu";a:0:{}s:8:"matsuura";a:0:{}s:8:"nagasaki";a:0:{}s:5:"obama";a:0:{}s:5:"omura";a:0:{}s:5:"oseto";a:0:{}s:6:"saikai";a:0:{}s:6:"sasebo";a:0:{}s:5:"seihi";a:0:{}s:9:"shimabara";a:0:{}s:12:"shinkamigoto";a:0:{}s:7:"togitsu";a:0:{}s:8:"tsushima";a:0:{}s:5:"unzen";a:0:{}}s:4:"nara";a:38:{s:4:"ando";a:0:{}s:4:"gose";a:0:{}s:6:"heguri";a:0:{}s:14:"higashiyoshino";a:0:{}s:7:"ikaruga";a:0:{}s:5:"ikoma";a:0:{}s:12:"kamikitayama";a:0:{}s:7:"kanmaki";a:0:{}s:7:"kashiba";a:0:{}s:9:"kashihara";a:0:{}s:9:"katsuragi";a:0:{}s:5:"kawai";a:0:{}s:8:"kawakami";a:0:{}s:9:"kawanishi";a:0:{}s:5:"koryo";a:0:{}s:8:"kurotaki";a:0:{}s:6:"mitsue";a:0:{}s:6:"miyake";a:0:{}s:4:"nara";a:0:{}s:8:"nosegawa";a:0:{}s:3:"oji";a:0:{}s:4:"ouda";a:0:{}s:5:"oyodo";a:0:{}s:7:"sakurai";a:0:{}s:5:"sango";a:0:{}s:9:"shimoichi";a:0:{}s:13:"shimokitayama";a:0:{}s:6:"shinjo";a:0:{}s:4:"soni";a:0:{}s:8:"takatori";a:0:{}s:10:"tawaramoto";a:0:{}s:7:"tenkawa";a:0:{}s:5:"tenri";a:0:{}s:3:"uda";a:0:{}s:14:"yamatokoriyama";a:0:{}s:12:"yamatotakada";a:0:{}s:7:"yamazoe";a:0:{}s:7:"yoshino";a:0:{}}s:7:"niigata";a:34:{s:3:"aga";a:0:{}s:5:"agano";a:0:{}s:5:"gosen";a:0:{}s:8:"itoigawa";a:0:{}s:9:"izumozaki";a:0:{}s:6:"joetsu";a:0:{}s:4:"kamo";a:0:{}s:6:"kariwa";a:0:{}s:11:"kashiwazaki";a:0:{}s:12:"minamiuonuma";a:0:{}s:7:"mitsuke";a:0:{}s:5:"muika";a:0:{}s:8:"murakami";a:0:{}s:5:"myoko";a:0:{}s:7:"nagaoka";a:0:{}s:7:"niigata";a:0:{}s:5:"ojiya";a:0:{}s:3:"omi";a:0:{}s:4:"sado";a:0:{}s:5:"sanjo";a:0:{}s:5:"seiro";a:0:{}s:6:"seirou";a:0:{}s:8:"sekikawa";a:0:{}s:7:"shibata";a:0:{}s:6:"tagami";a:0:{}s:6:"tainai";a:0:{}s:6:"tochio";a:0:{}s:9:"tokamachi";a:0:{}s:7:"tsubame";a:0:{}s:6:"tsunan";a:0:{}s:6:"uonuma";a:0:{}s:6:"yahiko";a:0:{}s:5:"yoita";a:0:{}s:6:"yuzawa";a:0:{}}s:4:"oita";a:19:{s:5:"beppu";a:0:{}s:8:"bungoono";a:0:{}s:11:"bungotakada";a:0:{}s:6:"hasama";a:0:{}s:4:"hiji";a:0:{}s:9:"himeshima";a:0:{}s:4:"hita";a:0:{}s:8:"kamitsue";a:0:{}s:7:"kokonoe";a:0:{}s:4:"kuju";a:0:{}s:8:"kunisaki";a:0:{}s:4:"kusu";a:0:{}s:4:"oita";a:0:{}s:5:"saiki";a:0:{}s:6:"taketa";a:0:{}s:7:"tsukumi";a:0:{}s:3:"usa";a:0:{}s:5:"usuki";a:0:{}s:4:"yufu";a:0:{}}s:7:"okayama";a:26:{s:6:"akaiwa";a:0:{}s:8:"asakuchi";a:0:{}s:5:"bizen";a:0:{}s:9:"hayashima";a:0:{}s:5:"ibara";a:0:{}s:8:"kagamino";a:0:{}s:7:"kasaoka";a:0:{}s:8:"kibichuo";a:0:{}s:7:"kumenan";a:0:{}s:9:"kurashiki";a:0:{}s:6:"maniwa";a:0:{}s:6:"misaki";a:0:{}s:4:"nagi";a:0:{}s:5:"niimi";a:0:{}s:12:"nishiawakura";a:0:{}s:7:"okayama";a:0:{}s:7:"satosho";a:0:{}s:8:"setouchi";a:0:{}s:6:"shinjo";a:0:{}s:4:"shoo";a:0:{}s:4:"soja";a:0:{}s:9:"takahashi";a:0:{}s:6:"tamano";a:0:{}s:7:"tsuyama";a:0:{}s:4:"wake";a:0:{}s:6:"yakage";a:0:{}}s:7:"okinawa";a:42:{s:5:"aguni";a:0:{}s:7:"ginowan";a:0:{}s:6:"ginoza";a:0:{}s:9:"gushikami";a:0:{}s:7:"haebaru";a:0:{}s:7:"higashi";a:0:{}s:6:"hirara";a:0:{}s:5:"iheya";a:0:{}s:8:"ishigaki";a:0:{}s:8:"ishikawa";a:0:{}s:6:"itoman";a:0:{}s:5:"izena";a:0:{}s:6:"kadena";a:0:{}s:3:"kin";a:0:{}s:9:"kitadaito";a:0:{}s:14:"kitanakagusuku";a:0:{}s:8:"kumejima";a:0:{}s:8:"kunigami";a:0:{}s:11:"minamidaito";a:0:{}s:6:"motobu";a:0:{}s:4:"nago";a:0:{}s:4:"naha";a:0:{}s:10:"nakagusuku";a:0:{}s:7:"nakijin";a:0:{}s:5:"nanjo";a:0:{}s:9:"nishihara";a:0:{}s:5:"ogimi";a:0:{}s:7:"okinawa";a:0:{}s:4:"onna";a:0:{}s:7:"shimoji";a:0:{}s:8:"taketomi";a:0:{}s:6:"tarama";a:0:{}s:9:"tokashiki";a:0:{}s:10:"tomigusuku";a:0:{}s:6:"tonaki";a:0:{}s:6:"urasoe";a:0:{}s:5:"uruma";a:0:{}s:5:"yaese";a:0:{}s:7:"yomitan";a:0:{}s:8:"yonabaru";a:0:{}s:8:"yonaguni";a:0:{}s:6:"zamami";a:0:{}}s:5:"osaka";a:50:{s:5:"abeno";a:0:{}s:14:"chihayaakasaka";a:0:{}s:4:"chuo";a:0:{}s:5:"daito";a:0:{}s:9:"fujiidera";a:0:{}s:8:"habikino";a:0:{}s:6:"hannan";a:0:{}s:12:"higashiosaka";a:0:{}s:16:"higashisumiyoshi";a:0:{}s:15:"higashiyodogawa";a:0:{}s:8:"hirakata";a:0:{}s:7:"ibaraki";a:0:{}s:5:"ikeda";a:0:{}s:5:"izumi";a:0:{}s:9:"izumiotsu";a:0:{}s:9:"izumisano";a:0:{}s:6:"kadoma";a:0:{}s:7:"kaizuka";a:0:{}s:5:"kanan";a:0:{}s:9:"kashiwara";a:0:{}s:6:"katano";a:0:{}s:13:"kawachinagano";a:0:{}s:9:"kishiwada";a:0:{}s:4:"kita";a:0:{}s:8:"kumatori";a:0:{}s:9:"matsubara";a:0:{}s:6:"minato";a:0:{}s:5:"minoh";a:0:{}s:6:"misaki";a:0:{}s:9:"moriguchi";a:0:{}s:8:"neyagawa";a:0:{}s:5:"nishi";a:0:{}s:4:"nose";a:0:{}s:11:"osakasayama";a:0:{}s:5:"sakai";a:0:{}s:6:"sayama";a:0:{}s:6:"sennan";a:0:{}s:6:"settsu";a:0:{}s:11:"shijonawate";a:0:{}s:9:"shimamoto";a:0:{}s:5:"suita";a:0:{}s:7:"tadaoka";a:0:{}s:6:"taishi";a:0:{}s:6:"tajiri";a:0:{}s:8:"takaishi";a:0:{}s:9:"takatsuki";a:0:{}s:12:"tondabayashi";a:0:{}s:8:"toyonaka";a:0:{}s:6:"toyono";a:0:{}s:3:"yao";a:0:{}}s:4:"saga";a:26:{s:6:"ariake";a:0:{}s:5:"arita";a:0:{}s:8:"fukudomi";a:0:{}s:6:"genkai";a:0:{}s:8:"hamatama";a:0:{}s:5:"hizen";a:0:{}s:5:"imari";a:0:{}s:8:"kamimine";a:0:{}s:7:"kanzaki";a:0:{}s:7:"karatsu";a:0:{}s:7:"kashima";a:0:{}s:8:"kitagata";a:0:{}s:8:"kitahata";a:0:{}s:6:"kiyama";a:0:{}s:7:"kouhoku";a:0:{}s:7:"kyuragi";a:0:{}s:10:"nishiarita";a:0:{}s:3:"ogi";a:0:{}s:6:"omachi";a:0:{}s:5:"ouchi";a:0:{}s:4:"saga";a:0:{}s:9:"shiroishi";a:0:{}s:4:"taku";a:0:{}s:4:"tara";a:0:{}s:4:"tosu";a:0:{}s:11:"yoshinogari";a:0:{}}s:7:"saitama";a:69:{s:7:"arakawa";a:0:{}s:5:"asaka";a:0:{}s:8:"chichibu";a:0:{}s:6:"fujimi";a:0:{}s:8:"fujimino";a:0:{}s:6:"fukaya";a:0:{}s:5:"hanno";a:0:{}s:5:"hanyu";a:0:{}s:6:"hasuda";a:0:{}s:8:"hatogaya";a:0:{}s:8:"hatoyama";a:0:{}s:6:"hidaka";a:0:{}s:15:"higashichichibu";a:0:{}s:16:"higashimatsuyama";a:0:{}s:5:"honjo";a:0:{}s:3:"ina";a:0:{}s:5:"iruma";a:0:{}s:8:"iwatsuki";a:0:{}s:9:"kamiizumi";a:0:{}s:8:"kamikawa";a:0:{}s:8:"kamisato";a:0:{}s:8:"kasukabe";a:0:{}s:7:"kawagoe";a:0:{}s:9:"kawaguchi";a:0:{}s:8:"kawajima";a:0:{}s:4:"kazo";a:0:{}s:8:"kitamoto";a:0:{}s:9:"koshigaya";a:0:{}s:7:"kounosu";a:0:{}s:4:"kuki";a:0:{}s:8:"kumagaya";a:0:{}s:10:"matsubushi";a:0:{}s:6:"minano";a:0:{}s:6:"misato";a:0:{}s:9:"miyashiro";a:0:{}s:7:"miyoshi";a:0:{}s:8:"moroyama";a:0:{}s:8:"nagatoro";a:0:{}s:8:"namegawa";a:0:{}s:5:"niiza";a:0:{}s:5:"ogano";a:0:{}s:5:"ogawa";a:0:{}s:5:"ogose";a:0:{}s:7:"okegawa";a:0:{}s:5:"omiya";a:0:{}s:5:"otaki";a:0:{}s:6:"ranzan";a:0:{}s:7:"ryokami";a:0:{}s:7:"saitama";a:0:{}s:6:"sakado";a:0:{}s:5:"satte";a:0:{}s:6:"sayama";a:0:{}s:5:"shiki";a:0:{}s:8:"shiraoka";a:0:{}s:4:"soka";a:0:{}s:6:"sugito";a:0:{}s:4:"toda";a:0:{}s:8:"tokigawa";a:0:{}s:10:"tokorozawa";a:0:{}s:12:"tsurugashima";a:0:{}s:5:"urawa";a:0:{}s:6:"warabi";a:0:{}s:6:"yashio";a:0:{}s:6:"yokoze";a:0:{}s:4:"yono";a:0:{}s:5:"yorii";a:0:{}s:7:"yoshida";a:0:{}s:9:"yoshikawa";a:0:{}s:7:"yoshimi";a:0:{}}s:5:"shiga";a:23:{s:5:"aisho";a:0:{}s:4:"gamo";a:0:{}s:10:"higashiomi";a:0:{}s:6:"hikone";a:0:{}s:4:"koka";a:0:{}s:5:"konan";a:0:{}s:5:"kosei";a:0:{}s:4:"koto";a:0:{}s:7:"kusatsu";a:0:{}s:7:"maibara";a:0:{}s:8:"moriyama";a:0:{}s:8:"nagahama";a:0:{}s:9:"nishiazai";a:0:{}s:8:"notogawa";a:0:{}s:11:"omihachiman";a:0:{}s:4:"otsu";a:0:{}s:5:"ritto";a:0:{}s:5:"ryuoh";a:0:{}s:9:"takashima";a:0:{}s:9:"takatsuki";a:0:{}s:8:"torahime";a:0:{}s:8:"toyosato";a:0:{}s:4:"yasu";a:0:{}}s:7:"shimane";a:23:{s:5:"akagi";a:0:{}s:3:"ama";a:0:{}s:5:"gotsu";a:0:{}s:6:"hamada";a:0:{}s:12:"higashiizumo";a:0:{}s:6:"hikawa";a:0:{}s:6:"hikimi";a:0:{}s:5:"izumo";a:0:{}s:8:"kakinoki";a:0:{}s:6:"masuda";a:0:{}s:6:"matsue";a:0:{}s:6:"misato";a:0:{}s:12:"nishinoshima";a:0:{}s:4:"ohda";a:0:{}s:10:"okinoshima";a:0:{}s:8:"okuizumo";a:0:{}s:7:"shimane";a:0:{}s:6:"tamayu";a:0:{}s:7:"tsuwano";a:0:{}s:5:"unnan";a:0:{}s:6:"yakumo";a:0:{}s:6:"yasugi";a:0:{}s:7:"yatsuka";a:0:{}}s:8:"shizuoka";a:36:{s:4:"arai";a:0:{}s:5:"atami";a:0:{}s:4:"fuji";a:0:{}s:7:"fujieda";a:0:{}s:8:"fujikawa";a:0:{}s:10:"fujinomiya";a:0:{}s:7:"fukuroi";a:0:{}s:7:"gotemba";a:0:{}s:7:"haibara";a:0:{}s:9:"hamamatsu";a:0:{}s:10:"higashiizu";a:0:{}s:3:"ito";a:0:{}s:5:"iwata";a:0:{}s:3:"izu";a:0:{}s:9:"izunokuni";a:0:{}s:8:"kakegawa";a:0:{}s:7:"kannami";a:0:{}s:9:"kawanehon";a:0:{}s:6:"kawazu";a:0:{}s:8:"kikugawa";a:0:{}s:5:"kosai";a:0:{}s:10:"makinohara";a:0:{}s:9:"matsuzaki";a:0:{}s:9:"minamiizu";a:0:{}s:7:"mishima";a:0:{}s:9:"morimachi";a:0:{}s:8:"nishiizu";a:0:{}s:6:"numazu";a:0:{}s:8:"omaezaki";a:0:{}s:7:"shimada";a:0:{}s:7:"shimizu";a:0:{}s:7:"shimoda";a:0:{}s:8:"shizuoka";a:0:{}s:6:"susono";a:0:{}s:5:"yaizu";a:0:{}s:7:"yoshida";a:0:{}}s:7:"tochigi";a:31:{s:8:"ashikaga";a:0:{}s:4:"bato";a:0:{}s:4:"haga";a:0:{}s:7:"ichikai";a:0:{}s:7:"iwafune";a:0:{}s:10:"kaminokawa";a:0:{}s:6:"kanuma";a:0:{}s:10:"karasuyama";a:0:{}s:7:"kuroiso";a:0:{}s:7:"mashiko";a:0:{}s:4:"mibu";a:0:{}s:4:"moka";a:0:{}s:6:"motegi";a:0:{}s:4:"nasu";a:0:{}s:12:"nasushiobara";a:0:{}s:5:"nikko";a:0:{}s:9:"nishikata";a:0:{}s:4:"nogi";a:0:{}s:5:"ohira";a:0:{}s:8:"ohtawara";a:0:{}s:5:"oyama";a:0:{}s:6:"sakura";a:0:{}s:4:"sano";a:0:{}s:10:"shimotsuke";a:0:{}s:6:"shioya";a:0:{}s:10:"takanezawa";a:0:{}s:7:"tochigi";a:0:{}s:5:"tsuga";a:0:{}s:5:"ujiie";a:0:{}s:10:"utsunomiya";a:0:{}s:5:"yaita";a:0:{}}s:9:"tokushima";a:17:{s:6:"aizumi";a:0:{}s:4:"anan";a:0:{}s:6:"ichiba";a:0:{}s:5:"itano";a:0:{}s:6:"kainan";a:0:{}s:12:"komatsushima";a:0:{}s:10:"matsushige";a:0:{}s:4:"mima";a:0:{}s:6:"minami";a:0:{}s:7:"miyoshi";a:0:{}s:4:"mugi";a:0:{}s:8:"nakagawa";a:0:{}s:6:"naruto";a:0:{}s:9:"sanagochi";a:0:{}s:9:"shishikui";a:0:{}s:9:"tokushima";a:0:{}s:6:"wajiki";a:0:{}}s:5:"tokyo";a:57:{s:6:"adachi";a:0:{}s:7:"akiruno";a:0:{}s:8:"akishima";a:0:{}s:9:"aogashima";a:0:{}s:7:"arakawa";a:0:{}s:6:"bunkyo";a:0:{}s:7:"chiyoda";a:0:{}s:5:"chofu";a:0:{}s:4:"chuo";a:0:{}s:7:"edogawa";a:0:{}s:5:"fuchu";a:0:{}s:5:"fussa";a:0:{}s:7:"hachijo";a:0:{}s:8:"hachioji";a:0:{}s:6:"hamura";a:0:{}s:13:"higashikurume";a:0:{}s:15:"higashimurayama";a:0:{}s:13:"higashiyamato";a:0:{}s:4:"hino";a:0:{}s:6:"hinode";a:0:{}s:8:"hinohara";a:0:{}s:5:"inagi";a:0:{}s:8:"itabashi";a:0:{}s:10:"katsushika";a:0:{}s:4:"kita";a:0:{}s:6:"kiyose";a:0:{}s:7:"kodaira";a:0:{}s:7:"koganei";a:0:{}s:9:"kokubunji";a:0:{}s:5:"komae";a:0:{}s:4:"koto";a:0:{}s:10:"kouzushima";a:0:{}s:9:"kunitachi";a:0:{}s:7:"machida";a:0:{}s:6:"meguro";a:0:{}s:6:"minato";a:0:{}s:6:"mitaka";a:0:{}s:6:"mizuho";a:0:{}s:15:"musashimurayama";a:0:{}s:9:"musashino";a:0:{}s:6:"nakano";a:0:{}s:6:"nerima";a:0:{}s:9:"ogasawara";a:0:{}s:7:"okutama";a:0:{}s:3:"ome";a:0:{}s:6:"oshima";a:0:{}s:3:"ota";a:0:{}s:8:"setagaya";a:0:{}s:7:"shibuya";a:0:{}s:9:"shinagawa";a:0:{}s:8:"shinjuku";a:0:{}s:8:"suginami";a:0:{}s:6:"sumida";a:0:{}s:9:"tachikawa";a:0:{}s:5:"taito";a:0:{}s:4:"tama";a:0:{}s:7:"toshima";a:0:{}}s:7:"tottori";a:13:{s:5:"chizu";a:0:{}s:4:"hino";a:0:{}s:8:"kawahara";a:0:{}s:4:"koge";a:0:{}s:7:"kotoura";a:0:{}s:6:"misasa";a:0:{}s:5:"nanbu";a:0:{}s:8:"nichinan";a:0:{}s:11:"sakaiminato";a:0:{}s:7:"tottori";a:0:{}s:6:"wakasa";a:0:{}s:4:"yazu";a:0:{}s:6:"yonago";a:0:{}}s:6:"toyama";a:24:{s:5:"asahi";a:0:{}s:5:"fuchu";a:0:{}s:9:"fukumitsu";a:0:{}s:9:"funahashi";a:0:{}s:4:"himi";a:0:{}s:5:"imizu";a:0:{}s:5:"inami";a:0:{}s:6:"johana";a:0:{}s:8:"kamiichi";a:0:{}s:6:"kurobe";a:0:{}s:11:"nakaniikawa";a:0:{}s:10:"namerikawa";a:0:{}s:5:"nanto";a:0:{}s:6:"nyuzen";a:0:{}s:5:"oyabe";a:0:{}s:5:"taira";a:0:{}s:7:"takaoka";a:0:{}s:8:"tateyama";a:0:{}s:4:"toga";a:0:{}s:6:"tonami";a:0:{}s:6:"toyama";a:0:{}s:7:"unazuki";a:0:{}s:4:"uozu";a:0:{}s:6:"yamada";a:0:{}}s:8:"wakayama";a:29:{s:5:"arida";a:0:{}s:9:"aridagawa";a:0:{}s:4:"gobo";a:0:{}s:9:"hashimoto";a:0:{}s:6:"hidaka";a:0:{}s:8:"hirogawa";a:0:{}s:5:"inami";a:0:{}s:5:"iwade";a:0:{}s:6:"kainan";a:0:{}s:9:"kamitonda";a:0:{}s:9:"katsuragi";a:0:{}s:6:"kimino";a:0:{}s:8:"kinokawa";a:0:{}s:8:"kitayama";a:0:{}s:4:"koya";a:0:{}s:4:"koza";a:0:{}s:8:"kozagawa";a:0:{}s:8:"kudoyama";a:0:{}s:9:"kushimoto";a:0:{}s:6:"mihama";a:0:{}s:6:"misato";a:0:{}s:13:"nachikatsuura";a:0:{}s:6:"shingu";a:0:{}s:9:"shirahama";a:0:{}s:5:"taiji";a:0:{}s:6:"tanabe";a:0:{}s:8:"wakayama";a:0:{}s:5:"yuasa";a:0:{}s:4:"yura";a:0:{}}s:8:"yamagata";a:34:{s:5:"asahi";a:0:{}s:8:"funagata";a:0:{}s:9:"higashine";a:0:{}s:4:"iide";a:0:{}s:6:"kahoku";a:0:{}s:10:"kaminoyama";a:0:{}s:8:"kaneyama";a:0:{}s:9:"kawanishi";a:0:{}s:10:"mamurogawa";a:0:{}s:6:"mikawa";a:0:{}s:8:"murayama";a:0:{}s:5:"nagai";a:0:{}s:8:"nakayama";a:0:{}s:5:"nanyo";a:0:{}s:9:"nishikawa";a:0:{}s:9:"obanazawa";a:0:{}s:2:"oe";a:0:{}s:5:"oguni";a:0:{}s:6:"ohkura";a:0:{}s:7:"oishida";a:0:{}s:5:"sagae";a:0:{}s:6:"sakata";a:0:{}s:8:"sakegawa";a:0:{}s:6:"shinjo";a:0:{}s:9:"shirataka";a:0:{}s:6:"shonai";a:0:{}s:8:"takahata";a:0:{}s:5:"tendo";a:0:{}s:6:"tozawa";a:0:{}s:8:"tsuruoka";a:0:{}s:8:"yamagata";a:0:{}s:8:"yamanobe";a:0:{}s:8:"yonezawa";a:0:{}s:4:"yuza";a:0:{}}s:9:"yamaguchi";a:16:{s:3:"abu";a:0:{}s:4:"hagi";a:0:{}s:6:"hikari";a:0:{}s:4:"hofu";a:0:{}s:7:"iwakuni";a:0:{}s:9:"kudamatsu";a:0:{}s:5:"mitou";a:0:{}s:6:"nagato";a:0:{}s:6:"oshima";a:0:{}s:11:"shimonoseki";a:0:{}s:6:"shunan";a:0:{}s:6:"tabuse";a:0:{}s:8:"tokuyama";a:0:{}s:6:"toyota";a:0:{}s:3:"ube";a:0:{}s:3:"yuu";a:0:{}}s:9:"yamanashi";a:28:{s:4:"chuo";a:0:{}s:5:"doshi";a:0:{}s:7:"fuefuki";a:0:{}s:8:"fujikawa";a:0:{}s:15:"fujikawaguchiko";a:0:{}s:11:"fujiyoshida";a:0:{}s:8:"hayakawa";a:0:{}s:6:"hokuto";a:0:{}s:14:"ichikawamisato";a:0:{}s:3:"kai";a:0:{}s:4:"kofu";a:0:{}s:5:"koshu";a:0:{}s:6:"kosuge";a:0:{}s:11:"minami-alps";a:0:{}s:6:"minobu";a:0:{}s:9:"nakamichi";a:0:{}s:5:"nanbu";a:0:{}s:8:"narusawa";a:0:{}s:8:"nirasaki";a:0:{}s:12:"nishikatsura";a:0:{}s:6:"oshino";a:0:{}s:6:"otsuki";a:0:{}s:5:"showa";a:0:{}s:8:"tabayama";a:0:{}s:5:"tsuru";a:0:{}s:8:"uenohara";a:0:{}s:10:"yamanakako";a:0:{}s:9:"yamanashi";a:0:{}}s:9:"xn--4pvxs";a:0:{}s:11:"xn--vgu402c";a:0:{}s:10:"xn--c3s14m";a:0:{}s:11:"xn--f6qx53a";a:0:{}s:10:"xn--8pvr4u";a:0:{}s:11:"xn--uist22h";a:0:{}s:14:"xn--djrs72d6uy";a:0:{}s:11:"xn--mkru45i";a:0:{}s:13:"xn--0trq7p7nn";a:0:{}s:11:"xn--8ltr62k";a:0:{}s:11:"xn--2m4a15e";a:0:{}s:10:"xn--efvn9s";a:0:{}s:11:"xn--32vp30h";a:0:{}s:11:"xn--4it797k";a:0:{}s:11:"xn--1lqs71d";a:0:{}s:11:"xn--5rtp49c";a:0:{}s:11:"xn--5js045d";a:0:{}s:11:"xn--ehqz56n";a:0:{}s:11:"xn--1lqs03n";a:0:{}s:11:"xn--qqqt11m";a:0:{}s:10:"xn--kbrq7o";a:0:{}s:11:"xn--pssu33l";a:0:{}s:11:"xn--ntsq17g";a:0:{}s:10:"xn--uisz3g";a:0:{}s:10:"xn--6btw5a";a:0:{}s:9:"xn--1ctwo";a:0:{}s:10:"xn--6orx2r";a:0:{}s:10:"xn--rht61e";a:0:{}s:10:"xn--rht27z";a:0:{}s:10:"xn--djty4k";a:0:{}s:11:"xn--nit225k";a:0:{}s:9:"xn--rht3d";a:0:{}s:10:"xn--klty5x";a:0:{}s:10:"xn--kltx9a";a:0:{}s:10:"xn--kltp7d";a:0:{}s:11:"xn--uuwu58a";a:0:{}s:11:"xn--zbx025d";a:0:{}s:14:"xn--ntso0iqx3a";a:0:{}s:11:"xn--elqq16h";a:0:{}s:11:"xn--4it168d";a:0:{}s:11:"xn--klt787d";a:0:{}s:10:"xn--rny31h";a:0:{}s:12:"xn--7t0a264c";a:0:{}s:11:"xn--5rtq34k";a:0:{}s:11:"xn--k7yn95e";a:0:{}s:11:"xn--tor131o";a:0:{}s:14:"xn--d5qv7z876c";a:0:{}s:8:"kawasaki";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:10:"kitakyushu";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:4:"kobe";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:6:"nagoya";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:7:"sapporo";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:6:"sendai";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:8:"yokohama";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:8:"blogspot";a:0:{}}s:2:"ke";a:2:{s:1:"*";a:0:{}s:2:"co";a:1:{s:8:"blogspot";a:0:{}}}s:2:"kg";a:6:{s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}}s:2:"kh";a:1:{s:1:"*";a:0:{}}s:2:"ki";a:7:{s:3:"edu";a:0:{}s:3:"biz";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"com";a:0:{}}s:2:"km";a:17:{s:3:"org";a:0:{}s:3:"nom";a:0:{}s:3:"gov";a:0:{}s:3:"prd";a:0:{}s:2:"tm";a:0:{}s:3:"edu";a:0:{}s:3:"mil";a:0:{}s:3:"ass";a:0:{}s:3:"com";a:0:{}s:4:"coop";a:0:{}s:4:"asso";a:0:{}s:6:"presse";a:0:{}s:7:"medecin";a:0:{}s:8:"notaires";a:0:{}s:11:"pharmaciens";a:0:{}s:11:"veterinaire";a:0:{}s:4:"gouv";a:0:{}}s:2:"kn";a:4:{s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}}s:2:"kp";a:6:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"rep";a:0:{}s:3:"tra";a:0:{}}s:2:"kr";a:30:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"es";a:0:{}s:2:"go";a:0:{}s:2:"hs";a:0:{}s:2:"kg";a:0:{}s:3:"mil";a:0:{}s:2:"ms";a:0:{}s:2:"ne";a:0:{}s:2:"or";a:0:{}s:2:"pe";a:0:{}s:2:"re";a:0:{}s:2:"sc";a:0:{}s:5:"busan";a:0:{}s:8:"chungbuk";a:0:{}s:8:"chungnam";a:0:{}s:5:"daegu";a:0:{}s:7:"daejeon";a:0:{}s:7:"gangwon";a:0:{}s:7:"gwangju";a:0:{}s:9:"gyeongbuk";a:0:{}s:8:"gyeonggi";a:0:{}s:9:"gyeongnam";a:0:{}s:7:"incheon";a:0:{}s:4:"jeju";a:0:{}s:7:"jeonbuk";a:0:{}s:7:"jeonnam";a:0:{}s:5:"seoul";a:0:{}s:5:"ulsan";a:0:{}s:8:"blogspot";a:0:{}}s:2:"kw";a:1:{s:1:"*";a:0:{}}s:2:"ky";a:5:{s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}}s:2:"kz";a:7:{s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:0:{}s:3:"nym";a:0:{}}s:2:"la";a:11:{s:3:"int";a:0:{}s:3:"net";a:0:{}s:4:"info";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"per";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"bnr";a:0:{}s:1:"c";a:0:{}s:3:"nym";a:0:{}}s:2:"lb";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"lc";a:7:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:2:"co";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:2:"oy";a:0:{}}s:2:"li";a:3:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}s:3:"nym";a:0:{}}s:2:"lk";a:15:{s:3:"gov";a:0:{}s:3:"sch";a:0:{}s:3:"net";a:0:{}s:3:"int";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"ngo";a:0:{}s:3:"soc";a:0:{}s:3:"web";a:0:{}s:3:"ltd";a:0:{}s:4:"assn";a:0:{}s:3:"grp";a:0:{}s:5:"hotel";a:0:{}s:2:"ac";a:0:{}}s:2:"lr";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}}s:2:"ls";a:2:{s:2:"co";a:0:{}s:3:"org";a:0:{}}s:2:"lt";a:3:{s:3:"gov";a:0:{}s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"lu";a:2:{s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"lv";a:9:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"mil";a:0:{}s:2:"id";a:0:{}s:3:"net";a:0:{}s:3:"asn";a:0:{}s:4:"conf";a:0:{}}s:2:"ly";a:9:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"plc";a:0:{}s:3:"edu";a:0:{}s:3:"sch";a:0:{}s:3:"med";a:0:{}s:3:"org";a:0:{}s:2:"id";a:0:{}}s:2:"ma";a:6:{s:2:"co";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:2:"ac";a:0:{}s:5:"press";a:0:{}}s:2:"mc";a:2:{s:2:"tm";a:0:{}s:4:"asso";a:0:{}}s:2:"md";a:1:{s:8:"blogspot";a:0:{}}s:2:"me";a:26:{s:2:"co";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:2:"ac";a:0:{}s:3:"gov";a:0:{}s:3:"its";a:0:{}s:4:"priv";a:0:{}s:3:"c66";a:0:{}s:6:"daplie";a:1:{s:9:"localhost";a:0:{}}s:8:"filegear";a:0:{}s:8:"brasilia";a:0:{}s:4:"ddns";a:0:{}s:6:"dnsfor";a:0:{}s:5:"hopto";a:0:{}s:7:"loginto";a:0:{}s:4:"noip";a:0:{}s:6:"webhop";a:0:{}s:3:"nym";a:0:{}s:11:"diskstation";a:0:{}s:7:"dscloud";a:0:{}s:4:"i234";a:0:{}s:4:"myds";a:0:{}s:8:"synology";a:0:{}s:8:"wedeploy";a:0:{}s:5:"yombo";a:0:{}}s:2:"mg";a:9:{s:3:"org";a:0:{}s:3:"nom";a:0:{}s:3:"gov";a:0:{}s:3:"prd";a:0:{}s:2:"tm";a:0:{}s:3:"edu";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:0:{}s:2:"co";a:0:{}}s:2:"mh";a:0:{}s:3:"mil";a:0:{}s:2:"mk";a:9:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"inf";a:0:{}s:4:"name";a:0:{}s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"ml";a:7:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:4:"gouv";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:6:"presse";a:0:{}}s:2:"mm";a:1:{s:1:"*";a:0:{}}s:2:"mn";a:4:{s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:3:"nyc";a:0:{}}s:2:"mo";a:5:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}}s:4:"mobi";a:1:{s:7:"dscloud";a:0:{}}s:2:"mp";a:0:{}s:2:"mq";a:0:{}s:2:"mr";a:2:{s:3:"gov";a:0:{}s:8:"blogspot";a:0:{}}s:2:"ms";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"mt";a:4:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"mu";a:7:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"or";a:0:{}}s:6:"museum";a:548:{s:7:"academy";a:0:{}s:11:"agriculture";a:0:{}s:3:"air";a:0:{}s:8:"airguard";a:0:{}s:7:"alabama";a:0:{}s:6:"alaska";a:0:{}s:5:"amber";a:0:{}s:9:"ambulance";a:0:{}s:8:"american";a:0:{}s:9:"americana";a:0:{}s:16:"americanantiques";a:0:{}s:11:"americanart";a:0:{}s:9:"amsterdam";a:0:{}s:3:"and";a:0:{}s:9:"annefrank";a:0:{}s:6:"anthro";a:0:{}s:12:"anthropology";a:0:{}s:8:"antiques";a:0:{}s:8:"aquarium";a:0:{}s:9:"arboretum";a:0:{}s:14:"archaeological";a:0:{}s:11:"archaeology";a:0:{}s:12:"architecture";a:0:{}s:3:"art";a:0:{}s:12:"artanddesign";a:0:{}s:9:"artcenter";a:0:{}s:7:"artdeco";a:0:{}s:12:"arteducation";a:0:{}s:10:"artgallery";a:0:{}s:4:"arts";a:0:{}s:13:"artsandcrafts";a:0:{}s:8:"asmatart";a:0:{}s:13:"assassination";a:0:{}s:6:"assisi";a:0:{}s:11:"association";a:0:{}s:9:"astronomy";a:0:{}s:7:"atlanta";a:0:{}s:6:"austin";a:0:{}s:9:"australia";a:0:{}s:10:"automotive";a:0:{}s:8:"aviation";a:0:{}s:4:"axis";a:0:{}s:7:"badajoz";a:0:{}s:7:"baghdad";a:0:{}s:4:"bahn";a:0:{}s:4:"bale";a:0:{}s:9:"baltimore";a:0:{}s:9:"barcelona";a:0:{}s:8:"baseball";a:0:{}s:5:"basel";a:0:{}s:5:"baths";a:0:{}s:6:"bauern";a:0:{}s:9:"beauxarts";a:0:{}s:13:"beeldengeluid";a:0:{}s:8:"bellevue";a:0:{}s:7:"bergbau";a:0:{}s:8:"berkeley";a:0:{}s:6:"berlin";a:0:{}s:4:"bern";a:0:{}s:5:"bible";a:0:{}s:6:"bilbao";a:0:{}s:4:"bill";a:0:{}s:7:"birdart";a:0:{}s:10:"birthplace";a:0:{}s:4:"bonn";a:0:{}s:6:"boston";a:0:{}s:9:"botanical";a:0:{}s:15:"botanicalgarden";a:0:{}s:13:"botanicgarden";a:0:{}s:6:"botany";a:0:{}s:16:"brandywinevalley";a:0:{}s:6:"brasil";a:0:{}s:7:"bristol";a:0:{}s:7:"british";a:0:{}s:15:"britishcolumbia";a:0:{}s:9:"broadcast";a:0:{}s:6:"brunel";a:0:{}s:7:"brussel";a:0:{}s:8:"brussels";a:0:{}s:9:"bruxelles";a:0:{}s:8:"building";a:0:{}s:7:"burghof";a:0:{}s:3:"bus";a:0:{}s:6:"bushey";a:0:{}s:8:"cadaques";a:0:{}s:10:"california";a:0:{}s:9:"cambridge";a:0:{}s:3:"can";a:0:{}s:6:"canada";a:0:{}s:10:"capebreton";a:0:{}s:7:"carrier";a:0:{}s:10:"cartoonart";a:0:{}s:14:"casadelamoneda";a:0:{}s:6:"castle";a:0:{}s:7:"castres";a:0:{}s:6:"celtic";a:0:{}s:6:"center";a:0:{}s:11:"chattanooga";a:0:{}s:10:"cheltenham";a:0:{}s:13:"chesapeakebay";a:0:{}s:7:"chicago";a:0:{}s:8:"children";a:0:{}s:9:"childrens";a:0:{}s:15:"childrensgarden";a:0:{}s:12:"chiropractic";a:0:{}s:9:"chocolate";a:0:{}s:14:"christiansburg";a:0:{}s:10:"cincinnati";a:0:{}s:6:"cinema";a:0:{}s:6:"circus";a:0:{}s:12:"civilisation";a:0:{}s:12:"civilization";a:0:{}s:8:"civilwar";a:0:{}s:7:"clinton";a:0:{}s:5:"clock";a:0:{}s:4:"coal";a:0:{}s:14:"coastaldefence";a:0:{}s:4:"cody";a:0:{}s:7:"coldwar";a:0:{}s:10:"collection";a:0:{}s:20:"colonialwilliamsburg";a:0:{}s:15:"coloradoplateau";a:0:{}s:8:"columbia";a:0:{}s:8:"columbus";a:0:{}s:13:"communication";a:0:{}s:14:"communications";a:0:{}s:9:"community";a:0:{}s:8:"computer";a:0:{}s:15:"computerhistory";a:0:{}s:20:"xn--comunicaes-v6a2o";a:0:{}s:12:"contemporary";a:0:{}s:15:"contemporaryart";a:0:{}s:7:"convent";a:0:{}s:10:"copenhagen";a:0:{}s:11:"corporation";a:0:{}s:36:"xn--correios-e-telecomunicaes-ghc29a";a:0:{}s:8:"corvette";a:0:{}s:7:"costume";a:0:{}s:13:"countryestate";a:0:{}s:6:"county";a:0:{}s:6:"crafts";a:0:{}s:9:"cranbrook";a:0:{}s:8:"creation";a:0:{}s:8:"cultural";a:0:{}s:14:"culturalcenter";a:0:{}s:7:"culture";a:0:{}s:5:"cyber";a:0:{}s:5:"cymru";a:0:{}s:4:"dali";a:0:{}s:6:"dallas";a:0:{}s:8:"database";a:0:{}s:3:"ddr";a:0:{}s:14:"decorativearts";a:0:{}s:8:"delaware";a:0:{}s:11:"delmenhorst";a:0:{}s:7:"denmark";a:0:{}s:5:"depot";a:0:{}s:6:"design";a:0:{}s:7:"detroit";a:0:{}s:8:"dinosaur";a:0:{}s:9:"discovery";a:0:{}s:5:"dolls";a:0:{}s:8:"donostia";a:0:{}s:6:"durham";a:0:{}s:10:"eastafrica";a:0:{}s:9:"eastcoast";a:0:{}s:9:"education";a:0:{}s:11:"educational";a:0:{}s:8:"egyptian";a:0:{}s:9:"eisenbahn";a:0:{}s:6:"elburg";a:0:{}s:10:"elvendrell";a:0:{}s:10:"embroidery";a:0:{}s:12:"encyclopedic";a:0:{}s:7:"england";a:0:{}s:10:"entomology";a:0:{}s:11:"environment";a:0:{}s:25:"environmentalconservation";a:0:{}s:8:"epilepsy";a:0:{}s:5:"essex";a:0:{}s:6:"estate";a:0:{}s:9:"ethnology";a:0:{}s:6:"exeter";a:0:{}s:10:"exhibition";a:0:{}s:6:"family";a:0:{}s:4:"farm";a:0:{}s:13:"farmequipment";a:0:{}s:7:"farmers";a:0:{}s:9:"farmstead";a:0:{}s:5:"field";a:0:{}s:8:"figueres";a:0:{}s:9:"filatelia";a:0:{}s:4:"film";a:0:{}s:7:"fineart";a:0:{}s:8:"finearts";a:0:{}s:7:"finland";a:0:{}s:8:"flanders";a:0:{}s:7:"florida";a:0:{}s:5:"force";a:0:{}s:12:"fortmissoula";a:0:{}s:9:"fortworth";a:0:{}s:10:"foundation";a:0:{}s:9:"francaise";a:0:{}s:9:"frankfurt";a:0:{}s:12:"franziskaner";a:0:{}s:11:"freemasonry";a:0:{}s:8:"freiburg";a:0:{}s:8:"fribourg";a:0:{}s:4:"frog";a:0:{}s:8:"fundacio";a:0:{}s:9:"furniture";a:0:{}s:7:"gallery";a:0:{}s:6:"garden";a:0:{}s:7:"gateway";a:0:{}s:9:"geelvinck";a:0:{}s:11:"gemological";a:0:{}s:7:"geology";a:0:{}s:7:"georgia";a:0:{}s:7:"giessen";a:0:{}s:4:"glas";a:0:{}s:5:"glass";a:0:{}s:5:"gorge";a:0:{}s:11:"grandrapids";a:0:{}s:4:"graz";a:0:{}s:8:"guernsey";a:0:{}s:10:"halloffame";a:0:{}s:7:"hamburg";a:0:{}s:7:"handson";a:0:{}s:18:"harvestcelebration";a:0:{}s:6:"hawaii";a:0:{}s:6:"health";a:0:{}s:14:"heimatunduhren";a:0:{}s:6:"hellas";a:0:{}s:8:"helsinki";a:0:{}s:15:"hembygdsforbund";a:0:{}s:8:"heritage";a:0:{}s:8:"histoire";a:0:{}s:10:"historical";a:0:{}s:17:"historicalsociety";a:0:{}s:14:"historichouses";a:0:{}s:10:"historisch";a:0:{}s:12:"historisches";a:0:{}s:7:"history";a:0:{}s:16:"historyofscience";a:0:{}s:8:"horology";a:0:{}s:5:"house";a:0:{}s:10:"humanities";a:0:{}s:12:"illustration";a:0:{}s:13:"imageandsound";a:0:{}s:6:"indian";a:0:{}s:7:"indiana";a:0:{}s:12:"indianapolis";a:0:{}s:12:"indianmarket";a:0:{}s:12:"intelligence";a:0:{}s:11:"interactive";a:0:{}s:4:"iraq";a:0:{}s:4:"iron";a:0:{}s:9:"isleofman";a:0:{}s:7:"jamison";a:0:{}s:9:"jefferson";a:0:{}s:9:"jerusalem";a:0:{}s:7:"jewelry";a:0:{}s:6:"jewish";a:0:{}s:9:"jewishart";a:0:{}s:3:"jfk";a:0:{}s:10:"journalism";a:0:{}s:7:"judaica";a:0:{}s:11:"judygarland";a:0:{}s:10:"juedisches";a:0:{}s:4:"juif";a:0:{}s:6:"karate";a:0:{}s:9:"karikatur";a:0:{}s:4:"kids";a:0:{}s:10:"koebenhavn";a:0:{}s:5:"koeln";a:0:{}s:5:"kunst";a:0:{}s:13:"kunstsammlung";a:0:{}s:14:"kunstunddesign";a:0:{}s:5:"labor";a:0:{}s:6:"labour";a:0:{}s:7:"lajolla";a:0:{}s:10:"lancashire";a:0:{}s:6:"landes";a:0:{}s:4:"lans";a:0:{}s:11:"xn--lns-qla";a:0:{}s:7:"larsson";a:0:{}s:11:"lewismiller";a:0:{}s:7:"lincoln";a:0:{}s:4:"linz";a:0:{}s:6:"living";a:0:{}s:13:"livinghistory";a:0:{}s:12:"localhistory";a:0:{}s:6:"london";a:0:{}s:10:"losangeles";a:0:{}s:6:"louvre";a:0:{}s:8:"loyalist";a:0:{}s:7:"lucerne";a:0:{}s:10:"luxembourg";a:0:{}s:6:"luzern";a:0:{}s:3:"mad";a:0:{}s:6:"madrid";a:0:{}s:8:"mallorca";a:0:{}s:10:"manchester";a:0:{}s:7:"mansion";a:0:{}s:8:"mansions";a:0:{}s:4:"manx";a:0:{}s:7:"marburg";a:0:{}s:8:"maritime";a:0:{}s:8:"maritimo";a:0:{}s:8:"maryland";a:0:{}s:10:"marylhurst";a:0:{}s:5:"media";a:0:{}s:7:"medical";a:0:{}s:19:"medizinhistorisches";a:0:{}s:6:"meeres";a:0:{}s:8:"memorial";a:0:{}s:9:"mesaverde";a:0:{}s:8:"michigan";a:0:{}s:11:"midatlantic";a:0:{}s:8:"military";a:0:{}s:4:"mill";a:0:{}s:6:"miners";a:0:{}s:6:"mining";a:0:{}s:9:"minnesota";a:0:{}s:7:"missile";a:0:{}s:8:"missoula";a:0:{}s:6:"modern";a:0:{}s:4:"moma";a:0:{}s:5:"money";a:0:{}s:8:"monmouth";a:0:{}s:10:"monticello";a:0:{}s:8:"montreal";a:0:{}s:6:"moscow";a:0:{}s:10:"motorcycle";a:0:{}s:8:"muenchen";a:0:{}s:8:"muenster";a:0:{}s:8:"mulhouse";a:0:{}s:6:"muncie";a:0:{}s:6:"museet";a:0:{}s:12:"museumcenter";a:0:{}s:16:"museumvereniging";a:0:{}s:5:"music";a:0:{}s:8:"national";a:0:{}s:16:"nationalfirearms";a:0:{}s:16:"nationalheritage";a:0:{}s:14:"nativeamerican";a:0:{}s:14:"naturalhistory";a:0:{}s:20:"naturalhistorymuseum";a:0:{}s:15:"naturalsciences";a:0:{}s:6:"nature";a:0:{}s:17:"naturhistorisches";a:0:{}s:19:"natuurwetenschappen";a:0:{}s:8:"naumburg";a:0:{}s:5:"naval";a:0:{}s:8:"nebraska";a:0:{}s:5:"neues";a:0:{}s:12:"newhampshire";a:0:{}s:9:"newjersey";a:0:{}s:9:"newmexico";a:0:{}s:7:"newport";a:0:{}s:9:"newspaper";a:0:{}s:7:"newyork";a:0:{}s:6:"niepce";a:0:{}s:7:"norfolk";a:0:{}s:5:"north";a:0:{}s:3:"nrw";a:0:{}s:9:"nuernberg";a:0:{}s:9:"nuremberg";a:0:{}s:3:"nyc";a:0:{}s:4:"nyny";a:0:{}s:13:"oceanographic";a:0:{}s:15:"oceanographique";a:0:{}s:5:"omaha";a:0:{}s:6:"online";a:0:{}s:7:"ontario";a:0:{}s:7:"openair";a:0:{}s:6:"oregon";a:0:{}s:11:"oregontrail";a:0:{}s:5:"otago";a:0:{}s:6:"oxford";a:0:{}s:7:"pacific";a:0:{}s:9:"paderborn";a:0:{}s:6:"palace";a:0:{}s:5:"paleo";a:0:{}s:11:"palmsprings";a:0:{}s:6:"panama";a:0:{}s:5:"paris";a:0:{}s:8:"pasadena";a:0:{}s:8:"pharmacy";a:0:{}s:12:"philadelphia";a:0:{}s:16:"philadelphiaarea";a:0:{}s:9:"philately";a:0:{}s:7:"phoenix";a:0:{}s:11:"photography";a:0:{}s:6:"pilots";a:0:{}s:10:"pittsburgh";a:0:{}s:11:"planetarium";a:0:{}s:10:"plantation";a:0:{}s:6:"plants";a:0:{}s:5:"plaza";a:0:{}s:6:"portal";a:0:{}s:8:"portland";a:0:{}s:10:"portlligat";a:0:{}s:28:"posts-and-telecommunications";a:0:{}s:12:"preservation";a:0:{}s:8:"presidio";a:0:{}s:5:"press";a:0:{}s:7:"project";a:0:{}s:6:"public";a:0:{}s:5:"pubol";a:0:{}s:6:"quebec";a:0:{}s:8:"railroad";a:0:{}s:7:"railway";a:0:{}s:8:"research";a:0:{}s:10:"resistance";a:0:{}s:12:"riodejaneiro";a:0:{}s:9:"rochester";a:0:{}s:7:"rockart";a:0:{}s:4:"roma";a:0:{}s:6:"russia";a:0:{}s:10:"saintlouis";a:0:{}s:5:"salem";a:0:{}s:12:"salvadordali";a:0:{}s:8:"salzburg";a:0:{}s:8:"sandiego";a:0:{}s:12:"sanfrancisco";a:0:{}s:12:"santabarbara";a:0:{}s:9:"santacruz";a:0:{}s:7:"santafe";a:0:{}s:12:"saskatchewan";a:0:{}s:4:"satx";a:0:{}s:10:"savannahga";a:0:{}s:12:"schlesisches";a:0:{}s:11:"schoenbrunn";a:0:{}s:11:"schokoladen";a:0:{}s:6:"school";a:0:{}s:7:"schweiz";a:0:{}s:7:"science";a:0:{}s:17:"scienceandhistory";a:0:{}s:18:"scienceandindustry";a:0:{}s:13:"sciencecenter";a:0:{}s:14:"sciencecenters";a:0:{}s:15:"science-fiction";a:0:{}s:14:"sciencehistory";a:0:{}s:8:"sciences";a:0:{}s:18:"sciencesnaturelles";a:0:{}s:8:"scotland";a:0:{}s:7:"seaport";a:0:{}s:10:"settlement";a:0:{}s:8:"settlers";a:0:{}s:5:"shell";a:0:{}s:10:"sherbrooke";a:0:{}s:7:"sibenik";a:0:{}s:4:"silk";a:0:{}s:3:"ski";a:0:{}s:5:"skole";a:0:{}s:7:"society";a:0:{}s:7:"sologne";a:0:{}s:14:"soundandvision";a:0:{}s:13:"southcarolina";a:0:{}s:9:"southwest";a:0:{}s:5:"space";a:0:{}s:3:"spy";a:0:{}s:6:"square";a:0:{}s:5:"stadt";a:0:{}s:8:"stalbans";a:0:{}s:9:"starnberg";a:0:{}s:5:"state";a:0:{}s:15:"stateofdelaware";a:0:{}s:7:"station";a:0:{}s:5:"steam";a:0:{}s:10:"steiermark";a:0:{}s:6:"stjohn";a:0:{}s:9:"stockholm";a:0:{}s:12:"stpetersburg";a:0:{}s:9:"stuttgart";a:0:{}s:6:"suisse";a:0:{}s:12:"surgeonshall";a:0:{}s:6:"surrey";a:0:{}s:8:"svizzera";a:0:{}s:6:"sweden";a:0:{}s:6:"sydney";a:0:{}s:4:"tank";a:0:{}s:3:"tcm";a:0:{}s:10:"technology";a:0:{}s:17:"telekommunikation";a:0:{}s:10:"television";a:0:{}s:5:"texas";a:0:{}s:7:"textile";a:0:{}s:7:"theater";a:0:{}s:4:"time";a:0:{}s:11:"timekeeping";a:0:{}s:8:"topology";a:0:{}s:6:"torino";a:0:{}s:5:"touch";a:0:{}s:4:"town";a:0:{}s:9:"transport";a:0:{}s:4:"tree";a:0:{}s:7:"trolley";a:0:{}s:5:"trust";a:0:{}s:7:"trustee";a:0:{}s:5:"uhren";a:0:{}s:3:"ulm";a:0:{}s:8:"undersea";a:0:{}s:10:"university";a:0:{}s:3:"usa";a:0:{}s:10:"usantiques";a:0:{}s:6:"usarts";a:0:{}s:15:"uscountryestate";a:0:{}s:9:"usculture";a:0:{}s:16:"usdecorativearts";a:0:{}s:8:"usgarden";a:0:{}s:9:"ushistory";a:0:{}s:7:"ushuaia";a:0:{}s:15:"uslivinghistory";a:0:{}s:4:"utah";a:0:{}s:4:"uvic";a:0:{}s:6:"valley";a:0:{}s:6:"vantaa";a:0:{}s:10:"versailles";a:0:{}s:6:"viking";a:0:{}s:7:"village";a:0:{}s:8:"virginia";a:0:{}s:7:"virtual";a:0:{}s:7:"virtuel";a:0:{}s:10:"vlaanderen";a:0:{}s:11:"volkenkunde";a:0:{}s:5:"wales";a:0:{}s:8:"wallonie";a:0:{}s:3:"war";a:0:{}s:12:"washingtondc";a:0:{}s:13:"watchandclock";a:0:{}s:15:"watch-and-clock";a:0:{}s:7:"western";a:0:{}s:9:"westfalen";a:0:{}s:7:"whaling";a:0:{}s:8:"wildlife";a:0:{}s:12:"williamsburg";a:0:{}s:8:"windmill";a:0:{}s:8:"workshop";a:0:{}s:4:"york";a:0:{}s:9:"yorkshire";a:0:{}s:8:"yosemite";a:0:{}s:5:"youth";a:0:{}s:10:"zoological";a:0:{}s:7:"zoology";a:0:{}s:14:"xn--9dbhblg6di";a:0:{}s:10:"xn--h1aegh";a:0:{}}s:2:"mv";a:14:{s:4:"aero";a:0:{}s:3:"biz";a:0:{}s:3:"com";a:0:{}s:4:"coop";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:6:"museum";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"pro";a:0:{}}s:2:"mw";a:11:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:4:"coop";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"int";a:0:{}s:6:"museum";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"mx";a:7:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"gob";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"my";a:8:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}s:8:"blogspot";a:0:{}}s:2:"mz";a:8:{s:2:"ac";a:0:{}s:3:"adv";a:0:{}s:2:"co";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"na";a:17:{s:4:"info";a:0:{}s:3:"pro";a:0:{}s:4:"name";a:0:{}s:6:"school";a:0:{}s:2:"or";a:0:{}s:2:"dr";a:0:{}s:2:"us";a:0:{}s:2:"mx";a:0:{}s:2:"ca";a:0:{}s:2:"in";a:0:{}s:2:"cc";a:0:{}s:2:"tv";a:0:{}s:2:"ws";a:0:{}s:4:"mobi";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}}s:4:"name";a:2:{s:3:"her";a:1:{s:6:"forgot";a:0:{}}s:3:"his";a:1:{s:6:"forgot";a:0:{}}}s:2:"nc";a:2:{s:4:"asso";a:0:{}s:3:"nom";a:0:{}}s:2:"ne";a:0:{}s:3:"net";a:94:{s:10:"alwaysdata";a:1:{s:1:"*";a:0:{}}s:10:"cloudfront";a:0:{}s:8:"t3l3p0rt";a:0:{}s:7:"myfritz";a:0:{}s:6:"boomla";a:0:{}s:7:"bplaced";a:0:{}s:7:"square7";a:0:{}s:2:"gb";a:0:{}s:2:"hu";a:0:{}s:2:"jp";a:0:{}s:2:"se";a:0:{}s:2:"uk";a:0:{}s:2:"in";a:0:{}s:11:"cloudaccess";a:0:{}s:9:"cdn77-ssl";a:0:{}s:5:"cdn77";a:1:{s:1:"r";a:0:{}}s:8:"feste-ip";a:0:{}s:10:"knx-server";a:0:{}s:13:"static-access";a:0:{}s:11:"cryptonomic";a:1:{s:1:"*";a:0:{}}s:6:"debian";a:0:{}s:12:"at-band-camp";a:0:{}s:7:"blogdns";a:0:{}s:8:"broke-it";a:0:{}s:10:"buyshouses";a:0:{}s:8:"dnsalias";a:0:{}s:7:"dnsdojo";a:0:{}s:7:"does-it";a:0:{}s:9:"dontexist";a:0:{}s:8:"dynalias";a:0:{}s:9:"dynathome";a:0:{}s:13:"endofinternet";a:0:{}s:7:"from-az";a:0:{}s:7:"from-co";a:0:{}s:7:"from-la";a:0:{}s:7:"from-ny";a:0:{}s:7:"gets-it";a:0:{}s:12:"ham-radio-op";a:0:{}s:7:"homeftp";a:0:{}s:6:"homeip";a:0:{}s:9:"homelinux";a:0:{}s:8:"homeunix";a:0:{}s:11:"in-the-band";a:0:{}s:9:"is-a-chef";a:0:{}s:9:"is-a-geek";a:0:{}s:8:"isa-geek";a:0:{}s:9:"kicks-ass";a:0:{}s:13:"office-on-the";a:0:{}s:7:"podzone";a:0:{}s:13:"scrapper-site";a:0:{}s:6:"selfip";a:0:{}s:8:"sells-it";a:0:{}s:8:"servebbs";a:0:{}s:8:"serveftp";a:0:{}s:8:"thruhere";a:0:{}s:6:"webhop";a:0:{}s:8:"definima";a:0:{}s:7:"casacam";a:0:{}s:4:"dynu";a:0:{}s:5:"dynv6";a:0:{}s:6:"twmail";a:0:{}s:2:"ru";a:0:{}s:11:"channelsdvr";a:0:{}s:8:"fastlylb";a:1:{s:3:"map";a:0:{}}s:6:"fastly";a:4:{s:7:"freetls";a:0:{}s:3:"map";a:0:{}s:4:"prod";a:2:{s:1:"a";a:0:{}s:6:"global";a:0:{}}s:3:"ssl";a:3:{s:1:"a";a:0:{}s:1:"b";a:0:{}s:6:"global";a:0:{}}}s:12:"flynnhosting";a:0:{}s:14:"cloudfunctions";a:0:{}s:9:"moonscale";a:0:{}s:7:"ipifony";a:0:{}s:5:"barsy";a:0:{}s:13:"azurewebsites";a:0:{}s:12:"azure-mobile";a:0:{}s:8:"cloudapp";a:0:{}s:14:"eating-organic";a:0:{}s:9:"mydissent";a:0:{}s:8:"myeffect";a:0:{}s:9:"mymediapc";a:0:{}s:5:"mypsx";a:0:{}s:16:"mysecuritycamera";a:0:{}s:6:"nhlfan";a:0:{}s:5:"no-ip";a:0:{}s:6:"pgafan";a:0:{}s:24:"privatizehealthinsurance";a:0:{}s:8:"bounceme";a:0:{}s:4:"ddns";a:0:{}s:10:"redirectme";a:0:{}s:9:"serveblog";a:0:{}s:14:"serveminecraft";a:0:{}s:5:"sytes";a:0:{}s:8:"rackmaze";a:0:{}s:16:"firewall-gateway";a:0:{}s:7:"dsmynas";a:0:{}s:8:"familyds";a:0:{}s:2:"za";a:0:{}}s:2:"nf";a:10:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"per";a:0:{}s:3:"rec";a:0:{}s:3:"web";a:0:{}s:4:"arts";a:0:{}s:4:"firm";a:0:{}s:4:"info";a:0:{}s:5:"other";a:0:{}s:5:"store";a:0:{}}s:2:"ng";a:10:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:1:"i";a:0:{}s:3:"mil";a:0:{}s:4:"mobi";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sch";a:0:{}}s:2:"ni";a:14:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:2:"in";a:0:{}s:4:"info";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"nom";a:0:{}s:3:"org";a:0:{}s:3:"web";a:0:{}}s:2:"nl";a:7:{s:2:"bv";a:0:{}s:14:"virtueeldomein";a:0:{}s:2:"co";a:0:{}s:8:"blogspot";a:0:{}s:8:"transurl";a:1:{s:1:"*";a:0:{}}s:7:"cistron";a:0:{}s:5:"demon";a:0:{}}s:2:"no";a:726:{s:3:"fhs";a:0:{}s:3:"vgs";a:0:{}s:10:"fylkesbibl";a:0:{}s:9:"folkebibl";a:0:{}s:6:"museum";a:0:{}s:6:"idrett";a:0:{}s:4:"priv";a:0:{}s:3:"mil";a:0:{}s:4:"stat";a:0:{}s:3:"dep";a:0:{}s:7:"kommune";a:0:{}s:5:"herad";a:0:{}s:2:"aa";a:1:{s:2:"gs";a:0:{}}s:2:"ah";a:1:{s:2:"gs";a:0:{}}s:2:"bu";a:1:{s:2:"gs";a:0:{}}s:2:"fm";a:1:{s:2:"gs";a:0:{}}s:2:"hl";a:1:{s:2:"gs";a:0:{}}s:2:"hm";a:1:{s:2:"gs";a:0:{}}s:9:"jan-mayen";a:1:{s:2:"gs";a:0:{}}s:2:"mr";a:1:{s:2:"gs";a:0:{}}s:2:"nl";a:1:{s:2:"gs";a:0:{}}s:2:"nt";a:1:{s:2:"gs";a:0:{}}s:2:"of";a:1:{s:2:"gs";a:0:{}}s:2:"ol";a:1:{s:2:"gs";a:0:{}}s:4:"oslo";a:1:{s:2:"gs";a:0:{}}s:2:"rl";a:1:{s:2:"gs";a:0:{}}s:2:"sf";a:1:{s:2:"gs";a:0:{}}s:2:"st";a:1:{s:2:"gs";a:0:{}}s:8:"svalbard";a:1:{s:2:"gs";a:0:{}}s:2:"tm";a:1:{s:2:"gs";a:0:{}}s:2:"tr";a:1:{s:2:"gs";a:0:{}}s:2:"va";a:1:{s:2:"gs";a:0:{}}s:2:"vf";a:1:{s:2:"gs";a:0:{}}s:8:"akrehamn";a:0:{}s:15:"xn--krehamn-dxa";a:0:{}s:6:"algard";a:0:{}s:13:"xn--lgrd-poac";a:0:{}s:4:"arna";a:0:{}s:10:"brumunddal";a:0:{}s:5:"bryne";a:0:{}s:11:"bronnoysund";a:0:{}s:18:"xn--brnnysund-m8ac";a:0:{}s:6:"drobak";a:0:{}s:13:"xn--drbak-wua";a:0:{}s:8:"egersund";a:0:{}s:7:"fetsund";a:0:{}s:5:"floro";a:0:{}s:12:"xn--flor-jra";a:0:{}s:11:"fredrikstad";a:0:{}s:8:"hokksund";a:0:{}s:8:"honefoss";a:0:{}s:15:"xn--hnefoss-q1a";a:0:{}s:8:"jessheim";a:0:{}s:9:"jorpeland";a:0:{}s:16:"xn--jrpeland-54a";a:0:{}s:8:"kirkenes";a:0:{}s:8:"kopervik";a:0:{}s:12:"krokstadelva";a:0:{}s:8:"langevag";a:0:{}s:15:"xn--langevg-jxa";a:0:{}s:7:"leirvik";a:0:{}s:9:"mjondalen";a:0:{}s:16:"xn--mjndalen-64a";a:0:{}s:9:"mo-i-rana";a:0:{}s:7:"mosjoen";a:0:{}s:14:"xn--mosjen-eya";a:0:{}s:12:"nesoddtangen";a:0:{}s:8:"orkanger";a:0:{}s:6:"osoyro";a:0:{}s:13:"xn--osyro-wua";a:0:{}s:6:"raholt";a:0:{}s:13:"xn--rholt-mra";a:0:{}s:12:"sandnessjoen";a:0:{}s:19:"xn--sandnessjen-ogb";a:0:{}s:13:"skedsmokorset";a:0:{}s:7:"slattum";a:0:{}s:10:"spjelkavik";a:0:{}s:9:"stathelle";a:0:{}s:7:"stavern";a:0:{}s:15:"stjordalshalsen";a:0:{}s:22:"xn--stjrdalshalsen-sqb";a:0:{}s:8:"tananger";a:0:{}s:6:"tranby";a:0:{}s:11:"vossevangen";a:0:{}s:6:"afjord";a:0:{}s:13:"xn--fjord-lra";a:0:{}s:7:"agdenes";a:0:{}s:2:"al";a:0:{}s:9:"xn--l-1fa";a:0:{}s:7:"alesund";a:0:{}s:14:"xn--lesund-hua";a:0:{}s:9:"alstahaug";a:0:{}s:4:"alta";a:0:{}s:11:"xn--lt-liac";a:0:{}s:9:"alaheadju";a:0:{}s:16:"xn--laheadju-7ya";a:0:{}s:6:"alvdal";a:0:{}s:4:"amli";a:0:{}s:11:"xn--mli-tla";a:0:{}s:4:"amot";a:0:{}s:11:"xn--mot-tla";a:0:{}s:6:"andebu";a:0:{}s:5:"andoy";a:0:{}s:12:"xn--andy-ira";a:0:{}s:9:"andasuolo";a:0:{}s:5:"ardal";a:0:{}s:12:"xn--rdal-poa";a:0:{}s:7:"aremark";a:0:{}s:7:"arendal";a:0:{}s:9:"xn--s-1fa";a:0:{}s:6:"aseral";a:0:{}s:13:"xn--seral-lra";a:0:{}s:5:"asker";a:0:{}s:5:"askim";a:0:{}s:7:"askvoll";a:0:{}s:5:"askoy";a:0:{}s:12:"xn--asky-ira";a:0:{}s:5:"asnes";a:0:{}s:12:"xn--snes-poa";a:0:{}s:9:"audnedaln";a:0:{}s:5:"aukra";a:0:{}s:4:"aure";a:0:{}s:7:"aurland";a:0:{}s:14:"aurskog-holand";a:0:{}s:21:"xn--aurskog-hland-jnb";a:0:{}s:9:"austevoll";a:0:{}s:9:"austrheim";a:0:{}s:6:"averoy";a:0:{}s:13:"xn--avery-yua";a:0:{}s:10:"balestrand";a:0:{}s:9:"ballangen";a:0:{}s:5:"balat";a:0:{}s:12:"xn--blt-elab";a:0:{}s:9:"balsfjord";a:0:{}s:12:"bahccavuotna";a:0:{}s:19:"xn--bhccavuotna-k7a";a:0:{}s:6:"bamble";a:0:{}s:5:"bardu";a:0:{}s:6:"beardu";a:0:{}s:6:"beiarn";a:0:{}s:7:"bajddar";a:0:{}s:14:"xn--bjddar-pta";a:0:{}s:6:"baidar";a:0:{}s:13:"xn--bidr-5nac";a:0:{}s:4:"berg";a:0:{}s:6:"bergen";a:0:{}s:8:"berlevag";a:0:{}s:15:"xn--berlevg-jxa";a:0:{}s:11:"bearalvahki";a:0:{}s:18:"xn--bearalvhki-y4a";a:0:{}s:6:"bindal";a:0:{}s:8:"birkenes";a:0:{}s:7:"bjarkoy";a:0:{}s:14:"xn--bjarky-fya";a:0:{}s:9:"bjerkreim";a:0:{}s:5:"bjugn";a:0:{}s:4:"bodo";a:0:{}s:11:"xn--bod-2na";a:0:{}s:8:"badaddja";a:0:{}s:15:"xn--bdddj-mrabd";a:0:{}s:7:"budejju";a:0:{}s:4:"bokn";a:0:{}s:9:"bremanger";a:0:{}s:7:"bronnoy";a:0:{}s:14:"xn--brnny-wuac";a:0:{}s:7:"bygland";a:0:{}s:5:"bykle";a:0:{}s:5:"barum";a:0:{}s:12:"xn--brum-voa";a:0:{}s:8:"telemark";a:2:{s:2:"bo";a:0:{}s:9:"xn--b-5ga";a:0:{}}s:8:"nordland";a:4:{s:2:"bo";a:0:{}s:9:"xn--b-5ga";a:0:{}s:5:"heroy";a:0:{}s:12:"xn--hery-ira";a:0:{}}s:6:"bievat";a:0:{}s:13:"xn--bievt-0qa";a:0:{}s:5:"bomlo";a:0:{}s:12:"xn--bmlo-gra";a:0:{}s:9:"batsfjord";a:0:{}s:16:"xn--btsfjord-9za";a:0:{}s:11:"bahcavuotna";a:0:{}s:18:"xn--bhcavuotna-s4a";a:0:{}s:5:"dovre";a:0:{}s:7:"drammen";a:0:{}s:9:"drangedal";a:0:{}s:5:"dyroy";a:0:{}s:12:"xn--dyry-ira";a:0:{}s:5:"donna";a:0:{}s:12:"xn--dnna-gra";a:0:{}s:3:"eid";a:0:{}s:8:"eidfjord";a:0:{}s:8:"eidsberg";a:0:{}s:7:"eidskog";a:0:{}s:8:"eidsvoll";a:0:{}s:9:"eigersund";a:0:{}s:7:"elverum";a:0:{}s:7:"enebakk";a:0:{}s:8:"engerdal";a:0:{}s:4:"etne";a:0:{}s:7:"etnedal";a:0:{}s:6:"evenes";a:0:{}s:8:"evenassi";a:0:{}s:17:"xn--eveni-0qa01ga";a:0:{}s:15:"evje-og-hornnes";a:0:{}s:7:"farsund";a:0:{}s:6:"fauske";a:0:{}s:7:"fuossko";a:0:{}s:7:"fuoisku";a:0:{}s:5:"fedje";a:0:{}s:3:"fet";a:0:{}s:6:"finnoy";a:0:{}s:13:"xn--finny-yua";a:0:{}s:6:"fitjar";a:0:{}s:6:"fjaler";a:0:{}s:5:"fjell";a:0:{}s:8:"flakstad";a:0:{}s:9:"flatanger";a:0:{}s:11:"flekkefjord";a:0:{}s:8:"flesberg";a:0:{}s:5:"flora";a:0:{}s:3:"fla";a:0:{}s:10:"xn--fl-zia";a:0:{}s:7:"folldal";a:0:{}s:7:"forsand";a:0:{}s:6:"fosnes";a:0:{}s:4:"frei";a:0:{}s:5:"frogn";a:0:{}s:7:"froland";a:0:{}s:6:"frosta";a:0:{}s:5:"frana";a:0:{}s:12:"xn--frna-woa";a:0:{}s:5:"froya";a:0:{}s:12:"xn--frya-hra";a:0:{}s:4:"fusa";a:0:{}s:8:"fyresdal";a:0:{}s:5:"forde";a:0:{}s:12:"xn--frde-gra";a:0:{}s:6:"gamvik";a:0:{}s:10:"gangaviika";a:0:{}s:19:"xn--ggaviika-8ya47h";a:0:{}s:6:"gaular";a:0:{}s:7:"gausdal";a:0:{}s:9:"gildeskal";a:0:{}s:16:"xn--gildeskl-g0a";a:0:{}s:5:"giske";a:0:{}s:7:"gjemnes";a:0:{}s:8:"gjerdrum";a:0:{}s:8:"gjerstad";a:0:{}s:7:"gjesdal";a:0:{}s:6:"gjovik";a:0:{}s:13:"xn--gjvik-wua";a:0:{}s:7:"gloppen";a:0:{}s:3:"gol";a:0:{}s:4:"gran";a:0:{}s:5:"grane";a:0:{}s:7:"granvin";a:0:{}s:9:"gratangen";a:0:{}s:8:"grimstad";a:0:{}s:5:"grong";a:0:{}s:9:"kraanghke";a:0:{}s:16:"xn--kranghke-b0a";a:0:{}s:4:"grue";a:0:{}s:5:"gulen";a:0:{}s:6:"hadsel";a:0:{}s:6:"halden";a:0:{}s:5:"halsa";a:0:{}s:5:"hamar";a:0:{}s:7:"hamaroy";a:0:{}s:6:"habmer";a:0:{}s:13:"xn--hbmer-xqa";a:0:{}s:6:"hapmir";a:0:{}s:13:"xn--hpmir-xqa";a:0:{}s:10:"hammerfest";a:0:{}s:12:"hammarfeasta";a:0:{}s:19:"xn--hmmrfeasta-s4ac";a:0:{}s:5:"haram";a:0:{}s:6:"hareid";a:0:{}s:7:"harstad";a:0:{}s:6:"hasvik";a:0:{}s:10:"aknoluokta";a:0:{}s:19:"xn--koluokta-7ya57h";a:0:{}s:12:"hattfjelldal";a:0:{}s:8:"aarborte";a:0:{}s:9:"haugesund";a:0:{}s:5:"hemne";a:0:{}s:6:"hemnes";a:0:{}s:8:"hemsedal";a:0:{}s:15:"more-og-romsdal";a:2:{s:5:"heroy";a:0:{}s:5:"sande";a:0:{}}s:22:"xn--mre-og-romsdal-qqb";a:2:{s:12:"xn--hery-ira";a:0:{}s:5:"sande";a:0:{}}s:5:"hitra";a:0:{}s:8:"hjartdal";a:0:{}s:10:"hjelmeland";a:0:{}s:5:"hobol";a:0:{}s:12:"xn--hobl-ira";a:0:{}s:3:"hof";a:0:{}s:3:"hol";a:0:{}s:4:"hole";a:0:{}s:11:"holmestrand";a:0:{}s:8:"holtalen";a:0:{}s:15:"xn--holtlen-hxa";a:0:{}s:9:"hornindal";a:0:{}s:6:"horten";a:0:{}s:6:"hurdal";a:0:{}s:5:"hurum";a:0:{}s:6:"hvaler";a:0:{}s:9:"hyllestad";a:0:{}s:10:"hagebostad";a:0:{}s:17:"xn--hgebostad-g3a";a:0:{}s:8:"hoyanger";a:0:{}s:15:"xn--hyanger-q1a";a:0:{}s:9:"hoylandet";a:0:{}s:16:"xn--hylandet-54a";a:0:{}s:2:"ha";a:0:{}s:9:"xn--h-2fa";a:0:{}s:7:"ibestad";a:0:{}s:7:"inderoy";a:0:{}s:14:"xn--indery-fya";a:0:{}s:7:"iveland";a:0:{}s:8:"jevnaker";a:0:{}s:6:"jondal";a:0:{}s:7:"jolster";a:0:{}s:14:"xn--jlster-bya";a:0:{}s:8:"karasjok";a:0:{}s:10:"karasjohka";a:0:{}s:19:"xn--krjohka-hwab49j";a:0:{}s:7:"karlsoy";a:0:{}s:5:"galsa";a:0:{}s:12:"xn--gls-elac";a:0:{}s:6:"karmoy";a:0:{}s:13:"xn--karmy-yua";a:0:{}s:10:"kautokeino";a:0:{}s:13:"guovdageaidnu";a:0:{}s:5:"klepp";a:0:{}s:5:"klabu";a:0:{}s:12:"xn--klbu-woa";a:0:{}s:9:"kongsberg";a:0:{}s:11:"kongsvinger";a:0:{}s:7:"kragero";a:0:{}s:14:"xn--krager-gya";a:0:{}s:12:"kristiansand";a:0:{}s:12:"kristiansund";a:0:{}s:10:"krodsherad";a:0:{}s:17:"xn--krdsherad-m8a";a:0:{}s:8:"kvalsund";a:0:{}s:11:"rahkkeravju";a:0:{}s:18:"xn--rhkkervju-01af";a:0:{}s:4:"kvam";a:0:{}s:9:"kvinesdal";a:0:{}s:10:"kvinnherad";a:0:{}s:9:"kviteseid";a:0:{}s:7:"kvitsoy";a:0:{}s:14:"xn--kvitsy-fya";a:0:{}s:8:"kvafjord";a:0:{}s:15:"xn--kvfjord-nxa";a:0:{}s:13:"giehtavuoatna";a:0:{}s:9:"kvanangen";a:0:{}s:16:"xn--kvnangen-k0a";a:0:{}s:8:"navuotna";a:0:{}s:15:"xn--nvuotna-hwa";a:0:{}s:7:"kafjord";a:0:{}s:14:"xn--kfjord-iua";a:0:{}s:9:"gaivuotna";a:0:{}s:16:"xn--givuotna-8ya";a:0:{}s:6:"larvik";a:0:{}s:8:"lavangen";a:0:{}s:7:"lavagis";a:0:{}s:6:"loabat";a:0:{}s:13:"xn--loabt-0qa";a:0:{}s:7:"lebesby";a:0:{}s:10:"davvesiida";a:0:{}s:9:"leikanger";a:0:{}s:9:"leirfjord";a:0:{}s:4:"leka";a:0:{}s:7:"leksvik";a:0:{}s:6:"lenvik";a:0:{}s:11:"leangaviika";a:0:{}s:18:"xn--leagaviika-52b";a:0:{}s:5:"lesja";a:0:{}s:8:"levanger";a:0:{}s:4:"lier";a:0:{}s:6:"lierne";a:0:{}s:11:"lillehammer";a:0:{}s:9:"lillesand";a:0:{}s:9:"lindesnes";a:0:{}s:6:"lindas";a:0:{}s:13:"xn--linds-pra";a:0:{}s:3:"lom";a:0:{}s:5:"loppa";a:0:{}s:6:"lahppi";a:0:{}s:13:"xn--lhppi-xqa";a:0:{}s:4:"lund";a:0:{}s:6:"lunner";a:0:{}s:5:"luroy";a:0:{}s:12:"xn--lury-ira";a:0:{}s:6:"luster";a:0:{}s:7:"lyngdal";a:0:{}s:6:"lyngen";a:0:{}s:4:"ivgu";a:0:{}s:6:"lardal";a:0:{}s:6:"lerdal";a:0:{}s:13:"xn--lrdal-sra";a:0:{}s:8:"lodingen";a:0:{}s:15:"xn--ldingen-q1a";a:0:{}s:9:"lorenskog";a:0:{}s:16:"xn--lrenskog-54a";a:0:{}s:5:"loten";a:0:{}s:12:"xn--lten-gra";a:0:{}s:6:"malvik";a:0:{}s:5:"masoy";a:0:{}s:13:"xn--msy-ula0h";a:0:{}s:6:"muosat";a:0:{}s:13:"xn--muost-0qa";a:0:{}s:6:"mandal";a:0:{}s:6:"marker";a:0:{}s:9:"marnardal";a:0:{}s:10:"masfjorden";a:0:{}s:6:"meland";a:0:{}s:6:"meldal";a:0:{}s:6:"melhus";a:0:{}s:5:"meloy";a:0:{}s:12:"xn--mely-ira";a:0:{}s:7:"meraker";a:0:{}s:14:"xn--merker-kua";a:0:{}s:7:"moareke";a:0:{}s:14:"xn--moreke-jua";a:0:{}s:7:"midsund";a:0:{}s:14:"midtre-gauldal";a:0:{}s:7:"modalen";a:0:{}s:5:"modum";a:0:{}s:5:"molde";a:0:{}s:8:"moskenes";a:0:{}s:4:"moss";a:0:{}s:6:"mosvik";a:0:{}s:7:"malselv";a:0:{}s:14:"xn--mlselv-iua";a:0:{}s:11:"malatvuopmi";a:0:{}s:18:"xn--mlatvuopmi-s4a";a:0:{}s:10:"namdalseid";a:0:{}s:6:"aejrie";a:0:{}s:6:"namsos";a:0:{}s:10:"namsskogan";a:0:{}s:14:"naamesjevuemie";a:0:{}s:21:"xn--nmesjevuemie-tcba";a:0:{}s:12:"laakesvuemie";a:0:{}s:9:"nannestad";a:0:{}s:6:"narvik";a:0:{}s:8:"narviika";a:0:{}s:8:"naustdal";a:0:{}s:11:"nedre-eiker";a:0:{}s:8:"akershus";a:1:{s:3:"nes";a:0:{}}s:8:"buskerud";a:1:{s:3:"nes";a:0:{}}s:5:"nesna";a:0:{}s:8:"nesodden";a:0:{}s:7:"nesseby";a:0:{}s:7:"unjarga";a:0:{}s:14:"xn--unjrga-rta";a:0:{}s:6:"nesset";a:0:{}s:8:"nissedal";a:0:{}s:8:"nittedal";a:0:{}s:11:"nord-aurdal";a:0:{}s:9:"nord-fron";a:0:{}s:9:"nord-odal";a:0:{}s:7:"norddal";a:0:{}s:8:"nordkapp";a:0:{}s:11:"davvenjarga";a:0:{}s:18:"xn--davvenjrga-y4a";a:0:{}s:11:"nordre-land";a:0:{}s:9:"nordreisa";a:0:{}s:5:"raisa";a:0:{}s:12:"xn--risa-5na";a:0:{}s:13:"nore-og-uvdal";a:0:{}s:8:"notodden";a:0:{}s:5:"naroy";a:0:{}s:13:"xn--nry-yla5g";a:0:{}s:8:"notteroy";a:0:{}s:15:"xn--nttery-byae";a:0:{}s:4:"odda";a:0:{}s:6:"oksnes";a:0:{}s:13:"xn--ksnes-uua";a:0:{}s:6:"oppdal";a:0:{}s:8:"oppegard";a:0:{}s:15:"xn--oppegrd-ixa";a:0:{}s:6:"orkdal";a:0:{}s:6:"orland";a:0:{}s:13:"xn--rland-uua";a:0:{}s:6:"orskog";a:0:{}s:13:"xn--rskog-uua";a:0:{}s:5:"orsta";a:0:{}s:12:"xn--rsta-fra";a:0:{}s:7:"hedmark";a:3:{s:2:"os";a:0:{}s:5:"valer";a:0:{}s:12:"xn--vler-qoa";a:0:{}}s:9:"hordaland";a:1:{s:2:"os";a:0:{}}s:4:"osen";a:0:{}s:7:"osteroy";a:0:{}s:14:"xn--ostery-fya";a:0:{}s:11:"ostre-toten";a:0:{}s:18:"xn--stre-toten-zcb";a:0:{}s:9:"overhalla";a:0:{}s:10:"ovre-eiker";a:0:{}s:17:"xn--vre-eiker-k8a";a:0:{}s:4:"oyer";a:0:{}s:11:"xn--yer-zna";a:0:{}s:8:"oygarden";a:0:{}s:15:"xn--ygarden-p1a";a:0:{}s:13:"oystre-slidre";a:0:{}s:20:"xn--ystre-slidre-ujb";a:0:{}s:9:"porsanger";a:0:{}s:8:"porsangu";a:0:{}s:17:"xn--porsgu-sta26f";a:0:{}s:9:"porsgrunn";a:0:{}s:5:"radoy";a:0:{}s:12:"xn--rady-ira";a:0:{}s:9:"rakkestad";a:0:{}s:4:"rana";a:0:{}s:6:"ruovat";a:0:{}s:9:"randaberg";a:0:{}s:5:"rauma";a:0:{}s:8:"rendalen";a:0:{}s:7:"rennebu";a:0:{}s:8:"rennesoy";a:0:{}s:15:"xn--rennesy-v1a";a:0:{}s:6:"rindal";a:0:{}s:7:"ringebu";a:0:{}s:9:"ringerike";a:0:{}s:9:"ringsaker";a:0:{}s:5:"rissa";a:0:{}s:5:"risor";a:0:{}s:12:"xn--risr-ira";a:0:{}s:4:"roan";a:0:{}s:6:"rollag";a:0:{}s:5:"rygge";a:0:{}s:8:"ralingen";a:0:{}s:15:"xn--rlingen-mxa";a:0:{}s:5:"rodoy";a:0:{}s:12:"xn--rdy-0nab";a:0:{}s:7:"romskog";a:0:{}s:14:"xn--rmskog-bya";a:0:{}s:5:"roros";a:0:{}s:12:"xn--rros-gra";a:0:{}s:4:"rost";a:0:{}s:11:"xn--rst-0na";a:0:{}s:6:"royken";a:0:{}s:13:"xn--ryken-vua";a:0:{}s:7:"royrvik";a:0:{}s:14:"xn--ryrvik-bya";a:0:{}s:4:"rade";a:0:{}s:11:"xn--rde-ula";a:0:{}s:8:"salangen";a:0:{}s:7:"siellak";a:0:{}s:7:"saltdal";a:0:{}s:5:"salat";a:0:{}s:12:"xn--slt-elab";a:0:{}s:12:"xn--slat-5na";a:0:{}s:9:"samnanger";a:0:{}s:8:"vestfold";a:1:{s:5:"sande";a:0:{}}s:10:"sandefjord";a:0:{}s:7:"sandnes";a:0:{}s:6:"sandoy";a:0:{}s:13:"xn--sandy-yua";a:0:{}s:9:"sarpsborg";a:0:{}s:5:"sauda";a:0:{}s:8:"sauherad";a:0:{}s:3:"sel";a:0:{}s:5:"selbu";a:0:{}s:5:"selje";a:0:{}s:7:"seljord";a:0:{}s:6:"sigdal";a:0:{}s:6:"siljan";a:0:{}s:6:"sirdal";a:0:{}s:5:"skaun";a:0:{}s:7:"skedsmo";a:0:{}s:3:"ski";a:0:{}s:5:"skien";a:0:{}s:8:"skiptvet";a:0:{}s:8:"skjervoy";a:0:{}s:15:"xn--skjervy-v1a";a:0:{}s:7:"skierva";a:0:{}s:14:"xn--skierv-uta";a:0:{}s:5:"skjak";a:0:{}s:12:"xn--skjk-soa";a:0:{}s:6:"skodje";a:0:{}s:8:"skanland";a:0:{}s:15:"xn--sknland-fxa";a:0:{}s:6:"skanit";a:0:{}s:13:"xn--sknit-yqa";a:0:{}s:5:"smola";a:0:{}s:12:"xn--smla-hra";a:0:{}s:10:"snillfjord";a:0:{}s:5:"snasa";a:0:{}s:12:"xn--snsa-roa";a:0:{}s:6:"snoasa";a:0:{}s:6:"snaase";a:0:{}s:13:"xn--snase-nra";a:0:{}s:7:"sogndal";a:0:{}s:7:"sokndal";a:0:{}s:4:"sola";a:0:{}s:6:"solund";a:0:{}s:9:"songdalen";a:0:{}s:8:"sortland";a:0:{}s:9:"spydeberg";a:0:{}s:6:"stange";a:0:{}s:9:"stavanger";a:0:{}s:7:"steigen";a:0:{}s:9:"steinkjer";a:0:{}s:8:"stjordal";a:0:{}s:15:"xn--stjrdal-s1a";a:0:{}s:6:"stokke";a:0:{}s:11:"stor-elvdal";a:0:{}s:5:"stord";a:0:{}s:7:"stordal";a:0:{}s:9:"storfjord";a:0:{}s:10:"omasvuotna";a:0:{}s:6:"strand";a:0:{}s:7:"stranda";a:0:{}s:5:"stryn";a:0:{}s:4:"sula";a:0:{}s:6:"suldal";a:0:{}s:4:"sund";a:0:{}s:7:"sunndal";a:0:{}s:8:"surnadal";a:0:{}s:5:"sveio";a:0:{}s:7:"svelvik";a:0:{}s:9:"sykkylven";a:0:{}s:5:"sogne";a:0:{}s:12:"xn--sgne-gra";a:0:{}s:5:"somna";a:0:{}s:12:"xn--smna-gra";a:0:{}s:11:"sondre-land";a:0:{}s:18:"xn--sndre-land-0cb";a:0:{}s:10:"sor-aurdal";a:0:{}s:17:"xn--sr-aurdal-l8a";a:0:{}s:8:"sor-fron";a:0:{}s:15:"xn--sr-fron-q1a";a:0:{}s:8:"sor-odal";a:0:{}s:15:"xn--sr-odal-q1a";a:0:{}s:12:"sor-varanger";a:0:{}s:19:"xn--sr-varanger-ggb";a:0:{}s:13:"matta-varjjat";a:0:{}s:20:"xn--mtta-vrjjat-k7af";a:0:{}s:7:"sorfold";a:0:{}s:14:"xn--srfold-bya";a:0:{}s:8:"sorreisa";a:0:{}s:15:"xn--srreisa-q1a";a:0:{}s:5:"sorum";a:0:{}s:12:"xn--srum-gra";a:0:{}s:4:"tana";a:0:{}s:6:"deatnu";a:0:{}s:4:"time";a:0:{}s:8:"tingvoll";a:0:{}s:4:"tinn";a:0:{}s:9:"tjeldsund";a:0:{}s:13:"dielddanuorri";a:0:{}s:5:"tjome";a:0:{}s:12:"xn--tjme-hra";a:0:{}s:5:"tokke";a:0:{}s:5:"tolga";a:0:{}s:7:"torsken";a:0:{}s:6:"tranoy";a:0:{}s:13:"xn--trany-yua";a:0:{}s:6:"tromso";a:0:{}s:13:"xn--troms-zua";a:0:{}s:6:"tromsa";a:0:{}s:5:"romsa";a:0:{}s:9:"trondheim";a:0:{}s:8:"troandin";a:0:{}s:6:"trysil";a:0:{}s:5:"trana";a:0:{}s:12:"xn--trna-woa";a:0:{}s:8:"trogstad";a:0:{}s:15:"xn--trgstad-r1a";a:0:{}s:11:"tvedestrand";a:0:{}s:5:"tydal";a:0:{}s:6:"tynset";a:0:{}s:8:"tysfjord";a:0:{}s:12:"divtasvuodna";a:0:{}s:13:"divttasvuotna";a:0:{}s:6:"tysnes";a:0:{}s:6:"tysvar";a:0:{}s:13:"xn--tysvr-vra";a:0:{}s:8:"tonsberg";a:0:{}s:15:"xn--tnsberg-q1a";a:0:{}s:10:"ullensaker";a:0:{}s:10:"ullensvang";a:0:{}s:5:"ulvik";a:0:{}s:6:"utsira";a:0:{}s:5:"vadso";a:0:{}s:12:"xn--vads-jra";a:0:{}s:10:"cahcesuolo";a:0:{}s:19:"xn--hcesuolo-7ya35b";a:0:{}s:7:"vaksdal";a:0:{}s:5:"valle";a:0:{}s:4:"vang";a:0:{}s:8:"vanylven";a:0:{}s:5:"vardo";a:0:{}s:12:"xn--vard-jra";a:0:{}s:7:"varggat";a:0:{}s:14:"xn--vrggt-xqad";a:0:{}s:5:"vefsn";a:0:{}s:7:"vaapste";a:0:{}s:4:"vega";a:0:{}s:9:"vegarshei";a:0:{}s:16:"xn--vegrshei-c0a";a:0:{}s:8:"vennesla";a:0:{}s:6:"verdal";a:0:{}s:6:"verran";a:0:{}s:6:"vestby";a:0:{}s:7:"vestnes";a:0:{}s:13:"vestre-slidre";a:0:{}s:12:"vestre-toten";a:0:{}s:9:"vestvagoy";a:0:{}s:17:"xn--vestvgy-ixa6o";a:0:{}s:9:"vevelstad";a:0:{}s:3:"vik";a:0:{}s:5:"vikna";a:0:{}s:10:"vindafjord";a:0:{}s:5:"volda";a:0:{}s:4:"voss";a:0:{}s:5:"varoy";a:0:{}s:13:"xn--vry-yla5g";a:0:{}s:5:"vagan";a:0:{}s:12:"xn--vgan-qoa";a:0:{}s:6:"voagat";a:0:{}s:6:"vagsoy";a:0:{}s:14:"xn--vgsy-qoa0j";a:0:{}s:4:"vaga";a:0:{}s:11:"xn--vg-yiab";a:0:{}s:7:"ostfold";a:1:{s:5:"valer";a:0:{}}s:14:"xn--stfold-9xa";a:1:{s:12:"xn--vler-qoa";a:0:{}}s:2:"co";a:0:{}s:8:"blogspot";a:0:{}}s:2:"np";a:1:{s:1:"*";a:0:{}}s:2:"nr";a:7:{s:3:"biz";a:0:{}s:4:"info";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"com";a:0:{}}s:2:"nu";a:4:{s:8:"merseine";a:0:{}s:4:"mine";a:0:{}s:8:"shacknet";a:0:{}s:3:"nom";a:0:{}}s:2:"nz";a:17:{s:2:"ac";a:0:{}s:2:"co";a:1:{s:8:"blogspot";a:0:{}}s:3:"cri";a:0:{}s:4:"geek";a:0:{}s:3:"gen";a:0:{}s:4:"govt";a:0:{}s:6:"health";a:0:{}s:3:"iwi";a:0:{}s:4:"kiwi";a:0:{}s:5:"maori";a:0:{}s:3:"mil";a:0:{}s:12:"xn--mori-qsa";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:10:"parliament";a:0:{}s:6:"school";a:0:{}s:3:"nym";a:0:{}}s:2:"om";a:9:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"med";a:0:{}s:6:"museum";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"pro";a:0:{}}s:5:"onion";a:0:{}s:3:"org";a:99:{s:5:"amune";a:1:{s:4:"tele";a:0:{}}s:8:"pimienta";a:0:{}s:7:"poivron";a:0:{}s:7:"potager";a:0:{}s:11:"sweetpepper";a:0:{}s:2:"ae";a:0:{}s:2:"us";a:0:{}s:7:"certmgr";a:0:{}s:5:"cdn77";a:2:{s:1:"c";a:0:{}s:3:"rsc";a:0:{}}s:12:"cdn77-secure";a:1:{s:6:"origin";a:1:{s:3:"ssl";a:0:{}}}s:7:"cloudns";a:0:{}s:7:"duckdns";a:0:{}s:4:"tunk";a:0:{}s:6:"dyndns";a:2:{s:2:"go";a:0:{}s:4:"home";a:0:{}}s:7:"blogdns";a:0:{}s:8:"blogsite";a:0:{}s:18:"boldlygoingnowhere";a:0:{}s:8:"dnsalias";a:0:{}s:7:"dnsdojo";a:0:{}s:11:"doesntexist";a:0:{}s:9:"dontexist";a:0:{}s:7:"doomdns";a:0:{}s:6:"dvrdns";a:0:{}s:8:"dynalias";a:0:{}s:13:"endofinternet";a:0:{}s:16:"endoftheinternet";a:0:{}s:7:"from-me";a:0:{}s:9:"game-host";a:0:{}s:6:"gotdns";a:0:{}s:10:"hobby-site";a:0:{}s:7:"homedns";a:0:{}s:7:"homeftp";a:0:{}s:9:"homelinux";a:0:{}s:8:"homeunix";a:0:{}s:14:"is-a-bruinsfan";a:0:{}s:14:"is-a-candidate";a:0:{}s:15:"is-a-celticsfan";a:0:{}s:9:"is-a-chef";a:0:{}s:9:"is-a-geek";a:0:{}s:11:"is-a-knight";a:0:{}s:15:"is-a-linux-user";a:0:{}s:12:"is-a-patsfan";a:0:{}s:11:"is-a-soxfan";a:0:{}s:8:"is-found";a:0:{}s:7:"is-lost";a:0:{}s:8:"is-saved";a:0:{}s:11:"is-very-bad";a:0:{}s:12:"is-very-evil";a:0:{}s:12:"is-very-good";a:0:{}s:12:"is-very-nice";a:0:{}s:13:"is-very-sweet";a:0:{}s:8:"isa-geek";a:0:{}s:9:"kicks-ass";a:0:{}s:11:"misconfused";a:0:{}s:7:"podzone";a:0:{}s:10:"readmyblog";a:0:{}s:6:"selfip";a:0:{}s:13:"sellsyourhome";a:0:{}s:8:"servebbs";a:0:{}s:8:"serveftp";a:0:{}s:9:"servegame";a:0:{}s:12:"stuff-4-sale";a:0:{}s:6:"webhop";a:0:{}s:5:"ddnss";a:0:{}s:9:"accesscam";a:0:{}s:6:"camdvr";a:0:{}s:8:"freeddns";a:0:{}s:6:"mywire";a:0:{}s:11:"webredirect";a:0:{}s:2:"eu";a:55:{s:2:"al";a:0:{}s:4:"asso";a:0:{}s:2:"at";a:0:{}s:2:"au";a:0:{}s:2:"be";a:0:{}s:2:"bg";a:0:{}s:2:"ca";a:0:{}s:2:"cd";a:0:{}s:2:"ch";a:0:{}s:2:"cn";a:0:{}s:2:"cy";a:0:{}s:2:"cz";a:0:{}s:2:"de";a:0:{}s:2:"dk";a:0:{}s:3:"edu";a:0:{}s:2:"ee";a:0:{}s:2:"es";a:0:{}s:2:"fi";a:0:{}s:2:"fr";a:0:{}s:2:"gr";a:0:{}s:2:"hr";a:0:{}s:2:"hu";a:0:{}s:2:"ie";a:0:{}s:2:"il";a:0:{}s:2:"in";a:0:{}s:3:"int";a:0:{}s:2:"is";a:0:{}s:2:"it";a:0:{}s:2:"jp";a:0:{}s:2:"kr";a:0:{}s:2:"lt";a:0:{}s:2:"lu";a:0:{}s:2:"lv";a:0:{}s:2:"mc";a:0:{}s:2:"me";a:0:{}s:2:"mk";a:0:{}s:2:"mt";a:0:{}s:2:"my";a:0:{}s:3:"net";a:0:{}s:2:"ng";a:0:{}s:2:"nl";a:0:{}s:2:"no";a:0:{}s:2:"nz";a:0:{}s:5:"paris";a:0:{}s:2:"pl";a:0:{}s:2:"pt";a:0:{}s:3:"q-a";a:0:{}s:2:"ro";a:0:{}s:2:"ru";a:0:{}s:2:"se";a:0:{}s:2:"si";a:0:{}s:2:"sk";a:0:{}s:2:"tr";a:0:{}s:2:"uk";a:0:{}s:2:"us";a:0:{}}s:6:"twmail";a:0:{}s:16:"fedorainfracloud";a:0:{}s:12:"fedorapeople";a:0:{}s:13:"fedoraproject";a:1:{s:5:"cloud";a:0:{}}s:8:"hepforge";a:0:{}s:2:"js";a:0:{}s:14:"bmoattachments";a:0:{}s:11:"cable-modem";a:0:{}s:10:"collegefan";a:0:{}s:16:"couchpotatofries";a:0:{}s:6:"mlbfan";a:0:{}s:16:"mysecuritycamera";a:0:{}s:6:"nflfan";a:0:{}s:10:"read-books";a:0:{}s:6:"ufcfan";a:0:{}s:5:"hopto";a:0:{}s:5:"myftp";a:0:{}s:5:"no-ip";a:0:{}s:5:"zapto";a:0:{}s:11:"my-firewall";a:0:{}s:10:"myfirewall";a:0:{}s:5:"spdns";a:0:{}s:7:"dsmynas";a:0:{}s:8:"familyds";a:0:{}s:9:"tuxfamily";a:0:{}s:11:"diskstation";a:0:{}s:2:"hk";a:0:{}s:7:"wmflabs";a:0:{}s:2:"za";a:0:{}}s:2:"pa";a:11:{s:2:"ac";a:0:{}s:3:"gob";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"sld";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"ing";a:0:{}s:3:"abo";a:0:{}s:3:"med";a:0:{}s:3:"nom";a:0:{}}s:2:"pe";a:9:{s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:3:"nom";a:0:{}s:3:"mil";a:0:{}s:3:"org";a:0:{}s:3:"com";a:0:{}s:3:"net";a:0:{}s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"pf";a:3:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}}s:2:"pg";a:1:{s:1:"*";a:0:{}}s:2:"ph";a:8:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"ngo";a:0:{}s:3:"mil";a:0:{}s:1:"i";a:0:{}}s:2:"pk";a:14:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:3:"fam";a:0:{}s:3:"biz";a:0:{}s:3:"web";a:0:{}s:3:"gov";a:0:{}s:3:"gob";a:0:{}s:3:"gok";a:0:{}s:3:"gon";a:0:{}s:3:"gop";a:0:{}s:3:"gos";a:0:{}s:4:"info";a:0:{}}s:2:"pl";a:166:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"aid";a:0:{}s:4:"agro";a:0:{}s:3:"atm";a:0:{}s:4:"auto";a:0:{}s:3:"biz";a:0:{}s:3:"edu";a:0:{}s:5:"gmina";a:0:{}s:3:"gsm";a:0:{}s:4:"info";a:0:{}s:4:"mail";a:0:{}s:6:"miasta";a:0:{}s:5:"media";a:0:{}s:3:"mil";a:0:{}s:13:"nieruchomosci";a:0:{}s:3:"nom";a:0:{}s:2:"pc";a:0:{}s:6:"powiat";a:0:{}s:4:"priv";a:0:{}s:10:"realestate";a:0:{}s:3:"rel";a:0:{}s:3:"sex";a:0:{}s:4:"shop";a:0:{}s:5:"sklep";a:0:{}s:3:"sos";a:0:{}s:6:"szkola";a:0:{}s:5:"targi";a:0:{}s:2:"tm";a:0:{}s:7:"tourism";a:0:{}s:6:"travel";a:0:{}s:9:"turystyka";a:0:{}s:3:"gov";a:47:{s:2:"ap";a:0:{}s:2:"ic";a:0:{}s:2:"is";a:0:{}s:2:"us";a:0:{}s:5:"kmpsp";a:0:{}s:5:"kppsp";a:0:{}s:5:"kwpsp";a:0:{}s:3:"psp";a:0:{}s:4:"wskr";a:0:{}s:3:"kwp";a:0:{}s:2:"mw";a:0:{}s:2:"ug";a:0:{}s:2:"um";a:0:{}s:4:"umig";a:0:{}s:4:"ugim";a:0:{}s:4:"upow";a:0:{}s:2:"uw";a:0:{}s:9:"starostwo";a:0:{}s:2:"pa";a:0:{}s:2:"po";a:0:{}s:4:"psse";a:0:{}s:3:"pup";a:0:{}s:4:"rzgw";a:0:{}s:2:"sa";a:0:{}s:2:"so";a:0:{}s:2:"sr";a:0:{}s:3:"wsa";a:0:{}s:3:"sko";a:0:{}s:3:"uzs";a:0:{}s:4:"wiih";a:0:{}s:4:"winb";a:0:{}s:4:"pinb";a:0:{}s:4:"wios";a:0:{}s:4:"witd";a:0:{}s:6:"wzmiuw";a:0:{}s:3:"piw";a:0:{}s:3:"wiw";a:0:{}s:4:"griw";a:0:{}s:3:"wif";a:0:{}s:3:"oum";a:0:{}s:3:"sdn";a:0:{}s:2:"zp";a:0:{}s:4:"uppo";a:0:{}s:3:"mup";a:0:{}s:4:"wuoz";a:0:{}s:8:"konsulat";a:0:{}s:4:"oirm";a:0:{}}s:8:"augustow";a:0:{}s:10:"babia-gora";a:0:{}s:6:"bedzin";a:0:{}s:7:"beskidy";a:0:{}s:10:"bialowieza";a:0:{}s:9:"bialystok";a:0:{}s:7:"bielawa";a:0:{}s:10:"bieszczady";a:0:{}s:11:"boleslawiec";a:0:{}s:9:"bydgoszcz";a:0:{}s:5:"bytom";a:0:{}s:7:"cieszyn";a:0:{}s:7:"czeladz";a:0:{}s:5:"czest";a:0:{}s:9:"dlugoleka";a:0:{}s:6:"elblag";a:0:{}s:3:"elk";a:0:{}s:6:"glogow";a:0:{}s:7:"gniezno";a:0:{}s:7:"gorlice";a:0:{}s:7:"grajewo";a:0:{}s:5:"ilawa";a:0:{}s:8:"jaworzno";a:0:{}s:12:"jelenia-gora";a:0:{}s:5:"jgora";a:0:{}s:6:"kalisz";a:0:{}s:15:"kazimierz-dolny";a:0:{}s:7:"karpacz";a:0:{}s:7:"kartuzy";a:0:{}s:7:"kaszuby";a:0:{}s:8:"katowice";a:0:{}s:5:"kepno";a:0:{}s:7:"ketrzyn";a:0:{}s:7:"klodzko";a:0:{}s:10:"kobierzyce";a:0:{}s:9:"kolobrzeg";a:0:{}s:5:"konin";a:0:{}s:10:"konskowola";a:0:{}s:5:"kutno";a:0:{}s:4:"lapy";a:0:{}s:6:"lebork";a:0:{}s:7:"legnica";a:0:{}s:7:"lezajsk";a:0:{}s:8:"limanowa";a:0:{}s:5:"lomza";a:0:{}s:6:"lowicz";a:0:{}s:5:"lubin";a:0:{}s:5:"lukow";a:0:{}s:7:"malbork";a:0:{}s:10:"malopolska";a:0:{}s:8:"mazowsze";a:0:{}s:6:"mazury";a:0:{}s:6:"mielec";a:0:{}s:6:"mielno";a:0:{}s:7:"mragowo";a:0:{}s:5:"naklo";a:0:{}s:8:"nowaruda";a:0:{}s:4:"nysa";a:0:{}s:5:"olawa";a:0:{}s:6:"olecko";a:0:{}s:6:"olkusz";a:0:{}s:7:"olsztyn";a:0:{}s:7:"opoczno";a:0:{}s:5:"opole";a:0:{}s:7:"ostroda";a:0:{}s:9:"ostroleka";a:0:{}s:9:"ostrowiec";a:0:{}s:10:"ostrowwlkp";a:0:{}s:4:"pila";a:0:{}s:4:"pisz";a:0:{}s:7:"podhale";a:0:{}s:8:"podlasie";a:0:{}s:9:"polkowice";a:0:{}s:7:"pomorze";a:0:{}s:9:"pomorskie";a:0:{}s:10:"prochowice";a:0:{}s:8:"pruszkow";a:0:{}s:9:"przeworsk";a:0:{}s:6:"pulawy";a:0:{}s:5:"radom";a:0:{}s:8:"rawa-maz";a:0:{}s:6:"rybnik";a:0:{}s:7:"rzeszow";a:0:{}s:5:"sanok";a:0:{}s:5:"sejny";a:0:{}s:5:"slask";a:0:{}s:6:"slupsk";a:0:{}s:9:"sosnowiec";a:0:{}s:12:"stalowa-wola";a:0:{}s:7:"skoczow";a:0:{}s:12:"starachowice";a:0:{}s:8:"stargard";a:0:{}s:7:"suwalki";a:0:{}s:8:"swidnica";a:0:{}s:10:"swiebodzin";a:0:{}s:11:"swinoujscie";a:0:{}s:8:"szczecin";a:0:{}s:8:"szczytno";a:0:{}s:10:"tarnobrzeg";a:0:{}s:5:"tgory";a:0:{}s:5:"turek";a:0:{}s:5:"tychy";a:0:{}s:5:"ustka";a:0:{}s:9:"walbrzych";a:0:{}s:6:"warmia";a:0:{}s:8:"warszawa";a:0:{}s:3:"waw";a:0:{}s:6:"wegrow";a:0:{}s:6:"wielun";a:0:{}s:5:"wlocl";a:0:{}s:9:"wloclawek";a:0:{}s:9:"wodzislaw";a:0:{}s:7:"wolomin";a:0:{}s:7:"wroclaw";a:0:{}s:9:"zachpomor";a:0:{}s:5:"zagan";a:0:{}s:5:"zarow";a:0:{}s:5:"zgora";a:0:{}s:9:"zgorzelec";a:0:{}s:4:"beep";a:0:{}s:2:"co";a:0:{}s:3:"art";a:0:{}s:7:"gliwice";a:0:{}s:6:"krakow";a:0:{}s:6:"poznan";a:0:{}s:4:"wroc";a:0:{}s:8:"zakopane";a:0:{}s:3:"gda";a:0:{}s:6:"gdansk";a:0:{}s:6:"gdynia";a:0:{}s:3:"med";a:0:{}s:5:"sopot";a:0:{}}s:2:"pm";a:0:{}s:2:"pn";a:5:{s:3:"gov";a:0:{}s:2:"co";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}}s:4:"post";a:0:{}s:2:"pr";a:13:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:4:"isla";a:0:{}s:3:"pro";a:0:{}s:3:"biz";a:0:{}s:4:"info";a:0:{}s:4:"name";a:0:{}s:3:"est";a:0:{}s:4:"prof";a:0:{}s:2:"ac";a:0:{}}s:3:"pro";a:12:{s:3:"aaa";a:0:{}s:3:"aca";a:0:{}s:4:"acct";a:0:{}s:6:"avocat";a:0:{}s:3:"bar";a:0:{}s:3:"cpa";a:0:{}s:3:"eng";a:0:{}s:3:"jur";a:0:{}s:3:"law";a:0:{}s:3:"med";a:0:{}s:5:"recht";a:0:{}s:7:"cloudns";a:0:{}}s:2:"ps";a:7:{s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"sec";a:0:{}s:3:"plo";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}}s:2:"pt";a:10:{s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"int";a:0:{}s:4:"publ";a:0:{}s:3:"com";a:0:{}s:4:"nome";a:0:{}s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"pw";a:8:{s:2:"co";a:0:{}s:2:"ne";a:0:{}s:2:"or";a:0:{}s:2:"ed";a:0:{}s:2:"go";a:0:{}s:5:"belau";a:0:{}s:7:"cloudns";a:0:{}s:3:"nom";a:0:{}}s:2:"py";a:7:{s:3:"com";a:0:{}s:4:"coop";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"qa";a:10:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sch";a:0:{}s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"re";a:4:{s:4:"asso";a:0:{}s:3:"com";a:0:{}s:3:"nom";a:0:{}s:8:"blogspot";a:0:{}}s:2:"ro";a:13:{s:4:"arts";a:0:{}s:3:"com";a:0:{}s:4:"firm";a:0:{}s:4:"info";a:0:{}s:3:"nom";a:0:{}s:2:"nt";a:0:{}s:3:"org";a:0:{}s:3:"rec";a:0:{}s:5:"store";a:0:{}s:2:"tm";a:0:{}s:3:"www";a:0:{}s:4:"shop";a:0:{}s:8:"blogspot";a:0:{}}s:2:"rs";a:8:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:2:"in";a:0:{}s:3:"org";a:0:{}s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"ru";a:30:{s:2:"ac";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:4:"test";a:0:{}s:7:"adygeya";a:0:{}s:9:"bashkiria";a:0:{}s:3:"bir";a:0:{}s:3:"cbg";a:0:{}s:3:"com";a:0:{}s:8:"dagestan";a:0:{}s:6:"grozny";a:0:{}s:8:"kalmykia";a:0:{}s:8:"kustanai";a:0:{}s:6:"marine";a:0:{}s:8:"mordovia";a:0:{}s:3:"msk";a:0:{}s:5:"mytis";a:0:{}s:7:"nalchik";a:0:{}s:3:"nov";a:0:{}s:10:"pyatigorsk";a:0:{}s:3:"spb";a:0:{}s:11:"vladikavkaz";a:0:{}s:8:"vladimir";a:0:{}s:8:"blogspot";a:0:{}s:7:"cldmail";a:1:{s:2:"hb";a:0:{}}s:3:"net";a:0:{}s:3:"org";a:0:{}s:2:"pp";a:0:{}}s:2:"rw";a:9:{s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}s:2:"ac";a:0:{}s:3:"com";a:0:{}s:2:"co";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:4:"gouv";a:0:{}}s:2:"sa";a:8:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"med";a:0:{}s:3:"pub";a:0:{}s:3:"edu";a:0:{}s:3:"sch";a:0:{}}s:2:"sb";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"sc";a:5:{s:3:"com";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}}s:2:"sd";a:8:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"med";a:0:{}s:2:"tv";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}}s:2:"se";a:41:{s:1:"a";a:0:{}s:2:"ac";a:0:{}s:1:"b";a:0:{}s:2:"bd";a:0:{}s:5:"brand";a:0:{}s:1:"c";a:0:{}s:1:"d";a:0:{}s:1:"e";a:0:{}s:1:"f";a:0:{}s:2:"fh";a:0:{}s:4:"fhsk";a:0:{}s:3:"fhv";a:0:{}s:1:"g";a:0:{}s:1:"h";a:0:{}s:1:"i";a:0:{}s:1:"k";a:0:{}s:7:"komforb";a:0:{}s:15:"kommunalforbund";a:0:{}s:6:"komvux";a:0:{}s:1:"l";a:0:{}s:6:"lanbib";a:0:{}s:1:"m";a:0:{}s:1:"n";a:0:{}s:14:"naturbruksgymn";a:0:{}s:1:"o";a:0:{}s:3:"org";a:0:{}s:1:"p";a:0:{}s:5:"parti";a:0:{}s:2:"pp";a:0:{}s:5:"press";a:0:{}s:1:"r";a:0:{}s:1:"s";a:0:{}s:1:"t";a:0:{}s:2:"tm";a:0:{}s:1:"u";a:0:{}s:1:"w";a:0:{}s:1:"x";a:0:{}s:1:"y";a:0:{}s:1:"z";a:0:{}s:3:"com";a:0:{}s:8:"blogspot";a:0:{}}s:2:"sg";a:7:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"per";a:0:{}s:8:"blogspot";a:0:{}}s:2:"sh";a:9:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"mil";a:0:{}s:8:"hashbang";a:0:{}s:8:"platform";a:1:{s:1:"*";a:0:{}}s:8:"wedeploy";a:0:{}s:3:"now";a:0:{}}s:2:"si";a:2:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"sj";a:0:{}s:2:"sk";a:2:{s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"sl";a:5:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}}s:2:"sm";a:0:{}s:2:"sn";a:8:{s:3:"art";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:4:"gouv";a:0:{}s:3:"org";a:0:{}s:5:"perso";a:0:{}s:4:"univ";a:0:{}s:8:"blogspot";a:0:{}}s:2:"so";a:3:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"sr";a:0:{}s:2:"st";a:12:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:9:"consulado";a:0:{}s:3:"edu";a:0:{}s:9:"embaixada";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:8:"principe";a:0:{}s:7:"saotome";a:0:{}s:5:"store";a:0:{}}s:2:"su";a:53:{s:8:"abkhazia";a:0:{}s:7:"adygeya";a:0:{}s:10:"aktyubinsk";a:0:{}s:11:"arkhangelsk";a:0:{}s:7:"armenia";a:0:{}s:8:"ashgabad";a:0:{}s:10:"azerbaijan";a:0:{}s:8:"balashov";a:0:{}s:9:"bashkiria";a:0:{}s:7:"bryansk";a:0:{}s:7:"bukhara";a:0:{}s:8:"chimkent";a:0:{}s:8:"dagestan";a:0:{}s:15:"east-kazakhstan";a:0:{}s:5:"exnet";a:0:{}s:7:"georgia";a:0:{}s:6:"grozny";a:0:{}s:7:"ivanovo";a:0:{}s:6:"jambyl";a:0:{}s:8:"kalmykia";a:0:{}s:6:"kaluga";a:0:{}s:7:"karacol";a:0:{}s:9:"karaganda";a:0:{}s:7:"karelia";a:0:{}s:9:"khakassia";a:0:{}s:9:"krasnodar";a:0:{}s:6:"kurgan";a:0:{}s:8:"kustanai";a:0:{}s:5:"lenug";a:0:{}s:10:"mangyshlak";a:0:{}s:8:"mordovia";a:0:{}s:3:"msk";a:0:{}s:8:"murmansk";a:0:{}s:7:"nalchik";a:0:{}s:5:"navoi";a:0:{}s:16:"north-kazakhstan";a:0:{}s:3:"nov";a:0:{}s:7:"obninsk";a:0:{}s:5:"penza";a:0:{}s:8:"pokrovsk";a:0:{}s:5:"sochi";a:0:{}s:3:"spb";a:0:{}s:8:"tashkent";a:0:{}s:6:"termez";a:0:{}s:9:"togliatti";a:0:{}s:7:"troitsk";a:0:{}s:11:"tselinograd";a:0:{}s:4:"tula";a:0:{}s:4:"tuva";a:0:{}s:11:"vladikavkaz";a:0:{}s:8:"vladimir";a:0:{}s:7:"vologda";a:0:{}s:3:"nym";a:0:{}}s:2:"sv";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:3:"org";a:0:{}s:3:"red";a:0:{}}s:2:"sx";a:2:{s:3:"gov";a:0:{}s:3:"nym";a:0:{}}s:2:"sy";a:6:{s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}}s:2:"sz";a:3:{s:2:"co";a:0:{}s:2:"ac";a:0:{}s:3:"org";a:0:{}}s:2:"tc";a:0:{}s:2:"td";a:1:{s:8:"blogspot";a:0:{}}s:3:"tel";a:0:{}s:2:"tf";a:0:{}s:2:"tg";a:0:{}s:2:"th";a:7:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"go";a:0:{}s:2:"in";a:0:{}s:2:"mi";a:0:{}s:3:"net";a:0:{}s:2:"or";a:0:{}}s:2:"tj";a:15:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:2:"go";a:0:{}s:3:"gov";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"nic";a:0:{}s:3:"org";a:0:{}s:4:"test";a:0:{}s:3:"web";a:0:{}}s:2:"tk";a:0:{}s:2:"tl";a:1:{s:3:"gov";a:0:{}}s:2:"tm";a:8:{s:3:"com";a:0:{}s:2:"co";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"nom";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"edu";a:0:{}}s:2:"tn";a:20:{s:3:"com";a:0:{}s:3:"ens";a:0:{}s:3:"fin";a:0:{}s:3:"gov";a:0:{}s:3:"ind";a:0:{}s:4:"intl";a:0:{}s:3:"nat";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:4:"info";a:0:{}s:5:"perso";a:0:{}s:7:"tourism";a:0:{}s:6:"edunet";a:0:{}s:4:"rnrt";a:0:{}s:3:"rns";a:0:{}s:3:"rnu";a:0:{}s:6:"mincom";a:0:{}s:7:"agrinet";a:0:{}s:7:"defense";a:0:{}s:5:"turen";a:0:{}}s:2:"to";a:7:{s:3:"com";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"mil";a:0:{}s:7:"vpnplus";a:0:{}}s:2:"tr";a:21:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:4:"info";a:0:{}s:3:"biz";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"web";a:0:{}s:3:"gen";a:0:{}s:2:"tv";a:0:{}s:2:"av";a:0:{}s:2:"dr";a:0:{}s:3:"bbs";a:0:{}s:4:"name";a:0:{}s:3:"tel";a:0:{}s:3:"gov";a:0:{}s:3:"bel";a:0:{}s:3:"pol";a:0:{}s:3:"mil";a:0:{}s:3:"k12";a:0:{}s:3:"edu";a:0:{}s:3:"kep";a:0:{}s:2:"nc";a:1:{s:3:"gov";a:0:{}}}s:6:"travel";a:0:{}s:2:"tt";a:17:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"biz";a:0:{}s:4:"info";a:0:{}s:3:"pro";a:0:{}s:3:"int";a:0:{}s:4:"coop";a:0:{}s:4:"jobs";a:0:{}s:4:"mobi";a:0:{}s:6:"travel";a:0:{}s:6:"museum";a:0:{}s:4:"aero";a:0:{}s:4:"name";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}}s:2:"tv";a:4:{s:6:"dyndns";a:0:{}s:11:"better-than";a:0:{}s:10:"on-the-web";a:0:{}s:10:"worse-than";a:0:{}}s:2:"tw";a:16:{s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:1:{s:8:"mymailer";a:0:{}}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"idv";a:0:{}s:4:"game";a:0:{}s:4:"ebiz";a:0:{}s:4:"club";a:0:{}s:12:"xn--zf0ao64a";a:0:{}s:10:"xn--uc0atv";a:0:{}s:11:"xn--czrw28b";a:0:{}s:3:"url";a:0:{}s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"tz";a:12:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"go";a:0:{}s:5:"hotel";a:0:{}s:4:"info";a:0:{}s:2:"me";a:0:{}s:3:"mil";a:0:{}s:4:"mobi";a:0:{}s:2:"ne";a:0:{}s:2:"or";a:0:{}s:2:"sc";a:0:{}s:2:"tv";a:0:{}}s:2:"ua";a:82:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:2:"in";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:9:"cherkassy";a:0:{}s:8:"cherkasy";a:0:{}s:9:"chernigov";a:0:{}s:9:"chernihiv";a:0:{}s:10:"chernivtsi";a:0:{}s:10:"chernovtsy";a:0:{}s:2:"ck";a:0:{}s:2:"cn";a:0:{}s:2:"cr";a:0:{}s:6:"crimea";a:0:{}s:2:"cv";a:0:{}s:2:"dn";a:0:{}s:14:"dnepropetrovsk";a:0:{}s:14:"dnipropetrovsk";a:0:{}s:7:"dominic";a:0:{}s:7:"donetsk";a:0:{}s:2:"dp";a:0:{}s:2:"if";a:0:{}s:15:"ivano-frankivsk";a:0:{}s:2:"kh";a:0:{}s:7:"kharkiv";a:0:{}s:7:"kharkov";a:0:{}s:7:"kherson";a:0:{}s:12:"khmelnitskiy";a:0:{}s:12:"khmelnytskyi";a:0:{}s:4:"kiev";a:0:{}s:10:"kirovograd";a:0:{}s:2:"km";a:0:{}s:2:"kr";a:0:{}s:4:"krym";a:0:{}s:2:"ks";a:0:{}s:2:"kv";a:0:{}s:4:"kyiv";a:0:{}s:2:"lg";a:0:{}s:2:"lt";a:0:{}s:7:"lugansk";a:0:{}s:5:"lutsk";a:0:{}s:2:"lv";a:0:{}s:4:"lviv";a:0:{}s:2:"mk";a:0:{}s:8:"mykolaiv";a:0:{}s:8:"nikolaev";a:0:{}s:2:"od";a:0:{}s:5:"odesa";a:0:{}s:6:"odessa";a:0:{}s:2:"pl";a:0:{}s:7:"poltava";a:0:{}s:5:"rivne";a:0:{}s:5:"rovno";a:0:{}s:2:"rv";a:0:{}s:2:"sb";a:0:{}s:10:"sebastopol";a:0:{}s:10:"sevastopol";a:0:{}s:2:"sm";a:0:{}s:4:"sumy";a:0:{}s:2:"te";a:0:{}s:8:"ternopil";a:0:{}s:2:"uz";a:0:{}s:8:"uzhgorod";a:0:{}s:7:"vinnica";a:0:{}s:9:"vinnytsia";a:0:{}s:2:"vn";a:0:{}s:5:"volyn";a:0:{}s:5:"yalta";a:0:{}s:11:"zaporizhzhe";a:0:{}s:12:"zaporizhzhia";a:0:{}s:8:"zhitomir";a:0:{}s:8:"zhytomyr";a:0:{}s:2:"zp";a:0:{}s:2:"zt";a:0:{}s:2:"cc";a:0:{}s:3:"inf";a:0:{}s:3:"ltd";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:2:"pp";a:0:{}}s:2:"ug";a:10:{s:2:"co";a:0:{}s:2:"or";a:0:{}s:2:"ac";a:0:{}s:2:"sc";a:0:{}s:2:"go";a:0:{}s:2:"ne";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"uk";a:11:{s:2:"ac";a:0:{}s:2:"co";a:3:{s:8:"blogspot";a:0:{}s:5:"no-ip";a:0:{}s:13:"wellbeingzone";a:0:{}}s:3:"gov";a:2:{s:7:"service";a:0:{}s:10:"homeoffice";a:0:{}}s:3:"ltd";a:0:{}s:2:"me";a:0:{}s:3:"net";a:0:{}s:3:"nhs";a:0:{}s:3:"org";a:0:{}s:3:"plc";a:0:{}s:6:"police";a:0:{}s:3:"sch";a:1:{s:1:"*";a:0:{}}}s:2:"us";a:68:{s:3:"dni";a:0:{}s:3:"fed";a:0:{}s:3:"isa";a:0:{}s:4:"kids";a:0:{}s:3:"nsn";a:0:{}s:2:"ak";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"al";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ar";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"as";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"az";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ca";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"co";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ct";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"dc";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"de";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"fl";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ga";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"gu";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"hi";a:2:{s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ia";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"id";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"il";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"in";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ks";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ky";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"la";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ma";a:3:{s:3:"k12";a:3:{s:3:"pvt";a:0:{}s:4:"chtr";a:0:{}s:6:"paroch";a:0:{}}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"md";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"me";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"mi";a:11:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}s:9:"ann-arbor";a:0:{}s:3:"cog";a:0:{}s:3:"dst";a:0:{}s:5:"eaton";a:0:{}s:3:"gen";a:0:{}s:3:"mus";a:0:{}s:3:"tec";a:0:{}s:9:"washtenaw";a:0:{}}s:2:"mn";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"mo";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ms";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"mt";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nc";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nd";a:2:{s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ne";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nh";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nj";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nm";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nv";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ny";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"oh";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ok";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"or";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"pa";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"pr";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ri";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"sc";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"sd";a:2:{s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"tn";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"tx";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ut";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"vi";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"vt";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"va";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"wa";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"wi";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"wv";a:1:{s:2:"cc";a:0:{}}s:2:"wy";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:7:"cloudns";a:0:{}s:4:"drud";a:0:{}s:5:"is-by";a:0:{}s:11:"land-4-sale";a:0:{}s:12:"stuff-4-sale";a:0:{}s:7:"golffan";a:0:{}s:4:"noip";a:0:{}s:7:"pointto";a:0:{}}s:2:"uy";a:7:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"edu";a:0:{}s:3:"gub";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"nom";a:0:{}}s:2:"uz";a:4:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"va";a:0:{}s:2:"vc";a:7:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"edu";a:0:{}s:3:"nom";a:0:{}}s:2:"ve";a:17:{s:4:"arts";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"e12";a:0:{}s:3:"edu";a:0:{}s:4:"firm";a:0:{}s:3:"gob";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"rec";a:0:{}s:5:"store";a:0:{}s:3:"tec";a:0:{}s:3:"web";a:0:{}}s:2:"vg";a:1:{s:3:"nom";a:0:{}}s:2:"vi";a:5:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"k12";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"vn";a:13:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"int";a:0:{}s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:4:"info";a:0:{}s:4:"name";a:0:{}s:3:"pro";a:0:{}s:6:"health";a:0:{}s:8:"blogspot";a:0:{}}s:2:"vu";a:4:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"wf";a:0:{}s:2:"ws";a:8:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:7:"advisor";a:1:{s:1:"*";a:0:{}}s:6:"dyndns";a:0:{}s:6:"mypets";a:0:{}}s:2:"yt";a:0:{}s:14:"xn--mgbaam7a8h";a:0:{}s:10:"xn--y9a3aq";a:0:{}s:14:"xn--54b7fta0cc";a:0:{}s:8:"xn--90ae";a:0:{}s:9:"xn--90ais";a:0:{}s:10:"xn--fiqs8s";a:0:{}s:10:"xn--fiqz9s";a:0:{}s:15:"xn--lgbbat1ad8j";a:0:{}s:10:"xn--wgbh1c";a:0:{}s:9:"xn--e1a4c";a:0:{}s:8:"xn--node";a:0:{}s:8:"xn--qxam";a:0:{}s:11:"xn--j6w193g";a:0:{}s:11:"xn--2scrj9c";a:0:{}s:11:"xn--3hcrj9c";a:0:{}s:12:"xn--45br5cyl";a:0:{}s:14:"xn--h2breg3eve";a:0:{}s:13:"xn--h2brj9c8c";a:0:{}s:12:"xn--mgbgu82a";a:0:{}s:14:"xn--rvc1e0am3e";a:0:{}s:11:"xn--h2brj9c";a:0:{}s:14:"xn--mgbbh1a71e";a:0:{}s:13:"xn--fpcrj9c3d";a:0:{}s:11:"xn--gecrj9c";a:0:{}s:11:"xn--s9brj9c";a:0:{}s:11:"xn--45brj9c";a:0:{}s:17:"xn--xkc2dl3a5ee0h";a:0:{}s:15:"xn--mgba3a4f16a";a:0:{}s:14:"xn--mgba3a4fra";a:0:{}s:11:"xn--mgbtx2b";a:0:{}s:14:"xn--mgbayh7gpa";a:0:{}s:12:"xn--3e0b707e";a:0:{}s:11:"xn--80ao21a";a:0:{}s:13:"xn--fzc2c9e2c";a:0:{}s:16:"xn--xkc2al3hye2a";a:0:{}s:15:"xn--mgbc0a9azcg";a:0:{}s:9:"xn--d1alf";a:0:{}s:9:"xn--l1acc";a:0:{}s:11:"xn--mix891f";a:0:{}s:11:"xn--mix082f";a:0:{}s:14:"xn--mgbx4cd0ab";a:0:{}s:12:"xn--mgb9awbf";a:0:{}s:17:"xn--mgbai9azgqp6j";a:0:{}s:18:"xn--mgbai9a5eva00b";a:0:{}s:13:"xn--ygbi2ammx";a:0:{}s:10:"xn--90a3ac";a:6:{s:8:"xn--o1ac";a:0:{}s:9:"xn--c1avg";a:0:{}s:9:"xn--90azh";a:0:{}s:8:"xn--d1at";a:0:{}s:9:"xn--o1ach";a:0:{}s:8:"xn--80au";a:0:{}}s:8:"xn--p1ai";a:0:{}s:10:"xn--wgbl6a";a:0:{}s:17:"xn--mgberp4a5d4ar";a:0:{}s:19:"xn--mgberp4a5d4a87g";a:0:{}s:19:"xn--mgbqly7c0a67fbc";a:0:{}s:16:"xn--mgbqly7cvafr";a:0:{}s:12:"xn--mgbpl2fh";a:0:{}s:13:"xn--yfro4i67o";a:0:{}s:22:"xn--clchc0ea0b2g2a9gcd";a:0:{}s:12:"xn--ogbpf8fl";a:0:{}s:12:"xn--mgbtf8fl";a:0:{}s:10:"xn--o3cw4h";a:6:{s:13:"xn--12c1fe0br";a:0:{}s:16:"xn--12co0c3b4eva";a:0:{}s:13:"xn--h3cuzk1di";a:0:{}s:11:"xn--o3cyx2a";a:0:{}s:12:"xn--m3ch0j3a";a:0:{}s:15:"xn--12cfi8ixb8l";a:0:{}}s:11:"xn--pgbs0dh";a:0:{}s:11:"xn--kpry57d";a:0:{}s:11:"xn--kprw13d";a:0:{}s:11:"xn--nnx388a";a:0:{}s:9:"xn--j1amh";a:0:{}s:12:"xn--mgb2ddes";a:0:{}s:3:"xxx";a:0:{}s:2:"ye";a:1:{s:1:"*";a:0:{}}s:2:"za";a:17:{s:2:"ac";a:0:{}s:5:"agric";a:0:{}s:3:"alt";a:0:{}s:2:"co";a:1:{s:8:"blogspot";a:0:{}}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:7:"grondar";a:0:{}s:3:"law";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"ngo";a:0:{}s:3:"nis";a:0:{}s:3:"nom";a:0:{}s:3:"org";a:0:{}s:6:"school";a:0:{}s:2:"tm";a:0:{}s:3:"web";a:0:{}}s:2:"zm";a:11:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sch";a:0:{}}s:2:"zw";a:5:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"org";a:0:{}}s:3:"aaa";a:0:{}s:4:"aarp";a:0:{}s:6:"abarth";a:0:{}s:3:"abb";a:0:{}s:6:"abbott";a:0:{}s:6:"abbvie";a:0:{}s:3:"abc";a:0:{}s:4:"able";a:0:{}s:7:"abogado";a:0:{}s:8:"abudhabi";a:0:{}s:7:"academy";a:0:{}s:9:"accenture";a:0:{}s:10:"accountant";a:0:{}s:11:"accountants";a:0:{}s:3:"aco";a:0:{}s:6:"active";a:0:{}s:5:"actor";a:0:{}s:4:"adac";a:0:{}s:3:"ads";a:0:{}s:5:"adult";a:0:{}s:3:"aeg";a:0:{}s:5:"aetna";a:0:{}s:14:"afamilycompany";a:0:{}s:3:"afl";a:0:{}s:6:"africa";a:0:{}s:7:"agakhan";a:0:{}s:6:"agency";a:0:{}s:3:"aig";a:0:{}s:4:"aigo";a:0:{}s:6:"airbus";a:0:{}s:8:"airforce";a:0:{}s:6:"airtel";a:0:{}s:4:"akdn";a:0:{}s:9:"alfaromeo";a:0:{}s:7:"alibaba";a:0:{}s:6:"alipay";a:0:{}s:9:"allfinanz";a:0:{}s:8:"allstate";a:0:{}s:4:"ally";a:0:{}s:6:"alsace";a:0:{}s:6:"alstom";a:0:{}s:15:"americanexpress";a:0:{}s:14:"americanfamily";a:0:{}s:4:"amex";a:0:{}s:5:"amfam";a:0:{}s:5:"amica";a:0:{}s:9:"amsterdam";a:0:{}s:9:"analytics";a:0:{}s:7:"android";a:0:{}s:6:"anquan";a:0:{}s:3:"anz";a:0:{}s:3:"aol";a:0:{}s:10:"apartments";a:0:{}s:3:"app";a:0:{}s:5:"apple";a:0:{}s:9:"aquarelle";a:0:{}s:4:"arab";a:0:{}s:6:"aramco";a:0:{}s:5:"archi";a:0:{}s:4:"army";a:0:{}s:3:"art";a:0:{}s:4:"arte";a:0:{}s:4:"asda";a:0:{}s:10:"associates";a:0:{}s:7:"athleta";a:0:{}s:8:"attorney";a:0:{}s:7:"auction";a:0:{}s:4:"audi";a:0:{}s:7:"audible";a:0:{}s:5:"audio";a:0:{}s:7:"auspost";a:0:{}s:6:"author";a:0:{}s:4:"auto";a:0:{}s:5:"autos";a:0:{}s:7:"avianca";a:0:{}s:3:"aws";a:0:{}s:3:"axa";a:0:{}s:5:"azure";a:0:{}s:4:"baby";a:0:{}s:5:"baidu";a:0:{}s:7:"banamex";a:0:{}s:14:"bananarepublic";a:0:{}s:4:"band";a:0:{}s:4:"bank";a:0:{}s:3:"bar";a:0:{}s:9:"barcelona";a:0:{}s:11:"barclaycard";a:0:{}s:8:"barclays";a:0:{}s:8:"barefoot";a:0:{}s:8:"bargains";a:0:{}s:8:"baseball";a:0:{}s:10:"basketball";a:0:{}s:7:"bauhaus";a:0:{}s:6:"bayern";a:0:{}s:3:"bbc";a:0:{}s:3:"bbt";a:0:{}s:4:"bbva";a:0:{}s:3:"bcg";a:0:{}s:3:"bcn";a:0:{}s:5:"beats";a:0:{}s:6:"beauty";a:0:{}s:4:"beer";a:0:{}s:7:"bentley";a:0:{}s:6:"berlin";a:0:{}s:4:"best";a:0:{}s:7:"bestbuy";a:0:{}s:3:"bet";a:0:{}s:6:"bharti";a:0:{}s:5:"bible";a:0:{}s:3:"bid";a:0:{}s:4:"bike";a:0:{}s:4:"bing";a:0:{}s:5:"bingo";a:0:{}s:3:"bio";a:0:{}s:5:"black";a:0:{}s:11:"blackfriday";a:0:{}s:6:"blanco";a:0:{}s:11:"blockbuster";a:0:{}s:4:"blog";a:0:{}s:9:"bloomberg";a:0:{}s:4:"blue";a:0:{}s:3:"bms";a:0:{}s:3:"bmw";a:0:{}s:3:"bnl";a:0:{}s:10:"bnpparibas";a:0:{}s:5:"boats";a:0:{}s:10:"boehringer";a:0:{}s:4:"bofa";a:0:{}s:3:"bom";a:0:{}s:4:"bond";a:0:{}s:3:"boo";a:0:{}s:4:"book";a:0:{}s:7:"booking";a:0:{}s:5:"boots";a:0:{}s:5:"bosch";a:0:{}s:6:"bostik";a:0:{}s:6:"boston";a:0:{}s:3:"bot";a:0:{}s:8:"boutique";a:0:{}s:3:"box";a:0:{}s:8:"bradesco";a:0:{}s:11:"bridgestone";a:0:{}s:8:"broadway";a:0:{}s:6:"broker";a:0:{}s:7:"brother";a:0:{}s:8:"brussels";a:0:{}s:8:"budapest";a:0:{}s:7:"bugatti";a:0:{}s:5:"build";a:0:{}s:8:"builders";a:0:{}s:8:"business";a:0:{}s:3:"buy";a:0:{}s:4:"buzz";a:0:{}s:3:"bzh";a:0:{}s:3:"cab";a:0:{}s:4:"cafe";a:0:{}s:3:"cal";a:0:{}s:4:"call";a:0:{}s:11:"calvinklein";a:0:{}s:3:"cam";a:0:{}s:6:"camera";a:0:{}s:4:"camp";a:0:{}s:14:"cancerresearch";a:0:{}s:5:"canon";a:0:{}s:8:"capetown";a:0:{}s:7:"capital";a:0:{}s:10:"capitalone";a:0:{}s:3:"car";a:0:{}s:7:"caravan";a:0:{}s:5:"cards";a:0:{}s:4:"care";a:0:{}s:6:"career";a:0:{}s:7:"careers";a:0:{}s:4:"cars";a:0:{}s:7:"cartier";a:0:{}s:4:"casa";a:0:{}s:4:"case";a:0:{}s:6:"caseih";a:0:{}s:4:"cash";a:0:{}s:6:"casino";a:0:{}s:8:"catering";a:0:{}s:8:"catholic";a:0:{}s:3:"cba";a:0:{}s:3:"cbn";a:0:{}s:4:"cbre";a:0:{}s:3:"cbs";a:0:{}s:3:"ceb";a:0:{}s:6:"center";a:0:{}s:3:"ceo";a:0:{}s:4:"cern";a:0:{}s:3:"cfa";a:0:{}s:3:"cfd";a:0:{}s:6:"chanel";a:0:{}s:7:"channel";a:0:{}s:5:"chase";a:0:{}s:4:"chat";a:0:{}s:5:"cheap";a:0:{}s:7:"chintai";a:0:{}s:5:"chloe";a:0:{}s:9:"christmas";a:0:{}s:6:"chrome";a:0:{}s:8:"chrysler";a:0:{}s:6:"church";a:0:{}s:8:"cipriani";a:0:{}s:6:"circle";a:0:{}s:5:"cisco";a:0:{}s:7:"citadel";a:0:{}s:4:"citi";a:0:{}s:5:"citic";a:0:{}s:4:"city";a:0:{}s:8:"cityeats";a:0:{}s:6:"claims";a:0:{}s:8:"cleaning";a:0:{}s:5:"click";a:0:{}s:6:"clinic";a:0:{}s:8:"clinique";a:0:{}s:8:"clothing";a:0:{}s:5:"cloud";a:6:{s:8:"myfusion";a:0:{}s:7:"statics";a:1:{s:1:"*";a:0:{}}s:11:"magentosite";a:1:{s:1:"*";a:0:{}}s:5:"vapor";a:0:{}s:10:"sensiosite";a:1:{s:1:"*";a:0:{}}s:11:"trafficplex";a:0:{}}s:4:"club";a:1:{s:7:"cloudns";a:0:{}}s:7:"clubmed";a:0:{}s:5:"coach";a:0:{}s:5:"codes";a:0:{}s:6:"coffee";a:0:{}s:7:"college";a:0:{}s:7:"cologne";a:0:{}s:7:"comcast";a:0:{}s:8:"commbank";a:0:{}s:9:"community";a:0:{}s:7:"company";a:0:{}s:7:"compare";a:0:{}s:8:"computer";a:0:{}s:6:"comsec";a:0:{}s:6:"condos";a:0:{}s:12:"construction";a:0:{}s:10:"consulting";a:0:{}s:7:"contact";a:0:{}s:11:"contractors";a:0:{}s:7:"cooking";a:0:{}s:14:"cookingchannel";a:0:{}s:4:"cool";a:1:{s:2:"de";a:0:{}}s:7:"corsica";a:0:{}s:7:"country";a:0:{}s:6:"coupon";a:0:{}s:7:"coupons";a:0:{}s:7:"courses";a:0:{}s:6:"credit";a:0:{}s:10:"creditcard";a:0:{}s:11:"creditunion";a:0:{}s:7:"cricket";a:0:{}s:5:"crown";a:0:{}s:3:"crs";a:0:{}s:6:"cruise";a:0:{}s:7:"cruises";a:0:{}s:3:"csc";a:0:{}s:10:"cuisinella";a:0:{}s:5:"cymru";a:0:{}s:4:"cyou";a:0:{}s:5:"dabur";a:0:{}s:3:"dad";a:0:{}s:5:"dance";a:0:{}s:4:"data";a:0:{}s:4:"date";a:0:{}s:6:"dating";a:0:{}s:6:"datsun";a:0:{}s:3:"day";a:0:{}s:4:"dclk";a:0:{}s:3:"dds";a:0:{}s:4:"deal";a:0:{}s:6:"dealer";a:0:{}s:5:"deals";a:0:{}s:6:"degree";a:0:{}s:8:"delivery";a:0:{}s:4:"dell";a:0:{}s:8:"deloitte";a:0:{}s:5:"delta";a:0:{}s:8:"democrat";a:0:{}s:6:"dental";a:0:{}s:7:"dentist";a:0:{}s:4:"desi";a:0:{}s:6:"design";a:0:{}s:3:"dev";a:0:{}s:3:"dhl";a:0:{}s:8:"diamonds";a:0:{}s:4:"diet";a:0:{}s:7:"digital";a:0:{}s:6:"direct";a:0:{}s:9:"directory";a:0:{}s:8:"discount";a:0:{}s:8:"discover";a:0:{}s:4:"dish";a:0:{}s:3:"diy";a:0:{}s:3:"dnp";a:0:{}s:4:"docs";a:0:{}s:6:"doctor";a:0:{}s:5:"dodge";a:0:{}s:3:"dog";a:0:{}s:4:"doha";a:0:{}s:7:"domains";a:0:{}s:3:"dot";a:0:{}s:8:"download";a:0:{}s:5:"drive";a:0:{}s:3:"dtv";a:0:{}s:5:"dubai";a:0:{}s:4:"duck";a:0:{}s:6:"dunlop";a:0:{}s:4:"duns";a:0:{}s:6:"dupont";a:0:{}s:6:"durban";a:0:{}s:4:"dvag";a:0:{}s:3:"dvr";a:0:{}s:5:"earth";a:0:{}s:3:"eat";a:0:{}s:3:"eco";a:0:{}s:5:"edeka";a:0:{}s:9:"education";a:0:{}s:5:"email";a:0:{}s:6:"emerck";a:0:{}s:6:"energy";a:0:{}s:8:"engineer";a:0:{}s:11:"engineering";a:0:{}s:11:"enterprises";a:0:{}s:5:"epost";a:0:{}s:5:"epson";a:0:{}s:9:"equipment";a:0:{}s:8:"ericsson";a:0:{}s:4:"erni";a:0:{}s:3:"esq";a:0:{}s:6:"estate";a:1:{s:7:"compute";a:1:{s:1:"*";a:0:{}}}s:8:"esurance";a:0:{}s:8:"etisalat";a:0:{}s:10:"eurovision";a:0:{}s:3:"eus";a:1:{s:5:"party";a:1:{s:4:"user";a:0:{}}}s:6:"events";a:0:{}s:8:"everbank";a:0:{}s:8:"exchange";a:0:{}s:6:"expert";a:0:{}s:7:"exposed";a:0:{}s:7:"express";a:0:{}s:10:"extraspace";a:0:{}s:4:"fage";a:0:{}s:4:"fail";a:0:{}s:9:"fairwinds";a:0:{}s:5:"faith";a:1:{s:3:"ybo";a:0:{}}s:6:"family";a:0:{}s:3:"fan";a:0:{}s:4:"fans";a:0:{}s:4:"farm";a:1:{s:5:"storj";a:0:{}}s:7:"farmers";a:0:{}s:7:"fashion";a:0:{}s:4:"fast";a:0:{}s:5:"fedex";a:0:{}s:8:"feedback";a:0:{}s:7:"ferrari";a:0:{}s:7:"ferrero";a:0:{}s:4:"fiat";a:0:{}s:8:"fidelity";a:0:{}s:4:"fido";a:0:{}s:4:"film";a:0:{}s:5:"final";a:0:{}s:7:"finance";a:0:{}s:9:"financial";a:0:{}s:4:"fire";a:0:{}s:9:"firestone";a:0:{}s:8:"firmdale";a:0:{}s:4:"fish";a:0:{}s:7:"fishing";a:0:{}s:3:"fit";a:1:{s:6:"ptplus";a:0:{}}s:7:"fitness";a:0:{}s:6:"flickr";a:0:{}s:7:"flights";a:0:{}s:4:"flir";a:0:{}s:7:"florist";a:0:{}s:7:"flowers";a:0:{}s:3:"fly";a:0:{}s:3:"foo";a:0:{}s:4:"food";a:0:{}s:11:"foodnetwork";a:0:{}s:8:"football";a:0:{}s:4:"ford";a:0:{}s:5:"forex";a:0:{}s:7:"forsale";a:0:{}s:5:"forum";a:0:{}s:10:"foundation";a:0:{}s:3:"fox";a:0:{}s:4:"free";a:0:{}s:9:"fresenius";a:0:{}s:3:"frl";a:0:{}s:7:"frogans";a:0:{}s:9:"frontdoor";a:0:{}s:8:"frontier";a:0:{}s:3:"ftr";a:0:{}s:7:"fujitsu";a:0:{}s:9:"fujixerox";a:0:{}s:3:"fun";a:0:{}s:4:"fund";a:0:{}s:9:"furniture";a:0:{}s:6:"futbol";a:0:{}s:3:"fyi";a:0:{}s:3:"gal";a:0:{}s:7:"gallery";a:0:{}s:5:"gallo";a:0:{}s:6:"gallup";a:0:{}s:4:"game";a:0:{}s:5:"games";a:0:{}s:3:"gap";a:0:{}s:6:"garden";a:0:{}s:4:"gbiz";a:0:{}s:3:"gdn";a:0:{}s:3:"gea";a:0:{}s:4:"gent";a:0:{}s:7:"genting";a:0:{}s:6:"george";a:0:{}s:4:"ggee";a:0:{}s:4:"gift";a:0:{}s:5:"gifts";a:0:{}s:5:"gives";a:0:{}s:6:"giving";a:0:{}s:5:"glade";a:0:{}s:5:"glass";a:0:{}s:3:"gle";a:0:{}s:6:"global";a:0:{}s:5:"globo";a:0:{}s:5:"gmail";a:0:{}s:4:"gmbh";a:0:{}s:3:"gmo";a:0:{}s:3:"gmx";a:0:{}s:7:"godaddy";a:0:{}s:4:"gold";a:0:{}s:9:"goldpoint";a:0:{}s:4:"golf";a:0:{}s:3:"goo";a:0:{}s:9:"goodhands";a:0:{}s:8:"goodyear";a:0:{}s:4:"goog";a:1:{s:5:"cloud";a:0:{}}s:6:"google";a:0:{}s:3:"gop";a:0:{}s:3:"got";a:0:{}s:8:"grainger";a:0:{}s:8:"graphics";a:0:{}s:6:"gratis";a:0:{}s:5:"green";a:0:{}s:5:"gripe";a:0:{}s:7:"grocery";a:0:{}s:5:"group";a:0:{}s:8:"guardian";a:0:{}s:5:"gucci";a:0:{}s:4:"guge";a:0:{}s:5:"guide";a:0:{}s:7:"guitars";a:0:{}s:4:"guru";a:0:{}s:4:"hair";a:0:{}s:7:"hamburg";a:0:{}s:7:"hangout";a:0:{}s:4:"haus";a:0:{}s:3:"hbo";a:0:{}s:4:"hdfc";a:0:{}s:8:"hdfcbank";a:0:{}s:6:"health";a:0:{}s:10:"healthcare";a:0:{}s:4:"help";a:0:{}s:8:"helsinki";a:0:{}s:4:"here";a:0:{}s:6:"hermes";a:0:{}s:4:"hgtv";a:0:{}s:6:"hiphop";a:0:{}s:9:"hisamitsu";a:0:{}s:7:"hitachi";a:0:{}s:3:"hiv";a:0:{}s:3:"hkt";a:0:{}s:6:"hockey";a:0:{}s:8:"holdings";a:0:{}s:7:"holiday";a:0:{}s:9:"homedepot";a:0:{}s:9:"homegoods";a:0:{}s:5:"homes";a:0:{}s:9:"homesense";a:0:{}s:5:"honda";a:0:{}s:9:"honeywell";a:0:{}s:5:"horse";a:0:{}s:8:"hospital";a:0:{}s:4:"host";a:2:{s:11:"cloudaccess";a:0:{}s:8:"freesite";a:0:{}}s:7:"hosting";a:1:{s:9:"opencraft";a:0:{}}s:3:"hot";a:0:{}s:7:"hoteles";a:0:{}s:6:"hotels";a:0:{}s:7:"hotmail";a:0:{}s:5:"house";a:0:{}s:3:"how";a:0:{}s:4:"hsbc";a:0:{}s:3:"htc";a:0:{}s:6:"hughes";a:0:{}s:5:"hyatt";a:0:{}s:7:"hyundai";a:0:{}s:3:"ibm";a:0:{}s:4:"icbc";a:0:{}s:3:"ice";a:0:{}s:3:"icu";a:0:{}s:4:"ieee";a:0:{}s:3:"ifm";a:0:{}s:5:"ikano";a:0:{}s:6:"imamat";a:0:{}s:4:"imdb";a:0:{}s:4:"immo";a:0:{}s:10:"immobilien";a:0:{}s:10:"industries";a:0:{}s:8:"infiniti";a:0:{}s:3:"ing";a:0:{}s:3:"ink";a:0:{}s:9:"institute";a:0:{}s:9:"insurance";a:0:{}s:6:"insure";a:0:{}s:5:"intel";a:0:{}s:13:"international";a:0:{}s:6:"intuit";a:0:{}s:11:"investments";a:0:{}s:8:"ipiranga";a:0:{}s:5:"irish";a:0:{}s:7:"iselect";a:0:{}s:7:"ismaili";a:0:{}s:3:"ist";a:0:{}s:8:"istanbul";a:0:{}s:4:"itau";a:0:{}s:3:"itv";a:0:{}s:5:"iveco";a:0:{}s:3:"iwc";a:0:{}s:6:"jaguar";a:0:{}s:4:"java";a:0:{}s:3:"jcb";a:0:{}s:3:"jcp";a:0:{}s:4:"jeep";a:0:{}s:5:"jetzt";a:0:{}s:7:"jewelry";a:0:{}s:3:"jio";a:0:{}s:3:"jlc";a:0:{}s:3:"jll";a:0:{}s:3:"jmp";a:0:{}s:3:"jnj";a:0:{}s:6:"joburg";a:0:{}s:3:"jot";a:0:{}s:3:"joy";a:0:{}s:8:"jpmorgan";a:0:{}s:4:"jprs";a:0:{}s:6:"juegos";a:0:{}s:7:"juniper";a:0:{}s:6:"kaufen";a:0:{}s:4:"kddi";a:0:{}s:11:"kerryhotels";a:0:{}s:14:"kerrylogistics";a:0:{}s:15:"kerryproperties";a:0:{}s:3:"kfh";a:0:{}s:3:"kia";a:0:{}s:3:"kim";a:0:{}s:6:"kinder";a:0:{}s:6:"kindle";a:0:{}s:7:"kitchen";a:0:{}s:4:"kiwi";a:0:{}s:5:"koeln";a:0:{}s:7:"komatsu";a:0:{}s:6:"kosher";a:0:{}s:4:"kpmg";a:0:{}s:3:"kpn";a:0:{}s:3:"krd";a:2:{s:2:"co";a:0:{}s:3:"edu";a:0:{}}s:4:"kred";a:0:{}s:9:"kuokgroup";a:0:{}s:5:"kyoto";a:0:{}s:7:"lacaixa";a:0:{}s:9:"ladbrokes";a:0:{}s:11:"lamborghini";a:0:{}s:5:"lamer";a:0:{}s:9:"lancaster";a:0:{}s:6:"lancia";a:0:{}s:7:"lancome";a:0:{}s:4:"land";a:1:{s:6:"static";a:2:{s:3:"dev";a:0:{}s:5:"sites";a:0:{}}}s:9:"landrover";a:0:{}s:7:"lanxess";a:0:{}s:7:"lasalle";a:0:{}s:3:"lat";a:0:{}s:6:"latino";a:0:{}s:7:"latrobe";a:0:{}s:3:"law";a:0:{}s:6:"lawyer";a:0:{}s:3:"lds";a:0:{}s:5:"lease";a:0:{}s:7:"leclerc";a:0:{}s:6:"lefrak";a:0:{}s:5:"legal";a:0:{}s:4:"lego";a:0:{}s:5:"lexus";a:0:{}s:4:"lgbt";a:0:{}s:7:"liaison";a:0:{}s:4:"lidl";a:0:{}s:4:"life";a:0:{}s:13:"lifeinsurance";a:0:{}s:9:"lifestyle";a:0:{}s:8:"lighting";a:0:{}s:4:"like";a:0:{}s:5:"lilly";a:0:{}s:7:"limited";a:0:{}s:4:"limo";a:0:{}s:7:"lincoln";a:0:{}s:5:"linde";a:0:{}s:4:"link";a:2:{s:4:"cyon";a:0:{}s:5:"mypep";a:0:{}}s:5:"lipsy";a:0:{}s:4:"live";a:0:{}s:6:"living";a:0:{}s:5:"lixil";a:0:{}s:4:"loan";a:0:{}s:5:"loans";a:0:{}s:6:"locker";a:0:{}s:5:"locus";a:0:{}s:4:"loft";a:0:{}s:3:"lol";a:0:{}s:6:"london";a:0:{}s:5:"lotte";a:0:{}s:5:"lotto";a:0:{}s:4:"love";a:0:{}s:3:"lpl";a:0:{}s:12:"lplfinancial";a:0:{}s:3:"ltd";a:0:{}s:4:"ltda";a:0:{}s:8:"lundbeck";a:0:{}s:5:"lupin";a:0:{}s:4:"luxe";a:0:{}s:6:"luxury";a:0:{}s:5:"macys";a:0:{}s:6:"madrid";a:0:{}s:4:"maif";a:0:{}s:6:"maison";a:0:{}s:6:"makeup";a:0:{}s:3:"man";a:0:{}s:10:"management";a:1:{s:6:"router";a:0:{}}s:5:"mango";a:0:{}s:3:"map";a:0:{}s:6:"market";a:0:{}s:9:"marketing";a:0:{}s:7:"markets";a:0:{}s:8:"marriott";a:0:{}s:9:"marshalls";a:0:{}s:8:"maserati";a:0:{}s:6:"mattel";a:0:{}s:3:"mba";a:0:{}s:3:"mcd";a:0:{}s:9:"mcdonalds";a:0:{}s:8:"mckinsey";a:0:{}s:3:"med";a:0:{}s:5:"media";a:0:{}s:4:"meet";a:0:{}s:9:"melbourne";a:0:{}s:4:"meme";a:0:{}s:8:"memorial";a:0:{}s:3:"men";a:0:{}s:4:"menu";a:0:{}s:3:"meo";a:0:{}s:8:"merckmsd";a:0:{}s:7:"metlife";a:0:{}s:5:"miami";a:0:{}s:9:"microsoft";a:0:{}s:4:"mini";a:0:{}s:4:"mint";a:0:{}s:3:"mit";a:0:{}s:10:"mitsubishi";a:0:{}s:3:"mlb";a:0:{}s:3:"mls";a:0:{}s:3:"mma";a:0:{}s:6:"mobile";a:0:{}s:6:"mobily";a:0:{}s:4:"moda";a:0:{}s:3:"moe";a:0:{}s:3:"moi";a:0:{}s:3:"mom";a:0:{}s:6:"monash";a:0:{}s:5:"money";a:0:{}s:7:"monster";a:0:{}s:9:"montblanc";a:0:{}s:5:"mopar";a:0:{}s:6:"mormon";a:0:{}s:8:"mortgage";a:0:{}s:6:"moscow";a:0:{}s:4:"moto";a:0:{}s:11:"motorcycles";a:0:{}s:3:"mov";a:0:{}s:5:"movie";a:0:{}s:8:"movistar";a:0:{}s:3:"msd";a:0:{}s:3:"mtn";a:0:{}s:4:"mtpc";a:0:{}s:3:"mtr";a:0:{}s:6:"mutual";a:0:{}s:3:"nab";a:0:{}s:5:"nadex";a:0:{}s:6:"nagoya";a:0:{}s:10:"nationwide";a:0:{}s:6:"natura";a:0:{}s:4:"navy";a:0:{}s:3:"nba";a:0:{}s:3:"nec";a:0:{}s:7:"netbank";a:0:{}s:7:"netflix";a:0:{}s:7:"network";a:1:{s:5:"alces";a:1:{s:1:"*";a:0:{}}}s:7:"neustar";a:0:{}s:3:"new";a:0:{}s:10:"newholland";a:0:{}s:4:"news";a:0:{}s:4:"next";a:0:{}s:10:"nextdirect";a:0:{}s:5:"nexus";a:0:{}s:3:"nfl";a:0:{}s:3:"ngo";a:0:{}s:3:"nhk";a:0:{}s:4:"nico";a:0:{}s:4:"nike";a:0:{}s:5:"nikon";a:0:{}s:5:"ninja";a:0:{}s:6:"nissan";a:0:{}s:6:"nissay";a:0:{}s:5:"nokia";a:0:{}s:18:"northwesternmutual";a:0:{}s:6:"norton";a:0:{}s:3:"now";a:0:{}s:6:"nowruz";a:0:{}s:5:"nowtv";a:0:{}s:3:"nra";a:0:{}s:3:"nrw";a:0:{}s:3:"ntt";a:0:{}s:3:"nyc";a:0:{}s:3:"obi";a:0:{}s:8:"observer";a:0:{}s:3:"off";a:0:{}s:6:"office";a:0:{}s:7:"okinawa";a:0:{}s:6:"olayan";a:0:{}s:11:"olayangroup";a:0:{}s:7:"oldnavy";a:0:{}s:4:"ollo";a:0:{}s:5:"omega";a:0:{}s:3:"one";a:1:{s:8:"homelink";a:0:{}}s:3:"ong";a:0:{}s:3:"onl";a:0:{}s:6:"online";a:1:{s:5:"barsy";a:0:{}}s:10:"onyourside";a:0:{}s:3:"ooo";a:0:{}s:4:"open";a:0:{}s:6:"oracle";a:0:{}s:6:"orange";a:0:{}s:7:"organic";a:0:{}s:7:"origins";a:0:{}s:5:"osaka";a:0:{}s:6:"otsuka";a:0:{}s:3:"ott";a:0:{}s:3:"ovh";a:1:{s:7:"nerdpol";a:0:{}}s:4:"page";a:0:{}s:12:"pamperedchef";a:0:{}s:9:"panasonic";a:0:{}s:7:"panerai";a:0:{}s:5:"paris";a:0:{}s:4:"pars";a:0:{}s:8:"partners";a:0:{}s:5:"parts";a:0:{}s:5:"party";a:1:{s:3:"ybo";a:0:{}}s:9:"passagens";a:0:{}s:3:"pay";a:0:{}s:4:"pccw";a:0:{}s:3:"pet";a:0:{}s:6:"pfizer";a:0:{}s:8:"pharmacy";a:0:{}s:3:"phd";a:0:{}s:7:"philips";a:0:{}s:5:"phone";a:0:{}s:5:"photo";a:0:{}s:11:"photography";a:0:{}s:6:"photos";a:0:{}s:6:"physio";a:0:{}s:6:"piaget";a:0:{}s:4:"pics";a:0:{}s:6:"pictet";a:0:{}s:8:"pictures";a:1:{i:1337;a:0:{}}s:3:"pid";a:0:{}s:3:"pin";a:0:{}s:4:"ping";a:0:{}s:4:"pink";a:0:{}s:7:"pioneer";a:0:{}s:5:"pizza";a:0:{}s:5:"place";a:0:{}s:4:"play";a:0:{}s:11:"playstation";a:0:{}s:8:"plumbing";a:0:{}s:4:"plus";a:0:{}s:3:"pnc";a:0:{}s:4:"pohl";a:0:{}s:5:"poker";a:0:{}s:7:"politie";a:0:{}s:4:"porn";a:0:{}s:9:"pramerica";a:0:{}s:5:"praxi";a:0:{}s:5:"press";a:0:{}s:5:"prime";a:0:{}s:4:"prod";a:0:{}s:11:"productions";a:0:{}s:4:"prof";a:0:{}s:11:"progressive";a:0:{}s:5:"promo";a:0:{}s:10:"properties";a:0:{}s:8:"property";a:0:{}s:10:"protection";a:0:{}s:3:"pru";a:0:{}s:10:"prudential";a:0:{}s:3:"pub";a:0:{}s:3:"pwc";a:0:{}s:4:"qpon";a:0:{}s:6:"quebec";a:0:{}s:5:"quest";a:0:{}s:3:"qvc";a:0:{}s:6:"racing";a:0:{}s:5:"radio";a:0:{}s:4:"raid";a:0:{}s:4:"read";a:0:{}s:10:"realestate";a:0:{}s:7:"realtor";a:0:{}s:6:"realty";a:0:{}s:7:"recipes";a:0:{}s:3:"red";a:0:{}s:8:"redstone";a:0:{}s:11:"redumbrella";a:0:{}s:5:"rehab";a:0:{}s:5:"reise";a:0:{}s:6:"reisen";a:0:{}s:4:"reit";a:0:{}s:8:"reliance";a:0:{}s:3:"ren";a:0:{}s:4:"rent";a:0:{}s:7:"rentals";a:0:{}s:6:"repair";a:0:{}s:6:"report";a:0:{}s:10:"republican";a:0:{}s:4:"rest";a:0:{}s:10:"restaurant";a:0:{}s:6:"review";a:1:{s:3:"ybo";a:0:{}}s:7:"reviews";a:0:{}s:7:"rexroth";a:0:{}s:4:"rich";a:0:{}s:9:"richardli";a:0:{}s:5:"ricoh";a:0:{}s:11:"rightathome";a:0:{}s:3:"ril";a:0:{}s:3:"rio";a:0:{}s:3:"rip";a:1:{s:4:"clan";a:0:{}}s:4:"rmit";a:0:{}s:6:"rocher";a:0:{}s:5:"rocks";a:3:{s:6:"myddns";a:0:{}s:9:"lima-city";a:0:{}s:8:"webspace";a:0:{}}s:5:"rodeo";a:0:{}s:6:"rogers";a:0:{}s:4:"room";a:0:{}s:4:"rsvp";a:0:{}s:5:"rugby";a:0:{}s:4:"ruhr";a:0:{}s:3:"run";a:0:{}s:3:"rwe";a:0:{}s:6:"ryukyu";a:0:{}s:8:"saarland";a:0:{}s:4:"safe";a:0:{}s:6:"safety";a:0:{}s:6:"sakura";a:0:{}s:4:"sale";a:0:{}s:5:"salon";a:0:{}s:8:"samsclub";a:0:{}s:7:"samsung";a:0:{}s:7:"sandvik";a:0:{}s:15:"sandvikcoromant";a:0:{}s:6:"sanofi";a:0:{}s:3:"sap";a:0:{}s:4:"sapo";a:0:{}s:4:"sarl";a:0:{}s:3:"sas";a:0:{}s:4:"save";a:0:{}s:4:"saxo";a:0:{}s:3:"sbi";a:0:{}s:3:"sbs";a:0:{}s:3:"sca";a:0:{}s:3:"scb";a:0:{}s:10:"schaeffler";a:0:{}s:7:"schmidt";a:0:{}s:12:"scholarships";a:0:{}s:6:"school";a:0:{}s:6:"schule";a:0:{}s:7:"schwarz";a:0:{}s:7:"science";a:1:{s:3:"ybo";a:0:{}}s:9:"scjohnson";a:0:{}s:4:"scor";a:0:{}s:4:"scot";a:0:{}s:6:"search";a:0:{}s:4:"seat";a:0:{}s:6:"secure";a:0:{}s:8:"security";a:0:{}s:4:"seek";a:0:{}s:6:"select";a:0:{}s:5:"sener";a:0:{}s:8:"services";a:0:{}s:3:"ses";a:0:{}s:5:"seven";a:0:{}s:3:"sew";a:0:{}s:3:"sex";a:0:{}s:4:"sexy";a:0:{}s:3:"sfr";a:0:{}s:9:"shangrila";a:0:{}s:5:"sharp";a:0:{}s:4:"shaw";a:0:{}s:5:"shell";a:0:{}s:4:"shia";a:0:{}s:7:"shiksha";a:0:{}s:5:"shoes";a:0:{}s:4:"shop";a:0:{}s:8:"shopping";a:0:{}s:6:"shouji";a:0:{}s:4:"show";a:0:{}s:8:"showtime";a:0:{}s:7:"shriram";a:0:{}s:4:"silk";a:0:{}s:4:"sina";a:0:{}s:7:"singles";a:0:{}s:4:"site";a:3:{s:4:"cyon";a:0:{}s:10:"platformsh";a:1:{s:1:"*";a:0:{}}s:4:"byen";a:0:{}}s:3:"ski";a:0:{}s:4:"skin";a:0:{}s:3:"sky";a:0:{}s:5:"skype";a:0:{}s:5:"sling";a:0:{}s:5:"smart";a:0:{}s:5:"smile";a:0:{}s:4:"sncf";a:0:{}s:6:"soccer";a:0:{}s:6:"social";a:0:{}s:8:"softbank";a:0:{}s:8:"software";a:0:{}s:4:"sohu";a:0:{}s:5:"solar";a:0:{}s:9:"solutions";a:0:{}s:4:"song";a:0:{}s:4:"sony";a:0:{}s:3:"soy";a:0:{}s:5:"space";a:3:{s:10:"stackspace";a:0:{}s:4:"uber";a:0:{}s:6:"xs4all";a:0:{}}s:7:"spiegel";a:0:{}s:4:"spot";a:0:{}s:13:"spreadbetting";a:0:{}s:3:"srl";a:0:{}s:3:"srt";a:0:{}s:5:"stada";a:0:{}s:7:"staples";a:0:{}s:4:"star";a:0:{}s:7:"starhub";a:0:{}s:9:"statebank";a:0:{}s:9:"statefarm";a:0:{}s:7:"statoil";a:0:{}s:3:"stc";a:0:{}s:8:"stcgroup";a:0:{}s:9:"stockholm";a:0:{}s:7:"storage";a:0:{}s:5:"store";a:0:{}s:6:"stream";a:0:{}s:6:"studio";a:0:{}s:5:"study";a:0:{}s:5:"style";a:0:{}s:5:"sucks";a:0:{}s:8:"supplies";a:0:{}s:6:"supply";a:0:{}s:7:"support";a:1:{s:5:"barsy";a:0:{}}s:4:"surf";a:0:{}s:7:"surgery";a:0:{}s:6:"suzuki";a:0:{}s:6:"swatch";a:0:{}s:10:"swiftcover";a:0:{}s:5:"swiss";a:0:{}s:6:"sydney";a:0:{}s:8:"symantec";a:0:{}s:7:"systems";a:1:{s:11:"knightpoint";a:0:{}}s:3:"tab";a:0:{}s:6:"taipei";a:0:{}s:4:"talk";a:0:{}s:6:"taobao";a:0:{}s:6:"target";a:0:{}s:10:"tatamotors";a:0:{}s:5:"tatar";a:0:{}s:6:"tattoo";a:0:{}s:3:"tax";a:0:{}s:4:"taxi";a:0:{}s:3:"tci";a:0:{}s:3:"tdk";a:0:{}s:4:"team";a:0:{}s:4:"tech";a:0:{}s:10:"technology";a:0:{}s:8:"telecity";a:0:{}s:10:"telefonica";a:0:{}s:7:"temasek";a:0:{}s:6:"tennis";a:0:{}s:4:"teva";a:0:{}s:3:"thd";a:0:{}s:7:"theater";a:0:{}s:7:"theatre";a:0:{}s:4:"tiaa";a:0:{}s:7:"tickets";a:0:{}s:6:"tienda";a:0:{}s:7:"tiffany";a:0:{}s:4:"tips";a:0:{}s:5:"tires";a:0:{}s:5:"tirol";a:0:{}s:6:"tjmaxx";a:0:{}s:3:"tjx";a:0:{}s:6:"tkmaxx";a:0:{}s:5:"tmall";a:0:{}s:5:"today";a:0:{}s:5:"tokyo";a:0:{}s:5:"tools";a:0:{}s:3:"top";a:0:{}s:5:"toray";a:0:{}s:7:"toshiba";a:0:{}s:5:"total";a:0:{}s:5:"tours";a:0:{}s:4:"town";a:0:{}s:6:"toyota";a:0:{}s:4:"toys";a:0:{}s:5:"trade";a:1:{s:3:"ybo";a:0:{}}s:7:"trading";a:0:{}s:8:"training";a:0:{}s:13:"travelchannel";a:0:{}s:9:"travelers";a:0:{}s:18:"travelersinsurance";a:0:{}s:5:"trust";a:0:{}s:3:"trv";a:0:{}s:4:"tube";a:0:{}s:3:"tui";a:0:{}s:5:"tunes";a:0:{}s:5:"tushu";a:0:{}s:3:"tvs";a:0:{}s:5:"ubank";a:0:{}s:3:"ubs";a:0:{}s:8:"uconnect";a:0:{}s:6:"unicom";a:0:{}s:10:"university";a:0:{}s:3:"uno";a:0:{}s:3:"uol";a:0:{}s:3:"ups";a:0:{}s:9:"vacations";a:0:{}s:4:"vana";a:0:{}s:8:"vanguard";a:0:{}s:5:"vegas";a:0:{}s:8:"ventures";a:0:{}s:8:"verisign";a:0:{}s:12:"versicherung";a:0:{}s:3:"vet";a:0:{}s:6:"viajes";a:0:{}s:5:"video";a:0:{}s:3:"vig";a:0:{}s:6:"viking";a:0:{}s:6:"villas";a:0:{}s:3:"vin";a:0:{}s:3:"vip";a:0:{}s:6:"virgin";a:0:{}s:4:"visa";a:0:{}s:6:"vision";a:0:{}s:5:"vista";a:0:{}s:10:"vistaprint";a:0:{}s:4:"viva";a:0:{}s:4:"vivo";a:0:{}s:10:"vlaanderen";a:0:{}s:5:"vodka";a:0:{}s:10:"volkswagen";a:0:{}s:5:"volvo";a:0:{}s:4:"vote";a:0:{}s:6:"voting";a:0:{}s:4:"voto";a:0:{}s:6:"voyage";a:0:{}s:6:"vuelos";a:0:{}s:5:"wales";a:0:{}s:7:"walmart";a:0:{}s:6:"walter";a:0:{}s:4:"wang";a:0:{}s:7:"wanggou";a:0:{}s:6:"warman";a:0:{}s:5:"watch";a:0:{}s:7:"watches";a:0:{}s:7:"weather";a:0:{}s:14:"weatherchannel";a:0:{}s:6:"webcam";a:0:{}s:5:"weber";a:0:{}s:7:"website";a:0:{}s:3:"wed";a:0:{}s:7:"wedding";a:0:{}s:5:"weibo";a:0:{}s:4:"weir";a:0:{}s:7:"whoswho";a:0:{}s:4:"wien";a:0:{}s:4:"wiki";a:0:{}s:11:"williamhill";a:0:{}s:3:"win";a:0:{}s:7:"windows";a:0:{}s:4:"wine";a:0:{}s:7:"winners";a:0:{}s:3:"wme";a:0:{}s:13:"wolterskluwer";a:0:{}s:8:"woodside";a:0:{}s:4:"work";a:0:{}s:5:"works";a:0:{}s:5:"world";a:0:{}s:3:"wow";a:0:{}s:3:"wtc";a:0:{}s:3:"wtf";a:0:{}s:4:"xbox";a:0:{}s:5:"xerox";a:0:{}s:7:"xfinity";a:0:{}s:6:"xihuan";a:0:{}s:3:"xin";a:0:{}s:11:"xn--11b4c3d";a:0:{}s:11:"xn--1ck2e1b";a:0:{}s:11:"xn--1qqw23a";a:0:{}s:10:"xn--30rr7y";a:0:{}s:11:"xn--3bst00m";a:0:{}s:11:"xn--3ds443g";a:0:{}s:17:"xn--3oq18vl8pn36a";a:0:{}s:10:"xn--3pxu8k";a:0:{}s:11:"xn--42c2d9a";a:0:{}s:10:"xn--45q11c";a:0:{}s:10:"xn--4gbrim";a:0:{}s:11:"xn--55qw42g";a:0:{}s:10:"xn--55qx5d";a:0:{}s:17:"xn--5su34j936bgsg";a:0:{}s:10:"xn--5tzm5g";a:0:{}s:11:"xn--6frz82g";a:0:{}s:14:"xn--6qq986b3xl";a:0:{}s:12:"xn--80adxhks";a:0:{}s:14:"xn--80aqecdr1a";a:0:{}s:12:"xn--80asehdb";a:0:{}s:10:"xn--80aswg";a:0:{}s:12:"xn--8y0a063a";a:0:{}s:10:"xn--9dbq2a";a:0:{}s:10:"xn--9et52u";a:0:{}s:11:"xn--9krt00a";a:0:{}s:14:"xn--b4w605ferd";a:0:{}s:17:"xn--bck1b9a5dre4c";a:0:{}s:9:"xn--c1avg";a:0:{}s:10:"xn--c2br7g";a:0:{}s:11:"xn--cck2b3b";a:0:{}s:10:"xn--cg4bki";a:0:{}s:11:"xn--czr694b";a:0:{}s:10:"xn--czrs0t";a:0:{}s:10:"xn--czru2d";a:0:{}s:11:"xn--d1acj3b";a:0:{}s:13:"xn--eckvdtc9d";a:0:{}s:11:"xn--efvy88h";a:0:{}s:11:"xn--estv75g";a:0:{}s:11:"xn--fct429k";a:0:{}s:9:"xn--fhbei";a:0:{}s:14:"xn--fiq228c5hs";a:0:{}s:10:"xn--fiq64b";a:0:{}s:11:"xn--fjq720a";a:0:{}s:11:"xn--flw351e";a:0:{}s:16:"xn--fzys8d69uvgm";a:0:{}s:11:"xn--g2xx48c";a:0:{}s:12:"xn--gckr3f0f";a:0:{}s:11:"xn--gk3at1e";a:0:{}s:11:"xn--hxt814e";a:0:{}s:15:"xn--i1b6b1a6a2e";a:0:{}s:11:"xn--imr513n";a:0:{}s:10:"xn--io0a7i";a:0:{}s:9:"xn--j1aef";a:0:{}s:14:"xn--jlq61u9w7b";a:0:{}s:11:"xn--jvr189m";a:0:{}s:15:"xn--kcrx77d1x4a";a:0:{}s:11:"xn--kpu716f";a:0:{}s:10:"xn--kput3i";a:0:{}s:14:"xn--mgba3a3ejt";a:0:{}s:16:"xn--mgba7c0bbn0a";a:0:{}s:15:"xn--mgbaakc7dvf";a:0:{}s:12:"xn--mgbab2bd";a:0:{}s:14:"xn--mgbb9fbpob";a:0:{}s:14:"xn--mgbca7dzdo";a:0:{}s:14:"xn--mgbi4ecexp";a:0:{}s:12:"xn--mgbt3dhd";a:0:{}s:12:"xn--mk1bu44c";a:0:{}s:10:"xn--mxtq1m";a:0:{}s:12:"xn--ngbc5azd";a:0:{}s:12:"xn--ngbe9e0a";a:0:{}s:9:"xn--ngbrx";a:0:{}s:9:"xn--nqv7f";a:0:{}s:15:"xn--nqv7fs00ema";a:0:{}s:11:"xn--nyqy26a";a:0:{}s:9:"xn--p1acf";a:0:{}s:11:"xn--pbt977c";a:0:{}s:10:"xn--pssy2u";a:0:{}s:11:"xn--q9jyb4c";a:0:{}s:12:"xn--qcka1pmc";a:0:{}s:11:"xn--rhqv96g";a:0:{}s:11:"xn--rovu88b";a:0:{}s:11:"xn--ses554g";a:0:{}s:11:"xn--t60b56a";a:0:{}s:9:"xn--tckwe";a:0:{}s:13:"xn--tiq49xqyj";a:0:{}s:10:"xn--unup4y";a:0:{}s:23:"xn--vermgensberater-ctb";a:0:{}s:24:"xn--vermgensberatung-pwb";a:0:{}s:9:"xn--vhquv";a:0:{}s:11:"xn--vuq861b";a:0:{}s:20:"xn--w4r85el8fhu5dnra";a:0:{}s:11:"xn--w4rs40l";a:0:{}s:11:"xn--xhq521b";a:0:{}s:11:"xn--zfr164b";a:0:{}s:6:"xperia";a:0:{}s:3:"xyz";a:2:{s:8:"blogsite";a:0:{}s:5:"fhapp";a:0:{}}s:6:"yachts";a:0:{}s:5:"yahoo";a:0:{}s:7:"yamaxun";a:0:{}s:6:"yandex";a:0:{}s:9:"yodobashi";a:0:{}s:4:"yoga";a:0:{}s:8:"yokohama";a:0:{}s:3:"you";a:0:{}s:7:"youtube";a:0:{}s:3:"yun";a:0:{}s:6:"zappos";a:0:{}s:4:"zara";a:0:{}s:4:"zero";a:0:{}s:3:"zip";a:0:{}s:5:"zippo";a:0:{}s:4:"zone";a:2:{s:6:"triton";a:1:{s:1:"*";a:0:{}}s:4:"lima";a:0:{}}s:7:"zuerich";a:0:{}} \ No newline at end of file diff --git a/src/Cache/FileCache.php b/src/Cache/FileCache.php new file mode 100644 index 00000000..46cbae74 --- /dev/null +++ b/src/Cache/FileCache.php @@ -0,0 +1,366 @@ +default_ttl = $default_ttl; + if (!file_exists($cache_path) && file_exists(dirname($cache_path))) { + $this->mkdir($cache_path); // ensure that the parent path exists + } + + /*$path = realpath($cache_path); + if ($path === false) { + throw new InvalidArgumentException(sprintf('cache path does not exist: %s', $cache_path)); + }*/ + + if (!is_writable($cache_path . DIRECTORY_SEPARATOR)) { + throw new InvalidArgumentException(sprintf('cache path is not writable: %s', $cache_path)); + } + + $this->cache_path = $cache_path; + } + + /** + * {@inheritdoc} + */ + public function get($key, $default = null) + { + $path = $this->getPath($key); + + $expires_at = @filemtime($path); + + if ($expires_at === false) { + return $default; // file not found + } + + if ($this->getTime() >= $expires_at) { + @unlink($path); // file expired + + return $default; + } + + $data = @file_get_contents($path); + + if ($data === false) { + return $default; // race condition: file not found + } + + if ($data === 'b:0;') { + return false; // because we can't otherwise distinguish a FALSE return-value from unserialize() + } + + $value = @unserialize($data); + + if ($value === false) { + return $default; // unserialize() failed + } + + return $value; + } + + /** + * {@inheritdoc} + */ + public function set($key, $value, $ttl = null) + { + $path = $this->getPath($key); + + $dir = dirname($path); + + if (!file_exists($dir)) { + // ensure that the parent path exists: + $this->mkdir($dir); + } + + $temp_path = $this->cache_path . DIRECTORY_SEPARATOR . uniqid('', true); + + if (is_int($ttl)) { + $expires_at = $this->getTime() + $ttl; + } elseif ($ttl instanceof DateInterval) { + $expires_at = date_create_from_format('U', $this->getTime())->add($ttl)->getTimestamp(); + } elseif ($ttl === null) { + $expires_at = $this->getTime() + $this->default_ttl; + } else { + throw new InvalidArgumentException('invalid TTL: ' . print_r($ttl, true)); + } + + if (false === @file_put_contents($temp_path, serialize($value))) { + return false; + } + + if (false === @chmod($temp_path, $this->file_mode)) { + return false; + } + + if (@touch($temp_path, $expires_at) && @rename($temp_path, $path)) { + return true; + } + + @unlink($temp_path); + + return false; + } + + /** + * {@inheritdoc} + */ + public function delete($key) + { + return @unlink($this->getPath($key)); + } + + /** + * {@inheritdoc} + */ + public function clear() + { + $success = true; + + $paths = $this->listPaths(); + + foreach ($paths as $path) { + if (!unlink($path)) { + $success = false; + } + } + + return $success; + } + + /** + * {@inheritdoc} + */ + public function getMultiple($keys, $default = null) + { + if (!is_array($keys) && !$keys instanceof Traversable) { + throw new InvalidArgumentException('keys must be either of type array or Traversable'); + } + + $values = []; + + foreach ($keys as $key) { + $values[$key] = $this->get($key) ?: $default; + } + + return $values; + } + + /** + * {@inheritdoc} + */ + public function setMultiple($values, $ttl = null) + { + if (!is_array($values) && !$values instanceof Traversable) { + throw new InvalidArgumentException('keys must be either of type array or Traversable'); + } + + $ok = true; + + foreach ($values as $key => $value) { + $this->validateKey($key); + $ok = $this->set($key, $value, $ttl) && $ok; + } + + return $ok; + } + + /** + * {@inheritdoc} + */ + public function deleteMultiple($keys) + { + if (!is_array($keys) && !$keys instanceof Traversable) { + throw new InvalidArgumentException('keys must be either of type array or Traversable'); + } + + foreach ($keys as $key) { + $this->validateKey($key); + $this->delete($key); + } + } + + /** + * {@inheritdoc} + */ + public function has($key) + { + return $this->get($key, $this) !== $this; + } + + /** + * {@inheritdoc} + */ + public function increment($key, $step = 1) + { + $path = $this->getPath($key); + + $dir = dirname($path); + + if (!file_exists($dir)) { + $this->mkdir($dir); // ensure that the parent path exists + } + + $lock_path = $dir . DIRECTORY_SEPARATOR . '.lock'; // allows max. 256 client locks at one time + + $lock_handle = fopen($lock_path, 'w'); + + flock($lock_handle, LOCK_EX); + + $value = $this->get($key, 0) + $step; + + $ok = $this->set($key, $value); + + flock($lock_handle, LOCK_UN); + + return $ok ? $value : false; + } + + /** + * {@inheritdoc} + */ + public function decrement($key, $step = 1) + { + return $this->increment($key, -$step); + } + + /** + * For a given cache key, obtain the absolute file path. + * + * @param string $key + * + * @throws InvalidArgumentException if the specified key contains a character reserved by PSR-16 + * + * @return string absolute path to cache-file + */ + private function getPath($key) + { + $this->validateKey($key); + + $hash = hash('sha256', $key); + + return $this->cache_path + . DIRECTORY_SEPARATOR + . strtoupper($hash[0]) + . DIRECTORY_SEPARATOR + . strtoupper($hash[1]) + . DIRECTORY_SEPARATOR + . substr($hash, 2); + } + + /** + * @return int current timestamp + */ + private function getTime() + { + return time(); + } + + /** + * @return Generator|string[] + */ + private function listPaths() + { + $iterator = new RecursiveDirectoryIterator( + $this->cache_path, + FilesystemIterator::CURRENT_AS_PATHNAME | FilesystemIterator::SKIP_DOTS + ); + + $iterator = new RecursiveIteratorIterator($iterator); + + foreach ($iterator as $path) { + if (is_dir($path)) { + continue; // ignore directories + } + + yield $path; + } + } + + /** + * @param string $key + * + * @throws InvalidArgumentException + */ + private function validateKey($key) + { + if (preg_match(self::PSR16_RESERVED, $key, $match) === 1) { + throw new InvalidArgumentException("invalid character in key: {$match[0]}"); + } + } + + /** + * Recursively create directories and apply permission mask. + * + * @param string $path absolute directory path + */ + private function mkdir($path) + { + $parent_path = dirname($path); + + if (!file_exists($parent_path)) { + $this->mkdir($parent_path); // recursively create parent dirs first + } + + mkdir($path); + chmod($path, $this->dir_mode); + } +} diff --git a/src/Cache/InvalidArgumentException.php b/src/Cache/InvalidArgumentException.php new file mode 100644 index 00000000..29b9478e --- /dev/null +++ b/src/Cache/InvalidArgumentException.php @@ -0,0 +1,19 @@ +rules = $this->filterRules($rules); - } - - /** - * Filter the rules parameter. - * - * @param array|string|null $rules - * - * @throws TypeError if the $rules is not an array, a string or null - * @throws InvalidArgumentException if path does not exist or is not readable - * - * @return array + * @param array $rules */ - private function filterRules($rules): array + public function __construct(array $rules) { - if ($rules === null) { - return include dirname(__DIR__) . '/data/public-suffix-list.php'; - } - - if (is_array($rules)) { - return $rules; - } - - if (!is_string($rules)) { - throw new TypeError(sprintf('Expected rules to be an array, a file path or null; received "%s"', is_object($rules) ? get_class($rules) : gettype($rules))); - } - - if (!is_readable($rules)) { - throw new InvalidArgumentException(sprintf('File path is not readable "%s"', $rules)); - } - - return include $rules; + $this->rules = $rules; } /** diff --git a/src/PublicSuffixListManager.php b/src/PublicSuffixListManager.php index 713fd1c2..7d2975aa 100644 --- a/src/PublicSuffixListManager.php +++ b/src/PublicSuffixListManager.php @@ -11,9 +11,11 @@ namespace Pdp; -use Exception; +use Pdp\Cache\FileCache; use Pdp\Http\HttpAdapter; +use Psr\SimpleCache\CacheInterface; use SplFileObject; +use SplTempFileObject; /** * Public Suffix List Manager. @@ -25,29 +27,15 @@ class PublicSuffixListManager { const PUBLIC_SUFFIX_LIST_URL = 'https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat'; + const PUBLIC_SUFFIX_LIST_DATA = 'RAW'; const ALL_DOMAINS = 'ALL'; - const PDP_PSL_TEXT_FILE = 'public-suffix-list.txt'; - const PDP_PSL_PHP_FILE = 'public-suffix-list.php'; - const ICANN_DOMAINS = 'ICANN'; - const ICANN_PSL_PHP_FILE = 'icann-public-suffix-list.php'; - const PRIVATE_DOMAINS = 'PRIVATE'; - const PRIVATE_PSL_PHP_FILE = 'private-public-suffix-list.php'; - - /** - * @var array Public Suffix List Type - */ - private static $domainList = [ - self::ALL_DOMAINS => self::PDP_PSL_PHP_FILE, - self::ICANN_DOMAINS => self::ICANN_PSL_PHP_FILE, - self::PRIVATE_DOMAINS => self::PRIVATE_PSL_PHP_FILE, - ]; /** * @var string Directory where text and php versions of list will be cached */ - private $cacheDir; + private $cache; /** * @var HttpAdapter Http adapter @@ -57,31 +45,41 @@ class PublicSuffixListManager /** * Public constructor. * - * @param HttpAdapter $httpAdapter - * @param string $cacheDir Optional cache directory + * @param HttpAdapter $httpAdapter + * @param CacheInterface|null $cache */ - public function __construct(HttpAdapter $httpAdapter, string $cacheDir = null) + public function __construct(HttpAdapter $httpAdapter, CacheInterface $cache = null) { - $this->cacheDir = $cacheDir ?? realpath(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'data'); $this->httpAdapter = $httpAdapter; + $this->cache = $cache ?? new FileCache(realpath(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'data')); } /** * Gets Public Suffix List. * - * @param string $list the Public Suffix List type + * @param string $type the Public Suffix List type * * @return PublicSuffixList */ - public function getList($list = self::ALL_DOMAINS): PublicSuffixList + public function getList($type = self::ALL_DOMAINS): PublicSuffixList { - $cacheBasename = isset(self::$domainList[$list]) ? self::$domainList[$list] : self::PDP_PSL_PHP_FILE; - $cacheFile = $this->cacheDir . '/' . $cacheBasename; - if (!file_exists($cacheFile)) { - $this->refreshPublicSuffixList(); + static $psl_type_lists = [self::ALL_DOMAINS => 1, self::ICANN_DOMAINS => 1, self::PRIVATE_DOMAINS => 1]; + + if (!isset($psl_type_lists[$type])) { + $type = self::ALL_DOMAINS; + } + + if ($this->cache->has($type)) { + return new PublicSuffixList($this->cache->get($type)); + } + + if ($this->cache->has(self::PUBLIC_SUFFIX_LIST_DATA)) { + $this->cachePublicSuffixListTypes(); + return new PublicSuffixList($this->cache->get($type)); } - return new PublicSuffixList($cacheFile); + $this->refreshPublicSuffixList(); + return new PublicSuffixList($this->cache->get($type)); } /** @@ -90,35 +88,19 @@ public function getList($list = self::ALL_DOMAINS): PublicSuffixList */ public function refreshPublicSuffixList() { - $publicSuffixList = $this->httpAdapter->getContent(self::PUBLIC_SUFFIX_LIST_URL); - $this->cache(self::PDP_PSL_TEXT_FILE, $publicSuffixList); + $raw = $this->httpAdapter->getContent(self::PUBLIC_SUFFIX_LIST_URL); + $this->cache->set(self::PUBLIC_SUFFIX_LIST_DATA, $raw); - $publicSuffixListArray = $this->convertListToArray(); - foreach ($publicSuffixListArray as $type => $list) { - $content = 'cache(self::$domainList[$type], $content); - } + $this->cachePublicSuffixListTypes(); } /** - * Cache content to disk. - * - * @param string $basename basename in cache dir where data will be written - * @param string $data data to write - * - * @throws Exception if unable to write file - * - * @return int Number of bytes that were written to the file + * Cache the different public suffix list subtypes */ - private function cache(string $basename, string $data): int + private function cachePublicSuffixListTypes() { - $path = $this->cacheDir . '/' . $basename; - $result = @file_put_contents($path, $data); - if ($result !== false) { - return $result; - } - - throw new Exception(sprintf("Cannot write '%s'", $path)); + $publicSuffixListArray = $this->convertListToArray(); + $this->cache->setMultiple($publicSuffixListArray); } /** @@ -140,8 +122,9 @@ private function convertListToArray(): array self::PRIVATE_DOMAINS => [], ]; - $path = $this->cacheDir . '/' . self::PDP_PSL_TEXT_FILE; - $data = new SplFileObject($path); + $raw = $this->cache->get(self::PUBLIC_SUFFIX_LIST_DATA); + $data = new SplTempFileObject(); + $data->fwrite($raw); $data->setFlags(SplFileObject::DROP_NEW_LINE | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY); foreach ($data as $line) { $addDomain = $this->validateDomainAddition($line, $addDomain); diff --git a/tests/CheckPublicSuffixTest.php b/tests/CheckPublicSuffixTest.php index a73a0dbf..b31e66b3 100644 --- a/tests/CheckPublicSuffixTest.php +++ b/tests/CheckPublicSuffixTest.php @@ -2,7 +2,9 @@ namespace Pdp\Tests; +use Pdp\Cache\FileCache; use Pdp\PublicSuffixList; +use Pdp\PublicSuffixListManager; use PHPUnit\Framework\TestCase; /** @@ -21,7 +23,9 @@ class CheckPublicSuffixTest extends TestCase protected function setUp() { - $this->list = new PublicSuffixList(); + $cache = new FileCache(dirname(__DIR__) . '/data'); + $rules = $cache->get(PublicSuffixListManager::ALL_DOMAINS); + $this->list = new PublicSuffixList($rules); } /** diff --git a/tests/PublicSuffixListManagerTest.php b/tests/PublicSuffixListManagerTest.php index 872f3123..02be3cf9 100644 --- a/tests/PublicSuffixListManagerTest.php +++ b/tests/PublicSuffixListManagerTest.php @@ -4,12 +4,10 @@ namespace Pdp\Tests; -use Exception; use org\bovigo\vfs\vfsStream; use org\bovigo\vfs\vfsStreamDirectory; -use Pdp\Http\CurlHttpAdapter; +use Pdp\Cache\FileCache; use Pdp\Http\HttpAdapter; -use Pdp\PublicSuffixList; use Pdp\PublicSuffixListManager; use PHPUnit\Framework\TestCase; @@ -52,17 +50,12 @@ class PublicSuffixListManagerTest extends TestCase protected function setUp() { - parent::setUp(); - $this->dataDir = dirname(__DIR__) . '/data'; - $this->root = vfsStream::setup('pdp'); vfsStream::create(['cache' => []], $this->root); $this->cacheDir = vfsStream::url('pdp/cache'); - $this->httpAdapter = $this->getMock(HttpAdapter::class); - - $this->listManager = new PublicSuffixListManager($this->httpAdapter, $this->cacheDir); + $this->listManager = new PublicSuffixListManager($this->httpAdapter, new FileCache($this->cacheDir)); } protected function tearDown() @@ -71,85 +64,6 @@ protected function tearDown() $this->root = null; $this->httpAdapter = null; $this->listManager = null; - - parent::tearDown(); - } - - public function testRefreshPublicSuffixList() - { - $content = file_get_contents( - $this->dataDir . '/' . PublicSuffixListManager::PDP_PSL_TEXT_FILE - ); - - $this->httpAdapter->expects($this->once()) - ->method('getContent') - ->with(PublicSuffixListManager::PUBLIC_SUFFIX_LIST_URL) - ->will($this->returnValue($content)); - - $this->assertFileNotExists( - $this->cacheDir . '/' . PublicSuffixListManager::PDP_PSL_TEXT_FILE - ); - $this->assertFileNotExists( - $this->cacheDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE - ); - - $this->listManager->refreshPublicSuffixList(); - - $this->assertFileExists( - $this->cacheDir . '/' . PublicSuffixListManager::PDP_PSL_TEXT_FILE - ); - $this->assertFileExists( - $this->cacheDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE - ); - } - - public function testWriteThrowsExceptionIfCanNotWrite() - { - $this->expectException(Exception::class); - $this->expectExceptionMessage("Cannot write '/does/not/exist/public-suffix-list.txt'"); - $manager = new PublicSuffixListManager(new CurlHttpAdapter(), '/does/not/exist'); - $manager->refreshPublicSuffixList(); - } - - public function testGetList() - { - copy( - $this->dataDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE, - $this->cacheDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE - ); - $this->assertFileExists( - $this->cacheDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE - ); - $publicSuffixList = $this->listManager->getList(); - $this->assertInstanceOf(PublicSuffixList::class, $publicSuffixList); - $this->assertGreaterThanOrEqual(300, count($publicSuffixList->getRules())); - $this->assertArrayHasKey('stuff-4-sale', $publicSuffixList->getRules()['org']); - $this->assertArrayHasKey('net', $publicSuffixList->getRules()['ac']); - } - - public function testGetListWithoutCache() - { - $this->assertFileNotExists( - $this->cacheDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE - ); - - /** @var PublicSuffixListManager|\PHPUnit_Framework_MockObject_MockObject $listManager */ - $listManager = $this->getMockBuilder(PublicSuffixListManager::class) - ->setConstructorArgs([$this->httpAdapter, $this->cacheDir]) - ->setMethods(['refreshPublicSuffixList']) - ->getMock(); - - $listManager->expects($this->once()) - ->method('refreshPublicSuffixList') - ->will($this->returnCallback(function () { - copy( - $this->dataDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE, - $this->cacheDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE - ); - })); - - $publicSuffixList = $listManager->getList(); - $this->assertInstanceOf(PublicSuffixList::class, $publicSuffixList); } public function testGetProvidedListFromDefaultCacheDir() @@ -174,4 +88,12 @@ public function testGetDifferentPublicList() $invalidList = $listManager->getList('invalid type'); $this->assertEquals($publicList, $invalidList); } + + public function testRefreshList() + { + $listManager = new PublicSuffixListManager($this->httpAdapter); + $previous = $listManager->getList(); + $listManager->refreshPublicSuffixList(); + $this->assertEquals($previous, $listManager->getList()); + } } diff --git a/tests/PublicSuffixListTest.php b/tests/PublicSuffixListTest.php index 06a325c0..89d1bab2 100644 --- a/tests/PublicSuffixListTest.php +++ b/tests/PublicSuffixListTest.php @@ -12,14 +12,13 @@ */ namespace Pdp\Tests; -use InvalidArgumentException; +use Pdp\Cache\FileCache; use Pdp\MatchedDomain; use Pdp\NullDomain; use Pdp\PublicSuffixList; use Pdp\PublicSuffixListManager; use Pdp\UnmatchedDomain; use PHPUnit\Framework\TestCase; -use TypeError; class PublicSuffixListTest extends TestCase { @@ -28,36 +27,11 @@ class PublicSuffixListTest extends TestCase */ private $list; - private $dataDir; - protected function setUp() { - parent::setUp(); - $this->list = new PublicSuffixList(); - $this->dataDir = dirname(__DIR__) . '/data'; - } - - public function testConstructorThrowsTypeError() - { - $this->expectException(TypeError::class); - new PublicSuffixList(new \stdClass()); - } - - public function testConstructorThrowsInvalidArgumentException() - { - $this->expectException(InvalidArgumentException::class); - new PublicSuffixList('/usr/bin/foo/bar'); - } - - public function testConstructorWithFilePath() - { - $this->assertEquals($this->list, new PublicSuffixList($this->dataDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE)); - } - - public function testConstructorWithArray() - { - $rules = include $this->dataDir . '/' . PublicSuffixListManager::PDP_PSL_PHP_FILE; - $this->assertEquals($this->list, new PublicSuffixList($rules)); + $cache = new FileCache(dirname(__DIR__) . '/data'); + $rules = $cache->get(PublicSuffixListManager::ALL_DOMAINS); + $this->list = new PublicSuffixList($rules); } public function testNullWillReturnNullDomain() From dbc61364876be52abc3971252d4ad4ac9ce50d50 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 6 Oct 2017 12:39:13 +0200 Subject: [PATCH 036/461] Improving cache implementation --- bin/update-psl | 40 +- ...0249e90ffc9895458763fae6885c9ee74fdce5ec90 | 12289 +++++++- data/icann-public-suffix-list.php | 21737 ------------- data/private-public-suffix-list.php | 4212 --- data/public-suffix-list.php | 25436 ---------------- .../{FileCache.php => FileCacheAdapter.php} | 129 +- src/PublicSuffixListManager.php | 98 +- tests/Cache/FileCacheAdapterTest.php | 474 + tests/CheckPublicSuffixTest.php | 4 +- .../CurlHttpAdapterTest.php | 2 +- tests/PublicSuffixListManagerTest.php | 96 +- tests/PublicSuffixListTest.php | 9 +- 12 files changed, 12936 insertions(+), 51590 deletions(-) delete mode 100644 data/icann-public-suffix-list.php delete mode 100644 data/private-public-suffix-list.php delete mode 100644 data/public-suffix-list.php rename src/Cache/{FileCache.php => FileCacheAdapter.php} (72%) create mode 100644 tests/Cache/FileCacheAdapterTest.php rename tests/{HttpAdapter => Http}/CurlHttpAdapterTest.php (95%) diff --git a/bin/update-psl b/bin/update-psl index 2705cbde..247fb2ad 100755 --- a/bin/update-psl +++ b/bin/update-psl @@ -1,23 +1,33 @@ #!/usr/bin/env php refreshPublicSuffixList(); echo 'Update complete.' . PHP_EOL; exit(0); -} catch (\Exception $e) { +} catch (Exception $e) { echo 'An error occurred while updating the Public Suffix List.' . PHP_EOL; echo $e->getMessage() . PHP_EOL; exit(1); diff --git a/data/A/C/0562bba4a57c6841cba10249e90ffc9895458763fae6885c9ee74fdce5ec90 b/data/A/C/0562bba4a57c6841cba10249e90ffc9895458763fae6885c9ee74fdce5ec90 index d466acd5..1062c548 100644 --- a/data/A/C/0562bba4a57c6841cba10249e90ffc9895458763fae6885c9ee74fdce5ec90 +++ b/data/A/C/0562bba4a57c6841cba10249e90ffc9895458763fae6885c9ee74fdce5ec90 @@ -1 +1,12288 @@ -N; \ No newline at end of file +s:200466:"// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +// Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat, +// rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported. + +// Instructions on pulling and using this list can be found at https://publicsuffix.org/list/. + +// ===BEGIN ICANN DOMAINS=== + +// ac : https://en.wikipedia.org/wiki/.ac +ac +com.ac +edu.ac +gov.ac +net.ac +mil.ac +org.ac + +// ad : https://en.wikipedia.org/wiki/.ad +ad +nom.ad + +// ae : https://en.wikipedia.org/wiki/.ae +// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php +ae +co.ae +net.ae +org.ae +sch.ae +ac.ae +gov.ae +mil.ae + +// aero : see https://www.information.aero/index.php?id=66 +aero +accident-investigation.aero +accident-prevention.aero +aerobatic.aero +aeroclub.aero +aerodrome.aero +agents.aero +aircraft.aero +airline.aero +airport.aero +air-surveillance.aero +airtraffic.aero +air-traffic-control.aero +ambulance.aero +amusement.aero +association.aero +author.aero +ballooning.aero +broker.aero +caa.aero +cargo.aero +catering.aero +certification.aero +championship.aero +charter.aero +civilaviation.aero +club.aero +conference.aero +consultant.aero +consulting.aero +control.aero +council.aero +crew.aero +design.aero +dgca.aero +educator.aero +emergency.aero +engine.aero +engineer.aero +entertainment.aero +equipment.aero +exchange.aero +express.aero +federation.aero +flight.aero +freight.aero +fuel.aero +gliding.aero +government.aero +groundhandling.aero +group.aero +hanggliding.aero +homebuilt.aero +insurance.aero +journal.aero +journalist.aero +leasing.aero +logistics.aero +magazine.aero +maintenance.aero +media.aero +microlight.aero +modelling.aero +navigation.aero +parachuting.aero +paragliding.aero +passenger-association.aero +pilot.aero +press.aero +production.aero +recreation.aero +repbody.aero +res.aero +research.aero +rotorcraft.aero +safety.aero +scientist.aero +services.aero +show.aero +skydiving.aero +software.aero +student.aero +trader.aero +trading.aero +trainer.aero +union.aero +workinggroup.aero +works.aero + +// af : http://www.nic.af/help.jsp +af +gov.af +com.af +org.af +net.af +edu.af + +// ag : http://www.nic.ag/prices.htm +ag +com.ag +org.ag +net.ag +co.ag +nom.ag + +// ai : http://nic.com.ai/ +ai +off.ai +com.ai +net.ai +org.ai + +// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31 +al +com.al +edu.al +gov.al +mil.al +net.al +org.al + +// am : https://en.wikipedia.org/wiki/.am +am + +// ao : https://en.wikipedia.org/wiki/.ao +// http://www.dns.ao/REGISTR.DOC +ao +ed.ao +gv.ao +og.ao +co.ao +pb.ao +it.ao + +// aq : https://en.wikipedia.org/wiki/.aq +aq + +// ar : https://nic.ar/nic-argentina/normativa-vigente +ar +com.ar +edu.ar +gob.ar +gov.ar +int.ar +mil.ar +musica.ar +net.ar +org.ar +tur.ar + +// arpa : https://en.wikipedia.org/wiki/.arpa +// Confirmed by registry 2008-06-18 +arpa +e164.arpa +in-addr.arpa +ip6.arpa +iris.arpa +uri.arpa +urn.arpa + +// as : https://en.wikipedia.org/wiki/.as +as +gov.as + +// asia : https://en.wikipedia.org/wiki/.asia +asia + +// at : https://en.wikipedia.org/wiki/.at +// Confirmed by registry 2008-06-17 +at +ac.at +co.at +gv.at +or.at + +// au : https://en.wikipedia.org/wiki/.au +// http://www.auda.org.au/ +au +// 2LDs +com.au +net.au +org.au +edu.au +gov.au +asn.au +id.au +// Historic 2LDs (closed to new registration, but sites still exist) +info.au +conf.au +oz.au +// CGDNs - http://www.cgdn.org.au/ +act.au +nsw.au +nt.au +qld.au +sa.au +tas.au +vic.au +wa.au +// 3LDs +act.edu.au +nsw.edu.au +nt.edu.au +qld.edu.au +sa.edu.au +tas.edu.au +vic.edu.au +wa.edu.au +// act.gov.au Bug 984824 - Removed at request of Greg Tankard +// nsw.gov.au Bug 547985 - Removed at request of +// nt.gov.au Bug 940478 - Removed at request of Greg Connors +qld.gov.au +sa.gov.au +tas.gov.au +vic.gov.au +wa.gov.au + +// aw : https://en.wikipedia.org/wiki/.aw +aw +com.aw + +// ax : https://en.wikipedia.org/wiki/.ax +ax + +// az : https://en.wikipedia.org/wiki/.az +az +com.az +net.az +int.az +gov.az +org.az +edu.az +info.az +pp.az +mil.az +name.az +pro.az +biz.az + +// ba : http://nic.ba/users_data/files/pravilnik_o_registraciji.pdf +ba +com.ba +edu.ba +gov.ba +mil.ba +net.ba +org.ba + +// bb : https://en.wikipedia.org/wiki/.bb +bb +biz.bb +co.bb +com.bb +edu.bb +gov.bb +info.bb +net.bb +org.bb +store.bb +tv.bb + +// bd : https://en.wikipedia.org/wiki/.bd +*.bd + +// be : https://en.wikipedia.org/wiki/.be +// Confirmed by registry 2008-06-08 +be +ac.be + +// bf : https://en.wikipedia.org/wiki/.bf +bf +gov.bf + +// bg : https://en.wikipedia.org/wiki/.bg +// https://www.register.bg/user/static/rules/en/index.html +bg +a.bg +b.bg +c.bg +d.bg +e.bg +f.bg +g.bg +h.bg +i.bg +j.bg +k.bg +l.bg +m.bg +n.bg +o.bg +p.bg +q.bg +r.bg +s.bg +t.bg +u.bg +v.bg +w.bg +x.bg +y.bg +z.bg +0.bg +1.bg +2.bg +3.bg +4.bg +5.bg +6.bg +7.bg +8.bg +9.bg + +// bh : https://en.wikipedia.org/wiki/.bh +bh +com.bh +edu.bh +net.bh +org.bh +gov.bh + +// bi : https://en.wikipedia.org/wiki/.bi +// http://whois.nic.bi/ +bi +co.bi +com.bi +edu.bi +or.bi +org.bi + +// biz : https://en.wikipedia.org/wiki/.biz +biz + +// bj : https://en.wikipedia.org/wiki/.bj +bj +asso.bj +barreau.bj +gouv.bj + +// bm : http://www.bermudanic.bm/dnr-text.txt +bm +com.bm +edu.bm +gov.bm +net.bm +org.bm + +// bn : https://en.wikipedia.org/wiki/.bn +*.bn + +// bo : http://www.nic.bo/ +bo +com.bo +edu.bo +gov.bo +gob.bo +int.bo +org.bo +net.bo +mil.bo +tv.bo + +// br : http://registro.br/dominio/categoria.html +// Submitted by registry +br +abc.br +adm.br +adv.br +agr.br +aju.br +am.br +aparecida.br +arq.br +art.br +ato.br +b.br +belem.br +bio.br +blog.br +bmd.br +bsb.br +cim.br +cng.br +cnt.br +com.br +coop.br +cri.br +cuiaba.br +def.br +ecn.br +eco.br +edu.br +emp.br +eng.br +esp.br +etc.br +eti.br +far.br +flog.br +floripa.br +fortal.br +fm.br +fnd.br +fot.br +fst.br +g12.br +ggf.br +gov.br +// gov.br 26 states + df https://en.wikipedia.org/wiki/States_of_Brazil +ac.gov.br +al.gov.br +am.gov.br +ap.gov.br +ba.gov.br +ce.gov.br +df.gov.br +es.gov.br +go.gov.br +ma.gov.br +mg.gov.br +ms.gov.br +mt.gov.br +pa.gov.br +pb.gov.br +pe.gov.br +pi.gov.br +pr.gov.br +rj.gov.br +rn.gov.br +ro.gov.br +rr.gov.br +rs.gov.br +sc.gov.br +se.gov.br +sp.gov.br +to.gov.br +gru.br +imb.br +ind.br +inf.br +jampa.br +jor.br +jus.br +leg.br +lel.br +londrina.br +macapa.br +maceio.br +mat.br +med.br +mil.br +mp.br +mus.br +natal.br +net.br +niteroi.br +*.nom.br +not.br +ntr.br +odo.br +org.br +osasco.br +palmas.br +poa.br +ppg.br +pro.br +psc.br +psi.br +qsl.br +radio.br +rec.br +recife.br +riobranco.br +sjc.br +slg.br +srv.br +taxi.br +teo.br +tmp.br +trd.br +tur.br +tv.br +udi.br +vet.br +vix.br +vlog.br +wiki.br +zlg.br + +// bs : http://www.nic.bs/rules.html +bs +com.bs +net.bs +org.bs +edu.bs +gov.bs + +// bt : https://en.wikipedia.org/wiki/.bt +bt +com.bt +edu.bt +gov.bt +net.bt +org.bt + +// bv : No registrations at this time. +// Submitted by registry +bv + +// bw : https://en.wikipedia.org/wiki/.bw +// http://www.gobin.info/domainname/bw.doc +// list of other 2nd level tlds ? +bw +co.bw +org.bw + +// by : https://en.wikipedia.org/wiki/.by +// http://tld.by/rules_2006_en.html +// list of other 2nd level tlds ? +by +gov.by +mil.by +// Official information does not indicate that com.by is a reserved +// second-level domain, but it's being used as one (see www.google.com.by and +// www.yahoo.com.by, for example), so we list it here for safety's sake. +com.by + +// http://hoster.by/ +of.by + +// bz : https://en.wikipedia.org/wiki/.bz +// http://www.belizenic.bz/ +bz +com.bz +net.bz +org.bz +edu.bz +gov.bz + +// ca : https://en.wikipedia.org/wiki/.ca +ca +// ca geographical names +ab.ca +bc.ca +mb.ca +nb.ca +nf.ca +nl.ca +ns.ca +nt.ca +nu.ca +on.ca +pe.ca +qc.ca +sk.ca +yk.ca +// gc.ca: https://en.wikipedia.org/wiki/.gc.ca +// see also: http://registry.gc.ca/en/SubdomainFAQ +gc.ca + +// cat : https://en.wikipedia.org/wiki/.cat +cat + +// cc : https://en.wikipedia.org/wiki/.cc +cc + +// cd : https://en.wikipedia.org/wiki/.cd +// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 +cd +gov.cd + +// cf : https://en.wikipedia.org/wiki/.cf +cf + +// cg : https://en.wikipedia.org/wiki/.cg +cg + +// ch : https://en.wikipedia.org/wiki/.ch +ch + +// ci : https://en.wikipedia.org/wiki/.ci +// http://www.nic.ci/index.php?page=charte +ci +org.ci +or.ci +com.ci +co.ci +edu.ci +ed.ci +ac.ci +net.ci +go.ci +asso.ci +aéroport.ci +int.ci +presse.ci +md.ci +gouv.ci + +// ck : https://en.wikipedia.org/wiki/.ck +*.ck +!www.ck + +// cl : https://en.wikipedia.org/wiki/.cl +cl +gov.cl +gob.cl +co.cl +mil.cl + +// cm : https://en.wikipedia.org/wiki/.cm plus bug 981927 +cm +co.cm +com.cm +gov.cm +net.cm + +// cn : https://en.wikipedia.org/wiki/.cn +// Submitted by registry +cn +ac.cn +com.cn +edu.cn +gov.cn +net.cn +org.cn +mil.cn +公司.cn +网络.cn +網絡.cn +// cn geographic names +ah.cn +bj.cn +cq.cn +fj.cn +gd.cn +gs.cn +gz.cn +gx.cn +ha.cn +hb.cn +he.cn +hi.cn +hl.cn +hn.cn +jl.cn +js.cn +jx.cn +ln.cn +nm.cn +nx.cn +qh.cn +sc.cn +sd.cn +sh.cn +sn.cn +sx.cn +tj.cn +xj.cn +xz.cn +yn.cn +zj.cn +hk.cn +mo.cn +tw.cn + +// co : https://en.wikipedia.org/wiki/.co +// Submitted by registry +co +arts.co +com.co +edu.co +firm.co +gov.co +info.co +int.co +mil.co +net.co +nom.co +org.co +rec.co +web.co + +// com : https://en.wikipedia.org/wiki/.com +com + +// coop : https://en.wikipedia.org/wiki/.coop +coop + +// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do +cr +ac.cr +co.cr +ed.cr +fi.cr +go.cr +or.cr +sa.cr + +// cu : https://en.wikipedia.org/wiki/.cu +cu +com.cu +edu.cu +org.cu +net.cu +gov.cu +inf.cu + +// cv : https://en.wikipedia.org/wiki/.cv +cv + +// cw : http://www.una.cw/cw_registry/ +// Confirmed by registry 2013-03-26 +cw +com.cw +edu.cw +net.cw +org.cw + +// cx : https://en.wikipedia.org/wiki/.cx +// list of other 2nd level tlds ? +cx +gov.cx + +// cy : http://www.nic.cy/ +// Submitted by registry Panayiotou Fotia +cy +ac.cy +biz.cy +com.cy +ekloges.cy +gov.cy +ltd.cy +name.cy +net.cy +org.cy +parliament.cy +press.cy +pro.cy +tm.cy + +// cz : https://en.wikipedia.org/wiki/.cz +cz + +// de : https://en.wikipedia.org/wiki/.de +// Confirmed by registry (with technical +// reservations) 2008-07-01 +de + +// dj : https://en.wikipedia.org/wiki/.dj +dj + +// dk : https://en.wikipedia.org/wiki/.dk +// Confirmed by registry 2008-06-17 +dk + +// dm : https://en.wikipedia.org/wiki/.dm +dm +com.dm +net.dm +org.dm +edu.dm +gov.dm + +// do : https://en.wikipedia.org/wiki/.do +do +art.do +com.do +edu.do +gob.do +gov.do +mil.do +net.do +org.do +sld.do +web.do + +// dz : https://en.wikipedia.org/wiki/.dz +dz +com.dz +org.dz +net.dz +gov.dz +edu.dz +asso.dz +pol.dz +art.dz + +// ec : http://www.nic.ec/reg/paso1.asp +// Submitted by registry +ec +com.ec +info.ec +net.ec +fin.ec +k12.ec +med.ec +pro.ec +org.ec +edu.ec +gov.ec +gob.ec +mil.ec + +// edu : https://en.wikipedia.org/wiki/.edu +edu + +// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B +ee +edu.ee +gov.ee +riik.ee +lib.ee +med.ee +com.ee +pri.ee +aip.ee +org.ee +fie.ee + +// eg : https://en.wikipedia.org/wiki/.eg +eg +com.eg +edu.eg +eun.eg +gov.eg +mil.eg +name.eg +net.eg +org.eg +sci.eg + +// er : https://en.wikipedia.org/wiki/.er +*.er + +// es : https://www.nic.es/site_ingles/ingles/dominios/index.html +es +com.es +nom.es +org.es +gob.es +edu.es + +// et : https://en.wikipedia.org/wiki/.et +et +com.et +gov.et +org.et +edu.et +biz.et +name.et +info.et +net.et + +// eu : https://en.wikipedia.org/wiki/.eu +eu + +// fi : https://en.wikipedia.org/wiki/.fi +fi +// aland.fi : https://en.wikipedia.org/wiki/.ax +// This domain is being phased out in favor of .ax. As there are still many +// domains under aland.fi, we still keep it on the list until aland.fi is +// completely removed. +// TODO: Check for updates (expected to be phased out around Q1/2009) +aland.fi + +// fj : https://en.wikipedia.org/wiki/.fj +*.fj + +// fk : https://en.wikipedia.org/wiki/.fk +*.fk + +// fm : https://en.wikipedia.org/wiki/.fm +fm + +// fo : https://en.wikipedia.org/wiki/.fo +fo + +// fr : http://www.afnic.fr/ +// domaines descriptifs : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-descriptifs +fr +com.fr +asso.fr +nom.fr +prd.fr +presse.fr +tm.fr +// domaines sectoriels : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-sectoriels +aeroport.fr +assedic.fr +avocat.fr +avoues.fr +cci.fr +chambagri.fr +chirurgiens-dentistes.fr +experts-comptables.fr +geometre-expert.fr +gouv.fr +greta.fr +huissier-justice.fr +medecin.fr +notaires.fr +pharmacien.fr +port.fr +veterinaire.fr + +// ga : https://en.wikipedia.org/wiki/.ga +ga + +// gb : This registry is effectively dormant +// Submitted by registry +gb + +// gd : https://en.wikipedia.org/wiki/.gd +gd + +// ge : http://www.nic.net.ge/policy_en.pdf +ge +com.ge +edu.ge +gov.ge +org.ge +mil.ge +net.ge +pvt.ge + +// gf : https://en.wikipedia.org/wiki/.gf +gf + +// gg : http://www.channelisles.net/register-domains/ +// Confirmed by registry 2013-11-28 +gg +co.gg +net.gg +org.gg + +// gh : https://en.wikipedia.org/wiki/.gh +// see also: http://www.nic.gh/reg_now.php +// Although domains directly at second level are not possible at the moment, +// they have been possible for some time and may come back. +gh +com.gh +edu.gh +gov.gh +org.gh +mil.gh + +// gi : http://www.nic.gi/rules.html +gi +com.gi +ltd.gi +gov.gi +mod.gi +edu.gi +org.gi + +// gl : https://en.wikipedia.org/wiki/.gl +// http://nic.gl +gl +co.gl +com.gl +edu.gl +net.gl +org.gl + +// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm +gm + +// gn : http://psg.com/dns/gn/gn.txt +// Submitted by registry +gn +ac.gn +com.gn +edu.gn +gov.gn +org.gn +net.gn + +// gov : https://en.wikipedia.org/wiki/.gov +gov + +// gp : http://www.nic.gp/index.php?lang=en +gp +com.gp +net.gp +mobi.gp +edu.gp +org.gp +asso.gp + +// gq : https://en.wikipedia.org/wiki/.gq +gq + +// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html +// Submitted by registry +gr +com.gr +edu.gr +net.gr +org.gr +gov.gr + +// gs : https://en.wikipedia.org/wiki/.gs +gs + +// gt : http://www.gt/politicas_de_registro.html +gt +com.gt +edu.gt +gob.gt +ind.gt +mil.gt +net.gt +org.gt + +// gu : http://gadao.gov.gu/registration.txt +*.gu + +// gw : https://en.wikipedia.org/wiki/.gw +gw + +// gy : https://en.wikipedia.org/wiki/.gy +// http://registry.gy/ +gy +co.gy +com.gy +edu.gy +gov.gy +net.gy +org.gy + +// hk : https://www.hkdnr.hk +// Submitted by registry +hk +com.hk +edu.hk +gov.hk +idv.hk +net.hk +org.hk +公司.hk +教育.hk +敎育.hk +政府.hk +個人.hk +个人.hk +箇人.hk +網络.hk +网络.hk +组織.hk +網絡.hk +网絡.hk +组织.hk +組織.hk +組织.hk + +// hm : https://en.wikipedia.org/wiki/.hm +hm + +// hn : http://www.nic.hn/politicas/ps02,,05.html +hn +com.hn +edu.hn +org.hn +net.hn +mil.hn +gob.hn + +// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf +hr +iz.hr +from.hr +name.hr +com.hr + +// ht : http://www.nic.ht/info/charte.cfm +ht +com.ht +shop.ht +firm.ht +info.ht +adult.ht +net.ht +pro.ht +org.ht +med.ht +art.ht +coop.ht +pol.ht +asso.ht +edu.ht +rel.ht +gouv.ht +perso.ht + +// hu : http://www.domain.hu/domain/English/sld.html +// Confirmed by registry 2008-06-12 +hu +co.hu +info.hu +org.hu +priv.hu +sport.hu +tm.hu +2000.hu +agrar.hu +bolt.hu +casino.hu +city.hu +erotica.hu +erotika.hu +film.hu +forum.hu +games.hu +hotel.hu +ingatlan.hu +jogasz.hu +konyvelo.hu +lakas.hu +media.hu +news.hu +reklam.hu +sex.hu +shop.hu +suli.hu +szex.hu +tozsde.hu +utazas.hu +video.hu + +// id : https://register.pandi.or.id/ +id +ac.id +biz.id +co.id +desa.id +go.id +mil.id +my.id +net.id +or.id +sch.id +web.id + +// ie : https://en.wikipedia.org/wiki/.ie +ie +gov.ie + +// il : http://www.isoc.org.il/domains/ +il +ac.il +co.il +gov.il +idf.il +k12.il +muni.il +net.il +org.il + +// im : https://www.nic.im/ +// Submitted by registry +im +ac.im +co.im +com.im +ltd.co.im +net.im +org.im +plc.co.im +tt.im +tv.im + +// in : https://en.wikipedia.org/wiki/.in +// see also: https://registry.in/Policies +// Please note, that nic.in is not an official eTLD, but used by most +// government institutions. +in +co.in +firm.in +net.in +org.in +gen.in +ind.in +nic.in +ac.in +edu.in +res.in +gov.in +mil.in + +// info : https://en.wikipedia.org/wiki/.info +info + +// int : https://en.wikipedia.org/wiki/.int +// Confirmed by registry 2008-06-18 +int +eu.int + +// io : http://www.nic.io/rules.html +// list of other 2nd level tlds ? +io +com.io + +// iq : http://www.cmc.iq/english/iq/iqregister1.htm +iq +gov.iq +edu.iq +mil.iq +com.iq +org.iq +net.iq + +// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules +// Also see http://www.nic.ir/Internationalized_Domain_Names +// Two .ir entries added at request of , 2010-04-16 +ir +ac.ir +co.ir +gov.ir +id.ir +net.ir +org.ir +sch.ir +// xn--mgba3a4f16a.ir (.ir, Persian YEH) +ایران.ir +// xn--mgba3a4fra.ir (.ir, Arabic YEH) +ايران.ir + +// is : http://www.isnic.is/domain/rules.php +// Confirmed by registry 2008-12-06 +is +net.is +com.is +edu.is +gov.is +org.is +int.is + +// it : https://en.wikipedia.org/wiki/.it +it +gov.it +edu.it +// Reserved geo-names: +// http://www.nic.it/documenti/regolamenti-e-linee-guida/regolamento-assegnazione-versione-6.0.pdf +// There is also a list of reserved geo-names corresponding to Italian municipalities +// http://www.nic.it/documenti/appendice-c.pdf, but it is not included here. +// Regions +abr.it +abruzzo.it +aosta-valley.it +aostavalley.it +bas.it +basilicata.it +cal.it +calabria.it +cam.it +campania.it +emilia-romagna.it +emiliaromagna.it +emr.it +friuli-v-giulia.it +friuli-ve-giulia.it +friuli-vegiulia.it +friuli-venezia-giulia.it +friuli-veneziagiulia.it +friuli-vgiulia.it +friuliv-giulia.it +friulive-giulia.it +friulivegiulia.it +friulivenezia-giulia.it +friuliveneziagiulia.it +friulivgiulia.it +fvg.it +laz.it +lazio.it +lig.it +liguria.it +lom.it +lombardia.it +lombardy.it +lucania.it +mar.it +marche.it +mol.it +molise.it +piedmont.it +piemonte.it +pmn.it +pug.it +puglia.it +sar.it +sardegna.it +sardinia.it +sic.it +sicilia.it +sicily.it +taa.it +tos.it +toscana.it +trentino-a-adige.it +trentino-aadige.it +trentino-alto-adige.it +trentino-altoadige.it +trentino-s-tirol.it +trentino-stirol.it +trentino-sud-tirol.it +trentino-sudtirol.it +trentino-sued-tirol.it +trentino-suedtirol.it +trentinoa-adige.it +trentinoaadige.it +trentinoalto-adige.it +trentinoaltoadige.it +trentinos-tirol.it +trentinostirol.it +trentinosud-tirol.it +trentinosudtirol.it +trentinosued-tirol.it +trentinosuedtirol.it +tuscany.it +umb.it +umbria.it +val-d-aosta.it +val-daosta.it +vald-aosta.it +valdaosta.it +valle-aosta.it +valle-d-aosta.it +valle-daosta.it +valleaosta.it +valled-aosta.it +valledaosta.it +vallee-aoste.it +valleeaoste.it +vao.it +vda.it +ven.it +veneto.it +// Provinces +ag.it +agrigento.it +al.it +alessandria.it +alto-adige.it +altoadige.it +an.it +ancona.it +andria-barletta-trani.it +andria-trani-barletta.it +andriabarlettatrani.it +andriatranibarletta.it +ao.it +aosta.it +aoste.it +ap.it +aq.it +aquila.it +ar.it +arezzo.it +ascoli-piceno.it +ascolipiceno.it +asti.it +at.it +av.it +avellino.it +ba.it +balsan.it +bari.it +barletta-trani-andria.it +barlettatraniandria.it +belluno.it +benevento.it +bergamo.it +bg.it +bi.it +biella.it +bl.it +bn.it +bo.it +bologna.it +bolzano.it +bozen.it +br.it +brescia.it +brindisi.it +bs.it +bt.it +bz.it +ca.it +cagliari.it +caltanissetta.it +campidano-medio.it +campidanomedio.it +campobasso.it +carbonia-iglesias.it +carboniaiglesias.it +carrara-massa.it +carraramassa.it +caserta.it +catania.it +catanzaro.it +cb.it +ce.it +cesena-forli.it +cesenaforli.it +ch.it +chieti.it +ci.it +cl.it +cn.it +co.it +como.it +cosenza.it +cr.it +cremona.it +crotone.it +cs.it +ct.it +cuneo.it +cz.it +dell-ogliastra.it +dellogliastra.it +en.it +enna.it +fc.it +fe.it +fermo.it +ferrara.it +fg.it +fi.it +firenze.it +florence.it +fm.it +foggia.it +forli-cesena.it +forlicesena.it +fr.it +frosinone.it +ge.it +genoa.it +genova.it +go.it +gorizia.it +gr.it +grosseto.it +iglesias-carbonia.it +iglesiascarbonia.it +im.it +imperia.it +is.it +isernia.it +kr.it +la-spezia.it +laquila.it +laspezia.it +latina.it +lc.it +le.it +lecce.it +lecco.it +li.it +livorno.it +lo.it +lodi.it +lt.it +lu.it +lucca.it +macerata.it +mantova.it +massa-carrara.it +massacarrara.it +matera.it +mb.it +mc.it +me.it +medio-campidano.it +mediocampidano.it +messina.it +mi.it +milan.it +milano.it +mn.it +mo.it +modena.it +monza-brianza.it +monza-e-della-brianza.it +monza.it +monzabrianza.it +monzaebrianza.it +monzaedellabrianza.it +ms.it +mt.it +na.it +naples.it +napoli.it +no.it +novara.it +nu.it +nuoro.it +og.it +ogliastra.it +olbia-tempio.it +olbiatempio.it +or.it +oristano.it +ot.it +pa.it +padova.it +padua.it +palermo.it +parma.it +pavia.it +pc.it +pd.it +pe.it +perugia.it +pesaro-urbino.it +pesarourbino.it +pescara.it +pg.it +pi.it +piacenza.it +pisa.it +pistoia.it +pn.it +po.it +pordenone.it +potenza.it +pr.it +prato.it +pt.it +pu.it +pv.it +pz.it +ra.it +ragusa.it +ravenna.it +rc.it +re.it +reggio-calabria.it +reggio-emilia.it +reggiocalabria.it +reggioemilia.it +rg.it +ri.it +rieti.it +rimini.it +rm.it +rn.it +ro.it +roma.it +rome.it +rovigo.it +sa.it +salerno.it +sassari.it +savona.it +si.it +siena.it +siracusa.it +so.it +sondrio.it +sp.it +sr.it +ss.it +suedtirol.it +sv.it +ta.it +taranto.it +te.it +tempio-olbia.it +tempioolbia.it +teramo.it +terni.it +tn.it +to.it +torino.it +tp.it +tr.it +trani-andria-barletta.it +trani-barletta-andria.it +traniandriabarletta.it +tranibarlettaandria.it +trapani.it +trentino.it +trento.it +treviso.it +trieste.it +ts.it +turin.it +tv.it +ud.it +udine.it +urbino-pesaro.it +urbinopesaro.it +va.it +varese.it +vb.it +vc.it +ve.it +venezia.it +venice.it +verbania.it +vercelli.it +verona.it +vi.it +vibo-valentia.it +vibovalentia.it +vicenza.it +viterbo.it +vr.it +vs.it +vt.it +vv.it + +// je : http://www.channelisles.net/register-domains/ +// Confirmed by registry 2013-11-28 +je +co.je +net.je +org.je + +// jm : http://www.com.jm/register.html +*.jm + +// jo : http://www.dns.jo/Registration_policy.aspx +jo +com.jo +org.jo +net.jo +edu.jo +sch.jo +gov.jo +mil.jo +name.jo + +// jobs : https://en.wikipedia.org/wiki/.jobs +jobs + +// jp : https://en.wikipedia.org/wiki/.jp +// http://jprs.co.jp/en/jpdomain.html +// Submitted by registry +jp +// jp organizational type names +ac.jp +ad.jp +co.jp +ed.jp +go.jp +gr.jp +lg.jp +ne.jp +or.jp +// jp prefecture type names +aichi.jp +akita.jp +aomori.jp +chiba.jp +ehime.jp +fukui.jp +fukuoka.jp +fukushima.jp +gifu.jp +gunma.jp +hiroshima.jp +hokkaido.jp +hyogo.jp +ibaraki.jp +ishikawa.jp +iwate.jp +kagawa.jp +kagoshima.jp +kanagawa.jp +kochi.jp +kumamoto.jp +kyoto.jp +mie.jp +miyagi.jp +miyazaki.jp +nagano.jp +nagasaki.jp +nara.jp +niigata.jp +oita.jp +okayama.jp +okinawa.jp +osaka.jp +saga.jp +saitama.jp +shiga.jp +shimane.jp +shizuoka.jp +tochigi.jp +tokushima.jp +tokyo.jp +tottori.jp +toyama.jp +wakayama.jp +yamagata.jp +yamaguchi.jp +yamanashi.jp +栃木.jp +愛知.jp +愛媛.jp +兵庫.jp +熊本.jp +茨城.jp +北海道.jp +千葉.jp +和歌山.jp +長崎.jp +長野.jp +新潟.jp +青森.jp +静岡.jp +東京.jp +石川.jp +埼玉.jp +三重.jp +京都.jp +佐賀.jp +大分.jp +大阪.jp +奈良.jp +宮城.jp +宮崎.jp +富山.jp +山口.jp +山形.jp +山梨.jp +岩手.jp +岐阜.jp +岡山.jp +島根.jp +広島.jp +徳島.jp +沖縄.jp +滋賀.jp +神奈川.jp +福井.jp +福岡.jp +福島.jp +秋田.jp +群馬.jp +香川.jp +高知.jp +鳥取.jp +鹿児島.jp +// jp geographic type names +// http://jprs.jp/doc/rule/saisoku-1.html +*.kawasaki.jp +*.kitakyushu.jp +*.kobe.jp +*.nagoya.jp +*.sapporo.jp +*.sendai.jp +*.yokohama.jp +!city.kawasaki.jp +!city.kitakyushu.jp +!city.kobe.jp +!city.nagoya.jp +!city.sapporo.jp +!city.sendai.jp +!city.yokohama.jp +// 4th level registration +aisai.aichi.jp +ama.aichi.jp +anjo.aichi.jp +asuke.aichi.jp +chiryu.aichi.jp +chita.aichi.jp +fuso.aichi.jp +gamagori.aichi.jp +handa.aichi.jp +hazu.aichi.jp +hekinan.aichi.jp +higashiura.aichi.jp +ichinomiya.aichi.jp +inazawa.aichi.jp +inuyama.aichi.jp +isshiki.aichi.jp +iwakura.aichi.jp +kanie.aichi.jp +kariya.aichi.jp +kasugai.aichi.jp +kira.aichi.jp +kiyosu.aichi.jp +komaki.aichi.jp +konan.aichi.jp +kota.aichi.jp +mihama.aichi.jp +miyoshi.aichi.jp +nishio.aichi.jp +nisshin.aichi.jp +obu.aichi.jp +oguchi.aichi.jp +oharu.aichi.jp +okazaki.aichi.jp +owariasahi.aichi.jp +seto.aichi.jp +shikatsu.aichi.jp +shinshiro.aichi.jp +shitara.aichi.jp +tahara.aichi.jp +takahama.aichi.jp +tobishima.aichi.jp +toei.aichi.jp +togo.aichi.jp +tokai.aichi.jp +tokoname.aichi.jp +toyoake.aichi.jp +toyohashi.aichi.jp +toyokawa.aichi.jp +toyone.aichi.jp +toyota.aichi.jp +tsushima.aichi.jp +yatomi.aichi.jp +akita.akita.jp +daisen.akita.jp +fujisato.akita.jp +gojome.akita.jp +hachirogata.akita.jp +happou.akita.jp +higashinaruse.akita.jp +honjo.akita.jp +honjyo.akita.jp +ikawa.akita.jp +kamikoani.akita.jp +kamioka.akita.jp +katagami.akita.jp +kazuno.akita.jp +kitaakita.akita.jp +kosaka.akita.jp +kyowa.akita.jp +misato.akita.jp +mitane.akita.jp +moriyoshi.akita.jp +nikaho.akita.jp +noshiro.akita.jp +odate.akita.jp +oga.akita.jp +ogata.akita.jp +semboku.akita.jp +yokote.akita.jp +yurihonjo.akita.jp +aomori.aomori.jp +gonohe.aomori.jp +hachinohe.aomori.jp +hashikami.aomori.jp +hiranai.aomori.jp +hirosaki.aomori.jp +itayanagi.aomori.jp +kuroishi.aomori.jp +misawa.aomori.jp +mutsu.aomori.jp +nakadomari.aomori.jp +noheji.aomori.jp +oirase.aomori.jp +owani.aomori.jp +rokunohe.aomori.jp +sannohe.aomori.jp +shichinohe.aomori.jp +shingo.aomori.jp +takko.aomori.jp +towada.aomori.jp +tsugaru.aomori.jp +tsuruta.aomori.jp +abiko.chiba.jp +asahi.chiba.jp +chonan.chiba.jp +chosei.chiba.jp +choshi.chiba.jp +chuo.chiba.jp +funabashi.chiba.jp +futtsu.chiba.jp +hanamigawa.chiba.jp +ichihara.chiba.jp +ichikawa.chiba.jp +ichinomiya.chiba.jp +inzai.chiba.jp +isumi.chiba.jp +kamagaya.chiba.jp +kamogawa.chiba.jp +kashiwa.chiba.jp +katori.chiba.jp +katsuura.chiba.jp +kimitsu.chiba.jp +kisarazu.chiba.jp +kozaki.chiba.jp +kujukuri.chiba.jp +kyonan.chiba.jp +matsudo.chiba.jp +midori.chiba.jp +mihama.chiba.jp +minamiboso.chiba.jp +mobara.chiba.jp +mutsuzawa.chiba.jp +nagara.chiba.jp +nagareyama.chiba.jp +narashino.chiba.jp +narita.chiba.jp +noda.chiba.jp +oamishirasato.chiba.jp +omigawa.chiba.jp +onjuku.chiba.jp +otaki.chiba.jp +sakae.chiba.jp +sakura.chiba.jp +shimofusa.chiba.jp +shirako.chiba.jp +shiroi.chiba.jp +shisui.chiba.jp +sodegaura.chiba.jp +sosa.chiba.jp +tako.chiba.jp +tateyama.chiba.jp +togane.chiba.jp +tohnosho.chiba.jp +tomisato.chiba.jp +urayasu.chiba.jp +yachimata.chiba.jp +yachiyo.chiba.jp +yokaichiba.chiba.jp +yokoshibahikari.chiba.jp +yotsukaido.chiba.jp +ainan.ehime.jp +honai.ehime.jp +ikata.ehime.jp +imabari.ehime.jp +iyo.ehime.jp +kamijima.ehime.jp +kihoku.ehime.jp +kumakogen.ehime.jp +masaki.ehime.jp +matsuno.ehime.jp +matsuyama.ehime.jp +namikata.ehime.jp +niihama.ehime.jp +ozu.ehime.jp +saijo.ehime.jp +seiyo.ehime.jp +shikokuchuo.ehime.jp +tobe.ehime.jp +toon.ehime.jp +uchiko.ehime.jp +uwajima.ehime.jp +yawatahama.ehime.jp +echizen.fukui.jp +eiheiji.fukui.jp +fukui.fukui.jp +ikeda.fukui.jp +katsuyama.fukui.jp +mihama.fukui.jp +minamiechizen.fukui.jp +obama.fukui.jp +ohi.fukui.jp +ono.fukui.jp +sabae.fukui.jp +sakai.fukui.jp +takahama.fukui.jp +tsuruga.fukui.jp +wakasa.fukui.jp +ashiya.fukuoka.jp +buzen.fukuoka.jp +chikugo.fukuoka.jp +chikuho.fukuoka.jp +chikujo.fukuoka.jp +chikushino.fukuoka.jp +chikuzen.fukuoka.jp +chuo.fukuoka.jp +dazaifu.fukuoka.jp +fukuchi.fukuoka.jp +hakata.fukuoka.jp +higashi.fukuoka.jp +hirokawa.fukuoka.jp +hisayama.fukuoka.jp +iizuka.fukuoka.jp +inatsuki.fukuoka.jp +kaho.fukuoka.jp +kasuga.fukuoka.jp +kasuya.fukuoka.jp +kawara.fukuoka.jp +keisen.fukuoka.jp +koga.fukuoka.jp +kurate.fukuoka.jp +kurogi.fukuoka.jp +kurume.fukuoka.jp +minami.fukuoka.jp +miyako.fukuoka.jp +miyama.fukuoka.jp +miyawaka.fukuoka.jp +mizumaki.fukuoka.jp +munakata.fukuoka.jp +nakagawa.fukuoka.jp +nakama.fukuoka.jp +nishi.fukuoka.jp +nogata.fukuoka.jp +ogori.fukuoka.jp +okagaki.fukuoka.jp +okawa.fukuoka.jp +oki.fukuoka.jp +omuta.fukuoka.jp +onga.fukuoka.jp +onojo.fukuoka.jp +oto.fukuoka.jp +saigawa.fukuoka.jp +sasaguri.fukuoka.jp +shingu.fukuoka.jp +shinyoshitomi.fukuoka.jp +shonai.fukuoka.jp +soeda.fukuoka.jp +sue.fukuoka.jp +tachiarai.fukuoka.jp +tagawa.fukuoka.jp +takata.fukuoka.jp +toho.fukuoka.jp +toyotsu.fukuoka.jp +tsuiki.fukuoka.jp +ukiha.fukuoka.jp +umi.fukuoka.jp +usui.fukuoka.jp +yamada.fukuoka.jp +yame.fukuoka.jp +yanagawa.fukuoka.jp +yukuhashi.fukuoka.jp +aizubange.fukushima.jp +aizumisato.fukushima.jp +aizuwakamatsu.fukushima.jp +asakawa.fukushima.jp +bandai.fukushima.jp +date.fukushima.jp +fukushima.fukushima.jp +furudono.fukushima.jp +futaba.fukushima.jp +hanawa.fukushima.jp +higashi.fukushima.jp +hirata.fukushima.jp +hirono.fukushima.jp +iitate.fukushima.jp +inawashiro.fukushima.jp +ishikawa.fukushima.jp +iwaki.fukushima.jp +izumizaki.fukushima.jp +kagamiishi.fukushima.jp +kaneyama.fukushima.jp +kawamata.fukushima.jp +kitakata.fukushima.jp +kitashiobara.fukushima.jp +koori.fukushima.jp +koriyama.fukushima.jp +kunimi.fukushima.jp +miharu.fukushima.jp +mishima.fukushima.jp +namie.fukushima.jp +nango.fukushima.jp +nishiaizu.fukushima.jp +nishigo.fukushima.jp +okuma.fukushima.jp +omotego.fukushima.jp +ono.fukushima.jp +otama.fukushima.jp +samegawa.fukushima.jp +shimogo.fukushima.jp +shirakawa.fukushima.jp +showa.fukushima.jp +soma.fukushima.jp +sukagawa.fukushima.jp +taishin.fukushima.jp +tamakawa.fukushima.jp +tanagura.fukushima.jp +tenei.fukushima.jp +yabuki.fukushima.jp +yamato.fukushima.jp +yamatsuri.fukushima.jp +yanaizu.fukushima.jp +yugawa.fukushima.jp +anpachi.gifu.jp +ena.gifu.jp +gifu.gifu.jp +ginan.gifu.jp +godo.gifu.jp +gujo.gifu.jp +hashima.gifu.jp +hichiso.gifu.jp +hida.gifu.jp +higashishirakawa.gifu.jp +ibigawa.gifu.jp +ikeda.gifu.jp +kakamigahara.gifu.jp +kani.gifu.jp +kasahara.gifu.jp +kasamatsu.gifu.jp +kawaue.gifu.jp +kitagata.gifu.jp +mino.gifu.jp +minokamo.gifu.jp +mitake.gifu.jp +mizunami.gifu.jp +motosu.gifu.jp +nakatsugawa.gifu.jp +ogaki.gifu.jp +sakahogi.gifu.jp +seki.gifu.jp +sekigahara.gifu.jp +shirakawa.gifu.jp +tajimi.gifu.jp +takayama.gifu.jp +tarui.gifu.jp +toki.gifu.jp +tomika.gifu.jp +wanouchi.gifu.jp +yamagata.gifu.jp +yaotsu.gifu.jp +yoro.gifu.jp +annaka.gunma.jp +chiyoda.gunma.jp +fujioka.gunma.jp +higashiagatsuma.gunma.jp +isesaki.gunma.jp +itakura.gunma.jp +kanna.gunma.jp +kanra.gunma.jp +katashina.gunma.jp +kawaba.gunma.jp +kiryu.gunma.jp +kusatsu.gunma.jp +maebashi.gunma.jp +meiwa.gunma.jp +midori.gunma.jp +minakami.gunma.jp +naganohara.gunma.jp +nakanojo.gunma.jp +nanmoku.gunma.jp +numata.gunma.jp +oizumi.gunma.jp +ora.gunma.jp +ota.gunma.jp +shibukawa.gunma.jp +shimonita.gunma.jp +shinto.gunma.jp +showa.gunma.jp +takasaki.gunma.jp +takayama.gunma.jp +tamamura.gunma.jp +tatebayashi.gunma.jp +tomioka.gunma.jp +tsukiyono.gunma.jp +tsumagoi.gunma.jp +ueno.gunma.jp +yoshioka.gunma.jp +asaminami.hiroshima.jp +daiwa.hiroshima.jp +etajima.hiroshima.jp +fuchu.hiroshima.jp +fukuyama.hiroshima.jp +hatsukaichi.hiroshima.jp +higashihiroshima.hiroshima.jp +hongo.hiroshima.jp +jinsekikogen.hiroshima.jp +kaita.hiroshima.jp +kui.hiroshima.jp +kumano.hiroshima.jp +kure.hiroshima.jp +mihara.hiroshima.jp +miyoshi.hiroshima.jp +naka.hiroshima.jp +onomichi.hiroshima.jp +osakikamijima.hiroshima.jp +otake.hiroshima.jp +saka.hiroshima.jp +sera.hiroshima.jp +seranishi.hiroshima.jp +shinichi.hiroshima.jp +shobara.hiroshima.jp +takehara.hiroshima.jp +abashiri.hokkaido.jp +abira.hokkaido.jp +aibetsu.hokkaido.jp +akabira.hokkaido.jp +akkeshi.hokkaido.jp +asahikawa.hokkaido.jp +ashibetsu.hokkaido.jp +ashoro.hokkaido.jp +assabu.hokkaido.jp +atsuma.hokkaido.jp +bibai.hokkaido.jp +biei.hokkaido.jp +bifuka.hokkaido.jp +bihoro.hokkaido.jp +biratori.hokkaido.jp +chippubetsu.hokkaido.jp +chitose.hokkaido.jp +date.hokkaido.jp +ebetsu.hokkaido.jp +embetsu.hokkaido.jp +eniwa.hokkaido.jp +erimo.hokkaido.jp +esan.hokkaido.jp +esashi.hokkaido.jp +fukagawa.hokkaido.jp +fukushima.hokkaido.jp +furano.hokkaido.jp +furubira.hokkaido.jp +haboro.hokkaido.jp +hakodate.hokkaido.jp +hamatonbetsu.hokkaido.jp +hidaka.hokkaido.jp +higashikagura.hokkaido.jp +higashikawa.hokkaido.jp +hiroo.hokkaido.jp +hokuryu.hokkaido.jp +hokuto.hokkaido.jp +honbetsu.hokkaido.jp +horokanai.hokkaido.jp +horonobe.hokkaido.jp +ikeda.hokkaido.jp +imakane.hokkaido.jp +ishikari.hokkaido.jp +iwamizawa.hokkaido.jp +iwanai.hokkaido.jp +kamifurano.hokkaido.jp +kamikawa.hokkaido.jp +kamishihoro.hokkaido.jp +kamisunagawa.hokkaido.jp +kamoenai.hokkaido.jp +kayabe.hokkaido.jp +kembuchi.hokkaido.jp +kikonai.hokkaido.jp +kimobetsu.hokkaido.jp +kitahiroshima.hokkaido.jp +kitami.hokkaido.jp +kiyosato.hokkaido.jp +koshimizu.hokkaido.jp +kunneppu.hokkaido.jp +kuriyama.hokkaido.jp +kuromatsunai.hokkaido.jp +kushiro.hokkaido.jp +kutchan.hokkaido.jp +kyowa.hokkaido.jp +mashike.hokkaido.jp +matsumae.hokkaido.jp +mikasa.hokkaido.jp +minamifurano.hokkaido.jp +mombetsu.hokkaido.jp +moseushi.hokkaido.jp +mukawa.hokkaido.jp +muroran.hokkaido.jp +naie.hokkaido.jp +nakagawa.hokkaido.jp +nakasatsunai.hokkaido.jp +nakatombetsu.hokkaido.jp +nanae.hokkaido.jp +nanporo.hokkaido.jp +nayoro.hokkaido.jp +nemuro.hokkaido.jp +niikappu.hokkaido.jp +niki.hokkaido.jp +nishiokoppe.hokkaido.jp +noboribetsu.hokkaido.jp +numata.hokkaido.jp +obihiro.hokkaido.jp +obira.hokkaido.jp +oketo.hokkaido.jp +okoppe.hokkaido.jp +otaru.hokkaido.jp +otobe.hokkaido.jp +otofuke.hokkaido.jp +otoineppu.hokkaido.jp +oumu.hokkaido.jp +ozora.hokkaido.jp +pippu.hokkaido.jp +rankoshi.hokkaido.jp +rebun.hokkaido.jp +rikubetsu.hokkaido.jp +rishiri.hokkaido.jp +rishirifuji.hokkaido.jp +saroma.hokkaido.jp +sarufutsu.hokkaido.jp +shakotan.hokkaido.jp +shari.hokkaido.jp +shibecha.hokkaido.jp +shibetsu.hokkaido.jp +shikabe.hokkaido.jp +shikaoi.hokkaido.jp +shimamaki.hokkaido.jp +shimizu.hokkaido.jp +shimokawa.hokkaido.jp +shinshinotsu.hokkaido.jp +shintoku.hokkaido.jp +shiranuka.hokkaido.jp +shiraoi.hokkaido.jp +shiriuchi.hokkaido.jp +sobetsu.hokkaido.jp +sunagawa.hokkaido.jp +taiki.hokkaido.jp +takasu.hokkaido.jp +takikawa.hokkaido.jp +takinoue.hokkaido.jp +teshikaga.hokkaido.jp +tobetsu.hokkaido.jp +tohma.hokkaido.jp +tomakomai.hokkaido.jp +tomari.hokkaido.jp +toya.hokkaido.jp +toyako.hokkaido.jp +toyotomi.hokkaido.jp +toyoura.hokkaido.jp +tsubetsu.hokkaido.jp +tsukigata.hokkaido.jp +urakawa.hokkaido.jp +urausu.hokkaido.jp +uryu.hokkaido.jp +utashinai.hokkaido.jp +wakkanai.hokkaido.jp +wassamu.hokkaido.jp +yakumo.hokkaido.jp +yoichi.hokkaido.jp +aioi.hyogo.jp +akashi.hyogo.jp +ako.hyogo.jp +amagasaki.hyogo.jp +aogaki.hyogo.jp +asago.hyogo.jp +ashiya.hyogo.jp +awaji.hyogo.jp +fukusaki.hyogo.jp +goshiki.hyogo.jp +harima.hyogo.jp +himeji.hyogo.jp +ichikawa.hyogo.jp +inagawa.hyogo.jp +itami.hyogo.jp +kakogawa.hyogo.jp +kamigori.hyogo.jp +kamikawa.hyogo.jp +kasai.hyogo.jp +kasuga.hyogo.jp +kawanishi.hyogo.jp +miki.hyogo.jp +minamiawaji.hyogo.jp +nishinomiya.hyogo.jp +nishiwaki.hyogo.jp +ono.hyogo.jp +sanda.hyogo.jp +sannan.hyogo.jp +sasayama.hyogo.jp +sayo.hyogo.jp +shingu.hyogo.jp +shinonsen.hyogo.jp +shiso.hyogo.jp +sumoto.hyogo.jp +taishi.hyogo.jp +taka.hyogo.jp +takarazuka.hyogo.jp +takasago.hyogo.jp +takino.hyogo.jp +tamba.hyogo.jp +tatsuno.hyogo.jp +toyooka.hyogo.jp +yabu.hyogo.jp +yashiro.hyogo.jp +yoka.hyogo.jp +yokawa.hyogo.jp +ami.ibaraki.jp +asahi.ibaraki.jp +bando.ibaraki.jp +chikusei.ibaraki.jp +daigo.ibaraki.jp +fujishiro.ibaraki.jp +hitachi.ibaraki.jp +hitachinaka.ibaraki.jp +hitachiomiya.ibaraki.jp +hitachiota.ibaraki.jp +ibaraki.ibaraki.jp +ina.ibaraki.jp +inashiki.ibaraki.jp +itako.ibaraki.jp +iwama.ibaraki.jp +joso.ibaraki.jp +kamisu.ibaraki.jp +kasama.ibaraki.jp +kashima.ibaraki.jp +kasumigaura.ibaraki.jp +koga.ibaraki.jp +miho.ibaraki.jp +mito.ibaraki.jp +moriya.ibaraki.jp +naka.ibaraki.jp +namegata.ibaraki.jp +oarai.ibaraki.jp +ogawa.ibaraki.jp +omitama.ibaraki.jp +ryugasaki.ibaraki.jp +sakai.ibaraki.jp +sakuragawa.ibaraki.jp +shimodate.ibaraki.jp +shimotsuma.ibaraki.jp +shirosato.ibaraki.jp +sowa.ibaraki.jp +suifu.ibaraki.jp +takahagi.ibaraki.jp +tamatsukuri.ibaraki.jp +tokai.ibaraki.jp +tomobe.ibaraki.jp +tone.ibaraki.jp +toride.ibaraki.jp +tsuchiura.ibaraki.jp +tsukuba.ibaraki.jp +uchihara.ibaraki.jp +ushiku.ibaraki.jp +yachiyo.ibaraki.jp +yamagata.ibaraki.jp +yawara.ibaraki.jp +yuki.ibaraki.jp +anamizu.ishikawa.jp +hakui.ishikawa.jp +hakusan.ishikawa.jp +kaga.ishikawa.jp +kahoku.ishikawa.jp +kanazawa.ishikawa.jp +kawakita.ishikawa.jp +komatsu.ishikawa.jp +nakanoto.ishikawa.jp +nanao.ishikawa.jp +nomi.ishikawa.jp +nonoichi.ishikawa.jp +noto.ishikawa.jp +shika.ishikawa.jp +suzu.ishikawa.jp +tsubata.ishikawa.jp +tsurugi.ishikawa.jp +uchinada.ishikawa.jp +wajima.ishikawa.jp +fudai.iwate.jp +fujisawa.iwate.jp +hanamaki.iwate.jp +hiraizumi.iwate.jp +hirono.iwate.jp +ichinohe.iwate.jp +ichinoseki.iwate.jp +iwaizumi.iwate.jp +iwate.iwate.jp +joboji.iwate.jp +kamaishi.iwate.jp +kanegasaki.iwate.jp +karumai.iwate.jp +kawai.iwate.jp +kitakami.iwate.jp +kuji.iwate.jp +kunohe.iwate.jp +kuzumaki.iwate.jp +miyako.iwate.jp +mizusawa.iwate.jp +morioka.iwate.jp +ninohe.iwate.jp +noda.iwate.jp +ofunato.iwate.jp +oshu.iwate.jp +otsuchi.iwate.jp +rikuzentakata.iwate.jp +shiwa.iwate.jp +shizukuishi.iwate.jp +sumita.iwate.jp +tanohata.iwate.jp +tono.iwate.jp +yahaba.iwate.jp +yamada.iwate.jp +ayagawa.kagawa.jp +higashikagawa.kagawa.jp +kanonji.kagawa.jp +kotohira.kagawa.jp +manno.kagawa.jp +marugame.kagawa.jp +mitoyo.kagawa.jp +naoshima.kagawa.jp +sanuki.kagawa.jp +tadotsu.kagawa.jp +takamatsu.kagawa.jp +tonosho.kagawa.jp +uchinomi.kagawa.jp +utazu.kagawa.jp +zentsuji.kagawa.jp +akune.kagoshima.jp +amami.kagoshima.jp +hioki.kagoshima.jp +isa.kagoshima.jp +isen.kagoshima.jp +izumi.kagoshima.jp +kagoshima.kagoshima.jp +kanoya.kagoshima.jp +kawanabe.kagoshima.jp +kinko.kagoshima.jp +kouyama.kagoshima.jp +makurazaki.kagoshima.jp +matsumoto.kagoshima.jp +minamitane.kagoshima.jp +nakatane.kagoshima.jp +nishinoomote.kagoshima.jp +satsumasendai.kagoshima.jp +soo.kagoshima.jp +tarumizu.kagoshima.jp +yusui.kagoshima.jp +aikawa.kanagawa.jp +atsugi.kanagawa.jp +ayase.kanagawa.jp +chigasaki.kanagawa.jp +ebina.kanagawa.jp +fujisawa.kanagawa.jp +hadano.kanagawa.jp +hakone.kanagawa.jp +hiratsuka.kanagawa.jp +isehara.kanagawa.jp +kaisei.kanagawa.jp +kamakura.kanagawa.jp +kiyokawa.kanagawa.jp +matsuda.kanagawa.jp +minamiashigara.kanagawa.jp +miura.kanagawa.jp +nakai.kanagawa.jp +ninomiya.kanagawa.jp +odawara.kanagawa.jp +oi.kanagawa.jp +oiso.kanagawa.jp +sagamihara.kanagawa.jp +samukawa.kanagawa.jp +tsukui.kanagawa.jp +yamakita.kanagawa.jp +yamato.kanagawa.jp +yokosuka.kanagawa.jp +yugawara.kanagawa.jp +zama.kanagawa.jp +zushi.kanagawa.jp +aki.kochi.jp +geisei.kochi.jp +hidaka.kochi.jp +higashitsuno.kochi.jp +ino.kochi.jp +kagami.kochi.jp +kami.kochi.jp +kitagawa.kochi.jp +kochi.kochi.jp +mihara.kochi.jp +motoyama.kochi.jp +muroto.kochi.jp +nahari.kochi.jp +nakamura.kochi.jp +nankoku.kochi.jp +nishitosa.kochi.jp +niyodogawa.kochi.jp +ochi.kochi.jp +okawa.kochi.jp +otoyo.kochi.jp +otsuki.kochi.jp +sakawa.kochi.jp +sukumo.kochi.jp +susaki.kochi.jp +tosa.kochi.jp +tosashimizu.kochi.jp +toyo.kochi.jp +tsuno.kochi.jp +umaji.kochi.jp +yasuda.kochi.jp +yusuhara.kochi.jp +amakusa.kumamoto.jp +arao.kumamoto.jp +aso.kumamoto.jp +choyo.kumamoto.jp +gyokuto.kumamoto.jp +kamiamakusa.kumamoto.jp +kikuchi.kumamoto.jp +kumamoto.kumamoto.jp +mashiki.kumamoto.jp +mifune.kumamoto.jp +minamata.kumamoto.jp +minamioguni.kumamoto.jp +nagasu.kumamoto.jp +nishihara.kumamoto.jp +oguni.kumamoto.jp +ozu.kumamoto.jp +sumoto.kumamoto.jp +takamori.kumamoto.jp +uki.kumamoto.jp +uto.kumamoto.jp +yamaga.kumamoto.jp +yamato.kumamoto.jp +yatsushiro.kumamoto.jp +ayabe.kyoto.jp +fukuchiyama.kyoto.jp +higashiyama.kyoto.jp +ide.kyoto.jp +ine.kyoto.jp +joyo.kyoto.jp +kameoka.kyoto.jp +kamo.kyoto.jp +kita.kyoto.jp +kizu.kyoto.jp +kumiyama.kyoto.jp +kyotamba.kyoto.jp +kyotanabe.kyoto.jp +kyotango.kyoto.jp +maizuru.kyoto.jp +minami.kyoto.jp +minamiyamashiro.kyoto.jp +miyazu.kyoto.jp +muko.kyoto.jp +nagaokakyo.kyoto.jp +nakagyo.kyoto.jp +nantan.kyoto.jp +oyamazaki.kyoto.jp +sakyo.kyoto.jp +seika.kyoto.jp +tanabe.kyoto.jp +uji.kyoto.jp +ujitawara.kyoto.jp +wazuka.kyoto.jp +yamashina.kyoto.jp +yawata.kyoto.jp +asahi.mie.jp +inabe.mie.jp +ise.mie.jp +kameyama.mie.jp +kawagoe.mie.jp +kiho.mie.jp +kisosaki.mie.jp +kiwa.mie.jp +komono.mie.jp +kumano.mie.jp +kuwana.mie.jp +matsusaka.mie.jp +meiwa.mie.jp +mihama.mie.jp +minamiise.mie.jp +misugi.mie.jp +miyama.mie.jp +nabari.mie.jp +shima.mie.jp +suzuka.mie.jp +tado.mie.jp +taiki.mie.jp +taki.mie.jp +tamaki.mie.jp +toba.mie.jp +tsu.mie.jp +udono.mie.jp +ureshino.mie.jp +watarai.mie.jp +yokkaichi.mie.jp +furukawa.miyagi.jp +higashimatsushima.miyagi.jp +ishinomaki.miyagi.jp +iwanuma.miyagi.jp +kakuda.miyagi.jp +kami.miyagi.jp +kawasaki.miyagi.jp +marumori.miyagi.jp +matsushima.miyagi.jp +minamisanriku.miyagi.jp +misato.miyagi.jp +murata.miyagi.jp +natori.miyagi.jp +ogawara.miyagi.jp +ohira.miyagi.jp +onagawa.miyagi.jp +osaki.miyagi.jp +rifu.miyagi.jp +semine.miyagi.jp +shibata.miyagi.jp +shichikashuku.miyagi.jp +shikama.miyagi.jp +shiogama.miyagi.jp +shiroishi.miyagi.jp +tagajo.miyagi.jp +taiwa.miyagi.jp +tome.miyagi.jp +tomiya.miyagi.jp +wakuya.miyagi.jp +watari.miyagi.jp +yamamoto.miyagi.jp +zao.miyagi.jp +aya.miyazaki.jp +ebino.miyazaki.jp +gokase.miyazaki.jp +hyuga.miyazaki.jp +kadogawa.miyazaki.jp +kawaminami.miyazaki.jp +kijo.miyazaki.jp +kitagawa.miyazaki.jp +kitakata.miyazaki.jp +kitaura.miyazaki.jp +kobayashi.miyazaki.jp +kunitomi.miyazaki.jp +kushima.miyazaki.jp +mimata.miyazaki.jp +miyakonojo.miyazaki.jp +miyazaki.miyazaki.jp +morotsuka.miyazaki.jp +nichinan.miyazaki.jp +nishimera.miyazaki.jp +nobeoka.miyazaki.jp +saito.miyazaki.jp +shiiba.miyazaki.jp +shintomi.miyazaki.jp +takaharu.miyazaki.jp +takanabe.miyazaki.jp +takazaki.miyazaki.jp +tsuno.miyazaki.jp +achi.nagano.jp +agematsu.nagano.jp +anan.nagano.jp +aoki.nagano.jp +asahi.nagano.jp +azumino.nagano.jp +chikuhoku.nagano.jp +chikuma.nagano.jp +chino.nagano.jp +fujimi.nagano.jp +hakuba.nagano.jp +hara.nagano.jp +hiraya.nagano.jp +iida.nagano.jp +iijima.nagano.jp +iiyama.nagano.jp +iizuna.nagano.jp +ikeda.nagano.jp +ikusaka.nagano.jp +ina.nagano.jp +karuizawa.nagano.jp +kawakami.nagano.jp +kiso.nagano.jp +kisofukushima.nagano.jp +kitaaiki.nagano.jp +komagane.nagano.jp +komoro.nagano.jp +matsukawa.nagano.jp +matsumoto.nagano.jp +miasa.nagano.jp +minamiaiki.nagano.jp +minamimaki.nagano.jp +minamiminowa.nagano.jp +minowa.nagano.jp +miyada.nagano.jp +miyota.nagano.jp +mochizuki.nagano.jp +nagano.nagano.jp +nagawa.nagano.jp +nagiso.nagano.jp +nakagawa.nagano.jp +nakano.nagano.jp +nozawaonsen.nagano.jp +obuse.nagano.jp +ogawa.nagano.jp +okaya.nagano.jp +omachi.nagano.jp +omi.nagano.jp +ookuwa.nagano.jp +ooshika.nagano.jp +otaki.nagano.jp +otari.nagano.jp +sakae.nagano.jp +sakaki.nagano.jp +saku.nagano.jp +sakuho.nagano.jp +shimosuwa.nagano.jp +shinanomachi.nagano.jp +shiojiri.nagano.jp +suwa.nagano.jp +suzaka.nagano.jp +takagi.nagano.jp +takamori.nagano.jp +takayama.nagano.jp +tateshina.nagano.jp +tatsuno.nagano.jp +togakushi.nagano.jp +togura.nagano.jp +tomi.nagano.jp +ueda.nagano.jp +wada.nagano.jp +yamagata.nagano.jp +yamanouchi.nagano.jp +yasaka.nagano.jp +yasuoka.nagano.jp +chijiwa.nagasaki.jp +futsu.nagasaki.jp +goto.nagasaki.jp +hasami.nagasaki.jp +hirado.nagasaki.jp +iki.nagasaki.jp +isahaya.nagasaki.jp +kawatana.nagasaki.jp +kuchinotsu.nagasaki.jp +matsuura.nagasaki.jp +nagasaki.nagasaki.jp +obama.nagasaki.jp +omura.nagasaki.jp +oseto.nagasaki.jp +saikai.nagasaki.jp +sasebo.nagasaki.jp +seihi.nagasaki.jp +shimabara.nagasaki.jp +shinkamigoto.nagasaki.jp +togitsu.nagasaki.jp +tsushima.nagasaki.jp +unzen.nagasaki.jp +ando.nara.jp +gose.nara.jp +heguri.nara.jp +higashiyoshino.nara.jp +ikaruga.nara.jp +ikoma.nara.jp +kamikitayama.nara.jp +kanmaki.nara.jp +kashiba.nara.jp +kashihara.nara.jp +katsuragi.nara.jp +kawai.nara.jp +kawakami.nara.jp +kawanishi.nara.jp +koryo.nara.jp +kurotaki.nara.jp +mitsue.nara.jp +miyake.nara.jp +nara.nara.jp +nosegawa.nara.jp +oji.nara.jp +ouda.nara.jp +oyodo.nara.jp +sakurai.nara.jp +sango.nara.jp +shimoichi.nara.jp +shimokitayama.nara.jp +shinjo.nara.jp +soni.nara.jp +takatori.nara.jp +tawaramoto.nara.jp +tenkawa.nara.jp +tenri.nara.jp +uda.nara.jp +yamatokoriyama.nara.jp +yamatotakada.nara.jp +yamazoe.nara.jp +yoshino.nara.jp +aga.niigata.jp +agano.niigata.jp +gosen.niigata.jp +itoigawa.niigata.jp +izumozaki.niigata.jp +joetsu.niigata.jp +kamo.niigata.jp +kariwa.niigata.jp +kashiwazaki.niigata.jp +minamiuonuma.niigata.jp +mitsuke.niigata.jp +muika.niigata.jp +murakami.niigata.jp +myoko.niigata.jp +nagaoka.niigata.jp +niigata.niigata.jp +ojiya.niigata.jp +omi.niigata.jp +sado.niigata.jp +sanjo.niigata.jp +seiro.niigata.jp +seirou.niigata.jp +sekikawa.niigata.jp +shibata.niigata.jp +tagami.niigata.jp +tainai.niigata.jp +tochio.niigata.jp +tokamachi.niigata.jp +tsubame.niigata.jp +tsunan.niigata.jp +uonuma.niigata.jp +yahiko.niigata.jp +yoita.niigata.jp +yuzawa.niigata.jp +beppu.oita.jp +bungoono.oita.jp +bungotakada.oita.jp +hasama.oita.jp +hiji.oita.jp +himeshima.oita.jp +hita.oita.jp +kamitsue.oita.jp +kokonoe.oita.jp +kuju.oita.jp +kunisaki.oita.jp +kusu.oita.jp +oita.oita.jp +saiki.oita.jp +taketa.oita.jp +tsukumi.oita.jp +usa.oita.jp +usuki.oita.jp +yufu.oita.jp +akaiwa.okayama.jp +asakuchi.okayama.jp +bizen.okayama.jp +hayashima.okayama.jp +ibara.okayama.jp +kagamino.okayama.jp +kasaoka.okayama.jp +kibichuo.okayama.jp +kumenan.okayama.jp +kurashiki.okayama.jp +maniwa.okayama.jp +misaki.okayama.jp +nagi.okayama.jp +niimi.okayama.jp +nishiawakura.okayama.jp +okayama.okayama.jp +satosho.okayama.jp +setouchi.okayama.jp +shinjo.okayama.jp +shoo.okayama.jp +soja.okayama.jp +takahashi.okayama.jp +tamano.okayama.jp +tsuyama.okayama.jp +wake.okayama.jp +yakage.okayama.jp +aguni.okinawa.jp +ginowan.okinawa.jp +ginoza.okinawa.jp +gushikami.okinawa.jp +haebaru.okinawa.jp +higashi.okinawa.jp +hirara.okinawa.jp +iheya.okinawa.jp +ishigaki.okinawa.jp +ishikawa.okinawa.jp +itoman.okinawa.jp +izena.okinawa.jp +kadena.okinawa.jp +kin.okinawa.jp +kitadaito.okinawa.jp +kitanakagusuku.okinawa.jp +kumejima.okinawa.jp +kunigami.okinawa.jp +minamidaito.okinawa.jp +motobu.okinawa.jp +nago.okinawa.jp +naha.okinawa.jp +nakagusuku.okinawa.jp +nakijin.okinawa.jp +nanjo.okinawa.jp +nishihara.okinawa.jp +ogimi.okinawa.jp +okinawa.okinawa.jp +onna.okinawa.jp +shimoji.okinawa.jp +taketomi.okinawa.jp +tarama.okinawa.jp +tokashiki.okinawa.jp +tomigusuku.okinawa.jp +tonaki.okinawa.jp +urasoe.okinawa.jp +uruma.okinawa.jp +yaese.okinawa.jp +yomitan.okinawa.jp +yonabaru.okinawa.jp +yonaguni.okinawa.jp +zamami.okinawa.jp +abeno.osaka.jp +chihayaakasaka.osaka.jp +chuo.osaka.jp +daito.osaka.jp +fujiidera.osaka.jp +habikino.osaka.jp +hannan.osaka.jp +higashiosaka.osaka.jp +higashisumiyoshi.osaka.jp +higashiyodogawa.osaka.jp +hirakata.osaka.jp +ibaraki.osaka.jp +ikeda.osaka.jp +izumi.osaka.jp +izumiotsu.osaka.jp +izumisano.osaka.jp +kadoma.osaka.jp +kaizuka.osaka.jp +kanan.osaka.jp +kashiwara.osaka.jp +katano.osaka.jp +kawachinagano.osaka.jp +kishiwada.osaka.jp +kita.osaka.jp +kumatori.osaka.jp +matsubara.osaka.jp +minato.osaka.jp +minoh.osaka.jp +misaki.osaka.jp +moriguchi.osaka.jp +neyagawa.osaka.jp +nishi.osaka.jp +nose.osaka.jp +osakasayama.osaka.jp +sakai.osaka.jp +sayama.osaka.jp +sennan.osaka.jp +settsu.osaka.jp +shijonawate.osaka.jp +shimamoto.osaka.jp +suita.osaka.jp +tadaoka.osaka.jp +taishi.osaka.jp +tajiri.osaka.jp +takaishi.osaka.jp +takatsuki.osaka.jp +tondabayashi.osaka.jp +toyonaka.osaka.jp +toyono.osaka.jp +yao.osaka.jp +ariake.saga.jp +arita.saga.jp +fukudomi.saga.jp +genkai.saga.jp +hamatama.saga.jp +hizen.saga.jp +imari.saga.jp +kamimine.saga.jp +kanzaki.saga.jp +karatsu.saga.jp +kashima.saga.jp +kitagata.saga.jp +kitahata.saga.jp +kiyama.saga.jp +kouhoku.saga.jp +kyuragi.saga.jp +nishiarita.saga.jp +ogi.saga.jp +omachi.saga.jp +ouchi.saga.jp +saga.saga.jp +shiroishi.saga.jp +taku.saga.jp +tara.saga.jp +tosu.saga.jp +yoshinogari.saga.jp +arakawa.saitama.jp +asaka.saitama.jp +chichibu.saitama.jp +fujimi.saitama.jp +fujimino.saitama.jp +fukaya.saitama.jp +hanno.saitama.jp +hanyu.saitama.jp +hasuda.saitama.jp +hatogaya.saitama.jp +hatoyama.saitama.jp +hidaka.saitama.jp +higashichichibu.saitama.jp +higashimatsuyama.saitama.jp +honjo.saitama.jp +ina.saitama.jp +iruma.saitama.jp +iwatsuki.saitama.jp +kamiizumi.saitama.jp +kamikawa.saitama.jp +kamisato.saitama.jp +kasukabe.saitama.jp +kawagoe.saitama.jp +kawaguchi.saitama.jp +kawajima.saitama.jp +kazo.saitama.jp +kitamoto.saitama.jp +koshigaya.saitama.jp +kounosu.saitama.jp +kuki.saitama.jp +kumagaya.saitama.jp +matsubushi.saitama.jp +minano.saitama.jp +misato.saitama.jp +miyashiro.saitama.jp +miyoshi.saitama.jp +moroyama.saitama.jp +nagatoro.saitama.jp +namegawa.saitama.jp +niiza.saitama.jp +ogano.saitama.jp +ogawa.saitama.jp +ogose.saitama.jp +okegawa.saitama.jp +omiya.saitama.jp +otaki.saitama.jp +ranzan.saitama.jp +ryokami.saitama.jp +saitama.saitama.jp +sakado.saitama.jp +satte.saitama.jp +sayama.saitama.jp +shiki.saitama.jp +shiraoka.saitama.jp +soka.saitama.jp +sugito.saitama.jp +toda.saitama.jp +tokigawa.saitama.jp +tokorozawa.saitama.jp +tsurugashima.saitama.jp +urawa.saitama.jp +warabi.saitama.jp +yashio.saitama.jp +yokoze.saitama.jp +yono.saitama.jp +yorii.saitama.jp +yoshida.saitama.jp +yoshikawa.saitama.jp +yoshimi.saitama.jp +aisho.shiga.jp +gamo.shiga.jp +higashiomi.shiga.jp +hikone.shiga.jp +koka.shiga.jp +konan.shiga.jp +kosei.shiga.jp +koto.shiga.jp +kusatsu.shiga.jp +maibara.shiga.jp +moriyama.shiga.jp +nagahama.shiga.jp +nishiazai.shiga.jp +notogawa.shiga.jp +omihachiman.shiga.jp +otsu.shiga.jp +ritto.shiga.jp +ryuoh.shiga.jp +takashima.shiga.jp +takatsuki.shiga.jp +torahime.shiga.jp +toyosato.shiga.jp +yasu.shiga.jp +akagi.shimane.jp +ama.shimane.jp +gotsu.shimane.jp +hamada.shimane.jp +higashiizumo.shimane.jp +hikawa.shimane.jp +hikimi.shimane.jp +izumo.shimane.jp +kakinoki.shimane.jp +masuda.shimane.jp +matsue.shimane.jp +misato.shimane.jp +nishinoshima.shimane.jp +ohda.shimane.jp +okinoshima.shimane.jp +okuizumo.shimane.jp +shimane.shimane.jp +tamayu.shimane.jp +tsuwano.shimane.jp +unnan.shimane.jp +yakumo.shimane.jp +yasugi.shimane.jp +yatsuka.shimane.jp +arai.shizuoka.jp +atami.shizuoka.jp +fuji.shizuoka.jp +fujieda.shizuoka.jp +fujikawa.shizuoka.jp +fujinomiya.shizuoka.jp +fukuroi.shizuoka.jp +gotemba.shizuoka.jp +haibara.shizuoka.jp +hamamatsu.shizuoka.jp +higashiizu.shizuoka.jp +ito.shizuoka.jp +iwata.shizuoka.jp +izu.shizuoka.jp +izunokuni.shizuoka.jp +kakegawa.shizuoka.jp +kannami.shizuoka.jp +kawanehon.shizuoka.jp +kawazu.shizuoka.jp +kikugawa.shizuoka.jp +kosai.shizuoka.jp +makinohara.shizuoka.jp +matsuzaki.shizuoka.jp +minamiizu.shizuoka.jp +mishima.shizuoka.jp +morimachi.shizuoka.jp +nishiizu.shizuoka.jp +numazu.shizuoka.jp +omaezaki.shizuoka.jp +shimada.shizuoka.jp +shimizu.shizuoka.jp +shimoda.shizuoka.jp +shizuoka.shizuoka.jp +susono.shizuoka.jp +yaizu.shizuoka.jp +yoshida.shizuoka.jp +ashikaga.tochigi.jp +bato.tochigi.jp +haga.tochigi.jp +ichikai.tochigi.jp +iwafune.tochigi.jp +kaminokawa.tochigi.jp +kanuma.tochigi.jp +karasuyama.tochigi.jp +kuroiso.tochigi.jp +mashiko.tochigi.jp +mibu.tochigi.jp +moka.tochigi.jp +motegi.tochigi.jp +nasu.tochigi.jp +nasushiobara.tochigi.jp +nikko.tochigi.jp +nishikata.tochigi.jp +nogi.tochigi.jp +ohira.tochigi.jp +ohtawara.tochigi.jp +oyama.tochigi.jp +sakura.tochigi.jp +sano.tochigi.jp +shimotsuke.tochigi.jp +shioya.tochigi.jp +takanezawa.tochigi.jp +tochigi.tochigi.jp +tsuga.tochigi.jp +ujiie.tochigi.jp +utsunomiya.tochigi.jp +yaita.tochigi.jp +aizumi.tokushima.jp +anan.tokushima.jp +ichiba.tokushima.jp +itano.tokushima.jp +kainan.tokushima.jp +komatsushima.tokushima.jp +matsushige.tokushima.jp +mima.tokushima.jp +minami.tokushima.jp +miyoshi.tokushima.jp +mugi.tokushima.jp +nakagawa.tokushima.jp +naruto.tokushima.jp +sanagochi.tokushima.jp +shishikui.tokushima.jp +tokushima.tokushima.jp +wajiki.tokushima.jp +adachi.tokyo.jp +akiruno.tokyo.jp +akishima.tokyo.jp +aogashima.tokyo.jp +arakawa.tokyo.jp +bunkyo.tokyo.jp +chiyoda.tokyo.jp +chofu.tokyo.jp +chuo.tokyo.jp +edogawa.tokyo.jp +fuchu.tokyo.jp +fussa.tokyo.jp +hachijo.tokyo.jp +hachioji.tokyo.jp +hamura.tokyo.jp +higashikurume.tokyo.jp +higashimurayama.tokyo.jp +higashiyamato.tokyo.jp +hino.tokyo.jp +hinode.tokyo.jp +hinohara.tokyo.jp +inagi.tokyo.jp +itabashi.tokyo.jp +katsushika.tokyo.jp +kita.tokyo.jp +kiyose.tokyo.jp +kodaira.tokyo.jp +koganei.tokyo.jp +kokubunji.tokyo.jp +komae.tokyo.jp +koto.tokyo.jp +kouzushima.tokyo.jp +kunitachi.tokyo.jp +machida.tokyo.jp +meguro.tokyo.jp +minato.tokyo.jp +mitaka.tokyo.jp +mizuho.tokyo.jp +musashimurayama.tokyo.jp +musashino.tokyo.jp +nakano.tokyo.jp +nerima.tokyo.jp +ogasawara.tokyo.jp +okutama.tokyo.jp +ome.tokyo.jp +oshima.tokyo.jp +ota.tokyo.jp +setagaya.tokyo.jp +shibuya.tokyo.jp +shinagawa.tokyo.jp +shinjuku.tokyo.jp +suginami.tokyo.jp +sumida.tokyo.jp +tachikawa.tokyo.jp +taito.tokyo.jp +tama.tokyo.jp +toshima.tokyo.jp +chizu.tottori.jp +hino.tottori.jp +kawahara.tottori.jp +koge.tottori.jp +kotoura.tottori.jp +misasa.tottori.jp +nanbu.tottori.jp +nichinan.tottori.jp +sakaiminato.tottori.jp +tottori.tottori.jp +wakasa.tottori.jp +yazu.tottori.jp +yonago.tottori.jp +asahi.toyama.jp +fuchu.toyama.jp +fukumitsu.toyama.jp +funahashi.toyama.jp +himi.toyama.jp +imizu.toyama.jp +inami.toyama.jp +johana.toyama.jp +kamiichi.toyama.jp +kurobe.toyama.jp +nakaniikawa.toyama.jp +namerikawa.toyama.jp +nanto.toyama.jp +nyuzen.toyama.jp +oyabe.toyama.jp +taira.toyama.jp +takaoka.toyama.jp +tateyama.toyama.jp +toga.toyama.jp +tonami.toyama.jp +toyama.toyama.jp +unazuki.toyama.jp +uozu.toyama.jp +yamada.toyama.jp +arida.wakayama.jp +aridagawa.wakayama.jp +gobo.wakayama.jp +hashimoto.wakayama.jp +hidaka.wakayama.jp +hirogawa.wakayama.jp +inami.wakayama.jp +iwade.wakayama.jp +kainan.wakayama.jp +kamitonda.wakayama.jp +katsuragi.wakayama.jp +kimino.wakayama.jp +kinokawa.wakayama.jp +kitayama.wakayama.jp +koya.wakayama.jp +koza.wakayama.jp +kozagawa.wakayama.jp +kudoyama.wakayama.jp +kushimoto.wakayama.jp +mihama.wakayama.jp +misato.wakayama.jp +nachikatsuura.wakayama.jp +shingu.wakayama.jp +shirahama.wakayama.jp +taiji.wakayama.jp +tanabe.wakayama.jp +wakayama.wakayama.jp +yuasa.wakayama.jp +yura.wakayama.jp +asahi.yamagata.jp +funagata.yamagata.jp +higashine.yamagata.jp +iide.yamagata.jp +kahoku.yamagata.jp +kaminoyama.yamagata.jp +kaneyama.yamagata.jp +kawanishi.yamagata.jp +mamurogawa.yamagata.jp +mikawa.yamagata.jp +murayama.yamagata.jp +nagai.yamagata.jp +nakayama.yamagata.jp +nanyo.yamagata.jp +nishikawa.yamagata.jp +obanazawa.yamagata.jp +oe.yamagata.jp +oguni.yamagata.jp +ohkura.yamagata.jp +oishida.yamagata.jp +sagae.yamagata.jp +sakata.yamagata.jp +sakegawa.yamagata.jp +shinjo.yamagata.jp +shirataka.yamagata.jp +shonai.yamagata.jp +takahata.yamagata.jp +tendo.yamagata.jp +tozawa.yamagata.jp +tsuruoka.yamagata.jp +yamagata.yamagata.jp +yamanobe.yamagata.jp +yonezawa.yamagata.jp +yuza.yamagata.jp +abu.yamaguchi.jp +hagi.yamaguchi.jp +hikari.yamaguchi.jp +hofu.yamaguchi.jp +iwakuni.yamaguchi.jp +kudamatsu.yamaguchi.jp +mitou.yamaguchi.jp +nagato.yamaguchi.jp +oshima.yamaguchi.jp +shimonoseki.yamaguchi.jp +shunan.yamaguchi.jp +tabuse.yamaguchi.jp +tokuyama.yamaguchi.jp +toyota.yamaguchi.jp +ube.yamaguchi.jp +yuu.yamaguchi.jp +chuo.yamanashi.jp +doshi.yamanashi.jp +fuefuki.yamanashi.jp +fujikawa.yamanashi.jp +fujikawaguchiko.yamanashi.jp +fujiyoshida.yamanashi.jp +hayakawa.yamanashi.jp +hokuto.yamanashi.jp +ichikawamisato.yamanashi.jp +kai.yamanashi.jp +kofu.yamanashi.jp +koshu.yamanashi.jp +kosuge.yamanashi.jp +minami-alps.yamanashi.jp +minobu.yamanashi.jp +nakamichi.yamanashi.jp +nanbu.yamanashi.jp +narusawa.yamanashi.jp +nirasaki.yamanashi.jp +nishikatsura.yamanashi.jp +oshino.yamanashi.jp +otsuki.yamanashi.jp +showa.yamanashi.jp +tabayama.yamanashi.jp +tsuru.yamanashi.jp +uenohara.yamanashi.jp +yamanakako.yamanashi.jp +yamanashi.yamanashi.jp + +// ke : http://www.kenic.or.ke/index.php?option=com_content&task=view&id=117&Itemid=145 +*.ke + +// kg : http://www.domain.kg/dmn_n.html +kg +org.kg +net.kg +com.kg +edu.kg +gov.kg +mil.kg + +// kh : http://www.mptc.gov.kh/dns_registration.htm +*.kh + +// ki : http://www.ki/dns/index.html +ki +edu.ki +biz.ki +net.ki +org.ki +gov.ki +info.ki +com.ki + +// km : https://en.wikipedia.org/wiki/.km +// http://www.domaine.km/documents/charte.doc +km +org.km +nom.km +gov.km +prd.km +tm.km +edu.km +mil.km +ass.km +com.km +// These are only mentioned as proposed suggestions at domaine.km, but +// https://en.wikipedia.org/wiki/.km says they're available for registration: +coop.km +asso.km +presse.km +medecin.km +notaires.km +pharmaciens.km +veterinaire.km +gouv.km + +// kn : https://en.wikipedia.org/wiki/.kn +// http://www.dot.kn/domainRules.html +kn +net.kn +org.kn +edu.kn +gov.kn + +// kp : http://www.kcce.kp/en_index.php +kp +com.kp +edu.kp +gov.kp +org.kp +rep.kp +tra.kp + +// kr : https://en.wikipedia.org/wiki/.kr +// see also: http://domain.nida.or.kr/eng/registration.jsp +kr +ac.kr +co.kr +es.kr +go.kr +hs.kr +kg.kr +mil.kr +ms.kr +ne.kr +or.kr +pe.kr +re.kr +sc.kr +// kr geographical names +busan.kr +chungbuk.kr +chungnam.kr +daegu.kr +daejeon.kr +gangwon.kr +gwangju.kr +gyeongbuk.kr +gyeonggi.kr +gyeongnam.kr +incheon.kr +jeju.kr +jeonbuk.kr +jeonnam.kr +seoul.kr +ulsan.kr + +// kw : https://en.wikipedia.org/wiki/.kw +*.kw + +// ky : http://www.icta.ky/da_ky_reg_dom.php +// Confirmed by registry 2008-06-17 +ky +edu.ky +gov.ky +com.ky +org.ky +net.ky + +// kz : https://en.wikipedia.org/wiki/.kz +// see also: http://www.nic.kz/rules/index.jsp +kz +org.kz +edu.kz +net.kz +gov.kz +mil.kz +com.kz + +// la : https://en.wikipedia.org/wiki/.la +// Submitted by registry +la +int.la +net.la +info.la +edu.la +gov.la +per.la +com.la +org.la + +// lb : https://en.wikipedia.org/wiki/.lb +// Submitted by registry +lb +com.lb +edu.lb +gov.lb +net.lb +org.lb + +// lc : https://en.wikipedia.org/wiki/.lc +// see also: http://www.nic.lc/rules.htm +lc +com.lc +net.lc +co.lc +org.lc +edu.lc +gov.lc + +// li : https://en.wikipedia.org/wiki/.li +li + +// lk : http://www.nic.lk/seclevpr.html +lk +gov.lk +sch.lk +net.lk +int.lk +com.lk +org.lk +edu.lk +ngo.lk +soc.lk +web.lk +ltd.lk +assn.lk +grp.lk +hotel.lk +ac.lk + +// lr : http://psg.com/dns/lr/lr.txt +// Submitted by registry +lr +com.lr +edu.lr +gov.lr +org.lr +net.lr + +// ls : https://en.wikipedia.org/wiki/.ls +ls +co.ls +org.ls + +// lt : https://en.wikipedia.org/wiki/.lt +lt +// gov.lt : http://www.gov.lt/index_en.php +gov.lt + +// lu : http://www.dns.lu/en/ +lu + +// lv : http://www.nic.lv/DNS/En/generic.php +lv +com.lv +edu.lv +gov.lv +org.lv +mil.lv +id.lv +net.lv +asn.lv +conf.lv + +// ly : http://www.nic.ly/regulations.php +ly +com.ly +net.ly +gov.ly +plc.ly +edu.ly +sch.ly +med.ly +org.ly +id.ly + +// ma : https://en.wikipedia.org/wiki/.ma +// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf +ma +co.ma +net.ma +gov.ma +org.ma +ac.ma +press.ma + +// mc : http://www.nic.mc/ +mc +tm.mc +asso.mc + +// md : https://en.wikipedia.org/wiki/.md +md + +// me : https://en.wikipedia.org/wiki/.me +me +co.me +net.me +org.me +edu.me +ac.me +gov.me +its.me +priv.me + +// mg : http://nic.mg/nicmg/?page_id=39 +mg +org.mg +nom.mg +gov.mg +prd.mg +tm.mg +edu.mg +mil.mg +com.mg +co.mg + +// mh : https://en.wikipedia.org/wiki/.mh +mh + +// mil : https://en.wikipedia.org/wiki/.mil +mil + +// mk : https://en.wikipedia.org/wiki/.mk +// see also: http://dns.marnet.net.mk/postapka.php +mk +com.mk +org.mk +net.mk +edu.mk +gov.mk +inf.mk +name.mk + +// ml : http://www.gobin.info/domainname/ml-template.doc +// see also: https://en.wikipedia.org/wiki/.ml +ml +com.ml +edu.ml +gouv.ml +gov.ml +net.ml +org.ml +presse.ml + +// mm : https://en.wikipedia.org/wiki/.mm +*.mm + +// mn : https://en.wikipedia.org/wiki/.mn +mn +gov.mn +edu.mn +org.mn + +// mo : http://www.monic.net.mo/ +mo +com.mo +net.mo +org.mo +edu.mo +gov.mo + +// mobi : https://en.wikipedia.org/wiki/.mobi +mobi + +// mp : http://www.dot.mp/ +// Confirmed by registry 2008-06-17 +mp + +// mq : https://en.wikipedia.org/wiki/.mq +mq + +// mr : https://en.wikipedia.org/wiki/.mr +mr +gov.mr + +// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf +ms +com.ms +edu.ms +gov.ms +net.ms +org.ms + +// mt : https://www.nic.org.mt/go/policy +// Submitted by registry +mt +com.mt +edu.mt +net.mt +org.mt + +// mu : https://en.wikipedia.org/wiki/.mu +mu +com.mu +net.mu +org.mu +gov.mu +ac.mu +co.mu +or.mu + +// museum : http://about.museum/naming/ +// http://index.museum/ +museum +academy.museum +agriculture.museum +air.museum +airguard.museum +alabama.museum +alaska.museum +amber.museum +ambulance.museum +american.museum +americana.museum +americanantiques.museum +americanart.museum +amsterdam.museum +and.museum +annefrank.museum +anthro.museum +anthropology.museum +antiques.museum +aquarium.museum +arboretum.museum +archaeological.museum +archaeology.museum +architecture.museum +art.museum +artanddesign.museum +artcenter.museum +artdeco.museum +arteducation.museum +artgallery.museum +arts.museum +artsandcrafts.museum +asmatart.museum +assassination.museum +assisi.museum +association.museum +astronomy.museum +atlanta.museum +austin.museum +australia.museum +automotive.museum +aviation.museum +axis.museum +badajoz.museum +baghdad.museum +bahn.museum +bale.museum +baltimore.museum +barcelona.museum +baseball.museum +basel.museum +baths.museum +bauern.museum +beauxarts.museum +beeldengeluid.museum +bellevue.museum +bergbau.museum +berkeley.museum +berlin.museum +bern.museum +bible.museum +bilbao.museum +bill.museum +birdart.museum +birthplace.museum +bonn.museum +boston.museum +botanical.museum +botanicalgarden.museum +botanicgarden.museum +botany.museum +brandywinevalley.museum +brasil.museum +bristol.museum +british.museum +britishcolumbia.museum +broadcast.museum +brunel.museum +brussel.museum +brussels.museum +bruxelles.museum +building.museum +burghof.museum +bus.museum +bushey.museum +cadaques.museum +california.museum +cambridge.museum +can.museum +canada.museum +capebreton.museum +carrier.museum +cartoonart.museum +casadelamoneda.museum +castle.museum +castres.museum +celtic.museum +center.museum +chattanooga.museum +cheltenham.museum +chesapeakebay.museum +chicago.museum +children.museum +childrens.museum +childrensgarden.museum +chiropractic.museum +chocolate.museum +christiansburg.museum +cincinnati.museum +cinema.museum +circus.museum +civilisation.museum +civilization.museum +civilwar.museum +clinton.museum +clock.museum +coal.museum +coastaldefence.museum +cody.museum +coldwar.museum +collection.museum +colonialwilliamsburg.museum +coloradoplateau.museum +columbia.museum +columbus.museum +communication.museum +communications.museum +community.museum +computer.museum +computerhistory.museum +comunicações.museum +contemporary.museum +contemporaryart.museum +convent.museum +copenhagen.museum +corporation.museum +correios-e-telecomunicações.museum +corvette.museum +costume.museum +countryestate.museum +county.museum +crafts.museum +cranbrook.museum +creation.museum +cultural.museum +culturalcenter.museum +culture.museum +cyber.museum +cymru.museum +dali.museum +dallas.museum +database.museum +ddr.museum +decorativearts.museum +delaware.museum +delmenhorst.museum +denmark.museum +depot.museum +design.museum +detroit.museum +dinosaur.museum +discovery.museum +dolls.museum +donostia.museum +durham.museum +eastafrica.museum +eastcoast.museum +education.museum +educational.museum +egyptian.museum +eisenbahn.museum +elburg.museum +elvendrell.museum +embroidery.museum +encyclopedic.museum +england.museum +entomology.museum +environment.museum +environmentalconservation.museum +epilepsy.museum +essex.museum +estate.museum +ethnology.museum +exeter.museum +exhibition.museum +family.museum +farm.museum +farmequipment.museum +farmers.museum +farmstead.museum +field.museum +figueres.museum +filatelia.museum +film.museum +fineart.museum +finearts.museum +finland.museum +flanders.museum +florida.museum +force.museum +fortmissoula.museum +fortworth.museum +foundation.museum +francaise.museum +frankfurt.museum +franziskaner.museum +freemasonry.museum +freiburg.museum +fribourg.museum +frog.museum +fundacio.museum +furniture.museum +gallery.museum +garden.museum +gateway.museum +geelvinck.museum +gemological.museum +geology.museum +georgia.museum +giessen.museum +glas.museum +glass.museum +gorge.museum +grandrapids.museum +graz.museum +guernsey.museum +halloffame.museum +hamburg.museum +handson.museum +harvestcelebration.museum +hawaii.museum +health.museum +heimatunduhren.museum +hellas.museum +helsinki.museum +hembygdsforbund.museum +heritage.museum +histoire.museum +historical.museum +historicalsociety.museum +historichouses.museum +historisch.museum +historisches.museum +history.museum +historyofscience.museum +horology.museum +house.museum +humanities.museum +illustration.museum +imageandsound.museum +indian.museum +indiana.museum +indianapolis.museum +indianmarket.museum +intelligence.museum +interactive.museum +iraq.museum +iron.museum +isleofman.museum +jamison.museum +jefferson.museum +jerusalem.museum +jewelry.museum +jewish.museum +jewishart.museum +jfk.museum +journalism.museum +judaica.museum +judygarland.museum +juedisches.museum +juif.museum +karate.museum +karikatur.museum +kids.museum +koebenhavn.museum +koeln.museum +kunst.museum +kunstsammlung.museum +kunstunddesign.museum +labor.museum +labour.museum +lajolla.museum +lancashire.museum +landes.museum +lans.museum +läns.museum +larsson.museum +lewismiller.museum +lincoln.museum +linz.museum +living.museum +livinghistory.museum +localhistory.museum +london.museum +losangeles.museum +louvre.museum +loyalist.museum +lucerne.museum +luxembourg.museum +luzern.museum +mad.museum +madrid.museum +mallorca.museum +manchester.museum +mansion.museum +mansions.museum +manx.museum +marburg.museum +maritime.museum +maritimo.museum +maryland.museum +marylhurst.museum +media.museum +medical.museum +medizinhistorisches.museum +meeres.museum +memorial.museum +mesaverde.museum +michigan.museum +midatlantic.museum +military.museum +mill.museum +miners.museum +mining.museum +minnesota.museum +missile.museum +missoula.museum +modern.museum +moma.museum +money.museum +monmouth.museum +monticello.museum +montreal.museum +moscow.museum +motorcycle.museum +muenchen.museum +muenster.museum +mulhouse.museum +muncie.museum +museet.museum +museumcenter.museum +museumvereniging.museum +music.museum +national.museum +nationalfirearms.museum +nationalheritage.museum +nativeamerican.museum +naturalhistory.museum +naturalhistorymuseum.museum +naturalsciences.museum +nature.museum +naturhistorisches.museum +natuurwetenschappen.museum +naumburg.museum +naval.museum +nebraska.museum +neues.museum +newhampshire.museum +newjersey.museum +newmexico.museum +newport.museum +newspaper.museum +newyork.museum +niepce.museum +norfolk.museum +north.museum +nrw.museum +nuernberg.museum +nuremberg.museum +nyc.museum +nyny.museum +oceanographic.museum +oceanographique.museum +omaha.museum +online.museum +ontario.museum +openair.museum +oregon.museum +oregontrail.museum +otago.museum +oxford.museum +pacific.museum +paderborn.museum +palace.museum +paleo.museum +palmsprings.museum +panama.museum +paris.museum +pasadena.museum +pharmacy.museum +philadelphia.museum +philadelphiaarea.museum +philately.museum +phoenix.museum +photography.museum +pilots.museum +pittsburgh.museum +planetarium.museum +plantation.museum +plants.museum +plaza.museum +portal.museum +portland.museum +portlligat.museum +posts-and-telecommunications.museum +preservation.museum +presidio.museum +press.museum +project.museum +public.museum +pubol.museum +quebec.museum +railroad.museum +railway.museum +research.museum +resistance.museum +riodejaneiro.museum +rochester.museum +rockart.museum +roma.museum +russia.museum +saintlouis.museum +salem.museum +salvadordali.museum +salzburg.museum +sandiego.museum +sanfrancisco.museum +santabarbara.museum +santacruz.museum +santafe.museum +saskatchewan.museum +satx.museum +savannahga.museum +schlesisches.museum +schoenbrunn.museum +schokoladen.museum +school.museum +schweiz.museum +science.museum +scienceandhistory.museum +scienceandindustry.museum +sciencecenter.museum +sciencecenters.museum +science-fiction.museum +sciencehistory.museum +sciences.museum +sciencesnaturelles.museum +scotland.museum +seaport.museum +settlement.museum +settlers.museum +shell.museum +sherbrooke.museum +sibenik.museum +silk.museum +ski.museum +skole.museum +society.museum +sologne.museum +soundandvision.museum +southcarolina.museum +southwest.museum +space.museum +spy.museum +square.museum +stadt.museum +stalbans.museum +starnberg.museum +state.museum +stateofdelaware.museum +station.museum +steam.museum +steiermark.museum +stjohn.museum +stockholm.museum +stpetersburg.museum +stuttgart.museum +suisse.museum +surgeonshall.museum +surrey.museum +svizzera.museum +sweden.museum +sydney.museum +tank.museum +tcm.museum +technology.museum +telekommunikation.museum +television.museum +texas.museum +textile.museum +theater.museum +time.museum +timekeeping.museum +topology.museum +torino.museum +touch.museum +town.museum +transport.museum +tree.museum +trolley.museum +trust.museum +trustee.museum +uhren.museum +ulm.museum +undersea.museum +university.museum +usa.museum +usantiques.museum +usarts.museum +uscountryestate.museum +usculture.museum +usdecorativearts.museum +usgarden.museum +ushistory.museum +ushuaia.museum +uslivinghistory.museum +utah.museum +uvic.museum +valley.museum +vantaa.museum +versailles.museum +viking.museum +village.museum +virginia.museum +virtual.museum +virtuel.museum +vlaanderen.museum +volkenkunde.museum +wales.museum +wallonie.museum +war.museum +washingtondc.museum +watchandclock.museum +watch-and-clock.museum +western.museum +westfalen.museum +whaling.museum +wildlife.museum +williamsburg.museum +windmill.museum +workshop.museum +york.museum +yorkshire.museum +yosemite.museum +youth.museum +zoological.museum +zoology.museum +ירושלים.museum +иком.museum + +// mv : https://en.wikipedia.org/wiki/.mv +// "mv" included because, contra Wikipedia, google.mv exists. +mv +aero.mv +biz.mv +com.mv +coop.mv +edu.mv +gov.mv +info.mv +int.mv +mil.mv +museum.mv +name.mv +net.mv +org.mv +pro.mv + +// mw : http://www.registrar.mw/ +mw +ac.mw +biz.mw +co.mw +com.mw +coop.mw +edu.mw +gov.mw +int.mw +museum.mw +net.mw +org.mw + +// mx : http://www.nic.mx/ +// Submitted by registry +mx +com.mx +org.mx +gob.mx +edu.mx +net.mx + +// my : http://www.mynic.net.my/ +my +com.my +net.my +org.my +gov.my +edu.my +mil.my +name.my + +// mz : http://www.uem.mz/ +// Submitted by registry +mz +ac.mz +adv.mz +co.mz +edu.mz +gov.mz +mil.mz +net.mz +org.mz + +// na : http://www.na-nic.com.na/ +// http://www.info.na/domain/ +na +info.na +pro.na +name.na +school.na +or.na +dr.na +us.na +mx.na +ca.na +in.na +cc.na +tv.na +ws.na +mobi.na +co.na +com.na +org.na + +// name : has 2nd-level tlds, but there's no list of them +name + +// nc : http://www.cctld.nc/ +nc +asso.nc +nom.nc + +// ne : https://en.wikipedia.org/wiki/.ne +ne + +// net : https://en.wikipedia.org/wiki/.net +net + +// nf : https://en.wikipedia.org/wiki/.nf +nf +com.nf +net.nf +per.nf +rec.nf +web.nf +arts.nf +firm.nf +info.nf +other.nf +store.nf + +// ng : http://www.nira.org.ng/index.php/join-us/register-ng-domain/189-nira-slds +ng +com.ng +edu.ng +gov.ng +i.ng +mil.ng +mobi.ng +name.ng +net.ng +org.ng +sch.ng + +// ni : http://www.nic.ni/ +ni +ac.ni +biz.ni +co.ni +com.ni +edu.ni +gob.ni +in.ni +info.ni +int.ni +mil.ni +net.ni +nom.ni +org.ni +web.ni + +// nl : https://en.wikipedia.org/wiki/.nl +// https://www.sidn.nl/ +// ccTLD for the Netherlands +nl + +// BV.nl will be a registry for dutch BV's (besloten vennootschap) +bv.nl + +// no : http://www.norid.no/regelverk/index.en.html +// The Norwegian registry has declined to notify us of updates. The web pages +// referenced below are the official source of the data. There is also an +// announce mailing list: +// https://postlister.uninett.no/sympa/info/norid-diskusjon +no +// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html +fhs.no +vgs.no +fylkesbibl.no +folkebibl.no +museum.no +idrett.no +priv.no +// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html +mil.no +stat.no +dep.no +kommune.no +herad.no +// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html +// counties +aa.no +ah.no +bu.no +fm.no +hl.no +hm.no +jan-mayen.no +mr.no +nl.no +nt.no +of.no +ol.no +oslo.no +rl.no +sf.no +st.no +svalbard.no +tm.no +tr.no +va.no +vf.no +// primary and lower secondary schools per county +gs.aa.no +gs.ah.no +gs.bu.no +gs.fm.no +gs.hl.no +gs.hm.no +gs.jan-mayen.no +gs.mr.no +gs.nl.no +gs.nt.no +gs.of.no +gs.ol.no +gs.oslo.no +gs.rl.no +gs.sf.no +gs.st.no +gs.svalbard.no +gs.tm.no +gs.tr.no +gs.va.no +gs.vf.no +// cities +akrehamn.no +åkrehamn.no +algard.no +ålgård.no +arna.no +brumunddal.no +bryne.no +bronnoysund.no +brønnøysund.no +drobak.no +drøbak.no +egersund.no +fetsund.no +floro.no +florø.no +fredrikstad.no +hokksund.no +honefoss.no +hønefoss.no +jessheim.no +jorpeland.no +jørpeland.no +kirkenes.no +kopervik.no +krokstadelva.no +langevag.no +langevåg.no +leirvik.no +mjondalen.no +mjøndalen.no +mo-i-rana.no +mosjoen.no +mosjøen.no +nesoddtangen.no +orkanger.no +osoyro.no +osøyro.no +raholt.no +råholt.no +sandnessjoen.no +sandnessjøen.no +skedsmokorset.no +slattum.no +spjelkavik.no +stathelle.no +stavern.no +stjordalshalsen.no +stjørdalshalsen.no +tananger.no +tranby.no +vossevangen.no +// communities +afjord.no +åfjord.no +agdenes.no +al.no +ål.no +alesund.no +ålesund.no +alstahaug.no +alta.no +áltá.no +alaheadju.no +álaheadju.no +alvdal.no +amli.no +åmli.no +amot.no +åmot.no +andebu.no +andoy.no +andøy.no +andasuolo.no +ardal.no +årdal.no +aremark.no +arendal.no +ås.no +aseral.no +åseral.no +asker.no +askim.no +askvoll.no +askoy.no +askøy.no +asnes.no +åsnes.no +audnedaln.no +aukra.no +aure.no +aurland.no +aurskog-holand.no +aurskog-høland.no +austevoll.no +austrheim.no +averoy.no +averøy.no +balestrand.no +ballangen.no +balat.no +bálát.no +balsfjord.no +bahccavuotna.no +báhccavuotna.no +bamble.no +bardu.no +beardu.no +beiarn.no +bajddar.no +bájddar.no +baidar.no +báidár.no +berg.no +bergen.no +berlevag.no +berlevåg.no +bearalvahki.no +bearalváhki.no +bindal.no +birkenes.no +bjarkoy.no +bjarkøy.no +bjerkreim.no +bjugn.no +bodo.no +bodø.no +badaddja.no +bådåddjå.no +budejju.no +bokn.no +bremanger.no +bronnoy.no +brønnøy.no +bygland.no +bykle.no +barum.no +bærum.no +bo.telemark.no +bø.telemark.no +bo.nordland.no +bø.nordland.no +bievat.no +bievát.no +bomlo.no +bømlo.no +batsfjord.no +båtsfjord.no +bahcavuotna.no +báhcavuotna.no +dovre.no +drammen.no +drangedal.no +dyroy.no +dyrøy.no +donna.no +dønna.no +eid.no +eidfjord.no +eidsberg.no +eidskog.no +eidsvoll.no +eigersund.no +elverum.no +enebakk.no +engerdal.no +etne.no +etnedal.no +evenes.no +evenassi.no +evenášši.no +evje-og-hornnes.no +farsund.no +fauske.no +fuossko.no +fuoisku.no +fedje.no +fet.no +finnoy.no +finnøy.no +fitjar.no +fjaler.no +fjell.no +flakstad.no +flatanger.no +flekkefjord.no +flesberg.no +flora.no +fla.no +flå.no +folldal.no +forsand.no +fosnes.no +frei.no +frogn.no +froland.no +frosta.no +frana.no +fræna.no +froya.no +frøya.no +fusa.no +fyresdal.no +forde.no +førde.no +gamvik.no +gangaviika.no +gáŋgaviika.no +gaular.no +gausdal.no +gildeskal.no +gildeskål.no +giske.no +gjemnes.no +gjerdrum.no +gjerstad.no +gjesdal.no +gjovik.no +gjøvik.no +gloppen.no +gol.no +gran.no +grane.no +granvin.no +gratangen.no +grimstad.no +grong.no +kraanghke.no +kråanghke.no +grue.no +gulen.no +hadsel.no +halden.no +halsa.no +hamar.no +hamaroy.no +habmer.no +hábmer.no +hapmir.no +hápmir.no +hammerfest.no +hammarfeasta.no +hámmárfeasta.no +haram.no +hareid.no +harstad.no +hasvik.no +aknoluokta.no +ákŋoluokta.no +hattfjelldal.no +aarborte.no +haugesund.no +hemne.no +hemnes.no +hemsedal.no +heroy.more-og-romsdal.no +herøy.møre-og-romsdal.no +heroy.nordland.no +herøy.nordland.no +hitra.no +hjartdal.no +hjelmeland.no +hobol.no +hobøl.no +hof.no +hol.no +hole.no +holmestrand.no +holtalen.no +holtålen.no +hornindal.no +horten.no +hurdal.no +hurum.no +hvaler.no +hyllestad.no +hagebostad.no +hægebostad.no +hoyanger.no +høyanger.no +hoylandet.no +høylandet.no +ha.no +hå.no +ibestad.no +inderoy.no +inderøy.no +iveland.no +jevnaker.no +jondal.no +jolster.no +jølster.no +karasjok.no +karasjohka.no +kárášjohka.no +karlsoy.no +galsa.no +gálsá.no +karmoy.no +karmøy.no +kautokeino.no +guovdageaidnu.no +klepp.no +klabu.no +klæbu.no +kongsberg.no +kongsvinger.no +kragero.no +kragerø.no +kristiansand.no +kristiansund.no +krodsherad.no +krødsherad.no +kvalsund.no +rahkkeravju.no +ráhkkerávju.no +kvam.no +kvinesdal.no +kvinnherad.no +kviteseid.no +kvitsoy.no +kvitsøy.no +kvafjord.no +kvæfjord.no +giehtavuoatna.no +kvanangen.no +kvænangen.no +navuotna.no +návuotna.no +kafjord.no +kåfjord.no +gaivuotna.no +gáivuotna.no +larvik.no +lavangen.no +lavagis.no +loabat.no +loabát.no +lebesby.no +davvesiida.no +leikanger.no +leirfjord.no +leka.no +leksvik.no +lenvik.no +leangaviika.no +leaŋgaviika.no +lesja.no +levanger.no +lier.no +lierne.no +lillehammer.no +lillesand.no +lindesnes.no +lindas.no +lindås.no +lom.no +loppa.no +lahppi.no +láhppi.no +lund.no +lunner.no +luroy.no +lurøy.no +luster.no +lyngdal.no +lyngen.no +ivgu.no +lardal.no +lerdal.no +lærdal.no +lodingen.no +lødingen.no +lorenskog.no +lørenskog.no +loten.no +løten.no +malvik.no +masoy.no +måsøy.no +muosat.no +muosát.no +mandal.no +marker.no +marnardal.no +masfjorden.no +meland.no +meldal.no +melhus.no +meloy.no +meløy.no +meraker.no +meråker.no +moareke.no +moåreke.no +midsund.no +midtre-gauldal.no +modalen.no +modum.no +molde.no +moskenes.no +moss.no +mosvik.no +malselv.no +målselv.no +malatvuopmi.no +málatvuopmi.no +namdalseid.no +aejrie.no +namsos.no +namsskogan.no +naamesjevuemie.no +nååmesjevuemie.no +laakesvuemie.no +nannestad.no +narvik.no +narviika.no +naustdal.no +nedre-eiker.no +nes.akershus.no +nes.buskerud.no +nesna.no +nesodden.no +nesseby.no +unjarga.no +unjárga.no +nesset.no +nissedal.no +nittedal.no +nord-aurdal.no +nord-fron.no +nord-odal.no +norddal.no +nordkapp.no +davvenjarga.no +davvenjárga.no +nordre-land.no +nordreisa.no +raisa.no +ráisa.no +nore-og-uvdal.no +notodden.no +naroy.no +nærøy.no +notteroy.no +nøtterøy.no +odda.no +oksnes.no +øksnes.no +oppdal.no +oppegard.no +oppegård.no +orkdal.no +orland.no +ørland.no +orskog.no +ørskog.no +orsta.no +ørsta.no +os.hedmark.no +os.hordaland.no +osen.no +osteroy.no +osterøy.no +ostre-toten.no +østre-toten.no +overhalla.no +ovre-eiker.no +øvre-eiker.no +oyer.no +øyer.no +oygarden.no +øygarden.no +oystre-slidre.no +øystre-slidre.no +porsanger.no +porsangu.no +porsáŋgu.no +porsgrunn.no +radoy.no +radøy.no +rakkestad.no +rana.no +ruovat.no +randaberg.no +rauma.no +rendalen.no +rennebu.no +rennesoy.no +rennesøy.no +rindal.no +ringebu.no +ringerike.no +ringsaker.no +rissa.no +risor.no +risør.no +roan.no +rollag.no +rygge.no +ralingen.no +rælingen.no +rodoy.no +rødøy.no +romskog.no +rømskog.no +roros.no +røros.no +rost.no +røst.no +royken.no +røyken.no +royrvik.no +røyrvik.no +rade.no +råde.no +salangen.no +siellak.no +saltdal.no +salat.no +sálát.no +sálat.no +samnanger.no +sande.more-og-romsdal.no +sande.møre-og-romsdal.no +sande.vestfold.no +sandefjord.no +sandnes.no +sandoy.no +sandøy.no +sarpsborg.no +sauda.no +sauherad.no +sel.no +selbu.no +selje.no +seljord.no +sigdal.no +siljan.no +sirdal.no +skaun.no +skedsmo.no +ski.no +skien.no +skiptvet.no +skjervoy.no +skjervøy.no +skierva.no +skiervá.no +skjak.no +skjåk.no +skodje.no +skanland.no +skånland.no +skanit.no +skánit.no +smola.no +smøla.no +snillfjord.no +snasa.no +snåsa.no +snoasa.no +snaase.no +snåase.no +sogndal.no +sokndal.no +sola.no +solund.no +songdalen.no +sortland.no +spydeberg.no +stange.no +stavanger.no +steigen.no +steinkjer.no +stjordal.no +stjørdal.no +stokke.no +stor-elvdal.no +stord.no +stordal.no +storfjord.no +omasvuotna.no +strand.no +stranda.no +stryn.no +sula.no +suldal.no +sund.no +sunndal.no +surnadal.no +sveio.no +svelvik.no +sykkylven.no +sogne.no +søgne.no +somna.no +sømna.no +sondre-land.no +søndre-land.no +sor-aurdal.no +sør-aurdal.no +sor-fron.no +sør-fron.no +sor-odal.no +sør-odal.no +sor-varanger.no +sør-varanger.no +matta-varjjat.no +mátta-várjjat.no +sorfold.no +sørfold.no +sorreisa.no +sørreisa.no +sorum.no +sørum.no +tana.no +deatnu.no +time.no +tingvoll.no +tinn.no +tjeldsund.no +dielddanuorri.no +tjome.no +tjøme.no +tokke.no +tolga.no +torsken.no +tranoy.no +tranøy.no +tromso.no +tromsø.no +tromsa.no +romsa.no +trondheim.no +troandin.no +trysil.no +trana.no +træna.no +trogstad.no +trøgstad.no +tvedestrand.no +tydal.no +tynset.no +tysfjord.no +divtasvuodna.no +divttasvuotna.no +tysnes.no +tysvar.no +tysvær.no +tonsberg.no +tønsberg.no +ullensaker.no +ullensvang.no +ulvik.no +utsira.no +vadso.no +vadsø.no +cahcesuolo.no +čáhcesuolo.no +vaksdal.no +valle.no +vang.no +vanylven.no +vardo.no +vardø.no +varggat.no +várggát.no +vefsn.no +vaapste.no +vega.no +vegarshei.no +vegårshei.no +vennesla.no +verdal.no +verran.no +vestby.no +vestnes.no +vestre-slidre.no +vestre-toten.no +vestvagoy.no +vestvågøy.no +vevelstad.no +vik.no +vikna.no +vindafjord.no +volda.no +voss.no +varoy.no +værøy.no +vagan.no +vågan.no +voagat.no +vagsoy.no +vågsøy.no +vaga.no +vågå.no +valer.ostfold.no +våler.østfold.no +valer.hedmark.no +våler.hedmark.no + +// np : http://www.mos.com.np/register.html +*.np + +// nr : http://cenpac.net.nr/dns/index.html +// Submitted by registry +nr +biz.nr +info.nr +gov.nr +edu.nr +org.nr +net.nr +com.nr + +// nu : https://en.wikipedia.org/wiki/.nu +nu + +// nz : https://en.wikipedia.org/wiki/.nz +// Submitted by registry +nz +ac.nz +co.nz +cri.nz +geek.nz +gen.nz +govt.nz +health.nz +iwi.nz +kiwi.nz +maori.nz +mil.nz +māori.nz +net.nz +org.nz +parliament.nz +school.nz + +// om : https://en.wikipedia.org/wiki/.om +om +co.om +com.om +edu.om +gov.om +med.om +museum.om +net.om +org.om +pro.om + +// onion : https://tools.ietf.org/html/rfc7686 +onion + +// org : https://en.wikipedia.org/wiki/.org +org + +// pa : http://www.nic.pa/ +// Some additional second level "domains" resolve directly as hostnames, such as +// pannet.pa, so we add a rule for "pa". +pa +ac.pa +gob.pa +com.pa +org.pa +sld.pa +edu.pa +net.pa +ing.pa +abo.pa +med.pa +nom.pa + +// pe : https://www.nic.pe/InformeFinalComision.pdf +pe +edu.pe +gob.pe +nom.pe +mil.pe +org.pe +com.pe +net.pe + +// pf : http://www.gobin.info/domainname/formulaire-pf.pdf +pf +com.pf +org.pf +edu.pf + +// pg : https://en.wikipedia.org/wiki/.pg +*.pg + +// ph : http://www.domains.ph/FAQ2.asp +// Submitted by registry +ph +com.ph +net.ph +org.ph +gov.ph +edu.ph +ngo.ph +mil.ph +i.ph + +// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK +pk +com.pk +net.pk +edu.pk +org.pk +fam.pk +biz.pk +web.pk +gov.pk +gob.pk +gok.pk +gon.pk +gop.pk +gos.pk +info.pk + +// pl http://www.dns.pl/english/index.html +// Submitted by registry +pl +com.pl +net.pl +org.pl +// pl functional domains (http://www.dns.pl/english/index.html) +aid.pl +agro.pl +atm.pl +auto.pl +biz.pl +edu.pl +gmina.pl +gsm.pl +info.pl +mail.pl +miasta.pl +media.pl +mil.pl +nieruchomosci.pl +nom.pl +pc.pl +powiat.pl +priv.pl +realestate.pl +rel.pl +sex.pl +shop.pl +sklep.pl +sos.pl +szkola.pl +targi.pl +tm.pl +tourism.pl +travel.pl +turystyka.pl +// Government domains +gov.pl +ap.gov.pl +ic.gov.pl +is.gov.pl +us.gov.pl +kmpsp.gov.pl +kppsp.gov.pl +kwpsp.gov.pl +psp.gov.pl +wskr.gov.pl +kwp.gov.pl +mw.gov.pl +ug.gov.pl +um.gov.pl +umig.gov.pl +ugim.gov.pl +upow.gov.pl +uw.gov.pl +starostwo.gov.pl +pa.gov.pl +po.gov.pl +psse.gov.pl +pup.gov.pl +rzgw.gov.pl +sa.gov.pl +so.gov.pl +sr.gov.pl +wsa.gov.pl +sko.gov.pl +uzs.gov.pl +wiih.gov.pl +winb.gov.pl +pinb.gov.pl +wios.gov.pl +witd.gov.pl +wzmiuw.gov.pl +piw.gov.pl +wiw.gov.pl +griw.gov.pl +wif.gov.pl +oum.gov.pl +sdn.gov.pl +zp.gov.pl +uppo.gov.pl +mup.gov.pl +wuoz.gov.pl +konsulat.gov.pl +oirm.gov.pl +// pl regional domains (http://www.dns.pl/english/index.html) +augustow.pl +babia-gora.pl +bedzin.pl +beskidy.pl +bialowieza.pl +bialystok.pl +bielawa.pl +bieszczady.pl +boleslawiec.pl +bydgoszcz.pl +bytom.pl +cieszyn.pl +czeladz.pl +czest.pl +dlugoleka.pl +elblag.pl +elk.pl +glogow.pl +gniezno.pl +gorlice.pl +grajewo.pl +ilawa.pl +jaworzno.pl +jelenia-gora.pl +jgora.pl +kalisz.pl +kazimierz-dolny.pl +karpacz.pl +kartuzy.pl +kaszuby.pl +katowice.pl +kepno.pl +ketrzyn.pl +klodzko.pl +kobierzyce.pl +kolobrzeg.pl +konin.pl +konskowola.pl +kutno.pl +lapy.pl +lebork.pl +legnica.pl +lezajsk.pl +limanowa.pl +lomza.pl +lowicz.pl +lubin.pl +lukow.pl +malbork.pl +malopolska.pl +mazowsze.pl +mazury.pl +mielec.pl +mielno.pl +mragowo.pl +naklo.pl +nowaruda.pl +nysa.pl +olawa.pl +olecko.pl +olkusz.pl +olsztyn.pl +opoczno.pl +opole.pl +ostroda.pl +ostroleka.pl +ostrowiec.pl +ostrowwlkp.pl +pila.pl +pisz.pl +podhale.pl +podlasie.pl +polkowice.pl +pomorze.pl +pomorskie.pl +prochowice.pl +pruszkow.pl +przeworsk.pl +pulawy.pl +radom.pl +rawa-maz.pl +rybnik.pl +rzeszow.pl +sanok.pl +sejny.pl +slask.pl +slupsk.pl +sosnowiec.pl +stalowa-wola.pl +skoczow.pl +starachowice.pl +stargard.pl +suwalki.pl +swidnica.pl +swiebodzin.pl +swinoujscie.pl +szczecin.pl +szczytno.pl +tarnobrzeg.pl +tgory.pl +turek.pl +tychy.pl +ustka.pl +walbrzych.pl +warmia.pl +warszawa.pl +waw.pl +wegrow.pl +wielun.pl +wlocl.pl +wloclawek.pl +wodzislaw.pl +wolomin.pl +wroclaw.pl +zachpomor.pl +zagan.pl +zarow.pl +zgora.pl +zgorzelec.pl + +// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +pm + +// pn : http://www.government.pn/PnRegistry/policies.htm +pn +gov.pn +co.pn +org.pn +edu.pn +net.pn + +// post : https://en.wikipedia.org/wiki/.post +post + +// pr : http://www.nic.pr/index.asp?f=1 +pr +com.pr +net.pr +org.pr +gov.pr +edu.pr +isla.pr +pro.pr +biz.pr +info.pr +name.pr +// these aren't mentioned on nic.pr, but on https://en.wikipedia.org/wiki/.pr +est.pr +prof.pr +ac.pr + +// pro : http://registry.pro/get-pro +pro +aaa.pro +aca.pro +acct.pro +avocat.pro +bar.pro +cpa.pro +eng.pro +jur.pro +law.pro +med.pro +recht.pro + +// ps : https://en.wikipedia.org/wiki/.ps +// http://www.nic.ps/registration/policy.html#reg +ps +edu.ps +gov.ps +sec.ps +plo.ps +com.ps +org.ps +net.ps + +// pt : http://online.dns.pt/dns/start_dns +pt +net.pt +gov.pt +org.pt +edu.pt +int.pt +publ.pt +com.pt +nome.pt + +// pw : https://en.wikipedia.org/wiki/.pw +pw +co.pw +ne.pw +or.pw +ed.pw +go.pw +belau.pw + +// py : http://www.nic.py/pautas.html#seccion_9 +// Submitted by registry +py +com.py +coop.py +edu.py +gov.py +mil.py +net.py +org.py + +// qa : http://domains.qa/en/ +qa +com.qa +edu.qa +gov.qa +mil.qa +name.qa +net.qa +org.qa +sch.qa + +// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs +re +asso.re +com.re +nom.re + +// ro : http://www.rotld.ro/ +ro +arts.ro +com.ro +firm.ro +info.ro +nom.ro +nt.ro +org.ro +rec.ro +store.ro +tm.ro +www.ro + +// rs : https://www.rnids.rs/en/domains/national-domains +rs +ac.rs +co.rs +edu.rs +gov.rs +in.rs +org.rs + +// ru : https://cctld.ru/en/domains/domens_ru/reserved/ +ru +ac.ru +edu.ru +gov.ru +int.ru +mil.ru +test.ru + +// rw : http://www.nic.rw/cgi-bin/policy.pl +rw +gov.rw +net.rw +edu.rw +ac.rw +com.rw +co.rw +int.rw +mil.rw +gouv.rw + +// sa : http://www.nic.net.sa/ +sa +com.sa +net.sa +org.sa +gov.sa +med.sa +pub.sa +edu.sa +sch.sa + +// sb : http://www.sbnic.net.sb/ +// Submitted by registry +sb +com.sb +edu.sb +gov.sb +net.sb +org.sb + +// sc : http://www.nic.sc/ +sc +com.sc +gov.sc +net.sc +org.sc +edu.sc + +// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm +// Submitted by registry +sd +com.sd +net.sd +org.sd +edu.sd +med.sd +tv.sd +gov.sd +info.sd + +// se : https://en.wikipedia.org/wiki/.se +// Submitted by registry +se +a.se +ac.se +b.se +bd.se +brand.se +c.se +d.se +e.se +f.se +fh.se +fhsk.se +fhv.se +g.se +h.se +i.se +k.se +komforb.se +kommunalforbund.se +komvux.se +l.se +lanbib.se +m.se +n.se +naturbruksgymn.se +o.se +org.se +p.se +parti.se +pp.se +press.se +r.se +s.se +t.se +tm.se +u.se +w.se +x.se +y.se +z.se + +// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines +sg +com.sg +net.sg +org.sg +gov.sg +edu.sg +per.sg + +// sh : http://www.nic.sh/registrar.html +sh +com.sh +net.sh +gov.sh +org.sh +mil.sh + +// si : https://en.wikipedia.org/wiki/.si +si + +// sj : No registrations at this time. +// Submitted by registry +sj + +// sk : https://en.wikipedia.org/wiki/.sk +// list of 2nd level domains ? +sk + +// sl : http://www.nic.sl +// Submitted by registry +sl +com.sl +net.sl +edu.sl +gov.sl +org.sl + +// sm : https://en.wikipedia.org/wiki/.sm +sm + +// sn : https://en.wikipedia.org/wiki/.sn +sn +art.sn +com.sn +edu.sn +gouv.sn +org.sn +perso.sn +univ.sn + +// so : http://www.soregistry.com/ +so +com.so +net.so +org.so + +// sr : https://en.wikipedia.org/wiki/.sr +sr + +// st : http://www.nic.st/html/policyrules/ +st +co.st +com.st +consulado.st +edu.st +embaixada.st +gov.st +mil.st +net.st +org.st +principe.st +saotome.st +store.st + +// su : https://en.wikipedia.org/wiki/.su +su + +// sv : http://www.svnet.org.sv/niveldos.pdf +sv +com.sv +edu.sv +gob.sv +org.sv +red.sv + +// sx : https://en.wikipedia.org/wiki/.sx +// Submitted by registry +sx +gov.sx + +// sy : https://en.wikipedia.org/wiki/.sy +// see also: http://www.gobin.info/domainname/sy.doc +sy +edu.sy +gov.sy +net.sy +mil.sy +com.sy +org.sy + +// sz : https://en.wikipedia.org/wiki/.sz +// http://www.sispa.org.sz/ +sz +co.sz +ac.sz +org.sz + +// tc : https://en.wikipedia.org/wiki/.tc +tc + +// td : https://en.wikipedia.org/wiki/.td +td + +// tel: https://en.wikipedia.org/wiki/.tel +// http://www.telnic.org/ +tel + +// tf : https://en.wikipedia.org/wiki/.tf +tf + +// tg : https://en.wikipedia.org/wiki/.tg +// http://www.nic.tg/ +tg + +// th : https://en.wikipedia.org/wiki/.th +// Submitted by registry +th +ac.th +co.th +go.th +in.th +mi.th +net.th +or.th + +// tj : http://www.nic.tj/policy.html +tj +ac.tj +biz.tj +co.tj +com.tj +edu.tj +go.tj +gov.tj +int.tj +mil.tj +name.tj +net.tj +nic.tj +org.tj +test.tj +web.tj + +// tk : https://en.wikipedia.org/wiki/.tk +tk + +// tl : https://en.wikipedia.org/wiki/.tl +tl +gov.tl + +// tm : http://www.nic.tm/local.html +tm +com.tm +co.tm +org.tm +net.tm +nom.tm +gov.tm +mil.tm +edu.tm + +// tn : https://en.wikipedia.org/wiki/.tn +// http://whois.ati.tn/ +tn +com.tn +ens.tn +fin.tn +gov.tn +ind.tn +intl.tn +nat.tn +net.tn +org.tn +info.tn +perso.tn +tourism.tn +edunet.tn +rnrt.tn +rns.tn +rnu.tn +mincom.tn +agrinet.tn +defense.tn +turen.tn + +// to : https://en.wikipedia.org/wiki/.to +// Submitted by registry +to +com.to +gov.to +net.to +org.to +edu.to +mil.to + +// subTLDs: https://www.nic.tr/forms/eng/policies.pdf +// and: https://www.nic.tr/forms/politikalar.pdf +// Submitted by +tr +com.tr +info.tr +biz.tr +net.tr +org.tr +web.tr +gen.tr +tv.tr +av.tr +dr.tr +bbs.tr +name.tr +tel.tr +gov.tr +bel.tr +pol.tr +mil.tr +k12.tr +edu.tr +kep.tr + +// Used by Northern Cyprus +nc.tr + +// Used by government agencies of Northern Cyprus +gov.nc.tr + +// travel : https://en.wikipedia.org/wiki/.travel +travel + +// tt : http://www.nic.tt/ +tt +co.tt +com.tt +org.tt +net.tt +biz.tt +info.tt +pro.tt +int.tt +coop.tt +jobs.tt +mobi.tt +travel.tt +museum.tt +aero.tt +name.tt +gov.tt +edu.tt + +// tv : https://en.wikipedia.org/wiki/.tv +// Not listing any 2LDs as reserved since none seem to exist in practice, +// Wikipedia notwithstanding. +tv + +// tw : https://en.wikipedia.org/wiki/.tw +tw +edu.tw +gov.tw +mil.tw +com.tw +net.tw +org.tw +idv.tw +game.tw +ebiz.tw +club.tw +網路.tw +組織.tw +商業.tw + +// tz : http://www.tznic.or.tz/index.php/domains +// Submitted by registry +tz +ac.tz +co.tz +go.tz +hotel.tz +info.tz +me.tz +mil.tz +mobi.tz +ne.tz +or.tz +sc.tz +tv.tz + +// ua : https://hostmaster.ua/policy/?ua +// Submitted by registry +ua +// ua 2LD +com.ua +edu.ua +gov.ua +in.ua +net.ua +org.ua +// ua geographic names +// https://hostmaster.ua/2ld/ +cherkassy.ua +cherkasy.ua +chernigov.ua +chernihiv.ua +chernivtsi.ua +chernovtsy.ua +ck.ua +cn.ua +cr.ua +crimea.ua +cv.ua +dn.ua +dnepropetrovsk.ua +dnipropetrovsk.ua +dominic.ua +donetsk.ua +dp.ua +if.ua +ivano-frankivsk.ua +kh.ua +kharkiv.ua +kharkov.ua +kherson.ua +khmelnitskiy.ua +khmelnytskyi.ua +kiev.ua +kirovograd.ua +km.ua +kr.ua +krym.ua +ks.ua +kv.ua +kyiv.ua +lg.ua +lt.ua +lugansk.ua +lutsk.ua +lv.ua +lviv.ua +mk.ua +mykolaiv.ua +nikolaev.ua +od.ua +odesa.ua +odessa.ua +pl.ua +poltava.ua +rivne.ua +rovno.ua +rv.ua +sb.ua +sebastopol.ua +sevastopol.ua +sm.ua +sumy.ua +te.ua +ternopil.ua +uz.ua +uzhgorod.ua +vinnica.ua +vinnytsia.ua +vn.ua +volyn.ua +yalta.ua +zaporizhzhe.ua +zaporizhzhia.ua +zhitomir.ua +zhytomyr.ua +zp.ua +zt.ua + +// ug : https://www.registry.co.ug/ +ug +co.ug +or.ug +ac.ug +sc.ug +go.ug +ne.ug +com.ug +org.ug + +// uk : https://en.wikipedia.org/wiki/.uk +// Submitted by registry +uk +ac.uk +co.uk +gov.uk +ltd.uk +me.uk +net.uk +nhs.uk +org.uk +plc.uk +police.uk +*.sch.uk + +// us : https://en.wikipedia.org/wiki/.us +us +dni.us +fed.us +isa.us +kids.us +nsn.us +// us geographic names +ak.us +al.us +ar.us +as.us +az.us +ca.us +co.us +ct.us +dc.us +de.us +fl.us +ga.us +gu.us +hi.us +ia.us +id.us +il.us +in.us +ks.us +ky.us +la.us +ma.us +md.us +me.us +mi.us +mn.us +mo.us +ms.us +mt.us +nc.us +nd.us +ne.us +nh.us +nj.us +nm.us +nv.us +ny.us +oh.us +ok.us +or.us +pa.us +pr.us +ri.us +sc.us +sd.us +tn.us +tx.us +ut.us +vi.us +vt.us +va.us +wa.us +wi.us +wv.us +wy.us +// The registrar notes several more specific domains available in each state, +// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat +// haphazard; in some states these domains resolve as addresses, while in others +// only subdomains are available, or even nothing at all. We include the +// most common ones where it's clear that different sites are different +// entities. +k12.ak.us +k12.al.us +k12.ar.us +k12.as.us +k12.az.us +k12.ca.us +k12.co.us +k12.ct.us +k12.dc.us +k12.de.us +k12.fl.us +k12.ga.us +k12.gu.us +// k12.hi.us Bug 614565 - Hawaii has a state-wide DOE login +k12.ia.us +k12.id.us +k12.il.us +k12.in.us +k12.ks.us +k12.ky.us +k12.la.us +k12.ma.us +k12.md.us +k12.me.us +k12.mi.us +k12.mn.us +k12.mo.us +k12.ms.us +k12.mt.us +k12.nc.us +// k12.nd.us Bug 1028347 - Removed at request of Travis Rosso +k12.ne.us +k12.nh.us +k12.nj.us +k12.nm.us +k12.nv.us +k12.ny.us +k12.oh.us +k12.ok.us +k12.or.us +k12.pa.us +k12.pr.us +k12.ri.us +k12.sc.us +// k12.sd.us Bug 934131 - Removed at request of James Booze +k12.tn.us +k12.tx.us +k12.ut.us +k12.vi.us +k12.vt.us +k12.va.us +k12.wa.us +k12.wi.us +// k12.wv.us Bug 947705 - Removed at request of Verne Britton +k12.wy.us +cc.ak.us +cc.al.us +cc.ar.us +cc.as.us +cc.az.us +cc.ca.us +cc.co.us +cc.ct.us +cc.dc.us +cc.de.us +cc.fl.us +cc.ga.us +cc.gu.us +cc.hi.us +cc.ia.us +cc.id.us +cc.il.us +cc.in.us +cc.ks.us +cc.ky.us +cc.la.us +cc.ma.us +cc.md.us +cc.me.us +cc.mi.us +cc.mn.us +cc.mo.us +cc.ms.us +cc.mt.us +cc.nc.us +cc.nd.us +cc.ne.us +cc.nh.us +cc.nj.us +cc.nm.us +cc.nv.us +cc.ny.us +cc.oh.us +cc.ok.us +cc.or.us +cc.pa.us +cc.pr.us +cc.ri.us +cc.sc.us +cc.sd.us +cc.tn.us +cc.tx.us +cc.ut.us +cc.vi.us +cc.vt.us +cc.va.us +cc.wa.us +cc.wi.us +cc.wv.us +cc.wy.us +lib.ak.us +lib.al.us +lib.ar.us +lib.as.us +lib.az.us +lib.ca.us +lib.co.us +lib.ct.us +lib.dc.us +// lib.de.us Issue #243 - Moved to Private section at request of Ed Moore +lib.fl.us +lib.ga.us +lib.gu.us +lib.hi.us +lib.ia.us +lib.id.us +lib.il.us +lib.in.us +lib.ks.us +lib.ky.us +lib.la.us +lib.ma.us +lib.md.us +lib.me.us +lib.mi.us +lib.mn.us +lib.mo.us +lib.ms.us +lib.mt.us +lib.nc.us +lib.nd.us +lib.ne.us +lib.nh.us +lib.nj.us +lib.nm.us +lib.nv.us +lib.ny.us +lib.oh.us +lib.ok.us +lib.or.us +lib.pa.us +lib.pr.us +lib.ri.us +lib.sc.us +lib.sd.us +lib.tn.us +lib.tx.us +lib.ut.us +lib.vi.us +lib.vt.us +lib.va.us +lib.wa.us +lib.wi.us +// lib.wv.us Bug 941670 - Removed at request of Larry W Arnold +lib.wy.us +// k12.ma.us contains school districts in Massachusetts. The 4LDs are +// managed independently except for private (PVT), charter (CHTR) and +// parochial (PAROCH) schools. Those are delegated directly to the +// 5LD operators. +pvt.k12.ma.us +chtr.k12.ma.us +paroch.k12.ma.us +// Merit Network, Inc. maintains the registry for =~ /(k12|cc|lib).mi.us/ and the following +// see also: http://domreg.merit.edu +// see also: whois -h whois.domreg.merit.edu help +ann-arbor.mi.us +cog.mi.us +dst.mi.us +eaton.mi.us +gen.mi.us +mus.mi.us +tec.mi.us +washtenaw.mi.us + +// uy : http://www.nic.org.uy/ +uy +com.uy +edu.uy +gub.uy +mil.uy +net.uy +org.uy + +// uz : http://www.reg.uz/ +uz +co.uz +com.uz +net.uz +org.uz + +// va : https://en.wikipedia.org/wiki/.va +va + +// vc : https://en.wikipedia.org/wiki/.vc +// Submitted by registry +vc +com.vc +net.vc +org.vc +gov.vc +mil.vc +edu.vc + +// ve : https://registro.nic.ve/ +// Submitted by registry +ve +arts.ve +co.ve +com.ve +e12.ve +edu.ve +firm.ve +gob.ve +gov.ve +info.ve +int.ve +mil.ve +net.ve +org.ve +rec.ve +store.ve +tec.ve +web.ve + +// vg : https://en.wikipedia.org/wiki/.vg +vg + +// vi : http://www.nic.vi/newdomainform.htm +// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other +// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they +// are available for registration (which they do not seem to be). +vi +co.vi +com.vi +k12.vi +net.vi +org.vi + +// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp +vn +com.vn +net.vn +org.vn +edu.vn +gov.vn +int.vn +ac.vn +biz.vn +info.vn +name.vn +pro.vn +health.vn + +// vu : https://en.wikipedia.org/wiki/.vu +// http://www.vunic.vu/ +vu +com.vu +edu.vu +net.vu +org.vu + +// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +wf + +// ws : https://en.wikipedia.org/wiki/.ws +// http://samoanic.ws/index.dhtml +ws +com.ws +net.ws +org.ws +gov.ws +edu.ws + +// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +yt + +// IDN ccTLDs +// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then +// U-label, and follow this format: +// // A-Label ("", [, variant info]) : +// // [sponsoring org] +// U-Label + +// xn--mgbaam7a8h ("Emerat", Arabic) : AE +// http://nic.ae/english/arabicdomain/rules.jsp +امارات + +// xn--y9a3aq ("hye", Armenian) : AM +// ISOC AM (operated by .am Registry) +հայ + +// xn--54b7fta0cc ("Bangla", Bangla) : BD +বাংলা + +// xn--90ae ("bg", Bulgarian) : BG +бг + +// xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY +// Operated by .by registry +бел + +// xn--fiqs8s ("Zhongguo/China", Chinese, Simplified) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中国 + +// xn--fiqz9s ("Zhongguo/China", Chinese, Traditional) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中國 + +// xn--lgbbat1ad8j ("Algeria/Al Jazair", Arabic) : DZ +الجزائر + +// xn--wgbh1c ("Egypt/Masr", Arabic) : EG +// http://www.dotmasr.eg/ +مصر + +// xn--e1a4c ("eu", Cyrillic) : EU +ею + +// xn--node ("ge", Georgian Mkhedruli) : GE +გე + +// xn--qxam ("el", Greek) : GR +// Hellenic Ministry of Infrastructure, Transport, and Networks +ελ + +// xn--j6w193g ("Hong Kong", Chinese) : HK +// https://www2.hkirc.hk/register/rules.jsp +香港 + +// xn--2scrj9c ("Bharat", Kannada) : IN +// India +ಭಾರತ + +// xn--3hcrj9c ("Bharat", Oriya) : IN +// India +ଭାରତ + +// xn--45br5cyl ("Bharatam", Assamese) : IN +// India +ভাৰত + +// xn--h2breg3eve ("Bharatam", Sanskrit) : IN +// India +भारतम् + +// xn--h2brj9c8c ("Bharot", Santali) : IN +// India +भारोत + +// xn--mgbgu82a ("Bharat", Sindhi) : IN +// India +ڀارت + +// xn--rvc1e0am3e ("Bharatam", Malayalam) : IN +// India +ഭാരതം + +// xn--h2brj9c ("Bharat", Devanagari) : IN +// India +भारत + +// xn--mgbbh1a71e ("Bharat", Arabic) : IN +// India +بھارت + +// xn--fpcrj9c3d ("Bharat", Telugu) : IN +// India +భారత్ + +// xn--gecrj9c ("Bharat", Gujarati) : IN +// India +ભારત + +// xn--s9brj9c ("Bharat", Gurmukhi) : IN +// India +ਭਾਰਤ + +// xn--45brj9c ("Bharat", Bengali) : IN +// India +ভারত + +// xn--xkc2dl3a5ee0h ("India", Tamil) : IN +// India +இந்தியா + +// xn--mgba3a4f16a ("Iran", Persian) : IR +ایران + +// xn--mgba3a4fra ("Iran", Arabic) : IR +ايران + +// xn--mgbtx2b ("Iraq", Arabic) : IQ +// Communications and Media Commission +عراق + +// xn--mgbayh7gpa ("al-Ordon", Arabic) : JO +// National Information Technology Center (NITC) +// Royal Scientific Society, Al-Jubeiha +الاردن + +// xn--3e0b707e ("Republic of Korea", Hangul) : KR +한국 + +// xn--80ao21a ("Kaz", Kazakh) : KZ +қаз + +// xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK +// http://nic.lk +ලංකා + +// xn--xkc2al3hye2a ("Ilangai", Tamil) : LK +// http://nic.lk +இலங்கை + +// xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA +المغرب + +// xn--d1alf ("mkd", Macedonian) : MK +// MARnet +мкд + +// xn--l1acc ("mon", Mongolian) : MN +мон + +// xn--mix891f ("Macao", Chinese, Traditional) : MO +// MONIC / HNET Asia (Registry Operator for .mo) +澳門 + +// xn--mix082f ("Macao", Chinese, Simplified) : MO +澳门 + +// xn--mgbx4cd0ab ("Malaysia", Malay) : MY +مليسيا + +// xn--mgb9awbf ("Oman", Arabic) : OM +عمان + +// xn--mgbai9azgqp6j ("Pakistan", Urdu/Arabic) : PK +پاکستان + +// xn--mgbai9a5eva00b ("Pakistan", Urdu/Arabic, variant) : PK +پاكستان + +// xn--ygbi2ammx ("Falasteen", Arabic) : PS +// The Palestinian National Internet Naming Authority (PNINA) +// http://www.pnina.ps +فلسطين + +// xn--90a3ac ("srb", Cyrillic) : RS +// https://www.rnids.rs/en/domains/national-domains +срб +пр.срб +орг.срб +обр.срб +од.срб +упр.срб +ак.срб + +// xn--p1ai ("rf", Russian-Cyrillic) : RU +// http://www.cctld.ru/en/docs/rulesrf.php +рф + +// xn--wgbl6a ("Qatar", Arabic) : QA +// http://www.ict.gov.qa/ +قطر + +// xn--mgberp4a5d4ar ("AlSaudiah", Arabic) : SA +// http://www.nic.net.sa/ +السعودية + +// xn--mgberp4a5d4a87g ("AlSaudiah", Arabic, variant) : SA +السعودیة + +// xn--mgbqly7c0a67fbc ("AlSaudiah", Arabic, variant) : SA +السعودیۃ + +// xn--mgbqly7cvafr ("AlSaudiah", Arabic, variant) : SA +السعوديه + +// xn--mgbpl2fh ("sudan", Arabic) : SD +// Operated by .sd registry +سودان + +// xn--yfro4i67o Singapore ("Singapore", Chinese) : SG +新加坡 + +// xn--clchc0ea0b2g2a9gcd ("Singapore", Tamil) : SG +சிங்கப்பூர் + +// xn--ogbpf8fl ("Syria", Arabic) : SY +سورية + +// xn--mgbtf8fl ("Syria", Arabic, variant) : SY +سوريا + +// xn--o3cw4h ("Thai", Thai) : TH +// http://www.thnic.co.th +ไทย +ศึกษา.ไทย +ธุรกิจ.ไทย +รัฐบาล.ไทย +ทหาร.ไทย +เน็ต.ไทย +องค์กร.ไทย + +// xn--pgbs0dh ("Tunisia", Arabic) : TN +// http://nic.tn +تونس + +// xn--kpry57d ("Taiwan", Chinese, Traditional) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台灣 + +// xn--kprw13d ("Taiwan", Chinese, Simplified) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台湾 + +// xn--nnx388a ("Taiwan", Chinese, variant) : TW +臺灣 + +// xn--j1amh ("ukr", Cyrillic) : UA +укр + +// xn--mgb2ddes ("AlYemen", Arabic) : YE +اليمن + +// xxx : http://icmregistry.com +xxx + +// ye : http://www.y.net.ye/services/domain_name.htm +*.ye + +// za : http://www.zadna.org.za/content/page/domain-information +ac.za +agric.za +alt.za +co.za +edu.za +gov.za +grondar.za +law.za +mil.za +net.za +ngo.za +nis.za +nom.za +org.za +school.za +tm.za +web.za + +// zm : https://zicta.zm/ +// Submitted by registry +zm +ac.zm +biz.zm +co.zm +com.zm +edu.zm +gov.zm +info.zm +mil.zm +net.zm +org.zm +sch.zm + +// zw : https://www.potraz.gov.zw/ +// Confirmed by registry 2017-01-25 +zw +ac.zw +co.zw +gov.zw +mil.zw +org.zw + +// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2017-02-23T00:46:09Z + +// aaa : 2015-02-26 American Automobile Association, Inc. +aaa + +// aarp : 2015-05-21 AARP +aarp + +// abarth : 2015-07-30 Fiat Chrysler Automobiles N.V. +abarth + +// abb : 2014-10-24 ABB Ltd +abb + +// abbott : 2014-07-24 Abbott Laboratories, Inc. +abbott + +// abbvie : 2015-07-30 AbbVie Inc. +abbvie + +// abc : 2015-07-30 Disney Enterprises, Inc. +abc + +// able : 2015-06-25 Able Inc. +able + +// abogado : 2014-04-24 Top Level Domain Holdings Limited +abogado + +// abudhabi : 2015-07-30 Abu Dhabi Systems and Information Centre +abudhabi + +// academy : 2013-11-07 Half Oaks, LLC +academy + +// accenture : 2014-08-15 Accenture plc +accenture + +// accountant : 2014-11-20 dot Accountant Limited +accountant + +// accountants : 2014-03-20 Knob Town, LLC +accountants + +// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG +aco + +// active : 2014-05-01 The Active Network, Inc +active + +// actor : 2013-12-12 United TLD Holdco Ltd. +actor + +// adac : 2015-07-16 Allgemeiner Deutscher Automobil-Club e.V. (ADAC) +adac + +// ads : 2014-12-04 Charleston Road Registry Inc. +ads + +// adult : 2014-10-16 ICM Registry AD LLC +adult + +// aeg : 2015-03-19 Aktiebolaget Electrolux +aeg + +// aetna : 2015-05-21 Aetna Life Insurance Company +aetna + +// afamilycompany : 2015-07-23 Johnson Shareholdings, Inc. +afamilycompany + +// afl : 2014-10-02 Australian Football League +afl + +// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa +africa + +// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +agakhan + +// agency : 2013-11-14 Steel Falls, LLC +agency + +// aig : 2014-12-18 American International Group, Inc. +aig + +// aigo : 2015-08-06 aigo Digital Technology Co,Ltd. +aigo + +// airbus : 2015-07-30 Airbus S.A.S. +airbus + +// airforce : 2014-03-06 United TLD Holdco Ltd. +airforce + +// airtel : 2014-10-24 Bharti Airtel Limited +airtel + +// akdn : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +akdn + +// alfaromeo : 2015-07-31 Fiat Chrysler Automobiles N.V. +alfaromeo + +// alibaba : 2015-01-15 Alibaba Group Holding Limited +alibaba + +// alipay : 2015-01-15 Alibaba Group Holding Limited +alipay + +// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft +allfinanz + +// allstate : 2015-07-31 Allstate Fire and Casualty Insurance Company +allstate + +// ally : 2015-06-18 Ally Financial Inc. +ally + +// alsace : 2014-07-02 REGION D ALSACE +alsace + +// alstom : 2015-07-30 ALSTOM +alstom + +// americanexpress : 2015-07-31 American Express Travel Related Services Company, Inc. +americanexpress + +// americanfamily : 2015-07-23 AmFam, Inc. +americanfamily + +// amex : 2015-07-31 American Express Travel Related Services Company, Inc. +amex + +// amfam : 2015-07-23 AmFam, Inc. +amfam + +// amica : 2015-05-28 Amica Mutual Insurance Company +amica + +// amsterdam : 2014-07-24 Gemeente Amsterdam +amsterdam + +// analytics : 2014-12-18 Campus IP LLC +analytics + +// android : 2014-08-07 Charleston Road Registry Inc. +android + +// anquan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +anquan + +// anz : 2015-07-31 Australia and New Zealand Banking Group Limited +anz + +// aol : 2015-09-17 AOL Inc. +aol + +// apartments : 2014-12-11 June Maple, LLC +apartments + +// app : 2015-05-14 Charleston Road Registry Inc. +app + +// apple : 2015-05-14 Apple Inc. +apple + +// aquarelle : 2014-07-24 Aquarelle.com +aquarelle + +// arab : 2015-11-12 League of Arab States +arab + +// aramco : 2014-11-20 Aramco Services Company +aramco + +// archi : 2014-02-06 STARTING DOT LIMITED +archi + +// army : 2014-03-06 United TLD Holdco Ltd. +army + +// art : 2016-03-24 UK Creative Ideas Limited +art + +// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E. +arte + +// asda : 2015-07-31 Wal-Mart Stores, Inc. +asda + +// associates : 2014-03-06 Baxter Hill, LLC +associates + +// athleta : 2015-07-30 The Gap, Inc. +athleta + +// attorney : 2014-03-20 +attorney + +// auction : 2014-03-20 +auction + +// audi : 2015-05-21 AUDI Aktiengesellschaft +audi + +// audible : 2015-06-25 Amazon EU S.à r.l. +audible + +// audio : 2014-03-20 Uniregistry, Corp. +audio + +// auspost : 2015-08-13 Australian Postal Corporation +auspost + +// author : 2014-12-18 Amazon EU S.à r.l. +author + +// auto : 2014-11-13 +auto + +// autos : 2014-01-09 DERAutos, LLC +autos + +// avianca : 2015-01-08 Aerovias del Continente Americano S.A. Avianca +avianca + +// aws : 2015-06-25 Amazon EU S.à r.l. +aws + +// axa : 2013-12-19 AXA SA +axa + +// azure : 2014-12-18 Microsoft Corporation +azure + +// baby : 2015-04-09 Johnson & Johnson Services, Inc. +baby + +// baidu : 2015-01-08 Baidu, Inc. +baidu + +// banamex : 2015-07-30 Citigroup Inc. +banamex + +// bananarepublic : 2015-07-31 The Gap, Inc. +bananarepublic + +// band : 2014-06-12 +band + +// bank : 2014-09-25 fTLD Registry Services LLC +bank + +// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +bar + +// barcelona : 2014-07-24 Municipi de Barcelona +barcelona + +// barclaycard : 2014-11-20 Barclays Bank PLC +barclaycard + +// barclays : 2014-11-20 Barclays Bank PLC +barclays + +// barefoot : 2015-06-11 Gallo Vineyards, Inc. +barefoot + +// bargains : 2013-11-14 Half Hallow, LLC +bargains + +// baseball : 2015-10-29 MLB Advanced Media DH, LLC +baseball + +// basketball : 2015-08-20 Fédération Internationale de Basketball (FIBA) +basketball + +// bauhaus : 2014-04-17 Werkhaus GmbH +bauhaus + +// bayern : 2014-01-23 Bayern Connect GmbH +bayern + +// bbc : 2014-12-18 British Broadcasting Corporation +bbc + +// bbt : 2015-07-23 BB&T Corporation +bbt + +// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A. +bbva + +// bcg : 2015-04-02 The Boston Consulting Group, Inc. +bcg + +// bcn : 2014-07-24 Municipi de Barcelona +bcn + +// beats : 2015-05-14 Beats Electronics, LLC +beats + +// beauty : 2015-12-03 L'Oréal +beauty + +// beer : 2014-01-09 Top Level Domain Holdings Limited +beer + +// bentley : 2014-12-18 Bentley Motors Limited +bentley + +// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG +berlin + +// best : 2013-12-19 BestTLD Pty Ltd +best + +// bestbuy : 2015-07-31 BBY Solutions, Inc. +bestbuy + +// bet : 2015-05-07 Afilias plc +bet + +// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited +bharti + +// bible : 2014-06-19 American Bible Society +bible + +// bid : 2013-12-19 dot Bid Limited +bid + +// bike : 2013-08-27 Grand Hollow, LLC +bike + +// bing : 2014-12-18 Microsoft Corporation +bing + +// bingo : 2014-12-04 Sand Cedar, LLC +bingo + +// bio : 2014-03-06 STARTING DOT LIMITED +bio + +// black : 2014-01-16 Afilias Limited +black + +// blackfriday : 2014-01-16 Uniregistry, Corp. +blackfriday + +// blanco : 2015-07-16 BLANCO GmbH + Co KG +blanco + +// blockbuster : 2015-07-30 Dish DBS Corporation +blockbuster + +// blog : 2015-05-14 +blog + +// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC +bloomberg + +// blue : 2013-11-07 Afilias Limited +blue + +// bms : 2014-10-30 Bristol-Myers Squibb Company +bms + +// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +bmw + +// bnl : 2014-07-24 Banca Nazionale del Lavoro +bnl + +// bnpparibas : 2014-05-29 BNP Paribas +bnpparibas + +// boats : 2014-12-04 DERBoats, LLC +boats + +// boehringer : 2015-07-09 Boehringer Ingelheim International GmbH +boehringer + +// bofa : 2015-07-31 NMS Services, Inc. +bofa + +// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +bom + +// bond : 2014-06-05 Bond University Limited +bond + +// boo : 2014-01-30 Charleston Road Registry Inc. +boo + +// book : 2015-08-27 Amazon EU S.à r.l. +book + +// booking : 2015-07-16 Booking.com B.V. +booking + +// boots : 2015-01-08 THE BOOTS COMPANY PLC +boots + +// bosch : 2015-06-18 Robert Bosch GMBH +bosch + +// bostik : 2015-05-28 Bostik SA +bostik + +// boston : 2015-12-10 +boston + +// bot : 2014-12-18 Amazon EU S.à r.l. +bot + +// boutique : 2013-11-14 Over Galley, LLC +boutique + +// box : 2015-11-12 NS1 Limited +box + +// bradesco : 2014-12-18 Banco Bradesco S.A. +bradesco + +// bridgestone : 2014-12-18 Bridgestone Corporation +bridgestone + +// broadway : 2014-12-22 Celebrate Broadway, Inc. +broadway + +// broker : 2014-12-11 IG Group Holdings PLC +broker + +// brother : 2015-01-29 Brother Industries, Ltd. +brother + +// brussels : 2014-02-06 DNS.be vzw +brussels + +// budapest : 2013-11-21 Top Level Domain Holdings Limited +budapest + +// bugatti : 2015-07-23 Bugatti International SA +bugatti + +// build : 2013-11-07 Plan Bee LLC +build + +// builders : 2013-11-07 Atomic Madison, LLC +builders + +// business : 2013-11-07 Spring Cross, LLC +business + +// buy : 2014-12-18 Amazon EU S.à r.l. +buy + +// buzz : 2013-10-02 DOTSTRATEGY CO. +buzz + +// bzh : 2014-02-27 Association www.bzh +bzh + +// cab : 2013-10-24 Half Sunset, LLC +cab + +// cafe : 2015-02-11 Pioneer Canyon, LLC +cafe + +// cal : 2014-07-24 Charleston Road Registry Inc. +cal + +// call : 2014-12-18 Amazon EU S.à r.l. +call + +// calvinklein : 2015-07-30 PVH gTLD Holdings LLC +calvinklein + +// cam : 2016-04-21 AC Webconnecting Holding B.V. +cam + +// camera : 2013-08-27 Atomic Maple, LLC +camera + +// camp : 2013-11-07 Delta Dynamite, LLC +camp + +// cancerresearch : 2014-05-15 Australian Cancer Research Foundation +cancerresearch + +// canon : 2014-09-12 Canon Inc. +canon + +// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +capetown + +// capital : 2014-03-06 Delta Mill, LLC +capital + +// capitalone : 2015-08-06 Capital One Financial Corporation +capitalone + +// car : 2015-01-22 +car + +// caravan : 2013-12-12 Caravan International, Inc. +caravan + +// cards : 2013-12-05 Foggy Hollow, LLC +cards + +// care : 2014-03-06 Goose Cross +care + +// career : 2013-10-09 dotCareer LLC +career + +// careers : 2013-10-02 Wild Corner, LLC +careers + +// cars : 2014-11-13 +cars + +// cartier : 2014-06-23 Richemont DNS Inc. +cartier + +// casa : 2013-11-21 Top Level Domain Holdings Limited +casa + +// case : 2015-09-03 CNH Industrial N.V. +case + +// caseih : 2015-09-03 CNH Industrial N.V. +caseih + +// cash : 2014-03-06 Delta Lake, LLC +cash + +// casino : 2014-12-18 Binky Sky, LLC +casino + +// catering : 2013-12-05 New Falls. LLC +catering + +// catholic : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +catholic + +// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +cba + +// cbn : 2014-08-22 The Christian Broadcasting Network, Inc. +cbn + +// cbre : 2015-07-02 CBRE, Inc. +cbre + +// cbs : 2015-08-06 CBS Domains Inc. +cbs + +// ceb : 2015-04-09 The Corporate Executive Board Company +ceb + +// center : 2013-11-07 Tin Mill, LLC +center + +// ceo : 2013-11-07 CEOTLD Pty Ltd +ceo + +// cern : 2014-06-05 European Organization for Nuclear Research ("CERN") +cern + +// cfa : 2014-08-28 CFA Institute +cfa + +// cfd : 2014-12-11 IG Group Holdings PLC +cfd + +// chanel : 2015-04-09 Chanel International B.V. +chanel + +// channel : 2014-05-08 Charleston Road Registry Inc. +channel + +// chase : 2015-04-30 JPMorgan Chase & Co. +chase + +// chat : 2014-12-04 Sand Fields, LLC +chat + +// cheap : 2013-11-14 Sand Cover, LLC +cheap + +// chintai : 2015-06-11 CHINTAI Corporation +chintai + +// chloe : 2014-10-16 Richemont DNS Inc. +chloe + +// christmas : 2013-11-21 Uniregistry, Corp. +christmas + +// chrome : 2014-07-24 Charleston Road Registry Inc. +chrome + +// chrysler : 2015-07-30 FCA US LLC. +chrysler + +// church : 2014-02-06 Holly Fields, LLC +church + +// cipriani : 2015-02-19 Hotel Cipriani Srl +cipriani + +// circle : 2014-12-18 Amazon EU S.à r.l. +circle + +// cisco : 2014-12-22 Cisco Technology, Inc. +cisco + +// citadel : 2015-07-23 Citadel Domain LLC +citadel + +// citi : 2015-07-30 Citigroup Inc. +citi + +// citic : 2014-01-09 CITIC Group Corporation +citic + +// city : 2014-05-29 Snow Sky, LLC +city + +// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. +cityeats + +// claims : 2014-03-20 Black Corner, LLC +claims + +// cleaning : 2013-12-05 Fox Shadow, LLC +cleaning + +// click : 2014-06-05 Uniregistry, Corp. +click + +// clinic : 2014-03-20 Goose Park, LLC +clinic + +// clinique : 2015-10-01 The Estée Lauder Companies Inc. +clinique + +// clothing : 2013-08-27 Steel Lake, LLC +clothing + +// cloud : 2015-04-16 ARUBA S.p.A. +cloud + +// club : 2013-11-08 .CLUB DOMAINS, LLC +club + +// clubmed : 2015-06-25 Club Méditerranée S.A. +clubmed + +// coach : 2014-10-09 Koko Island, LLC +coach + +// codes : 2013-10-31 Puff Willow, LLC +codes + +// coffee : 2013-10-17 Trixy Cover, LLC +coffee + +// college : 2014-01-16 XYZ.COM LLC +college + +// cologne : 2014-02-05 NetCologne Gesellschaft für Telekommunikation mbH +cologne + +// comcast : 2015-07-23 Comcast IP Holdings I, LLC +comcast + +// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +commbank + +// community : 2013-12-05 Fox Orchard, LLC +community + +// company : 2013-11-07 Silver Avenue, LLC +company + +// compare : 2015-10-08 iSelect Ltd +compare + +// computer : 2013-10-24 Pine Mill, LLC +computer + +// comsec : 2015-01-08 VeriSign, Inc. +comsec + +// condos : 2013-12-05 Pine House, LLC +condos + +// construction : 2013-09-16 Fox Dynamite, LLC +construction + +// consulting : 2013-12-05 +consulting + +// contact : 2015-01-08 Top Level Spectrum, Inc. +contact + +// contractors : 2013-09-10 Magic Woods, LLC +contractors + +// cooking : 2013-11-21 Top Level Domain Holdings Limited +cooking + +// cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +cookingchannel + +// cool : 2013-11-14 Koko Lake, LLC +cool + +// corsica : 2014-09-25 Collectivité Territoriale de Corse +corsica + +// country : 2013-12-19 Top Level Domain Holdings Limited +country + +// coupon : 2015-02-26 Amazon EU S.à r.l. +coupon + +// coupons : 2015-03-26 Black Island, LLC +coupons + +// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD +courses + +// credit : 2014-03-20 Snow Shadow, LLC +credit + +// creditcard : 2014-03-20 Binky Frostbite, LLC +creditcard + +// creditunion : 2015-01-22 CUNA Performance Resources, LLC +creditunion + +// cricket : 2014-10-09 dot Cricket Limited +cricket + +// crown : 2014-10-24 Crown Equipment Corporation +crown + +// crs : 2014-04-03 Federated Co-operatives Limited +crs + +// cruise : 2015-12-10 Viking River Cruises (Bermuda) Ltd. +cruise + +// cruises : 2013-12-05 Spring Way, LLC +cruises + +// csc : 2014-09-25 Alliance-One Services, Inc. +csc + +// cuisinella : 2014-04-03 SALM S.A.S. +cuisinella + +// cymru : 2014-05-08 Nominet UK +cymru + +// cyou : 2015-01-22 Beijing Gamease Age Digital Technology Co., Ltd. +cyou + +// dabur : 2014-02-06 Dabur India Limited +dabur + +// dad : 2014-01-23 Charleston Road Registry Inc. +dad + +// dance : 2013-10-24 United TLD Holdco Ltd. +dance + +// data : 2016-06-02 Dish DBS Corporation +data + +// date : 2014-11-20 dot Date Limited +date + +// dating : 2013-12-05 Pine Fest, LLC +dating + +// datsun : 2014-03-27 NISSAN MOTOR CO., LTD. +datsun + +// day : 2014-01-30 Charleston Road Registry Inc. +day + +// dclk : 2014-11-20 Charleston Road Registry Inc. +dclk + +// dds : 2015-05-07 Top Level Domain Holdings Limited +dds + +// deal : 2015-06-25 Amazon EU S.à r.l. +deal + +// dealer : 2014-12-22 Dealer Dot Com, Inc. +dealer + +// deals : 2014-05-22 Sand Sunset, LLC +deals + +// degree : 2014-03-06 +degree + +// delivery : 2014-09-11 Steel Station, LLC +delivery + +// dell : 2014-10-24 Dell Inc. +dell + +// deloitte : 2015-07-31 Deloitte Touche Tohmatsu +deloitte + +// delta : 2015-02-19 Delta Air Lines, Inc. +delta + +// democrat : 2013-10-24 United TLD Holdco Ltd. +democrat + +// dental : 2014-03-20 Tin Birch, LLC +dental + +// dentist : 2014-03-20 +dentist + +// desi : 2013-11-14 Desi Networks LLC +desi + +// design : 2014-11-07 Top Level Design, LLC +design + +// dev : 2014-10-16 Charleston Road Registry Inc. +dev + +// dhl : 2015-07-23 Deutsche Post AG +dhl + +// diamonds : 2013-09-22 John Edge, LLC +diamonds + +// diet : 2014-06-26 Uniregistry, Corp. +diet + +// digital : 2014-03-06 Dash Park, LLC +digital + +// direct : 2014-04-10 Half Trail, LLC +direct + +// directory : 2013-09-20 Extra Madison, LLC +directory + +// discount : 2014-03-06 Holly Hill, LLC +discount + +// discover : 2015-07-23 Discover Financial Services +discover + +// dish : 2015-07-30 Dish DBS Corporation +dish + +// diy : 2015-11-05 Lifestyle Domain Holdings, Inc. +diy + +// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd. +dnp + +// docs : 2014-10-16 Charleston Road Registry Inc. +docs + +// doctor : 2016-06-02 Brice Trail, LLC +doctor + +// dodge : 2015-07-30 FCA US LLC. +dodge + +// dog : 2014-12-04 Koko Mill, LLC +dog + +// doha : 2014-09-18 Communications Regulatory Authority (CRA) +doha + +// domains : 2013-10-17 Sugar Cross, LLC +domains + +// dot : 2015-05-21 Dish DBS Corporation +dot + +// download : 2014-11-20 dot Support Limited +download + +// drive : 2015-03-05 Charleston Road Registry Inc. +drive + +// dtv : 2015-06-04 Dish DBS Corporation +dtv + +// dubai : 2015-01-01 Dubai Smart Government Department +dubai + +// duck : 2015-07-23 Johnson Shareholdings, Inc. +duck + +// dunlop : 2015-07-02 The Goodyear Tire & Rubber Company +dunlop + +// duns : 2015-08-06 The Dun & Bradstreet Corporation +duns + +// dupont : 2015-06-25 E. I. du Pont de Nemours and Company +dupont + +// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +durban + +// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +dvag + +// dvr : 2016-05-26 Hughes Satellite Systems Corporation +dvr + +// earth : 2014-12-04 Interlink Co., Ltd. +earth + +// eat : 2014-01-23 Charleston Road Registry Inc. +eat + +// eco : 2016-07-08 Big Room Inc. +eco + +// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. +edeka + +// education : 2013-11-07 Brice Way, LLC +education + +// email : 2013-10-31 Spring Madison, LLC +email + +// emerck : 2014-04-03 Merck KGaA +emerck + +// energy : 2014-09-11 Binky Birch, LLC +energy + +// engineer : 2014-03-06 United TLD Holdco Ltd. +engineer + +// engineering : 2014-03-06 Romeo Canyon +engineering + +// enterprises : 2013-09-20 Snow Oaks, LLC +enterprises + +// epost : 2015-07-23 Deutsche Post AG +epost + +// epson : 2014-12-04 Seiko Epson Corporation +epson + +// equipment : 2013-08-27 Corn Station, LLC +equipment + +// ericsson : 2015-07-09 Telefonaktiebolaget L M Ericsson +ericsson + +// erni : 2014-04-03 ERNI Group Holding AG +erni + +// esq : 2014-05-08 Charleston Road Registry Inc. +esq + +// estate : 2013-08-27 Trixy Park, LLC +estate + +// esurance : 2015-07-23 Esurance Insurance Company +esurance + +// etisalat : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +etisalat + +// eurovision : 2014-04-24 European Broadcasting Union (EBU) +eurovision + +// eus : 2013-12-12 Puntueus Fundazioa +eus + +// events : 2013-12-05 Pioneer Maple, LLC +events + +// everbank : 2014-05-15 EverBank +everbank + +// exchange : 2014-03-06 Spring Falls, LLC +exchange + +// expert : 2013-11-21 Magic Pass, LLC +expert + +// exposed : 2013-12-05 Victor Beach, LLC +exposed + +// express : 2015-02-11 Sea Sunset, LLC +express + +// extraspace : 2015-05-14 Extra Space Storage LLC +extraspace + +// fage : 2014-12-18 Fage International S.A. +fage + +// fail : 2014-03-06 Atomic Pipe, LLC +fail + +// fairwinds : 2014-11-13 FairWinds Partners, LLC +fairwinds + +// faith : 2014-11-20 dot Faith Limited +faith + +// family : 2015-04-02 +family + +// fan : 2014-03-06 +fan + +// fans : 2014-11-07 Asiamix Digital Limited +fans + +// farm : 2013-11-07 Just Maple, LLC +farm + +// farmers : 2015-07-09 Farmers Insurance Exchange +farmers + +// fashion : 2014-07-03 Top Level Domain Holdings Limited +fashion + +// fast : 2014-12-18 Amazon EU S.à r.l. +fast + +// fedex : 2015-08-06 Federal Express Corporation +fedex + +// feedback : 2013-12-19 Top Level Spectrum, Inc. +feedback + +// ferrari : 2015-07-31 Fiat Chrysler Automobiles N.V. +ferrari + +// ferrero : 2014-12-18 Ferrero Trading Lux S.A. +ferrero + +// fiat : 2015-07-31 Fiat Chrysler Automobiles N.V. +fiat + +// fidelity : 2015-07-30 Fidelity Brokerage Services LLC +fidelity + +// fido : 2015-08-06 Rogers Communications Partnership +fido + +// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd +film + +// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +final + +// finance : 2014-03-20 Cotton Cypress, LLC +finance + +// financial : 2014-03-06 Just Cover, LLC +financial + +// fire : 2015-06-25 Amazon EU S.à r.l. +fire + +// firestone : 2014-12-18 Bridgestone Corporation +firestone + +// firmdale : 2014-03-27 Firmdale Holdings Limited +firmdale + +// fish : 2013-12-12 Fox Woods, LLC +fish + +// fishing : 2013-11-21 Top Level Domain Holdings Limited +fishing + +// fit : 2014-11-07 Top Level Domain Holdings Limited +fit + +// fitness : 2014-03-06 Brice Orchard, LLC +fitness + +// flickr : 2015-04-02 Yahoo! Domain Services Inc. +flickr + +// flights : 2013-12-05 Fox Station, LLC +flights + +// flir : 2015-07-23 FLIR Systems, Inc. +flir + +// florist : 2013-11-07 Half Cypress, LLC +florist + +// flowers : 2014-10-09 Uniregistry, Corp. +flowers + +// fly : 2014-05-08 Charleston Road Registry Inc. +fly + +// foo : 2014-01-23 Charleston Road Registry Inc. +foo + +// food : 2016-04-21 Lifestyle Domain Holdings, Inc. +food + +// foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc. +foodnetwork + +// football : 2014-12-18 Foggy Farms, LLC +football + +// ford : 2014-11-13 Ford Motor Company +ford + +// forex : 2014-12-11 IG Group Holdings PLC +forex + +// forsale : 2014-05-22 +forsale + +// forum : 2015-04-02 Fegistry, LLC +forum + +// foundation : 2013-12-05 John Dale, LLC +foundation + +// fox : 2015-09-11 FOX Registry, LLC +fox + +// free : 2015-12-10 Amazon EU S.à r.l. +free + +// fresenius : 2015-07-30 Fresenius Immobilien-Verwaltungs-GmbH +fresenius + +// frl : 2014-05-15 FRLregistry B.V. +frl + +// frogans : 2013-12-19 OP3FT +frogans + +// frontdoor : 2015-07-02 Lifestyle Domain Holdings, Inc. +frontdoor + +// frontier : 2015-02-05 Frontier Communications Corporation +frontier + +// ftr : 2015-07-16 Frontier Communications Corporation +ftr + +// fujitsu : 2015-07-30 Fujitsu Limited +fujitsu + +// fujixerox : 2015-07-23 Xerox DNHC LLC +fujixerox + +// fun : 2016-01-14 +fun + +// fund : 2014-03-20 John Castle, LLC +fund + +// furniture : 2014-03-20 Lone Fields, LLC +furniture + +// futbol : 2013-09-20 +futbol + +// fyi : 2015-04-02 Silver Tigers, LLC +fyi + +// gal : 2013-11-07 Asociación puntoGAL +gal + +// gallery : 2013-09-13 Sugar House, LLC +gallery + +// gallo : 2015-06-11 Gallo Vineyards, Inc. +gallo + +// gallup : 2015-02-19 Gallup, Inc. +gallup + +// game : 2015-05-28 Uniregistry, Corp. +game + +// games : 2015-05-28 +games + +// gap : 2015-07-31 The Gap, Inc. +gap + +// garden : 2014-06-26 Top Level Domain Holdings Limited +garden + +// gbiz : 2014-07-17 Charleston Road Registry Inc. +gbiz + +// gdn : 2014-07-31 Joint Stock Company "Navigation-information systems" +gdn + +// gea : 2014-12-04 GEA Group Aktiengesellschaft +gea + +// gent : 2014-01-23 COMBELL GROUP NV/SA +gent + +// genting : 2015-03-12 Resorts World Inc Pte. Ltd. +genting + +// george : 2015-07-31 Wal-Mart Stores, Inc. +george + +// ggee : 2014-01-09 GMO Internet, Inc. +ggee + +// gift : 2013-10-17 Uniregistry, Corp. +gift + +// gifts : 2014-07-03 Goose Sky, LLC +gifts + +// gives : 2014-03-06 United TLD Holdco Ltd. +gives + +// giving : 2014-11-13 Giving Limited +giving + +// glade : 2015-07-23 Johnson Shareholdings, Inc. +glade + +// glass : 2013-11-07 Black Cover, LLC +glass + +// gle : 2014-07-24 Charleston Road Registry Inc. +gle + +// global : 2014-04-17 Dot GLOBAL AS +global + +// globo : 2013-12-19 Globo Comunicação e Participações S.A +globo + +// gmail : 2014-05-01 Charleston Road Registry Inc. +gmail + +// gmbh : 2016-01-29 Extra Dynamite, LLC +gmbh + +// gmo : 2014-01-09 GMO Internet, Inc. +gmo + +// gmx : 2014-04-24 1&1 Mail & Media GmbH +gmx + +// godaddy : 2015-07-23 Go Daddy East, LLC +godaddy + +// gold : 2015-01-22 June Edge, LLC +gold + +// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +goldpoint + +// golf : 2014-12-18 Lone falls, LLC +golf + +// goo : 2014-12-18 NTT Resonant Inc. +goo + +// goodhands : 2015-07-31 Allstate Fire and Casualty Insurance Company +goodhands + +// goodyear : 2015-07-02 The Goodyear Tire & Rubber Company +goodyear + +// goog : 2014-11-20 Charleston Road Registry Inc. +goog + +// google : 2014-07-24 Charleston Road Registry Inc. +google + +// gop : 2014-01-16 Republican State Leadership Committee, Inc. +gop + +// got : 2014-12-18 Amazon EU S.à r.l. +got + +// grainger : 2015-05-07 Grainger Registry Services, LLC +grainger + +// graphics : 2013-09-13 Over Madison, LLC +graphics + +// gratis : 2014-03-20 Pioneer Tigers, LLC +gratis + +// green : 2014-05-08 Afilias Limited +green + +// gripe : 2014-03-06 Corn Sunset, LLC +gripe + +// grocery : 2016-06-16 Wal-Mart Stores, Inc. +grocery + +// group : 2014-08-15 Romeo Town, LLC +group + +// guardian : 2015-07-30 The Guardian Life Insurance Company of America +guardian + +// gucci : 2014-11-13 Guccio Gucci S.p.a. +gucci + +// guge : 2014-08-28 Charleston Road Registry Inc. +guge + +// guide : 2013-09-13 Snow Moon, LLC +guide + +// guitars : 2013-11-14 Uniregistry, Corp. +guitars + +// guru : 2013-08-27 Pioneer Cypress, LLC +guru + +// hair : 2015-12-03 L'Oréal +hair + +// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH +hamburg + +// hangout : 2014-11-13 Charleston Road Registry Inc. +hangout + +// haus : 2013-12-05 +haus + +// hbo : 2015-07-30 HBO Registry Services, Inc. +hbo + +// hdfc : 2015-07-30 HOUSING DEVELOPMENT FINANCE CORPORATION LIMITED +hdfc + +// hdfcbank : 2015-02-12 HDFC Bank Limited +hdfcbank + +// health : 2015-02-11 DotHealth, LLC +health + +// healthcare : 2014-06-12 Silver Glen, LLC +healthcare + +// help : 2014-06-26 Uniregistry, Corp. +help + +// helsinki : 2015-02-05 City of Helsinki +helsinki + +// here : 2014-02-06 Charleston Road Registry Inc. +here + +// hermes : 2014-07-10 HERMES INTERNATIONAL +hermes + +// hgtv : 2015-07-02 Lifestyle Domain Holdings, Inc. +hgtv + +// hiphop : 2014-03-06 Uniregistry, Corp. +hiphop + +// hisamitsu : 2015-07-16 Hisamitsu Pharmaceutical Co.,Inc. +hisamitsu + +// hitachi : 2014-10-31 Hitachi, Ltd. +hitachi + +// hiv : 2014-03-13 +hiv + +// hkt : 2015-05-14 PCCW-HKT DataCom Services Limited +hkt + +// hockey : 2015-03-19 Half Willow, LLC +hockey + +// holdings : 2013-08-27 John Madison, LLC +holdings + +// holiday : 2013-11-07 Goose Woods, LLC +holiday + +// homedepot : 2015-04-02 Homer TLC, Inc. +homedepot + +// homegoods : 2015-07-16 The TJX Companies, Inc. +homegoods + +// homes : 2014-01-09 DERHomes, LLC +homes + +// homesense : 2015-07-16 The TJX Companies, Inc. +homesense + +// honda : 2014-12-18 Honda Motor Co., Ltd. +honda + +// honeywell : 2015-07-23 Honeywell GTLD LLC +honeywell + +// horse : 2013-11-21 Top Level Domain Holdings Limited +horse + +// hospital : 2016-10-20 Ruby Pike, LLC +hospital + +// host : 2014-04-17 DotHost Inc. +host + +// hosting : 2014-05-29 Uniregistry, Corp. +hosting + +// hot : 2015-08-27 Amazon EU S.à r.l. +hot + +// hoteles : 2015-03-05 Travel Reservations SRL +hoteles + +// hotels : 2016-04-07 Booking.com B.V. +hotels + +// hotmail : 2014-12-18 Microsoft Corporation +hotmail + +// house : 2013-11-07 Sugar Park, LLC +house + +// how : 2014-01-23 Charleston Road Registry Inc. +how + +// hsbc : 2014-10-24 HSBC Holdings PLC +hsbc + +// htc : 2015-04-02 HTC corporation +htc + +// hughes : 2015-07-30 Hughes Satellite Systems Corporation +hughes + +// hyatt : 2015-07-30 Hyatt GTLD, L.L.C. +hyatt + +// hyundai : 2015-07-09 Hyundai Motor Company +hyundai + +// ibm : 2014-07-31 International Business Machines Corporation +ibm + +// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited +icbc + +// ice : 2014-10-30 IntercontinentalExchange, Inc. +ice + +// icu : 2015-01-08 One.com A/S +icu + +// ieee : 2015-07-23 IEEE Global LLC +ieee + +// ifm : 2014-01-30 ifm electronic gmbh +ifm + +// ikano : 2015-07-09 Ikano S.A. +ikano + +// imamat : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +imamat + +// imdb : 2015-06-25 Amazon EU S.à r.l. +imdb + +// immo : 2014-07-10 Auburn Bloom, LLC +immo + +// immobilien : 2013-11-07 United TLD Holdco Ltd. +immobilien + +// industries : 2013-12-05 Outer House, LLC +industries + +// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD. +infiniti + +// ing : 2014-01-23 Charleston Road Registry Inc. +ing + +// ink : 2013-12-05 Top Level Design, LLC +ink + +// institute : 2013-11-07 Outer Maple, LLC +institute + +// insurance : 2015-02-19 fTLD Registry Services LLC +insurance + +// insure : 2014-03-20 Pioneer Willow, LLC +insure + +// intel : 2015-08-06 Intel Corporation +intel + +// international : 2013-11-07 Wild Way, LLC +international + +// intuit : 2015-07-30 Intuit Administrative Services, Inc. +intuit + +// investments : 2014-03-20 Holly Glen, LLC +investments + +// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. +ipiranga + +// irish : 2014-08-07 Dot-Irish LLC +irish + +// iselect : 2015-02-11 iSelect Ltd +iselect + +// ismaili : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +ismaili + +// ist : 2014-08-28 Istanbul Metropolitan Municipality +ist + +// istanbul : 2014-08-28 Istanbul Metropolitan Municipality +istanbul + +// itau : 2014-10-02 Itau Unibanco Holding S.A. +itau + +// itv : 2015-07-09 ITV Services Limited +itv + +// iveco : 2015-09-03 CNH Industrial N.V. +iveco + +// iwc : 2014-06-23 Richemont DNS Inc. +iwc + +// jaguar : 2014-11-13 Jaguar Land Rover Ltd +jaguar + +// java : 2014-06-19 Oracle Corporation +java + +// jcb : 2014-11-20 JCB Co., Ltd. +jcb + +// jcp : 2015-04-23 JCP Media, Inc. +jcp + +// jeep : 2015-07-30 FCA US LLC. +jeep + +// jetzt : 2014-01-09 +jetzt + +// jewelry : 2015-03-05 Wild Bloom, LLC +jewelry + +// jio : 2015-04-02 Affinity Names, Inc. +jio + +// jlc : 2014-12-04 Richemont DNS Inc. +jlc + +// jll : 2015-04-02 Jones Lang LaSalle Incorporated +jll + +// jmp : 2015-03-26 Matrix IP LLC +jmp + +// jnj : 2015-06-18 Johnson & Johnson Services, Inc. +jnj + +// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +joburg + +// jot : 2014-12-18 Amazon EU S.à r.l. +jot + +// joy : 2014-12-18 Amazon EU S.à r.l. +joy + +// jpmorgan : 2015-04-30 JPMorgan Chase & Co. +jpmorgan + +// jprs : 2014-09-18 Japan Registry Services Co., Ltd. +jprs + +// juegos : 2014-03-20 Uniregistry, Corp. +juegos + +// juniper : 2015-07-30 JUNIPER NETWORKS, INC. +juniper + +// kaufen : 2013-11-07 United TLD Holdco Ltd. +kaufen + +// kddi : 2014-09-12 KDDI CORPORATION +kddi + +// kerryhotels : 2015-04-30 Kerry Trading Co. Limited +kerryhotels + +// kerrylogistics : 2015-04-09 Kerry Trading Co. Limited +kerrylogistics + +// kerryproperties : 2015-04-09 Kerry Trading Co. Limited +kerryproperties + +// kfh : 2014-12-04 Kuwait Finance House +kfh + +// kia : 2015-07-09 KIA MOTORS CORPORATION +kia + +// kim : 2013-09-23 Afilias Limited +kim + +// kinder : 2014-11-07 Ferrero Trading Lux S.A. +kinder + +// kindle : 2015-06-25 Amazon EU S.à r.l. +kindle + +// kitchen : 2013-09-20 Just Goodbye, LLC +kitchen + +// kiwi : 2013-09-20 DOT KIWI LIMITED +kiwi + +// koeln : 2014-01-09 NetCologne Gesellschaft für Telekommunikation mbH +koeln + +// komatsu : 2015-01-08 Komatsu Ltd. +komatsu + +// kosher : 2015-08-20 Kosher Marketing Assets LLC +kosher + +// kpmg : 2015-04-23 KPMG International Cooperative (KPMG International Genossenschaft) +kpmg + +// kpn : 2015-01-08 Koninklijke KPN N.V. +kpn + +// krd : 2013-12-05 KRG Department of Information Technology +krd + +// kred : 2013-12-19 KredTLD Pty Ltd +kred + +// kuokgroup : 2015-04-09 Kerry Trading Co. Limited +kuokgroup + +// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen +kyoto + +// lacaixa : 2014-01-09 CAIXA D'ESTALVIS I PENSIONS DE BARCELONA +lacaixa + +// ladbrokes : 2015-08-06 LADBROKES INTERNATIONAL PLC +ladbrokes + +// lamborghini : 2015-06-04 Automobili Lamborghini S.p.A. +lamborghini + +// lamer : 2015-10-01 The Estée Lauder Companies Inc. +lamer + +// lancaster : 2015-02-12 LANCASTER +lancaster + +// lancia : 2015-07-31 Fiat Chrysler Automobiles N.V. +lancia + +// lancome : 2015-07-23 L'Oréal +lancome + +// land : 2013-09-10 Pine Moon, LLC +land + +// landrover : 2014-11-13 Jaguar Land Rover Ltd +landrover + +// lanxess : 2015-07-30 LANXESS Corporation +lanxess + +// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated +lasalle + +// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico +lat + +// latino : 2015-07-30 Dish DBS Corporation +latino + +// latrobe : 2014-06-16 La Trobe University +latrobe + +// law : 2015-01-22 Minds + Machines Group Limited +law + +// lawyer : 2014-03-20 +lawyer + +// lds : 2014-03-20 IRI Domain Management, LLC ("Applicant") +lds + +// lease : 2014-03-06 Victor Trail, LLC +lease + +// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc +leclerc + +// lefrak : 2015-07-16 LeFrak Organization, Inc. +lefrak + +// legal : 2014-10-16 Blue Falls, LLC +legal + +// lego : 2015-07-16 LEGO Juris A/S +lego + +// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION +lexus + +// lgbt : 2014-05-08 Afilias Limited +lgbt + +// liaison : 2014-10-02 Liaison Technologies, Incorporated +liaison + +// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +lidl + +// life : 2014-02-06 Trixy Oaks, LLC +life + +// lifeinsurance : 2015-01-15 American Council of Life Insurers +lifeinsurance + +// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc. +lifestyle + +// lighting : 2013-08-27 John McCook, LLC +lighting + +// like : 2014-12-18 Amazon EU S.à r.l. +like + +// lilly : 2015-07-31 Eli Lilly and Company +lilly + +// limited : 2014-03-06 Big Fest, LLC +limited + +// limo : 2013-10-17 Hidden Frostbite, LLC +limo + +// lincoln : 2014-11-13 Ford Motor Company +lincoln + +// linde : 2014-12-04 Linde Aktiengesellschaft +linde + +// link : 2013-11-14 Uniregistry, Corp. +link + +// lipsy : 2015-06-25 Lipsy Ltd +lipsy + +// live : 2014-12-04 +live + +// living : 2015-07-30 Lifestyle Domain Holdings, Inc. +living + +// lixil : 2015-03-19 LIXIL Group Corporation +lixil + +// loan : 2014-11-20 dot Loan Limited +loan + +// loans : 2014-03-20 June Woods, LLC +loans + +// locker : 2015-06-04 Dish DBS Corporation +locker + +// locus : 2015-06-25 Locus Analytics LLC +locus + +// loft : 2015-07-30 Annco, Inc. +loft + +// lol : 2015-01-30 Uniregistry, Corp. +lol + +// london : 2013-11-14 Dot London Domains Limited +london + +// lotte : 2014-11-07 Lotte Holdings Co., Ltd. +lotte + +// lotto : 2014-04-10 Afilias Limited +lotto + +// love : 2014-12-22 Merchant Law Group LLP +love + +// lpl : 2015-07-30 LPL Holdings, Inc. +lpl + +// lplfinancial : 2015-07-30 LPL Holdings, Inc. +lplfinancial + +// ltd : 2014-09-25 Over Corner, LLC +ltd + +// ltda : 2014-04-17 DOMAIN ROBOT SERVICOS DE HOSPEDAGEM NA INTERNET LTDA +ltda + +// lundbeck : 2015-08-06 H. Lundbeck A/S +lundbeck + +// lupin : 2014-11-07 LUPIN LIMITED +lupin + +// luxe : 2014-01-09 Top Level Domain Holdings Limited +luxe + +// luxury : 2013-10-17 Luxury Partners, LLC +luxury + +// macys : 2015-07-31 Macys, Inc. +macys + +// madrid : 2014-05-01 Comunidad de Madrid +madrid + +// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF) +maif + +// maison : 2013-12-05 Victor Frostbite, LLC +maison + +// makeup : 2015-01-15 L'Oréal +makeup + +// man : 2014-12-04 MAN SE +man + +// management : 2013-11-07 John Goodbye, LLC +management + +// mango : 2013-10-24 PUNTO FA S.L. +mango + +// map : 2016-06-09 Charleston Road Registry Inc. +map + +// market : 2014-03-06 +market + +// marketing : 2013-11-07 Fern Pass, LLC +marketing + +// markets : 2014-12-11 IG Group Holdings PLC +markets + +// marriott : 2014-10-09 Marriott Worldwide Corporation +marriott + +// marshalls : 2015-07-16 The TJX Companies, Inc. +marshalls + +// maserati : 2015-07-31 Fiat Chrysler Automobiles N.V. +maserati + +// mattel : 2015-08-06 Mattel Sites, Inc. +mattel + +// mba : 2015-04-02 Lone Hollow, LLC +mba + +// mcd : 2015-07-30 McDonald’s Corporation +mcd + +// mcdonalds : 2015-07-30 McDonald’s Corporation +mcdonalds + +// mckinsey : 2015-07-31 McKinsey Holdings, Inc. +mckinsey + +// med : 2015-08-06 Medistry LLC +med + +// media : 2014-03-06 Grand Glen, LLC +media + +// meet : 2014-01-16 +meet + +// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation +melbourne + +// meme : 2014-01-30 Charleston Road Registry Inc. +meme + +// memorial : 2014-10-16 Dog Beach, LLC +memorial + +// men : 2015-02-26 Exclusive Registry Limited +men + +// menu : 2013-09-11 Wedding TLD2, LLC +menu + +// meo : 2014-11-07 PT Comunicacoes S.A. +meo + +// merckmsd : 2016-07-14 MSD Registry Holdings, Inc. +merckmsd + +// metlife : 2015-05-07 MetLife Services and Solutions, LLC +metlife + +// miami : 2013-12-19 Top Level Domain Holdings Limited +miami + +// microsoft : 2014-12-18 Microsoft Corporation +microsoft + +// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +mini + +// mint : 2015-07-30 Intuit Administrative Services, Inc. +mint + +// mit : 2015-07-02 Massachusetts Institute of Technology +mit + +// mitsubishi : 2015-07-23 Mitsubishi Corporation +mitsubishi + +// mlb : 2015-05-21 MLB Advanced Media DH, LLC +mlb + +// mls : 2015-04-23 The Canadian Real Estate Association +mls + +// mma : 2014-11-07 MMA IARD +mma + +// mobile : 2016-06-02 Dish DBS Corporation +mobile + +// mobily : 2014-12-18 GreenTech Consultancy Company W.L.L. +mobily + +// moda : 2013-11-07 United TLD Holdco Ltd. +moda + +// moe : 2013-11-13 Interlink Co., Ltd. +moe + +// moi : 2014-12-18 Amazon EU S.à r.l. +moi + +// mom : 2015-04-16 Uniregistry, Corp. +mom + +// monash : 2013-09-30 Monash University +monash + +// money : 2014-10-16 Outer McCook, LLC +money + +// monster : 2015-09-11 Monster Worldwide, Inc. +monster + +// montblanc : 2014-06-23 Richemont DNS Inc. +montblanc + +// mopar : 2015-07-30 FCA US LLC. +mopar + +// mormon : 2013-12-05 IRI Domain Management, LLC ("Applicant") +mormon + +// mortgage : 2014-03-20 +mortgage + +// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +moscow + +// moto : 2015-06-04 +moto + +// motorcycles : 2014-01-09 DERMotorcycles, LLC +motorcycles + +// mov : 2014-01-30 Charleston Road Registry Inc. +mov + +// movie : 2015-02-05 New Frostbite, LLC +movie + +// movistar : 2014-10-16 Telefónica S.A. +movistar + +// msd : 2015-07-23 MSD Registry Holdings, Inc. +msd + +// mtn : 2014-12-04 MTN Dubai Limited +mtn + +// mtpc : 2014-11-20 Mitsubishi Tanabe Pharma Corporation +mtpc + +// mtr : 2015-03-12 MTR Corporation Limited +mtr + +// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC +mutual + +// nab : 2015-08-20 National Australia Bank Limited +nab + +// nadex : 2014-12-11 IG Group Holdings PLC +nadex + +// nagoya : 2013-10-24 GMO Registry, Inc. +nagoya + +// nationwide : 2015-07-23 Nationwide Mutual Insurance Company +nationwide + +// natura : 2015-03-12 NATURA COSMÉTICOS S.A. +natura + +// navy : 2014-03-06 United TLD Holdco Ltd. +navy + +// nba : 2015-07-31 NBA REGISTRY, LLC +nba + +// nec : 2015-01-08 NEC Corporation +nec + +// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +netbank + +// netflix : 2015-06-18 Netflix, Inc. +netflix + +// network : 2013-11-14 Trixy Manor, LLC +network + +// neustar : 2013-12-05 NeuStar, Inc. +neustar + +// new : 2014-01-30 Charleston Road Registry Inc. +new + +// newholland : 2015-09-03 CNH Industrial N.V. +newholland + +// news : 2014-12-18 +news + +// next : 2015-06-18 Next plc +next + +// nextdirect : 2015-06-18 Next plc +nextdirect + +// nexus : 2014-07-24 Charleston Road Registry Inc. +nexus + +// nfl : 2015-07-23 NFL Reg Ops LLC +nfl + +// ngo : 2014-03-06 Public Interest Registry +ngo + +// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK) +nhk + +// nico : 2014-12-04 DWANGO Co., Ltd. +nico + +// nike : 2015-07-23 NIKE, Inc. +nike + +// nikon : 2015-05-21 NIKON CORPORATION +nikon + +// ninja : 2013-11-07 United TLD Holdco Ltd. +ninja + +// nissan : 2014-03-27 NISSAN MOTOR CO., LTD. +nissan + +// nissay : 2015-10-29 Nippon Life Insurance Company +nissay + +// nokia : 2015-01-08 Nokia Corporation +nokia + +// northwesternmutual : 2015-06-18 Northwestern Mutual Registry, LLC +northwesternmutual + +// norton : 2014-12-04 Symantec Corporation +norton + +// now : 2015-06-25 Amazon EU S.à r.l. +now + +// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +nowruz + +// nowtv : 2015-05-14 Starbucks (HK) Limited +nowtv + +// nra : 2014-05-22 NRA Holdings Company, INC. +nra + +// nrw : 2013-11-21 Minds + Machines GmbH +nrw + +// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION +ntt + +// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications +nyc + +// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA +obi + +// observer : 2015-04-30 +observer + +// off : 2015-07-23 Johnson Shareholdings, Inc. +off + +// office : 2015-03-12 Microsoft Corporation +office + +// okinawa : 2013-12-05 BusinessRalliart Inc. +okinawa + +// olayan : 2015-05-14 Crescent Holding GmbH +olayan + +// olayangroup : 2015-05-14 Crescent Holding GmbH +olayangroup + +// oldnavy : 2015-07-31 The Gap, Inc. +oldnavy + +// ollo : 2015-06-04 Dish DBS Corporation +ollo + +// omega : 2015-01-08 The Swatch Group Ltd +omega + +// one : 2014-11-07 One.com A/S +one + +// ong : 2014-03-06 Public Interest Registry +ong + +// onl : 2013-09-16 I-Registry Ltd. +onl + +// online : 2015-01-15 DotOnline Inc. +online + +// onyourside : 2015-07-23 Nationwide Mutual Insurance Company +onyourside + +// ooo : 2014-01-09 INFIBEAM INCORPORATION LIMITED +ooo + +// open : 2015-07-31 American Express Travel Related Services Company, Inc. +open + +// oracle : 2014-06-19 Oracle Corporation +oracle + +// orange : 2015-03-12 Orange Brand Services Limited +orange + +// organic : 2014-03-27 Afilias Limited +organic + +// origins : 2015-10-01 The Estée Lauder Companies Inc. +origins + +// osaka : 2014-09-04 Interlink Co., Ltd. +osaka + +// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd. +otsuka + +// ott : 2015-06-04 Dish DBS Corporation +ott + +// ovh : 2014-01-16 OVH SAS +ovh + +// page : 2014-12-04 Charleston Road Registry Inc. +page + +// pamperedchef : 2015-02-05 The Pampered Chef, Ltd. +pamperedchef + +// panasonic : 2015-07-30 Panasonic Corporation +panasonic + +// panerai : 2014-11-07 Richemont DNS Inc. +panerai + +// paris : 2014-01-30 City of Paris +paris + +// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +pars + +// partners : 2013-12-05 Magic Glen, LLC +partners + +// parts : 2013-12-05 Sea Goodbye, LLC +parts + +// party : 2014-09-11 Blue Sky Registry Limited +party + +// passagens : 2015-03-05 Travel Reservations SRL +passagens + +// pay : 2015-08-27 Amazon EU S.à r.l. +pay + +// pccw : 2015-05-14 PCCW Enterprises Limited +pccw + +// pet : 2015-05-07 Afilias plc +pet + +// pfizer : 2015-09-11 Pfizer Inc. +pfizer + +// pharmacy : 2014-06-19 National Association of Boards of Pharmacy +pharmacy + +// phd : 2016-07-28 Charleston Road Registry Inc. +phd + +// philips : 2014-11-07 Koninklijke Philips N.V. +philips + +// phone : 2016-06-02 Dish DBS Corporation +phone + +// photo : 2013-11-14 Uniregistry, Corp. +photo + +// photography : 2013-09-20 Sugar Glen, LLC +photography + +// photos : 2013-10-17 Sea Corner, LLC +photos + +// physio : 2014-05-01 PhysBiz Pty Ltd +physio + +// piaget : 2014-10-16 Richemont DNS Inc. +piaget + +// pics : 2013-11-14 Uniregistry, Corp. +pics + +// pictet : 2014-06-26 Pictet Europe S.A. +pictet + +// pictures : 2014-03-06 Foggy Sky, LLC +pictures + +// pid : 2015-01-08 Top Level Spectrum, Inc. +pid + +// pin : 2014-12-18 Amazon EU S.à r.l. +pin + +// ping : 2015-06-11 Ping Registry Provider, Inc. +ping + +// pink : 2013-10-01 Afilias Limited +pink + +// pioneer : 2015-07-16 Pioneer Corporation +pioneer + +// pizza : 2014-06-26 Foggy Moon, LLC +pizza + +// place : 2014-04-24 Snow Galley, LLC +place + +// play : 2015-03-05 Charleston Road Registry Inc. +play + +// playstation : 2015-07-02 Sony Computer Entertainment Inc. +playstation + +// plumbing : 2013-09-10 Spring Tigers, LLC +plumbing + +// plus : 2015-02-05 Sugar Mill, LLC +plus + +// pnc : 2015-07-02 PNC Domain Co., LLC +pnc + +// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +pohl + +// poker : 2014-07-03 Afilias Domains No. 5 Limited +poker + +// politie : 2015-08-20 Politie Nederland +politie + +// porn : 2014-10-16 ICM Registry PN LLC +porn + +// pramerica : 2015-07-30 Prudential Financial, Inc. +pramerica + +// praxi : 2013-12-05 Praxi S.p.A. +praxi + +// press : 2014-04-03 DotPress Inc. +press + +// prime : 2015-06-25 Amazon EU S.à r.l. +prime + +// prod : 2014-01-23 Charleston Road Registry Inc. +prod + +// productions : 2013-12-05 Magic Birch, LLC +productions + +// prof : 2014-07-24 Charleston Road Registry Inc. +prof + +// progressive : 2015-07-23 Progressive Casualty Insurance Company +progressive + +// promo : 2014-12-18 +promo + +// properties : 2013-12-05 Big Pass, LLC +properties + +// property : 2014-05-22 Uniregistry, Corp. +property + +// protection : 2015-04-23 +protection + +// pru : 2015-07-30 Prudential Financial, Inc. +pru + +// prudential : 2015-07-30 Prudential Financial, Inc. +prudential + +// pub : 2013-12-12 United TLD Holdco Ltd. +pub + +// pwc : 2015-10-29 PricewaterhouseCoopers LLP +pwc + +// qpon : 2013-11-14 dotCOOL, Inc. +qpon + +// quebec : 2013-12-19 PointQuébec Inc +quebec + +// quest : 2015-03-26 Quest ION Limited +quest + +// qvc : 2015-07-30 QVC, Inc. +qvc + +// racing : 2014-12-04 Premier Registry Limited +racing + +// radio : 2016-07-21 European Broadcasting Union (EBU) +radio + +// raid : 2015-07-23 Johnson Shareholdings, Inc. +raid + +// read : 2014-12-18 Amazon EU S.à r.l. +read + +// realestate : 2015-09-11 dotRealEstate LLC +realestate + +// realtor : 2014-05-29 Real Estate Domains LLC +realtor + +// realty : 2015-03-19 Fegistry, LLC +realty + +// recipes : 2013-10-17 Grand Island, LLC +recipes + +// red : 2013-11-07 Afilias Limited +red + +// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd. +redstone + +// redumbrella : 2015-03-26 Travelers TLD, LLC +redumbrella + +// rehab : 2014-03-06 United TLD Holdco Ltd. +rehab + +// reise : 2014-03-13 +reise + +// reisen : 2014-03-06 New Cypress, LLC +reisen + +// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc. +reit + +// reliance : 2015-04-02 Reliance Industries Limited +reliance + +// ren : 2013-12-12 Beijing Qianxiang Wangjing Technology Development Co., Ltd. +ren + +// rent : 2014-12-04 DERRent, LLC +rent + +// rentals : 2013-12-05 Big Hollow,LLC +rentals + +// repair : 2013-11-07 Lone Sunset, LLC +repair + +// report : 2013-12-05 Binky Glen, LLC +report + +// republican : 2014-03-20 United TLD Holdco Ltd. +republican + +// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +rest + +// restaurant : 2014-07-03 Snow Avenue, LLC +restaurant + +// review : 2014-11-20 dot Review Limited +review + +// reviews : 2013-09-13 +reviews + +// rexroth : 2015-06-18 Robert Bosch GMBH +rexroth + +// rich : 2013-11-21 I-Registry Ltd. +rich + +// richardli : 2015-05-14 Pacific Century Asset Management (HK) Limited +richardli + +// ricoh : 2014-11-20 Ricoh Company, Ltd. +ricoh + +// rightathome : 2015-07-23 Johnson Shareholdings, Inc. +rightathome + +// ril : 2015-04-02 Reliance Industries Limited +ril + +// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO +rio + +// rip : 2014-07-10 United TLD Holdco Ltd. +rip + +// rmit : 2015-11-19 Royal Melbourne Institute of Technology +rmit + +// rocher : 2014-12-18 Ferrero Trading Lux S.A. +rocher + +// rocks : 2013-11-14 +rocks + +// rodeo : 2013-12-19 Top Level Domain Holdings Limited +rodeo + +// rogers : 2015-08-06 Rogers Communications Partnership +rogers + +// room : 2014-12-18 Amazon EU S.à r.l. +room + +// rsvp : 2014-05-08 Charleston Road Registry Inc. +rsvp + +// rugby : 2016-12-15 World Rugby Strategic Developments Limited +rugby + +// ruhr : 2013-10-02 regiodot GmbH & Co. KG +ruhr + +// run : 2015-03-19 Snow Park, LLC +run + +// rwe : 2015-04-02 RWE AG +rwe + +// ryukyu : 2014-01-09 BusinessRalliart Inc. +ryukyu + +// saarland : 2013-12-12 dotSaarland GmbH +saarland + +// safe : 2014-12-18 Amazon EU S.à r.l. +safe + +// safety : 2015-01-08 Safety Registry Services, LLC. +safety + +// sakura : 2014-12-18 SAKURA Internet Inc. +sakura + +// sale : 2014-10-16 +sale + +// salon : 2014-12-11 Outer Orchard, LLC +salon + +// samsclub : 2015-07-31 Wal-Mart Stores, Inc. +samsclub + +// samsung : 2014-04-03 SAMSUNG SDS CO., LTD +samsung + +// sandvik : 2014-11-13 Sandvik AB +sandvik + +// sandvikcoromant : 2014-11-07 Sandvik AB +sandvikcoromant + +// sanofi : 2014-10-09 Sanofi +sanofi + +// sap : 2014-03-27 SAP AG +sap + +// sapo : 2014-11-07 PT Comunicacoes S.A. +sapo + +// sarl : 2014-07-03 Delta Orchard, LLC +sarl + +// sas : 2015-04-02 Research IP LLC +sas + +// save : 2015-06-25 Amazon EU S.à r.l. +save + +// saxo : 2014-10-31 Saxo Bank A/S +saxo + +// sbi : 2015-03-12 STATE BANK OF INDIA +sbi + +// sbs : 2014-11-07 SPECIAL BROADCASTING SERVICE CORPORATION +sbs + +// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ) +sca + +// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited ("SCB") +scb + +// schaeffler : 2015-08-06 Schaeffler Technologies AG & Co. KG +schaeffler + +// schmidt : 2014-04-03 SALM S.A.S. +schmidt + +// scholarships : 2014-04-24 Scholarships.com, LLC +scholarships + +// school : 2014-12-18 Little Galley, LLC +school + +// schule : 2014-03-06 Outer Moon, LLC +schule + +// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +schwarz + +// science : 2014-09-11 dot Science Limited +science + +// scjohnson : 2015-07-23 Johnson Shareholdings, Inc. +scjohnson + +// scor : 2014-10-31 SCOR SE +scor + +// scot : 2014-01-23 Dot Scot Registry Limited +scot + +// search : 2016-06-09 Charleston Road Registry Inc. +search + +// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) +seat + +// secure : 2015-08-27 Amazon EU S.à r.l. +secure + +// security : 2015-05-14 +security + +// seek : 2014-12-04 Seek Limited +seek + +// select : 2015-10-08 iSelect Ltd +select + +// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A. +sener + +// services : 2014-02-27 Fox Castle, LLC +services + +// ses : 2015-07-23 SES +ses + +// seven : 2015-08-06 Seven West Media Ltd +seven + +// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG +sew + +// sex : 2014-11-13 ICM Registry SX LLC +sex + +// sexy : 2013-09-11 Uniregistry, Corp. +sexy + +// sfr : 2015-08-13 Societe Francaise du Radiotelephone - SFR +sfr + +// shangrila : 2015-09-03 Shangri‐La International Hotel Management Limited +shangrila + +// sharp : 2014-05-01 Sharp Corporation +sharp + +// shaw : 2015-04-23 Shaw Cablesystems G.P. +shaw + +// shell : 2015-07-30 Shell Information Technology International Inc +shell + +// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +shia + +// shiksha : 2013-11-14 Afilias Limited +shiksha + +// shoes : 2013-10-02 Binky Galley, LLC +shoes + +// shop : 2016-04-08 GMO Registry, Inc. +shop + +// shopping : 2016-03-31 +shopping + +// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +shouji + +// show : 2015-03-05 Snow Beach, LLC +show + +// showtime : 2015-08-06 CBS Domains Inc. +showtime + +// shriram : 2014-01-23 Shriram Capital Ltd. +shriram + +// silk : 2015-06-25 Amazon EU S.à r.l. +silk + +// sina : 2015-03-12 Sina Corporation +sina + +// singles : 2013-08-27 Fern Madison, LLC +singles + +// site : 2015-01-15 DotSite Inc. +site + +// ski : 2015-04-09 STARTING DOT LIMITED +ski + +// skin : 2015-01-15 L'Oréal +skin + +// sky : 2014-06-19 Sky IP International Ltd, a company incorporated in England and Wales, operating via its registered Swiss branch +sky + +// skype : 2014-12-18 Microsoft Corporation +skype + +// sling : 2015-07-30 Hughes Satellite Systems Corporation +sling + +// smart : 2015-07-09 Smart Communications, Inc. (SMART) +smart + +// smile : 2014-12-18 Amazon EU S.à r.l. +smile + +// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F +sncf + +// soccer : 2015-03-26 Foggy Shadow, LLC +soccer + +// social : 2013-11-07 United TLD Holdco Ltd. +social + +// softbank : 2015-07-02 SoftBank Corp. +softbank + +// software : 2014-03-20 +software + +// sohu : 2013-12-19 Sohu.com Limited +sohu + +// solar : 2013-11-07 Ruby Town, LLC +solar + +// solutions : 2013-11-07 Silver Cover, LLC +solutions + +// song : 2015-02-26 Amazon EU S.à r.l. +song + +// sony : 2015-01-08 Sony Corporation +sony + +// soy : 2014-01-23 Charleston Road Registry Inc. +soy + +// space : 2014-04-03 DotSpace Inc. +space + +// spiegel : 2014-02-05 SPIEGEL-Verlag Rudolf Augstein GmbH & Co. KG +spiegel + +// spot : 2015-02-26 Amazon EU S.à r.l. +spot + +// spreadbetting : 2014-12-11 IG Group Holdings PLC +spreadbetting + +// srl : 2015-05-07 mySRL GmbH +srl + +// srt : 2015-07-30 FCA US LLC. +srt + +// stada : 2014-11-13 STADA Arzneimittel AG +stada + +// staples : 2015-07-30 Staples, Inc. +staples + +// star : 2015-01-08 Star India Private Limited +star + +// starhub : 2015-02-05 StarHub Ltd +starhub + +// statebank : 2015-03-12 STATE BANK OF INDIA +statebank + +// statefarm : 2015-07-30 State Farm Mutual Automobile Insurance Company +statefarm + +// statoil : 2014-12-04 Statoil ASA +statoil + +// stc : 2014-10-09 Saudi Telecom Company +stc + +// stcgroup : 2014-10-09 Saudi Telecom Company +stcgroup + +// stockholm : 2014-12-18 Stockholms kommun +stockholm + +// storage : 2014-12-22 Self Storage Company LLC +storage + +// store : 2015-04-09 DotStore Inc. +store + +// stream : 2016-01-08 dot Stream Limited +stream + +// studio : 2015-02-11 +studio + +// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD +study + +// style : 2014-12-04 Binky Moon, LLC +style + +// sucks : 2014-12-22 Vox Populi Registry Inc. +sucks + +// supplies : 2013-12-19 Atomic Fields, LLC +supplies + +// supply : 2013-12-19 Half Falls, LLC +supply + +// support : 2013-10-24 Grand Orchard, LLC +support + +// surf : 2014-01-09 Top Level Domain Holdings Limited +surf + +// surgery : 2014-03-20 Tin Avenue, LLC +surgery + +// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION +suzuki + +// swatch : 2015-01-08 The Swatch Group Ltd +swatch + +// swiftcover : 2015-07-23 Swiftcover Insurance Services Limited +swiftcover + +// swiss : 2014-10-16 Swiss Confederation +swiss + +// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet +sydney + +// symantec : 2014-12-04 Symantec Corporation +symantec + +// systems : 2013-11-07 Dash Cypress, LLC +systems + +// tab : 2014-12-04 Tabcorp Holdings Limited +tab + +// taipei : 2014-07-10 Taipei City Government +taipei + +// talk : 2015-04-09 Amazon EU S.à r.l. +talk + +// taobao : 2015-01-15 Alibaba Group Holding Limited +taobao + +// target : 2015-07-31 Target Domain Holdings, LLC +target + +// tatamotors : 2015-03-12 Tata Motors Ltd +tatamotors + +// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" +tatar + +// tattoo : 2013-08-30 Uniregistry, Corp. +tattoo + +// tax : 2014-03-20 Storm Orchard, LLC +tax + +// taxi : 2015-03-19 Pine Falls, LLC +taxi + +// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +tci + +// tdk : 2015-06-11 TDK Corporation +tdk + +// team : 2015-03-05 Atomic Lake, LLC +team + +// tech : 2015-01-30 Dot Tech LLC +tech + +// technology : 2013-09-13 Auburn Falls +technology + +// telecity : 2015-02-19 TelecityGroup International Limited +telecity + +// telefonica : 2014-10-16 Telefónica S.A. +telefonica + +// temasek : 2014-08-07 Temasek Holdings (Private) Limited +temasek + +// tennis : 2014-12-04 Cotton Bloom, LLC +tennis + +// teva : 2015-07-02 Teva Pharmaceutical Industries Limited +teva + +// thd : 2015-04-02 Homer TLC, Inc. +thd + +// theater : 2015-03-19 Blue Tigers, LLC +theater + +// theatre : 2015-05-07 +theatre + +// tiaa : 2015-07-23 Teachers Insurance and Annuity Association of America +tiaa + +// tickets : 2015-02-05 Accent Media Limited +tickets + +// tienda : 2013-11-14 Victor Manor, LLC +tienda + +// tiffany : 2015-01-30 Tiffany and Company +tiffany + +// tips : 2013-09-20 Corn Willow, LLC +tips + +// tires : 2014-11-07 Dog Edge, LLC +tires + +// tirol : 2014-04-24 punkt Tirol GmbH +tirol + +// tjmaxx : 2015-07-16 The TJX Companies, Inc. +tjmaxx + +// tjx : 2015-07-16 The TJX Companies, Inc. +tjx + +// tkmaxx : 2015-07-16 The TJX Companies, Inc. +tkmaxx + +// tmall : 2015-01-15 Alibaba Group Holding Limited +tmall + +// today : 2013-09-20 Pearl Woods, LLC +today + +// tokyo : 2013-11-13 GMO Registry, Inc. +tokyo + +// tools : 2013-11-21 Pioneer North, LLC +tools + +// top : 2014-03-20 Jiangsu Bangning Science & Technology Co.,Ltd. +top + +// toray : 2014-12-18 Toray Industries, Inc. +toray + +// toshiba : 2014-04-10 TOSHIBA Corporation +toshiba + +// total : 2015-08-06 Total SA +total + +// tours : 2015-01-22 Sugar Station, LLC +tours + +// town : 2014-03-06 Koko Moon, LLC +town + +// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION +toyota + +// toys : 2014-03-06 Pioneer Orchard, LLC +toys + +// trade : 2014-01-23 Elite Registry Limited +trade + +// trading : 2014-12-11 IG Group Holdings PLC +trading + +// training : 2013-11-07 Wild Willow, LLC +training + +// travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +travelchannel + +// travelers : 2015-03-26 Travelers TLD, LLC +travelers + +// travelersinsurance : 2015-03-26 Travelers TLD, LLC +travelersinsurance + +// trust : 2014-10-16 +trust + +// trv : 2015-03-26 Travelers TLD, LLC +trv + +// tube : 2015-06-11 Latin American Telecom LLC +tube + +// tui : 2014-07-03 TUI AG +tui + +// tunes : 2015-02-26 Amazon EU S.à r.l. +tunes + +// tushu : 2014-12-18 Amazon EU S.à r.l. +tushu + +// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED +tvs + +// ubank : 2015-08-20 National Australia Bank Limited +ubank + +// ubs : 2014-12-11 UBS AG +ubs + +// uconnect : 2015-07-30 FCA US LLC. +uconnect + +// unicom : 2015-10-15 China United Network Communications Corporation Limited +unicom + +// university : 2014-03-06 Little Station, LLC +university + +// uno : 2013-09-11 Dot Latin LLC +uno + +// uol : 2014-05-01 UBN INTERNET LTDA. +uol + +// ups : 2015-06-25 UPS Market Driver, Inc. +ups + +// vacations : 2013-12-05 Atomic Tigers, LLC +vacations + +// vana : 2014-12-11 Lifestyle Domain Holdings, Inc. +vana + +// vanguard : 2015-09-03 The Vanguard Group, Inc. +vanguard + +// vegas : 2014-01-16 Dot Vegas, Inc. +vegas + +// ventures : 2013-08-27 Binky Lake, LLC +ventures + +// verisign : 2015-08-13 VeriSign, Inc. +verisign + +// versicherung : 2014-03-20 +versicherung + +// vet : 2014-03-06 +vet + +// viajes : 2013-10-17 Black Madison, LLC +viajes + +// video : 2014-10-16 +video + +// vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe +vig + +// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd. +viking + +// villas : 2013-12-05 New Sky, LLC +villas + +// vin : 2015-06-18 Holly Shadow, LLC +vin + +// vip : 2015-01-22 Minds + Machines Group Limited +vip + +// virgin : 2014-09-25 Virgin Enterprises Limited +virgin + +// visa : 2015-07-30 Visa Worldwide Pte. Limited +visa + +// vision : 2013-12-05 Koko Station, LLC +vision + +// vista : 2014-09-18 Vistaprint Limited +vista + +// vistaprint : 2014-09-18 Vistaprint Limited +vistaprint + +// viva : 2014-11-07 Saudi Telecom Company +viva + +// vivo : 2015-07-31 Telefonica Brasil S.A. +vivo + +// vlaanderen : 2014-02-06 DNS.be vzw +vlaanderen + +// vodka : 2013-12-19 Top Level Domain Holdings Limited +vodka + +// volkswagen : 2015-05-14 Volkswagen Group of America Inc. +volkswagen + +// volvo : 2015-11-12 Volvo Holding Sverige Aktiebolag +volvo + +// vote : 2013-11-21 Monolith Registry LLC +vote + +// voting : 2013-11-13 Valuetainment Corp. +voting + +// voto : 2013-11-21 Monolith Registry LLC +voto + +// voyage : 2013-08-27 Ruby House, LLC +voyage + +// vuelos : 2015-03-05 Travel Reservations SRL +vuelos + +// wales : 2014-05-08 Nominet UK +wales + +// walmart : 2015-07-31 Wal-Mart Stores, Inc. +walmart + +// walter : 2014-11-13 Sandvik AB +walter + +// wang : 2013-10-24 Zodiac Leo Limited +wang + +// wanggou : 2014-12-18 Amazon EU S.à r.l. +wanggou + +// warman : 2015-06-18 Weir Group IP Limited +warman + +// watch : 2013-11-14 Sand Shadow, LLC +watch + +// watches : 2014-12-22 Richemont DNS Inc. +watches + +// weather : 2015-01-08 The Weather Channel, LLC +weather + +// weatherchannel : 2015-03-12 The Weather Channel, LLC +weatherchannel + +// webcam : 2014-01-23 dot Webcam Limited +webcam + +// weber : 2015-06-04 Saint-Gobain Weber SA +weber + +// website : 2014-04-03 DotWebsite Inc. +website + +// wed : 2013-10-01 Atgron, Inc. +wed + +// wedding : 2014-04-24 Top Level Domain Holdings Limited +wedding + +// weibo : 2015-03-05 Sina Corporation +weibo + +// weir : 2015-01-29 Weir Group IP Limited +weir + +// whoswho : 2014-02-20 Who's Who Registry +whoswho + +// wien : 2013-10-28 punkt.wien GmbH +wien + +// wiki : 2013-11-07 Top Level Design, LLC +wiki + +// williamhill : 2014-03-13 William Hill Organization Limited +williamhill + +// win : 2014-11-20 First Registry Limited +win + +// windows : 2014-12-18 Microsoft Corporation +windows + +// wine : 2015-06-18 June Station, LLC +wine + +// winners : 2015-07-16 The TJX Companies, Inc. +winners + +// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC +wme + +// wolterskluwer : 2015-08-06 Wolters Kluwer N.V. +wolterskluwer + +// woodside : 2015-07-09 Woodside Petroleum Limited +woodside + +// work : 2013-12-19 Top Level Domain Holdings Limited +work + +// works : 2013-11-14 Little Dynamite, LLC +works + +// world : 2014-06-12 Bitter Fields, LLC +world + +// wow : 2015-10-08 Amazon EU S.à r.l. +wow + +// wtc : 2013-12-19 World Trade Centers Association, Inc. +wtc + +// wtf : 2014-03-06 Hidden Way, LLC +wtf + +// xbox : 2014-12-18 Microsoft Corporation +xbox + +// xerox : 2014-10-24 Xerox DNHC LLC +xerox + +// xfinity : 2015-07-09 Comcast IP Holdings I, LLC +xfinity + +// xihuan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +xihuan + +// xin : 2014-12-11 Elegant Leader Limited +xin + +// xn--11b4c3d : 2015-01-15 VeriSign Sarl +कॉम + +// xn--1ck2e1b : 2015-02-26 Amazon EU S.à r.l. +セール + +// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd. +佛山 + +// xn--30rr7y : 2014-06-12 Excellent First Limited +慈善 + +// xn--3bst00m : 2013-09-13 Eagle Horizon Limited +集团 + +// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED +在线 + +// xn--3oq18vl8pn36a : 2015-07-02 Volkswagen (China) Investment Co., Ltd. +大众汽车 + +// xn--3pxu8k : 2015-01-15 VeriSign Sarl +点看 + +// xn--42c2d9a : 2015-01-15 VeriSign Sarl +คอม + +// xn--45q11c : 2013-11-21 Zodiac Scorpio Limited +八卦 + +// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment +موقع + +// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center +公益 + +// xn--55qx5d : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) +公司 + +// xn--5su34j936bgsg : 2015-09-03 Shangri‐La International Hotel Management Limited +香格里拉 + +// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited +网站 + +// xn--6frz82g : 2013-09-23 Afilias Limited +移动 + +// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited +我爱你 + +// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +москва + +// xn--80aqecdr1a : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +католик + +// xn--80asehdb : 2013-07-14 CORE Association +онлайн + +// xn--80aswg : 2013-07-14 CORE Association +сайт + +// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited +联通 + +// xn--9dbq2a : 2015-01-15 VeriSign Sarl +קום + +// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED +时尚 + +// xn--9krt00a : 2015-03-12 Sina Corporation +微博 + +// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited +淡马锡 + +// xn--bck1b9a5dre4c : 2015-02-26 Amazon EU S.à r.l. +ファッション + +// xn--c1avg : 2013-11-14 Public Interest Registry +орг + +// xn--c2br7g : 2015-01-15 VeriSign Sarl +नेट + +// xn--cck2b3b : 2015-02-26 Amazon EU S.à r.l. +ストア + +// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD +삼성 + +// xn--czr694b : 2014-01-16 Dot Trademark TLD Holding Company Limited +商标 + +// xn--czrs0t : 2013-12-19 Wild Island, LLC +商店 + +// xn--czru2d : 2013-11-21 Zodiac Capricorn Limited +商城 + +// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet” +дети + +// xn--eckvdtc9d : 2014-12-18 Amazon EU S.à r.l. +ポイント + +// xn--efvy88h : 2014-08-22 Xinhua News Agency Guangdong Branch 新华通讯社广东分社 +新闻 + +// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited +工行 + +// xn--fct429k : 2015-04-09 Amazon EU S.à r.l. +家電 + +// xn--fhbei : 2015-01-15 VeriSign Sarl +كوم + +// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED +中文网 + +// xn--fiq64b : 2013-10-14 CITIC Group Corporation +中信 + +// xn--fjq720a : 2014-05-22 Will Bloom, LLC +娱乐 + +// xn--flw351e : 2014-07-31 Charleston Road Registry Inc. +谷歌 + +// xn--fzys8d69uvgm : 2015-05-14 PCCW Enterprises Limited +電訊盈科 + +// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited +购物 + +// xn--gckr3f0f : 2015-02-26 Amazon EU S.à r.l. +クラウド + +// xn--gk3at1e : 2015-10-08 Amazon EU S.à r.l. +通販 + +// xn--hxt814e : 2014-05-15 Zodiac Libra Limited +网店 + +// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry +संगठन + +// xn--imr513n : 2014-12-11 Dot Trademark TLD Holding Company Limited +餐厅 + +// xn--io0a7i : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) +网络 + +// xn--j1aef : 2015-01-15 VeriSign Sarl +ком + +// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation +诺基亚 + +// xn--jvr189m : 2015-02-26 Amazon EU S.à r.l. +食品 + +// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V. +飞利浦 + +// xn--kpu716f : 2014-12-22 Richemont DNS Inc. +手表 + +// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd +手机 + +// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company +ارامكو + +// xn--mgba7c0bbn0a : 2015-05-14 Crescent Holding GmbH +العليان + +// xn--mgbaakc7dvf : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +اتصالات + +// xn--mgbab2bd : 2013-10-31 CORE Association +بازار + +// xn--mgbb9fbpob : 2014-12-18 GreenTech Consultancy Company W.L.L. +موبايلي + +// xn--mgbca7dzdo : 2015-07-30 Abu Dhabi Systems and Information Centre +ابوظبي + +// xn--mgbi4ecexp : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +كاثوليك + +// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +همراه + +// xn--mk1bu44c : 2015-01-15 VeriSign Sarl +닷컴 + +// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd. +政府 + +// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd. +شبكة + +// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House +بيتك + +// xn--ngbrx : 2015-11-12 League of Arab States +عرب + +// xn--nqv7f : 2013-11-14 Public Interest Registry +机构 + +// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry +组织机构 + +// xn--nyqy26a : 2014-11-07 Stable Tone Limited +健康 + +// xn--p1acf : 2013-12-12 Rusnames Limited +рус + +// xn--pbt977c : 2014-12-22 Richemont DNS Inc. +珠宝 + +// xn--pssy2u : 2015-01-15 VeriSign Sarl +大拿 + +// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc. +みんな + +// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc. +グーグル + +// xn--rhqv96g : 2013-09-11 Stable Tone Limited +世界 + +// xn--rovu88b : 2015-02-26 Amazon EU S.à r.l. +書籍 + +// xn--ses554g : 2014-01-16 +网址 + +// xn--t60b56a : 2015-01-15 VeriSign Sarl +닷넷 + +// xn--tckwe : 2015-01-15 VeriSign Sarl +コム + +// xn--tiq49xqyj : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +天主教 + +// xn--unup4y : 2013-07-14 Spring Fields, LLC +游戏 + +// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberater + +// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberatung + +// xn--vhquv : 2013-08-27 Dash McCook, LLC +企业 + +// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd. +信息 + +// xn--w4r85el8fhu5dnra : 2015-04-30 Kerry Trading Co. Limited +嘉里大酒店 + +// xn--w4rs40l : 2015-07-30 Kerry Trading Co. Limited +嘉里 + +// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd. +广东 + +// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center +政务 + +// xperia : 2015-05-14 Sony Mobile Communications AB +xperia + +// xyz : 2013-12-05 XYZ.COM LLC +xyz + +// yachts : 2014-01-09 DERYachts, LLC +yachts + +// yahoo : 2015-04-02 Yahoo! Domain Services Inc. +yahoo + +// yamaxun : 2014-12-18 Amazon EU S.à r.l. +yamaxun + +// yandex : 2014-04-10 YANDEX, LLC +yandex + +// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +yodobashi + +// yoga : 2014-05-29 Top Level Domain Holdings Limited +yoga + +// yokohama : 2013-12-12 GMO Registry, Inc. +yokohama + +// you : 2015-04-09 Amazon EU S.à r.l. +you + +// youtube : 2014-05-01 Charleston Road Registry Inc. +youtube + +// yun : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +yun + +// zappos : 2015-06-25 Amazon EU S.à r.l. +zappos + +// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) +zara + +// zero : 2014-12-18 Amazon EU S.à r.l. +zero + +// zip : 2014-05-08 Charleston Road Registry Inc. +zip + +// zippo : 2015-07-02 Zadco Company +zippo + +// zone : 2013-11-14 Outer Falls, LLC +zone + +// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich) +zuerich + + +// ===END ICANN DOMAINS=== +// ===BEGIN PRIVATE DOMAINS=== +// (Note: these are in alphabetical order by company name) + +// 1GB LLC : https://www.1gb.ua/ +// Submitted by 1GB LLC +cc.ua +inf.ua +ltd.ua + +// Agnat sp. z o.o. : https://domena.pl +// Submitted by Przemyslaw Plewa +beep.pl + +// Alces Software Ltd : http://alces-software.com +// Submitted by Mark J. Titorenko +*.compute.estate +*.alces.network + +// alwaysdata : https://www.alwaysdata.com +// Submitted by Cyril +*.alwaysdata.net + +// Amazon CloudFront : https://aws.amazon.com/cloudfront/ +// Submitted by Donavan Miller +cloudfront.net + +// Amazon Elastic Compute Cloud : https://aws.amazon.com/ec2/ +// Submitted by Luke Wells +*.compute.amazonaws.com +*.compute-1.amazonaws.com +*.compute.amazonaws.com.cn +us-east-1.amazonaws.com + +// Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ +// Submitted by Luke Wells +cn-north-1.eb.amazonaws.com.cn +elasticbeanstalk.com +ap-northeast-1.elasticbeanstalk.com +ap-northeast-2.elasticbeanstalk.com +ap-south-1.elasticbeanstalk.com +ap-southeast-1.elasticbeanstalk.com +ap-southeast-2.elasticbeanstalk.com +ca-central-1.elasticbeanstalk.com +eu-central-1.elasticbeanstalk.com +eu-west-1.elasticbeanstalk.com +eu-west-2.elasticbeanstalk.com +sa-east-1.elasticbeanstalk.com +us-east-1.elasticbeanstalk.com +us-east-2.elasticbeanstalk.com +us-gov-west-1.elasticbeanstalk.com +us-west-1.elasticbeanstalk.com +us-west-2.elasticbeanstalk.com + +// Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/ +// Submitted by Luke Wells +*.elb.amazonaws.com +*.elb.amazonaws.com.cn + +// Amazon S3 : https://aws.amazon.com/s3/ +// Submitted by Luke Wells +s3.amazonaws.com +s3-ap-northeast-1.amazonaws.com +s3-ap-northeast-2.amazonaws.com +s3-ap-south-1.amazonaws.com +s3-ap-southeast-1.amazonaws.com +s3-ap-southeast-2.amazonaws.com +s3-ca-central-1.amazonaws.com +s3-eu-central-1.amazonaws.com +s3-eu-west-1.amazonaws.com +s3-eu-west-2.amazonaws.com +s3-external-1.amazonaws.com +s3-fips-us-gov-west-1.amazonaws.com +s3-sa-east-1.amazonaws.com +s3-us-gov-west-1.amazonaws.com +s3-us-east-2.amazonaws.com +s3-us-west-1.amazonaws.com +s3-us-west-2.amazonaws.com +s3.ap-northeast-2.amazonaws.com +s3.ap-south-1.amazonaws.com +s3.cn-north-1.amazonaws.com.cn +s3.ca-central-1.amazonaws.com +s3.eu-central-1.amazonaws.com +s3.eu-west-2.amazonaws.com +s3.us-east-2.amazonaws.com +s3.dualstack.ap-northeast-1.amazonaws.com +s3.dualstack.ap-northeast-2.amazonaws.com +s3.dualstack.ap-south-1.amazonaws.com +s3.dualstack.ap-southeast-1.amazonaws.com +s3.dualstack.ap-southeast-2.amazonaws.com +s3.dualstack.ca-central-1.amazonaws.com +s3.dualstack.eu-central-1.amazonaws.com +s3.dualstack.eu-west-1.amazonaws.com +s3.dualstack.eu-west-2.amazonaws.com +s3.dualstack.sa-east-1.amazonaws.com +s3.dualstack.us-east-1.amazonaws.com +s3.dualstack.us-east-2.amazonaws.com +s3-website-us-east-1.amazonaws.com +s3-website-us-west-1.amazonaws.com +s3-website-us-west-2.amazonaws.com +s3-website-ap-northeast-1.amazonaws.com +s3-website-ap-southeast-1.amazonaws.com +s3-website-ap-southeast-2.amazonaws.com +s3-website-eu-west-1.amazonaws.com +s3-website-sa-east-1.amazonaws.com +s3-website.ap-northeast-2.amazonaws.com +s3-website.ap-south-1.amazonaws.com +s3-website.ca-central-1.amazonaws.com +s3-website.eu-central-1.amazonaws.com +s3-website.eu-west-2.amazonaws.com +s3-website.us-east-2.amazonaws.com + +// Amune : https://amune.org/ +// Submitted by Team Amune +t3l3p0rt.net +tele.amune.org + +// Aptible : https://www.aptible.com/ +// Submitted by Thomas Orozco +on-aptible.com + +// Asociación Amigos de la Informática "Euskalamiga" : http://encounter.eus/ +// Submitted by Hector Martin +user.party.eus + +// Association potager.org : https://potager.org/ +// Submitted by Lunar +pimienta.org +poivron.org +potager.org +sweetpepper.org + +// ASUSTOR Inc. : http://www.asustor.com +// Submitted by Vincent Tseng +myasustor.com + +// AVM : https://avm.de +// Submitted by Andreas Weise +myfritz.net + +// AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com +// Submitted by James Kennedy +*.awdev.ca +*.advisor.ws + +// backplane : https://www.backplane.io +// Submitted by Anthony Voutas +backplaneapp.io + +// BetaInABox +// Submitted by Adrian +betainabox.com + +// BinaryLane : http://www.binarylane.com +// Submitted by Nathan O'Sullivan +bnr.la + +// Boomla : https://boomla.com +// Submitted by Tibor Halter +boomla.net + +// Boxfuse : https://boxfuse.com +// Submitted by Axel Fontaine +boxfuse.io + +// bplaced : https://www.bplaced.net/ +// Submitted by Miroslav Bozic +square7.ch +bplaced.com +bplaced.de +square7.de +bplaced.net +square7.net + +// BrowserSafetyMark +// Submitted by Dave Tharp +browsersafetymark.io + +// callidomus : https://www.callidomus.com/ +// Submitted by Marcus Popp +mycd.eu + +// CentralNic : http://www.centralnic.com/names/domains +// Submitted by registry +ae.org +ar.com +br.com +cn.com +com.de +com.se +de.com +eu.com +gb.com +gb.net +hu.com +hu.net +jp.net +jpn.com +kr.com +mex.com +no.com +qc.com +ru.com +sa.com +se.com +se.net +uk.com +uk.net +us.com +uy.com +za.bz +za.com + +// Africa.com Web Solutions Ltd : https://registry.africa.com +// Submitted by Gavin Brown +africa.com + +// iDOT Services Limited : http://www.domain.gr.com +// Submitted by Gavin Brown +gr.com + +// Radix FZC : http://domains.in.net +// Submitted by Gavin Brown +in.net + +// US REGISTRY LLC : http://us.org +// Submitted by Gavin Brown +us.org + +// co.com Registry, LLC : https://registry.co.com +// Submitted by Gavin Brown +co.com + +// c.la : http://www.c.la/ +c.la + +// certmgr.org : https://certmgr.org +// Submitted by B. Blechschmidt +certmgr.org + +// Citrix : https://citrix.com +// Submitted by Alex Stoddard +xenapponazure.com + +// ClearVox : http://www.clearvox.nl/ +// Submitted by Leon Rowland +virtueeldomein.nl + +// Cloud66 : https://www.cloud66.com/ +// Submitted by Khash Sajadi +c66.me + +// CloudAccess.net : https://www.cloudaccess.net/ +// Submitted by Pawel Panek +jdevcloud.com +wpdevcloud.com +cloudaccess.host +freesite.host +cloudaccess.net + +// cloudControl : https://www.cloudcontrol.com/ +// Submitted by Tobias Wilken +cloudcontrolled.com +cloudcontrolapp.com + +// co.ca : http://registry.co.ca/ +co.ca + +// i-registry s.r.o. : http://www.i-registry.cz/ +// Submitted by Martin Semrad +co.cz + +// CDN77.com : http://www.cdn77.com +// Submitted by Jan Krpes +c.cdn77.org +cdn77-ssl.net +r.cdn77.net +rsc.cdn77.org +ssl.origin.cdn77-secure.org + +// Cloud DNS Ltd : http://www.cloudns.net +// Submitted by Aleksander Hristov +cloudns.asia +cloudns.biz +cloudns.club +cloudns.cc +cloudns.eu +cloudns.in +cloudns.info +cloudns.org +cloudns.pro +cloudns.pw +cloudns.us + +// CoDNS B.V. +co.nl +co.no + +// COSIMO GmbH : http://www.cosimo.de +// Submitted by Rene Marticke +dyn.cosidns.de +dynamisches-dns.de +dnsupdater.de +internet-dns.de +l-o-g-i-n.de +dynamic-dns.info +feste-ip.net +knx-server.net +static-access.net + +// Craynic, s.r.o. : http://www.craynic.com/ +// Submitted by Ales Krajnik +realm.cz + +// Cryptonomic : https://cryptonomic.net/ +// Submitted by Andrew Cady +*.cryptonomic.net + +// Cupcake : https://cupcake.io/ +// Submitted by Jonathan Rudenberg +cupcake.is + +// cyon GmbH : https://www.cyon.ch/ +// Submitted by Dominic Luechinger +cyon.link +cyon.site + +// Daplie, Inc : https://daplie.com +// Submitted by AJ ONeal +daplie.me +localhost.daplie.me + +// Dansk.net : http://www.dansk.net/ +// Submitted by Anani Voule +biz.dk +co.dk +firm.dk +reg.dk +store.dk + +// Debian : https://www.debian.org/ +// Submitted by Peter Palfrader / Debian Sysadmin Team +debian.net + +// deSEC : https://desec.io/ +// Submitted by Peter Thomassen +dedyn.io + +// DNShome : https://www.dnshome.de/ +// Submitted by Norbert Auler +dnshome.de + +// DrayTek Corp. : https://www.draytek.com/ +// Submitted by Paul Fang +drayddns.com + +// DreamHost : http://www.dreamhost.com/ +// Submitted by Andrew Farmer +dreamhosters.com + +// Drobo : http://www.drobo.com/ +// Submitted by Ricardo Padilha +mydrobo.com + +// Drud Holdings, LLC. : https://www.drud.com/ +// Submitted by Kevin Bridges +drud.io +drud.us + +// DuckDNS : http://www.duckdns.org/ +// Submitted by Richard Harper +duckdns.org + +// dy.fi : http://dy.fi/ +// Submitted by Heikki Hannikainen +dy.fi +tunk.org + +// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/ +dyndns-at-home.com +dyndns-at-work.com +dyndns-blog.com +dyndns-free.com +dyndns-home.com +dyndns-ip.com +dyndns-mail.com +dyndns-office.com +dyndns-pics.com +dyndns-remote.com +dyndns-server.com +dyndns-web.com +dyndns-wiki.com +dyndns-work.com +dyndns.biz +dyndns.info +dyndns.org +dyndns.tv +at-band-camp.net +ath.cx +barrel-of-knowledge.info +barrell-of-knowledge.info +better-than.tv +blogdns.com +blogdns.net +blogdns.org +blogsite.org +boldlygoingnowhere.org +broke-it.net +buyshouses.net +cechire.com +dnsalias.com +dnsalias.net +dnsalias.org +dnsdojo.com +dnsdojo.net +dnsdojo.org +does-it.net +doesntexist.com +doesntexist.org +dontexist.com +dontexist.net +dontexist.org +doomdns.com +doomdns.org +dvrdns.org +dyn-o-saur.com +dynalias.com +dynalias.net +dynalias.org +dynathome.net +dyndns.ws +endofinternet.net +endofinternet.org +endoftheinternet.org +est-a-la-maison.com +est-a-la-masion.com +est-le-patron.com +est-mon-blogueur.com +for-better.biz +for-more.biz +for-our.info +for-some.biz +for-the.biz +forgot.her.name +forgot.his.name +from-ak.com +from-al.com +from-ar.com +from-az.net +from-ca.com +from-co.net +from-ct.com +from-dc.com +from-de.com +from-fl.com +from-ga.com +from-hi.com +from-ia.com +from-id.com +from-il.com +from-in.com +from-ks.com +from-ky.com +from-la.net +from-ma.com +from-md.com +from-me.org +from-mi.com +from-mn.com +from-mo.com +from-ms.com +from-mt.com +from-nc.com +from-nd.com +from-ne.com +from-nh.com +from-nj.com +from-nm.com +from-nv.com +from-ny.net +from-oh.com +from-ok.com +from-or.com +from-pa.com +from-pr.com +from-ri.com +from-sc.com +from-sd.com +from-tn.com +from-tx.com +from-ut.com +from-va.com +from-vt.com +from-wa.com +from-wi.com +from-wv.com +from-wy.com +ftpaccess.cc +fuettertdasnetz.de +game-host.org +game-server.cc +getmyip.com +gets-it.net +go.dyndns.org +gotdns.com +gotdns.org +groks-the.info +groks-this.info +ham-radio-op.net +here-for-more.info +hobby-site.com +hobby-site.org +home.dyndns.org +homedns.org +homeftp.net +homeftp.org +homeip.net +homelinux.com +homelinux.net +homelinux.org +homeunix.com +homeunix.net +homeunix.org +iamallama.com +in-the-band.net +is-a-anarchist.com +is-a-blogger.com +is-a-bookkeeper.com +is-a-bruinsfan.org +is-a-bulls-fan.com +is-a-candidate.org +is-a-caterer.com +is-a-celticsfan.org +is-a-chef.com +is-a-chef.net +is-a-chef.org +is-a-conservative.com +is-a-cpa.com +is-a-cubicle-slave.com +is-a-democrat.com +is-a-designer.com +is-a-doctor.com +is-a-financialadvisor.com +is-a-geek.com +is-a-geek.net +is-a-geek.org +is-a-green.com +is-a-guru.com +is-a-hard-worker.com +is-a-hunter.com +is-a-knight.org +is-a-landscaper.com +is-a-lawyer.com +is-a-liberal.com +is-a-libertarian.com +is-a-linux-user.org +is-a-llama.com +is-a-musician.com +is-a-nascarfan.com +is-a-nurse.com +is-a-painter.com +is-a-patsfan.org +is-a-personaltrainer.com +is-a-photographer.com +is-a-player.com +is-a-republican.com +is-a-rockstar.com +is-a-socialist.com +is-a-soxfan.org +is-a-student.com +is-a-teacher.com +is-a-techie.com +is-a-therapist.com +is-an-accountant.com +is-an-actor.com +is-an-actress.com +is-an-anarchist.com +is-an-artist.com +is-an-engineer.com +is-an-entertainer.com +is-by.us +is-certified.com +is-found.org +is-gone.com +is-into-anime.com +is-into-cars.com +is-into-cartoons.com +is-into-games.com +is-leet.com +is-lost.org +is-not-certified.com +is-saved.org +is-slick.com +is-uberleet.com +is-very-bad.org +is-very-evil.org +is-very-good.org +is-very-nice.org +is-very-sweet.org +is-with-theband.com +isa-geek.com +isa-geek.net +isa-geek.org +isa-hockeynut.com +issmarterthanyou.com +isteingeek.de +istmein.de +kicks-ass.net +kicks-ass.org +knowsitall.info +land-4-sale.us +lebtimnetz.de +leitungsen.de +likes-pie.com +likescandy.com +merseine.nu +mine.nu +misconfused.org +mypets.ws +myphotos.cc +neat-url.com +office-on-the.net +on-the-web.tv +podzone.net +podzone.org +readmyblog.org +saves-the-whales.com +scrapper-site.net +scrapping.cc +selfip.biz +selfip.com +selfip.info +selfip.net +selfip.org +sells-for-less.com +sells-for-u.com +sells-it.net +sellsyourhome.org +servebbs.com +servebbs.net +servebbs.org +serveftp.net +serveftp.org +servegame.org +shacknet.nu +simple-url.com +space-to-rent.com +stuff-4-sale.org +stuff-4-sale.us +teaches-yoga.com +thruhere.net +traeumtgerade.de +webhop.biz +webhop.info +webhop.net +webhop.org +worse-than.tv +writesthisblog.com + +// ddnss.de : https://www.ddnss.de/ +// Submitted by Robert Niedziela +ddnss.de +dyn.ddnss.de +dyndns.ddnss.de +dyndns1.de +dyn-ip24.de +home-webserver.de +dyn.home-webserver.de +myhome-server.de +ddnss.org + +// Definima : http://www.definima.com/ +// Submitted by Maxence Bitterli +definima.net +definima.io + +// Dynu.com : https://www.dynu.com/ +// Submitted by Sue Ye +ddnsfree.com +ddnsgeek.com +giize.com +gleeze.com +kozow.com +loseyourip.com +ooguy.com +theworkpc.com +casacam.net +dynu.net +accesscam.org +camdvr.org +freeddns.org +mywire.org +webredirect.org +myddns.rocks +blogsite.xyz + +// dynv6 : https://dynv6.com +// Submitted by Dominik Menke +dynv6.net + +// E4YOU spol. s.r.o. : https://e4you.cz/ +// Submitted by Vladimir Dudr +e4.cz + +// Enalean SAS: https://www.enalean.com +// Submitted by Thomas Cottier +mytuleap.com + +// Enonic : http://enonic.com/ +// Submitted by Erik Kaareng-Sunde +enonic.io +customer.enonic.io + +// EU.org https://eu.org/ +// Submitted by Pierre Beyssac +eu.org +al.eu.org +asso.eu.org +at.eu.org +au.eu.org +be.eu.org +bg.eu.org +ca.eu.org +cd.eu.org +ch.eu.org +cn.eu.org +cy.eu.org +cz.eu.org +de.eu.org +dk.eu.org +edu.eu.org +ee.eu.org +es.eu.org +fi.eu.org +fr.eu.org +gr.eu.org +hr.eu.org +hu.eu.org +ie.eu.org +il.eu.org +in.eu.org +int.eu.org +is.eu.org +it.eu.org +jp.eu.org +kr.eu.org +lt.eu.org +lu.eu.org +lv.eu.org +mc.eu.org +me.eu.org +mk.eu.org +mt.eu.org +my.eu.org +net.eu.org +ng.eu.org +nl.eu.org +no.eu.org +nz.eu.org +paris.eu.org +pl.eu.org +pt.eu.org +q-a.eu.org +ro.eu.org +ru.eu.org +se.eu.org +si.eu.org +sk.eu.org +tr.eu.org +uk.eu.org +us.eu.org + +// Evennode : http://www.evennode.com/ +// Submitted by Michal Kralik +eu-1.evennode.com +eu-2.evennode.com +eu-3.evennode.com +eu-4.evennode.com +us-1.evennode.com +us-2.evennode.com +us-3.evennode.com +us-4.evennode.com + +// eDirect Corp. : https://hosting.url.com.tw/ +// Submitted by C.S. chang +twmail.cc +twmail.net +twmail.org +mymailer.com.tw +url.tw + +// Facebook, Inc. +// Submitted by Peter Ruibal +apps.fbsbx.com + +// FAITID : https://faitid.org/ +// Submitted by Maxim Alzoba +// https://www.flexireg.net/stat_info +ru.net +adygeya.ru +bashkiria.ru +bir.ru +cbg.ru +com.ru +dagestan.ru +grozny.ru +kalmykia.ru +kustanai.ru +marine.ru +mordovia.ru +msk.ru +mytis.ru +nalchik.ru +nov.ru +pyatigorsk.ru +spb.ru +vladikavkaz.ru +vladimir.ru +abkhazia.su +adygeya.su +aktyubinsk.su +arkhangelsk.su +armenia.su +ashgabad.su +azerbaijan.su +balashov.su +bashkiria.su +bryansk.su +bukhara.su +chimkent.su +dagestan.su +east-kazakhstan.su +exnet.su +georgia.su +grozny.su +ivanovo.su +jambyl.su +kalmykia.su +kaluga.su +karacol.su +karaganda.su +karelia.su +khakassia.su +krasnodar.su +kurgan.su +kustanai.su +lenug.su +mangyshlak.su +mordovia.su +msk.su +murmansk.su +nalchik.su +navoi.su +north-kazakhstan.su +nov.su +obninsk.su +penza.su +pokrovsk.su +sochi.su +spb.su +tashkent.su +termez.su +togliatti.su +troitsk.su +tselinograd.su +tula.su +tuva.su +vladikavkaz.su +vladimir.su +vologda.su + +// Fancy Bits, LLC : http://getchannels.com +// Submitted by Aman Gupta +channelsdvr.net + +// Fastly Inc. : http://www.fastly.com/ +// Submitted by Fastly Security +fastlylb.net +map.fastlylb.net +freetls.fastly.net +map.fastly.net +a.prod.fastly.net +global.prod.fastly.net +a.ssl.fastly.net +b.ssl.fastly.net +global.ssl.fastly.net + +// Featherhead : https://featherhead.xyz/ +// Submitted by Simon Menke +fhapp.xyz + +// Fedora : https://fedoraproject.org/ +// submitted by Patrick Uiterwijk +fedorainfracloud.org +fedorapeople.org +cloud.fedoraproject.org + +// Filegear Inc. : https://www.filegear.com +// Submitted by Jason Zhu +filegear.me + +// Firebase, Inc. +// Submitted by Chris Raynor +firebaseapp.com + +// Flynn : https://flynn.io +// Submitted by Jonathan Rudenberg +flynnhub.com +flynnhosting.net + +// Freebox : http://www.freebox.fr +// Submitted by Romain Fliedel +freebox-os.com +freeboxos.com +fbx-os.fr +fbxos.fr +freebox-os.fr +freeboxos.fr + +// Fusion Intranet : https://www.fusion-intranet.com +// Submitted by Matthias Burtscher +myfusion.cloud + +// Futureweb OG : http://www.futureweb.at +// Submitted by Andreas Schnederle-Wagner +*.futurecms.at +futurehosting.at +futuremailing.at +*.ex.ortsinfo.at +*.kunden.ortsinfo.at +*.statics.cloud + +// GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains +// Submitted by David Illsley +service.gov.uk + +// GitHub, Inc. +// Submitted by Patrick Toomey +github.io +githubusercontent.com + +// GitLab, Inc. +// Submitted by Alex Hanselka +gitlab.io + +// UKHomeOffice : https://www.gov.uk/government/organisations/home-office +// Submitted by Jon Shanks +homeoffice.gov.uk + +// GlobeHosting, Inc. +// Submitted by Zoltan Egresi +ro.im +shop.ro + +// GoIP DNS Services : http://www.goip.de +// Submitted by Christian Poulter +goip.de + +// Google, Inc. +// Submitted by Eduardo Vela +*.0emm.com +appspot.com +blogspot.ae +blogspot.al +blogspot.am +blogspot.ba +blogspot.be +blogspot.bg +blogspot.bj +blogspot.ca +blogspot.cf +blogspot.ch +blogspot.cl +blogspot.co.at +blogspot.co.id +blogspot.co.il +blogspot.co.ke +blogspot.co.nz +blogspot.co.uk +blogspot.co.za +blogspot.com +blogspot.com.ar +blogspot.com.au +blogspot.com.br +blogspot.com.by +blogspot.com.co +blogspot.com.cy +blogspot.com.ee +blogspot.com.eg +blogspot.com.es +blogspot.com.mt +blogspot.com.ng +blogspot.com.tr +blogspot.com.uy +blogspot.cv +blogspot.cz +blogspot.de +blogspot.dk +blogspot.fi +blogspot.fr +blogspot.gr +blogspot.hk +blogspot.hr +blogspot.hu +blogspot.ie +blogspot.in +blogspot.is +blogspot.it +blogspot.jp +blogspot.kr +blogspot.li +blogspot.lt +blogspot.lu +blogspot.md +blogspot.mk +blogspot.mr +blogspot.mx +blogspot.my +blogspot.nl +blogspot.no +blogspot.pe +blogspot.pt +blogspot.qa +blogspot.re +blogspot.ro +blogspot.rs +blogspot.ru +blogspot.se +blogspot.sg +blogspot.si +blogspot.sk +blogspot.sn +blogspot.td +blogspot.tw +blogspot.ug +blogspot.vn +cloudfunctions.net +cloud.goog +codespot.com +googleapis.com +googlecode.com +pagespeedmobilizer.com +publishproxy.com +withgoogle.com +withyoutube.com + +// Hashbang : https://hashbang.sh +hashbang.sh + +// Hasura : https://hasura.io +// Submitted by Shahidh K Muhammed +hasura-app.io + +// Hepforge : https://www.hepforge.org +// Submitted by David Grellscheid +hepforge.org + +// Heroku : https://www.heroku.com/ +// Submitted by Tom Maher +herokuapp.com +herokussl.com + +// Ici la Lune : http://www.icilalune.com/ +// Submitted by Simon Morvan +moonscale.net + +// iki.fi +// Submitted by Hannu Aronsson +iki.fi + +// info.at : http://www.info.at/ +biz.at +info.at + +// info.cx : http://info.cx +// Submitted by Jacob Slater +info.cx + +// Interlegis : http://www.interlegis.leg.br +// Submitted by Gabriel Ferreira +ac.leg.br +al.leg.br +am.leg.br +ap.leg.br +ba.leg.br +ce.leg.br +df.leg.br +es.leg.br +go.leg.br +ma.leg.br +mg.leg.br +ms.leg.br +mt.leg.br +pa.leg.br +pb.leg.br +pe.leg.br +pi.leg.br +pr.leg.br +rj.leg.br +rn.leg.br +ro.leg.br +rr.leg.br +rs.leg.br +sc.leg.br +se.leg.br +sp.leg.br +to.leg.br + +// intermetrics GmbH : https://pixolino.com/ +// Submitted by Wolfgang Schwarz +pixolino.com + +// IPiFony Systems, Inc. : https://www.ipifony.com/ +// Submitted by Matthew Hardeman +ipifony.net + +// Joyent : https://www.joyent.com/ +// Submitted by Brian Bennett +*.triton.zone +*.cns.joyent.com + +// JS.ORG : http://dns.js.org +// Submitted by Stefan Keim +js.org + +// Keyweb AG : https://www.keyweb.de +// Submitted by Martin Dannehl +keymachine.de + +// KnightPoint Systems, LLC : http://www.knightpoint.com/ +// Submitted by Roy Keene +knightpoint.systems + +// .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf +co.krd +edu.krd + +// LCube - Professional hosting e.K. : https://www.lcube-webhosting.de +// Submitted by Lars Laehn +git-repos.de +lcube-server.de +svn-repos.de + +// LiquidNet Ltd : http://www.liquidnetlimited.com/ +// Submitted by Victor Velchev +we.bs + +// Lukanet Ltd : https://lukanet.com +// Submitted by Anton Avramov +barsy.bg +barsyonline.com +barsy.de +barsy.eu +barsy.in +barsy.net +barsy.online +barsy.support + +// Magento Commerce +// Submitted by Damien Tournoud +*.magentosite.cloud + +// Mail.Ru Group : https://hb.cldmail.ru +// Submitted by Ilya Zaretskiy +hb.cldmail.ru + +// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ +// Submitted by Zdeněk Šustr +cloud.metacentrum.cz +custom.metacentrum.cz + +// Meteor Development Group : https://www.meteor.com/hosting +// Submitted by Pierre Carrier +meteorapp.com +eu.meteorapp.com + +// Michau Enterprises Limited : http://www.co.pl/ +co.pl + +// Microsoft : http://microsoft.com +// Submitted by Barry Dorrans +azurewebsites.net +azure-mobile.net +cloudapp.net + +// Mozilla Foundation : https://mozilla.org/ +// Submitted by glob +bmoattachments.org + +// MSK-IX : https://www.msk-ix.ru/ +// Submitted by Khannanov Roman +net.ru +org.ru +pp.ru + +// Netlify : https://www.netlify.com +// Submitted by Jessica Parsons +bitballoon.com +netlify.com + +// Neustar Inc. +// Submitted by Trung Tran +4u.com + +// ngrok : https://ngrok.com/ +// Submitted by Alan Shreve +ngrok.io + +// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/ +// Submitted by Jeff Wheelhouse +nfshost.com + +// nsupdate.info : https://www.nsupdate.info/ +// Submitted by Thomas Waldmann +nsupdate.info +nerdpol.ovh + +// No-IP.com : https://noip.com/ +// Submitted by Deven Reza +blogsyte.com +brasilia.me +cable-modem.org +ciscofreak.com +collegefan.org +couchpotatofries.org +damnserver.com +ddns.me +ditchyourip.com +dnsfor.me +dnsiskinky.com +dvrcam.info +dynns.com +eating-organic.net +fantasyleague.cc +geekgalaxy.com +golffan.us +health-carereform.com +homesecuritymac.com +homesecuritypc.com +hopto.me +ilovecollege.info +loginto.me +mlbfan.org +mmafan.biz +myactivedirectory.com +mydissent.net +myeffect.net +mymediapc.net +mypsx.net +mysecuritycamera.com +mysecuritycamera.net +mysecuritycamera.org +net-freaks.com +nflfan.org +nhlfan.net +no-ip.ca +no-ip.co.uk +no-ip.net +noip.us +onthewifi.com +pgafan.net +point2this.com +pointto.us +privatizehealthinsurance.net +quicksytes.com +read-books.org +securitytactics.com +serveexchange.com +servehumour.com +servep2p.com +servesarcasm.com +stufftoread.com +ufcfan.org +unusualperson.com +workisboring.com +3utilities.com +bounceme.net +ddns.net +ddnsking.com +gotdns.ch +hopto.org +myftp.biz +myftp.org +myvnc.com +no-ip.biz +no-ip.info +no-ip.org +noip.me +redirectme.net +servebeer.com +serveblog.net +servecounterstrike.com +serveftp.com +servegame.com +servehalflife.com +servehttp.com +serveirc.com +serveminecraft.net +servemp3.com +servepics.com +servequake.com +sytes.net +webhop.me +zapto.org + +// NodeArt : https://nodeart.io +// Submitted by Konstantin Nosov +stage.nodeart.io + +// Nodum B.V. : https://nodum.io/ +// Submitted by Wietse Wind +nodum.co +nodum.io + +// NYC.mn : http://www.information.nyc.mn +// Submitted by Matthew Brown +nyc.mn + +// NymNom : https://nymnom.com/ +// Submitted by Dave McCormack +nom.ae +nom.ai +nom.al +nym.by +nym.bz +nom.cl +nom.gd +nom.gl +nym.gr +nom.gt +nom.hn +nom.im +nym.kz +nym.la +nom.li +nym.li +nym.lt +nym.lu +nym.me +nom.mk +nym.mx +nom.nu +nym.nz +nym.pe +nym.pt +nom.pw +nom.qa +nom.rs +nom.si +nym.sk +nym.su +nym.sx +nym.tw +nom.ug +nom.uy +nom.vc +nom.vg + +// Octopodal Solutions, LLC. : https://ulterius.io/ +// Submitted by Andrew Sampson +cya.gg + +// One Fold Media : http://www.onefoldmedia.com/ +// Submitted by Eddie Jones +nid.io + +// OpenCraft GmbH : http://opencraft.com/ +// Submitted by Sven Marnach +opencraft.hosting + +// Opera Software, A.S.A. +// Submitted by Yngve Pettersen +operaunite.com + +// OutSystems +// Submitted by Duarte Santos +outsystemscloud.com + +// OwnProvider : http://www.ownprovider.com +// Submitted by Jan Moennich +ownprovider.com + +// oy.lc +// Submitted by Charly Coste +oy.lc + +// Pagefog : https://pagefog.com/ +// Submitted by Derek Myers +pgfog.com + +// Pagefront : https://www.pagefronthq.com/ +// Submitted by Jason Kriss +pagefrontapp.com + +// .pl domains (grandfathered) +art.pl +gliwice.pl +krakow.pl +poznan.pl +wroc.pl +zakopane.pl + +// Pantheon Systems, Inc. : https://pantheon.io/ +// Submitted by Gary Dylina +pantheonsite.io +gotpantheon.com + +// Peplink | Pepwave : http://peplink.com/ +// Submitted by Steve Leung +mypep.link + +// Planet-Work : https://www.planet-work.com/ +// Submitted by Frédéric VANNIÈRE +on-web.fr + +// Platform.sh : https://platform.sh +// Submitted by Nikola Kotur +*.platform.sh +*.platformsh.site + +// prgmr.com : https://prgmr.com/ +// Submitted by Sarah Newman +xen.prgmr.com + +// priv.at : http://www.nic.priv.at/ +// Submitted by registry +priv.at + +// Protonet GmbH : http://protonet.io +// Submitted by Martin Meier +protonet.io + +// Publication Presse Communication SARL : https://ppcom.fr +// Submitted by Yaacov Akiba Slama +chirurgiens-dentistes-en-france.fr +byen.site + +// QA2 +// Submitted by Daniel Dent (https://www.danieldent.com/) +qa2.com + +// QNAP System Inc : https://www.qnap.com +// Submitted by Nick Chang +dev-myqnapcloud.com +alpha-myqnapcloud.com +myqnapcloud.com + +// Quip : https://quip.com +// Submitted by Patrick Linehan +*.quipelements.com + +// Qutheory LLC : http://qutheory.io +// Submitted by Jonas Schwartz +vapor.cloud +vaporcloud.io + +// Rackmaze LLC : https://www.rackmaze.com +// Submitted by Kirill Pertsev +rackmaze.com +rackmaze.net + +// Red Hat, Inc. OpenShift : https://openshift.redhat.com/ +// Submitted by Tim Kramer +rhcloud.com + +// RethinkDB : https://www.rethinkdb.com/ +// Submitted by Chris Kastorff +hzc.io + +// Revitalised Limited : http://www.revitalised.co.uk +// Submitted by Jack Price +wellbeingzone.eu +ptplus.fit +wellbeingzone.co.uk + +// Sandstorm Development Group, Inc. : https://sandcats.io/ +// Submitted by Asheesh Laroia +sandcats.io + +// SBE network solutions GmbH : https://www.sbe.de/ +// Submitted by Norman Meilick +logoip.de +logoip.com + +// Securepoint GmbH : https://www.securepoint.de +// Submitted by Erik Anders +firewall-gateway.com +firewall-gateway.de +my-gateway.de +my-router.de +spdns.de +spdns.eu +firewall-gateway.net +my-firewall.org +myfirewall.org +spdns.org + +// SensioLabs, SAS : https://sensiolabs.com/ +// Submitted by Fabien Potencier +*.sensiosite.cloud + +// Service Online LLC : http://drs.ua/ +// Submitted by Serhii Bulakh +biz.ua +co.ua +pp.ua + +// ShiftEdit : https://shiftedit.net/ +// Submitted by Adam Jimenez +shiftedit.io + +// Shopblocks : http://www.shopblocks.com/ +// Submitted by Alex Bowers +myshopblocks.com + +// SinaAppEngine : http://sae.sina.com.cn/ +// Submitted by SinaAppEngine +1kapp.com +appchizi.com +applinzi.com +sinaapp.com +vipsinaapp.com + +// Skyhat : http://www.skyhat.io +// Submitted by Shante Adam +bounty-full.com +alpha.bounty-full.com +beta.bounty-full.com + +// staticland : https://static.land +// Submitted by Seth Vincent +static.land +dev.static.land +sites.static.land + +// SourceLair PC : https://www.sourcelair.com +// Submitted by Antonis Kalipetis +apps.lair.io +*.stolos.io + +// SpaceKit : https://www.spacekit.io/ +// Submitted by Reza Akhavan +spacekit.io + +// Stackspace : https://www.stackspace.io/ +// Submitted by Lina He +stackspace.space + +// Storj Labs Inc. : https://storj.io/ +// Submitted by Philip Hutchins +storj.farm + +// Sub 6 Limited: http://www.sub6.com +// Submitted by Dan Miller +temp-dns.com + +// Synology, Inc. : https://www.synology.com/ +// Submitted by Rony Weng +diskstation.me +dscloud.biz +dscloud.me +dscloud.mobi +dsmynas.com +dsmynas.net +dsmynas.org +familyds.com +familyds.net +familyds.org +i234.me +myds.me +synology.me +vpnplus.to + +// TAIFUN Software AG : http://taifun-software.de +// Submitted by Bjoern Henke +taifun-dns.de + +// TASK geographical domains (www.task.gda.pl/uslugi/dns) +gda.pl +gdansk.pl +gdynia.pl +med.pl +sopot.pl + +// Thingdust AG : https://thingdust.com/ +// Submitted by Adrian Imboden +cust.dev.thingdust.io +cust.disrec.thingdust.io +cust.prod.thingdust.io +cust.testing.thingdust.io + +// TownNews.com : http://www.townnews.com +// Submitted by Dustin Ward +bloxcms.com +townnews-staging.com + +// TrafficPlex GmbH : https://www.trafficplex.de/ +// Submitted by Phillipp Röll +12hp.at +2ix.at +4lima.at +lima-city.at +12hp.ch +2ix.ch +4lima.ch +lima-city.ch +trafficplex.cloud +de.cool +12hp.de +2ix.de +4lima.de +lima-city.de +1337.pictures +clan.rip +lima-city.rocks +webspace.rocks +lima.zone + +// TransIP : htts://www.transip.nl +// Submitted by Rory Breuk +*.transurl.be +*.transurl.eu +*.transurl.nl + +// TuxFamily : http://tuxfamily.org +// Submitted by TuxFamily administrators +tuxfamily.org + +// TwoDNS : https://www.twodns.de/ +// Submitted by TwoDNS-Support +dd-dns.de +diskstation.eu +diskstation.org +dray-dns.de +draydns.de +dyn-vpn.de +dynvpn.de +mein-vigor.de +my-vigor.de +my-wan.de +syno-ds.de +synology-diskstation.de +synology-ds.de + +// Uberspace : https://uberspace.de +// Submitted by Moritz Werner +uber.space + +// UDR Limited : http://www.udr.hk.com +// Submitted by registry +hk.com +hk.org +ltd.hk +inc.hk + +// .US +// Submitted by Ed Moore +lib.de.us + +// Viprinet Europe GmbH : http://www.viprinet.com +// Submitted by Simon Kissel +router.management + +// Virtual-Info : https://www.virtual-info.info/ +// Submitted by Adnan RIHAN +v-info.info + +// WeDeploy by Liferay, Inc. : https://www.wedeploy.com +// Submitted by Henrique Vicente +wedeploy.io +wedeploy.me +wedeploy.sh + +// Western Digital Technologies, Inc : https://www.wdc.com +// Submitted by Jung Jin +remotewd.com + +// Wikimedia Labs : https://wikitech.wikimedia.org +// Submitted by Yuvi Panda +wmflabs.org + +// XS4ALL Internet bv : https://www.xs4all.nl/ +// Submitted by Daniel Mostertman +cistron.nl +demon.nl +xs4all.space + +// Yola : https://www.yola.com/ +// Submitted by Stefano Rivera +yolasite.com + +// Yombo : https://yombo.net +// Submitted by Mitch Schwenk +ybo.faith +yombo.me +homelink.one +ybo.party +ybo.review +ybo.science +ybo.trade + +// ZaNiC : http://www.za.net/ +// Submitted by registry +za.net +za.org + +// Zeit, Inc. : https://zeit.domains/ +// Submitted by Olli Vanhoja +now.sh + +// ===END PRIVATE DOMAINS=== +"; \ No newline at end of file diff --git a/data/icann-public-suffix-list.php b/data/icann-public-suffix-list.php deleted file mode 100644 index 7054dacc..00000000 --- a/data/icann-public-suffix-list.php +++ /dev/null @@ -1,21737 +0,0 @@ - - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'mil' => - array ( - ), - 'org' => - array ( - ), - ), - 'ad' => - array ( - 'nom' => - array ( - ), - ), - 'ae' => - array ( - 'co' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'sch' => - array ( - ), - 'ac' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - ), - 'aero' => - array ( - 'accident-investigation' => - array ( - ), - 'accident-prevention' => - array ( - ), - 'aerobatic' => - array ( - ), - 'aeroclub' => - array ( - ), - 'aerodrome' => - array ( - ), - 'agents' => - array ( - ), - 'aircraft' => - array ( - ), - 'airline' => - array ( - ), - 'airport' => - array ( - ), - 'air-surveillance' => - array ( - ), - 'airtraffic' => - array ( - ), - 'air-traffic-control' => - array ( - ), - 'ambulance' => - array ( - ), - 'amusement' => - array ( - ), - 'association' => - array ( - ), - 'author' => - array ( - ), - 'ballooning' => - array ( - ), - 'broker' => - array ( - ), - 'caa' => - array ( - ), - 'cargo' => - array ( - ), - 'catering' => - array ( - ), - 'certification' => - array ( - ), - 'championship' => - array ( - ), - 'charter' => - array ( - ), - 'civilaviation' => - array ( - ), - 'club' => - array ( - ), - 'conference' => - array ( - ), - 'consultant' => - array ( - ), - 'consulting' => - array ( - ), - 'control' => - array ( - ), - 'council' => - array ( - ), - 'crew' => - array ( - ), - 'design' => - array ( - ), - 'dgca' => - array ( - ), - 'educator' => - array ( - ), - 'emergency' => - array ( - ), - 'engine' => - array ( - ), - 'engineer' => - array ( - ), - 'entertainment' => - array ( - ), - 'equipment' => - array ( - ), - 'exchange' => - array ( - ), - 'express' => - array ( - ), - 'federation' => - array ( - ), - 'flight' => - array ( - ), - 'freight' => - array ( - ), - 'fuel' => - array ( - ), - 'gliding' => - array ( - ), - 'government' => - array ( - ), - 'groundhandling' => - array ( - ), - 'group' => - array ( - ), - 'hanggliding' => - array ( - ), - 'homebuilt' => - array ( - ), - 'insurance' => - array ( - ), - 'journal' => - array ( - ), - 'journalist' => - array ( - ), - 'leasing' => - array ( - ), - 'logistics' => - array ( - ), - 'magazine' => - array ( - ), - 'maintenance' => - array ( - ), - 'media' => - array ( - ), - 'microlight' => - array ( - ), - 'modelling' => - array ( - ), - 'navigation' => - array ( - ), - 'parachuting' => - array ( - ), - 'paragliding' => - array ( - ), - 'passenger-association' => - array ( - ), - 'pilot' => - array ( - ), - 'press' => - array ( - ), - 'production' => - array ( - ), - 'recreation' => - array ( - ), - 'repbody' => - array ( - ), - 'res' => - array ( - ), - 'research' => - array ( - ), - 'rotorcraft' => - array ( - ), - 'safety' => - array ( - ), - 'scientist' => - array ( - ), - 'services' => - array ( - ), - 'show' => - array ( - ), - 'skydiving' => - array ( - ), - 'software' => - array ( - ), - 'student' => - array ( - ), - 'trader' => - array ( - ), - 'trading' => - array ( - ), - 'trainer' => - array ( - ), - 'union' => - array ( - ), - 'workinggroup' => - array ( - ), - 'works' => - array ( - ), - ), - 'af' => - array ( - 'gov' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'edu' => - array ( - ), - ), - 'ag' => - array ( - 'com' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'co' => - array ( - ), - 'nom' => - array ( - ), - ), - 'ai' => - array ( - 'off' => - array ( - ), - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'al' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'am' => - array ( - ), - 'ao' => - array ( - 'ed' => - array ( - ), - 'gv' => - array ( - ), - 'og' => - array ( - ), - 'co' => - array ( - ), - 'pb' => - array ( - ), - 'it' => - array ( - ), - ), - 'aq' => - array ( - ), - 'ar' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gob' => - array ( - ), - 'gov' => - array ( - ), - 'int' => - array ( - ), - 'mil' => - array ( - ), - 'musica' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'tur' => - array ( - ), - ), - 'arpa' => - array ( - 'e164' => - array ( - ), - 'in-addr' => - array ( - ), - 'ip6' => - array ( - ), - 'iris' => - array ( - ), - 'uri' => - array ( - ), - 'urn' => - array ( - ), - ), - 'as' => - array ( - 'gov' => - array ( - ), - ), - 'asia' => - array ( - ), - 'at' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'gv' => - array ( - ), - 'or' => - array ( - ), - ), - 'au' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - 'act' => - array ( - ), - 'nsw' => - array ( - ), - 'nt' => - array ( - ), - 'qld' => - array ( - ), - 'sa' => - array ( - ), - 'tas' => - array ( - ), - 'vic' => - array ( - ), - 'wa' => - array ( - ), - ), - 'gov' => - array ( - 'qld' => - array ( - ), - 'sa' => - array ( - ), - 'tas' => - array ( - ), - 'vic' => - array ( - ), - 'wa' => - array ( - ), - ), - 'asn' => - array ( - ), - 'id' => - array ( - ), - 'info' => - array ( - ), - 'conf' => - array ( - ), - 'oz' => - array ( - ), - 'act' => - array ( - ), - 'nsw' => - array ( - ), - 'nt' => - array ( - ), - 'qld' => - array ( - ), - 'sa' => - array ( - ), - 'tas' => - array ( - ), - 'vic' => - array ( - ), - 'wa' => - array ( - ), - ), - 'aw' => - array ( - 'com' => - array ( - ), - ), - 'ax' => - array ( - ), - 'az' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'int' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'info' => - array ( - ), - 'pp' => - array ( - ), - 'mil' => - array ( - ), - 'name' => - array ( - ), - 'pro' => - array ( - ), - 'biz' => - array ( - ), - ), - 'ba' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'bb' => - array ( - 'biz' => - array ( - ), - 'co' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'info' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'store' => - array ( - ), - 'tv' => - array ( - ), - ), - 'bd' => - array ( - '*' => - array ( - ), - ), - 'be' => - array ( - 'ac' => - array ( - ), - ), - 'bf' => - array ( - 'gov' => - array ( - ), - ), - 'bg' => - array ( - 'a' => - array ( - ), - 'b' => - array ( - ), - 'c' => - array ( - ), - 'd' => - array ( - ), - 'e' => - array ( - ), - 'f' => - array ( - ), - 'g' => - array ( - ), - 'h' => - array ( - ), - 'i' => - array ( - ), - 'j' => - array ( - ), - 'k' => - array ( - ), - 'l' => - array ( - ), - 'm' => - array ( - ), - 'n' => - array ( - ), - 'o' => - array ( - ), - 'p' => - array ( - ), - 'q' => - array ( - ), - 'r' => - array ( - ), - 's' => - array ( - ), - 't' => - array ( - ), - 'u' => - array ( - ), - 'v' => - array ( - ), - 'w' => - array ( - ), - 'x' => - array ( - ), - 'y' => - array ( - ), - 'z' => - array ( - ), - 0 => - array ( - ), - 1 => - array ( - ), - 2 => - array ( - ), - 3 => - array ( - ), - 4 => - array ( - ), - 5 => - array ( - ), - 6 => - array ( - ), - 7 => - array ( - ), - 8 => - array ( - ), - 9 => - array ( - ), - ), - 'bh' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - ), - 'bi' => - array ( - 'co' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'or' => - array ( - ), - 'org' => - array ( - ), - ), - 'biz' => - array ( - ), - 'bj' => - array ( - 'asso' => - array ( - ), - 'barreau' => - array ( - ), - 'gouv' => - array ( - ), - ), - 'bm' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'bn' => - array ( - '*' => - array ( - ), - ), - 'bo' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'gob' => - array ( - ), - 'int' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'mil' => - array ( - ), - 'tv' => - array ( - ), - ), - 'br' => - array ( - 'abc' => - array ( - ), - 'adm' => - array ( - ), - 'adv' => - array ( - ), - 'agr' => - array ( - ), - 'aju' => - array ( - ), - 'am' => - array ( - ), - 'aparecida' => - array ( - ), - 'arq' => - array ( - ), - 'art' => - array ( - ), - 'ato' => - array ( - ), - 'b' => - array ( - ), - 'belem' => - array ( - ), - 'bio' => - array ( - ), - 'blog' => - array ( - ), - 'bmd' => - array ( - ), - 'bsb' => - array ( - ), - 'cim' => - array ( - ), - 'cng' => - array ( - ), - 'cnt' => - array ( - ), - 'com' => - array ( - ), - 'coop' => - array ( - ), - 'cri' => - array ( - ), - 'cuiaba' => - array ( - ), - 'def' => - array ( - ), - 'ecn' => - array ( - ), - 'eco' => - array ( - ), - 'edu' => - array ( - ), - 'emp' => - array ( - ), - 'eng' => - array ( - ), - 'esp' => - array ( - ), - 'etc' => - array ( - ), - 'eti' => - array ( - ), - 'far' => - array ( - ), - 'flog' => - array ( - ), - 'floripa' => - array ( - ), - 'fortal' => - array ( - ), - 'fm' => - array ( - ), - 'fnd' => - array ( - ), - 'fot' => - array ( - ), - 'fst' => - array ( - ), - 'g12' => - array ( - ), - 'ggf' => - array ( - ), - 'gov' => - array ( - 'ac' => - array ( - ), - 'al' => - array ( - ), - 'am' => - array ( - ), - 'ap' => - array ( - ), - 'ba' => - array ( - ), - 'ce' => - array ( - ), - 'df' => - array ( - ), - 'es' => - array ( - ), - 'go' => - array ( - ), - 'ma' => - array ( - ), - 'mg' => - array ( - ), - 'ms' => - array ( - ), - 'mt' => - array ( - ), - 'pa' => - array ( - ), - 'pb' => - array ( - ), - 'pe' => - array ( - ), - 'pi' => - array ( - ), - 'pr' => - array ( - ), - 'rj' => - array ( - ), - 'rn' => - array ( - ), - 'ro' => - array ( - ), - 'rr' => - array ( - ), - 'rs' => - array ( - ), - 'sc' => - array ( - ), - 'se' => - array ( - ), - 'sp' => - array ( - ), - 'to' => - array ( - ), - ), - 'gru' => - array ( - ), - 'imb' => - array ( - ), - 'ind' => - array ( - ), - 'inf' => - array ( - ), - 'jampa' => - array ( - ), - 'jor' => - array ( - ), - 'jus' => - array ( - ), - 'leg' => - array ( - ), - 'lel' => - array ( - ), - 'londrina' => - array ( - ), - 'macapa' => - array ( - ), - 'maceio' => - array ( - ), - 'mat' => - array ( - ), - 'med' => - array ( - ), - 'mil' => - array ( - ), - 'mp' => - array ( - ), - 'mus' => - array ( - ), - 'natal' => - array ( - ), - 'net' => - array ( - ), - 'niteroi' => - array ( - ), - 'nom' => - array ( - '*' => - array ( - ), - ), - 'not' => - array ( - ), - 'ntr' => - array ( - ), - 'odo' => - array ( - ), - 'org' => - array ( - ), - 'osasco' => - array ( - ), - 'palmas' => - array ( - ), - 'poa' => - array ( - ), - 'ppg' => - array ( - ), - 'pro' => - array ( - ), - 'psc' => - array ( - ), - 'psi' => - array ( - ), - 'qsl' => - array ( - ), - 'radio' => - array ( - ), - 'rec' => - array ( - ), - 'recife' => - array ( - ), - 'riobranco' => - array ( - ), - 'sjc' => - array ( - ), - 'slg' => - array ( - ), - 'srv' => - array ( - ), - 'taxi' => - array ( - ), - 'teo' => - array ( - ), - 'tmp' => - array ( - ), - 'trd' => - array ( - ), - 'tur' => - array ( - ), - 'tv' => - array ( - ), - 'udi' => - array ( - ), - 'vet' => - array ( - ), - 'vix' => - array ( - ), - 'vlog' => - array ( - ), - 'wiki' => - array ( - ), - 'zlg' => - array ( - ), - ), - 'bs' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - ), - 'bt' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'bv' => - array ( - ), - 'bw' => - array ( - 'co' => - array ( - ), - 'org' => - array ( - ), - ), - 'by' => - array ( - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'com' => - array ( - ), - 'of' => - array ( - ), - ), - 'bz' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - ), - 'ca' => - array ( - 'ab' => - array ( - ), - 'bc' => - array ( - ), - 'mb' => - array ( - ), - 'nb' => - array ( - ), - 'nf' => - array ( - ), - 'nl' => - array ( - ), - 'ns' => - array ( - ), - 'nt' => - array ( - ), - 'nu' => - array ( - ), - 'on' => - array ( - ), - 'pe' => - array ( - ), - 'qc' => - array ( - ), - 'sk' => - array ( - ), - 'yk' => - array ( - ), - 'gc' => - array ( - ), - ), - 'cat' => - array ( - ), - 'cc' => - array ( - ), - 'cd' => - array ( - 'gov' => - array ( - ), - ), - 'cf' => - array ( - ), - 'cg' => - array ( - ), - 'ch' => - array ( - ), - 'ci' => - array ( - 'org' => - array ( - ), - 'or' => - array ( - ), - 'com' => - array ( - ), - 'co' => - array ( - ), - 'edu' => - array ( - ), - 'ed' => - array ( - ), - 'ac' => - array ( - ), - 'net' => - array ( - ), - 'go' => - array ( - ), - 'asso' => - array ( - ), - 'xn--aroport-bya' => - array ( - ), - 'int' => - array ( - ), - 'presse' => - array ( - ), - 'md' => - array ( - ), - 'gouv' => - array ( - ), - ), - 'ck' => - array ( - '*' => - array ( - ), - 'www' => - array ( - '!' => '', - ), - ), - 'cl' => - array ( - 'gov' => - array ( - ), - 'gob' => - array ( - ), - 'co' => - array ( - ), - 'mil' => - array ( - ), - ), - 'cm' => - array ( - 'co' => - array ( - ), - 'com' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - ), - 'cn' => - array ( - 'ac' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'mil' => - array ( - ), - 'xn--55qx5d' => - array ( - ), - 'xn--io0a7i' => - array ( - ), - 'xn--od0alg' => - array ( - ), - 'ah' => - array ( - ), - 'bj' => - array ( - ), - 'cq' => - array ( - ), - 'fj' => - array ( - ), - 'gd' => - array ( - ), - 'gs' => - array ( - ), - 'gz' => - array ( - ), - 'gx' => - array ( - ), - 'ha' => - array ( - ), - 'hb' => - array ( - ), - 'he' => - array ( - ), - 'hi' => - array ( - ), - 'hl' => - array ( - ), - 'hn' => - array ( - ), - 'jl' => - array ( - ), - 'js' => - array ( - ), - 'jx' => - array ( - ), - 'ln' => - array ( - ), - 'nm' => - array ( - ), - 'nx' => - array ( - ), - 'qh' => - array ( - ), - 'sc' => - array ( - ), - 'sd' => - array ( - ), - 'sh' => - array ( - ), - 'sn' => - array ( - ), - 'sx' => - array ( - ), - 'tj' => - array ( - ), - 'xj' => - array ( - ), - 'xz' => - array ( - ), - 'yn' => - array ( - ), - 'zj' => - array ( - ), - 'hk' => - array ( - ), - 'mo' => - array ( - ), - 'tw' => - array ( - ), - ), - 'co' => - array ( - 'arts' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'firm' => - array ( - ), - 'gov' => - array ( - ), - 'info' => - array ( - ), - 'int' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'nom' => - array ( - ), - 'org' => - array ( - ), - 'rec' => - array ( - ), - 'web' => - array ( - ), - ), - 'com' => - array ( - ), - 'coop' => - array ( - ), - 'cr' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'ed' => - array ( - ), - 'fi' => - array ( - ), - 'go' => - array ( - ), - 'or' => - array ( - ), - 'sa' => - array ( - ), - ), - 'cu' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'gov' => - array ( - ), - 'inf' => - array ( - ), - ), - 'cv' => - array ( - ), - 'cw' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'cx' => - array ( - 'gov' => - array ( - ), - ), - 'cy' => - array ( - 'ac' => - array ( - ), - 'biz' => - array ( - ), - 'com' => - array ( - ), - 'ekloges' => - array ( - ), - 'gov' => - array ( - ), - 'ltd' => - array ( - ), - 'name' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'parliament' => - array ( - ), - 'press' => - array ( - ), - 'pro' => - array ( - ), - 'tm' => - array ( - ), - ), - 'cz' => - array ( - ), - 'de' => - array ( - ), - 'dj' => - array ( - ), - 'dk' => - array ( - ), - 'dm' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - ), - 'do' => - array ( - 'art' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gob' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'sld' => - array ( - ), - 'web' => - array ( - ), - ), - 'dz' => - array ( - 'com' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'gov' => - array ( - ), - 'edu' => - array ( - ), - 'asso' => - array ( - ), - 'pol' => - array ( - ), - 'art' => - array ( - ), - ), - 'ec' => - array ( - 'com' => - array ( - ), - 'info' => - array ( - ), - 'net' => - array ( - ), - 'fin' => - array ( - ), - 'k12' => - array ( - ), - 'med' => - array ( - ), - 'pro' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'gob' => - array ( - ), - 'mil' => - array ( - ), - ), - 'edu' => - array ( - ), - 'ee' => - array ( - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'riik' => - array ( - ), - 'lib' => - array ( - ), - 'med' => - array ( - ), - 'com' => - array ( - ), - 'pri' => - array ( - ), - 'aip' => - array ( - ), - 'org' => - array ( - ), - 'fie' => - array ( - ), - ), - 'eg' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'eun' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'name' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'sci' => - array ( - ), - ), - 'er' => - array ( - '*' => - array ( - ), - ), - 'es' => - array ( - 'com' => - array ( - ), - 'nom' => - array ( - ), - 'org' => - array ( - ), - 'gob' => - array ( - ), - 'edu' => - array ( - ), - ), - 'et' => - array ( - 'com' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'biz' => - array ( - ), - 'name' => - array ( - ), - 'info' => - array ( - ), - 'net' => - array ( - ), - ), - 'eu' => - array ( - ), - 'fi' => - array ( - 'aland' => - array ( - ), - ), - 'fj' => - array ( - '*' => - array ( - ), - ), - 'fk' => - array ( - '*' => - array ( - ), - ), - 'fm' => - array ( - ), - 'fo' => - array ( - ), - 'fr' => - array ( - 'com' => - array ( - ), - 'asso' => - array ( - ), - 'nom' => - array ( - ), - 'prd' => - array ( - ), - 'presse' => - array ( - ), - 'tm' => - array ( - ), - 'aeroport' => - array ( - ), - 'assedic' => - array ( - ), - 'avocat' => - array ( - ), - 'avoues' => - array ( - ), - 'cci' => - array ( - ), - 'chambagri' => - array ( - ), - 'chirurgiens-dentistes' => - array ( - ), - 'experts-comptables' => - array ( - ), - 'geometre-expert' => - array ( - ), - 'gouv' => - array ( - ), - 'greta' => - array ( - ), - 'huissier-justice' => - array ( - ), - 'medecin' => - array ( - ), - 'notaires' => - array ( - ), - 'pharmacien' => - array ( - ), - 'port' => - array ( - ), - 'veterinaire' => - array ( - ), - ), - 'ga' => - array ( - ), - 'gb' => - array ( - ), - 'gd' => - array ( - ), - 'ge' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'pvt' => - array ( - ), - ), - 'gf' => - array ( - ), - 'gg' => - array ( - 'co' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'gh' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'mil' => - array ( - ), - ), - 'gi' => - array ( - 'com' => - array ( - ), - 'ltd' => - array ( - ), - 'gov' => - array ( - ), - 'mod' => - array ( - ), - 'edu' => - array ( - ), - 'org' => - array ( - ), - ), - 'gl' => - array ( - 'co' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'gm' => - array ( - ), - 'gn' => - array ( - 'ac' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - ), - 'gov' => - array ( - ), - 'gp' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'mobi' => - array ( - ), - 'edu' => - array ( - ), - 'org' => - array ( - ), - 'asso' => - array ( - ), - ), - 'gq' => - array ( - ), - 'gr' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - ), - 'gs' => - array ( - ), - 'gt' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gob' => - array ( - ), - 'ind' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'gu' => - array ( - '*' => - array ( - ), - ), - 'gw' => - array ( - ), - 'gy' => - array ( - 'co' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'hk' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'idv' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'xn--55qx5d' => - array ( - ), - 'xn--wcvs22d' => - array ( - ), - 'xn--lcvr32d' => - array ( - ), - 'xn--mxtq1m' => - array ( - ), - 'xn--gmqw5a' => - array ( - ), - 'xn--ciqpn' => - array ( - ), - 'xn--gmq050i' => - array ( - ), - 'xn--zf0avx' => - array ( - ), - 'xn--io0a7i' => - array ( - ), - 'xn--mk0axi' => - array ( - ), - 'xn--od0alg' => - array ( - ), - 'xn--od0aq3b' => - array ( - ), - 'xn--tn0ag' => - array ( - ), - 'xn--uc0atv' => - array ( - ), - 'xn--uc0ay4a' => - array ( - ), - ), - 'hm' => - array ( - ), - 'hn' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'mil' => - array ( - ), - 'gob' => - array ( - ), - ), - 'hr' => - array ( - 'iz' => - array ( - ), - 'from' => - array ( - ), - 'name' => - array ( - ), - 'com' => - array ( - ), - ), - 'ht' => - array ( - 'com' => - array ( - ), - 'shop' => - array ( - ), - 'firm' => - array ( - ), - 'info' => - array ( - ), - 'adult' => - array ( - ), - 'net' => - array ( - ), - 'pro' => - array ( - ), - 'org' => - array ( - ), - 'med' => - array ( - ), - 'art' => - array ( - ), - 'coop' => - array ( - ), - 'pol' => - array ( - ), - 'asso' => - array ( - ), - 'edu' => - array ( - ), - 'rel' => - array ( - ), - 'gouv' => - array ( - ), - 'perso' => - array ( - ), - ), - 'hu' => - array ( - 'co' => - array ( - ), - 'info' => - array ( - ), - 'org' => - array ( - ), - 'priv' => - array ( - ), - 'sport' => - array ( - ), - 'tm' => - array ( - ), - 2000 => - array ( - ), - 'agrar' => - array ( - ), - 'bolt' => - array ( - ), - 'casino' => - array ( - ), - 'city' => - array ( - ), - 'erotica' => - array ( - ), - 'erotika' => - array ( - ), - 'film' => - array ( - ), - 'forum' => - array ( - ), - 'games' => - array ( - ), - 'hotel' => - array ( - ), - 'ingatlan' => - array ( - ), - 'jogasz' => - array ( - ), - 'konyvelo' => - array ( - ), - 'lakas' => - array ( - ), - 'media' => - array ( - ), - 'news' => - array ( - ), - 'reklam' => - array ( - ), - 'sex' => - array ( - ), - 'shop' => - array ( - ), - 'suli' => - array ( - ), - 'szex' => - array ( - ), - 'tozsde' => - array ( - ), - 'utazas' => - array ( - ), - 'video' => - array ( - ), - ), - 'id' => - array ( - 'ac' => - array ( - ), - 'biz' => - array ( - ), - 'co' => - array ( - ), - 'desa' => - array ( - ), - 'go' => - array ( - ), - 'mil' => - array ( - ), - 'my' => - array ( - ), - 'net' => - array ( - ), - 'or' => - array ( - ), - 'sch' => - array ( - ), - 'web' => - array ( - ), - ), - 'ie' => - array ( - 'gov' => - array ( - ), - ), - 'il' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'gov' => - array ( - ), - 'idf' => - array ( - ), - 'k12' => - array ( - ), - 'muni' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'im' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - 'ltd' => - array ( - ), - 'plc' => - array ( - ), - ), - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'tt' => - array ( - ), - 'tv' => - array ( - ), - ), - 'in' => - array ( - 'co' => - array ( - ), - 'firm' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gen' => - array ( - ), - 'ind' => - array ( - ), - 'nic' => - array ( - ), - 'ac' => - array ( - ), - 'edu' => - array ( - ), - 'res' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - ), - 'info' => - array ( - ), - 'int' => - array ( - 'eu' => - array ( - ), - ), - 'io' => - array ( - 'com' => - array ( - ), - ), - 'iq' => - array ( - 'gov' => - array ( - ), - 'edu' => - array ( - ), - 'mil' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - ), - 'ir' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'gov' => - array ( - ), - 'id' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'sch' => - array ( - ), - 'xn--mgba3a4f16a' => - array ( - ), - 'xn--mgba3a4fra' => - array ( - ), - ), - 'is' => - array ( - 'net' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'int' => - array ( - ), - ), - 'it' => - array ( - 'gov' => - array ( - ), - 'edu' => - array ( - ), - 'abr' => - array ( - ), - 'abruzzo' => - array ( - ), - 'aosta-valley' => - array ( - ), - 'aostavalley' => - array ( - ), - 'bas' => - array ( - ), - 'basilicata' => - array ( - ), - 'cal' => - array ( - ), - 'calabria' => - array ( - ), - 'cam' => - array ( - ), - 'campania' => - array ( - ), - 'emilia-romagna' => - array ( - ), - 'emiliaromagna' => - array ( - ), - 'emr' => - array ( - ), - 'friuli-v-giulia' => - array ( - ), - 'friuli-ve-giulia' => - array ( - ), - 'friuli-vegiulia' => - array ( - ), - 'friuli-venezia-giulia' => - array ( - ), - 'friuli-veneziagiulia' => - array ( - ), - 'friuli-vgiulia' => - array ( - ), - 'friuliv-giulia' => - array ( - ), - 'friulive-giulia' => - array ( - ), - 'friulivegiulia' => - array ( - ), - 'friulivenezia-giulia' => - array ( - ), - 'friuliveneziagiulia' => - array ( - ), - 'friulivgiulia' => - array ( - ), - 'fvg' => - array ( - ), - 'laz' => - array ( - ), - 'lazio' => - array ( - ), - 'lig' => - array ( - ), - 'liguria' => - array ( - ), - 'lom' => - array ( - ), - 'lombardia' => - array ( - ), - 'lombardy' => - array ( - ), - 'lucania' => - array ( - ), - 'mar' => - array ( - ), - 'marche' => - array ( - ), - 'mol' => - array ( - ), - 'molise' => - array ( - ), - 'piedmont' => - array ( - ), - 'piemonte' => - array ( - ), - 'pmn' => - array ( - ), - 'pug' => - array ( - ), - 'puglia' => - array ( - ), - 'sar' => - array ( - ), - 'sardegna' => - array ( - ), - 'sardinia' => - array ( - ), - 'sic' => - array ( - ), - 'sicilia' => - array ( - ), - 'sicily' => - array ( - ), - 'taa' => - array ( - ), - 'tos' => - array ( - ), - 'toscana' => - array ( - ), - 'trentino-a-adige' => - array ( - ), - 'trentino-aadige' => - array ( - ), - 'trentino-alto-adige' => - array ( - ), - 'trentino-altoadige' => - array ( - ), - 'trentino-s-tirol' => - array ( - ), - 'trentino-stirol' => - array ( - ), - 'trentino-sud-tirol' => - array ( - ), - 'trentino-sudtirol' => - array ( - ), - 'trentino-sued-tirol' => - array ( - ), - 'trentino-suedtirol' => - array ( - ), - 'trentinoa-adige' => - array ( - ), - 'trentinoaadige' => - array ( - ), - 'trentinoalto-adige' => - array ( - ), - 'trentinoaltoadige' => - array ( - ), - 'trentinos-tirol' => - array ( - ), - 'trentinostirol' => - array ( - ), - 'trentinosud-tirol' => - array ( - ), - 'trentinosudtirol' => - array ( - ), - 'trentinosued-tirol' => - array ( - ), - 'trentinosuedtirol' => - array ( - ), - 'tuscany' => - array ( - ), - 'umb' => - array ( - ), - 'umbria' => - array ( - ), - 'val-d-aosta' => - array ( - ), - 'val-daosta' => - array ( - ), - 'vald-aosta' => - array ( - ), - 'valdaosta' => - array ( - ), - 'valle-aosta' => - array ( - ), - 'valle-d-aosta' => - array ( - ), - 'valle-daosta' => - array ( - ), - 'valleaosta' => - array ( - ), - 'valled-aosta' => - array ( - ), - 'valledaosta' => - array ( - ), - 'vallee-aoste' => - array ( - ), - 'valleeaoste' => - array ( - ), - 'vao' => - array ( - ), - 'vda' => - array ( - ), - 'ven' => - array ( - ), - 'veneto' => - array ( - ), - 'ag' => - array ( - ), - 'agrigento' => - array ( - ), - 'al' => - array ( - ), - 'alessandria' => - array ( - ), - 'alto-adige' => - array ( - ), - 'altoadige' => - array ( - ), - 'an' => - array ( - ), - 'ancona' => - array ( - ), - 'andria-barletta-trani' => - array ( - ), - 'andria-trani-barletta' => - array ( - ), - 'andriabarlettatrani' => - array ( - ), - 'andriatranibarletta' => - array ( - ), - 'ao' => - array ( - ), - 'aosta' => - array ( - ), - 'aoste' => - array ( - ), - 'ap' => - array ( - ), - 'aq' => - array ( - ), - 'aquila' => - array ( - ), - 'ar' => - array ( - ), - 'arezzo' => - array ( - ), - 'ascoli-piceno' => - array ( - ), - 'ascolipiceno' => - array ( - ), - 'asti' => - array ( - ), - 'at' => - array ( - ), - 'av' => - array ( - ), - 'avellino' => - array ( - ), - 'ba' => - array ( - ), - 'balsan' => - array ( - ), - 'bari' => - array ( - ), - 'barletta-trani-andria' => - array ( - ), - 'barlettatraniandria' => - array ( - ), - 'belluno' => - array ( - ), - 'benevento' => - array ( - ), - 'bergamo' => - array ( - ), - 'bg' => - array ( - ), - 'bi' => - array ( - ), - 'biella' => - array ( - ), - 'bl' => - array ( - ), - 'bn' => - array ( - ), - 'bo' => - array ( - ), - 'bologna' => - array ( - ), - 'bolzano' => - array ( - ), - 'bozen' => - array ( - ), - 'br' => - array ( - ), - 'brescia' => - array ( - ), - 'brindisi' => - array ( - ), - 'bs' => - array ( - ), - 'bt' => - array ( - ), - 'bz' => - array ( - ), - 'ca' => - array ( - ), - 'cagliari' => - array ( - ), - 'caltanissetta' => - array ( - ), - 'campidano-medio' => - array ( - ), - 'campidanomedio' => - array ( - ), - 'campobasso' => - array ( - ), - 'carbonia-iglesias' => - array ( - ), - 'carboniaiglesias' => - array ( - ), - 'carrara-massa' => - array ( - ), - 'carraramassa' => - array ( - ), - 'caserta' => - array ( - ), - 'catania' => - array ( - ), - 'catanzaro' => - array ( - ), - 'cb' => - array ( - ), - 'ce' => - array ( - ), - 'cesena-forli' => - array ( - ), - 'cesenaforli' => - array ( - ), - 'ch' => - array ( - ), - 'chieti' => - array ( - ), - 'ci' => - array ( - ), - 'cl' => - array ( - ), - 'cn' => - array ( - ), - 'co' => - array ( - ), - 'como' => - array ( - ), - 'cosenza' => - array ( - ), - 'cr' => - array ( - ), - 'cremona' => - array ( - ), - 'crotone' => - array ( - ), - 'cs' => - array ( - ), - 'ct' => - array ( - ), - 'cuneo' => - array ( - ), - 'cz' => - array ( - ), - 'dell-ogliastra' => - array ( - ), - 'dellogliastra' => - array ( - ), - 'en' => - array ( - ), - 'enna' => - array ( - ), - 'fc' => - array ( - ), - 'fe' => - array ( - ), - 'fermo' => - array ( - ), - 'ferrara' => - array ( - ), - 'fg' => - array ( - ), - 'fi' => - array ( - ), - 'firenze' => - array ( - ), - 'florence' => - array ( - ), - 'fm' => - array ( - ), - 'foggia' => - array ( - ), - 'forli-cesena' => - array ( - ), - 'forlicesena' => - array ( - ), - 'fr' => - array ( - ), - 'frosinone' => - array ( - ), - 'ge' => - array ( - ), - 'genoa' => - array ( - ), - 'genova' => - array ( - ), - 'go' => - array ( - ), - 'gorizia' => - array ( - ), - 'gr' => - array ( - ), - 'grosseto' => - array ( - ), - 'iglesias-carbonia' => - array ( - ), - 'iglesiascarbonia' => - array ( - ), - 'im' => - array ( - ), - 'imperia' => - array ( - ), - 'is' => - array ( - ), - 'isernia' => - array ( - ), - 'kr' => - array ( - ), - 'la-spezia' => - array ( - ), - 'laquila' => - array ( - ), - 'laspezia' => - array ( - ), - 'latina' => - array ( - ), - 'lc' => - array ( - ), - 'le' => - array ( - ), - 'lecce' => - array ( - ), - 'lecco' => - array ( - ), - 'li' => - array ( - ), - 'livorno' => - array ( - ), - 'lo' => - array ( - ), - 'lodi' => - array ( - ), - 'lt' => - array ( - ), - 'lu' => - array ( - ), - 'lucca' => - array ( - ), - 'macerata' => - array ( - ), - 'mantova' => - array ( - ), - 'massa-carrara' => - array ( - ), - 'massacarrara' => - array ( - ), - 'matera' => - array ( - ), - 'mb' => - array ( - ), - 'mc' => - array ( - ), - 'me' => - array ( - ), - 'medio-campidano' => - array ( - ), - 'mediocampidano' => - array ( - ), - 'messina' => - array ( - ), - 'mi' => - array ( - ), - 'milan' => - array ( - ), - 'milano' => - array ( - ), - 'mn' => - array ( - ), - 'mo' => - array ( - ), - 'modena' => - array ( - ), - 'monza-brianza' => - array ( - ), - 'monza-e-della-brianza' => - array ( - ), - 'monza' => - array ( - ), - 'monzabrianza' => - array ( - ), - 'monzaebrianza' => - array ( - ), - 'monzaedellabrianza' => - array ( - ), - 'ms' => - array ( - ), - 'mt' => - array ( - ), - 'na' => - array ( - ), - 'naples' => - array ( - ), - 'napoli' => - array ( - ), - 'no' => - array ( - ), - 'novara' => - array ( - ), - 'nu' => - array ( - ), - 'nuoro' => - array ( - ), - 'og' => - array ( - ), - 'ogliastra' => - array ( - ), - 'olbia-tempio' => - array ( - ), - 'olbiatempio' => - array ( - ), - 'or' => - array ( - ), - 'oristano' => - array ( - ), - 'ot' => - array ( - ), - 'pa' => - array ( - ), - 'padova' => - array ( - ), - 'padua' => - array ( - ), - 'palermo' => - array ( - ), - 'parma' => - array ( - ), - 'pavia' => - array ( - ), - 'pc' => - array ( - ), - 'pd' => - array ( - ), - 'pe' => - array ( - ), - 'perugia' => - array ( - ), - 'pesaro-urbino' => - array ( - ), - 'pesarourbino' => - array ( - ), - 'pescara' => - array ( - ), - 'pg' => - array ( - ), - 'pi' => - array ( - ), - 'piacenza' => - array ( - ), - 'pisa' => - array ( - ), - 'pistoia' => - array ( - ), - 'pn' => - array ( - ), - 'po' => - array ( - ), - 'pordenone' => - array ( - ), - 'potenza' => - array ( - ), - 'pr' => - array ( - ), - 'prato' => - array ( - ), - 'pt' => - array ( - ), - 'pu' => - array ( - ), - 'pv' => - array ( - ), - 'pz' => - array ( - ), - 'ra' => - array ( - ), - 'ragusa' => - array ( - ), - 'ravenna' => - array ( - ), - 'rc' => - array ( - ), - 're' => - array ( - ), - 'reggio-calabria' => - array ( - ), - 'reggio-emilia' => - array ( - ), - 'reggiocalabria' => - array ( - ), - 'reggioemilia' => - array ( - ), - 'rg' => - array ( - ), - 'ri' => - array ( - ), - 'rieti' => - array ( - ), - 'rimini' => - array ( - ), - 'rm' => - array ( - ), - 'rn' => - array ( - ), - 'ro' => - array ( - ), - 'roma' => - array ( - ), - 'rome' => - array ( - ), - 'rovigo' => - array ( - ), - 'sa' => - array ( - ), - 'salerno' => - array ( - ), - 'sassari' => - array ( - ), - 'savona' => - array ( - ), - 'si' => - array ( - ), - 'siena' => - array ( - ), - 'siracusa' => - array ( - ), - 'so' => - array ( - ), - 'sondrio' => - array ( - ), - 'sp' => - array ( - ), - 'sr' => - array ( - ), - 'ss' => - array ( - ), - 'suedtirol' => - array ( - ), - 'sv' => - array ( - ), - 'ta' => - array ( - ), - 'taranto' => - array ( - ), - 'te' => - array ( - ), - 'tempio-olbia' => - array ( - ), - 'tempioolbia' => - array ( - ), - 'teramo' => - array ( - ), - 'terni' => - array ( - ), - 'tn' => - array ( - ), - 'to' => - array ( - ), - 'torino' => - array ( - ), - 'tp' => - array ( - ), - 'tr' => - array ( - ), - 'trani-andria-barletta' => - array ( - ), - 'trani-barletta-andria' => - array ( - ), - 'traniandriabarletta' => - array ( - ), - 'tranibarlettaandria' => - array ( - ), - 'trapani' => - array ( - ), - 'trentino' => - array ( - ), - 'trento' => - array ( - ), - 'treviso' => - array ( - ), - 'trieste' => - array ( - ), - 'ts' => - array ( - ), - 'turin' => - array ( - ), - 'tv' => - array ( - ), - 'ud' => - array ( - ), - 'udine' => - array ( - ), - 'urbino-pesaro' => - array ( - ), - 'urbinopesaro' => - array ( - ), - 'va' => - array ( - ), - 'varese' => - array ( - ), - 'vb' => - array ( - ), - 'vc' => - array ( - ), - 've' => - array ( - ), - 'venezia' => - array ( - ), - 'venice' => - array ( - ), - 'verbania' => - array ( - ), - 'vercelli' => - array ( - ), - 'verona' => - array ( - ), - 'vi' => - array ( - ), - 'vibo-valentia' => - array ( - ), - 'vibovalentia' => - array ( - ), - 'vicenza' => - array ( - ), - 'viterbo' => - array ( - ), - 'vr' => - array ( - ), - 'vs' => - array ( - ), - 'vt' => - array ( - ), - 'vv' => - array ( - ), - ), - 'je' => - array ( - 'co' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'jm' => - array ( - '*' => - array ( - ), - ), - 'jo' => - array ( - 'com' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'edu' => - array ( - ), - 'sch' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'name' => - array ( - ), - ), - 'jobs' => - array ( - ), - 'jp' => - array ( - 'ac' => - array ( - ), - 'ad' => - array ( - ), - 'co' => - array ( - ), - 'ed' => - array ( - ), - 'go' => - array ( - ), - 'gr' => - array ( - ), - 'lg' => - array ( - ), - 'ne' => - array ( - ), - 'or' => - array ( - ), - 'aichi' => - array ( - 'aisai' => - array ( - ), - 'ama' => - array ( - ), - 'anjo' => - array ( - ), - 'asuke' => - array ( - ), - 'chiryu' => - array ( - ), - 'chita' => - array ( - ), - 'fuso' => - array ( - ), - 'gamagori' => - array ( - ), - 'handa' => - array ( - ), - 'hazu' => - array ( - ), - 'hekinan' => - array ( - ), - 'higashiura' => - array ( - ), - 'ichinomiya' => - array ( - ), - 'inazawa' => - array ( - ), - 'inuyama' => - array ( - ), - 'isshiki' => - array ( - ), - 'iwakura' => - array ( - ), - 'kanie' => - array ( - ), - 'kariya' => - array ( - ), - 'kasugai' => - array ( - ), - 'kira' => - array ( - ), - 'kiyosu' => - array ( - ), - 'komaki' => - array ( - ), - 'konan' => - array ( - ), - 'kota' => - array ( - ), - 'mihama' => - array ( - ), - 'miyoshi' => - array ( - ), - 'nishio' => - array ( - ), - 'nisshin' => - array ( - ), - 'obu' => - array ( - ), - 'oguchi' => - array ( - ), - 'oharu' => - array ( - ), - 'okazaki' => - array ( - ), - 'owariasahi' => - array ( - ), - 'seto' => - array ( - ), - 'shikatsu' => - array ( - ), - 'shinshiro' => - array ( - ), - 'shitara' => - array ( - ), - 'tahara' => - array ( - ), - 'takahama' => - array ( - ), - 'tobishima' => - array ( - ), - 'toei' => - array ( - ), - 'togo' => - array ( - ), - 'tokai' => - array ( - ), - 'tokoname' => - array ( - ), - 'toyoake' => - array ( - ), - 'toyohashi' => - array ( - ), - 'toyokawa' => - array ( - ), - 'toyone' => - array ( - ), - 'toyota' => - array ( - ), - 'tsushima' => - array ( - ), - 'yatomi' => - array ( - ), - ), - 'akita' => - array ( - 'akita' => - array ( - ), - 'daisen' => - array ( - ), - 'fujisato' => - array ( - ), - 'gojome' => - array ( - ), - 'hachirogata' => - array ( - ), - 'happou' => - array ( - ), - 'higashinaruse' => - array ( - ), - 'honjo' => - array ( - ), - 'honjyo' => - array ( - ), - 'ikawa' => - array ( - ), - 'kamikoani' => - array ( - ), - 'kamioka' => - array ( - ), - 'katagami' => - array ( - ), - 'kazuno' => - array ( - ), - 'kitaakita' => - array ( - ), - 'kosaka' => - array ( - ), - 'kyowa' => - array ( - ), - 'misato' => - array ( - ), - 'mitane' => - array ( - ), - 'moriyoshi' => - array ( - ), - 'nikaho' => - array ( - ), - 'noshiro' => - array ( - ), - 'odate' => - array ( - ), - 'oga' => - array ( - ), - 'ogata' => - array ( - ), - 'semboku' => - array ( - ), - 'yokote' => - array ( - ), - 'yurihonjo' => - array ( - ), - ), - 'aomori' => - array ( - 'aomori' => - array ( - ), - 'gonohe' => - array ( - ), - 'hachinohe' => - array ( - ), - 'hashikami' => - array ( - ), - 'hiranai' => - array ( - ), - 'hirosaki' => - array ( - ), - 'itayanagi' => - array ( - ), - 'kuroishi' => - array ( - ), - 'misawa' => - array ( - ), - 'mutsu' => - array ( - ), - 'nakadomari' => - array ( - ), - 'noheji' => - array ( - ), - 'oirase' => - array ( - ), - 'owani' => - array ( - ), - 'rokunohe' => - array ( - ), - 'sannohe' => - array ( - ), - 'shichinohe' => - array ( - ), - 'shingo' => - array ( - ), - 'takko' => - array ( - ), - 'towada' => - array ( - ), - 'tsugaru' => - array ( - ), - 'tsuruta' => - array ( - ), - ), - 'chiba' => - array ( - 'abiko' => - array ( - ), - 'asahi' => - array ( - ), - 'chonan' => - array ( - ), - 'chosei' => - array ( - ), - 'choshi' => - array ( - ), - 'chuo' => - array ( - ), - 'funabashi' => - array ( - ), - 'futtsu' => - array ( - ), - 'hanamigawa' => - array ( - ), - 'ichihara' => - array ( - ), - 'ichikawa' => - array ( - ), - 'ichinomiya' => - array ( - ), - 'inzai' => - array ( - ), - 'isumi' => - array ( - ), - 'kamagaya' => - array ( - ), - 'kamogawa' => - array ( - ), - 'kashiwa' => - array ( - ), - 'katori' => - array ( - ), - 'katsuura' => - array ( - ), - 'kimitsu' => - array ( - ), - 'kisarazu' => - array ( - ), - 'kozaki' => - array ( - ), - 'kujukuri' => - array ( - ), - 'kyonan' => - array ( - ), - 'matsudo' => - array ( - ), - 'midori' => - array ( - ), - 'mihama' => - array ( - ), - 'minamiboso' => - array ( - ), - 'mobara' => - array ( - ), - 'mutsuzawa' => - array ( - ), - 'nagara' => - array ( - ), - 'nagareyama' => - array ( - ), - 'narashino' => - array ( - ), - 'narita' => - array ( - ), - 'noda' => - array ( - ), - 'oamishirasato' => - array ( - ), - 'omigawa' => - array ( - ), - 'onjuku' => - array ( - ), - 'otaki' => - array ( - ), - 'sakae' => - array ( - ), - 'sakura' => - array ( - ), - 'shimofusa' => - array ( - ), - 'shirako' => - array ( - ), - 'shiroi' => - array ( - ), - 'shisui' => - array ( - ), - 'sodegaura' => - array ( - ), - 'sosa' => - array ( - ), - 'tako' => - array ( - ), - 'tateyama' => - array ( - ), - 'togane' => - array ( - ), - 'tohnosho' => - array ( - ), - 'tomisato' => - array ( - ), - 'urayasu' => - array ( - ), - 'yachimata' => - array ( - ), - 'yachiyo' => - array ( - ), - 'yokaichiba' => - array ( - ), - 'yokoshibahikari' => - array ( - ), - 'yotsukaido' => - array ( - ), - ), - 'ehime' => - array ( - 'ainan' => - array ( - ), - 'honai' => - array ( - ), - 'ikata' => - array ( - ), - 'imabari' => - array ( - ), - 'iyo' => - array ( - ), - 'kamijima' => - array ( - ), - 'kihoku' => - array ( - ), - 'kumakogen' => - array ( - ), - 'masaki' => - array ( - ), - 'matsuno' => - array ( - ), - 'matsuyama' => - array ( - ), - 'namikata' => - array ( - ), - 'niihama' => - array ( - ), - 'ozu' => - array ( - ), - 'saijo' => - array ( - ), - 'seiyo' => - array ( - ), - 'shikokuchuo' => - array ( - ), - 'tobe' => - array ( - ), - 'toon' => - array ( - ), - 'uchiko' => - array ( - ), - 'uwajima' => - array ( - ), - 'yawatahama' => - array ( - ), - ), - 'fukui' => - array ( - 'echizen' => - array ( - ), - 'eiheiji' => - array ( - ), - 'fukui' => - array ( - ), - 'ikeda' => - array ( - ), - 'katsuyama' => - array ( - ), - 'mihama' => - array ( - ), - 'minamiechizen' => - array ( - ), - 'obama' => - array ( - ), - 'ohi' => - array ( - ), - 'ono' => - array ( - ), - 'sabae' => - array ( - ), - 'sakai' => - array ( - ), - 'takahama' => - array ( - ), - 'tsuruga' => - array ( - ), - 'wakasa' => - array ( - ), - ), - 'fukuoka' => - array ( - 'ashiya' => - array ( - ), - 'buzen' => - array ( - ), - 'chikugo' => - array ( - ), - 'chikuho' => - array ( - ), - 'chikujo' => - array ( - ), - 'chikushino' => - array ( - ), - 'chikuzen' => - array ( - ), - 'chuo' => - array ( - ), - 'dazaifu' => - array ( - ), - 'fukuchi' => - array ( - ), - 'hakata' => - array ( - ), - 'higashi' => - array ( - ), - 'hirokawa' => - array ( - ), - 'hisayama' => - array ( - ), - 'iizuka' => - array ( - ), - 'inatsuki' => - array ( - ), - 'kaho' => - array ( - ), - 'kasuga' => - array ( - ), - 'kasuya' => - array ( - ), - 'kawara' => - array ( - ), - 'keisen' => - array ( - ), - 'koga' => - array ( - ), - 'kurate' => - array ( - ), - 'kurogi' => - array ( - ), - 'kurume' => - array ( - ), - 'minami' => - array ( - ), - 'miyako' => - array ( - ), - 'miyama' => - array ( - ), - 'miyawaka' => - array ( - ), - 'mizumaki' => - array ( - ), - 'munakata' => - array ( - ), - 'nakagawa' => - array ( - ), - 'nakama' => - array ( - ), - 'nishi' => - array ( - ), - 'nogata' => - array ( - ), - 'ogori' => - array ( - ), - 'okagaki' => - array ( - ), - 'okawa' => - array ( - ), - 'oki' => - array ( - ), - 'omuta' => - array ( - ), - 'onga' => - array ( - ), - 'onojo' => - array ( - ), - 'oto' => - array ( - ), - 'saigawa' => - array ( - ), - 'sasaguri' => - array ( - ), - 'shingu' => - array ( - ), - 'shinyoshitomi' => - array ( - ), - 'shonai' => - array ( - ), - 'soeda' => - array ( - ), - 'sue' => - array ( - ), - 'tachiarai' => - array ( - ), - 'tagawa' => - array ( - ), - 'takata' => - array ( - ), - 'toho' => - array ( - ), - 'toyotsu' => - array ( - ), - 'tsuiki' => - array ( - ), - 'ukiha' => - array ( - ), - 'umi' => - array ( - ), - 'usui' => - array ( - ), - 'yamada' => - array ( - ), - 'yame' => - array ( - ), - 'yanagawa' => - array ( - ), - 'yukuhashi' => - array ( - ), - ), - 'fukushima' => - array ( - 'aizubange' => - array ( - ), - 'aizumisato' => - array ( - ), - 'aizuwakamatsu' => - array ( - ), - 'asakawa' => - array ( - ), - 'bandai' => - array ( - ), - 'date' => - array ( - ), - 'fukushima' => - array ( - ), - 'furudono' => - array ( - ), - 'futaba' => - array ( - ), - 'hanawa' => - array ( - ), - 'higashi' => - array ( - ), - 'hirata' => - array ( - ), - 'hirono' => - array ( - ), - 'iitate' => - array ( - ), - 'inawashiro' => - array ( - ), - 'ishikawa' => - array ( - ), - 'iwaki' => - array ( - ), - 'izumizaki' => - array ( - ), - 'kagamiishi' => - array ( - ), - 'kaneyama' => - array ( - ), - 'kawamata' => - array ( - ), - 'kitakata' => - array ( - ), - 'kitashiobara' => - array ( - ), - 'koori' => - array ( - ), - 'koriyama' => - array ( - ), - 'kunimi' => - array ( - ), - 'miharu' => - array ( - ), - 'mishima' => - array ( - ), - 'namie' => - array ( - ), - 'nango' => - array ( - ), - 'nishiaizu' => - array ( - ), - 'nishigo' => - array ( - ), - 'okuma' => - array ( - ), - 'omotego' => - array ( - ), - 'ono' => - array ( - ), - 'otama' => - array ( - ), - 'samegawa' => - array ( - ), - 'shimogo' => - array ( - ), - 'shirakawa' => - array ( - ), - 'showa' => - array ( - ), - 'soma' => - array ( - ), - 'sukagawa' => - array ( - ), - 'taishin' => - array ( - ), - 'tamakawa' => - array ( - ), - 'tanagura' => - array ( - ), - 'tenei' => - array ( - ), - 'yabuki' => - array ( - ), - 'yamato' => - array ( - ), - 'yamatsuri' => - array ( - ), - 'yanaizu' => - array ( - ), - 'yugawa' => - array ( - ), - ), - 'gifu' => - array ( - 'anpachi' => - array ( - ), - 'ena' => - array ( - ), - 'gifu' => - array ( - ), - 'ginan' => - array ( - ), - 'godo' => - array ( - ), - 'gujo' => - array ( - ), - 'hashima' => - array ( - ), - 'hichiso' => - array ( - ), - 'hida' => - array ( - ), - 'higashishirakawa' => - array ( - ), - 'ibigawa' => - array ( - ), - 'ikeda' => - array ( - ), - 'kakamigahara' => - array ( - ), - 'kani' => - array ( - ), - 'kasahara' => - array ( - ), - 'kasamatsu' => - array ( - ), - 'kawaue' => - array ( - ), - 'kitagata' => - array ( - ), - 'mino' => - array ( - ), - 'minokamo' => - array ( - ), - 'mitake' => - array ( - ), - 'mizunami' => - array ( - ), - 'motosu' => - array ( - ), - 'nakatsugawa' => - array ( - ), - 'ogaki' => - array ( - ), - 'sakahogi' => - array ( - ), - 'seki' => - array ( - ), - 'sekigahara' => - array ( - ), - 'shirakawa' => - array ( - ), - 'tajimi' => - array ( - ), - 'takayama' => - array ( - ), - 'tarui' => - array ( - ), - 'toki' => - array ( - ), - 'tomika' => - array ( - ), - 'wanouchi' => - array ( - ), - 'yamagata' => - array ( - ), - 'yaotsu' => - array ( - ), - 'yoro' => - array ( - ), - ), - 'gunma' => - array ( - 'annaka' => - array ( - ), - 'chiyoda' => - array ( - ), - 'fujioka' => - array ( - ), - 'higashiagatsuma' => - array ( - ), - 'isesaki' => - array ( - ), - 'itakura' => - array ( - ), - 'kanna' => - array ( - ), - 'kanra' => - array ( - ), - 'katashina' => - array ( - ), - 'kawaba' => - array ( - ), - 'kiryu' => - array ( - ), - 'kusatsu' => - array ( - ), - 'maebashi' => - array ( - ), - 'meiwa' => - array ( - ), - 'midori' => - array ( - ), - 'minakami' => - array ( - ), - 'naganohara' => - array ( - ), - 'nakanojo' => - array ( - ), - 'nanmoku' => - array ( - ), - 'numata' => - array ( - ), - 'oizumi' => - array ( - ), - 'ora' => - array ( - ), - 'ota' => - array ( - ), - 'shibukawa' => - array ( - ), - 'shimonita' => - array ( - ), - 'shinto' => - array ( - ), - 'showa' => - array ( - ), - 'takasaki' => - array ( - ), - 'takayama' => - array ( - ), - 'tamamura' => - array ( - ), - 'tatebayashi' => - array ( - ), - 'tomioka' => - array ( - ), - 'tsukiyono' => - array ( - ), - 'tsumagoi' => - array ( - ), - 'ueno' => - array ( - ), - 'yoshioka' => - array ( - ), - ), - 'hiroshima' => - array ( - 'asaminami' => - array ( - ), - 'daiwa' => - array ( - ), - 'etajima' => - array ( - ), - 'fuchu' => - array ( - ), - 'fukuyama' => - array ( - ), - 'hatsukaichi' => - array ( - ), - 'higashihiroshima' => - array ( - ), - 'hongo' => - array ( - ), - 'jinsekikogen' => - array ( - ), - 'kaita' => - array ( - ), - 'kui' => - array ( - ), - 'kumano' => - array ( - ), - 'kure' => - array ( - ), - 'mihara' => - array ( - ), - 'miyoshi' => - array ( - ), - 'naka' => - array ( - ), - 'onomichi' => - array ( - ), - 'osakikamijima' => - array ( - ), - 'otake' => - array ( - ), - 'saka' => - array ( - ), - 'sera' => - array ( - ), - 'seranishi' => - array ( - ), - 'shinichi' => - array ( - ), - 'shobara' => - array ( - ), - 'takehara' => - array ( - ), - ), - 'hokkaido' => - array ( - 'abashiri' => - array ( - ), - 'abira' => - array ( - ), - 'aibetsu' => - array ( - ), - 'akabira' => - array ( - ), - 'akkeshi' => - array ( - ), - 'asahikawa' => - array ( - ), - 'ashibetsu' => - array ( - ), - 'ashoro' => - array ( - ), - 'assabu' => - array ( - ), - 'atsuma' => - array ( - ), - 'bibai' => - array ( - ), - 'biei' => - array ( - ), - 'bifuka' => - array ( - ), - 'bihoro' => - array ( - ), - 'biratori' => - array ( - ), - 'chippubetsu' => - array ( - ), - 'chitose' => - array ( - ), - 'date' => - array ( - ), - 'ebetsu' => - array ( - ), - 'embetsu' => - array ( - ), - 'eniwa' => - array ( - ), - 'erimo' => - array ( - ), - 'esan' => - array ( - ), - 'esashi' => - array ( - ), - 'fukagawa' => - array ( - ), - 'fukushima' => - array ( - ), - 'furano' => - array ( - ), - 'furubira' => - array ( - ), - 'haboro' => - array ( - ), - 'hakodate' => - array ( - ), - 'hamatonbetsu' => - array ( - ), - 'hidaka' => - array ( - ), - 'higashikagura' => - array ( - ), - 'higashikawa' => - array ( - ), - 'hiroo' => - array ( - ), - 'hokuryu' => - array ( - ), - 'hokuto' => - array ( - ), - 'honbetsu' => - array ( - ), - 'horokanai' => - array ( - ), - 'horonobe' => - array ( - ), - 'ikeda' => - array ( - ), - 'imakane' => - array ( - ), - 'ishikari' => - array ( - ), - 'iwamizawa' => - array ( - ), - 'iwanai' => - array ( - ), - 'kamifurano' => - array ( - ), - 'kamikawa' => - array ( - ), - 'kamishihoro' => - array ( - ), - 'kamisunagawa' => - array ( - ), - 'kamoenai' => - array ( - ), - 'kayabe' => - array ( - ), - 'kembuchi' => - array ( - ), - 'kikonai' => - array ( - ), - 'kimobetsu' => - array ( - ), - 'kitahiroshima' => - array ( - ), - 'kitami' => - array ( - ), - 'kiyosato' => - array ( - ), - 'koshimizu' => - array ( - ), - 'kunneppu' => - array ( - ), - 'kuriyama' => - array ( - ), - 'kuromatsunai' => - array ( - ), - 'kushiro' => - array ( - ), - 'kutchan' => - array ( - ), - 'kyowa' => - array ( - ), - 'mashike' => - array ( - ), - 'matsumae' => - array ( - ), - 'mikasa' => - array ( - ), - 'minamifurano' => - array ( - ), - 'mombetsu' => - array ( - ), - 'moseushi' => - array ( - ), - 'mukawa' => - array ( - ), - 'muroran' => - array ( - ), - 'naie' => - array ( - ), - 'nakagawa' => - array ( - ), - 'nakasatsunai' => - array ( - ), - 'nakatombetsu' => - array ( - ), - 'nanae' => - array ( - ), - 'nanporo' => - array ( - ), - 'nayoro' => - array ( - ), - 'nemuro' => - array ( - ), - 'niikappu' => - array ( - ), - 'niki' => - array ( - ), - 'nishiokoppe' => - array ( - ), - 'noboribetsu' => - array ( - ), - 'numata' => - array ( - ), - 'obihiro' => - array ( - ), - 'obira' => - array ( - ), - 'oketo' => - array ( - ), - 'okoppe' => - array ( - ), - 'otaru' => - array ( - ), - 'otobe' => - array ( - ), - 'otofuke' => - array ( - ), - 'otoineppu' => - array ( - ), - 'oumu' => - array ( - ), - 'ozora' => - array ( - ), - 'pippu' => - array ( - ), - 'rankoshi' => - array ( - ), - 'rebun' => - array ( - ), - 'rikubetsu' => - array ( - ), - 'rishiri' => - array ( - ), - 'rishirifuji' => - array ( - ), - 'saroma' => - array ( - ), - 'sarufutsu' => - array ( - ), - 'shakotan' => - array ( - ), - 'shari' => - array ( - ), - 'shibecha' => - array ( - ), - 'shibetsu' => - array ( - ), - 'shikabe' => - array ( - ), - 'shikaoi' => - array ( - ), - 'shimamaki' => - array ( - ), - 'shimizu' => - array ( - ), - 'shimokawa' => - array ( - ), - 'shinshinotsu' => - array ( - ), - 'shintoku' => - array ( - ), - 'shiranuka' => - array ( - ), - 'shiraoi' => - array ( - ), - 'shiriuchi' => - array ( - ), - 'sobetsu' => - array ( - ), - 'sunagawa' => - array ( - ), - 'taiki' => - array ( - ), - 'takasu' => - array ( - ), - 'takikawa' => - array ( - ), - 'takinoue' => - array ( - ), - 'teshikaga' => - array ( - ), - 'tobetsu' => - array ( - ), - 'tohma' => - array ( - ), - 'tomakomai' => - array ( - ), - 'tomari' => - array ( - ), - 'toya' => - array ( - ), - 'toyako' => - array ( - ), - 'toyotomi' => - array ( - ), - 'toyoura' => - array ( - ), - 'tsubetsu' => - array ( - ), - 'tsukigata' => - array ( - ), - 'urakawa' => - array ( - ), - 'urausu' => - array ( - ), - 'uryu' => - array ( - ), - 'utashinai' => - array ( - ), - 'wakkanai' => - array ( - ), - 'wassamu' => - array ( - ), - 'yakumo' => - array ( - ), - 'yoichi' => - array ( - ), - ), - 'hyogo' => - array ( - 'aioi' => - array ( - ), - 'akashi' => - array ( - ), - 'ako' => - array ( - ), - 'amagasaki' => - array ( - ), - 'aogaki' => - array ( - ), - 'asago' => - array ( - ), - 'ashiya' => - array ( - ), - 'awaji' => - array ( - ), - 'fukusaki' => - array ( - ), - 'goshiki' => - array ( - ), - 'harima' => - array ( - ), - 'himeji' => - array ( - ), - 'ichikawa' => - array ( - ), - 'inagawa' => - array ( - ), - 'itami' => - array ( - ), - 'kakogawa' => - array ( - ), - 'kamigori' => - array ( - ), - 'kamikawa' => - array ( - ), - 'kasai' => - array ( - ), - 'kasuga' => - array ( - ), - 'kawanishi' => - array ( - ), - 'miki' => - array ( - ), - 'minamiawaji' => - array ( - ), - 'nishinomiya' => - array ( - ), - 'nishiwaki' => - array ( - ), - 'ono' => - array ( - ), - 'sanda' => - array ( - ), - 'sannan' => - array ( - ), - 'sasayama' => - array ( - ), - 'sayo' => - array ( - ), - 'shingu' => - array ( - ), - 'shinonsen' => - array ( - ), - 'shiso' => - array ( - ), - 'sumoto' => - array ( - ), - 'taishi' => - array ( - ), - 'taka' => - array ( - ), - 'takarazuka' => - array ( - ), - 'takasago' => - array ( - ), - 'takino' => - array ( - ), - 'tamba' => - array ( - ), - 'tatsuno' => - array ( - ), - 'toyooka' => - array ( - ), - 'yabu' => - array ( - ), - 'yashiro' => - array ( - ), - 'yoka' => - array ( - ), - 'yokawa' => - array ( - ), - ), - 'ibaraki' => - array ( - 'ami' => - array ( - ), - 'asahi' => - array ( - ), - 'bando' => - array ( - ), - 'chikusei' => - array ( - ), - 'daigo' => - array ( - ), - 'fujishiro' => - array ( - ), - 'hitachi' => - array ( - ), - 'hitachinaka' => - array ( - ), - 'hitachiomiya' => - array ( - ), - 'hitachiota' => - array ( - ), - 'ibaraki' => - array ( - ), - 'ina' => - array ( - ), - 'inashiki' => - array ( - ), - 'itako' => - array ( - ), - 'iwama' => - array ( - ), - 'joso' => - array ( - ), - 'kamisu' => - array ( - ), - 'kasama' => - array ( - ), - 'kashima' => - array ( - ), - 'kasumigaura' => - array ( - ), - 'koga' => - array ( - ), - 'miho' => - array ( - ), - 'mito' => - array ( - ), - 'moriya' => - array ( - ), - 'naka' => - array ( - ), - 'namegata' => - array ( - ), - 'oarai' => - array ( - ), - 'ogawa' => - array ( - ), - 'omitama' => - array ( - ), - 'ryugasaki' => - array ( - ), - 'sakai' => - array ( - ), - 'sakuragawa' => - array ( - ), - 'shimodate' => - array ( - ), - 'shimotsuma' => - array ( - ), - 'shirosato' => - array ( - ), - 'sowa' => - array ( - ), - 'suifu' => - array ( - ), - 'takahagi' => - array ( - ), - 'tamatsukuri' => - array ( - ), - 'tokai' => - array ( - ), - 'tomobe' => - array ( - ), - 'tone' => - array ( - ), - 'toride' => - array ( - ), - 'tsuchiura' => - array ( - ), - 'tsukuba' => - array ( - ), - 'uchihara' => - array ( - ), - 'ushiku' => - array ( - ), - 'yachiyo' => - array ( - ), - 'yamagata' => - array ( - ), - 'yawara' => - array ( - ), - 'yuki' => - array ( - ), - ), - 'ishikawa' => - array ( - 'anamizu' => - array ( - ), - 'hakui' => - array ( - ), - 'hakusan' => - array ( - ), - 'kaga' => - array ( - ), - 'kahoku' => - array ( - ), - 'kanazawa' => - array ( - ), - 'kawakita' => - array ( - ), - 'komatsu' => - array ( - ), - 'nakanoto' => - array ( - ), - 'nanao' => - array ( - ), - 'nomi' => - array ( - ), - 'nonoichi' => - array ( - ), - 'noto' => - array ( - ), - 'shika' => - array ( - ), - 'suzu' => - array ( - ), - 'tsubata' => - array ( - ), - 'tsurugi' => - array ( - ), - 'uchinada' => - array ( - ), - 'wajima' => - array ( - ), - ), - 'iwate' => - array ( - 'fudai' => - array ( - ), - 'fujisawa' => - array ( - ), - 'hanamaki' => - array ( - ), - 'hiraizumi' => - array ( - ), - 'hirono' => - array ( - ), - 'ichinohe' => - array ( - ), - 'ichinoseki' => - array ( - ), - 'iwaizumi' => - array ( - ), - 'iwate' => - array ( - ), - 'joboji' => - array ( - ), - 'kamaishi' => - array ( - ), - 'kanegasaki' => - array ( - ), - 'karumai' => - array ( - ), - 'kawai' => - array ( - ), - 'kitakami' => - array ( - ), - 'kuji' => - array ( - ), - 'kunohe' => - array ( - ), - 'kuzumaki' => - array ( - ), - 'miyako' => - array ( - ), - 'mizusawa' => - array ( - ), - 'morioka' => - array ( - ), - 'ninohe' => - array ( - ), - 'noda' => - array ( - ), - 'ofunato' => - array ( - ), - 'oshu' => - array ( - ), - 'otsuchi' => - array ( - ), - 'rikuzentakata' => - array ( - ), - 'shiwa' => - array ( - ), - 'shizukuishi' => - array ( - ), - 'sumita' => - array ( - ), - 'tanohata' => - array ( - ), - 'tono' => - array ( - ), - 'yahaba' => - array ( - ), - 'yamada' => - array ( - ), - ), - 'kagawa' => - array ( - 'ayagawa' => - array ( - ), - 'higashikagawa' => - array ( - ), - 'kanonji' => - array ( - ), - 'kotohira' => - array ( - ), - 'manno' => - array ( - ), - 'marugame' => - array ( - ), - 'mitoyo' => - array ( - ), - 'naoshima' => - array ( - ), - 'sanuki' => - array ( - ), - 'tadotsu' => - array ( - ), - 'takamatsu' => - array ( - ), - 'tonosho' => - array ( - ), - 'uchinomi' => - array ( - ), - 'utazu' => - array ( - ), - 'zentsuji' => - array ( - ), - ), - 'kagoshima' => - array ( - 'akune' => - array ( - ), - 'amami' => - array ( - ), - 'hioki' => - array ( - ), - 'isa' => - array ( - ), - 'isen' => - array ( - ), - 'izumi' => - array ( - ), - 'kagoshima' => - array ( - ), - 'kanoya' => - array ( - ), - 'kawanabe' => - array ( - ), - 'kinko' => - array ( - ), - 'kouyama' => - array ( - ), - 'makurazaki' => - array ( - ), - 'matsumoto' => - array ( - ), - 'minamitane' => - array ( - ), - 'nakatane' => - array ( - ), - 'nishinoomote' => - array ( - ), - 'satsumasendai' => - array ( - ), - 'soo' => - array ( - ), - 'tarumizu' => - array ( - ), - 'yusui' => - array ( - ), - ), - 'kanagawa' => - array ( - 'aikawa' => - array ( - ), - 'atsugi' => - array ( - ), - 'ayase' => - array ( - ), - 'chigasaki' => - array ( - ), - 'ebina' => - array ( - ), - 'fujisawa' => - array ( - ), - 'hadano' => - array ( - ), - 'hakone' => - array ( - ), - 'hiratsuka' => - array ( - ), - 'isehara' => - array ( - ), - 'kaisei' => - array ( - ), - 'kamakura' => - array ( - ), - 'kiyokawa' => - array ( - ), - 'matsuda' => - array ( - ), - 'minamiashigara' => - array ( - ), - 'miura' => - array ( - ), - 'nakai' => - array ( - ), - 'ninomiya' => - array ( - ), - 'odawara' => - array ( - ), - 'oi' => - array ( - ), - 'oiso' => - array ( - ), - 'sagamihara' => - array ( - ), - 'samukawa' => - array ( - ), - 'tsukui' => - array ( - ), - 'yamakita' => - array ( - ), - 'yamato' => - array ( - ), - 'yokosuka' => - array ( - ), - 'yugawara' => - array ( - ), - 'zama' => - array ( - ), - 'zushi' => - array ( - ), - ), - 'kochi' => - array ( - 'aki' => - array ( - ), - 'geisei' => - array ( - ), - 'hidaka' => - array ( - ), - 'higashitsuno' => - array ( - ), - 'ino' => - array ( - ), - 'kagami' => - array ( - ), - 'kami' => - array ( - ), - 'kitagawa' => - array ( - ), - 'kochi' => - array ( - ), - 'mihara' => - array ( - ), - 'motoyama' => - array ( - ), - 'muroto' => - array ( - ), - 'nahari' => - array ( - ), - 'nakamura' => - array ( - ), - 'nankoku' => - array ( - ), - 'nishitosa' => - array ( - ), - 'niyodogawa' => - array ( - ), - 'ochi' => - array ( - ), - 'okawa' => - array ( - ), - 'otoyo' => - array ( - ), - 'otsuki' => - array ( - ), - 'sakawa' => - array ( - ), - 'sukumo' => - array ( - ), - 'susaki' => - array ( - ), - 'tosa' => - array ( - ), - 'tosashimizu' => - array ( - ), - 'toyo' => - array ( - ), - 'tsuno' => - array ( - ), - 'umaji' => - array ( - ), - 'yasuda' => - array ( - ), - 'yusuhara' => - array ( - ), - ), - 'kumamoto' => - array ( - 'amakusa' => - array ( - ), - 'arao' => - array ( - ), - 'aso' => - array ( - ), - 'choyo' => - array ( - ), - 'gyokuto' => - array ( - ), - 'kamiamakusa' => - array ( - ), - 'kikuchi' => - array ( - ), - 'kumamoto' => - array ( - ), - 'mashiki' => - array ( - ), - 'mifune' => - array ( - ), - 'minamata' => - array ( - ), - 'minamioguni' => - array ( - ), - 'nagasu' => - array ( - ), - 'nishihara' => - array ( - ), - 'oguni' => - array ( - ), - 'ozu' => - array ( - ), - 'sumoto' => - array ( - ), - 'takamori' => - array ( - ), - 'uki' => - array ( - ), - 'uto' => - array ( - ), - 'yamaga' => - array ( - ), - 'yamato' => - array ( - ), - 'yatsushiro' => - array ( - ), - ), - 'kyoto' => - array ( - 'ayabe' => - array ( - ), - 'fukuchiyama' => - array ( - ), - 'higashiyama' => - array ( - ), - 'ide' => - array ( - ), - 'ine' => - array ( - ), - 'joyo' => - array ( - ), - 'kameoka' => - array ( - ), - 'kamo' => - array ( - ), - 'kita' => - array ( - ), - 'kizu' => - array ( - ), - 'kumiyama' => - array ( - ), - 'kyotamba' => - array ( - ), - 'kyotanabe' => - array ( - ), - 'kyotango' => - array ( - ), - 'maizuru' => - array ( - ), - 'minami' => - array ( - ), - 'minamiyamashiro' => - array ( - ), - 'miyazu' => - array ( - ), - 'muko' => - array ( - ), - 'nagaokakyo' => - array ( - ), - 'nakagyo' => - array ( - ), - 'nantan' => - array ( - ), - 'oyamazaki' => - array ( - ), - 'sakyo' => - array ( - ), - 'seika' => - array ( - ), - 'tanabe' => - array ( - ), - 'uji' => - array ( - ), - 'ujitawara' => - array ( - ), - 'wazuka' => - array ( - ), - 'yamashina' => - array ( - ), - 'yawata' => - array ( - ), - ), - 'mie' => - array ( - 'asahi' => - array ( - ), - 'inabe' => - array ( - ), - 'ise' => - array ( - ), - 'kameyama' => - array ( - ), - 'kawagoe' => - array ( - ), - 'kiho' => - array ( - ), - 'kisosaki' => - array ( - ), - 'kiwa' => - array ( - ), - 'komono' => - array ( - ), - 'kumano' => - array ( - ), - 'kuwana' => - array ( - ), - 'matsusaka' => - array ( - ), - 'meiwa' => - array ( - ), - 'mihama' => - array ( - ), - 'minamiise' => - array ( - ), - 'misugi' => - array ( - ), - 'miyama' => - array ( - ), - 'nabari' => - array ( - ), - 'shima' => - array ( - ), - 'suzuka' => - array ( - ), - 'tado' => - array ( - ), - 'taiki' => - array ( - ), - 'taki' => - array ( - ), - 'tamaki' => - array ( - ), - 'toba' => - array ( - ), - 'tsu' => - array ( - ), - 'udono' => - array ( - ), - 'ureshino' => - array ( - ), - 'watarai' => - array ( - ), - 'yokkaichi' => - array ( - ), - ), - 'miyagi' => - array ( - 'furukawa' => - array ( - ), - 'higashimatsushima' => - array ( - ), - 'ishinomaki' => - array ( - ), - 'iwanuma' => - array ( - ), - 'kakuda' => - array ( - ), - 'kami' => - array ( - ), - 'kawasaki' => - array ( - ), - 'marumori' => - array ( - ), - 'matsushima' => - array ( - ), - 'minamisanriku' => - array ( - ), - 'misato' => - array ( - ), - 'murata' => - array ( - ), - 'natori' => - array ( - ), - 'ogawara' => - array ( - ), - 'ohira' => - array ( - ), - 'onagawa' => - array ( - ), - 'osaki' => - array ( - ), - 'rifu' => - array ( - ), - 'semine' => - array ( - ), - 'shibata' => - array ( - ), - 'shichikashuku' => - array ( - ), - 'shikama' => - array ( - ), - 'shiogama' => - array ( - ), - 'shiroishi' => - array ( - ), - 'tagajo' => - array ( - ), - 'taiwa' => - array ( - ), - 'tome' => - array ( - ), - 'tomiya' => - array ( - ), - 'wakuya' => - array ( - ), - 'watari' => - array ( - ), - 'yamamoto' => - array ( - ), - 'zao' => - array ( - ), - ), - 'miyazaki' => - array ( - 'aya' => - array ( - ), - 'ebino' => - array ( - ), - 'gokase' => - array ( - ), - 'hyuga' => - array ( - ), - 'kadogawa' => - array ( - ), - 'kawaminami' => - array ( - ), - 'kijo' => - array ( - ), - 'kitagawa' => - array ( - ), - 'kitakata' => - array ( - ), - 'kitaura' => - array ( - ), - 'kobayashi' => - array ( - ), - 'kunitomi' => - array ( - ), - 'kushima' => - array ( - ), - 'mimata' => - array ( - ), - 'miyakonojo' => - array ( - ), - 'miyazaki' => - array ( - ), - 'morotsuka' => - array ( - ), - 'nichinan' => - array ( - ), - 'nishimera' => - array ( - ), - 'nobeoka' => - array ( - ), - 'saito' => - array ( - ), - 'shiiba' => - array ( - ), - 'shintomi' => - array ( - ), - 'takaharu' => - array ( - ), - 'takanabe' => - array ( - ), - 'takazaki' => - array ( - ), - 'tsuno' => - array ( - ), - ), - 'nagano' => - array ( - 'achi' => - array ( - ), - 'agematsu' => - array ( - ), - 'anan' => - array ( - ), - 'aoki' => - array ( - ), - 'asahi' => - array ( - ), - 'azumino' => - array ( - ), - 'chikuhoku' => - array ( - ), - 'chikuma' => - array ( - ), - 'chino' => - array ( - ), - 'fujimi' => - array ( - ), - 'hakuba' => - array ( - ), - 'hara' => - array ( - ), - 'hiraya' => - array ( - ), - 'iida' => - array ( - ), - 'iijima' => - array ( - ), - 'iiyama' => - array ( - ), - 'iizuna' => - array ( - ), - 'ikeda' => - array ( - ), - 'ikusaka' => - array ( - ), - 'ina' => - array ( - ), - 'karuizawa' => - array ( - ), - 'kawakami' => - array ( - ), - 'kiso' => - array ( - ), - 'kisofukushima' => - array ( - ), - 'kitaaiki' => - array ( - ), - 'komagane' => - array ( - ), - 'komoro' => - array ( - ), - 'matsukawa' => - array ( - ), - 'matsumoto' => - array ( - ), - 'miasa' => - array ( - ), - 'minamiaiki' => - array ( - ), - 'minamimaki' => - array ( - ), - 'minamiminowa' => - array ( - ), - 'minowa' => - array ( - ), - 'miyada' => - array ( - ), - 'miyota' => - array ( - ), - 'mochizuki' => - array ( - ), - 'nagano' => - array ( - ), - 'nagawa' => - array ( - ), - 'nagiso' => - array ( - ), - 'nakagawa' => - array ( - ), - 'nakano' => - array ( - ), - 'nozawaonsen' => - array ( - ), - 'obuse' => - array ( - ), - 'ogawa' => - array ( - ), - 'okaya' => - array ( - ), - 'omachi' => - array ( - ), - 'omi' => - array ( - ), - 'ookuwa' => - array ( - ), - 'ooshika' => - array ( - ), - 'otaki' => - array ( - ), - 'otari' => - array ( - ), - 'sakae' => - array ( - ), - 'sakaki' => - array ( - ), - 'saku' => - array ( - ), - 'sakuho' => - array ( - ), - 'shimosuwa' => - array ( - ), - 'shinanomachi' => - array ( - ), - 'shiojiri' => - array ( - ), - 'suwa' => - array ( - ), - 'suzaka' => - array ( - ), - 'takagi' => - array ( - ), - 'takamori' => - array ( - ), - 'takayama' => - array ( - ), - 'tateshina' => - array ( - ), - 'tatsuno' => - array ( - ), - 'togakushi' => - array ( - ), - 'togura' => - array ( - ), - 'tomi' => - array ( - ), - 'ueda' => - array ( - ), - 'wada' => - array ( - ), - 'yamagata' => - array ( - ), - 'yamanouchi' => - array ( - ), - 'yasaka' => - array ( - ), - 'yasuoka' => - array ( - ), - ), - 'nagasaki' => - array ( - 'chijiwa' => - array ( - ), - 'futsu' => - array ( - ), - 'goto' => - array ( - ), - 'hasami' => - array ( - ), - 'hirado' => - array ( - ), - 'iki' => - array ( - ), - 'isahaya' => - array ( - ), - 'kawatana' => - array ( - ), - 'kuchinotsu' => - array ( - ), - 'matsuura' => - array ( - ), - 'nagasaki' => - array ( - ), - 'obama' => - array ( - ), - 'omura' => - array ( - ), - 'oseto' => - array ( - ), - 'saikai' => - array ( - ), - 'sasebo' => - array ( - ), - 'seihi' => - array ( - ), - 'shimabara' => - array ( - ), - 'shinkamigoto' => - array ( - ), - 'togitsu' => - array ( - ), - 'tsushima' => - array ( - ), - 'unzen' => - array ( - ), - ), - 'nara' => - array ( - 'ando' => - array ( - ), - 'gose' => - array ( - ), - 'heguri' => - array ( - ), - 'higashiyoshino' => - array ( - ), - 'ikaruga' => - array ( - ), - 'ikoma' => - array ( - ), - 'kamikitayama' => - array ( - ), - 'kanmaki' => - array ( - ), - 'kashiba' => - array ( - ), - 'kashihara' => - array ( - ), - 'katsuragi' => - array ( - ), - 'kawai' => - array ( - ), - 'kawakami' => - array ( - ), - 'kawanishi' => - array ( - ), - 'koryo' => - array ( - ), - 'kurotaki' => - array ( - ), - 'mitsue' => - array ( - ), - 'miyake' => - array ( - ), - 'nara' => - array ( - ), - 'nosegawa' => - array ( - ), - 'oji' => - array ( - ), - 'ouda' => - array ( - ), - 'oyodo' => - array ( - ), - 'sakurai' => - array ( - ), - 'sango' => - array ( - ), - 'shimoichi' => - array ( - ), - 'shimokitayama' => - array ( - ), - 'shinjo' => - array ( - ), - 'soni' => - array ( - ), - 'takatori' => - array ( - ), - 'tawaramoto' => - array ( - ), - 'tenkawa' => - array ( - ), - 'tenri' => - array ( - ), - 'uda' => - array ( - ), - 'yamatokoriyama' => - array ( - ), - 'yamatotakada' => - array ( - ), - 'yamazoe' => - array ( - ), - 'yoshino' => - array ( - ), - ), - 'niigata' => - array ( - 'aga' => - array ( - ), - 'agano' => - array ( - ), - 'gosen' => - array ( - ), - 'itoigawa' => - array ( - ), - 'izumozaki' => - array ( - ), - 'joetsu' => - array ( - ), - 'kamo' => - array ( - ), - 'kariwa' => - array ( - ), - 'kashiwazaki' => - array ( - ), - 'minamiuonuma' => - array ( - ), - 'mitsuke' => - array ( - ), - 'muika' => - array ( - ), - 'murakami' => - array ( - ), - 'myoko' => - array ( - ), - 'nagaoka' => - array ( - ), - 'niigata' => - array ( - ), - 'ojiya' => - array ( - ), - 'omi' => - array ( - ), - 'sado' => - array ( - ), - 'sanjo' => - array ( - ), - 'seiro' => - array ( - ), - 'seirou' => - array ( - ), - 'sekikawa' => - array ( - ), - 'shibata' => - array ( - ), - 'tagami' => - array ( - ), - 'tainai' => - array ( - ), - 'tochio' => - array ( - ), - 'tokamachi' => - array ( - ), - 'tsubame' => - array ( - ), - 'tsunan' => - array ( - ), - 'uonuma' => - array ( - ), - 'yahiko' => - array ( - ), - 'yoita' => - array ( - ), - 'yuzawa' => - array ( - ), - ), - 'oita' => - array ( - 'beppu' => - array ( - ), - 'bungoono' => - array ( - ), - 'bungotakada' => - array ( - ), - 'hasama' => - array ( - ), - 'hiji' => - array ( - ), - 'himeshima' => - array ( - ), - 'hita' => - array ( - ), - 'kamitsue' => - array ( - ), - 'kokonoe' => - array ( - ), - 'kuju' => - array ( - ), - 'kunisaki' => - array ( - ), - 'kusu' => - array ( - ), - 'oita' => - array ( - ), - 'saiki' => - array ( - ), - 'taketa' => - array ( - ), - 'tsukumi' => - array ( - ), - 'usa' => - array ( - ), - 'usuki' => - array ( - ), - 'yufu' => - array ( - ), - ), - 'okayama' => - array ( - 'akaiwa' => - array ( - ), - 'asakuchi' => - array ( - ), - 'bizen' => - array ( - ), - 'hayashima' => - array ( - ), - 'ibara' => - array ( - ), - 'kagamino' => - array ( - ), - 'kasaoka' => - array ( - ), - 'kibichuo' => - array ( - ), - 'kumenan' => - array ( - ), - 'kurashiki' => - array ( - ), - 'maniwa' => - array ( - ), - 'misaki' => - array ( - ), - 'nagi' => - array ( - ), - 'niimi' => - array ( - ), - 'nishiawakura' => - array ( - ), - 'okayama' => - array ( - ), - 'satosho' => - array ( - ), - 'setouchi' => - array ( - ), - 'shinjo' => - array ( - ), - 'shoo' => - array ( - ), - 'soja' => - array ( - ), - 'takahashi' => - array ( - ), - 'tamano' => - array ( - ), - 'tsuyama' => - array ( - ), - 'wake' => - array ( - ), - 'yakage' => - array ( - ), - ), - 'okinawa' => - array ( - 'aguni' => - array ( - ), - 'ginowan' => - array ( - ), - 'ginoza' => - array ( - ), - 'gushikami' => - array ( - ), - 'haebaru' => - array ( - ), - 'higashi' => - array ( - ), - 'hirara' => - array ( - ), - 'iheya' => - array ( - ), - 'ishigaki' => - array ( - ), - 'ishikawa' => - array ( - ), - 'itoman' => - array ( - ), - 'izena' => - array ( - ), - 'kadena' => - array ( - ), - 'kin' => - array ( - ), - 'kitadaito' => - array ( - ), - 'kitanakagusuku' => - array ( - ), - 'kumejima' => - array ( - ), - 'kunigami' => - array ( - ), - 'minamidaito' => - array ( - ), - 'motobu' => - array ( - ), - 'nago' => - array ( - ), - 'naha' => - array ( - ), - 'nakagusuku' => - array ( - ), - 'nakijin' => - array ( - ), - 'nanjo' => - array ( - ), - 'nishihara' => - array ( - ), - 'ogimi' => - array ( - ), - 'okinawa' => - array ( - ), - 'onna' => - array ( - ), - 'shimoji' => - array ( - ), - 'taketomi' => - array ( - ), - 'tarama' => - array ( - ), - 'tokashiki' => - array ( - ), - 'tomigusuku' => - array ( - ), - 'tonaki' => - array ( - ), - 'urasoe' => - array ( - ), - 'uruma' => - array ( - ), - 'yaese' => - array ( - ), - 'yomitan' => - array ( - ), - 'yonabaru' => - array ( - ), - 'yonaguni' => - array ( - ), - 'zamami' => - array ( - ), - ), - 'osaka' => - array ( - 'abeno' => - array ( - ), - 'chihayaakasaka' => - array ( - ), - 'chuo' => - array ( - ), - 'daito' => - array ( - ), - 'fujiidera' => - array ( - ), - 'habikino' => - array ( - ), - 'hannan' => - array ( - ), - 'higashiosaka' => - array ( - ), - 'higashisumiyoshi' => - array ( - ), - 'higashiyodogawa' => - array ( - ), - 'hirakata' => - array ( - ), - 'ibaraki' => - array ( - ), - 'ikeda' => - array ( - ), - 'izumi' => - array ( - ), - 'izumiotsu' => - array ( - ), - 'izumisano' => - array ( - ), - 'kadoma' => - array ( - ), - 'kaizuka' => - array ( - ), - 'kanan' => - array ( - ), - 'kashiwara' => - array ( - ), - 'katano' => - array ( - ), - 'kawachinagano' => - array ( - ), - 'kishiwada' => - array ( - ), - 'kita' => - array ( - ), - 'kumatori' => - array ( - ), - 'matsubara' => - array ( - ), - 'minato' => - array ( - ), - 'minoh' => - array ( - ), - 'misaki' => - array ( - ), - 'moriguchi' => - array ( - ), - 'neyagawa' => - array ( - ), - 'nishi' => - array ( - ), - 'nose' => - array ( - ), - 'osakasayama' => - array ( - ), - 'sakai' => - array ( - ), - 'sayama' => - array ( - ), - 'sennan' => - array ( - ), - 'settsu' => - array ( - ), - 'shijonawate' => - array ( - ), - 'shimamoto' => - array ( - ), - 'suita' => - array ( - ), - 'tadaoka' => - array ( - ), - 'taishi' => - array ( - ), - 'tajiri' => - array ( - ), - 'takaishi' => - array ( - ), - 'takatsuki' => - array ( - ), - 'tondabayashi' => - array ( - ), - 'toyonaka' => - array ( - ), - 'toyono' => - array ( - ), - 'yao' => - array ( - ), - ), - 'saga' => - array ( - 'ariake' => - array ( - ), - 'arita' => - array ( - ), - 'fukudomi' => - array ( - ), - 'genkai' => - array ( - ), - 'hamatama' => - array ( - ), - 'hizen' => - array ( - ), - 'imari' => - array ( - ), - 'kamimine' => - array ( - ), - 'kanzaki' => - array ( - ), - 'karatsu' => - array ( - ), - 'kashima' => - array ( - ), - 'kitagata' => - array ( - ), - 'kitahata' => - array ( - ), - 'kiyama' => - array ( - ), - 'kouhoku' => - array ( - ), - 'kyuragi' => - array ( - ), - 'nishiarita' => - array ( - ), - 'ogi' => - array ( - ), - 'omachi' => - array ( - ), - 'ouchi' => - array ( - ), - 'saga' => - array ( - ), - 'shiroishi' => - array ( - ), - 'taku' => - array ( - ), - 'tara' => - array ( - ), - 'tosu' => - array ( - ), - 'yoshinogari' => - array ( - ), - ), - 'saitama' => - array ( - 'arakawa' => - array ( - ), - 'asaka' => - array ( - ), - 'chichibu' => - array ( - ), - 'fujimi' => - array ( - ), - 'fujimino' => - array ( - ), - 'fukaya' => - array ( - ), - 'hanno' => - array ( - ), - 'hanyu' => - array ( - ), - 'hasuda' => - array ( - ), - 'hatogaya' => - array ( - ), - 'hatoyama' => - array ( - ), - 'hidaka' => - array ( - ), - 'higashichichibu' => - array ( - ), - 'higashimatsuyama' => - array ( - ), - 'honjo' => - array ( - ), - 'ina' => - array ( - ), - 'iruma' => - array ( - ), - 'iwatsuki' => - array ( - ), - 'kamiizumi' => - array ( - ), - 'kamikawa' => - array ( - ), - 'kamisato' => - array ( - ), - 'kasukabe' => - array ( - ), - 'kawagoe' => - array ( - ), - 'kawaguchi' => - array ( - ), - 'kawajima' => - array ( - ), - 'kazo' => - array ( - ), - 'kitamoto' => - array ( - ), - 'koshigaya' => - array ( - ), - 'kounosu' => - array ( - ), - 'kuki' => - array ( - ), - 'kumagaya' => - array ( - ), - 'matsubushi' => - array ( - ), - 'minano' => - array ( - ), - 'misato' => - array ( - ), - 'miyashiro' => - array ( - ), - 'miyoshi' => - array ( - ), - 'moroyama' => - array ( - ), - 'nagatoro' => - array ( - ), - 'namegawa' => - array ( - ), - 'niiza' => - array ( - ), - 'ogano' => - array ( - ), - 'ogawa' => - array ( - ), - 'ogose' => - array ( - ), - 'okegawa' => - array ( - ), - 'omiya' => - array ( - ), - 'otaki' => - array ( - ), - 'ranzan' => - array ( - ), - 'ryokami' => - array ( - ), - 'saitama' => - array ( - ), - 'sakado' => - array ( - ), - 'satte' => - array ( - ), - 'sayama' => - array ( - ), - 'shiki' => - array ( - ), - 'shiraoka' => - array ( - ), - 'soka' => - array ( - ), - 'sugito' => - array ( - ), - 'toda' => - array ( - ), - 'tokigawa' => - array ( - ), - 'tokorozawa' => - array ( - ), - 'tsurugashima' => - array ( - ), - 'urawa' => - array ( - ), - 'warabi' => - array ( - ), - 'yashio' => - array ( - ), - 'yokoze' => - array ( - ), - 'yono' => - array ( - ), - 'yorii' => - array ( - ), - 'yoshida' => - array ( - ), - 'yoshikawa' => - array ( - ), - 'yoshimi' => - array ( - ), - ), - 'shiga' => - array ( - 'aisho' => - array ( - ), - 'gamo' => - array ( - ), - 'higashiomi' => - array ( - ), - 'hikone' => - array ( - ), - 'koka' => - array ( - ), - 'konan' => - array ( - ), - 'kosei' => - array ( - ), - 'koto' => - array ( - ), - 'kusatsu' => - array ( - ), - 'maibara' => - array ( - ), - 'moriyama' => - array ( - ), - 'nagahama' => - array ( - ), - 'nishiazai' => - array ( - ), - 'notogawa' => - array ( - ), - 'omihachiman' => - array ( - ), - 'otsu' => - array ( - ), - 'ritto' => - array ( - ), - 'ryuoh' => - array ( - ), - 'takashima' => - array ( - ), - 'takatsuki' => - array ( - ), - 'torahime' => - array ( - ), - 'toyosato' => - array ( - ), - 'yasu' => - array ( - ), - ), - 'shimane' => - array ( - 'akagi' => - array ( - ), - 'ama' => - array ( - ), - 'gotsu' => - array ( - ), - 'hamada' => - array ( - ), - 'higashiizumo' => - array ( - ), - 'hikawa' => - array ( - ), - 'hikimi' => - array ( - ), - 'izumo' => - array ( - ), - 'kakinoki' => - array ( - ), - 'masuda' => - array ( - ), - 'matsue' => - array ( - ), - 'misato' => - array ( - ), - 'nishinoshima' => - array ( - ), - 'ohda' => - array ( - ), - 'okinoshima' => - array ( - ), - 'okuizumo' => - array ( - ), - 'shimane' => - array ( - ), - 'tamayu' => - array ( - ), - 'tsuwano' => - array ( - ), - 'unnan' => - array ( - ), - 'yakumo' => - array ( - ), - 'yasugi' => - array ( - ), - 'yatsuka' => - array ( - ), - ), - 'shizuoka' => - array ( - 'arai' => - array ( - ), - 'atami' => - array ( - ), - 'fuji' => - array ( - ), - 'fujieda' => - array ( - ), - 'fujikawa' => - array ( - ), - 'fujinomiya' => - array ( - ), - 'fukuroi' => - array ( - ), - 'gotemba' => - array ( - ), - 'haibara' => - array ( - ), - 'hamamatsu' => - array ( - ), - 'higashiizu' => - array ( - ), - 'ito' => - array ( - ), - 'iwata' => - array ( - ), - 'izu' => - array ( - ), - 'izunokuni' => - array ( - ), - 'kakegawa' => - array ( - ), - 'kannami' => - array ( - ), - 'kawanehon' => - array ( - ), - 'kawazu' => - array ( - ), - 'kikugawa' => - array ( - ), - 'kosai' => - array ( - ), - 'makinohara' => - array ( - ), - 'matsuzaki' => - array ( - ), - 'minamiizu' => - array ( - ), - 'mishima' => - array ( - ), - 'morimachi' => - array ( - ), - 'nishiizu' => - array ( - ), - 'numazu' => - array ( - ), - 'omaezaki' => - array ( - ), - 'shimada' => - array ( - ), - 'shimizu' => - array ( - ), - 'shimoda' => - array ( - ), - 'shizuoka' => - array ( - ), - 'susono' => - array ( - ), - 'yaizu' => - array ( - ), - 'yoshida' => - array ( - ), - ), - 'tochigi' => - array ( - 'ashikaga' => - array ( - ), - 'bato' => - array ( - ), - 'haga' => - array ( - ), - 'ichikai' => - array ( - ), - 'iwafune' => - array ( - ), - 'kaminokawa' => - array ( - ), - 'kanuma' => - array ( - ), - 'karasuyama' => - array ( - ), - 'kuroiso' => - array ( - ), - 'mashiko' => - array ( - ), - 'mibu' => - array ( - ), - 'moka' => - array ( - ), - 'motegi' => - array ( - ), - 'nasu' => - array ( - ), - 'nasushiobara' => - array ( - ), - 'nikko' => - array ( - ), - 'nishikata' => - array ( - ), - 'nogi' => - array ( - ), - 'ohira' => - array ( - ), - 'ohtawara' => - array ( - ), - 'oyama' => - array ( - ), - 'sakura' => - array ( - ), - 'sano' => - array ( - ), - 'shimotsuke' => - array ( - ), - 'shioya' => - array ( - ), - 'takanezawa' => - array ( - ), - 'tochigi' => - array ( - ), - 'tsuga' => - array ( - ), - 'ujiie' => - array ( - ), - 'utsunomiya' => - array ( - ), - 'yaita' => - array ( - ), - ), - 'tokushima' => - array ( - 'aizumi' => - array ( - ), - 'anan' => - array ( - ), - 'ichiba' => - array ( - ), - 'itano' => - array ( - ), - 'kainan' => - array ( - ), - 'komatsushima' => - array ( - ), - 'matsushige' => - array ( - ), - 'mima' => - array ( - ), - 'minami' => - array ( - ), - 'miyoshi' => - array ( - ), - 'mugi' => - array ( - ), - 'nakagawa' => - array ( - ), - 'naruto' => - array ( - ), - 'sanagochi' => - array ( - ), - 'shishikui' => - array ( - ), - 'tokushima' => - array ( - ), - 'wajiki' => - array ( - ), - ), - 'tokyo' => - array ( - 'adachi' => - array ( - ), - 'akiruno' => - array ( - ), - 'akishima' => - array ( - ), - 'aogashima' => - array ( - ), - 'arakawa' => - array ( - ), - 'bunkyo' => - array ( - ), - 'chiyoda' => - array ( - ), - 'chofu' => - array ( - ), - 'chuo' => - array ( - ), - 'edogawa' => - array ( - ), - 'fuchu' => - array ( - ), - 'fussa' => - array ( - ), - 'hachijo' => - array ( - ), - 'hachioji' => - array ( - ), - 'hamura' => - array ( - ), - 'higashikurume' => - array ( - ), - 'higashimurayama' => - array ( - ), - 'higashiyamato' => - array ( - ), - 'hino' => - array ( - ), - 'hinode' => - array ( - ), - 'hinohara' => - array ( - ), - 'inagi' => - array ( - ), - 'itabashi' => - array ( - ), - 'katsushika' => - array ( - ), - 'kita' => - array ( - ), - 'kiyose' => - array ( - ), - 'kodaira' => - array ( - ), - 'koganei' => - array ( - ), - 'kokubunji' => - array ( - ), - 'komae' => - array ( - ), - 'koto' => - array ( - ), - 'kouzushima' => - array ( - ), - 'kunitachi' => - array ( - ), - 'machida' => - array ( - ), - 'meguro' => - array ( - ), - 'minato' => - array ( - ), - 'mitaka' => - array ( - ), - 'mizuho' => - array ( - ), - 'musashimurayama' => - array ( - ), - 'musashino' => - array ( - ), - 'nakano' => - array ( - ), - 'nerima' => - array ( - ), - 'ogasawara' => - array ( - ), - 'okutama' => - array ( - ), - 'ome' => - array ( - ), - 'oshima' => - array ( - ), - 'ota' => - array ( - ), - 'setagaya' => - array ( - ), - 'shibuya' => - array ( - ), - 'shinagawa' => - array ( - ), - 'shinjuku' => - array ( - ), - 'suginami' => - array ( - ), - 'sumida' => - array ( - ), - 'tachikawa' => - array ( - ), - 'taito' => - array ( - ), - 'tama' => - array ( - ), - 'toshima' => - array ( - ), - ), - 'tottori' => - array ( - 'chizu' => - array ( - ), - 'hino' => - array ( - ), - 'kawahara' => - array ( - ), - 'koge' => - array ( - ), - 'kotoura' => - array ( - ), - 'misasa' => - array ( - ), - 'nanbu' => - array ( - ), - 'nichinan' => - array ( - ), - 'sakaiminato' => - array ( - ), - 'tottori' => - array ( - ), - 'wakasa' => - array ( - ), - 'yazu' => - array ( - ), - 'yonago' => - array ( - ), - ), - 'toyama' => - array ( - 'asahi' => - array ( - ), - 'fuchu' => - array ( - ), - 'fukumitsu' => - array ( - ), - 'funahashi' => - array ( - ), - 'himi' => - array ( - ), - 'imizu' => - array ( - ), - 'inami' => - array ( - ), - 'johana' => - array ( - ), - 'kamiichi' => - array ( - ), - 'kurobe' => - array ( - ), - 'nakaniikawa' => - array ( - ), - 'namerikawa' => - array ( - ), - 'nanto' => - array ( - ), - 'nyuzen' => - array ( - ), - 'oyabe' => - array ( - ), - 'taira' => - array ( - ), - 'takaoka' => - array ( - ), - 'tateyama' => - array ( - ), - 'toga' => - array ( - ), - 'tonami' => - array ( - ), - 'toyama' => - array ( - ), - 'unazuki' => - array ( - ), - 'uozu' => - array ( - ), - 'yamada' => - array ( - ), - ), - 'wakayama' => - array ( - 'arida' => - array ( - ), - 'aridagawa' => - array ( - ), - 'gobo' => - array ( - ), - 'hashimoto' => - array ( - ), - 'hidaka' => - array ( - ), - 'hirogawa' => - array ( - ), - 'inami' => - array ( - ), - 'iwade' => - array ( - ), - 'kainan' => - array ( - ), - 'kamitonda' => - array ( - ), - 'katsuragi' => - array ( - ), - 'kimino' => - array ( - ), - 'kinokawa' => - array ( - ), - 'kitayama' => - array ( - ), - 'koya' => - array ( - ), - 'koza' => - array ( - ), - 'kozagawa' => - array ( - ), - 'kudoyama' => - array ( - ), - 'kushimoto' => - array ( - ), - 'mihama' => - array ( - ), - 'misato' => - array ( - ), - 'nachikatsuura' => - array ( - ), - 'shingu' => - array ( - ), - 'shirahama' => - array ( - ), - 'taiji' => - array ( - ), - 'tanabe' => - array ( - ), - 'wakayama' => - array ( - ), - 'yuasa' => - array ( - ), - 'yura' => - array ( - ), - ), - 'yamagata' => - array ( - 'asahi' => - array ( - ), - 'funagata' => - array ( - ), - 'higashine' => - array ( - ), - 'iide' => - array ( - ), - 'kahoku' => - array ( - ), - 'kaminoyama' => - array ( - ), - 'kaneyama' => - array ( - ), - 'kawanishi' => - array ( - ), - 'mamurogawa' => - array ( - ), - 'mikawa' => - array ( - ), - 'murayama' => - array ( - ), - 'nagai' => - array ( - ), - 'nakayama' => - array ( - ), - 'nanyo' => - array ( - ), - 'nishikawa' => - array ( - ), - 'obanazawa' => - array ( - ), - 'oe' => - array ( - ), - 'oguni' => - array ( - ), - 'ohkura' => - array ( - ), - 'oishida' => - array ( - ), - 'sagae' => - array ( - ), - 'sakata' => - array ( - ), - 'sakegawa' => - array ( - ), - 'shinjo' => - array ( - ), - 'shirataka' => - array ( - ), - 'shonai' => - array ( - ), - 'takahata' => - array ( - ), - 'tendo' => - array ( - ), - 'tozawa' => - array ( - ), - 'tsuruoka' => - array ( - ), - 'yamagata' => - array ( - ), - 'yamanobe' => - array ( - ), - 'yonezawa' => - array ( - ), - 'yuza' => - array ( - ), - ), - 'yamaguchi' => - array ( - 'abu' => - array ( - ), - 'hagi' => - array ( - ), - 'hikari' => - array ( - ), - 'hofu' => - array ( - ), - 'iwakuni' => - array ( - ), - 'kudamatsu' => - array ( - ), - 'mitou' => - array ( - ), - 'nagato' => - array ( - ), - 'oshima' => - array ( - ), - 'shimonoseki' => - array ( - ), - 'shunan' => - array ( - ), - 'tabuse' => - array ( - ), - 'tokuyama' => - array ( - ), - 'toyota' => - array ( - ), - 'ube' => - array ( - ), - 'yuu' => - array ( - ), - ), - 'yamanashi' => - array ( - 'chuo' => - array ( - ), - 'doshi' => - array ( - ), - 'fuefuki' => - array ( - ), - 'fujikawa' => - array ( - ), - 'fujikawaguchiko' => - array ( - ), - 'fujiyoshida' => - array ( - ), - 'hayakawa' => - array ( - ), - 'hokuto' => - array ( - ), - 'ichikawamisato' => - array ( - ), - 'kai' => - array ( - ), - 'kofu' => - array ( - ), - 'koshu' => - array ( - ), - 'kosuge' => - array ( - ), - 'minami-alps' => - array ( - ), - 'minobu' => - array ( - ), - 'nakamichi' => - array ( - ), - 'nanbu' => - array ( - ), - 'narusawa' => - array ( - ), - 'nirasaki' => - array ( - ), - 'nishikatsura' => - array ( - ), - 'oshino' => - array ( - ), - 'otsuki' => - array ( - ), - 'showa' => - array ( - ), - 'tabayama' => - array ( - ), - 'tsuru' => - array ( - ), - 'uenohara' => - array ( - ), - 'yamanakako' => - array ( - ), - 'yamanashi' => - array ( - ), - ), - 'xn--4pvxs' => - array ( - ), - 'xn--vgu402c' => - array ( - ), - 'xn--c3s14m' => - array ( - ), - 'xn--f6qx53a' => - array ( - ), - 'xn--8pvr4u' => - array ( - ), - 'xn--uist22h' => - array ( - ), - 'xn--djrs72d6uy' => - array ( - ), - 'xn--mkru45i' => - array ( - ), - 'xn--0trq7p7nn' => - array ( - ), - 'xn--8ltr62k' => - array ( - ), - 'xn--2m4a15e' => - array ( - ), - 'xn--efvn9s' => - array ( - ), - 'xn--32vp30h' => - array ( - ), - 'xn--4it797k' => - array ( - ), - 'xn--1lqs71d' => - array ( - ), - 'xn--5rtp49c' => - array ( - ), - 'xn--5js045d' => - array ( - ), - 'xn--ehqz56n' => - array ( - ), - 'xn--1lqs03n' => - array ( - ), - 'xn--qqqt11m' => - array ( - ), - 'xn--kbrq7o' => - array ( - ), - 'xn--pssu33l' => - array ( - ), - 'xn--ntsq17g' => - array ( - ), - 'xn--uisz3g' => - array ( - ), - 'xn--6btw5a' => - array ( - ), - 'xn--1ctwo' => - array ( - ), - 'xn--6orx2r' => - array ( - ), - 'xn--rht61e' => - array ( - ), - 'xn--rht27z' => - array ( - ), - 'xn--djty4k' => - array ( - ), - 'xn--nit225k' => - array ( - ), - 'xn--rht3d' => - array ( - ), - 'xn--klty5x' => - array ( - ), - 'xn--kltx9a' => - array ( - ), - 'xn--kltp7d' => - array ( - ), - 'xn--uuwu58a' => - array ( - ), - 'xn--zbx025d' => - array ( - ), - 'xn--ntso0iqx3a' => - array ( - ), - 'xn--elqq16h' => - array ( - ), - 'xn--4it168d' => - array ( - ), - 'xn--klt787d' => - array ( - ), - 'xn--rny31h' => - array ( - ), - 'xn--7t0a264c' => - array ( - ), - 'xn--5rtq34k' => - array ( - ), - 'xn--k7yn95e' => - array ( - ), - 'xn--tor131o' => - array ( - ), - 'xn--d5qv7z876c' => - array ( - ), - 'kawasaki' => - array ( - '*' => - array ( - ), - 'city' => - array ( - '!' => '', - ), - ), - 'kitakyushu' => - array ( - '*' => - array ( - ), - 'city' => - array ( - '!' => '', - ), - ), - 'kobe' => - array ( - '*' => - array ( - ), - 'city' => - array ( - '!' => '', - ), - ), - 'nagoya' => - array ( - '*' => - array ( - ), - 'city' => - array ( - '!' => '', - ), - ), - 'sapporo' => - array ( - '*' => - array ( - ), - 'city' => - array ( - '!' => '', - ), - ), - 'sendai' => - array ( - '*' => - array ( - ), - 'city' => - array ( - '!' => '', - ), - ), - 'yokohama' => - array ( - '*' => - array ( - ), - 'city' => - array ( - '!' => '', - ), - ), - ), - 'ke' => - array ( - '*' => - array ( - ), - ), - 'kg' => - array ( - 'org' => - array ( - ), - 'net' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - ), - 'kh' => - array ( - '*' => - array ( - ), - ), - 'ki' => - array ( - 'edu' => - array ( - ), - 'biz' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - 'info' => - array ( - ), - 'com' => - array ( - ), - ), - 'km' => - array ( - 'org' => - array ( - ), - 'nom' => - array ( - ), - 'gov' => - array ( - ), - 'prd' => - array ( - ), - 'tm' => - array ( - ), - 'edu' => - array ( - ), - 'mil' => - array ( - ), - 'ass' => - array ( - ), - 'com' => - array ( - ), - 'coop' => - array ( - ), - 'asso' => - array ( - ), - 'presse' => - array ( - ), - 'medecin' => - array ( - ), - 'notaires' => - array ( - ), - 'pharmaciens' => - array ( - ), - 'veterinaire' => - array ( - ), - 'gouv' => - array ( - ), - ), - 'kn' => - array ( - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - ), - 'kp' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'rep' => - array ( - ), - 'tra' => - array ( - ), - ), - 'kr' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'es' => - array ( - ), - 'go' => - array ( - ), - 'hs' => - array ( - ), - 'kg' => - array ( - ), - 'mil' => - array ( - ), - 'ms' => - array ( - ), - 'ne' => - array ( - ), - 'or' => - array ( - ), - 'pe' => - array ( - ), - 're' => - array ( - ), - 'sc' => - array ( - ), - 'busan' => - array ( - ), - 'chungbuk' => - array ( - ), - 'chungnam' => - array ( - ), - 'daegu' => - array ( - ), - 'daejeon' => - array ( - ), - 'gangwon' => - array ( - ), - 'gwangju' => - array ( - ), - 'gyeongbuk' => - array ( - ), - 'gyeonggi' => - array ( - ), - 'gyeongnam' => - array ( - ), - 'incheon' => - array ( - ), - 'jeju' => - array ( - ), - 'jeonbuk' => - array ( - ), - 'jeonnam' => - array ( - ), - 'seoul' => - array ( - ), - 'ulsan' => - array ( - ), - ), - 'kw' => - array ( - '*' => - array ( - ), - ), - 'ky' => - array ( - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - ), - 'kz' => - array ( - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'net' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'com' => - array ( - ), - ), - 'la' => - array ( - 'int' => - array ( - ), - 'net' => - array ( - ), - 'info' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'per' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - ), - 'lb' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'lc' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'co' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - ), - 'li' => - array ( - ), - 'lk' => - array ( - 'gov' => - array ( - ), - 'sch' => - array ( - ), - 'net' => - array ( - ), - 'int' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'ngo' => - array ( - ), - 'soc' => - array ( - ), - 'web' => - array ( - ), - 'ltd' => - array ( - ), - 'assn' => - array ( - ), - 'grp' => - array ( - ), - 'hotel' => - array ( - ), - 'ac' => - array ( - ), - ), - 'lr' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - ), - 'ls' => - array ( - 'co' => - array ( - ), - 'org' => - array ( - ), - ), - 'lt' => - array ( - 'gov' => - array ( - ), - ), - 'lu' => - array ( - ), - 'lv' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'mil' => - array ( - ), - 'id' => - array ( - ), - 'net' => - array ( - ), - 'asn' => - array ( - ), - 'conf' => - array ( - ), - ), - 'ly' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'gov' => - array ( - ), - 'plc' => - array ( - ), - 'edu' => - array ( - ), - 'sch' => - array ( - ), - 'med' => - array ( - ), - 'org' => - array ( - ), - 'id' => - array ( - ), - ), - 'ma' => - array ( - 'co' => - array ( - ), - 'net' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'ac' => - array ( - ), - 'press' => - array ( - ), - ), - 'mc' => - array ( - 'tm' => - array ( - ), - 'asso' => - array ( - ), - ), - 'md' => - array ( - ), - 'me' => - array ( - 'co' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'ac' => - array ( - ), - 'gov' => - array ( - ), - 'its' => - array ( - ), - 'priv' => - array ( - ), - ), - 'mg' => - array ( - 'org' => - array ( - ), - 'nom' => - array ( - ), - 'gov' => - array ( - ), - 'prd' => - array ( - ), - 'tm' => - array ( - ), - 'edu' => - array ( - ), - 'mil' => - array ( - ), - 'com' => - array ( - ), - 'co' => - array ( - ), - ), - 'mh' => - array ( - ), - 'mil' => - array ( - ), - 'mk' => - array ( - 'com' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'inf' => - array ( - ), - 'name' => - array ( - ), - ), - 'ml' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gouv' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'presse' => - array ( - ), - ), - 'mm' => - array ( - '*' => - array ( - ), - ), - 'mn' => - array ( - 'gov' => - array ( - ), - 'edu' => - array ( - ), - 'org' => - array ( - ), - ), - 'mo' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - ), - 'mobi' => - array ( - ), - 'mp' => - array ( - ), - 'mq' => - array ( - ), - 'mr' => - array ( - 'gov' => - array ( - ), - ), - 'ms' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'mt' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'mu' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'or' => - array ( - ), - ), - 'museum' => - array ( - 'academy' => - array ( - ), - 'agriculture' => - array ( - ), - 'air' => - array ( - ), - 'airguard' => - array ( - ), - 'alabama' => - array ( - ), - 'alaska' => - array ( - ), - 'amber' => - array ( - ), - 'ambulance' => - array ( - ), - 'american' => - array ( - ), - 'americana' => - array ( - ), - 'americanantiques' => - array ( - ), - 'americanart' => - array ( - ), - 'amsterdam' => - array ( - ), - 'and' => - array ( - ), - 'annefrank' => - array ( - ), - 'anthro' => - array ( - ), - 'anthropology' => - array ( - ), - 'antiques' => - array ( - ), - 'aquarium' => - array ( - ), - 'arboretum' => - array ( - ), - 'archaeological' => - array ( - ), - 'archaeology' => - array ( - ), - 'architecture' => - array ( - ), - 'art' => - array ( - ), - 'artanddesign' => - array ( - ), - 'artcenter' => - array ( - ), - 'artdeco' => - array ( - ), - 'arteducation' => - array ( - ), - 'artgallery' => - array ( - ), - 'arts' => - array ( - ), - 'artsandcrafts' => - array ( - ), - 'asmatart' => - array ( - ), - 'assassination' => - array ( - ), - 'assisi' => - array ( - ), - 'association' => - array ( - ), - 'astronomy' => - array ( - ), - 'atlanta' => - array ( - ), - 'austin' => - array ( - ), - 'australia' => - array ( - ), - 'automotive' => - array ( - ), - 'aviation' => - array ( - ), - 'axis' => - array ( - ), - 'badajoz' => - array ( - ), - 'baghdad' => - array ( - ), - 'bahn' => - array ( - ), - 'bale' => - array ( - ), - 'baltimore' => - array ( - ), - 'barcelona' => - array ( - ), - 'baseball' => - array ( - ), - 'basel' => - array ( - ), - 'baths' => - array ( - ), - 'bauern' => - array ( - ), - 'beauxarts' => - array ( - ), - 'beeldengeluid' => - array ( - ), - 'bellevue' => - array ( - ), - 'bergbau' => - array ( - ), - 'berkeley' => - array ( - ), - 'berlin' => - array ( - ), - 'bern' => - array ( - ), - 'bible' => - array ( - ), - 'bilbao' => - array ( - ), - 'bill' => - array ( - ), - 'birdart' => - array ( - ), - 'birthplace' => - array ( - ), - 'bonn' => - array ( - ), - 'boston' => - array ( - ), - 'botanical' => - array ( - ), - 'botanicalgarden' => - array ( - ), - 'botanicgarden' => - array ( - ), - 'botany' => - array ( - ), - 'brandywinevalley' => - array ( - ), - 'brasil' => - array ( - ), - 'bristol' => - array ( - ), - 'british' => - array ( - ), - 'britishcolumbia' => - array ( - ), - 'broadcast' => - array ( - ), - 'brunel' => - array ( - ), - 'brussel' => - array ( - ), - 'brussels' => - array ( - ), - 'bruxelles' => - array ( - ), - 'building' => - array ( - ), - 'burghof' => - array ( - ), - 'bus' => - array ( - ), - 'bushey' => - array ( - ), - 'cadaques' => - array ( - ), - 'california' => - array ( - ), - 'cambridge' => - array ( - ), - 'can' => - array ( - ), - 'canada' => - array ( - ), - 'capebreton' => - array ( - ), - 'carrier' => - array ( - ), - 'cartoonart' => - array ( - ), - 'casadelamoneda' => - array ( - ), - 'castle' => - array ( - ), - 'castres' => - array ( - ), - 'celtic' => - array ( - ), - 'center' => - array ( - ), - 'chattanooga' => - array ( - ), - 'cheltenham' => - array ( - ), - 'chesapeakebay' => - array ( - ), - 'chicago' => - array ( - ), - 'children' => - array ( - ), - 'childrens' => - array ( - ), - 'childrensgarden' => - array ( - ), - 'chiropractic' => - array ( - ), - 'chocolate' => - array ( - ), - 'christiansburg' => - array ( - ), - 'cincinnati' => - array ( - ), - 'cinema' => - array ( - ), - 'circus' => - array ( - ), - 'civilisation' => - array ( - ), - 'civilization' => - array ( - ), - 'civilwar' => - array ( - ), - 'clinton' => - array ( - ), - 'clock' => - array ( - ), - 'coal' => - array ( - ), - 'coastaldefence' => - array ( - ), - 'cody' => - array ( - ), - 'coldwar' => - array ( - ), - 'collection' => - array ( - ), - 'colonialwilliamsburg' => - array ( - ), - 'coloradoplateau' => - array ( - ), - 'columbia' => - array ( - ), - 'columbus' => - array ( - ), - 'communication' => - array ( - ), - 'communications' => - array ( - ), - 'community' => - array ( - ), - 'computer' => - array ( - ), - 'computerhistory' => - array ( - ), - 'xn--comunicaes-v6a2o' => - array ( - ), - 'contemporary' => - array ( - ), - 'contemporaryart' => - array ( - ), - 'convent' => - array ( - ), - 'copenhagen' => - array ( - ), - 'corporation' => - array ( - ), - 'xn--correios-e-telecomunicaes-ghc29a' => - array ( - ), - 'corvette' => - array ( - ), - 'costume' => - array ( - ), - 'countryestate' => - array ( - ), - 'county' => - array ( - ), - 'crafts' => - array ( - ), - 'cranbrook' => - array ( - ), - 'creation' => - array ( - ), - 'cultural' => - array ( - ), - 'culturalcenter' => - array ( - ), - 'culture' => - array ( - ), - 'cyber' => - array ( - ), - 'cymru' => - array ( - ), - 'dali' => - array ( - ), - 'dallas' => - array ( - ), - 'database' => - array ( - ), - 'ddr' => - array ( - ), - 'decorativearts' => - array ( - ), - 'delaware' => - array ( - ), - 'delmenhorst' => - array ( - ), - 'denmark' => - array ( - ), - 'depot' => - array ( - ), - 'design' => - array ( - ), - 'detroit' => - array ( - ), - 'dinosaur' => - array ( - ), - 'discovery' => - array ( - ), - 'dolls' => - array ( - ), - 'donostia' => - array ( - ), - 'durham' => - array ( - ), - 'eastafrica' => - array ( - ), - 'eastcoast' => - array ( - ), - 'education' => - array ( - ), - 'educational' => - array ( - ), - 'egyptian' => - array ( - ), - 'eisenbahn' => - array ( - ), - 'elburg' => - array ( - ), - 'elvendrell' => - array ( - ), - 'embroidery' => - array ( - ), - 'encyclopedic' => - array ( - ), - 'england' => - array ( - ), - 'entomology' => - array ( - ), - 'environment' => - array ( - ), - 'environmentalconservation' => - array ( - ), - 'epilepsy' => - array ( - ), - 'essex' => - array ( - ), - 'estate' => - array ( - ), - 'ethnology' => - array ( - ), - 'exeter' => - array ( - ), - 'exhibition' => - array ( - ), - 'family' => - array ( - ), - 'farm' => - array ( - ), - 'farmequipment' => - array ( - ), - 'farmers' => - array ( - ), - 'farmstead' => - array ( - ), - 'field' => - array ( - ), - 'figueres' => - array ( - ), - 'filatelia' => - array ( - ), - 'film' => - array ( - ), - 'fineart' => - array ( - ), - 'finearts' => - array ( - ), - 'finland' => - array ( - ), - 'flanders' => - array ( - ), - 'florida' => - array ( - ), - 'force' => - array ( - ), - 'fortmissoula' => - array ( - ), - 'fortworth' => - array ( - ), - 'foundation' => - array ( - ), - 'francaise' => - array ( - ), - 'frankfurt' => - array ( - ), - 'franziskaner' => - array ( - ), - 'freemasonry' => - array ( - ), - 'freiburg' => - array ( - ), - 'fribourg' => - array ( - ), - 'frog' => - array ( - ), - 'fundacio' => - array ( - ), - 'furniture' => - array ( - ), - 'gallery' => - array ( - ), - 'garden' => - array ( - ), - 'gateway' => - array ( - ), - 'geelvinck' => - array ( - ), - 'gemological' => - array ( - ), - 'geology' => - array ( - ), - 'georgia' => - array ( - ), - 'giessen' => - array ( - ), - 'glas' => - array ( - ), - 'glass' => - array ( - ), - 'gorge' => - array ( - ), - 'grandrapids' => - array ( - ), - 'graz' => - array ( - ), - 'guernsey' => - array ( - ), - 'halloffame' => - array ( - ), - 'hamburg' => - array ( - ), - 'handson' => - array ( - ), - 'harvestcelebration' => - array ( - ), - 'hawaii' => - array ( - ), - 'health' => - array ( - ), - 'heimatunduhren' => - array ( - ), - 'hellas' => - array ( - ), - 'helsinki' => - array ( - ), - 'hembygdsforbund' => - array ( - ), - 'heritage' => - array ( - ), - 'histoire' => - array ( - ), - 'historical' => - array ( - ), - 'historicalsociety' => - array ( - ), - 'historichouses' => - array ( - ), - 'historisch' => - array ( - ), - 'historisches' => - array ( - ), - 'history' => - array ( - ), - 'historyofscience' => - array ( - ), - 'horology' => - array ( - ), - 'house' => - array ( - ), - 'humanities' => - array ( - ), - 'illustration' => - array ( - ), - 'imageandsound' => - array ( - ), - 'indian' => - array ( - ), - 'indiana' => - array ( - ), - 'indianapolis' => - array ( - ), - 'indianmarket' => - array ( - ), - 'intelligence' => - array ( - ), - 'interactive' => - array ( - ), - 'iraq' => - array ( - ), - 'iron' => - array ( - ), - 'isleofman' => - array ( - ), - 'jamison' => - array ( - ), - 'jefferson' => - array ( - ), - 'jerusalem' => - array ( - ), - 'jewelry' => - array ( - ), - 'jewish' => - array ( - ), - 'jewishart' => - array ( - ), - 'jfk' => - array ( - ), - 'journalism' => - array ( - ), - 'judaica' => - array ( - ), - 'judygarland' => - array ( - ), - 'juedisches' => - array ( - ), - 'juif' => - array ( - ), - 'karate' => - array ( - ), - 'karikatur' => - array ( - ), - 'kids' => - array ( - ), - 'koebenhavn' => - array ( - ), - 'koeln' => - array ( - ), - 'kunst' => - array ( - ), - 'kunstsammlung' => - array ( - ), - 'kunstunddesign' => - array ( - ), - 'labor' => - array ( - ), - 'labour' => - array ( - ), - 'lajolla' => - array ( - ), - 'lancashire' => - array ( - ), - 'landes' => - array ( - ), - 'lans' => - array ( - ), - 'xn--lns-qla' => - array ( - ), - 'larsson' => - array ( - ), - 'lewismiller' => - array ( - ), - 'lincoln' => - array ( - ), - 'linz' => - array ( - ), - 'living' => - array ( - ), - 'livinghistory' => - array ( - ), - 'localhistory' => - array ( - ), - 'london' => - array ( - ), - 'losangeles' => - array ( - ), - 'louvre' => - array ( - ), - 'loyalist' => - array ( - ), - 'lucerne' => - array ( - ), - 'luxembourg' => - array ( - ), - 'luzern' => - array ( - ), - 'mad' => - array ( - ), - 'madrid' => - array ( - ), - 'mallorca' => - array ( - ), - 'manchester' => - array ( - ), - 'mansion' => - array ( - ), - 'mansions' => - array ( - ), - 'manx' => - array ( - ), - 'marburg' => - array ( - ), - 'maritime' => - array ( - ), - 'maritimo' => - array ( - ), - 'maryland' => - array ( - ), - 'marylhurst' => - array ( - ), - 'media' => - array ( - ), - 'medical' => - array ( - ), - 'medizinhistorisches' => - array ( - ), - 'meeres' => - array ( - ), - 'memorial' => - array ( - ), - 'mesaverde' => - array ( - ), - 'michigan' => - array ( - ), - 'midatlantic' => - array ( - ), - 'military' => - array ( - ), - 'mill' => - array ( - ), - 'miners' => - array ( - ), - 'mining' => - array ( - ), - 'minnesota' => - array ( - ), - 'missile' => - array ( - ), - 'missoula' => - array ( - ), - 'modern' => - array ( - ), - 'moma' => - array ( - ), - 'money' => - array ( - ), - 'monmouth' => - array ( - ), - 'monticello' => - array ( - ), - 'montreal' => - array ( - ), - 'moscow' => - array ( - ), - 'motorcycle' => - array ( - ), - 'muenchen' => - array ( - ), - 'muenster' => - array ( - ), - 'mulhouse' => - array ( - ), - 'muncie' => - array ( - ), - 'museet' => - array ( - ), - 'museumcenter' => - array ( - ), - 'museumvereniging' => - array ( - ), - 'music' => - array ( - ), - 'national' => - array ( - ), - 'nationalfirearms' => - array ( - ), - 'nationalheritage' => - array ( - ), - 'nativeamerican' => - array ( - ), - 'naturalhistory' => - array ( - ), - 'naturalhistorymuseum' => - array ( - ), - 'naturalsciences' => - array ( - ), - 'nature' => - array ( - ), - 'naturhistorisches' => - array ( - ), - 'natuurwetenschappen' => - array ( - ), - 'naumburg' => - array ( - ), - 'naval' => - array ( - ), - 'nebraska' => - array ( - ), - 'neues' => - array ( - ), - 'newhampshire' => - array ( - ), - 'newjersey' => - array ( - ), - 'newmexico' => - array ( - ), - 'newport' => - array ( - ), - 'newspaper' => - array ( - ), - 'newyork' => - array ( - ), - 'niepce' => - array ( - ), - 'norfolk' => - array ( - ), - 'north' => - array ( - ), - 'nrw' => - array ( - ), - 'nuernberg' => - array ( - ), - 'nuremberg' => - array ( - ), - 'nyc' => - array ( - ), - 'nyny' => - array ( - ), - 'oceanographic' => - array ( - ), - 'oceanographique' => - array ( - ), - 'omaha' => - array ( - ), - 'online' => - array ( - ), - 'ontario' => - array ( - ), - 'openair' => - array ( - ), - 'oregon' => - array ( - ), - 'oregontrail' => - array ( - ), - 'otago' => - array ( - ), - 'oxford' => - array ( - ), - 'pacific' => - array ( - ), - 'paderborn' => - array ( - ), - 'palace' => - array ( - ), - 'paleo' => - array ( - ), - 'palmsprings' => - array ( - ), - 'panama' => - array ( - ), - 'paris' => - array ( - ), - 'pasadena' => - array ( - ), - 'pharmacy' => - array ( - ), - 'philadelphia' => - array ( - ), - 'philadelphiaarea' => - array ( - ), - 'philately' => - array ( - ), - 'phoenix' => - array ( - ), - 'photography' => - array ( - ), - 'pilots' => - array ( - ), - 'pittsburgh' => - array ( - ), - 'planetarium' => - array ( - ), - 'plantation' => - array ( - ), - 'plants' => - array ( - ), - 'plaza' => - array ( - ), - 'portal' => - array ( - ), - 'portland' => - array ( - ), - 'portlligat' => - array ( - ), - 'posts-and-telecommunications' => - array ( - ), - 'preservation' => - array ( - ), - 'presidio' => - array ( - ), - 'press' => - array ( - ), - 'project' => - array ( - ), - 'public' => - array ( - ), - 'pubol' => - array ( - ), - 'quebec' => - array ( - ), - 'railroad' => - array ( - ), - 'railway' => - array ( - ), - 'research' => - array ( - ), - 'resistance' => - array ( - ), - 'riodejaneiro' => - array ( - ), - 'rochester' => - array ( - ), - 'rockart' => - array ( - ), - 'roma' => - array ( - ), - 'russia' => - array ( - ), - 'saintlouis' => - array ( - ), - 'salem' => - array ( - ), - 'salvadordali' => - array ( - ), - 'salzburg' => - array ( - ), - 'sandiego' => - array ( - ), - 'sanfrancisco' => - array ( - ), - 'santabarbara' => - array ( - ), - 'santacruz' => - array ( - ), - 'santafe' => - array ( - ), - 'saskatchewan' => - array ( - ), - 'satx' => - array ( - ), - 'savannahga' => - array ( - ), - 'schlesisches' => - array ( - ), - 'schoenbrunn' => - array ( - ), - 'schokoladen' => - array ( - ), - 'school' => - array ( - ), - 'schweiz' => - array ( - ), - 'science' => - array ( - ), - 'scienceandhistory' => - array ( - ), - 'scienceandindustry' => - array ( - ), - 'sciencecenter' => - array ( - ), - 'sciencecenters' => - array ( - ), - 'science-fiction' => - array ( - ), - 'sciencehistory' => - array ( - ), - 'sciences' => - array ( - ), - 'sciencesnaturelles' => - array ( - ), - 'scotland' => - array ( - ), - 'seaport' => - array ( - ), - 'settlement' => - array ( - ), - 'settlers' => - array ( - ), - 'shell' => - array ( - ), - 'sherbrooke' => - array ( - ), - 'sibenik' => - array ( - ), - 'silk' => - array ( - ), - 'ski' => - array ( - ), - 'skole' => - array ( - ), - 'society' => - array ( - ), - 'sologne' => - array ( - ), - 'soundandvision' => - array ( - ), - 'southcarolina' => - array ( - ), - 'southwest' => - array ( - ), - 'space' => - array ( - ), - 'spy' => - array ( - ), - 'square' => - array ( - ), - 'stadt' => - array ( - ), - 'stalbans' => - array ( - ), - 'starnberg' => - array ( - ), - 'state' => - array ( - ), - 'stateofdelaware' => - array ( - ), - 'station' => - array ( - ), - 'steam' => - array ( - ), - 'steiermark' => - array ( - ), - 'stjohn' => - array ( - ), - 'stockholm' => - array ( - ), - 'stpetersburg' => - array ( - ), - 'stuttgart' => - array ( - ), - 'suisse' => - array ( - ), - 'surgeonshall' => - array ( - ), - 'surrey' => - array ( - ), - 'svizzera' => - array ( - ), - 'sweden' => - array ( - ), - 'sydney' => - array ( - ), - 'tank' => - array ( - ), - 'tcm' => - array ( - ), - 'technology' => - array ( - ), - 'telekommunikation' => - array ( - ), - 'television' => - array ( - ), - 'texas' => - array ( - ), - 'textile' => - array ( - ), - 'theater' => - array ( - ), - 'time' => - array ( - ), - 'timekeeping' => - array ( - ), - 'topology' => - array ( - ), - 'torino' => - array ( - ), - 'touch' => - array ( - ), - 'town' => - array ( - ), - 'transport' => - array ( - ), - 'tree' => - array ( - ), - 'trolley' => - array ( - ), - 'trust' => - array ( - ), - 'trustee' => - array ( - ), - 'uhren' => - array ( - ), - 'ulm' => - array ( - ), - 'undersea' => - array ( - ), - 'university' => - array ( - ), - 'usa' => - array ( - ), - 'usantiques' => - array ( - ), - 'usarts' => - array ( - ), - 'uscountryestate' => - array ( - ), - 'usculture' => - array ( - ), - 'usdecorativearts' => - array ( - ), - 'usgarden' => - array ( - ), - 'ushistory' => - array ( - ), - 'ushuaia' => - array ( - ), - 'uslivinghistory' => - array ( - ), - 'utah' => - array ( - ), - 'uvic' => - array ( - ), - 'valley' => - array ( - ), - 'vantaa' => - array ( - ), - 'versailles' => - array ( - ), - 'viking' => - array ( - ), - 'village' => - array ( - ), - 'virginia' => - array ( - ), - 'virtual' => - array ( - ), - 'virtuel' => - array ( - ), - 'vlaanderen' => - array ( - ), - 'volkenkunde' => - array ( - ), - 'wales' => - array ( - ), - 'wallonie' => - array ( - ), - 'war' => - array ( - ), - 'washingtondc' => - array ( - ), - 'watchandclock' => - array ( - ), - 'watch-and-clock' => - array ( - ), - 'western' => - array ( - ), - 'westfalen' => - array ( - ), - 'whaling' => - array ( - ), - 'wildlife' => - array ( - ), - 'williamsburg' => - array ( - ), - 'windmill' => - array ( - ), - 'workshop' => - array ( - ), - 'york' => - array ( - ), - 'yorkshire' => - array ( - ), - 'yosemite' => - array ( - ), - 'youth' => - array ( - ), - 'zoological' => - array ( - ), - 'zoology' => - array ( - ), - 'xn--9dbhblg6di' => - array ( - ), - 'xn--h1aegh' => - array ( - ), - ), - 'mv' => - array ( - 'aero' => - array ( - ), - 'biz' => - array ( - ), - 'com' => - array ( - ), - 'coop' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'info' => - array ( - ), - 'int' => - array ( - ), - 'mil' => - array ( - ), - 'museum' => - array ( - ), - 'name' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'pro' => - array ( - ), - ), - 'mw' => - array ( - 'ac' => - array ( - ), - 'biz' => - array ( - ), - 'co' => - array ( - ), - 'com' => - array ( - ), - 'coop' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'int' => - array ( - ), - 'museum' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'mx' => - array ( - 'com' => - array ( - ), - 'org' => - array ( - ), - 'gob' => - array ( - ), - 'edu' => - array ( - ), - 'net' => - array ( - ), - ), - 'my' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - 'edu' => - array ( - ), - 'mil' => - array ( - ), - 'name' => - array ( - ), - ), - 'mz' => - array ( - 'ac' => - array ( - ), - 'adv' => - array ( - ), - 'co' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'na' => - array ( - 'info' => - array ( - ), - 'pro' => - array ( - ), - 'name' => - array ( - ), - 'school' => - array ( - ), - 'or' => - array ( - ), - 'dr' => - array ( - ), - 'us' => - array ( - ), - 'mx' => - array ( - ), - 'ca' => - array ( - ), - 'in' => - array ( - ), - 'cc' => - array ( - ), - 'tv' => - array ( - ), - 'ws' => - array ( - ), - 'mobi' => - array ( - ), - 'co' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - ), - 'name' => - array ( - ), - 'nc' => - array ( - 'asso' => - array ( - ), - 'nom' => - array ( - ), - ), - 'ne' => - array ( - ), - 'net' => - array ( - ), - 'nf' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'per' => - array ( - ), - 'rec' => - array ( - ), - 'web' => - array ( - ), - 'arts' => - array ( - ), - 'firm' => - array ( - ), - 'info' => - array ( - ), - 'other' => - array ( - ), - 'store' => - array ( - ), - ), - 'ng' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'i' => - array ( - ), - 'mil' => - array ( - ), - 'mobi' => - array ( - ), - 'name' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'sch' => - array ( - ), - ), - 'ni' => - array ( - 'ac' => - array ( - ), - 'biz' => - array ( - ), - 'co' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gob' => - array ( - ), - 'in' => - array ( - ), - 'info' => - array ( - ), - 'int' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'nom' => - array ( - ), - 'org' => - array ( - ), - 'web' => - array ( - ), - ), - 'nl' => - array ( - 'bv' => - array ( - ), - ), - 'no' => - array ( - 'fhs' => - array ( - ), - 'vgs' => - array ( - ), - 'fylkesbibl' => - array ( - ), - 'folkebibl' => - array ( - ), - 'museum' => - array ( - ), - 'idrett' => - array ( - ), - 'priv' => - array ( - ), - 'mil' => - array ( - ), - 'stat' => - array ( - ), - 'dep' => - array ( - ), - 'kommune' => - array ( - ), - 'herad' => - array ( - ), - 'aa' => - array ( - 'gs' => - array ( - ), - ), - 'ah' => - array ( - 'gs' => - array ( - ), - ), - 'bu' => - array ( - 'gs' => - array ( - ), - ), - 'fm' => - array ( - 'gs' => - array ( - ), - ), - 'hl' => - array ( - 'gs' => - array ( - ), - ), - 'hm' => - array ( - 'gs' => - array ( - ), - ), - 'jan-mayen' => - array ( - 'gs' => - array ( - ), - ), - 'mr' => - array ( - 'gs' => - array ( - ), - ), - 'nl' => - array ( - 'gs' => - array ( - ), - ), - 'nt' => - array ( - 'gs' => - array ( - ), - ), - 'of' => - array ( - 'gs' => - array ( - ), - ), - 'ol' => - array ( - 'gs' => - array ( - ), - ), - 'oslo' => - array ( - 'gs' => - array ( - ), - ), - 'rl' => - array ( - 'gs' => - array ( - ), - ), - 'sf' => - array ( - 'gs' => - array ( - ), - ), - 'st' => - array ( - 'gs' => - array ( - ), - ), - 'svalbard' => - array ( - 'gs' => - array ( - ), - ), - 'tm' => - array ( - 'gs' => - array ( - ), - ), - 'tr' => - array ( - 'gs' => - array ( - ), - ), - 'va' => - array ( - 'gs' => - array ( - ), - ), - 'vf' => - array ( - 'gs' => - array ( - ), - ), - 'akrehamn' => - array ( - ), - 'xn--krehamn-dxa' => - array ( - ), - 'algard' => - array ( - ), - 'xn--lgrd-poac' => - array ( - ), - 'arna' => - array ( - ), - 'brumunddal' => - array ( - ), - 'bryne' => - array ( - ), - 'bronnoysund' => - array ( - ), - 'xn--brnnysund-m8ac' => - array ( - ), - 'drobak' => - array ( - ), - 'xn--drbak-wua' => - array ( - ), - 'egersund' => - array ( - ), - 'fetsund' => - array ( - ), - 'floro' => - array ( - ), - 'xn--flor-jra' => - array ( - ), - 'fredrikstad' => - array ( - ), - 'hokksund' => - array ( - ), - 'honefoss' => - array ( - ), - 'xn--hnefoss-q1a' => - array ( - ), - 'jessheim' => - array ( - ), - 'jorpeland' => - array ( - ), - 'xn--jrpeland-54a' => - array ( - ), - 'kirkenes' => - array ( - ), - 'kopervik' => - array ( - ), - 'krokstadelva' => - array ( - ), - 'langevag' => - array ( - ), - 'xn--langevg-jxa' => - array ( - ), - 'leirvik' => - array ( - ), - 'mjondalen' => - array ( - ), - 'xn--mjndalen-64a' => - array ( - ), - 'mo-i-rana' => - array ( - ), - 'mosjoen' => - array ( - ), - 'xn--mosjen-eya' => - array ( - ), - 'nesoddtangen' => - array ( - ), - 'orkanger' => - array ( - ), - 'osoyro' => - array ( - ), - 'xn--osyro-wua' => - array ( - ), - 'raholt' => - array ( - ), - 'xn--rholt-mra' => - array ( - ), - 'sandnessjoen' => - array ( - ), - 'xn--sandnessjen-ogb' => - array ( - ), - 'skedsmokorset' => - array ( - ), - 'slattum' => - array ( - ), - 'spjelkavik' => - array ( - ), - 'stathelle' => - array ( - ), - 'stavern' => - array ( - ), - 'stjordalshalsen' => - array ( - ), - 'xn--stjrdalshalsen-sqb' => - array ( - ), - 'tananger' => - array ( - ), - 'tranby' => - array ( - ), - 'vossevangen' => - array ( - ), - 'afjord' => - array ( - ), - 'xn--fjord-lra' => - array ( - ), - 'agdenes' => - array ( - ), - 'al' => - array ( - ), - 'xn--l-1fa' => - array ( - ), - 'alesund' => - array ( - ), - 'xn--lesund-hua' => - array ( - ), - 'alstahaug' => - array ( - ), - 'alta' => - array ( - ), - 'xn--lt-liac' => - array ( - ), - 'alaheadju' => - array ( - ), - 'xn--laheadju-7ya' => - array ( - ), - 'alvdal' => - array ( - ), - 'amli' => - array ( - ), - 'xn--mli-tla' => - array ( - ), - 'amot' => - array ( - ), - 'xn--mot-tla' => - array ( - ), - 'andebu' => - array ( - ), - 'andoy' => - array ( - ), - 'xn--andy-ira' => - array ( - ), - 'andasuolo' => - array ( - ), - 'ardal' => - array ( - ), - 'xn--rdal-poa' => - array ( - ), - 'aremark' => - array ( - ), - 'arendal' => - array ( - ), - 'xn--s-1fa' => - array ( - ), - 'aseral' => - array ( - ), - 'xn--seral-lra' => - array ( - ), - 'asker' => - array ( - ), - 'askim' => - array ( - ), - 'askvoll' => - array ( - ), - 'askoy' => - array ( - ), - 'xn--asky-ira' => - array ( - ), - 'asnes' => - array ( - ), - 'xn--snes-poa' => - array ( - ), - 'audnedaln' => - array ( - ), - 'aukra' => - array ( - ), - 'aure' => - array ( - ), - 'aurland' => - array ( - ), - 'aurskog-holand' => - array ( - ), - 'xn--aurskog-hland-jnb' => - array ( - ), - 'austevoll' => - array ( - ), - 'austrheim' => - array ( - ), - 'averoy' => - array ( - ), - 'xn--avery-yua' => - array ( - ), - 'balestrand' => - array ( - ), - 'ballangen' => - array ( - ), - 'balat' => - array ( - ), - 'xn--blt-elab' => - array ( - ), - 'balsfjord' => - array ( - ), - 'bahccavuotna' => - array ( - ), - 'xn--bhccavuotna-k7a' => - array ( - ), - 'bamble' => - array ( - ), - 'bardu' => - array ( - ), - 'beardu' => - array ( - ), - 'beiarn' => - array ( - ), - 'bajddar' => - array ( - ), - 'xn--bjddar-pta' => - array ( - ), - 'baidar' => - array ( - ), - 'xn--bidr-5nac' => - array ( - ), - 'berg' => - array ( - ), - 'bergen' => - array ( - ), - 'berlevag' => - array ( - ), - 'xn--berlevg-jxa' => - array ( - ), - 'bearalvahki' => - array ( - ), - 'xn--bearalvhki-y4a' => - array ( - ), - 'bindal' => - array ( - ), - 'birkenes' => - array ( - ), - 'bjarkoy' => - array ( - ), - 'xn--bjarky-fya' => - array ( - ), - 'bjerkreim' => - array ( - ), - 'bjugn' => - array ( - ), - 'bodo' => - array ( - ), - 'xn--bod-2na' => - array ( - ), - 'badaddja' => - array ( - ), - 'xn--bdddj-mrabd' => - array ( - ), - 'budejju' => - array ( - ), - 'bokn' => - array ( - ), - 'bremanger' => - array ( - ), - 'bronnoy' => - array ( - ), - 'xn--brnny-wuac' => - array ( - ), - 'bygland' => - array ( - ), - 'bykle' => - array ( - ), - 'barum' => - array ( - ), - 'xn--brum-voa' => - array ( - ), - 'telemark' => - array ( - 'bo' => - array ( - ), - 'xn--b-5ga' => - array ( - ), - ), - 'nordland' => - array ( - 'bo' => - array ( - ), - 'xn--b-5ga' => - array ( - ), - 'heroy' => - array ( - ), - 'xn--hery-ira' => - array ( - ), - ), - 'bievat' => - array ( - ), - 'xn--bievt-0qa' => - array ( - ), - 'bomlo' => - array ( - ), - 'xn--bmlo-gra' => - array ( - ), - 'batsfjord' => - array ( - ), - 'xn--btsfjord-9za' => - array ( - ), - 'bahcavuotna' => - array ( - ), - 'xn--bhcavuotna-s4a' => - array ( - ), - 'dovre' => - array ( - ), - 'drammen' => - array ( - ), - 'drangedal' => - array ( - ), - 'dyroy' => - array ( - ), - 'xn--dyry-ira' => - array ( - ), - 'donna' => - array ( - ), - 'xn--dnna-gra' => - array ( - ), - 'eid' => - array ( - ), - 'eidfjord' => - array ( - ), - 'eidsberg' => - array ( - ), - 'eidskog' => - array ( - ), - 'eidsvoll' => - array ( - ), - 'eigersund' => - array ( - ), - 'elverum' => - array ( - ), - 'enebakk' => - array ( - ), - 'engerdal' => - array ( - ), - 'etne' => - array ( - ), - 'etnedal' => - array ( - ), - 'evenes' => - array ( - ), - 'evenassi' => - array ( - ), - 'xn--eveni-0qa01ga' => - array ( - ), - 'evje-og-hornnes' => - array ( - ), - 'farsund' => - array ( - ), - 'fauske' => - array ( - ), - 'fuossko' => - array ( - ), - 'fuoisku' => - array ( - ), - 'fedje' => - array ( - ), - 'fet' => - array ( - ), - 'finnoy' => - array ( - ), - 'xn--finny-yua' => - array ( - ), - 'fitjar' => - array ( - ), - 'fjaler' => - array ( - ), - 'fjell' => - array ( - ), - 'flakstad' => - array ( - ), - 'flatanger' => - array ( - ), - 'flekkefjord' => - array ( - ), - 'flesberg' => - array ( - ), - 'flora' => - array ( - ), - 'fla' => - array ( - ), - 'xn--fl-zia' => - array ( - ), - 'folldal' => - array ( - ), - 'forsand' => - array ( - ), - 'fosnes' => - array ( - ), - 'frei' => - array ( - ), - 'frogn' => - array ( - ), - 'froland' => - array ( - ), - 'frosta' => - array ( - ), - 'frana' => - array ( - ), - 'xn--frna-woa' => - array ( - ), - 'froya' => - array ( - ), - 'xn--frya-hra' => - array ( - ), - 'fusa' => - array ( - ), - 'fyresdal' => - array ( - ), - 'forde' => - array ( - ), - 'xn--frde-gra' => - array ( - ), - 'gamvik' => - array ( - ), - 'gangaviika' => - array ( - ), - 'xn--ggaviika-8ya47h' => - array ( - ), - 'gaular' => - array ( - ), - 'gausdal' => - array ( - ), - 'gildeskal' => - array ( - ), - 'xn--gildeskl-g0a' => - array ( - ), - 'giske' => - array ( - ), - 'gjemnes' => - array ( - ), - 'gjerdrum' => - array ( - ), - 'gjerstad' => - array ( - ), - 'gjesdal' => - array ( - ), - 'gjovik' => - array ( - ), - 'xn--gjvik-wua' => - array ( - ), - 'gloppen' => - array ( - ), - 'gol' => - array ( - ), - 'gran' => - array ( - ), - 'grane' => - array ( - ), - 'granvin' => - array ( - ), - 'gratangen' => - array ( - ), - 'grimstad' => - array ( - ), - 'grong' => - array ( - ), - 'kraanghke' => - array ( - ), - 'xn--kranghke-b0a' => - array ( - ), - 'grue' => - array ( - ), - 'gulen' => - array ( - ), - 'hadsel' => - array ( - ), - 'halden' => - array ( - ), - 'halsa' => - array ( - ), - 'hamar' => - array ( - ), - 'hamaroy' => - array ( - ), - 'habmer' => - array ( - ), - 'xn--hbmer-xqa' => - array ( - ), - 'hapmir' => - array ( - ), - 'xn--hpmir-xqa' => - array ( - ), - 'hammerfest' => - array ( - ), - 'hammarfeasta' => - array ( - ), - 'xn--hmmrfeasta-s4ac' => - array ( - ), - 'haram' => - array ( - ), - 'hareid' => - array ( - ), - 'harstad' => - array ( - ), - 'hasvik' => - array ( - ), - 'aknoluokta' => - array ( - ), - 'xn--koluokta-7ya57h' => - array ( - ), - 'hattfjelldal' => - array ( - ), - 'aarborte' => - array ( - ), - 'haugesund' => - array ( - ), - 'hemne' => - array ( - ), - 'hemnes' => - array ( - ), - 'hemsedal' => - array ( - ), - 'more-og-romsdal' => - array ( - 'heroy' => - array ( - ), - 'sande' => - array ( - ), - ), - 'xn--mre-og-romsdal-qqb' => - array ( - 'xn--hery-ira' => - array ( - ), - 'sande' => - array ( - ), - ), - 'hitra' => - array ( - ), - 'hjartdal' => - array ( - ), - 'hjelmeland' => - array ( - ), - 'hobol' => - array ( - ), - 'xn--hobl-ira' => - array ( - ), - 'hof' => - array ( - ), - 'hol' => - array ( - ), - 'hole' => - array ( - ), - 'holmestrand' => - array ( - ), - 'holtalen' => - array ( - ), - 'xn--holtlen-hxa' => - array ( - ), - 'hornindal' => - array ( - ), - 'horten' => - array ( - ), - 'hurdal' => - array ( - ), - 'hurum' => - array ( - ), - 'hvaler' => - array ( - ), - 'hyllestad' => - array ( - ), - 'hagebostad' => - array ( - ), - 'xn--hgebostad-g3a' => - array ( - ), - 'hoyanger' => - array ( - ), - 'xn--hyanger-q1a' => - array ( - ), - 'hoylandet' => - array ( - ), - 'xn--hylandet-54a' => - array ( - ), - 'ha' => - array ( - ), - 'xn--h-2fa' => - array ( - ), - 'ibestad' => - array ( - ), - 'inderoy' => - array ( - ), - 'xn--indery-fya' => - array ( - ), - 'iveland' => - array ( - ), - 'jevnaker' => - array ( - ), - 'jondal' => - array ( - ), - 'jolster' => - array ( - ), - 'xn--jlster-bya' => - array ( - ), - 'karasjok' => - array ( - ), - 'karasjohka' => - array ( - ), - 'xn--krjohka-hwab49j' => - array ( - ), - 'karlsoy' => - array ( - ), - 'galsa' => - array ( - ), - 'xn--gls-elac' => - array ( - ), - 'karmoy' => - array ( - ), - 'xn--karmy-yua' => - array ( - ), - 'kautokeino' => - array ( - ), - 'guovdageaidnu' => - array ( - ), - 'klepp' => - array ( - ), - 'klabu' => - array ( - ), - 'xn--klbu-woa' => - array ( - ), - 'kongsberg' => - array ( - ), - 'kongsvinger' => - array ( - ), - 'kragero' => - array ( - ), - 'xn--krager-gya' => - array ( - ), - 'kristiansand' => - array ( - ), - 'kristiansund' => - array ( - ), - 'krodsherad' => - array ( - ), - 'xn--krdsherad-m8a' => - array ( - ), - 'kvalsund' => - array ( - ), - 'rahkkeravju' => - array ( - ), - 'xn--rhkkervju-01af' => - array ( - ), - 'kvam' => - array ( - ), - 'kvinesdal' => - array ( - ), - 'kvinnherad' => - array ( - ), - 'kviteseid' => - array ( - ), - 'kvitsoy' => - array ( - ), - 'xn--kvitsy-fya' => - array ( - ), - 'kvafjord' => - array ( - ), - 'xn--kvfjord-nxa' => - array ( - ), - 'giehtavuoatna' => - array ( - ), - 'kvanangen' => - array ( - ), - 'xn--kvnangen-k0a' => - array ( - ), - 'navuotna' => - array ( - ), - 'xn--nvuotna-hwa' => - array ( - ), - 'kafjord' => - array ( - ), - 'xn--kfjord-iua' => - array ( - ), - 'gaivuotna' => - array ( - ), - 'xn--givuotna-8ya' => - array ( - ), - 'larvik' => - array ( - ), - 'lavangen' => - array ( - ), - 'lavagis' => - array ( - ), - 'loabat' => - array ( - ), - 'xn--loabt-0qa' => - array ( - ), - 'lebesby' => - array ( - ), - 'davvesiida' => - array ( - ), - 'leikanger' => - array ( - ), - 'leirfjord' => - array ( - ), - 'leka' => - array ( - ), - 'leksvik' => - array ( - ), - 'lenvik' => - array ( - ), - 'leangaviika' => - array ( - ), - 'xn--leagaviika-52b' => - array ( - ), - 'lesja' => - array ( - ), - 'levanger' => - array ( - ), - 'lier' => - array ( - ), - 'lierne' => - array ( - ), - 'lillehammer' => - array ( - ), - 'lillesand' => - array ( - ), - 'lindesnes' => - array ( - ), - 'lindas' => - array ( - ), - 'xn--linds-pra' => - array ( - ), - 'lom' => - array ( - ), - 'loppa' => - array ( - ), - 'lahppi' => - array ( - ), - 'xn--lhppi-xqa' => - array ( - ), - 'lund' => - array ( - ), - 'lunner' => - array ( - ), - 'luroy' => - array ( - ), - 'xn--lury-ira' => - array ( - ), - 'luster' => - array ( - ), - 'lyngdal' => - array ( - ), - 'lyngen' => - array ( - ), - 'ivgu' => - array ( - ), - 'lardal' => - array ( - ), - 'lerdal' => - array ( - ), - 'xn--lrdal-sra' => - array ( - ), - 'lodingen' => - array ( - ), - 'xn--ldingen-q1a' => - array ( - ), - 'lorenskog' => - array ( - ), - 'xn--lrenskog-54a' => - array ( - ), - 'loten' => - array ( - ), - 'xn--lten-gra' => - array ( - ), - 'malvik' => - array ( - ), - 'masoy' => - array ( - ), - 'xn--msy-ula0h' => - array ( - ), - 'muosat' => - array ( - ), - 'xn--muost-0qa' => - array ( - ), - 'mandal' => - array ( - ), - 'marker' => - array ( - ), - 'marnardal' => - array ( - ), - 'masfjorden' => - array ( - ), - 'meland' => - array ( - ), - 'meldal' => - array ( - ), - 'melhus' => - array ( - ), - 'meloy' => - array ( - ), - 'xn--mely-ira' => - array ( - ), - 'meraker' => - array ( - ), - 'xn--merker-kua' => - array ( - ), - 'moareke' => - array ( - ), - 'xn--moreke-jua' => - array ( - ), - 'midsund' => - array ( - ), - 'midtre-gauldal' => - array ( - ), - 'modalen' => - array ( - ), - 'modum' => - array ( - ), - 'molde' => - array ( - ), - 'moskenes' => - array ( - ), - 'moss' => - array ( - ), - 'mosvik' => - array ( - ), - 'malselv' => - array ( - ), - 'xn--mlselv-iua' => - array ( - ), - 'malatvuopmi' => - array ( - ), - 'xn--mlatvuopmi-s4a' => - array ( - ), - 'namdalseid' => - array ( - ), - 'aejrie' => - array ( - ), - 'namsos' => - array ( - ), - 'namsskogan' => - array ( - ), - 'naamesjevuemie' => - array ( - ), - 'xn--nmesjevuemie-tcba' => - array ( - ), - 'laakesvuemie' => - array ( - ), - 'nannestad' => - array ( - ), - 'narvik' => - array ( - ), - 'narviika' => - array ( - ), - 'naustdal' => - array ( - ), - 'nedre-eiker' => - array ( - ), - 'akershus' => - array ( - 'nes' => - array ( - ), - ), - 'buskerud' => - array ( - 'nes' => - array ( - ), - ), - 'nesna' => - array ( - ), - 'nesodden' => - array ( - ), - 'nesseby' => - array ( - ), - 'unjarga' => - array ( - ), - 'xn--unjrga-rta' => - array ( - ), - 'nesset' => - array ( - ), - 'nissedal' => - array ( - ), - 'nittedal' => - array ( - ), - 'nord-aurdal' => - array ( - ), - 'nord-fron' => - array ( - ), - 'nord-odal' => - array ( - ), - 'norddal' => - array ( - ), - 'nordkapp' => - array ( - ), - 'davvenjarga' => - array ( - ), - 'xn--davvenjrga-y4a' => - array ( - ), - 'nordre-land' => - array ( - ), - 'nordreisa' => - array ( - ), - 'raisa' => - array ( - ), - 'xn--risa-5na' => - array ( - ), - 'nore-og-uvdal' => - array ( - ), - 'notodden' => - array ( - ), - 'naroy' => - array ( - ), - 'xn--nry-yla5g' => - array ( - ), - 'notteroy' => - array ( - ), - 'xn--nttery-byae' => - array ( - ), - 'odda' => - array ( - ), - 'oksnes' => - array ( - ), - 'xn--ksnes-uua' => - array ( - ), - 'oppdal' => - array ( - ), - 'oppegard' => - array ( - ), - 'xn--oppegrd-ixa' => - array ( - ), - 'orkdal' => - array ( - ), - 'orland' => - array ( - ), - 'xn--rland-uua' => - array ( - ), - 'orskog' => - array ( - ), - 'xn--rskog-uua' => - array ( - ), - 'orsta' => - array ( - ), - 'xn--rsta-fra' => - array ( - ), - 'hedmark' => - array ( - 'os' => - array ( - ), - 'valer' => - array ( - ), - 'xn--vler-qoa' => - array ( - ), - ), - 'hordaland' => - array ( - 'os' => - array ( - ), - ), - 'osen' => - array ( - ), - 'osteroy' => - array ( - ), - 'xn--ostery-fya' => - array ( - ), - 'ostre-toten' => - array ( - ), - 'xn--stre-toten-zcb' => - array ( - ), - 'overhalla' => - array ( - ), - 'ovre-eiker' => - array ( - ), - 'xn--vre-eiker-k8a' => - array ( - ), - 'oyer' => - array ( - ), - 'xn--yer-zna' => - array ( - ), - 'oygarden' => - array ( - ), - 'xn--ygarden-p1a' => - array ( - ), - 'oystre-slidre' => - array ( - ), - 'xn--ystre-slidre-ujb' => - array ( - ), - 'porsanger' => - array ( - ), - 'porsangu' => - array ( - ), - 'xn--porsgu-sta26f' => - array ( - ), - 'porsgrunn' => - array ( - ), - 'radoy' => - array ( - ), - 'xn--rady-ira' => - array ( - ), - 'rakkestad' => - array ( - ), - 'rana' => - array ( - ), - 'ruovat' => - array ( - ), - 'randaberg' => - array ( - ), - 'rauma' => - array ( - ), - 'rendalen' => - array ( - ), - 'rennebu' => - array ( - ), - 'rennesoy' => - array ( - ), - 'xn--rennesy-v1a' => - array ( - ), - 'rindal' => - array ( - ), - 'ringebu' => - array ( - ), - 'ringerike' => - array ( - ), - 'ringsaker' => - array ( - ), - 'rissa' => - array ( - ), - 'risor' => - array ( - ), - 'xn--risr-ira' => - array ( - ), - 'roan' => - array ( - ), - 'rollag' => - array ( - ), - 'rygge' => - array ( - ), - 'ralingen' => - array ( - ), - 'xn--rlingen-mxa' => - array ( - ), - 'rodoy' => - array ( - ), - 'xn--rdy-0nab' => - array ( - ), - 'romskog' => - array ( - ), - 'xn--rmskog-bya' => - array ( - ), - 'roros' => - array ( - ), - 'xn--rros-gra' => - array ( - ), - 'rost' => - array ( - ), - 'xn--rst-0na' => - array ( - ), - 'royken' => - array ( - ), - 'xn--ryken-vua' => - array ( - ), - 'royrvik' => - array ( - ), - 'xn--ryrvik-bya' => - array ( - ), - 'rade' => - array ( - ), - 'xn--rde-ula' => - array ( - ), - 'salangen' => - array ( - ), - 'siellak' => - array ( - ), - 'saltdal' => - array ( - ), - 'salat' => - array ( - ), - 'xn--slt-elab' => - array ( - ), - 'xn--slat-5na' => - array ( - ), - 'samnanger' => - array ( - ), - 'vestfold' => - array ( - 'sande' => - array ( - ), - ), - 'sandefjord' => - array ( - ), - 'sandnes' => - array ( - ), - 'sandoy' => - array ( - ), - 'xn--sandy-yua' => - array ( - ), - 'sarpsborg' => - array ( - ), - 'sauda' => - array ( - ), - 'sauherad' => - array ( - ), - 'sel' => - array ( - ), - 'selbu' => - array ( - ), - 'selje' => - array ( - ), - 'seljord' => - array ( - ), - 'sigdal' => - array ( - ), - 'siljan' => - array ( - ), - 'sirdal' => - array ( - ), - 'skaun' => - array ( - ), - 'skedsmo' => - array ( - ), - 'ski' => - array ( - ), - 'skien' => - array ( - ), - 'skiptvet' => - array ( - ), - 'skjervoy' => - array ( - ), - 'xn--skjervy-v1a' => - array ( - ), - 'skierva' => - array ( - ), - 'xn--skierv-uta' => - array ( - ), - 'skjak' => - array ( - ), - 'xn--skjk-soa' => - array ( - ), - 'skodje' => - array ( - ), - 'skanland' => - array ( - ), - 'xn--sknland-fxa' => - array ( - ), - 'skanit' => - array ( - ), - 'xn--sknit-yqa' => - array ( - ), - 'smola' => - array ( - ), - 'xn--smla-hra' => - array ( - ), - 'snillfjord' => - array ( - ), - 'snasa' => - array ( - ), - 'xn--snsa-roa' => - array ( - ), - 'snoasa' => - array ( - ), - 'snaase' => - array ( - ), - 'xn--snase-nra' => - array ( - ), - 'sogndal' => - array ( - ), - 'sokndal' => - array ( - ), - 'sola' => - array ( - ), - 'solund' => - array ( - ), - 'songdalen' => - array ( - ), - 'sortland' => - array ( - ), - 'spydeberg' => - array ( - ), - 'stange' => - array ( - ), - 'stavanger' => - array ( - ), - 'steigen' => - array ( - ), - 'steinkjer' => - array ( - ), - 'stjordal' => - array ( - ), - 'xn--stjrdal-s1a' => - array ( - ), - 'stokke' => - array ( - ), - 'stor-elvdal' => - array ( - ), - 'stord' => - array ( - ), - 'stordal' => - array ( - ), - 'storfjord' => - array ( - ), - 'omasvuotna' => - array ( - ), - 'strand' => - array ( - ), - 'stranda' => - array ( - ), - 'stryn' => - array ( - ), - 'sula' => - array ( - ), - 'suldal' => - array ( - ), - 'sund' => - array ( - ), - 'sunndal' => - array ( - ), - 'surnadal' => - array ( - ), - 'sveio' => - array ( - ), - 'svelvik' => - array ( - ), - 'sykkylven' => - array ( - ), - 'sogne' => - array ( - ), - 'xn--sgne-gra' => - array ( - ), - 'somna' => - array ( - ), - 'xn--smna-gra' => - array ( - ), - 'sondre-land' => - array ( - ), - 'xn--sndre-land-0cb' => - array ( - ), - 'sor-aurdal' => - array ( - ), - 'xn--sr-aurdal-l8a' => - array ( - ), - 'sor-fron' => - array ( - ), - 'xn--sr-fron-q1a' => - array ( - ), - 'sor-odal' => - array ( - ), - 'xn--sr-odal-q1a' => - array ( - ), - 'sor-varanger' => - array ( - ), - 'xn--sr-varanger-ggb' => - array ( - ), - 'matta-varjjat' => - array ( - ), - 'xn--mtta-vrjjat-k7af' => - array ( - ), - 'sorfold' => - array ( - ), - 'xn--srfold-bya' => - array ( - ), - 'sorreisa' => - array ( - ), - 'xn--srreisa-q1a' => - array ( - ), - 'sorum' => - array ( - ), - 'xn--srum-gra' => - array ( - ), - 'tana' => - array ( - ), - 'deatnu' => - array ( - ), - 'time' => - array ( - ), - 'tingvoll' => - array ( - ), - 'tinn' => - array ( - ), - 'tjeldsund' => - array ( - ), - 'dielddanuorri' => - array ( - ), - 'tjome' => - array ( - ), - 'xn--tjme-hra' => - array ( - ), - 'tokke' => - array ( - ), - 'tolga' => - array ( - ), - 'torsken' => - array ( - ), - 'tranoy' => - array ( - ), - 'xn--trany-yua' => - array ( - ), - 'tromso' => - array ( - ), - 'xn--troms-zua' => - array ( - ), - 'tromsa' => - array ( - ), - 'romsa' => - array ( - ), - 'trondheim' => - array ( - ), - 'troandin' => - array ( - ), - 'trysil' => - array ( - ), - 'trana' => - array ( - ), - 'xn--trna-woa' => - array ( - ), - 'trogstad' => - array ( - ), - 'xn--trgstad-r1a' => - array ( - ), - 'tvedestrand' => - array ( - ), - 'tydal' => - array ( - ), - 'tynset' => - array ( - ), - 'tysfjord' => - array ( - ), - 'divtasvuodna' => - array ( - ), - 'divttasvuotna' => - array ( - ), - 'tysnes' => - array ( - ), - 'tysvar' => - array ( - ), - 'xn--tysvr-vra' => - array ( - ), - 'tonsberg' => - array ( - ), - 'xn--tnsberg-q1a' => - array ( - ), - 'ullensaker' => - array ( - ), - 'ullensvang' => - array ( - ), - 'ulvik' => - array ( - ), - 'utsira' => - array ( - ), - 'vadso' => - array ( - ), - 'xn--vads-jra' => - array ( - ), - 'cahcesuolo' => - array ( - ), - 'xn--hcesuolo-7ya35b' => - array ( - ), - 'vaksdal' => - array ( - ), - 'valle' => - array ( - ), - 'vang' => - array ( - ), - 'vanylven' => - array ( - ), - 'vardo' => - array ( - ), - 'xn--vard-jra' => - array ( - ), - 'varggat' => - array ( - ), - 'xn--vrggt-xqad' => - array ( - ), - 'vefsn' => - array ( - ), - 'vaapste' => - array ( - ), - 'vega' => - array ( - ), - 'vegarshei' => - array ( - ), - 'xn--vegrshei-c0a' => - array ( - ), - 'vennesla' => - array ( - ), - 'verdal' => - array ( - ), - 'verran' => - array ( - ), - 'vestby' => - array ( - ), - 'vestnes' => - array ( - ), - 'vestre-slidre' => - array ( - ), - 'vestre-toten' => - array ( - ), - 'vestvagoy' => - array ( - ), - 'xn--vestvgy-ixa6o' => - array ( - ), - 'vevelstad' => - array ( - ), - 'vik' => - array ( - ), - 'vikna' => - array ( - ), - 'vindafjord' => - array ( - ), - 'volda' => - array ( - ), - 'voss' => - array ( - ), - 'varoy' => - array ( - ), - 'xn--vry-yla5g' => - array ( - ), - 'vagan' => - array ( - ), - 'xn--vgan-qoa' => - array ( - ), - 'voagat' => - array ( - ), - 'vagsoy' => - array ( - ), - 'xn--vgsy-qoa0j' => - array ( - ), - 'vaga' => - array ( - ), - 'xn--vg-yiab' => - array ( - ), - 'ostfold' => - array ( - 'valer' => - array ( - ), - ), - 'xn--stfold-9xa' => - array ( - 'xn--vler-qoa' => - array ( - ), - ), - ), - 'np' => - array ( - '*' => - array ( - ), - ), - 'nr' => - array ( - 'biz' => - array ( - ), - 'info' => - array ( - ), - 'gov' => - array ( - ), - 'edu' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'com' => - array ( - ), - ), - 'nu' => - array ( - ), - 'nz' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'cri' => - array ( - ), - 'geek' => - array ( - ), - 'gen' => - array ( - ), - 'govt' => - array ( - ), - 'health' => - array ( - ), - 'iwi' => - array ( - ), - 'kiwi' => - array ( - ), - 'maori' => - array ( - ), - 'mil' => - array ( - ), - 'xn--mori-qsa' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'parliament' => - array ( - ), - 'school' => - array ( - ), - ), - 'om' => - array ( - 'co' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'med' => - array ( - ), - 'museum' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'pro' => - array ( - ), - ), - 'onion' => - array ( - ), - 'org' => - array ( - ), - 'pa' => - array ( - 'ac' => - array ( - ), - 'gob' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - 'sld' => - array ( - ), - 'edu' => - array ( - ), - 'net' => - array ( - ), - 'ing' => - array ( - ), - 'abo' => - array ( - ), - 'med' => - array ( - ), - 'nom' => - array ( - ), - ), - 'pe' => - array ( - 'edu' => - array ( - ), - 'gob' => - array ( - ), - 'nom' => - array ( - ), - 'mil' => - array ( - ), - 'org' => - array ( - ), - 'com' => - array ( - ), - 'net' => - array ( - ), - ), - 'pf' => - array ( - 'com' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - ), - 'pg' => - array ( - '*' => - array ( - ), - ), - 'ph' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - 'edu' => - array ( - ), - 'ngo' => - array ( - ), - 'mil' => - array ( - ), - 'i' => - array ( - ), - ), - 'pk' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'edu' => - array ( - ), - 'org' => - array ( - ), - 'fam' => - array ( - ), - 'biz' => - array ( - ), - 'web' => - array ( - ), - 'gov' => - array ( - ), - 'gob' => - array ( - ), - 'gok' => - array ( - ), - 'gon' => - array ( - ), - 'gop' => - array ( - ), - 'gos' => - array ( - ), - 'info' => - array ( - ), - ), - 'pl' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'aid' => - array ( - ), - 'agro' => - array ( - ), - 'atm' => - array ( - ), - 'auto' => - array ( - ), - 'biz' => - array ( - ), - 'edu' => - array ( - ), - 'gmina' => - array ( - ), - 'gsm' => - array ( - ), - 'info' => - array ( - ), - 'mail' => - array ( - ), - 'miasta' => - array ( - ), - 'media' => - array ( - ), - 'mil' => - array ( - ), - 'nieruchomosci' => - array ( - ), - 'nom' => - array ( - ), - 'pc' => - array ( - ), - 'powiat' => - array ( - ), - 'priv' => - array ( - ), - 'realestate' => - array ( - ), - 'rel' => - array ( - ), - 'sex' => - array ( - ), - 'shop' => - array ( - ), - 'sklep' => - array ( - ), - 'sos' => - array ( - ), - 'szkola' => - array ( - ), - 'targi' => - array ( - ), - 'tm' => - array ( - ), - 'tourism' => - array ( - ), - 'travel' => - array ( - ), - 'turystyka' => - array ( - ), - 'gov' => - array ( - 'ap' => - array ( - ), - 'ic' => - array ( - ), - 'is' => - array ( - ), - 'us' => - array ( - ), - 'kmpsp' => - array ( - ), - 'kppsp' => - array ( - ), - 'kwpsp' => - array ( - ), - 'psp' => - array ( - ), - 'wskr' => - array ( - ), - 'kwp' => - array ( - ), - 'mw' => - array ( - ), - 'ug' => - array ( - ), - 'um' => - array ( - ), - 'umig' => - array ( - ), - 'ugim' => - array ( - ), - 'upow' => - array ( - ), - 'uw' => - array ( - ), - 'starostwo' => - array ( - ), - 'pa' => - array ( - ), - 'po' => - array ( - ), - 'psse' => - array ( - ), - 'pup' => - array ( - ), - 'rzgw' => - array ( - ), - 'sa' => - array ( - ), - 'so' => - array ( - ), - 'sr' => - array ( - ), - 'wsa' => - array ( - ), - 'sko' => - array ( - ), - 'uzs' => - array ( - ), - 'wiih' => - array ( - ), - 'winb' => - array ( - ), - 'pinb' => - array ( - ), - 'wios' => - array ( - ), - 'witd' => - array ( - ), - 'wzmiuw' => - array ( - ), - 'piw' => - array ( - ), - 'wiw' => - array ( - ), - 'griw' => - array ( - ), - 'wif' => - array ( - ), - 'oum' => - array ( - ), - 'sdn' => - array ( - ), - 'zp' => - array ( - ), - 'uppo' => - array ( - ), - 'mup' => - array ( - ), - 'wuoz' => - array ( - ), - 'konsulat' => - array ( - ), - 'oirm' => - array ( - ), - ), - 'augustow' => - array ( - ), - 'babia-gora' => - array ( - ), - 'bedzin' => - array ( - ), - 'beskidy' => - array ( - ), - 'bialowieza' => - array ( - ), - 'bialystok' => - array ( - ), - 'bielawa' => - array ( - ), - 'bieszczady' => - array ( - ), - 'boleslawiec' => - array ( - ), - 'bydgoszcz' => - array ( - ), - 'bytom' => - array ( - ), - 'cieszyn' => - array ( - ), - 'czeladz' => - array ( - ), - 'czest' => - array ( - ), - 'dlugoleka' => - array ( - ), - 'elblag' => - array ( - ), - 'elk' => - array ( - ), - 'glogow' => - array ( - ), - 'gniezno' => - array ( - ), - 'gorlice' => - array ( - ), - 'grajewo' => - array ( - ), - 'ilawa' => - array ( - ), - 'jaworzno' => - array ( - ), - 'jelenia-gora' => - array ( - ), - 'jgora' => - array ( - ), - 'kalisz' => - array ( - ), - 'kazimierz-dolny' => - array ( - ), - 'karpacz' => - array ( - ), - 'kartuzy' => - array ( - ), - 'kaszuby' => - array ( - ), - 'katowice' => - array ( - ), - 'kepno' => - array ( - ), - 'ketrzyn' => - array ( - ), - 'klodzko' => - array ( - ), - 'kobierzyce' => - array ( - ), - 'kolobrzeg' => - array ( - ), - 'konin' => - array ( - ), - 'konskowola' => - array ( - ), - 'kutno' => - array ( - ), - 'lapy' => - array ( - ), - 'lebork' => - array ( - ), - 'legnica' => - array ( - ), - 'lezajsk' => - array ( - ), - 'limanowa' => - array ( - ), - 'lomza' => - array ( - ), - 'lowicz' => - array ( - ), - 'lubin' => - array ( - ), - 'lukow' => - array ( - ), - 'malbork' => - array ( - ), - 'malopolska' => - array ( - ), - 'mazowsze' => - array ( - ), - 'mazury' => - array ( - ), - 'mielec' => - array ( - ), - 'mielno' => - array ( - ), - 'mragowo' => - array ( - ), - 'naklo' => - array ( - ), - 'nowaruda' => - array ( - ), - 'nysa' => - array ( - ), - 'olawa' => - array ( - ), - 'olecko' => - array ( - ), - 'olkusz' => - array ( - ), - 'olsztyn' => - array ( - ), - 'opoczno' => - array ( - ), - 'opole' => - array ( - ), - 'ostroda' => - array ( - ), - 'ostroleka' => - array ( - ), - 'ostrowiec' => - array ( - ), - 'ostrowwlkp' => - array ( - ), - 'pila' => - array ( - ), - 'pisz' => - array ( - ), - 'podhale' => - array ( - ), - 'podlasie' => - array ( - ), - 'polkowice' => - array ( - ), - 'pomorze' => - array ( - ), - 'pomorskie' => - array ( - ), - 'prochowice' => - array ( - ), - 'pruszkow' => - array ( - ), - 'przeworsk' => - array ( - ), - 'pulawy' => - array ( - ), - 'radom' => - array ( - ), - 'rawa-maz' => - array ( - ), - 'rybnik' => - array ( - ), - 'rzeszow' => - array ( - ), - 'sanok' => - array ( - ), - 'sejny' => - array ( - ), - 'slask' => - array ( - ), - 'slupsk' => - array ( - ), - 'sosnowiec' => - array ( - ), - 'stalowa-wola' => - array ( - ), - 'skoczow' => - array ( - ), - 'starachowice' => - array ( - ), - 'stargard' => - array ( - ), - 'suwalki' => - array ( - ), - 'swidnica' => - array ( - ), - 'swiebodzin' => - array ( - ), - 'swinoujscie' => - array ( - ), - 'szczecin' => - array ( - ), - 'szczytno' => - array ( - ), - 'tarnobrzeg' => - array ( - ), - 'tgory' => - array ( - ), - 'turek' => - array ( - ), - 'tychy' => - array ( - ), - 'ustka' => - array ( - ), - 'walbrzych' => - array ( - ), - 'warmia' => - array ( - ), - 'warszawa' => - array ( - ), - 'waw' => - array ( - ), - 'wegrow' => - array ( - ), - 'wielun' => - array ( - ), - 'wlocl' => - array ( - ), - 'wloclawek' => - array ( - ), - 'wodzislaw' => - array ( - ), - 'wolomin' => - array ( - ), - 'wroclaw' => - array ( - ), - 'zachpomor' => - array ( - ), - 'zagan' => - array ( - ), - 'zarow' => - array ( - ), - 'zgora' => - array ( - ), - 'zgorzelec' => - array ( - ), - ), - 'pm' => - array ( - ), - 'pn' => - array ( - 'gov' => - array ( - ), - 'co' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'net' => - array ( - ), - ), - 'post' => - array ( - ), - 'pr' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - 'edu' => - array ( - ), - 'isla' => - array ( - ), - 'pro' => - array ( - ), - 'biz' => - array ( - ), - 'info' => - array ( - ), - 'name' => - array ( - ), - 'est' => - array ( - ), - 'prof' => - array ( - ), - 'ac' => - array ( - ), - ), - 'pro' => - array ( - 'aaa' => - array ( - ), - 'aca' => - array ( - ), - 'acct' => - array ( - ), - 'avocat' => - array ( - ), - 'bar' => - array ( - ), - 'cpa' => - array ( - ), - 'eng' => - array ( - ), - 'jur' => - array ( - ), - 'law' => - array ( - ), - 'med' => - array ( - ), - 'recht' => - array ( - ), - ), - 'ps' => - array ( - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'sec' => - array ( - ), - 'plo' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - ), - 'pt' => - array ( - 'net' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'int' => - array ( - ), - 'publ' => - array ( - ), - 'com' => - array ( - ), - 'nome' => - array ( - ), - ), - 'pw' => - array ( - 'co' => - array ( - ), - 'ne' => - array ( - ), - 'or' => - array ( - ), - 'ed' => - array ( - ), - 'go' => - array ( - ), - 'belau' => - array ( - ), - ), - 'py' => - array ( - 'com' => - array ( - ), - 'coop' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'qa' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'name' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'sch' => - array ( - ), - ), - 're' => - array ( - 'asso' => - array ( - ), - 'com' => - array ( - ), - 'nom' => - array ( - ), - ), - 'ro' => - array ( - 'arts' => - array ( - ), - 'com' => - array ( - ), - 'firm' => - array ( - ), - 'info' => - array ( - ), - 'nom' => - array ( - ), - 'nt' => - array ( - ), - 'org' => - array ( - ), - 'rec' => - array ( - ), - 'store' => - array ( - ), - 'tm' => - array ( - ), - 'www' => - array ( - ), - ), - 'rs' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'in' => - array ( - ), - 'org' => - array ( - ), - ), - 'ru' => - array ( - 'ac' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'int' => - array ( - ), - 'mil' => - array ( - ), - 'test' => - array ( - ), - ), - 'rw' => - array ( - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'edu' => - array ( - ), - 'ac' => - array ( - ), - 'com' => - array ( - ), - 'co' => - array ( - ), - 'int' => - array ( - ), - 'mil' => - array ( - ), - 'gouv' => - array ( - ), - ), - 'sa' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - 'med' => - array ( - ), - 'pub' => - array ( - ), - 'edu' => - array ( - ), - 'sch' => - array ( - ), - ), - 'sb' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'sc' => - array ( - 'com' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - ), - 'sd' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'med' => - array ( - ), - 'tv' => - array ( - ), - 'gov' => - array ( - ), - 'info' => - array ( - ), - ), - 'se' => - array ( - 'a' => - array ( - ), - 'ac' => - array ( - ), - 'b' => - array ( - ), - 'bd' => - array ( - ), - 'brand' => - array ( - ), - 'c' => - array ( - ), - 'd' => - array ( - ), - 'e' => - array ( - ), - 'f' => - array ( - ), - 'fh' => - array ( - ), - 'fhsk' => - array ( - ), - 'fhv' => - array ( - ), - 'g' => - array ( - ), - 'h' => - array ( - ), - 'i' => - array ( - ), - 'k' => - array ( - ), - 'komforb' => - array ( - ), - 'kommunalforbund' => - array ( - ), - 'komvux' => - array ( - ), - 'l' => - array ( - ), - 'lanbib' => - array ( - ), - 'm' => - array ( - ), - 'n' => - array ( - ), - 'naturbruksgymn' => - array ( - ), - 'o' => - array ( - ), - 'org' => - array ( - ), - 'p' => - array ( - ), - 'parti' => - array ( - ), - 'pp' => - array ( - ), - 'press' => - array ( - ), - 'r' => - array ( - ), - 's' => - array ( - ), - 't' => - array ( - ), - 'tm' => - array ( - ), - 'u' => - array ( - ), - 'w' => - array ( - ), - 'x' => - array ( - ), - 'y' => - array ( - ), - 'z' => - array ( - ), - ), - 'sg' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - 'edu' => - array ( - ), - 'per' => - array ( - ), - ), - 'sh' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'mil' => - array ( - ), - ), - 'si' => - array ( - ), - 'sj' => - array ( - ), - 'sk' => - array ( - ), - 'sl' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - ), - 'sm' => - array ( - ), - 'sn' => - array ( - 'art' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gouv' => - array ( - ), - 'org' => - array ( - ), - 'perso' => - array ( - ), - 'univ' => - array ( - ), - ), - 'so' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'sr' => - array ( - ), - 'st' => - array ( - 'co' => - array ( - ), - 'com' => - array ( - ), - 'consulado' => - array ( - ), - 'edu' => - array ( - ), - 'embaixada' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'principe' => - array ( - ), - 'saotome' => - array ( - ), - 'store' => - array ( - ), - ), - 'su' => - array ( - ), - 'sv' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gob' => - array ( - ), - 'org' => - array ( - ), - 'red' => - array ( - ), - ), - 'sx' => - array ( - 'gov' => - array ( - ), - ), - 'sy' => - array ( - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'mil' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - ), - 'sz' => - array ( - 'co' => - array ( - ), - 'ac' => - array ( - ), - 'org' => - array ( - ), - ), - 'tc' => - array ( - ), - 'td' => - array ( - ), - 'tel' => - array ( - ), - 'tf' => - array ( - ), - 'tg' => - array ( - ), - 'th' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'go' => - array ( - ), - 'in' => - array ( - ), - 'mi' => - array ( - ), - 'net' => - array ( - ), - 'or' => - array ( - ), - ), - 'tj' => - array ( - 'ac' => - array ( - ), - 'biz' => - array ( - ), - 'co' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'go' => - array ( - ), - 'gov' => - array ( - ), - 'int' => - array ( - ), - 'mil' => - array ( - ), - 'name' => - array ( - ), - 'net' => - array ( - ), - 'nic' => - array ( - ), - 'org' => - array ( - ), - 'test' => - array ( - ), - 'web' => - array ( - ), - ), - 'tk' => - array ( - ), - 'tl' => - array ( - 'gov' => - array ( - ), - ), - 'tm' => - array ( - 'com' => - array ( - ), - 'co' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'nom' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'edu' => - array ( - ), - ), - 'tn' => - array ( - 'com' => - array ( - ), - 'ens' => - array ( - ), - 'fin' => - array ( - ), - 'gov' => - array ( - ), - 'ind' => - array ( - ), - 'intl' => - array ( - ), - 'nat' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'info' => - array ( - ), - 'perso' => - array ( - ), - 'tourism' => - array ( - ), - 'edunet' => - array ( - ), - 'rnrt' => - array ( - ), - 'rns' => - array ( - ), - 'rnu' => - array ( - ), - 'mincom' => - array ( - ), - 'agrinet' => - array ( - ), - 'defense' => - array ( - ), - 'turen' => - array ( - ), - ), - 'to' => - array ( - 'com' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'mil' => - array ( - ), - ), - 'tr' => - array ( - 'com' => - array ( - ), - 'info' => - array ( - ), - 'biz' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'web' => - array ( - ), - 'gen' => - array ( - ), - 'tv' => - array ( - ), - 'av' => - array ( - ), - 'dr' => - array ( - ), - 'bbs' => - array ( - ), - 'name' => - array ( - ), - 'tel' => - array ( - ), - 'gov' => - array ( - ), - 'bel' => - array ( - ), - 'pol' => - array ( - ), - 'mil' => - array ( - ), - 'k12' => - array ( - ), - 'edu' => - array ( - ), - 'kep' => - array ( - ), - 'nc' => - array ( - 'gov' => - array ( - ), - ), - ), - 'travel' => - array ( - ), - 'tt' => - array ( - 'co' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'biz' => - array ( - ), - 'info' => - array ( - ), - 'pro' => - array ( - ), - 'int' => - array ( - ), - 'coop' => - array ( - ), - 'jobs' => - array ( - ), - 'mobi' => - array ( - ), - 'travel' => - array ( - ), - 'museum' => - array ( - ), - 'aero' => - array ( - ), - 'name' => - array ( - ), - 'gov' => - array ( - ), - 'edu' => - array ( - ), - ), - 'tv' => - array ( - ), - 'tw' => - array ( - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'idv' => - array ( - ), - 'game' => - array ( - ), - 'ebiz' => - array ( - ), - 'club' => - array ( - ), - 'xn--zf0ao64a' => - array ( - ), - 'xn--uc0atv' => - array ( - ), - 'xn--czrw28b' => - array ( - ), - ), - 'tz' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'go' => - array ( - ), - 'hotel' => - array ( - ), - 'info' => - array ( - ), - 'me' => - array ( - ), - 'mil' => - array ( - ), - 'mobi' => - array ( - ), - 'ne' => - array ( - ), - 'or' => - array ( - ), - 'sc' => - array ( - ), - 'tv' => - array ( - ), - ), - 'ua' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'in' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'cherkassy' => - array ( - ), - 'cherkasy' => - array ( - ), - 'chernigov' => - array ( - ), - 'chernihiv' => - array ( - ), - 'chernivtsi' => - array ( - ), - 'chernovtsy' => - array ( - ), - 'ck' => - array ( - ), - 'cn' => - array ( - ), - 'cr' => - array ( - ), - 'crimea' => - array ( - ), - 'cv' => - array ( - ), - 'dn' => - array ( - ), - 'dnepropetrovsk' => - array ( - ), - 'dnipropetrovsk' => - array ( - ), - 'dominic' => - array ( - ), - 'donetsk' => - array ( - ), - 'dp' => - array ( - ), - 'if' => - array ( - ), - 'ivano-frankivsk' => - array ( - ), - 'kh' => - array ( - ), - 'kharkiv' => - array ( - ), - 'kharkov' => - array ( - ), - 'kherson' => - array ( - ), - 'khmelnitskiy' => - array ( - ), - 'khmelnytskyi' => - array ( - ), - 'kiev' => - array ( - ), - 'kirovograd' => - array ( - ), - 'km' => - array ( - ), - 'kr' => - array ( - ), - 'krym' => - array ( - ), - 'ks' => - array ( - ), - 'kv' => - array ( - ), - 'kyiv' => - array ( - ), - 'lg' => - array ( - ), - 'lt' => - array ( - ), - 'lugansk' => - array ( - ), - 'lutsk' => - array ( - ), - 'lv' => - array ( - ), - 'lviv' => - array ( - ), - 'mk' => - array ( - ), - 'mykolaiv' => - array ( - ), - 'nikolaev' => - array ( - ), - 'od' => - array ( - ), - 'odesa' => - array ( - ), - 'odessa' => - array ( - ), - 'pl' => - array ( - ), - 'poltava' => - array ( - ), - 'rivne' => - array ( - ), - 'rovno' => - array ( - ), - 'rv' => - array ( - ), - 'sb' => - array ( - ), - 'sebastopol' => - array ( - ), - 'sevastopol' => - array ( - ), - 'sm' => - array ( - ), - 'sumy' => - array ( - ), - 'te' => - array ( - ), - 'ternopil' => - array ( - ), - 'uz' => - array ( - ), - 'uzhgorod' => - array ( - ), - 'vinnica' => - array ( - ), - 'vinnytsia' => - array ( - ), - 'vn' => - array ( - ), - 'volyn' => - array ( - ), - 'yalta' => - array ( - ), - 'zaporizhzhe' => - array ( - ), - 'zaporizhzhia' => - array ( - ), - 'zhitomir' => - array ( - ), - 'zhytomyr' => - array ( - ), - 'zp' => - array ( - ), - 'zt' => - array ( - ), - ), - 'ug' => - array ( - 'co' => - array ( - ), - 'or' => - array ( - ), - 'ac' => - array ( - ), - 'sc' => - array ( - ), - 'go' => - array ( - ), - 'ne' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - ), - 'uk' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'gov' => - array ( - ), - 'ltd' => - array ( - ), - 'me' => - array ( - ), - 'net' => - array ( - ), - 'nhs' => - array ( - ), - 'org' => - array ( - ), - 'plc' => - array ( - ), - 'police' => - array ( - ), - 'sch' => - array ( - '*' => - array ( - ), - ), - ), - 'us' => - array ( - 'dni' => - array ( - ), - 'fed' => - array ( - ), - 'isa' => - array ( - ), - 'kids' => - array ( - ), - 'nsn' => - array ( - ), - 'ak' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'al' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ar' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'as' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'az' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ca' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'co' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ct' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'dc' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'de' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - ), - 'fl' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ga' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'gu' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'hi' => - array ( - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ia' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'id' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'il' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'in' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ks' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ky' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'la' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ma' => - array ( - 'k12' => - array ( - 'pvt' => - array ( - ), - 'chtr' => - array ( - ), - 'paroch' => - array ( - ), - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'md' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'me' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'mi' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - 'ann-arbor' => - array ( - ), - 'cog' => - array ( - ), - 'dst' => - array ( - ), - 'eaton' => - array ( - ), - 'gen' => - array ( - ), - 'mus' => - array ( - ), - 'tec' => - array ( - ), - 'washtenaw' => - array ( - ), - ), - 'mn' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'mo' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ms' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'mt' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'nc' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'nd' => - array ( - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ne' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'nh' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'nj' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'nm' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'nv' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ny' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'oh' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ok' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'or' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'pa' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'pr' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ri' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'sc' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'sd' => - array ( - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'tn' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'tx' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ut' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'vi' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'vt' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'va' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'wa' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'wi' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'wv' => - array ( - 'cc' => - array ( - ), - ), - 'wy' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - ), - 'uy' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gub' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'uz' => - array ( - 'co' => - array ( - ), - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'va' => - array ( - ), - 'vc' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'edu' => - array ( - ), - ), - 've' => - array ( - 'arts' => - array ( - ), - 'co' => - array ( - ), - 'com' => - array ( - ), - 'e12' => - array ( - ), - 'edu' => - array ( - ), - 'firm' => - array ( - ), - 'gob' => - array ( - ), - 'gov' => - array ( - ), - 'info' => - array ( - ), - 'int' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'rec' => - array ( - ), - 'store' => - array ( - ), - 'tec' => - array ( - ), - 'web' => - array ( - ), - ), - 'vg' => - array ( - ), - 'vi' => - array ( - 'co' => - array ( - ), - 'com' => - array ( - ), - 'k12' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'vn' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'int' => - array ( - ), - 'ac' => - array ( - ), - 'biz' => - array ( - ), - 'info' => - array ( - ), - 'name' => - array ( - ), - 'pro' => - array ( - ), - 'health' => - array ( - ), - ), - 'vu' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'wf' => - array ( - ), - 'ws' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - 'edu' => - array ( - ), - ), - 'yt' => - array ( - ), - 'xn--mgbaam7a8h' => - array ( - ), - 'xn--y9a3aq' => - array ( - ), - 'xn--54b7fta0cc' => - array ( - ), - 'xn--90ae' => - array ( - ), - 'xn--90ais' => - array ( - ), - 'xn--fiqs8s' => - array ( - ), - 'xn--fiqz9s' => - array ( - ), - 'xn--lgbbat1ad8j' => - array ( - ), - 'xn--wgbh1c' => - array ( - ), - 'xn--e1a4c' => - array ( - ), - 'xn--node' => - array ( - ), - 'xn--qxam' => - array ( - ), - 'xn--j6w193g' => - array ( - ), - 'xn--2scrj9c' => - array ( - ), - 'xn--3hcrj9c' => - array ( - ), - 'xn--45br5cyl' => - array ( - ), - 'xn--h2breg3eve' => - array ( - ), - 'xn--h2brj9c8c' => - array ( - ), - 'xn--mgbgu82a' => - array ( - ), - 'xn--rvc1e0am3e' => - array ( - ), - 'xn--h2brj9c' => - array ( - ), - 'xn--mgbbh1a71e' => - array ( - ), - 'xn--fpcrj9c3d' => - array ( - ), - 'xn--gecrj9c' => - array ( - ), - 'xn--s9brj9c' => - array ( - ), - 'xn--45brj9c' => - array ( - ), - 'xn--xkc2dl3a5ee0h' => - array ( - ), - 'xn--mgba3a4f16a' => - array ( - ), - 'xn--mgba3a4fra' => - array ( - ), - 'xn--mgbtx2b' => - array ( - ), - 'xn--mgbayh7gpa' => - array ( - ), - 'xn--3e0b707e' => - array ( - ), - 'xn--80ao21a' => - array ( - ), - 'xn--fzc2c9e2c' => - array ( - ), - 'xn--xkc2al3hye2a' => - array ( - ), - 'xn--mgbc0a9azcg' => - array ( - ), - 'xn--d1alf' => - array ( - ), - 'xn--l1acc' => - array ( - ), - 'xn--mix891f' => - array ( - ), - 'xn--mix082f' => - array ( - ), - 'xn--mgbx4cd0ab' => - array ( - ), - 'xn--mgb9awbf' => - array ( - ), - 'xn--mgbai9azgqp6j' => - array ( - ), - 'xn--mgbai9a5eva00b' => - array ( - ), - 'xn--ygbi2ammx' => - array ( - ), - 'xn--90a3ac' => - array ( - 'xn--o1ac' => - array ( - ), - 'xn--c1avg' => - array ( - ), - 'xn--90azh' => - array ( - ), - 'xn--d1at' => - array ( - ), - 'xn--o1ach' => - array ( - ), - 'xn--80au' => - array ( - ), - ), - 'xn--p1ai' => - array ( - ), - 'xn--wgbl6a' => - array ( - ), - 'xn--mgberp4a5d4ar' => - array ( - ), - 'xn--mgberp4a5d4a87g' => - array ( - ), - 'xn--mgbqly7c0a67fbc' => - array ( - ), - 'xn--mgbqly7cvafr' => - array ( - ), - 'xn--mgbpl2fh' => - array ( - ), - 'xn--yfro4i67o' => - array ( - ), - 'xn--clchc0ea0b2g2a9gcd' => - array ( - ), - 'xn--ogbpf8fl' => - array ( - ), - 'xn--mgbtf8fl' => - array ( - ), - 'xn--o3cw4h' => - array ( - 'xn--12c1fe0br' => - array ( - ), - 'xn--12co0c3b4eva' => - array ( - ), - 'xn--h3cuzk1di' => - array ( - ), - 'xn--o3cyx2a' => - array ( - ), - 'xn--m3ch0j3a' => - array ( - ), - 'xn--12cfi8ixb8l' => - array ( - ), - ), - 'xn--pgbs0dh' => - array ( - ), - 'xn--kpry57d' => - array ( - ), - 'xn--kprw13d' => - array ( - ), - 'xn--nnx388a' => - array ( - ), - 'xn--j1amh' => - array ( - ), - 'xn--mgb2ddes' => - array ( - ), - 'xxx' => - array ( - ), - 'ye' => - array ( - '*' => - array ( - ), - ), - 'za' => - array ( - 'ac' => - array ( - ), - 'agric' => - array ( - ), - 'alt' => - array ( - ), - 'co' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'grondar' => - array ( - ), - 'law' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'ngo' => - array ( - ), - 'nis' => - array ( - ), - 'nom' => - array ( - ), - 'org' => - array ( - ), - 'school' => - array ( - ), - 'tm' => - array ( - ), - 'web' => - array ( - ), - ), - 'zm' => - array ( - 'ac' => - array ( - ), - 'biz' => - array ( - ), - 'co' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'info' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'sch' => - array ( - ), - ), - 'zw' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'org' => - array ( - ), - ), - 'aaa' => - array ( - ), - 'aarp' => - array ( - ), - 'abarth' => - array ( - ), - 'abb' => - array ( - ), - 'abbott' => - array ( - ), - 'abbvie' => - array ( - ), - 'abc' => - array ( - ), - 'able' => - array ( - ), - 'abogado' => - array ( - ), - 'abudhabi' => - array ( - ), - 'academy' => - array ( - ), - 'accenture' => - array ( - ), - 'accountant' => - array ( - ), - 'accountants' => - array ( - ), - 'aco' => - array ( - ), - 'active' => - array ( - ), - 'actor' => - array ( - ), - 'adac' => - array ( - ), - 'ads' => - array ( - ), - 'adult' => - array ( - ), - 'aeg' => - array ( - ), - 'aetna' => - array ( - ), - 'afamilycompany' => - array ( - ), - 'afl' => - array ( - ), - 'africa' => - array ( - ), - 'agakhan' => - array ( - ), - 'agency' => - array ( - ), - 'aig' => - array ( - ), - 'aigo' => - array ( - ), - 'airbus' => - array ( - ), - 'airforce' => - array ( - ), - 'airtel' => - array ( - ), - 'akdn' => - array ( - ), - 'alfaromeo' => - array ( - ), - 'alibaba' => - array ( - ), - 'alipay' => - array ( - ), - 'allfinanz' => - array ( - ), - 'allstate' => - array ( - ), - 'ally' => - array ( - ), - 'alsace' => - array ( - ), - 'alstom' => - array ( - ), - 'americanexpress' => - array ( - ), - 'americanfamily' => - array ( - ), - 'amex' => - array ( - ), - 'amfam' => - array ( - ), - 'amica' => - array ( - ), - 'amsterdam' => - array ( - ), - 'analytics' => - array ( - ), - 'android' => - array ( - ), - 'anquan' => - array ( - ), - 'anz' => - array ( - ), - 'aol' => - array ( - ), - 'apartments' => - array ( - ), - 'app' => - array ( - ), - 'apple' => - array ( - ), - 'aquarelle' => - array ( - ), - 'arab' => - array ( - ), - 'aramco' => - array ( - ), - 'archi' => - array ( - ), - 'army' => - array ( - ), - 'art' => - array ( - ), - 'arte' => - array ( - ), - 'asda' => - array ( - ), - 'associates' => - array ( - ), - 'athleta' => - array ( - ), - 'attorney' => - array ( - ), - 'auction' => - array ( - ), - 'audi' => - array ( - ), - 'audible' => - array ( - ), - 'audio' => - array ( - ), - 'auspost' => - array ( - ), - 'author' => - array ( - ), - 'auto' => - array ( - ), - 'autos' => - array ( - ), - 'avianca' => - array ( - ), - 'aws' => - array ( - ), - 'axa' => - array ( - ), - 'azure' => - array ( - ), - 'baby' => - array ( - ), - 'baidu' => - array ( - ), - 'banamex' => - array ( - ), - 'bananarepublic' => - array ( - ), - 'band' => - array ( - ), - 'bank' => - array ( - ), - 'bar' => - array ( - ), - 'barcelona' => - array ( - ), - 'barclaycard' => - array ( - ), - 'barclays' => - array ( - ), - 'barefoot' => - array ( - ), - 'bargains' => - array ( - ), - 'baseball' => - array ( - ), - 'basketball' => - array ( - ), - 'bauhaus' => - array ( - ), - 'bayern' => - array ( - ), - 'bbc' => - array ( - ), - 'bbt' => - array ( - ), - 'bbva' => - array ( - ), - 'bcg' => - array ( - ), - 'bcn' => - array ( - ), - 'beats' => - array ( - ), - 'beauty' => - array ( - ), - 'beer' => - array ( - ), - 'bentley' => - array ( - ), - 'berlin' => - array ( - ), - 'best' => - array ( - ), - 'bestbuy' => - array ( - ), - 'bet' => - array ( - ), - 'bharti' => - array ( - ), - 'bible' => - array ( - ), - 'bid' => - array ( - ), - 'bike' => - array ( - ), - 'bing' => - array ( - ), - 'bingo' => - array ( - ), - 'bio' => - array ( - ), - 'black' => - array ( - ), - 'blackfriday' => - array ( - ), - 'blanco' => - array ( - ), - 'blockbuster' => - array ( - ), - 'blog' => - array ( - ), - 'bloomberg' => - array ( - ), - 'blue' => - array ( - ), - 'bms' => - array ( - ), - 'bmw' => - array ( - ), - 'bnl' => - array ( - ), - 'bnpparibas' => - array ( - ), - 'boats' => - array ( - ), - 'boehringer' => - array ( - ), - 'bofa' => - array ( - ), - 'bom' => - array ( - ), - 'bond' => - array ( - ), - 'boo' => - array ( - ), - 'book' => - array ( - ), - 'booking' => - array ( - ), - 'boots' => - array ( - ), - 'bosch' => - array ( - ), - 'bostik' => - array ( - ), - 'boston' => - array ( - ), - 'bot' => - array ( - ), - 'boutique' => - array ( - ), - 'box' => - array ( - ), - 'bradesco' => - array ( - ), - 'bridgestone' => - array ( - ), - 'broadway' => - array ( - ), - 'broker' => - array ( - ), - 'brother' => - array ( - ), - 'brussels' => - array ( - ), - 'budapest' => - array ( - ), - 'bugatti' => - array ( - ), - 'build' => - array ( - ), - 'builders' => - array ( - ), - 'business' => - array ( - ), - 'buy' => - array ( - ), - 'buzz' => - array ( - ), - 'bzh' => - array ( - ), - 'cab' => - array ( - ), - 'cafe' => - array ( - ), - 'cal' => - array ( - ), - 'call' => - array ( - ), - 'calvinklein' => - array ( - ), - 'cam' => - array ( - ), - 'camera' => - array ( - ), - 'camp' => - array ( - ), - 'cancerresearch' => - array ( - ), - 'canon' => - array ( - ), - 'capetown' => - array ( - ), - 'capital' => - array ( - ), - 'capitalone' => - array ( - ), - 'car' => - array ( - ), - 'caravan' => - array ( - ), - 'cards' => - array ( - ), - 'care' => - array ( - ), - 'career' => - array ( - ), - 'careers' => - array ( - ), - 'cars' => - array ( - ), - 'cartier' => - array ( - ), - 'casa' => - array ( - ), - 'case' => - array ( - ), - 'caseih' => - array ( - ), - 'cash' => - array ( - ), - 'casino' => - array ( - ), - 'catering' => - array ( - ), - 'catholic' => - array ( - ), - 'cba' => - array ( - ), - 'cbn' => - array ( - ), - 'cbre' => - array ( - ), - 'cbs' => - array ( - ), - 'ceb' => - array ( - ), - 'center' => - array ( - ), - 'ceo' => - array ( - ), - 'cern' => - array ( - ), - 'cfa' => - array ( - ), - 'cfd' => - array ( - ), - 'chanel' => - array ( - ), - 'channel' => - array ( - ), - 'chase' => - array ( - ), - 'chat' => - array ( - ), - 'cheap' => - array ( - ), - 'chintai' => - array ( - ), - 'chloe' => - array ( - ), - 'christmas' => - array ( - ), - 'chrome' => - array ( - ), - 'chrysler' => - array ( - ), - 'church' => - array ( - ), - 'cipriani' => - array ( - ), - 'circle' => - array ( - ), - 'cisco' => - array ( - ), - 'citadel' => - array ( - ), - 'citi' => - array ( - ), - 'citic' => - array ( - ), - 'city' => - array ( - ), - 'cityeats' => - array ( - ), - 'claims' => - array ( - ), - 'cleaning' => - array ( - ), - 'click' => - array ( - ), - 'clinic' => - array ( - ), - 'clinique' => - array ( - ), - 'clothing' => - array ( - ), - 'cloud' => - array ( - ), - 'club' => - array ( - ), - 'clubmed' => - array ( - ), - 'coach' => - array ( - ), - 'codes' => - array ( - ), - 'coffee' => - array ( - ), - 'college' => - array ( - ), - 'cologne' => - array ( - ), - 'comcast' => - array ( - ), - 'commbank' => - array ( - ), - 'community' => - array ( - ), - 'company' => - array ( - ), - 'compare' => - array ( - ), - 'computer' => - array ( - ), - 'comsec' => - array ( - ), - 'condos' => - array ( - ), - 'construction' => - array ( - ), - 'consulting' => - array ( - ), - 'contact' => - array ( - ), - 'contractors' => - array ( - ), - 'cooking' => - array ( - ), - 'cookingchannel' => - array ( - ), - 'cool' => - array ( - ), - 'corsica' => - array ( - ), - 'country' => - array ( - ), - 'coupon' => - array ( - ), - 'coupons' => - array ( - ), - 'courses' => - array ( - ), - 'credit' => - array ( - ), - 'creditcard' => - array ( - ), - 'creditunion' => - array ( - ), - 'cricket' => - array ( - ), - 'crown' => - array ( - ), - 'crs' => - array ( - ), - 'cruise' => - array ( - ), - 'cruises' => - array ( - ), - 'csc' => - array ( - ), - 'cuisinella' => - array ( - ), - 'cymru' => - array ( - ), - 'cyou' => - array ( - ), - 'dabur' => - array ( - ), - 'dad' => - array ( - ), - 'dance' => - array ( - ), - 'data' => - array ( - ), - 'date' => - array ( - ), - 'dating' => - array ( - ), - 'datsun' => - array ( - ), - 'day' => - array ( - ), - 'dclk' => - array ( - ), - 'dds' => - array ( - ), - 'deal' => - array ( - ), - 'dealer' => - array ( - ), - 'deals' => - array ( - ), - 'degree' => - array ( - ), - 'delivery' => - array ( - ), - 'dell' => - array ( - ), - 'deloitte' => - array ( - ), - 'delta' => - array ( - ), - 'democrat' => - array ( - ), - 'dental' => - array ( - ), - 'dentist' => - array ( - ), - 'desi' => - array ( - ), - 'design' => - array ( - ), - 'dev' => - array ( - ), - 'dhl' => - array ( - ), - 'diamonds' => - array ( - ), - 'diet' => - array ( - ), - 'digital' => - array ( - ), - 'direct' => - array ( - ), - 'directory' => - array ( - ), - 'discount' => - array ( - ), - 'discover' => - array ( - ), - 'dish' => - array ( - ), - 'diy' => - array ( - ), - 'dnp' => - array ( - ), - 'docs' => - array ( - ), - 'doctor' => - array ( - ), - 'dodge' => - array ( - ), - 'dog' => - array ( - ), - 'doha' => - array ( - ), - 'domains' => - array ( - ), - 'dot' => - array ( - ), - 'download' => - array ( - ), - 'drive' => - array ( - ), - 'dtv' => - array ( - ), - 'dubai' => - array ( - ), - 'duck' => - array ( - ), - 'dunlop' => - array ( - ), - 'duns' => - array ( - ), - 'dupont' => - array ( - ), - 'durban' => - array ( - ), - 'dvag' => - array ( - ), - 'dvr' => - array ( - ), - 'earth' => - array ( - ), - 'eat' => - array ( - ), - 'eco' => - array ( - ), - 'edeka' => - array ( - ), - 'education' => - array ( - ), - 'email' => - array ( - ), - 'emerck' => - array ( - ), - 'energy' => - array ( - ), - 'engineer' => - array ( - ), - 'engineering' => - array ( - ), - 'enterprises' => - array ( - ), - 'epost' => - array ( - ), - 'epson' => - array ( - ), - 'equipment' => - array ( - ), - 'ericsson' => - array ( - ), - 'erni' => - array ( - ), - 'esq' => - array ( - ), - 'estate' => - array ( - ), - 'esurance' => - array ( - ), - 'etisalat' => - array ( - ), - 'eurovision' => - array ( - ), - 'eus' => - array ( - ), - 'events' => - array ( - ), - 'everbank' => - array ( - ), - 'exchange' => - array ( - ), - 'expert' => - array ( - ), - 'exposed' => - array ( - ), - 'express' => - array ( - ), - 'extraspace' => - array ( - ), - 'fage' => - array ( - ), - 'fail' => - array ( - ), - 'fairwinds' => - array ( - ), - 'faith' => - array ( - ), - 'family' => - array ( - ), - 'fan' => - array ( - ), - 'fans' => - array ( - ), - 'farm' => - array ( - ), - 'farmers' => - array ( - ), - 'fashion' => - array ( - ), - 'fast' => - array ( - ), - 'fedex' => - array ( - ), - 'feedback' => - array ( - ), - 'ferrari' => - array ( - ), - 'ferrero' => - array ( - ), - 'fiat' => - array ( - ), - 'fidelity' => - array ( - ), - 'fido' => - array ( - ), - 'film' => - array ( - ), - 'final' => - array ( - ), - 'finance' => - array ( - ), - 'financial' => - array ( - ), - 'fire' => - array ( - ), - 'firestone' => - array ( - ), - 'firmdale' => - array ( - ), - 'fish' => - array ( - ), - 'fishing' => - array ( - ), - 'fit' => - array ( - ), - 'fitness' => - array ( - ), - 'flickr' => - array ( - ), - 'flights' => - array ( - ), - 'flir' => - array ( - ), - 'florist' => - array ( - ), - 'flowers' => - array ( - ), - 'fly' => - array ( - ), - 'foo' => - array ( - ), - 'food' => - array ( - ), - 'foodnetwork' => - array ( - ), - 'football' => - array ( - ), - 'ford' => - array ( - ), - 'forex' => - array ( - ), - 'forsale' => - array ( - ), - 'forum' => - array ( - ), - 'foundation' => - array ( - ), - 'fox' => - array ( - ), - 'free' => - array ( - ), - 'fresenius' => - array ( - ), - 'frl' => - array ( - ), - 'frogans' => - array ( - ), - 'frontdoor' => - array ( - ), - 'frontier' => - array ( - ), - 'ftr' => - array ( - ), - 'fujitsu' => - array ( - ), - 'fujixerox' => - array ( - ), - 'fun' => - array ( - ), - 'fund' => - array ( - ), - 'furniture' => - array ( - ), - 'futbol' => - array ( - ), - 'fyi' => - array ( - ), - 'gal' => - array ( - ), - 'gallery' => - array ( - ), - 'gallo' => - array ( - ), - 'gallup' => - array ( - ), - 'game' => - array ( - ), - 'games' => - array ( - ), - 'gap' => - array ( - ), - 'garden' => - array ( - ), - 'gbiz' => - array ( - ), - 'gdn' => - array ( - ), - 'gea' => - array ( - ), - 'gent' => - array ( - ), - 'genting' => - array ( - ), - 'george' => - array ( - ), - 'ggee' => - array ( - ), - 'gift' => - array ( - ), - 'gifts' => - array ( - ), - 'gives' => - array ( - ), - 'giving' => - array ( - ), - 'glade' => - array ( - ), - 'glass' => - array ( - ), - 'gle' => - array ( - ), - 'global' => - array ( - ), - 'globo' => - array ( - ), - 'gmail' => - array ( - ), - 'gmbh' => - array ( - ), - 'gmo' => - array ( - ), - 'gmx' => - array ( - ), - 'godaddy' => - array ( - ), - 'gold' => - array ( - ), - 'goldpoint' => - array ( - ), - 'golf' => - array ( - ), - 'goo' => - array ( - ), - 'goodhands' => - array ( - ), - 'goodyear' => - array ( - ), - 'goog' => - array ( - ), - 'google' => - array ( - ), - 'gop' => - array ( - ), - 'got' => - array ( - ), - 'grainger' => - array ( - ), - 'graphics' => - array ( - ), - 'gratis' => - array ( - ), - 'green' => - array ( - ), - 'gripe' => - array ( - ), - 'grocery' => - array ( - ), - 'group' => - array ( - ), - 'guardian' => - array ( - ), - 'gucci' => - array ( - ), - 'guge' => - array ( - ), - 'guide' => - array ( - ), - 'guitars' => - array ( - ), - 'guru' => - array ( - ), - 'hair' => - array ( - ), - 'hamburg' => - array ( - ), - 'hangout' => - array ( - ), - 'haus' => - array ( - ), - 'hbo' => - array ( - ), - 'hdfc' => - array ( - ), - 'hdfcbank' => - array ( - ), - 'health' => - array ( - ), - 'healthcare' => - array ( - ), - 'help' => - array ( - ), - 'helsinki' => - array ( - ), - 'here' => - array ( - ), - 'hermes' => - array ( - ), - 'hgtv' => - array ( - ), - 'hiphop' => - array ( - ), - 'hisamitsu' => - array ( - ), - 'hitachi' => - array ( - ), - 'hiv' => - array ( - ), - 'hkt' => - array ( - ), - 'hockey' => - array ( - ), - 'holdings' => - array ( - ), - 'holiday' => - array ( - ), - 'homedepot' => - array ( - ), - 'homegoods' => - array ( - ), - 'homes' => - array ( - ), - 'homesense' => - array ( - ), - 'honda' => - array ( - ), - 'honeywell' => - array ( - ), - 'horse' => - array ( - ), - 'hospital' => - array ( - ), - 'host' => - array ( - ), - 'hosting' => - array ( - ), - 'hot' => - array ( - ), - 'hoteles' => - array ( - ), - 'hotels' => - array ( - ), - 'hotmail' => - array ( - ), - 'house' => - array ( - ), - 'how' => - array ( - ), - 'hsbc' => - array ( - ), - 'htc' => - array ( - ), - 'hughes' => - array ( - ), - 'hyatt' => - array ( - ), - 'hyundai' => - array ( - ), - 'ibm' => - array ( - ), - 'icbc' => - array ( - ), - 'ice' => - array ( - ), - 'icu' => - array ( - ), - 'ieee' => - array ( - ), - 'ifm' => - array ( - ), - 'ikano' => - array ( - ), - 'imamat' => - array ( - ), - 'imdb' => - array ( - ), - 'immo' => - array ( - ), - 'immobilien' => - array ( - ), - 'industries' => - array ( - ), - 'infiniti' => - array ( - ), - 'ing' => - array ( - ), - 'ink' => - array ( - ), - 'institute' => - array ( - ), - 'insurance' => - array ( - ), - 'insure' => - array ( - ), - 'intel' => - array ( - ), - 'international' => - array ( - ), - 'intuit' => - array ( - ), - 'investments' => - array ( - ), - 'ipiranga' => - array ( - ), - 'irish' => - array ( - ), - 'iselect' => - array ( - ), - 'ismaili' => - array ( - ), - 'ist' => - array ( - ), - 'istanbul' => - array ( - ), - 'itau' => - array ( - ), - 'itv' => - array ( - ), - 'iveco' => - array ( - ), - 'iwc' => - array ( - ), - 'jaguar' => - array ( - ), - 'java' => - array ( - ), - 'jcb' => - array ( - ), - 'jcp' => - array ( - ), - 'jeep' => - array ( - ), - 'jetzt' => - array ( - ), - 'jewelry' => - array ( - ), - 'jio' => - array ( - ), - 'jlc' => - array ( - ), - 'jll' => - array ( - ), - 'jmp' => - array ( - ), - 'jnj' => - array ( - ), - 'joburg' => - array ( - ), - 'jot' => - array ( - ), - 'joy' => - array ( - ), - 'jpmorgan' => - array ( - ), - 'jprs' => - array ( - ), - 'juegos' => - array ( - ), - 'juniper' => - array ( - ), - 'kaufen' => - array ( - ), - 'kddi' => - array ( - ), - 'kerryhotels' => - array ( - ), - 'kerrylogistics' => - array ( - ), - 'kerryproperties' => - array ( - ), - 'kfh' => - array ( - ), - 'kia' => - array ( - ), - 'kim' => - array ( - ), - 'kinder' => - array ( - ), - 'kindle' => - array ( - ), - 'kitchen' => - array ( - ), - 'kiwi' => - array ( - ), - 'koeln' => - array ( - ), - 'komatsu' => - array ( - ), - 'kosher' => - array ( - ), - 'kpmg' => - array ( - ), - 'kpn' => - array ( - ), - 'krd' => - array ( - ), - 'kred' => - array ( - ), - 'kuokgroup' => - array ( - ), - 'kyoto' => - array ( - ), - 'lacaixa' => - array ( - ), - 'ladbrokes' => - array ( - ), - 'lamborghini' => - array ( - ), - 'lamer' => - array ( - ), - 'lancaster' => - array ( - ), - 'lancia' => - array ( - ), - 'lancome' => - array ( - ), - 'land' => - array ( - ), - 'landrover' => - array ( - ), - 'lanxess' => - array ( - ), - 'lasalle' => - array ( - ), - 'lat' => - array ( - ), - 'latino' => - array ( - ), - 'latrobe' => - array ( - ), - 'law' => - array ( - ), - 'lawyer' => - array ( - ), - 'lds' => - array ( - ), - 'lease' => - array ( - ), - 'leclerc' => - array ( - ), - 'lefrak' => - array ( - ), - 'legal' => - array ( - ), - 'lego' => - array ( - ), - 'lexus' => - array ( - ), - 'lgbt' => - array ( - ), - 'liaison' => - array ( - ), - 'lidl' => - array ( - ), - 'life' => - array ( - ), - 'lifeinsurance' => - array ( - ), - 'lifestyle' => - array ( - ), - 'lighting' => - array ( - ), - 'like' => - array ( - ), - 'lilly' => - array ( - ), - 'limited' => - array ( - ), - 'limo' => - array ( - ), - 'lincoln' => - array ( - ), - 'linde' => - array ( - ), - 'link' => - array ( - ), - 'lipsy' => - array ( - ), - 'live' => - array ( - ), - 'living' => - array ( - ), - 'lixil' => - array ( - ), - 'loan' => - array ( - ), - 'loans' => - array ( - ), - 'locker' => - array ( - ), - 'locus' => - array ( - ), - 'loft' => - array ( - ), - 'lol' => - array ( - ), - 'london' => - array ( - ), - 'lotte' => - array ( - ), - 'lotto' => - array ( - ), - 'love' => - array ( - ), - 'lpl' => - array ( - ), - 'lplfinancial' => - array ( - ), - 'ltd' => - array ( - ), - 'ltda' => - array ( - ), - 'lundbeck' => - array ( - ), - 'lupin' => - array ( - ), - 'luxe' => - array ( - ), - 'luxury' => - array ( - ), - 'macys' => - array ( - ), - 'madrid' => - array ( - ), - 'maif' => - array ( - ), - 'maison' => - array ( - ), - 'makeup' => - array ( - ), - 'man' => - array ( - ), - 'management' => - array ( - ), - 'mango' => - array ( - ), - 'map' => - array ( - ), - 'market' => - array ( - ), - 'marketing' => - array ( - ), - 'markets' => - array ( - ), - 'marriott' => - array ( - ), - 'marshalls' => - array ( - ), - 'maserati' => - array ( - ), - 'mattel' => - array ( - ), - 'mba' => - array ( - ), - 'mcd' => - array ( - ), - 'mcdonalds' => - array ( - ), - 'mckinsey' => - array ( - ), - 'med' => - array ( - ), - 'media' => - array ( - ), - 'meet' => - array ( - ), - 'melbourne' => - array ( - ), - 'meme' => - array ( - ), - 'memorial' => - array ( - ), - 'men' => - array ( - ), - 'menu' => - array ( - ), - 'meo' => - array ( - ), - 'merckmsd' => - array ( - ), - 'metlife' => - array ( - ), - 'miami' => - array ( - ), - 'microsoft' => - array ( - ), - 'mini' => - array ( - ), - 'mint' => - array ( - ), - 'mit' => - array ( - ), - 'mitsubishi' => - array ( - ), - 'mlb' => - array ( - ), - 'mls' => - array ( - ), - 'mma' => - array ( - ), - 'mobile' => - array ( - ), - 'mobily' => - array ( - ), - 'moda' => - array ( - ), - 'moe' => - array ( - ), - 'moi' => - array ( - ), - 'mom' => - array ( - ), - 'monash' => - array ( - ), - 'money' => - array ( - ), - 'monster' => - array ( - ), - 'montblanc' => - array ( - ), - 'mopar' => - array ( - ), - 'mormon' => - array ( - ), - 'mortgage' => - array ( - ), - 'moscow' => - array ( - ), - 'moto' => - array ( - ), - 'motorcycles' => - array ( - ), - 'mov' => - array ( - ), - 'movie' => - array ( - ), - 'movistar' => - array ( - ), - 'msd' => - array ( - ), - 'mtn' => - array ( - ), - 'mtpc' => - array ( - ), - 'mtr' => - array ( - ), - 'mutual' => - array ( - ), - 'nab' => - array ( - ), - 'nadex' => - array ( - ), - 'nagoya' => - array ( - ), - 'nationwide' => - array ( - ), - 'natura' => - array ( - ), - 'navy' => - array ( - ), - 'nba' => - array ( - ), - 'nec' => - array ( - ), - 'netbank' => - array ( - ), - 'netflix' => - array ( - ), - 'network' => - array ( - ), - 'neustar' => - array ( - ), - 'new' => - array ( - ), - 'newholland' => - array ( - ), - 'news' => - array ( - ), - 'next' => - array ( - ), - 'nextdirect' => - array ( - ), - 'nexus' => - array ( - ), - 'nfl' => - array ( - ), - 'ngo' => - array ( - ), - 'nhk' => - array ( - ), - 'nico' => - array ( - ), - 'nike' => - array ( - ), - 'nikon' => - array ( - ), - 'ninja' => - array ( - ), - 'nissan' => - array ( - ), - 'nissay' => - array ( - ), - 'nokia' => - array ( - ), - 'northwesternmutual' => - array ( - ), - 'norton' => - array ( - ), - 'now' => - array ( - ), - 'nowruz' => - array ( - ), - 'nowtv' => - array ( - ), - 'nra' => - array ( - ), - 'nrw' => - array ( - ), - 'ntt' => - array ( - ), - 'nyc' => - array ( - ), - 'obi' => - array ( - ), - 'observer' => - array ( - ), - 'off' => - array ( - ), - 'office' => - array ( - ), - 'okinawa' => - array ( - ), - 'olayan' => - array ( - ), - 'olayangroup' => - array ( - ), - 'oldnavy' => - array ( - ), - 'ollo' => - array ( - ), - 'omega' => - array ( - ), - 'one' => - array ( - ), - 'ong' => - array ( - ), - 'onl' => - array ( - ), - 'online' => - array ( - ), - 'onyourside' => - array ( - ), - 'ooo' => - array ( - ), - 'open' => - array ( - ), - 'oracle' => - array ( - ), - 'orange' => - array ( - ), - 'organic' => - array ( - ), - 'origins' => - array ( - ), - 'osaka' => - array ( - ), - 'otsuka' => - array ( - ), - 'ott' => - array ( - ), - 'ovh' => - array ( - ), - 'page' => - array ( - ), - 'pamperedchef' => - array ( - ), - 'panasonic' => - array ( - ), - 'panerai' => - array ( - ), - 'paris' => - array ( - ), - 'pars' => - array ( - ), - 'partners' => - array ( - ), - 'parts' => - array ( - ), - 'party' => - array ( - ), - 'passagens' => - array ( - ), - 'pay' => - array ( - ), - 'pccw' => - array ( - ), - 'pet' => - array ( - ), - 'pfizer' => - array ( - ), - 'pharmacy' => - array ( - ), - 'phd' => - array ( - ), - 'philips' => - array ( - ), - 'phone' => - array ( - ), - 'photo' => - array ( - ), - 'photography' => - array ( - ), - 'photos' => - array ( - ), - 'physio' => - array ( - ), - 'piaget' => - array ( - ), - 'pics' => - array ( - ), - 'pictet' => - array ( - ), - 'pictures' => - array ( - ), - 'pid' => - array ( - ), - 'pin' => - array ( - ), - 'ping' => - array ( - ), - 'pink' => - array ( - ), - 'pioneer' => - array ( - ), - 'pizza' => - array ( - ), - 'place' => - array ( - ), - 'play' => - array ( - ), - 'playstation' => - array ( - ), - 'plumbing' => - array ( - ), - 'plus' => - array ( - ), - 'pnc' => - array ( - ), - 'pohl' => - array ( - ), - 'poker' => - array ( - ), - 'politie' => - array ( - ), - 'porn' => - array ( - ), - 'pramerica' => - array ( - ), - 'praxi' => - array ( - ), - 'press' => - array ( - ), - 'prime' => - array ( - ), - 'prod' => - array ( - ), - 'productions' => - array ( - ), - 'prof' => - array ( - ), - 'progressive' => - array ( - ), - 'promo' => - array ( - ), - 'properties' => - array ( - ), - 'property' => - array ( - ), - 'protection' => - array ( - ), - 'pru' => - array ( - ), - 'prudential' => - array ( - ), - 'pub' => - array ( - ), - 'pwc' => - array ( - ), - 'qpon' => - array ( - ), - 'quebec' => - array ( - ), - 'quest' => - array ( - ), - 'qvc' => - array ( - ), - 'racing' => - array ( - ), - 'radio' => - array ( - ), - 'raid' => - array ( - ), - 'read' => - array ( - ), - 'realestate' => - array ( - ), - 'realtor' => - array ( - ), - 'realty' => - array ( - ), - 'recipes' => - array ( - ), - 'red' => - array ( - ), - 'redstone' => - array ( - ), - 'redumbrella' => - array ( - ), - 'rehab' => - array ( - ), - 'reise' => - array ( - ), - 'reisen' => - array ( - ), - 'reit' => - array ( - ), - 'reliance' => - array ( - ), - 'ren' => - array ( - ), - 'rent' => - array ( - ), - 'rentals' => - array ( - ), - 'repair' => - array ( - ), - 'report' => - array ( - ), - 'republican' => - array ( - ), - 'rest' => - array ( - ), - 'restaurant' => - array ( - ), - 'review' => - array ( - ), - 'reviews' => - array ( - ), - 'rexroth' => - array ( - ), - 'rich' => - array ( - ), - 'richardli' => - array ( - ), - 'ricoh' => - array ( - ), - 'rightathome' => - array ( - ), - 'ril' => - array ( - ), - 'rio' => - array ( - ), - 'rip' => - array ( - ), - 'rmit' => - array ( - ), - 'rocher' => - array ( - ), - 'rocks' => - array ( - ), - 'rodeo' => - array ( - ), - 'rogers' => - array ( - ), - 'room' => - array ( - ), - 'rsvp' => - array ( - ), - 'rugby' => - array ( - ), - 'ruhr' => - array ( - ), - 'run' => - array ( - ), - 'rwe' => - array ( - ), - 'ryukyu' => - array ( - ), - 'saarland' => - array ( - ), - 'safe' => - array ( - ), - 'safety' => - array ( - ), - 'sakura' => - array ( - ), - 'sale' => - array ( - ), - 'salon' => - array ( - ), - 'samsclub' => - array ( - ), - 'samsung' => - array ( - ), - 'sandvik' => - array ( - ), - 'sandvikcoromant' => - array ( - ), - 'sanofi' => - array ( - ), - 'sap' => - array ( - ), - 'sapo' => - array ( - ), - 'sarl' => - array ( - ), - 'sas' => - array ( - ), - 'save' => - array ( - ), - 'saxo' => - array ( - ), - 'sbi' => - array ( - ), - 'sbs' => - array ( - ), - 'sca' => - array ( - ), - 'scb' => - array ( - ), - 'schaeffler' => - array ( - ), - 'schmidt' => - array ( - ), - 'scholarships' => - array ( - ), - 'school' => - array ( - ), - 'schule' => - array ( - ), - 'schwarz' => - array ( - ), - 'science' => - array ( - ), - 'scjohnson' => - array ( - ), - 'scor' => - array ( - ), - 'scot' => - array ( - ), - 'search' => - array ( - ), - 'seat' => - array ( - ), - 'secure' => - array ( - ), - 'security' => - array ( - ), - 'seek' => - array ( - ), - 'select' => - array ( - ), - 'sener' => - array ( - ), - 'services' => - array ( - ), - 'ses' => - array ( - ), - 'seven' => - array ( - ), - 'sew' => - array ( - ), - 'sex' => - array ( - ), - 'sexy' => - array ( - ), - 'sfr' => - array ( - ), - 'shangrila' => - array ( - ), - 'sharp' => - array ( - ), - 'shaw' => - array ( - ), - 'shell' => - array ( - ), - 'shia' => - array ( - ), - 'shiksha' => - array ( - ), - 'shoes' => - array ( - ), - 'shop' => - array ( - ), - 'shopping' => - array ( - ), - 'shouji' => - array ( - ), - 'show' => - array ( - ), - 'showtime' => - array ( - ), - 'shriram' => - array ( - ), - 'silk' => - array ( - ), - 'sina' => - array ( - ), - 'singles' => - array ( - ), - 'site' => - array ( - ), - 'ski' => - array ( - ), - 'skin' => - array ( - ), - 'sky' => - array ( - ), - 'skype' => - array ( - ), - 'sling' => - array ( - ), - 'smart' => - array ( - ), - 'smile' => - array ( - ), - 'sncf' => - array ( - ), - 'soccer' => - array ( - ), - 'social' => - array ( - ), - 'softbank' => - array ( - ), - 'software' => - array ( - ), - 'sohu' => - array ( - ), - 'solar' => - array ( - ), - 'solutions' => - array ( - ), - 'song' => - array ( - ), - 'sony' => - array ( - ), - 'soy' => - array ( - ), - 'space' => - array ( - ), - 'spiegel' => - array ( - ), - 'spot' => - array ( - ), - 'spreadbetting' => - array ( - ), - 'srl' => - array ( - ), - 'srt' => - array ( - ), - 'stada' => - array ( - ), - 'staples' => - array ( - ), - 'star' => - array ( - ), - 'starhub' => - array ( - ), - 'statebank' => - array ( - ), - 'statefarm' => - array ( - ), - 'statoil' => - array ( - ), - 'stc' => - array ( - ), - 'stcgroup' => - array ( - ), - 'stockholm' => - array ( - ), - 'storage' => - array ( - ), - 'store' => - array ( - ), - 'stream' => - array ( - ), - 'studio' => - array ( - ), - 'study' => - array ( - ), - 'style' => - array ( - ), - 'sucks' => - array ( - ), - 'supplies' => - array ( - ), - 'supply' => - array ( - ), - 'support' => - array ( - ), - 'surf' => - array ( - ), - 'surgery' => - array ( - ), - 'suzuki' => - array ( - ), - 'swatch' => - array ( - ), - 'swiftcover' => - array ( - ), - 'swiss' => - array ( - ), - 'sydney' => - array ( - ), - 'symantec' => - array ( - ), - 'systems' => - array ( - ), - 'tab' => - array ( - ), - 'taipei' => - array ( - ), - 'talk' => - array ( - ), - 'taobao' => - array ( - ), - 'target' => - array ( - ), - 'tatamotors' => - array ( - ), - 'tatar' => - array ( - ), - 'tattoo' => - array ( - ), - 'tax' => - array ( - ), - 'taxi' => - array ( - ), - 'tci' => - array ( - ), - 'tdk' => - array ( - ), - 'team' => - array ( - ), - 'tech' => - array ( - ), - 'technology' => - array ( - ), - 'telecity' => - array ( - ), - 'telefonica' => - array ( - ), - 'temasek' => - array ( - ), - 'tennis' => - array ( - ), - 'teva' => - array ( - ), - 'thd' => - array ( - ), - 'theater' => - array ( - ), - 'theatre' => - array ( - ), - 'tiaa' => - array ( - ), - 'tickets' => - array ( - ), - 'tienda' => - array ( - ), - 'tiffany' => - array ( - ), - 'tips' => - array ( - ), - 'tires' => - array ( - ), - 'tirol' => - array ( - ), - 'tjmaxx' => - array ( - ), - 'tjx' => - array ( - ), - 'tkmaxx' => - array ( - ), - 'tmall' => - array ( - ), - 'today' => - array ( - ), - 'tokyo' => - array ( - ), - 'tools' => - array ( - ), - 'top' => - array ( - ), - 'toray' => - array ( - ), - 'toshiba' => - array ( - ), - 'total' => - array ( - ), - 'tours' => - array ( - ), - 'town' => - array ( - ), - 'toyota' => - array ( - ), - 'toys' => - array ( - ), - 'trade' => - array ( - ), - 'trading' => - array ( - ), - 'training' => - array ( - ), - 'travelchannel' => - array ( - ), - 'travelers' => - array ( - ), - 'travelersinsurance' => - array ( - ), - 'trust' => - array ( - ), - 'trv' => - array ( - ), - 'tube' => - array ( - ), - 'tui' => - array ( - ), - 'tunes' => - array ( - ), - 'tushu' => - array ( - ), - 'tvs' => - array ( - ), - 'ubank' => - array ( - ), - 'ubs' => - array ( - ), - 'uconnect' => - array ( - ), - 'unicom' => - array ( - ), - 'university' => - array ( - ), - 'uno' => - array ( - ), - 'uol' => - array ( - ), - 'ups' => - array ( - ), - 'vacations' => - array ( - ), - 'vana' => - array ( - ), - 'vanguard' => - array ( - ), - 'vegas' => - array ( - ), - 'ventures' => - array ( - ), - 'verisign' => - array ( - ), - 'versicherung' => - array ( - ), - 'vet' => - array ( - ), - 'viajes' => - array ( - ), - 'video' => - array ( - ), - 'vig' => - array ( - ), - 'viking' => - array ( - ), - 'villas' => - array ( - ), - 'vin' => - array ( - ), - 'vip' => - array ( - ), - 'virgin' => - array ( - ), - 'visa' => - array ( - ), - 'vision' => - array ( - ), - 'vista' => - array ( - ), - 'vistaprint' => - array ( - ), - 'viva' => - array ( - ), - 'vivo' => - array ( - ), - 'vlaanderen' => - array ( - ), - 'vodka' => - array ( - ), - 'volkswagen' => - array ( - ), - 'volvo' => - array ( - ), - 'vote' => - array ( - ), - 'voting' => - array ( - ), - 'voto' => - array ( - ), - 'voyage' => - array ( - ), - 'vuelos' => - array ( - ), - 'wales' => - array ( - ), - 'walmart' => - array ( - ), - 'walter' => - array ( - ), - 'wang' => - array ( - ), - 'wanggou' => - array ( - ), - 'warman' => - array ( - ), - 'watch' => - array ( - ), - 'watches' => - array ( - ), - 'weather' => - array ( - ), - 'weatherchannel' => - array ( - ), - 'webcam' => - array ( - ), - 'weber' => - array ( - ), - 'website' => - array ( - ), - 'wed' => - array ( - ), - 'wedding' => - array ( - ), - 'weibo' => - array ( - ), - 'weir' => - array ( - ), - 'whoswho' => - array ( - ), - 'wien' => - array ( - ), - 'wiki' => - array ( - ), - 'williamhill' => - array ( - ), - 'win' => - array ( - ), - 'windows' => - array ( - ), - 'wine' => - array ( - ), - 'winners' => - array ( - ), - 'wme' => - array ( - ), - 'wolterskluwer' => - array ( - ), - 'woodside' => - array ( - ), - 'work' => - array ( - ), - 'works' => - array ( - ), - 'world' => - array ( - ), - 'wow' => - array ( - ), - 'wtc' => - array ( - ), - 'wtf' => - array ( - ), - 'xbox' => - array ( - ), - 'xerox' => - array ( - ), - 'xfinity' => - array ( - ), - 'xihuan' => - array ( - ), - 'xin' => - array ( - ), - 'xn--11b4c3d' => - array ( - ), - 'xn--1ck2e1b' => - array ( - ), - 'xn--1qqw23a' => - array ( - ), - 'xn--30rr7y' => - array ( - ), - 'xn--3bst00m' => - array ( - ), - 'xn--3ds443g' => - array ( - ), - 'xn--3oq18vl8pn36a' => - array ( - ), - 'xn--3pxu8k' => - array ( - ), - 'xn--42c2d9a' => - array ( - ), - 'xn--45q11c' => - array ( - ), - 'xn--4gbrim' => - array ( - ), - 'xn--55qw42g' => - array ( - ), - 'xn--55qx5d' => - array ( - ), - 'xn--5su34j936bgsg' => - array ( - ), - 'xn--5tzm5g' => - array ( - ), - 'xn--6frz82g' => - array ( - ), - 'xn--6qq986b3xl' => - array ( - ), - 'xn--80adxhks' => - array ( - ), - 'xn--80aqecdr1a' => - array ( - ), - 'xn--80asehdb' => - array ( - ), - 'xn--80aswg' => - array ( - ), - 'xn--8y0a063a' => - array ( - ), - 'xn--9dbq2a' => - array ( - ), - 'xn--9et52u' => - array ( - ), - 'xn--9krt00a' => - array ( - ), - 'xn--b4w605ferd' => - array ( - ), - 'xn--bck1b9a5dre4c' => - array ( - ), - 'xn--c1avg' => - array ( - ), - 'xn--c2br7g' => - array ( - ), - 'xn--cck2b3b' => - array ( - ), - 'xn--cg4bki' => - array ( - ), - 'xn--czr694b' => - array ( - ), - 'xn--czrs0t' => - array ( - ), - 'xn--czru2d' => - array ( - ), - 'xn--d1acj3b' => - array ( - ), - 'xn--eckvdtc9d' => - array ( - ), - 'xn--efvy88h' => - array ( - ), - 'xn--estv75g' => - array ( - ), - 'xn--fct429k' => - array ( - ), - 'xn--fhbei' => - array ( - ), - 'xn--fiq228c5hs' => - array ( - ), - 'xn--fiq64b' => - array ( - ), - 'xn--fjq720a' => - array ( - ), - 'xn--flw351e' => - array ( - ), - 'xn--fzys8d69uvgm' => - array ( - ), - 'xn--g2xx48c' => - array ( - ), - 'xn--gckr3f0f' => - array ( - ), - 'xn--gk3at1e' => - array ( - ), - 'xn--hxt814e' => - array ( - ), - 'xn--i1b6b1a6a2e' => - array ( - ), - 'xn--imr513n' => - array ( - ), - 'xn--io0a7i' => - array ( - ), - 'xn--j1aef' => - array ( - ), - 'xn--jlq61u9w7b' => - array ( - ), - 'xn--jvr189m' => - array ( - ), - 'xn--kcrx77d1x4a' => - array ( - ), - 'xn--kpu716f' => - array ( - ), - 'xn--kput3i' => - array ( - ), - 'xn--mgba3a3ejt' => - array ( - ), - 'xn--mgba7c0bbn0a' => - array ( - ), - 'xn--mgbaakc7dvf' => - array ( - ), - 'xn--mgbab2bd' => - array ( - ), - 'xn--mgbb9fbpob' => - array ( - ), - 'xn--mgbca7dzdo' => - array ( - ), - 'xn--mgbi4ecexp' => - array ( - ), - 'xn--mgbt3dhd' => - array ( - ), - 'xn--mk1bu44c' => - array ( - ), - 'xn--mxtq1m' => - array ( - ), - 'xn--ngbc5azd' => - array ( - ), - 'xn--ngbe9e0a' => - array ( - ), - 'xn--ngbrx' => - array ( - ), - 'xn--nqv7f' => - array ( - ), - 'xn--nqv7fs00ema' => - array ( - ), - 'xn--nyqy26a' => - array ( - ), - 'xn--p1acf' => - array ( - ), - 'xn--pbt977c' => - array ( - ), - 'xn--pssy2u' => - array ( - ), - 'xn--q9jyb4c' => - array ( - ), - 'xn--qcka1pmc' => - array ( - ), - 'xn--rhqv96g' => - array ( - ), - 'xn--rovu88b' => - array ( - ), - 'xn--ses554g' => - array ( - ), - 'xn--t60b56a' => - array ( - ), - 'xn--tckwe' => - array ( - ), - 'xn--tiq49xqyj' => - array ( - ), - 'xn--unup4y' => - array ( - ), - 'xn--vermgensberater-ctb' => - array ( - ), - 'xn--vermgensberatung-pwb' => - array ( - ), - 'xn--vhquv' => - array ( - ), - 'xn--vuq861b' => - array ( - ), - 'xn--w4r85el8fhu5dnra' => - array ( - ), - 'xn--w4rs40l' => - array ( - ), - 'xn--xhq521b' => - array ( - ), - 'xn--zfr164b' => - array ( - ), - 'xperia' => - array ( - ), - 'xyz' => - array ( - ), - 'yachts' => - array ( - ), - 'yahoo' => - array ( - ), - 'yamaxun' => - array ( - ), - 'yandex' => - array ( - ), - 'yodobashi' => - array ( - ), - 'yoga' => - array ( - ), - 'yokohama' => - array ( - ), - 'you' => - array ( - ), - 'youtube' => - array ( - ), - 'yun' => - array ( - ), - 'zappos' => - array ( - ), - 'zara' => - array ( - ), - 'zero' => - array ( - ), - 'zip' => - array ( - ), - 'zippo' => - array ( - ), - 'zone' => - array ( - ), - 'zuerich' => - array ( - ), -); \ No newline at end of file diff --git a/data/private-public-suffix-list.php b/data/private-public-suffix-list.php deleted file mode 100644 index de29d63d..00000000 --- a/data/private-public-suffix-list.php +++ /dev/null @@ -1,4212 +0,0 @@ - - array ( - 'cc' => - array ( - ), - 'inf' => - array ( - ), - 'ltd' => - array ( - ), - 'biz' => - array ( - ), - 'co' => - array ( - ), - 'pp' => - array ( - ), - ), - 'pl' => - array ( - 'beep' => - array ( - ), - 'co' => - array ( - ), - 'art' => - array ( - ), - 'gliwice' => - array ( - ), - 'krakow' => - array ( - ), - 'poznan' => - array ( - ), - 'wroc' => - array ( - ), - 'zakopane' => - array ( - ), - 'gda' => - array ( - ), - 'gdansk' => - array ( - ), - 'gdynia' => - array ( - ), - 'med' => - array ( - ), - 'sopot' => - array ( - ), - ), - 'estate' => - array ( - 'compute' => - array ( - '*' => - array ( - ), - ), - ), - 'network' => - array ( - 'alces' => - array ( - '*' => - array ( - ), - ), - ), - 'net' => - array ( - 'alwaysdata' => - array ( - '*' => - array ( - ), - ), - 'cloudfront' => - array ( - ), - 't3l3p0rt' => - array ( - ), - 'myfritz' => - array ( - ), - 'boomla' => - array ( - ), - 'bplaced' => - array ( - ), - 'square7' => - array ( - ), - 'gb' => - array ( - ), - 'hu' => - array ( - ), - 'jp' => - array ( - ), - 'se' => - array ( - ), - 'uk' => - array ( - ), - 'in' => - array ( - ), - 'cloudaccess' => - array ( - ), - 'cdn77-ssl' => - array ( - ), - 'cdn77' => - array ( - 'r' => - array ( - ), - ), - 'feste-ip' => - array ( - ), - 'knx-server' => - array ( - ), - 'static-access' => - array ( - ), - 'cryptonomic' => - array ( - '*' => - array ( - ), - ), - 'debian' => - array ( - ), - 'at-band-camp' => - array ( - ), - 'blogdns' => - array ( - ), - 'broke-it' => - array ( - ), - 'buyshouses' => - array ( - ), - 'dnsalias' => - array ( - ), - 'dnsdojo' => - array ( - ), - 'does-it' => - array ( - ), - 'dontexist' => - array ( - ), - 'dynalias' => - array ( - ), - 'dynathome' => - array ( - ), - 'endofinternet' => - array ( - ), - 'from-az' => - array ( - ), - 'from-co' => - array ( - ), - 'from-la' => - array ( - ), - 'from-ny' => - array ( - ), - 'gets-it' => - array ( - ), - 'ham-radio-op' => - array ( - ), - 'homeftp' => - array ( - ), - 'homeip' => - array ( - ), - 'homelinux' => - array ( - ), - 'homeunix' => - array ( - ), - 'in-the-band' => - array ( - ), - 'is-a-chef' => - array ( - ), - 'is-a-geek' => - array ( - ), - 'isa-geek' => - array ( - ), - 'kicks-ass' => - array ( - ), - 'office-on-the' => - array ( - ), - 'podzone' => - array ( - ), - 'scrapper-site' => - array ( - ), - 'selfip' => - array ( - ), - 'sells-it' => - array ( - ), - 'servebbs' => - array ( - ), - 'serveftp' => - array ( - ), - 'thruhere' => - array ( - ), - 'webhop' => - array ( - ), - 'definima' => - array ( - ), - 'casacam' => - array ( - ), - 'dynu' => - array ( - ), - 'dynv6' => - array ( - ), - 'twmail' => - array ( - ), - 'ru' => - array ( - ), - 'channelsdvr' => - array ( - ), - 'fastlylb' => - array ( - 'map' => - array ( - ), - ), - 'fastly' => - array ( - 'freetls' => - array ( - ), - 'map' => - array ( - ), - 'prod' => - array ( - 'a' => - array ( - ), - 'global' => - array ( - ), - ), - 'ssl' => - array ( - 'a' => - array ( - ), - 'b' => - array ( - ), - 'global' => - array ( - ), - ), - ), - 'flynnhosting' => - array ( - ), - 'cloudfunctions' => - array ( - ), - 'moonscale' => - array ( - ), - 'ipifony' => - array ( - ), - 'barsy' => - array ( - ), - 'azurewebsites' => - array ( - ), - 'azure-mobile' => - array ( - ), - 'cloudapp' => - array ( - ), - 'eating-organic' => - array ( - ), - 'mydissent' => - array ( - ), - 'myeffect' => - array ( - ), - 'mymediapc' => - array ( - ), - 'mypsx' => - array ( - ), - 'mysecuritycamera' => - array ( - ), - 'nhlfan' => - array ( - ), - 'no-ip' => - array ( - ), - 'pgafan' => - array ( - ), - 'privatizehealthinsurance' => - array ( - ), - 'bounceme' => - array ( - ), - 'ddns' => - array ( - ), - 'redirectme' => - array ( - ), - 'serveblog' => - array ( - ), - 'serveminecraft' => - array ( - ), - 'sytes' => - array ( - ), - 'rackmaze' => - array ( - ), - 'firewall-gateway' => - array ( - ), - 'dsmynas' => - array ( - ), - 'familyds' => - array ( - ), - 'za' => - array ( - ), - ), - 'com' => - array ( - 'amazonaws' => - array ( - 'compute' => - array ( - '*' => - array ( - ), - ), - 'compute-1' => - array ( - '*' => - array ( - ), - ), - 'us-east-1' => - array ( - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - ), - 'elb' => - array ( - '*' => - array ( - ), - ), - 's3' => - array ( - ), - 's3-ap-northeast-1' => - array ( - ), - 's3-ap-northeast-2' => - array ( - ), - 's3-ap-south-1' => - array ( - ), - 's3-ap-southeast-1' => - array ( - ), - 's3-ap-southeast-2' => - array ( - ), - 's3-ca-central-1' => - array ( - ), - 's3-eu-central-1' => - array ( - ), - 's3-eu-west-1' => - array ( - ), - 's3-eu-west-2' => - array ( - ), - 's3-external-1' => - array ( - ), - 's3-fips-us-gov-west-1' => - array ( - ), - 's3-sa-east-1' => - array ( - ), - 's3-us-gov-west-1' => - array ( - ), - 's3-us-east-2' => - array ( - ), - 's3-us-west-1' => - array ( - ), - 's3-us-west-2' => - array ( - ), - 'ap-northeast-2' => - array ( - 's3' => - array ( - ), - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - 's3-website' => - array ( - ), - ), - 'ap-south-1' => - array ( - 's3' => - array ( - ), - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - 's3-website' => - array ( - ), - ), - 'ca-central-1' => - array ( - 's3' => - array ( - ), - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - 's3-website' => - array ( - ), - ), - 'eu-central-1' => - array ( - 's3' => - array ( - ), - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - 's3-website' => - array ( - ), - ), - 'eu-west-2' => - array ( - 's3' => - array ( - ), - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - 's3-website' => - array ( - ), - ), - 'us-east-2' => - array ( - 's3' => - array ( - ), - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - 's3-website' => - array ( - ), - ), - 'ap-northeast-1' => - array ( - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - ), - 'ap-southeast-1' => - array ( - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - ), - 'ap-southeast-2' => - array ( - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - ), - 'eu-west-1' => - array ( - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - ), - 'sa-east-1' => - array ( - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - ), - 's3-website-us-east-1' => - array ( - ), - 's3-website-us-west-1' => - array ( - ), - 's3-website-us-west-2' => - array ( - ), - 's3-website-ap-northeast-1' => - array ( - ), - 's3-website-ap-southeast-1' => - array ( - ), - 's3-website-ap-southeast-2' => - array ( - ), - 's3-website-eu-west-1' => - array ( - ), - 's3-website-sa-east-1' => - array ( - ), - ), - 'elasticbeanstalk' => - array ( - 'ap-northeast-1' => - array ( - ), - 'ap-northeast-2' => - array ( - ), - 'ap-south-1' => - array ( - ), - 'ap-southeast-1' => - array ( - ), - 'ap-southeast-2' => - array ( - ), - 'ca-central-1' => - array ( - ), - 'eu-central-1' => - array ( - ), - 'eu-west-1' => - array ( - ), - 'eu-west-2' => - array ( - ), - 'sa-east-1' => - array ( - ), - 'us-east-1' => - array ( - ), - 'us-east-2' => - array ( - ), - 'us-gov-west-1' => - array ( - ), - 'us-west-1' => - array ( - ), - 'us-west-2' => - array ( - ), - ), - 'on-aptible' => - array ( - ), - 'myasustor' => - array ( - ), - 'betainabox' => - array ( - ), - 'bplaced' => - array ( - ), - 'ar' => - array ( - ), - 'br' => - array ( - ), - 'cn' => - array ( - ), - 'de' => - array ( - ), - 'eu' => - array ( - ), - 'gb' => - array ( - ), - 'hu' => - array ( - ), - 'jpn' => - array ( - ), - 'kr' => - array ( - ), - 'mex' => - array ( - ), - 'no' => - array ( - ), - 'qc' => - array ( - ), - 'ru' => - array ( - ), - 'sa' => - array ( - ), - 'se' => - array ( - ), - 'uk' => - array ( - ), - 'us' => - array ( - ), - 'uy' => - array ( - ), - 'za' => - array ( - ), - 'africa' => - array ( - ), - 'gr' => - array ( - ), - 'co' => - array ( - ), - 'xenapponazure' => - array ( - ), - 'jdevcloud' => - array ( - ), - 'wpdevcloud' => - array ( - ), - 'cloudcontrolled' => - array ( - ), - 'cloudcontrolapp' => - array ( - ), - 'drayddns' => - array ( - ), - 'dreamhosters' => - array ( - ), - 'mydrobo' => - array ( - ), - 'dyndns-at-home' => - array ( - ), - 'dyndns-at-work' => - array ( - ), - 'dyndns-blog' => - array ( - ), - 'dyndns-free' => - array ( - ), - 'dyndns-home' => - array ( - ), - 'dyndns-ip' => - array ( - ), - 'dyndns-mail' => - array ( - ), - 'dyndns-office' => - array ( - ), - 'dyndns-pics' => - array ( - ), - 'dyndns-remote' => - array ( - ), - 'dyndns-server' => - array ( - ), - 'dyndns-web' => - array ( - ), - 'dyndns-wiki' => - array ( - ), - 'dyndns-work' => - array ( - ), - 'blogdns' => - array ( - ), - 'cechire' => - array ( - ), - 'dnsalias' => - array ( - ), - 'dnsdojo' => - array ( - ), - 'doesntexist' => - array ( - ), - 'dontexist' => - array ( - ), - 'doomdns' => - array ( - ), - 'dyn-o-saur' => - array ( - ), - 'dynalias' => - array ( - ), - 'est-a-la-maison' => - array ( - ), - 'est-a-la-masion' => - array ( - ), - 'est-le-patron' => - array ( - ), - 'est-mon-blogueur' => - array ( - ), - 'from-ak' => - array ( - ), - 'from-al' => - array ( - ), - 'from-ar' => - array ( - ), - 'from-ca' => - array ( - ), - 'from-ct' => - array ( - ), - 'from-dc' => - array ( - ), - 'from-de' => - array ( - ), - 'from-fl' => - array ( - ), - 'from-ga' => - array ( - ), - 'from-hi' => - array ( - ), - 'from-ia' => - array ( - ), - 'from-id' => - array ( - ), - 'from-il' => - array ( - ), - 'from-in' => - array ( - ), - 'from-ks' => - array ( - ), - 'from-ky' => - array ( - ), - 'from-ma' => - array ( - ), - 'from-md' => - array ( - ), - 'from-mi' => - array ( - ), - 'from-mn' => - array ( - ), - 'from-mo' => - array ( - ), - 'from-ms' => - array ( - ), - 'from-mt' => - array ( - ), - 'from-nc' => - array ( - ), - 'from-nd' => - array ( - ), - 'from-ne' => - array ( - ), - 'from-nh' => - array ( - ), - 'from-nj' => - array ( - ), - 'from-nm' => - array ( - ), - 'from-nv' => - array ( - ), - 'from-oh' => - array ( - ), - 'from-ok' => - array ( - ), - 'from-or' => - array ( - ), - 'from-pa' => - array ( - ), - 'from-pr' => - array ( - ), - 'from-ri' => - array ( - ), - 'from-sc' => - array ( - ), - 'from-sd' => - array ( - ), - 'from-tn' => - array ( - ), - 'from-tx' => - array ( - ), - 'from-ut' => - array ( - ), - 'from-va' => - array ( - ), - 'from-vt' => - array ( - ), - 'from-wa' => - array ( - ), - 'from-wi' => - array ( - ), - 'from-wv' => - array ( - ), - 'from-wy' => - array ( - ), - 'getmyip' => - array ( - ), - 'gotdns' => - array ( - ), - 'hobby-site' => - array ( - ), - 'homelinux' => - array ( - ), - 'homeunix' => - array ( - ), - 'iamallama' => - array ( - ), - 'is-a-anarchist' => - array ( - ), - 'is-a-blogger' => - array ( - ), - 'is-a-bookkeeper' => - array ( - ), - 'is-a-bulls-fan' => - array ( - ), - 'is-a-caterer' => - array ( - ), - 'is-a-chef' => - array ( - ), - 'is-a-conservative' => - array ( - ), - 'is-a-cpa' => - array ( - ), - 'is-a-cubicle-slave' => - array ( - ), - 'is-a-democrat' => - array ( - ), - 'is-a-designer' => - array ( - ), - 'is-a-doctor' => - array ( - ), - 'is-a-financialadvisor' => - array ( - ), - 'is-a-geek' => - array ( - ), - 'is-a-green' => - array ( - ), - 'is-a-guru' => - array ( - ), - 'is-a-hard-worker' => - array ( - ), - 'is-a-hunter' => - array ( - ), - 'is-a-landscaper' => - array ( - ), - 'is-a-lawyer' => - array ( - ), - 'is-a-liberal' => - array ( - ), - 'is-a-libertarian' => - array ( - ), - 'is-a-llama' => - array ( - ), - 'is-a-musician' => - array ( - ), - 'is-a-nascarfan' => - array ( - ), - 'is-a-nurse' => - array ( - ), - 'is-a-painter' => - array ( - ), - 'is-a-personaltrainer' => - array ( - ), - 'is-a-photographer' => - array ( - ), - 'is-a-player' => - array ( - ), - 'is-a-republican' => - array ( - ), - 'is-a-rockstar' => - array ( - ), - 'is-a-socialist' => - array ( - ), - 'is-a-student' => - array ( - ), - 'is-a-teacher' => - array ( - ), - 'is-a-techie' => - array ( - ), - 'is-a-therapist' => - array ( - ), - 'is-an-accountant' => - array ( - ), - 'is-an-actor' => - array ( - ), - 'is-an-actress' => - array ( - ), - 'is-an-anarchist' => - array ( - ), - 'is-an-artist' => - array ( - ), - 'is-an-engineer' => - array ( - ), - 'is-an-entertainer' => - array ( - ), - 'is-certified' => - array ( - ), - 'is-gone' => - array ( - ), - 'is-into-anime' => - array ( - ), - 'is-into-cars' => - array ( - ), - 'is-into-cartoons' => - array ( - ), - 'is-into-games' => - array ( - ), - 'is-leet' => - array ( - ), - 'is-not-certified' => - array ( - ), - 'is-slick' => - array ( - ), - 'is-uberleet' => - array ( - ), - 'is-with-theband' => - array ( - ), - 'isa-geek' => - array ( - ), - 'isa-hockeynut' => - array ( - ), - 'issmarterthanyou' => - array ( - ), - 'likes-pie' => - array ( - ), - 'likescandy' => - array ( - ), - 'neat-url' => - array ( - ), - 'saves-the-whales' => - array ( - ), - 'selfip' => - array ( - ), - 'sells-for-less' => - array ( - ), - 'sells-for-u' => - array ( - ), - 'servebbs' => - array ( - ), - 'simple-url' => - array ( - ), - 'space-to-rent' => - array ( - ), - 'teaches-yoga' => - array ( - ), - 'writesthisblog' => - array ( - ), - 'ddnsfree' => - array ( - ), - 'ddnsgeek' => - array ( - ), - 'giize' => - array ( - ), - 'gleeze' => - array ( - ), - 'kozow' => - array ( - ), - 'loseyourip' => - array ( - ), - 'ooguy' => - array ( - ), - 'theworkpc' => - array ( - ), - 'mytuleap' => - array ( - ), - 'evennode' => - array ( - 'eu-1' => - array ( - ), - 'eu-2' => - array ( - ), - 'eu-3' => - array ( - ), - 'eu-4' => - array ( - ), - 'us-1' => - array ( - ), - 'us-2' => - array ( - ), - 'us-3' => - array ( - ), - 'us-4' => - array ( - ), - ), - 'fbsbx' => - array ( - 'apps' => - array ( - ), - ), - 'firebaseapp' => - array ( - ), - 'flynnhub' => - array ( - ), - 'freebox-os' => - array ( - ), - 'freeboxos' => - array ( - ), - 'githubusercontent' => - array ( - ), - '0emm' => - array ( - '*' => - array ( - ), - ), - 'appspot' => - array ( - ), - 'blogspot' => - array ( - ), - 'codespot' => - array ( - ), - 'googleapis' => - array ( - ), - 'googlecode' => - array ( - ), - 'pagespeedmobilizer' => - array ( - ), - 'publishproxy' => - array ( - ), - 'withgoogle' => - array ( - ), - 'withyoutube' => - array ( - ), - 'herokuapp' => - array ( - ), - 'herokussl' => - array ( - ), - 'pixolino' => - array ( - ), - 'joyent' => - array ( - 'cns' => - array ( - '*' => - array ( - ), - ), - ), - 'barsyonline' => - array ( - ), - 'meteorapp' => - array ( - 'eu' => - array ( - ), - ), - 'bitballoon' => - array ( - ), - 'netlify' => - array ( - ), - '4u' => - array ( - ), - 'nfshost' => - array ( - ), - 'blogsyte' => - array ( - ), - 'ciscofreak' => - array ( - ), - 'damnserver' => - array ( - ), - 'ditchyourip' => - array ( - ), - 'dnsiskinky' => - array ( - ), - 'dynns' => - array ( - ), - 'geekgalaxy' => - array ( - ), - 'health-carereform' => - array ( - ), - 'homesecuritymac' => - array ( - ), - 'homesecuritypc' => - array ( - ), - 'myactivedirectory' => - array ( - ), - 'mysecuritycamera' => - array ( - ), - 'net-freaks' => - array ( - ), - 'onthewifi' => - array ( - ), - 'point2this' => - array ( - ), - 'quicksytes' => - array ( - ), - 'securitytactics' => - array ( - ), - 'serveexchange' => - array ( - ), - 'servehumour' => - array ( - ), - 'servep2p' => - array ( - ), - 'servesarcasm' => - array ( - ), - 'stufftoread' => - array ( - ), - 'unusualperson' => - array ( - ), - 'workisboring' => - array ( - ), - '3utilities' => - array ( - ), - 'ddnsking' => - array ( - ), - 'myvnc' => - array ( - ), - 'servebeer' => - array ( - ), - 'servecounterstrike' => - array ( - ), - 'serveftp' => - array ( - ), - 'servegame' => - array ( - ), - 'servehalflife' => - array ( - ), - 'servehttp' => - array ( - ), - 'serveirc' => - array ( - ), - 'servemp3' => - array ( - ), - 'servepics' => - array ( - ), - 'servequake' => - array ( - ), - 'operaunite' => - array ( - ), - 'outsystemscloud' => - array ( - ), - 'ownprovider' => - array ( - ), - 'pgfog' => - array ( - ), - 'pagefrontapp' => - array ( - ), - 'gotpantheon' => - array ( - ), - 'prgmr' => - array ( - 'xen' => - array ( - ), - ), - 'qa2' => - array ( - ), - 'dev-myqnapcloud' => - array ( - ), - 'alpha-myqnapcloud' => - array ( - ), - 'myqnapcloud' => - array ( - ), - 'quipelements' => - array ( - '*' => - array ( - ), - ), - 'rackmaze' => - array ( - ), - 'rhcloud' => - array ( - ), - 'logoip' => - array ( - ), - 'firewall-gateway' => - array ( - ), - 'myshopblocks' => - array ( - ), - '1kapp' => - array ( - ), - 'appchizi' => - array ( - ), - 'applinzi' => - array ( - ), - 'sinaapp' => - array ( - ), - 'vipsinaapp' => - array ( - ), - 'bounty-full' => - array ( - 'alpha' => - array ( - ), - 'beta' => - array ( - ), - ), - 'temp-dns' => - array ( - ), - 'dsmynas' => - array ( - ), - 'familyds' => - array ( - ), - 'bloxcms' => - array ( - ), - 'townnews-staging' => - array ( - ), - 'hk' => - array ( - ), - 'remotewd' => - array ( - ), - 'yolasite' => - array ( - ), - ), - 'cn' => - array ( - 'com' => - array ( - 'amazonaws' => - array ( - 'compute' => - array ( - '*' => - array ( - ), - ), - 'eb' => - array ( - 'cn-north-1' => - array ( - ), - ), - 'elb' => - array ( - '*' => - array ( - ), - ), - 'cn-north-1' => - array ( - 's3' => - array ( - ), - ), - ), - ), - ), - 'org' => - array ( - 'amune' => - array ( - 'tele' => - array ( - ), - ), - 'pimienta' => - array ( - ), - 'poivron' => - array ( - ), - 'potager' => - array ( - ), - 'sweetpepper' => - array ( - ), - 'ae' => - array ( - ), - 'us' => - array ( - ), - 'certmgr' => - array ( - ), - 'cdn77' => - array ( - 'c' => - array ( - ), - 'rsc' => - array ( - ), - ), - 'cdn77-secure' => - array ( - 'origin' => - array ( - 'ssl' => - array ( - ), - ), - ), - 'cloudns' => - array ( - ), - 'duckdns' => - array ( - ), - 'tunk' => - array ( - ), - 'dyndns' => - array ( - 'go' => - array ( - ), - 'home' => - array ( - ), - ), - 'blogdns' => - array ( - ), - 'blogsite' => - array ( - ), - 'boldlygoingnowhere' => - array ( - ), - 'dnsalias' => - array ( - ), - 'dnsdojo' => - array ( - ), - 'doesntexist' => - array ( - ), - 'dontexist' => - array ( - ), - 'doomdns' => - array ( - ), - 'dvrdns' => - array ( - ), - 'dynalias' => - array ( - ), - 'endofinternet' => - array ( - ), - 'endoftheinternet' => - array ( - ), - 'from-me' => - array ( - ), - 'game-host' => - array ( - ), - 'gotdns' => - array ( - ), - 'hobby-site' => - array ( - ), - 'homedns' => - array ( - ), - 'homeftp' => - array ( - ), - 'homelinux' => - array ( - ), - 'homeunix' => - array ( - ), - 'is-a-bruinsfan' => - array ( - ), - 'is-a-candidate' => - array ( - ), - 'is-a-celticsfan' => - array ( - ), - 'is-a-chef' => - array ( - ), - 'is-a-geek' => - array ( - ), - 'is-a-knight' => - array ( - ), - 'is-a-linux-user' => - array ( - ), - 'is-a-patsfan' => - array ( - ), - 'is-a-soxfan' => - array ( - ), - 'is-found' => - array ( - ), - 'is-lost' => - array ( - ), - 'is-saved' => - array ( - ), - 'is-very-bad' => - array ( - ), - 'is-very-evil' => - array ( - ), - 'is-very-good' => - array ( - ), - 'is-very-nice' => - array ( - ), - 'is-very-sweet' => - array ( - ), - 'isa-geek' => - array ( - ), - 'kicks-ass' => - array ( - ), - 'misconfused' => - array ( - ), - 'podzone' => - array ( - ), - 'readmyblog' => - array ( - ), - 'selfip' => - array ( - ), - 'sellsyourhome' => - array ( - ), - 'servebbs' => - array ( - ), - 'serveftp' => - array ( - ), - 'servegame' => - array ( - ), - 'stuff-4-sale' => - array ( - ), - 'webhop' => - array ( - ), - 'ddnss' => - array ( - ), - 'accesscam' => - array ( - ), - 'camdvr' => - array ( - ), - 'freeddns' => - array ( - ), - 'mywire' => - array ( - ), - 'webredirect' => - array ( - ), - 'eu' => - array ( - 'al' => - array ( - ), - 'asso' => - array ( - ), - 'at' => - array ( - ), - 'au' => - array ( - ), - 'be' => - array ( - ), - 'bg' => - array ( - ), - 'ca' => - array ( - ), - 'cd' => - array ( - ), - 'ch' => - array ( - ), - 'cn' => - array ( - ), - 'cy' => - array ( - ), - 'cz' => - array ( - ), - 'de' => - array ( - ), - 'dk' => - array ( - ), - 'edu' => - array ( - ), - 'ee' => - array ( - ), - 'es' => - array ( - ), - 'fi' => - array ( - ), - 'fr' => - array ( - ), - 'gr' => - array ( - ), - 'hr' => - array ( - ), - 'hu' => - array ( - ), - 'ie' => - array ( - ), - 'il' => - array ( - ), - 'in' => - array ( - ), - 'int' => - array ( - ), - 'is' => - array ( - ), - 'it' => - array ( - ), - 'jp' => - array ( - ), - 'kr' => - array ( - ), - 'lt' => - array ( - ), - 'lu' => - array ( - ), - 'lv' => - array ( - ), - 'mc' => - array ( - ), - 'me' => - array ( - ), - 'mk' => - array ( - ), - 'mt' => - array ( - ), - 'my' => - array ( - ), - 'net' => - array ( - ), - 'ng' => - array ( - ), - 'nl' => - array ( - ), - 'no' => - array ( - ), - 'nz' => - array ( - ), - 'paris' => - array ( - ), - 'pl' => - array ( - ), - 'pt' => - array ( - ), - 'q-a' => - array ( - ), - 'ro' => - array ( - ), - 'ru' => - array ( - ), - 'se' => - array ( - ), - 'si' => - array ( - ), - 'sk' => - array ( - ), - 'tr' => - array ( - ), - 'uk' => - array ( - ), - 'us' => - array ( - ), - ), - 'twmail' => - array ( - ), - 'fedorainfracloud' => - array ( - ), - 'fedorapeople' => - array ( - ), - 'fedoraproject' => - array ( - 'cloud' => - array ( - ), - ), - 'hepforge' => - array ( - ), - 'js' => - array ( - ), - 'bmoattachments' => - array ( - ), - 'cable-modem' => - array ( - ), - 'collegefan' => - array ( - ), - 'couchpotatofries' => - array ( - ), - 'mlbfan' => - array ( - ), - 'mysecuritycamera' => - array ( - ), - 'nflfan' => - array ( - ), - 'read-books' => - array ( - ), - 'ufcfan' => - array ( - ), - 'hopto' => - array ( - ), - 'myftp' => - array ( - ), - 'no-ip' => - array ( - ), - 'zapto' => - array ( - ), - 'my-firewall' => - array ( - ), - 'myfirewall' => - array ( - ), - 'spdns' => - array ( - ), - 'dsmynas' => - array ( - ), - 'familyds' => - array ( - ), - 'tuxfamily' => - array ( - ), - 'diskstation' => - array ( - ), - 'hk' => - array ( - ), - 'wmflabs' => - array ( - ), - 'za' => - array ( - ), - ), - 'eus' => - array ( - 'party' => - array ( - 'user' => - array ( - ), - ), - ), - 'ca' => - array ( - 'awdev' => - array ( - '*' => - array ( - ), - ), - 'co' => - array ( - ), - 'blogspot' => - array ( - ), - 'no-ip' => - array ( - ), - ), - 'ws' => - array ( - 'advisor' => - array ( - '*' => - array ( - ), - ), - 'dyndns' => - array ( - ), - 'mypets' => - array ( - ), - ), - 'io' => - array ( - 'backplaneapp' => - array ( - ), - 'boxfuse' => - array ( - ), - 'browsersafetymark' => - array ( - ), - 'dedyn' => - array ( - ), - 'drud' => - array ( - ), - 'definima' => - array ( - ), - 'enonic' => - array ( - 'customer' => - array ( - ), - ), - 'github' => - array ( - ), - 'gitlab' => - array ( - ), - 'hasura-app' => - array ( - ), - 'ngrok' => - array ( - ), - 'nodeart' => - array ( - 'stage' => - array ( - ), - ), - 'nodum' => - array ( - ), - 'nid' => - array ( - ), - 'pantheonsite' => - array ( - ), - 'protonet' => - array ( - ), - 'vaporcloud' => - array ( - ), - 'hzc' => - array ( - ), - 'sandcats' => - array ( - ), - 'shiftedit' => - array ( - ), - 'lair' => - array ( - 'apps' => - array ( - ), - ), - 'stolos' => - array ( - '*' => - array ( - ), - ), - 'spacekit' => - array ( - ), - 'thingdust' => - array ( - 'dev' => - array ( - 'cust' => - array ( - ), - ), - 'disrec' => - array ( - 'cust' => - array ( - ), - ), - 'prod' => - array ( - 'cust' => - array ( - ), - ), - 'testing' => - array ( - 'cust' => - array ( - ), - ), - ), - 'wedeploy' => - array ( - ), - ), - 'la' => - array ( - 'bnr' => - array ( - ), - 'c' => - array ( - ), - 'nym' => - array ( - ), - ), - 'ch' => - array ( - 'square7' => - array ( - ), - 'blogspot' => - array ( - ), - 'gotdns' => - array ( - ), - '12hp' => - array ( - ), - '2ix' => - array ( - ), - '4lima' => - array ( - ), - 'lima-city' => - array ( - ), - ), - 'de' => - array ( - 'bplaced' => - array ( - ), - 'square7' => - array ( - ), - 'com' => - array ( - ), - 'cosidns' => - array ( - 'dyn' => - array ( - ), - ), - 'dynamisches-dns' => - array ( - ), - 'dnsupdater' => - array ( - ), - 'internet-dns' => - array ( - ), - 'l-o-g-i-n' => - array ( - ), - 'dnshome' => - array ( - ), - 'fuettertdasnetz' => - array ( - ), - 'isteingeek' => - array ( - ), - 'istmein' => - array ( - ), - 'lebtimnetz' => - array ( - ), - 'leitungsen' => - array ( - ), - 'traeumtgerade' => - array ( - ), - 'ddnss' => - array ( - 'dyn' => - array ( - ), - 'dyndns' => - array ( - ), - ), - 'dyndns1' => - array ( - ), - 'dyn-ip24' => - array ( - ), - 'home-webserver' => - array ( - 'dyn' => - array ( - ), - ), - 'myhome-server' => - array ( - ), - 'goip' => - array ( - ), - 'blogspot' => - array ( - ), - 'keymachine' => - array ( - ), - 'git-repos' => - array ( - ), - 'lcube-server' => - array ( - ), - 'svn-repos' => - array ( - ), - 'barsy' => - array ( - ), - 'logoip' => - array ( - ), - 'firewall-gateway' => - array ( - ), - 'my-gateway' => - array ( - ), - 'my-router' => - array ( - ), - 'spdns' => - array ( - ), - 'taifun-dns' => - array ( - ), - '12hp' => - array ( - ), - '2ix' => - array ( - ), - '4lima' => - array ( - ), - 'lima-city' => - array ( - ), - 'dd-dns' => - array ( - ), - 'dray-dns' => - array ( - ), - 'draydns' => - array ( - ), - 'dyn-vpn' => - array ( - ), - 'dynvpn' => - array ( - ), - 'mein-vigor' => - array ( - ), - 'my-vigor' => - array ( - ), - 'my-wan' => - array ( - ), - 'syno-ds' => - array ( - ), - 'synology-diskstation' => - array ( - ), - 'synology-ds' => - array ( - ), - ), - 'eu' => - array ( - 'mycd' => - array ( - ), - 'cloudns' => - array ( - ), - 'barsy' => - array ( - ), - 'wellbeingzone' => - array ( - ), - 'spdns' => - array ( - ), - 'transurl' => - array ( - '*' => - array ( - ), - ), - 'diskstation' => - array ( - ), - ), - 'se' => - array ( - 'com' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'bz' => - array ( - 'za' => - array ( - ), - 'nym' => - array ( - ), - ), - 'nl' => - array ( - 'virtueeldomein' => - array ( - ), - 'co' => - array ( - ), - 'blogspot' => - array ( - ), - 'transurl' => - array ( - '*' => - array ( - ), - ), - 'cistron' => - array ( - ), - 'demon' => - array ( - ), - ), - 'me' => - array ( - 'c66' => - array ( - ), - 'daplie' => - array ( - 'localhost' => - array ( - ), - ), - 'filegear' => - array ( - ), - 'brasilia' => - array ( - ), - 'ddns' => - array ( - ), - 'dnsfor' => - array ( - ), - 'hopto' => - array ( - ), - 'loginto' => - array ( - ), - 'noip' => - array ( - ), - 'webhop' => - array ( - ), - 'nym' => - array ( - ), - 'diskstation' => - array ( - ), - 'dscloud' => - array ( - ), - 'i234' => - array ( - ), - 'myds' => - array ( - ), - 'synology' => - array ( - ), - 'wedeploy' => - array ( - ), - 'yombo' => - array ( - ), - ), - 'host' => - array ( - 'cloudaccess' => - array ( - ), - 'freesite' => - array ( - ), - ), - 'cz' => - array ( - 'co' => - array ( - ), - 'realm' => - array ( - ), - 'e4' => - array ( - ), - 'blogspot' => - array ( - ), - 'metacentrum' => - array ( - 'cloud' => - array ( - ), - 'custom' => - array ( - ), - ), - ), - 'asia' => - array ( - 'cloudns' => - array ( - ), - ), - 'biz' => - array ( - 'cloudns' => - array ( - ), - 'dyndns' => - array ( - ), - 'for-better' => - array ( - ), - 'for-more' => - array ( - ), - 'for-some' => - array ( - ), - 'for-the' => - array ( - ), - 'selfip' => - array ( - ), - 'webhop' => - array ( - ), - 'mmafan' => - array ( - ), - 'myftp' => - array ( - ), - 'no-ip' => - array ( - ), - 'dscloud' => - array ( - ), - ), - 'club' => - array ( - 'cloudns' => - array ( - ), - ), - 'cc' => - array ( - 'cloudns' => - array ( - ), - 'ftpaccess' => - array ( - ), - 'game-server' => - array ( - ), - 'myphotos' => - array ( - ), - 'scrapping' => - array ( - ), - 'twmail' => - array ( - ), - 'fantasyleague' => - array ( - ), - ), - 'in' => - array ( - 'cloudns' => - array ( - ), - 'blogspot' => - array ( - ), - 'barsy' => - array ( - ), - ), - 'info' => - array ( - 'cloudns' => - array ( - ), - 'dynamic-dns' => - array ( - ), - 'dyndns' => - array ( - ), - 'barrel-of-knowledge' => - array ( - ), - 'barrell-of-knowledge' => - array ( - ), - 'for-our' => - array ( - ), - 'groks-the' => - array ( - ), - 'groks-this' => - array ( - ), - 'here-for-more' => - array ( - ), - 'knowsitall' => - array ( - ), - 'selfip' => - array ( - ), - 'webhop' => - array ( - ), - 'nsupdate' => - array ( - ), - 'dvrcam' => - array ( - ), - 'ilovecollege' => - array ( - ), - 'no-ip' => - array ( - ), - 'v-info' => - array ( - ), - ), - 'pro' => - array ( - 'cloudns' => - array ( - ), - ), - 'pw' => - array ( - 'cloudns' => - array ( - ), - 'nom' => - array ( - ), - ), - 'us' => - array ( - 'cloudns' => - array ( - ), - 'drud' => - array ( - ), - 'is-by' => - array ( - ), - 'land-4-sale' => - array ( - ), - 'stuff-4-sale' => - array ( - ), - 'golffan' => - array ( - ), - 'noip' => - array ( - ), - 'pointto' => - array ( - ), - 'de' => - array ( - 'lib' => - array ( - ), - ), - ), - 'no' => - array ( - 'co' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'is' => - array ( - 'cupcake' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'link' => - array ( - 'cyon' => - array ( - ), - 'mypep' => - array ( - ), - ), - 'site' => - array ( - 'cyon' => - array ( - ), - 'platformsh' => - array ( - '*' => - array ( - ), - ), - 'byen' => - array ( - ), - ), - 'dk' => - array ( - 'biz' => - array ( - ), - 'co' => - array ( - ), - 'firm' => - array ( - ), - 'reg' => - array ( - ), - 'store' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'fi' => - array ( - 'dy' => - array ( - ), - 'blogspot' => - array ( - ), - 'iki' => - array ( - ), - ), - 'tv' => - array ( - 'dyndns' => - array ( - ), - 'better-than' => - array ( - ), - 'on-the-web' => - array ( - ), - 'worse-than' => - array ( - ), - ), - 'cx' => - array ( - 'ath' => - array ( - ), - 'info' => - array ( - ), - ), - 'name' => - array ( - 'her' => - array ( - 'forgot' => - array ( - ), - ), - 'his' => - array ( - 'forgot' => - array ( - ), - ), - ), - 'nu' => - array ( - 'merseine' => - array ( - ), - 'mine' => - array ( - ), - 'shacknet' => - array ( - ), - 'nom' => - array ( - ), - ), - 'rocks' => - array ( - 'myddns' => - array ( - ), - 'lima-city' => - array ( - ), - 'webspace' => - array ( - ), - ), - 'xyz' => - array ( - 'blogsite' => - array ( - ), - 'fhapp' => - array ( - ), - ), - 'tw' => - array ( - 'com' => - array ( - 'mymailer' => - array ( - ), - ), - 'url' => - array ( - ), - 'blogspot' => - array ( - ), - 'nym' => - array ( - ), - ), - 'ru' => - array ( - 'adygeya' => - array ( - ), - 'bashkiria' => - array ( - ), - 'bir' => - array ( - ), - 'cbg' => - array ( - ), - 'com' => - array ( - ), - 'dagestan' => - array ( - ), - 'grozny' => - array ( - ), - 'kalmykia' => - array ( - ), - 'kustanai' => - array ( - ), - 'marine' => - array ( - ), - 'mordovia' => - array ( - ), - 'msk' => - array ( - ), - 'mytis' => - array ( - ), - 'nalchik' => - array ( - ), - 'nov' => - array ( - ), - 'pyatigorsk' => - array ( - ), - 'spb' => - array ( - ), - 'vladikavkaz' => - array ( - ), - 'vladimir' => - array ( - ), - 'blogspot' => - array ( - ), - 'cldmail' => - array ( - 'hb' => - array ( - ), - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'pp' => - array ( - ), - ), - 'su' => - array ( - 'abkhazia' => - array ( - ), - 'adygeya' => - array ( - ), - 'aktyubinsk' => - array ( - ), - 'arkhangelsk' => - array ( - ), - 'armenia' => - array ( - ), - 'ashgabad' => - array ( - ), - 'azerbaijan' => - array ( - ), - 'balashov' => - array ( - ), - 'bashkiria' => - array ( - ), - 'bryansk' => - array ( - ), - 'bukhara' => - array ( - ), - 'chimkent' => - array ( - ), - 'dagestan' => - array ( - ), - 'east-kazakhstan' => - array ( - ), - 'exnet' => - array ( - ), - 'georgia' => - array ( - ), - 'grozny' => - array ( - ), - 'ivanovo' => - array ( - ), - 'jambyl' => - array ( - ), - 'kalmykia' => - array ( - ), - 'kaluga' => - array ( - ), - 'karacol' => - array ( - ), - 'karaganda' => - array ( - ), - 'karelia' => - array ( - ), - 'khakassia' => - array ( - ), - 'krasnodar' => - array ( - ), - 'kurgan' => - array ( - ), - 'kustanai' => - array ( - ), - 'lenug' => - array ( - ), - 'mangyshlak' => - array ( - ), - 'mordovia' => - array ( - ), - 'msk' => - array ( - ), - 'murmansk' => - array ( - ), - 'nalchik' => - array ( - ), - 'navoi' => - array ( - ), - 'north-kazakhstan' => - array ( - ), - 'nov' => - array ( - ), - 'obninsk' => - array ( - ), - 'penza' => - array ( - ), - 'pokrovsk' => - array ( - ), - 'sochi' => - array ( - ), - 'spb' => - array ( - ), - 'tashkent' => - array ( - ), - 'termez' => - array ( - ), - 'togliatti' => - array ( - ), - 'troitsk' => - array ( - ), - 'tselinograd' => - array ( - ), - 'tula' => - array ( - ), - 'tuva' => - array ( - ), - 'vladikavkaz' => - array ( - ), - 'vladimir' => - array ( - ), - 'vologda' => - array ( - ), - 'nym' => - array ( - ), - ), - 'fr' => - array ( - 'fbx-os' => - array ( - ), - 'fbxos' => - array ( - ), - 'freebox-os' => - array ( - ), - 'freeboxos' => - array ( - ), - 'blogspot' => - array ( - ), - 'on-web' => - array ( - ), - 'chirurgiens-dentistes-en-france' => - array ( - ), - ), - 'cloud' => - array ( - 'myfusion' => - array ( - ), - 'statics' => - array ( - '*' => - array ( - ), - ), - 'magentosite' => - array ( - '*' => - array ( - ), - ), - 'vapor' => - array ( - ), - 'sensiosite' => - array ( - '*' => - array ( - ), - ), - 'trafficplex' => - array ( - ), - ), - 'at' => - array ( - 'futurecms' => - array ( - '*' => - array ( - ), - ), - 'futurehosting' => - array ( - ), - 'futuremailing' => - array ( - ), - 'ortsinfo' => - array ( - 'ex' => - array ( - '*' => - array ( - ), - ), - 'kunden' => - array ( - '*' => - array ( - ), - ), - ), - 'co' => - array ( - 'blogspot' => - array ( - ), - ), - 'biz' => - array ( - ), - 'info' => - array ( - ), - 'priv' => - array ( - ), - '12hp' => - array ( - ), - '2ix' => - array ( - ), - '4lima' => - array ( - ), - 'lima-city' => - array ( - ), - ), - 'uk' => - array ( - 'gov' => - array ( - 'service' => - array ( - ), - 'homeoffice' => - array ( - ), - ), - 'co' => - array ( - 'blogspot' => - array ( - ), - 'no-ip' => - array ( - ), - 'wellbeingzone' => - array ( - ), - ), - ), - 'im' => - array ( - 'ro' => - array ( - ), - 'nom' => - array ( - ), - ), - 'ro' => - array ( - 'shop' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'ae' => - array ( - 'blogspot' => - array ( - ), - 'nom' => - array ( - ), - ), - 'al' => - array ( - 'blogspot' => - array ( - ), - 'nom' => - array ( - ), - ), - 'am' => - array ( - 'blogspot' => - array ( - ), - ), - 'ba' => - array ( - 'blogspot' => - array ( - ), - ), - 'be' => - array ( - 'blogspot' => - array ( - ), - 'transurl' => - array ( - '*' => - array ( - ), - ), - ), - 'bg' => - array ( - 'blogspot' => - array ( - ), - 'barsy' => - array ( - ), - ), - 'bj' => - array ( - 'blogspot' => - array ( - ), - ), - 'cf' => - array ( - 'blogspot' => - array ( - ), - ), - 'cl' => - array ( - 'blogspot' => - array ( - ), - 'nom' => - array ( - ), - ), - 'id' => - array ( - 'co' => - array ( - 'blogspot' => - array ( - ), - ), - ), - 'il' => - array ( - 'co' => - array ( - 'blogspot' => - array ( - ), - ), - ), - 'ke' => - array ( - 'co' => - array ( - 'blogspot' => - array ( - ), - ), - ), - 'nz' => - array ( - 'co' => - array ( - 'blogspot' => - array ( - ), - ), - 'nym' => - array ( - ), - ), - 'za' => - array ( - 'co' => - array ( - 'blogspot' => - array ( - ), - ), - ), - 'ar' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - ), - 'au' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - ), - 'br' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - 'leg' => - array ( - 'ac' => - array ( - ), - 'al' => - array ( - ), - 'am' => - array ( - ), - 'ap' => - array ( - ), - 'ba' => - array ( - ), - 'ce' => - array ( - ), - 'df' => - array ( - ), - 'es' => - array ( - ), - 'go' => - array ( - ), - 'ma' => - array ( - ), - 'mg' => - array ( - ), - 'ms' => - array ( - ), - 'mt' => - array ( - ), - 'pa' => - array ( - ), - 'pb' => - array ( - ), - 'pe' => - array ( - ), - 'pi' => - array ( - ), - 'pr' => - array ( - ), - 'rj' => - array ( - ), - 'rn' => - array ( - ), - 'ro' => - array ( - ), - 'rr' => - array ( - ), - 'rs' => - array ( - ), - 'sc' => - array ( - ), - 'se' => - array ( - ), - 'sp' => - array ( - ), - 'to' => - array ( - ), - ), - ), - 'by' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - 'nym' => - array ( - ), - ), - 'co' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - 'nodum' => - array ( - ), - ), - 'cy' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - ), - 'ee' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - ), - 'eg' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - ), - 'es' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - ), - 'mt' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - ), - 'ng' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - ), - 'tr' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - ), - 'uy' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - 'nom' => - array ( - ), - ), - 'cv' => - array ( - 'blogspot' => - array ( - ), - ), - 'gr' => - array ( - 'blogspot' => - array ( - ), - 'nym' => - array ( - ), - ), - 'hk' => - array ( - 'blogspot' => - array ( - ), - 'ltd' => - array ( - ), - 'inc' => - array ( - ), - ), - 'hr' => - array ( - 'blogspot' => - array ( - ), - ), - 'hu' => - array ( - 'blogspot' => - array ( - ), - ), - 'ie' => - array ( - 'blogspot' => - array ( - ), - ), - 'it' => - array ( - 'blogspot' => - array ( - ), - ), - 'jp' => - array ( - 'blogspot' => - array ( - ), - ), - 'kr' => - array ( - 'blogspot' => - array ( - ), - ), - 'li' => - array ( - 'blogspot' => - array ( - ), - 'nom' => - array ( - ), - 'nym' => - array ( - ), - ), - 'lt' => - array ( - 'blogspot' => - array ( - ), - 'nym' => - array ( - ), - ), - 'lu' => - array ( - 'blogspot' => - array ( - ), - 'nym' => - array ( - ), - ), - 'md' => - array ( - 'blogspot' => - array ( - ), - ), - 'mk' => - array ( - 'blogspot' => - array ( - ), - 'nom' => - array ( - ), - ), - 'mr' => - array ( - 'blogspot' => - array ( - ), - ), - 'mx' => - array ( - 'blogspot' => - array ( - ), - 'nym' => - array ( - ), - ), - 'my' => - array ( - 'blogspot' => - array ( - ), - ), - 'pe' => - array ( - 'blogspot' => - array ( - ), - 'nym' => - array ( - ), - ), - 'pt' => - array ( - 'blogspot' => - array ( - ), - 'nym' => - array ( - ), - ), - 'qa' => - array ( - 'blogspot' => - array ( - ), - 'nom' => - array ( - ), - ), - 're' => - array ( - 'blogspot' => - array ( - ), - ), - 'rs' => - array ( - 'blogspot' => - array ( - ), - 'nom' => - array ( - ), - ), - 'sg' => - array ( - 'blogspot' => - array ( - ), - ), - 'si' => - array ( - 'blogspot' => - array ( - ), - 'nom' => - array ( - ), - ), - 'sk' => - array ( - 'blogspot' => - array ( - ), - 'nym' => - array ( - ), - ), - 'sn' => - array ( - 'blogspot' => - array ( - ), - ), - 'td' => - array ( - 'blogspot' => - array ( - ), - ), - 'ug' => - array ( - 'blogspot' => - array ( - ), - 'nom' => - array ( - ), - ), - 'vn' => - array ( - 'blogspot' => - array ( - ), - ), - 'goog' => - array ( - 'cloud' => - array ( - ), - ), - 'sh' => - array ( - 'hashbang' => - array ( - ), - 'platform' => - array ( - '*' => - array ( - ), - ), - 'wedeploy' => - array ( - ), - 'now' => - array ( - ), - ), - 'zone' => - array ( - 'triton' => - array ( - '*' => - array ( - ), - ), - 'lima' => - array ( - ), - ), - 'systems' => - array ( - 'knightpoint' => - array ( - ), - ), - 'krd' => - array ( - 'co' => - array ( - ), - 'edu' => - array ( - ), - ), - 'bs' => - array ( - 'we' => - array ( - ), - ), - 'online' => - array ( - 'barsy' => - array ( - ), - ), - 'support' => - array ( - 'barsy' => - array ( - ), - ), - 'ovh' => - array ( - 'nerdpol' => - array ( - ), - ), - 'mn' => - array ( - 'nyc' => - array ( - ), - ), - 'ai' => - array ( - 'nom' => - array ( - ), - ), - 'gd' => - array ( - 'nom' => - array ( - ), - ), - 'gl' => - array ( - 'nom' => - array ( - ), - ), - 'gt' => - array ( - 'nom' => - array ( - ), - ), - 'hn' => - array ( - 'nom' => - array ( - ), - ), - 'kz' => - array ( - 'nym' => - array ( - ), - ), - 'sx' => - array ( - 'nym' => - array ( - ), - ), - 'vc' => - array ( - 'nom' => - array ( - ), - ), - 'vg' => - array ( - 'nom' => - array ( - ), - ), - 'gg' => - array ( - 'cya' => - array ( - ), - ), - 'hosting' => - array ( - 'opencraft' => - array ( - ), - ), - 'lc' => - array ( - 'oy' => - array ( - ), - ), - 'fit' => - array ( - 'ptplus' => - array ( - ), - ), - 'land' => - array ( - 'static' => - array ( - 'dev' => - array ( - ), - 'sites' => - array ( - ), - ), - ), - 'space' => - array ( - 'stackspace' => - array ( - ), - 'uber' => - array ( - ), - 'xs4all' => - array ( - ), - ), - 'farm' => - array ( - 'storj' => - array ( - ), - ), - 'mobi' => - array ( - 'dscloud' => - array ( - ), - ), - 'to' => - array ( - 'vpnplus' => - array ( - ), - ), - 'cool' => - array ( - 'de' => - array ( - ), - ), - 'pictures' => - array ( - 1337 => - array ( - ), - ), - 'rip' => - array ( - 'clan' => - array ( - ), - ), - 'management' => - array ( - 'router' => - array ( - ), - ), - 'faith' => - array ( - 'ybo' => - array ( - ), - ), - 'one' => - array ( - 'homelink' => - array ( - ), - ), - 'party' => - array ( - 'ybo' => - array ( - ), - ), - 'review' => - array ( - 'ybo' => - array ( - ), - ), - 'science' => - array ( - 'ybo' => - array ( - ), - ), - 'trade' => - array ( - 'ybo' => - array ( - ), - ), -); \ No newline at end of file diff --git a/data/public-suffix-list.php b/data/public-suffix-list.php deleted file mode 100644 index d63dbabf..00000000 --- a/data/public-suffix-list.php +++ /dev/null @@ -1,25436 +0,0 @@ - - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'mil' => - array ( - ), - 'org' => - array ( - ), - ), - 'ad' => - array ( - 'nom' => - array ( - ), - ), - 'ae' => - array ( - 'co' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'sch' => - array ( - ), - 'ac' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'blogspot' => - array ( - ), - 'nom' => - array ( - ), - ), - 'aero' => - array ( - 'accident-investigation' => - array ( - ), - 'accident-prevention' => - array ( - ), - 'aerobatic' => - array ( - ), - 'aeroclub' => - array ( - ), - 'aerodrome' => - array ( - ), - 'agents' => - array ( - ), - 'aircraft' => - array ( - ), - 'airline' => - array ( - ), - 'airport' => - array ( - ), - 'air-surveillance' => - array ( - ), - 'airtraffic' => - array ( - ), - 'air-traffic-control' => - array ( - ), - 'ambulance' => - array ( - ), - 'amusement' => - array ( - ), - 'association' => - array ( - ), - 'author' => - array ( - ), - 'ballooning' => - array ( - ), - 'broker' => - array ( - ), - 'caa' => - array ( - ), - 'cargo' => - array ( - ), - 'catering' => - array ( - ), - 'certification' => - array ( - ), - 'championship' => - array ( - ), - 'charter' => - array ( - ), - 'civilaviation' => - array ( - ), - 'club' => - array ( - ), - 'conference' => - array ( - ), - 'consultant' => - array ( - ), - 'consulting' => - array ( - ), - 'control' => - array ( - ), - 'council' => - array ( - ), - 'crew' => - array ( - ), - 'design' => - array ( - ), - 'dgca' => - array ( - ), - 'educator' => - array ( - ), - 'emergency' => - array ( - ), - 'engine' => - array ( - ), - 'engineer' => - array ( - ), - 'entertainment' => - array ( - ), - 'equipment' => - array ( - ), - 'exchange' => - array ( - ), - 'express' => - array ( - ), - 'federation' => - array ( - ), - 'flight' => - array ( - ), - 'freight' => - array ( - ), - 'fuel' => - array ( - ), - 'gliding' => - array ( - ), - 'government' => - array ( - ), - 'groundhandling' => - array ( - ), - 'group' => - array ( - ), - 'hanggliding' => - array ( - ), - 'homebuilt' => - array ( - ), - 'insurance' => - array ( - ), - 'journal' => - array ( - ), - 'journalist' => - array ( - ), - 'leasing' => - array ( - ), - 'logistics' => - array ( - ), - 'magazine' => - array ( - ), - 'maintenance' => - array ( - ), - 'media' => - array ( - ), - 'microlight' => - array ( - ), - 'modelling' => - array ( - ), - 'navigation' => - array ( - ), - 'parachuting' => - array ( - ), - 'paragliding' => - array ( - ), - 'passenger-association' => - array ( - ), - 'pilot' => - array ( - ), - 'press' => - array ( - ), - 'production' => - array ( - ), - 'recreation' => - array ( - ), - 'repbody' => - array ( - ), - 'res' => - array ( - ), - 'research' => - array ( - ), - 'rotorcraft' => - array ( - ), - 'safety' => - array ( - ), - 'scientist' => - array ( - ), - 'services' => - array ( - ), - 'show' => - array ( - ), - 'skydiving' => - array ( - ), - 'software' => - array ( - ), - 'student' => - array ( - ), - 'trader' => - array ( - ), - 'trading' => - array ( - ), - 'trainer' => - array ( - ), - 'union' => - array ( - ), - 'workinggroup' => - array ( - ), - 'works' => - array ( - ), - ), - 'af' => - array ( - 'gov' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'edu' => - array ( - ), - ), - 'ag' => - array ( - 'com' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'co' => - array ( - ), - 'nom' => - array ( - ), - ), - 'ai' => - array ( - 'off' => - array ( - ), - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'nom' => - array ( - ), - ), - 'al' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'blogspot' => - array ( - ), - 'nom' => - array ( - ), - ), - 'am' => - array ( - 'blogspot' => - array ( - ), - ), - 'ao' => - array ( - 'ed' => - array ( - ), - 'gv' => - array ( - ), - 'og' => - array ( - ), - 'co' => - array ( - ), - 'pb' => - array ( - ), - 'it' => - array ( - ), - ), - 'aq' => - array ( - ), - 'ar' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - 'edu' => - array ( - ), - 'gob' => - array ( - ), - 'gov' => - array ( - ), - 'int' => - array ( - ), - 'mil' => - array ( - ), - 'musica' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'tur' => - array ( - ), - ), - 'arpa' => - array ( - 'e164' => - array ( - ), - 'in-addr' => - array ( - ), - 'ip6' => - array ( - ), - 'iris' => - array ( - ), - 'uri' => - array ( - ), - 'urn' => - array ( - ), - ), - 'as' => - array ( - 'gov' => - array ( - ), - ), - 'asia' => - array ( - 'cloudns' => - array ( - ), - ), - 'at' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - 'blogspot' => - array ( - ), - ), - 'gv' => - array ( - ), - 'or' => - array ( - ), - 'futurecms' => - array ( - '*' => - array ( - ), - ), - 'futurehosting' => - array ( - ), - 'futuremailing' => - array ( - ), - 'ortsinfo' => - array ( - 'ex' => - array ( - '*' => - array ( - ), - ), - 'kunden' => - array ( - '*' => - array ( - ), - ), - ), - 'biz' => - array ( - ), - 'info' => - array ( - ), - 'priv' => - array ( - ), - '12hp' => - array ( - ), - '2ix' => - array ( - ), - '4lima' => - array ( - ), - 'lima-city' => - array ( - ), - ), - 'au' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - 'act' => - array ( - ), - 'nsw' => - array ( - ), - 'nt' => - array ( - ), - 'qld' => - array ( - ), - 'sa' => - array ( - ), - 'tas' => - array ( - ), - 'vic' => - array ( - ), - 'wa' => - array ( - ), - ), - 'gov' => - array ( - 'qld' => - array ( - ), - 'sa' => - array ( - ), - 'tas' => - array ( - ), - 'vic' => - array ( - ), - 'wa' => - array ( - ), - ), - 'asn' => - array ( - ), - 'id' => - array ( - ), - 'info' => - array ( - ), - 'conf' => - array ( - ), - 'oz' => - array ( - ), - 'act' => - array ( - ), - 'nsw' => - array ( - ), - 'nt' => - array ( - ), - 'qld' => - array ( - ), - 'sa' => - array ( - ), - 'tas' => - array ( - ), - 'vic' => - array ( - ), - 'wa' => - array ( - ), - ), - 'aw' => - array ( - 'com' => - array ( - ), - ), - 'ax' => - array ( - ), - 'az' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'int' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'info' => - array ( - ), - 'pp' => - array ( - ), - 'mil' => - array ( - ), - 'name' => - array ( - ), - 'pro' => - array ( - ), - 'biz' => - array ( - ), - ), - 'ba' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'bb' => - array ( - 'biz' => - array ( - ), - 'co' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'info' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'store' => - array ( - ), - 'tv' => - array ( - ), - ), - 'bd' => - array ( - '*' => - array ( - ), - ), - 'be' => - array ( - 'ac' => - array ( - ), - 'blogspot' => - array ( - ), - 'transurl' => - array ( - '*' => - array ( - ), - ), - ), - 'bf' => - array ( - 'gov' => - array ( - ), - ), - 'bg' => - array ( - 'a' => - array ( - ), - 'b' => - array ( - ), - 'c' => - array ( - ), - 'd' => - array ( - ), - 'e' => - array ( - ), - 'f' => - array ( - ), - 'g' => - array ( - ), - 'h' => - array ( - ), - 'i' => - array ( - ), - 'j' => - array ( - ), - 'k' => - array ( - ), - 'l' => - array ( - ), - 'm' => - array ( - ), - 'n' => - array ( - ), - 'o' => - array ( - ), - 'p' => - array ( - ), - 'q' => - array ( - ), - 'r' => - array ( - ), - 's' => - array ( - ), - 't' => - array ( - ), - 'u' => - array ( - ), - 'v' => - array ( - ), - 'w' => - array ( - ), - 'x' => - array ( - ), - 'y' => - array ( - ), - 'z' => - array ( - ), - 0 => - array ( - ), - 1 => - array ( - ), - 2 => - array ( - ), - 3 => - array ( - ), - 4 => - array ( - ), - 5 => - array ( - ), - 6 => - array ( - ), - 7 => - array ( - ), - 8 => - array ( - ), - 9 => - array ( - ), - 'blogspot' => - array ( - ), - 'barsy' => - array ( - ), - ), - 'bh' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - ), - 'bi' => - array ( - 'co' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'or' => - array ( - ), - 'org' => - array ( - ), - ), - 'biz' => - array ( - 'cloudns' => - array ( - ), - 'dyndns' => - array ( - ), - 'for-better' => - array ( - ), - 'for-more' => - array ( - ), - 'for-some' => - array ( - ), - 'for-the' => - array ( - ), - 'selfip' => - array ( - ), - 'webhop' => - array ( - ), - 'mmafan' => - array ( - ), - 'myftp' => - array ( - ), - 'no-ip' => - array ( - ), - 'dscloud' => - array ( - ), - ), - 'bj' => - array ( - 'asso' => - array ( - ), - 'barreau' => - array ( - ), - 'gouv' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'bm' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'bn' => - array ( - '*' => - array ( - ), - ), - 'bo' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'gob' => - array ( - ), - 'int' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'mil' => - array ( - ), - 'tv' => - array ( - ), - ), - 'br' => - array ( - 'abc' => - array ( - ), - 'adm' => - array ( - ), - 'adv' => - array ( - ), - 'agr' => - array ( - ), - 'aju' => - array ( - ), - 'am' => - array ( - ), - 'aparecida' => - array ( - ), - 'arq' => - array ( - ), - 'art' => - array ( - ), - 'ato' => - array ( - ), - 'b' => - array ( - ), - 'belem' => - array ( - ), - 'bio' => - array ( - ), - 'blog' => - array ( - ), - 'bmd' => - array ( - ), - 'bsb' => - array ( - ), - 'cim' => - array ( - ), - 'cng' => - array ( - ), - 'cnt' => - array ( - ), - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - 'coop' => - array ( - ), - 'cri' => - array ( - ), - 'cuiaba' => - array ( - ), - 'def' => - array ( - ), - 'ecn' => - array ( - ), - 'eco' => - array ( - ), - 'edu' => - array ( - ), - 'emp' => - array ( - ), - 'eng' => - array ( - ), - 'esp' => - array ( - ), - 'etc' => - array ( - ), - 'eti' => - array ( - ), - 'far' => - array ( - ), - 'flog' => - array ( - ), - 'floripa' => - array ( - ), - 'fortal' => - array ( - ), - 'fm' => - array ( - ), - 'fnd' => - array ( - ), - 'fot' => - array ( - ), - 'fst' => - array ( - ), - 'g12' => - array ( - ), - 'ggf' => - array ( - ), - 'gov' => - array ( - 'ac' => - array ( - ), - 'al' => - array ( - ), - 'am' => - array ( - ), - 'ap' => - array ( - ), - 'ba' => - array ( - ), - 'ce' => - array ( - ), - 'df' => - array ( - ), - 'es' => - array ( - ), - 'go' => - array ( - ), - 'ma' => - array ( - ), - 'mg' => - array ( - ), - 'ms' => - array ( - ), - 'mt' => - array ( - ), - 'pa' => - array ( - ), - 'pb' => - array ( - ), - 'pe' => - array ( - ), - 'pi' => - array ( - ), - 'pr' => - array ( - ), - 'rj' => - array ( - ), - 'rn' => - array ( - ), - 'ro' => - array ( - ), - 'rr' => - array ( - ), - 'rs' => - array ( - ), - 'sc' => - array ( - ), - 'se' => - array ( - ), - 'sp' => - array ( - ), - 'to' => - array ( - ), - ), - 'gru' => - array ( - ), - 'imb' => - array ( - ), - 'ind' => - array ( - ), - 'inf' => - array ( - ), - 'jampa' => - array ( - ), - 'jor' => - array ( - ), - 'jus' => - array ( - ), - 'leg' => - array ( - 'ac' => - array ( - ), - 'al' => - array ( - ), - 'am' => - array ( - ), - 'ap' => - array ( - ), - 'ba' => - array ( - ), - 'ce' => - array ( - ), - 'df' => - array ( - ), - 'es' => - array ( - ), - 'go' => - array ( - ), - 'ma' => - array ( - ), - 'mg' => - array ( - ), - 'ms' => - array ( - ), - 'mt' => - array ( - ), - 'pa' => - array ( - ), - 'pb' => - array ( - ), - 'pe' => - array ( - ), - 'pi' => - array ( - ), - 'pr' => - array ( - ), - 'rj' => - array ( - ), - 'rn' => - array ( - ), - 'ro' => - array ( - ), - 'rr' => - array ( - ), - 'rs' => - array ( - ), - 'sc' => - array ( - ), - 'se' => - array ( - ), - 'sp' => - array ( - ), - 'to' => - array ( - ), - ), - 'lel' => - array ( - ), - 'londrina' => - array ( - ), - 'macapa' => - array ( - ), - 'maceio' => - array ( - ), - 'mat' => - array ( - ), - 'med' => - array ( - ), - 'mil' => - array ( - ), - 'mp' => - array ( - ), - 'mus' => - array ( - ), - 'natal' => - array ( - ), - 'net' => - array ( - ), - 'niteroi' => - array ( - ), - 'nom' => - array ( - '*' => - array ( - ), - ), - 'not' => - array ( - ), - 'ntr' => - array ( - ), - 'odo' => - array ( - ), - 'org' => - array ( - ), - 'osasco' => - array ( - ), - 'palmas' => - array ( - ), - 'poa' => - array ( - ), - 'ppg' => - array ( - ), - 'pro' => - array ( - ), - 'psc' => - array ( - ), - 'psi' => - array ( - ), - 'qsl' => - array ( - ), - 'radio' => - array ( - ), - 'rec' => - array ( - ), - 'recife' => - array ( - ), - 'riobranco' => - array ( - ), - 'sjc' => - array ( - ), - 'slg' => - array ( - ), - 'srv' => - array ( - ), - 'taxi' => - array ( - ), - 'teo' => - array ( - ), - 'tmp' => - array ( - ), - 'trd' => - array ( - ), - 'tur' => - array ( - ), - 'tv' => - array ( - ), - 'udi' => - array ( - ), - 'vet' => - array ( - ), - 'vix' => - array ( - ), - 'vlog' => - array ( - ), - 'wiki' => - array ( - ), - 'zlg' => - array ( - ), - ), - 'bs' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'we' => - array ( - ), - ), - 'bt' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'bv' => - array ( - ), - 'bw' => - array ( - 'co' => - array ( - ), - 'org' => - array ( - ), - ), - 'by' => - array ( - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - 'of' => - array ( - ), - 'nym' => - array ( - ), - ), - 'bz' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'za' => - array ( - ), - 'nym' => - array ( - ), - ), - 'ca' => - array ( - 'ab' => - array ( - ), - 'bc' => - array ( - ), - 'mb' => - array ( - ), - 'nb' => - array ( - ), - 'nf' => - array ( - ), - 'nl' => - array ( - ), - 'ns' => - array ( - ), - 'nt' => - array ( - ), - 'nu' => - array ( - ), - 'on' => - array ( - ), - 'pe' => - array ( - ), - 'qc' => - array ( - ), - 'sk' => - array ( - ), - 'yk' => - array ( - ), - 'gc' => - array ( - ), - 'awdev' => - array ( - '*' => - array ( - ), - ), - 'co' => - array ( - ), - 'blogspot' => - array ( - ), - 'no-ip' => - array ( - ), - ), - 'cat' => - array ( - ), - 'cc' => - array ( - 'cloudns' => - array ( - ), - 'ftpaccess' => - array ( - ), - 'game-server' => - array ( - ), - 'myphotos' => - array ( - ), - 'scrapping' => - array ( - ), - 'twmail' => - array ( - ), - 'fantasyleague' => - array ( - ), - ), - 'cd' => - array ( - 'gov' => - array ( - ), - ), - 'cf' => - array ( - 'blogspot' => - array ( - ), - ), - 'cg' => - array ( - ), - 'ch' => - array ( - 'square7' => - array ( - ), - 'blogspot' => - array ( - ), - 'gotdns' => - array ( - ), - '12hp' => - array ( - ), - '2ix' => - array ( - ), - '4lima' => - array ( - ), - 'lima-city' => - array ( - ), - ), - 'ci' => - array ( - 'org' => - array ( - ), - 'or' => - array ( - ), - 'com' => - array ( - ), - 'co' => - array ( - ), - 'edu' => - array ( - ), - 'ed' => - array ( - ), - 'ac' => - array ( - ), - 'net' => - array ( - ), - 'go' => - array ( - ), - 'asso' => - array ( - ), - 'xn--aroport-bya' => - array ( - ), - 'int' => - array ( - ), - 'presse' => - array ( - ), - 'md' => - array ( - ), - 'gouv' => - array ( - ), - ), - 'ck' => - array ( - '*' => - array ( - ), - 'www' => - array ( - '!' => '', - ), - ), - 'cl' => - array ( - 'gov' => - array ( - ), - 'gob' => - array ( - ), - 'co' => - array ( - ), - 'mil' => - array ( - ), - 'blogspot' => - array ( - ), - 'nom' => - array ( - ), - ), - 'cm' => - array ( - 'co' => - array ( - ), - 'com' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - ), - 'cn' => - array ( - 'ac' => - array ( - ), - 'com' => - array ( - 'amazonaws' => - array ( - 'compute' => - array ( - '*' => - array ( - ), - ), - 'eb' => - array ( - 'cn-north-1' => - array ( - ), - ), - 'elb' => - array ( - '*' => - array ( - ), - ), - 'cn-north-1' => - array ( - 's3' => - array ( - ), - ), - ), - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'mil' => - array ( - ), - 'xn--55qx5d' => - array ( - ), - 'xn--io0a7i' => - array ( - ), - 'xn--od0alg' => - array ( - ), - 'ah' => - array ( - ), - 'bj' => - array ( - ), - 'cq' => - array ( - ), - 'fj' => - array ( - ), - 'gd' => - array ( - ), - 'gs' => - array ( - ), - 'gz' => - array ( - ), - 'gx' => - array ( - ), - 'ha' => - array ( - ), - 'hb' => - array ( - ), - 'he' => - array ( - ), - 'hi' => - array ( - ), - 'hl' => - array ( - ), - 'hn' => - array ( - ), - 'jl' => - array ( - ), - 'js' => - array ( - ), - 'jx' => - array ( - ), - 'ln' => - array ( - ), - 'nm' => - array ( - ), - 'nx' => - array ( - ), - 'qh' => - array ( - ), - 'sc' => - array ( - ), - 'sd' => - array ( - ), - 'sh' => - array ( - ), - 'sn' => - array ( - ), - 'sx' => - array ( - ), - 'tj' => - array ( - ), - 'xj' => - array ( - ), - 'xz' => - array ( - ), - 'yn' => - array ( - ), - 'zj' => - array ( - ), - 'hk' => - array ( - ), - 'mo' => - array ( - ), - 'tw' => - array ( - ), - ), - 'co' => - array ( - 'arts' => - array ( - ), - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - 'edu' => - array ( - ), - 'firm' => - array ( - ), - 'gov' => - array ( - ), - 'info' => - array ( - ), - 'int' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'nom' => - array ( - ), - 'org' => - array ( - ), - 'rec' => - array ( - ), - 'web' => - array ( - ), - 'nodum' => - array ( - ), - ), - 'com' => - array ( - 'amazonaws' => - array ( - 'compute' => - array ( - '*' => - array ( - ), - ), - 'compute-1' => - array ( - '*' => - array ( - ), - ), - 'us-east-1' => - array ( - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - ), - 'elb' => - array ( - '*' => - array ( - ), - ), - 's3' => - array ( - ), - 's3-ap-northeast-1' => - array ( - ), - 's3-ap-northeast-2' => - array ( - ), - 's3-ap-south-1' => - array ( - ), - 's3-ap-southeast-1' => - array ( - ), - 's3-ap-southeast-2' => - array ( - ), - 's3-ca-central-1' => - array ( - ), - 's3-eu-central-1' => - array ( - ), - 's3-eu-west-1' => - array ( - ), - 's3-eu-west-2' => - array ( - ), - 's3-external-1' => - array ( - ), - 's3-fips-us-gov-west-1' => - array ( - ), - 's3-sa-east-1' => - array ( - ), - 's3-us-gov-west-1' => - array ( - ), - 's3-us-east-2' => - array ( - ), - 's3-us-west-1' => - array ( - ), - 's3-us-west-2' => - array ( - ), - 'ap-northeast-2' => - array ( - 's3' => - array ( - ), - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - 's3-website' => - array ( - ), - ), - 'ap-south-1' => - array ( - 's3' => - array ( - ), - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - 's3-website' => - array ( - ), - ), - 'ca-central-1' => - array ( - 's3' => - array ( - ), - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - 's3-website' => - array ( - ), - ), - 'eu-central-1' => - array ( - 's3' => - array ( - ), - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - 's3-website' => - array ( - ), - ), - 'eu-west-2' => - array ( - 's3' => - array ( - ), - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - 's3-website' => - array ( - ), - ), - 'us-east-2' => - array ( - 's3' => - array ( - ), - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - 's3-website' => - array ( - ), - ), - 'ap-northeast-1' => - array ( - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - ), - 'ap-southeast-1' => - array ( - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - ), - 'ap-southeast-2' => - array ( - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - ), - 'eu-west-1' => - array ( - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - ), - 'sa-east-1' => - array ( - 'dualstack' => - array ( - 's3' => - array ( - ), - ), - ), - 's3-website-us-east-1' => - array ( - ), - 's3-website-us-west-1' => - array ( - ), - 's3-website-us-west-2' => - array ( - ), - 's3-website-ap-northeast-1' => - array ( - ), - 's3-website-ap-southeast-1' => - array ( - ), - 's3-website-ap-southeast-2' => - array ( - ), - 's3-website-eu-west-1' => - array ( - ), - 's3-website-sa-east-1' => - array ( - ), - ), - 'elasticbeanstalk' => - array ( - 'ap-northeast-1' => - array ( - ), - 'ap-northeast-2' => - array ( - ), - 'ap-south-1' => - array ( - ), - 'ap-southeast-1' => - array ( - ), - 'ap-southeast-2' => - array ( - ), - 'ca-central-1' => - array ( - ), - 'eu-central-1' => - array ( - ), - 'eu-west-1' => - array ( - ), - 'eu-west-2' => - array ( - ), - 'sa-east-1' => - array ( - ), - 'us-east-1' => - array ( - ), - 'us-east-2' => - array ( - ), - 'us-gov-west-1' => - array ( - ), - 'us-west-1' => - array ( - ), - 'us-west-2' => - array ( - ), - ), - 'on-aptible' => - array ( - ), - 'myasustor' => - array ( - ), - 'betainabox' => - array ( - ), - 'bplaced' => - array ( - ), - 'ar' => - array ( - ), - 'br' => - array ( - ), - 'cn' => - array ( - ), - 'de' => - array ( - ), - 'eu' => - array ( - ), - 'gb' => - array ( - ), - 'hu' => - array ( - ), - 'jpn' => - array ( - ), - 'kr' => - array ( - ), - 'mex' => - array ( - ), - 'no' => - array ( - ), - 'qc' => - array ( - ), - 'ru' => - array ( - ), - 'sa' => - array ( - ), - 'se' => - array ( - ), - 'uk' => - array ( - ), - 'us' => - array ( - ), - 'uy' => - array ( - ), - 'za' => - array ( - ), - 'africa' => - array ( - ), - 'gr' => - array ( - ), - 'co' => - array ( - ), - 'xenapponazure' => - array ( - ), - 'jdevcloud' => - array ( - ), - 'wpdevcloud' => - array ( - ), - 'cloudcontrolled' => - array ( - ), - 'cloudcontrolapp' => - array ( - ), - 'drayddns' => - array ( - ), - 'dreamhosters' => - array ( - ), - 'mydrobo' => - array ( - ), - 'dyndns-at-home' => - array ( - ), - 'dyndns-at-work' => - array ( - ), - 'dyndns-blog' => - array ( - ), - 'dyndns-free' => - array ( - ), - 'dyndns-home' => - array ( - ), - 'dyndns-ip' => - array ( - ), - 'dyndns-mail' => - array ( - ), - 'dyndns-office' => - array ( - ), - 'dyndns-pics' => - array ( - ), - 'dyndns-remote' => - array ( - ), - 'dyndns-server' => - array ( - ), - 'dyndns-web' => - array ( - ), - 'dyndns-wiki' => - array ( - ), - 'dyndns-work' => - array ( - ), - 'blogdns' => - array ( - ), - 'cechire' => - array ( - ), - 'dnsalias' => - array ( - ), - 'dnsdojo' => - array ( - ), - 'doesntexist' => - array ( - ), - 'dontexist' => - array ( - ), - 'doomdns' => - array ( - ), - 'dyn-o-saur' => - array ( - ), - 'dynalias' => - array ( - ), - 'est-a-la-maison' => - array ( - ), - 'est-a-la-masion' => - array ( - ), - 'est-le-patron' => - array ( - ), - 'est-mon-blogueur' => - array ( - ), - 'from-ak' => - array ( - ), - 'from-al' => - array ( - ), - 'from-ar' => - array ( - ), - 'from-ca' => - array ( - ), - 'from-ct' => - array ( - ), - 'from-dc' => - array ( - ), - 'from-de' => - array ( - ), - 'from-fl' => - array ( - ), - 'from-ga' => - array ( - ), - 'from-hi' => - array ( - ), - 'from-ia' => - array ( - ), - 'from-id' => - array ( - ), - 'from-il' => - array ( - ), - 'from-in' => - array ( - ), - 'from-ks' => - array ( - ), - 'from-ky' => - array ( - ), - 'from-ma' => - array ( - ), - 'from-md' => - array ( - ), - 'from-mi' => - array ( - ), - 'from-mn' => - array ( - ), - 'from-mo' => - array ( - ), - 'from-ms' => - array ( - ), - 'from-mt' => - array ( - ), - 'from-nc' => - array ( - ), - 'from-nd' => - array ( - ), - 'from-ne' => - array ( - ), - 'from-nh' => - array ( - ), - 'from-nj' => - array ( - ), - 'from-nm' => - array ( - ), - 'from-nv' => - array ( - ), - 'from-oh' => - array ( - ), - 'from-ok' => - array ( - ), - 'from-or' => - array ( - ), - 'from-pa' => - array ( - ), - 'from-pr' => - array ( - ), - 'from-ri' => - array ( - ), - 'from-sc' => - array ( - ), - 'from-sd' => - array ( - ), - 'from-tn' => - array ( - ), - 'from-tx' => - array ( - ), - 'from-ut' => - array ( - ), - 'from-va' => - array ( - ), - 'from-vt' => - array ( - ), - 'from-wa' => - array ( - ), - 'from-wi' => - array ( - ), - 'from-wv' => - array ( - ), - 'from-wy' => - array ( - ), - 'getmyip' => - array ( - ), - 'gotdns' => - array ( - ), - 'hobby-site' => - array ( - ), - 'homelinux' => - array ( - ), - 'homeunix' => - array ( - ), - 'iamallama' => - array ( - ), - 'is-a-anarchist' => - array ( - ), - 'is-a-blogger' => - array ( - ), - 'is-a-bookkeeper' => - array ( - ), - 'is-a-bulls-fan' => - array ( - ), - 'is-a-caterer' => - array ( - ), - 'is-a-chef' => - array ( - ), - 'is-a-conservative' => - array ( - ), - 'is-a-cpa' => - array ( - ), - 'is-a-cubicle-slave' => - array ( - ), - 'is-a-democrat' => - array ( - ), - 'is-a-designer' => - array ( - ), - 'is-a-doctor' => - array ( - ), - 'is-a-financialadvisor' => - array ( - ), - 'is-a-geek' => - array ( - ), - 'is-a-green' => - array ( - ), - 'is-a-guru' => - array ( - ), - 'is-a-hard-worker' => - array ( - ), - 'is-a-hunter' => - array ( - ), - 'is-a-landscaper' => - array ( - ), - 'is-a-lawyer' => - array ( - ), - 'is-a-liberal' => - array ( - ), - 'is-a-libertarian' => - array ( - ), - 'is-a-llama' => - array ( - ), - 'is-a-musician' => - array ( - ), - 'is-a-nascarfan' => - array ( - ), - 'is-a-nurse' => - array ( - ), - 'is-a-painter' => - array ( - ), - 'is-a-personaltrainer' => - array ( - ), - 'is-a-photographer' => - array ( - ), - 'is-a-player' => - array ( - ), - 'is-a-republican' => - array ( - ), - 'is-a-rockstar' => - array ( - ), - 'is-a-socialist' => - array ( - ), - 'is-a-student' => - array ( - ), - 'is-a-teacher' => - array ( - ), - 'is-a-techie' => - array ( - ), - 'is-a-therapist' => - array ( - ), - 'is-an-accountant' => - array ( - ), - 'is-an-actor' => - array ( - ), - 'is-an-actress' => - array ( - ), - 'is-an-anarchist' => - array ( - ), - 'is-an-artist' => - array ( - ), - 'is-an-engineer' => - array ( - ), - 'is-an-entertainer' => - array ( - ), - 'is-certified' => - array ( - ), - 'is-gone' => - array ( - ), - 'is-into-anime' => - array ( - ), - 'is-into-cars' => - array ( - ), - 'is-into-cartoons' => - array ( - ), - 'is-into-games' => - array ( - ), - 'is-leet' => - array ( - ), - 'is-not-certified' => - array ( - ), - 'is-slick' => - array ( - ), - 'is-uberleet' => - array ( - ), - 'is-with-theband' => - array ( - ), - 'isa-geek' => - array ( - ), - 'isa-hockeynut' => - array ( - ), - 'issmarterthanyou' => - array ( - ), - 'likes-pie' => - array ( - ), - 'likescandy' => - array ( - ), - 'neat-url' => - array ( - ), - 'saves-the-whales' => - array ( - ), - 'selfip' => - array ( - ), - 'sells-for-less' => - array ( - ), - 'sells-for-u' => - array ( - ), - 'servebbs' => - array ( - ), - 'simple-url' => - array ( - ), - 'space-to-rent' => - array ( - ), - 'teaches-yoga' => - array ( - ), - 'writesthisblog' => - array ( - ), - 'ddnsfree' => - array ( - ), - 'ddnsgeek' => - array ( - ), - 'giize' => - array ( - ), - 'gleeze' => - array ( - ), - 'kozow' => - array ( - ), - 'loseyourip' => - array ( - ), - 'ooguy' => - array ( - ), - 'theworkpc' => - array ( - ), - 'mytuleap' => - array ( - ), - 'evennode' => - array ( - 'eu-1' => - array ( - ), - 'eu-2' => - array ( - ), - 'eu-3' => - array ( - ), - 'eu-4' => - array ( - ), - 'us-1' => - array ( - ), - 'us-2' => - array ( - ), - 'us-3' => - array ( - ), - 'us-4' => - array ( - ), - ), - 'fbsbx' => - array ( - 'apps' => - array ( - ), - ), - 'firebaseapp' => - array ( - ), - 'flynnhub' => - array ( - ), - 'freebox-os' => - array ( - ), - 'freeboxos' => - array ( - ), - 'githubusercontent' => - array ( - ), - '0emm' => - array ( - '*' => - array ( - ), - ), - 'appspot' => - array ( - ), - 'blogspot' => - array ( - ), - 'codespot' => - array ( - ), - 'googleapis' => - array ( - ), - 'googlecode' => - array ( - ), - 'pagespeedmobilizer' => - array ( - ), - 'publishproxy' => - array ( - ), - 'withgoogle' => - array ( - ), - 'withyoutube' => - array ( - ), - 'herokuapp' => - array ( - ), - 'herokussl' => - array ( - ), - 'pixolino' => - array ( - ), - 'joyent' => - array ( - 'cns' => - array ( - '*' => - array ( - ), - ), - ), - 'barsyonline' => - array ( - ), - 'meteorapp' => - array ( - 'eu' => - array ( - ), - ), - 'bitballoon' => - array ( - ), - 'netlify' => - array ( - ), - '4u' => - array ( - ), - 'nfshost' => - array ( - ), - 'blogsyte' => - array ( - ), - 'ciscofreak' => - array ( - ), - 'damnserver' => - array ( - ), - 'ditchyourip' => - array ( - ), - 'dnsiskinky' => - array ( - ), - 'dynns' => - array ( - ), - 'geekgalaxy' => - array ( - ), - 'health-carereform' => - array ( - ), - 'homesecuritymac' => - array ( - ), - 'homesecuritypc' => - array ( - ), - 'myactivedirectory' => - array ( - ), - 'mysecuritycamera' => - array ( - ), - 'net-freaks' => - array ( - ), - 'onthewifi' => - array ( - ), - 'point2this' => - array ( - ), - 'quicksytes' => - array ( - ), - 'securitytactics' => - array ( - ), - 'serveexchange' => - array ( - ), - 'servehumour' => - array ( - ), - 'servep2p' => - array ( - ), - 'servesarcasm' => - array ( - ), - 'stufftoread' => - array ( - ), - 'unusualperson' => - array ( - ), - 'workisboring' => - array ( - ), - '3utilities' => - array ( - ), - 'ddnsking' => - array ( - ), - 'myvnc' => - array ( - ), - 'servebeer' => - array ( - ), - 'servecounterstrike' => - array ( - ), - 'serveftp' => - array ( - ), - 'servegame' => - array ( - ), - 'servehalflife' => - array ( - ), - 'servehttp' => - array ( - ), - 'serveirc' => - array ( - ), - 'servemp3' => - array ( - ), - 'servepics' => - array ( - ), - 'servequake' => - array ( - ), - 'operaunite' => - array ( - ), - 'outsystemscloud' => - array ( - ), - 'ownprovider' => - array ( - ), - 'pgfog' => - array ( - ), - 'pagefrontapp' => - array ( - ), - 'gotpantheon' => - array ( - ), - 'prgmr' => - array ( - 'xen' => - array ( - ), - ), - 'qa2' => - array ( - ), - 'dev-myqnapcloud' => - array ( - ), - 'alpha-myqnapcloud' => - array ( - ), - 'myqnapcloud' => - array ( - ), - 'quipelements' => - array ( - '*' => - array ( - ), - ), - 'rackmaze' => - array ( - ), - 'rhcloud' => - array ( - ), - 'logoip' => - array ( - ), - 'firewall-gateway' => - array ( - ), - 'myshopblocks' => - array ( - ), - '1kapp' => - array ( - ), - 'appchizi' => - array ( - ), - 'applinzi' => - array ( - ), - 'sinaapp' => - array ( - ), - 'vipsinaapp' => - array ( - ), - 'bounty-full' => - array ( - 'alpha' => - array ( - ), - 'beta' => - array ( - ), - ), - 'temp-dns' => - array ( - ), - 'dsmynas' => - array ( - ), - 'familyds' => - array ( - ), - 'bloxcms' => - array ( - ), - 'townnews-staging' => - array ( - ), - 'hk' => - array ( - ), - 'remotewd' => - array ( - ), - 'yolasite' => - array ( - ), - ), - 'coop' => - array ( - ), - 'cr' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'ed' => - array ( - ), - 'fi' => - array ( - ), - 'go' => - array ( - ), - 'or' => - array ( - ), - 'sa' => - array ( - ), - ), - 'cu' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'gov' => - array ( - ), - 'inf' => - array ( - ), - ), - 'cv' => - array ( - 'blogspot' => - array ( - ), - ), - 'cw' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'cx' => - array ( - 'gov' => - array ( - ), - 'ath' => - array ( - ), - 'info' => - array ( - ), - ), - 'cy' => - array ( - 'ac' => - array ( - ), - 'biz' => - array ( - ), - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - 'ekloges' => - array ( - ), - 'gov' => - array ( - ), - 'ltd' => - array ( - ), - 'name' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'parliament' => - array ( - ), - 'press' => - array ( - ), - 'pro' => - array ( - ), - 'tm' => - array ( - ), - ), - 'cz' => - array ( - 'co' => - array ( - ), - 'realm' => - array ( - ), - 'e4' => - array ( - ), - 'blogspot' => - array ( - ), - 'metacentrum' => - array ( - 'cloud' => - array ( - ), - 'custom' => - array ( - ), - ), - ), - 'de' => - array ( - 'bplaced' => - array ( - ), - 'square7' => - array ( - ), - 'com' => - array ( - ), - 'cosidns' => - array ( - 'dyn' => - array ( - ), - ), - 'dynamisches-dns' => - array ( - ), - 'dnsupdater' => - array ( - ), - 'internet-dns' => - array ( - ), - 'l-o-g-i-n' => - array ( - ), - 'dnshome' => - array ( - ), - 'fuettertdasnetz' => - array ( - ), - 'isteingeek' => - array ( - ), - 'istmein' => - array ( - ), - 'lebtimnetz' => - array ( - ), - 'leitungsen' => - array ( - ), - 'traeumtgerade' => - array ( - ), - 'ddnss' => - array ( - 'dyn' => - array ( - ), - 'dyndns' => - array ( - ), - ), - 'dyndns1' => - array ( - ), - 'dyn-ip24' => - array ( - ), - 'home-webserver' => - array ( - 'dyn' => - array ( - ), - ), - 'myhome-server' => - array ( - ), - 'goip' => - array ( - ), - 'blogspot' => - array ( - ), - 'keymachine' => - array ( - ), - 'git-repos' => - array ( - ), - 'lcube-server' => - array ( - ), - 'svn-repos' => - array ( - ), - 'barsy' => - array ( - ), - 'logoip' => - array ( - ), - 'firewall-gateway' => - array ( - ), - 'my-gateway' => - array ( - ), - 'my-router' => - array ( - ), - 'spdns' => - array ( - ), - 'taifun-dns' => - array ( - ), - '12hp' => - array ( - ), - '2ix' => - array ( - ), - '4lima' => - array ( - ), - 'lima-city' => - array ( - ), - 'dd-dns' => - array ( - ), - 'dray-dns' => - array ( - ), - 'draydns' => - array ( - ), - 'dyn-vpn' => - array ( - ), - 'dynvpn' => - array ( - ), - 'mein-vigor' => - array ( - ), - 'my-vigor' => - array ( - ), - 'my-wan' => - array ( - ), - 'syno-ds' => - array ( - ), - 'synology-diskstation' => - array ( - ), - 'synology-ds' => - array ( - ), - ), - 'dj' => - array ( - ), - 'dk' => - array ( - 'biz' => - array ( - ), - 'co' => - array ( - ), - 'firm' => - array ( - ), - 'reg' => - array ( - ), - 'store' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'dm' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - ), - 'do' => - array ( - 'art' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gob' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'sld' => - array ( - ), - 'web' => - array ( - ), - ), - 'dz' => - array ( - 'com' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'gov' => - array ( - ), - 'edu' => - array ( - ), - 'asso' => - array ( - ), - 'pol' => - array ( - ), - 'art' => - array ( - ), - ), - 'ec' => - array ( - 'com' => - array ( - ), - 'info' => - array ( - ), - 'net' => - array ( - ), - 'fin' => - array ( - ), - 'k12' => - array ( - ), - 'med' => - array ( - ), - 'pro' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'gob' => - array ( - ), - 'mil' => - array ( - ), - ), - 'edu' => - array ( - ), - 'ee' => - array ( - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'riik' => - array ( - ), - 'lib' => - array ( - ), - 'med' => - array ( - ), - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - 'pri' => - array ( - ), - 'aip' => - array ( - ), - 'org' => - array ( - ), - 'fie' => - array ( - ), - ), - 'eg' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - 'edu' => - array ( - ), - 'eun' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'name' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'sci' => - array ( - ), - ), - 'er' => - array ( - '*' => - array ( - ), - ), - 'es' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - 'nom' => - array ( - ), - 'org' => - array ( - ), - 'gob' => - array ( - ), - 'edu' => - array ( - ), - ), - 'et' => - array ( - 'com' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'biz' => - array ( - ), - 'name' => - array ( - ), - 'info' => - array ( - ), - 'net' => - array ( - ), - ), - 'eu' => - array ( - 'mycd' => - array ( - ), - 'cloudns' => - array ( - ), - 'barsy' => - array ( - ), - 'wellbeingzone' => - array ( - ), - 'spdns' => - array ( - ), - 'transurl' => - array ( - '*' => - array ( - ), - ), - 'diskstation' => - array ( - ), - ), - 'fi' => - array ( - 'aland' => - array ( - ), - 'dy' => - array ( - ), - 'blogspot' => - array ( - ), - 'iki' => - array ( - ), - ), - 'fj' => - array ( - '*' => - array ( - ), - ), - 'fk' => - array ( - '*' => - array ( - ), - ), - 'fm' => - array ( - ), - 'fo' => - array ( - ), - 'fr' => - array ( - 'com' => - array ( - ), - 'asso' => - array ( - ), - 'nom' => - array ( - ), - 'prd' => - array ( - ), - 'presse' => - array ( - ), - 'tm' => - array ( - ), - 'aeroport' => - array ( - ), - 'assedic' => - array ( - ), - 'avocat' => - array ( - ), - 'avoues' => - array ( - ), - 'cci' => - array ( - ), - 'chambagri' => - array ( - ), - 'chirurgiens-dentistes' => - array ( - ), - 'experts-comptables' => - array ( - ), - 'geometre-expert' => - array ( - ), - 'gouv' => - array ( - ), - 'greta' => - array ( - ), - 'huissier-justice' => - array ( - ), - 'medecin' => - array ( - ), - 'notaires' => - array ( - ), - 'pharmacien' => - array ( - ), - 'port' => - array ( - ), - 'veterinaire' => - array ( - ), - 'fbx-os' => - array ( - ), - 'fbxos' => - array ( - ), - 'freebox-os' => - array ( - ), - 'freeboxos' => - array ( - ), - 'blogspot' => - array ( - ), - 'on-web' => - array ( - ), - 'chirurgiens-dentistes-en-france' => - array ( - ), - ), - 'ga' => - array ( - ), - 'gb' => - array ( - ), - 'gd' => - array ( - 'nom' => - array ( - ), - ), - 'ge' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'pvt' => - array ( - ), - ), - 'gf' => - array ( - ), - 'gg' => - array ( - 'co' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'cya' => - array ( - ), - ), - 'gh' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'mil' => - array ( - ), - ), - 'gi' => - array ( - 'com' => - array ( - ), - 'ltd' => - array ( - ), - 'gov' => - array ( - ), - 'mod' => - array ( - ), - 'edu' => - array ( - ), - 'org' => - array ( - ), - ), - 'gl' => - array ( - 'co' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'nom' => - array ( - ), - ), - 'gm' => - array ( - ), - 'gn' => - array ( - 'ac' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - ), - 'gov' => - array ( - ), - 'gp' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'mobi' => - array ( - ), - 'edu' => - array ( - ), - 'org' => - array ( - ), - 'asso' => - array ( - ), - ), - 'gq' => - array ( - ), - 'gr' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - 'blogspot' => - array ( - ), - 'nym' => - array ( - ), - ), - 'gs' => - array ( - ), - 'gt' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gob' => - array ( - ), - 'ind' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'nom' => - array ( - ), - ), - 'gu' => - array ( - '*' => - array ( - ), - ), - 'gw' => - array ( - ), - 'gy' => - array ( - 'co' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'hk' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'idv' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'xn--55qx5d' => - array ( - ), - 'xn--wcvs22d' => - array ( - ), - 'xn--lcvr32d' => - array ( - ), - 'xn--mxtq1m' => - array ( - ), - 'xn--gmqw5a' => - array ( - ), - 'xn--ciqpn' => - array ( - ), - 'xn--gmq050i' => - array ( - ), - 'xn--zf0avx' => - array ( - ), - 'xn--io0a7i' => - array ( - ), - 'xn--mk0axi' => - array ( - ), - 'xn--od0alg' => - array ( - ), - 'xn--od0aq3b' => - array ( - ), - 'xn--tn0ag' => - array ( - ), - 'xn--uc0atv' => - array ( - ), - 'xn--uc0ay4a' => - array ( - ), - 'blogspot' => - array ( - ), - 'ltd' => - array ( - ), - 'inc' => - array ( - ), - ), - 'hm' => - array ( - ), - 'hn' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'mil' => - array ( - ), - 'gob' => - array ( - ), - 'nom' => - array ( - ), - ), - 'hr' => - array ( - 'iz' => - array ( - ), - 'from' => - array ( - ), - 'name' => - array ( - ), - 'com' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'ht' => - array ( - 'com' => - array ( - ), - 'shop' => - array ( - ), - 'firm' => - array ( - ), - 'info' => - array ( - ), - 'adult' => - array ( - ), - 'net' => - array ( - ), - 'pro' => - array ( - ), - 'org' => - array ( - ), - 'med' => - array ( - ), - 'art' => - array ( - ), - 'coop' => - array ( - ), - 'pol' => - array ( - ), - 'asso' => - array ( - ), - 'edu' => - array ( - ), - 'rel' => - array ( - ), - 'gouv' => - array ( - ), - 'perso' => - array ( - ), - ), - 'hu' => - array ( - 'co' => - array ( - ), - 'info' => - array ( - ), - 'org' => - array ( - ), - 'priv' => - array ( - ), - 'sport' => - array ( - ), - 'tm' => - array ( - ), - 2000 => - array ( - ), - 'agrar' => - array ( - ), - 'bolt' => - array ( - ), - 'casino' => - array ( - ), - 'city' => - array ( - ), - 'erotica' => - array ( - ), - 'erotika' => - array ( - ), - 'film' => - array ( - ), - 'forum' => - array ( - ), - 'games' => - array ( - ), - 'hotel' => - array ( - ), - 'ingatlan' => - array ( - ), - 'jogasz' => - array ( - ), - 'konyvelo' => - array ( - ), - 'lakas' => - array ( - ), - 'media' => - array ( - ), - 'news' => - array ( - ), - 'reklam' => - array ( - ), - 'sex' => - array ( - ), - 'shop' => - array ( - ), - 'suli' => - array ( - ), - 'szex' => - array ( - ), - 'tozsde' => - array ( - ), - 'utazas' => - array ( - ), - 'video' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'id' => - array ( - 'ac' => - array ( - ), - 'biz' => - array ( - ), - 'co' => - array ( - 'blogspot' => - array ( - ), - ), - 'desa' => - array ( - ), - 'go' => - array ( - ), - 'mil' => - array ( - ), - 'my' => - array ( - ), - 'net' => - array ( - ), - 'or' => - array ( - ), - 'sch' => - array ( - ), - 'web' => - array ( - ), - ), - 'ie' => - array ( - 'gov' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'il' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - 'blogspot' => - array ( - ), - ), - 'gov' => - array ( - ), - 'idf' => - array ( - ), - 'k12' => - array ( - ), - 'muni' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'im' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - 'ltd' => - array ( - ), - 'plc' => - array ( - ), - ), - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'tt' => - array ( - ), - 'tv' => - array ( - ), - 'ro' => - array ( - ), - 'nom' => - array ( - ), - ), - 'in' => - array ( - 'co' => - array ( - ), - 'firm' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gen' => - array ( - ), - 'ind' => - array ( - ), - 'nic' => - array ( - ), - 'ac' => - array ( - ), - 'edu' => - array ( - ), - 'res' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'cloudns' => - array ( - ), - 'blogspot' => - array ( - ), - 'barsy' => - array ( - ), - ), - 'info' => - array ( - 'cloudns' => - array ( - ), - 'dynamic-dns' => - array ( - ), - 'dyndns' => - array ( - ), - 'barrel-of-knowledge' => - array ( - ), - 'barrell-of-knowledge' => - array ( - ), - 'for-our' => - array ( - ), - 'groks-the' => - array ( - ), - 'groks-this' => - array ( - ), - 'here-for-more' => - array ( - ), - 'knowsitall' => - array ( - ), - 'selfip' => - array ( - ), - 'webhop' => - array ( - ), - 'nsupdate' => - array ( - ), - 'dvrcam' => - array ( - ), - 'ilovecollege' => - array ( - ), - 'no-ip' => - array ( - ), - 'v-info' => - array ( - ), - ), - 'int' => - array ( - 'eu' => - array ( - ), - ), - 'io' => - array ( - 'com' => - array ( - ), - 'backplaneapp' => - array ( - ), - 'boxfuse' => - array ( - ), - 'browsersafetymark' => - array ( - ), - 'dedyn' => - array ( - ), - 'drud' => - array ( - ), - 'definima' => - array ( - ), - 'enonic' => - array ( - 'customer' => - array ( - ), - ), - 'github' => - array ( - ), - 'gitlab' => - array ( - ), - 'hasura-app' => - array ( - ), - 'ngrok' => - array ( - ), - 'nodeart' => - array ( - 'stage' => - array ( - ), - ), - 'nodum' => - array ( - ), - 'nid' => - array ( - ), - 'pantheonsite' => - array ( - ), - 'protonet' => - array ( - ), - 'vaporcloud' => - array ( - ), - 'hzc' => - array ( - ), - 'sandcats' => - array ( - ), - 'shiftedit' => - array ( - ), - 'lair' => - array ( - 'apps' => - array ( - ), - ), - 'stolos' => - array ( - '*' => - array ( - ), - ), - 'spacekit' => - array ( - ), - 'thingdust' => - array ( - 'dev' => - array ( - 'cust' => - array ( - ), - ), - 'disrec' => - array ( - 'cust' => - array ( - ), - ), - 'prod' => - array ( - 'cust' => - array ( - ), - ), - 'testing' => - array ( - 'cust' => - array ( - ), - ), - ), - 'wedeploy' => - array ( - ), - ), - 'iq' => - array ( - 'gov' => - array ( - ), - 'edu' => - array ( - ), - 'mil' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - ), - 'ir' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'gov' => - array ( - ), - 'id' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'sch' => - array ( - ), - 'xn--mgba3a4f16a' => - array ( - ), - 'xn--mgba3a4fra' => - array ( - ), - ), - 'is' => - array ( - 'net' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'int' => - array ( - ), - 'cupcake' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'it' => - array ( - 'gov' => - array ( - ), - 'edu' => - array ( - ), - 'abr' => - array ( - ), - 'abruzzo' => - array ( - ), - 'aosta-valley' => - array ( - ), - 'aostavalley' => - array ( - ), - 'bas' => - array ( - ), - 'basilicata' => - array ( - ), - 'cal' => - array ( - ), - 'calabria' => - array ( - ), - 'cam' => - array ( - ), - 'campania' => - array ( - ), - 'emilia-romagna' => - array ( - ), - 'emiliaromagna' => - array ( - ), - 'emr' => - array ( - ), - 'friuli-v-giulia' => - array ( - ), - 'friuli-ve-giulia' => - array ( - ), - 'friuli-vegiulia' => - array ( - ), - 'friuli-venezia-giulia' => - array ( - ), - 'friuli-veneziagiulia' => - array ( - ), - 'friuli-vgiulia' => - array ( - ), - 'friuliv-giulia' => - array ( - ), - 'friulive-giulia' => - array ( - ), - 'friulivegiulia' => - array ( - ), - 'friulivenezia-giulia' => - array ( - ), - 'friuliveneziagiulia' => - array ( - ), - 'friulivgiulia' => - array ( - ), - 'fvg' => - array ( - ), - 'laz' => - array ( - ), - 'lazio' => - array ( - ), - 'lig' => - array ( - ), - 'liguria' => - array ( - ), - 'lom' => - array ( - ), - 'lombardia' => - array ( - ), - 'lombardy' => - array ( - ), - 'lucania' => - array ( - ), - 'mar' => - array ( - ), - 'marche' => - array ( - ), - 'mol' => - array ( - ), - 'molise' => - array ( - ), - 'piedmont' => - array ( - ), - 'piemonte' => - array ( - ), - 'pmn' => - array ( - ), - 'pug' => - array ( - ), - 'puglia' => - array ( - ), - 'sar' => - array ( - ), - 'sardegna' => - array ( - ), - 'sardinia' => - array ( - ), - 'sic' => - array ( - ), - 'sicilia' => - array ( - ), - 'sicily' => - array ( - ), - 'taa' => - array ( - ), - 'tos' => - array ( - ), - 'toscana' => - array ( - ), - 'trentino-a-adige' => - array ( - ), - 'trentino-aadige' => - array ( - ), - 'trentino-alto-adige' => - array ( - ), - 'trentino-altoadige' => - array ( - ), - 'trentino-s-tirol' => - array ( - ), - 'trentino-stirol' => - array ( - ), - 'trentino-sud-tirol' => - array ( - ), - 'trentino-sudtirol' => - array ( - ), - 'trentino-sued-tirol' => - array ( - ), - 'trentino-suedtirol' => - array ( - ), - 'trentinoa-adige' => - array ( - ), - 'trentinoaadige' => - array ( - ), - 'trentinoalto-adige' => - array ( - ), - 'trentinoaltoadige' => - array ( - ), - 'trentinos-tirol' => - array ( - ), - 'trentinostirol' => - array ( - ), - 'trentinosud-tirol' => - array ( - ), - 'trentinosudtirol' => - array ( - ), - 'trentinosued-tirol' => - array ( - ), - 'trentinosuedtirol' => - array ( - ), - 'tuscany' => - array ( - ), - 'umb' => - array ( - ), - 'umbria' => - array ( - ), - 'val-d-aosta' => - array ( - ), - 'val-daosta' => - array ( - ), - 'vald-aosta' => - array ( - ), - 'valdaosta' => - array ( - ), - 'valle-aosta' => - array ( - ), - 'valle-d-aosta' => - array ( - ), - 'valle-daosta' => - array ( - ), - 'valleaosta' => - array ( - ), - 'valled-aosta' => - array ( - ), - 'valledaosta' => - array ( - ), - 'vallee-aoste' => - array ( - ), - 'valleeaoste' => - array ( - ), - 'vao' => - array ( - ), - 'vda' => - array ( - ), - 'ven' => - array ( - ), - 'veneto' => - array ( - ), - 'ag' => - array ( - ), - 'agrigento' => - array ( - ), - 'al' => - array ( - ), - 'alessandria' => - array ( - ), - 'alto-adige' => - array ( - ), - 'altoadige' => - array ( - ), - 'an' => - array ( - ), - 'ancona' => - array ( - ), - 'andria-barletta-trani' => - array ( - ), - 'andria-trani-barletta' => - array ( - ), - 'andriabarlettatrani' => - array ( - ), - 'andriatranibarletta' => - array ( - ), - 'ao' => - array ( - ), - 'aosta' => - array ( - ), - 'aoste' => - array ( - ), - 'ap' => - array ( - ), - 'aq' => - array ( - ), - 'aquila' => - array ( - ), - 'ar' => - array ( - ), - 'arezzo' => - array ( - ), - 'ascoli-piceno' => - array ( - ), - 'ascolipiceno' => - array ( - ), - 'asti' => - array ( - ), - 'at' => - array ( - ), - 'av' => - array ( - ), - 'avellino' => - array ( - ), - 'ba' => - array ( - ), - 'balsan' => - array ( - ), - 'bari' => - array ( - ), - 'barletta-trani-andria' => - array ( - ), - 'barlettatraniandria' => - array ( - ), - 'belluno' => - array ( - ), - 'benevento' => - array ( - ), - 'bergamo' => - array ( - ), - 'bg' => - array ( - ), - 'bi' => - array ( - ), - 'biella' => - array ( - ), - 'bl' => - array ( - ), - 'bn' => - array ( - ), - 'bo' => - array ( - ), - 'bologna' => - array ( - ), - 'bolzano' => - array ( - ), - 'bozen' => - array ( - ), - 'br' => - array ( - ), - 'brescia' => - array ( - ), - 'brindisi' => - array ( - ), - 'bs' => - array ( - ), - 'bt' => - array ( - ), - 'bz' => - array ( - ), - 'ca' => - array ( - ), - 'cagliari' => - array ( - ), - 'caltanissetta' => - array ( - ), - 'campidano-medio' => - array ( - ), - 'campidanomedio' => - array ( - ), - 'campobasso' => - array ( - ), - 'carbonia-iglesias' => - array ( - ), - 'carboniaiglesias' => - array ( - ), - 'carrara-massa' => - array ( - ), - 'carraramassa' => - array ( - ), - 'caserta' => - array ( - ), - 'catania' => - array ( - ), - 'catanzaro' => - array ( - ), - 'cb' => - array ( - ), - 'ce' => - array ( - ), - 'cesena-forli' => - array ( - ), - 'cesenaforli' => - array ( - ), - 'ch' => - array ( - ), - 'chieti' => - array ( - ), - 'ci' => - array ( - ), - 'cl' => - array ( - ), - 'cn' => - array ( - ), - 'co' => - array ( - ), - 'como' => - array ( - ), - 'cosenza' => - array ( - ), - 'cr' => - array ( - ), - 'cremona' => - array ( - ), - 'crotone' => - array ( - ), - 'cs' => - array ( - ), - 'ct' => - array ( - ), - 'cuneo' => - array ( - ), - 'cz' => - array ( - ), - 'dell-ogliastra' => - array ( - ), - 'dellogliastra' => - array ( - ), - 'en' => - array ( - ), - 'enna' => - array ( - ), - 'fc' => - array ( - ), - 'fe' => - array ( - ), - 'fermo' => - array ( - ), - 'ferrara' => - array ( - ), - 'fg' => - array ( - ), - 'fi' => - array ( - ), - 'firenze' => - array ( - ), - 'florence' => - array ( - ), - 'fm' => - array ( - ), - 'foggia' => - array ( - ), - 'forli-cesena' => - array ( - ), - 'forlicesena' => - array ( - ), - 'fr' => - array ( - ), - 'frosinone' => - array ( - ), - 'ge' => - array ( - ), - 'genoa' => - array ( - ), - 'genova' => - array ( - ), - 'go' => - array ( - ), - 'gorizia' => - array ( - ), - 'gr' => - array ( - ), - 'grosseto' => - array ( - ), - 'iglesias-carbonia' => - array ( - ), - 'iglesiascarbonia' => - array ( - ), - 'im' => - array ( - ), - 'imperia' => - array ( - ), - 'is' => - array ( - ), - 'isernia' => - array ( - ), - 'kr' => - array ( - ), - 'la-spezia' => - array ( - ), - 'laquila' => - array ( - ), - 'laspezia' => - array ( - ), - 'latina' => - array ( - ), - 'lc' => - array ( - ), - 'le' => - array ( - ), - 'lecce' => - array ( - ), - 'lecco' => - array ( - ), - 'li' => - array ( - ), - 'livorno' => - array ( - ), - 'lo' => - array ( - ), - 'lodi' => - array ( - ), - 'lt' => - array ( - ), - 'lu' => - array ( - ), - 'lucca' => - array ( - ), - 'macerata' => - array ( - ), - 'mantova' => - array ( - ), - 'massa-carrara' => - array ( - ), - 'massacarrara' => - array ( - ), - 'matera' => - array ( - ), - 'mb' => - array ( - ), - 'mc' => - array ( - ), - 'me' => - array ( - ), - 'medio-campidano' => - array ( - ), - 'mediocampidano' => - array ( - ), - 'messina' => - array ( - ), - 'mi' => - array ( - ), - 'milan' => - array ( - ), - 'milano' => - array ( - ), - 'mn' => - array ( - ), - 'mo' => - array ( - ), - 'modena' => - array ( - ), - 'monza-brianza' => - array ( - ), - 'monza-e-della-brianza' => - array ( - ), - 'monza' => - array ( - ), - 'monzabrianza' => - array ( - ), - 'monzaebrianza' => - array ( - ), - 'monzaedellabrianza' => - array ( - ), - 'ms' => - array ( - ), - 'mt' => - array ( - ), - 'na' => - array ( - ), - 'naples' => - array ( - ), - 'napoli' => - array ( - ), - 'no' => - array ( - ), - 'novara' => - array ( - ), - 'nu' => - array ( - ), - 'nuoro' => - array ( - ), - 'og' => - array ( - ), - 'ogliastra' => - array ( - ), - 'olbia-tempio' => - array ( - ), - 'olbiatempio' => - array ( - ), - 'or' => - array ( - ), - 'oristano' => - array ( - ), - 'ot' => - array ( - ), - 'pa' => - array ( - ), - 'padova' => - array ( - ), - 'padua' => - array ( - ), - 'palermo' => - array ( - ), - 'parma' => - array ( - ), - 'pavia' => - array ( - ), - 'pc' => - array ( - ), - 'pd' => - array ( - ), - 'pe' => - array ( - ), - 'perugia' => - array ( - ), - 'pesaro-urbino' => - array ( - ), - 'pesarourbino' => - array ( - ), - 'pescara' => - array ( - ), - 'pg' => - array ( - ), - 'pi' => - array ( - ), - 'piacenza' => - array ( - ), - 'pisa' => - array ( - ), - 'pistoia' => - array ( - ), - 'pn' => - array ( - ), - 'po' => - array ( - ), - 'pordenone' => - array ( - ), - 'potenza' => - array ( - ), - 'pr' => - array ( - ), - 'prato' => - array ( - ), - 'pt' => - array ( - ), - 'pu' => - array ( - ), - 'pv' => - array ( - ), - 'pz' => - array ( - ), - 'ra' => - array ( - ), - 'ragusa' => - array ( - ), - 'ravenna' => - array ( - ), - 'rc' => - array ( - ), - 're' => - array ( - ), - 'reggio-calabria' => - array ( - ), - 'reggio-emilia' => - array ( - ), - 'reggiocalabria' => - array ( - ), - 'reggioemilia' => - array ( - ), - 'rg' => - array ( - ), - 'ri' => - array ( - ), - 'rieti' => - array ( - ), - 'rimini' => - array ( - ), - 'rm' => - array ( - ), - 'rn' => - array ( - ), - 'ro' => - array ( - ), - 'roma' => - array ( - ), - 'rome' => - array ( - ), - 'rovigo' => - array ( - ), - 'sa' => - array ( - ), - 'salerno' => - array ( - ), - 'sassari' => - array ( - ), - 'savona' => - array ( - ), - 'si' => - array ( - ), - 'siena' => - array ( - ), - 'siracusa' => - array ( - ), - 'so' => - array ( - ), - 'sondrio' => - array ( - ), - 'sp' => - array ( - ), - 'sr' => - array ( - ), - 'ss' => - array ( - ), - 'suedtirol' => - array ( - ), - 'sv' => - array ( - ), - 'ta' => - array ( - ), - 'taranto' => - array ( - ), - 'te' => - array ( - ), - 'tempio-olbia' => - array ( - ), - 'tempioolbia' => - array ( - ), - 'teramo' => - array ( - ), - 'terni' => - array ( - ), - 'tn' => - array ( - ), - 'to' => - array ( - ), - 'torino' => - array ( - ), - 'tp' => - array ( - ), - 'tr' => - array ( - ), - 'trani-andria-barletta' => - array ( - ), - 'trani-barletta-andria' => - array ( - ), - 'traniandriabarletta' => - array ( - ), - 'tranibarlettaandria' => - array ( - ), - 'trapani' => - array ( - ), - 'trentino' => - array ( - ), - 'trento' => - array ( - ), - 'treviso' => - array ( - ), - 'trieste' => - array ( - ), - 'ts' => - array ( - ), - 'turin' => - array ( - ), - 'tv' => - array ( - ), - 'ud' => - array ( - ), - 'udine' => - array ( - ), - 'urbino-pesaro' => - array ( - ), - 'urbinopesaro' => - array ( - ), - 'va' => - array ( - ), - 'varese' => - array ( - ), - 'vb' => - array ( - ), - 'vc' => - array ( - ), - 've' => - array ( - ), - 'venezia' => - array ( - ), - 'venice' => - array ( - ), - 'verbania' => - array ( - ), - 'vercelli' => - array ( - ), - 'verona' => - array ( - ), - 'vi' => - array ( - ), - 'vibo-valentia' => - array ( - ), - 'vibovalentia' => - array ( - ), - 'vicenza' => - array ( - ), - 'viterbo' => - array ( - ), - 'vr' => - array ( - ), - 'vs' => - array ( - ), - 'vt' => - array ( - ), - 'vv' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'je' => - array ( - 'co' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'jm' => - array ( - '*' => - array ( - ), - ), - 'jo' => - array ( - 'com' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'edu' => - array ( - ), - 'sch' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'name' => - array ( - ), - ), - 'jobs' => - array ( - ), - 'jp' => - array ( - 'ac' => - array ( - ), - 'ad' => - array ( - ), - 'co' => - array ( - ), - 'ed' => - array ( - ), - 'go' => - array ( - ), - 'gr' => - array ( - ), - 'lg' => - array ( - ), - 'ne' => - array ( - ), - 'or' => - array ( - ), - 'aichi' => - array ( - 'aisai' => - array ( - ), - 'ama' => - array ( - ), - 'anjo' => - array ( - ), - 'asuke' => - array ( - ), - 'chiryu' => - array ( - ), - 'chita' => - array ( - ), - 'fuso' => - array ( - ), - 'gamagori' => - array ( - ), - 'handa' => - array ( - ), - 'hazu' => - array ( - ), - 'hekinan' => - array ( - ), - 'higashiura' => - array ( - ), - 'ichinomiya' => - array ( - ), - 'inazawa' => - array ( - ), - 'inuyama' => - array ( - ), - 'isshiki' => - array ( - ), - 'iwakura' => - array ( - ), - 'kanie' => - array ( - ), - 'kariya' => - array ( - ), - 'kasugai' => - array ( - ), - 'kira' => - array ( - ), - 'kiyosu' => - array ( - ), - 'komaki' => - array ( - ), - 'konan' => - array ( - ), - 'kota' => - array ( - ), - 'mihama' => - array ( - ), - 'miyoshi' => - array ( - ), - 'nishio' => - array ( - ), - 'nisshin' => - array ( - ), - 'obu' => - array ( - ), - 'oguchi' => - array ( - ), - 'oharu' => - array ( - ), - 'okazaki' => - array ( - ), - 'owariasahi' => - array ( - ), - 'seto' => - array ( - ), - 'shikatsu' => - array ( - ), - 'shinshiro' => - array ( - ), - 'shitara' => - array ( - ), - 'tahara' => - array ( - ), - 'takahama' => - array ( - ), - 'tobishima' => - array ( - ), - 'toei' => - array ( - ), - 'togo' => - array ( - ), - 'tokai' => - array ( - ), - 'tokoname' => - array ( - ), - 'toyoake' => - array ( - ), - 'toyohashi' => - array ( - ), - 'toyokawa' => - array ( - ), - 'toyone' => - array ( - ), - 'toyota' => - array ( - ), - 'tsushima' => - array ( - ), - 'yatomi' => - array ( - ), - ), - 'akita' => - array ( - 'akita' => - array ( - ), - 'daisen' => - array ( - ), - 'fujisato' => - array ( - ), - 'gojome' => - array ( - ), - 'hachirogata' => - array ( - ), - 'happou' => - array ( - ), - 'higashinaruse' => - array ( - ), - 'honjo' => - array ( - ), - 'honjyo' => - array ( - ), - 'ikawa' => - array ( - ), - 'kamikoani' => - array ( - ), - 'kamioka' => - array ( - ), - 'katagami' => - array ( - ), - 'kazuno' => - array ( - ), - 'kitaakita' => - array ( - ), - 'kosaka' => - array ( - ), - 'kyowa' => - array ( - ), - 'misato' => - array ( - ), - 'mitane' => - array ( - ), - 'moriyoshi' => - array ( - ), - 'nikaho' => - array ( - ), - 'noshiro' => - array ( - ), - 'odate' => - array ( - ), - 'oga' => - array ( - ), - 'ogata' => - array ( - ), - 'semboku' => - array ( - ), - 'yokote' => - array ( - ), - 'yurihonjo' => - array ( - ), - ), - 'aomori' => - array ( - 'aomori' => - array ( - ), - 'gonohe' => - array ( - ), - 'hachinohe' => - array ( - ), - 'hashikami' => - array ( - ), - 'hiranai' => - array ( - ), - 'hirosaki' => - array ( - ), - 'itayanagi' => - array ( - ), - 'kuroishi' => - array ( - ), - 'misawa' => - array ( - ), - 'mutsu' => - array ( - ), - 'nakadomari' => - array ( - ), - 'noheji' => - array ( - ), - 'oirase' => - array ( - ), - 'owani' => - array ( - ), - 'rokunohe' => - array ( - ), - 'sannohe' => - array ( - ), - 'shichinohe' => - array ( - ), - 'shingo' => - array ( - ), - 'takko' => - array ( - ), - 'towada' => - array ( - ), - 'tsugaru' => - array ( - ), - 'tsuruta' => - array ( - ), - ), - 'chiba' => - array ( - 'abiko' => - array ( - ), - 'asahi' => - array ( - ), - 'chonan' => - array ( - ), - 'chosei' => - array ( - ), - 'choshi' => - array ( - ), - 'chuo' => - array ( - ), - 'funabashi' => - array ( - ), - 'futtsu' => - array ( - ), - 'hanamigawa' => - array ( - ), - 'ichihara' => - array ( - ), - 'ichikawa' => - array ( - ), - 'ichinomiya' => - array ( - ), - 'inzai' => - array ( - ), - 'isumi' => - array ( - ), - 'kamagaya' => - array ( - ), - 'kamogawa' => - array ( - ), - 'kashiwa' => - array ( - ), - 'katori' => - array ( - ), - 'katsuura' => - array ( - ), - 'kimitsu' => - array ( - ), - 'kisarazu' => - array ( - ), - 'kozaki' => - array ( - ), - 'kujukuri' => - array ( - ), - 'kyonan' => - array ( - ), - 'matsudo' => - array ( - ), - 'midori' => - array ( - ), - 'mihama' => - array ( - ), - 'minamiboso' => - array ( - ), - 'mobara' => - array ( - ), - 'mutsuzawa' => - array ( - ), - 'nagara' => - array ( - ), - 'nagareyama' => - array ( - ), - 'narashino' => - array ( - ), - 'narita' => - array ( - ), - 'noda' => - array ( - ), - 'oamishirasato' => - array ( - ), - 'omigawa' => - array ( - ), - 'onjuku' => - array ( - ), - 'otaki' => - array ( - ), - 'sakae' => - array ( - ), - 'sakura' => - array ( - ), - 'shimofusa' => - array ( - ), - 'shirako' => - array ( - ), - 'shiroi' => - array ( - ), - 'shisui' => - array ( - ), - 'sodegaura' => - array ( - ), - 'sosa' => - array ( - ), - 'tako' => - array ( - ), - 'tateyama' => - array ( - ), - 'togane' => - array ( - ), - 'tohnosho' => - array ( - ), - 'tomisato' => - array ( - ), - 'urayasu' => - array ( - ), - 'yachimata' => - array ( - ), - 'yachiyo' => - array ( - ), - 'yokaichiba' => - array ( - ), - 'yokoshibahikari' => - array ( - ), - 'yotsukaido' => - array ( - ), - ), - 'ehime' => - array ( - 'ainan' => - array ( - ), - 'honai' => - array ( - ), - 'ikata' => - array ( - ), - 'imabari' => - array ( - ), - 'iyo' => - array ( - ), - 'kamijima' => - array ( - ), - 'kihoku' => - array ( - ), - 'kumakogen' => - array ( - ), - 'masaki' => - array ( - ), - 'matsuno' => - array ( - ), - 'matsuyama' => - array ( - ), - 'namikata' => - array ( - ), - 'niihama' => - array ( - ), - 'ozu' => - array ( - ), - 'saijo' => - array ( - ), - 'seiyo' => - array ( - ), - 'shikokuchuo' => - array ( - ), - 'tobe' => - array ( - ), - 'toon' => - array ( - ), - 'uchiko' => - array ( - ), - 'uwajima' => - array ( - ), - 'yawatahama' => - array ( - ), - ), - 'fukui' => - array ( - 'echizen' => - array ( - ), - 'eiheiji' => - array ( - ), - 'fukui' => - array ( - ), - 'ikeda' => - array ( - ), - 'katsuyama' => - array ( - ), - 'mihama' => - array ( - ), - 'minamiechizen' => - array ( - ), - 'obama' => - array ( - ), - 'ohi' => - array ( - ), - 'ono' => - array ( - ), - 'sabae' => - array ( - ), - 'sakai' => - array ( - ), - 'takahama' => - array ( - ), - 'tsuruga' => - array ( - ), - 'wakasa' => - array ( - ), - ), - 'fukuoka' => - array ( - 'ashiya' => - array ( - ), - 'buzen' => - array ( - ), - 'chikugo' => - array ( - ), - 'chikuho' => - array ( - ), - 'chikujo' => - array ( - ), - 'chikushino' => - array ( - ), - 'chikuzen' => - array ( - ), - 'chuo' => - array ( - ), - 'dazaifu' => - array ( - ), - 'fukuchi' => - array ( - ), - 'hakata' => - array ( - ), - 'higashi' => - array ( - ), - 'hirokawa' => - array ( - ), - 'hisayama' => - array ( - ), - 'iizuka' => - array ( - ), - 'inatsuki' => - array ( - ), - 'kaho' => - array ( - ), - 'kasuga' => - array ( - ), - 'kasuya' => - array ( - ), - 'kawara' => - array ( - ), - 'keisen' => - array ( - ), - 'koga' => - array ( - ), - 'kurate' => - array ( - ), - 'kurogi' => - array ( - ), - 'kurume' => - array ( - ), - 'minami' => - array ( - ), - 'miyako' => - array ( - ), - 'miyama' => - array ( - ), - 'miyawaka' => - array ( - ), - 'mizumaki' => - array ( - ), - 'munakata' => - array ( - ), - 'nakagawa' => - array ( - ), - 'nakama' => - array ( - ), - 'nishi' => - array ( - ), - 'nogata' => - array ( - ), - 'ogori' => - array ( - ), - 'okagaki' => - array ( - ), - 'okawa' => - array ( - ), - 'oki' => - array ( - ), - 'omuta' => - array ( - ), - 'onga' => - array ( - ), - 'onojo' => - array ( - ), - 'oto' => - array ( - ), - 'saigawa' => - array ( - ), - 'sasaguri' => - array ( - ), - 'shingu' => - array ( - ), - 'shinyoshitomi' => - array ( - ), - 'shonai' => - array ( - ), - 'soeda' => - array ( - ), - 'sue' => - array ( - ), - 'tachiarai' => - array ( - ), - 'tagawa' => - array ( - ), - 'takata' => - array ( - ), - 'toho' => - array ( - ), - 'toyotsu' => - array ( - ), - 'tsuiki' => - array ( - ), - 'ukiha' => - array ( - ), - 'umi' => - array ( - ), - 'usui' => - array ( - ), - 'yamada' => - array ( - ), - 'yame' => - array ( - ), - 'yanagawa' => - array ( - ), - 'yukuhashi' => - array ( - ), - ), - 'fukushima' => - array ( - 'aizubange' => - array ( - ), - 'aizumisato' => - array ( - ), - 'aizuwakamatsu' => - array ( - ), - 'asakawa' => - array ( - ), - 'bandai' => - array ( - ), - 'date' => - array ( - ), - 'fukushima' => - array ( - ), - 'furudono' => - array ( - ), - 'futaba' => - array ( - ), - 'hanawa' => - array ( - ), - 'higashi' => - array ( - ), - 'hirata' => - array ( - ), - 'hirono' => - array ( - ), - 'iitate' => - array ( - ), - 'inawashiro' => - array ( - ), - 'ishikawa' => - array ( - ), - 'iwaki' => - array ( - ), - 'izumizaki' => - array ( - ), - 'kagamiishi' => - array ( - ), - 'kaneyama' => - array ( - ), - 'kawamata' => - array ( - ), - 'kitakata' => - array ( - ), - 'kitashiobara' => - array ( - ), - 'koori' => - array ( - ), - 'koriyama' => - array ( - ), - 'kunimi' => - array ( - ), - 'miharu' => - array ( - ), - 'mishima' => - array ( - ), - 'namie' => - array ( - ), - 'nango' => - array ( - ), - 'nishiaizu' => - array ( - ), - 'nishigo' => - array ( - ), - 'okuma' => - array ( - ), - 'omotego' => - array ( - ), - 'ono' => - array ( - ), - 'otama' => - array ( - ), - 'samegawa' => - array ( - ), - 'shimogo' => - array ( - ), - 'shirakawa' => - array ( - ), - 'showa' => - array ( - ), - 'soma' => - array ( - ), - 'sukagawa' => - array ( - ), - 'taishin' => - array ( - ), - 'tamakawa' => - array ( - ), - 'tanagura' => - array ( - ), - 'tenei' => - array ( - ), - 'yabuki' => - array ( - ), - 'yamato' => - array ( - ), - 'yamatsuri' => - array ( - ), - 'yanaizu' => - array ( - ), - 'yugawa' => - array ( - ), - ), - 'gifu' => - array ( - 'anpachi' => - array ( - ), - 'ena' => - array ( - ), - 'gifu' => - array ( - ), - 'ginan' => - array ( - ), - 'godo' => - array ( - ), - 'gujo' => - array ( - ), - 'hashima' => - array ( - ), - 'hichiso' => - array ( - ), - 'hida' => - array ( - ), - 'higashishirakawa' => - array ( - ), - 'ibigawa' => - array ( - ), - 'ikeda' => - array ( - ), - 'kakamigahara' => - array ( - ), - 'kani' => - array ( - ), - 'kasahara' => - array ( - ), - 'kasamatsu' => - array ( - ), - 'kawaue' => - array ( - ), - 'kitagata' => - array ( - ), - 'mino' => - array ( - ), - 'minokamo' => - array ( - ), - 'mitake' => - array ( - ), - 'mizunami' => - array ( - ), - 'motosu' => - array ( - ), - 'nakatsugawa' => - array ( - ), - 'ogaki' => - array ( - ), - 'sakahogi' => - array ( - ), - 'seki' => - array ( - ), - 'sekigahara' => - array ( - ), - 'shirakawa' => - array ( - ), - 'tajimi' => - array ( - ), - 'takayama' => - array ( - ), - 'tarui' => - array ( - ), - 'toki' => - array ( - ), - 'tomika' => - array ( - ), - 'wanouchi' => - array ( - ), - 'yamagata' => - array ( - ), - 'yaotsu' => - array ( - ), - 'yoro' => - array ( - ), - ), - 'gunma' => - array ( - 'annaka' => - array ( - ), - 'chiyoda' => - array ( - ), - 'fujioka' => - array ( - ), - 'higashiagatsuma' => - array ( - ), - 'isesaki' => - array ( - ), - 'itakura' => - array ( - ), - 'kanna' => - array ( - ), - 'kanra' => - array ( - ), - 'katashina' => - array ( - ), - 'kawaba' => - array ( - ), - 'kiryu' => - array ( - ), - 'kusatsu' => - array ( - ), - 'maebashi' => - array ( - ), - 'meiwa' => - array ( - ), - 'midori' => - array ( - ), - 'minakami' => - array ( - ), - 'naganohara' => - array ( - ), - 'nakanojo' => - array ( - ), - 'nanmoku' => - array ( - ), - 'numata' => - array ( - ), - 'oizumi' => - array ( - ), - 'ora' => - array ( - ), - 'ota' => - array ( - ), - 'shibukawa' => - array ( - ), - 'shimonita' => - array ( - ), - 'shinto' => - array ( - ), - 'showa' => - array ( - ), - 'takasaki' => - array ( - ), - 'takayama' => - array ( - ), - 'tamamura' => - array ( - ), - 'tatebayashi' => - array ( - ), - 'tomioka' => - array ( - ), - 'tsukiyono' => - array ( - ), - 'tsumagoi' => - array ( - ), - 'ueno' => - array ( - ), - 'yoshioka' => - array ( - ), - ), - 'hiroshima' => - array ( - 'asaminami' => - array ( - ), - 'daiwa' => - array ( - ), - 'etajima' => - array ( - ), - 'fuchu' => - array ( - ), - 'fukuyama' => - array ( - ), - 'hatsukaichi' => - array ( - ), - 'higashihiroshima' => - array ( - ), - 'hongo' => - array ( - ), - 'jinsekikogen' => - array ( - ), - 'kaita' => - array ( - ), - 'kui' => - array ( - ), - 'kumano' => - array ( - ), - 'kure' => - array ( - ), - 'mihara' => - array ( - ), - 'miyoshi' => - array ( - ), - 'naka' => - array ( - ), - 'onomichi' => - array ( - ), - 'osakikamijima' => - array ( - ), - 'otake' => - array ( - ), - 'saka' => - array ( - ), - 'sera' => - array ( - ), - 'seranishi' => - array ( - ), - 'shinichi' => - array ( - ), - 'shobara' => - array ( - ), - 'takehara' => - array ( - ), - ), - 'hokkaido' => - array ( - 'abashiri' => - array ( - ), - 'abira' => - array ( - ), - 'aibetsu' => - array ( - ), - 'akabira' => - array ( - ), - 'akkeshi' => - array ( - ), - 'asahikawa' => - array ( - ), - 'ashibetsu' => - array ( - ), - 'ashoro' => - array ( - ), - 'assabu' => - array ( - ), - 'atsuma' => - array ( - ), - 'bibai' => - array ( - ), - 'biei' => - array ( - ), - 'bifuka' => - array ( - ), - 'bihoro' => - array ( - ), - 'biratori' => - array ( - ), - 'chippubetsu' => - array ( - ), - 'chitose' => - array ( - ), - 'date' => - array ( - ), - 'ebetsu' => - array ( - ), - 'embetsu' => - array ( - ), - 'eniwa' => - array ( - ), - 'erimo' => - array ( - ), - 'esan' => - array ( - ), - 'esashi' => - array ( - ), - 'fukagawa' => - array ( - ), - 'fukushima' => - array ( - ), - 'furano' => - array ( - ), - 'furubira' => - array ( - ), - 'haboro' => - array ( - ), - 'hakodate' => - array ( - ), - 'hamatonbetsu' => - array ( - ), - 'hidaka' => - array ( - ), - 'higashikagura' => - array ( - ), - 'higashikawa' => - array ( - ), - 'hiroo' => - array ( - ), - 'hokuryu' => - array ( - ), - 'hokuto' => - array ( - ), - 'honbetsu' => - array ( - ), - 'horokanai' => - array ( - ), - 'horonobe' => - array ( - ), - 'ikeda' => - array ( - ), - 'imakane' => - array ( - ), - 'ishikari' => - array ( - ), - 'iwamizawa' => - array ( - ), - 'iwanai' => - array ( - ), - 'kamifurano' => - array ( - ), - 'kamikawa' => - array ( - ), - 'kamishihoro' => - array ( - ), - 'kamisunagawa' => - array ( - ), - 'kamoenai' => - array ( - ), - 'kayabe' => - array ( - ), - 'kembuchi' => - array ( - ), - 'kikonai' => - array ( - ), - 'kimobetsu' => - array ( - ), - 'kitahiroshima' => - array ( - ), - 'kitami' => - array ( - ), - 'kiyosato' => - array ( - ), - 'koshimizu' => - array ( - ), - 'kunneppu' => - array ( - ), - 'kuriyama' => - array ( - ), - 'kuromatsunai' => - array ( - ), - 'kushiro' => - array ( - ), - 'kutchan' => - array ( - ), - 'kyowa' => - array ( - ), - 'mashike' => - array ( - ), - 'matsumae' => - array ( - ), - 'mikasa' => - array ( - ), - 'minamifurano' => - array ( - ), - 'mombetsu' => - array ( - ), - 'moseushi' => - array ( - ), - 'mukawa' => - array ( - ), - 'muroran' => - array ( - ), - 'naie' => - array ( - ), - 'nakagawa' => - array ( - ), - 'nakasatsunai' => - array ( - ), - 'nakatombetsu' => - array ( - ), - 'nanae' => - array ( - ), - 'nanporo' => - array ( - ), - 'nayoro' => - array ( - ), - 'nemuro' => - array ( - ), - 'niikappu' => - array ( - ), - 'niki' => - array ( - ), - 'nishiokoppe' => - array ( - ), - 'noboribetsu' => - array ( - ), - 'numata' => - array ( - ), - 'obihiro' => - array ( - ), - 'obira' => - array ( - ), - 'oketo' => - array ( - ), - 'okoppe' => - array ( - ), - 'otaru' => - array ( - ), - 'otobe' => - array ( - ), - 'otofuke' => - array ( - ), - 'otoineppu' => - array ( - ), - 'oumu' => - array ( - ), - 'ozora' => - array ( - ), - 'pippu' => - array ( - ), - 'rankoshi' => - array ( - ), - 'rebun' => - array ( - ), - 'rikubetsu' => - array ( - ), - 'rishiri' => - array ( - ), - 'rishirifuji' => - array ( - ), - 'saroma' => - array ( - ), - 'sarufutsu' => - array ( - ), - 'shakotan' => - array ( - ), - 'shari' => - array ( - ), - 'shibecha' => - array ( - ), - 'shibetsu' => - array ( - ), - 'shikabe' => - array ( - ), - 'shikaoi' => - array ( - ), - 'shimamaki' => - array ( - ), - 'shimizu' => - array ( - ), - 'shimokawa' => - array ( - ), - 'shinshinotsu' => - array ( - ), - 'shintoku' => - array ( - ), - 'shiranuka' => - array ( - ), - 'shiraoi' => - array ( - ), - 'shiriuchi' => - array ( - ), - 'sobetsu' => - array ( - ), - 'sunagawa' => - array ( - ), - 'taiki' => - array ( - ), - 'takasu' => - array ( - ), - 'takikawa' => - array ( - ), - 'takinoue' => - array ( - ), - 'teshikaga' => - array ( - ), - 'tobetsu' => - array ( - ), - 'tohma' => - array ( - ), - 'tomakomai' => - array ( - ), - 'tomari' => - array ( - ), - 'toya' => - array ( - ), - 'toyako' => - array ( - ), - 'toyotomi' => - array ( - ), - 'toyoura' => - array ( - ), - 'tsubetsu' => - array ( - ), - 'tsukigata' => - array ( - ), - 'urakawa' => - array ( - ), - 'urausu' => - array ( - ), - 'uryu' => - array ( - ), - 'utashinai' => - array ( - ), - 'wakkanai' => - array ( - ), - 'wassamu' => - array ( - ), - 'yakumo' => - array ( - ), - 'yoichi' => - array ( - ), - ), - 'hyogo' => - array ( - 'aioi' => - array ( - ), - 'akashi' => - array ( - ), - 'ako' => - array ( - ), - 'amagasaki' => - array ( - ), - 'aogaki' => - array ( - ), - 'asago' => - array ( - ), - 'ashiya' => - array ( - ), - 'awaji' => - array ( - ), - 'fukusaki' => - array ( - ), - 'goshiki' => - array ( - ), - 'harima' => - array ( - ), - 'himeji' => - array ( - ), - 'ichikawa' => - array ( - ), - 'inagawa' => - array ( - ), - 'itami' => - array ( - ), - 'kakogawa' => - array ( - ), - 'kamigori' => - array ( - ), - 'kamikawa' => - array ( - ), - 'kasai' => - array ( - ), - 'kasuga' => - array ( - ), - 'kawanishi' => - array ( - ), - 'miki' => - array ( - ), - 'minamiawaji' => - array ( - ), - 'nishinomiya' => - array ( - ), - 'nishiwaki' => - array ( - ), - 'ono' => - array ( - ), - 'sanda' => - array ( - ), - 'sannan' => - array ( - ), - 'sasayama' => - array ( - ), - 'sayo' => - array ( - ), - 'shingu' => - array ( - ), - 'shinonsen' => - array ( - ), - 'shiso' => - array ( - ), - 'sumoto' => - array ( - ), - 'taishi' => - array ( - ), - 'taka' => - array ( - ), - 'takarazuka' => - array ( - ), - 'takasago' => - array ( - ), - 'takino' => - array ( - ), - 'tamba' => - array ( - ), - 'tatsuno' => - array ( - ), - 'toyooka' => - array ( - ), - 'yabu' => - array ( - ), - 'yashiro' => - array ( - ), - 'yoka' => - array ( - ), - 'yokawa' => - array ( - ), - ), - 'ibaraki' => - array ( - 'ami' => - array ( - ), - 'asahi' => - array ( - ), - 'bando' => - array ( - ), - 'chikusei' => - array ( - ), - 'daigo' => - array ( - ), - 'fujishiro' => - array ( - ), - 'hitachi' => - array ( - ), - 'hitachinaka' => - array ( - ), - 'hitachiomiya' => - array ( - ), - 'hitachiota' => - array ( - ), - 'ibaraki' => - array ( - ), - 'ina' => - array ( - ), - 'inashiki' => - array ( - ), - 'itako' => - array ( - ), - 'iwama' => - array ( - ), - 'joso' => - array ( - ), - 'kamisu' => - array ( - ), - 'kasama' => - array ( - ), - 'kashima' => - array ( - ), - 'kasumigaura' => - array ( - ), - 'koga' => - array ( - ), - 'miho' => - array ( - ), - 'mito' => - array ( - ), - 'moriya' => - array ( - ), - 'naka' => - array ( - ), - 'namegata' => - array ( - ), - 'oarai' => - array ( - ), - 'ogawa' => - array ( - ), - 'omitama' => - array ( - ), - 'ryugasaki' => - array ( - ), - 'sakai' => - array ( - ), - 'sakuragawa' => - array ( - ), - 'shimodate' => - array ( - ), - 'shimotsuma' => - array ( - ), - 'shirosato' => - array ( - ), - 'sowa' => - array ( - ), - 'suifu' => - array ( - ), - 'takahagi' => - array ( - ), - 'tamatsukuri' => - array ( - ), - 'tokai' => - array ( - ), - 'tomobe' => - array ( - ), - 'tone' => - array ( - ), - 'toride' => - array ( - ), - 'tsuchiura' => - array ( - ), - 'tsukuba' => - array ( - ), - 'uchihara' => - array ( - ), - 'ushiku' => - array ( - ), - 'yachiyo' => - array ( - ), - 'yamagata' => - array ( - ), - 'yawara' => - array ( - ), - 'yuki' => - array ( - ), - ), - 'ishikawa' => - array ( - 'anamizu' => - array ( - ), - 'hakui' => - array ( - ), - 'hakusan' => - array ( - ), - 'kaga' => - array ( - ), - 'kahoku' => - array ( - ), - 'kanazawa' => - array ( - ), - 'kawakita' => - array ( - ), - 'komatsu' => - array ( - ), - 'nakanoto' => - array ( - ), - 'nanao' => - array ( - ), - 'nomi' => - array ( - ), - 'nonoichi' => - array ( - ), - 'noto' => - array ( - ), - 'shika' => - array ( - ), - 'suzu' => - array ( - ), - 'tsubata' => - array ( - ), - 'tsurugi' => - array ( - ), - 'uchinada' => - array ( - ), - 'wajima' => - array ( - ), - ), - 'iwate' => - array ( - 'fudai' => - array ( - ), - 'fujisawa' => - array ( - ), - 'hanamaki' => - array ( - ), - 'hiraizumi' => - array ( - ), - 'hirono' => - array ( - ), - 'ichinohe' => - array ( - ), - 'ichinoseki' => - array ( - ), - 'iwaizumi' => - array ( - ), - 'iwate' => - array ( - ), - 'joboji' => - array ( - ), - 'kamaishi' => - array ( - ), - 'kanegasaki' => - array ( - ), - 'karumai' => - array ( - ), - 'kawai' => - array ( - ), - 'kitakami' => - array ( - ), - 'kuji' => - array ( - ), - 'kunohe' => - array ( - ), - 'kuzumaki' => - array ( - ), - 'miyako' => - array ( - ), - 'mizusawa' => - array ( - ), - 'morioka' => - array ( - ), - 'ninohe' => - array ( - ), - 'noda' => - array ( - ), - 'ofunato' => - array ( - ), - 'oshu' => - array ( - ), - 'otsuchi' => - array ( - ), - 'rikuzentakata' => - array ( - ), - 'shiwa' => - array ( - ), - 'shizukuishi' => - array ( - ), - 'sumita' => - array ( - ), - 'tanohata' => - array ( - ), - 'tono' => - array ( - ), - 'yahaba' => - array ( - ), - 'yamada' => - array ( - ), - ), - 'kagawa' => - array ( - 'ayagawa' => - array ( - ), - 'higashikagawa' => - array ( - ), - 'kanonji' => - array ( - ), - 'kotohira' => - array ( - ), - 'manno' => - array ( - ), - 'marugame' => - array ( - ), - 'mitoyo' => - array ( - ), - 'naoshima' => - array ( - ), - 'sanuki' => - array ( - ), - 'tadotsu' => - array ( - ), - 'takamatsu' => - array ( - ), - 'tonosho' => - array ( - ), - 'uchinomi' => - array ( - ), - 'utazu' => - array ( - ), - 'zentsuji' => - array ( - ), - ), - 'kagoshima' => - array ( - 'akune' => - array ( - ), - 'amami' => - array ( - ), - 'hioki' => - array ( - ), - 'isa' => - array ( - ), - 'isen' => - array ( - ), - 'izumi' => - array ( - ), - 'kagoshima' => - array ( - ), - 'kanoya' => - array ( - ), - 'kawanabe' => - array ( - ), - 'kinko' => - array ( - ), - 'kouyama' => - array ( - ), - 'makurazaki' => - array ( - ), - 'matsumoto' => - array ( - ), - 'minamitane' => - array ( - ), - 'nakatane' => - array ( - ), - 'nishinoomote' => - array ( - ), - 'satsumasendai' => - array ( - ), - 'soo' => - array ( - ), - 'tarumizu' => - array ( - ), - 'yusui' => - array ( - ), - ), - 'kanagawa' => - array ( - 'aikawa' => - array ( - ), - 'atsugi' => - array ( - ), - 'ayase' => - array ( - ), - 'chigasaki' => - array ( - ), - 'ebina' => - array ( - ), - 'fujisawa' => - array ( - ), - 'hadano' => - array ( - ), - 'hakone' => - array ( - ), - 'hiratsuka' => - array ( - ), - 'isehara' => - array ( - ), - 'kaisei' => - array ( - ), - 'kamakura' => - array ( - ), - 'kiyokawa' => - array ( - ), - 'matsuda' => - array ( - ), - 'minamiashigara' => - array ( - ), - 'miura' => - array ( - ), - 'nakai' => - array ( - ), - 'ninomiya' => - array ( - ), - 'odawara' => - array ( - ), - 'oi' => - array ( - ), - 'oiso' => - array ( - ), - 'sagamihara' => - array ( - ), - 'samukawa' => - array ( - ), - 'tsukui' => - array ( - ), - 'yamakita' => - array ( - ), - 'yamato' => - array ( - ), - 'yokosuka' => - array ( - ), - 'yugawara' => - array ( - ), - 'zama' => - array ( - ), - 'zushi' => - array ( - ), - ), - 'kochi' => - array ( - 'aki' => - array ( - ), - 'geisei' => - array ( - ), - 'hidaka' => - array ( - ), - 'higashitsuno' => - array ( - ), - 'ino' => - array ( - ), - 'kagami' => - array ( - ), - 'kami' => - array ( - ), - 'kitagawa' => - array ( - ), - 'kochi' => - array ( - ), - 'mihara' => - array ( - ), - 'motoyama' => - array ( - ), - 'muroto' => - array ( - ), - 'nahari' => - array ( - ), - 'nakamura' => - array ( - ), - 'nankoku' => - array ( - ), - 'nishitosa' => - array ( - ), - 'niyodogawa' => - array ( - ), - 'ochi' => - array ( - ), - 'okawa' => - array ( - ), - 'otoyo' => - array ( - ), - 'otsuki' => - array ( - ), - 'sakawa' => - array ( - ), - 'sukumo' => - array ( - ), - 'susaki' => - array ( - ), - 'tosa' => - array ( - ), - 'tosashimizu' => - array ( - ), - 'toyo' => - array ( - ), - 'tsuno' => - array ( - ), - 'umaji' => - array ( - ), - 'yasuda' => - array ( - ), - 'yusuhara' => - array ( - ), - ), - 'kumamoto' => - array ( - 'amakusa' => - array ( - ), - 'arao' => - array ( - ), - 'aso' => - array ( - ), - 'choyo' => - array ( - ), - 'gyokuto' => - array ( - ), - 'kamiamakusa' => - array ( - ), - 'kikuchi' => - array ( - ), - 'kumamoto' => - array ( - ), - 'mashiki' => - array ( - ), - 'mifune' => - array ( - ), - 'minamata' => - array ( - ), - 'minamioguni' => - array ( - ), - 'nagasu' => - array ( - ), - 'nishihara' => - array ( - ), - 'oguni' => - array ( - ), - 'ozu' => - array ( - ), - 'sumoto' => - array ( - ), - 'takamori' => - array ( - ), - 'uki' => - array ( - ), - 'uto' => - array ( - ), - 'yamaga' => - array ( - ), - 'yamato' => - array ( - ), - 'yatsushiro' => - array ( - ), - ), - 'kyoto' => - array ( - 'ayabe' => - array ( - ), - 'fukuchiyama' => - array ( - ), - 'higashiyama' => - array ( - ), - 'ide' => - array ( - ), - 'ine' => - array ( - ), - 'joyo' => - array ( - ), - 'kameoka' => - array ( - ), - 'kamo' => - array ( - ), - 'kita' => - array ( - ), - 'kizu' => - array ( - ), - 'kumiyama' => - array ( - ), - 'kyotamba' => - array ( - ), - 'kyotanabe' => - array ( - ), - 'kyotango' => - array ( - ), - 'maizuru' => - array ( - ), - 'minami' => - array ( - ), - 'minamiyamashiro' => - array ( - ), - 'miyazu' => - array ( - ), - 'muko' => - array ( - ), - 'nagaokakyo' => - array ( - ), - 'nakagyo' => - array ( - ), - 'nantan' => - array ( - ), - 'oyamazaki' => - array ( - ), - 'sakyo' => - array ( - ), - 'seika' => - array ( - ), - 'tanabe' => - array ( - ), - 'uji' => - array ( - ), - 'ujitawara' => - array ( - ), - 'wazuka' => - array ( - ), - 'yamashina' => - array ( - ), - 'yawata' => - array ( - ), - ), - 'mie' => - array ( - 'asahi' => - array ( - ), - 'inabe' => - array ( - ), - 'ise' => - array ( - ), - 'kameyama' => - array ( - ), - 'kawagoe' => - array ( - ), - 'kiho' => - array ( - ), - 'kisosaki' => - array ( - ), - 'kiwa' => - array ( - ), - 'komono' => - array ( - ), - 'kumano' => - array ( - ), - 'kuwana' => - array ( - ), - 'matsusaka' => - array ( - ), - 'meiwa' => - array ( - ), - 'mihama' => - array ( - ), - 'minamiise' => - array ( - ), - 'misugi' => - array ( - ), - 'miyama' => - array ( - ), - 'nabari' => - array ( - ), - 'shima' => - array ( - ), - 'suzuka' => - array ( - ), - 'tado' => - array ( - ), - 'taiki' => - array ( - ), - 'taki' => - array ( - ), - 'tamaki' => - array ( - ), - 'toba' => - array ( - ), - 'tsu' => - array ( - ), - 'udono' => - array ( - ), - 'ureshino' => - array ( - ), - 'watarai' => - array ( - ), - 'yokkaichi' => - array ( - ), - ), - 'miyagi' => - array ( - 'furukawa' => - array ( - ), - 'higashimatsushima' => - array ( - ), - 'ishinomaki' => - array ( - ), - 'iwanuma' => - array ( - ), - 'kakuda' => - array ( - ), - 'kami' => - array ( - ), - 'kawasaki' => - array ( - ), - 'marumori' => - array ( - ), - 'matsushima' => - array ( - ), - 'minamisanriku' => - array ( - ), - 'misato' => - array ( - ), - 'murata' => - array ( - ), - 'natori' => - array ( - ), - 'ogawara' => - array ( - ), - 'ohira' => - array ( - ), - 'onagawa' => - array ( - ), - 'osaki' => - array ( - ), - 'rifu' => - array ( - ), - 'semine' => - array ( - ), - 'shibata' => - array ( - ), - 'shichikashuku' => - array ( - ), - 'shikama' => - array ( - ), - 'shiogama' => - array ( - ), - 'shiroishi' => - array ( - ), - 'tagajo' => - array ( - ), - 'taiwa' => - array ( - ), - 'tome' => - array ( - ), - 'tomiya' => - array ( - ), - 'wakuya' => - array ( - ), - 'watari' => - array ( - ), - 'yamamoto' => - array ( - ), - 'zao' => - array ( - ), - ), - 'miyazaki' => - array ( - 'aya' => - array ( - ), - 'ebino' => - array ( - ), - 'gokase' => - array ( - ), - 'hyuga' => - array ( - ), - 'kadogawa' => - array ( - ), - 'kawaminami' => - array ( - ), - 'kijo' => - array ( - ), - 'kitagawa' => - array ( - ), - 'kitakata' => - array ( - ), - 'kitaura' => - array ( - ), - 'kobayashi' => - array ( - ), - 'kunitomi' => - array ( - ), - 'kushima' => - array ( - ), - 'mimata' => - array ( - ), - 'miyakonojo' => - array ( - ), - 'miyazaki' => - array ( - ), - 'morotsuka' => - array ( - ), - 'nichinan' => - array ( - ), - 'nishimera' => - array ( - ), - 'nobeoka' => - array ( - ), - 'saito' => - array ( - ), - 'shiiba' => - array ( - ), - 'shintomi' => - array ( - ), - 'takaharu' => - array ( - ), - 'takanabe' => - array ( - ), - 'takazaki' => - array ( - ), - 'tsuno' => - array ( - ), - ), - 'nagano' => - array ( - 'achi' => - array ( - ), - 'agematsu' => - array ( - ), - 'anan' => - array ( - ), - 'aoki' => - array ( - ), - 'asahi' => - array ( - ), - 'azumino' => - array ( - ), - 'chikuhoku' => - array ( - ), - 'chikuma' => - array ( - ), - 'chino' => - array ( - ), - 'fujimi' => - array ( - ), - 'hakuba' => - array ( - ), - 'hara' => - array ( - ), - 'hiraya' => - array ( - ), - 'iida' => - array ( - ), - 'iijima' => - array ( - ), - 'iiyama' => - array ( - ), - 'iizuna' => - array ( - ), - 'ikeda' => - array ( - ), - 'ikusaka' => - array ( - ), - 'ina' => - array ( - ), - 'karuizawa' => - array ( - ), - 'kawakami' => - array ( - ), - 'kiso' => - array ( - ), - 'kisofukushima' => - array ( - ), - 'kitaaiki' => - array ( - ), - 'komagane' => - array ( - ), - 'komoro' => - array ( - ), - 'matsukawa' => - array ( - ), - 'matsumoto' => - array ( - ), - 'miasa' => - array ( - ), - 'minamiaiki' => - array ( - ), - 'minamimaki' => - array ( - ), - 'minamiminowa' => - array ( - ), - 'minowa' => - array ( - ), - 'miyada' => - array ( - ), - 'miyota' => - array ( - ), - 'mochizuki' => - array ( - ), - 'nagano' => - array ( - ), - 'nagawa' => - array ( - ), - 'nagiso' => - array ( - ), - 'nakagawa' => - array ( - ), - 'nakano' => - array ( - ), - 'nozawaonsen' => - array ( - ), - 'obuse' => - array ( - ), - 'ogawa' => - array ( - ), - 'okaya' => - array ( - ), - 'omachi' => - array ( - ), - 'omi' => - array ( - ), - 'ookuwa' => - array ( - ), - 'ooshika' => - array ( - ), - 'otaki' => - array ( - ), - 'otari' => - array ( - ), - 'sakae' => - array ( - ), - 'sakaki' => - array ( - ), - 'saku' => - array ( - ), - 'sakuho' => - array ( - ), - 'shimosuwa' => - array ( - ), - 'shinanomachi' => - array ( - ), - 'shiojiri' => - array ( - ), - 'suwa' => - array ( - ), - 'suzaka' => - array ( - ), - 'takagi' => - array ( - ), - 'takamori' => - array ( - ), - 'takayama' => - array ( - ), - 'tateshina' => - array ( - ), - 'tatsuno' => - array ( - ), - 'togakushi' => - array ( - ), - 'togura' => - array ( - ), - 'tomi' => - array ( - ), - 'ueda' => - array ( - ), - 'wada' => - array ( - ), - 'yamagata' => - array ( - ), - 'yamanouchi' => - array ( - ), - 'yasaka' => - array ( - ), - 'yasuoka' => - array ( - ), - ), - 'nagasaki' => - array ( - 'chijiwa' => - array ( - ), - 'futsu' => - array ( - ), - 'goto' => - array ( - ), - 'hasami' => - array ( - ), - 'hirado' => - array ( - ), - 'iki' => - array ( - ), - 'isahaya' => - array ( - ), - 'kawatana' => - array ( - ), - 'kuchinotsu' => - array ( - ), - 'matsuura' => - array ( - ), - 'nagasaki' => - array ( - ), - 'obama' => - array ( - ), - 'omura' => - array ( - ), - 'oseto' => - array ( - ), - 'saikai' => - array ( - ), - 'sasebo' => - array ( - ), - 'seihi' => - array ( - ), - 'shimabara' => - array ( - ), - 'shinkamigoto' => - array ( - ), - 'togitsu' => - array ( - ), - 'tsushima' => - array ( - ), - 'unzen' => - array ( - ), - ), - 'nara' => - array ( - 'ando' => - array ( - ), - 'gose' => - array ( - ), - 'heguri' => - array ( - ), - 'higashiyoshino' => - array ( - ), - 'ikaruga' => - array ( - ), - 'ikoma' => - array ( - ), - 'kamikitayama' => - array ( - ), - 'kanmaki' => - array ( - ), - 'kashiba' => - array ( - ), - 'kashihara' => - array ( - ), - 'katsuragi' => - array ( - ), - 'kawai' => - array ( - ), - 'kawakami' => - array ( - ), - 'kawanishi' => - array ( - ), - 'koryo' => - array ( - ), - 'kurotaki' => - array ( - ), - 'mitsue' => - array ( - ), - 'miyake' => - array ( - ), - 'nara' => - array ( - ), - 'nosegawa' => - array ( - ), - 'oji' => - array ( - ), - 'ouda' => - array ( - ), - 'oyodo' => - array ( - ), - 'sakurai' => - array ( - ), - 'sango' => - array ( - ), - 'shimoichi' => - array ( - ), - 'shimokitayama' => - array ( - ), - 'shinjo' => - array ( - ), - 'soni' => - array ( - ), - 'takatori' => - array ( - ), - 'tawaramoto' => - array ( - ), - 'tenkawa' => - array ( - ), - 'tenri' => - array ( - ), - 'uda' => - array ( - ), - 'yamatokoriyama' => - array ( - ), - 'yamatotakada' => - array ( - ), - 'yamazoe' => - array ( - ), - 'yoshino' => - array ( - ), - ), - 'niigata' => - array ( - 'aga' => - array ( - ), - 'agano' => - array ( - ), - 'gosen' => - array ( - ), - 'itoigawa' => - array ( - ), - 'izumozaki' => - array ( - ), - 'joetsu' => - array ( - ), - 'kamo' => - array ( - ), - 'kariwa' => - array ( - ), - 'kashiwazaki' => - array ( - ), - 'minamiuonuma' => - array ( - ), - 'mitsuke' => - array ( - ), - 'muika' => - array ( - ), - 'murakami' => - array ( - ), - 'myoko' => - array ( - ), - 'nagaoka' => - array ( - ), - 'niigata' => - array ( - ), - 'ojiya' => - array ( - ), - 'omi' => - array ( - ), - 'sado' => - array ( - ), - 'sanjo' => - array ( - ), - 'seiro' => - array ( - ), - 'seirou' => - array ( - ), - 'sekikawa' => - array ( - ), - 'shibata' => - array ( - ), - 'tagami' => - array ( - ), - 'tainai' => - array ( - ), - 'tochio' => - array ( - ), - 'tokamachi' => - array ( - ), - 'tsubame' => - array ( - ), - 'tsunan' => - array ( - ), - 'uonuma' => - array ( - ), - 'yahiko' => - array ( - ), - 'yoita' => - array ( - ), - 'yuzawa' => - array ( - ), - ), - 'oita' => - array ( - 'beppu' => - array ( - ), - 'bungoono' => - array ( - ), - 'bungotakada' => - array ( - ), - 'hasama' => - array ( - ), - 'hiji' => - array ( - ), - 'himeshima' => - array ( - ), - 'hita' => - array ( - ), - 'kamitsue' => - array ( - ), - 'kokonoe' => - array ( - ), - 'kuju' => - array ( - ), - 'kunisaki' => - array ( - ), - 'kusu' => - array ( - ), - 'oita' => - array ( - ), - 'saiki' => - array ( - ), - 'taketa' => - array ( - ), - 'tsukumi' => - array ( - ), - 'usa' => - array ( - ), - 'usuki' => - array ( - ), - 'yufu' => - array ( - ), - ), - 'okayama' => - array ( - 'akaiwa' => - array ( - ), - 'asakuchi' => - array ( - ), - 'bizen' => - array ( - ), - 'hayashima' => - array ( - ), - 'ibara' => - array ( - ), - 'kagamino' => - array ( - ), - 'kasaoka' => - array ( - ), - 'kibichuo' => - array ( - ), - 'kumenan' => - array ( - ), - 'kurashiki' => - array ( - ), - 'maniwa' => - array ( - ), - 'misaki' => - array ( - ), - 'nagi' => - array ( - ), - 'niimi' => - array ( - ), - 'nishiawakura' => - array ( - ), - 'okayama' => - array ( - ), - 'satosho' => - array ( - ), - 'setouchi' => - array ( - ), - 'shinjo' => - array ( - ), - 'shoo' => - array ( - ), - 'soja' => - array ( - ), - 'takahashi' => - array ( - ), - 'tamano' => - array ( - ), - 'tsuyama' => - array ( - ), - 'wake' => - array ( - ), - 'yakage' => - array ( - ), - ), - 'okinawa' => - array ( - 'aguni' => - array ( - ), - 'ginowan' => - array ( - ), - 'ginoza' => - array ( - ), - 'gushikami' => - array ( - ), - 'haebaru' => - array ( - ), - 'higashi' => - array ( - ), - 'hirara' => - array ( - ), - 'iheya' => - array ( - ), - 'ishigaki' => - array ( - ), - 'ishikawa' => - array ( - ), - 'itoman' => - array ( - ), - 'izena' => - array ( - ), - 'kadena' => - array ( - ), - 'kin' => - array ( - ), - 'kitadaito' => - array ( - ), - 'kitanakagusuku' => - array ( - ), - 'kumejima' => - array ( - ), - 'kunigami' => - array ( - ), - 'minamidaito' => - array ( - ), - 'motobu' => - array ( - ), - 'nago' => - array ( - ), - 'naha' => - array ( - ), - 'nakagusuku' => - array ( - ), - 'nakijin' => - array ( - ), - 'nanjo' => - array ( - ), - 'nishihara' => - array ( - ), - 'ogimi' => - array ( - ), - 'okinawa' => - array ( - ), - 'onna' => - array ( - ), - 'shimoji' => - array ( - ), - 'taketomi' => - array ( - ), - 'tarama' => - array ( - ), - 'tokashiki' => - array ( - ), - 'tomigusuku' => - array ( - ), - 'tonaki' => - array ( - ), - 'urasoe' => - array ( - ), - 'uruma' => - array ( - ), - 'yaese' => - array ( - ), - 'yomitan' => - array ( - ), - 'yonabaru' => - array ( - ), - 'yonaguni' => - array ( - ), - 'zamami' => - array ( - ), - ), - 'osaka' => - array ( - 'abeno' => - array ( - ), - 'chihayaakasaka' => - array ( - ), - 'chuo' => - array ( - ), - 'daito' => - array ( - ), - 'fujiidera' => - array ( - ), - 'habikino' => - array ( - ), - 'hannan' => - array ( - ), - 'higashiosaka' => - array ( - ), - 'higashisumiyoshi' => - array ( - ), - 'higashiyodogawa' => - array ( - ), - 'hirakata' => - array ( - ), - 'ibaraki' => - array ( - ), - 'ikeda' => - array ( - ), - 'izumi' => - array ( - ), - 'izumiotsu' => - array ( - ), - 'izumisano' => - array ( - ), - 'kadoma' => - array ( - ), - 'kaizuka' => - array ( - ), - 'kanan' => - array ( - ), - 'kashiwara' => - array ( - ), - 'katano' => - array ( - ), - 'kawachinagano' => - array ( - ), - 'kishiwada' => - array ( - ), - 'kita' => - array ( - ), - 'kumatori' => - array ( - ), - 'matsubara' => - array ( - ), - 'minato' => - array ( - ), - 'minoh' => - array ( - ), - 'misaki' => - array ( - ), - 'moriguchi' => - array ( - ), - 'neyagawa' => - array ( - ), - 'nishi' => - array ( - ), - 'nose' => - array ( - ), - 'osakasayama' => - array ( - ), - 'sakai' => - array ( - ), - 'sayama' => - array ( - ), - 'sennan' => - array ( - ), - 'settsu' => - array ( - ), - 'shijonawate' => - array ( - ), - 'shimamoto' => - array ( - ), - 'suita' => - array ( - ), - 'tadaoka' => - array ( - ), - 'taishi' => - array ( - ), - 'tajiri' => - array ( - ), - 'takaishi' => - array ( - ), - 'takatsuki' => - array ( - ), - 'tondabayashi' => - array ( - ), - 'toyonaka' => - array ( - ), - 'toyono' => - array ( - ), - 'yao' => - array ( - ), - ), - 'saga' => - array ( - 'ariake' => - array ( - ), - 'arita' => - array ( - ), - 'fukudomi' => - array ( - ), - 'genkai' => - array ( - ), - 'hamatama' => - array ( - ), - 'hizen' => - array ( - ), - 'imari' => - array ( - ), - 'kamimine' => - array ( - ), - 'kanzaki' => - array ( - ), - 'karatsu' => - array ( - ), - 'kashima' => - array ( - ), - 'kitagata' => - array ( - ), - 'kitahata' => - array ( - ), - 'kiyama' => - array ( - ), - 'kouhoku' => - array ( - ), - 'kyuragi' => - array ( - ), - 'nishiarita' => - array ( - ), - 'ogi' => - array ( - ), - 'omachi' => - array ( - ), - 'ouchi' => - array ( - ), - 'saga' => - array ( - ), - 'shiroishi' => - array ( - ), - 'taku' => - array ( - ), - 'tara' => - array ( - ), - 'tosu' => - array ( - ), - 'yoshinogari' => - array ( - ), - ), - 'saitama' => - array ( - 'arakawa' => - array ( - ), - 'asaka' => - array ( - ), - 'chichibu' => - array ( - ), - 'fujimi' => - array ( - ), - 'fujimino' => - array ( - ), - 'fukaya' => - array ( - ), - 'hanno' => - array ( - ), - 'hanyu' => - array ( - ), - 'hasuda' => - array ( - ), - 'hatogaya' => - array ( - ), - 'hatoyama' => - array ( - ), - 'hidaka' => - array ( - ), - 'higashichichibu' => - array ( - ), - 'higashimatsuyama' => - array ( - ), - 'honjo' => - array ( - ), - 'ina' => - array ( - ), - 'iruma' => - array ( - ), - 'iwatsuki' => - array ( - ), - 'kamiizumi' => - array ( - ), - 'kamikawa' => - array ( - ), - 'kamisato' => - array ( - ), - 'kasukabe' => - array ( - ), - 'kawagoe' => - array ( - ), - 'kawaguchi' => - array ( - ), - 'kawajima' => - array ( - ), - 'kazo' => - array ( - ), - 'kitamoto' => - array ( - ), - 'koshigaya' => - array ( - ), - 'kounosu' => - array ( - ), - 'kuki' => - array ( - ), - 'kumagaya' => - array ( - ), - 'matsubushi' => - array ( - ), - 'minano' => - array ( - ), - 'misato' => - array ( - ), - 'miyashiro' => - array ( - ), - 'miyoshi' => - array ( - ), - 'moroyama' => - array ( - ), - 'nagatoro' => - array ( - ), - 'namegawa' => - array ( - ), - 'niiza' => - array ( - ), - 'ogano' => - array ( - ), - 'ogawa' => - array ( - ), - 'ogose' => - array ( - ), - 'okegawa' => - array ( - ), - 'omiya' => - array ( - ), - 'otaki' => - array ( - ), - 'ranzan' => - array ( - ), - 'ryokami' => - array ( - ), - 'saitama' => - array ( - ), - 'sakado' => - array ( - ), - 'satte' => - array ( - ), - 'sayama' => - array ( - ), - 'shiki' => - array ( - ), - 'shiraoka' => - array ( - ), - 'soka' => - array ( - ), - 'sugito' => - array ( - ), - 'toda' => - array ( - ), - 'tokigawa' => - array ( - ), - 'tokorozawa' => - array ( - ), - 'tsurugashima' => - array ( - ), - 'urawa' => - array ( - ), - 'warabi' => - array ( - ), - 'yashio' => - array ( - ), - 'yokoze' => - array ( - ), - 'yono' => - array ( - ), - 'yorii' => - array ( - ), - 'yoshida' => - array ( - ), - 'yoshikawa' => - array ( - ), - 'yoshimi' => - array ( - ), - ), - 'shiga' => - array ( - 'aisho' => - array ( - ), - 'gamo' => - array ( - ), - 'higashiomi' => - array ( - ), - 'hikone' => - array ( - ), - 'koka' => - array ( - ), - 'konan' => - array ( - ), - 'kosei' => - array ( - ), - 'koto' => - array ( - ), - 'kusatsu' => - array ( - ), - 'maibara' => - array ( - ), - 'moriyama' => - array ( - ), - 'nagahama' => - array ( - ), - 'nishiazai' => - array ( - ), - 'notogawa' => - array ( - ), - 'omihachiman' => - array ( - ), - 'otsu' => - array ( - ), - 'ritto' => - array ( - ), - 'ryuoh' => - array ( - ), - 'takashima' => - array ( - ), - 'takatsuki' => - array ( - ), - 'torahime' => - array ( - ), - 'toyosato' => - array ( - ), - 'yasu' => - array ( - ), - ), - 'shimane' => - array ( - 'akagi' => - array ( - ), - 'ama' => - array ( - ), - 'gotsu' => - array ( - ), - 'hamada' => - array ( - ), - 'higashiizumo' => - array ( - ), - 'hikawa' => - array ( - ), - 'hikimi' => - array ( - ), - 'izumo' => - array ( - ), - 'kakinoki' => - array ( - ), - 'masuda' => - array ( - ), - 'matsue' => - array ( - ), - 'misato' => - array ( - ), - 'nishinoshima' => - array ( - ), - 'ohda' => - array ( - ), - 'okinoshima' => - array ( - ), - 'okuizumo' => - array ( - ), - 'shimane' => - array ( - ), - 'tamayu' => - array ( - ), - 'tsuwano' => - array ( - ), - 'unnan' => - array ( - ), - 'yakumo' => - array ( - ), - 'yasugi' => - array ( - ), - 'yatsuka' => - array ( - ), - ), - 'shizuoka' => - array ( - 'arai' => - array ( - ), - 'atami' => - array ( - ), - 'fuji' => - array ( - ), - 'fujieda' => - array ( - ), - 'fujikawa' => - array ( - ), - 'fujinomiya' => - array ( - ), - 'fukuroi' => - array ( - ), - 'gotemba' => - array ( - ), - 'haibara' => - array ( - ), - 'hamamatsu' => - array ( - ), - 'higashiizu' => - array ( - ), - 'ito' => - array ( - ), - 'iwata' => - array ( - ), - 'izu' => - array ( - ), - 'izunokuni' => - array ( - ), - 'kakegawa' => - array ( - ), - 'kannami' => - array ( - ), - 'kawanehon' => - array ( - ), - 'kawazu' => - array ( - ), - 'kikugawa' => - array ( - ), - 'kosai' => - array ( - ), - 'makinohara' => - array ( - ), - 'matsuzaki' => - array ( - ), - 'minamiizu' => - array ( - ), - 'mishima' => - array ( - ), - 'morimachi' => - array ( - ), - 'nishiizu' => - array ( - ), - 'numazu' => - array ( - ), - 'omaezaki' => - array ( - ), - 'shimada' => - array ( - ), - 'shimizu' => - array ( - ), - 'shimoda' => - array ( - ), - 'shizuoka' => - array ( - ), - 'susono' => - array ( - ), - 'yaizu' => - array ( - ), - 'yoshida' => - array ( - ), - ), - 'tochigi' => - array ( - 'ashikaga' => - array ( - ), - 'bato' => - array ( - ), - 'haga' => - array ( - ), - 'ichikai' => - array ( - ), - 'iwafune' => - array ( - ), - 'kaminokawa' => - array ( - ), - 'kanuma' => - array ( - ), - 'karasuyama' => - array ( - ), - 'kuroiso' => - array ( - ), - 'mashiko' => - array ( - ), - 'mibu' => - array ( - ), - 'moka' => - array ( - ), - 'motegi' => - array ( - ), - 'nasu' => - array ( - ), - 'nasushiobara' => - array ( - ), - 'nikko' => - array ( - ), - 'nishikata' => - array ( - ), - 'nogi' => - array ( - ), - 'ohira' => - array ( - ), - 'ohtawara' => - array ( - ), - 'oyama' => - array ( - ), - 'sakura' => - array ( - ), - 'sano' => - array ( - ), - 'shimotsuke' => - array ( - ), - 'shioya' => - array ( - ), - 'takanezawa' => - array ( - ), - 'tochigi' => - array ( - ), - 'tsuga' => - array ( - ), - 'ujiie' => - array ( - ), - 'utsunomiya' => - array ( - ), - 'yaita' => - array ( - ), - ), - 'tokushima' => - array ( - 'aizumi' => - array ( - ), - 'anan' => - array ( - ), - 'ichiba' => - array ( - ), - 'itano' => - array ( - ), - 'kainan' => - array ( - ), - 'komatsushima' => - array ( - ), - 'matsushige' => - array ( - ), - 'mima' => - array ( - ), - 'minami' => - array ( - ), - 'miyoshi' => - array ( - ), - 'mugi' => - array ( - ), - 'nakagawa' => - array ( - ), - 'naruto' => - array ( - ), - 'sanagochi' => - array ( - ), - 'shishikui' => - array ( - ), - 'tokushima' => - array ( - ), - 'wajiki' => - array ( - ), - ), - 'tokyo' => - array ( - 'adachi' => - array ( - ), - 'akiruno' => - array ( - ), - 'akishima' => - array ( - ), - 'aogashima' => - array ( - ), - 'arakawa' => - array ( - ), - 'bunkyo' => - array ( - ), - 'chiyoda' => - array ( - ), - 'chofu' => - array ( - ), - 'chuo' => - array ( - ), - 'edogawa' => - array ( - ), - 'fuchu' => - array ( - ), - 'fussa' => - array ( - ), - 'hachijo' => - array ( - ), - 'hachioji' => - array ( - ), - 'hamura' => - array ( - ), - 'higashikurume' => - array ( - ), - 'higashimurayama' => - array ( - ), - 'higashiyamato' => - array ( - ), - 'hino' => - array ( - ), - 'hinode' => - array ( - ), - 'hinohara' => - array ( - ), - 'inagi' => - array ( - ), - 'itabashi' => - array ( - ), - 'katsushika' => - array ( - ), - 'kita' => - array ( - ), - 'kiyose' => - array ( - ), - 'kodaira' => - array ( - ), - 'koganei' => - array ( - ), - 'kokubunji' => - array ( - ), - 'komae' => - array ( - ), - 'koto' => - array ( - ), - 'kouzushima' => - array ( - ), - 'kunitachi' => - array ( - ), - 'machida' => - array ( - ), - 'meguro' => - array ( - ), - 'minato' => - array ( - ), - 'mitaka' => - array ( - ), - 'mizuho' => - array ( - ), - 'musashimurayama' => - array ( - ), - 'musashino' => - array ( - ), - 'nakano' => - array ( - ), - 'nerima' => - array ( - ), - 'ogasawara' => - array ( - ), - 'okutama' => - array ( - ), - 'ome' => - array ( - ), - 'oshima' => - array ( - ), - 'ota' => - array ( - ), - 'setagaya' => - array ( - ), - 'shibuya' => - array ( - ), - 'shinagawa' => - array ( - ), - 'shinjuku' => - array ( - ), - 'suginami' => - array ( - ), - 'sumida' => - array ( - ), - 'tachikawa' => - array ( - ), - 'taito' => - array ( - ), - 'tama' => - array ( - ), - 'toshima' => - array ( - ), - ), - 'tottori' => - array ( - 'chizu' => - array ( - ), - 'hino' => - array ( - ), - 'kawahara' => - array ( - ), - 'koge' => - array ( - ), - 'kotoura' => - array ( - ), - 'misasa' => - array ( - ), - 'nanbu' => - array ( - ), - 'nichinan' => - array ( - ), - 'sakaiminato' => - array ( - ), - 'tottori' => - array ( - ), - 'wakasa' => - array ( - ), - 'yazu' => - array ( - ), - 'yonago' => - array ( - ), - ), - 'toyama' => - array ( - 'asahi' => - array ( - ), - 'fuchu' => - array ( - ), - 'fukumitsu' => - array ( - ), - 'funahashi' => - array ( - ), - 'himi' => - array ( - ), - 'imizu' => - array ( - ), - 'inami' => - array ( - ), - 'johana' => - array ( - ), - 'kamiichi' => - array ( - ), - 'kurobe' => - array ( - ), - 'nakaniikawa' => - array ( - ), - 'namerikawa' => - array ( - ), - 'nanto' => - array ( - ), - 'nyuzen' => - array ( - ), - 'oyabe' => - array ( - ), - 'taira' => - array ( - ), - 'takaoka' => - array ( - ), - 'tateyama' => - array ( - ), - 'toga' => - array ( - ), - 'tonami' => - array ( - ), - 'toyama' => - array ( - ), - 'unazuki' => - array ( - ), - 'uozu' => - array ( - ), - 'yamada' => - array ( - ), - ), - 'wakayama' => - array ( - 'arida' => - array ( - ), - 'aridagawa' => - array ( - ), - 'gobo' => - array ( - ), - 'hashimoto' => - array ( - ), - 'hidaka' => - array ( - ), - 'hirogawa' => - array ( - ), - 'inami' => - array ( - ), - 'iwade' => - array ( - ), - 'kainan' => - array ( - ), - 'kamitonda' => - array ( - ), - 'katsuragi' => - array ( - ), - 'kimino' => - array ( - ), - 'kinokawa' => - array ( - ), - 'kitayama' => - array ( - ), - 'koya' => - array ( - ), - 'koza' => - array ( - ), - 'kozagawa' => - array ( - ), - 'kudoyama' => - array ( - ), - 'kushimoto' => - array ( - ), - 'mihama' => - array ( - ), - 'misato' => - array ( - ), - 'nachikatsuura' => - array ( - ), - 'shingu' => - array ( - ), - 'shirahama' => - array ( - ), - 'taiji' => - array ( - ), - 'tanabe' => - array ( - ), - 'wakayama' => - array ( - ), - 'yuasa' => - array ( - ), - 'yura' => - array ( - ), - ), - 'yamagata' => - array ( - 'asahi' => - array ( - ), - 'funagata' => - array ( - ), - 'higashine' => - array ( - ), - 'iide' => - array ( - ), - 'kahoku' => - array ( - ), - 'kaminoyama' => - array ( - ), - 'kaneyama' => - array ( - ), - 'kawanishi' => - array ( - ), - 'mamurogawa' => - array ( - ), - 'mikawa' => - array ( - ), - 'murayama' => - array ( - ), - 'nagai' => - array ( - ), - 'nakayama' => - array ( - ), - 'nanyo' => - array ( - ), - 'nishikawa' => - array ( - ), - 'obanazawa' => - array ( - ), - 'oe' => - array ( - ), - 'oguni' => - array ( - ), - 'ohkura' => - array ( - ), - 'oishida' => - array ( - ), - 'sagae' => - array ( - ), - 'sakata' => - array ( - ), - 'sakegawa' => - array ( - ), - 'shinjo' => - array ( - ), - 'shirataka' => - array ( - ), - 'shonai' => - array ( - ), - 'takahata' => - array ( - ), - 'tendo' => - array ( - ), - 'tozawa' => - array ( - ), - 'tsuruoka' => - array ( - ), - 'yamagata' => - array ( - ), - 'yamanobe' => - array ( - ), - 'yonezawa' => - array ( - ), - 'yuza' => - array ( - ), - ), - 'yamaguchi' => - array ( - 'abu' => - array ( - ), - 'hagi' => - array ( - ), - 'hikari' => - array ( - ), - 'hofu' => - array ( - ), - 'iwakuni' => - array ( - ), - 'kudamatsu' => - array ( - ), - 'mitou' => - array ( - ), - 'nagato' => - array ( - ), - 'oshima' => - array ( - ), - 'shimonoseki' => - array ( - ), - 'shunan' => - array ( - ), - 'tabuse' => - array ( - ), - 'tokuyama' => - array ( - ), - 'toyota' => - array ( - ), - 'ube' => - array ( - ), - 'yuu' => - array ( - ), - ), - 'yamanashi' => - array ( - 'chuo' => - array ( - ), - 'doshi' => - array ( - ), - 'fuefuki' => - array ( - ), - 'fujikawa' => - array ( - ), - 'fujikawaguchiko' => - array ( - ), - 'fujiyoshida' => - array ( - ), - 'hayakawa' => - array ( - ), - 'hokuto' => - array ( - ), - 'ichikawamisato' => - array ( - ), - 'kai' => - array ( - ), - 'kofu' => - array ( - ), - 'koshu' => - array ( - ), - 'kosuge' => - array ( - ), - 'minami-alps' => - array ( - ), - 'minobu' => - array ( - ), - 'nakamichi' => - array ( - ), - 'nanbu' => - array ( - ), - 'narusawa' => - array ( - ), - 'nirasaki' => - array ( - ), - 'nishikatsura' => - array ( - ), - 'oshino' => - array ( - ), - 'otsuki' => - array ( - ), - 'showa' => - array ( - ), - 'tabayama' => - array ( - ), - 'tsuru' => - array ( - ), - 'uenohara' => - array ( - ), - 'yamanakako' => - array ( - ), - 'yamanashi' => - array ( - ), - ), - 'xn--4pvxs' => - array ( - ), - 'xn--vgu402c' => - array ( - ), - 'xn--c3s14m' => - array ( - ), - 'xn--f6qx53a' => - array ( - ), - 'xn--8pvr4u' => - array ( - ), - 'xn--uist22h' => - array ( - ), - 'xn--djrs72d6uy' => - array ( - ), - 'xn--mkru45i' => - array ( - ), - 'xn--0trq7p7nn' => - array ( - ), - 'xn--8ltr62k' => - array ( - ), - 'xn--2m4a15e' => - array ( - ), - 'xn--efvn9s' => - array ( - ), - 'xn--32vp30h' => - array ( - ), - 'xn--4it797k' => - array ( - ), - 'xn--1lqs71d' => - array ( - ), - 'xn--5rtp49c' => - array ( - ), - 'xn--5js045d' => - array ( - ), - 'xn--ehqz56n' => - array ( - ), - 'xn--1lqs03n' => - array ( - ), - 'xn--qqqt11m' => - array ( - ), - 'xn--kbrq7o' => - array ( - ), - 'xn--pssu33l' => - array ( - ), - 'xn--ntsq17g' => - array ( - ), - 'xn--uisz3g' => - array ( - ), - 'xn--6btw5a' => - array ( - ), - 'xn--1ctwo' => - array ( - ), - 'xn--6orx2r' => - array ( - ), - 'xn--rht61e' => - array ( - ), - 'xn--rht27z' => - array ( - ), - 'xn--djty4k' => - array ( - ), - 'xn--nit225k' => - array ( - ), - 'xn--rht3d' => - array ( - ), - 'xn--klty5x' => - array ( - ), - 'xn--kltx9a' => - array ( - ), - 'xn--kltp7d' => - array ( - ), - 'xn--uuwu58a' => - array ( - ), - 'xn--zbx025d' => - array ( - ), - 'xn--ntso0iqx3a' => - array ( - ), - 'xn--elqq16h' => - array ( - ), - 'xn--4it168d' => - array ( - ), - 'xn--klt787d' => - array ( - ), - 'xn--rny31h' => - array ( - ), - 'xn--7t0a264c' => - array ( - ), - 'xn--5rtq34k' => - array ( - ), - 'xn--k7yn95e' => - array ( - ), - 'xn--tor131o' => - array ( - ), - 'xn--d5qv7z876c' => - array ( - ), - 'kawasaki' => - array ( - '*' => - array ( - ), - 'city' => - array ( - '!' => '', - ), - ), - 'kitakyushu' => - array ( - '*' => - array ( - ), - 'city' => - array ( - '!' => '', - ), - ), - 'kobe' => - array ( - '*' => - array ( - ), - 'city' => - array ( - '!' => '', - ), - ), - 'nagoya' => - array ( - '*' => - array ( - ), - 'city' => - array ( - '!' => '', - ), - ), - 'sapporo' => - array ( - '*' => - array ( - ), - 'city' => - array ( - '!' => '', - ), - ), - 'sendai' => - array ( - '*' => - array ( - ), - 'city' => - array ( - '!' => '', - ), - ), - 'yokohama' => - array ( - '*' => - array ( - ), - 'city' => - array ( - '!' => '', - ), - ), - 'blogspot' => - array ( - ), - ), - 'ke' => - array ( - '*' => - array ( - ), - 'co' => - array ( - 'blogspot' => - array ( - ), - ), - ), - 'kg' => - array ( - 'org' => - array ( - ), - 'net' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - ), - 'kh' => - array ( - '*' => - array ( - ), - ), - 'ki' => - array ( - 'edu' => - array ( - ), - 'biz' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - 'info' => - array ( - ), - 'com' => - array ( - ), - ), - 'km' => - array ( - 'org' => - array ( - ), - 'nom' => - array ( - ), - 'gov' => - array ( - ), - 'prd' => - array ( - ), - 'tm' => - array ( - ), - 'edu' => - array ( - ), - 'mil' => - array ( - ), - 'ass' => - array ( - ), - 'com' => - array ( - ), - 'coop' => - array ( - ), - 'asso' => - array ( - ), - 'presse' => - array ( - ), - 'medecin' => - array ( - ), - 'notaires' => - array ( - ), - 'pharmaciens' => - array ( - ), - 'veterinaire' => - array ( - ), - 'gouv' => - array ( - ), - ), - 'kn' => - array ( - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - ), - 'kp' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'rep' => - array ( - ), - 'tra' => - array ( - ), - ), - 'kr' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'es' => - array ( - ), - 'go' => - array ( - ), - 'hs' => - array ( - ), - 'kg' => - array ( - ), - 'mil' => - array ( - ), - 'ms' => - array ( - ), - 'ne' => - array ( - ), - 'or' => - array ( - ), - 'pe' => - array ( - ), - 're' => - array ( - ), - 'sc' => - array ( - ), - 'busan' => - array ( - ), - 'chungbuk' => - array ( - ), - 'chungnam' => - array ( - ), - 'daegu' => - array ( - ), - 'daejeon' => - array ( - ), - 'gangwon' => - array ( - ), - 'gwangju' => - array ( - ), - 'gyeongbuk' => - array ( - ), - 'gyeonggi' => - array ( - ), - 'gyeongnam' => - array ( - ), - 'incheon' => - array ( - ), - 'jeju' => - array ( - ), - 'jeonbuk' => - array ( - ), - 'jeonnam' => - array ( - ), - 'seoul' => - array ( - ), - 'ulsan' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'kw' => - array ( - '*' => - array ( - ), - ), - 'ky' => - array ( - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - ), - 'kz' => - array ( - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'net' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'com' => - array ( - ), - 'nym' => - array ( - ), - ), - 'la' => - array ( - 'int' => - array ( - ), - 'net' => - array ( - ), - 'info' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'per' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - 'bnr' => - array ( - ), - 'c' => - array ( - ), - 'nym' => - array ( - ), - ), - 'lb' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'lc' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'co' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'oy' => - array ( - ), - ), - 'li' => - array ( - 'blogspot' => - array ( - ), - 'nom' => - array ( - ), - 'nym' => - array ( - ), - ), - 'lk' => - array ( - 'gov' => - array ( - ), - 'sch' => - array ( - ), - 'net' => - array ( - ), - 'int' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'ngo' => - array ( - ), - 'soc' => - array ( - ), - 'web' => - array ( - ), - 'ltd' => - array ( - ), - 'assn' => - array ( - ), - 'grp' => - array ( - ), - 'hotel' => - array ( - ), - 'ac' => - array ( - ), - ), - 'lr' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - ), - 'ls' => - array ( - 'co' => - array ( - ), - 'org' => - array ( - ), - ), - 'lt' => - array ( - 'gov' => - array ( - ), - 'blogspot' => - array ( - ), - 'nym' => - array ( - ), - ), - 'lu' => - array ( - 'blogspot' => - array ( - ), - 'nym' => - array ( - ), - ), - 'lv' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'mil' => - array ( - ), - 'id' => - array ( - ), - 'net' => - array ( - ), - 'asn' => - array ( - ), - 'conf' => - array ( - ), - ), - 'ly' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'gov' => - array ( - ), - 'plc' => - array ( - ), - 'edu' => - array ( - ), - 'sch' => - array ( - ), - 'med' => - array ( - ), - 'org' => - array ( - ), - 'id' => - array ( - ), - ), - 'ma' => - array ( - 'co' => - array ( - ), - 'net' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'ac' => - array ( - ), - 'press' => - array ( - ), - ), - 'mc' => - array ( - 'tm' => - array ( - ), - 'asso' => - array ( - ), - ), - 'md' => - array ( - 'blogspot' => - array ( - ), - ), - 'me' => - array ( - 'co' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'ac' => - array ( - ), - 'gov' => - array ( - ), - 'its' => - array ( - ), - 'priv' => - array ( - ), - 'c66' => - array ( - ), - 'daplie' => - array ( - 'localhost' => - array ( - ), - ), - 'filegear' => - array ( - ), - 'brasilia' => - array ( - ), - 'ddns' => - array ( - ), - 'dnsfor' => - array ( - ), - 'hopto' => - array ( - ), - 'loginto' => - array ( - ), - 'noip' => - array ( - ), - 'webhop' => - array ( - ), - 'nym' => - array ( - ), - 'diskstation' => - array ( - ), - 'dscloud' => - array ( - ), - 'i234' => - array ( - ), - 'myds' => - array ( - ), - 'synology' => - array ( - ), - 'wedeploy' => - array ( - ), - 'yombo' => - array ( - ), - ), - 'mg' => - array ( - 'org' => - array ( - ), - 'nom' => - array ( - ), - 'gov' => - array ( - ), - 'prd' => - array ( - ), - 'tm' => - array ( - ), - 'edu' => - array ( - ), - 'mil' => - array ( - ), - 'com' => - array ( - ), - 'co' => - array ( - ), - ), - 'mh' => - array ( - ), - 'mil' => - array ( - ), - 'mk' => - array ( - 'com' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'inf' => - array ( - ), - 'name' => - array ( - ), - 'blogspot' => - array ( - ), - 'nom' => - array ( - ), - ), - 'ml' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gouv' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'presse' => - array ( - ), - ), - 'mm' => - array ( - '*' => - array ( - ), - ), - 'mn' => - array ( - 'gov' => - array ( - ), - 'edu' => - array ( - ), - 'org' => - array ( - ), - 'nyc' => - array ( - ), - ), - 'mo' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - ), - 'mobi' => - array ( - 'dscloud' => - array ( - ), - ), - 'mp' => - array ( - ), - 'mq' => - array ( - ), - 'mr' => - array ( - 'gov' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'ms' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'mt' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - 'edu' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'mu' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'or' => - array ( - ), - ), - 'museum' => - array ( - 'academy' => - array ( - ), - 'agriculture' => - array ( - ), - 'air' => - array ( - ), - 'airguard' => - array ( - ), - 'alabama' => - array ( - ), - 'alaska' => - array ( - ), - 'amber' => - array ( - ), - 'ambulance' => - array ( - ), - 'american' => - array ( - ), - 'americana' => - array ( - ), - 'americanantiques' => - array ( - ), - 'americanart' => - array ( - ), - 'amsterdam' => - array ( - ), - 'and' => - array ( - ), - 'annefrank' => - array ( - ), - 'anthro' => - array ( - ), - 'anthropology' => - array ( - ), - 'antiques' => - array ( - ), - 'aquarium' => - array ( - ), - 'arboretum' => - array ( - ), - 'archaeological' => - array ( - ), - 'archaeology' => - array ( - ), - 'architecture' => - array ( - ), - 'art' => - array ( - ), - 'artanddesign' => - array ( - ), - 'artcenter' => - array ( - ), - 'artdeco' => - array ( - ), - 'arteducation' => - array ( - ), - 'artgallery' => - array ( - ), - 'arts' => - array ( - ), - 'artsandcrafts' => - array ( - ), - 'asmatart' => - array ( - ), - 'assassination' => - array ( - ), - 'assisi' => - array ( - ), - 'association' => - array ( - ), - 'astronomy' => - array ( - ), - 'atlanta' => - array ( - ), - 'austin' => - array ( - ), - 'australia' => - array ( - ), - 'automotive' => - array ( - ), - 'aviation' => - array ( - ), - 'axis' => - array ( - ), - 'badajoz' => - array ( - ), - 'baghdad' => - array ( - ), - 'bahn' => - array ( - ), - 'bale' => - array ( - ), - 'baltimore' => - array ( - ), - 'barcelona' => - array ( - ), - 'baseball' => - array ( - ), - 'basel' => - array ( - ), - 'baths' => - array ( - ), - 'bauern' => - array ( - ), - 'beauxarts' => - array ( - ), - 'beeldengeluid' => - array ( - ), - 'bellevue' => - array ( - ), - 'bergbau' => - array ( - ), - 'berkeley' => - array ( - ), - 'berlin' => - array ( - ), - 'bern' => - array ( - ), - 'bible' => - array ( - ), - 'bilbao' => - array ( - ), - 'bill' => - array ( - ), - 'birdart' => - array ( - ), - 'birthplace' => - array ( - ), - 'bonn' => - array ( - ), - 'boston' => - array ( - ), - 'botanical' => - array ( - ), - 'botanicalgarden' => - array ( - ), - 'botanicgarden' => - array ( - ), - 'botany' => - array ( - ), - 'brandywinevalley' => - array ( - ), - 'brasil' => - array ( - ), - 'bristol' => - array ( - ), - 'british' => - array ( - ), - 'britishcolumbia' => - array ( - ), - 'broadcast' => - array ( - ), - 'brunel' => - array ( - ), - 'brussel' => - array ( - ), - 'brussels' => - array ( - ), - 'bruxelles' => - array ( - ), - 'building' => - array ( - ), - 'burghof' => - array ( - ), - 'bus' => - array ( - ), - 'bushey' => - array ( - ), - 'cadaques' => - array ( - ), - 'california' => - array ( - ), - 'cambridge' => - array ( - ), - 'can' => - array ( - ), - 'canada' => - array ( - ), - 'capebreton' => - array ( - ), - 'carrier' => - array ( - ), - 'cartoonart' => - array ( - ), - 'casadelamoneda' => - array ( - ), - 'castle' => - array ( - ), - 'castres' => - array ( - ), - 'celtic' => - array ( - ), - 'center' => - array ( - ), - 'chattanooga' => - array ( - ), - 'cheltenham' => - array ( - ), - 'chesapeakebay' => - array ( - ), - 'chicago' => - array ( - ), - 'children' => - array ( - ), - 'childrens' => - array ( - ), - 'childrensgarden' => - array ( - ), - 'chiropractic' => - array ( - ), - 'chocolate' => - array ( - ), - 'christiansburg' => - array ( - ), - 'cincinnati' => - array ( - ), - 'cinema' => - array ( - ), - 'circus' => - array ( - ), - 'civilisation' => - array ( - ), - 'civilization' => - array ( - ), - 'civilwar' => - array ( - ), - 'clinton' => - array ( - ), - 'clock' => - array ( - ), - 'coal' => - array ( - ), - 'coastaldefence' => - array ( - ), - 'cody' => - array ( - ), - 'coldwar' => - array ( - ), - 'collection' => - array ( - ), - 'colonialwilliamsburg' => - array ( - ), - 'coloradoplateau' => - array ( - ), - 'columbia' => - array ( - ), - 'columbus' => - array ( - ), - 'communication' => - array ( - ), - 'communications' => - array ( - ), - 'community' => - array ( - ), - 'computer' => - array ( - ), - 'computerhistory' => - array ( - ), - 'xn--comunicaes-v6a2o' => - array ( - ), - 'contemporary' => - array ( - ), - 'contemporaryart' => - array ( - ), - 'convent' => - array ( - ), - 'copenhagen' => - array ( - ), - 'corporation' => - array ( - ), - 'xn--correios-e-telecomunicaes-ghc29a' => - array ( - ), - 'corvette' => - array ( - ), - 'costume' => - array ( - ), - 'countryestate' => - array ( - ), - 'county' => - array ( - ), - 'crafts' => - array ( - ), - 'cranbrook' => - array ( - ), - 'creation' => - array ( - ), - 'cultural' => - array ( - ), - 'culturalcenter' => - array ( - ), - 'culture' => - array ( - ), - 'cyber' => - array ( - ), - 'cymru' => - array ( - ), - 'dali' => - array ( - ), - 'dallas' => - array ( - ), - 'database' => - array ( - ), - 'ddr' => - array ( - ), - 'decorativearts' => - array ( - ), - 'delaware' => - array ( - ), - 'delmenhorst' => - array ( - ), - 'denmark' => - array ( - ), - 'depot' => - array ( - ), - 'design' => - array ( - ), - 'detroit' => - array ( - ), - 'dinosaur' => - array ( - ), - 'discovery' => - array ( - ), - 'dolls' => - array ( - ), - 'donostia' => - array ( - ), - 'durham' => - array ( - ), - 'eastafrica' => - array ( - ), - 'eastcoast' => - array ( - ), - 'education' => - array ( - ), - 'educational' => - array ( - ), - 'egyptian' => - array ( - ), - 'eisenbahn' => - array ( - ), - 'elburg' => - array ( - ), - 'elvendrell' => - array ( - ), - 'embroidery' => - array ( - ), - 'encyclopedic' => - array ( - ), - 'england' => - array ( - ), - 'entomology' => - array ( - ), - 'environment' => - array ( - ), - 'environmentalconservation' => - array ( - ), - 'epilepsy' => - array ( - ), - 'essex' => - array ( - ), - 'estate' => - array ( - ), - 'ethnology' => - array ( - ), - 'exeter' => - array ( - ), - 'exhibition' => - array ( - ), - 'family' => - array ( - ), - 'farm' => - array ( - ), - 'farmequipment' => - array ( - ), - 'farmers' => - array ( - ), - 'farmstead' => - array ( - ), - 'field' => - array ( - ), - 'figueres' => - array ( - ), - 'filatelia' => - array ( - ), - 'film' => - array ( - ), - 'fineart' => - array ( - ), - 'finearts' => - array ( - ), - 'finland' => - array ( - ), - 'flanders' => - array ( - ), - 'florida' => - array ( - ), - 'force' => - array ( - ), - 'fortmissoula' => - array ( - ), - 'fortworth' => - array ( - ), - 'foundation' => - array ( - ), - 'francaise' => - array ( - ), - 'frankfurt' => - array ( - ), - 'franziskaner' => - array ( - ), - 'freemasonry' => - array ( - ), - 'freiburg' => - array ( - ), - 'fribourg' => - array ( - ), - 'frog' => - array ( - ), - 'fundacio' => - array ( - ), - 'furniture' => - array ( - ), - 'gallery' => - array ( - ), - 'garden' => - array ( - ), - 'gateway' => - array ( - ), - 'geelvinck' => - array ( - ), - 'gemological' => - array ( - ), - 'geology' => - array ( - ), - 'georgia' => - array ( - ), - 'giessen' => - array ( - ), - 'glas' => - array ( - ), - 'glass' => - array ( - ), - 'gorge' => - array ( - ), - 'grandrapids' => - array ( - ), - 'graz' => - array ( - ), - 'guernsey' => - array ( - ), - 'halloffame' => - array ( - ), - 'hamburg' => - array ( - ), - 'handson' => - array ( - ), - 'harvestcelebration' => - array ( - ), - 'hawaii' => - array ( - ), - 'health' => - array ( - ), - 'heimatunduhren' => - array ( - ), - 'hellas' => - array ( - ), - 'helsinki' => - array ( - ), - 'hembygdsforbund' => - array ( - ), - 'heritage' => - array ( - ), - 'histoire' => - array ( - ), - 'historical' => - array ( - ), - 'historicalsociety' => - array ( - ), - 'historichouses' => - array ( - ), - 'historisch' => - array ( - ), - 'historisches' => - array ( - ), - 'history' => - array ( - ), - 'historyofscience' => - array ( - ), - 'horology' => - array ( - ), - 'house' => - array ( - ), - 'humanities' => - array ( - ), - 'illustration' => - array ( - ), - 'imageandsound' => - array ( - ), - 'indian' => - array ( - ), - 'indiana' => - array ( - ), - 'indianapolis' => - array ( - ), - 'indianmarket' => - array ( - ), - 'intelligence' => - array ( - ), - 'interactive' => - array ( - ), - 'iraq' => - array ( - ), - 'iron' => - array ( - ), - 'isleofman' => - array ( - ), - 'jamison' => - array ( - ), - 'jefferson' => - array ( - ), - 'jerusalem' => - array ( - ), - 'jewelry' => - array ( - ), - 'jewish' => - array ( - ), - 'jewishart' => - array ( - ), - 'jfk' => - array ( - ), - 'journalism' => - array ( - ), - 'judaica' => - array ( - ), - 'judygarland' => - array ( - ), - 'juedisches' => - array ( - ), - 'juif' => - array ( - ), - 'karate' => - array ( - ), - 'karikatur' => - array ( - ), - 'kids' => - array ( - ), - 'koebenhavn' => - array ( - ), - 'koeln' => - array ( - ), - 'kunst' => - array ( - ), - 'kunstsammlung' => - array ( - ), - 'kunstunddesign' => - array ( - ), - 'labor' => - array ( - ), - 'labour' => - array ( - ), - 'lajolla' => - array ( - ), - 'lancashire' => - array ( - ), - 'landes' => - array ( - ), - 'lans' => - array ( - ), - 'xn--lns-qla' => - array ( - ), - 'larsson' => - array ( - ), - 'lewismiller' => - array ( - ), - 'lincoln' => - array ( - ), - 'linz' => - array ( - ), - 'living' => - array ( - ), - 'livinghistory' => - array ( - ), - 'localhistory' => - array ( - ), - 'london' => - array ( - ), - 'losangeles' => - array ( - ), - 'louvre' => - array ( - ), - 'loyalist' => - array ( - ), - 'lucerne' => - array ( - ), - 'luxembourg' => - array ( - ), - 'luzern' => - array ( - ), - 'mad' => - array ( - ), - 'madrid' => - array ( - ), - 'mallorca' => - array ( - ), - 'manchester' => - array ( - ), - 'mansion' => - array ( - ), - 'mansions' => - array ( - ), - 'manx' => - array ( - ), - 'marburg' => - array ( - ), - 'maritime' => - array ( - ), - 'maritimo' => - array ( - ), - 'maryland' => - array ( - ), - 'marylhurst' => - array ( - ), - 'media' => - array ( - ), - 'medical' => - array ( - ), - 'medizinhistorisches' => - array ( - ), - 'meeres' => - array ( - ), - 'memorial' => - array ( - ), - 'mesaverde' => - array ( - ), - 'michigan' => - array ( - ), - 'midatlantic' => - array ( - ), - 'military' => - array ( - ), - 'mill' => - array ( - ), - 'miners' => - array ( - ), - 'mining' => - array ( - ), - 'minnesota' => - array ( - ), - 'missile' => - array ( - ), - 'missoula' => - array ( - ), - 'modern' => - array ( - ), - 'moma' => - array ( - ), - 'money' => - array ( - ), - 'monmouth' => - array ( - ), - 'monticello' => - array ( - ), - 'montreal' => - array ( - ), - 'moscow' => - array ( - ), - 'motorcycle' => - array ( - ), - 'muenchen' => - array ( - ), - 'muenster' => - array ( - ), - 'mulhouse' => - array ( - ), - 'muncie' => - array ( - ), - 'museet' => - array ( - ), - 'museumcenter' => - array ( - ), - 'museumvereniging' => - array ( - ), - 'music' => - array ( - ), - 'national' => - array ( - ), - 'nationalfirearms' => - array ( - ), - 'nationalheritage' => - array ( - ), - 'nativeamerican' => - array ( - ), - 'naturalhistory' => - array ( - ), - 'naturalhistorymuseum' => - array ( - ), - 'naturalsciences' => - array ( - ), - 'nature' => - array ( - ), - 'naturhistorisches' => - array ( - ), - 'natuurwetenschappen' => - array ( - ), - 'naumburg' => - array ( - ), - 'naval' => - array ( - ), - 'nebraska' => - array ( - ), - 'neues' => - array ( - ), - 'newhampshire' => - array ( - ), - 'newjersey' => - array ( - ), - 'newmexico' => - array ( - ), - 'newport' => - array ( - ), - 'newspaper' => - array ( - ), - 'newyork' => - array ( - ), - 'niepce' => - array ( - ), - 'norfolk' => - array ( - ), - 'north' => - array ( - ), - 'nrw' => - array ( - ), - 'nuernberg' => - array ( - ), - 'nuremberg' => - array ( - ), - 'nyc' => - array ( - ), - 'nyny' => - array ( - ), - 'oceanographic' => - array ( - ), - 'oceanographique' => - array ( - ), - 'omaha' => - array ( - ), - 'online' => - array ( - ), - 'ontario' => - array ( - ), - 'openair' => - array ( - ), - 'oregon' => - array ( - ), - 'oregontrail' => - array ( - ), - 'otago' => - array ( - ), - 'oxford' => - array ( - ), - 'pacific' => - array ( - ), - 'paderborn' => - array ( - ), - 'palace' => - array ( - ), - 'paleo' => - array ( - ), - 'palmsprings' => - array ( - ), - 'panama' => - array ( - ), - 'paris' => - array ( - ), - 'pasadena' => - array ( - ), - 'pharmacy' => - array ( - ), - 'philadelphia' => - array ( - ), - 'philadelphiaarea' => - array ( - ), - 'philately' => - array ( - ), - 'phoenix' => - array ( - ), - 'photography' => - array ( - ), - 'pilots' => - array ( - ), - 'pittsburgh' => - array ( - ), - 'planetarium' => - array ( - ), - 'plantation' => - array ( - ), - 'plants' => - array ( - ), - 'plaza' => - array ( - ), - 'portal' => - array ( - ), - 'portland' => - array ( - ), - 'portlligat' => - array ( - ), - 'posts-and-telecommunications' => - array ( - ), - 'preservation' => - array ( - ), - 'presidio' => - array ( - ), - 'press' => - array ( - ), - 'project' => - array ( - ), - 'public' => - array ( - ), - 'pubol' => - array ( - ), - 'quebec' => - array ( - ), - 'railroad' => - array ( - ), - 'railway' => - array ( - ), - 'research' => - array ( - ), - 'resistance' => - array ( - ), - 'riodejaneiro' => - array ( - ), - 'rochester' => - array ( - ), - 'rockart' => - array ( - ), - 'roma' => - array ( - ), - 'russia' => - array ( - ), - 'saintlouis' => - array ( - ), - 'salem' => - array ( - ), - 'salvadordali' => - array ( - ), - 'salzburg' => - array ( - ), - 'sandiego' => - array ( - ), - 'sanfrancisco' => - array ( - ), - 'santabarbara' => - array ( - ), - 'santacruz' => - array ( - ), - 'santafe' => - array ( - ), - 'saskatchewan' => - array ( - ), - 'satx' => - array ( - ), - 'savannahga' => - array ( - ), - 'schlesisches' => - array ( - ), - 'schoenbrunn' => - array ( - ), - 'schokoladen' => - array ( - ), - 'school' => - array ( - ), - 'schweiz' => - array ( - ), - 'science' => - array ( - ), - 'scienceandhistory' => - array ( - ), - 'scienceandindustry' => - array ( - ), - 'sciencecenter' => - array ( - ), - 'sciencecenters' => - array ( - ), - 'science-fiction' => - array ( - ), - 'sciencehistory' => - array ( - ), - 'sciences' => - array ( - ), - 'sciencesnaturelles' => - array ( - ), - 'scotland' => - array ( - ), - 'seaport' => - array ( - ), - 'settlement' => - array ( - ), - 'settlers' => - array ( - ), - 'shell' => - array ( - ), - 'sherbrooke' => - array ( - ), - 'sibenik' => - array ( - ), - 'silk' => - array ( - ), - 'ski' => - array ( - ), - 'skole' => - array ( - ), - 'society' => - array ( - ), - 'sologne' => - array ( - ), - 'soundandvision' => - array ( - ), - 'southcarolina' => - array ( - ), - 'southwest' => - array ( - ), - 'space' => - array ( - ), - 'spy' => - array ( - ), - 'square' => - array ( - ), - 'stadt' => - array ( - ), - 'stalbans' => - array ( - ), - 'starnberg' => - array ( - ), - 'state' => - array ( - ), - 'stateofdelaware' => - array ( - ), - 'station' => - array ( - ), - 'steam' => - array ( - ), - 'steiermark' => - array ( - ), - 'stjohn' => - array ( - ), - 'stockholm' => - array ( - ), - 'stpetersburg' => - array ( - ), - 'stuttgart' => - array ( - ), - 'suisse' => - array ( - ), - 'surgeonshall' => - array ( - ), - 'surrey' => - array ( - ), - 'svizzera' => - array ( - ), - 'sweden' => - array ( - ), - 'sydney' => - array ( - ), - 'tank' => - array ( - ), - 'tcm' => - array ( - ), - 'technology' => - array ( - ), - 'telekommunikation' => - array ( - ), - 'television' => - array ( - ), - 'texas' => - array ( - ), - 'textile' => - array ( - ), - 'theater' => - array ( - ), - 'time' => - array ( - ), - 'timekeeping' => - array ( - ), - 'topology' => - array ( - ), - 'torino' => - array ( - ), - 'touch' => - array ( - ), - 'town' => - array ( - ), - 'transport' => - array ( - ), - 'tree' => - array ( - ), - 'trolley' => - array ( - ), - 'trust' => - array ( - ), - 'trustee' => - array ( - ), - 'uhren' => - array ( - ), - 'ulm' => - array ( - ), - 'undersea' => - array ( - ), - 'university' => - array ( - ), - 'usa' => - array ( - ), - 'usantiques' => - array ( - ), - 'usarts' => - array ( - ), - 'uscountryestate' => - array ( - ), - 'usculture' => - array ( - ), - 'usdecorativearts' => - array ( - ), - 'usgarden' => - array ( - ), - 'ushistory' => - array ( - ), - 'ushuaia' => - array ( - ), - 'uslivinghistory' => - array ( - ), - 'utah' => - array ( - ), - 'uvic' => - array ( - ), - 'valley' => - array ( - ), - 'vantaa' => - array ( - ), - 'versailles' => - array ( - ), - 'viking' => - array ( - ), - 'village' => - array ( - ), - 'virginia' => - array ( - ), - 'virtual' => - array ( - ), - 'virtuel' => - array ( - ), - 'vlaanderen' => - array ( - ), - 'volkenkunde' => - array ( - ), - 'wales' => - array ( - ), - 'wallonie' => - array ( - ), - 'war' => - array ( - ), - 'washingtondc' => - array ( - ), - 'watchandclock' => - array ( - ), - 'watch-and-clock' => - array ( - ), - 'western' => - array ( - ), - 'westfalen' => - array ( - ), - 'whaling' => - array ( - ), - 'wildlife' => - array ( - ), - 'williamsburg' => - array ( - ), - 'windmill' => - array ( - ), - 'workshop' => - array ( - ), - 'york' => - array ( - ), - 'yorkshire' => - array ( - ), - 'yosemite' => - array ( - ), - 'youth' => - array ( - ), - 'zoological' => - array ( - ), - 'zoology' => - array ( - ), - 'xn--9dbhblg6di' => - array ( - ), - 'xn--h1aegh' => - array ( - ), - ), - 'mv' => - array ( - 'aero' => - array ( - ), - 'biz' => - array ( - ), - 'com' => - array ( - ), - 'coop' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'info' => - array ( - ), - 'int' => - array ( - ), - 'mil' => - array ( - ), - 'museum' => - array ( - ), - 'name' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'pro' => - array ( - ), - ), - 'mw' => - array ( - 'ac' => - array ( - ), - 'biz' => - array ( - ), - 'co' => - array ( - ), - 'com' => - array ( - ), - 'coop' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'int' => - array ( - ), - 'museum' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'mx' => - array ( - 'com' => - array ( - ), - 'org' => - array ( - ), - 'gob' => - array ( - ), - 'edu' => - array ( - ), - 'net' => - array ( - ), - 'blogspot' => - array ( - ), - 'nym' => - array ( - ), - ), - 'my' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - 'edu' => - array ( - ), - 'mil' => - array ( - ), - 'name' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'mz' => - array ( - 'ac' => - array ( - ), - 'adv' => - array ( - ), - 'co' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'na' => - array ( - 'info' => - array ( - ), - 'pro' => - array ( - ), - 'name' => - array ( - ), - 'school' => - array ( - ), - 'or' => - array ( - ), - 'dr' => - array ( - ), - 'us' => - array ( - ), - 'mx' => - array ( - ), - 'ca' => - array ( - ), - 'in' => - array ( - ), - 'cc' => - array ( - ), - 'tv' => - array ( - ), - 'ws' => - array ( - ), - 'mobi' => - array ( - ), - 'co' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - ), - 'name' => - array ( - 'her' => - array ( - 'forgot' => - array ( - ), - ), - 'his' => - array ( - 'forgot' => - array ( - ), - ), - ), - 'nc' => - array ( - 'asso' => - array ( - ), - 'nom' => - array ( - ), - ), - 'ne' => - array ( - ), - 'net' => - array ( - 'alwaysdata' => - array ( - '*' => - array ( - ), - ), - 'cloudfront' => - array ( - ), - 't3l3p0rt' => - array ( - ), - 'myfritz' => - array ( - ), - 'boomla' => - array ( - ), - 'bplaced' => - array ( - ), - 'square7' => - array ( - ), - 'gb' => - array ( - ), - 'hu' => - array ( - ), - 'jp' => - array ( - ), - 'se' => - array ( - ), - 'uk' => - array ( - ), - 'in' => - array ( - ), - 'cloudaccess' => - array ( - ), - 'cdn77-ssl' => - array ( - ), - 'cdn77' => - array ( - 'r' => - array ( - ), - ), - 'feste-ip' => - array ( - ), - 'knx-server' => - array ( - ), - 'static-access' => - array ( - ), - 'cryptonomic' => - array ( - '*' => - array ( - ), - ), - 'debian' => - array ( - ), - 'at-band-camp' => - array ( - ), - 'blogdns' => - array ( - ), - 'broke-it' => - array ( - ), - 'buyshouses' => - array ( - ), - 'dnsalias' => - array ( - ), - 'dnsdojo' => - array ( - ), - 'does-it' => - array ( - ), - 'dontexist' => - array ( - ), - 'dynalias' => - array ( - ), - 'dynathome' => - array ( - ), - 'endofinternet' => - array ( - ), - 'from-az' => - array ( - ), - 'from-co' => - array ( - ), - 'from-la' => - array ( - ), - 'from-ny' => - array ( - ), - 'gets-it' => - array ( - ), - 'ham-radio-op' => - array ( - ), - 'homeftp' => - array ( - ), - 'homeip' => - array ( - ), - 'homelinux' => - array ( - ), - 'homeunix' => - array ( - ), - 'in-the-band' => - array ( - ), - 'is-a-chef' => - array ( - ), - 'is-a-geek' => - array ( - ), - 'isa-geek' => - array ( - ), - 'kicks-ass' => - array ( - ), - 'office-on-the' => - array ( - ), - 'podzone' => - array ( - ), - 'scrapper-site' => - array ( - ), - 'selfip' => - array ( - ), - 'sells-it' => - array ( - ), - 'servebbs' => - array ( - ), - 'serveftp' => - array ( - ), - 'thruhere' => - array ( - ), - 'webhop' => - array ( - ), - 'definima' => - array ( - ), - 'casacam' => - array ( - ), - 'dynu' => - array ( - ), - 'dynv6' => - array ( - ), - 'twmail' => - array ( - ), - 'ru' => - array ( - ), - 'channelsdvr' => - array ( - ), - 'fastlylb' => - array ( - 'map' => - array ( - ), - ), - 'fastly' => - array ( - 'freetls' => - array ( - ), - 'map' => - array ( - ), - 'prod' => - array ( - 'a' => - array ( - ), - 'global' => - array ( - ), - ), - 'ssl' => - array ( - 'a' => - array ( - ), - 'b' => - array ( - ), - 'global' => - array ( - ), - ), - ), - 'flynnhosting' => - array ( - ), - 'cloudfunctions' => - array ( - ), - 'moonscale' => - array ( - ), - 'ipifony' => - array ( - ), - 'barsy' => - array ( - ), - 'azurewebsites' => - array ( - ), - 'azure-mobile' => - array ( - ), - 'cloudapp' => - array ( - ), - 'eating-organic' => - array ( - ), - 'mydissent' => - array ( - ), - 'myeffect' => - array ( - ), - 'mymediapc' => - array ( - ), - 'mypsx' => - array ( - ), - 'mysecuritycamera' => - array ( - ), - 'nhlfan' => - array ( - ), - 'no-ip' => - array ( - ), - 'pgafan' => - array ( - ), - 'privatizehealthinsurance' => - array ( - ), - 'bounceme' => - array ( - ), - 'ddns' => - array ( - ), - 'redirectme' => - array ( - ), - 'serveblog' => - array ( - ), - 'serveminecraft' => - array ( - ), - 'sytes' => - array ( - ), - 'rackmaze' => - array ( - ), - 'firewall-gateway' => - array ( - ), - 'dsmynas' => - array ( - ), - 'familyds' => - array ( - ), - 'za' => - array ( - ), - ), - 'nf' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'per' => - array ( - ), - 'rec' => - array ( - ), - 'web' => - array ( - ), - 'arts' => - array ( - ), - 'firm' => - array ( - ), - 'info' => - array ( - ), - 'other' => - array ( - ), - 'store' => - array ( - ), - ), - 'ng' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'i' => - array ( - ), - 'mil' => - array ( - ), - 'mobi' => - array ( - ), - 'name' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'sch' => - array ( - ), - ), - 'ni' => - array ( - 'ac' => - array ( - ), - 'biz' => - array ( - ), - 'co' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gob' => - array ( - ), - 'in' => - array ( - ), - 'info' => - array ( - ), - 'int' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'nom' => - array ( - ), - 'org' => - array ( - ), - 'web' => - array ( - ), - ), - 'nl' => - array ( - 'bv' => - array ( - ), - 'virtueeldomein' => - array ( - ), - 'co' => - array ( - ), - 'blogspot' => - array ( - ), - 'transurl' => - array ( - '*' => - array ( - ), - ), - 'cistron' => - array ( - ), - 'demon' => - array ( - ), - ), - 'no' => - array ( - 'fhs' => - array ( - ), - 'vgs' => - array ( - ), - 'fylkesbibl' => - array ( - ), - 'folkebibl' => - array ( - ), - 'museum' => - array ( - ), - 'idrett' => - array ( - ), - 'priv' => - array ( - ), - 'mil' => - array ( - ), - 'stat' => - array ( - ), - 'dep' => - array ( - ), - 'kommune' => - array ( - ), - 'herad' => - array ( - ), - 'aa' => - array ( - 'gs' => - array ( - ), - ), - 'ah' => - array ( - 'gs' => - array ( - ), - ), - 'bu' => - array ( - 'gs' => - array ( - ), - ), - 'fm' => - array ( - 'gs' => - array ( - ), - ), - 'hl' => - array ( - 'gs' => - array ( - ), - ), - 'hm' => - array ( - 'gs' => - array ( - ), - ), - 'jan-mayen' => - array ( - 'gs' => - array ( - ), - ), - 'mr' => - array ( - 'gs' => - array ( - ), - ), - 'nl' => - array ( - 'gs' => - array ( - ), - ), - 'nt' => - array ( - 'gs' => - array ( - ), - ), - 'of' => - array ( - 'gs' => - array ( - ), - ), - 'ol' => - array ( - 'gs' => - array ( - ), - ), - 'oslo' => - array ( - 'gs' => - array ( - ), - ), - 'rl' => - array ( - 'gs' => - array ( - ), - ), - 'sf' => - array ( - 'gs' => - array ( - ), - ), - 'st' => - array ( - 'gs' => - array ( - ), - ), - 'svalbard' => - array ( - 'gs' => - array ( - ), - ), - 'tm' => - array ( - 'gs' => - array ( - ), - ), - 'tr' => - array ( - 'gs' => - array ( - ), - ), - 'va' => - array ( - 'gs' => - array ( - ), - ), - 'vf' => - array ( - 'gs' => - array ( - ), - ), - 'akrehamn' => - array ( - ), - 'xn--krehamn-dxa' => - array ( - ), - 'algard' => - array ( - ), - 'xn--lgrd-poac' => - array ( - ), - 'arna' => - array ( - ), - 'brumunddal' => - array ( - ), - 'bryne' => - array ( - ), - 'bronnoysund' => - array ( - ), - 'xn--brnnysund-m8ac' => - array ( - ), - 'drobak' => - array ( - ), - 'xn--drbak-wua' => - array ( - ), - 'egersund' => - array ( - ), - 'fetsund' => - array ( - ), - 'floro' => - array ( - ), - 'xn--flor-jra' => - array ( - ), - 'fredrikstad' => - array ( - ), - 'hokksund' => - array ( - ), - 'honefoss' => - array ( - ), - 'xn--hnefoss-q1a' => - array ( - ), - 'jessheim' => - array ( - ), - 'jorpeland' => - array ( - ), - 'xn--jrpeland-54a' => - array ( - ), - 'kirkenes' => - array ( - ), - 'kopervik' => - array ( - ), - 'krokstadelva' => - array ( - ), - 'langevag' => - array ( - ), - 'xn--langevg-jxa' => - array ( - ), - 'leirvik' => - array ( - ), - 'mjondalen' => - array ( - ), - 'xn--mjndalen-64a' => - array ( - ), - 'mo-i-rana' => - array ( - ), - 'mosjoen' => - array ( - ), - 'xn--mosjen-eya' => - array ( - ), - 'nesoddtangen' => - array ( - ), - 'orkanger' => - array ( - ), - 'osoyro' => - array ( - ), - 'xn--osyro-wua' => - array ( - ), - 'raholt' => - array ( - ), - 'xn--rholt-mra' => - array ( - ), - 'sandnessjoen' => - array ( - ), - 'xn--sandnessjen-ogb' => - array ( - ), - 'skedsmokorset' => - array ( - ), - 'slattum' => - array ( - ), - 'spjelkavik' => - array ( - ), - 'stathelle' => - array ( - ), - 'stavern' => - array ( - ), - 'stjordalshalsen' => - array ( - ), - 'xn--stjrdalshalsen-sqb' => - array ( - ), - 'tananger' => - array ( - ), - 'tranby' => - array ( - ), - 'vossevangen' => - array ( - ), - 'afjord' => - array ( - ), - 'xn--fjord-lra' => - array ( - ), - 'agdenes' => - array ( - ), - 'al' => - array ( - ), - 'xn--l-1fa' => - array ( - ), - 'alesund' => - array ( - ), - 'xn--lesund-hua' => - array ( - ), - 'alstahaug' => - array ( - ), - 'alta' => - array ( - ), - 'xn--lt-liac' => - array ( - ), - 'alaheadju' => - array ( - ), - 'xn--laheadju-7ya' => - array ( - ), - 'alvdal' => - array ( - ), - 'amli' => - array ( - ), - 'xn--mli-tla' => - array ( - ), - 'amot' => - array ( - ), - 'xn--mot-tla' => - array ( - ), - 'andebu' => - array ( - ), - 'andoy' => - array ( - ), - 'xn--andy-ira' => - array ( - ), - 'andasuolo' => - array ( - ), - 'ardal' => - array ( - ), - 'xn--rdal-poa' => - array ( - ), - 'aremark' => - array ( - ), - 'arendal' => - array ( - ), - 'xn--s-1fa' => - array ( - ), - 'aseral' => - array ( - ), - 'xn--seral-lra' => - array ( - ), - 'asker' => - array ( - ), - 'askim' => - array ( - ), - 'askvoll' => - array ( - ), - 'askoy' => - array ( - ), - 'xn--asky-ira' => - array ( - ), - 'asnes' => - array ( - ), - 'xn--snes-poa' => - array ( - ), - 'audnedaln' => - array ( - ), - 'aukra' => - array ( - ), - 'aure' => - array ( - ), - 'aurland' => - array ( - ), - 'aurskog-holand' => - array ( - ), - 'xn--aurskog-hland-jnb' => - array ( - ), - 'austevoll' => - array ( - ), - 'austrheim' => - array ( - ), - 'averoy' => - array ( - ), - 'xn--avery-yua' => - array ( - ), - 'balestrand' => - array ( - ), - 'ballangen' => - array ( - ), - 'balat' => - array ( - ), - 'xn--blt-elab' => - array ( - ), - 'balsfjord' => - array ( - ), - 'bahccavuotna' => - array ( - ), - 'xn--bhccavuotna-k7a' => - array ( - ), - 'bamble' => - array ( - ), - 'bardu' => - array ( - ), - 'beardu' => - array ( - ), - 'beiarn' => - array ( - ), - 'bajddar' => - array ( - ), - 'xn--bjddar-pta' => - array ( - ), - 'baidar' => - array ( - ), - 'xn--bidr-5nac' => - array ( - ), - 'berg' => - array ( - ), - 'bergen' => - array ( - ), - 'berlevag' => - array ( - ), - 'xn--berlevg-jxa' => - array ( - ), - 'bearalvahki' => - array ( - ), - 'xn--bearalvhki-y4a' => - array ( - ), - 'bindal' => - array ( - ), - 'birkenes' => - array ( - ), - 'bjarkoy' => - array ( - ), - 'xn--bjarky-fya' => - array ( - ), - 'bjerkreim' => - array ( - ), - 'bjugn' => - array ( - ), - 'bodo' => - array ( - ), - 'xn--bod-2na' => - array ( - ), - 'badaddja' => - array ( - ), - 'xn--bdddj-mrabd' => - array ( - ), - 'budejju' => - array ( - ), - 'bokn' => - array ( - ), - 'bremanger' => - array ( - ), - 'bronnoy' => - array ( - ), - 'xn--brnny-wuac' => - array ( - ), - 'bygland' => - array ( - ), - 'bykle' => - array ( - ), - 'barum' => - array ( - ), - 'xn--brum-voa' => - array ( - ), - 'telemark' => - array ( - 'bo' => - array ( - ), - 'xn--b-5ga' => - array ( - ), - ), - 'nordland' => - array ( - 'bo' => - array ( - ), - 'xn--b-5ga' => - array ( - ), - 'heroy' => - array ( - ), - 'xn--hery-ira' => - array ( - ), - ), - 'bievat' => - array ( - ), - 'xn--bievt-0qa' => - array ( - ), - 'bomlo' => - array ( - ), - 'xn--bmlo-gra' => - array ( - ), - 'batsfjord' => - array ( - ), - 'xn--btsfjord-9za' => - array ( - ), - 'bahcavuotna' => - array ( - ), - 'xn--bhcavuotna-s4a' => - array ( - ), - 'dovre' => - array ( - ), - 'drammen' => - array ( - ), - 'drangedal' => - array ( - ), - 'dyroy' => - array ( - ), - 'xn--dyry-ira' => - array ( - ), - 'donna' => - array ( - ), - 'xn--dnna-gra' => - array ( - ), - 'eid' => - array ( - ), - 'eidfjord' => - array ( - ), - 'eidsberg' => - array ( - ), - 'eidskog' => - array ( - ), - 'eidsvoll' => - array ( - ), - 'eigersund' => - array ( - ), - 'elverum' => - array ( - ), - 'enebakk' => - array ( - ), - 'engerdal' => - array ( - ), - 'etne' => - array ( - ), - 'etnedal' => - array ( - ), - 'evenes' => - array ( - ), - 'evenassi' => - array ( - ), - 'xn--eveni-0qa01ga' => - array ( - ), - 'evje-og-hornnes' => - array ( - ), - 'farsund' => - array ( - ), - 'fauske' => - array ( - ), - 'fuossko' => - array ( - ), - 'fuoisku' => - array ( - ), - 'fedje' => - array ( - ), - 'fet' => - array ( - ), - 'finnoy' => - array ( - ), - 'xn--finny-yua' => - array ( - ), - 'fitjar' => - array ( - ), - 'fjaler' => - array ( - ), - 'fjell' => - array ( - ), - 'flakstad' => - array ( - ), - 'flatanger' => - array ( - ), - 'flekkefjord' => - array ( - ), - 'flesberg' => - array ( - ), - 'flora' => - array ( - ), - 'fla' => - array ( - ), - 'xn--fl-zia' => - array ( - ), - 'folldal' => - array ( - ), - 'forsand' => - array ( - ), - 'fosnes' => - array ( - ), - 'frei' => - array ( - ), - 'frogn' => - array ( - ), - 'froland' => - array ( - ), - 'frosta' => - array ( - ), - 'frana' => - array ( - ), - 'xn--frna-woa' => - array ( - ), - 'froya' => - array ( - ), - 'xn--frya-hra' => - array ( - ), - 'fusa' => - array ( - ), - 'fyresdal' => - array ( - ), - 'forde' => - array ( - ), - 'xn--frde-gra' => - array ( - ), - 'gamvik' => - array ( - ), - 'gangaviika' => - array ( - ), - 'xn--ggaviika-8ya47h' => - array ( - ), - 'gaular' => - array ( - ), - 'gausdal' => - array ( - ), - 'gildeskal' => - array ( - ), - 'xn--gildeskl-g0a' => - array ( - ), - 'giske' => - array ( - ), - 'gjemnes' => - array ( - ), - 'gjerdrum' => - array ( - ), - 'gjerstad' => - array ( - ), - 'gjesdal' => - array ( - ), - 'gjovik' => - array ( - ), - 'xn--gjvik-wua' => - array ( - ), - 'gloppen' => - array ( - ), - 'gol' => - array ( - ), - 'gran' => - array ( - ), - 'grane' => - array ( - ), - 'granvin' => - array ( - ), - 'gratangen' => - array ( - ), - 'grimstad' => - array ( - ), - 'grong' => - array ( - ), - 'kraanghke' => - array ( - ), - 'xn--kranghke-b0a' => - array ( - ), - 'grue' => - array ( - ), - 'gulen' => - array ( - ), - 'hadsel' => - array ( - ), - 'halden' => - array ( - ), - 'halsa' => - array ( - ), - 'hamar' => - array ( - ), - 'hamaroy' => - array ( - ), - 'habmer' => - array ( - ), - 'xn--hbmer-xqa' => - array ( - ), - 'hapmir' => - array ( - ), - 'xn--hpmir-xqa' => - array ( - ), - 'hammerfest' => - array ( - ), - 'hammarfeasta' => - array ( - ), - 'xn--hmmrfeasta-s4ac' => - array ( - ), - 'haram' => - array ( - ), - 'hareid' => - array ( - ), - 'harstad' => - array ( - ), - 'hasvik' => - array ( - ), - 'aknoluokta' => - array ( - ), - 'xn--koluokta-7ya57h' => - array ( - ), - 'hattfjelldal' => - array ( - ), - 'aarborte' => - array ( - ), - 'haugesund' => - array ( - ), - 'hemne' => - array ( - ), - 'hemnes' => - array ( - ), - 'hemsedal' => - array ( - ), - 'more-og-romsdal' => - array ( - 'heroy' => - array ( - ), - 'sande' => - array ( - ), - ), - 'xn--mre-og-romsdal-qqb' => - array ( - 'xn--hery-ira' => - array ( - ), - 'sande' => - array ( - ), - ), - 'hitra' => - array ( - ), - 'hjartdal' => - array ( - ), - 'hjelmeland' => - array ( - ), - 'hobol' => - array ( - ), - 'xn--hobl-ira' => - array ( - ), - 'hof' => - array ( - ), - 'hol' => - array ( - ), - 'hole' => - array ( - ), - 'holmestrand' => - array ( - ), - 'holtalen' => - array ( - ), - 'xn--holtlen-hxa' => - array ( - ), - 'hornindal' => - array ( - ), - 'horten' => - array ( - ), - 'hurdal' => - array ( - ), - 'hurum' => - array ( - ), - 'hvaler' => - array ( - ), - 'hyllestad' => - array ( - ), - 'hagebostad' => - array ( - ), - 'xn--hgebostad-g3a' => - array ( - ), - 'hoyanger' => - array ( - ), - 'xn--hyanger-q1a' => - array ( - ), - 'hoylandet' => - array ( - ), - 'xn--hylandet-54a' => - array ( - ), - 'ha' => - array ( - ), - 'xn--h-2fa' => - array ( - ), - 'ibestad' => - array ( - ), - 'inderoy' => - array ( - ), - 'xn--indery-fya' => - array ( - ), - 'iveland' => - array ( - ), - 'jevnaker' => - array ( - ), - 'jondal' => - array ( - ), - 'jolster' => - array ( - ), - 'xn--jlster-bya' => - array ( - ), - 'karasjok' => - array ( - ), - 'karasjohka' => - array ( - ), - 'xn--krjohka-hwab49j' => - array ( - ), - 'karlsoy' => - array ( - ), - 'galsa' => - array ( - ), - 'xn--gls-elac' => - array ( - ), - 'karmoy' => - array ( - ), - 'xn--karmy-yua' => - array ( - ), - 'kautokeino' => - array ( - ), - 'guovdageaidnu' => - array ( - ), - 'klepp' => - array ( - ), - 'klabu' => - array ( - ), - 'xn--klbu-woa' => - array ( - ), - 'kongsberg' => - array ( - ), - 'kongsvinger' => - array ( - ), - 'kragero' => - array ( - ), - 'xn--krager-gya' => - array ( - ), - 'kristiansand' => - array ( - ), - 'kristiansund' => - array ( - ), - 'krodsherad' => - array ( - ), - 'xn--krdsherad-m8a' => - array ( - ), - 'kvalsund' => - array ( - ), - 'rahkkeravju' => - array ( - ), - 'xn--rhkkervju-01af' => - array ( - ), - 'kvam' => - array ( - ), - 'kvinesdal' => - array ( - ), - 'kvinnherad' => - array ( - ), - 'kviteseid' => - array ( - ), - 'kvitsoy' => - array ( - ), - 'xn--kvitsy-fya' => - array ( - ), - 'kvafjord' => - array ( - ), - 'xn--kvfjord-nxa' => - array ( - ), - 'giehtavuoatna' => - array ( - ), - 'kvanangen' => - array ( - ), - 'xn--kvnangen-k0a' => - array ( - ), - 'navuotna' => - array ( - ), - 'xn--nvuotna-hwa' => - array ( - ), - 'kafjord' => - array ( - ), - 'xn--kfjord-iua' => - array ( - ), - 'gaivuotna' => - array ( - ), - 'xn--givuotna-8ya' => - array ( - ), - 'larvik' => - array ( - ), - 'lavangen' => - array ( - ), - 'lavagis' => - array ( - ), - 'loabat' => - array ( - ), - 'xn--loabt-0qa' => - array ( - ), - 'lebesby' => - array ( - ), - 'davvesiida' => - array ( - ), - 'leikanger' => - array ( - ), - 'leirfjord' => - array ( - ), - 'leka' => - array ( - ), - 'leksvik' => - array ( - ), - 'lenvik' => - array ( - ), - 'leangaviika' => - array ( - ), - 'xn--leagaviika-52b' => - array ( - ), - 'lesja' => - array ( - ), - 'levanger' => - array ( - ), - 'lier' => - array ( - ), - 'lierne' => - array ( - ), - 'lillehammer' => - array ( - ), - 'lillesand' => - array ( - ), - 'lindesnes' => - array ( - ), - 'lindas' => - array ( - ), - 'xn--linds-pra' => - array ( - ), - 'lom' => - array ( - ), - 'loppa' => - array ( - ), - 'lahppi' => - array ( - ), - 'xn--lhppi-xqa' => - array ( - ), - 'lund' => - array ( - ), - 'lunner' => - array ( - ), - 'luroy' => - array ( - ), - 'xn--lury-ira' => - array ( - ), - 'luster' => - array ( - ), - 'lyngdal' => - array ( - ), - 'lyngen' => - array ( - ), - 'ivgu' => - array ( - ), - 'lardal' => - array ( - ), - 'lerdal' => - array ( - ), - 'xn--lrdal-sra' => - array ( - ), - 'lodingen' => - array ( - ), - 'xn--ldingen-q1a' => - array ( - ), - 'lorenskog' => - array ( - ), - 'xn--lrenskog-54a' => - array ( - ), - 'loten' => - array ( - ), - 'xn--lten-gra' => - array ( - ), - 'malvik' => - array ( - ), - 'masoy' => - array ( - ), - 'xn--msy-ula0h' => - array ( - ), - 'muosat' => - array ( - ), - 'xn--muost-0qa' => - array ( - ), - 'mandal' => - array ( - ), - 'marker' => - array ( - ), - 'marnardal' => - array ( - ), - 'masfjorden' => - array ( - ), - 'meland' => - array ( - ), - 'meldal' => - array ( - ), - 'melhus' => - array ( - ), - 'meloy' => - array ( - ), - 'xn--mely-ira' => - array ( - ), - 'meraker' => - array ( - ), - 'xn--merker-kua' => - array ( - ), - 'moareke' => - array ( - ), - 'xn--moreke-jua' => - array ( - ), - 'midsund' => - array ( - ), - 'midtre-gauldal' => - array ( - ), - 'modalen' => - array ( - ), - 'modum' => - array ( - ), - 'molde' => - array ( - ), - 'moskenes' => - array ( - ), - 'moss' => - array ( - ), - 'mosvik' => - array ( - ), - 'malselv' => - array ( - ), - 'xn--mlselv-iua' => - array ( - ), - 'malatvuopmi' => - array ( - ), - 'xn--mlatvuopmi-s4a' => - array ( - ), - 'namdalseid' => - array ( - ), - 'aejrie' => - array ( - ), - 'namsos' => - array ( - ), - 'namsskogan' => - array ( - ), - 'naamesjevuemie' => - array ( - ), - 'xn--nmesjevuemie-tcba' => - array ( - ), - 'laakesvuemie' => - array ( - ), - 'nannestad' => - array ( - ), - 'narvik' => - array ( - ), - 'narviika' => - array ( - ), - 'naustdal' => - array ( - ), - 'nedre-eiker' => - array ( - ), - 'akershus' => - array ( - 'nes' => - array ( - ), - ), - 'buskerud' => - array ( - 'nes' => - array ( - ), - ), - 'nesna' => - array ( - ), - 'nesodden' => - array ( - ), - 'nesseby' => - array ( - ), - 'unjarga' => - array ( - ), - 'xn--unjrga-rta' => - array ( - ), - 'nesset' => - array ( - ), - 'nissedal' => - array ( - ), - 'nittedal' => - array ( - ), - 'nord-aurdal' => - array ( - ), - 'nord-fron' => - array ( - ), - 'nord-odal' => - array ( - ), - 'norddal' => - array ( - ), - 'nordkapp' => - array ( - ), - 'davvenjarga' => - array ( - ), - 'xn--davvenjrga-y4a' => - array ( - ), - 'nordre-land' => - array ( - ), - 'nordreisa' => - array ( - ), - 'raisa' => - array ( - ), - 'xn--risa-5na' => - array ( - ), - 'nore-og-uvdal' => - array ( - ), - 'notodden' => - array ( - ), - 'naroy' => - array ( - ), - 'xn--nry-yla5g' => - array ( - ), - 'notteroy' => - array ( - ), - 'xn--nttery-byae' => - array ( - ), - 'odda' => - array ( - ), - 'oksnes' => - array ( - ), - 'xn--ksnes-uua' => - array ( - ), - 'oppdal' => - array ( - ), - 'oppegard' => - array ( - ), - 'xn--oppegrd-ixa' => - array ( - ), - 'orkdal' => - array ( - ), - 'orland' => - array ( - ), - 'xn--rland-uua' => - array ( - ), - 'orskog' => - array ( - ), - 'xn--rskog-uua' => - array ( - ), - 'orsta' => - array ( - ), - 'xn--rsta-fra' => - array ( - ), - 'hedmark' => - array ( - 'os' => - array ( - ), - 'valer' => - array ( - ), - 'xn--vler-qoa' => - array ( - ), - ), - 'hordaland' => - array ( - 'os' => - array ( - ), - ), - 'osen' => - array ( - ), - 'osteroy' => - array ( - ), - 'xn--ostery-fya' => - array ( - ), - 'ostre-toten' => - array ( - ), - 'xn--stre-toten-zcb' => - array ( - ), - 'overhalla' => - array ( - ), - 'ovre-eiker' => - array ( - ), - 'xn--vre-eiker-k8a' => - array ( - ), - 'oyer' => - array ( - ), - 'xn--yer-zna' => - array ( - ), - 'oygarden' => - array ( - ), - 'xn--ygarden-p1a' => - array ( - ), - 'oystre-slidre' => - array ( - ), - 'xn--ystre-slidre-ujb' => - array ( - ), - 'porsanger' => - array ( - ), - 'porsangu' => - array ( - ), - 'xn--porsgu-sta26f' => - array ( - ), - 'porsgrunn' => - array ( - ), - 'radoy' => - array ( - ), - 'xn--rady-ira' => - array ( - ), - 'rakkestad' => - array ( - ), - 'rana' => - array ( - ), - 'ruovat' => - array ( - ), - 'randaberg' => - array ( - ), - 'rauma' => - array ( - ), - 'rendalen' => - array ( - ), - 'rennebu' => - array ( - ), - 'rennesoy' => - array ( - ), - 'xn--rennesy-v1a' => - array ( - ), - 'rindal' => - array ( - ), - 'ringebu' => - array ( - ), - 'ringerike' => - array ( - ), - 'ringsaker' => - array ( - ), - 'rissa' => - array ( - ), - 'risor' => - array ( - ), - 'xn--risr-ira' => - array ( - ), - 'roan' => - array ( - ), - 'rollag' => - array ( - ), - 'rygge' => - array ( - ), - 'ralingen' => - array ( - ), - 'xn--rlingen-mxa' => - array ( - ), - 'rodoy' => - array ( - ), - 'xn--rdy-0nab' => - array ( - ), - 'romskog' => - array ( - ), - 'xn--rmskog-bya' => - array ( - ), - 'roros' => - array ( - ), - 'xn--rros-gra' => - array ( - ), - 'rost' => - array ( - ), - 'xn--rst-0na' => - array ( - ), - 'royken' => - array ( - ), - 'xn--ryken-vua' => - array ( - ), - 'royrvik' => - array ( - ), - 'xn--ryrvik-bya' => - array ( - ), - 'rade' => - array ( - ), - 'xn--rde-ula' => - array ( - ), - 'salangen' => - array ( - ), - 'siellak' => - array ( - ), - 'saltdal' => - array ( - ), - 'salat' => - array ( - ), - 'xn--slt-elab' => - array ( - ), - 'xn--slat-5na' => - array ( - ), - 'samnanger' => - array ( - ), - 'vestfold' => - array ( - 'sande' => - array ( - ), - ), - 'sandefjord' => - array ( - ), - 'sandnes' => - array ( - ), - 'sandoy' => - array ( - ), - 'xn--sandy-yua' => - array ( - ), - 'sarpsborg' => - array ( - ), - 'sauda' => - array ( - ), - 'sauherad' => - array ( - ), - 'sel' => - array ( - ), - 'selbu' => - array ( - ), - 'selje' => - array ( - ), - 'seljord' => - array ( - ), - 'sigdal' => - array ( - ), - 'siljan' => - array ( - ), - 'sirdal' => - array ( - ), - 'skaun' => - array ( - ), - 'skedsmo' => - array ( - ), - 'ski' => - array ( - ), - 'skien' => - array ( - ), - 'skiptvet' => - array ( - ), - 'skjervoy' => - array ( - ), - 'xn--skjervy-v1a' => - array ( - ), - 'skierva' => - array ( - ), - 'xn--skierv-uta' => - array ( - ), - 'skjak' => - array ( - ), - 'xn--skjk-soa' => - array ( - ), - 'skodje' => - array ( - ), - 'skanland' => - array ( - ), - 'xn--sknland-fxa' => - array ( - ), - 'skanit' => - array ( - ), - 'xn--sknit-yqa' => - array ( - ), - 'smola' => - array ( - ), - 'xn--smla-hra' => - array ( - ), - 'snillfjord' => - array ( - ), - 'snasa' => - array ( - ), - 'xn--snsa-roa' => - array ( - ), - 'snoasa' => - array ( - ), - 'snaase' => - array ( - ), - 'xn--snase-nra' => - array ( - ), - 'sogndal' => - array ( - ), - 'sokndal' => - array ( - ), - 'sola' => - array ( - ), - 'solund' => - array ( - ), - 'songdalen' => - array ( - ), - 'sortland' => - array ( - ), - 'spydeberg' => - array ( - ), - 'stange' => - array ( - ), - 'stavanger' => - array ( - ), - 'steigen' => - array ( - ), - 'steinkjer' => - array ( - ), - 'stjordal' => - array ( - ), - 'xn--stjrdal-s1a' => - array ( - ), - 'stokke' => - array ( - ), - 'stor-elvdal' => - array ( - ), - 'stord' => - array ( - ), - 'stordal' => - array ( - ), - 'storfjord' => - array ( - ), - 'omasvuotna' => - array ( - ), - 'strand' => - array ( - ), - 'stranda' => - array ( - ), - 'stryn' => - array ( - ), - 'sula' => - array ( - ), - 'suldal' => - array ( - ), - 'sund' => - array ( - ), - 'sunndal' => - array ( - ), - 'surnadal' => - array ( - ), - 'sveio' => - array ( - ), - 'svelvik' => - array ( - ), - 'sykkylven' => - array ( - ), - 'sogne' => - array ( - ), - 'xn--sgne-gra' => - array ( - ), - 'somna' => - array ( - ), - 'xn--smna-gra' => - array ( - ), - 'sondre-land' => - array ( - ), - 'xn--sndre-land-0cb' => - array ( - ), - 'sor-aurdal' => - array ( - ), - 'xn--sr-aurdal-l8a' => - array ( - ), - 'sor-fron' => - array ( - ), - 'xn--sr-fron-q1a' => - array ( - ), - 'sor-odal' => - array ( - ), - 'xn--sr-odal-q1a' => - array ( - ), - 'sor-varanger' => - array ( - ), - 'xn--sr-varanger-ggb' => - array ( - ), - 'matta-varjjat' => - array ( - ), - 'xn--mtta-vrjjat-k7af' => - array ( - ), - 'sorfold' => - array ( - ), - 'xn--srfold-bya' => - array ( - ), - 'sorreisa' => - array ( - ), - 'xn--srreisa-q1a' => - array ( - ), - 'sorum' => - array ( - ), - 'xn--srum-gra' => - array ( - ), - 'tana' => - array ( - ), - 'deatnu' => - array ( - ), - 'time' => - array ( - ), - 'tingvoll' => - array ( - ), - 'tinn' => - array ( - ), - 'tjeldsund' => - array ( - ), - 'dielddanuorri' => - array ( - ), - 'tjome' => - array ( - ), - 'xn--tjme-hra' => - array ( - ), - 'tokke' => - array ( - ), - 'tolga' => - array ( - ), - 'torsken' => - array ( - ), - 'tranoy' => - array ( - ), - 'xn--trany-yua' => - array ( - ), - 'tromso' => - array ( - ), - 'xn--troms-zua' => - array ( - ), - 'tromsa' => - array ( - ), - 'romsa' => - array ( - ), - 'trondheim' => - array ( - ), - 'troandin' => - array ( - ), - 'trysil' => - array ( - ), - 'trana' => - array ( - ), - 'xn--trna-woa' => - array ( - ), - 'trogstad' => - array ( - ), - 'xn--trgstad-r1a' => - array ( - ), - 'tvedestrand' => - array ( - ), - 'tydal' => - array ( - ), - 'tynset' => - array ( - ), - 'tysfjord' => - array ( - ), - 'divtasvuodna' => - array ( - ), - 'divttasvuotna' => - array ( - ), - 'tysnes' => - array ( - ), - 'tysvar' => - array ( - ), - 'xn--tysvr-vra' => - array ( - ), - 'tonsberg' => - array ( - ), - 'xn--tnsberg-q1a' => - array ( - ), - 'ullensaker' => - array ( - ), - 'ullensvang' => - array ( - ), - 'ulvik' => - array ( - ), - 'utsira' => - array ( - ), - 'vadso' => - array ( - ), - 'xn--vads-jra' => - array ( - ), - 'cahcesuolo' => - array ( - ), - 'xn--hcesuolo-7ya35b' => - array ( - ), - 'vaksdal' => - array ( - ), - 'valle' => - array ( - ), - 'vang' => - array ( - ), - 'vanylven' => - array ( - ), - 'vardo' => - array ( - ), - 'xn--vard-jra' => - array ( - ), - 'varggat' => - array ( - ), - 'xn--vrggt-xqad' => - array ( - ), - 'vefsn' => - array ( - ), - 'vaapste' => - array ( - ), - 'vega' => - array ( - ), - 'vegarshei' => - array ( - ), - 'xn--vegrshei-c0a' => - array ( - ), - 'vennesla' => - array ( - ), - 'verdal' => - array ( - ), - 'verran' => - array ( - ), - 'vestby' => - array ( - ), - 'vestnes' => - array ( - ), - 'vestre-slidre' => - array ( - ), - 'vestre-toten' => - array ( - ), - 'vestvagoy' => - array ( - ), - 'xn--vestvgy-ixa6o' => - array ( - ), - 'vevelstad' => - array ( - ), - 'vik' => - array ( - ), - 'vikna' => - array ( - ), - 'vindafjord' => - array ( - ), - 'volda' => - array ( - ), - 'voss' => - array ( - ), - 'varoy' => - array ( - ), - 'xn--vry-yla5g' => - array ( - ), - 'vagan' => - array ( - ), - 'xn--vgan-qoa' => - array ( - ), - 'voagat' => - array ( - ), - 'vagsoy' => - array ( - ), - 'xn--vgsy-qoa0j' => - array ( - ), - 'vaga' => - array ( - ), - 'xn--vg-yiab' => - array ( - ), - 'ostfold' => - array ( - 'valer' => - array ( - ), - ), - 'xn--stfold-9xa' => - array ( - 'xn--vler-qoa' => - array ( - ), - ), - 'co' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'np' => - array ( - '*' => - array ( - ), - ), - 'nr' => - array ( - 'biz' => - array ( - ), - 'info' => - array ( - ), - 'gov' => - array ( - ), - 'edu' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'com' => - array ( - ), - ), - 'nu' => - array ( - 'merseine' => - array ( - ), - 'mine' => - array ( - ), - 'shacknet' => - array ( - ), - 'nom' => - array ( - ), - ), - 'nz' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - 'blogspot' => - array ( - ), - ), - 'cri' => - array ( - ), - 'geek' => - array ( - ), - 'gen' => - array ( - ), - 'govt' => - array ( - ), - 'health' => - array ( - ), - 'iwi' => - array ( - ), - 'kiwi' => - array ( - ), - 'maori' => - array ( - ), - 'mil' => - array ( - ), - 'xn--mori-qsa' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'parliament' => - array ( - ), - 'school' => - array ( - ), - 'nym' => - array ( - ), - ), - 'om' => - array ( - 'co' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'med' => - array ( - ), - 'museum' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'pro' => - array ( - ), - ), - 'onion' => - array ( - ), - 'org' => - array ( - 'amune' => - array ( - 'tele' => - array ( - ), - ), - 'pimienta' => - array ( - ), - 'poivron' => - array ( - ), - 'potager' => - array ( - ), - 'sweetpepper' => - array ( - ), - 'ae' => - array ( - ), - 'us' => - array ( - ), - 'certmgr' => - array ( - ), - 'cdn77' => - array ( - 'c' => - array ( - ), - 'rsc' => - array ( - ), - ), - 'cdn77-secure' => - array ( - 'origin' => - array ( - 'ssl' => - array ( - ), - ), - ), - 'cloudns' => - array ( - ), - 'duckdns' => - array ( - ), - 'tunk' => - array ( - ), - 'dyndns' => - array ( - 'go' => - array ( - ), - 'home' => - array ( - ), - ), - 'blogdns' => - array ( - ), - 'blogsite' => - array ( - ), - 'boldlygoingnowhere' => - array ( - ), - 'dnsalias' => - array ( - ), - 'dnsdojo' => - array ( - ), - 'doesntexist' => - array ( - ), - 'dontexist' => - array ( - ), - 'doomdns' => - array ( - ), - 'dvrdns' => - array ( - ), - 'dynalias' => - array ( - ), - 'endofinternet' => - array ( - ), - 'endoftheinternet' => - array ( - ), - 'from-me' => - array ( - ), - 'game-host' => - array ( - ), - 'gotdns' => - array ( - ), - 'hobby-site' => - array ( - ), - 'homedns' => - array ( - ), - 'homeftp' => - array ( - ), - 'homelinux' => - array ( - ), - 'homeunix' => - array ( - ), - 'is-a-bruinsfan' => - array ( - ), - 'is-a-candidate' => - array ( - ), - 'is-a-celticsfan' => - array ( - ), - 'is-a-chef' => - array ( - ), - 'is-a-geek' => - array ( - ), - 'is-a-knight' => - array ( - ), - 'is-a-linux-user' => - array ( - ), - 'is-a-patsfan' => - array ( - ), - 'is-a-soxfan' => - array ( - ), - 'is-found' => - array ( - ), - 'is-lost' => - array ( - ), - 'is-saved' => - array ( - ), - 'is-very-bad' => - array ( - ), - 'is-very-evil' => - array ( - ), - 'is-very-good' => - array ( - ), - 'is-very-nice' => - array ( - ), - 'is-very-sweet' => - array ( - ), - 'isa-geek' => - array ( - ), - 'kicks-ass' => - array ( - ), - 'misconfused' => - array ( - ), - 'podzone' => - array ( - ), - 'readmyblog' => - array ( - ), - 'selfip' => - array ( - ), - 'sellsyourhome' => - array ( - ), - 'servebbs' => - array ( - ), - 'serveftp' => - array ( - ), - 'servegame' => - array ( - ), - 'stuff-4-sale' => - array ( - ), - 'webhop' => - array ( - ), - 'ddnss' => - array ( - ), - 'accesscam' => - array ( - ), - 'camdvr' => - array ( - ), - 'freeddns' => - array ( - ), - 'mywire' => - array ( - ), - 'webredirect' => - array ( - ), - 'eu' => - array ( - 'al' => - array ( - ), - 'asso' => - array ( - ), - 'at' => - array ( - ), - 'au' => - array ( - ), - 'be' => - array ( - ), - 'bg' => - array ( - ), - 'ca' => - array ( - ), - 'cd' => - array ( - ), - 'ch' => - array ( - ), - 'cn' => - array ( - ), - 'cy' => - array ( - ), - 'cz' => - array ( - ), - 'de' => - array ( - ), - 'dk' => - array ( - ), - 'edu' => - array ( - ), - 'ee' => - array ( - ), - 'es' => - array ( - ), - 'fi' => - array ( - ), - 'fr' => - array ( - ), - 'gr' => - array ( - ), - 'hr' => - array ( - ), - 'hu' => - array ( - ), - 'ie' => - array ( - ), - 'il' => - array ( - ), - 'in' => - array ( - ), - 'int' => - array ( - ), - 'is' => - array ( - ), - 'it' => - array ( - ), - 'jp' => - array ( - ), - 'kr' => - array ( - ), - 'lt' => - array ( - ), - 'lu' => - array ( - ), - 'lv' => - array ( - ), - 'mc' => - array ( - ), - 'me' => - array ( - ), - 'mk' => - array ( - ), - 'mt' => - array ( - ), - 'my' => - array ( - ), - 'net' => - array ( - ), - 'ng' => - array ( - ), - 'nl' => - array ( - ), - 'no' => - array ( - ), - 'nz' => - array ( - ), - 'paris' => - array ( - ), - 'pl' => - array ( - ), - 'pt' => - array ( - ), - 'q-a' => - array ( - ), - 'ro' => - array ( - ), - 'ru' => - array ( - ), - 'se' => - array ( - ), - 'si' => - array ( - ), - 'sk' => - array ( - ), - 'tr' => - array ( - ), - 'uk' => - array ( - ), - 'us' => - array ( - ), - ), - 'twmail' => - array ( - ), - 'fedorainfracloud' => - array ( - ), - 'fedorapeople' => - array ( - ), - 'fedoraproject' => - array ( - 'cloud' => - array ( - ), - ), - 'hepforge' => - array ( - ), - 'js' => - array ( - ), - 'bmoattachments' => - array ( - ), - 'cable-modem' => - array ( - ), - 'collegefan' => - array ( - ), - 'couchpotatofries' => - array ( - ), - 'mlbfan' => - array ( - ), - 'mysecuritycamera' => - array ( - ), - 'nflfan' => - array ( - ), - 'read-books' => - array ( - ), - 'ufcfan' => - array ( - ), - 'hopto' => - array ( - ), - 'myftp' => - array ( - ), - 'no-ip' => - array ( - ), - 'zapto' => - array ( - ), - 'my-firewall' => - array ( - ), - 'myfirewall' => - array ( - ), - 'spdns' => - array ( - ), - 'dsmynas' => - array ( - ), - 'familyds' => - array ( - ), - 'tuxfamily' => - array ( - ), - 'diskstation' => - array ( - ), - 'hk' => - array ( - ), - 'wmflabs' => - array ( - ), - 'za' => - array ( - ), - ), - 'pa' => - array ( - 'ac' => - array ( - ), - 'gob' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - 'sld' => - array ( - ), - 'edu' => - array ( - ), - 'net' => - array ( - ), - 'ing' => - array ( - ), - 'abo' => - array ( - ), - 'med' => - array ( - ), - 'nom' => - array ( - ), - ), - 'pe' => - array ( - 'edu' => - array ( - ), - 'gob' => - array ( - ), - 'nom' => - array ( - ), - 'mil' => - array ( - ), - 'org' => - array ( - ), - 'com' => - array ( - ), - 'net' => - array ( - ), - 'blogspot' => - array ( - ), - 'nym' => - array ( - ), - ), - 'pf' => - array ( - 'com' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - ), - 'pg' => - array ( - '*' => - array ( - ), - ), - 'ph' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - 'edu' => - array ( - ), - 'ngo' => - array ( - ), - 'mil' => - array ( - ), - 'i' => - array ( - ), - ), - 'pk' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'edu' => - array ( - ), - 'org' => - array ( - ), - 'fam' => - array ( - ), - 'biz' => - array ( - ), - 'web' => - array ( - ), - 'gov' => - array ( - ), - 'gob' => - array ( - ), - 'gok' => - array ( - ), - 'gon' => - array ( - ), - 'gop' => - array ( - ), - 'gos' => - array ( - ), - 'info' => - array ( - ), - ), - 'pl' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'aid' => - array ( - ), - 'agro' => - array ( - ), - 'atm' => - array ( - ), - 'auto' => - array ( - ), - 'biz' => - array ( - ), - 'edu' => - array ( - ), - 'gmina' => - array ( - ), - 'gsm' => - array ( - ), - 'info' => - array ( - ), - 'mail' => - array ( - ), - 'miasta' => - array ( - ), - 'media' => - array ( - ), - 'mil' => - array ( - ), - 'nieruchomosci' => - array ( - ), - 'nom' => - array ( - ), - 'pc' => - array ( - ), - 'powiat' => - array ( - ), - 'priv' => - array ( - ), - 'realestate' => - array ( - ), - 'rel' => - array ( - ), - 'sex' => - array ( - ), - 'shop' => - array ( - ), - 'sklep' => - array ( - ), - 'sos' => - array ( - ), - 'szkola' => - array ( - ), - 'targi' => - array ( - ), - 'tm' => - array ( - ), - 'tourism' => - array ( - ), - 'travel' => - array ( - ), - 'turystyka' => - array ( - ), - 'gov' => - array ( - 'ap' => - array ( - ), - 'ic' => - array ( - ), - 'is' => - array ( - ), - 'us' => - array ( - ), - 'kmpsp' => - array ( - ), - 'kppsp' => - array ( - ), - 'kwpsp' => - array ( - ), - 'psp' => - array ( - ), - 'wskr' => - array ( - ), - 'kwp' => - array ( - ), - 'mw' => - array ( - ), - 'ug' => - array ( - ), - 'um' => - array ( - ), - 'umig' => - array ( - ), - 'ugim' => - array ( - ), - 'upow' => - array ( - ), - 'uw' => - array ( - ), - 'starostwo' => - array ( - ), - 'pa' => - array ( - ), - 'po' => - array ( - ), - 'psse' => - array ( - ), - 'pup' => - array ( - ), - 'rzgw' => - array ( - ), - 'sa' => - array ( - ), - 'so' => - array ( - ), - 'sr' => - array ( - ), - 'wsa' => - array ( - ), - 'sko' => - array ( - ), - 'uzs' => - array ( - ), - 'wiih' => - array ( - ), - 'winb' => - array ( - ), - 'pinb' => - array ( - ), - 'wios' => - array ( - ), - 'witd' => - array ( - ), - 'wzmiuw' => - array ( - ), - 'piw' => - array ( - ), - 'wiw' => - array ( - ), - 'griw' => - array ( - ), - 'wif' => - array ( - ), - 'oum' => - array ( - ), - 'sdn' => - array ( - ), - 'zp' => - array ( - ), - 'uppo' => - array ( - ), - 'mup' => - array ( - ), - 'wuoz' => - array ( - ), - 'konsulat' => - array ( - ), - 'oirm' => - array ( - ), - ), - 'augustow' => - array ( - ), - 'babia-gora' => - array ( - ), - 'bedzin' => - array ( - ), - 'beskidy' => - array ( - ), - 'bialowieza' => - array ( - ), - 'bialystok' => - array ( - ), - 'bielawa' => - array ( - ), - 'bieszczady' => - array ( - ), - 'boleslawiec' => - array ( - ), - 'bydgoszcz' => - array ( - ), - 'bytom' => - array ( - ), - 'cieszyn' => - array ( - ), - 'czeladz' => - array ( - ), - 'czest' => - array ( - ), - 'dlugoleka' => - array ( - ), - 'elblag' => - array ( - ), - 'elk' => - array ( - ), - 'glogow' => - array ( - ), - 'gniezno' => - array ( - ), - 'gorlice' => - array ( - ), - 'grajewo' => - array ( - ), - 'ilawa' => - array ( - ), - 'jaworzno' => - array ( - ), - 'jelenia-gora' => - array ( - ), - 'jgora' => - array ( - ), - 'kalisz' => - array ( - ), - 'kazimierz-dolny' => - array ( - ), - 'karpacz' => - array ( - ), - 'kartuzy' => - array ( - ), - 'kaszuby' => - array ( - ), - 'katowice' => - array ( - ), - 'kepno' => - array ( - ), - 'ketrzyn' => - array ( - ), - 'klodzko' => - array ( - ), - 'kobierzyce' => - array ( - ), - 'kolobrzeg' => - array ( - ), - 'konin' => - array ( - ), - 'konskowola' => - array ( - ), - 'kutno' => - array ( - ), - 'lapy' => - array ( - ), - 'lebork' => - array ( - ), - 'legnica' => - array ( - ), - 'lezajsk' => - array ( - ), - 'limanowa' => - array ( - ), - 'lomza' => - array ( - ), - 'lowicz' => - array ( - ), - 'lubin' => - array ( - ), - 'lukow' => - array ( - ), - 'malbork' => - array ( - ), - 'malopolska' => - array ( - ), - 'mazowsze' => - array ( - ), - 'mazury' => - array ( - ), - 'mielec' => - array ( - ), - 'mielno' => - array ( - ), - 'mragowo' => - array ( - ), - 'naklo' => - array ( - ), - 'nowaruda' => - array ( - ), - 'nysa' => - array ( - ), - 'olawa' => - array ( - ), - 'olecko' => - array ( - ), - 'olkusz' => - array ( - ), - 'olsztyn' => - array ( - ), - 'opoczno' => - array ( - ), - 'opole' => - array ( - ), - 'ostroda' => - array ( - ), - 'ostroleka' => - array ( - ), - 'ostrowiec' => - array ( - ), - 'ostrowwlkp' => - array ( - ), - 'pila' => - array ( - ), - 'pisz' => - array ( - ), - 'podhale' => - array ( - ), - 'podlasie' => - array ( - ), - 'polkowice' => - array ( - ), - 'pomorze' => - array ( - ), - 'pomorskie' => - array ( - ), - 'prochowice' => - array ( - ), - 'pruszkow' => - array ( - ), - 'przeworsk' => - array ( - ), - 'pulawy' => - array ( - ), - 'radom' => - array ( - ), - 'rawa-maz' => - array ( - ), - 'rybnik' => - array ( - ), - 'rzeszow' => - array ( - ), - 'sanok' => - array ( - ), - 'sejny' => - array ( - ), - 'slask' => - array ( - ), - 'slupsk' => - array ( - ), - 'sosnowiec' => - array ( - ), - 'stalowa-wola' => - array ( - ), - 'skoczow' => - array ( - ), - 'starachowice' => - array ( - ), - 'stargard' => - array ( - ), - 'suwalki' => - array ( - ), - 'swidnica' => - array ( - ), - 'swiebodzin' => - array ( - ), - 'swinoujscie' => - array ( - ), - 'szczecin' => - array ( - ), - 'szczytno' => - array ( - ), - 'tarnobrzeg' => - array ( - ), - 'tgory' => - array ( - ), - 'turek' => - array ( - ), - 'tychy' => - array ( - ), - 'ustka' => - array ( - ), - 'walbrzych' => - array ( - ), - 'warmia' => - array ( - ), - 'warszawa' => - array ( - ), - 'waw' => - array ( - ), - 'wegrow' => - array ( - ), - 'wielun' => - array ( - ), - 'wlocl' => - array ( - ), - 'wloclawek' => - array ( - ), - 'wodzislaw' => - array ( - ), - 'wolomin' => - array ( - ), - 'wroclaw' => - array ( - ), - 'zachpomor' => - array ( - ), - 'zagan' => - array ( - ), - 'zarow' => - array ( - ), - 'zgora' => - array ( - ), - 'zgorzelec' => - array ( - ), - 'beep' => - array ( - ), - 'co' => - array ( - ), - 'art' => - array ( - ), - 'gliwice' => - array ( - ), - 'krakow' => - array ( - ), - 'poznan' => - array ( - ), - 'wroc' => - array ( - ), - 'zakopane' => - array ( - ), - 'gda' => - array ( - ), - 'gdansk' => - array ( - ), - 'gdynia' => - array ( - ), - 'med' => - array ( - ), - 'sopot' => - array ( - ), - ), - 'pm' => - array ( - ), - 'pn' => - array ( - 'gov' => - array ( - ), - 'co' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'net' => - array ( - ), - ), - 'post' => - array ( - ), - 'pr' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - 'edu' => - array ( - ), - 'isla' => - array ( - ), - 'pro' => - array ( - ), - 'biz' => - array ( - ), - 'info' => - array ( - ), - 'name' => - array ( - ), - 'est' => - array ( - ), - 'prof' => - array ( - ), - 'ac' => - array ( - ), - ), - 'pro' => - array ( - 'aaa' => - array ( - ), - 'aca' => - array ( - ), - 'acct' => - array ( - ), - 'avocat' => - array ( - ), - 'bar' => - array ( - ), - 'cpa' => - array ( - ), - 'eng' => - array ( - ), - 'jur' => - array ( - ), - 'law' => - array ( - ), - 'med' => - array ( - ), - 'recht' => - array ( - ), - 'cloudns' => - array ( - ), - ), - 'ps' => - array ( - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'sec' => - array ( - ), - 'plo' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - ), - 'pt' => - array ( - 'net' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'int' => - array ( - ), - 'publ' => - array ( - ), - 'com' => - array ( - ), - 'nome' => - array ( - ), - 'blogspot' => - array ( - ), - 'nym' => - array ( - ), - ), - 'pw' => - array ( - 'co' => - array ( - ), - 'ne' => - array ( - ), - 'or' => - array ( - ), - 'ed' => - array ( - ), - 'go' => - array ( - ), - 'belau' => - array ( - ), - 'cloudns' => - array ( - ), - 'nom' => - array ( - ), - ), - 'py' => - array ( - 'com' => - array ( - ), - 'coop' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'qa' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'name' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'sch' => - array ( - ), - 'blogspot' => - array ( - ), - 'nom' => - array ( - ), - ), - 're' => - array ( - 'asso' => - array ( - ), - 'com' => - array ( - ), - 'nom' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'ro' => - array ( - 'arts' => - array ( - ), - 'com' => - array ( - ), - 'firm' => - array ( - ), - 'info' => - array ( - ), - 'nom' => - array ( - ), - 'nt' => - array ( - ), - 'org' => - array ( - ), - 'rec' => - array ( - ), - 'store' => - array ( - ), - 'tm' => - array ( - ), - 'www' => - array ( - ), - 'shop' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'rs' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'in' => - array ( - ), - 'org' => - array ( - ), - 'blogspot' => - array ( - ), - 'nom' => - array ( - ), - ), - 'ru' => - array ( - 'ac' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'int' => - array ( - ), - 'mil' => - array ( - ), - 'test' => - array ( - ), - 'adygeya' => - array ( - ), - 'bashkiria' => - array ( - ), - 'bir' => - array ( - ), - 'cbg' => - array ( - ), - 'com' => - array ( - ), - 'dagestan' => - array ( - ), - 'grozny' => - array ( - ), - 'kalmykia' => - array ( - ), - 'kustanai' => - array ( - ), - 'marine' => - array ( - ), - 'mordovia' => - array ( - ), - 'msk' => - array ( - ), - 'mytis' => - array ( - ), - 'nalchik' => - array ( - ), - 'nov' => - array ( - ), - 'pyatigorsk' => - array ( - ), - 'spb' => - array ( - ), - 'vladikavkaz' => - array ( - ), - 'vladimir' => - array ( - ), - 'blogspot' => - array ( - ), - 'cldmail' => - array ( - 'hb' => - array ( - ), - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'pp' => - array ( - ), - ), - 'rw' => - array ( - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'edu' => - array ( - ), - 'ac' => - array ( - ), - 'com' => - array ( - ), - 'co' => - array ( - ), - 'int' => - array ( - ), - 'mil' => - array ( - ), - 'gouv' => - array ( - ), - ), - 'sa' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - 'med' => - array ( - ), - 'pub' => - array ( - ), - 'edu' => - array ( - ), - 'sch' => - array ( - ), - ), - 'sb' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'sc' => - array ( - 'com' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - ), - 'sd' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'med' => - array ( - ), - 'tv' => - array ( - ), - 'gov' => - array ( - ), - 'info' => - array ( - ), - ), - 'se' => - array ( - 'a' => - array ( - ), - 'ac' => - array ( - ), - 'b' => - array ( - ), - 'bd' => - array ( - ), - 'brand' => - array ( - ), - 'c' => - array ( - ), - 'd' => - array ( - ), - 'e' => - array ( - ), - 'f' => - array ( - ), - 'fh' => - array ( - ), - 'fhsk' => - array ( - ), - 'fhv' => - array ( - ), - 'g' => - array ( - ), - 'h' => - array ( - ), - 'i' => - array ( - ), - 'k' => - array ( - ), - 'komforb' => - array ( - ), - 'kommunalforbund' => - array ( - ), - 'komvux' => - array ( - ), - 'l' => - array ( - ), - 'lanbib' => - array ( - ), - 'm' => - array ( - ), - 'n' => - array ( - ), - 'naturbruksgymn' => - array ( - ), - 'o' => - array ( - ), - 'org' => - array ( - ), - 'p' => - array ( - ), - 'parti' => - array ( - ), - 'pp' => - array ( - ), - 'press' => - array ( - ), - 'r' => - array ( - ), - 's' => - array ( - ), - 't' => - array ( - ), - 'tm' => - array ( - ), - 'u' => - array ( - ), - 'w' => - array ( - ), - 'x' => - array ( - ), - 'y' => - array ( - ), - 'z' => - array ( - ), - 'com' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'sg' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - 'edu' => - array ( - ), - 'per' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'sh' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - 'mil' => - array ( - ), - 'hashbang' => - array ( - ), - 'platform' => - array ( - '*' => - array ( - ), - ), - 'wedeploy' => - array ( - ), - 'now' => - array ( - ), - ), - 'si' => - array ( - 'blogspot' => - array ( - ), - 'nom' => - array ( - ), - ), - 'sj' => - array ( - ), - 'sk' => - array ( - 'blogspot' => - array ( - ), - 'nym' => - array ( - ), - ), - 'sl' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'org' => - array ( - ), - ), - 'sm' => - array ( - ), - 'sn' => - array ( - 'art' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gouv' => - array ( - ), - 'org' => - array ( - ), - 'perso' => - array ( - ), - 'univ' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'so' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'sr' => - array ( - ), - 'st' => - array ( - 'co' => - array ( - ), - 'com' => - array ( - ), - 'consulado' => - array ( - ), - 'edu' => - array ( - ), - 'embaixada' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'principe' => - array ( - ), - 'saotome' => - array ( - ), - 'store' => - array ( - ), - ), - 'su' => - array ( - 'abkhazia' => - array ( - ), - 'adygeya' => - array ( - ), - 'aktyubinsk' => - array ( - ), - 'arkhangelsk' => - array ( - ), - 'armenia' => - array ( - ), - 'ashgabad' => - array ( - ), - 'azerbaijan' => - array ( - ), - 'balashov' => - array ( - ), - 'bashkiria' => - array ( - ), - 'bryansk' => - array ( - ), - 'bukhara' => - array ( - ), - 'chimkent' => - array ( - ), - 'dagestan' => - array ( - ), - 'east-kazakhstan' => - array ( - ), - 'exnet' => - array ( - ), - 'georgia' => - array ( - ), - 'grozny' => - array ( - ), - 'ivanovo' => - array ( - ), - 'jambyl' => - array ( - ), - 'kalmykia' => - array ( - ), - 'kaluga' => - array ( - ), - 'karacol' => - array ( - ), - 'karaganda' => - array ( - ), - 'karelia' => - array ( - ), - 'khakassia' => - array ( - ), - 'krasnodar' => - array ( - ), - 'kurgan' => - array ( - ), - 'kustanai' => - array ( - ), - 'lenug' => - array ( - ), - 'mangyshlak' => - array ( - ), - 'mordovia' => - array ( - ), - 'msk' => - array ( - ), - 'murmansk' => - array ( - ), - 'nalchik' => - array ( - ), - 'navoi' => - array ( - ), - 'north-kazakhstan' => - array ( - ), - 'nov' => - array ( - ), - 'obninsk' => - array ( - ), - 'penza' => - array ( - ), - 'pokrovsk' => - array ( - ), - 'sochi' => - array ( - ), - 'spb' => - array ( - ), - 'tashkent' => - array ( - ), - 'termez' => - array ( - ), - 'togliatti' => - array ( - ), - 'troitsk' => - array ( - ), - 'tselinograd' => - array ( - ), - 'tula' => - array ( - ), - 'tuva' => - array ( - ), - 'vladikavkaz' => - array ( - ), - 'vladimir' => - array ( - ), - 'vologda' => - array ( - ), - 'nym' => - array ( - ), - ), - 'sv' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gob' => - array ( - ), - 'org' => - array ( - ), - 'red' => - array ( - ), - ), - 'sx' => - array ( - 'gov' => - array ( - ), - 'nym' => - array ( - ), - ), - 'sy' => - array ( - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'mil' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - ), - 'sz' => - array ( - 'co' => - array ( - ), - 'ac' => - array ( - ), - 'org' => - array ( - ), - ), - 'tc' => - array ( - ), - 'td' => - array ( - 'blogspot' => - array ( - ), - ), - 'tel' => - array ( - ), - 'tf' => - array ( - ), - 'tg' => - array ( - ), - 'th' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'go' => - array ( - ), - 'in' => - array ( - ), - 'mi' => - array ( - ), - 'net' => - array ( - ), - 'or' => - array ( - ), - ), - 'tj' => - array ( - 'ac' => - array ( - ), - 'biz' => - array ( - ), - 'co' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'go' => - array ( - ), - 'gov' => - array ( - ), - 'int' => - array ( - ), - 'mil' => - array ( - ), - 'name' => - array ( - ), - 'net' => - array ( - ), - 'nic' => - array ( - ), - 'org' => - array ( - ), - 'test' => - array ( - ), - 'web' => - array ( - ), - ), - 'tk' => - array ( - ), - 'tl' => - array ( - 'gov' => - array ( - ), - ), - 'tm' => - array ( - 'com' => - array ( - ), - 'co' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'nom' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'edu' => - array ( - ), - ), - 'tn' => - array ( - 'com' => - array ( - ), - 'ens' => - array ( - ), - 'fin' => - array ( - ), - 'gov' => - array ( - ), - 'ind' => - array ( - ), - 'intl' => - array ( - ), - 'nat' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'info' => - array ( - ), - 'perso' => - array ( - ), - 'tourism' => - array ( - ), - 'edunet' => - array ( - ), - 'rnrt' => - array ( - ), - 'rns' => - array ( - ), - 'rnu' => - array ( - ), - 'mincom' => - array ( - ), - 'agrinet' => - array ( - ), - 'defense' => - array ( - ), - 'turen' => - array ( - ), - ), - 'to' => - array ( - 'com' => - array ( - ), - 'gov' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'mil' => - array ( - ), - 'vpnplus' => - array ( - ), - ), - 'tr' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - 'info' => - array ( - ), - 'biz' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'web' => - array ( - ), - 'gen' => - array ( - ), - 'tv' => - array ( - ), - 'av' => - array ( - ), - 'dr' => - array ( - ), - 'bbs' => - array ( - ), - 'name' => - array ( - ), - 'tel' => - array ( - ), - 'gov' => - array ( - ), - 'bel' => - array ( - ), - 'pol' => - array ( - ), - 'mil' => - array ( - ), - 'k12' => - array ( - ), - 'edu' => - array ( - ), - 'kep' => - array ( - ), - 'nc' => - array ( - 'gov' => - array ( - ), - ), - ), - 'travel' => - array ( - ), - 'tt' => - array ( - 'co' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - 'net' => - array ( - ), - 'biz' => - array ( - ), - 'info' => - array ( - ), - 'pro' => - array ( - ), - 'int' => - array ( - ), - 'coop' => - array ( - ), - 'jobs' => - array ( - ), - 'mobi' => - array ( - ), - 'travel' => - array ( - ), - 'museum' => - array ( - ), - 'aero' => - array ( - ), - 'name' => - array ( - ), - 'gov' => - array ( - ), - 'edu' => - array ( - ), - ), - 'tv' => - array ( - 'dyndns' => - array ( - ), - 'better-than' => - array ( - ), - 'on-the-web' => - array ( - ), - 'worse-than' => - array ( - ), - ), - 'tw' => - array ( - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'com' => - array ( - 'mymailer' => - array ( - ), - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'idv' => - array ( - ), - 'game' => - array ( - ), - 'ebiz' => - array ( - ), - 'club' => - array ( - ), - 'xn--zf0ao64a' => - array ( - ), - 'xn--uc0atv' => - array ( - ), - 'xn--czrw28b' => - array ( - ), - 'url' => - array ( - ), - 'blogspot' => - array ( - ), - 'nym' => - array ( - ), - ), - 'tz' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'go' => - array ( - ), - 'hotel' => - array ( - ), - 'info' => - array ( - ), - 'me' => - array ( - ), - 'mil' => - array ( - ), - 'mobi' => - array ( - ), - 'ne' => - array ( - ), - 'or' => - array ( - ), - 'sc' => - array ( - ), - 'tv' => - array ( - ), - ), - 'ua' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'in' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'cherkassy' => - array ( - ), - 'cherkasy' => - array ( - ), - 'chernigov' => - array ( - ), - 'chernihiv' => - array ( - ), - 'chernivtsi' => - array ( - ), - 'chernovtsy' => - array ( - ), - 'ck' => - array ( - ), - 'cn' => - array ( - ), - 'cr' => - array ( - ), - 'crimea' => - array ( - ), - 'cv' => - array ( - ), - 'dn' => - array ( - ), - 'dnepropetrovsk' => - array ( - ), - 'dnipropetrovsk' => - array ( - ), - 'dominic' => - array ( - ), - 'donetsk' => - array ( - ), - 'dp' => - array ( - ), - 'if' => - array ( - ), - 'ivano-frankivsk' => - array ( - ), - 'kh' => - array ( - ), - 'kharkiv' => - array ( - ), - 'kharkov' => - array ( - ), - 'kherson' => - array ( - ), - 'khmelnitskiy' => - array ( - ), - 'khmelnytskyi' => - array ( - ), - 'kiev' => - array ( - ), - 'kirovograd' => - array ( - ), - 'km' => - array ( - ), - 'kr' => - array ( - ), - 'krym' => - array ( - ), - 'ks' => - array ( - ), - 'kv' => - array ( - ), - 'kyiv' => - array ( - ), - 'lg' => - array ( - ), - 'lt' => - array ( - ), - 'lugansk' => - array ( - ), - 'lutsk' => - array ( - ), - 'lv' => - array ( - ), - 'lviv' => - array ( - ), - 'mk' => - array ( - ), - 'mykolaiv' => - array ( - ), - 'nikolaev' => - array ( - ), - 'od' => - array ( - ), - 'odesa' => - array ( - ), - 'odessa' => - array ( - ), - 'pl' => - array ( - ), - 'poltava' => - array ( - ), - 'rivne' => - array ( - ), - 'rovno' => - array ( - ), - 'rv' => - array ( - ), - 'sb' => - array ( - ), - 'sebastopol' => - array ( - ), - 'sevastopol' => - array ( - ), - 'sm' => - array ( - ), - 'sumy' => - array ( - ), - 'te' => - array ( - ), - 'ternopil' => - array ( - ), - 'uz' => - array ( - ), - 'uzhgorod' => - array ( - ), - 'vinnica' => - array ( - ), - 'vinnytsia' => - array ( - ), - 'vn' => - array ( - ), - 'volyn' => - array ( - ), - 'yalta' => - array ( - ), - 'zaporizhzhe' => - array ( - ), - 'zaporizhzhia' => - array ( - ), - 'zhitomir' => - array ( - ), - 'zhytomyr' => - array ( - ), - 'zp' => - array ( - ), - 'zt' => - array ( - ), - 'cc' => - array ( - ), - 'inf' => - array ( - ), - 'ltd' => - array ( - ), - 'biz' => - array ( - ), - 'co' => - array ( - ), - 'pp' => - array ( - ), - ), - 'ug' => - array ( - 'co' => - array ( - ), - 'or' => - array ( - ), - 'ac' => - array ( - ), - 'sc' => - array ( - ), - 'go' => - array ( - ), - 'ne' => - array ( - ), - 'com' => - array ( - ), - 'org' => - array ( - ), - 'blogspot' => - array ( - ), - 'nom' => - array ( - ), - ), - 'uk' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - 'blogspot' => - array ( - ), - 'no-ip' => - array ( - ), - 'wellbeingzone' => - array ( - ), - ), - 'gov' => - array ( - 'service' => - array ( - ), - 'homeoffice' => - array ( - ), - ), - 'ltd' => - array ( - ), - 'me' => - array ( - ), - 'net' => - array ( - ), - 'nhs' => - array ( - ), - 'org' => - array ( - ), - 'plc' => - array ( - ), - 'police' => - array ( - ), - 'sch' => - array ( - '*' => - array ( - ), - ), - ), - 'us' => - array ( - 'dni' => - array ( - ), - 'fed' => - array ( - ), - 'isa' => - array ( - ), - 'kids' => - array ( - ), - 'nsn' => - array ( - ), - 'ak' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'al' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ar' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'as' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'az' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ca' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'co' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ct' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'dc' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'de' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'fl' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ga' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'gu' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'hi' => - array ( - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ia' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'id' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'il' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'in' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ks' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ky' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'la' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ma' => - array ( - 'k12' => - array ( - 'pvt' => - array ( - ), - 'chtr' => - array ( - ), - 'paroch' => - array ( - ), - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'md' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'me' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'mi' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - 'ann-arbor' => - array ( - ), - 'cog' => - array ( - ), - 'dst' => - array ( - ), - 'eaton' => - array ( - ), - 'gen' => - array ( - ), - 'mus' => - array ( - ), - 'tec' => - array ( - ), - 'washtenaw' => - array ( - ), - ), - 'mn' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'mo' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ms' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'mt' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'nc' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'nd' => - array ( - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ne' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'nh' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'nj' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'nm' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'nv' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ny' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'oh' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ok' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'or' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'pa' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'pr' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ri' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'sc' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'sd' => - array ( - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'tn' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'tx' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'ut' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'vi' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'vt' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'va' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'wa' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'wi' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'wv' => - array ( - 'cc' => - array ( - ), - ), - 'wy' => - array ( - 'k12' => - array ( - ), - 'cc' => - array ( - ), - 'lib' => - array ( - ), - ), - 'cloudns' => - array ( - ), - 'drud' => - array ( - ), - 'is-by' => - array ( - ), - 'land-4-sale' => - array ( - ), - 'stuff-4-sale' => - array ( - ), - 'golffan' => - array ( - ), - 'noip' => - array ( - ), - 'pointto' => - array ( - ), - ), - 'uy' => - array ( - 'com' => - array ( - 'blogspot' => - array ( - ), - ), - 'edu' => - array ( - ), - 'gub' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'nom' => - array ( - ), - ), - 'uz' => - array ( - 'co' => - array ( - ), - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'va' => - array ( - ), - 'vc' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'edu' => - array ( - ), - 'nom' => - array ( - ), - ), - 've' => - array ( - 'arts' => - array ( - ), - 'co' => - array ( - ), - 'com' => - array ( - ), - 'e12' => - array ( - ), - 'edu' => - array ( - ), - 'firm' => - array ( - ), - 'gob' => - array ( - ), - 'gov' => - array ( - ), - 'info' => - array ( - ), - 'int' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'rec' => - array ( - ), - 'store' => - array ( - ), - 'tec' => - array ( - ), - 'web' => - array ( - ), - ), - 'vg' => - array ( - 'nom' => - array ( - ), - ), - 'vi' => - array ( - 'co' => - array ( - ), - 'com' => - array ( - ), - 'k12' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'vn' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'int' => - array ( - ), - 'ac' => - array ( - ), - 'biz' => - array ( - ), - 'info' => - array ( - ), - 'name' => - array ( - ), - 'pro' => - array ( - ), - 'health' => - array ( - ), - 'blogspot' => - array ( - ), - ), - 'vu' => - array ( - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - ), - 'wf' => - array ( - ), - 'ws' => - array ( - 'com' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'gov' => - array ( - ), - 'edu' => - array ( - ), - 'advisor' => - array ( - '*' => - array ( - ), - ), - 'dyndns' => - array ( - ), - 'mypets' => - array ( - ), - ), - 'yt' => - array ( - ), - 'xn--mgbaam7a8h' => - array ( - ), - 'xn--y9a3aq' => - array ( - ), - 'xn--54b7fta0cc' => - array ( - ), - 'xn--90ae' => - array ( - ), - 'xn--90ais' => - array ( - ), - 'xn--fiqs8s' => - array ( - ), - 'xn--fiqz9s' => - array ( - ), - 'xn--lgbbat1ad8j' => - array ( - ), - 'xn--wgbh1c' => - array ( - ), - 'xn--e1a4c' => - array ( - ), - 'xn--node' => - array ( - ), - 'xn--qxam' => - array ( - ), - 'xn--j6w193g' => - array ( - ), - 'xn--2scrj9c' => - array ( - ), - 'xn--3hcrj9c' => - array ( - ), - 'xn--45br5cyl' => - array ( - ), - 'xn--h2breg3eve' => - array ( - ), - 'xn--h2brj9c8c' => - array ( - ), - 'xn--mgbgu82a' => - array ( - ), - 'xn--rvc1e0am3e' => - array ( - ), - 'xn--h2brj9c' => - array ( - ), - 'xn--mgbbh1a71e' => - array ( - ), - 'xn--fpcrj9c3d' => - array ( - ), - 'xn--gecrj9c' => - array ( - ), - 'xn--s9brj9c' => - array ( - ), - 'xn--45brj9c' => - array ( - ), - 'xn--xkc2dl3a5ee0h' => - array ( - ), - 'xn--mgba3a4f16a' => - array ( - ), - 'xn--mgba3a4fra' => - array ( - ), - 'xn--mgbtx2b' => - array ( - ), - 'xn--mgbayh7gpa' => - array ( - ), - 'xn--3e0b707e' => - array ( - ), - 'xn--80ao21a' => - array ( - ), - 'xn--fzc2c9e2c' => - array ( - ), - 'xn--xkc2al3hye2a' => - array ( - ), - 'xn--mgbc0a9azcg' => - array ( - ), - 'xn--d1alf' => - array ( - ), - 'xn--l1acc' => - array ( - ), - 'xn--mix891f' => - array ( - ), - 'xn--mix082f' => - array ( - ), - 'xn--mgbx4cd0ab' => - array ( - ), - 'xn--mgb9awbf' => - array ( - ), - 'xn--mgbai9azgqp6j' => - array ( - ), - 'xn--mgbai9a5eva00b' => - array ( - ), - 'xn--ygbi2ammx' => - array ( - ), - 'xn--90a3ac' => - array ( - 'xn--o1ac' => - array ( - ), - 'xn--c1avg' => - array ( - ), - 'xn--90azh' => - array ( - ), - 'xn--d1at' => - array ( - ), - 'xn--o1ach' => - array ( - ), - 'xn--80au' => - array ( - ), - ), - 'xn--p1ai' => - array ( - ), - 'xn--wgbl6a' => - array ( - ), - 'xn--mgberp4a5d4ar' => - array ( - ), - 'xn--mgberp4a5d4a87g' => - array ( - ), - 'xn--mgbqly7c0a67fbc' => - array ( - ), - 'xn--mgbqly7cvafr' => - array ( - ), - 'xn--mgbpl2fh' => - array ( - ), - 'xn--yfro4i67o' => - array ( - ), - 'xn--clchc0ea0b2g2a9gcd' => - array ( - ), - 'xn--ogbpf8fl' => - array ( - ), - 'xn--mgbtf8fl' => - array ( - ), - 'xn--o3cw4h' => - array ( - 'xn--12c1fe0br' => - array ( - ), - 'xn--12co0c3b4eva' => - array ( - ), - 'xn--h3cuzk1di' => - array ( - ), - 'xn--o3cyx2a' => - array ( - ), - 'xn--m3ch0j3a' => - array ( - ), - 'xn--12cfi8ixb8l' => - array ( - ), - ), - 'xn--pgbs0dh' => - array ( - ), - 'xn--kpry57d' => - array ( - ), - 'xn--kprw13d' => - array ( - ), - 'xn--nnx388a' => - array ( - ), - 'xn--j1amh' => - array ( - ), - 'xn--mgb2ddes' => - array ( - ), - 'xxx' => - array ( - ), - 'ye' => - array ( - '*' => - array ( - ), - ), - 'za' => - array ( - 'ac' => - array ( - ), - 'agric' => - array ( - ), - 'alt' => - array ( - ), - 'co' => - array ( - 'blogspot' => - array ( - ), - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'grondar' => - array ( - ), - 'law' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'ngo' => - array ( - ), - 'nis' => - array ( - ), - 'nom' => - array ( - ), - 'org' => - array ( - ), - 'school' => - array ( - ), - 'tm' => - array ( - ), - 'web' => - array ( - ), - ), - 'zm' => - array ( - 'ac' => - array ( - ), - 'biz' => - array ( - ), - 'co' => - array ( - ), - 'com' => - array ( - ), - 'edu' => - array ( - ), - 'gov' => - array ( - ), - 'info' => - array ( - ), - 'mil' => - array ( - ), - 'net' => - array ( - ), - 'org' => - array ( - ), - 'sch' => - array ( - ), - ), - 'zw' => - array ( - 'ac' => - array ( - ), - 'co' => - array ( - ), - 'gov' => - array ( - ), - 'mil' => - array ( - ), - 'org' => - array ( - ), - ), - 'aaa' => - array ( - ), - 'aarp' => - array ( - ), - 'abarth' => - array ( - ), - 'abb' => - array ( - ), - 'abbott' => - array ( - ), - 'abbvie' => - array ( - ), - 'abc' => - array ( - ), - 'able' => - array ( - ), - 'abogado' => - array ( - ), - 'abudhabi' => - array ( - ), - 'academy' => - array ( - ), - 'accenture' => - array ( - ), - 'accountant' => - array ( - ), - 'accountants' => - array ( - ), - 'aco' => - array ( - ), - 'active' => - array ( - ), - 'actor' => - array ( - ), - 'adac' => - array ( - ), - 'ads' => - array ( - ), - 'adult' => - array ( - ), - 'aeg' => - array ( - ), - 'aetna' => - array ( - ), - 'afamilycompany' => - array ( - ), - 'afl' => - array ( - ), - 'africa' => - array ( - ), - 'agakhan' => - array ( - ), - 'agency' => - array ( - ), - 'aig' => - array ( - ), - 'aigo' => - array ( - ), - 'airbus' => - array ( - ), - 'airforce' => - array ( - ), - 'airtel' => - array ( - ), - 'akdn' => - array ( - ), - 'alfaromeo' => - array ( - ), - 'alibaba' => - array ( - ), - 'alipay' => - array ( - ), - 'allfinanz' => - array ( - ), - 'allstate' => - array ( - ), - 'ally' => - array ( - ), - 'alsace' => - array ( - ), - 'alstom' => - array ( - ), - 'americanexpress' => - array ( - ), - 'americanfamily' => - array ( - ), - 'amex' => - array ( - ), - 'amfam' => - array ( - ), - 'amica' => - array ( - ), - 'amsterdam' => - array ( - ), - 'analytics' => - array ( - ), - 'android' => - array ( - ), - 'anquan' => - array ( - ), - 'anz' => - array ( - ), - 'aol' => - array ( - ), - 'apartments' => - array ( - ), - 'app' => - array ( - ), - 'apple' => - array ( - ), - 'aquarelle' => - array ( - ), - 'arab' => - array ( - ), - 'aramco' => - array ( - ), - 'archi' => - array ( - ), - 'army' => - array ( - ), - 'art' => - array ( - ), - 'arte' => - array ( - ), - 'asda' => - array ( - ), - 'associates' => - array ( - ), - 'athleta' => - array ( - ), - 'attorney' => - array ( - ), - 'auction' => - array ( - ), - 'audi' => - array ( - ), - 'audible' => - array ( - ), - 'audio' => - array ( - ), - 'auspost' => - array ( - ), - 'author' => - array ( - ), - 'auto' => - array ( - ), - 'autos' => - array ( - ), - 'avianca' => - array ( - ), - 'aws' => - array ( - ), - 'axa' => - array ( - ), - 'azure' => - array ( - ), - 'baby' => - array ( - ), - 'baidu' => - array ( - ), - 'banamex' => - array ( - ), - 'bananarepublic' => - array ( - ), - 'band' => - array ( - ), - 'bank' => - array ( - ), - 'bar' => - array ( - ), - 'barcelona' => - array ( - ), - 'barclaycard' => - array ( - ), - 'barclays' => - array ( - ), - 'barefoot' => - array ( - ), - 'bargains' => - array ( - ), - 'baseball' => - array ( - ), - 'basketball' => - array ( - ), - 'bauhaus' => - array ( - ), - 'bayern' => - array ( - ), - 'bbc' => - array ( - ), - 'bbt' => - array ( - ), - 'bbva' => - array ( - ), - 'bcg' => - array ( - ), - 'bcn' => - array ( - ), - 'beats' => - array ( - ), - 'beauty' => - array ( - ), - 'beer' => - array ( - ), - 'bentley' => - array ( - ), - 'berlin' => - array ( - ), - 'best' => - array ( - ), - 'bestbuy' => - array ( - ), - 'bet' => - array ( - ), - 'bharti' => - array ( - ), - 'bible' => - array ( - ), - 'bid' => - array ( - ), - 'bike' => - array ( - ), - 'bing' => - array ( - ), - 'bingo' => - array ( - ), - 'bio' => - array ( - ), - 'black' => - array ( - ), - 'blackfriday' => - array ( - ), - 'blanco' => - array ( - ), - 'blockbuster' => - array ( - ), - 'blog' => - array ( - ), - 'bloomberg' => - array ( - ), - 'blue' => - array ( - ), - 'bms' => - array ( - ), - 'bmw' => - array ( - ), - 'bnl' => - array ( - ), - 'bnpparibas' => - array ( - ), - 'boats' => - array ( - ), - 'boehringer' => - array ( - ), - 'bofa' => - array ( - ), - 'bom' => - array ( - ), - 'bond' => - array ( - ), - 'boo' => - array ( - ), - 'book' => - array ( - ), - 'booking' => - array ( - ), - 'boots' => - array ( - ), - 'bosch' => - array ( - ), - 'bostik' => - array ( - ), - 'boston' => - array ( - ), - 'bot' => - array ( - ), - 'boutique' => - array ( - ), - 'box' => - array ( - ), - 'bradesco' => - array ( - ), - 'bridgestone' => - array ( - ), - 'broadway' => - array ( - ), - 'broker' => - array ( - ), - 'brother' => - array ( - ), - 'brussels' => - array ( - ), - 'budapest' => - array ( - ), - 'bugatti' => - array ( - ), - 'build' => - array ( - ), - 'builders' => - array ( - ), - 'business' => - array ( - ), - 'buy' => - array ( - ), - 'buzz' => - array ( - ), - 'bzh' => - array ( - ), - 'cab' => - array ( - ), - 'cafe' => - array ( - ), - 'cal' => - array ( - ), - 'call' => - array ( - ), - 'calvinklein' => - array ( - ), - 'cam' => - array ( - ), - 'camera' => - array ( - ), - 'camp' => - array ( - ), - 'cancerresearch' => - array ( - ), - 'canon' => - array ( - ), - 'capetown' => - array ( - ), - 'capital' => - array ( - ), - 'capitalone' => - array ( - ), - 'car' => - array ( - ), - 'caravan' => - array ( - ), - 'cards' => - array ( - ), - 'care' => - array ( - ), - 'career' => - array ( - ), - 'careers' => - array ( - ), - 'cars' => - array ( - ), - 'cartier' => - array ( - ), - 'casa' => - array ( - ), - 'case' => - array ( - ), - 'caseih' => - array ( - ), - 'cash' => - array ( - ), - 'casino' => - array ( - ), - 'catering' => - array ( - ), - 'catholic' => - array ( - ), - 'cba' => - array ( - ), - 'cbn' => - array ( - ), - 'cbre' => - array ( - ), - 'cbs' => - array ( - ), - 'ceb' => - array ( - ), - 'center' => - array ( - ), - 'ceo' => - array ( - ), - 'cern' => - array ( - ), - 'cfa' => - array ( - ), - 'cfd' => - array ( - ), - 'chanel' => - array ( - ), - 'channel' => - array ( - ), - 'chase' => - array ( - ), - 'chat' => - array ( - ), - 'cheap' => - array ( - ), - 'chintai' => - array ( - ), - 'chloe' => - array ( - ), - 'christmas' => - array ( - ), - 'chrome' => - array ( - ), - 'chrysler' => - array ( - ), - 'church' => - array ( - ), - 'cipriani' => - array ( - ), - 'circle' => - array ( - ), - 'cisco' => - array ( - ), - 'citadel' => - array ( - ), - 'citi' => - array ( - ), - 'citic' => - array ( - ), - 'city' => - array ( - ), - 'cityeats' => - array ( - ), - 'claims' => - array ( - ), - 'cleaning' => - array ( - ), - 'click' => - array ( - ), - 'clinic' => - array ( - ), - 'clinique' => - array ( - ), - 'clothing' => - array ( - ), - 'cloud' => - array ( - 'myfusion' => - array ( - ), - 'statics' => - array ( - '*' => - array ( - ), - ), - 'magentosite' => - array ( - '*' => - array ( - ), - ), - 'vapor' => - array ( - ), - 'sensiosite' => - array ( - '*' => - array ( - ), - ), - 'trafficplex' => - array ( - ), - ), - 'club' => - array ( - 'cloudns' => - array ( - ), - ), - 'clubmed' => - array ( - ), - 'coach' => - array ( - ), - 'codes' => - array ( - ), - 'coffee' => - array ( - ), - 'college' => - array ( - ), - 'cologne' => - array ( - ), - 'comcast' => - array ( - ), - 'commbank' => - array ( - ), - 'community' => - array ( - ), - 'company' => - array ( - ), - 'compare' => - array ( - ), - 'computer' => - array ( - ), - 'comsec' => - array ( - ), - 'condos' => - array ( - ), - 'construction' => - array ( - ), - 'consulting' => - array ( - ), - 'contact' => - array ( - ), - 'contractors' => - array ( - ), - 'cooking' => - array ( - ), - 'cookingchannel' => - array ( - ), - 'cool' => - array ( - 'de' => - array ( - ), - ), - 'corsica' => - array ( - ), - 'country' => - array ( - ), - 'coupon' => - array ( - ), - 'coupons' => - array ( - ), - 'courses' => - array ( - ), - 'credit' => - array ( - ), - 'creditcard' => - array ( - ), - 'creditunion' => - array ( - ), - 'cricket' => - array ( - ), - 'crown' => - array ( - ), - 'crs' => - array ( - ), - 'cruise' => - array ( - ), - 'cruises' => - array ( - ), - 'csc' => - array ( - ), - 'cuisinella' => - array ( - ), - 'cymru' => - array ( - ), - 'cyou' => - array ( - ), - 'dabur' => - array ( - ), - 'dad' => - array ( - ), - 'dance' => - array ( - ), - 'data' => - array ( - ), - 'date' => - array ( - ), - 'dating' => - array ( - ), - 'datsun' => - array ( - ), - 'day' => - array ( - ), - 'dclk' => - array ( - ), - 'dds' => - array ( - ), - 'deal' => - array ( - ), - 'dealer' => - array ( - ), - 'deals' => - array ( - ), - 'degree' => - array ( - ), - 'delivery' => - array ( - ), - 'dell' => - array ( - ), - 'deloitte' => - array ( - ), - 'delta' => - array ( - ), - 'democrat' => - array ( - ), - 'dental' => - array ( - ), - 'dentist' => - array ( - ), - 'desi' => - array ( - ), - 'design' => - array ( - ), - 'dev' => - array ( - ), - 'dhl' => - array ( - ), - 'diamonds' => - array ( - ), - 'diet' => - array ( - ), - 'digital' => - array ( - ), - 'direct' => - array ( - ), - 'directory' => - array ( - ), - 'discount' => - array ( - ), - 'discover' => - array ( - ), - 'dish' => - array ( - ), - 'diy' => - array ( - ), - 'dnp' => - array ( - ), - 'docs' => - array ( - ), - 'doctor' => - array ( - ), - 'dodge' => - array ( - ), - 'dog' => - array ( - ), - 'doha' => - array ( - ), - 'domains' => - array ( - ), - 'dot' => - array ( - ), - 'download' => - array ( - ), - 'drive' => - array ( - ), - 'dtv' => - array ( - ), - 'dubai' => - array ( - ), - 'duck' => - array ( - ), - 'dunlop' => - array ( - ), - 'duns' => - array ( - ), - 'dupont' => - array ( - ), - 'durban' => - array ( - ), - 'dvag' => - array ( - ), - 'dvr' => - array ( - ), - 'earth' => - array ( - ), - 'eat' => - array ( - ), - 'eco' => - array ( - ), - 'edeka' => - array ( - ), - 'education' => - array ( - ), - 'email' => - array ( - ), - 'emerck' => - array ( - ), - 'energy' => - array ( - ), - 'engineer' => - array ( - ), - 'engineering' => - array ( - ), - 'enterprises' => - array ( - ), - 'epost' => - array ( - ), - 'epson' => - array ( - ), - 'equipment' => - array ( - ), - 'ericsson' => - array ( - ), - 'erni' => - array ( - ), - 'esq' => - array ( - ), - 'estate' => - array ( - 'compute' => - array ( - '*' => - array ( - ), - ), - ), - 'esurance' => - array ( - ), - 'etisalat' => - array ( - ), - 'eurovision' => - array ( - ), - 'eus' => - array ( - 'party' => - array ( - 'user' => - array ( - ), - ), - ), - 'events' => - array ( - ), - 'everbank' => - array ( - ), - 'exchange' => - array ( - ), - 'expert' => - array ( - ), - 'exposed' => - array ( - ), - 'express' => - array ( - ), - 'extraspace' => - array ( - ), - 'fage' => - array ( - ), - 'fail' => - array ( - ), - 'fairwinds' => - array ( - ), - 'faith' => - array ( - 'ybo' => - array ( - ), - ), - 'family' => - array ( - ), - 'fan' => - array ( - ), - 'fans' => - array ( - ), - 'farm' => - array ( - 'storj' => - array ( - ), - ), - 'farmers' => - array ( - ), - 'fashion' => - array ( - ), - 'fast' => - array ( - ), - 'fedex' => - array ( - ), - 'feedback' => - array ( - ), - 'ferrari' => - array ( - ), - 'ferrero' => - array ( - ), - 'fiat' => - array ( - ), - 'fidelity' => - array ( - ), - 'fido' => - array ( - ), - 'film' => - array ( - ), - 'final' => - array ( - ), - 'finance' => - array ( - ), - 'financial' => - array ( - ), - 'fire' => - array ( - ), - 'firestone' => - array ( - ), - 'firmdale' => - array ( - ), - 'fish' => - array ( - ), - 'fishing' => - array ( - ), - 'fit' => - array ( - 'ptplus' => - array ( - ), - ), - 'fitness' => - array ( - ), - 'flickr' => - array ( - ), - 'flights' => - array ( - ), - 'flir' => - array ( - ), - 'florist' => - array ( - ), - 'flowers' => - array ( - ), - 'fly' => - array ( - ), - 'foo' => - array ( - ), - 'food' => - array ( - ), - 'foodnetwork' => - array ( - ), - 'football' => - array ( - ), - 'ford' => - array ( - ), - 'forex' => - array ( - ), - 'forsale' => - array ( - ), - 'forum' => - array ( - ), - 'foundation' => - array ( - ), - 'fox' => - array ( - ), - 'free' => - array ( - ), - 'fresenius' => - array ( - ), - 'frl' => - array ( - ), - 'frogans' => - array ( - ), - 'frontdoor' => - array ( - ), - 'frontier' => - array ( - ), - 'ftr' => - array ( - ), - 'fujitsu' => - array ( - ), - 'fujixerox' => - array ( - ), - 'fun' => - array ( - ), - 'fund' => - array ( - ), - 'furniture' => - array ( - ), - 'futbol' => - array ( - ), - 'fyi' => - array ( - ), - 'gal' => - array ( - ), - 'gallery' => - array ( - ), - 'gallo' => - array ( - ), - 'gallup' => - array ( - ), - 'game' => - array ( - ), - 'games' => - array ( - ), - 'gap' => - array ( - ), - 'garden' => - array ( - ), - 'gbiz' => - array ( - ), - 'gdn' => - array ( - ), - 'gea' => - array ( - ), - 'gent' => - array ( - ), - 'genting' => - array ( - ), - 'george' => - array ( - ), - 'ggee' => - array ( - ), - 'gift' => - array ( - ), - 'gifts' => - array ( - ), - 'gives' => - array ( - ), - 'giving' => - array ( - ), - 'glade' => - array ( - ), - 'glass' => - array ( - ), - 'gle' => - array ( - ), - 'global' => - array ( - ), - 'globo' => - array ( - ), - 'gmail' => - array ( - ), - 'gmbh' => - array ( - ), - 'gmo' => - array ( - ), - 'gmx' => - array ( - ), - 'godaddy' => - array ( - ), - 'gold' => - array ( - ), - 'goldpoint' => - array ( - ), - 'golf' => - array ( - ), - 'goo' => - array ( - ), - 'goodhands' => - array ( - ), - 'goodyear' => - array ( - ), - 'goog' => - array ( - 'cloud' => - array ( - ), - ), - 'google' => - array ( - ), - 'gop' => - array ( - ), - 'got' => - array ( - ), - 'grainger' => - array ( - ), - 'graphics' => - array ( - ), - 'gratis' => - array ( - ), - 'green' => - array ( - ), - 'gripe' => - array ( - ), - 'grocery' => - array ( - ), - 'group' => - array ( - ), - 'guardian' => - array ( - ), - 'gucci' => - array ( - ), - 'guge' => - array ( - ), - 'guide' => - array ( - ), - 'guitars' => - array ( - ), - 'guru' => - array ( - ), - 'hair' => - array ( - ), - 'hamburg' => - array ( - ), - 'hangout' => - array ( - ), - 'haus' => - array ( - ), - 'hbo' => - array ( - ), - 'hdfc' => - array ( - ), - 'hdfcbank' => - array ( - ), - 'health' => - array ( - ), - 'healthcare' => - array ( - ), - 'help' => - array ( - ), - 'helsinki' => - array ( - ), - 'here' => - array ( - ), - 'hermes' => - array ( - ), - 'hgtv' => - array ( - ), - 'hiphop' => - array ( - ), - 'hisamitsu' => - array ( - ), - 'hitachi' => - array ( - ), - 'hiv' => - array ( - ), - 'hkt' => - array ( - ), - 'hockey' => - array ( - ), - 'holdings' => - array ( - ), - 'holiday' => - array ( - ), - 'homedepot' => - array ( - ), - 'homegoods' => - array ( - ), - 'homes' => - array ( - ), - 'homesense' => - array ( - ), - 'honda' => - array ( - ), - 'honeywell' => - array ( - ), - 'horse' => - array ( - ), - 'hospital' => - array ( - ), - 'host' => - array ( - 'cloudaccess' => - array ( - ), - 'freesite' => - array ( - ), - ), - 'hosting' => - array ( - 'opencraft' => - array ( - ), - ), - 'hot' => - array ( - ), - 'hoteles' => - array ( - ), - 'hotels' => - array ( - ), - 'hotmail' => - array ( - ), - 'house' => - array ( - ), - 'how' => - array ( - ), - 'hsbc' => - array ( - ), - 'htc' => - array ( - ), - 'hughes' => - array ( - ), - 'hyatt' => - array ( - ), - 'hyundai' => - array ( - ), - 'ibm' => - array ( - ), - 'icbc' => - array ( - ), - 'ice' => - array ( - ), - 'icu' => - array ( - ), - 'ieee' => - array ( - ), - 'ifm' => - array ( - ), - 'ikano' => - array ( - ), - 'imamat' => - array ( - ), - 'imdb' => - array ( - ), - 'immo' => - array ( - ), - 'immobilien' => - array ( - ), - 'industries' => - array ( - ), - 'infiniti' => - array ( - ), - 'ing' => - array ( - ), - 'ink' => - array ( - ), - 'institute' => - array ( - ), - 'insurance' => - array ( - ), - 'insure' => - array ( - ), - 'intel' => - array ( - ), - 'international' => - array ( - ), - 'intuit' => - array ( - ), - 'investments' => - array ( - ), - 'ipiranga' => - array ( - ), - 'irish' => - array ( - ), - 'iselect' => - array ( - ), - 'ismaili' => - array ( - ), - 'ist' => - array ( - ), - 'istanbul' => - array ( - ), - 'itau' => - array ( - ), - 'itv' => - array ( - ), - 'iveco' => - array ( - ), - 'iwc' => - array ( - ), - 'jaguar' => - array ( - ), - 'java' => - array ( - ), - 'jcb' => - array ( - ), - 'jcp' => - array ( - ), - 'jeep' => - array ( - ), - 'jetzt' => - array ( - ), - 'jewelry' => - array ( - ), - 'jio' => - array ( - ), - 'jlc' => - array ( - ), - 'jll' => - array ( - ), - 'jmp' => - array ( - ), - 'jnj' => - array ( - ), - 'joburg' => - array ( - ), - 'jot' => - array ( - ), - 'joy' => - array ( - ), - 'jpmorgan' => - array ( - ), - 'jprs' => - array ( - ), - 'juegos' => - array ( - ), - 'juniper' => - array ( - ), - 'kaufen' => - array ( - ), - 'kddi' => - array ( - ), - 'kerryhotels' => - array ( - ), - 'kerrylogistics' => - array ( - ), - 'kerryproperties' => - array ( - ), - 'kfh' => - array ( - ), - 'kia' => - array ( - ), - 'kim' => - array ( - ), - 'kinder' => - array ( - ), - 'kindle' => - array ( - ), - 'kitchen' => - array ( - ), - 'kiwi' => - array ( - ), - 'koeln' => - array ( - ), - 'komatsu' => - array ( - ), - 'kosher' => - array ( - ), - 'kpmg' => - array ( - ), - 'kpn' => - array ( - ), - 'krd' => - array ( - 'co' => - array ( - ), - 'edu' => - array ( - ), - ), - 'kred' => - array ( - ), - 'kuokgroup' => - array ( - ), - 'kyoto' => - array ( - ), - 'lacaixa' => - array ( - ), - 'ladbrokes' => - array ( - ), - 'lamborghini' => - array ( - ), - 'lamer' => - array ( - ), - 'lancaster' => - array ( - ), - 'lancia' => - array ( - ), - 'lancome' => - array ( - ), - 'land' => - array ( - 'static' => - array ( - 'dev' => - array ( - ), - 'sites' => - array ( - ), - ), - ), - 'landrover' => - array ( - ), - 'lanxess' => - array ( - ), - 'lasalle' => - array ( - ), - 'lat' => - array ( - ), - 'latino' => - array ( - ), - 'latrobe' => - array ( - ), - 'law' => - array ( - ), - 'lawyer' => - array ( - ), - 'lds' => - array ( - ), - 'lease' => - array ( - ), - 'leclerc' => - array ( - ), - 'lefrak' => - array ( - ), - 'legal' => - array ( - ), - 'lego' => - array ( - ), - 'lexus' => - array ( - ), - 'lgbt' => - array ( - ), - 'liaison' => - array ( - ), - 'lidl' => - array ( - ), - 'life' => - array ( - ), - 'lifeinsurance' => - array ( - ), - 'lifestyle' => - array ( - ), - 'lighting' => - array ( - ), - 'like' => - array ( - ), - 'lilly' => - array ( - ), - 'limited' => - array ( - ), - 'limo' => - array ( - ), - 'lincoln' => - array ( - ), - 'linde' => - array ( - ), - 'link' => - array ( - 'cyon' => - array ( - ), - 'mypep' => - array ( - ), - ), - 'lipsy' => - array ( - ), - 'live' => - array ( - ), - 'living' => - array ( - ), - 'lixil' => - array ( - ), - 'loan' => - array ( - ), - 'loans' => - array ( - ), - 'locker' => - array ( - ), - 'locus' => - array ( - ), - 'loft' => - array ( - ), - 'lol' => - array ( - ), - 'london' => - array ( - ), - 'lotte' => - array ( - ), - 'lotto' => - array ( - ), - 'love' => - array ( - ), - 'lpl' => - array ( - ), - 'lplfinancial' => - array ( - ), - 'ltd' => - array ( - ), - 'ltda' => - array ( - ), - 'lundbeck' => - array ( - ), - 'lupin' => - array ( - ), - 'luxe' => - array ( - ), - 'luxury' => - array ( - ), - 'macys' => - array ( - ), - 'madrid' => - array ( - ), - 'maif' => - array ( - ), - 'maison' => - array ( - ), - 'makeup' => - array ( - ), - 'man' => - array ( - ), - 'management' => - array ( - 'router' => - array ( - ), - ), - 'mango' => - array ( - ), - 'map' => - array ( - ), - 'market' => - array ( - ), - 'marketing' => - array ( - ), - 'markets' => - array ( - ), - 'marriott' => - array ( - ), - 'marshalls' => - array ( - ), - 'maserati' => - array ( - ), - 'mattel' => - array ( - ), - 'mba' => - array ( - ), - 'mcd' => - array ( - ), - 'mcdonalds' => - array ( - ), - 'mckinsey' => - array ( - ), - 'med' => - array ( - ), - 'media' => - array ( - ), - 'meet' => - array ( - ), - 'melbourne' => - array ( - ), - 'meme' => - array ( - ), - 'memorial' => - array ( - ), - 'men' => - array ( - ), - 'menu' => - array ( - ), - 'meo' => - array ( - ), - 'merckmsd' => - array ( - ), - 'metlife' => - array ( - ), - 'miami' => - array ( - ), - 'microsoft' => - array ( - ), - 'mini' => - array ( - ), - 'mint' => - array ( - ), - 'mit' => - array ( - ), - 'mitsubishi' => - array ( - ), - 'mlb' => - array ( - ), - 'mls' => - array ( - ), - 'mma' => - array ( - ), - 'mobile' => - array ( - ), - 'mobily' => - array ( - ), - 'moda' => - array ( - ), - 'moe' => - array ( - ), - 'moi' => - array ( - ), - 'mom' => - array ( - ), - 'monash' => - array ( - ), - 'money' => - array ( - ), - 'monster' => - array ( - ), - 'montblanc' => - array ( - ), - 'mopar' => - array ( - ), - 'mormon' => - array ( - ), - 'mortgage' => - array ( - ), - 'moscow' => - array ( - ), - 'moto' => - array ( - ), - 'motorcycles' => - array ( - ), - 'mov' => - array ( - ), - 'movie' => - array ( - ), - 'movistar' => - array ( - ), - 'msd' => - array ( - ), - 'mtn' => - array ( - ), - 'mtpc' => - array ( - ), - 'mtr' => - array ( - ), - 'mutual' => - array ( - ), - 'nab' => - array ( - ), - 'nadex' => - array ( - ), - 'nagoya' => - array ( - ), - 'nationwide' => - array ( - ), - 'natura' => - array ( - ), - 'navy' => - array ( - ), - 'nba' => - array ( - ), - 'nec' => - array ( - ), - 'netbank' => - array ( - ), - 'netflix' => - array ( - ), - 'network' => - array ( - 'alces' => - array ( - '*' => - array ( - ), - ), - ), - 'neustar' => - array ( - ), - 'new' => - array ( - ), - 'newholland' => - array ( - ), - 'news' => - array ( - ), - 'next' => - array ( - ), - 'nextdirect' => - array ( - ), - 'nexus' => - array ( - ), - 'nfl' => - array ( - ), - 'ngo' => - array ( - ), - 'nhk' => - array ( - ), - 'nico' => - array ( - ), - 'nike' => - array ( - ), - 'nikon' => - array ( - ), - 'ninja' => - array ( - ), - 'nissan' => - array ( - ), - 'nissay' => - array ( - ), - 'nokia' => - array ( - ), - 'northwesternmutual' => - array ( - ), - 'norton' => - array ( - ), - 'now' => - array ( - ), - 'nowruz' => - array ( - ), - 'nowtv' => - array ( - ), - 'nra' => - array ( - ), - 'nrw' => - array ( - ), - 'ntt' => - array ( - ), - 'nyc' => - array ( - ), - 'obi' => - array ( - ), - 'observer' => - array ( - ), - 'off' => - array ( - ), - 'office' => - array ( - ), - 'okinawa' => - array ( - ), - 'olayan' => - array ( - ), - 'olayangroup' => - array ( - ), - 'oldnavy' => - array ( - ), - 'ollo' => - array ( - ), - 'omega' => - array ( - ), - 'one' => - array ( - 'homelink' => - array ( - ), - ), - 'ong' => - array ( - ), - 'onl' => - array ( - ), - 'online' => - array ( - 'barsy' => - array ( - ), - ), - 'onyourside' => - array ( - ), - 'ooo' => - array ( - ), - 'open' => - array ( - ), - 'oracle' => - array ( - ), - 'orange' => - array ( - ), - 'organic' => - array ( - ), - 'origins' => - array ( - ), - 'osaka' => - array ( - ), - 'otsuka' => - array ( - ), - 'ott' => - array ( - ), - 'ovh' => - array ( - 'nerdpol' => - array ( - ), - ), - 'page' => - array ( - ), - 'pamperedchef' => - array ( - ), - 'panasonic' => - array ( - ), - 'panerai' => - array ( - ), - 'paris' => - array ( - ), - 'pars' => - array ( - ), - 'partners' => - array ( - ), - 'parts' => - array ( - ), - 'party' => - array ( - 'ybo' => - array ( - ), - ), - 'passagens' => - array ( - ), - 'pay' => - array ( - ), - 'pccw' => - array ( - ), - 'pet' => - array ( - ), - 'pfizer' => - array ( - ), - 'pharmacy' => - array ( - ), - 'phd' => - array ( - ), - 'philips' => - array ( - ), - 'phone' => - array ( - ), - 'photo' => - array ( - ), - 'photography' => - array ( - ), - 'photos' => - array ( - ), - 'physio' => - array ( - ), - 'piaget' => - array ( - ), - 'pics' => - array ( - ), - 'pictet' => - array ( - ), - 'pictures' => - array ( - 1337 => - array ( - ), - ), - 'pid' => - array ( - ), - 'pin' => - array ( - ), - 'ping' => - array ( - ), - 'pink' => - array ( - ), - 'pioneer' => - array ( - ), - 'pizza' => - array ( - ), - 'place' => - array ( - ), - 'play' => - array ( - ), - 'playstation' => - array ( - ), - 'plumbing' => - array ( - ), - 'plus' => - array ( - ), - 'pnc' => - array ( - ), - 'pohl' => - array ( - ), - 'poker' => - array ( - ), - 'politie' => - array ( - ), - 'porn' => - array ( - ), - 'pramerica' => - array ( - ), - 'praxi' => - array ( - ), - 'press' => - array ( - ), - 'prime' => - array ( - ), - 'prod' => - array ( - ), - 'productions' => - array ( - ), - 'prof' => - array ( - ), - 'progressive' => - array ( - ), - 'promo' => - array ( - ), - 'properties' => - array ( - ), - 'property' => - array ( - ), - 'protection' => - array ( - ), - 'pru' => - array ( - ), - 'prudential' => - array ( - ), - 'pub' => - array ( - ), - 'pwc' => - array ( - ), - 'qpon' => - array ( - ), - 'quebec' => - array ( - ), - 'quest' => - array ( - ), - 'qvc' => - array ( - ), - 'racing' => - array ( - ), - 'radio' => - array ( - ), - 'raid' => - array ( - ), - 'read' => - array ( - ), - 'realestate' => - array ( - ), - 'realtor' => - array ( - ), - 'realty' => - array ( - ), - 'recipes' => - array ( - ), - 'red' => - array ( - ), - 'redstone' => - array ( - ), - 'redumbrella' => - array ( - ), - 'rehab' => - array ( - ), - 'reise' => - array ( - ), - 'reisen' => - array ( - ), - 'reit' => - array ( - ), - 'reliance' => - array ( - ), - 'ren' => - array ( - ), - 'rent' => - array ( - ), - 'rentals' => - array ( - ), - 'repair' => - array ( - ), - 'report' => - array ( - ), - 'republican' => - array ( - ), - 'rest' => - array ( - ), - 'restaurant' => - array ( - ), - 'review' => - array ( - 'ybo' => - array ( - ), - ), - 'reviews' => - array ( - ), - 'rexroth' => - array ( - ), - 'rich' => - array ( - ), - 'richardli' => - array ( - ), - 'ricoh' => - array ( - ), - 'rightathome' => - array ( - ), - 'ril' => - array ( - ), - 'rio' => - array ( - ), - 'rip' => - array ( - 'clan' => - array ( - ), - ), - 'rmit' => - array ( - ), - 'rocher' => - array ( - ), - 'rocks' => - array ( - 'myddns' => - array ( - ), - 'lima-city' => - array ( - ), - 'webspace' => - array ( - ), - ), - 'rodeo' => - array ( - ), - 'rogers' => - array ( - ), - 'room' => - array ( - ), - 'rsvp' => - array ( - ), - 'rugby' => - array ( - ), - 'ruhr' => - array ( - ), - 'run' => - array ( - ), - 'rwe' => - array ( - ), - 'ryukyu' => - array ( - ), - 'saarland' => - array ( - ), - 'safe' => - array ( - ), - 'safety' => - array ( - ), - 'sakura' => - array ( - ), - 'sale' => - array ( - ), - 'salon' => - array ( - ), - 'samsclub' => - array ( - ), - 'samsung' => - array ( - ), - 'sandvik' => - array ( - ), - 'sandvikcoromant' => - array ( - ), - 'sanofi' => - array ( - ), - 'sap' => - array ( - ), - 'sapo' => - array ( - ), - 'sarl' => - array ( - ), - 'sas' => - array ( - ), - 'save' => - array ( - ), - 'saxo' => - array ( - ), - 'sbi' => - array ( - ), - 'sbs' => - array ( - ), - 'sca' => - array ( - ), - 'scb' => - array ( - ), - 'schaeffler' => - array ( - ), - 'schmidt' => - array ( - ), - 'scholarships' => - array ( - ), - 'school' => - array ( - ), - 'schule' => - array ( - ), - 'schwarz' => - array ( - ), - 'science' => - array ( - 'ybo' => - array ( - ), - ), - 'scjohnson' => - array ( - ), - 'scor' => - array ( - ), - 'scot' => - array ( - ), - 'search' => - array ( - ), - 'seat' => - array ( - ), - 'secure' => - array ( - ), - 'security' => - array ( - ), - 'seek' => - array ( - ), - 'select' => - array ( - ), - 'sener' => - array ( - ), - 'services' => - array ( - ), - 'ses' => - array ( - ), - 'seven' => - array ( - ), - 'sew' => - array ( - ), - 'sex' => - array ( - ), - 'sexy' => - array ( - ), - 'sfr' => - array ( - ), - 'shangrila' => - array ( - ), - 'sharp' => - array ( - ), - 'shaw' => - array ( - ), - 'shell' => - array ( - ), - 'shia' => - array ( - ), - 'shiksha' => - array ( - ), - 'shoes' => - array ( - ), - 'shop' => - array ( - ), - 'shopping' => - array ( - ), - 'shouji' => - array ( - ), - 'show' => - array ( - ), - 'showtime' => - array ( - ), - 'shriram' => - array ( - ), - 'silk' => - array ( - ), - 'sina' => - array ( - ), - 'singles' => - array ( - ), - 'site' => - array ( - 'cyon' => - array ( - ), - 'platformsh' => - array ( - '*' => - array ( - ), - ), - 'byen' => - array ( - ), - ), - 'ski' => - array ( - ), - 'skin' => - array ( - ), - 'sky' => - array ( - ), - 'skype' => - array ( - ), - 'sling' => - array ( - ), - 'smart' => - array ( - ), - 'smile' => - array ( - ), - 'sncf' => - array ( - ), - 'soccer' => - array ( - ), - 'social' => - array ( - ), - 'softbank' => - array ( - ), - 'software' => - array ( - ), - 'sohu' => - array ( - ), - 'solar' => - array ( - ), - 'solutions' => - array ( - ), - 'song' => - array ( - ), - 'sony' => - array ( - ), - 'soy' => - array ( - ), - 'space' => - array ( - 'stackspace' => - array ( - ), - 'uber' => - array ( - ), - 'xs4all' => - array ( - ), - ), - 'spiegel' => - array ( - ), - 'spot' => - array ( - ), - 'spreadbetting' => - array ( - ), - 'srl' => - array ( - ), - 'srt' => - array ( - ), - 'stada' => - array ( - ), - 'staples' => - array ( - ), - 'star' => - array ( - ), - 'starhub' => - array ( - ), - 'statebank' => - array ( - ), - 'statefarm' => - array ( - ), - 'statoil' => - array ( - ), - 'stc' => - array ( - ), - 'stcgroup' => - array ( - ), - 'stockholm' => - array ( - ), - 'storage' => - array ( - ), - 'store' => - array ( - ), - 'stream' => - array ( - ), - 'studio' => - array ( - ), - 'study' => - array ( - ), - 'style' => - array ( - ), - 'sucks' => - array ( - ), - 'supplies' => - array ( - ), - 'supply' => - array ( - ), - 'support' => - array ( - 'barsy' => - array ( - ), - ), - 'surf' => - array ( - ), - 'surgery' => - array ( - ), - 'suzuki' => - array ( - ), - 'swatch' => - array ( - ), - 'swiftcover' => - array ( - ), - 'swiss' => - array ( - ), - 'sydney' => - array ( - ), - 'symantec' => - array ( - ), - 'systems' => - array ( - 'knightpoint' => - array ( - ), - ), - 'tab' => - array ( - ), - 'taipei' => - array ( - ), - 'talk' => - array ( - ), - 'taobao' => - array ( - ), - 'target' => - array ( - ), - 'tatamotors' => - array ( - ), - 'tatar' => - array ( - ), - 'tattoo' => - array ( - ), - 'tax' => - array ( - ), - 'taxi' => - array ( - ), - 'tci' => - array ( - ), - 'tdk' => - array ( - ), - 'team' => - array ( - ), - 'tech' => - array ( - ), - 'technology' => - array ( - ), - 'telecity' => - array ( - ), - 'telefonica' => - array ( - ), - 'temasek' => - array ( - ), - 'tennis' => - array ( - ), - 'teva' => - array ( - ), - 'thd' => - array ( - ), - 'theater' => - array ( - ), - 'theatre' => - array ( - ), - 'tiaa' => - array ( - ), - 'tickets' => - array ( - ), - 'tienda' => - array ( - ), - 'tiffany' => - array ( - ), - 'tips' => - array ( - ), - 'tires' => - array ( - ), - 'tirol' => - array ( - ), - 'tjmaxx' => - array ( - ), - 'tjx' => - array ( - ), - 'tkmaxx' => - array ( - ), - 'tmall' => - array ( - ), - 'today' => - array ( - ), - 'tokyo' => - array ( - ), - 'tools' => - array ( - ), - 'top' => - array ( - ), - 'toray' => - array ( - ), - 'toshiba' => - array ( - ), - 'total' => - array ( - ), - 'tours' => - array ( - ), - 'town' => - array ( - ), - 'toyota' => - array ( - ), - 'toys' => - array ( - ), - 'trade' => - array ( - 'ybo' => - array ( - ), - ), - 'trading' => - array ( - ), - 'training' => - array ( - ), - 'travelchannel' => - array ( - ), - 'travelers' => - array ( - ), - 'travelersinsurance' => - array ( - ), - 'trust' => - array ( - ), - 'trv' => - array ( - ), - 'tube' => - array ( - ), - 'tui' => - array ( - ), - 'tunes' => - array ( - ), - 'tushu' => - array ( - ), - 'tvs' => - array ( - ), - 'ubank' => - array ( - ), - 'ubs' => - array ( - ), - 'uconnect' => - array ( - ), - 'unicom' => - array ( - ), - 'university' => - array ( - ), - 'uno' => - array ( - ), - 'uol' => - array ( - ), - 'ups' => - array ( - ), - 'vacations' => - array ( - ), - 'vana' => - array ( - ), - 'vanguard' => - array ( - ), - 'vegas' => - array ( - ), - 'ventures' => - array ( - ), - 'verisign' => - array ( - ), - 'versicherung' => - array ( - ), - 'vet' => - array ( - ), - 'viajes' => - array ( - ), - 'video' => - array ( - ), - 'vig' => - array ( - ), - 'viking' => - array ( - ), - 'villas' => - array ( - ), - 'vin' => - array ( - ), - 'vip' => - array ( - ), - 'virgin' => - array ( - ), - 'visa' => - array ( - ), - 'vision' => - array ( - ), - 'vista' => - array ( - ), - 'vistaprint' => - array ( - ), - 'viva' => - array ( - ), - 'vivo' => - array ( - ), - 'vlaanderen' => - array ( - ), - 'vodka' => - array ( - ), - 'volkswagen' => - array ( - ), - 'volvo' => - array ( - ), - 'vote' => - array ( - ), - 'voting' => - array ( - ), - 'voto' => - array ( - ), - 'voyage' => - array ( - ), - 'vuelos' => - array ( - ), - 'wales' => - array ( - ), - 'walmart' => - array ( - ), - 'walter' => - array ( - ), - 'wang' => - array ( - ), - 'wanggou' => - array ( - ), - 'warman' => - array ( - ), - 'watch' => - array ( - ), - 'watches' => - array ( - ), - 'weather' => - array ( - ), - 'weatherchannel' => - array ( - ), - 'webcam' => - array ( - ), - 'weber' => - array ( - ), - 'website' => - array ( - ), - 'wed' => - array ( - ), - 'wedding' => - array ( - ), - 'weibo' => - array ( - ), - 'weir' => - array ( - ), - 'whoswho' => - array ( - ), - 'wien' => - array ( - ), - 'wiki' => - array ( - ), - 'williamhill' => - array ( - ), - 'win' => - array ( - ), - 'windows' => - array ( - ), - 'wine' => - array ( - ), - 'winners' => - array ( - ), - 'wme' => - array ( - ), - 'wolterskluwer' => - array ( - ), - 'woodside' => - array ( - ), - 'work' => - array ( - ), - 'works' => - array ( - ), - 'world' => - array ( - ), - 'wow' => - array ( - ), - 'wtc' => - array ( - ), - 'wtf' => - array ( - ), - 'xbox' => - array ( - ), - 'xerox' => - array ( - ), - 'xfinity' => - array ( - ), - 'xihuan' => - array ( - ), - 'xin' => - array ( - ), - 'xn--11b4c3d' => - array ( - ), - 'xn--1ck2e1b' => - array ( - ), - 'xn--1qqw23a' => - array ( - ), - 'xn--30rr7y' => - array ( - ), - 'xn--3bst00m' => - array ( - ), - 'xn--3ds443g' => - array ( - ), - 'xn--3oq18vl8pn36a' => - array ( - ), - 'xn--3pxu8k' => - array ( - ), - 'xn--42c2d9a' => - array ( - ), - 'xn--45q11c' => - array ( - ), - 'xn--4gbrim' => - array ( - ), - 'xn--55qw42g' => - array ( - ), - 'xn--55qx5d' => - array ( - ), - 'xn--5su34j936bgsg' => - array ( - ), - 'xn--5tzm5g' => - array ( - ), - 'xn--6frz82g' => - array ( - ), - 'xn--6qq986b3xl' => - array ( - ), - 'xn--80adxhks' => - array ( - ), - 'xn--80aqecdr1a' => - array ( - ), - 'xn--80asehdb' => - array ( - ), - 'xn--80aswg' => - array ( - ), - 'xn--8y0a063a' => - array ( - ), - 'xn--9dbq2a' => - array ( - ), - 'xn--9et52u' => - array ( - ), - 'xn--9krt00a' => - array ( - ), - 'xn--b4w605ferd' => - array ( - ), - 'xn--bck1b9a5dre4c' => - array ( - ), - 'xn--c1avg' => - array ( - ), - 'xn--c2br7g' => - array ( - ), - 'xn--cck2b3b' => - array ( - ), - 'xn--cg4bki' => - array ( - ), - 'xn--czr694b' => - array ( - ), - 'xn--czrs0t' => - array ( - ), - 'xn--czru2d' => - array ( - ), - 'xn--d1acj3b' => - array ( - ), - 'xn--eckvdtc9d' => - array ( - ), - 'xn--efvy88h' => - array ( - ), - 'xn--estv75g' => - array ( - ), - 'xn--fct429k' => - array ( - ), - 'xn--fhbei' => - array ( - ), - 'xn--fiq228c5hs' => - array ( - ), - 'xn--fiq64b' => - array ( - ), - 'xn--fjq720a' => - array ( - ), - 'xn--flw351e' => - array ( - ), - 'xn--fzys8d69uvgm' => - array ( - ), - 'xn--g2xx48c' => - array ( - ), - 'xn--gckr3f0f' => - array ( - ), - 'xn--gk3at1e' => - array ( - ), - 'xn--hxt814e' => - array ( - ), - 'xn--i1b6b1a6a2e' => - array ( - ), - 'xn--imr513n' => - array ( - ), - 'xn--io0a7i' => - array ( - ), - 'xn--j1aef' => - array ( - ), - 'xn--jlq61u9w7b' => - array ( - ), - 'xn--jvr189m' => - array ( - ), - 'xn--kcrx77d1x4a' => - array ( - ), - 'xn--kpu716f' => - array ( - ), - 'xn--kput3i' => - array ( - ), - 'xn--mgba3a3ejt' => - array ( - ), - 'xn--mgba7c0bbn0a' => - array ( - ), - 'xn--mgbaakc7dvf' => - array ( - ), - 'xn--mgbab2bd' => - array ( - ), - 'xn--mgbb9fbpob' => - array ( - ), - 'xn--mgbca7dzdo' => - array ( - ), - 'xn--mgbi4ecexp' => - array ( - ), - 'xn--mgbt3dhd' => - array ( - ), - 'xn--mk1bu44c' => - array ( - ), - 'xn--mxtq1m' => - array ( - ), - 'xn--ngbc5azd' => - array ( - ), - 'xn--ngbe9e0a' => - array ( - ), - 'xn--ngbrx' => - array ( - ), - 'xn--nqv7f' => - array ( - ), - 'xn--nqv7fs00ema' => - array ( - ), - 'xn--nyqy26a' => - array ( - ), - 'xn--p1acf' => - array ( - ), - 'xn--pbt977c' => - array ( - ), - 'xn--pssy2u' => - array ( - ), - 'xn--q9jyb4c' => - array ( - ), - 'xn--qcka1pmc' => - array ( - ), - 'xn--rhqv96g' => - array ( - ), - 'xn--rovu88b' => - array ( - ), - 'xn--ses554g' => - array ( - ), - 'xn--t60b56a' => - array ( - ), - 'xn--tckwe' => - array ( - ), - 'xn--tiq49xqyj' => - array ( - ), - 'xn--unup4y' => - array ( - ), - 'xn--vermgensberater-ctb' => - array ( - ), - 'xn--vermgensberatung-pwb' => - array ( - ), - 'xn--vhquv' => - array ( - ), - 'xn--vuq861b' => - array ( - ), - 'xn--w4r85el8fhu5dnra' => - array ( - ), - 'xn--w4rs40l' => - array ( - ), - 'xn--xhq521b' => - array ( - ), - 'xn--zfr164b' => - array ( - ), - 'xperia' => - array ( - ), - 'xyz' => - array ( - 'blogsite' => - array ( - ), - 'fhapp' => - array ( - ), - ), - 'yachts' => - array ( - ), - 'yahoo' => - array ( - ), - 'yamaxun' => - array ( - ), - 'yandex' => - array ( - ), - 'yodobashi' => - array ( - ), - 'yoga' => - array ( - ), - 'yokohama' => - array ( - ), - 'you' => - array ( - ), - 'youtube' => - array ( - ), - 'yun' => - array ( - ), - 'zappos' => - array ( - ), - 'zara' => - array ( - ), - 'zero' => - array ( - ), - 'zip' => - array ( - ), - 'zippo' => - array ( - ), - 'zone' => - array ( - 'triton' => - array ( - '*' => - array ( - ), - ), - 'lima' => - array ( - ), - ), - 'zuerich' => - array ( - ), -); \ No newline at end of file diff --git a/src/Cache/FileCache.php b/src/Cache/FileCacheAdapter.php similarity index 72% rename from src/Cache/FileCache.php rename to src/Cache/FileCacheAdapter.php index 46cbae74..be54713f 100644 --- a/src/Cache/FileCache.php +++ b/src/Cache/FileCacheAdapter.php @@ -20,14 +20,13 @@ use Traversable; /** - * This is a simple, file-based cache implementation, which is bootstrapped by - * the Core Provider as a default. + * A simple file-based PSR-16 cache implementation. * - * Bootstrapping a more powerful cache for production scenarios is highly recommended. + * This class is heavily based on the code found in * - * @see https://github.com/matthiasmullie/scrapbook/ + * @see https://github.com/kodus/file-cache/blob/master/src/FileCache.php */ -final class FileCache implements CacheInterface +final class FileCacheAdapter implements CacheInterface { /** * @var string control characters for keys, reserved by PSR-16 @@ -42,7 +41,7 @@ final class FileCache implements CacheInterface /** * @var int */ - private $default_ttl; + private $default_ttl = 86400; /** * @var int @@ -55,23 +54,18 @@ final class FileCache implements CacheInterface private $file_mode = 0664; /** - * @param string $cache_path absolute root path of cache-file folder - * @param int $default_ttl default time-to-live (in seconds) - * @param int $dir_mode permission mode for created dirs - * @param int $file_mode permission mode for created files + * @param string $cache_path absolute root path of cache-file folder */ - public function __construct(string $cache_path, int $default_ttl = 86400) + public function __construct(string $cache_path = '') { - $this->default_ttl = $default_ttl; + if ($cache_path === '') { + $cache_path = realpath(dirname(__DIR__, 2) . DIRECTORY_SEPARATOR . 'data'); + } + if (!file_exists($cache_path) && file_exists(dirname($cache_path))) { $this->mkdir($cache_path); // ensure that the parent path exists } - /*$path = realpath($cache_path); - if ($path === false) { - throw new InvalidArgumentException(sprintf('cache path does not exist: %s', $cache_path)); - }*/ - if (!is_writable($cache_path . DIRECTORY_SEPARATOR)) { throw new InvalidArgumentException(sprintf('cache path is not writable: %s', $cache_path)); } @@ -85,21 +79,18 @@ public function __construct(string $cache_path, int $default_ttl = 86400) public function get($key, $default = null) { $path = $this->getPath($key); - $expires_at = @filemtime($path); - if ($expires_at === false) { return $default; // file not found } - if ($this->getTime() >= $expires_at) { + if (time() >= $expires_at) { @unlink($path); // file expired return $default; } $data = @file_get_contents($path); - if ($data === false) { return $default; // race condition: file not found } @@ -109,7 +100,6 @@ public function get($key, $default = null) } $value = @unserialize($data); - if ($value === false) { return $default; // unserialize() failed } @@ -122,8 +112,8 @@ public function get($key, $default = null) */ public function set($key, $value, $ttl = null) { + $expires_at = $this->getExpireAt($ttl); $path = $this->getPath($key); - $dir = dirname($path); if (!file_exists($dir)) { @@ -132,17 +122,6 @@ public function set($key, $value, $ttl = null) } $temp_path = $this->cache_path . DIRECTORY_SEPARATOR . uniqid('', true); - - if (is_int($ttl)) { - $expires_at = $this->getTime() + $ttl; - } elseif ($ttl instanceof DateInterval) { - $expires_at = date_create_from_format('U', $this->getTime())->add($ttl)->getTimestamp(); - } elseif ($ttl === null) { - $expires_at = $this->getTime() + $this->default_ttl; - } else { - throw new InvalidArgumentException('invalid TTL: ' . print_r($ttl, true)); - } - if (false === @file_put_contents($temp_path, serialize($value))) { return false; } @@ -160,6 +139,30 @@ public function set($key, $value, $ttl = null) return false; } + /** + * Returns the expiration time expressed in the number of seconds since the Unix Epoch. + * + * @param mixed $ttl + * + * @return int + */ + private function getExpireAt($ttl): int + { + if (is_int($ttl)) { + return time() + $ttl; + } + + if ($ttl instanceof DateInterval) { + return date_create_immutable('@' . time())->add($ttl)->getTimestamp(); + } + + if ($ttl === null) { + return time() + $this->default_ttl; + } + + throw new InvalidArgumentException(sprintf('Expected TTL to be an int, a DateInterval or null; received "%s"', is_object($ttl) ? get_class($ttl) : gettype($ttl))); + } + /** * {@inheritdoc} */ @@ -176,7 +179,6 @@ public function clear() $success = true; $paths = $this->listPaths(); - foreach ($paths as $path) { if (!unlink($path)) { $success = false; @@ -196,7 +198,6 @@ public function getMultiple($keys, $default = null) } $values = []; - foreach ($keys as $key) { $values[$key] = $this->get($key) ?: $default; } @@ -246,42 +247,6 @@ public function has($key) return $this->get($key, $this) !== $this; } - /** - * {@inheritdoc} - */ - public function increment($key, $step = 1) - { - $path = $this->getPath($key); - - $dir = dirname($path); - - if (!file_exists($dir)) { - $this->mkdir($dir); // ensure that the parent path exists - } - - $lock_path = $dir . DIRECTORY_SEPARATOR . '.lock'; // allows max. 256 client locks at one time - - $lock_handle = fopen($lock_path, 'w'); - - flock($lock_handle, LOCK_EX); - - $value = $this->get($key, 0) + $step; - - $ok = $this->set($key, $value); - - flock($lock_handle, LOCK_UN); - - return $ok ? $value : false; - } - - /** - * {@inheritdoc} - */ - public function decrement($key, $step = 1) - { - return $this->increment($key, -$step); - } - /** * For a given cache key, obtain the absolute file path. * @@ -306,14 +271,6 @@ private function getPath($key) . substr($hash, 2); } - /** - * @return int current timestamp - */ - private function getTime() - { - return time(); - } - /** * @return Generator|string[] */ @@ -327,11 +284,9 @@ private function listPaths() $iterator = new RecursiveIteratorIterator($iterator); foreach ($iterator as $path) { - if (is_dir($path)) { - continue; // ignore directories + if (!is_dir($path)) { + yield $path; } - - yield $path; } } @@ -342,8 +297,12 @@ private function listPaths() */ private function validateKey($key) { + if (!is_string($key)) { + throw new InvalidArgumentException(sprintf('Expected key to be a string; received "%s"', is_object($key) ? get_class($key) : gettype($key))); + } + if (preg_match(self::PSR16_RESERVED, $key, $match) === 1) { - throw new InvalidArgumentException("invalid character in key: {$match[0]}"); + throw new InvalidArgumentException(sprintf('invalid character in key: %s', $match[0])); } } diff --git a/src/PublicSuffixListManager.php b/src/PublicSuffixListManager.php index 7d2975aa..b80b920c 100644 --- a/src/PublicSuffixListManager.php +++ b/src/PublicSuffixListManager.php @@ -11,10 +11,9 @@ namespace Pdp; -use Pdp\Cache\FileCache; use Pdp\Http\HttpAdapter; use Psr\SimpleCache\CacheInterface; -use SplFileObject; +use RuntimeException; use SplTempFileObject; /** @@ -26,16 +25,20 @@ class PublicSuffixListManager { const PUBLIC_SUFFIX_LIST_URL = 'https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat'; - const PUBLIC_SUFFIX_LIST_DATA = 'RAW'; const ALL_DOMAINS = 'ALL'; const ICANN_DOMAINS = 'ICANN'; const PRIVATE_DOMAINS = 'PRIVATE'; + /** + * @var string Public Suffix List Source URL + */ + private $sourceUrl; + /** * @var string Directory where text and php versions of list will be cached */ - private $cache; + private $cacheAdapter; /** * @var HttpAdapter Http adapter @@ -45,13 +48,18 @@ class PublicSuffixListManager /** * Public constructor. * - * @param HttpAdapter $httpAdapter - * @param CacheInterface|null $cache + * @param CacheInterface $cacheAdapter + * @param HttpAdapter $httpAdapter + * @param string $sourceUrl */ - public function __construct(HttpAdapter $httpAdapter, CacheInterface $cache = null) - { + public function __construct( + CacheInterface $cacheAdapter, + HttpAdapter $httpAdapter, + string $sourceUrl = self::PUBLIC_SUFFIX_LIST_URL + ) { + $this->cacheAdapter = $cacheAdapter; $this->httpAdapter = $httpAdapter; - $this->cache = $cache ?? new FileCache(realpath(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'data')); + $this->sourceUrl = $sourceUrl; } /** @@ -59,48 +67,63 @@ public function __construct(HttpAdapter $httpAdapter, CacheInterface $cache = nu * * @param string $type the Public Suffix List type * + * @throws RuntimeException if no PublicSuffixList can be returned + * * @return PublicSuffixList */ public function getList($type = self::ALL_DOMAINS): PublicSuffixList { - static $psl_type_lists = [self::ALL_DOMAINS => 1, self::ICANN_DOMAINS => 1, self::PRIVATE_DOMAINS => 1]; + static $type_lists = [self::ALL_DOMAINS => 1, self::ICANN_DOMAINS => 1, self::PRIVATE_DOMAINS => 1]; - if (!isset($psl_type_lists[$type])) { + if (!isset($type_lists[$type])) { $type = self::ALL_DOMAINS; } - if ($this->cache->has($type)) { - return new PublicSuffixList($this->cache->get($type)); + if (($list = $this->cacheAdapter->get($type)) !== null) { + return new PublicSuffixList($list); + } + + if (($raw = $this->cacheAdapter->get(self::PUBLIC_SUFFIX_LIST_DATA)) !== null + && $this->cachePublicSuffixListTypes($raw)) { + return new PublicSuffixList($this->cacheAdapter->get($type)); } - if ($this->cache->has(self::PUBLIC_SUFFIX_LIST_DATA)) { - $this->cachePublicSuffixListTypes(); - return new PublicSuffixList($this->cache->get($type)); + if ($this->refreshPublicSuffixList()) { + return new PublicSuffixList($this->cacheAdapter->get($type)); } - $this->refreshPublicSuffixList(); - return new PublicSuffixList($this->cache->get($type)); + //this should not happen but in rare cases you should be able to cach this one + throw new RuntimeException(sprintf('Unable to return `%s` Public Suffix List', $type)); } /** * Downloads Public Suffix List and writes text cache and PHP cache. If these files * already exist, they will be overwritten. + * + * Returns true if all list are correctly refreshed + * + * @return bool */ - public function refreshPublicSuffixList() + public function refreshPublicSuffixList(): bool { - $raw = $this->httpAdapter->getContent(self::PUBLIC_SUFFIX_LIST_URL); - $this->cache->set(self::PUBLIC_SUFFIX_LIST_DATA, $raw); + $publicSuffixList = $this->httpAdapter->getContent($this->sourceUrl); - $this->cachePublicSuffixListTypes(); + return $this->cacheAdapter->set(self::PUBLIC_SUFFIX_LIST_DATA, $publicSuffixList) + && $this->cachePublicSuffixListTypes($publicSuffixList); } /** - * Cache the different public suffix list subtypes + * Cache the different public suffix list subtypes. + * + * Returns true if all the public suffix list are correctly refreshed + * + * @return bool */ - private function cachePublicSuffixListTypes() + private function cachePublicSuffixListTypes(string $publicSuffixList): bool { - $publicSuffixListArray = $this->convertListToArray(); - $this->cache->setMultiple($publicSuffixListArray); + $publicSuffixListTypes = $this->convertListToArray($publicSuffixList); + + return $this->cacheAdapter->setMultiple($publicSuffixListTypes); } /** @@ -109,32 +132,31 @@ private function cachePublicSuffixListTypes() * @return array Associative, multidimensional array representation of the * public suffx list */ - private function convertListToArray(): array + private function convertListToArray(string $publicSuffixList): array { $addDomain = [ self::ICANN_DOMAINS => false, self::PRIVATE_DOMAINS => false, ]; - $publicSuffixListArray = [ + $publicSuffixListTypes = [ self::ALL_DOMAINS => [], self::ICANN_DOMAINS => [], self::PRIVATE_DOMAINS => [], ]; - $raw = $this->cache->get(self::PUBLIC_SUFFIX_LIST_DATA); $data = new SplTempFileObject(); - $data->fwrite($raw); - $data->setFlags(SplFileObject::DROP_NEW_LINE | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY); + $data->fwrite($publicSuffixList); + $data->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); foreach ($data as $line) { $addDomain = $this->validateDomainAddition($line, $addDomain); if (strstr($line, '//') !== false) { continue; } - $publicSuffixListArray = $this->convertLineToArray($line, $publicSuffixListArray, $addDomain); + $publicSuffixListTypes = $this->convertLineToArray($line, $publicSuffixListTypes, $addDomain); } - return $publicSuffixListArray; + return $publicSuffixListTypes; } /** @@ -180,23 +202,23 @@ private function isValidSection(bool $previousStatus, string $line, string $sect * Convert a line from the Public Suffix list. * * @param string $textLine Public Suffix List text line - * @param array $publicSuffixListArray Associative, multidimensional array representation of the + * @param array $publicSuffixListTypes Associative, multidimensional array representation of the * public suffx list * @param array $addDomain Tell which section should be converted * * @return array Associative, multidimensional array representation of the * public suffx list */ - private function convertLineToArray(string $textLine, array $publicSuffixListArray, array $addDomain): array + private function convertLineToArray(string $textLine, array $publicSuffixListTypes, array $addDomain): array { $ruleParts = explode('.', $textLine); - $this->buildArray($publicSuffixListArray[self::ALL_DOMAINS], $ruleParts); + $this->buildArray($publicSuffixListTypes[self::ALL_DOMAINS], $ruleParts); $domainNames = array_keys(array_filter($addDomain)); foreach ($domainNames as $domainName) { - $this->buildArray($publicSuffixListArray[$domainName], $ruleParts); + $this->buildArray($publicSuffixListTypes[$domainName], $ruleParts); } - return $publicSuffixListArray; + return $publicSuffixListTypes; } /** diff --git a/tests/Cache/FileCacheAdapterTest.php b/tests/Cache/FileCacheAdapterTest.php new file mode 100644 index 00000000..9aaf5c23 --- /dev/null +++ b/tests/Cache/FileCacheAdapterTest.php @@ -0,0 +1,474 @@ +root = vfsStream::setup('pdp'); + vfsStream::create(['cache' => []], $this->root); + $this->cacheDir = vfsStream::url('pdp/cache'); + $this->cache = new FileCacheAdapter($this->cacheDir); + } + + public function tearDown() + { + $this->cache = null; + $this->cacheDir = null; + $this->root = null; + } + + /** + * @dataProvider storableValuesProvider + * + * @param mixed $expected + * @param string $key + */ + public function testSetGet($expected) + { + $this->cache->set('foo', $expected); + $this->assertEquals($expected, $this->cache->get('foo')); + } + + public function storableValuesProvider() + { + return [ + 'string' => ['bar'], + 'boolean' => [false], + 'array' => [['foo', 'bar']], + 'class' => [date_create()], + 'null' => [null], + 'float' => [1.1], + ]; + } + + /** + * @depends testSetGet + */ + public function testDelete() + { + $this->cache->set('foo', 'bar'); + $this->assertEquals('bar', $this->cache->get('foo')); + $this->cache->delete('foo'); + $this->assertNull($this->cache->get('foo')); + } + + public function testGetInvalidArg() + { + $this->expectException(InvalidArgumentException::class); + $this->cache->get(null); + } + + public function testInvalidKey() + { + $this->expectException(InvalidArgumentException::class); + $this->cache->get('foo:bar', 'bar'); + } + + public function testSetInvalidTTL() + { + $this->expectException(InvalidArgumentException::class); + $this->cache->set('foo', 'bar', date_create()); + } + + /** + * @depends testDelete + */ + public function testGetNotFound() + { + $this->assertNull($this->cache->get('notfound')); + } + + /** + * @depends testDelete + */ + public function testGetNotFoundDefault() + { + $default = 'chickpeas'; + $this->assertEquals( + $default, + $this->cache->get('notfound', $default) + ); + } + + /** + * @depends testSetGet + * @slow + */ + public function testSetExpire() + { + $this->cache->set('foo', 'bar', 1); + $this->assertEquals('bar', $this->cache->get('foo')); + + // Wait 2 seconds so the cache expires + usleep(2000000); + $this->assertNull($this->cache->get('foo')); + } + + /** + * @depends testSetGet + * @slow + */ + public function testSetExpireDateInterval() + { + $this->cache->set('foo', 'bar', new DateInterval('PT1S')); + $this->assertEquals('bar', $this->cache->get('foo')); + + // Wait 2 seconds so the cache expires + usleep(2000000); + $this->assertNull($this->cache->get('foo')); + } + + public function testSetInvalidArg() + { + $this->expectException(InvalidArgumentException::class); + $this->cache->set(null, 'bar'); + } + + public function testDeleteInvalidArg() + { + $this->expectException(InvalidArgumentException::class); + $this->cache->delete(null); + } + + /** + * @depends testSetGet + */ + public function testClearCache() + { + $this->cache->set('foo', 'bar'); + $this->cache->clear(); + $this->assertNull($this->cache->get('foo')); + } + + /** + * @depends testSetGet + */ + public function testHas() + { + $this->cache->set('foo', 'bar'); + $this->assertTrue($this->cache->has('foo')); + } + + /** + * @depends testHas + */ + public function testHasNot() + { + $this->assertFalse($this->cache->has('not-found')); + } + + public function testHasInvalidArg() + { + $this->expectException(InvalidArgumentException::class); + $this->cache->has(null); + } + + /** + * @depends testSetGet + */ + public function testSetGetMultiple() + { + $values = [ + 'key1' => 'value1', + 'key2' => 'value2', + 'key3' => 'value3', + ]; + + $this->cache->setMultiple($values); + $result = $this->cache->getMultiple(array_keys($values)); + foreach ($result as $key => $value) { + $this->assertTrue(isset($values[$key])); + $this->assertEquals($values[$key], $value); + unset($values[$key]); + } + + // The list of values should now be empty + $this->assertEquals([], $values); + } + + /** + * @depends testSetGet + */ + public function testSetGetMultipleGenerator() + { + $values = [ + 'key1' => 'value1', + 'key2' => 'value2', + 'key3' => 'value3', + ]; + + $gen = function () use ($values) { + foreach ($values as $key => $value) { + yield $key => $value; + } + }; + + $this->cache->setMultiple($gen()); + + $result = $this->cache->getMultiple(array_keys($values)); + foreach ($result as $key => $value) { + $this->assertTrue(isset($values[$key])); + $this->assertEquals($values[$key], $value); + unset($values[$key]); + } + + // The list of values should now be empty + $this->assertEquals([], $values); + } + + /** + * @depends testSetGet + */ + public function testSetGetMultipleGenerator2() + { + $values = [ + 'key1' => 'value1', + 'key2' => 'value2', + 'key3' => 'value3', + ]; + + $gen = function () use ($values) { + foreach ($values as $key => $value) { + yield $key; + } + }; + + $this->cache->setMultiple($values); + $result = $this->cache->getMultiple($gen()); + foreach ($result as $key => $value) { + $this->assertTrue(isset($values[$key])); + $this->assertEquals($values[$key], $value); + unset($values[$key]); + } + + // The list of values should now be empty + $this->assertEquals([], $values); + } + + /** + * @depends testSetGetMultiple + * @depends testSetExpire + * @slow + */ + public function testSetMultipleExpireDateIntervalNotExpired() + { + $values = [ + 'key1' => 'value1', + 'key2' => 'value2', + 'key3' => 'value3', + ]; + + $this->cache->setMultiple($values, new DateInterval('PT5S')); + $result = $this->cache->getMultiple(array_keys($values)); + $count = 0; + foreach ($result as $key => $value) { + $count++; + $this->assertTrue(isset($values[$key])); + $this->assertEquals($values[$key], $value); + unset($values[$key]); + } + $this->assertEquals(3, $count); + // The list of values should now be empty + $this->assertEquals([], $values); + } + + /** + * @slow + */ + public function testSetMultipleExpireDateIntervalExpired() + { + $values = [ + 'key1' => 'value1', + 'key2' => 'value2', + 'key3' => 'value3', + ]; + + $this->cache->setMultiple($values, new \DateInterval('PT1S')); + + // Wait 2 seconds so the cache expires + sleep(2); + + $result = $this->cache->getMultiple(array_keys($values), 'not-found'); + $count = 0; + + $expected = [ + 'key1' => 'not-found', + 'key2' => 'not-found', + 'key3' => 'not-found', + ]; + + foreach ($result as $key => $value) { + $count++; + $this->assertTrue(isset($expected[$key])); + $this->assertEquals($expected[$key], $value); + unset($expected[$key]); + } + $this->assertEquals(3, $count); + + // The list of values should now be empty + $this->assertEquals([], $expected); + } + + /** + * @slow + */ + public function testSetMultipleExpireDateIntervalInt() + { + $values = [ + 'key1' => 'value1', + 'key2' => 'value2', + 'key3' => 'value3', + ]; + + $this->cache->setMultiple($values, 1); + + // Wait 2 seconds so the cache expires + sleep(2); + + $result = $this->cache->getMultiple(array_keys($values), 'not-found'); + $count = 0; + + $expected = [ + 'key1' => 'not-found', + 'key2' => 'not-found', + 'key3' => 'not-found', + ]; + + foreach ($result as $key => $value) { + $count++; + $this->assertTrue(isset($expected[$key])); + $this->assertEquals($expected[$key], $value); + unset($expected[$key]); + } + $this->assertEquals(3, $count); + + // The list of values should now be empty + $this->assertEquals([], $expected); + } + + public function testSetMultipleInvalidArg() + { + $this->expectException(InvalidArgumentException::class); + $this->cache->setMultiple(null); + } + + public function testGetMultipleInvalidArg() + { + $this->expectException(InvalidArgumentException::class); + $result = $this->cache->getMultiple(null); + // If $result was a generator, the generator will only error once the + // first value is requested. + // + // This extra line is just a precaution for that + if ($result instanceof Traversable) { + $result->current(); + } + } + + /** + * @depends testSetGetMultiple + */ + public function testDeleteMultipleDefaultGet() + { + $values = [ + 'key1' => 'value1', + 'key2' => 'value2', + 'key3' => 'value3', + ]; + + $this->cache->setMultiple($values); + + $this->cache->deleteMultiple(['key1', 'key3']); + + $result = $this->cache->getMultiple(array_keys($values), 'tea'); + + $expected = [ + 'key1' => 'tea', + 'key2' => 'value2', + 'key3' => 'tea', + ]; + + foreach ($result as $key => $value) { + $this->assertTrue(isset($expected[$key])); + $this->assertEquals($expected[$key], $value); + unset($expected[$key]); + } + + // The list of values should now be empty + $this->assertEquals([], $expected); + } + + /** + * @depends testSetGetMultiple + */ + public function testDeleteMultipleGenerator() + { + $values = [ + 'key1' => 'value1', + 'key2' => 'value2', + 'key3' => 'value3', + ]; + + $this->cache->setMultiple($values); + + $gen = function () { + yield 'key1'; + yield 'key3'; + }; + + $this->cache->deleteMultiple($gen()); + + $result = $this->cache->getMultiple(array_keys($values), 'tea'); + + $expected = [ + 'key1' => 'tea', + 'key2' => 'value2', + 'key3' => 'tea', + ]; + + foreach ($result as $key => $value) { + $this->assertTrue(isset($expected[$key])); + $this->assertEquals($expected[$key], $value); + unset($expected[$key]); + } + + // The list of values should now be empty + $this->assertEquals([], $expected); + } + + /** + * @expectException \Psr\SimpleCache\InvalidArgumentException + */ + public function testDeleteMultipleInvalidArg() + { + $this->expectException(InvalidArgumentException::class); + $this->cache->deleteMultiple(null); + } +} diff --git a/tests/CheckPublicSuffixTest.php b/tests/CheckPublicSuffixTest.php index b31e66b3..cc91ef30 100644 --- a/tests/CheckPublicSuffixTest.php +++ b/tests/CheckPublicSuffixTest.php @@ -2,7 +2,7 @@ namespace Pdp\Tests; -use Pdp\Cache\FileCache; +use Pdp\Cache\FileCacheAdapter; use Pdp\PublicSuffixList; use Pdp\PublicSuffixListManager; use PHPUnit\Framework\TestCase; @@ -23,7 +23,7 @@ class CheckPublicSuffixTest extends TestCase protected function setUp() { - $cache = new FileCache(dirname(__DIR__) . '/data'); + $cache = new FileCacheAdapter(); $rules = $cache->get(PublicSuffixListManager::ALL_DOMAINS); $this->list = new PublicSuffixList($rules); } diff --git a/tests/HttpAdapter/CurlHttpAdapterTest.php b/tests/Http/CurlHttpAdapterTest.php similarity index 95% rename from tests/HttpAdapter/CurlHttpAdapterTest.php rename to tests/Http/CurlHttpAdapterTest.php index 7b400688..3164d458 100644 --- a/tests/HttpAdapter/CurlHttpAdapterTest.php +++ b/tests/Http/CurlHttpAdapterTest.php @@ -1,6 +1,6 @@ dataDir = dirname(__DIR__) . '/data'; - $this->root = vfsStream::setup('pdp'); - vfsStream::create(['cache' => []], $this->root); - $this->cacheDir = vfsStream::url('pdp/cache'); - $this->httpAdapter = $this->getMock(HttpAdapter::class); - $this->listManager = new PublicSuffixListManager($this->httpAdapter, new FileCache($this->cacheDir)); + $this->cachePool = new FileCacheAdapter('/tmp/test-my-cache'); + + $this->manager = new PublicSuffixListManager( + $this->cachePool, + new CurlHttpAdapter(), + 'https://publicsuffix.org/list/public_suffix_list.dat' + ); } protected function tearDown() { - $this->cacheDir = null; - $this->root = null; - $this->httpAdapter = null; - $this->listManager = null; + $this->manager = null; + $this->cachePool = null; } public function testGetProvidedListFromDefaultCacheDir() { - // By not providing cache I'm forcing use of default cache dir - $listManager = new PublicSuffixListManager($this->httpAdapter); - $publicSuffixList = $listManager->getList(); + $publicSuffixList = $this->manager->getList(); $this->assertGreaterThanOrEqual(300, count($publicSuffixList->getRules())); } - private function getMock(string $class) - { - return $this->getMockBuilder($class) - ->disableOriginalConstructor() - ->getMock(); - } - public function testGetDifferentPublicList() { - $listManager = new PublicSuffixListManager($this->httpAdapter); - $publicList = $listManager->getList(); - $invalidList = $listManager->getList('invalid type'); + $publicList = $this->manager->getList(); + $invalidList = $this->manager->getList('invalid type'); $this->assertEquals($publicList, $invalidList); } public function testRefreshList() { - $listManager = new PublicSuffixListManager($this->httpAdapter); - $previous = $listManager->getList(); - $listManager->refreshPublicSuffixList(); - $this->assertEquals($previous, $listManager->getList()); + $previous = $this->manager->getList(); + $this->assertTrue($this->manager->refreshPublicSuffixList()); + $this->assertEquals($previous, $this->manager->getList()); + } + + public function testGetListRebuildListFromLocalCache() + { + $previous = $this->manager->getList(PublicSuffixListManager::ICANN_DOMAINS); + $this->cachePool->delete(PublicSuffixListManager::ICANN_DOMAINS); //delete local copy of ICAN DOMAINS RULES + $list = $this->manager->getList(PublicSuffixListManager::ICANN_DOMAINS); + $this->assertEquals($previous, $this->manager->getList(PublicSuffixListManager::ICANN_DOMAINS)); + } + + public function testGetListRebuildListFromRemoveSource() + { + $previous = $this->manager->getList(PublicSuffixListManager::ICANN_DOMAINS); + $this->cachePool->clear(); //delete all local cache + $list = $this->manager->getList(PublicSuffixListManager::ICANN_DOMAINS); + $this->assertEquals($previous, $this->manager->getList(PublicSuffixListManager::ICANN_DOMAINS)); } } diff --git a/tests/PublicSuffixListTest.php b/tests/PublicSuffixListTest.php index 89d1bab2..6fd49b8f 100644 --- a/tests/PublicSuffixListTest.php +++ b/tests/PublicSuffixListTest.php @@ -12,7 +12,7 @@ */ namespace Pdp\Tests; -use Pdp\Cache\FileCache; +use Pdp\Cache\FileCacheAdapter; use Pdp\MatchedDomain; use Pdp\NullDomain; use Pdp\PublicSuffixList; @@ -29,11 +29,16 @@ class PublicSuffixListTest extends TestCase protected function setUp() { - $cache = new FileCache(dirname(__DIR__) . '/data'); + $cache = new FileCacheAdapter(); $rules = $cache->get(PublicSuffixListManager::ALL_DOMAINS); $this->list = new PublicSuffixList($rules); } + public function testGetRules() + { + $this->assertInternalType('array', $this->list->getRules()); + } + public function testNullWillReturnNullDomain() { $domain = $this->list->query('COM'); From 0a75cffcf9d3f98ff44877fd7cd86bce6c8c74cb Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 6 Oct 2017 13:45:56 +0200 Subject: [PATCH 037/461] improve test suite --- src/PublicSuffixListManager.php | 2 +- tests/Cache/FileCacheAdapterTest.php | 6 +++--- tests/CheckPublicSuffixTest.php | 8 ++++---- tests/PublicSuffixListManagerTest.php | 17 ++++++++++++----- tests/PublicSuffixListTest.php | 2 +- 5 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/PublicSuffixListManager.php b/src/PublicSuffixListManager.php index b80b920c..1a2a33b0 100644 --- a/src/PublicSuffixListManager.php +++ b/src/PublicSuffixListManager.php @@ -36,7 +36,7 @@ class PublicSuffixListManager private $sourceUrl; /** - * @var string Directory where text and php versions of list will be cached + * @var CacheInterface PSR-16 cache adapter */ private $cacheAdapter; diff --git a/tests/Cache/FileCacheAdapterTest.php b/tests/Cache/FileCacheAdapterTest.php index 9aaf5c23..99bd6b38 100644 --- a/tests/Cache/FileCacheAdapterTest.php +++ b/tests/Cache/FileCacheAdapterTest.php @@ -23,11 +23,11 @@ */ class FileCacheAdapterTest extends TestCase { - private $cache; + protected $cache; - private $root; + protected $root; - private $cacheDir; + protected $cacheDir; public function setUp() { diff --git a/tests/CheckPublicSuffixTest.php b/tests/CheckPublicSuffixTest.php index cc91ef30..6b9f37a7 100644 --- a/tests/CheckPublicSuffixTest.php +++ b/tests/CheckPublicSuffixTest.php @@ -3,6 +3,7 @@ namespace Pdp\Tests; use Pdp\Cache\FileCacheAdapter; +use Pdp\Http\CurlHttpAdapter; use Pdp\PublicSuffixList; use Pdp\PublicSuffixListManager; use PHPUnit\Framework\TestCase; @@ -21,11 +22,10 @@ class CheckPublicSuffixTest extends TestCase */ private $list; - protected function setUp() + public function setUp() { - $cache = new FileCacheAdapter(); - $rules = $cache->get(PublicSuffixListManager::ALL_DOMAINS); - $this->list = new PublicSuffixList($rules); + $manager = new PublicSuffixListManager(new FileCacheAdapter(), new CurlHttpAdapter()); + $this->list = $manager->getList(); } /** diff --git a/tests/PublicSuffixListManagerTest.php b/tests/PublicSuffixListManagerTest.php index 42d9b259..0a96a3c5 100644 --- a/tests/PublicSuffixListManagerTest.php +++ b/tests/PublicSuffixListManagerTest.php @@ -4,6 +4,7 @@ namespace Pdp\Tests; +use org\bovigo\vfs\vfsStream; use Pdp\Cache\FileCacheAdapter; use Pdp\Http\CurlHttpAdapter; use Pdp\PublicSuffixListManager; @@ -15,13 +16,17 @@ class PublicSuffixListManagerTest extends TestCase * @var PublicSuffixListManager List manager */ protected $manager; - + protected $cache; + protected $root; + protected $cacheDir; protected $cachePool; - protected function setUp() + public function setUp() { - $this->cachePool = new FileCacheAdapter('/tmp/test-my-cache'); - + $this->root = vfsStream::setup('pdp'); + vfsStream::create(['cache' => []], $this->root); + $this->cacheDir = vfsStream::url('pdp/cache'); + $this->cachePool = new FileCacheAdapter($this->cacheDir); $this->manager = new PublicSuffixListManager( $this->cachePool, new CurlHttpAdapter(), @@ -29,10 +34,12 @@ protected function setUp() ); } - protected function tearDown() + public function tearDown() { $this->manager = null; $this->cachePool = null; + $this->cacheDir = null; + $this->root = null; } public function testGetProvidedListFromDefaultCacheDir() diff --git a/tests/PublicSuffixListTest.php b/tests/PublicSuffixListTest.php index 6fd49b8f..4fdb8e6b 100644 --- a/tests/PublicSuffixListTest.php +++ b/tests/PublicSuffixListTest.php @@ -27,7 +27,7 @@ class PublicSuffixListTest extends TestCase */ private $list; - protected function setUp() + public function setUp() { $cache = new FileCacheAdapter(); $rules = $cache->get(PublicSuffixListManager::ALL_DOMAINS); From 2408c1b4687ec4584c866389b0c0ed4d4d762c60 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 6 Oct 2017 14:18:29 +0200 Subject: [PATCH 038/461] Improve test suite --- tests/PublicSuffixListManagerTest.php | 9 ++++----- tests/PublicSuffixListTest.php | 6 +++--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/tests/PublicSuffixListManagerTest.php b/tests/PublicSuffixListManagerTest.php index 0a96a3c5..05343e33 100644 --- a/tests/PublicSuffixListManagerTest.php +++ b/tests/PublicSuffixListManagerTest.php @@ -16,10 +16,9 @@ class PublicSuffixListManagerTest extends TestCase * @var PublicSuffixListManager List manager */ protected $manager; - protected $cache; - protected $root; - protected $cacheDir; protected $cachePool; + protected $cacheDir; + protected $root; public function setUp() { @@ -50,9 +49,9 @@ public function testGetProvidedListFromDefaultCacheDir() public function testGetDifferentPublicList() { - $publicList = $this->manager->getList(); + $publicSuffixList = $this->manager->getList(); $invalidList = $this->manager->getList('invalid type'); - $this->assertEquals($publicList, $invalidList); + $this->assertEquals($publicSuffixList, $invalidList); } public function testRefreshList() diff --git a/tests/PublicSuffixListTest.php b/tests/PublicSuffixListTest.php index 4fdb8e6b..e2b0773d 100644 --- a/tests/PublicSuffixListTest.php +++ b/tests/PublicSuffixListTest.php @@ -13,6 +13,7 @@ namespace Pdp\Tests; use Pdp\Cache\FileCacheAdapter; +use Pdp\Http\CurlHttpAdapter; use Pdp\MatchedDomain; use Pdp\NullDomain; use Pdp\PublicSuffixList; @@ -29,9 +30,8 @@ class PublicSuffixListTest extends TestCase public function setUp() { - $cache = new FileCacheAdapter(); - $rules = $cache->get(PublicSuffixListManager::ALL_DOMAINS); - $this->list = new PublicSuffixList($rules); + $manager = new PublicSuffixListManager(new FileCacheAdapter(), new CurlHttpAdapter()); + $this->list = $manager->getList(); } public function testGetRules() From d476cb954e64433b4e3c0e72d690920ce5a003db Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 6 Oct 2017 19:42:22 +0200 Subject: [PATCH 039/461] improve typehint --- src/Cache/FileCacheAdapter.php | 4 ++-- src/PublicSuffixListManager.php | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Cache/FileCacheAdapter.php b/src/Cache/FileCacheAdapter.php index be54713f..3454bdae 100644 --- a/src/Cache/FileCacheAdapter.php +++ b/src/Cache/FileCacheAdapter.php @@ -256,7 +256,7 @@ public function has($key) * * @return string absolute path to cache-file */ - private function getPath($key) + private function getPath($key): string { $this->validateKey($key); @@ -274,7 +274,7 @@ private function getPath($key) /** * @return Generator|string[] */ - private function listPaths() + private function listPaths(): Generator { $iterator = new RecursiveDirectoryIterator( $this->cache_path, diff --git a/src/PublicSuffixListManager.php b/src/PublicSuffixListManager.php index 1a2a33b0..0eee92b1 100644 --- a/src/PublicSuffixListManager.php +++ b/src/PublicSuffixListManager.php @@ -117,6 +117,8 @@ public function refreshPublicSuffixList(): bool * * Returns true if all the public suffix list are correctly refreshed * + * @param string $publicSuffixList + * * @return bool */ private function cachePublicSuffixListTypes(string $publicSuffixList): bool @@ -129,6 +131,8 @@ private function cachePublicSuffixListTypes(string $publicSuffixList): bool /** * Parses text representation of list to associative, multidimensional array. * + * @param string $publicSuffixList + * * @return array Associative, multidimensional array representation of the * public suffx list */ From 05c4489a71e56cf3c54ee8c8b45c911902da3908 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 9 Oct 2017 18:05:20 +0200 Subject: [PATCH 040/461] Switch from array to json remove extra check in PublicSuffixListManager regarding cache --- ...347ea112977e316242f2d457864041f59dfb684fc0 | 2 +- ...77e1e93475af9f8761ed84ed960a467e7e01126243 | 2 +- ...847b7815909e864b2fd9c4ea88b00d35adb2ecdfd7 | 2 +- src/PublicSuffixListManager.php | 44 +++++-------------- 4 files changed, 14 insertions(+), 36 deletions(-) diff --git a/data/7/1/09ec0807d8f2bd40aa93347ea112977e316242f2d457864041f59dfb684fc0 b/data/7/1/09ec0807d8f2bd40aa93347ea112977e316242f2d457864041f59dfb684fc0 index 7a383d3d..26ed497a 100644 --- a/data/7/1/09ec0807d8f2bd40aa93347ea112977e316242f2d457864041f59dfb684fc0 +++ b/data/7/1/09ec0807d8f2bd40aa93347ea112977e316242f2d457864041f59dfb684fc0 @@ -1 +1 @@ -a:146:{s:2:"ua";a:6:{s:2:"cc";a:0:{}s:3:"inf";a:0:{}s:3:"ltd";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:2:"pp";a:0:{}}s:2:"pl";a:13:{s:4:"beep";a:0:{}s:2:"co";a:0:{}s:3:"art";a:0:{}s:7:"gliwice";a:0:{}s:6:"krakow";a:0:{}s:6:"poznan";a:0:{}s:4:"wroc";a:0:{}s:8:"zakopane";a:0:{}s:3:"gda";a:0:{}s:6:"gdansk";a:0:{}s:6:"gdynia";a:0:{}s:3:"med";a:0:{}s:5:"sopot";a:0:{}}s:6:"estate";a:1:{s:7:"compute";a:1:{s:1:"*";a:0:{}}}s:7:"network";a:1:{s:5:"alces";a:1:{s:1:"*";a:0:{}}}s:3:"net";a:94:{s:10:"alwaysdata";a:1:{s:1:"*";a:0:{}}s:10:"cloudfront";a:0:{}s:8:"t3l3p0rt";a:0:{}s:7:"myfritz";a:0:{}s:6:"boomla";a:0:{}s:7:"bplaced";a:0:{}s:7:"square7";a:0:{}s:2:"gb";a:0:{}s:2:"hu";a:0:{}s:2:"jp";a:0:{}s:2:"se";a:0:{}s:2:"uk";a:0:{}s:2:"in";a:0:{}s:11:"cloudaccess";a:0:{}s:9:"cdn77-ssl";a:0:{}s:5:"cdn77";a:1:{s:1:"r";a:0:{}}s:8:"feste-ip";a:0:{}s:10:"knx-server";a:0:{}s:13:"static-access";a:0:{}s:11:"cryptonomic";a:1:{s:1:"*";a:0:{}}s:6:"debian";a:0:{}s:12:"at-band-camp";a:0:{}s:7:"blogdns";a:0:{}s:8:"broke-it";a:0:{}s:10:"buyshouses";a:0:{}s:8:"dnsalias";a:0:{}s:7:"dnsdojo";a:0:{}s:7:"does-it";a:0:{}s:9:"dontexist";a:0:{}s:8:"dynalias";a:0:{}s:9:"dynathome";a:0:{}s:13:"endofinternet";a:0:{}s:7:"from-az";a:0:{}s:7:"from-co";a:0:{}s:7:"from-la";a:0:{}s:7:"from-ny";a:0:{}s:7:"gets-it";a:0:{}s:12:"ham-radio-op";a:0:{}s:7:"homeftp";a:0:{}s:6:"homeip";a:0:{}s:9:"homelinux";a:0:{}s:8:"homeunix";a:0:{}s:11:"in-the-band";a:0:{}s:9:"is-a-chef";a:0:{}s:9:"is-a-geek";a:0:{}s:8:"isa-geek";a:0:{}s:9:"kicks-ass";a:0:{}s:13:"office-on-the";a:0:{}s:7:"podzone";a:0:{}s:13:"scrapper-site";a:0:{}s:6:"selfip";a:0:{}s:8:"sells-it";a:0:{}s:8:"servebbs";a:0:{}s:8:"serveftp";a:0:{}s:8:"thruhere";a:0:{}s:6:"webhop";a:0:{}s:8:"definima";a:0:{}s:7:"casacam";a:0:{}s:4:"dynu";a:0:{}s:5:"dynv6";a:0:{}s:6:"twmail";a:0:{}s:2:"ru";a:0:{}s:11:"channelsdvr";a:0:{}s:8:"fastlylb";a:1:{s:3:"map";a:0:{}}s:6:"fastly";a:4:{s:7:"freetls";a:0:{}s:3:"map";a:0:{}s:4:"prod";a:2:{s:1:"a";a:0:{}s:6:"global";a:0:{}}s:3:"ssl";a:3:{s:1:"a";a:0:{}s:1:"b";a:0:{}s:6:"global";a:0:{}}}s:12:"flynnhosting";a:0:{}s:14:"cloudfunctions";a:0:{}s:9:"moonscale";a:0:{}s:7:"ipifony";a:0:{}s:5:"barsy";a:0:{}s:13:"azurewebsites";a:0:{}s:12:"azure-mobile";a:0:{}s:8:"cloudapp";a:0:{}s:14:"eating-organic";a:0:{}s:9:"mydissent";a:0:{}s:8:"myeffect";a:0:{}s:9:"mymediapc";a:0:{}s:5:"mypsx";a:0:{}s:16:"mysecuritycamera";a:0:{}s:6:"nhlfan";a:0:{}s:5:"no-ip";a:0:{}s:6:"pgafan";a:0:{}s:24:"privatizehealthinsurance";a:0:{}s:8:"bounceme";a:0:{}s:4:"ddns";a:0:{}s:10:"redirectme";a:0:{}s:9:"serveblog";a:0:{}s:14:"serveminecraft";a:0:{}s:5:"sytes";a:0:{}s:8:"rackmaze";a:0:{}s:16:"firewall-gateway";a:0:{}s:7:"dsmynas";a:0:{}s:8:"familyds";a:0:{}s:2:"za";a:0:{}}s:3:"com";a:290:{s:9:"amazonaws";a:40:{s:7:"compute";a:1:{s:1:"*";a:0:{}}s:9:"compute-1";a:1:{s:1:"*";a:0:{}}s:9:"us-east-1";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:3:"elb";a:1:{s:1:"*";a:0:{}}s:2:"s3";a:0:{}s:17:"s3-ap-northeast-1";a:0:{}s:17:"s3-ap-northeast-2";a:0:{}s:13:"s3-ap-south-1";a:0:{}s:17:"s3-ap-southeast-1";a:0:{}s:17:"s3-ap-southeast-2";a:0:{}s:15:"s3-ca-central-1";a:0:{}s:15:"s3-eu-central-1";a:0:{}s:12:"s3-eu-west-1";a:0:{}s:12:"s3-eu-west-2";a:0:{}s:13:"s3-external-1";a:0:{}s:21:"s3-fips-us-gov-west-1";a:0:{}s:12:"s3-sa-east-1";a:0:{}s:16:"s3-us-gov-west-1";a:0:{}s:12:"s3-us-east-2";a:0:{}s:12:"s3-us-west-1";a:0:{}s:12:"s3-us-west-2";a:0:{}s:14:"ap-northeast-2";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:10:"ap-south-1";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:12:"ca-central-1";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:12:"eu-central-1";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:9:"eu-west-2";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:9:"us-east-2";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:14:"ap-northeast-1";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:14:"ap-southeast-1";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:14:"ap-southeast-2";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:9:"eu-west-1";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:9:"sa-east-1";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:20:"s3-website-us-east-1";a:0:{}s:20:"s3-website-us-west-1";a:0:{}s:20:"s3-website-us-west-2";a:0:{}s:25:"s3-website-ap-northeast-1";a:0:{}s:25:"s3-website-ap-southeast-1";a:0:{}s:25:"s3-website-ap-southeast-2";a:0:{}s:20:"s3-website-eu-west-1";a:0:{}s:20:"s3-website-sa-east-1";a:0:{}}s:16:"elasticbeanstalk";a:15:{s:14:"ap-northeast-1";a:0:{}s:14:"ap-northeast-2";a:0:{}s:10:"ap-south-1";a:0:{}s:14:"ap-southeast-1";a:0:{}s:14:"ap-southeast-2";a:0:{}s:12:"ca-central-1";a:0:{}s:12:"eu-central-1";a:0:{}s:9:"eu-west-1";a:0:{}s:9:"eu-west-2";a:0:{}s:9:"sa-east-1";a:0:{}s:9:"us-east-1";a:0:{}s:9:"us-east-2";a:0:{}s:13:"us-gov-west-1";a:0:{}s:9:"us-west-1";a:0:{}s:9:"us-west-2";a:0:{}}s:10:"on-aptible";a:0:{}s:9:"myasustor";a:0:{}s:10:"betainabox";a:0:{}s:7:"bplaced";a:0:{}s:2:"ar";a:0:{}s:2:"br";a:0:{}s:2:"cn";a:0:{}s:2:"de";a:0:{}s:2:"eu";a:0:{}s:2:"gb";a:0:{}s:2:"hu";a:0:{}s:3:"jpn";a:0:{}s:2:"kr";a:0:{}s:3:"mex";a:0:{}s:2:"no";a:0:{}s:2:"qc";a:0:{}s:2:"ru";a:0:{}s:2:"sa";a:0:{}s:2:"se";a:0:{}s:2:"uk";a:0:{}s:2:"us";a:0:{}s:2:"uy";a:0:{}s:2:"za";a:0:{}s:6:"africa";a:0:{}s:2:"gr";a:0:{}s:2:"co";a:0:{}s:13:"xenapponazure";a:0:{}s:9:"jdevcloud";a:0:{}s:10:"wpdevcloud";a:0:{}s:15:"cloudcontrolled";a:0:{}s:15:"cloudcontrolapp";a:0:{}s:8:"drayddns";a:0:{}s:12:"dreamhosters";a:0:{}s:7:"mydrobo";a:0:{}s:14:"dyndns-at-home";a:0:{}s:14:"dyndns-at-work";a:0:{}s:11:"dyndns-blog";a:0:{}s:11:"dyndns-free";a:0:{}s:11:"dyndns-home";a:0:{}s:9:"dyndns-ip";a:0:{}s:11:"dyndns-mail";a:0:{}s:13:"dyndns-office";a:0:{}s:11:"dyndns-pics";a:0:{}s:13:"dyndns-remote";a:0:{}s:13:"dyndns-server";a:0:{}s:10:"dyndns-web";a:0:{}s:11:"dyndns-wiki";a:0:{}s:11:"dyndns-work";a:0:{}s:7:"blogdns";a:0:{}s:7:"cechire";a:0:{}s:8:"dnsalias";a:0:{}s:7:"dnsdojo";a:0:{}s:11:"doesntexist";a:0:{}s:9:"dontexist";a:0:{}s:7:"doomdns";a:0:{}s:10:"dyn-o-saur";a:0:{}s:8:"dynalias";a:0:{}s:15:"est-a-la-maison";a:0:{}s:15:"est-a-la-masion";a:0:{}s:13:"est-le-patron";a:0:{}s:16:"est-mon-blogueur";a:0:{}s:7:"from-ak";a:0:{}s:7:"from-al";a:0:{}s:7:"from-ar";a:0:{}s:7:"from-ca";a:0:{}s:7:"from-ct";a:0:{}s:7:"from-dc";a:0:{}s:7:"from-de";a:0:{}s:7:"from-fl";a:0:{}s:7:"from-ga";a:0:{}s:7:"from-hi";a:0:{}s:7:"from-ia";a:0:{}s:7:"from-id";a:0:{}s:7:"from-il";a:0:{}s:7:"from-in";a:0:{}s:7:"from-ks";a:0:{}s:7:"from-ky";a:0:{}s:7:"from-ma";a:0:{}s:7:"from-md";a:0:{}s:7:"from-mi";a:0:{}s:7:"from-mn";a:0:{}s:7:"from-mo";a:0:{}s:7:"from-ms";a:0:{}s:7:"from-mt";a:0:{}s:7:"from-nc";a:0:{}s:7:"from-nd";a:0:{}s:7:"from-ne";a:0:{}s:7:"from-nh";a:0:{}s:7:"from-nj";a:0:{}s:7:"from-nm";a:0:{}s:7:"from-nv";a:0:{}s:7:"from-oh";a:0:{}s:7:"from-ok";a:0:{}s:7:"from-or";a:0:{}s:7:"from-pa";a:0:{}s:7:"from-pr";a:0:{}s:7:"from-ri";a:0:{}s:7:"from-sc";a:0:{}s:7:"from-sd";a:0:{}s:7:"from-tn";a:0:{}s:7:"from-tx";a:0:{}s:7:"from-ut";a:0:{}s:7:"from-va";a:0:{}s:7:"from-vt";a:0:{}s:7:"from-wa";a:0:{}s:7:"from-wi";a:0:{}s:7:"from-wv";a:0:{}s:7:"from-wy";a:0:{}s:7:"getmyip";a:0:{}s:6:"gotdns";a:0:{}s:10:"hobby-site";a:0:{}s:9:"homelinux";a:0:{}s:8:"homeunix";a:0:{}s:9:"iamallama";a:0:{}s:14:"is-a-anarchist";a:0:{}s:12:"is-a-blogger";a:0:{}s:15:"is-a-bookkeeper";a:0:{}s:14:"is-a-bulls-fan";a:0:{}s:12:"is-a-caterer";a:0:{}s:9:"is-a-chef";a:0:{}s:17:"is-a-conservative";a:0:{}s:8:"is-a-cpa";a:0:{}s:18:"is-a-cubicle-slave";a:0:{}s:13:"is-a-democrat";a:0:{}s:13:"is-a-designer";a:0:{}s:11:"is-a-doctor";a:0:{}s:21:"is-a-financialadvisor";a:0:{}s:9:"is-a-geek";a:0:{}s:10:"is-a-green";a:0:{}s:9:"is-a-guru";a:0:{}s:16:"is-a-hard-worker";a:0:{}s:11:"is-a-hunter";a:0:{}s:15:"is-a-landscaper";a:0:{}s:11:"is-a-lawyer";a:0:{}s:12:"is-a-liberal";a:0:{}s:16:"is-a-libertarian";a:0:{}s:10:"is-a-llama";a:0:{}s:13:"is-a-musician";a:0:{}s:14:"is-a-nascarfan";a:0:{}s:10:"is-a-nurse";a:0:{}s:12:"is-a-painter";a:0:{}s:20:"is-a-personaltrainer";a:0:{}s:17:"is-a-photographer";a:0:{}s:11:"is-a-player";a:0:{}s:15:"is-a-republican";a:0:{}s:13:"is-a-rockstar";a:0:{}s:14:"is-a-socialist";a:0:{}s:12:"is-a-student";a:0:{}s:12:"is-a-teacher";a:0:{}s:11:"is-a-techie";a:0:{}s:14:"is-a-therapist";a:0:{}s:16:"is-an-accountant";a:0:{}s:11:"is-an-actor";a:0:{}s:13:"is-an-actress";a:0:{}s:15:"is-an-anarchist";a:0:{}s:12:"is-an-artist";a:0:{}s:14:"is-an-engineer";a:0:{}s:17:"is-an-entertainer";a:0:{}s:12:"is-certified";a:0:{}s:7:"is-gone";a:0:{}s:13:"is-into-anime";a:0:{}s:12:"is-into-cars";a:0:{}s:16:"is-into-cartoons";a:0:{}s:13:"is-into-games";a:0:{}s:7:"is-leet";a:0:{}s:16:"is-not-certified";a:0:{}s:8:"is-slick";a:0:{}s:11:"is-uberleet";a:0:{}s:15:"is-with-theband";a:0:{}s:8:"isa-geek";a:0:{}s:13:"isa-hockeynut";a:0:{}s:16:"issmarterthanyou";a:0:{}s:9:"likes-pie";a:0:{}s:10:"likescandy";a:0:{}s:8:"neat-url";a:0:{}s:16:"saves-the-whales";a:0:{}s:6:"selfip";a:0:{}s:14:"sells-for-less";a:0:{}s:11:"sells-for-u";a:0:{}s:8:"servebbs";a:0:{}s:10:"simple-url";a:0:{}s:13:"space-to-rent";a:0:{}s:12:"teaches-yoga";a:0:{}s:14:"writesthisblog";a:0:{}s:8:"ddnsfree";a:0:{}s:8:"ddnsgeek";a:0:{}s:5:"giize";a:0:{}s:6:"gleeze";a:0:{}s:5:"kozow";a:0:{}s:10:"loseyourip";a:0:{}s:5:"ooguy";a:0:{}s:9:"theworkpc";a:0:{}s:8:"mytuleap";a:0:{}s:8:"evennode";a:8:{s:4:"eu-1";a:0:{}s:4:"eu-2";a:0:{}s:4:"eu-3";a:0:{}s:4:"eu-4";a:0:{}s:4:"us-1";a:0:{}s:4:"us-2";a:0:{}s:4:"us-3";a:0:{}s:4:"us-4";a:0:{}}s:5:"fbsbx";a:1:{s:4:"apps";a:0:{}}s:11:"firebaseapp";a:0:{}s:8:"flynnhub";a:0:{}s:10:"freebox-os";a:0:{}s:9:"freeboxos";a:0:{}s:17:"githubusercontent";a:0:{}s:4:"0emm";a:1:{s:1:"*";a:0:{}}s:7:"appspot";a:0:{}s:8:"blogspot";a:0:{}s:8:"codespot";a:0:{}s:10:"googleapis";a:0:{}s:10:"googlecode";a:0:{}s:18:"pagespeedmobilizer";a:0:{}s:12:"publishproxy";a:0:{}s:10:"withgoogle";a:0:{}s:11:"withyoutube";a:0:{}s:9:"herokuapp";a:0:{}s:9:"herokussl";a:0:{}s:8:"pixolino";a:0:{}s:6:"joyent";a:1:{s:3:"cns";a:1:{s:1:"*";a:0:{}}}s:11:"barsyonline";a:0:{}s:9:"meteorapp";a:1:{s:2:"eu";a:0:{}}s:10:"bitballoon";a:0:{}s:7:"netlify";a:0:{}s:2:"4u";a:0:{}s:7:"nfshost";a:0:{}s:8:"blogsyte";a:0:{}s:10:"ciscofreak";a:0:{}s:10:"damnserver";a:0:{}s:11:"ditchyourip";a:0:{}s:10:"dnsiskinky";a:0:{}s:5:"dynns";a:0:{}s:10:"geekgalaxy";a:0:{}s:17:"health-carereform";a:0:{}s:15:"homesecuritymac";a:0:{}s:14:"homesecuritypc";a:0:{}s:17:"myactivedirectory";a:0:{}s:16:"mysecuritycamera";a:0:{}s:10:"net-freaks";a:0:{}s:9:"onthewifi";a:0:{}s:10:"point2this";a:0:{}s:10:"quicksytes";a:0:{}s:15:"securitytactics";a:0:{}s:13:"serveexchange";a:0:{}s:11:"servehumour";a:0:{}s:8:"servep2p";a:0:{}s:12:"servesarcasm";a:0:{}s:11:"stufftoread";a:0:{}s:13:"unusualperson";a:0:{}s:12:"workisboring";a:0:{}s:10:"3utilities";a:0:{}s:8:"ddnsking";a:0:{}s:5:"myvnc";a:0:{}s:9:"servebeer";a:0:{}s:18:"servecounterstrike";a:0:{}s:8:"serveftp";a:0:{}s:9:"servegame";a:0:{}s:13:"servehalflife";a:0:{}s:9:"servehttp";a:0:{}s:8:"serveirc";a:0:{}s:8:"servemp3";a:0:{}s:9:"servepics";a:0:{}s:10:"servequake";a:0:{}s:10:"operaunite";a:0:{}s:15:"outsystemscloud";a:0:{}s:11:"ownprovider";a:0:{}s:5:"pgfog";a:0:{}s:12:"pagefrontapp";a:0:{}s:11:"gotpantheon";a:0:{}s:5:"prgmr";a:1:{s:3:"xen";a:0:{}}s:3:"qa2";a:0:{}s:15:"dev-myqnapcloud";a:0:{}s:17:"alpha-myqnapcloud";a:0:{}s:11:"myqnapcloud";a:0:{}s:12:"quipelements";a:1:{s:1:"*";a:0:{}}s:8:"rackmaze";a:0:{}s:7:"rhcloud";a:0:{}s:6:"logoip";a:0:{}s:16:"firewall-gateway";a:0:{}s:12:"myshopblocks";a:0:{}s:5:"1kapp";a:0:{}s:8:"appchizi";a:0:{}s:8:"applinzi";a:0:{}s:7:"sinaapp";a:0:{}s:10:"vipsinaapp";a:0:{}s:11:"bounty-full";a:2:{s:5:"alpha";a:0:{}s:4:"beta";a:0:{}}s:8:"temp-dns";a:0:{}s:7:"dsmynas";a:0:{}s:8:"familyds";a:0:{}s:7:"bloxcms";a:0:{}s:16:"townnews-staging";a:0:{}s:2:"hk";a:0:{}s:8:"remotewd";a:0:{}s:8:"yolasite";a:0:{}}s:2:"cn";a:1:{s:3:"com";a:1:{s:9:"amazonaws";a:4:{s:7:"compute";a:1:{s:1:"*";a:0:{}}s:2:"eb";a:1:{s:10:"cn-north-1";a:0:{}}s:3:"elb";a:1:{s:1:"*";a:0:{}}s:10:"cn-north-1";a:1:{s:2:"s3";a:0:{}}}}}s:3:"org";a:99:{s:5:"amune";a:1:{s:4:"tele";a:0:{}}s:8:"pimienta";a:0:{}s:7:"poivron";a:0:{}s:7:"potager";a:0:{}s:11:"sweetpepper";a:0:{}s:2:"ae";a:0:{}s:2:"us";a:0:{}s:7:"certmgr";a:0:{}s:5:"cdn77";a:2:{s:1:"c";a:0:{}s:3:"rsc";a:0:{}}s:12:"cdn77-secure";a:1:{s:6:"origin";a:1:{s:3:"ssl";a:0:{}}}s:7:"cloudns";a:0:{}s:7:"duckdns";a:0:{}s:4:"tunk";a:0:{}s:6:"dyndns";a:2:{s:2:"go";a:0:{}s:4:"home";a:0:{}}s:7:"blogdns";a:0:{}s:8:"blogsite";a:0:{}s:18:"boldlygoingnowhere";a:0:{}s:8:"dnsalias";a:0:{}s:7:"dnsdojo";a:0:{}s:11:"doesntexist";a:0:{}s:9:"dontexist";a:0:{}s:7:"doomdns";a:0:{}s:6:"dvrdns";a:0:{}s:8:"dynalias";a:0:{}s:13:"endofinternet";a:0:{}s:16:"endoftheinternet";a:0:{}s:7:"from-me";a:0:{}s:9:"game-host";a:0:{}s:6:"gotdns";a:0:{}s:10:"hobby-site";a:0:{}s:7:"homedns";a:0:{}s:7:"homeftp";a:0:{}s:9:"homelinux";a:0:{}s:8:"homeunix";a:0:{}s:14:"is-a-bruinsfan";a:0:{}s:14:"is-a-candidate";a:0:{}s:15:"is-a-celticsfan";a:0:{}s:9:"is-a-chef";a:0:{}s:9:"is-a-geek";a:0:{}s:11:"is-a-knight";a:0:{}s:15:"is-a-linux-user";a:0:{}s:12:"is-a-patsfan";a:0:{}s:11:"is-a-soxfan";a:0:{}s:8:"is-found";a:0:{}s:7:"is-lost";a:0:{}s:8:"is-saved";a:0:{}s:11:"is-very-bad";a:0:{}s:12:"is-very-evil";a:0:{}s:12:"is-very-good";a:0:{}s:12:"is-very-nice";a:0:{}s:13:"is-very-sweet";a:0:{}s:8:"isa-geek";a:0:{}s:9:"kicks-ass";a:0:{}s:11:"misconfused";a:0:{}s:7:"podzone";a:0:{}s:10:"readmyblog";a:0:{}s:6:"selfip";a:0:{}s:13:"sellsyourhome";a:0:{}s:8:"servebbs";a:0:{}s:8:"serveftp";a:0:{}s:9:"servegame";a:0:{}s:12:"stuff-4-sale";a:0:{}s:6:"webhop";a:0:{}s:5:"ddnss";a:0:{}s:9:"accesscam";a:0:{}s:6:"camdvr";a:0:{}s:8:"freeddns";a:0:{}s:6:"mywire";a:0:{}s:11:"webredirect";a:0:{}s:2:"eu";a:55:{s:2:"al";a:0:{}s:4:"asso";a:0:{}s:2:"at";a:0:{}s:2:"au";a:0:{}s:2:"be";a:0:{}s:2:"bg";a:0:{}s:2:"ca";a:0:{}s:2:"cd";a:0:{}s:2:"ch";a:0:{}s:2:"cn";a:0:{}s:2:"cy";a:0:{}s:2:"cz";a:0:{}s:2:"de";a:0:{}s:2:"dk";a:0:{}s:3:"edu";a:0:{}s:2:"ee";a:0:{}s:2:"es";a:0:{}s:2:"fi";a:0:{}s:2:"fr";a:0:{}s:2:"gr";a:0:{}s:2:"hr";a:0:{}s:2:"hu";a:0:{}s:2:"ie";a:0:{}s:2:"il";a:0:{}s:2:"in";a:0:{}s:3:"int";a:0:{}s:2:"is";a:0:{}s:2:"it";a:0:{}s:2:"jp";a:0:{}s:2:"kr";a:0:{}s:2:"lt";a:0:{}s:2:"lu";a:0:{}s:2:"lv";a:0:{}s:2:"mc";a:0:{}s:2:"me";a:0:{}s:2:"mk";a:0:{}s:2:"mt";a:0:{}s:2:"my";a:0:{}s:3:"net";a:0:{}s:2:"ng";a:0:{}s:2:"nl";a:0:{}s:2:"no";a:0:{}s:2:"nz";a:0:{}s:5:"paris";a:0:{}s:2:"pl";a:0:{}s:2:"pt";a:0:{}s:3:"q-a";a:0:{}s:2:"ro";a:0:{}s:2:"ru";a:0:{}s:2:"se";a:0:{}s:2:"si";a:0:{}s:2:"sk";a:0:{}s:2:"tr";a:0:{}s:2:"uk";a:0:{}s:2:"us";a:0:{}}s:6:"twmail";a:0:{}s:16:"fedorainfracloud";a:0:{}s:12:"fedorapeople";a:0:{}s:13:"fedoraproject";a:1:{s:5:"cloud";a:0:{}}s:8:"hepforge";a:0:{}s:2:"js";a:0:{}s:14:"bmoattachments";a:0:{}s:11:"cable-modem";a:0:{}s:10:"collegefan";a:0:{}s:16:"couchpotatofries";a:0:{}s:6:"mlbfan";a:0:{}s:16:"mysecuritycamera";a:0:{}s:6:"nflfan";a:0:{}s:10:"read-books";a:0:{}s:6:"ufcfan";a:0:{}s:5:"hopto";a:0:{}s:5:"myftp";a:0:{}s:5:"no-ip";a:0:{}s:5:"zapto";a:0:{}s:11:"my-firewall";a:0:{}s:10:"myfirewall";a:0:{}s:5:"spdns";a:0:{}s:7:"dsmynas";a:0:{}s:8:"familyds";a:0:{}s:9:"tuxfamily";a:0:{}s:11:"diskstation";a:0:{}s:2:"hk";a:0:{}s:7:"wmflabs";a:0:{}s:2:"za";a:0:{}}s:3:"eus";a:1:{s:5:"party";a:1:{s:4:"user";a:0:{}}}s:2:"ca";a:4:{s:5:"awdev";a:1:{s:1:"*";a:0:{}}s:2:"co";a:0:{}s:8:"blogspot";a:0:{}s:5:"no-ip";a:0:{}}s:2:"ws";a:3:{s:7:"advisor";a:1:{s:1:"*";a:0:{}}s:6:"dyndns";a:0:{}s:6:"mypets";a:0:{}}s:2:"io";a:25:{s:12:"backplaneapp";a:0:{}s:7:"boxfuse";a:0:{}s:17:"browsersafetymark";a:0:{}s:5:"dedyn";a:0:{}s:4:"drud";a:0:{}s:8:"definima";a:0:{}s:6:"enonic";a:1:{s:8:"customer";a:0:{}}s:6:"github";a:0:{}s:6:"gitlab";a:0:{}s:10:"hasura-app";a:0:{}s:5:"ngrok";a:0:{}s:7:"nodeart";a:1:{s:5:"stage";a:0:{}}s:5:"nodum";a:0:{}s:3:"nid";a:0:{}s:12:"pantheonsite";a:0:{}s:8:"protonet";a:0:{}s:10:"vaporcloud";a:0:{}s:3:"hzc";a:0:{}s:8:"sandcats";a:0:{}s:9:"shiftedit";a:0:{}s:4:"lair";a:1:{s:4:"apps";a:0:{}}s:6:"stolos";a:1:{s:1:"*";a:0:{}}s:8:"spacekit";a:0:{}s:9:"thingdust";a:4:{s:3:"dev";a:1:{s:4:"cust";a:0:{}}s:6:"disrec";a:1:{s:4:"cust";a:0:{}}s:4:"prod";a:1:{s:4:"cust";a:0:{}}s:7:"testing";a:1:{s:4:"cust";a:0:{}}}s:8:"wedeploy";a:0:{}}s:2:"la";a:3:{s:3:"bnr";a:0:{}s:1:"c";a:0:{}s:3:"nym";a:0:{}}s:2:"ch";a:7:{s:7:"square7";a:0:{}s:8:"blogspot";a:0:{}s:6:"gotdns";a:0:{}s:4:"12hp";a:0:{}s:3:"2ix";a:0:{}s:5:"4lima";a:0:{}s:9:"lima-city";a:0:{}}s:2:"de";a:48:{s:7:"bplaced";a:0:{}s:7:"square7";a:0:{}s:3:"com";a:0:{}s:7:"cosidns";a:1:{s:3:"dyn";a:0:{}}s:15:"dynamisches-dns";a:0:{}s:10:"dnsupdater";a:0:{}s:12:"internet-dns";a:0:{}s:9:"l-o-g-i-n";a:0:{}s:7:"dnshome";a:0:{}s:15:"fuettertdasnetz";a:0:{}s:10:"isteingeek";a:0:{}s:7:"istmein";a:0:{}s:10:"lebtimnetz";a:0:{}s:10:"leitungsen";a:0:{}s:13:"traeumtgerade";a:0:{}s:5:"ddnss";a:2:{s:3:"dyn";a:0:{}s:6:"dyndns";a:0:{}}s:7:"dyndns1";a:0:{}s:8:"dyn-ip24";a:0:{}s:14:"home-webserver";a:1:{s:3:"dyn";a:0:{}}s:13:"myhome-server";a:0:{}s:4:"goip";a:0:{}s:8:"blogspot";a:0:{}s:10:"keymachine";a:0:{}s:9:"git-repos";a:0:{}s:12:"lcube-server";a:0:{}s:9:"svn-repos";a:0:{}s:5:"barsy";a:0:{}s:6:"logoip";a:0:{}s:16:"firewall-gateway";a:0:{}s:10:"my-gateway";a:0:{}s:9:"my-router";a:0:{}s:5:"spdns";a:0:{}s:10:"taifun-dns";a:0:{}s:4:"12hp";a:0:{}s:3:"2ix";a:0:{}s:5:"4lima";a:0:{}s:9:"lima-city";a:0:{}s:6:"dd-dns";a:0:{}s:8:"dray-dns";a:0:{}s:7:"draydns";a:0:{}s:7:"dyn-vpn";a:0:{}s:6:"dynvpn";a:0:{}s:10:"mein-vigor";a:0:{}s:8:"my-vigor";a:0:{}s:6:"my-wan";a:0:{}s:7:"syno-ds";a:0:{}s:20:"synology-diskstation";a:0:{}s:11:"synology-ds";a:0:{}}s:2:"eu";a:7:{s:4:"mycd";a:0:{}s:7:"cloudns";a:0:{}s:5:"barsy";a:0:{}s:13:"wellbeingzone";a:0:{}s:5:"spdns";a:0:{}s:8:"transurl";a:1:{s:1:"*";a:0:{}}s:11:"diskstation";a:0:{}}s:2:"se";a:2:{s:3:"com";a:0:{}s:8:"blogspot";a:0:{}}s:2:"bz";a:2:{s:2:"za";a:0:{}s:3:"nym";a:0:{}}s:2:"nl";a:6:{s:14:"virtueeldomein";a:0:{}s:2:"co";a:0:{}s:8:"blogspot";a:0:{}s:8:"transurl";a:1:{s:1:"*";a:0:{}}s:7:"cistron";a:0:{}s:5:"demon";a:0:{}}s:2:"me";a:18:{s:3:"c66";a:0:{}s:6:"daplie";a:1:{s:9:"localhost";a:0:{}}s:8:"filegear";a:0:{}s:8:"brasilia";a:0:{}s:4:"ddns";a:0:{}s:6:"dnsfor";a:0:{}s:5:"hopto";a:0:{}s:7:"loginto";a:0:{}s:4:"noip";a:0:{}s:6:"webhop";a:0:{}s:3:"nym";a:0:{}s:11:"diskstation";a:0:{}s:7:"dscloud";a:0:{}s:4:"i234";a:0:{}s:4:"myds";a:0:{}s:8:"synology";a:0:{}s:8:"wedeploy";a:0:{}s:5:"yombo";a:0:{}}s:4:"host";a:2:{s:11:"cloudaccess";a:0:{}s:8:"freesite";a:0:{}}s:2:"cz";a:5:{s:2:"co";a:0:{}s:5:"realm";a:0:{}s:2:"e4";a:0:{}s:8:"blogspot";a:0:{}s:11:"metacentrum";a:2:{s:5:"cloud";a:0:{}s:6:"custom";a:0:{}}}s:4:"asia";a:1:{s:7:"cloudns";a:0:{}}s:3:"biz";a:12:{s:7:"cloudns";a:0:{}s:6:"dyndns";a:0:{}s:10:"for-better";a:0:{}s:8:"for-more";a:0:{}s:8:"for-some";a:0:{}s:7:"for-the";a:0:{}s:6:"selfip";a:0:{}s:6:"webhop";a:0:{}s:6:"mmafan";a:0:{}s:5:"myftp";a:0:{}s:5:"no-ip";a:0:{}s:7:"dscloud";a:0:{}}s:4:"club";a:1:{s:7:"cloudns";a:0:{}}s:2:"cc";a:7:{s:7:"cloudns";a:0:{}s:9:"ftpaccess";a:0:{}s:11:"game-server";a:0:{}s:8:"myphotos";a:0:{}s:9:"scrapping";a:0:{}s:6:"twmail";a:0:{}s:13:"fantasyleague";a:0:{}}s:2:"in";a:3:{s:7:"cloudns";a:0:{}s:8:"blogspot";a:0:{}s:5:"barsy";a:0:{}}s:4:"info";a:17:{s:7:"cloudns";a:0:{}s:11:"dynamic-dns";a:0:{}s:6:"dyndns";a:0:{}s:19:"barrel-of-knowledge";a:0:{}s:20:"barrell-of-knowledge";a:0:{}s:7:"for-our";a:0:{}s:9:"groks-the";a:0:{}s:10:"groks-this";a:0:{}s:13:"here-for-more";a:0:{}s:10:"knowsitall";a:0:{}s:6:"selfip";a:0:{}s:6:"webhop";a:0:{}s:8:"nsupdate";a:0:{}s:6:"dvrcam";a:0:{}s:12:"ilovecollege";a:0:{}s:5:"no-ip";a:0:{}s:6:"v-info";a:0:{}}s:3:"pro";a:1:{s:7:"cloudns";a:0:{}}s:2:"pw";a:2:{s:7:"cloudns";a:0:{}s:3:"nom";a:0:{}}s:2:"us";a:9:{s:7:"cloudns";a:0:{}s:4:"drud";a:0:{}s:5:"is-by";a:0:{}s:11:"land-4-sale";a:0:{}s:12:"stuff-4-sale";a:0:{}s:7:"golffan";a:0:{}s:4:"noip";a:0:{}s:7:"pointto";a:0:{}s:2:"de";a:1:{s:3:"lib";a:0:{}}}s:2:"no";a:2:{s:2:"co";a:0:{}s:8:"blogspot";a:0:{}}s:2:"is";a:2:{s:7:"cupcake";a:0:{}s:8:"blogspot";a:0:{}}s:4:"link";a:2:{s:4:"cyon";a:0:{}s:5:"mypep";a:0:{}}s:4:"site";a:3:{s:4:"cyon";a:0:{}s:10:"platformsh";a:1:{s:1:"*";a:0:{}}s:4:"byen";a:0:{}}s:2:"dk";a:6:{s:3:"biz";a:0:{}s:2:"co";a:0:{}s:4:"firm";a:0:{}s:3:"reg";a:0:{}s:5:"store";a:0:{}s:8:"blogspot";a:0:{}}s:2:"fi";a:3:{s:2:"dy";a:0:{}s:8:"blogspot";a:0:{}s:3:"iki";a:0:{}}s:2:"tv";a:4:{s:6:"dyndns";a:0:{}s:11:"better-than";a:0:{}s:10:"on-the-web";a:0:{}s:10:"worse-than";a:0:{}}s:2:"cx";a:2:{s:3:"ath";a:0:{}s:4:"info";a:0:{}}s:4:"name";a:2:{s:3:"her";a:1:{s:6:"forgot";a:0:{}}s:3:"his";a:1:{s:6:"forgot";a:0:{}}}s:2:"nu";a:4:{s:8:"merseine";a:0:{}s:4:"mine";a:0:{}s:8:"shacknet";a:0:{}s:3:"nom";a:0:{}}s:5:"rocks";a:3:{s:6:"myddns";a:0:{}s:9:"lima-city";a:0:{}s:8:"webspace";a:0:{}}s:3:"xyz";a:2:{s:8:"blogsite";a:0:{}s:5:"fhapp";a:0:{}}s:2:"tw";a:4:{s:3:"com";a:1:{s:8:"mymailer";a:0:{}}s:3:"url";a:0:{}s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"ru";a:24:{s:7:"adygeya";a:0:{}s:9:"bashkiria";a:0:{}s:3:"bir";a:0:{}s:3:"cbg";a:0:{}s:3:"com";a:0:{}s:8:"dagestan";a:0:{}s:6:"grozny";a:0:{}s:8:"kalmykia";a:0:{}s:8:"kustanai";a:0:{}s:6:"marine";a:0:{}s:8:"mordovia";a:0:{}s:3:"msk";a:0:{}s:5:"mytis";a:0:{}s:7:"nalchik";a:0:{}s:3:"nov";a:0:{}s:10:"pyatigorsk";a:0:{}s:3:"spb";a:0:{}s:11:"vladikavkaz";a:0:{}s:8:"vladimir";a:0:{}s:8:"blogspot";a:0:{}s:7:"cldmail";a:1:{s:2:"hb";a:0:{}}s:3:"net";a:0:{}s:3:"org";a:0:{}s:2:"pp";a:0:{}}s:2:"su";a:53:{s:8:"abkhazia";a:0:{}s:7:"adygeya";a:0:{}s:10:"aktyubinsk";a:0:{}s:11:"arkhangelsk";a:0:{}s:7:"armenia";a:0:{}s:8:"ashgabad";a:0:{}s:10:"azerbaijan";a:0:{}s:8:"balashov";a:0:{}s:9:"bashkiria";a:0:{}s:7:"bryansk";a:0:{}s:7:"bukhara";a:0:{}s:8:"chimkent";a:0:{}s:8:"dagestan";a:0:{}s:15:"east-kazakhstan";a:0:{}s:5:"exnet";a:0:{}s:7:"georgia";a:0:{}s:6:"grozny";a:0:{}s:7:"ivanovo";a:0:{}s:6:"jambyl";a:0:{}s:8:"kalmykia";a:0:{}s:6:"kaluga";a:0:{}s:7:"karacol";a:0:{}s:9:"karaganda";a:0:{}s:7:"karelia";a:0:{}s:9:"khakassia";a:0:{}s:9:"krasnodar";a:0:{}s:6:"kurgan";a:0:{}s:8:"kustanai";a:0:{}s:5:"lenug";a:0:{}s:10:"mangyshlak";a:0:{}s:8:"mordovia";a:0:{}s:3:"msk";a:0:{}s:8:"murmansk";a:0:{}s:7:"nalchik";a:0:{}s:5:"navoi";a:0:{}s:16:"north-kazakhstan";a:0:{}s:3:"nov";a:0:{}s:7:"obninsk";a:0:{}s:5:"penza";a:0:{}s:8:"pokrovsk";a:0:{}s:5:"sochi";a:0:{}s:3:"spb";a:0:{}s:8:"tashkent";a:0:{}s:6:"termez";a:0:{}s:9:"togliatti";a:0:{}s:7:"troitsk";a:0:{}s:11:"tselinograd";a:0:{}s:4:"tula";a:0:{}s:4:"tuva";a:0:{}s:11:"vladikavkaz";a:0:{}s:8:"vladimir";a:0:{}s:7:"vologda";a:0:{}s:3:"nym";a:0:{}}s:2:"fr";a:7:{s:6:"fbx-os";a:0:{}s:5:"fbxos";a:0:{}s:10:"freebox-os";a:0:{}s:9:"freeboxos";a:0:{}s:8:"blogspot";a:0:{}s:6:"on-web";a:0:{}s:31:"chirurgiens-dentistes-en-france";a:0:{}}s:5:"cloud";a:6:{s:8:"myfusion";a:0:{}s:7:"statics";a:1:{s:1:"*";a:0:{}}s:11:"magentosite";a:1:{s:1:"*";a:0:{}}s:5:"vapor";a:0:{}s:10:"sensiosite";a:1:{s:1:"*";a:0:{}}s:11:"trafficplex";a:0:{}}s:2:"at";a:12:{s:9:"futurecms";a:1:{s:1:"*";a:0:{}}s:13:"futurehosting";a:0:{}s:13:"futuremailing";a:0:{}s:8:"ortsinfo";a:2:{s:2:"ex";a:1:{s:1:"*";a:0:{}}s:6:"kunden";a:1:{s:1:"*";a:0:{}}}s:2:"co";a:1:{s:8:"blogspot";a:0:{}}s:3:"biz";a:0:{}s:4:"info";a:0:{}s:4:"priv";a:0:{}s:4:"12hp";a:0:{}s:3:"2ix";a:0:{}s:5:"4lima";a:0:{}s:9:"lima-city";a:0:{}}s:2:"uk";a:2:{s:3:"gov";a:2:{s:7:"service";a:0:{}s:10:"homeoffice";a:0:{}}s:2:"co";a:3:{s:8:"blogspot";a:0:{}s:5:"no-ip";a:0:{}s:13:"wellbeingzone";a:0:{}}}s:2:"im";a:2:{s:2:"ro";a:0:{}s:3:"nom";a:0:{}}s:2:"ro";a:2:{s:4:"shop";a:0:{}s:8:"blogspot";a:0:{}}s:2:"ae";a:2:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"al";a:2:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"am";a:1:{s:8:"blogspot";a:0:{}}s:2:"ba";a:1:{s:8:"blogspot";a:0:{}}s:2:"be";a:2:{s:8:"blogspot";a:0:{}s:8:"transurl";a:1:{s:1:"*";a:0:{}}}s:2:"bg";a:2:{s:8:"blogspot";a:0:{}s:5:"barsy";a:0:{}}s:2:"bj";a:1:{s:8:"blogspot";a:0:{}}s:2:"cf";a:1:{s:8:"blogspot";a:0:{}}s:2:"cl";a:2:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"id";a:1:{s:2:"co";a:1:{s:8:"blogspot";a:0:{}}}s:2:"il";a:1:{s:2:"co";a:1:{s:8:"blogspot";a:0:{}}}s:2:"ke";a:1:{s:2:"co";a:1:{s:8:"blogspot";a:0:{}}}s:2:"nz";a:2:{s:2:"co";a:1:{s:8:"blogspot";a:0:{}}s:3:"nym";a:0:{}}s:2:"za";a:1:{s:2:"co";a:1:{s:8:"blogspot";a:0:{}}}s:2:"ar";a:1:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}}s:2:"au";a:1:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}}s:2:"br";a:2:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"leg";a:27:{s:2:"ac";a:0:{}s:2:"al";a:0:{}s:2:"am";a:0:{}s:2:"ap";a:0:{}s:2:"ba";a:0:{}s:2:"ce";a:0:{}s:2:"df";a:0:{}s:2:"es";a:0:{}s:2:"go";a:0:{}s:2:"ma";a:0:{}s:2:"mg";a:0:{}s:2:"ms";a:0:{}s:2:"mt";a:0:{}s:2:"pa";a:0:{}s:2:"pb";a:0:{}s:2:"pe";a:0:{}s:2:"pi";a:0:{}s:2:"pr";a:0:{}s:2:"rj";a:0:{}s:2:"rn";a:0:{}s:2:"ro";a:0:{}s:2:"rr";a:0:{}s:2:"rs";a:0:{}s:2:"sc";a:0:{}s:2:"se";a:0:{}s:2:"sp";a:0:{}s:2:"to";a:0:{}}}s:2:"by";a:2:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"nym";a:0:{}}s:2:"co";a:2:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:5:"nodum";a:0:{}}s:2:"cy";a:1:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}}s:2:"ee";a:1:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}}s:2:"eg";a:1:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}}s:2:"es";a:1:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}}s:2:"mt";a:1:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}}s:2:"ng";a:1:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}}s:2:"tr";a:1:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}}s:2:"uy";a:2:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"nom";a:0:{}}s:2:"cv";a:1:{s:8:"blogspot";a:0:{}}s:2:"gr";a:2:{s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"hk";a:3:{s:8:"blogspot";a:0:{}s:3:"ltd";a:0:{}s:3:"inc";a:0:{}}s:2:"hr";a:1:{s:8:"blogspot";a:0:{}}s:2:"hu";a:1:{s:8:"blogspot";a:0:{}}s:2:"ie";a:1:{s:8:"blogspot";a:0:{}}s:2:"it";a:1:{s:8:"blogspot";a:0:{}}s:2:"jp";a:1:{s:8:"blogspot";a:0:{}}s:2:"kr";a:1:{s:8:"blogspot";a:0:{}}s:2:"li";a:3:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}s:3:"nym";a:0:{}}s:2:"lt";a:2:{s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"lu";a:2:{s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"md";a:1:{s:8:"blogspot";a:0:{}}s:2:"mk";a:2:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"mr";a:1:{s:8:"blogspot";a:0:{}}s:2:"mx";a:2:{s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"my";a:1:{s:8:"blogspot";a:0:{}}s:2:"pe";a:2:{s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"pt";a:2:{s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"qa";a:2:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"re";a:1:{s:8:"blogspot";a:0:{}}s:2:"rs";a:2:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"sg";a:1:{s:8:"blogspot";a:0:{}}s:2:"si";a:2:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"sk";a:2:{s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"sn";a:1:{s:8:"blogspot";a:0:{}}s:2:"td";a:1:{s:8:"blogspot";a:0:{}}s:2:"ug";a:2:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"vn";a:1:{s:8:"blogspot";a:0:{}}s:4:"goog";a:1:{s:5:"cloud";a:0:{}}s:2:"sh";a:4:{s:8:"hashbang";a:0:{}s:8:"platform";a:1:{s:1:"*";a:0:{}}s:8:"wedeploy";a:0:{}s:3:"now";a:0:{}}s:4:"zone";a:2:{s:6:"triton";a:1:{s:1:"*";a:0:{}}s:4:"lima";a:0:{}}s:7:"systems";a:1:{s:11:"knightpoint";a:0:{}}s:3:"krd";a:2:{s:2:"co";a:0:{}s:3:"edu";a:0:{}}s:2:"bs";a:1:{s:2:"we";a:0:{}}s:6:"online";a:1:{s:5:"barsy";a:0:{}}s:7:"support";a:1:{s:5:"barsy";a:0:{}}s:3:"ovh";a:1:{s:7:"nerdpol";a:0:{}}s:2:"mn";a:1:{s:3:"nyc";a:0:{}}s:2:"ai";a:1:{s:3:"nom";a:0:{}}s:2:"gd";a:1:{s:3:"nom";a:0:{}}s:2:"gl";a:1:{s:3:"nom";a:0:{}}s:2:"gt";a:1:{s:3:"nom";a:0:{}}s:2:"hn";a:1:{s:3:"nom";a:0:{}}s:2:"kz";a:1:{s:3:"nym";a:0:{}}s:2:"sx";a:1:{s:3:"nym";a:0:{}}s:2:"vc";a:1:{s:3:"nom";a:0:{}}s:2:"vg";a:1:{s:3:"nom";a:0:{}}s:2:"gg";a:1:{s:3:"cya";a:0:{}}s:7:"hosting";a:1:{s:9:"opencraft";a:0:{}}s:2:"lc";a:1:{s:2:"oy";a:0:{}}s:3:"fit";a:1:{s:6:"ptplus";a:0:{}}s:4:"land";a:1:{s:6:"static";a:2:{s:3:"dev";a:0:{}s:5:"sites";a:0:{}}}s:5:"space";a:3:{s:10:"stackspace";a:0:{}s:4:"uber";a:0:{}s:6:"xs4all";a:0:{}}s:4:"farm";a:1:{s:5:"storj";a:0:{}}s:4:"mobi";a:1:{s:7:"dscloud";a:0:{}}s:2:"to";a:1:{s:7:"vpnplus";a:0:{}}s:4:"cool";a:1:{s:2:"de";a:0:{}}s:8:"pictures";a:1:{i:1337;a:0:{}}s:3:"rip";a:1:{s:4:"clan";a:0:{}}s:10:"management";a:1:{s:6:"router";a:0:{}}s:5:"faith";a:1:{s:3:"ybo";a:0:{}}s:3:"one";a:1:{s:8:"homelink";a:0:{}}s:5:"party";a:1:{s:3:"ybo";a:0:{}}s:6:"review";a:1:{s:3:"ybo";a:0:{}}s:7:"science";a:1:{s:3:"ybo";a:0:{}}s:5:"trade";a:1:{s:3:"ybo";a:0:{}}} \ No newline at end of file +s:17660:"{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":{"*":[]},"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"se":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"barsyonline":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[]},"hepforge":[],"js":[],"bmoattachments":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ca":{"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"ws":{"advisor":{"*":[]},"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"hzc":[],"sandcats":[],"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[]},"host":{"cloudaccess":[],"freesite":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[]},"pw":{"cloudns":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"no":{"co":[],"blogspot":[]},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"cldmail":{"hb":[]},"net":[],"org":[],"pp":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"cloud":{"myfusion":[],"statics":{"*":[]},"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"at":{"futurecms":{"*":[]},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"no-ip":[],"wellbeingzone":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"be":{"blogspot":[],"transurl":{"*":[]}},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]}},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"co":{"com":{"blogspot":[]},"nodum":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[]},"it":{"blogspot":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"bs":{"we":[]},"online":{"barsy":[]},"support":{"barsy":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[]},"ai":{"nom":[]},"gd":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"hn":{"nom":[]},"kz":{"nym":[]},"sx":{"nym":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"lc":{"oy":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"space":{"stackspace":[],"uber":[],"xs4all":[]},"farm":{"storj":[]},"mobi":{"dscloud":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}"; \ No newline at end of file diff --git a/data/A/A/91f9d4d1ae7f5129b52177e1e93475af9f8761ed84ed960a467e7e01126243 b/data/A/A/91f9d4d1ae7f5129b52177e1e93475af9f8761ed84ed960a467e7e01126243 index f07d964c..19f0df11 100644 --- a/data/A/A/91f9d4d1ae7f5129b52177e1e93475af9f8761ed84ed960a467e7e01126243 +++ b/data/A/A/91f9d4d1ae7f5129b52177e1e93475af9f8761ed84ed960a467e7e01126243 @@ -1 +1 @@ -a:1557:{s:2:"ac";a:6:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"mil";a:0:{}s:3:"org";a:0:{}}s:2:"ad";a:1:{s:3:"nom";a:0:{}}s:2:"ae";a:7:{s:2:"co";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sch";a:0:{}s:2:"ac";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}}s:4:"aero";a:87:{s:22:"accident-investigation";a:0:{}s:19:"accident-prevention";a:0:{}s:9:"aerobatic";a:0:{}s:8:"aeroclub";a:0:{}s:9:"aerodrome";a:0:{}s:6:"agents";a:0:{}s:8:"aircraft";a:0:{}s:7:"airline";a:0:{}s:7:"airport";a:0:{}s:16:"air-surveillance";a:0:{}s:10:"airtraffic";a:0:{}s:19:"air-traffic-control";a:0:{}s:9:"ambulance";a:0:{}s:9:"amusement";a:0:{}s:11:"association";a:0:{}s:6:"author";a:0:{}s:10:"ballooning";a:0:{}s:6:"broker";a:0:{}s:3:"caa";a:0:{}s:5:"cargo";a:0:{}s:8:"catering";a:0:{}s:13:"certification";a:0:{}s:12:"championship";a:0:{}s:7:"charter";a:0:{}s:13:"civilaviation";a:0:{}s:4:"club";a:0:{}s:10:"conference";a:0:{}s:10:"consultant";a:0:{}s:10:"consulting";a:0:{}s:7:"control";a:0:{}s:7:"council";a:0:{}s:4:"crew";a:0:{}s:6:"design";a:0:{}s:4:"dgca";a:0:{}s:8:"educator";a:0:{}s:9:"emergency";a:0:{}s:6:"engine";a:0:{}s:8:"engineer";a:0:{}s:13:"entertainment";a:0:{}s:9:"equipment";a:0:{}s:8:"exchange";a:0:{}s:7:"express";a:0:{}s:10:"federation";a:0:{}s:6:"flight";a:0:{}s:7:"freight";a:0:{}s:4:"fuel";a:0:{}s:7:"gliding";a:0:{}s:10:"government";a:0:{}s:14:"groundhandling";a:0:{}s:5:"group";a:0:{}s:11:"hanggliding";a:0:{}s:9:"homebuilt";a:0:{}s:9:"insurance";a:0:{}s:7:"journal";a:0:{}s:10:"journalist";a:0:{}s:7:"leasing";a:0:{}s:9:"logistics";a:0:{}s:8:"magazine";a:0:{}s:11:"maintenance";a:0:{}s:5:"media";a:0:{}s:10:"microlight";a:0:{}s:9:"modelling";a:0:{}s:10:"navigation";a:0:{}s:11:"parachuting";a:0:{}s:11:"paragliding";a:0:{}s:21:"passenger-association";a:0:{}s:5:"pilot";a:0:{}s:5:"press";a:0:{}s:10:"production";a:0:{}s:10:"recreation";a:0:{}s:7:"repbody";a:0:{}s:3:"res";a:0:{}s:8:"research";a:0:{}s:10:"rotorcraft";a:0:{}s:6:"safety";a:0:{}s:9:"scientist";a:0:{}s:8:"services";a:0:{}s:4:"show";a:0:{}s:9:"skydiving";a:0:{}s:8:"software";a:0:{}s:7:"student";a:0:{}s:6:"trader";a:0:{}s:7:"trading";a:0:{}s:7:"trainer";a:0:{}s:5:"union";a:0:{}s:12:"workinggroup";a:0:{}s:5:"works";a:0:{}}s:2:"af";a:5:{s:3:"gov";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}}s:2:"ag";a:5:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:2:"co";a:0:{}s:3:"nom";a:0:{}}s:2:"ai";a:4:{s:3:"off";a:0:{}s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"al";a:6:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"am";a:0:{}s:2:"ao";a:6:{s:2:"ed";a:0:{}s:2:"gv";a:0:{}s:2:"og";a:0:{}s:2:"co";a:0:{}s:2:"pb";a:0:{}s:2:"it";a:0:{}}s:2:"aq";a:0:{}s:2:"ar";a:10:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:3:"gov";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:6:"musica";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"tur";a:0:{}}s:4:"arpa";a:6:{s:4:"e164";a:0:{}s:7:"in-addr";a:0:{}s:3:"ip6";a:0:{}s:4:"iris";a:0:{}s:3:"uri";a:0:{}s:3:"urn";a:0:{}}s:2:"as";a:1:{s:3:"gov";a:0:{}}s:4:"asia";a:0:{}s:2:"at";a:4:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"gv";a:0:{}s:2:"or";a:0:{}}s:2:"au";a:18:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:8:{s:3:"act";a:0:{}s:3:"nsw";a:0:{}s:2:"nt";a:0:{}s:3:"qld";a:0:{}s:2:"sa";a:0:{}s:3:"tas";a:0:{}s:3:"vic";a:0:{}s:2:"wa";a:0:{}}s:3:"gov";a:5:{s:3:"qld";a:0:{}s:2:"sa";a:0:{}s:3:"tas";a:0:{}s:3:"vic";a:0:{}s:2:"wa";a:0:{}}s:3:"asn";a:0:{}s:2:"id";a:0:{}s:4:"info";a:0:{}s:4:"conf";a:0:{}s:2:"oz";a:0:{}s:3:"act";a:0:{}s:3:"nsw";a:0:{}s:2:"nt";a:0:{}s:3:"qld";a:0:{}s:2:"sa";a:0:{}s:3:"tas";a:0:{}s:3:"vic";a:0:{}s:2:"wa";a:0:{}}s:2:"aw";a:1:{s:3:"com";a:0:{}}s:2:"ax";a:0:{}s:2:"az";a:12:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"int";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:4:"info";a:0:{}s:2:"pp";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}s:3:"pro";a:0:{}s:3:"biz";a:0:{}}s:2:"ba";a:6:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"bb";a:10:{s:3:"biz";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:5:"store";a:0:{}s:2:"tv";a:0:{}}s:2:"bd";a:1:{s:1:"*";a:0:{}}s:2:"be";a:1:{s:2:"ac";a:0:{}}s:2:"bf";a:1:{s:3:"gov";a:0:{}}s:2:"bg";a:36:{s:1:"a";a:0:{}s:1:"b";a:0:{}s:1:"c";a:0:{}s:1:"d";a:0:{}s:1:"e";a:0:{}s:1:"f";a:0:{}s:1:"g";a:0:{}s:1:"h";a:0:{}s:1:"i";a:0:{}s:1:"j";a:0:{}s:1:"k";a:0:{}s:1:"l";a:0:{}s:1:"m";a:0:{}s:1:"n";a:0:{}s:1:"o";a:0:{}s:1:"p";a:0:{}s:1:"q";a:0:{}s:1:"r";a:0:{}s:1:"s";a:0:{}s:1:"t";a:0:{}s:1:"u";a:0:{}s:1:"v";a:0:{}s:1:"w";a:0:{}s:1:"x";a:0:{}s:1:"y";a:0:{}s:1:"z";a:0:{}i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}i:3;a:0:{}i:4;a:0:{}i:5;a:0:{}i:6;a:0:{}i:7;a:0:{}i:8;a:0:{}i:9;a:0:{}}s:2:"bh";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}}s:2:"bi";a:5:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:2:"or";a:0:{}s:3:"org";a:0:{}}s:3:"biz";a:0:{}s:2:"bj";a:3:{s:4:"asso";a:0:{}s:7:"barreau";a:0:{}s:4:"gouv";a:0:{}}s:2:"bm";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"bn";a:1:{s:1:"*";a:0:{}}s:2:"bo";a:9:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"gob";a:0:{}s:3:"int";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"mil";a:0:{}s:2:"tv";a:0:{}}s:2:"br";a:95:{s:3:"abc";a:0:{}s:3:"adm";a:0:{}s:3:"adv";a:0:{}s:3:"agr";a:0:{}s:3:"aju";a:0:{}s:2:"am";a:0:{}s:9:"aparecida";a:0:{}s:3:"arq";a:0:{}s:3:"art";a:0:{}s:3:"ato";a:0:{}s:1:"b";a:0:{}s:5:"belem";a:0:{}s:3:"bio";a:0:{}s:4:"blog";a:0:{}s:3:"bmd";a:0:{}s:3:"bsb";a:0:{}s:3:"cim";a:0:{}s:3:"cng";a:0:{}s:3:"cnt";a:0:{}s:3:"com";a:0:{}s:4:"coop";a:0:{}s:3:"cri";a:0:{}s:6:"cuiaba";a:0:{}s:3:"def";a:0:{}s:3:"ecn";a:0:{}s:3:"eco";a:0:{}s:3:"edu";a:0:{}s:3:"emp";a:0:{}s:3:"eng";a:0:{}s:3:"esp";a:0:{}s:3:"etc";a:0:{}s:3:"eti";a:0:{}s:3:"far";a:0:{}s:4:"flog";a:0:{}s:7:"floripa";a:0:{}s:6:"fortal";a:0:{}s:2:"fm";a:0:{}s:3:"fnd";a:0:{}s:3:"fot";a:0:{}s:3:"fst";a:0:{}s:3:"g12";a:0:{}s:3:"ggf";a:0:{}s:3:"gov";a:27:{s:2:"ac";a:0:{}s:2:"al";a:0:{}s:2:"am";a:0:{}s:2:"ap";a:0:{}s:2:"ba";a:0:{}s:2:"ce";a:0:{}s:2:"df";a:0:{}s:2:"es";a:0:{}s:2:"go";a:0:{}s:2:"ma";a:0:{}s:2:"mg";a:0:{}s:2:"ms";a:0:{}s:2:"mt";a:0:{}s:2:"pa";a:0:{}s:2:"pb";a:0:{}s:2:"pe";a:0:{}s:2:"pi";a:0:{}s:2:"pr";a:0:{}s:2:"rj";a:0:{}s:2:"rn";a:0:{}s:2:"ro";a:0:{}s:2:"rr";a:0:{}s:2:"rs";a:0:{}s:2:"sc";a:0:{}s:2:"se";a:0:{}s:2:"sp";a:0:{}s:2:"to";a:0:{}}s:3:"gru";a:0:{}s:3:"imb";a:0:{}s:3:"ind";a:0:{}s:3:"inf";a:0:{}s:5:"jampa";a:0:{}s:3:"jor";a:0:{}s:3:"jus";a:0:{}s:3:"leg";a:0:{}s:3:"lel";a:0:{}s:8:"londrina";a:0:{}s:6:"macapa";a:0:{}s:6:"maceio";a:0:{}s:3:"mat";a:0:{}s:3:"med";a:0:{}s:3:"mil";a:0:{}s:2:"mp";a:0:{}s:3:"mus";a:0:{}s:5:"natal";a:0:{}s:3:"net";a:0:{}s:7:"niteroi";a:0:{}s:3:"nom";a:1:{s:1:"*";a:0:{}}s:3:"not";a:0:{}s:3:"ntr";a:0:{}s:3:"odo";a:0:{}s:3:"org";a:0:{}s:6:"osasco";a:0:{}s:6:"palmas";a:0:{}s:3:"poa";a:0:{}s:3:"ppg";a:0:{}s:3:"pro";a:0:{}s:3:"psc";a:0:{}s:3:"psi";a:0:{}s:3:"qsl";a:0:{}s:5:"radio";a:0:{}s:3:"rec";a:0:{}s:6:"recife";a:0:{}s:9:"riobranco";a:0:{}s:3:"sjc";a:0:{}s:3:"slg";a:0:{}s:3:"srv";a:0:{}s:4:"taxi";a:0:{}s:3:"teo";a:0:{}s:3:"tmp";a:0:{}s:3:"trd";a:0:{}s:3:"tur";a:0:{}s:2:"tv";a:0:{}s:3:"udi";a:0:{}s:3:"vet";a:0:{}s:3:"vix";a:0:{}s:4:"vlog";a:0:{}s:4:"wiki";a:0:{}s:3:"zlg";a:0:{}}s:2:"bs";a:5:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}}s:2:"bt";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"bv";a:0:{}s:2:"bw";a:2:{s:2:"co";a:0:{}s:3:"org";a:0:{}}s:2:"by";a:4:{s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:0:{}s:2:"of";a:0:{}}s:2:"bz";a:5:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}}s:2:"ca";a:15:{s:2:"ab";a:0:{}s:2:"bc";a:0:{}s:2:"mb";a:0:{}s:2:"nb";a:0:{}s:2:"nf";a:0:{}s:2:"nl";a:0:{}s:2:"ns";a:0:{}s:2:"nt";a:0:{}s:2:"nu";a:0:{}s:2:"on";a:0:{}s:2:"pe";a:0:{}s:2:"qc";a:0:{}s:2:"sk";a:0:{}s:2:"yk";a:0:{}s:2:"gc";a:0:{}}s:3:"cat";a:0:{}s:2:"cc";a:0:{}s:2:"cd";a:1:{s:3:"gov";a:0:{}}s:2:"cf";a:0:{}s:2:"cg";a:0:{}s:2:"ch";a:0:{}s:2:"ci";a:15:{s:3:"org";a:0:{}s:2:"or";a:0:{}s:3:"com";a:0:{}s:2:"co";a:0:{}s:3:"edu";a:0:{}s:2:"ed";a:0:{}s:2:"ac";a:0:{}s:3:"net";a:0:{}s:2:"go";a:0:{}s:4:"asso";a:0:{}s:15:"xn--aroport-bya";a:0:{}s:3:"int";a:0:{}s:6:"presse";a:0:{}s:2:"md";a:0:{}s:4:"gouv";a:0:{}}s:2:"ck";a:2:{s:1:"*";a:0:{}s:3:"www";a:1:{s:1:"!";s:0:"";}}s:2:"cl";a:4:{s:3:"gov";a:0:{}s:3:"gob";a:0:{}s:2:"co";a:0:{}s:3:"mil";a:0:{}}s:2:"cm";a:4:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}}s:2:"cn";a:44:{s:2:"ac";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"mil";a:0:{}s:10:"xn--55qx5d";a:0:{}s:10:"xn--io0a7i";a:0:{}s:10:"xn--od0alg";a:0:{}s:2:"ah";a:0:{}s:2:"bj";a:0:{}s:2:"cq";a:0:{}s:2:"fj";a:0:{}s:2:"gd";a:0:{}s:2:"gs";a:0:{}s:2:"gz";a:0:{}s:2:"gx";a:0:{}s:2:"ha";a:0:{}s:2:"hb";a:0:{}s:2:"he";a:0:{}s:2:"hi";a:0:{}s:2:"hl";a:0:{}s:2:"hn";a:0:{}s:2:"jl";a:0:{}s:2:"js";a:0:{}s:2:"jx";a:0:{}s:2:"ln";a:0:{}s:2:"nm";a:0:{}s:2:"nx";a:0:{}s:2:"qh";a:0:{}s:2:"sc";a:0:{}s:2:"sd";a:0:{}s:2:"sh";a:0:{}s:2:"sn";a:0:{}s:2:"sx";a:0:{}s:2:"tj";a:0:{}s:2:"xj";a:0:{}s:2:"xz";a:0:{}s:2:"yn";a:0:{}s:2:"zj";a:0:{}s:2:"hk";a:0:{}s:2:"mo";a:0:{}s:2:"tw";a:0:{}}s:2:"co";a:13:{s:4:"arts";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:4:"firm";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"nom";a:0:{}s:3:"org";a:0:{}s:3:"rec";a:0:{}s:3:"web";a:0:{}}s:3:"com";a:0:{}s:4:"coop";a:0:{}s:2:"cr";a:7:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"ed";a:0:{}s:2:"fi";a:0:{}s:2:"go";a:0:{}s:2:"or";a:0:{}s:2:"sa";a:0:{}}s:2:"cu";a:6:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"inf";a:0:{}}s:2:"cv";a:0:{}s:2:"cw";a:4:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"cx";a:1:{s:3:"gov";a:0:{}}s:2:"cy";a:13:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:3:"com";a:0:{}s:7:"ekloges";a:0:{}s:3:"gov";a:0:{}s:3:"ltd";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:10:"parliament";a:0:{}s:5:"press";a:0:{}s:3:"pro";a:0:{}s:2:"tm";a:0:{}}s:2:"cz";a:0:{}s:2:"de";a:0:{}s:2:"dj";a:0:{}s:2:"dk";a:0:{}s:2:"dm";a:5:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}}s:2:"do";a:10:{s:3:"art";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sld";a:0:{}s:3:"web";a:0:{}}s:2:"dz";a:8:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:4:"asso";a:0:{}s:3:"pol";a:0:{}s:3:"art";a:0:{}}s:2:"ec";a:12:{s:3:"com";a:0:{}s:4:"info";a:0:{}s:3:"net";a:0:{}s:3:"fin";a:0:{}s:3:"k12";a:0:{}s:3:"med";a:0:{}s:3:"pro";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"gob";a:0:{}s:3:"mil";a:0:{}}s:3:"edu";a:0:{}s:2:"ee";a:10:{s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:4:"riik";a:0:{}s:3:"lib";a:0:{}s:3:"med";a:0:{}s:3:"com";a:0:{}s:3:"pri";a:0:{}s:3:"aip";a:0:{}s:3:"org";a:0:{}s:3:"fie";a:0:{}}s:2:"eg";a:9:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"eun";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sci";a:0:{}}s:2:"er";a:1:{s:1:"*";a:0:{}}s:2:"es";a:5:{s:3:"com";a:0:{}s:3:"nom";a:0:{}s:3:"org";a:0:{}s:3:"gob";a:0:{}s:3:"edu";a:0:{}}s:2:"et";a:8:{s:3:"com";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"biz";a:0:{}s:4:"name";a:0:{}s:4:"info";a:0:{}s:3:"net";a:0:{}}s:2:"eu";a:0:{}s:2:"fi";a:1:{s:5:"aland";a:0:{}}s:2:"fj";a:1:{s:1:"*";a:0:{}}s:2:"fk";a:1:{s:1:"*";a:0:{}}s:2:"fm";a:0:{}s:2:"fo";a:0:{}s:2:"fr";a:23:{s:3:"com";a:0:{}s:4:"asso";a:0:{}s:3:"nom";a:0:{}s:3:"prd";a:0:{}s:6:"presse";a:0:{}s:2:"tm";a:0:{}s:8:"aeroport";a:0:{}s:7:"assedic";a:0:{}s:6:"avocat";a:0:{}s:6:"avoues";a:0:{}s:3:"cci";a:0:{}s:9:"chambagri";a:0:{}s:21:"chirurgiens-dentistes";a:0:{}s:18:"experts-comptables";a:0:{}s:15:"geometre-expert";a:0:{}s:4:"gouv";a:0:{}s:5:"greta";a:0:{}s:16:"huissier-justice";a:0:{}s:7:"medecin";a:0:{}s:8:"notaires";a:0:{}s:10:"pharmacien";a:0:{}s:4:"port";a:0:{}s:11:"veterinaire";a:0:{}}s:2:"ga";a:0:{}s:2:"gb";a:0:{}s:2:"gd";a:0:{}s:2:"ge";a:7:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"pvt";a:0:{}}s:2:"gf";a:0:{}s:2:"gg";a:3:{s:2:"co";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"gh";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"mil";a:0:{}}s:2:"gi";a:6:{s:3:"com";a:0:{}s:3:"ltd";a:0:{}s:3:"gov";a:0:{}s:3:"mod";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}}s:2:"gl";a:5:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"gm";a:0:{}s:2:"gn";a:6:{s:2:"ac";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}}s:3:"gov";a:0:{}s:2:"gp";a:6:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:4:"mobi";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:4:"asso";a:0:{}}s:2:"gq";a:0:{}s:2:"gr";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}}s:2:"gs";a:0:{}s:2:"gt";a:7:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:3:"ind";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"gu";a:1:{s:1:"*";a:0:{}}s:2:"gw";a:0:{}s:2:"gy";a:6:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"hk";a:21:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"idv";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:10:"xn--55qx5d";a:0:{}s:11:"xn--wcvs22d";a:0:{}s:11:"xn--lcvr32d";a:0:{}s:10:"xn--mxtq1m";a:0:{}s:10:"xn--gmqw5a";a:0:{}s:9:"xn--ciqpn";a:0:{}s:11:"xn--gmq050i";a:0:{}s:10:"xn--zf0avx";a:0:{}s:10:"xn--io0a7i";a:0:{}s:10:"xn--mk0axi";a:0:{}s:10:"xn--od0alg";a:0:{}s:11:"xn--od0aq3b";a:0:{}s:9:"xn--tn0ag";a:0:{}s:10:"xn--uc0atv";a:0:{}s:11:"xn--uc0ay4a";a:0:{}}s:2:"hm";a:0:{}s:2:"hn";a:6:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"mil";a:0:{}s:3:"gob";a:0:{}}s:2:"hr";a:4:{s:2:"iz";a:0:{}s:4:"from";a:0:{}s:4:"name";a:0:{}s:3:"com";a:0:{}}s:2:"ht";a:17:{s:3:"com";a:0:{}s:4:"shop";a:0:{}s:4:"firm";a:0:{}s:4:"info";a:0:{}s:5:"adult";a:0:{}s:3:"net";a:0:{}s:3:"pro";a:0:{}s:3:"org";a:0:{}s:3:"med";a:0:{}s:3:"art";a:0:{}s:4:"coop";a:0:{}s:3:"pol";a:0:{}s:4:"asso";a:0:{}s:3:"edu";a:0:{}s:3:"rel";a:0:{}s:4:"gouv";a:0:{}s:5:"perso";a:0:{}}s:2:"hu";a:31:{s:2:"co";a:0:{}s:4:"info";a:0:{}s:3:"org";a:0:{}s:4:"priv";a:0:{}s:5:"sport";a:0:{}s:2:"tm";a:0:{}i:2000;a:0:{}s:5:"agrar";a:0:{}s:4:"bolt";a:0:{}s:6:"casino";a:0:{}s:4:"city";a:0:{}s:7:"erotica";a:0:{}s:7:"erotika";a:0:{}s:4:"film";a:0:{}s:5:"forum";a:0:{}s:5:"games";a:0:{}s:5:"hotel";a:0:{}s:8:"ingatlan";a:0:{}s:6:"jogasz";a:0:{}s:8:"konyvelo";a:0:{}s:5:"lakas";a:0:{}s:5:"media";a:0:{}s:4:"news";a:0:{}s:6:"reklam";a:0:{}s:3:"sex";a:0:{}s:4:"shop";a:0:{}s:4:"suli";a:0:{}s:4:"szex";a:0:{}s:6:"tozsde";a:0:{}s:6:"utazas";a:0:{}s:5:"video";a:0:{}}s:2:"id";a:11:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:4:"desa";a:0:{}s:2:"go";a:0:{}s:3:"mil";a:0:{}s:2:"my";a:0:{}s:3:"net";a:0:{}s:2:"or";a:0:{}s:3:"sch";a:0:{}s:3:"web";a:0:{}}s:2:"ie";a:1:{s:3:"gov";a:0:{}}s:2:"il";a:8:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:3:"gov";a:0:{}s:3:"idf";a:0:{}s:3:"k12";a:0:{}s:4:"muni";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"im";a:7:{s:2:"ac";a:0:{}s:2:"co";a:2:{s:3:"ltd";a:0:{}s:3:"plc";a:0:{}}s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:2:"tt";a:0:{}s:2:"tv";a:0:{}}s:2:"in";a:12:{s:2:"co";a:0:{}s:4:"firm";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gen";a:0:{}s:3:"ind";a:0:{}s:3:"nic";a:0:{}s:2:"ac";a:0:{}s:3:"edu";a:0:{}s:3:"res";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}}s:4:"info";a:0:{}s:3:"int";a:1:{s:2:"eu";a:0:{}}s:2:"io";a:1:{s:3:"com";a:0:{}}s:2:"iq";a:6:{s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}}s:2:"ir";a:9:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:3:"gov";a:0:{}s:2:"id";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sch";a:0:{}s:15:"xn--mgba3a4f16a";a:0:{}s:14:"xn--mgba3a4fra";a:0:{}}s:2:"is";a:6:{s:3:"net";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"int";a:0:{}}s:2:"it";a:368:{s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"abr";a:0:{}s:7:"abruzzo";a:0:{}s:12:"aosta-valley";a:0:{}s:11:"aostavalley";a:0:{}s:3:"bas";a:0:{}s:10:"basilicata";a:0:{}s:3:"cal";a:0:{}s:8:"calabria";a:0:{}s:3:"cam";a:0:{}s:8:"campania";a:0:{}s:14:"emilia-romagna";a:0:{}s:13:"emiliaromagna";a:0:{}s:3:"emr";a:0:{}s:15:"friuli-v-giulia";a:0:{}s:16:"friuli-ve-giulia";a:0:{}s:15:"friuli-vegiulia";a:0:{}s:21:"friuli-venezia-giulia";a:0:{}s:20:"friuli-veneziagiulia";a:0:{}s:14:"friuli-vgiulia";a:0:{}s:14:"friuliv-giulia";a:0:{}s:15:"friulive-giulia";a:0:{}s:14:"friulivegiulia";a:0:{}s:20:"friulivenezia-giulia";a:0:{}s:19:"friuliveneziagiulia";a:0:{}s:13:"friulivgiulia";a:0:{}s:3:"fvg";a:0:{}s:3:"laz";a:0:{}s:5:"lazio";a:0:{}s:3:"lig";a:0:{}s:7:"liguria";a:0:{}s:3:"lom";a:0:{}s:9:"lombardia";a:0:{}s:8:"lombardy";a:0:{}s:7:"lucania";a:0:{}s:3:"mar";a:0:{}s:6:"marche";a:0:{}s:3:"mol";a:0:{}s:6:"molise";a:0:{}s:8:"piedmont";a:0:{}s:8:"piemonte";a:0:{}s:3:"pmn";a:0:{}s:3:"pug";a:0:{}s:6:"puglia";a:0:{}s:3:"sar";a:0:{}s:8:"sardegna";a:0:{}s:8:"sardinia";a:0:{}s:3:"sic";a:0:{}s:7:"sicilia";a:0:{}s:6:"sicily";a:0:{}s:3:"taa";a:0:{}s:3:"tos";a:0:{}s:7:"toscana";a:0:{}s:16:"trentino-a-adige";a:0:{}s:15:"trentino-aadige";a:0:{}s:19:"trentino-alto-adige";a:0:{}s:18:"trentino-altoadige";a:0:{}s:16:"trentino-s-tirol";a:0:{}s:15:"trentino-stirol";a:0:{}s:18:"trentino-sud-tirol";a:0:{}s:17:"trentino-sudtirol";a:0:{}s:19:"trentino-sued-tirol";a:0:{}s:18:"trentino-suedtirol";a:0:{}s:15:"trentinoa-adige";a:0:{}s:14:"trentinoaadige";a:0:{}s:18:"trentinoalto-adige";a:0:{}s:17:"trentinoaltoadige";a:0:{}s:15:"trentinos-tirol";a:0:{}s:14:"trentinostirol";a:0:{}s:17:"trentinosud-tirol";a:0:{}s:16:"trentinosudtirol";a:0:{}s:18:"trentinosued-tirol";a:0:{}s:17:"trentinosuedtirol";a:0:{}s:7:"tuscany";a:0:{}s:3:"umb";a:0:{}s:6:"umbria";a:0:{}s:11:"val-d-aosta";a:0:{}s:10:"val-daosta";a:0:{}s:10:"vald-aosta";a:0:{}s:9:"valdaosta";a:0:{}s:11:"valle-aosta";a:0:{}s:13:"valle-d-aosta";a:0:{}s:12:"valle-daosta";a:0:{}s:10:"valleaosta";a:0:{}s:12:"valled-aosta";a:0:{}s:11:"valledaosta";a:0:{}s:12:"vallee-aoste";a:0:{}s:11:"valleeaoste";a:0:{}s:3:"vao";a:0:{}s:3:"vda";a:0:{}s:3:"ven";a:0:{}s:6:"veneto";a:0:{}s:2:"ag";a:0:{}s:9:"agrigento";a:0:{}s:2:"al";a:0:{}s:11:"alessandria";a:0:{}s:10:"alto-adige";a:0:{}s:9:"altoadige";a:0:{}s:2:"an";a:0:{}s:6:"ancona";a:0:{}s:21:"andria-barletta-trani";a:0:{}s:21:"andria-trani-barletta";a:0:{}s:19:"andriabarlettatrani";a:0:{}s:19:"andriatranibarletta";a:0:{}s:2:"ao";a:0:{}s:5:"aosta";a:0:{}s:5:"aoste";a:0:{}s:2:"ap";a:0:{}s:2:"aq";a:0:{}s:6:"aquila";a:0:{}s:2:"ar";a:0:{}s:6:"arezzo";a:0:{}s:13:"ascoli-piceno";a:0:{}s:12:"ascolipiceno";a:0:{}s:4:"asti";a:0:{}s:2:"at";a:0:{}s:2:"av";a:0:{}s:8:"avellino";a:0:{}s:2:"ba";a:0:{}s:6:"balsan";a:0:{}s:4:"bari";a:0:{}s:21:"barletta-trani-andria";a:0:{}s:19:"barlettatraniandria";a:0:{}s:7:"belluno";a:0:{}s:9:"benevento";a:0:{}s:7:"bergamo";a:0:{}s:2:"bg";a:0:{}s:2:"bi";a:0:{}s:6:"biella";a:0:{}s:2:"bl";a:0:{}s:2:"bn";a:0:{}s:2:"bo";a:0:{}s:7:"bologna";a:0:{}s:7:"bolzano";a:0:{}s:5:"bozen";a:0:{}s:2:"br";a:0:{}s:7:"brescia";a:0:{}s:8:"brindisi";a:0:{}s:2:"bs";a:0:{}s:2:"bt";a:0:{}s:2:"bz";a:0:{}s:2:"ca";a:0:{}s:8:"cagliari";a:0:{}s:13:"caltanissetta";a:0:{}s:15:"campidano-medio";a:0:{}s:14:"campidanomedio";a:0:{}s:10:"campobasso";a:0:{}s:17:"carbonia-iglesias";a:0:{}s:16:"carboniaiglesias";a:0:{}s:13:"carrara-massa";a:0:{}s:12:"carraramassa";a:0:{}s:7:"caserta";a:0:{}s:7:"catania";a:0:{}s:9:"catanzaro";a:0:{}s:2:"cb";a:0:{}s:2:"ce";a:0:{}s:12:"cesena-forli";a:0:{}s:11:"cesenaforli";a:0:{}s:2:"ch";a:0:{}s:6:"chieti";a:0:{}s:2:"ci";a:0:{}s:2:"cl";a:0:{}s:2:"cn";a:0:{}s:2:"co";a:0:{}s:4:"como";a:0:{}s:7:"cosenza";a:0:{}s:2:"cr";a:0:{}s:7:"cremona";a:0:{}s:7:"crotone";a:0:{}s:2:"cs";a:0:{}s:2:"ct";a:0:{}s:5:"cuneo";a:0:{}s:2:"cz";a:0:{}s:14:"dell-ogliastra";a:0:{}s:13:"dellogliastra";a:0:{}s:2:"en";a:0:{}s:4:"enna";a:0:{}s:2:"fc";a:0:{}s:2:"fe";a:0:{}s:5:"fermo";a:0:{}s:7:"ferrara";a:0:{}s:2:"fg";a:0:{}s:2:"fi";a:0:{}s:7:"firenze";a:0:{}s:8:"florence";a:0:{}s:2:"fm";a:0:{}s:6:"foggia";a:0:{}s:12:"forli-cesena";a:0:{}s:11:"forlicesena";a:0:{}s:2:"fr";a:0:{}s:9:"frosinone";a:0:{}s:2:"ge";a:0:{}s:5:"genoa";a:0:{}s:6:"genova";a:0:{}s:2:"go";a:0:{}s:7:"gorizia";a:0:{}s:2:"gr";a:0:{}s:8:"grosseto";a:0:{}s:17:"iglesias-carbonia";a:0:{}s:16:"iglesiascarbonia";a:0:{}s:2:"im";a:0:{}s:7:"imperia";a:0:{}s:2:"is";a:0:{}s:7:"isernia";a:0:{}s:2:"kr";a:0:{}s:9:"la-spezia";a:0:{}s:7:"laquila";a:0:{}s:8:"laspezia";a:0:{}s:6:"latina";a:0:{}s:2:"lc";a:0:{}s:2:"le";a:0:{}s:5:"lecce";a:0:{}s:5:"lecco";a:0:{}s:2:"li";a:0:{}s:7:"livorno";a:0:{}s:2:"lo";a:0:{}s:4:"lodi";a:0:{}s:2:"lt";a:0:{}s:2:"lu";a:0:{}s:5:"lucca";a:0:{}s:8:"macerata";a:0:{}s:7:"mantova";a:0:{}s:13:"massa-carrara";a:0:{}s:12:"massacarrara";a:0:{}s:6:"matera";a:0:{}s:2:"mb";a:0:{}s:2:"mc";a:0:{}s:2:"me";a:0:{}s:15:"medio-campidano";a:0:{}s:14:"mediocampidano";a:0:{}s:7:"messina";a:0:{}s:2:"mi";a:0:{}s:5:"milan";a:0:{}s:6:"milano";a:0:{}s:2:"mn";a:0:{}s:2:"mo";a:0:{}s:6:"modena";a:0:{}s:13:"monza-brianza";a:0:{}s:21:"monza-e-della-brianza";a:0:{}s:5:"monza";a:0:{}s:12:"monzabrianza";a:0:{}s:13:"monzaebrianza";a:0:{}s:18:"monzaedellabrianza";a:0:{}s:2:"ms";a:0:{}s:2:"mt";a:0:{}s:2:"na";a:0:{}s:6:"naples";a:0:{}s:6:"napoli";a:0:{}s:2:"no";a:0:{}s:6:"novara";a:0:{}s:2:"nu";a:0:{}s:5:"nuoro";a:0:{}s:2:"og";a:0:{}s:9:"ogliastra";a:0:{}s:12:"olbia-tempio";a:0:{}s:11:"olbiatempio";a:0:{}s:2:"or";a:0:{}s:8:"oristano";a:0:{}s:2:"ot";a:0:{}s:2:"pa";a:0:{}s:6:"padova";a:0:{}s:5:"padua";a:0:{}s:7:"palermo";a:0:{}s:5:"parma";a:0:{}s:5:"pavia";a:0:{}s:2:"pc";a:0:{}s:2:"pd";a:0:{}s:2:"pe";a:0:{}s:7:"perugia";a:0:{}s:13:"pesaro-urbino";a:0:{}s:12:"pesarourbino";a:0:{}s:7:"pescara";a:0:{}s:2:"pg";a:0:{}s:2:"pi";a:0:{}s:8:"piacenza";a:0:{}s:4:"pisa";a:0:{}s:7:"pistoia";a:0:{}s:2:"pn";a:0:{}s:2:"po";a:0:{}s:9:"pordenone";a:0:{}s:7:"potenza";a:0:{}s:2:"pr";a:0:{}s:5:"prato";a:0:{}s:2:"pt";a:0:{}s:2:"pu";a:0:{}s:2:"pv";a:0:{}s:2:"pz";a:0:{}s:2:"ra";a:0:{}s:6:"ragusa";a:0:{}s:7:"ravenna";a:0:{}s:2:"rc";a:0:{}s:2:"re";a:0:{}s:15:"reggio-calabria";a:0:{}s:13:"reggio-emilia";a:0:{}s:14:"reggiocalabria";a:0:{}s:12:"reggioemilia";a:0:{}s:2:"rg";a:0:{}s:2:"ri";a:0:{}s:5:"rieti";a:0:{}s:6:"rimini";a:0:{}s:2:"rm";a:0:{}s:2:"rn";a:0:{}s:2:"ro";a:0:{}s:4:"roma";a:0:{}s:4:"rome";a:0:{}s:6:"rovigo";a:0:{}s:2:"sa";a:0:{}s:7:"salerno";a:0:{}s:7:"sassari";a:0:{}s:6:"savona";a:0:{}s:2:"si";a:0:{}s:5:"siena";a:0:{}s:8:"siracusa";a:0:{}s:2:"so";a:0:{}s:7:"sondrio";a:0:{}s:2:"sp";a:0:{}s:2:"sr";a:0:{}s:2:"ss";a:0:{}s:9:"suedtirol";a:0:{}s:2:"sv";a:0:{}s:2:"ta";a:0:{}s:7:"taranto";a:0:{}s:2:"te";a:0:{}s:12:"tempio-olbia";a:0:{}s:11:"tempioolbia";a:0:{}s:6:"teramo";a:0:{}s:5:"terni";a:0:{}s:2:"tn";a:0:{}s:2:"to";a:0:{}s:6:"torino";a:0:{}s:2:"tp";a:0:{}s:2:"tr";a:0:{}s:21:"trani-andria-barletta";a:0:{}s:21:"trani-barletta-andria";a:0:{}s:19:"traniandriabarletta";a:0:{}s:19:"tranibarlettaandria";a:0:{}s:7:"trapani";a:0:{}s:8:"trentino";a:0:{}s:6:"trento";a:0:{}s:7:"treviso";a:0:{}s:7:"trieste";a:0:{}s:2:"ts";a:0:{}s:5:"turin";a:0:{}s:2:"tv";a:0:{}s:2:"ud";a:0:{}s:5:"udine";a:0:{}s:13:"urbino-pesaro";a:0:{}s:12:"urbinopesaro";a:0:{}s:2:"va";a:0:{}s:6:"varese";a:0:{}s:2:"vb";a:0:{}s:2:"vc";a:0:{}s:2:"ve";a:0:{}s:7:"venezia";a:0:{}s:6:"venice";a:0:{}s:8:"verbania";a:0:{}s:8:"vercelli";a:0:{}s:6:"verona";a:0:{}s:2:"vi";a:0:{}s:13:"vibo-valentia";a:0:{}s:12:"vibovalentia";a:0:{}s:7:"vicenza";a:0:{}s:7:"viterbo";a:0:{}s:2:"vr";a:0:{}s:2:"vs";a:0:{}s:2:"vt";a:0:{}s:2:"vv";a:0:{}}s:2:"je";a:3:{s:2:"co";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"jm";a:1:{s:1:"*";a:0:{}}s:2:"jo";a:8:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}s:3:"sch";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}}s:4:"jobs";a:0:{}s:2:"jp";a:110:{s:2:"ac";a:0:{}s:2:"ad";a:0:{}s:2:"co";a:0:{}s:2:"ed";a:0:{}s:2:"go";a:0:{}s:2:"gr";a:0:{}s:2:"lg";a:0:{}s:2:"ne";a:0:{}s:2:"or";a:0:{}s:5:"aichi";a:52:{s:5:"aisai";a:0:{}s:3:"ama";a:0:{}s:4:"anjo";a:0:{}s:5:"asuke";a:0:{}s:6:"chiryu";a:0:{}s:5:"chita";a:0:{}s:4:"fuso";a:0:{}s:8:"gamagori";a:0:{}s:5:"handa";a:0:{}s:4:"hazu";a:0:{}s:7:"hekinan";a:0:{}s:10:"higashiura";a:0:{}s:10:"ichinomiya";a:0:{}s:7:"inazawa";a:0:{}s:7:"inuyama";a:0:{}s:7:"isshiki";a:0:{}s:7:"iwakura";a:0:{}s:5:"kanie";a:0:{}s:6:"kariya";a:0:{}s:7:"kasugai";a:0:{}s:4:"kira";a:0:{}s:6:"kiyosu";a:0:{}s:6:"komaki";a:0:{}s:5:"konan";a:0:{}s:4:"kota";a:0:{}s:6:"mihama";a:0:{}s:7:"miyoshi";a:0:{}s:6:"nishio";a:0:{}s:7:"nisshin";a:0:{}s:3:"obu";a:0:{}s:6:"oguchi";a:0:{}s:5:"oharu";a:0:{}s:7:"okazaki";a:0:{}s:10:"owariasahi";a:0:{}s:4:"seto";a:0:{}s:8:"shikatsu";a:0:{}s:9:"shinshiro";a:0:{}s:7:"shitara";a:0:{}s:6:"tahara";a:0:{}s:8:"takahama";a:0:{}s:9:"tobishima";a:0:{}s:4:"toei";a:0:{}s:4:"togo";a:0:{}s:5:"tokai";a:0:{}s:8:"tokoname";a:0:{}s:7:"toyoake";a:0:{}s:9:"toyohashi";a:0:{}s:8:"toyokawa";a:0:{}s:6:"toyone";a:0:{}s:6:"toyota";a:0:{}s:8:"tsushima";a:0:{}s:6:"yatomi";a:0:{}}s:5:"akita";a:28:{s:5:"akita";a:0:{}s:6:"daisen";a:0:{}s:8:"fujisato";a:0:{}s:6:"gojome";a:0:{}s:11:"hachirogata";a:0:{}s:6:"happou";a:0:{}s:13:"higashinaruse";a:0:{}s:5:"honjo";a:0:{}s:6:"honjyo";a:0:{}s:5:"ikawa";a:0:{}s:9:"kamikoani";a:0:{}s:7:"kamioka";a:0:{}s:8:"katagami";a:0:{}s:6:"kazuno";a:0:{}s:9:"kitaakita";a:0:{}s:6:"kosaka";a:0:{}s:5:"kyowa";a:0:{}s:6:"misato";a:0:{}s:6:"mitane";a:0:{}s:9:"moriyoshi";a:0:{}s:6:"nikaho";a:0:{}s:7:"noshiro";a:0:{}s:5:"odate";a:0:{}s:3:"oga";a:0:{}s:5:"ogata";a:0:{}s:7:"semboku";a:0:{}s:6:"yokote";a:0:{}s:9:"yurihonjo";a:0:{}}s:6:"aomori";a:22:{s:6:"aomori";a:0:{}s:6:"gonohe";a:0:{}s:9:"hachinohe";a:0:{}s:9:"hashikami";a:0:{}s:7:"hiranai";a:0:{}s:8:"hirosaki";a:0:{}s:9:"itayanagi";a:0:{}s:8:"kuroishi";a:0:{}s:6:"misawa";a:0:{}s:5:"mutsu";a:0:{}s:10:"nakadomari";a:0:{}s:6:"noheji";a:0:{}s:6:"oirase";a:0:{}s:5:"owani";a:0:{}s:8:"rokunohe";a:0:{}s:7:"sannohe";a:0:{}s:10:"shichinohe";a:0:{}s:6:"shingo";a:0:{}s:5:"takko";a:0:{}s:6:"towada";a:0:{}s:7:"tsugaru";a:0:{}s:7:"tsuruta";a:0:{}}s:5:"chiba";a:58:{s:5:"abiko";a:0:{}s:5:"asahi";a:0:{}s:6:"chonan";a:0:{}s:6:"chosei";a:0:{}s:6:"choshi";a:0:{}s:4:"chuo";a:0:{}s:9:"funabashi";a:0:{}s:6:"futtsu";a:0:{}s:10:"hanamigawa";a:0:{}s:8:"ichihara";a:0:{}s:8:"ichikawa";a:0:{}s:10:"ichinomiya";a:0:{}s:5:"inzai";a:0:{}s:5:"isumi";a:0:{}s:8:"kamagaya";a:0:{}s:8:"kamogawa";a:0:{}s:7:"kashiwa";a:0:{}s:6:"katori";a:0:{}s:8:"katsuura";a:0:{}s:7:"kimitsu";a:0:{}s:8:"kisarazu";a:0:{}s:6:"kozaki";a:0:{}s:8:"kujukuri";a:0:{}s:6:"kyonan";a:0:{}s:7:"matsudo";a:0:{}s:6:"midori";a:0:{}s:6:"mihama";a:0:{}s:10:"minamiboso";a:0:{}s:6:"mobara";a:0:{}s:9:"mutsuzawa";a:0:{}s:6:"nagara";a:0:{}s:10:"nagareyama";a:0:{}s:9:"narashino";a:0:{}s:6:"narita";a:0:{}s:4:"noda";a:0:{}s:13:"oamishirasato";a:0:{}s:7:"omigawa";a:0:{}s:6:"onjuku";a:0:{}s:5:"otaki";a:0:{}s:5:"sakae";a:0:{}s:6:"sakura";a:0:{}s:9:"shimofusa";a:0:{}s:7:"shirako";a:0:{}s:6:"shiroi";a:0:{}s:6:"shisui";a:0:{}s:9:"sodegaura";a:0:{}s:4:"sosa";a:0:{}s:4:"tako";a:0:{}s:8:"tateyama";a:0:{}s:6:"togane";a:0:{}s:8:"tohnosho";a:0:{}s:8:"tomisato";a:0:{}s:7:"urayasu";a:0:{}s:9:"yachimata";a:0:{}s:7:"yachiyo";a:0:{}s:10:"yokaichiba";a:0:{}s:15:"yokoshibahikari";a:0:{}s:10:"yotsukaido";a:0:{}}s:5:"ehime";a:22:{s:5:"ainan";a:0:{}s:5:"honai";a:0:{}s:5:"ikata";a:0:{}s:7:"imabari";a:0:{}s:3:"iyo";a:0:{}s:8:"kamijima";a:0:{}s:6:"kihoku";a:0:{}s:9:"kumakogen";a:0:{}s:6:"masaki";a:0:{}s:7:"matsuno";a:0:{}s:9:"matsuyama";a:0:{}s:8:"namikata";a:0:{}s:7:"niihama";a:0:{}s:3:"ozu";a:0:{}s:5:"saijo";a:0:{}s:5:"seiyo";a:0:{}s:11:"shikokuchuo";a:0:{}s:4:"tobe";a:0:{}s:4:"toon";a:0:{}s:6:"uchiko";a:0:{}s:7:"uwajima";a:0:{}s:10:"yawatahama";a:0:{}}s:5:"fukui";a:15:{s:7:"echizen";a:0:{}s:7:"eiheiji";a:0:{}s:5:"fukui";a:0:{}s:5:"ikeda";a:0:{}s:9:"katsuyama";a:0:{}s:6:"mihama";a:0:{}s:13:"minamiechizen";a:0:{}s:5:"obama";a:0:{}s:3:"ohi";a:0:{}s:3:"ono";a:0:{}s:5:"sabae";a:0:{}s:5:"sakai";a:0:{}s:8:"takahama";a:0:{}s:7:"tsuruga";a:0:{}s:6:"wakasa";a:0:{}}s:7:"fukuoka";a:63:{s:6:"ashiya";a:0:{}s:5:"buzen";a:0:{}s:7:"chikugo";a:0:{}s:7:"chikuho";a:0:{}s:7:"chikujo";a:0:{}s:10:"chikushino";a:0:{}s:8:"chikuzen";a:0:{}s:4:"chuo";a:0:{}s:7:"dazaifu";a:0:{}s:7:"fukuchi";a:0:{}s:6:"hakata";a:0:{}s:7:"higashi";a:0:{}s:8:"hirokawa";a:0:{}s:8:"hisayama";a:0:{}s:6:"iizuka";a:0:{}s:8:"inatsuki";a:0:{}s:4:"kaho";a:0:{}s:6:"kasuga";a:0:{}s:6:"kasuya";a:0:{}s:6:"kawara";a:0:{}s:6:"keisen";a:0:{}s:4:"koga";a:0:{}s:6:"kurate";a:0:{}s:6:"kurogi";a:0:{}s:6:"kurume";a:0:{}s:6:"minami";a:0:{}s:6:"miyako";a:0:{}s:6:"miyama";a:0:{}s:8:"miyawaka";a:0:{}s:8:"mizumaki";a:0:{}s:8:"munakata";a:0:{}s:8:"nakagawa";a:0:{}s:6:"nakama";a:0:{}s:5:"nishi";a:0:{}s:6:"nogata";a:0:{}s:5:"ogori";a:0:{}s:7:"okagaki";a:0:{}s:5:"okawa";a:0:{}s:3:"oki";a:0:{}s:5:"omuta";a:0:{}s:4:"onga";a:0:{}s:5:"onojo";a:0:{}s:3:"oto";a:0:{}s:7:"saigawa";a:0:{}s:8:"sasaguri";a:0:{}s:6:"shingu";a:0:{}s:13:"shinyoshitomi";a:0:{}s:6:"shonai";a:0:{}s:5:"soeda";a:0:{}s:3:"sue";a:0:{}s:9:"tachiarai";a:0:{}s:6:"tagawa";a:0:{}s:6:"takata";a:0:{}s:4:"toho";a:0:{}s:7:"toyotsu";a:0:{}s:6:"tsuiki";a:0:{}s:5:"ukiha";a:0:{}s:3:"umi";a:0:{}s:4:"usui";a:0:{}s:6:"yamada";a:0:{}s:4:"yame";a:0:{}s:8:"yanagawa";a:0:{}s:9:"yukuhashi";a:0:{}}s:9:"fukushima";a:51:{s:9:"aizubange";a:0:{}s:10:"aizumisato";a:0:{}s:13:"aizuwakamatsu";a:0:{}s:7:"asakawa";a:0:{}s:6:"bandai";a:0:{}s:4:"date";a:0:{}s:9:"fukushima";a:0:{}s:8:"furudono";a:0:{}s:6:"futaba";a:0:{}s:6:"hanawa";a:0:{}s:7:"higashi";a:0:{}s:6:"hirata";a:0:{}s:6:"hirono";a:0:{}s:6:"iitate";a:0:{}s:10:"inawashiro";a:0:{}s:8:"ishikawa";a:0:{}s:5:"iwaki";a:0:{}s:9:"izumizaki";a:0:{}s:10:"kagamiishi";a:0:{}s:8:"kaneyama";a:0:{}s:8:"kawamata";a:0:{}s:8:"kitakata";a:0:{}s:12:"kitashiobara";a:0:{}s:5:"koori";a:0:{}s:8:"koriyama";a:0:{}s:6:"kunimi";a:0:{}s:6:"miharu";a:0:{}s:7:"mishima";a:0:{}s:5:"namie";a:0:{}s:5:"nango";a:0:{}s:9:"nishiaizu";a:0:{}s:7:"nishigo";a:0:{}s:5:"okuma";a:0:{}s:7:"omotego";a:0:{}s:3:"ono";a:0:{}s:5:"otama";a:0:{}s:8:"samegawa";a:0:{}s:7:"shimogo";a:0:{}s:9:"shirakawa";a:0:{}s:5:"showa";a:0:{}s:4:"soma";a:0:{}s:8:"sukagawa";a:0:{}s:7:"taishin";a:0:{}s:8:"tamakawa";a:0:{}s:8:"tanagura";a:0:{}s:5:"tenei";a:0:{}s:6:"yabuki";a:0:{}s:6:"yamato";a:0:{}s:9:"yamatsuri";a:0:{}s:7:"yanaizu";a:0:{}s:6:"yugawa";a:0:{}}s:4:"gifu";a:38:{s:7:"anpachi";a:0:{}s:3:"ena";a:0:{}s:4:"gifu";a:0:{}s:5:"ginan";a:0:{}s:4:"godo";a:0:{}s:4:"gujo";a:0:{}s:7:"hashima";a:0:{}s:7:"hichiso";a:0:{}s:4:"hida";a:0:{}s:16:"higashishirakawa";a:0:{}s:7:"ibigawa";a:0:{}s:5:"ikeda";a:0:{}s:12:"kakamigahara";a:0:{}s:4:"kani";a:0:{}s:8:"kasahara";a:0:{}s:9:"kasamatsu";a:0:{}s:6:"kawaue";a:0:{}s:8:"kitagata";a:0:{}s:4:"mino";a:0:{}s:8:"minokamo";a:0:{}s:6:"mitake";a:0:{}s:8:"mizunami";a:0:{}s:6:"motosu";a:0:{}s:11:"nakatsugawa";a:0:{}s:5:"ogaki";a:0:{}s:8:"sakahogi";a:0:{}s:4:"seki";a:0:{}s:10:"sekigahara";a:0:{}s:9:"shirakawa";a:0:{}s:6:"tajimi";a:0:{}s:8:"takayama";a:0:{}s:5:"tarui";a:0:{}s:4:"toki";a:0:{}s:6:"tomika";a:0:{}s:8:"wanouchi";a:0:{}s:8:"yamagata";a:0:{}s:6:"yaotsu";a:0:{}s:4:"yoro";a:0:{}}s:5:"gunma";a:36:{s:6:"annaka";a:0:{}s:7:"chiyoda";a:0:{}s:7:"fujioka";a:0:{}s:15:"higashiagatsuma";a:0:{}s:7:"isesaki";a:0:{}s:7:"itakura";a:0:{}s:5:"kanna";a:0:{}s:5:"kanra";a:0:{}s:9:"katashina";a:0:{}s:6:"kawaba";a:0:{}s:5:"kiryu";a:0:{}s:7:"kusatsu";a:0:{}s:8:"maebashi";a:0:{}s:5:"meiwa";a:0:{}s:6:"midori";a:0:{}s:8:"minakami";a:0:{}s:10:"naganohara";a:0:{}s:8:"nakanojo";a:0:{}s:7:"nanmoku";a:0:{}s:6:"numata";a:0:{}s:6:"oizumi";a:0:{}s:3:"ora";a:0:{}s:3:"ota";a:0:{}s:9:"shibukawa";a:0:{}s:9:"shimonita";a:0:{}s:6:"shinto";a:0:{}s:5:"showa";a:0:{}s:8:"takasaki";a:0:{}s:8:"takayama";a:0:{}s:8:"tamamura";a:0:{}s:11:"tatebayashi";a:0:{}s:7:"tomioka";a:0:{}s:9:"tsukiyono";a:0:{}s:8:"tsumagoi";a:0:{}s:4:"ueno";a:0:{}s:8:"yoshioka";a:0:{}}s:9:"hiroshima";a:25:{s:9:"asaminami";a:0:{}s:5:"daiwa";a:0:{}s:7:"etajima";a:0:{}s:5:"fuchu";a:0:{}s:8:"fukuyama";a:0:{}s:11:"hatsukaichi";a:0:{}s:16:"higashihiroshima";a:0:{}s:5:"hongo";a:0:{}s:12:"jinsekikogen";a:0:{}s:5:"kaita";a:0:{}s:3:"kui";a:0:{}s:6:"kumano";a:0:{}s:4:"kure";a:0:{}s:6:"mihara";a:0:{}s:7:"miyoshi";a:0:{}s:4:"naka";a:0:{}s:8:"onomichi";a:0:{}s:13:"osakikamijima";a:0:{}s:5:"otake";a:0:{}s:4:"saka";a:0:{}s:4:"sera";a:0:{}s:9:"seranishi";a:0:{}s:8:"shinichi";a:0:{}s:7:"shobara";a:0:{}s:8:"takehara";a:0:{}}s:8:"hokkaido";a:142:{s:8:"abashiri";a:0:{}s:5:"abira";a:0:{}s:7:"aibetsu";a:0:{}s:7:"akabira";a:0:{}s:7:"akkeshi";a:0:{}s:9:"asahikawa";a:0:{}s:9:"ashibetsu";a:0:{}s:6:"ashoro";a:0:{}s:6:"assabu";a:0:{}s:6:"atsuma";a:0:{}s:5:"bibai";a:0:{}s:4:"biei";a:0:{}s:6:"bifuka";a:0:{}s:6:"bihoro";a:0:{}s:8:"biratori";a:0:{}s:11:"chippubetsu";a:0:{}s:7:"chitose";a:0:{}s:4:"date";a:0:{}s:6:"ebetsu";a:0:{}s:7:"embetsu";a:0:{}s:5:"eniwa";a:0:{}s:5:"erimo";a:0:{}s:4:"esan";a:0:{}s:6:"esashi";a:0:{}s:8:"fukagawa";a:0:{}s:9:"fukushima";a:0:{}s:6:"furano";a:0:{}s:8:"furubira";a:0:{}s:6:"haboro";a:0:{}s:8:"hakodate";a:0:{}s:12:"hamatonbetsu";a:0:{}s:6:"hidaka";a:0:{}s:13:"higashikagura";a:0:{}s:11:"higashikawa";a:0:{}s:5:"hiroo";a:0:{}s:7:"hokuryu";a:0:{}s:6:"hokuto";a:0:{}s:8:"honbetsu";a:0:{}s:9:"horokanai";a:0:{}s:8:"horonobe";a:0:{}s:5:"ikeda";a:0:{}s:7:"imakane";a:0:{}s:8:"ishikari";a:0:{}s:9:"iwamizawa";a:0:{}s:6:"iwanai";a:0:{}s:10:"kamifurano";a:0:{}s:8:"kamikawa";a:0:{}s:11:"kamishihoro";a:0:{}s:12:"kamisunagawa";a:0:{}s:8:"kamoenai";a:0:{}s:6:"kayabe";a:0:{}s:8:"kembuchi";a:0:{}s:7:"kikonai";a:0:{}s:9:"kimobetsu";a:0:{}s:13:"kitahiroshima";a:0:{}s:6:"kitami";a:0:{}s:8:"kiyosato";a:0:{}s:9:"koshimizu";a:0:{}s:8:"kunneppu";a:0:{}s:8:"kuriyama";a:0:{}s:12:"kuromatsunai";a:0:{}s:7:"kushiro";a:0:{}s:7:"kutchan";a:0:{}s:5:"kyowa";a:0:{}s:7:"mashike";a:0:{}s:8:"matsumae";a:0:{}s:6:"mikasa";a:0:{}s:12:"minamifurano";a:0:{}s:8:"mombetsu";a:0:{}s:8:"moseushi";a:0:{}s:6:"mukawa";a:0:{}s:7:"muroran";a:0:{}s:4:"naie";a:0:{}s:8:"nakagawa";a:0:{}s:12:"nakasatsunai";a:0:{}s:12:"nakatombetsu";a:0:{}s:5:"nanae";a:0:{}s:7:"nanporo";a:0:{}s:6:"nayoro";a:0:{}s:6:"nemuro";a:0:{}s:8:"niikappu";a:0:{}s:4:"niki";a:0:{}s:11:"nishiokoppe";a:0:{}s:11:"noboribetsu";a:0:{}s:6:"numata";a:0:{}s:7:"obihiro";a:0:{}s:5:"obira";a:0:{}s:5:"oketo";a:0:{}s:6:"okoppe";a:0:{}s:5:"otaru";a:0:{}s:5:"otobe";a:0:{}s:7:"otofuke";a:0:{}s:9:"otoineppu";a:0:{}s:4:"oumu";a:0:{}s:5:"ozora";a:0:{}s:5:"pippu";a:0:{}s:8:"rankoshi";a:0:{}s:5:"rebun";a:0:{}s:9:"rikubetsu";a:0:{}s:7:"rishiri";a:0:{}s:11:"rishirifuji";a:0:{}s:6:"saroma";a:0:{}s:9:"sarufutsu";a:0:{}s:8:"shakotan";a:0:{}s:5:"shari";a:0:{}s:8:"shibecha";a:0:{}s:8:"shibetsu";a:0:{}s:7:"shikabe";a:0:{}s:7:"shikaoi";a:0:{}s:9:"shimamaki";a:0:{}s:7:"shimizu";a:0:{}s:9:"shimokawa";a:0:{}s:12:"shinshinotsu";a:0:{}s:8:"shintoku";a:0:{}s:9:"shiranuka";a:0:{}s:7:"shiraoi";a:0:{}s:9:"shiriuchi";a:0:{}s:7:"sobetsu";a:0:{}s:8:"sunagawa";a:0:{}s:5:"taiki";a:0:{}s:6:"takasu";a:0:{}s:8:"takikawa";a:0:{}s:8:"takinoue";a:0:{}s:9:"teshikaga";a:0:{}s:7:"tobetsu";a:0:{}s:5:"tohma";a:0:{}s:9:"tomakomai";a:0:{}s:6:"tomari";a:0:{}s:4:"toya";a:0:{}s:6:"toyako";a:0:{}s:8:"toyotomi";a:0:{}s:7:"toyoura";a:0:{}s:8:"tsubetsu";a:0:{}s:9:"tsukigata";a:0:{}s:7:"urakawa";a:0:{}s:6:"urausu";a:0:{}s:4:"uryu";a:0:{}s:9:"utashinai";a:0:{}s:8:"wakkanai";a:0:{}s:7:"wassamu";a:0:{}s:6:"yakumo";a:0:{}s:6:"yoichi";a:0:{}}s:5:"hyogo";a:46:{s:4:"aioi";a:0:{}s:6:"akashi";a:0:{}s:3:"ako";a:0:{}s:9:"amagasaki";a:0:{}s:6:"aogaki";a:0:{}s:5:"asago";a:0:{}s:6:"ashiya";a:0:{}s:5:"awaji";a:0:{}s:8:"fukusaki";a:0:{}s:7:"goshiki";a:0:{}s:6:"harima";a:0:{}s:6:"himeji";a:0:{}s:8:"ichikawa";a:0:{}s:7:"inagawa";a:0:{}s:5:"itami";a:0:{}s:8:"kakogawa";a:0:{}s:8:"kamigori";a:0:{}s:8:"kamikawa";a:0:{}s:5:"kasai";a:0:{}s:6:"kasuga";a:0:{}s:9:"kawanishi";a:0:{}s:4:"miki";a:0:{}s:11:"minamiawaji";a:0:{}s:11:"nishinomiya";a:0:{}s:9:"nishiwaki";a:0:{}s:3:"ono";a:0:{}s:5:"sanda";a:0:{}s:6:"sannan";a:0:{}s:8:"sasayama";a:0:{}s:4:"sayo";a:0:{}s:6:"shingu";a:0:{}s:9:"shinonsen";a:0:{}s:5:"shiso";a:0:{}s:6:"sumoto";a:0:{}s:6:"taishi";a:0:{}s:4:"taka";a:0:{}s:10:"takarazuka";a:0:{}s:8:"takasago";a:0:{}s:6:"takino";a:0:{}s:5:"tamba";a:0:{}s:7:"tatsuno";a:0:{}s:7:"toyooka";a:0:{}s:4:"yabu";a:0:{}s:7:"yashiro";a:0:{}s:4:"yoka";a:0:{}s:6:"yokawa";a:0:{}}s:7:"ibaraki";a:51:{s:3:"ami";a:0:{}s:5:"asahi";a:0:{}s:5:"bando";a:0:{}s:8:"chikusei";a:0:{}s:5:"daigo";a:0:{}s:9:"fujishiro";a:0:{}s:7:"hitachi";a:0:{}s:11:"hitachinaka";a:0:{}s:12:"hitachiomiya";a:0:{}s:10:"hitachiota";a:0:{}s:7:"ibaraki";a:0:{}s:3:"ina";a:0:{}s:8:"inashiki";a:0:{}s:5:"itako";a:0:{}s:5:"iwama";a:0:{}s:4:"joso";a:0:{}s:6:"kamisu";a:0:{}s:6:"kasama";a:0:{}s:7:"kashima";a:0:{}s:11:"kasumigaura";a:0:{}s:4:"koga";a:0:{}s:4:"miho";a:0:{}s:4:"mito";a:0:{}s:6:"moriya";a:0:{}s:4:"naka";a:0:{}s:8:"namegata";a:0:{}s:5:"oarai";a:0:{}s:5:"ogawa";a:0:{}s:7:"omitama";a:0:{}s:9:"ryugasaki";a:0:{}s:5:"sakai";a:0:{}s:10:"sakuragawa";a:0:{}s:9:"shimodate";a:0:{}s:10:"shimotsuma";a:0:{}s:9:"shirosato";a:0:{}s:4:"sowa";a:0:{}s:5:"suifu";a:0:{}s:8:"takahagi";a:0:{}s:11:"tamatsukuri";a:0:{}s:5:"tokai";a:0:{}s:6:"tomobe";a:0:{}s:4:"tone";a:0:{}s:6:"toride";a:0:{}s:9:"tsuchiura";a:0:{}s:7:"tsukuba";a:0:{}s:8:"uchihara";a:0:{}s:6:"ushiku";a:0:{}s:7:"yachiyo";a:0:{}s:8:"yamagata";a:0:{}s:6:"yawara";a:0:{}s:4:"yuki";a:0:{}}s:8:"ishikawa";a:19:{s:7:"anamizu";a:0:{}s:5:"hakui";a:0:{}s:7:"hakusan";a:0:{}s:4:"kaga";a:0:{}s:6:"kahoku";a:0:{}s:8:"kanazawa";a:0:{}s:8:"kawakita";a:0:{}s:7:"komatsu";a:0:{}s:8:"nakanoto";a:0:{}s:5:"nanao";a:0:{}s:4:"nomi";a:0:{}s:8:"nonoichi";a:0:{}s:4:"noto";a:0:{}s:5:"shika";a:0:{}s:4:"suzu";a:0:{}s:7:"tsubata";a:0:{}s:7:"tsurugi";a:0:{}s:8:"uchinada";a:0:{}s:6:"wajima";a:0:{}}s:5:"iwate";a:34:{s:5:"fudai";a:0:{}s:8:"fujisawa";a:0:{}s:8:"hanamaki";a:0:{}s:9:"hiraizumi";a:0:{}s:6:"hirono";a:0:{}s:8:"ichinohe";a:0:{}s:10:"ichinoseki";a:0:{}s:8:"iwaizumi";a:0:{}s:5:"iwate";a:0:{}s:6:"joboji";a:0:{}s:8:"kamaishi";a:0:{}s:10:"kanegasaki";a:0:{}s:7:"karumai";a:0:{}s:5:"kawai";a:0:{}s:8:"kitakami";a:0:{}s:4:"kuji";a:0:{}s:6:"kunohe";a:0:{}s:8:"kuzumaki";a:0:{}s:6:"miyako";a:0:{}s:8:"mizusawa";a:0:{}s:7:"morioka";a:0:{}s:6:"ninohe";a:0:{}s:4:"noda";a:0:{}s:7:"ofunato";a:0:{}s:4:"oshu";a:0:{}s:7:"otsuchi";a:0:{}s:13:"rikuzentakata";a:0:{}s:5:"shiwa";a:0:{}s:11:"shizukuishi";a:0:{}s:6:"sumita";a:0:{}s:8:"tanohata";a:0:{}s:4:"tono";a:0:{}s:6:"yahaba";a:0:{}s:6:"yamada";a:0:{}}s:6:"kagawa";a:15:{s:7:"ayagawa";a:0:{}s:13:"higashikagawa";a:0:{}s:7:"kanonji";a:0:{}s:8:"kotohira";a:0:{}s:5:"manno";a:0:{}s:8:"marugame";a:0:{}s:6:"mitoyo";a:0:{}s:8:"naoshima";a:0:{}s:6:"sanuki";a:0:{}s:7:"tadotsu";a:0:{}s:9:"takamatsu";a:0:{}s:7:"tonosho";a:0:{}s:8:"uchinomi";a:0:{}s:5:"utazu";a:0:{}s:8:"zentsuji";a:0:{}}s:9:"kagoshima";a:20:{s:5:"akune";a:0:{}s:5:"amami";a:0:{}s:5:"hioki";a:0:{}s:3:"isa";a:0:{}s:4:"isen";a:0:{}s:5:"izumi";a:0:{}s:9:"kagoshima";a:0:{}s:6:"kanoya";a:0:{}s:8:"kawanabe";a:0:{}s:5:"kinko";a:0:{}s:7:"kouyama";a:0:{}s:10:"makurazaki";a:0:{}s:9:"matsumoto";a:0:{}s:10:"minamitane";a:0:{}s:8:"nakatane";a:0:{}s:12:"nishinoomote";a:0:{}s:13:"satsumasendai";a:0:{}s:3:"soo";a:0:{}s:8:"tarumizu";a:0:{}s:5:"yusui";a:0:{}}s:8:"kanagawa";a:30:{s:6:"aikawa";a:0:{}s:6:"atsugi";a:0:{}s:5:"ayase";a:0:{}s:9:"chigasaki";a:0:{}s:5:"ebina";a:0:{}s:8:"fujisawa";a:0:{}s:6:"hadano";a:0:{}s:6:"hakone";a:0:{}s:9:"hiratsuka";a:0:{}s:7:"isehara";a:0:{}s:6:"kaisei";a:0:{}s:8:"kamakura";a:0:{}s:8:"kiyokawa";a:0:{}s:7:"matsuda";a:0:{}s:14:"minamiashigara";a:0:{}s:5:"miura";a:0:{}s:5:"nakai";a:0:{}s:8:"ninomiya";a:0:{}s:7:"odawara";a:0:{}s:2:"oi";a:0:{}s:4:"oiso";a:0:{}s:10:"sagamihara";a:0:{}s:8:"samukawa";a:0:{}s:6:"tsukui";a:0:{}s:8:"yamakita";a:0:{}s:6:"yamato";a:0:{}s:8:"yokosuka";a:0:{}s:8:"yugawara";a:0:{}s:4:"zama";a:0:{}s:5:"zushi";a:0:{}}s:5:"kochi";a:31:{s:3:"aki";a:0:{}s:6:"geisei";a:0:{}s:6:"hidaka";a:0:{}s:12:"higashitsuno";a:0:{}s:3:"ino";a:0:{}s:6:"kagami";a:0:{}s:4:"kami";a:0:{}s:8:"kitagawa";a:0:{}s:5:"kochi";a:0:{}s:6:"mihara";a:0:{}s:8:"motoyama";a:0:{}s:6:"muroto";a:0:{}s:6:"nahari";a:0:{}s:8:"nakamura";a:0:{}s:7:"nankoku";a:0:{}s:9:"nishitosa";a:0:{}s:10:"niyodogawa";a:0:{}s:4:"ochi";a:0:{}s:5:"okawa";a:0:{}s:5:"otoyo";a:0:{}s:6:"otsuki";a:0:{}s:6:"sakawa";a:0:{}s:6:"sukumo";a:0:{}s:6:"susaki";a:0:{}s:4:"tosa";a:0:{}s:11:"tosashimizu";a:0:{}s:4:"toyo";a:0:{}s:5:"tsuno";a:0:{}s:5:"umaji";a:0:{}s:6:"yasuda";a:0:{}s:8:"yusuhara";a:0:{}}s:8:"kumamoto";a:23:{s:7:"amakusa";a:0:{}s:4:"arao";a:0:{}s:3:"aso";a:0:{}s:5:"choyo";a:0:{}s:7:"gyokuto";a:0:{}s:11:"kamiamakusa";a:0:{}s:7:"kikuchi";a:0:{}s:8:"kumamoto";a:0:{}s:7:"mashiki";a:0:{}s:6:"mifune";a:0:{}s:8:"minamata";a:0:{}s:11:"minamioguni";a:0:{}s:6:"nagasu";a:0:{}s:9:"nishihara";a:0:{}s:5:"oguni";a:0:{}s:3:"ozu";a:0:{}s:6:"sumoto";a:0:{}s:8:"takamori";a:0:{}s:3:"uki";a:0:{}s:3:"uto";a:0:{}s:6:"yamaga";a:0:{}s:6:"yamato";a:0:{}s:10:"yatsushiro";a:0:{}}s:5:"kyoto";a:31:{s:5:"ayabe";a:0:{}s:11:"fukuchiyama";a:0:{}s:11:"higashiyama";a:0:{}s:3:"ide";a:0:{}s:3:"ine";a:0:{}s:4:"joyo";a:0:{}s:7:"kameoka";a:0:{}s:4:"kamo";a:0:{}s:4:"kita";a:0:{}s:4:"kizu";a:0:{}s:8:"kumiyama";a:0:{}s:8:"kyotamba";a:0:{}s:9:"kyotanabe";a:0:{}s:8:"kyotango";a:0:{}s:7:"maizuru";a:0:{}s:6:"minami";a:0:{}s:15:"minamiyamashiro";a:0:{}s:6:"miyazu";a:0:{}s:4:"muko";a:0:{}s:10:"nagaokakyo";a:0:{}s:7:"nakagyo";a:0:{}s:6:"nantan";a:0:{}s:9:"oyamazaki";a:0:{}s:5:"sakyo";a:0:{}s:5:"seika";a:0:{}s:6:"tanabe";a:0:{}s:3:"uji";a:0:{}s:9:"ujitawara";a:0:{}s:6:"wazuka";a:0:{}s:9:"yamashina";a:0:{}s:6:"yawata";a:0:{}}s:3:"mie";a:30:{s:5:"asahi";a:0:{}s:5:"inabe";a:0:{}s:3:"ise";a:0:{}s:8:"kameyama";a:0:{}s:7:"kawagoe";a:0:{}s:4:"kiho";a:0:{}s:8:"kisosaki";a:0:{}s:4:"kiwa";a:0:{}s:6:"komono";a:0:{}s:6:"kumano";a:0:{}s:6:"kuwana";a:0:{}s:9:"matsusaka";a:0:{}s:5:"meiwa";a:0:{}s:6:"mihama";a:0:{}s:9:"minamiise";a:0:{}s:6:"misugi";a:0:{}s:6:"miyama";a:0:{}s:6:"nabari";a:0:{}s:5:"shima";a:0:{}s:6:"suzuka";a:0:{}s:4:"tado";a:0:{}s:5:"taiki";a:0:{}s:4:"taki";a:0:{}s:6:"tamaki";a:0:{}s:4:"toba";a:0:{}s:3:"tsu";a:0:{}s:5:"udono";a:0:{}s:8:"ureshino";a:0:{}s:7:"watarai";a:0:{}s:9:"yokkaichi";a:0:{}}s:6:"miyagi";a:32:{s:8:"furukawa";a:0:{}s:17:"higashimatsushima";a:0:{}s:10:"ishinomaki";a:0:{}s:7:"iwanuma";a:0:{}s:6:"kakuda";a:0:{}s:4:"kami";a:0:{}s:8:"kawasaki";a:0:{}s:8:"marumori";a:0:{}s:10:"matsushima";a:0:{}s:13:"minamisanriku";a:0:{}s:6:"misato";a:0:{}s:6:"murata";a:0:{}s:6:"natori";a:0:{}s:7:"ogawara";a:0:{}s:5:"ohira";a:0:{}s:7:"onagawa";a:0:{}s:5:"osaki";a:0:{}s:4:"rifu";a:0:{}s:6:"semine";a:0:{}s:7:"shibata";a:0:{}s:13:"shichikashuku";a:0:{}s:7:"shikama";a:0:{}s:8:"shiogama";a:0:{}s:9:"shiroishi";a:0:{}s:6:"tagajo";a:0:{}s:5:"taiwa";a:0:{}s:4:"tome";a:0:{}s:6:"tomiya";a:0:{}s:6:"wakuya";a:0:{}s:6:"watari";a:0:{}s:8:"yamamoto";a:0:{}s:3:"zao";a:0:{}}s:8:"miyazaki";a:27:{s:3:"aya";a:0:{}s:5:"ebino";a:0:{}s:6:"gokase";a:0:{}s:5:"hyuga";a:0:{}s:8:"kadogawa";a:0:{}s:10:"kawaminami";a:0:{}s:4:"kijo";a:0:{}s:8:"kitagawa";a:0:{}s:8:"kitakata";a:0:{}s:7:"kitaura";a:0:{}s:9:"kobayashi";a:0:{}s:8:"kunitomi";a:0:{}s:7:"kushima";a:0:{}s:6:"mimata";a:0:{}s:10:"miyakonojo";a:0:{}s:8:"miyazaki";a:0:{}s:9:"morotsuka";a:0:{}s:8:"nichinan";a:0:{}s:9:"nishimera";a:0:{}s:7:"nobeoka";a:0:{}s:5:"saito";a:0:{}s:6:"shiiba";a:0:{}s:8:"shintomi";a:0:{}s:8:"takaharu";a:0:{}s:8:"takanabe";a:0:{}s:8:"takazaki";a:0:{}s:5:"tsuno";a:0:{}}s:6:"nagano";a:75:{s:4:"achi";a:0:{}s:8:"agematsu";a:0:{}s:4:"anan";a:0:{}s:4:"aoki";a:0:{}s:5:"asahi";a:0:{}s:7:"azumino";a:0:{}s:9:"chikuhoku";a:0:{}s:7:"chikuma";a:0:{}s:5:"chino";a:0:{}s:6:"fujimi";a:0:{}s:6:"hakuba";a:0:{}s:4:"hara";a:0:{}s:6:"hiraya";a:0:{}s:4:"iida";a:0:{}s:6:"iijima";a:0:{}s:6:"iiyama";a:0:{}s:6:"iizuna";a:0:{}s:5:"ikeda";a:0:{}s:7:"ikusaka";a:0:{}s:3:"ina";a:0:{}s:9:"karuizawa";a:0:{}s:8:"kawakami";a:0:{}s:4:"kiso";a:0:{}s:13:"kisofukushima";a:0:{}s:8:"kitaaiki";a:0:{}s:8:"komagane";a:0:{}s:6:"komoro";a:0:{}s:9:"matsukawa";a:0:{}s:9:"matsumoto";a:0:{}s:5:"miasa";a:0:{}s:10:"minamiaiki";a:0:{}s:10:"minamimaki";a:0:{}s:12:"minamiminowa";a:0:{}s:6:"minowa";a:0:{}s:6:"miyada";a:0:{}s:6:"miyota";a:0:{}s:9:"mochizuki";a:0:{}s:6:"nagano";a:0:{}s:6:"nagawa";a:0:{}s:6:"nagiso";a:0:{}s:8:"nakagawa";a:0:{}s:6:"nakano";a:0:{}s:11:"nozawaonsen";a:0:{}s:5:"obuse";a:0:{}s:5:"ogawa";a:0:{}s:5:"okaya";a:0:{}s:6:"omachi";a:0:{}s:3:"omi";a:0:{}s:6:"ookuwa";a:0:{}s:7:"ooshika";a:0:{}s:5:"otaki";a:0:{}s:5:"otari";a:0:{}s:5:"sakae";a:0:{}s:6:"sakaki";a:0:{}s:4:"saku";a:0:{}s:6:"sakuho";a:0:{}s:9:"shimosuwa";a:0:{}s:12:"shinanomachi";a:0:{}s:8:"shiojiri";a:0:{}s:4:"suwa";a:0:{}s:6:"suzaka";a:0:{}s:6:"takagi";a:0:{}s:8:"takamori";a:0:{}s:8:"takayama";a:0:{}s:9:"tateshina";a:0:{}s:7:"tatsuno";a:0:{}s:9:"togakushi";a:0:{}s:6:"togura";a:0:{}s:4:"tomi";a:0:{}s:4:"ueda";a:0:{}s:4:"wada";a:0:{}s:8:"yamagata";a:0:{}s:10:"yamanouchi";a:0:{}s:6:"yasaka";a:0:{}s:7:"yasuoka";a:0:{}}s:8:"nagasaki";a:22:{s:7:"chijiwa";a:0:{}s:5:"futsu";a:0:{}s:4:"goto";a:0:{}s:6:"hasami";a:0:{}s:6:"hirado";a:0:{}s:3:"iki";a:0:{}s:7:"isahaya";a:0:{}s:8:"kawatana";a:0:{}s:10:"kuchinotsu";a:0:{}s:8:"matsuura";a:0:{}s:8:"nagasaki";a:0:{}s:5:"obama";a:0:{}s:5:"omura";a:0:{}s:5:"oseto";a:0:{}s:6:"saikai";a:0:{}s:6:"sasebo";a:0:{}s:5:"seihi";a:0:{}s:9:"shimabara";a:0:{}s:12:"shinkamigoto";a:0:{}s:7:"togitsu";a:0:{}s:8:"tsushima";a:0:{}s:5:"unzen";a:0:{}}s:4:"nara";a:38:{s:4:"ando";a:0:{}s:4:"gose";a:0:{}s:6:"heguri";a:0:{}s:14:"higashiyoshino";a:0:{}s:7:"ikaruga";a:0:{}s:5:"ikoma";a:0:{}s:12:"kamikitayama";a:0:{}s:7:"kanmaki";a:0:{}s:7:"kashiba";a:0:{}s:9:"kashihara";a:0:{}s:9:"katsuragi";a:0:{}s:5:"kawai";a:0:{}s:8:"kawakami";a:0:{}s:9:"kawanishi";a:0:{}s:5:"koryo";a:0:{}s:8:"kurotaki";a:0:{}s:6:"mitsue";a:0:{}s:6:"miyake";a:0:{}s:4:"nara";a:0:{}s:8:"nosegawa";a:0:{}s:3:"oji";a:0:{}s:4:"ouda";a:0:{}s:5:"oyodo";a:0:{}s:7:"sakurai";a:0:{}s:5:"sango";a:0:{}s:9:"shimoichi";a:0:{}s:13:"shimokitayama";a:0:{}s:6:"shinjo";a:0:{}s:4:"soni";a:0:{}s:8:"takatori";a:0:{}s:10:"tawaramoto";a:0:{}s:7:"tenkawa";a:0:{}s:5:"tenri";a:0:{}s:3:"uda";a:0:{}s:14:"yamatokoriyama";a:0:{}s:12:"yamatotakada";a:0:{}s:7:"yamazoe";a:0:{}s:7:"yoshino";a:0:{}}s:7:"niigata";a:34:{s:3:"aga";a:0:{}s:5:"agano";a:0:{}s:5:"gosen";a:0:{}s:8:"itoigawa";a:0:{}s:9:"izumozaki";a:0:{}s:6:"joetsu";a:0:{}s:4:"kamo";a:0:{}s:6:"kariwa";a:0:{}s:11:"kashiwazaki";a:0:{}s:12:"minamiuonuma";a:0:{}s:7:"mitsuke";a:0:{}s:5:"muika";a:0:{}s:8:"murakami";a:0:{}s:5:"myoko";a:0:{}s:7:"nagaoka";a:0:{}s:7:"niigata";a:0:{}s:5:"ojiya";a:0:{}s:3:"omi";a:0:{}s:4:"sado";a:0:{}s:5:"sanjo";a:0:{}s:5:"seiro";a:0:{}s:6:"seirou";a:0:{}s:8:"sekikawa";a:0:{}s:7:"shibata";a:0:{}s:6:"tagami";a:0:{}s:6:"tainai";a:0:{}s:6:"tochio";a:0:{}s:9:"tokamachi";a:0:{}s:7:"tsubame";a:0:{}s:6:"tsunan";a:0:{}s:6:"uonuma";a:0:{}s:6:"yahiko";a:0:{}s:5:"yoita";a:0:{}s:6:"yuzawa";a:0:{}}s:4:"oita";a:19:{s:5:"beppu";a:0:{}s:8:"bungoono";a:0:{}s:11:"bungotakada";a:0:{}s:6:"hasama";a:0:{}s:4:"hiji";a:0:{}s:9:"himeshima";a:0:{}s:4:"hita";a:0:{}s:8:"kamitsue";a:0:{}s:7:"kokonoe";a:0:{}s:4:"kuju";a:0:{}s:8:"kunisaki";a:0:{}s:4:"kusu";a:0:{}s:4:"oita";a:0:{}s:5:"saiki";a:0:{}s:6:"taketa";a:0:{}s:7:"tsukumi";a:0:{}s:3:"usa";a:0:{}s:5:"usuki";a:0:{}s:4:"yufu";a:0:{}}s:7:"okayama";a:26:{s:6:"akaiwa";a:0:{}s:8:"asakuchi";a:0:{}s:5:"bizen";a:0:{}s:9:"hayashima";a:0:{}s:5:"ibara";a:0:{}s:8:"kagamino";a:0:{}s:7:"kasaoka";a:0:{}s:8:"kibichuo";a:0:{}s:7:"kumenan";a:0:{}s:9:"kurashiki";a:0:{}s:6:"maniwa";a:0:{}s:6:"misaki";a:0:{}s:4:"nagi";a:0:{}s:5:"niimi";a:0:{}s:12:"nishiawakura";a:0:{}s:7:"okayama";a:0:{}s:7:"satosho";a:0:{}s:8:"setouchi";a:0:{}s:6:"shinjo";a:0:{}s:4:"shoo";a:0:{}s:4:"soja";a:0:{}s:9:"takahashi";a:0:{}s:6:"tamano";a:0:{}s:7:"tsuyama";a:0:{}s:4:"wake";a:0:{}s:6:"yakage";a:0:{}}s:7:"okinawa";a:42:{s:5:"aguni";a:0:{}s:7:"ginowan";a:0:{}s:6:"ginoza";a:0:{}s:9:"gushikami";a:0:{}s:7:"haebaru";a:0:{}s:7:"higashi";a:0:{}s:6:"hirara";a:0:{}s:5:"iheya";a:0:{}s:8:"ishigaki";a:0:{}s:8:"ishikawa";a:0:{}s:6:"itoman";a:0:{}s:5:"izena";a:0:{}s:6:"kadena";a:0:{}s:3:"kin";a:0:{}s:9:"kitadaito";a:0:{}s:14:"kitanakagusuku";a:0:{}s:8:"kumejima";a:0:{}s:8:"kunigami";a:0:{}s:11:"minamidaito";a:0:{}s:6:"motobu";a:0:{}s:4:"nago";a:0:{}s:4:"naha";a:0:{}s:10:"nakagusuku";a:0:{}s:7:"nakijin";a:0:{}s:5:"nanjo";a:0:{}s:9:"nishihara";a:0:{}s:5:"ogimi";a:0:{}s:7:"okinawa";a:0:{}s:4:"onna";a:0:{}s:7:"shimoji";a:0:{}s:8:"taketomi";a:0:{}s:6:"tarama";a:0:{}s:9:"tokashiki";a:0:{}s:10:"tomigusuku";a:0:{}s:6:"tonaki";a:0:{}s:6:"urasoe";a:0:{}s:5:"uruma";a:0:{}s:5:"yaese";a:0:{}s:7:"yomitan";a:0:{}s:8:"yonabaru";a:0:{}s:8:"yonaguni";a:0:{}s:6:"zamami";a:0:{}}s:5:"osaka";a:50:{s:5:"abeno";a:0:{}s:14:"chihayaakasaka";a:0:{}s:4:"chuo";a:0:{}s:5:"daito";a:0:{}s:9:"fujiidera";a:0:{}s:8:"habikino";a:0:{}s:6:"hannan";a:0:{}s:12:"higashiosaka";a:0:{}s:16:"higashisumiyoshi";a:0:{}s:15:"higashiyodogawa";a:0:{}s:8:"hirakata";a:0:{}s:7:"ibaraki";a:0:{}s:5:"ikeda";a:0:{}s:5:"izumi";a:0:{}s:9:"izumiotsu";a:0:{}s:9:"izumisano";a:0:{}s:6:"kadoma";a:0:{}s:7:"kaizuka";a:0:{}s:5:"kanan";a:0:{}s:9:"kashiwara";a:0:{}s:6:"katano";a:0:{}s:13:"kawachinagano";a:0:{}s:9:"kishiwada";a:0:{}s:4:"kita";a:0:{}s:8:"kumatori";a:0:{}s:9:"matsubara";a:0:{}s:6:"minato";a:0:{}s:5:"minoh";a:0:{}s:6:"misaki";a:0:{}s:9:"moriguchi";a:0:{}s:8:"neyagawa";a:0:{}s:5:"nishi";a:0:{}s:4:"nose";a:0:{}s:11:"osakasayama";a:0:{}s:5:"sakai";a:0:{}s:6:"sayama";a:0:{}s:6:"sennan";a:0:{}s:6:"settsu";a:0:{}s:11:"shijonawate";a:0:{}s:9:"shimamoto";a:0:{}s:5:"suita";a:0:{}s:7:"tadaoka";a:0:{}s:6:"taishi";a:0:{}s:6:"tajiri";a:0:{}s:8:"takaishi";a:0:{}s:9:"takatsuki";a:0:{}s:12:"tondabayashi";a:0:{}s:8:"toyonaka";a:0:{}s:6:"toyono";a:0:{}s:3:"yao";a:0:{}}s:4:"saga";a:26:{s:6:"ariake";a:0:{}s:5:"arita";a:0:{}s:8:"fukudomi";a:0:{}s:6:"genkai";a:0:{}s:8:"hamatama";a:0:{}s:5:"hizen";a:0:{}s:5:"imari";a:0:{}s:8:"kamimine";a:0:{}s:7:"kanzaki";a:0:{}s:7:"karatsu";a:0:{}s:7:"kashima";a:0:{}s:8:"kitagata";a:0:{}s:8:"kitahata";a:0:{}s:6:"kiyama";a:0:{}s:7:"kouhoku";a:0:{}s:7:"kyuragi";a:0:{}s:10:"nishiarita";a:0:{}s:3:"ogi";a:0:{}s:6:"omachi";a:0:{}s:5:"ouchi";a:0:{}s:4:"saga";a:0:{}s:9:"shiroishi";a:0:{}s:4:"taku";a:0:{}s:4:"tara";a:0:{}s:4:"tosu";a:0:{}s:11:"yoshinogari";a:0:{}}s:7:"saitama";a:69:{s:7:"arakawa";a:0:{}s:5:"asaka";a:0:{}s:8:"chichibu";a:0:{}s:6:"fujimi";a:0:{}s:8:"fujimino";a:0:{}s:6:"fukaya";a:0:{}s:5:"hanno";a:0:{}s:5:"hanyu";a:0:{}s:6:"hasuda";a:0:{}s:8:"hatogaya";a:0:{}s:8:"hatoyama";a:0:{}s:6:"hidaka";a:0:{}s:15:"higashichichibu";a:0:{}s:16:"higashimatsuyama";a:0:{}s:5:"honjo";a:0:{}s:3:"ina";a:0:{}s:5:"iruma";a:0:{}s:8:"iwatsuki";a:0:{}s:9:"kamiizumi";a:0:{}s:8:"kamikawa";a:0:{}s:8:"kamisato";a:0:{}s:8:"kasukabe";a:0:{}s:7:"kawagoe";a:0:{}s:9:"kawaguchi";a:0:{}s:8:"kawajima";a:0:{}s:4:"kazo";a:0:{}s:8:"kitamoto";a:0:{}s:9:"koshigaya";a:0:{}s:7:"kounosu";a:0:{}s:4:"kuki";a:0:{}s:8:"kumagaya";a:0:{}s:10:"matsubushi";a:0:{}s:6:"minano";a:0:{}s:6:"misato";a:0:{}s:9:"miyashiro";a:0:{}s:7:"miyoshi";a:0:{}s:8:"moroyama";a:0:{}s:8:"nagatoro";a:0:{}s:8:"namegawa";a:0:{}s:5:"niiza";a:0:{}s:5:"ogano";a:0:{}s:5:"ogawa";a:0:{}s:5:"ogose";a:0:{}s:7:"okegawa";a:0:{}s:5:"omiya";a:0:{}s:5:"otaki";a:0:{}s:6:"ranzan";a:0:{}s:7:"ryokami";a:0:{}s:7:"saitama";a:0:{}s:6:"sakado";a:0:{}s:5:"satte";a:0:{}s:6:"sayama";a:0:{}s:5:"shiki";a:0:{}s:8:"shiraoka";a:0:{}s:4:"soka";a:0:{}s:6:"sugito";a:0:{}s:4:"toda";a:0:{}s:8:"tokigawa";a:0:{}s:10:"tokorozawa";a:0:{}s:12:"tsurugashima";a:0:{}s:5:"urawa";a:0:{}s:6:"warabi";a:0:{}s:6:"yashio";a:0:{}s:6:"yokoze";a:0:{}s:4:"yono";a:0:{}s:5:"yorii";a:0:{}s:7:"yoshida";a:0:{}s:9:"yoshikawa";a:0:{}s:7:"yoshimi";a:0:{}}s:5:"shiga";a:23:{s:5:"aisho";a:0:{}s:4:"gamo";a:0:{}s:10:"higashiomi";a:0:{}s:6:"hikone";a:0:{}s:4:"koka";a:0:{}s:5:"konan";a:0:{}s:5:"kosei";a:0:{}s:4:"koto";a:0:{}s:7:"kusatsu";a:0:{}s:7:"maibara";a:0:{}s:8:"moriyama";a:0:{}s:8:"nagahama";a:0:{}s:9:"nishiazai";a:0:{}s:8:"notogawa";a:0:{}s:11:"omihachiman";a:0:{}s:4:"otsu";a:0:{}s:5:"ritto";a:0:{}s:5:"ryuoh";a:0:{}s:9:"takashima";a:0:{}s:9:"takatsuki";a:0:{}s:8:"torahime";a:0:{}s:8:"toyosato";a:0:{}s:4:"yasu";a:0:{}}s:7:"shimane";a:23:{s:5:"akagi";a:0:{}s:3:"ama";a:0:{}s:5:"gotsu";a:0:{}s:6:"hamada";a:0:{}s:12:"higashiizumo";a:0:{}s:6:"hikawa";a:0:{}s:6:"hikimi";a:0:{}s:5:"izumo";a:0:{}s:8:"kakinoki";a:0:{}s:6:"masuda";a:0:{}s:6:"matsue";a:0:{}s:6:"misato";a:0:{}s:12:"nishinoshima";a:0:{}s:4:"ohda";a:0:{}s:10:"okinoshima";a:0:{}s:8:"okuizumo";a:0:{}s:7:"shimane";a:0:{}s:6:"tamayu";a:0:{}s:7:"tsuwano";a:0:{}s:5:"unnan";a:0:{}s:6:"yakumo";a:0:{}s:6:"yasugi";a:0:{}s:7:"yatsuka";a:0:{}}s:8:"shizuoka";a:36:{s:4:"arai";a:0:{}s:5:"atami";a:0:{}s:4:"fuji";a:0:{}s:7:"fujieda";a:0:{}s:8:"fujikawa";a:0:{}s:10:"fujinomiya";a:0:{}s:7:"fukuroi";a:0:{}s:7:"gotemba";a:0:{}s:7:"haibara";a:0:{}s:9:"hamamatsu";a:0:{}s:10:"higashiizu";a:0:{}s:3:"ito";a:0:{}s:5:"iwata";a:0:{}s:3:"izu";a:0:{}s:9:"izunokuni";a:0:{}s:8:"kakegawa";a:0:{}s:7:"kannami";a:0:{}s:9:"kawanehon";a:0:{}s:6:"kawazu";a:0:{}s:8:"kikugawa";a:0:{}s:5:"kosai";a:0:{}s:10:"makinohara";a:0:{}s:9:"matsuzaki";a:0:{}s:9:"minamiizu";a:0:{}s:7:"mishima";a:0:{}s:9:"morimachi";a:0:{}s:8:"nishiizu";a:0:{}s:6:"numazu";a:0:{}s:8:"omaezaki";a:0:{}s:7:"shimada";a:0:{}s:7:"shimizu";a:0:{}s:7:"shimoda";a:0:{}s:8:"shizuoka";a:0:{}s:6:"susono";a:0:{}s:5:"yaizu";a:0:{}s:7:"yoshida";a:0:{}}s:7:"tochigi";a:31:{s:8:"ashikaga";a:0:{}s:4:"bato";a:0:{}s:4:"haga";a:0:{}s:7:"ichikai";a:0:{}s:7:"iwafune";a:0:{}s:10:"kaminokawa";a:0:{}s:6:"kanuma";a:0:{}s:10:"karasuyama";a:0:{}s:7:"kuroiso";a:0:{}s:7:"mashiko";a:0:{}s:4:"mibu";a:0:{}s:4:"moka";a:0:{}s:6:"motegi";a:0:{}s:4:"nasu";a:0:{}s:12:"nasushiobara";a:0:{}s:5:"nikko";a:0:{}s:9:"nishikata";a:0:{}s:4:"nogi";a:0:{}s:5:"ohira";a:0:{}s:8:"ohtawara";a:0:{}s:5:"oyama";a:0:{}s:6:"sakura";a:0:{}s:4:"sano";a:0:{}s:10:"shimotsuke";a:0:{}s:6:"shioya";a:0:{}s:10:"takanezawa";a:0:{}s:7:"tochigi";a:0:{}s:5:"tsuga";a:0:{}s:5:"ujiie";a:0:{}s:10:"utsunomiya";a:0:{}s:5:"yaita";a:0:{}}s:9:"tokushima";a:17:{s:6:"aizumi";a:0:{}s:4:"anan";a:0:{}s:6:"ichiba";a:0:{}s:5:"itano";a:0:{}s:6:"kainan";a:0:{}s:12:"komatsushima";a:0:{}s:10:"matsushige";a:0:{}s:4:"mima";a:0:{}s:6:"minami";a:0:{}s:7:"miyoshi";a:0:{}s:4:"mugi";a:0:{}s:8:"nakagawa";a:0:{}s:6:"naruto";a:0:{}s:9:"sanagochi";a:0:{}s:9:"shishikui";a:0:{}s:9:"tokushima";a:0:{}s:6:"wajiki";a:0:{}}s:5:"tokyo";a:57:{s:6:"adachi";a:0:{}s:7:"akiruno";a:0:{}s:8:"akishima";a:0:{}s:9:"aogashima";a:0:{}s:7:"arakawa";a:0:{}s:6:"bunkyo";a:0:{}s:7:"chiyoda";a:0:{}s:5:"chofu";a:0:{}s:4:"chuo";a:0:{}s:7:"edogawa";a:0:{}s:5:"fuchu";a:0:{}s:5:"fussa";a:0:{}s:7:"hachijo";a:0:{}s:8:"hachioji";a:0:{}s:6:"hamura";a:0:{}s:13:"higashikurume";a:0:{}s:15:"higashimurayama";a:0:{}s:13:"higashiyamato";a:0:{}s:4:"hino";a:0:{}s:6:"hinode";a:0:{}s:8:"hinohara";a:0:{}s:5:"inagi";a:0:{}s:8:"itabashi";a:0:{}s:10:"katsushika";a:0:{}s:4:"kita";a:0:{}s:6:"kiyose";a:0:{}s:7:"kodaira";a:0:{}s:7:"koganei";a:0:{}s:9:"kokubunji";a:0:{}s:5:"komae";a:0:{}s:4:"koto";a:0:{}s:10:"kouzushima";a:0:{}s:9:"kunitachi";a:0:{}s:7:"machida";a:0:{}s:6:"meguro";a:0:{}s:6:"minato";a:0:{}s:6:"mitaka";a:0:{}s:6:"mizuho";a:0:{}s:15:"musashimurayama";a:0:{}s:9:"musashino";a:0:{}s:6:"nakano";a:0:{}s:6:"nerima";a:0:{}s:9:"ogasawara";a:0:{}s:7:"okutama";a:0:{}s:3:"ome";a:0:{}s:6:"oshima";a:0:{}s:3:"ota";a:0:{}s:8:"setagaya";a:0:{}s:7:"shibuya";a:0:{}s:9:"shinagawa";a:0:{}s:8:"shinjuku";a:0:{}s:8:"suginami";a:0:{}s:6:"sumida";a:0:{}s:9:"tachikawa";a:0:{}s:5:"taito";a:0:{}s:4:"tama";a:0:{}s:7:"toshima";a:0:{}}s:7:"tottori";a:13:{s:5:"chizu";a:0:{}s:4:"hino";a:0:{}s:8:"kawahara";a:0:{}s:4:"koge";a:0:{}s:7:"kotoura";a:0:{}s:6:"misasa";a:0:{}s:5:"nanbu";a:0:{}s:8:"nichinan";a:0:{}s:11:"sakaiminato";a:0:{}s:7:"tottori";a:0:{}s:6:"wakasa";a:0:{}s:4:"yazu";a:0:{}s:6:"yonago";a:0:{}}s:6:"toyama";a:24:{s:5:"asahi";a:0:{}s:5:"fuchu";a:0:{}s:9:"fukumitsu";a:0:{}s:9:"funahashi";a:0:{}s:4:"himi";a:0:{}s:5:"imizu";a:0:{}s:5:"inami";a:0:{}s:6:"johana";a:0:{}s:8:"kamiichi";a:0:{}s:6:"kurobe";a:0:{}s:11:"nakaniikawa";a:0:{}s:10:"namerikawa";a:0:{}s:5:"nanto";a:0:{}s:6:"nyuzen";a:0:{}s:5:"oyabe";a:0:{}s:5:"taira";a:0:{}s:7:"takaoka";a:0:{}s:8:"tateyama";a:0:{}s:4:"toga";a:0:{}s:6:"tonami";a:0:{}s:6:"toyama";a:0:{}s:7:"unazuki";a:0:{}s:4:"uozu";a:0:{}s:6:"yamada";a:0:{}}s:8:"wakayama";a:29:{s:5:"arida";a:0:{}s:9:"aridagawa";a:0:{}s:4:"gobo";a:0:{}s:9:"hashimoto";a:0:{}s:6:"hidaka";a:0:{}s:8:"hirogawa";a:0:{}s:5:"inami";a:0:{}s:5:"iwade";a:0:{}s:6:"kainan";a:0:{}s:9:"kamitonda";a:0:{}s:9:"katsuragi";a:0:{}s:6:"kimino";a:0:{}s:8:"kinokawa";a:0:{}s:8:"kitayama";a:0:{}s:4:"koya";a:0:{}s:4:"koza";a:0:{}s:8:"kozagawa";a:0:{}s:8:"kudoyama";a:0:{}s:9:"kushimoto";a:0:{}s:6:"mihama";a:0:{}s:6:"misato";a:0:{}s:13:"nachikatsuura";a:0:{}s:6:"shingu";a:0:{}s:9:"shirahama";a:0:{}s:5:"taiji";a:0:{}s:6:"tanabe";a:0:{}s:8:"wakayama";a:0:{}s:5:"yuasa";a:0:{}s:4:"yura";a:0:{}}s:8:"yamagata";a:34:{s:5:"asahi";a:0:{}s:8:"funagata";a:0:{}s:9:"higashine";a:0:{}s:4:"iide";a:0:{}s:6:"kahoku";a:0:{}s:10:"kaminoyama";a:0:{}s:8:"kaneyama";a:0:{}s:9:"kawanishi";a:0:{}s:10:"mamurogawa";a:0:{}s:6:"mikawa";a:0:{}s:8:"murayama";a:0:{}s:5:"nagai";a:0:{}s:8:"nakayama";a:0:{}s:5:"nanyo";a:0:{}s:9:"nishikawa";a:0:{}s:9:"obanazawa";a:0:{}s:2:"oe";a:0:{}s:5:"oguni";a:0:{}s:6:"ohkura";a:0:{}s:7:"oishida";a:0:{}s:5:"sagae";a:0:{}s:6:"sakata";a:0:{}s:8:"sakegawa";a:0:{}s:6:"shinjo";a:0:{}s:9:"shirataka";a:0:{}s:6:"shonai";a:0:{}s:8:"takahata";a:0:{}s:5:"tendo";a:0:{}s:6:"tozawa";a:0:{}s:8:"tsuruoka";a:0:{}s:8:"yamagata";a:0:{}s:8:"yamanobe";a:0:{}s:8:"yonezawa";a:0:{}s:4:"yuza";a:0:{}}s:9:"yamaguchi";a:16:{s:3:"abu";a:0:{}s:4:"hagi";a:0:{}s:6:"hikari";a:0:{}s:4:"hofu";a:0:{}s:7:"iwakuni";a:0:{}s:9:"kudamatsu";a:0:{}s:5:"mitou";a:0:{}s:6:"nagato";a:0:{}s:6:"oshima";a:0:{}s:11:"shimonoseki";a:0:{}s:6:"shunan";a:0:{}s:6:"tabuse";a:0:{}s:8:"tokuyama";a:0:{}s:6:"toyota";a:0:{}s:3:"ube";a:0:{}s:3:"yuu";a:0:{}}s:9:"yamanashi";a:28:{s:4:"chuo";a:0:{}s:5:"doshi";a:0:{}s:7:"fuefuki";a:0:{}s:8:"fujikawa";a:0:{}s:15:"fujikawaguchiko";a:0:{}s:11:"fujiyoshida";a:0:{}s:8:"hayakawa";a:0:{}s:6:"hokuto";a:0:{}s:14:"ichikawamisato";a:0:{}s:3:"kai";a:0:{}s:4:"kofu";a:0:{}s:5:"koshu";a:0:{}s:6:"kosuge";a:0:{}s:11:"minami-alps";a:0:{}s:6:"minobu";a:0:{}s:9:"nakamichi";a:0:{}s:5:"nanbu";a:0:{}s:8:"narusawa";a:0:{}s:8:"nirasaki";a:0:{}s:12:"nishikatsura";a:0:{}s:6:"oshino";a:0:{}s:6:"otsuki";a:0:{}s:5:"showa";a:0:{}s:8:"tabayama";a:0:{}s:5:"tsuru";a:0:{}s:8:"uenohara";a:0:{}s:10:"yamanakako";a:0:{}s:9:"yamanashi";a:0:{}}s:9:"xn--4pvxs";a:0:{}s:11:"xn--vgu402c";a:0:{}s:10:"xn--c3s14m";a:0:{}s:11:"xn--f6qx53a";a:0:{}s:10:"xn--8pvr4u";a:0:{}s:11:"xn--uist22h";a:0:{}s:14:"xn--djrs72d6uy";a:0:{}s:11:"xn--mkru45i";a:0:{}s:13:"xn--0trq7p7nn";a:0:{}s:11:"xn--8ltr62k";a:0:{}s:11:"xn--2m4a15e";a:0:{}s:10:"xn--efvn9s";a:0:{}s:11:"xn--32vp30h";a:0:{}s:11:"xn--4it797k";a:0:{}s:11:"xn--1lqs71d";a:0:{}s:11:"xn--5rtp49c";a:0:{}s:11:"xn--5js045d";a:0:{}s:11:"xn--ehqz56n";a:0:{}s:11:"xn--1lqs03n";a:0:{}s:11:"xn--qqqt11m";a:0:{}s:10:"xn--kbrq7o";a:0:{}s:11:"xn--pssu33l";a:0:{}s:11:"xn--ntsq17g";a:0:{}s:10:"xn--uisz3g";a:0:{}s:10:"xn--6btw5a";a:0:{}s:9:"xn--1ctwo";a:0:{}s:10:"xn--6orx2r";a:0:{}s:10:"xn--rht61e";a:0:{}s:10:"xn--rht27z";a:0:{}s:10:"xn--djty4k";a:0:{}s:11:"xn--nit225k";a:0:{}s:9:"xn--rht3d";a:0:{}s:10:"xn--klty5x";a:0:{}s:10:"xn--kltx9a";a:0:{}s:10:"xn--kltp7d";a:0:{}s:11:"xn--uuwu58a";a:0:{}s:11:"xn--zbx025d";a:0:{}s:14:"xn--ntso0iqx3a";a:0:{}s:11:"xn--elqq16h";a:0:{}s:11:"xn--4it168d";a:0:{}s:11:"xn--klt787d";a:0:{}s:10:"xn--rny31h";a:0:{}s:12:"xn--7t0a264c";a:0:{}s:11:"xn--5rtq34k";a:0:{}s:11:"xn--k7yn95e";a:0:{}s:11:"xn--tor131o";a:0:{}s:14:"xn--d5qv7z876c";a:0:{}s:8:"kawasaki";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:10:"kitakyushu";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:4:"kobe";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:6:"nagoya";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:7:"sapporo";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:6:"sendai";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:8:"yokohama";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}}s:2:"ke";a:1:{s:1:"*";a:0:{}}s:2:"kg";a:6:{s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}}s:2:"kh";a:1:{s:1:"*";a:0:{}}s:2:"ki";a:7:{s:3:"edu";a:0:{}s:3:"biz";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"com";a:0:{}}s:2:"km";a:17:{s:3:"org";a:0:{}s:3:"nom";a:0:{}s:3:"gov";a:0:{}s:3:"prd";a:0:{}s:2:"tm";a:0:{}s:3:"edu";a:0:{}s:3:"mil";a:0:{}s:3:"ass";a:0:{}s:3:"com";a:0:{}s:4:"coop";a:0:{}s:4:"asso";a:0:{}s:6:"presse";a:0:{}s:7:"medecin";a:0:{}s:8:"notaires";a:0:{}s:11:"pharmaciens";a:0:{}s:11:"veterinaire";a:0:{}s:4:"gouv";a:0:{}}s:2:"kn";a:4:{s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}}s:2:"kp";a:6:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"rep";a:0:{}s:3:"tra";a:0:{}}s:2:"kr";a:29:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"es";a:0:{}s:2:"go";a:0:{}s:2:"hs";a:0:{}s:2:"kg";a:0:{}s:3:"mil";a:0:{}s:2:"ms";a:0:{}s:2:"ne";a:0:{}s:2:"or";a:0:{}s:2:"pe";a:0:{}s:2:"re";a:0:{}s:2:"sc";a:0:{}s:5:"busan";a:0:{}s:8:"chungbuk";a:0:{}s:8:"chungnam";a:0:{}s:5:"daegu";a:0:{}s:7:"daejeon";a:0:{}s:7:"gangwon";a:0:{}s:7:"gwangju";a:0:{}s:9:"gyeongbuk";a:0:{}s:8:"gyeonggi";a:0:{}s:9:"gyeongnam";a:0:{}s:7:"incheon";a:0:{}s:4:"jeju";a:0:{}s:7:"jeonbuk";a:0:{}s:7:"jeonnam";a:0:{}s:5:"seoul";a:0:{}s:5:"ulsan";a:0:{}}s:2:"kw";a:1:{s:1:"*";a:0:{}}s:2:"ky";a:5:{s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}}s:2:"kz";a:6:{s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:0:{}}s:2:"la";a:8:{s:3:"int";a:0:{}s:3:"net";a:0:{}s:4:"info";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"per";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}}s:2:"lb";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"lc";a:6:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:2:"co";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}}s:2:"li";a:0:{}s:2:"lk";a:15:{s:3:"gov";a:0:{}s:3:"sch";a:0:{}s:3:"net";a:0:{}s:3:"int";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"ngo";a:0:{}s:3:"soc";a:0:{}s:3:"web";a:0:{}s:3:"ltd";a:0:{}s:4:"assn";a:0:{}s:3:"grp";a:0:{}s:5:"hotel";a:0:{}s:2:"ac";a:0:{}}s:2:"lr";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}}s:2:"ls";a:2:{s:2:"co";a:0:{}s:3:"org";a:0:{}}s:2:"lt";a:1:{s:3:"gov";a:0:{}}s:2:"lu";a:0:{}s:2:"lv";a:9:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"mil";a:0:{}s:2:"id";a:0:{}s:3:"net";a:0:{}s:3:"asn";a:0:{}s:4:"conf";a:0:{}}s:2:"ly";a:9:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"plc";a:0:{}s:3:"edu";a:0:{}s:3:"sch";a:0:{}s:3:"med";a:0:{}s:3:"org";a:0:{}s:2:"id";a:0:{}}s:2:"ma";a:6:{s:2:"co";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:2:"ac";a:0:{}s:5:"press";a:0:{}}s:2:"mc";a:2:{s:2:"tm";a:0:{}s:4:"asso";a:0:{}}s:2:"md";a:0:{}s:2:"me";a:8:{s:2:"co";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:2:"ac";a:0:{}s:3:"gov";a:0:{}s:3:"its";a:0:{}s:4:"priv";a:0:{}}s:2:"mg";a:9:{s:3:"org";a:0:{}s:3:"nom";a:0:{}s:3:"gov";a:0:{}s:3:"prd";a:0:{}s:2:"tm";a:0:{}s:3:"edu";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:0:{}s:2:"co";a:0:{}}s:2:"mh";a:0:{}s:3:"mil";a:0:{}s:2:"mk";a:7:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"inf";a:0:{}s:4:"name";a:0:{}}s:2:"ml";a:7:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:4:"gouv";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:6:"presse";a:0:{}}s:2:"mm";a:1:{s:1:"*";a:0:{}}s:2:"mn";a:3:{s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}}s:2:"mo";a:5:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}}s:4:"mobi";a:0:{}s:2:"mp";a:0:{}s:2:"mq";a:0:{}s:2:"mr";a:1:{s:3:"gov";a:0:{}}s:2:"ms";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"mt";a:4:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"mu";a:7:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"or";a:0:{}}s:6:"museum";a:548:{s:7:"academy";a:0:{}s:11:"agriculture";a:0:{}s:3:"air";a:0:{}s:8:"airguard";a:0:{}s:7:"alabama";a:0:{}s:6:"alaska";a:0:{}s:5:"amber";a:0:{}s:9:"ambulance";a:0:{}s:8:"american";a:0:{}s:9:"americana";a:0:{}s:16:"americanantiques";a:0:{}s:11:"americanart";a:0:{}s:9:"amsterdam";a:0:{}s:3:"and";a:0:{}s:9:"annefrank";a:0:{}s:6:"anthro";a:0:{}s:12:"anthropology";a:0:{}s:8:"antiques";a:0:{}s:8:"aquarium";a:0:{}s:9:"arboretum";a:0:{}s:14:"archaeological";a:0:{}s:11:"archaeology";a:0:{}s:12:"architecture";a:0:{}s:3:"art";a:0:{}s:12:"artanddesign";a:0:{}s:9:"artcenter";a:0:{}s:7:"artdeco";a:0:{}s:12:"arteducation";a:0:{}s:10:"artgallery";a:0:{}s:4:"arts";a:0:{}s:13:"artsandcrafts";a:0:{}s:8:"asmatart";a:0:{}s:13:"assassination";a:0:{}s:6:"assisi";a:0:{}s:11:"association";a:0:{}s:9:"astronomy";a:0:{}s:7:"atlanta";a:0:{}s:6:"austin";a:0:{}s:9:"australia";a:0:{}s:10:"automotive";a:0:{}s:8:"aviation";a:0:{}s:4:"axis";a:0:{}s:7:"badajoz";a:0:{}s:7:"baghdad";a:0:{}s:4:"bahn";a:0:{}s:4:"bale";a:0:{}s:9:"baltimore";a:0:{}s:9:"barcelona";a:0:{}s:8:"baseball";a:0:{}s:5:"basel";a:0:{}s:5:"baths";a:0:{}s:6:"bauern";a:0:{}s:9:"beauxarts";a:0:{}s:13:"beeldengeluid";a:0:{}s:8:"bellevue";a:0:{}s:7:"bergbau";a:0:{}s:8:"berkeley";a:0:{}s:6:"berlin";a:0:{}s:4:"bern";a:0:{}s:5:"bible";a:0:{}s:6:"bilbao";a:0:{}s:4:"bill";a:0:{}s:7:"birdart";a:0:{}s:10:"birthplace";a:0:{}s:4:"bonn";a:0:{}s:6:"boston";a:0:{}s:9:"botanical";a:0:{}s:15:"botanicalgarden";a:0:{}s:13:"botanicgarden";a:0:{}s:6:"botany";a:0:{}s:16:"brandywinevalley";a:0:{}s:6:"brasil";a:0:{}s:7:"bristol";a:0:{}s:7:"british";a:0:{}s:15:"britishcolumbia";a:0:{}s:9:"broadcast";a:0:{}s:6:"brunel";a:0:{}s:7:"brussel";a:0:{}s:8:"brussels";a:0:{}s:9:"bruxelles";a:0:{}s:8:"building";a:0:{}s:7:"burghof";a:0:{}s:3:"bus";a:0:{}s:6:"bushey";a:0:{}s:8:"cadaques";a:0:{}s:10:"california";a:0:{}s:9:"cambridge";a:0:{}s:3:"can";a:0:{}s:6:"canada";a:0:{}s:10:"capebreton";a:0:{}s:7:"carrier";a:0:{}s:10:"cartoonart";a:0:{}s:14:"casadelamoneda";a:0:{}s:6:"castle";a:0:{}s:7:"castres";a:0:{}s:6:"celtic";a:0:{}s:6:"center";a:0:{}s:11:"chattanooga";a:0:{}s:10:"cheltenham";a:0:{}s:13:"chesapeakebay";a:0:{}s:7:"chicago";a:0:{}s:8:"children";a:0:{}s:9:"childrens";a:0:{}s:15:"childrensgarden";a:0:{}s:12:"chiropractic";a:0:{}s:9:"chocolate";a:0:{}s:14:"christiansburg";a:0:{}s:10:"cincinnati";a:0:{}s:6:"cinema";a:0:{}s:6:"circus";a:0:{}s:12:"civilisation";a:0:{}s:12:"civilization";a:0:{}s:8:"civilwar";a:0:{}s:7:"clinton";a:0:{}s:5:"clock";a:0:{}s:4:"coal";a:0:{}s:14:"coastaldefence";a:0:{}s:4:"cody";a:0:{}s:7:"coldwar";a:0:{}s:10:"collection";a:0:{}s:20:"colonialwilliamsburg";a:0:{}s:15:"coloradoplateau";a:0:{}s:8:"columbia";a:0:{}s:8:"columbus";a:0:{}s:13:"communication";a:0:{}s:14:"communications";a:0:{}s:9:"community";a:0:{}s:8:"computer";a:0:{}s:15:"computerhistory";a:0:{}s:20:"xn--comunicaes-v6a2o";a:0:{}s:12:"contemporary";a:0:{}s:15:"contemporaryart";a:0:{}s:7:"convent";a:0:{}s:10:"copenhagen";a:0:{}s:11:"corporation";a:0:{}s:36:"xn--correios-e-telecomunicaes-ghc29a";a:0:{}s:8:"corvette";a:0:{}s:7:"costume";a:0:{}s:13:"countryestate";a:0:{}s:6:"county";a:0:{}s:6:"crafts";a:0:{}s:9:"cranbrook";a:0:{}s:8:"creation";a:0:{}s:8:"cultural";a:0:{}s:14:"culturalcenter";a:0:{}s:7:"culture";a:0:{}s:5:"cyber";a:0:{}s:5:"cymru";a:0:{}s:4:"dali";a:0:{}s:6:"dallas";a:0:{}s:8:"database";a:0:{}s:3:"ddr";a:0:{}s:14:"decorativearts";a:0:{}s:8:"delaware";a:0:{}s:11:"delmenhorst";a:0:{}s:7:"denmark";a:0:{}s:5:"depot";a:0:{}s:6:"design";a:0:{}s:7:"detroit";a:0:{}s:8:"dinosaur";a:0:{}s:9:"discovery";a:0:{}s:5:"dolls";a:0:{}s:8:"donostia";a:0:{}s:6:"durham";a:0:{}s:10:"eastafrica";a:0:{}s:9:"eastcoast";a:0:{}s:9:"education";a:0:{}s:11:"educational";a:0:{}s:8:"egyptian";a:0:{}s:9:"eisenbahn";a:0:{}s:6:"elburg";a:0:{}s:10:"elvendrell";a:0:{}s:10:"embroidery";a:0:{}s:12:"encyclopedic";a:0:{}s:7:"england";a:0:{}s:10:"entomology";a:0:{}s:11:"environment";a:0:{}s:25:"environmentalconservation";a:0:{}s:8:"epilepsy";a:0:{}s:5:"essex";a:0:{}s:6:"estate";a:0:{}s:9:"ethnology";a:0:{}s:6:"exeter";a:0:{}s:10:"exhibition";a:0:{}s:6:"family";a:0:{}s:4:"farm";a:0:{}s:13:"farmequipment";a:0:{}s:7:"farmers";a:0:{}s:9:"farmstead";a:0:{}s:5:"field";a:0:{}s:8:"figueres";a:0:{}s:9:"filatelia";a:0:{}s:4:"film";a:0:{}s:7:"fineart";a:0:{}s:8:"finearts";a:0:{}s:7:"finland";a:0:{}s:8:"flanders";a:0:{}s:7:"florida";a:0:{}s:5:"force";a:0:{}s:12:"fortmissoula";a:0:{}s:9:"fortworth";a:0:{}s:10:"foundation";a:0:{}s:9:"francaise";a:0:{}s:9:"frankfurt";a:0:{}s:12:"franziskaner";a:0:{}s:11:"freemasonry";a:0:{}s:8:"freiburg";a:0:{}s:8:"fribourg";a:0:{}s:4:"frog";a:0:{}s:8:"fundacio";a:0:{}s:9:"furniture";a:0:{}s:7:"gallery";a:0:{}s:6:"garden";a:0:{}s:7:"gateway";a:0:{}s:9:"geelvinck";a:0:{}s:11:"gemological";a:0:{}s:7:"geology";a:0:{}s:7:"georgia";a:0:{}s:7:"giessen";a:0:{}s:4:"glas";a:0:{}s:5:"glass";a:0:{}s:5:"gorge";a:0:{}s:11:"grandrapids";a:0:{}s:4:"graz";a:0:{}s:8:"guernsey";a:0:{}s:10:"halloffame";a:0:{}s:7:"hamburg";a:0:{}s:7:"handson";a:0:{}s:18:"harvestcelebration";a:0:{}s:6:"hawaii";a:0:{}s:6:"health";a:0:{}s:14:"heimatunduhren";a:0:{}s:6:"hellas";a:0:{}s:8:"helsinki";a:0:{}s:15:"hembygdsforbund";a:0:{}s:8:"heritage";a:0:{}s:8:"histoire";a:0:{}s:10:"historical";a:0:{}s:17:"historicalsociety";a:0:{}s:14:"historichouses";a:0:{}s:10:"historisch";a:0:{}s:12:"historisches";a:0:{}s:7:"history";a:0:{}s:16:"historyofscience";a:0:{}s:8:"horology";a:0:{}s:5:"house";a:0:{}s:10:"humanities";a:0:{}s:12:"illustration";a:0:{}s:13:"imageandsound";a:0:{}s:6:"indian";a:0:{}s:7:"indiana";a:0:{}s:12:"indianapolis";a:0:{}s:12:"indianmarket";a:0:{}s:12:"intelligence";a:0:{}s:11:"interactive";a:0:{}s:4:"iraq";a:0:{}s:4:"iron";a:0:{}s:9:"isleofman";a:0:{}s:7:"jamison";a:0:{}s:9:"jefferson";a:0:{}s:9:"jerusalem";a:0:{}s:7:"jewelry";a:0:{}s:6:"jewish";a:0:{}s:9:"jewishart";a:0:{}s:3:"jfk";a:0:{}s:10:"journalism";a:0:{}s:7:"judaica";a:0:{}s:11:"judygarland";a:0:{}s:10:"juedisches";a:0:{}s:4:"juif";a:0:{}s:6:"karate";a:0:{}s:9:"karikatur";a:0:{}s:4:"kids";a:0:{}s:10:"koebenhavn";a:0:{}s:5:"koeln";a:0:{}s:5:"kunst";a:0:{}s:13:"kunstsammlung";a:0:{}s:14:"kunstunddesign";a:0:{}s:5:"labor";a:0:{}s:6:"labour";a:0:{}s:7:"lajolla";a:0:{}s:10:"lancashire";a:0:{}s:6:"landes";a:0:{}s:4:"lans";a:0:{}s:11:"xn--lns-qla";a:0:{}s:7:"larsson";a:0:{}s:11:"lewismiller";a:0:{}s:7:"lincoln";a:0:{}s:4:"linz";a:0:{}s:6:"living";a:0:{}s:13:"livinghistory";a:0:{}s:12:"localhistory";a:0:{}s:6:"london";a:0:{}s:10:"losangeles";a:0:{}s:6:"louvre";a:0:{}s:8:"loyalist";a:0:{}s:7:"lucerne";a:0:{}s:10:"luxembourg";a:0:{}s:6:"luzern";a:0:{}s:3:"mad";a:0:{}s:6:"madrid";a:0:{}s:8:"mallorca";a:0:{}s:10:"manchester";a:0:{}s:7:"mansion";a:0:{}s:8:"mansions";a:0:{}s:4:"manx";a:0:{}s:7:"marburg";a:0:{}s:8:"maritime";a:0:{}s:8:"maritimo";a:0:{}s:8:"maryland";a:0:{}s:10:"marylhurst";a:0:{}s:5:"media";a:0:{}s:7:"medical";a:0:{}s:19:"medizinhistorisches";a:0:{}s:6:"meeres";a:0:{}s:8:"memorial";a:0:{}s:9:"mesaverde";a:0:{}s:8:"michigan";a:0:{}s:11:"midatlantic";a:0:{}s:8:"military";a:0:{}s:4:"mill";a:0:{}s:6:"miners";a:0:{}s:6:"mining";a:0:{}s:9:"minnesota";a:0:{}s:7:"missile";a:0:{}s:8:"missoula";a:0:{}s:6:"modern";a:0:{}s:4:"moma";a:0:{}s:5:"money";a:0:{}s:8:"monmouth";a:0:{}s:10:"monticello";a:0:{}s:8:"montreal";a:0:{}s:6:"moscow";a:0:{}s:10:"motorcycle";a:0:{}s:8:"muenchen";a:0:{}s:8:"muenster";a:0:{}s:8:"mulhouse";a:0:{}s:6:"muncie";a:0:{}s:6:"museet";a:0:{}s:12:"museumcenter";a:0:{}s:16:"museumvereniging";a:0:{}s:5:"music";a:0:{}s:8:"national";a:0:{}s:16:"nationalfirearms";a:0:{}s:16:"nationalheritage";a:0:{}s:14:"nativeamerican";a:0:{}s:14:"naturalhistory";a:0:{}s:20:"naturalhistorymuseum";a:0:{}s:15:"naturalsciences";a:0:{}s:6:"nature";a:0:{}s:17:"naturhistorisches";a:0:{}s:19:"natuurwetenschappen";a:0:{}s:8:"naumburg";a:0:{}s:5:"naval";a:0:{}s:8:"nebraska";a:0:{}s:5:"neues";a:0:{}s:12:"newhampshire";a:0:{}s:9:"newjersey";a:0:{}s:9:"newmexico";a:0:{}s:7:"newport";a:0:{}s:9:"newspaper";a:0:{}s:7:"newyork";a:0:{}s:6:"niepce";a:0:{}s:7:"norfolk";a:0:{}s:5:"north";a:0:{}s:3:"nrw";a:0:{}s:9:"nuernberg";a:0:{}s:9:"nuremberg";a:0:{}s:3:"nyc";a:0:{}s:4:"nyny";a:0:{}s:13:"oceanographic";a:0:{}s:15:"oceanographique";a:0:{}s:5:"omaha";a:0:{}s:6:"online";a:0:{}s:7:"ontario";a:0:{}s:7:"openair";a:0:{}s:6:"oregon";a:0:{}s:11:"oregontrail";a:0:{}s:5:"otago";a:0:{}s:6:"oxford";a:0:{}s:7:"pacific";a:0:{}s:9:"paderborn";a:0:{}s:6:"palace";a:0:{}s:5:"paleo";a:0:{}s:11:"palmsprings";a:0:{}s:6:"panama";a:0:{}s:5:"paris";a:0:{}s:8:"pasadena";a:0:{}s:8:"pharmacy";a:0:{}s:12:"philadelphia";a:0:{}s:16:"philadelphiaarea";a:0:{}s:9:"philately";a:0:{}s:7:"phoenix";a:0:{}s:11:"photography";a:0:{}s:6:"pilots";a:0:{}s:10:"pittsburgh";a:0:{}s:11:"planetarium";a:0:{}s:10:"plantation";a:0:{}s:6:"plants";a:0:{}s:5:"plaza";a:0:{}s:6:"portal";a:0:{}s:8:"portland";a:0:{}s:10:"portlligat";a:0:{}s:28:"posts-and-telecommunications";a:0:{}s:12:"preservation";a:0:{}s:8:"presidio";a:0:{}s:5:"press";a:0:{}s:7:"project";a:0:{}s:6:"public";a:0:{}s:5:"pubol";a:0:{}s:6:"quebec";a:0:{}s:8:"railroad";a:0:{}s:7:"railway";a:0:{}s:8:"research";a:0:{}s:10:"resistance";a:0:{}s:12:"riodejaneiro";a:0:{}s:9:"rochester";a:0:{}s:7:"rockart";a:0:{}s:4:"roma";a:0:{}s:6:"russia";a:0:{}s:10:"saintlouis";a:0:{}s:5:"salem";a:0:{}s:12:"salvadordali";a:0:{}s:8:"salzburg";a:0:{}s:8:"sandiego";a:0:{}s:12:"sanfrancisco";a:0:{}s:12:"santabarbara";a:0:{}s:9:"santacruz";a:0:{}s:7:"santafe";a:0:{}s:12:"saskatchewan";a:0:{}s:4:"satx";a:0:{}s:10:"savannahga";a:0:{}s:12:"schlesisches";a:0:{}s:11:"schoenbrunn";a:0:{}s:11:"schokoladen";a:0:{}s:6:"school";a:0:{}s:7:"schweiz";a:0:{}s:7:"science";a:0:{}s:17:"scienceandhistory";a:0:{}s:18:"scienceandindustry";a:0:{}s:13:"sciencecenter";a:0:{}s:14:"sciencecenters";a:0:{}s:15:"science-fiction";a:0:{}s:14:"sciencehistory";a:0:{}s:8:"sciences";a:0:{}s:18:"sciencesnaturelles";a:0:{}s:8:"scotland";a:0:{}s:7:"seaport";a:0:{}s:10:"settlement";a:0:{}s:8:"settlers";a:0:{}s:5:"shell";a:0:{}s:10:"sherbrooke";a:0:{}s:7:"sibenik";a:0:{}s:4:"silk";a:0:{}s:3:"ski";a:0:{}s:5:"skole";a:0:{}s:7:"society";a:0:{}s:7:"sologne";a:0:{}s:14:"soundandvision";a:0:{}s:13:"southcarolina";a:0:{}s:9:"southwest";a:0:{}s:5:"space";a:0:{}s:3:"spy";a:0:{}s:6:"square";a:0:{}s:5:"stadt";a:0:{}s:8:"stalbans";a:0:{}s:9:"starnberg";a:0:{}s:5:"state";a:0:{}s:15:"stateofdelaware";a:0:{}s:7:"station";a:0:{}s:5:"steam";a:0:{}s:10:"steiermark";a:0:{}s:6:"stjohn";a:0:{}s:9:"stockholm";a:0:{}s:12:"stpetersburg";a:0:{}s:9:"stuttgart";a:0:{}s:6:"suisse";a:0:{}s:12:"surgeonshall";a:0:{}s:6:"surrey";a:0:{}s:8:"svizzera";a:0:{}s:6:"sweden";a:0:{}s:6:"sydney";a:0:{}s:4:"tank";a:0:{}s:3:"tcm";a:0:{}s:10:"technology";a:0:{}s:17:"telekommunikation";a:0:{}s:10:"television";a:0:{}s:5:"texas";a:0:{}s:7:"textile";a:0:{}s:7:"theater";a:0:{}s:4:"time";a:0:{}s:11:"timekeeping";a:0:{}s:8:"topology";a:0:{}s:6:"torino";a:0:{}s:5:"touch";a:0:{}s:4:"town";a:0:{}s:9:"transport";a:0:{}s:4:"tree";a:0:{}s:7:"trolley";a:0:{}s:5:"trust";a:0:{}s:7:"trustee";a:0:{}s:5:"uhren";a:0:{}s:3:"ulm";a:0:{}s:8:"undersea";a:0:{}s:10:"university";a:0:{}s:3:"usa";a:0:{}s:10:"usantiques";a:0:{}s:6:"usarts";a:0:{}s:15:"uscountryestate";a:0:{}s:9:"usculture";a:0:{}s:16:"usdecorativearts";a:0:{}s:8:"usgarden";a:0:{}s:9:"ushistory";a:0:{}s:7:"ushuaia";a:0:{}s:15:"uslivinghistory";a:0:{}s:4:"utah";a:0:{}s:4:"uvic";a:0:{}s:6:"valley";a:0:{}s:6:"vantaa";a:0:{}s:10:"versailles";a:0:{}s:6:"viking";a:0:{}s:7:"village";a:0:{}s:8:"virginia";a:0:{}s:7:"virtual";a:0:{}s:7:"virtuel";a:0:{}s:10:"vlaanderen";a:0:{}s:11:"volkenkunde";a:0:{}s:5:"wales";a:0:{}s:8:"wallonie";a:0:{}s:3:"war";a:0:{}s:12:"washingtondc";a:0:{}s:13:"watchandclock";a:0:{}s:15:"watch-and-clock";a:0:{}s:7:"western";a:0:{}s:9:"westfalen";a:0:{}s:7:"whaling";a:0:{}s:8:"wildlife";a:0:{}s:12:"williamsburg";a:0:{}s:8:"windmill";a:0:{}s:8:"workshop";a:0:{}s:4:"york";a:0:{}s:9:"yorkshire";a:0:{}s:8:"yosemite";a:0:{}s:5:"youth";a:0:{}s:10:"zoological";a:0:{}s:7:"zoology";a:0:{}s:14:"xn--9dbhblg6di";a:0:{}s:10:"xn--h1aegh";a:0:{}}s:2:"mv";a:14:{s:4:"aero";a:0:{}s:3:"biz";a:0:{}s:3:"com";a:0:{}s:4:"coop";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:6:"museum";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"pro";a:0:{}}s:2:"mw";a:11:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:4:"coop";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"int";a:0:{}s:6:"museum";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"mx";a:5:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"gob";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}}s:2:"my";a:7:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}}s:2:"mz";a:8:{s:2:"ac";a:0:{}s:3:"adv";a:0:{}s:2:"co";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"na";a:17:{s:4:"info";a:0:{}s:3:"pro";a:0:{}s:4:"name";a:0:{}s:6:"school";a:0:{}s:2:"or";a:0:{}s:2:"dr";a:0:{}s:2:"us";a:0:{}s:2:"mx";a:0:{}s:2:"ca";a:0:{}s:2:"in";a:0:{}s:2:"cc";a:0:{}s:2:"tv";a:0:{}s:2:"ws";a:0:{}s:4:"mobi";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}}s:4:"name";a:0:{}s:2:"nc";a:2:{s:4:"asso";a:0:{}s:3:"nom";a:0:{}}s:2:"ne";a:0:{}s:3:"net";a:0:{}s:2:"nf";a:10:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"per";a:0:{}s:3:"rec";a:0:{}s:3:"web";a:0:{}s:4:"arts";a:0:{}s:4:"firm";a:0:{}s:4:"info";a:0:{}s:5:"other";a:0:{}s:5:"store";a:0:{}}s:2:"ng";a:10:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:1:"i";a:0:{}s:3:"mil";a:0:{}s:4:"mobi";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sch";a:0:{}}s:2:"ni";a:14:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:2:"in";a:0:{}s:4:"info";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"nom";a:0:{}s:3:"org";a:0:{}s:3:"web";a:0:{}}s:2:"nl";a:1:{s:2:"bv";a:0:{}}s:2:"no";a:724:{s:3:"fhs";a:0:{}s:3:"vgs";a:0:{}s:10:"fylkesbibl";a:0:{}s:9:"folkebibl";a:0:{}s:6:"museum";a:0:{}s:6:"idrett";a:0:{}s:4:"priv";a:0:{}s:3:"mil";a:0:{}s:4:"stat";a:0:{}s:3:"dep";a:0:{}s:7:"kommune";a:0:{}s:5:"herad";a:0:{}s:2:"aa";a:1:{s:2:"gs";a:0:{}}s:2:"ah";a:1:{s:2:"gs";a:0:{}}s:2:"bu";a:1:{s:2:"gs";a:0:{}}s:2:"fm";a:1:{s:2:"gs";a:0:{}}s:2:"hl";a:1:{s:2:"gs";a:0:{}}s:2:"hm";a:1:{s:2:"gs";a:0:{}}s:9:"jan-mayen";a:1:{s:2:"gs";a:0:{}}s:2:"mr";a:1:{s:2:"gs";a:0:{}}s:2:"nl";a:1:{s:2:"gs";a:0:{}}s:2:"nt";a:1:{s:2:"gs";a:0:{}}s:2:"of";a:1:{s:2:"gs";a:0:{}}s:2:"ol";a:1:{s:2:"gs";a:0:{}}s:4:"oslo";a:1:{s:2:"gs";a:0:{}}s:2:"rl";a:1:{s:2:"gs";a:0:{}}s:2:"sf";a:1:{s:2:"gs";a:0:{}}s:2:"st";a:1:{s:2:"gs";a:0:{}}s:8:"svalbard";a:1:{s:2:"gs";a:0:{}}s:2:"tm";a:1:{s:2:"gs";a:0:{}}s:2:"tr";a:1:{s:2:"gs";a:0:{}}s:2:"va";a:1:{s:2:"gs";a:0:{}}s:2:"vf";a:1:{s:2:"gs";a:0:{}}s:8:"akrehamn";a:0:{}s:15:"xn--krehamn-dxa";a:0:{}s:6:"algard";a:0:{}s:13:"xn--lgrd-poac";a:0:{}s:4:"arna";a:0:{}s:10:"brumunddal";a:0:{}s:5:"bryne";a:0:{}s:11:"bronnoysund";a:0:{}s:18:"xn--brnnysund-m8ac";a:0:{}s:6:"drobak";a:0:{}s:13:"xn--drbak-wua";a:0:{}s:8:"egersund";a:0:{}s:7:"fetsund";a:0:{}s:5:"floro";a:0:{}s:12:"xn--flor-jra";a:0:{}s:11:"fredrikstad";a:0:{}s:8:"hokksund";a:0:{}s:8:"honefoss";a:0:{}s:15:"xn--hnefoss-q1a";a:0:{}s:8:"jessheim";a:0:{}s:9:"jorpeland";a:0:{}s:16:"xn--jrpeland-54a";a:0:{}s:8:"kirkenes";a:0:{}s:8:"kopervik";a:0:{}s:12:"krokstadelva";a:0:{}s:8:"langevag";a:0:{}s:15:"xn--langevg-jxa";a:0:{}s:7:"leirvik";a:0:{}s:9:"mjondalen";a:0:{}s:16:"xn--mjndalen-64a";a:0:{}s:9:"mo-i-rana";a:0:{}s:7:"mosjoen";a:0:{}s:14:"xn--mosjen-eya";a:0:{}s:12:"nesoddtangen";a:0:{}s:8:"orkanger";a:0:{}s:6:"osoyro";a:0:{}s:13:"xn--osyro-wua";a:0:{}s:6:"raholt";a:0:{}s:13:"xn--rholt-mra";a:0:{}s:12:"sandnessjoen";a:0:{}s:19:"xn--sandnessjen-ogb";a:0:{}s:13:"skedsmokorset";a:0:{}s:7:"slattum";a:0:{}s:10:"spjelkavik";a:0:{}s:9:"stathelle";a:0:{}s:7:"stavern";a:0:{}s:15:"stjordalshalsen";a:0:{}s:22:"xn--stjrdalshalsen-sqb";a:0:{}s:8:"tananger";a:0:{}s:6:"tranby";a:0:{}s:11:"vossevangen";a:0:{}s:6:"afjord";a:0:{}s:13:"xn--fjord-lra";a:0:{}s:7:"agdenes";a:0:{}s:2:"al";a:0:{}s:9:"xn--l-1fa";a:0:{}s:7:"alesund";a:0:{}s:14:"xn--lesund-hua";a:0:{}s:9:"alstahaug";a:0:{}s:4:"alta";a:0:{}s:11:"xn--lt-liac";a:0:{}s:9:"alaheadju";a:0:{}s:16:"xn--laheadju-7ya";a:0:{}s:6:"alvdal";a:0:{}s:4:"amli";a:0:{}s:11:"xn--mli-tla";a:0:{}s:4:"amot";a:0:{}s:11:"xn--mot-tla";a:0:{}s:6:"andebu";a:0:{}s:5:"andoy";a:0:{}s:12:"xn--andy-ira";a:0:{}s:9:"andasuolo";a:0:{}s:5:"ardal";a:0:{}s:12:"xn--rdal-poa";a:0:{}s:7:"aremark";a:0:{}s:7:"arendal";a:0:{}s:9:"xn--s-1fa";a:0:{}s:6:"aseral";a:0:{}s:13:"xn--seral-lra";a:0:{}s:5:"asker";a:0:{}s:5:"askim";a:0:{}s:7:"askvoll";a:0:{}s:5:"askoy";a:0:{}s:12:"xn--asky-ira";a:0:{}s:5:"asnes";a:0:{}s:12:"xn--snes-poa";a:0:{}s:9:"audnedaln";a:0:{}s:5:"aukra";a:0:{}s:4:"aure";a:0:{}s:7:"aurland";a:0:{}s:14:"aurskog-holand";a:0:{}s:21:"xn--aurskog-hland-jnb";a:0:{}s:9:"austevoll";a:0:{}s:9:"austrheim";a:0:{}s:6:"averoy";a:0:{}s:13:"xn--avery-yua";a:0:{}s:10:"balestrand";a:0:{}s:9:"ballangen";a:0:{}s:5:"balat";a:0:{}s:12:"xn--blt-elab";a:0:{}s:9:"balsfjord";a:0:{}s:12:"bahccavuotna";a:0:{}s:19:"xn--bhccavuotna-k7a";a:0:{}s:6:"bamble";a:0:{}s:5:"bardu";a:0:{}s:6:"beardu";a:0:{}s:6:"beiarn";a:0:{}s:7:"bajddar";a:0:{}s:14:"xn--bjddar-pta";a:0:{}s:6:"baidar";a:0:{}s:13:"xn--bidr-5nac";a:0:{}s:4:"berg";a:0:{}s:6:"bergen";a:0:{}s:8:"berlevag";a:0:{}s:15:"xn--berlevg-jxa";a:0:{}s:11:"bearalvahki";a:0:{}s:18:"xn--bearalvhki-y4a";a:0:{}s:6:"bindal";a:0:{}s:8:"birkenes";a:0:{}s:7:"bjarkoy";a:0:{}s:14:"xn--bjarky-fya";a:0:{}s:9:"bjerkreim";a:0:{}s:5:"bjugn";a:0:{}s:4:"bodo";a:0:{}s:11:"xn--bod-2na";a:0:{}s:8:"badaddja";a:0:{}s:15:"xn--bdddj-mrabd";a:0:{}s:7:"budejju";a:0:{}s:4:"bokn";a:0:{}s:9:"bremanger";a:0:{}s:7:"bronnoy";a:0:{}s:14:"xn--brnny-wuac";a:0:{}s:7:"bygland";a:0:{}s:5:"bykle";a:0:{}s:5:"barum";a:0:{}s:12:"xn--brum-voa";a:0:{}s:8:"telemark";a:2:{s:2:"bo";a:0:{}s:9:"xn--b-5ga";a:0:{}}s:8:"nordland";a:4:{s:2:"bo";a:0:{}s:9:"xn--b-5ga";a:0:{}s:5:"heroy";a:0:{}s:12:"xn--hery-ira";a:0:{}}s:6:"bievat";a:0:{}s:13:"xn--bievt-0qa";a:0:{}s:5:"bomlo";a:0:{}s:12:"xn--bmlo-gra";a:0:{}s:9:"batsfjord";a:0:{}s:16:"xn--btsfjord-9za";a:0:{}s:11:"bahcavuotna";a:0:{}s:18:"xn--bhcavuotna-s4a";a:0:{}s:5:"dovre";a:0:{}s:7:"drammen";a:0:{}s:9:"drangedal";a:0:{}s:5:"dyroy";a:0:{}s:12:"xn--dyry-ira";a:0:{}s:5:"donna";a:0:{}s:12:"xn--dnna-gra";a:0:{}s:3:"eid";a:0:{}s:8:"eidfjord";a:0:{}s:8:"eidsberg";a:0:{}s:7:"eidskog";a:0:{}s:8:"eidsvoll";a:0:{}s:9:"eigersund";a:0:{}s:7:"elverum";a:0:{}s:7:"enebakk";a:0:{}s:8:"engerdal";a:0:{}s:4:"etne";a:0:{}s:7:"etnedal";a:0:{}s:6:"evenes";a:0:{}s:8:"evenassi";a:0:{}s:17:"xn--eveni-0qa01ga";a:0:{}s:15:"evje-og-hornnes";a:0:{}s:7:"farsund";a:0:{}s:6:"fauske";a:0:{}s:7:"fuossko";a:0:{}s:7:"fuoisku";a:0:{}s:5:"fedje";a:0:{}s:3:"fet";a:0:{}s:6:"finnoy";a:0:{}s:13:"xn--finny-yua";a:0:{}s:6:"fitjar";a:0:{}s:6:"fjaler";a:0:{}s:5:"fjell";a:0:{}s:8:"flakstad";a:0:{}s:9:"flatanger";a:0:{}s:11:"flekkefjord";a:0:{}s:8:"flesberg";a:0:{}s:5:"flora";a:0:{}s:3:"fla";a:0:{}s:10:"xn--fl-zia";a:0:{}s:7:"folldal";a:0:{}s:7:"forsand";a:0:{}s:6:"fosnes";a:0:{}s:4:"frei";a:0:{}s:5:"frogn";a:0:{}s:7:"froland";a:0:{}s:6:"frosta";a:0:{}s:5:"frana";a:0:{}s:12:"xn--frna-woa";a:0:{}s:5:"froya";a:0:{}s:12:"xn--frya-hra";a:0:{}s:4:"fusa";a:0:{}s:8:"fyresdal";a:0:{}s:5:"forde";a:0:{}s:12:"xn--frde-gra";a:0:{}s:6:"gamvik";a:0:{}s:10:"gangaviika";a:0:{}s:19:"xn--ggaviika-8ya47h";a:0:{}s:6:"gaular";a:0:{}s:7:"gausdal";a:0:{}s:9:"gildeskal";a:0:{}s:16:"xn--gildeskl-g0a";a:0:{}s:5:"giske";a:0:{}s:7:"gjemnes";a:0:{}s:8:"gjerdrum";a:0:{}s:8:"gjerstad";a:0:{}s:7:"gjesdal";a:0:{}s:6:"gjovik";a:0:{}s:13:"xn--gjvik-wua";a:0:{}s:7:"gloppen";a:0:{}s:3:"gol";a:0:{}s:4:"gran";a:0:{}s:5:"grane";a:0:{}s:7:"granvin";a:0:{}s:9:"gratangen";a:0:{}s:8:"grimstad";a:0:{}s:5:"grong";a:0:{}s:9:"kraanghke";a:0:{}s:16:"xn--kranghke-b0a";a:0:{}s:4:"grue";a:0:{}s:5:"gulen";a:0:{}s:6:"hadsel";a:0:{}s:6:"halden";a:0:{}s:5:"halsa";a:0:{}s:5:"hamar";a:0:{}s:7:"hamaroy";a:0:{}s:6:"habmer";a:0:{}s:13:"xn--hbmer-xqa";a:0:{}s:6:"hapmir";a:0:{}s:13:"xn--hpmir-xqa";a:0:{}s:10:"hammerfest";a:0:{}s:12:"hammarfeasta";a:0:{}s:19:"xn--hmmrfeasta-s4ac";a:0:{}s:5:"haram";a:0:{}s:6:"hareid";a:0:{}s:7:"harstad";a:0:{}s:6:"hasvik";a:0:{}s:10:"aknoluokta";a:0:{}s:19:"xn--koluokta-7ya57h";a:0:{}s:12:"hattfjelldal";a:0:{}s:8:"aarborte";a:0:{}s:9:"haugesund";a:0:{}s:5:"hemne";a:0:{}s:6:"hemnes";a:0:{}s:8:"hemsedal";a:0:{}s:15:"more-og-romsdal";a:2:{s:5:"heroy";a:0:{}s:5:"sande";a:0:{}}s:22:"xn--mre-og-romsdal-qqb";a:2:{s:12:"xn--hery-ira";a:0:{}s:5:"sande";a:0:{}}s:5:"hitra";a:0:{}s:8:"hjartdal";a:0:{}s:10:"hjelmeland";a:0:{}s:5:"hobol";a:0:{}s:12:"xn--hobl-ira";a:0:{}s:3:"hof";a:0:{}s:3:"hol";a:0:{}s:4:"hole";a:0:{}s:11:"holmestrand";a:0:{}s:8:"holtalen";a:0:{}s:15:"xn--holtlen-hxa";a:0:{}s:9:"hornindal";a:0:{}s:6:"horten";a:0:{}s:6:"hurdal";a:0:{}s:5:"hurum";a:0:{}s:6:"hvaler";a:0:{}s:9:"hyllestad";a:0:{}s:10:"hagebostad";a:0:{}s:17:"xn--hgebostad-g3a";a:0:{}s:8:"hoyanger";a:0:{}s:15:"xn--hyanger-q1a";a:0:{}s:9:"hoylandet";a:0:{}s:16:"xn--hylandet-54a";a:0:{}s:2:"ha";a:0:{}s:9:"xn--h-2fa";a:0:{}s:7:"ibestad";a:0:{}s:7:"inderoy";a:0:{}s:14:"xn--indery-fya";a:0:{}s:7:"iveland";a:0:{}s:8:"jevnaker";a:0:{}s:6:"jondal";a:0:{}s:7:"jolster";a:0:{}s:14:"xn--jlster-bya";a:0:{}s:8:"karasjok";a:0:{}s:10:"karasjohka";a:0:{}s:19:"xn--krjohka-hwab49j";a:0:{}s:7:"karlsoy";a:0:{}s:5:"galsa";a:0:{}s:12:"xn--gls-elac";a:0:{}s:6:"karmoy";a:0:{}s:13:"xn--karmy-yua";a:0:{}s:10:"kautokeino";a:0:{}s:13:"guovdageaidnu";a:0:{}s:5:"klepp";a:0:{}s:5:"klabu";a:0:{}s:12:"xn--klbu-woa";a:0:{}s:9:"kongsberg";a:0:{}s:11:"kongsvinger";a:0:{}s:7:"kragero";a:0:{}s:14:"xn--krager-gya";a:0:{}s:12:"kristiansand";a:0:{}s:12:"kristiansund";a:0:{}s:10:"krodsherad";a:0:{}s:17:"xn--krdsherad-m8a";a:0:{}s:8:"kvalsund";a:0:{}s:11:"rahkkeravju";a:0:{}s:18:"xn--rhkkervju-01af";a:0:{}s:4:"kvam";a:0:{}s:9:"kvinesdal";a:0:{}s:10:"kvinnherad";a:0:{}s:9:"kviteseid";a:0:{}s:7:"kvitsoy";a:0:{}s:14:"xn--kvitsy-fya";a:0:{}s:8:"kvafjord";a:0:{}s:15:"xn--kvfjord-nxa";a:0:{}s:13:"giehtavuoatna";a:0:{}s:9:"kvanangen";a:0:{}s:16:"xn--kvnangen-k0a";a:0:{}s:8:"navuotna";a:0:{}s:15:"xn--nvuotna-hwa";a:0:{}s:7:"kafjord";a:0:{}s:14:"xn--kfjord-iua";a:0:{}s:9:"gaivuotna";a:0:{}s:16:"xn--givuotna-8ya";a:0:{}s:6:"larvik";a:0:{}s:8:"lavangen";a:0:{}s:7:"lavagis";a:0:{}s:6:"loabat";a:0:{}s:13:"xn--loabt-0qa";a:0:{}s:7:"lebesby";a:0:{}s:10:"davvesiida";a:0:{}s:9:"leikanger";a:0:{}s:9:"leirfjord";a:0:{}s:4:"leka";a:0:{}s:7:"leksvik";a:0:{}s:6:"lenvik";a:0:{}s:11:"leangaviika";a:0:{}s:18:"xn--leagaviika-52b";a:0:{}s:5:"lesja";a:0:{}s:8:"levanger";a:0:{}s:4:"lier";a:0:{}s:6:"lierne";a:0:{}s:11:"lillehammer";a:0:{}s:9:"lillesand";a:0:{}s:9:"lindesnes";a:0:{}s:6:"lindas";a:0:{}s:13:"xn--linds-pra";a:0:{}s:3:"lom";a:0:{}s:5:"loppa";a:0:{}s:6:"lahppi";a:0:{}s:13:"xn--lhppi-xqa";a:0:{}s:4:"lund";a:0:{}s:6:"lunner";a:0:{}s:5:"luroy";a:0:{}s:12:"xn--lury-ira";a:0:{}s:6:"luster";a:0:{}s:7:"lyngdal";a:0:{}s:6:"lyngen";a:0:{}s:4:"ivgu";a:0:{}s:6:"lardal";a:0:{}s:6:"lerdal";a:0:{}s:13:"xn--lrdal-sra";a:0:{}s:8:"lodingen";a:0:{}s:15:"xn--ldingen-q1a";a:0:{}s:9:"lorenskog";a:0:{}s:16:"xn--lrenskog-54a";a:0:{}s:5:"loten";a:0:{}s:12:"xn--lten-gra";a:0:{}s:6:"malvik";a:0:{}s:5:"masoy";a:0:{}s:13:"xn--msy-ula0h";a:0:{}s:6:"muosat";a:0:{}s:13:"xn--muost-0qa";a:0:{}s:6:"mandal";a:0:{}s:6:"marker";a:0:{}s:9:"marnardal";a:0:{}s:10:"masfjorden";a:0:{}s:6:"meland";a:0:{}s:6:"meldal";a:0:{}s:6:"melhus";a:0:{}s:5:"meloy";a:0:{}s:12:"xn--mely-ira";a:0:{}s:7:"meraker";a:0:{}s:14:"xn--merker-kua";a:0:{}s:7:"moareke";a:0:{}s:14:"xn--moreke-jua";a:0:{}s:7:"midsund";a:0:{}s:14:"midtre-gauldal";a:0:{}s:7:"modalen";a:0:{}s:5:"modum";a:0:{}s:5:"molde";a:0:{}s:8:"moskenes";a:0:{}s:4:"moss";a:0:{}s:6:"mosvik";a:0:{}s:7:"malselv";a:0:{}s:14:"xn--mlselv-iua";a:0:{}s:11:"malatvuopmi";a:0:{}s:18:"xn--mlatvuopmi-s4a";a:0:{}s:10:"namdalseid";a:0:{}s:6:"aejrie";a:0:{}s:6:"namsos";a:0:{}s:10:"namsskogan";a:0:{}s:14:"naamesjevuemie";a:0:{}s:21:"xn--nmesjevuemie-tcba";a:0:{}s:12:"laakesvuemie";a:0:{}s:9:"nannestad";a:0:{}s:6:"narvik";a:0:{}s:8:"narviika";a:0:{}s:8:"naustdal";a:0:{}s:11:"nedre-eiker";a:0:{}s:8:"akershus";a:1:{s:3:"nes";a:0:{}}s:8:"buskerud";a:1:{s:3:"nes";a:0:{}}s:5:"nesna";a:0:{}s:8:"nesodden";a:0:{}s:7:"nesseby";a:0:{}s:7:"unjarga";a:0:{}s:14:"xn--unjrga-rta";a:0:{}s:6:"nesset";a:0:{}s:8:"nissedal";a:0:{}s:8:"nittedal";a:0:{}s:11:"nord-aurdal";a:0:{}s:9:"nord-fron";a:0:{}s:9:"nord-odal";a:0:{}s:7:"norddal";a:0:{}s:8:"nordkapp";a:0:{}s:11:"davvenjarga";a:0:{}s:18:"xn--davvenjrga-y4a";a:0:{}s:11:"nordre-land";a:0:{}s:9:"nordreisa";a:0:{}s:5:"raisa";a:0:{}s:12:"xn--risa-5na";a:0:{}s:13:"nore-og-uvdal";a:0:{}s:8:"notodden";a:0:{}s:5:"naroy";a:0:{}s:13:"xn--nry-yla5g";a:0:{}s:8:"notteroy";a:0:{}s:15:"xn--nttery-byae";a:0:{}s:4:"odda";a:0:{}s:6:"oksnes";a:0:{}s:13:"xn--ksnes-uua";a:0:{}s:6:"oppdal";a:0:{}s:8:"oppegard";a:0:{}s:15:"xn--oppegrd-ixa";a:0:{}s:6:"orkdal";a:0:{}s:6:"orland";a:0:{}s:13:"xn--rland-uua";a:0:{}s:6:"orskog";a:0:{}s:13:"xn--rskog-uua";a:0:{}s:5:"orsta";a:0:{}s:12:"xn--rsta-fra";a:0:{}s:7:"hedmark";a:3:{s:2:"os";a:0:{}s:5:"valer";a:0:{}s:12:"xn--vler-qoa";a:0:{}}s:9:"hordaland";a:1:{s:2:"os";a:0:{}}s:4:"osen";a:0:{}s:7:"osteroy";a:0:{}s:14:"xn--ostery-fya";a:0:{}s:11:"ostre-toten";a:0:{}s:18:"xn--stre-toten-zcb";a:0:{}s:9:"overhalla";a:0:{}s:10:"ovre-eiker";a:0:{}s:17:"xn--vre-eiker-k8a";a:0:{}s:4:"oyer";a:0:{}s:11:"xn--yer-zna";a:0:{}s:8:"oygarden";a:0:{}s:15:"xn--ygarden-p1a";a:0:{}s:13:"oystre-slidre";a:0:{}s:20:"xn--ystre-slidre-ujb";a:0:{}s:9:"porsanger";a:0:{}s:8:"porsangu";a:0:{}s:17:"xn--porsgu-sta26f";a:0:{}s:9:"porsgrunn";a:0:{}s:5:"radoy";a:0:{}s:12:"xn--rady-ira";a:0:{}s:9:"rakkestad";a:0:{}s:4:"rana";a:0:{}s:6:"ruovat";a:0:{}s:9:"randaberg";a:0:{}s:5:"rauma";a:0:{}s:8:"rendalen";a:0:{}s:7:"rennebu";a:0:{}s:8:"rennesoy";a:0:{}s:15:"xn--rennesy-v1a";a:0:{}s:6:"rindal";a:0:{}s:7:"ringebu";a:0:{}s:9:"ringerike";a:0:{}s:9:"ringsaker";a:0:{}s:5:"rissa";a:0:{}s:5:"risor";a:0:{}s:12:"xn--risr-ira";a:0:{}s:4:"roan";a:0:{}s:6:"rollag";a:0:{}s:5:"rygge";a:0:{}s:8:"ralingen";a:0:{}s:15:"xn--rlingen-mxa";a:0:{}s:5:"rodoy";a:0:{}s:12:"xn--rdy-0nab";a:0:{}s:7:"romskog";a:0:{}s:14:"xn--rmskog-bya";a:0:{}s:5:"roros";a:0:{}s:12:"xn--rros-gra";a:0:{}s:4:"rost";a:0:{}s:11:"xn--rst-0na";a:0:{}s:6:"royken";a:0:{}s:13:"xn--ryken-vua";a:0:{}s:7:"royrvik";a:0:{}s:14:"xn--ryrvik-bya";a:0:{}s:4:"rade";a:0:{}s:11:"xn--rde-ula";a:0:{}s:8:"salangen";a:0:{}s:7:"siellak";a:0:{}s:7:"saltdal";a:0:{}s:5:"salat";a:0:{}s:12:"xn--slt-elab";a:0:{}s:12:"xn--slat-5na";a:0:{}s:9:"samnanger";a:0:{}s:8:"vestfold";a:1:{s:5:"sande";a:0:{}}s:10:"sandefjord";a:0:{}s:7:"sandnes";a:0:{}s:6:"sandoy";a:0:{}s:13:"xn--sandy-yua";a:0:{}s:9:"sarpsborg";a:0:{}s:5:"sauda";a:0:{}s:8:"sauherad";a:0:{}s:3:"sel";a:0:{}s:5:"selbu";a:0:{}s:5:"selje";a:0:{}s:7:"seljord";a:0:{}s:6:"sigdal";a:0:{}s:6:"siljan";a:0:{}s:6:"sirdal";a:0:{}s:5:"skaun";a:0:{}s:7:"skedsmo";a:0:{}s:3:"ski";a:0:{}s:5:"skien";a:0:{}s:8:"skiptvet";a:0:{}s:8:"skjervoy";a:0:{}s:15:"xn--skjervy-v1a";a:0:{}s:7:"skierva";a:0:{}s:14:"xn--skierv-uta";a:0:{}s:5:"skjak";a:0:{}s:12:"xn--skjk-soa";a:0:{}s:6:"skodje";a:0:{}s:8:"skanland";a:0:{}s:15:"xn--sknland-fxa";a:0:{}s:6:"skanit";a:0:{}s:13:"xn--sknit-yqa";a:0:{}s:5:"smola";a:0:{}s:12:"xn--smla-hra";a:0:{}s:10:"snillfjord";a:0:{}s:5:"snasa";a:0:{}s:12:"xn--snsa-roa";a:0:{}s:6:"snoasa";a:0:{}s:6:"snaase";a:0:{}s:13:"xn--snase-nra";a:0:{}s:7:"sogndal";a:0:{}s:7:"sokndal";a:0:{}s:4:"sola";a:0:{}s:6:"solund";a:0:{}s:9:"songdalen";a:0:{}s:8:"sortland";a:0:{}s:9:"spydeberg";a:0:{}s:6:"stange";a:0:{}s:9:"stavanger";a:0:{}s:7:"steigen";a:0:{}s:9:"steinkjer";a:0:{}s:8:"stjordal";a:0:{}s:15:"xn--stjrdal-s1a";a:0:{}s:6:"stokke";a:0:{}s:11:"stor-elvdal";a:0:{}s:5:"stord";a:0:{}s:7:"stordal";a:0:{}s:9:"storfjord";a:0:{}s:10:"omasvuotna";a:0:{}s:6:"strand";a:0:{}s:7:"stranda";a:0:{}s:5:"stryn";a:0:{}s:4:"sula";a:0:{}s:6:"suldal";a:0:{}s:4:"sund";a:0:{}s:7:"sunndal";a:0:{}s:8:"surnadal";a:0:{}s:5:"sveio";a:0:{}s:7:"svelvik";a:0:{}s:9:"sykkylven";a:0:{}s:5:"sogne";a:0:{}s:12:"xn--sgne-gra";a:0:{}s:5:"somna";a:0:{}s:12:"xn--smna-gra";a:0:{}s:11:"sondre-land";a:0:{}s:18:"xn--sndre-land-0cb";a:0:{}s:10:"sor-aurdal";a:0:{}s:17:"xn--sr-aurdal-l8a";a:0:{}s:8:"sor-fron";a:0:{}s:15:"xn--sr-fron-q1a";a:0:{}s:8:"sor-odal";a:0:{}s:15:"xn--sr-odal-q1a";a:0:{}s:12:"sor-varanger";a:0:{}s:19:"xn--sr-varanger-ggb";a:0:{}s:13:"matta-varjjat";a:0:{}s:20:"xn--mtta-vrjjat-k7af";a:0:{}s:7:"sorfold";a:0:{}s:14:"xn--srfold-bya";a:0:{}s:8:"sorreisa";a:0:{}s:15:"xn--srreisa-q1a";a:0:{}s:5:"sorum";a:0:{}s:12:"xn--srum-gra";a:0:{}s:4:"tana";a:0:{}s:6:"deatnu";a:0:{}s:4:"time";a:0:{}s:8:"tingvoll";a:0:{}s:4:"tinn";a:0:{}s:9:"tjeldsund";a:0:{}s:13:"dielddanuorri";a:0:{}s:5:"tjome";a:0:{}s:12:"xn--tjme-hra";a:0:{}s:5:"tokke";a:0:{}s:5:"tolga";a:0:{}s:7:"torsken";a:0:{}s:6:"tranoy";a:0:{}s:13:"xn--trany-yua";a:0:{}s:6:"tromso";a:0:{}s:13:"xn--troms-zua";a:0:{}s:6:"tromsa";a:0:{}s:5:"romsa";a:0:{}s:9:"trondheim";a:0:{}s:8:"troandin";a:0:{}s:6:"trysil";a:0:{}s:5:"trana";a:0:{}s:12:"xn--trna-woa";a:0:{}s:8:"trogstad";a:0:{}s:15:"xn--trgstad-r1a";a:0:{}s:11:"tvedestrand";a:0:{}s:5:"tydal";a:0:{}s:6:"tynset";a:0:{}s:8:"tysfjord";a:0:{}s:12:"divtasvuodna";a:0:{}s:13:"divttasvuotna";a:0:{}s:6:"tysnes";a:0:{}s:6:"tysvar";a:0:{}s:13:"xn--tysvr-vra";a:0:{}s:8:"tonsberg";a:0:{}s:15:"xn--tnsberg-q1a";a:0:{}s:10:"ullensaker";a:0:{}s:10:"ullensvang";a:0:{}s:5:"ulvik";a:0:{}s:6:"utsira";a:0:{}s:5:"vadso";a:0:{}s:12:"xn--vads-jra";a:0:{}s:10:"cahcesuolo";a:0:{}s:19:"xn--hcesuolo-7ya35b";a:0:{}s:7:"vaksdal";a:0:{}s:5:"valle";a:0:{}s:4:"vang";a:0:{}s:8:"vanylven";a:0:{}s:5:"vardo";a:0:{}s:12:"xn--vard-jra";a:0:{}s:7:"varggat";a:0:{}s:14:"xn--vrggt-xqad";a:0:{}s:5:"vefsn";a:0:{}s:7:"vaapste";a:0:{}s:4:"vega";a:0:{}s:9:"vegarshei";a:0:{}s:16:"xn--vegrshei-c0a";a:0:{}s:8:"vennesla";a:0:{}s:6:"verdal";a:0:{}s:6:"verran";a:0:{}s:6:"vestby";a:0:{}s:7:"vestnes";a:0:{}s:13:"vestre-slidre";a:0:{}s:12:"vestre-toten";a:0:{}s:9:"vestvagoy";a:0:{}s:17:"xn--vestvgy-ixa6o";a:0:{}s:9:"vevelstad";a:0:{}s:3:"vik";a:0:{}s:5:"vikna";a:0:{}s:10:"vindafjord";a:0:{}s:5:"volda";a:0:{}s:4:"voss";a:0:{}s:5:"varoy";a:0:{}s:13:"xn--vry-yla5g";a:0:{}s:5:"vagan";a:0:{}s:12:"xn--vgan-qoa";a:0:{}s:6:"voagat";a:0:{}s:6:"vagsoy";a:0:{}s:14:"xn--vgsy-qoa0j";a:0:{}s:4:"vaga";a:0:{}s:11:"xn--vg-yiab";a:0:{}s:7:"ostfold";a:1:{s:5:"valer";a:0:{}}s:14:"xn--stfold-9xa";a:1:{s:12:"xn--vler-qoa";a:0:{}}}s:2:"np";a:1:{s:1:"*";a:0:{}}s:2:"nr";a:7:{s:3:"biz";a:0:{}s:4:"info";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"com";a:0:{}}s:2:"nu";a:0:{}s:2:"nz";a:16:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:3:"cri";a:0:{}s:4:"geek";a:0:{}s:3:"gen";a:0:{}s:4:"govt";a:0:{}s:6:"health";a:0:{}s:3:"iwi";a:0:{}s:4:"kiwi";a:0:{}s:5:"maori";a:0:{}s:3:"mil";a:0:{}s:12:"xn--mori-qsa";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:10:"parliament";a:0:{}s:6:"school";a:0:{}}s:2:"om";a:9:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"med";a:0:{}s:6:"museum";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"pro";a:0:{}}s:5:"onion";a:0:{}s:3:"org";a:0:{}s:2:"pa";a:11:{s:2:"ac";a:0:{}s:3:"gob";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"sld";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"ing";a:0:{}s:3:"abo";a:0:{}s:3:"med";a:0:{}s:3:"nom";a:0:{}}s:2:"pe";a:7:{s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:3:"nom";a:0:{}s:3:"mil";a:0:{}s:3:"org";a:0:{}s:3:"com";a:0:{}s:3:"net";a:0:{}}s:2:"pf";a:3:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}}s:2:"pg";a:1:{s:1:"*";a:0:{}}s:2:"ph";a:8:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"ngo";a:0:{}s:3:"mil";a:0:{}s:1:"i";a:0:{}}s:2:"pk";a:14:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:3:"fam";a:0:{}s:3:"biz";a:0:{}s:3:"web";a:0:{}s:3:"gov";a:0:{}s:3:"gob";a:0:{}s:3:"gok";a:0:{}s:3:"gon";a:0:{}s:3:"gop";a:0:{}s:3:"gos";a:0:{}s:4:"info";a:0:{}}s:2:"pl";a:153:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"aid";a:0:{}s:4:"agro";a:0:{}s:3:"atm";a:0:{}s:4:"auto";a:0:{}s:3:"biz";a:0:{}s:3:"edu";a:0:{}s:5:"gmina";a:0:{}s:3:"gsm";a:0:{}s:4:"info";a:0:{}s:4:"mail";a:0:{}s:6:"miasta";a:0:{}s:5:"media";a:0:{}s:3:"mil";a:0:{}s:13:"nieruchomosci";a:0:{}s:3:"nom";a:0:{}s:2:"pc";a:0:{}s:6:"powiat";a:0:{}s:4:"priv";a:0:{}s:10:"realestate";a:0:{}s:3:"rel";a:0:{}s:3:"sex";a:0:{}s:4:"shop";a:0:{}s:5:"sklep";a:0:{}s:3:"sos";a:0:{}s:6:"szkola";a:0:{}s:5:"targi";a:0:{}s:2:"tm";a:0:{}s:7:"tourism";a:0:{}s:6:"travel";a:0:{}s:9:"turystyka";a:0:{}s:3:"gov";a:47:{s:2:"ap";a:0:{}s:2:"ic";a:0:{}s:2:"is";a:0:{}s:2:"us";a:0:{}s:5:"kmpsp";a:0:{}s:5:"kppsp";a:0:{}s:5:"kwpsp";a:0:{}s:3:"psp";a:0:{}s:4:"wskr";a:0:{}s:3:"kwp";a:0:{}s:2:"mw";a:0:{}s:2:"ug";a:0:{}s:2:"um";a:0:{}s:4:"umig";a:0:{}s:4:"ugim";a:0:{}s:4:"upow";a:0:{}s:2:"uw";a:0:{}s:9:"starostwo";a:0:{}s:2:"pa";a:0:{}s:2:"po";a:0:{}s:4:"psse";a:0:{}s:3:"pup";a:0:{}s:4:"rzgw";a:0:{}s:2:"sa";a:0:{}s:2:"so";a:0:{}s:2:"sr";a:0:{}s:3:"wsa";a:0:{}s:3:"sko";a:0:{}s:3:"uzs";a:0:{}s:4:"wiih";a:0:{}s:4:"winb";a:0:{}s:4:"pinb";a:0:{}s:4:"wios";a:0:{}s:4:"witd";a:0:{}s:6:"wzmiuw";a:0:{}s:3:"piw";a:0:{}s:3:"wiw";a:0:{}s:4:"griw";a:0:{}s:3:"wif";a:0:{}s:3:"oum";a:0:{}s:3:"sdn";a:0:{}s:2:"zp";a:0:{}s:4:"uppo";a:0:{}s:3:"mup";a:0:{}s:4:"wuoz";a:0:{}s:8:"konsulat";a:0:{}s:4:"oirm";a:0:{}}s:8:"augustow";a:0:{}s:10:"babia-gora";a:0:{}s:6:"bedzin";a:0:{}s:7:"beskidy";a:0:{}s:10:"bialowieza";a:0:{}s:9:"bialystok";a:0:{}s:7:"bielawa";a:0:{}s:10:"bieszczady";a:0:{}s:11:"boleslawiec";a:0:{}s:9:"bydgoszcz";a:0:{}s:5:"bytom";a:0:{}s:7:"cieszyn";a:0:{}s:7:"czeladz";a:0:{}s:5:"czest";a:0:{}s:9:"dlugoleka";a:0:{}s:6:"elblag";a:0:{}s:3:"elk";a:0:{}s:6:"glogow";a:0:{}s:7:"gniezno";a:0:{}s:7:"gorlice";a:0:{}s:7:"grajewo";a:0:{}s:5:"ilawa";a:0:{}s:8:"jaworzno";a:0:{}s:12:"jelenia-gora";a:0:{}s:5:"jgora";a:0:{}s:6:"kalisz";a:0:{}s:15:"kazimierz-dolny";a:0:{}s:7:"karpacz";a:0:{}s:7:"kartuzy";a:0:{}s:7:"kaszuby";a:0:{}s:8:"katowice";a:0:{}s:5:"kepno";a:0:{}s:7:"ketrzyn";a:0:{}s:7:"klodzko";a:0:{}s:10:"kobierzyce";a:0:{}s:9:"kolobrzeg";a:0:{}s:5:"konin";a:0:{}s:10:"konskowola";a:0:{}s:5:"kutno";a:0:{}s:4:"lapy";a:0:{}s:6:"lebork";a:0:{}s:7:"legnica";a:0:{}s:7:"lezajsk";a:0:{}s:8:"limanowa";a:0:{}s:5:"lomza";a:0:{}s:6:"lowicz";a:0:{}s:5:"lubin";a:0:{}s:5:"lukow";a:0:{}s:7:"malbork";a:0:{}s:10:"malopolska";a:0:{}s:8:"mazowsze";a:0:{}s:6:"mazury";a:0:{}s:6:"mielec";a:0:{}s:6:"mielno";a:0:{}s:7:"mragowo";a:0:{}s:5:"naklo";a:0:{}s:8:"nowaruda";a:0:{}s:4:"nysa";a:0:{}s:5:"olawa";a:0:{}s:6:"olecko";a:0:{}s:6:"olkusz";a:0:{}s:7:"olsztyn";a:0:{}s:7:"opoczno";a:0:{}s:5:"opole";a:0:{}s:7:"ostroda";a:0:{}s:9:"ostroleka";a:0:{}s:9:"ostrowiec";a:0:{}s:10:"ostrowwlkp";a:0:{}s:4:"pila";a:0:{}s:4:"pisz";a:0:{}s:7:"podhale";a:0:{}s:8:"podlasie";a:0:{}s:9:"polkowice";a:0:{}s:7:"pomorze";a:0:{}s:9:"pomorskie";a:0:{}s:10:"prochowice";a:0:{}s:8:"pruszkow";a:0:{}s:9:"przeworsk";a:0:{}s:6:"pulawy";a:0:{}s:5:"radom";a:0:{}s:8:"rawa-maz";a:0:{}s:6:"rybnik";a:0:{}s:7:"rzeszow";a:0:{}s:5:"sanok";a:0:{}s:5:"sejny";a:0:{}s:5:"slask";a:0:{}s:6:"slupsk";a:0:{}s:9:"sosnowiec";a:0:{}s:12:"stalowa-wola";a:0:{}s:7:"skoczow";a:0:{}s:12:"starachowice";a:0:{}s:8:"stargard";a:0:{}s:7:"suwalki";a:0:{}s:8:"swidnica";a:0:{}s:10:"swiebodzin";a:0:{}s:11:"swinoujscie";a:0:{}s:8:"szczecin";a:0:{}s:8:"szczytno";a:0:{}s:10:"tarnobrzeg";a:0:{}s:5:"tgory";a:0:{}s:5:"turek";a:0:{}s:5:"tychy";a:0:{}s:5:"ustka";a:0:{}s:9:"walbrzych";a:0:{}s:6:"warmia";a:0:{}s:8:"warszawa";a:0:{}s:3:"waw";a:0:{}s:6:"wegrow";a:0:{}s:6:"wielun";a:0:{}s:5:"wlocl";a:0:{}s:9:"wloclawek";a:0:{}s:9:"wodzislaw";a:0:{}s:7:"wolomin";a:0:{}s:7:"wroclaw";a:0:{}s:9:"zachpomor";a:0:{}s:5:"zagan";a:0:{}s:5:"zarow";a:0:{}s:5:"zgora";a:0:{}s:9:"zgorzelec";a:0:{}}s:2:"pm";a:0:{}s:2:"pn";a:5:{s:3:"gov";a:0:{}s:2:"co";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}}s:4:"post";a:0:{}s:2:"pr";a:13:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:4:"isla";a:0:{}s:3:"pro";a:0:{}s:3:"biz";a:0:{}s:4:"info";a:0:{}s:4:"name";a:0:{}s:3:"est";a:0:{}s:4:"prof";a:0:{}s:2:"ac";a:0:{}}s:3:"pro";a:11:{s:3:"aaa";a:0:{}s:3:"aca";a:0:{}s:4:"acct";a:0:{}s:6:"avocat";a:0:{}s:3:"bar";a:0:{}s:3:"cpa";a:0:{}s:3:"eng";a:0:{}s:3:"jur";a:0:{}s:3:"law";a:0:{}s:3:"med";a:0:{}s:5:"recht";a:0:{}}s:2:"ps";a:7:{s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"sec";a:0:{}s:3:"plo";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}}s:2:"pt";a:8:{s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"int";a:0:{}s:4:"publ";a:0:{}s:3:"com";a:0:{}s:4:"nome";a:0:{}}s:2:"pw";a:6:{s:2:"co";a:0:{}s:2:"ne";a:0:{}s:2:"or";a:0:{}s:2:"ed";a:0:{}s:2:"go";a:0:{}s:5:"belau";a:0:{}}s:2:"py";a:7:{s:3:"com";a:0:{}s:4:"coop";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"qa";a:8:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sch";a:0:{}}s:2:"re";a:3:{s:4:"asso";a:0:{}s:3:"com";a:0:{}s:3:"nom";a:0:{}}s:2:"ro";a:11:{s:4:"arts";a:0:{}s:3:"com";a:0:{}s:4:"firm";a:0:{}s:4:"info";a:0:{}s:3:"nom";a:0:{}s:2:"nt";a:0:{}s:3:"org";a:0:{}s:3:"rec";a:0:{}s:5:"store";a:0:{}s:2:"tm";a:0:{}s:3:"www";a:0:{}}s:2:"rs";a:6:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:2:"in";a:0:{}s:3:"org";a:0:{}}s:2:"ru";a:6:{s:2:"ac";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:4:"test";a:0:{}}s:2:"rw";a:9:{s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}s:2:"ac";a:0:{}s:3:"com";a:0:{}s:2:"co";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:4:"gouv";a:0:{}}s:2:"sa";a:8:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"med";a:0:{}s:3:"pub";a:0:{}s:3:"edu";a:0:{}s:3:"sch";a:0:{}}s:2:"sb";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"sc";a:5:{s:3:"com";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}}s:2:"sd";a:8:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"med";a:0:{}s:2:"tv";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}}s:2:"se";a:39:{s:1:"a";a:0:{}s:2:"ac";a:0:{}s:1:"b";a:0:{}s:2:"bd";a:0:{}s:5:"brand";a:0:{}s:1:"c";a:0:{}s:1:"d";a:0:{}s:1:"e";a:0:{}s:1:"f";a:0:{}s:2:"fh";a:0:{}s:4:"fhsk";a:0:{}s:3:"fhv";a:0:{}s:1:"g";a:0:{}s:1:"h";a:0:{}s:1:"i";a:0:{}s:1:"k";a:0:{}s:7:"komforb";a:0:{}s:15:"kommunalforbund";a:0:{}s:6:"komvux";a:0:{}s:1:"l";a:0:{}s:6:"lanbib";a:0:{}s:1:"m";a:0:{}s:1:"n";a:0:{}s:14:"naturbruksgymn";a:0:{}s:1:"o";a:0:{}s:3:"org";a:0:{}s:1:"p";a:0:{}s:5:"parti";a:0:{}s:2:"pp";a:0:{}s:5:"press";a:0:{}s:1:"r";a:0:{}s:1:"s";a:0:{}s:1:"t";a:0:{}s:2:"tm";a:0:{}s:1:"u";a:0:{}s:1:"w";a:0:{}s:1:"x";a:0:{}s:1:"y";a:0:{}s:1:"z";a:0:{}}s:2:"sg";a:6:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"per";a:0:{}}s:2:"sh";a:5:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"mil";a:0:{}}s:2:"si";a:0:{}s:2:"sj";a:0:{}s:2:"sk";a:0:{}s:2:"sl";a:5:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}}s:2:"sm";a:0:{}s:2:"sn";a:7:{s:3:"art";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:4:"gouv";a:0:{}s:3:"org";a:0:{}s:5:"perso";a:0:{}s:4:"univ";a:0:{}}s:2:"so";a:3:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"sr";a:0:{}s:2:"st";a:12:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:9:"consulado";a:0:{}s:3:"edu";a:0:{}s:9:"embaixada";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:8:"principe";a:0:{}s:7:"saotome";a:0:{}s:5:"store";a:0:{}}s:2:"su";a:0:{}s:2:"sv";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:3:"org";a:0:{}s:3:"red";a:0:{}}s:2:"sx";a:1:{s:3:"gov";a:0:{}}s:2:"sy";a:6:{s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}}s:2:"sz";a:3:{s:2:"co";a:0:{}s:2:"ac";a:0:{}s:3:"org";a:0:{}}s:2:"tc";a:0:{}s:2:"td";a:0:{}s:3:"tel";a:0:{}s:2:"tf";a:0:{}s:2:"tg";a:0:{}s:2:"th";a:7:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"go";a:0:{}s:2:"in";a:0:{}s:2:"mi";a:0:{}s:3:"net";a:0:{}s:2:"or";a:0:{}}s:2:"tj";a:15:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:2:"go";a:0:{}s:3:"gov";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"nic";a:0:{}s:3:"org";a:0:{}s:4:"test";a:0:{}s:3:"web";a:0:{}}s:2:"tk";a:0:{}s:2:"tl";a:1:{s:3:"gov";a:0:{}}s:2:"tm";a:8:{s:3:"com";a:0:{}s:2:"co";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"nom";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"edu";a:0:{}}s:2:"tn";a:20:{s:3:"com";a:0:{}s:3:"ens";a:0:{}s:3:"fin";a:0:{}s:3:"gov";a:0:{}s:3:"ind";a:0:{}s:4:"intl";a:0:{}s:3:"nat";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:4:"info";a:0:{}s:5:"perso";a:0:{}s:7:"tourism";a:0:{}s:6:"edunet";a:0:{}s:4:"rnrt";a:0:{}s:3:"rns";a:0:{}s:3:"rnu";a:0:{}s:6:"mincom";a:0:{}s:7:"agrinet";a:0:{}s:7:"defense";a:0:{}s:5:"turen";a:0:{}}s:2:"to";a:6:{s:3:"com";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"mil";a:0:{}}s:2:"tr";a:21:{s:3:"com";a:0:{}s:4:"info";a:0:{}s:3:"biz";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"web";a:0:{}s:3:"gen";a:0:{}s:2:"tv";a:0:{}s:2:"av";a:0:{}s:2:"dr";a:0:{}s:3:"bbs";a:0:{}s:4:"name";a:0:{}s:3:"tel";a:0:{}s:3:"gov";a:0:{}s:3:"bel";a:0:{}s:3:"pol";a:0:{}s:3:"mil";a:0:{}s:3:"k12";a:0:{}s:3:"edu";a:0:{}s:3:"kep";a:0:{}s:2:"nc";a:1:{s:3:"gov";a:0:{}}}s:6:"travel";a:0:{}s:2:"tt";a:17:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"biz";a:0:{}s:4:"info";a:0:{}s:3:"pro";a:0:{}s:3:"int";a:0:{}s:4:"coop";a:0:{}s:4:"jobs";a:0:{}s:4:"mobi";a:0:{}s:6:"travel";a:0:{}s:6:"museum";a:0:{}s:4:"aero";a:0:{}s:4:"name";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}}s:2:"tv";a:0:{}s:2:"tw";a:13:{s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"idv";a:0:{}s:4:"game";a:0:{}s:4:"ebiz";a:0:{}s:4:"club";a:0:{}s:12:"xn--zf0ao64a";a:0:{}s:10:"xn--uc0atv";a:0:{}s:11:"xn--czrw28b";a:0:{}}s:2:"tz";a:12:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"go";a:0:{}s:5:"hotel";a:0:{}s:4:"info";a:0:{}s:2:"me";a:0:{}s:3:"mil";a:0:{}s:4:"mobi";a:0:{}s:2:"ne";a:0:{}s:2:"or";a:0:{}s:2:"sc";a:0:{}s:2:"tv";a:0:{}}s:2:"ua";a:76:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:2:"in";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:9:"cherkassy";a:0:{}s:8:"cherkasy";a:0:{}s:9:"chernigov";a:0:{}s:9:"chernihiv";a:0:{}s:10:"chernivtsi";a:0:{}s:10:"chernovtsy";a:0:{}s:2:"ck";a:0:{}s:2:"cn";a:0:{}s:2:"cr";a:0:{}s:6:"crimea";a:0:{}s:2:"cv";a:0:{}s:2:"dn";a:0:{}s:14:"dnepropetrovsk";a:0:{}s:14:"dnipropetrovsk";a:0:{}s:7:"dominic";a:0:{}s:7:"donetsk";a:0:{}s:2:"dp";a:0:{}s:2:"if";a:0:{}s:15:"ivano-frankivsk";a:0:{}s:2:"kh";a:0:{}s:7:"kharkiv";a:0:{}s:7:"kharkov";a:0:{}s:7:"kherson";a:0:{}s:12:"khmelnitskiy";a:0:{}s:12:"khmelnytskyi";a:0:{}s:4:"kiev";a:0:{}s:10:"kirovograd";a:0:{}s:2:"km";a:0:{}s:2:"kr";a:0:{}s:4:"krym";a:0:{}s:2:"ks";a:0:{}s:2:"kv";a:0:{}s:4:"kyiv";a:0:{}s:2:"lg";a:0:{}s:2:"lt";a:0:{}s:7:"lugansk";a:0:{}s:5:"lutsk";a:0:{}s:2:"lv";a:0:{}s:4:"lviv";a:0:{}s:2:"mk";a:0:{}s:8:"mykolaiv";a:0:{}s:8:"nikolaev";a:0:{}s:2:"od";a:0:{}s:5:"odesa";a:0:{}s:6:"odessa";a:0:{}s:2:"pl";a:0:{}s:7:"poltava";a:0:{}s:5:"rivne";a:0:{}s:5:"rovno";a:0:{}s:2:"rv";a:0:{}s:2:"sb";a:0:{}s:10:"sebastopol";a:0:{}s:10:"sevastopol";a:0:{}s:2:"sm";a:0:{}s:4:"sumy";a:0:{}s:2:"te";a:0:{}s:8:"ternopil";a:0:{}s:2:"uz";a:0:{}s:8:"uzhgorod";a:0:{}s:7:"vinnica";a:0:{}s:9:"vinnytsia";a:0:{}s:2:"vn";a:0:{}s:5:"volyn";a:0:{}s:5:"yalta";a:0:{}s:11:"zaporizhzhe";a:0:{}s:12:"zaporizhzhia";a:0:{}s:8:"zhitomir";a:0:{}s:8:"zhytomyr";a:0:{}s:2:"zp";a:0:{}s:2:"zt";a:0:{}}s:2:"ug";a:8:{s:2:"co";a:0:{}s:2:"or";a:0:{}s:2:"ac";a:0:{}s:2:"sc";a:0:{}s:2:"go";a:0:{}s:2:"ne";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}}s:2:"uk";a:11:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:3:"gov";a:0:{}s:3:"ltd";a:0:{}s:2:"me";a:0:{}s:3:"net";a:0:{}s:3:"nhs";a:0:{}s:3:"org";a:0:{}s:3:"plc";a:0:{}s:6:"police";a:0:{}s:3:"sch";a:1:{s:1:"*";a:0:{}}}s:2:"us";a:60:{s:3:"dni";a:0:{}s:3:"fed";a:0:{}s:3:"isa";a:0:{}s:4:"kids";a:0:{}s:3:"nsn";a:0:{}s:2:"ak";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"al";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ar";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"as";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"az";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ca";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"co";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ct";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"dc";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"de";a:2:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}}s:2:"fl";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ga";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"gu";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"hi";a:2:{s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ia";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"id";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"il";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"in";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ks";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ky";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"la";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ma";a:3:{s:3:"k12";a:3:{s:3:"pvt";a:0:{}s:4:"chtr";a:0:{}s:6:"paroch";a:0:{}}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"md";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"me";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"mi";a:11:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}s:9:"ann-arbor";a:0:{}s:3:"cog";a:0:{}s:3:"dst";a:0:{}s:5:"eaton";a:0:{}s:3:"gen";a:0:{}s:3:"mus";a:0:{}s:3:"tec";a:0:{}s:9:"washtenaw";a:0:{}}s:2:"mn";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"mo";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ms";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"mt";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nc";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nd";a:2:{s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ne";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nh";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nj";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nm";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nv";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ny";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"oh";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ok";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"or";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"pa";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"pr";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ri";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"sc";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"sd";a:2:{s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"tn";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"tx";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ut";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"vi";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"vt";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"va";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"wa";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"wi";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"wv";a:1:{s:2:"cc";a:0:{}}s:2:"wy";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}}s:2:"uy";a:6:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gub";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"uz";a:4:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"va";a:0:{}s:2:"vc";a:6:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"edu";a:0:{}}s:2:"ve";a:17:{s:4:"arts";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"e12";a:0:{}s:3:"edu";a:0:{}s:4:"firm";a:0:{}s:3:"gob";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"rec";a:0:{}s:5:"store";a:0:{}s:3:"tec";a:0:{}s:3:"web";a:0:{}}s:2:"vg";a:0:{}s:2:"vi";a:5:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"k12";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"vn";a:12:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"int";a:0:{}s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:4:"info";a:0:{}s:4:"name";a:0:{}s:3:"pro";a:0:{}s:6:"health";a:0:{}}s:2:"vu";a:4:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"wf";a:0:{}s:2:"ws";a:5:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}}s:2:"yt";a:0:{}s:14:"xn--mgbaam7a8h";a:0:{}s:10:"xn--y9a3aq";a:0:{}s:14:"xn--54b7fta0cc";a:0:{}s:8:"xn--90ae";a:0:{}s:9:"xn--90ais";a:0:{}s:10:"xn--fiqs8s";a:0:{}s:10:"xn--fiqz9s";a:0:{}s:15:"xn--lgbbat1ad8j";a:0:{}s:10:"xn--wgbh1c";a:0:{}s:9:"xn--e1a4c";a:0:{}s:8:"xn--node";a:0:{}s:8:"xn--qxam";a:0:{}s:11:"xn--j6w193g";a:0:{}s:11:"xn--2scrj9c";a:0:{}s:11:"xn--3hcrj9c";a:0:{}s:12:"xn--45br5cyl";a:0:{}s:14:"xn--h2breg3eve";a:0:{}s:13:"xn--h2brj9c8c";a:0:{}s:12:"xn--mgbgu82a";a:0:{}s:14:"xn--rvc1e0am3e";a:0:{}s:11:"xn--h2brj9c";a:0:{}s:14:"xn--mgbbh1a71e";a:0:{}s:13:"xn--fpcrj9c3d";a:0:{}s:11:"xn--gecrj9c";a:0:{}s:11:"xn--s9brj9c";a:0:{}s:11:"xn--45brj9c";a:0:{}s:17:"xn--xkc2dl3a5ee0h";a:0:{}s:15:"xn--mgba3a4f16a";a:0:{}s:14:"xn--mgba3a4fra";a:0:{}s:11:"xn--mgbtx2b";a:0:{}s:14:"xn--mgbayh7gpa";a:0:{}s:12:"xn--3e0b707e";a:0:{}s:11:"xn--80ao21a";a:0:{}s:13:"xn--fzc2c9e2c";a:0:{}s:16:"xn--xkc2al3hye2a";a:0:{}s:15:"xn--mgbc0a9azcg";a:0:{}s:9:"xn--d1alf";a:0:{}s:9:"xn--l1acc";a:0:{}s:11:"xn--mix891f";a:0:{}s:11:"xn--mix082f";a:0:{}s:14:"xn--mgbx4cd0ab";a:0:{}s:12:"xn--mgb9awbf";a:0:{}s:17:"xn--mgbai9azgqp6j";a:0:{}s:18:"xn--mgbai9a5eva00b";a:0:{}s:13:"xn--ygbi2ammx";a:0:{}s:10:"xn--90a3ac";a:6:{s:8:"xn--o1ac";a:0:{}s:9:"xn--c1avg";a:0:{}s:9:"xn--90azh";a:0:{}s:8:"xn--d1at";a:0:{}s:9:"xn--o1ach";a:0:{}s:8:"xn--80au";a:0:{}}s:8:"xn--p1ai";a:0:{}s:10:"xn--wgbl6a";a:0:{}s:17:"xn--mgberp4a5d4ar";a:0:{}s:19:"xn--mgberp4a5d4a87g";a:0:{}s:19:"xn--mgbqly7c0a67fbc";a:0:{}s:16:"xn--mgbqly7cvafr";a:0:{}s:12:"xn--mgbpl2fh";a:0:{}s:13:"xn--yfro4i67o";a:0:{}s:22:"xn--clchc0ea0b2g2a9gcd";a:0:{}s:12:"xn--ogbpf8fl";a:0:{}s:12:"xn--mgbtf8fl";a:0:{}s:10:"xn--o3cw4h";a:6:{s:13:"xn--12c1fe0br";a:0:{}s:16:"xn--12co0c3b4eva";a:0:{}s:13:"xn--h3cuzk1di";a:0:{}s:11:"xn--o3cyx2a";a:0:{}s:12:"xn--m3ch0j3a";a:0:{}s:15:"xn--12cfi8ixb8l";a:0:{}}s:11:"xn--pgbs0dh";a:0:{}s:11:"xn--kpry57d";a:0:{}s:11:"xn--kprw13d";a:0:{}s:11:"xn--nnx388a";a:0:{}s:9:"xn--j1amh";a:0:{}s:12:"xn--mgb2ddes";a:0:{}s:3:"xxx";a:0:{}s:2:"ye";a:1:{s:1:"*";a:0:{}}s:2:"za";a:17:{s:2:"ac";a:0:{}s:5:"agric";a:0:{}s:3:"alt";a:0:{}s:2:"co";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:7:"grondar";a:0:{}s:3:"law";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"ngo";a:0:{}s:3:"nis";a:0:{}s:3:"nom";a:0:{}s:3:"org";a:0:{}s:6:"school";a:0:{}s:2:"tm";a:0:{}s:3:"web";a:0:{}}s:2:"zm";a:11:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sch";a:0:{}}s:2:"zw";a:5:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"org";a:0:{}}s:3:"aaa";a:0:{}s:4:"aarp";a:0:{}s:6:"abarth";a:0:{}s:3:"abb";a:0:{}s:6:"abbott";a:0:{}s:6:"abbvie";a:0:{}s:3:"abc";a:0:{}s:4:"able";a:0:{}s:7:"abogado";a:0:{}s:8:"abudhabi";a:0:{}s:7:"academy";a:0:{}s:9:"accenture";a:0:{}s:10:"accountant";a:0:{}s:11:"accountants";a:0:{}s:3:"aco";a:0:{}s:6:"active";a:0:{}s:5:"actor";a:0:{}s:4:"adac";a:0:{}s:3:"ads";a:0:{}s:5:"adult";a:0:{}s:3:"aeg";a:0:{}s:5:"aetna";a:0:{}s:14:"afamilycompany";a:0:{}s:3:"afl";a:0:{}s:6:"africa";a:0:{}s:7:"agakhan";a:0:{}s:6:"agency";a:0:{}s:3:"aig";a:0:{}s:4:"aigo";a:0:{}s:6:"airbus";a:0:{}s:8:"airforce";a:0:{}s:6:"airtel";a:0:{}s:4:"akdn";a:0:{}s:9:"alfaromeo";a:0:{}s:7:"alibaba";a:0:{}s:6:"alipay";a:0:{}s:9:"allfinanz";a:0:{}s:8:"allstate";a:0:{}s:4:"ally";a:0:{}s:6:"alsace";a:0:{}s:6:"alstom";a:0:{}s:15:"americanexpress";a:0:{}s:14:"americanfamily";a:0:{}s:4:"amex";a:0:{}s:5:"amfam";a:0:{}s:5:"amica";a:0:{}s:9:"amsterdam";a:0:{}s:9:"analytics";a:0:{}s:7:"android";a:0:{}s:6:"anquan";a:0:{}s:3:"anz";a:0:{}s:3:"aol";a:0:{}s:10:"apartments";a:0:{}s:3:"app";a:0:{}s:5:"apple";a:0:{}s:9:"aquarelle";a:0:{}s:4:"arab";a:0:{}s:6:"aramco";a:0:{}s:5:"archi";a:0:{}s:4:"army";a:0:{}s:3:"art";a:0:{}s:4:"arte";a:0:{}s:4:"asda";a:0:{}s:10:"associates";a:0:{}s:7:"athleta";a:0:{}s:8:"attorney";a:0:{}s:7:"auction";a:0:{}s:4:"audi";a:0:{}s:7:"audible";a:0:{}s:5:"audio";a:0:{}s:7:"auspost";a:0:{}s:6:"author";a:0:{}s:4:"auto";a:0:{}s:5:"autos";a:0:{}s:7:"avianca";a:0:{}s:3:"aws";a:0:{}s:3:"axa";a:0:{}s:5:"azure";a:0:{}s:4:"baby";a:0:{}s:5:"baidu";a:0:{}s:7:"banamex";a:0:{}s:14:"bananarepublic";a:0:{}s:4:"band";a:0:{}s:4:"bank";a:0:{}s:3:"bar";a:0:{}s:9:"barcelona";a:0:{}s:11:"barclaycard";a:0:{}s:8:"barclays";a:0:{}s:8:"barefoot";a:0:{}s:8:"bargains";a:0:{}s:8:"baseball";a:0:{}s:10:"basketball";a:0:{}s:7:"bauhaus";a:0:{}s:6:"bayern";a:0:{}s:3:"bbc";a:0:{}s:3:"bbt";a:0:{}s:4:"bbva";a:0:{}s:3:"bcg";a:0:{}s:3:"bcn";a:0:{}s:5:"beats";a:0:{}s:6:"beauty";a:0:{}s:4:"beer";a:0:{}s:7:"bentley";a:0:{}s:6:"berlin";a:0:{}s:4:"best";a:0:{}s:7:"bestbuy";a:0:{}s:3:"bet";a:0:{}s:6:"bharti";a:0:{}s:5:"bible";a:0:{}s:3:"bid";a:0:{}s:4:"bike";a:0:{}s:4:"bing";a:0:{}s:5:"bingo";a:0:{}s:3:"bio";a:0:{}s:5:"black";a:0:{}s:11:"blackfriday";a:0:{}s:6:"blanco";a:0:{}s:11:"blockbuster";a:0:{}s:4:"blog";a:0:{}s:9:"bloomberg";a:0:{}s:4:"blue";a:0:{}s:3:"bms";a:0:{}s:3:"bmw";a:0:{}s:3:"bnl";a:0:{}s:10:"bnpparibas";a:0:{}s:5:"boats";a:0:{}s:10:"boehringer";a:0:{}s:4:"bofa";a:0:{}s:3:"bom";a:0:{}s:4:"bond";a:0:{}s:3:"boo";a:0:{}s:4:"book";a:0:{}s:7:"booking";a:0:{}s:5:"boots";a:0:{}s:5:"bosch";a:0:{}s:6:"bostik";a:0:{}s:6:"boston";a:0:{}s:3:"bot";a:0:{}s:8:"boutique";a:0:{}s:3:"box";a:0:{}s:8:"bradesco";a:0:{}s:11:"bridgestone";a:0:{}s:8:"broadway";a:0:{}s:6:"broker";a:0:{}s:7:"brother";a:0:{}s:8:"brussels";a:0:{}s:8:"budapest";a:0:{}s:7:"bugatti";a:0:{}s:5:"build";a:0:{}s:8:"builders";a:0:{}s:8:"business";a:0:{}s:3:"buy";a:0:{}s:4:"buzz";a:0:{}s:3:"bzh";a:0:{}s:3:"cab";a:0:{}s:4:"cafe";a:0:{}s:3:"cal";a:0:{}s:4:"call";a:0:{}s:11:"calvinklein";a:0:{}s:3:"cam";a:0:{}s:6:"camera";a:0:{}s:4:"camp";a:0:{}s:14:"cancerresearch";a:0:{}s:5:"canon";a:0:{}s:8:"capetown";a:0:{}s:7:"capital";a:0:{}s:10:"capitalone";a:0:{}s:3:"car";a:0:{}s:7:"caravan";a:0:{}s:5:"cards";a:0:{}s:4:"care";a:0:{}s:6:"career";a:0:{}s:7:"careers";a:0:{}s:4:"cars";a:0:{}s:7:"cartier";a:0:{}s:4:"casa";a:0:{}s:4:"case";a:0:{}s:6:"caseih";a:0:{}s:4:"cash";a:0:{}s:6:"casino";a:0:{}s:8:"catering";a:0:{}s:8:"catholic";a:0:{}s:3:"cba";a:0:{}s:3:"cbn";a:0:{}s:4:"cbre";a:0:{}s:3:"cbs";a:0:{}s:3:"ceb";a:0:{}s:6:"center";a:0:{}s:3:"ceo";a:0:{}s:4:"cern";a:0:{}s:3:"cfa";a:0:{}s:3:"cfd";a:0:{}s:6:"chanel";a:0:{}s:7:"channel";a:0:{}s:5:"chase";a:0:{}s:4:"chat";a:0:{}s:5:"cheap";a:0:{}s:7:"chintai";a:0:{}s:5:"chloe";a:0:{}s:9:"christmas";a:0:{}s:6:"chrome";a:0:{}s:8:"chrysler";a:0:{}s:6:"church";a:0:{}s:8:"cipriani";a:0:{}s:6:"circle";a:0:{}s:5:"cisco";a:0:{}s:7:"citadel";a:0:{}s:4:"citi";a:0:{}s:5:"citic";a:0:{}s:4:"city";a:0:{}s:8:"cityeats";a:0:{}s:6:"claims";a:0:{}s:8:"cleaning";a:0:{}s:5:"click";a:0:{}s:6:"clinic";a:0:{}s:8:"clinique";a:0:{}s:8:"clothing";a:0:{}s:5:"cloud";a:0:{}s:4:"club";a:0:{}s:7:"clubmed";a:0:{}s:5:"coach";a:0:{}s:5:"codes";a:0:{}s:6:"coffee";a:0:{}s:7:"college";a:0:{}s:7:"cologne";a:0:{}s:7:"comcast";a:0:{}s:8:"commbank";a:0:{}s:9:"community";a:0:{}s:7:"company";a:0:{}s:7:"compare";a:0:{}s:8:"computer";a:0:{}s:6:"comsec";a:0:{}s:6:"condos";a:0:{}s:12:"construction";a:0:{}s:10:"consulting";a:0:{}s:7:"contact";a:0:{}s:11:"contractors";a:0:{}s:7:"cooking";a:0:{}s:14:"cookingchannel";a:0:{}s:4:"cool";a:0:{}s:7:"corsica";a:0:{}s:7:"country";a:0:{}s:6:"coupon";a:0:{}s:7:"coupons";a:0:{}s:7:"courses";a:0:{}s:6:"credit";a:0:{}s:10:"creditcard";a:0:{}s:11:"creditunion";a:0:{}s:7:"cricket";a:0:{}s:5:"crown";a:0:{}s:3:"crs";a:0:{}s:6:"cruise";a:0:{}s:7:"cruises";a:0:{}s:3:"csc";a:0:{}s:10:"cuisinella";a:0:{}s:5:"cymru";a:0:{}s:4:"cyou";a:0:{}s:5:"dabur";a:0:{}s:3:"dad";a:0:{}s:5:"dance";a:0:{}s:4:"data";a:0:{}s:4:"date";a:0:{}s:6:"dating";a:0:{}s:6:"datsun";a:0:{}s:3:"day";a:0:{}s:4:"dclk";a:0:{}s:3:"dds";a:0:{}s:4:"deal";a:0:{}s:6:"dealer";a:0:{}s:5:"deals";a:0:{}s:6:"degree";a:0:{}s:8:"delivery";a:0:{}s:4:"dell";a:0:{}s:8:"deloitte";a:0:{}s:5:"delta";a:0:{}s:8:"democrat";a:0:{}s:6:"dental";a:0:{}s:7:"dentist";a:0:{}s:4:"desi";a:0:{}s:6:"design";a:0:{}s:3:"dev";a:0:{}s:3:"dhl";a:0:{}s:8:"diamonds";a:0:{}s:4:"diet";a:0:{}s:7:"digital";a:0:{}s:6:"direct";a:0:{}s:9:"directory";a:0:{}s:8:"discount";a:0:{}s:8:"discover";a:0:{}s:4:"dish";a:0:{}s:3:"diy";a:0:{}s:3:"dnp";a:0:{}s:4:"docs";a:0:{}s:6:"doctor";a:0:{}s:5:"dodge";a:0:{}s:3:"dog";a:0:{}s:4:"doha";a:0:{}s:7:"domains";a:0:{}s:3:"dot";a:0:{}s:8:"download";a:0:{}s:5:"drive";a:0:{}s:3:"dtv";a:0:{}s:5:"dubai";a:0:{}s:4:"duck";a:0:{}s:6:"dunlop";a:0:{}s:4:"duns";a:0:{}s:6:"dupont";a:0:{}s:6:"durban";a:0:{}s:4:"dvag";a:0:{}s:3:"dvr";a:0:{}s:5:"earth";a:0:{}s:3:"eat";a:0:{}s:3:"eco";a:0:{}s:5:"edeka";a:0:{}s:9:"education";a:0:{}s:5:"email";a:0:{}s:6:"emerck";a:0:{}s:6:"energy";a:0:{}s:8:"engineer";a:0:{}s:11:"engineering";a:0:{}s:11:"enterprises";a:0:{}s:5:"epost";a:0:{}s:5:"epson";a:0:{}s:9:"equipment";a:0:{}s:8:"ericsson";a:0:{}s:4:"erni";a:0:{}s:3:"esq";a:0:{}s:6:"estate";a:0:{}s:8:"esurance";a:0:{}s:8:"etisalat";a:0:{}s:10:"eurovision";a:0:{}s:3:"eus";a:0:{}s:6:"events";a:0:{}s:8:"everbank";a:0:{}s:8:"exchange";a:0:{}s:6:"expert";a:0:{}s:7:"exposed";a:0:{}s:7:"express";a:0:{}s:10:"extraspace";a:0:{}s:4:"fage";a:0:{}s:4:"fail";a:0:{}s:9:"fairwinds";a:0:{}s:5:"faith";a:0:{}s:6:"family";a:0:{}s:3:"fan";a:0:{}s:4:"fans";a:0:{}s:4:"farm";a:0:{}s:7:"farmers";a:0:{}s:7:"fashion";a:0:{}s:4:"fast";a:0:{}s:5:"fedex";a:0:{}s:8:"feedback";a:0:{}s:7:"ferrari";a:0:{}s:7:"ferrero";a:0:{}s:4:"fiat";a:0:{}s:8:"fidelity";a:0:{}s:4:"fido";a:0:{}s:4:"film";a:0:{}s:5:"final";a:0:{}s:7:"finance";a:0:{}s:9:"financial";a:0:{}s:4:"fire";a:0:{}s:9:"firestone";a:0:{}s:8:"firmdale";a:0:{}s:4:"fish";a:0:{}s:7:"fishing";a:0:{}s:3:"fit";a:0:{}s:7:"fitness";a:0:{}s:6:"flickr";a:0:{}s:7:"flights";a:0:{}s:4:"flir";a:0:{}s:7:"florist";a:0:{}s:7:"flowers";a:0:{}s:3:"fly";a:0:{}s:3:"foo";a:0:{}s:4:"food";a:0:{}s:11:"foodnetwork";a:0:{}s:8:"football";a:0:{}s:4:"ford";a:0:{}s:5:"forex";a:0:{}s:7:"forsale";a:0:{}s:5:"forum";a:0:{}s:10:"foundation";a:0:{}s:3:"fox";a:0:{}s:4:"free";a:0:{}s:9:"fresenius";a:0:{}s:3:"frl";a:0:{}s:7:"frogans";a:0:{}s:9:"frontdoor";a:0:{}s:8:"frontier";a:0:{}s:3:"ftr";a:0:{}s:7:"fujitsu";a:0:{}s:9:"fujixerox";a:0:{}s:3:"fun";a:0:{}s:4:"fund";a:0:{}s:9:"furniture";a:0:{}s:6:"futbol";a:0:{}s:3:"fyi";a:0:{}s:3:"gal";a:0:{}s:7:"gallery";a:0:{}s:5:"gallo";a:0:{}s:6:"gallup";a:0:{}s:4:"game";a:0:{}s:5:"games";a:0:{}s:3:"gap";a:0:{}s:6:"garden";a:0:{}s:4:"gbiz";a:0:{}s:3:"gdn";a:0:{}s:3:"gea";a:0:{}s:4:"gent";a:0:{}s:7:"genting";a:0:{}s:6:"george";a:0:{}s:4:"ggee";a:0:{}s:4:"gift";a:0:{}s:5:"gifts";a:0:{}s:5:"gives";a:0:{}s:6:"giving";a:0:{}s:5:"glade";a:0:{}s:5:"glass";a:0:{}s:3:"gle";a:0:{}s:6:"global";a:0:{}s:5:"globo";a:0:{}s:5:"gmail";a:0:{}s:4:"gmbh";a:0:{}s:3:"gmo";a:0:{}s:3:"gmx";a:0:{}s:7:"godaddy";a:0:{}s:4:"gold";a:0:{}s:9:"goldpoint";a:0:{}s:4:"golf";a:0:{}s:3:"goo";a:0:{}s:9:"goodhands";a:0:{}s:8:"goodyear";a:0:{}s:4:"goog";a:0:{}s:6:"google";a:0:{}s:3:"gop";a:0:{}s:3:"got";a:0:{}s:8:"grainger";a:0:{}s:8:"graphics";a:0:{}s:6:"gratis";a:0:{}s:5:"green";a:0:{}s:5:"gripe";a:0:{}s:7:"grocery";a:0:{}s:5:"group";a:0:{}s:8:"guardian";a:0:{}s:5:"gucci";a:0:{}s:4:"guge";a:0:{}s:5:"guide";a:0:{}s:7:"guitars";a:0:{}s:4:"guru";a:0:{}s:4:"hair";a:0:{}s:7:"hamburg";a:0:{}s:7:"hangout";a:0:{}s:4:"haus";a:0:{}s:3:"hbo";a:0:{}s:4:"hdfc";a:0:{}s:8:"hdfcbank";a:0:{}s:6:"health";a:0:{}s:10:"healthcare";a:0:{}s:4:"help";a:0:{}s:8:"helsinki";a:0:{}s:4:"here";a:0:{}s:6:"hermes";a:0:{}s:4:"hgtv";a:0:{}s:6:"hiphop";a:0:{}s:9:"hisamitsu";a:0:{}s:7:"hitachi";a:0:{}s:3:"hiv";a:0:{}s:3:"hkt";a:0:{}s:6:"hockey";a:0:{}s:8:"holdings";a:0:{}s:7:"holiday";a:0:{}s:9:"homedepot";a:0:{}s:9:"homegoods";a:0:{}s:5:"homes";a:0:{}s:9:"homesense";a:0:{}s:5:"honda";a:0:{}s:9:"honeywell";a:0:{}s:5:"horse";a:0:{}s:8:"hospital";a:0:{}s:4:"host";a:0:{}s:7:"hosting";a:0:{}s:3:"hot";a:0:{}s:7:"hoteles";a:0:{}s:6:"hotels";a:0:{}s:7:"hotmail";a:0:{}s:5:"house";a:0:{}s:3:"how";a:0:{}s:4:"hsbc";a:0:{}s:3:"htc";a:0:{}s:6:"hughes";a:0:{}s:5:"hyatt";a:0:{}s:7:"hyundai";a:0:{}s:3:"ibm";a:0:{}s:4:"icbc";a:0:{}s:3:"ice";a:0:{}s:3:"icu";a:0:{}s:4:"ieee";a:0:{}s:3:"ifm";a:0:{}s:5:"ikano";a:0:{}s:6:"imamat";a:0:{}s:4:"imdb";a:0:{}s:4:"immo";a:0:{}s:10:"immobilien";a:0:{}s:10:"industries";a:0:{}s:8:"infiniti";a:0:{}s:3:"ing";a:0:{}s:3:"ink";a:0:{}s:9:"institute";a:0:{}s:9:"insurance";a:0:{}s:6:"insure";a:0:{}s:5:"intel";a:0:{}s:13:"international";a:0:{}s:6:"intuit";a:0:{}s:11:"investments";a:0:{}s:8:"ipiranga";a:0:{}s:5:"irish";a:0:{}s:7:"iselect";a:0:{}s:7:"ismaili";a:0:{}s:3:"ist";a:0:{}s:8:"istanbul";a:0:{}s:4:"itau";a:0:{}s:3:"itv";a:0:{}s:5:"iveco";a:0:{}s:3:"iwc";a:0:{}s:6:"jaguar";a:0:{}s:4:"java";a:0:{}s:3:"jcb";a:0:{}s:3:"jcp";a:0:{}s:4:"jeep";a:0:{}s:5:"jetzt";a:0:{}s:7:"jewelry";a:0:{}s:3:"jio";a:0:{}s:3:"jlc";a:0:{}s:3:"jll";a:0:{}s:3:"jmp";a:0:{}s:3:"jnj";a:0:{}s:6:"joburg";a:0:{}s:3:"jot";a:0:{}s:3:"joy";a:0:{}s:8:"jpmorgan";a:0:{}s:4:"jprs";a:0:{}s:6:"juegos";a:0:{}s:7:"juniper";a:0:{}s:6:"kaufen";a:0:{}s:4:"kddi";a:0:{}s:11:"kerryhotels";a:0:{}s:14:"kerrylogistics";a:0:{}s:15:"kerryproperties";a:0:{}s:3:"kfh";a:0:{}s:3:"kia";a:0:{}s:3:"kim";a:0:{}s:6:"kinder";a:0:{}s:6:"kindle";a:0:{}s:7:"kitchen";a:0:{}s:4:"kiwi";a:0:{}s:5:"koeln";a:0:{}s:7:"komatsu";a:0:{}s:6:"kosher";a:0:{}s:4:"kpmg";a:0:{}s:3:"kpn";a:0:{}s:3:"krd";a:0:{}s:4:"kred";a:0:{}s:9:"kuokgroup";a:0:{}s:5:"kyoto";a:0:{}s:7:"lacaixa";a:0:{}s:9:"ladbrokes";a:0:{}s:11:"lamborghini";a:0:{}s:5:"lamer";a:0:{}s:9:"lancaster";a:0:{}s:6:"lancia";a:0:{}s:7:"lancome";a:0:{}s:4:"land";a:0:{}s:9:"landrover";a:0:{}s:7:"lanxess";a:0:{}s:7:"lasalle";a:0:{}s:3:"lat";a:0:{}s:6:"latino";a:0:{}s:7:"latrobe";a:0:{}s:3:"law";a:0:{}s:6:"lawyer";a:0:{}s:3:"lds";a:0:{}s:5:"lease";a:0:{}s:7:"leclerc";a:0:{}s:6:"lefrak";a:0:{}s:5:"legal";a:0:{}s:4:"lego";a:0:{}s:5:"lexus";a:0:{}s:4:"lgbt";a:0:{}s:7:"liaison";a:0:{}s:4:"lidl";a:0:{}s:4:"life";a:0:{}s:13:"lifeinsurance";a:0:{}s:9:"lifestyle";a:0:{}s:8:"lighting";a:0:{}s:4:"like";a:0:{}s:5:"lilly";a:0:{}s:7:"limited";a:0:{}s:4:"limo";a:0:{}s:7:"lincoln";a:0:{}s:5:"linde";a:0:{}s:4:"link";a:0:{}s:5:"lipsy";a:0:{}s:4:"live";a:0:{}s:6:"living";a:0:{}s:5:"lixil";a:0:{}s:4:"loan";a:0:{}s:5:"loans";a:0:{}s:6:"locker";a:0:{}s:5:"locus";a:0:{}s:4:"loft";a:0:{}s:3:"lol";a:0:{}s:6:"london";a:0:{}s:5:"lotte";a:0:{}s:5:"lotto";a:0:{}s:4:"love";a:0:{}s:3:"lpl";a:0:{}s:12:"lplfinancial";a:0:{}s:3:"ltd";a:0:{}s:4:"ltda";a:0:{}s:8:"lundbeck";a:0:{}s:5:"lupin";a:0:{}s:4:"luxe";a:0:{}s:6:"luxury";a:0:{}s:5:"macys";a:0:{}s:6:"madrid";a:0:{}s:4:"maif";a:0:{}s:6:"maison";a:0:{}s:6:"makeup";a:0:{}s:3:"man";a:0:{}s:10:"management";a:0:{}s:5:"mango";a:0:{}s:3:"map";a:0:{}s:6:"market";a:0:{}s:9:"marketing";a:0:{}s:7:"markets";a:0:{}s:8:"marriott";a:0:{}s:9:"marshalls";a:0:{}s:8:"maserati";a:0:{}s:6:"mattel";a:0:{}s:3:"mba";a:0:{}s:3:"mcd";a:0:{}s:9:"mcdonalds";a:0:{}s:8:"mckinsey";a:0:{}s:3:"med";a:0:{}s:5:"media";a:0:{}s:4:"meet";a:0:{}s:9:"melbourne";a:0:{}s:4:"meme";a:0:{}s:8:"memorial";a:0:{}s:3:"men";a:0:{}s:4:"menu";a:0:{}s:3:"meo";a:0:{}s:8:"merckmsd";a:0:{}s:7:"metlife";a:0:{}s:5:"miami";a:0:{}s:9:"microsoft";a:0:{}s:4:"mini";a:0:{}s:4:"mint";a:0:{}s:3:"mit";a:0:{}s:10:"mitsubishi";a:0:{}s:3:"mlb";a:0:{}s:3:"mls";a:0:{}s:3:"mma";a:0:{}s:6:"mobile";a:0:{}s:6:"mobily";a:0:{}s:4:"moda";a:0:{}s:3:"moe";a:0:{}s:3:"moi";a:0:{}s:3:"mom";a:0:{}s:6:"monash";a:0:{}s:5:"money";a:0:{}s:7:"monster";a:0:{}s:9:"montblanc";a:0:{}s:5:"mopar";a:0:{}s:6:"mormon";a:0:{}s:8:"mortgage";a:0:{}s:6:"moscow";a:0:{}s:4:"moto";a:0:{}s:11:"motorcycles";a:0:{}s:3:"mov";a:0:{}s:5:"movie";a:0:{}s:8:"movistar";a:0:{}s:3:"msd";a:0:{}s:3:"mtn";a:0:{}s:4:"mtpc";a:0:{}s:3:"mtr";a:0:{}s:6:"mutual";a:0:{}s:3:"nab";a:0:{}s:5:"nadex";a:0:{}s:6:"nagoya";a:0:{}s:10:"nationwide";a:0:{}s:6:"natura";a:0:{}s:4:"navy";a:0:{}s:3:"nba";a:0:{}s:3:"nec";a:0:{}s:7:"netbank";a:0:{}s:7:"netflix";a:0:{}s:7:"network";a:0:{}s:7:"neustar";a:0:{}s:3:"new";a:0:{}s:10:"newholland";a:0:{}s:4:"news";a:0:{}s:4:"next";a:0:{}s:10:"nextdirect";a:0:{}s:5:"nexus";a:0:{}s:3:"nfl";a:0:{}s:3:"ngo";a:0:{}s:3:"nhk";a:0:{}s:4:"nico";a:0:{}s:4:"nike";a:0:{}s:5:"nikon";a:0:{}s:5:"ninja";a:0:{}s:6:"nissan";a:0:{}s:6:"nissay";a:0:{}s:5:"nokia";a:0:{}s:18:"northwesternmutual";a:0:{}s:6:"norton";a:0:{}s:3:"now";a:0:{}s:6:"nowruz";a:0:{}s:5:"nowtv";a:0:{}s:3:"nra";a:0:{}s:3:"nrw";a:0:{}s:3:"ntt";a:0:{}s:3:"nyc";a:0:{}s:3:"obi";a:0:{}s:8:"observer";a:0:{}s:3:"off";a:0:{}s:6:"office";a:0:{}s:7:"okinawa";a:0:{}s:6:"olayan";a:0:{}s:11:"olayangroup";a:0:{}s:7:"oldnavy";a:0:{}s:4:"ollo";a:0:{}s:5:"omega";a:0:{}s:3:"one";a:0:{}s:3:"ong";a:0:{}s:3:"onl";a:0:{}s:6:"online";a:0:{}s:10:"onyourside";a:0:{}s:3:"ooo";a:0:{}s:4:"open";a:0:{}s:6:"oracle";a:0:{}s:6:"orange";a:0:{}s:7:"organic";a:0:{}s:7:"origins";a:0:{}s:5:"osaka";a:0:{}s:6:"otsuka";a:0:{}s:3:"ott";a:0:{}s:3:"ovh";a:0:{}s:4:"page";a:0:{}s:12:"pamperedchef";a:0:{}s:9:"panasonic";a:0:{}s:7:"panerai";a:0:{}s:5:"paris";a:0:{}s:4:"pars";a:0:{}s:8:"partners";a:0:{}s:5:"parts";a:0:{}s:5:"party";a:0:{}s:9:"passagens";a:0:{}s:3:"pay";a:0:{}s:4:"pccw";a:0:{}s:3:"pet";a:0:{}s:6:"pfizer";a:0:{}s:8:"pharmacy";a:0:{}s:3:"phd";a:0:{}s:7:"philips";a:0:{}s:5:"phone";a:0:{}s:5:"photo";a:0:{}s:11:"photography";a:0:{}s:6:"photos";a:0:{}s:6:"physio";a:0:{}s:6:"piaget";a:0:{}s:4:"pics";a:0:{}s:6:"pictet";a:0:{}s:8:"pictures";a:0:{}s:3:"pid";a:0:{}s:3:"pin";a:0:{}s:4:"ping";a:0:{}s:4:"pink";a:0:{}s:7:"pioneer";a:0:{}s:5:"pizza";a:0:{}s:5:"place";a:0:{}s:4:"play";a:0:{}s:11:"playstation";a:0:{}s:8:"plumbing";a:0:{}s:4:"plus";a:0:{}s:3:"pnc";a:0:{}s:4:"pohl";a:0:{}s:5:"poker";a:0:{}s:7:"politie";a:0:{}s:4:"porn";a:0:{}s:9:"pramerica";a:0:{}s:5:"praxi";a:0:{}s:5:"press";a:0:{}s:5:"prime";a:0:{}s:4:"prod";a:0:{}s:11:"productions";a:0:{}s:4:"prof";a:0:{}s:11:"progressive";a:0:{}s:5:"promo";a:0:{}s:10:"properties";a:0:{}s:8:"property";a:0:{}s:10:"protection";a:0:{}s:3:"pru";a:0:{}s:10:"prudential";a:0:{}s:3:"pub";a:0:{}s:3:"pwc";a:0:{}s:4:"qpon";a:0:{}s:6:"quebec";a:0:{}s:5:"quest";a:0:{}s:3:"qvc";a:0:{}s:6:"racing";a:0:{}s:5:"radio";a:0:{}s:4:"raid";a:0:{}s:4:"read";a:0:{}s:10:"realestate";a:0:{}s:7:"realtor";a:0:{}s:6:"realty";a:0:{}s:7:"recipes";a:0:{}s:3:"red";a:0:{}s:8:"redstone";a:0:{}s:11:"redumbrella";a:0:{}s:5:"rehab";a:0:{}s:5:"reise";a:0:{}s:6:"reisen";a:0:{}s:4:"reit";a:0:{}s:8:"reliance";a:0:{}s:3:"ren";a:0:{}s:4:"rent";a:0:{}s:7:"rentals";a:0:{}s:6:"repair";a:0:{}s:6:"report";a:0:{}s:10:"republican";a:0:{}s:4:"rest";a:0:{}s:10:"restaurant";a:0:{}s:6:"review";a:0:{}s:7:"reviews";a:0:{}s:7:"rexroth";a:0:{}s:4:"rich";a:0:{}s:9:"richardli";a:0:{}s:5:"ricoh";a:0:{}s:11:"rightathome";a:0:{}s:3:"ril";a:0:{}s:3:"rio";a:0:{}s:3:"rip";a:0:{}s:4:"rmit";a:0:{}s:6:"rocher";a:0:{}s:5:"rocks";a:0:{}s:5:"rodeo";a:0:{}s:6:"rogers";a:0:{}s:4:"room";a:0:{}s:4:"rsvp";a:0:{}s:5:"rugby";a:0:{}s:4:"ruhr";a:0:{}s:3:"run";a:0:{}s:3:"rwe";a:0:{}s:6:"ryukyu";a:0:{}s:8:"saarland";a:0:{}s:4:"safe";a:0:{}s:6:"safety";a:0:{}s:6:"sakura";a:0:{}s:4:"sale";a:0:{}s:5:"salon";a:0:{}s:8:"samsclub";a:0:{}s:7:"samsung";a:0:{}s:7:"sandvik";a:0:{}s:15:"sandvikcoromant";a:0:{}s:6:"sanofi";a:0:{}s:3:"sap";a:0:{}s:4:"sapo";a:0:{}s:4:"sarl";a:0:{}s:3:"sas";a:0:{}s:4:"save";a:0:{}s:4:"saxo";a:0:{}s:3:"sbi";a:0:{}s:3:"sbs";a:0:{}s:3:"sca";a:0:{}s:3:"scb";a:0:{}s:10:"schaeffler";a:0:{}s:7:"schmidt";a:0:{}s:12:"scholarships";a:0:{}s:6:"school";a:0:{}s:6:"schule";a:0:{}s:7:"schwarz";a:0:{}s:7:"science";a:0:{}s:9:"scjohnson";a:0:{}s:4:"scor";a:0:{}s:4:"scot";a:0:{}s:6:"search";a:0:{}s:4:"seat";a:0:{}s:6:"secure";a:0:{}s:8:"security";a:0:{}s:4:"seek";a:0:{}s:6:"select";a:0:{}s:5:"sener";a:0:{}s:8:"services";a:0:{}s:3:"ses";a:0:{}s:5:"seven";a:0:{}s:3:"sew";a:0:{}s:3:"sex";a:0:{}s:4:"sexy";a:0:{}s:3:"sfr";a:0:{}s:9:"shangrila";a:0:{}s:5:"sharp";a:0:{}s:4:"shaw";a:0:{}s:5:"shell";a:0:{}s:4:"shia";a:0:{}s:7:"shiksha";a:0:{}s:5:"shoes";a:0:{}s:4:"shop";a:0:{}s:8:"shopping";a:0:{}s:6:"shouji";a:0:{}s:4:"show";a:0:{}s:8:"showtime";a:0:{}s:7:"shriram";a:0:{}s:4:"silk";a:0:{}s:4:"sina";a:0:{}s:7:"singles";a:0:{}s:4:"site";a:0:{}s:3:"ski";a:0:{}s:4:"skin";a:0:{}s:3:"sky";a:0:{}s:5:"skype";a:0:{}s:5:"sling";a:0:{}s:5:"smart";a:0:{}s:5:"smile";a:0:{}s:4:"sncf";a:0:{}s:6:"soccer";a:0:{}s:6:"social";a:0:{}s:8:"softbank";a:0:{}s:8:"software";a:0:{}s:4:"sohu";a:0:{}s:5:"solar";a:0:{}s:9:"solutions";a:0:{}s:4:"song";a:0:{}s:4:"sony";a:0:{}s:3:"soy";a:0:{}s:5:"space";a:0:{}s:7:"spiegel";a:0:{}s:4:"spot";a:0:{}s:13:"spreadbetting";a:0:{}s:3:"srl";a:0:{}s:3:"srt";a:0:{}s:5:"stada";a:0:{}s:7:"staples";a:0:{}s:4:"star";a:0:{}s:7:"starhub";a:0:{}s:9:"statebank";a:0:{}s:9:"statefarm";a:0:{}s:7:"statoil";a:0:{}s:3:"stc";a:0:{}s:8:"stcgroup";a:0:{}s:9:"stockholm";a:0:{}s:7:"storage";a:0:{}s:5:"store";a:0:{}s:6:"stream";a:0:{}s:6:"studio";a:0:{}s:5:"study";a:0:{}s:5:"style";a:0:{}s:5:"sucks";a:0:{}s:8:"supplies";a:0:{}s:6:"supply";a:0:{}s:7:"support";a:0:{}s:4:"surf";a:0:{}s:7:"surgery";a:0:{}s:6:"suzuki";a:0:{}s:6:"swatch";a:0:{}s:10:"swiftcover";a:0:{}s:5:"swiss";a:0:{}s:6:"sydney";a:0:{}s:8:"symantec";a:0:{}s:7:"systems";a:0:{}s:3:"tab";a:0:{}s:6:"taipei";a:0:{}s:4:"talk";a:0:{}s:6:"taobao";a:0:{}s:6:"target";a:0:{}s:10:"tatamotors";a:0:{}s:5:"tatar";a:0:{}s:6:"tattoo";a:0:{}s:3:"tax";a:0:{}s:4:"taxi";a:0:{}s:3:"tci";a:0:{}s:3:"tdk";a:0:{}s:4:"team";a:0:{}s:4:"tech";a:0:{}s:10:"technology";a:0:{}s:8:"telecity";a:0:{}s:10:"telefonica";a:0:{}s:7:"temasek";a:0:{}s:6:"tennis";a:0:{}s:4:"teva";a:0:{}s:3:"thd";a:0:{}s:7:"theater";a:0:{}s:7:"theatre";a:0:{}s:4:"tiaa";a:0:{}s:7:"tickets";a:0:{}s:6:"tienda";a:0:{}s:7:"tiffany";a:0:{}s:4:"tips";a:0:{}s:5:"tires";a:0:{}s:5:"tirol";a:0:{}s:6:"tjmaxx";a:0:{}s:3:"tjx";a:0:{}s:6:"tkmaxx";a:0:{}s:5:"tmall";a:0:{}s:5:"today";a:0:{}s:5:"tokyo";a:0:{}s:5:"tools";a:0:{}s:3:"top";a:0:{}s:5:"toray";a:0:{}s:7:"toshiba";a:0:{}s:5:"total";a:0:{}s:5:"tours";a:0:{}s:4:"town";a:0:{}s:6:"toyota";a:0:{}s:4:"toys";a:0:{}s:5:"trade";a:0:{}s:7:"trading";a:0:{}s:8:"training";a:0:{}s:13:"travelchannel";a:0:{}s:9:"travelers";a:0:{}s:18:"travelersinsurance";a:0:{}s:5:"trust";a:0:{}s:3:"trv";a:0:{}s:4:"tube";a:0:{}s:3:"tui";a:0:{}s:5:"tunes";a:0:{}s:5:"tushu";a:0:{}s:3:"tvs";a:0:{}s:5:"ubank";a:0:{}s:3:"ubs";a:0:{}s:8:"uconnect";a:0:{}s:6:"unicom";a:0:{}s:10:"university";a:0:{}s:3:"uno";a:0:{}s:3:"uol";a:0:{}s:3:"ups";a:0:{}s:9:"vacations";a:0:{}s:4:"vana";a:0:{}s:8:"vanguard";a:0:{}s:5:"vegas";a:0:{}s:8:"ventures";a:0:{}s:8:"verisign";a:0:{}s:12:"versicherung";a:0:{}s:3:"vet";a:0:{}s:6:"viajes";a:0:{}s:5:"video";a:0:{}s:3:"vig";a:0:{}s:6:"viking";a:0:{}s:6:"villas";a:0:{}s:3:"vin";a:0:{}s:3:"vip";a:0:{}s:6:"virgin";a:0:{}s:4:"visa";a:0:{}s:6:"vision";a:0:{}s:5:"vista";a:0:{}s:10:"vistaprint";a:0:{}s:4:"viva";a:0:{}s:4:"vivo";a:0:{}s:10:"vlaanderen";a:0:{}s:5:"vodka";a:0:{}s:10:"volkswagen";a:0:{}s:5:"volvo";a:0:{}s:4:"vote";a:0:{}s:6:"voting";a:0:{}s:4:"voto";a:0:{}s:6:"voyage";a:0:{}s:6:"vuelos";a:0:{}s:5:"wales";a:0:{}s:7:"walmart";a:0:{}s:6:"walter";a:0:{}s:4:"wang";a:0:{}s:7:"wanggou";a:0:{}s:6:"warman";a:0:{}s:5:"watch";a:0:{}s:7:"watches";a:0:{}s:7:"weather";a:0:{}s:14:"weatherchannel";a:0:{}s:6:"webcam";a:0:{}s:5:"weber";a:0:{}s:7:"website";a:0:{}s:3:"wed";a:0:{}s:7:"wedding";a:0:{}s:5:"weibo";a:0:{}s:4:"weir";a:0:{}s:7:"whoswho";a:0:{}s:4:"wien";a:0:{}s:4:"wiki";a:0:{}s:11:"williamhill";a:0:{}s:3:"win";a:0:{}s:7:"windows";a:0:{}s:4:"wine";a:0:{}s:7:"winners";a:0:{}s:3:"wme";a:0:{}s:13:"wolterskluwer";a:0:{}s:8:"woodside";a:0:{}s:4:"work";a:0:{}s:5:"works";a:0:{}s:5:"world";a:0:{}s:3:"wow";a:0:{}s:3:"wtc";a:0:{}s:3:"wtf";a:0:{}s:4:"xbox";a:0:{}s:5:"xerox";a:0:{}s:7:"xfinity";a:0:{}s:6:"xihuan";a:0:{}s:3:"xin";a:0:{}s:11:"xn--11b4c3d";a:0:{}s:11:"xn--1ck2e1b";a:0:{}s:11:"xn--1qqw23a";a:0:{}s:10:"xn--30rr7y";a:0:{}s:11:"xn--3bst00m";a:0:{}s:11:"xn--3ds443g";a:0:{}s:17:"xn--3oq18vl8pn36a";a:0:{}s:10:"xn--3pxu8k";a:0:{}s:11:"xn--42c2d9a";a:0:{}s:10:"xn--45q11c";a:0:{}s:10:"xn--4gbrim";a:0:{}s:11:"xn--55qw42g";a:0:{}s:10:"xn--55qx5d";a:0:{}s:17:"xn--5su34j936bgsg";a:0:{}s:10:"xn--5tzm5g";a:0:{}s:11:"xn--6frz82g";a:0:{}s:14:"xn--6qq986b3xl";a:0:{}s:12:"xn--80adxhks";a:0:{}s:14:"xn--80aqecdr1a";a:0:{}s:12:"xn--80asehdb";a:0:{}s:10:"xn--80aswg";a:0:{}s:12:"xn--8y0a063a";a:0:{}s:10:"xn--9dbq2a";a:0:{}s:10:"xn--9et52u";a:0:{}s:11:"xn--9krt00a";a:0:{}s:14:"xn--b4w605ferd";a:0:{}s:17:"xn--bck1b9a5dre4c";a:0:{}s:9:"xn--c1avg";a:0:{}s:10:"xn--c2br7g";a:0:{}s:11:"xn--cck2b3b";a:0:{}s:10:"xn--cg4bki";a:0:{}s:11:"xn--czr694b";a:0:{}s:10:"xn--czrs0t";a:0:{}s:10:"xn--czru2d";a:0:{}s:11:"xn--d1acj3b";a:0:{}s:13:"xn--eckvdtc9d";a:0:{}s:11:"xn--efvy88h";a:0:{}s:11:"xn--estv75g";a:0:{}s:11:"xn--fct429k";a:0:{}s:9:"xn--fhbei";a:0:{}s:14:"xn--fiq228c5hs";a:0:{}s:10:"xn--fiq64b";a:0:{}s:11:"xn--fjq720a";a:0:{}s:11:"xn--flw351e";a:0:{}s:16:"xn--fzys8d69uvgm";a:0:{}s:11:"xn--g2xx48c";a:0:{}s:12:"xn--gckr3f0f";a:0:{}s:11:"xn--gk3at1e";a:0:{}s:11:"xn--hxt814e";a:0:{}s:15:"xn--i1b6b1a6a2e";a:0:{}s:11:"xn--imr513n";a:0:{}s:10:"xn--io0a7i";a:0:{}s:9:"xn--j1aef";a:0:{}s:14:"xn--jlq61u9w7b";a:0:{}s:11:"xn--jvr189m";a:0:{}s:15:"xn--kcrx77d1x4a";a:0:{}s:11:"xn--kpu716f";a:0:{}s:10:"xn--kput3i";a:0:{}s:14:"xn--mgba3a3ejt";a:0:{}s:16:"xn--mgba7c0bbn0a";a:0:{}s:15:"xn--mgbaakc7dvf";a:0:{}s:12:"xn--mgbab2bd";a:0:{}s:14:"xn--mgbb9fbpob";a:0:{}s:14:"xn--mgbca7dzdo";a:0:{}s:14:"xn--mgbi4ecexp";a:0:{}s:12:"xn--mgbt3dhd";a:0:{}s:12:"xn--mk1bu44c";a:0:{}s:10:"xn--mxtq1m";a:0:{}s:12:"xn--ngbc5azd";a:0:{}s:12:"xn--ngbe9e0a";a:0:{}s:9:"xn--ngbrx";a:0:{}s:9:"xn--nqv7f";a:0:{}s:15:"xn--nqv7fs00ema";a:0:{}s:11:"xn--nyqy26a";a:0:{}s:9:"xn--p1acf";a:0:{}s:11:"xn--pbt977c";a:0:{}s:10:"xn--pssy2u";a:0:{}s:11:"xn--q9jyb4c";a:0:{}s:12:"xn--qcka1pmc";a:0:{}s:11:"xn--rhqv96g";a:0:{}s:11:"xn--rovu88b";a:0:{}s:11:"xn--ses554g";a:0:{}s:11:"xn--t60b56a";a:0:{}s:9:"xn--tckwe";a:0:{}s:13:"xn--tiq49xqyj";a:0:{}s:10:"xn--unup4y";a:0:{}s:23:"xn--vermgensberater-ctb";a:0:{}s:24:"xn--vermgensberatung-pwb";a:0:{}s:9:"xn--vhquv";a:0:{}s:11:"xn--vuq861b";a:0:{}s:20:"xn--w4r85el8fhu5dnra";a:0:{}s:11:"xn--w4rs40l";a:0:{}s:11:"xn--xhq521b";a:0:{}s:11:"xn--zfr164b";a:0:{}s:6:"xperia";a:0:{}s:3:"xyz";a:0:{}s:6:"yachts";a:0:{}s:5:"yahoo";a:0:{}s:7:"yamaxun";a:0:{}s:6:"yandex";a:0:{}s:9:"yodobashi";a:0:{}s:4:"yoga";a:0:{}s:8:"yokohama";a:0:{}s:3:"you";a:0:{}s:7:"youtube";a:0:{}s:3:"yun";a:0:{}s:6:"zappos";a:0:{}s:4:"zara";a:0:{}s:4:"zero";a:0:{}s:3:"zip";a:0:{}s:5:"zippo";a:0:{}s:4:"zone";a:0:{}s:7:"zuerich";a:0:{}} \ No newline at end of file +s:86397:"{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gov":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[]},"br":{"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"belem":[],"bio":[],"blog":[],"bmd":[],"bsb":[],"cim":[],"cng":[],"cnt":[],"com":[],"coop":[],"cri":[],"cuiaba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"flog":[],"floripa":[],"fortal":[],"fm":[],"fnd":[],"fot":[],"fst":[],"g12":[],"ggf":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jampa":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"mat":[],"med":[],"mil":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"qsl":[],"radio":[],"rec":[],"recife":[],"riobranco":[],"sjc":[],"slg":[],"srv":[],"taxi":[],"teo":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"*":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"boots":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"chloe":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"htc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mcd":[],"mcdonalds":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"montblanc":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtpc":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"pamperedchef":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]}"; \ No newline at end of file diff --git a/data/B/5/c7aed7cd2a308523e7d2847b7815909e864b2fd9c4ea88b00d35adb2ecdfd7 b/data/B/5/c7aed7cd2a308523e7d2847b7815909e864b2fd9c4ea88b00d35adb2ecdfd7 index f70ffd06..2a5cb4e9 100644 --- a/data/B/5/c7aed7cd2a308523e7d2847b7815909e864b2fd9c4ea88b00d35adb2ecdfd7 +++ b/data/B/5/c7aed7cd2a308523e7d2847b7815909e864b2fd9c4ea88b00d35adb2ecdfd7 @@ -1 +1 @@ -a:1557:{s:2:"ac";a:6:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"mil";a:0:{}s:3:"org";a:0:{}}s:2:"ad";a:1:{s:3:"nom";a:0:{}}s:2:"ae";a:9:{s:2:"co";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sch";a:0:{}s:2:"ac";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:4:"aero";a:87:{s:22:"accident-investigation";a:0:{}s:19:"accident-prevention";a:0:{}s:9:"aerobatic";a:0:{}s:8:"aeroclub";a:0:{}s:9:"aerodrome";a:0:{}s:6:"agents";a:0:{}s:8:"aircraft";a:0:{}s:7:"airline";a:0:{}s:7:"airport";a:0:{}s:16:"air-surveillance";a:0:{}s:10:"airtraffic";a:0:{}s:19:"air-traffic-control";a:0:{}s:9:"ambulance";a:0:{}s:9:"amusement";a:0:{}s:11:"association";a:0:{}s:6:"author";a:0:{}s:10:"ballooning";a:0:{}s:6:"broker";a:0:{}s:3:"caa";a:0:{}s:5:"cargo";a:0:{}s:8:"catering";a:0:{}s:13:"certification";a:0:{}s:12:"championship";a:0:{}s:7:"charter";a:0:{}s:13:"civilaviation";a:0:{}s:4:"club";a:0:{}s:10:"conference";a:0:{}s:10:"consultant";a:0:{}s:10:"consulting";a:0:{}s:7:"control";a:0:{}s:7:"council";a:0:{}s:4:"crew";a:0:{}s:6:"design";a:0:{}s:4:"dgca";a:0:{}s:8:"educator";a:0:{}s:9:"emergency";a:0:{}s:6:"engine";a:0:{}s:8:"engineer";a:0:{}s:13:"entertainment";a:0:{}s:9:"equipment";a:0:{}s:8:"exchange";a:0:{}s:7:"express";a:0:{}s:10:"federation";a:0:{}s:6:"flight";a:0:{}s:7:"freight";a:0:{}s:4:"fuel";a:0:{}s:7:"gliding";a:0:{}s:10:"government";a:0:{}s:14:"groundhandling";a:0:{}s:5:"group";a:0:{}s:11:"hanggliding";a:0:{}s:9:"homebuilt";a:0:{}s:9:"insurance";a:0:{}s:7:"journal";a:0:{}s:10:"journalist";a:0:{}s:7:"leasing";a:0:{}s:9:"logistics";a:0:{}s:8:"magazine";a:0:{}s:11:"maintenance";a:0:{}s:5:"media";a:0:{}s:10:"microlight";a:0:{}s:9:"modelling";a:0:{}s:10:"navigation";a:0:{}s:11:"parachuting";a:0:{}s:11:"paragliding";a:0:{}s:21:"passenger-association";a:0:{}s:5:"pilot";a:0:{}s:5:"press";a:0:{}s:10:"production";a:0:{}s:10:"recreation";a:0:{}s:7:"repbody";a:0:{}s:3:"res";a:0:{}s:8:"research";a:0:{}s:10:"rotorcraft";a:0:{}s:6:"safety";a:0:{}s:9:"scientist";a:0:{}s:8:"services";a:0:{}s:4:"show";a:0:{}s:9:"skydiving";a:0:{}s:8:"software";a:0:{}s:7:"student";a:0:{}s:6:"trader";a:0:{}s:7:"trading";a:0:{}s:7:"trainer";a:0:{}s:5:"union";a:0:{}s:12:"workinggroup";a:0:{}s:5:"works";a:0:{}}s:2:"af";a:5:{s:3:"gov";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}}s:2:"ag";a:5:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:2:"co";a:0:{}s:3:"nom";a:0:{}}s:2:"ai";a:5:{s:3:"off";a:0:{}s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"nom";a:0:{}}s:2:"al";a:8:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"am";a:1:{s:8:"blogspot";a:0:{}}s:2:"ao";a:6:{s:2:"ed";a:0:{}s:2:"gv";a:0:{}s:2:"og";a:0:{}s:2:"co";a:0:{}s:2:"pb";a:0:{}s:2:"it";a:0:{}}s:2:"aq";a:0:{}s:2:"ar";a:10:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:3:"gov";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:6:"musica";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"tur";a:0:{}}s:4:"arpa";a:6:{s:4:"e164";a:0:{}s:7:"in-addr";a:0:{}s:3:"ip6";a:0:{}s:4:"iris";a:0:{}s:3:"uri";a:0:{}s:3:"urn";a:0:{}}s:2:"as";a:1:{s:3:"gov";a:0:{}}s:4:"asia";a:1:{s:7:"cloudns";a:0:{}}s:2:"at";a:15:{s:2:"ac";a:0:{}s:2:"co";a:1:{s:8:"blogspot";a:0:{}}s:2:"gv";a:0:{}s:2:"or";a:0:{}s:9:"futurecms";a:1:{s:1:"*";a:0:{}}s:13:"futurehosting";a:0:{}s:13:"futuremailing";a:0:{}s:8:"ortsinfo";a:2:{s:2:"ex";a:1:{s:1:"*";a:0:{}}s:6:"kunden";a:1:{s:1:"*";a:0:{}}}s:3:"biz";a:0:{}s:4:"info";a:0:{}s:4:"priv";a:0:{}s:4:"12hp";a:0:{}s:3:"2ix";a:0:{}s:5:"4lima";a:0:{}s:9:"lima-city";a:0:{}}s:2:"au";a:18:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:8:{s:3:"act";a:0:{}s:3:"nsw";a:0:{}s:2:"nt";a:0:{}s:3:"qld";a:0:{}s:2:"sa";a:0:{}s:3:"tas";a:0:{}s:3:"vic";a:0:{}s:2:"wa";a:0:{}}s:3:"gov";a:5:{s:3:"qld";a:0:{}s:2:"sa";a:0:{}s:3:"tas";a:0:{}s:3:"vic";a:0:{}s:2:"wa";a:0:{}}s:3:"asn";a:0:{}s:2:"id";a:0:{}s:4:"info";a:0:{}s:4:"conf";a:0:{}s:2:"oz";a:0:{}s:3:"act";a:0:{}s:3:"nsw";a:0:{}s:2:"nt";a:0:{}s:3:"qld";a:0:{}s:2:"sa";a:0:{}s:3:"tas";a:0:{}s:3:"vic";a:0:{}s:2:"wa";a:0:{}}s:2:"aw";a:1:{s:3:"com";a:0:{}}s:2:"ax";a:0:{}s:2:"az";a:12:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"int";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:4:"info";a:0:{}s:2:"pp";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}s:3:"pro";a:0:{}s:3:"biz";a:0:{}}s:2:"ba";a:7:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:8:"blogspot";a:0:{}}s:2:"bb";a:10:{s:3:"biz";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:5:"store";a:0:{}s:2:"tv";a:0:{}}s:2:"bd";a:1:{s:1:"*";a:0:{}}s:2:"be";a:3:{s:2:"ac";a:0:{}s:8:"blogspot";a:0:{}s:8:"transurl";a:1:{s:1:"*";a:0:{}}}s:2:"bf";a:1:{s:3:"gov";a:0:{}}s:2:"bg";a:38:{s:1:"a";a:0:{}s:1:"b";a:0:{}s:1:"c";a:0:{}s:1:"d";a:0:{}s:1:"e";a:0:{}s:1:"f";a:0:{}s:1:"g";a:0:{}s:1:"h";a:0:{}s:1:"i";a:0:{}s:1:"j";a:0:{}s:1:"k";a:0:{}s:1:"l";a:0:{}s:1:"m";a:0:{}s:1:"n";a:0:{}s:1:"o";a:0:{}s:1:"p";a:0:{}s:1:"q";a:0:{}s:1:"r";a:0:{}s:1:"s";a:0:{}s:1:"t";a:0:{}s:1:"u";a:0:{}s:1:"v";a:0:{}s:1:"w";a:0:{}s:1:"x";a:0:{}s:1:"y";a:0:{}s:1:"z";a:0:{}i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}i:3;a:0:{}i:4;a:0:{}i:5;a:0:{}i:6;a:0:{}i:7;a:0:{}i:8;a:0:{}i:9;a:0:{}s:8:"blogspot";a:0:{}s:5:"barsy";a:0:{}}s:2:"bh";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}}s:2:"bi";a:5:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:2:"or";a:0:{}s:3:"org";a:0:{}}s:3:"biz";a:12:{s:7:"cloudns";a:0:{}s:6:"dyndns";a:0:{}s:10:"for-better";a:0:{}s:8:"for-more";a:0:{}s:8:"for-some";a:0:{}s:7:"for-the";a:0:{}s:6:"selfip";a:0:{}s:6:"webhop";a:0:{}s:6:"mmafan";a:0:{}s:5:"myftp";a:0:{}s:5:"no-ip";a:0:{}s:7:"dscloud";a:0:{}}s:2:"bj";a:4:{s:4:"asso";a:0:{}s:7:"barreau";a:0:{}s:4:"gouv";a:0:{}s:8:"blogspot";a:0:{}}s:2:"bm";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"bn";a:1:{s:1:"*";a:0:{}}s:2:"bo";a:9:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"gob";a:0:{}s:3:"int";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"mil";a:0:{}s:2:"tv";a:0:{}}s:2:"br";a:95:{s:3:"abc";a:0:{}s:3:"adm";a:0:{}s:3:"adv";a:0:{}s:3:"agr";a:0:{}s:3:"aju";a:0:{}s:2:"am";a:0:{}s:9:"aparecida";a:0:{}s:3:"arq";a:0:{}s:3:"art";a:0:{}s:3:"ato";a:0:{}s:1:"b";a:0:{}s:5:"belem";a:0:{}s:3:"bio";a:0:{}s:4:"blog";a:0:{}s:3:"bmd";a:0:{}s:3:"bsb";a:0:{}s:3:"cim";a:0:{}s:3:"cng";a:0:{}s:3:"cnt";a:0:{}s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:4:"coop";a:0:{}s:3:"cri";a:0:{}s:6:"cuiaba";a:0:{}s:3:"def";a:0:{}s:3:"ecn";a:0:{}s:3:"eco";a:0:{}s:3:"edu";a:0:{}s:3:"emp";a:0:{}s:3:"eng";a:0:{}s:3:"esp";a:0:{}s:3:"etc";a:0:{}s:3:"eti";a:0:{}s:3:"far";a:0:{}s:4:"flog";a:0:{}s:7:"floripa";a:0:{}s:6:"fortal";a:0:{}s:2:"fm";a:0:{}s:3:"fnd";a:0:{}s:3:"fot";a:0:{}s:3:"fst";a:0:{}s:3:"g12";a:0:{}s:3:"ggf";a:0:{}s:3:"gov";a:27:{s:2:"ac";a:0:{}s:2:"al";a:0:{}s:2:"am";a:0:{}s:2:"ap";a:0:{}s:2:"ba";a:0:{}s:2:"ce";a:0:{}s:2:"df";a:0:{}s:2:"es";a:0:{}s:2:"go";a:0:{}s:2:"ma";a:0:{}s:2:"mg";a:0:{}s:2:"ms";a:0:{}s:2:"mt";a:0:{}s:2:"pa";a:0:{}s:2:"pb";a:0:{}s:2:"pe";a:0:{}s:2:"pi";a:0:{}s:2:"pr";a:0:{}s:2:"rj";a:0:{}s:2:"rn";a:0:{}s:2:"ro";a:0:{}s:2:"rr";a:0:{}s:2:"rs";a:0:{}s:2:"sc";a:0:{}s:2:"se";a:0:{}s:2:"sp";a:0:{}s:2:"to";a:0:{}}s:3:"gru";a:0:{}s:3:"imb";a:0:{}s:3:"ind";a:0:{}s:3:"inf";a:0:{}s:5:"jampa";a:0:{}s:3:"jor";a:0:{}s:3:"jus";a:0:{}s:3:"leg";a:27:{s:2:"ac";a:0:{}s:2:"al";a:0:{}s:2:"am";a:0:{}s:2:"ap";a:0:{}s:2:"ba";a:0:{}s:2:"ce";a:0:{}s:2:"df";a:0:{}s:2:"es";a:0:{}s:2:"go";a:0:{}s:2:"ma";a:0:{}s:2:"mg";a:0:{}s:2:"ms";a:0:{}s:2:"mt";a:0:{}s:2:"pa";a:0:{}s:2:"pb";a:0:{}s:2:"pe";a:0:{}s:2:"pi";a:0:{}s:2:"pr";a:0:{}s:2:"rj";a:0:{}s:2:"rn";a:0:{}s:2:"ro";a:0:{}s:2:"rr";a:0:{}s:2:"rs";a:0:{}s:2:"sc";a:0:{}s:2:"se";a:0:{}s:2:"sp";a:0:{}s:2:"to";a:0:{}}s:3:"lel";a:0:{}s:8:"londrina";a:0:{}s:6:"macapa";a:0:{}s:6:"maceio";a:0:{}s:3:"mat";a:0:{}s:3:"med";a:0:{}s:3:"mil";a:0:{}s:2:"mp";a:0:{}s:3:"mus";a:0:{}s:5:"natal";a:0:{}s:3:"net";a:0:{}s:7:"niteroi";a:0:{}s:3:"nom";a:1:{s:1:"*";a:0:{}}s:3:"not";a:0:{}s:3:"ntr";a:0:{}s:3:"odo";a:0:{}s:3:"org";a:0:{}s:6:"osasco";a:0:{}s:6:"palmas";a:0:{}s:3:"poa";a:0:{}s:3:"ppg";a:0:{}s:3:"pro";a:0:{}s:3:"psc";a:0:{}s:3:"psi";a:0:{}s:3:"qsl";a:0:{}s:5:"radio";a:0:{}s:3:"rec";a:0:{}s:6:"recife";a:0:{}s:9:"riobranco";a:0:{}s:3:"sjc";a:0:{}s:3:"slg";a:0:{}s:3:"srv";a:0:{}s:4:"taxi";a:0:{}s:3:"teo";a:0:{}s:3:"tmp";a:0:{}s:3:"trd";a:0:{}s:3:"tur";a:0:{}s:2:"tv";a:0:{}s:3:"udi";a:0:{}s:3:"vet";a:0:{}s:3:"vix";a:0:{}s:4:"vlog";a:0:{}s:4:"wiki";a:0:{}s:3:"zlg";a:0:{}}s:2:"bs";a:6:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:2:"we";a:0:{}}s:2:"bt";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"bv";a:0:{}s:2:"bw";a:2:{s:2:"co";a:0:{}s:3:"org";a:0:{}}s:2:"by";a:5:{s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:2:"of";a:0:{}s:3:"nym";a:0:{}}s:2:"bz";a:7:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:2:"za";a:0:{}s:3:"nym";a:0:{}}s:2:"ca";a:19:{s:2:"ab";a:0:{}s:2:"bc";a:0:{}s:2:"mb";a:0:{}s:2:"nb";a:0:{}s:2:"nf";a:0:{}s:2:"nl";a:0:{}s:2:"ns";a:0:{}s:2:"nt";a:0:{}s:2:"nu";a:0:{}s:2:"on";a:0:{}s:2:"pe";a:0:{}s:2:"qc";a:0:{}s:2:"sk";a:0:{}s:2:"yk";a:0:{}s:2:"gc";a:0:{}s:5:"awdev";a:1:{s:1:"*";a:0:{}}s:2:"co";a:0:{}s:8:"blogspot";a:0:{}s:5:"no-ip";a:0:{}}s:3:"cat";a:0:{}s:2:"cc";a:7:{s:7:"cloudns";a:0:{}s:9:"ftpaccess";a:0:{}s:11:"game-server";a:0:{}s:8:"myphotos";a:0:{}s:9:"scrapping";a:0:{}s:6:"twmail";a:0:{}s:13:"fantasyleague";a:0:{}}s:2:"cd";a:1:{s:3:"gov";a:0:{}}s:2:"cf";a:1:{s:8:"blogspot";a:0:{}}s:2:"cg";a:0:{}s:2:"ch";a:7:{s:7:"square7";a:0:{}s:8:"blogspot";a:0:{}s:6:"gotdns";a:0:{}s:4:"12hp";a:0:{}s:3:"2ix";a:0:{}s:5:"4lima";a:0:{}s:9:"lima-city";a:0:{}}s:2:"ci";a:15:{s:3:"org";a:0:{}s:2:"or";a:0:{}s:3:"com";a:0:{}s:2:"co";a:0:{}s:3:"edu";a:0:{}s:2:"ed";a:0:{}s:2:"ac";a:0:{}s:3:"net";a:0:{}s:2:"go";a:0:{}s:4:"asso";a:0:{}s:15:"xn--aroport-bya";a:0:{}s:3:"int";a:0:{}s:6:"presse";a:0:{}s:2:"md";a:0:{}s:4:"gouv";a:0:{}}s:2:"ck";a:2:{s:1:"*";a:0:{}s:3:"www";a:1:{s:1:"!";s:0:"";}}s:2:"cl";a:6:{s:3:"gov";a:0:{}s:3:"gob";a:0:{}s:2:"co";a:0:{}s:3:"mil";a:0:{}s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"cm";a:4:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}}s:2:"cn";a:44:{s:2:"ac";a:0:{}s:3:"com";a:1:{s:9:"amazonaws";a:4:{s:7:"compute";a:1:{s:1:"*";a:0:{}}s:2:"eb";a:1:{s:10:"cn-north-1";a:0:{}}s:3:"elb";a:1:{s:1:"*";a:0:{}}s:10:"cn-north-1";a:1:{s:2:"s3";a:0:{}}}}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"mil";a:0:{}s:10:"xn--55qx5d";a:0:{}s:10:"xn--io0a7i";a:0:{}s:10:"xn--od0alg";a:0:{}s:2:"ah";a:0:{}s:2:"bj";a:0:{}s:2:"cq";a:0:{}s:2:"fj";a:0:{}s:2:"gd";a:0:{}s:2:"gs";a:0:{}s:2:"gz";a:0:{}s:2:"gx";a:0:{}s:2:"ha";a:0:{}s:2:"hb";a:0:{}s:2:"he";a:0:{}s:2:"hi";a:0:{}s:2:"hl";a:0:{}s:2:"hn";a:0:{}s:2:"jl";a:0:{}s:2:"js";a:0:{}s:2:"jx";a:0:{}s:2:"ln";a:0:{}s:2:"nm";a:0:{}s:2:"nx";a:0:{}s:2:"qh";a:0:{}s:2:"sc";a:0:{}s:2:"sd";a:0:{}s:2:"sh";a:0:{}s:2:"sn";a:0:{}s:2:"sx";a:0:{}s:2:"tj";a:0:{}s:2:"xj";a:0:{}s:2:"xz";a:0:{}s:2:"yn";a:0:{}s:2:"zj";a:0:{}s:2:"hk";a:0:{}s:2:"mo";a:0:{}s:2:"tw";a:0:{}}s:2:"co";a:14:{s:4:"arts";a:0:{}s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"edu";a:0:{}s:4:"firm";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"nom";a:0:{}s:3:"org";a:0:{}s:3:"rec";a:0:{}s:3:"web";a:0:{}s:5:"nodum";a:0:{}}s:3:"com";a:290:{s:9:"amazonaws";a:40:{s:7:"compute";a:1:{s:1:"*";a:0:{}}s:9:"compute-1";a:1:{s:1:"*";a:0:{}}s:9:"us-east-1";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:3:"elb";a:1:{s:1:"*";a:0:{}}s:2:"s3";a:0:{}s:17:"s3-ap-northeast-1";a:0:{}s:17:"s3-ap-northeast-2";a:0:{}s:13:"s3-ap-south-1";a:0:{}s:17:"s3-ap-southeast-1";a:0:{}s:17:"s3-ap-southeast-2";a:0:{}s:15:"s3-ca-central-1";a:0:{}s:15:"s3-eu-central-1";a:0:{}s:12:"s3-eu-west-1";a:0:{}s:12:"s3-eu-west-2";a:0:{}s:13:"s3-external-1";a:0:{}s:21:"s3-fips-us-gov-west-1";a:0:{}s:12:"s3-sa-east-1";a:0:{}s:16:"s3-us-gov-west-1";a:0:{}s:12:"s3-us-east-2";a:0:{}s:12:"s3-us-west-1";a:0:{}s:12:"s3-us-west-2";a:0:{}s:14:"ap-northeast-2";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:10:"ap-south-1";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:12:"ca-central-1";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:12:"eu-central-1";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:9:"eu-west-2";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:9:"us-east-2";a:3:{s:2:"s3";a:0:{}s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}s:10:"s3-website";a:0:{}}s:14:"ap-northeast-1";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:14:"ap-southeast-1";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:14:"ap-southeast-2";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:9:"eu-west-1";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:9:"sa-east-1";a:1:{s:9:"dualstack";a:1:{s:2:"s3";a:0:{}}}s:20:"s3-website-us-east-1";a:0:{}s:20:"s3-website-us-west-1";a:0:{}s:20:"s3-website-us-west-2";a:0:{}s:25:"s3-website-ap-northeast-1";a:0:{}s:25:"s3-website-ap-southeast-1";a:0:{}s:25:"s3-website-ap-southeast-2";a:0:{}s:20:"s3-website-eu-west-1";a:0:{}s:20:"s3-website-sa-east-1";a:0:{}}s:16:"elasticbeanstalk";a:15:{s:14:"ap-northeast-1";a:0:{}s:14:"ap-northeast-2";a:0:{}s:10:"ap-south-1";a:0:{}s:14:"ap-southeast-1";a:0:{}s:14:"ap-southeast-2";a:0:{}s:12:"ca-central-1";a:0:{}s:12:"eu-central-1";a:0:{}s:9:"eu-west-1";a:0:{}s:9:"eu-west-2";a:0:{}s:9:"sa-east-1";a:0:{}s:9:"us-east-1";a:0:{}s:9:"us-east-2";a:0:{}s:13:"us-gov-west-1";a:0:{}s:9:"us-west-1";a:0:{}s:9:"us-west-2";a:0:{}}s:10:"on-aptible";a:0:{}s:9:"myasustor";a:0:{}s:10:"betainabox";a:0:{}s:7:"bplaced";a:0:{}s:2:"ar";a:0:{}s:2:"br";a:0:{}s:2:"cn";a:0:{}s:2:"de";a:0:{}s:2:"eu";a:0:{}s:2:"gb";a:0:{}s:2:"hu";a:0:{}s:3:"jpn";a:0:{}s:2:"kr";a:0:{}s:3:"mex";a:0:{}s:2:"no";a:0:{}s:2:"qc";a:0:{}s:2:"ru";a:0:{}s:2:"sa";a:0:{}s:2:"se";a:0:{}s:2:"uk";a:0:{}s:2:"us";a:0:{}s:2:"uy";a:0:{}s:2:"za";a:0:{}s:6:"africa";a:0:{}s:2:"gr";a:0:{}s:2:"co";a:0:{}s:13:"xenapponazure";a:0:{}s:9:"jdevcloud";a:0:{}s:10:"wpdevcloud";a:0:{}s:15:"cloudcontrolled";a:0:{}s:15:"cloudcontrolapp";a:0:{}s:8:"drayddns";a:0:{}s:12:"dreamhosters";a:0:{}s:7:"mydrobo";a:0:{}s:14:"dyndns-at-home";a:0:{}s:14:"dyndns-at-work";a:0:{}s:11:"dyndns-blog";a:0:{}s:11:"dyndns-free";a:0:{}s:11:"dyndns-home";a:0:{}s:9:"dyndns-ip";a:0:{}s:11:"dyndns-mail";a:0:{}s:13:"dyndns-office";a:0:{}s:11:"dyndns-pics";a:0:{}s:13:"dyndns-remote";a:0:{}s:13:"dyndns-server";a:0:{}s:10:"dyndns-web";a:0:{}s:11:"dyndns-wiki";a:0:{}s:11:"dyndns-work";a:0:{}s:7:"blogdns";a:0:{}s:7:"cechire";a:0:{}s:8:"dnsalias";a:0:{}s:7:"dnsdojo";a:0:{}s:11:"doesntexist";a:0:{}s:9:"dontexist";a:0:{}s:7:"doomdns";a:0:{}s:10:"dyn-o-saur";a:0:{}s:8:"dynalias";a:0:{}s:15:"est-a-la-maison";a:0:{}s:15:"est-a-la-masion";a:0:{}s:13:"est-le-patron";a:0:{}s:16:"est-mon-blogueur";a:0:{}s:7:"from-ak";a:0:{}s:7:"from-al";a:0:{}s:7:"from-ar";a:0:{}s:7:"from-ca";a:0:{}s:7:"from-ct";a:0:{}s:7:"from-dc";a:0:{}s:7:"from-de";a:0:{}s:7:"from-fl";a:0:{}s:7:"from-ga";a:0:{}s:7:"from-hi";a:0:{}s:7:"from-ia";a:0:{}s:7:"from-id";a:0:{}s:7:"from-il";a:0:{}s:7:"from-in";a:0:{}s:7:"from-ks";a:0:{}s:7:"from-ky";a:0:{}s:7:"from-ma";a:0:{}s:7:"from-md";a:0:{}s:7:"from-mi";a:0:{}s:7:"from-mn";a:0:{}s:7:"from-mo";a:0:{}s:7:"from-ms";a:0:{}s:7:"from-mt";a:0:{}s:7:"from-nc";a:0:{}s:7:"from-nd";a:0:{}s:7:"from-ne";a:0:{}s:7:"from-nh";a:0:{}s:7:"from-nj";a:0:{}s:7:"from-nm";a:0:{}s:7:"from-nv";a:0:{}s:7:"from-oh";a:0:{}s:7:"from-ok";a:0:{}s:7:"from-or";a:0:{}s:7:"from-pa";a:0:{}s:7:"from-pr";a:0:{}s:7:"from-ri";a:0:{}s:7:"from-sc";a:0:{}s:7:"from-sd";a:0:{}s:7:"from-tn";a:0:{}s:7:"from-tx";a:0:{}s:7:"from-ut";a:0:{}s:7:"from-va";a:0:{}s:7:"from-vt";a:0:{}s:7:"from-wa";a:0:{}s:7:"from-wi";a:0:{}s:7:"from-wv";a:0:{}s:7:"from-wy";a:0:{}s:7:"getmyip";a:0:{}s:6:"gotdns";a:0:{}s:10:"hobby-site";a:0:{}s:9:"homelinux";a:0:{}s:8:"homeunix";a:0:{}s:9:"iamallama";a:0:{}s:14:"is-a-anarchist";a:0:{}s:12:"is-a-blogger";a:0:{}s:15:"is-a-bookkeeper";a:0:{}s:14:"is-a-bulls-fan";a:0:{}s:12:"is-a-caterer";a:0:{}s:9:"is-a-chef";a:0:{}s:17:"is-a-conservative";a:0:{}s:8:"is-a-cpa";a:0:{}s:18:"is-a-cubicle-slave";a:0:{}s:13:"is-a-democrat";a:0:{}s:13:"is-a-designer";a:0:{}s:11:"is-a-doctor";a:0:{}s:21:"is-a-financialadvisor";a:0:{}s:9:"is-a-geek";a:0:{}s:10:"is-a-green";a:0:{}s:9:"is-a-guru";a:0:{}s:16:"is-a-hard-worker";a:0:{}s:11:"is-a-hunter";a:0:{}s:15:"is-a-landscaper";a:0:{}s:11:"is-a-lawyer";a:0:{}s:12:"is-a-liberal";a:0:{}s:16:"is-a-libertarian";a:0:{}s:10:"is-a-llama";a:0:{}s:13:"is-a-musician";a:0:{}s:14:"is-a-nascarfan";a:0:{}s:10:"is-a-nurse";a:0:{}s:12:"is-a-painter";a:0:{}s:20:"is-a-personaltrainer";a:0:{}s:17:"is-a-photographer";a:0:{}s:11:"is-a-player";a:0:{}s:15:"is-a-republican";a:0:{}s:13:"is-a-rockstar";a:0:{}s:14:"is-a-socialist";a:0:{}s:12:"is-a-student";a:0:{}s:12:"is-a-teacher";a:0:{}s:11:"is-a-techie";a:0:{}s:14:"is-a-therapist";a:0:{}s:16:"is-an-accountant";a:0:{}s:11:"is-an-actor";a:0:{}s:13:"is-an-actress";a:0:{}s:15:"is-an-anarchist";a:0:{}s:12:"is-an-artist";a:0:{}s:14:"is-an-engineer";a:0:{}s:17:"is-an-entertainer";a:0:{}s:12:"is-certified";a:0:{}s:7:"is-gone";a:0:{}s:13:"is-into-anime";a:0:{}s:12:"is-into-cars";a:0:{}s:16:"is-into-cartoons";a:0:{}s:13:"is-into-games";a:0:{}s:7:"is-leet";a:0:{}s:16:"is-not-certified";a:0:{}s:8:"is-slick";a:0:{}s:11:"is-uberleet";a:0:{}s:15:"is-with-theband";a:0:{}s:8:"isa-geek";a:0:{}s:13:"isa-hockeynut";a:0:{}s:16:"issmarterthanyou";a:0:{}s:9:"likes-pie";a:0:{}s:10:"likescandy";a:0:{}s:8:"neat-url";a:0:{}s:16:"saves-the-whales";a:0:{}s:6:"selfip";a:0:{}s:14:"sells-for-less";a:0:{}s:11:"sells-for-u";a:0:{}s:8:"servebbs";a:0:{}s:10:"simple-url";a:0:{}s:13:"space-to-rent";a:0:{}s:12:"teaches-yoga";a:0:{}s:14:"writesthisblog";a:0:{}s:8:"ddnsfree";a:0:{}s:8:"ddnsgeek";a:0:{}s:5:"giize";a:0:{}s:6:"gleeze";a:0:{}s:5:"kozow";a:0:{}s:10:"loseyourip";a:0:{}s:5:"ooguy";a:0:{}s:9:"theworkpc";a:0:{}s:8:"mytuleap";a:0:{}s:8:"evennode";a:8:{s:4:"eu-1";a:0:{}s:4:"eu-2";a:0:{}s:4:"eu-3";a:0:{}s:4:"eu-4";a:0:{}s:4:"us-1";a:0:{}s:4:"us-2";a:0:{}s:4:"us-3";a:0:{}s:4:"us-4";a:0:{}}s:5:"fbsbx";a:1:{s:4:"apps";a:0:{}}s:11:"firebaseapp";a:0:{}s:8:"flynnhub";a:0:{}s:10:"freebox-os";a:0:{}s:9:"freeboxos";a:0:{}s:17:"githubusercontent";a:0:{}s:4:"0emm";a:1:{s:1:"*";a:0:{}}s:7:"appspot";a:0:{}s:8:"blogspot";a:0:{}s:8:"codespot";a:0:{}s:10:"googleapis";a:0:{}s:10:"googlecode";a:0:{}s:18:"pagespeedmobilizer";a:0:{}s:12:"publishproxy";a:0:{}s:10:"withgoogle";a:0:{}s:11:"withyoutube";a:0:{}s:9:"herokuapp";a:0:{}s:9:"herokussl";a:0:{}s:8:"pixolino";a:0:{}s:6:"joyent";a:1:{s:3:"cns";a:1:{s:1:"*";a:0:{}}}s:11:"barsyonline";a:0:{}s:9:"meteorapp";a:1:{s:2:"eu";a:0:{}}s:10:"bitballoon";a:0:{}s:7:"netlify";a:0:{}s:2:"4u";a:0:{}s:7:"nfshost";a:0:{}s:8:"blogsyte";a:0:{}s:10:"ciscofreak";a:0:{}s:10:"damnserver";a:0:{}s:11:"ditchyourip";a:0:{}s:10:"dnsiskinky";a:0:{}s:5:"dynns";a:0:{}s:10:"geekgalaxy";a:0:{}s:17:"health-carereform";a:0:{}s:15:"homesecuritymac";a:0:{}s:14:"homesecuritypc";a:0:{}s:17:"myactivedirectory";a:0:{}s:16:"mysecuritycamera";a:0:{}s:10:"net-freaks";a:0:{}s:9:"onthewifi";a:0:{}s:10:"point2this";a:0:{}s:10:"quicksytes";a:0:{}s:15:"securitytactics";a:0:{}s:13:"serveexchange";a:0:{}s:11:"servehumour";a:0:{}s:8:"servep2p";a:0:{}s:12:"servesarcasm";a:0:{}s:11:"stufftoread";a:0:{}s:13:"unusualperson";a:0:{}s:12:"workisboring";a:0:{}s:10:"3utilities";a:0:{}s:8:"ddnsking";a:0:{}s:5:"myvnc";a:0:{}s:9:"servebeer";a:0:{}s:18:"servecounterstrike";a:0:{}s:8:"serveftp";a:0:{}s:9:"servegame";a:0:{}s:13:"servehalflife";a:0:{}s:9:"servehttp";a:0:{}s:8:"serveirc";a:0:{}s:8:"servemp3";a:0:{}s:9:"servepics";a:0:{}s:10:"servequake";a:0:{}s:10:"operaunite";a:0:{}s:15:"outsystemscloud";a:0:{}s:11:"ownprovider";a:0:{}s:5:"pgfog";a:0:{}s:12:"pagefrontapp";a:0:{}s:11:"gotpantheon";a:0:{}s:5:"prgmr";a:1:{s:3:"xen";a:0:{}}s:3:"qa2";a:0:{}s:15:"dev-myqnapcloud";a:0:{}s:17:"alpha-myqnapcloud";a:0:{}s:11:"myqnapcloud";a:0:{}s:12:"quipelements";a:1:{s:1:"*";a:0:{}}s:8:"rackmaze";a:0:{}s:7:"rhcloud";a:0:{}s:6:"logoip";a:0:{}s:16:"firewall-gateway";a:0:{}s:12:"myshopblocks";a:0:{}s:5:"1kapp";a:0:{}s:8:"appchizi";a:0:{}s:8:"applinzi";a:0:{}s:7:"sinaapp";a:0:{}s:10:"vipsinaapp";a:0:{}s:11:"bounty-full";a:2:{s:5:"alpha";a:0:{}s:4:"beta";a:0:{}}s:8:"temp-dns";a:0:{}s:7:"dsmynas";a:0:{}s:8:"familyds";a:0:{}s:7:"bloxcms";a:0:{}s:16:"townnews-staging";a:0:{}s:2:"hk";a:0:{}s:8:"remotewd";a:0:{}s:8:"yolasite";a:0:{}}s:4:"coop";a:0:{}s:2:"cr";a:7:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"ed";a:0:{}s:2:"fi";a:0:{}s:2:"go";a:0:{}s:2:"or";a:0:{}s:2:"sa";a:0:{}}s:2:"cu";a:6:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"inf";a:0:{}}s:2:"cv";a:1:{s:8:"blogspot";a:0:{}}s:2:"cw";a:4:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"cx";a:3:{s:3:"gov";a:0:{}s:3:"ath";a:0:{}s:4:"info";a:0:{}}s:2:"cy";a:13:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:7:"ekloges";a:0:{}s:3:"gov";a:0:{}s:3:"ltd";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:10:"parliament";a:0:{}s:5:"press";a:0:{}s:3:"pro";a:0:{}s:2:"tm";a:0:{}}s:2:"cz";a:5:{s:2:"co";a:0:{}s:5:"realm";a:0:{}s:2:"e4";a:0:{}s:8:"blogspot";a:0:{}s:11:"metacentrum";a:2:{s:5:"cloud";a:0:{}s:6:"custom";a:0:{}}}s:2:"de";a:48:{s:7:"bplaced";a:0:{}s:7:"square7";a:0:{}s:3:"com";a:0:{}s:7:"cosidns";a:1:{s:3:"dyn";a:0:{}}s:15:"dynamisches-dns";a:0:{}s:10:"dnsupdater";a:0:{}s:12:"internet-dns";a:0:{}s:9:"l-o-g-i-n";a:0:{}s:7:"dnshome";a:0:{}s:15:"fuettertdasnetz";a:0:{}s:10:"isteingeek";a:0:{}s:7:"istmein";a:0:{}s:10:"lebtimnetz";a:0:{}s:10:"leitungsen";a:0:{}s:13:"traeumtgerade";a:0:{}s:5:"ddnss";a:2:{s:3:"dyn";a:0:{}s:6:"dyndns";a:0:{}}s:7:"dyndns1";a:0:{}s:8:"dyn-ip24";a:0:{}s:14:"home-webserver";a:1:{s:3:"dyn";a:0:{}}s:13:"myhome-server";a:0:{}s:4:"goip";a:0:{}s:8:"blogspot";a:0:{}s:10:"keymachine";a:0:{}s:9:"git-repos";a:0:{}s:12:"lcube-server";a:0:{}s:9:"svn-repos";a:0:{}s:5:"barsy";a:0:{}s:6:"logoip";a:0:{}s:16:"firewall-gateway";a:0:{}s:10:"my-gateway";a:0:{}s:9:"my-router";a:0:{}s:5:"spdns";a:0:{}s:10:"taifun-dns";a:0:{}s:4:"12hp";a:0:{}s:3:"2ix";a:0:{}s:5:"4lima";a:0:{}s:9:"lima-city";a:0:{}s:6:"dd-dns";a:0:{}s:8:"dray-dns";a:0:{}s:7:"draydns";a:0:{}s:7:"dyn-vpn";a:0:{}s:6:"dynvpn";a:0:{}s:10:"mein-vigor";a:0:{}s:8:"my-vigor";a:0:{}s:6:"my-wan";a:0:{}s:7:"syno-ds";a:0:{}s:20:"synology-diskstation";a:0:{}s:11:"synology-ds";a:0:{}}s:2:"dj";a:0:{}s:2:"dk";a:6:{s:3:"biz";a:0:{}s:2:"co";a:0:{}s:4:"firm";a:0:{}s:3:"reg";a:0:{}s:5:"store";a:0:{}s:8:"blogspot";a:0:{}}s:2:"dm";a:5:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}}s:2:"do";a:10:{s:3:"art";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sld";a:0:{}s:3:"web";a:0:{}}s:2:"dz";a:8:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:4:"asso";a:0:{}s:3:"pol";a:0:{}s:3:"art";a:0:{}}s:2:"ec";a:12:{s:3:"com";a:0:{}s:4:"info";a:0:{}s:3:"net";a:0:{}s:3:"fin";a:0:{}s:3:"k12";a:0:{}s:3:"med";a:0:{}s:3:"pro";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"gob";a:0:{}s:3:"mil";a:0:{}}s:3:"edu";a:0:{}s:2:"ee";a:10:{s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:4:"riik";a:0:{}s:3:"lib";a:0:{}s:3:"med";a:0:{}s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"pri";a:0:{}s:3:"aip";a:0:{}s:3:"org";a:0:{}s:3:"fie";a:0:{}}s:2:"eg";a:9:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"edu";a:0:{}s:3:"eun";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sci";a:0:{}}s:2:"er";a:1:{s:1:"*";a:0:{}}s:2:"es";a:5:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"nom";a:0:{}s:3:"org";a:0:{}s:3:"gob";a:0:{}s:3:"edu";a:0:{}}s:2:"et";a:8:{s:3:"com";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"biz";a:0:{}s:4:"name";a:0:{}s:4:"info";a:0:{}s:3:"net";a:0:{}}s:2:"eu";a:7:{s:4:"mycd";a:0:{}s:7:"cloudns";a:0:{}s:5:"barsy";a:0:{}s:13:"wellbeingzone";a:0:{}s:5:"spdns";a:0:{}s:8:"transurl";a:1:{s:1:"*";a:0:{}}s:11:"diskstation";a:0:{}}s:2:"fi";a:4:{s:5:"aland";a:0:{}s:2:"dy";a:0:{}s:8:"blogspot";a:0:{}s:3:"iki";a:0:{}}s:2:"fj";a:1:{s:1:"*";a:0:{}}s:2:"fk";a:1:{s:1:"*";a:0:{}}s:2:"fm";a:0:{}s:2:"fo";a:0:{}s:2:"fr";a:30:{s:3:"com";a:0:{}s:4:"asso";a:0:{}s:3:"nom";a:0:{}s:3:"prd";a:0:{}s:6:"presse";a:0:{}s:2:"tm";a:0:{}s:8:"aeroport";a:0:{}s:7:"assedic";a:0:{}s:6:"avocat";a:0:{}s:6:"avoues";a:0:{}s:3:"cci";a:0:{}s:9:"chambagri";a:0:{}s:21:"chirurgiens-dentistes";a:0:{}s:18:"experts-comptables";a:0:{}s:15:"geometre-expert";a:0:{}s:4:"gouv";a:0:{}s:5:"greta";a:0:{}s:16:"huissier-justice";a:0:{}s:7:"medecin";a:0:{}s:8:"notaires";a:0:{}s:10:"pharmacien";a:0:{}s:4:"port";a:0:{}s:11:"veterinaire";a:0:{}s:6:"fbx-os";a:0:{}s:5:"fbxos";a:0:{}s:10:"freebox-os";a:0:{}s:9:"freeboxos";a:0:{}s:8:"blogspot";a:0:{}s:6:"on-web";a:0:{}s:31:"chirurgiens-dentistes-en-france";a:0:{}}s:2:"ga";a:0:{}s:2:"gb";a:0:{}s:2:"gd";a:1:{s:3:"nom";a:0:{}}s:2:"ge";a:7:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"pvt";a:0:{}}s:2:"gf";a:0:{}s:2:"gg";a:4:{s:2:"co";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"cya";a:0:{}}s:2:"gh";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"mil";a:0:{}}s:2:"gi";a:6:{s:3:"com";a:0:{}s:3:"ltd";a:0:{}s:3:"gov";a:0:{}s:3:"mod";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}}s:2:"gl";a:6:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"nom";a:0:{}}s:2:"gm";a:0:{}s:2:"gn";a:6:{s:2:"ac";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}}s:3:"gov";a:0:{}s:2:"gp";a:6:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:4:"mobi";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:4:"asso";a:0:{}}s:2:"gq";a:0:{}s:2:"gr";a:7:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"gs";a:0:{}s:2:"gt";a:8:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:3:"ind";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"nom";a:0:{}}s:2:"gu";a:1:{s:1:"*";a:0:{}}s:2:"gw";a:0:{}s:2:"gy";a:6:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"hk";a:24:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"idv";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:10:"xn--55qx5d";a:0:{}s:11:"xn--wcvs22d";a:0:{}s:11:"xn--lcvr32d";a:0:{}s:10:"xn--mxtq1m";a:0:{}s:10:"xn--gmqw5a";a:0:{}s:9:"xn--ciqpn";a:0:{}s:11:"xn--gmq050i";a:0:{}s:10:"xn--zf0avx";a:0:{}s:10:"xn--io0a7i";a:0:{}s:10:"xn--mk0axi";a:0:{}s:10:"xn--od0alg";a:0:{}s:11:"xn--od0aq3b";a:0:{}s:9:"xn--tn0ag";a:0:{}s:10:"xn--uc0atv";a:0:{}s:11:"xn--uc0ay4a";a:0:{}s:8:"blogspot";a:0:{}s:3:"ltd";a:0:{}s:3:"inc";a:0:{}}s:2:"hm";a:0:{}s:2:"hn";a:7:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"mil";a:0:{}s:3:"gob";a:0:{}s:3:"nom";a:0:{}}s:2:"hr";a:5:{s:2:"iz";a:0:{}s:4:"from";a:0:{}s:4:"name";a:0:{}s:3:"com";a:0:{}s:8:"blogspot";a:0:{}}s:2:"ht";a:17:{s:3:"com";a:0:{}s:4:"shop";a:0:{}s:4:"firm";a:0:{}s:4:"info";a:0:{}s:5:"adult";a:0:{}s:3:"net";a:0:{}s:3:"pro";a:0:{}s:3:"org";a:0:{}s:3:"med";a:0:{}s:3:"art";a:0:{}s:4:"coop";a:0:{}s:3:"pol";a:0:{}s:4:"asso";a:0:{}s:3:"edu";a:0:{}s:3:"rel";a:0:{}s:4:"gouv";a:0:{}s:5:"perso";a:0:{}}s:2:"hu";a:32:{s:2:"co";a:0:{}s:4:"info";a:0:{}s:3:"org";a:0:{}s:4:"priv";a:0:{}s:5:"sport";a:0:{}s:2:"tm";a:0:{}i:2000;a:0:{}s:5:"agrar";a:0:{}s:4:"bolt";a:0:{}s:6:"casino";a:0:{}s:4:"city";a:0:{}s:7:"erotica";a:0:{}s:7:"erotika";a:0:{}s:4:"film";a:0:{}s:5:"forum";a:0:{}s:5:"games";a:0:{}s:5:"hotel";a:0:{}s:8:"ingatlan";a:0:{}s:6:"jogasz";a:0:{}s:8:"konyvelo";a:0:{}s:5:"lakas";a:0:{}s:5:"media";a:0:{}s:4:"news";a:0:{}s:6:"reklam";a:0:{}s:3:"sex";a:0:{}s:4:"shop";a:0:{}s:4:"suli";a:0:{}s:4:"szex";a:0:{}s:6:"tozsde";a:0:{}s:6:"utazas";a:0:{}s:5:"video";a:0:{}s:8:"blogspot";a:0:{}}s:2:"id";a:11:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:1:{s:8:"blogspot";a:0:{}}s:4:"desa";a:0:{}s:2:"go";a:0:{}s:3:"mil";a:0:{}s:2:"my";a:0:{}s:3:"net";a:0:{}s:2:"or";a:0:{}s:3:"sch";a:0:{}s:3:"web";a:0:{}}s:2:"ie";a:2:{s:3:"gov";a:0:{}s:8:"blogspot";a:0:{}}s:2:"il";a:8:{s:2:"ac";a:0:{}s:2:"co";a:1:{s:8:"blogspot";a:0:{}}s:3:"gov";a:0:{}s:3:"idf";a:0:{}s:3:"k12";a:0:{}s:4:"muni";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"im";a:9:{s:2:"ac";a:0:{}s:2:"co";a:2:{s:3:"ltd";a:0:{}s:3:"plc";a:0:{}}s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:2:"tt";a:0:{}s:2:"tv";a:0:{}s:2:"ro";a:0:{}s:3:"nom";a:0:{}}s:2:"in";a:15:{s:2:"co";a:0:{}s:4:"firm";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gen";a:0:{}s:3:"ind";a:0:{}s:3:"nic";a:0:{}s:2:"ac";a:0:{}s:3:"edu";a:0:{}s:3:"res";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:7:"cloudns";a:0:{}s:8:"blogspot";a:0:{}s:5:"barsy";a:0:{}}s:4:"info";a:17:{s:7:"cloudns";a:0:{}s:11:"dynamic-dns";a:0:{}s:6:"dyndns";a:0:{}s:19:"barrel-of-knowledge";a:0:{}s:20:"barrell-of-knowledge";a:0:{}s:7:"for-our";a:0:{}s:9:"groks-the";a:0:{}s:10:"groks-this";a:0:{}s:13:"here-for-more";a:0:{}s:10:"knowsitall";a:0:{}s:6:"selfip";a:0:{}s:6:"webhop";a:0:{}s:8:"nsupdate";a:0:{}s:6:"dvrcam";a:0:{}s:12:"ilovecollege";a:0:{}s:5:"no-ip";a:0:{}s:6:"v-info";a:0:{}}s:3:"int";a:1:{s:2:"eu";a:0:{}}s:2:"io";a:26:{s:3:"com";a:0:{}s:12:"backplaneapp";a:0:{}s:7:"boxfuse";a:0:{}s:17:"browsersafetymark";a:0:{}s:5:"dedyn";a:0:{}s:4:"drud";a:0:{}s:8:"definima";a:0:{}s:6:"enonic";a:1:{s:8:"customer";a:0:{}}s:6:"github";a:0:{}s:6:"gitlab";a:0:{}s:10:"hasura-app";a:0:{}s:5:"ngrok";a:0:{}s:7:"nodeart";a:1:{s:5:"stage";a:0:{}}s:5:"nodum";a:0:{}s:3:"nid";a:0:{}s:12:"pantheonsite";a:0:{}s:8:"protonet";a:0:{}s:10:"vaporcloud";a:0:{}s:3:"hzc";a:0:{}s:8:"sandcats";a:0:{}s:9:"shiftedit";a:0:{}s:4:"lair";a:1:{s:4:"apps";a:0:{}}s:6:"stolos";a:1:{s:1:"*";a:0:{}}s:8:"spacekit";a:0:{}s:9:"thingdust";a:4:{s:3:"dev";a:1:{s:4:"cust";a:0:{}}s:6:"disrec";a:1:{s:4:"cust";a:0:{}}s:4:"prod";a:1:{s:4:"cust";a:0:{}}s:7:"testing";a:1:{s:4:"cust";a:0:{}}}s:8:"wedeploy";a:0:{}}s:2:"iq";a:6:{s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}}s:2:"ir";a:9:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:3:"gov";a:0:{}s:2:"id";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sch";a:0:{}s:15:"xn--mgba3a4f16a";a:0:{}s:14:"xn--mgba3a4fra";a:0:{}}s:2:"is";a:8:{s:3:"net";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"int";a:0:{}s:7:"cupcake";a:0:{}s:8:"blogspot";a:0:{}}s:2:"it";a:369:{s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"abr";a:0:{}s:7:"abruzzo";a:0:{}s:12:"aosta-valley";a:0:{}s:11:"aostavalley";a:0:{}s:3:"bas";a:0:{}s:10:"basilicata";a:0:{}s:3:"cal";a:0:{}s:8:"calabria";a:0:{}s:3:"cam";a:0:{}s:8:"campania";a:0:{}s:14:"emilia-romagna";a:0:{}s:13:"emiliaromagna";a:0:{}s:3:"emr";a:0:{}s:15:"friuli-v-giulia";a:0:{}s:16:"friuli-ve-giulia";a:0:{}s:15:"friuli-vegiulia";a:0:{}s:21:"friuli-venezia-giulia";a:0:{}s:20:"friuli-veneziagiulia";a:0:{}s:14:"friuli-vgiulia";a:0:{}s:14:"friuliv-giulia";a:0:{}s:15:"friulive-giulia";a:0:{}s:14:"friulivegiulia";a:0:{}s:20:"friulivenezia-giulia";a:0:{}s:19:"friuliveneziagiulia";a:0:{}s:13:"friulivgiulia";a:0:{}s:3:"fvg";a:0:{}s:3:"laz";a:0:{}s:5:"lazio";a:0:{}s:3:"lig";a:0:{}s:7:"liguria";a:0:{}s:3:"lom";a:0:{}s:9:"lombardia";a:0:{}s:8:"lombardy";a:0:{}s:7:"lucania";a:0:{}s:3:"mar";a:0:{}s:6:"marche";a:0:{}s:3:"mol";a:0:{}s:6:"molise";a:0:{}s:8:"piedmont";a:0:{}s:8:"piemonte";a:0:{}s:3:"pmn";a:0:{}s:3:"pug";a:0:{}s:6:"puglia";a:0:{}s:3:"sar";a:0:{}s:8:"sardegna";a:0:{}s:8:"sardinia";a:0:{}s:3:"sic";a:0:{}s:7:"sicilia";a:0:{}s:6:"sicily";a:0:{}s:3:"taa";a:0:{}s:3:"tos";a:0:{}s:7:"toscana";a:0:{}s:16:"trentino-a-adige";a:0:{}s:15:"trentino-aadige";a:0:{}s:19:"trentino-alto-adige";a:0:{}s:18:"trentino-altoadige";a:0:{}s:16:"trentino-s-tirol";a:0:{}s:15:"trentino-stirol";a:0:{}s:18:"trentino-sud-tirol";a:0:{}s:17:"trentino-sudtirol";a:0:{}s:19:"trentino-sued-tirol";a:0:{}s:18:"trentino-suedtirol";a:0:{}s:15:"trentinoa-adige";a:0:{}s:14:"trentinoaadige";a:0:{}s:18:"trentinoalto-adige";a:0:{}s:17:"trentinoaltoadige";a:0:{}s:15:"trentinos-tirol";a:0:{}s:14:"trentinostirol";a:0:{}s:17:"trentinosud-tirol";a:0:{}s:16:"trentinosudtirol";a:0:{}s:18:"trentinosued-tirol";a:0:{}s:17:"trentinosuedtirol";a:0:{}s:7:"tuscany";a:0:{}s:3:"umb";a:0:{}s:6:"umbria";a:0:{}s:11:"val-d-aosta";a:0:{}s:10:"val-daosta";a:0:{}s:10:"vald-aosta";a:0:{}s:9:"valdaosta";a:0:{}s:11:"valle-aosta";a:0:{}s:13:"valle-d-aosta";a:0:{}s:12:"valle-daosta";a:0:{}s:10:"valleaosta";a:0:{}s:12:"valled-aosta";a:0:{}s:11:"valledaosta";a:0:{}s:12:"vallee-aoste";a:0:{}s:11:"valleeaoste";a:0:{}s:3:"vao";a:0:{}s:3:"vda";a:0:{}s:3:"ven";a:0:{}s:6:"veneto";a:0:{}s:2:"ag";a:0:{}s:9:"agrigento";a:0:{}s:2:"al";a:0:{}s:11:"alessandria";a:0:{}s:10:"alto-adige";a:0:{}s:9:"altoadige";a:0:{}s:2:"an";a:0:{}s:6:"ancona";a:0:{}s:21:"andria-barletta-trani";a:0:{}s:21:"andria-trani-barletta";a:0:{}s:19:"andriabarlettatrani";a:0:{}s:19:"andriatranibarletta";a:0:{}s:2:"ao";a:0:{}s:5:"aosta";a:0:{}s:5:"aoste";a:0:{}s:2:"ap";a:0:{}s:2:"aq";a:0:{}s:6:"aquila";a:0:{}s:2:"ar";a:0:{}s:6:"arezzo";a:0:{}s:13:"ascoli-piceno";a:0:{}s:12:"ascolipiceno";a:0:{}s:4:"asti";a:0:{}s:2:"at";a:0:{}s:2:"av";a:0:{}s:8:"avellino";a:0:{}s:2:"ba";a:0:{}s:6:"balsan";a:0:{}s:4:"bari";a:0:{}s:21:"barletta-trani-andria";a:0:{}s:19:"barlettatraniandria";a:0:{}s:7:"belluno";a:0:{}s:9:"benevento";a:0:{}s:7:"bergamo";a:0:{}s:2:"bg";a:0:{}s:2:"bi";a:0:{}s:6:"biella";a:0:{}s:2:"bl";a:0:{}s:2:"bn";a:0:{}s:2:"bo";a:0:{}s:7:"bologna";a:0:{}s:7:"bolzano";a:0:{}s:5:"bozen";a:0:{}s:2:"br";a:0:{}s:7:"brescia";a:0:{}s:8:"brindisi";a:0:{}s:2:"bs";a:0:{}s:2:"bt";a:0:{}s:2:"bz";a:0:{}s:2:"ca";a:0:{}s:8:"cagliari";a:0:{}s:13:"caltanissetta";a:0:{}s:15:"campidano-medio";a:0:{}s:14:"campidanomedio";a:0:{}s:10:"campobasso";a:0:{}s:17:"carbonia-iglesias";a:0:{}s:16:"carboniaiglesias";a:0:{}s:13:"carrara-massa";a:0:{}s:12:"carraramassa";a:0:{}s:7:"caserta";a:0:{}s:7:"catania";a:0:{}s:9:"catanzaro";a:0:{}s:2:"cb";a:0:{}s:2:"ce";a:0:{}s:12:"cesena-forli";a:0:{}s:11:"cesenaforli";a:0:{}s:2:"ch";a:0:{}s:6:"chieti";a:0:{}s:2:"ci";a:0:{}s:2:"cl";a:0:{}s:2:"cn";a:0:{}s:2:"co";a:0:{}s:4:"como";a:0:{}s:7:"cosenza";a:0:{}s:2:"cr";a:0:{}s:7:"cremona";a:0:{}s:7:"crotone";a:0:{}s:2:"cs";a:0:{}s:2:"ct";a:0:{}s:5:"cuneo";a:0:{}s:2:"cz";a:0:{}s:14:"dell-ogliastra";a:0:{}s:13:"dellogliastra";a:0:{}s:2:"en";a:0:{}s:4:"enna";a:0:{}s:2:"fc";a:0:{}s:2:"fe";a:0:{}s:5:"fermo";a:0:{}s:7:"ferrara";a:0:{}s:2:"fg";a:0:{}s:2:"fi";a:0:{}s:7:"firenze";a:0:{}s:8:"florence";a:0:{}s:2:"fm";a:0:{}s:6:"foggia";a:0:{}s:12:"forli-cesena";a:0:{}s:11:"forlicesena";a:0:{}s:2:"fr";a:0:{}s:9:"frosinone";a:0:{}s:2:"ge";a:0:{}s:5:"genoa";a:0:{}s:6:"genova";a:0:{}s:2:"go";a:0:{}s:7:"gorizia";a:0:{}s:2:"gr";a:0:{}s:8:"grosseto";a:0:{}s:17:"iglesias-carbonia";a:0:{}s:16:"iglesiascarbonia";a:0:{}s:2:"im";a:0:{}s:7:"imperia";a:0:{}s:2:"is";a:0:{}s:7:"isernia";a:0:{}s:2:"kr";a:0:{}s:9:"la-spezia";a:0:{}s:7:"laquila";a:0:{}s:8:"laspezia";a:0:{}s:6:"latina";a:0:{}s:2:"lc";a:0:{}s:2:"le";a:0:{}s:5:"lecce";a:0:{}s:5:"lecco";a:0:{}s:2:"li";a:0:{}s:7:"livorno";a:0:{}s:2:"lo";a:0:{}s:4:"lodi";a:0:{}s:2:"lt";a:0:{}s:2:"lu";a:0:{}s:5:"lucca";a:0:{}s:8:"macerata";a:0:{}s:7:"mantova";a:0:{}s:13:"massa-carrara";a:0:{}s:12:"massacarrara";a:0:{}s:6:"matera";a:0:{}s:2:"mb";a:0:{}s:2:"mc";a:0:{}s:2:"me";a:0:{}s:15:"medio-campidano";a:0:{}s:14:"mediocampidano";a:0:{}s:7:"messina";a:0:{}s:2:"mi";a:0:{}s:5:"milan";a:0:{}s:6:"milano";a:0:{}s:2:"mn";a:0:{}s:2:"mo";a:0:{}s:6:"modena";a:0:{}s:13:"monza-brianza";a:0:{}s:21:"monza-e-della-brianza";a:0:{}s:5:"monza";a:0:{}s:12:"monzabrianza";a:0:{}s:13:"monzaebrianza";a:0:{}s:18:"monzaedellabrianza";a:0:{}s:2:"ms";a:0:{}s:2:"mt";a:0:{}s:2:"na";a:0:{}s:6:"naples";a:0:{}s:6:"napoli";a:0:{}s:2:"no";a:0:{}s:6:"novara";a:0:{}s:2:"nu";a:0:{}s:5:"nuoro";a:0:{}s:2:"og";a:0:{}s:9:"ogliastra";a:0:{}s:12:"olbia-tempio";a:0:{}s:11:"olbiatempio";a:0:{}s:2:"or";a:0:{}s:8:"oristano";a:0:{}s:2:"ot";a:0:{}s:2:"pa";a:0:{}s:6:"padova";a:0:{}s:5:"padua";a:0:{}s:7:"palermo";a:0:{}s:5:"parma";a:0:{}s:5:"pavia";a:0:{}s:2:"pc";a:0:{}s:2:"pd";a:0:{}s:2:"pe";a:0:{}s:7:"perugia";a:0:{}s:13:"pesaro-urbino";a:0:{}s:12:"pesarourbino";a:0:{}s:7:"pescara";a:0:{}s:2:"pg";a:0:{}s:2:"pi";a:0:{}s:8:"piacenza";a:0:{}s:4:"pisa";a:0:{}s:7:"pistoia";a:0:{}s:2:"pn";a:0:{}s:2:"po";a:0:{}s:9:"pordenone";a:0:{}s:7:"potenza";a:0:{}s:2:"pr";a:0:{}s:5:"prato";a:0:{}s:2:"pt";a:0:{}s:2:"pu";a:0:{}s:2:"pv";a:0:{}s:2:"pz";a:0:{}s:2:"ra";a:0:{}s:6:"ragusa";a:0:{}s:7:"ravenna";a:0:{}s:2:"rc";a:0:{}s:2:"re";a:0:{}s:15:"reggio-calabria";a:0:{}s:13:"reggio-emilia";a:0:{}s:14:"reggiocalabria";a:0:{}s:12:"reggioemilia";a:0:{}s:2:"rg";a:0:{}s:2:"ri";a:0:{}s:5:"rieti";a:0:{}s:6:"rimini";a:0:{}s:2:"rm";a:0:{}s:2:"rn";a:0:{}s:2:"ro";a:0:{}s:4:"roma";a:0:{}s:4:"rome";a:0:{}s:6:"rovigo";a:0:{}s:2:"sa";a:0:{}s:7:"salerno";a:0:{}s:7:"sassari";a:0:{}s:6:"savona";a:0:{}s:2:"si";a:0:{}s:5:"siena";a:0:{}s:8:"siracusa";a:0:{}s:2:"so";a:0:{}s:7:"sondrio";a:0:{}s:2:"sp";a:0:{}s:2:"sr";a:0:{}s:2:"ss";a:0:{}s:9:"suedtirol";a:0:{}s:2:"sv";a:0:{}s:2:"ta";a:0:{}s:7:"taranto";a:0:{}s:2:"te";a:0:{}s:12:"tempio-olbia";a:0:{}s:11:"tempioolbia";a:0:{}s:6:"teramo";a:0:{}s:5:"terni";a:0:{}s:2:"tn";a:0:{}s:2:"to";a:0:{}s:6:"torino";a:0:{}s:2:"tp";a:0:{}s:2:"tr";a:0:{}s:21:"trani-andria-barletta";a:0:{}s:21:"trani-barletta-andria";a:0:{}s:19:"traniandriabarletta";a:0:{}s:19:"tranibarlettaandria";a:0:{}s:7:"trapani";a:0:{}s:8:"trentino";a:0:{}s:6:"trento";a:0:{}s:7:"treviso";a:0:{}s:7:"trieste";a:0:{}s:2:"ts";a:0:{}s:5:"turin";a:0:{}s:2:"tv";a:0:{}s:2:"ud";a:0:{}s:5:"udine";a:0:{}s:13:"urbino-pesaro";a:0:{}s:12:"urbinopesaro";a:0:{}s:2:"va";a:0:{}s:6:"varese";a:0:{}s:2:"vb";a:0:{}s:2:"vc";a:0:{}s:2:"ve";a:0:{}s:7:"venezia";a:0:{}s:6:"venice";a:0:{}s:8:"verbania";a:0:{}s:8:"vercelli";a:0:{}s:6:"verona";a:0:{}s:2:"vi";a:0:{}s:13:"vibo-valentia";a:0:{}s:12:"vibovalentia";a:0:{}s:7:"vicenza";a:0:{}s:7:"viterbo";a:0:{}s:2:"vr";a:0:{}s:2:"vs";a:0:{}s:2:"vt";a:0:{}s:2:"vv";a:0:{}s:8:"blogspot";a:0:{}}s:2:"je";a:3:{s:2:"co";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"jm";a:1:{s:1:"*";a:0:{}}s:2:"jo";a:8:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}s:3:"sch";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}}s:4:"jobs";a:0:{}s:2:"jp";a:111:{s:2:"ac";a:0:{}s:2:"ad";a:0:{}s:2:"co";a:0:{}s:2:"ed";a:0:{}s:2:"go";a:0:{}s:2:"gr";a:0:{}s:2:"lg";a:0:{}s:2:"ne";a:0:{}s:2:"or";a:0:{}s:5:"aichi";a:52:{s:5:"aisai";a:0:{}s:3:"ama";a:0:{}s:4:"anjo";a:0:{}s:5:"asuke";a:0:{}s:6:"chiryu";a:0:{}s:5:"chita";a:0:{}s:4:"fuso";a:0:{}s:8:"gamagori";a:0:{}s:5:"handa";a:0:{}s:4:"hazu";a:0:{}s:7:"hekinan";a:0:{}s:10:"higashiura";a:0:{}s:10:"ichinomiya";a:0:{}s:7:"inazawa";a:0:{}s:7:"inuyama";a:0:{}s:7:"isshiki";a:0:{}s:7:"iwakura";a:0:{}s:5:"kanie";a:0:{}s:6:"kariya";a:0:{}s:7:"kasugai";a:0:{}s:4:"kira";a:0:{}s:6:"kiyosu";a:0:{}s:6:"komaki";a:0:{}s:5:"konan";a:0:{}s:4:"kota";a:0:{}s:6:"mihama";a:0:{}s:7:"miyoshi";a:0:{}s:6:"nishio";a:0:{}s:7:"nisshin";a:0:{}s:3:"obu";a:0:{}s:6:"oguchi";a:0:{}s:5:"oharu";a:0:{}s:7:"okazaki";a:0:{}s:10:"owariasahi";a:0:{}s:4:"seto";a:0:{}s:8:"shikatsu";a:0:{}s:9:"shinshiro";a:0:{}s:7:"shitara";a:0:{}s:6:"tahara";a:0:{}s:8:"takahama";a:0:{}s:9:"tobishima";a:0:{}s:4:"toei";a:0:{}s:4:"togo";a:0:{}s:5:"tokai";a:0:{}s:8:"tokoname";a:0:{}s:7:"toyoake";a:0:{}s:9:"toyohashi";a:0:{}s:8:"toyokawa";a:0:{}s:6:"toyone";a:0:{}s:6:"toyota";a:0:{}s:8:"tsushima";a:0:{}s:6:"yatomi";a:0:{}}s:5:"akita";a:28:{s:5:"akita";a:0:{}s:6:"daisen";a:0:{}s:8:"fujisato";a:0:{}s:6:"gojome";a:0:{}s:11:"hachirogata";a:0:{}s:6:"happou";a:0:{}s:13:"higashinaruse";a:0:{}s:5:"honjo";a:0:{}s:6:"honjyo";a:0:{}s:5:"ikawa";a:0:{}s:9:"kamikoani";a:0:{}s:7:"kamioka";a:0:{}s:8:"katagami";a:0:{}s:6:"kazuno";a:0:{}s:9:"kitaakita";a:0:{}s:6:"kosaka";a:0:{}s:5:"kyowa";a:0:{}s:6:"misato";a:0:{}s:6:"mitane";a:0:{}s:9:"moriyoshi";a:0:{}s:6:"nikaho";a:0:{}s:7:"noshiro";a:0:{}s:5:"odate";a:0:{}s:3:"oga";a:0:{}s:5:"ogata";a:0:{}s:7:"semboku";a:0:{}s:6:"yokote";a:0:{}s:9:"yurihonjo";a:0:{}}s:6:"aomori";a:22:{s:6:"aomori";a:0:{}s:6:"gonohe";a:0:{}s:9:"hachinohe";a:0:{}s:9:"hashikami";a:0:{}s:7:"hiranai";a:0:{}s:8:"hirosaki";a:0:{}s:9:"itayanagi";a:0:{}s:8:"kuroishi";a:0:{}s:6:"misawa";a:0:{}s:5:"mutsu";a:0:{}s:10:"nakadomari";a:0:{}s:6:"noheji";a:0:{}s:6:"oirase";a:0:{}s:5:"owani";a:0:{}s:8:"rokunohe";a:0:{}s:7:"sannohe";a:0:{}s:10:"shichinohe";a:0:{}s:6:"shingo";a:0:{}s:5:"takko";a:0:{}s:6:"towada";a:0:{}s:7:"tsugaru";a:0:{}s:7:"tsuruta";a:0:{}}s:5:"chiba";a:58:{s:5:"abiko";a:0:{}s:5:"asahi";a:0:{}s:6:"chonan";a:0:{}s:6:"chosei";a:0:{}s:6:"choshi";a:0:{}s:4:"chuo";a:0:{}s:9:"funabashi";a:0:{}s:6:"futtsu";a:0:{}s:10:"hanamigawa";a:0:{}s:8:"ichihara";a:0:{}s:8:"ichikawa";a:0:{}s:10:"ichinomiya";a:0:{}s:5:"inzai";a:0:{}s:5:"isumi";a:0:{}s:8:"kamagaya";a:0:{}s:8:"kamogawa";a:0:{}s:7:"kashiwa";a:0:{}s:6:"katori";a:0:{}s:8:"katsuura";a:0:{}s:7:"kimitsu";a:0:{}s:8:"kisarazu";a:0:{}s:6:"kozaki";a:0:{}s:8:"kujukuri";a:0:{}s:6:"kyonan";a:0:{}s:7:"matsudo";a:0:{}s:6:"midori";a:0:{}s:6:"mihama";a:0:{}s:10:"minamiboso";a:0:{}s:6:"mobara";a:0:{}s:9:"mutsuzawa";a:0:{}s:6:"nagara";a:0:{}s:10:"nagareyama";a:0:{}s:9:"narashino";a:0:{}s:6:"narita";a:0:{}s:4:"noda";a:0:{}s:13:"oamishirasato";a:0:{}s:7:"omigawa";a:0:{}s:6:"onjuku";a:0:{}s:5:"otaki";a:0:{}s:5:"sakae";a:0:{}s:6:"sakura";a:0:{}s:9:"shimofusa";a:0:{}s:7:"shirako";a:0:{}s:6:"shiroi";a:0:{}s:6:"shisui";a:0:{}s:9:"sodegaura";a:0:{}s:4:"sosa";a:0:{}s:4:"tako";a:0:{}s:8:"tateyama";a:0:{}s:6:"togane";a:0:{}s:8:"tohnosho";a:0:{}s:8:"tomisato";a:0:{}s:7:"urayasu";a:0:{}s:9:"yachimata";a:0:{}s:7:"yachiyo";a:0:{}s:10:"yokaichiba";a:0:{}s:15:"yokoshibahikari";a:0:{}s:10:"yotsukaido";a:0:{}}s:5:"ehime";a:22:{s:5:"ainan";a:0:{}s:5:"honai";a:0:{}s:5:"ikata";a:0:{}s:7:"imabari";a:0:{}s:3:"iyo";a:0:{}s:8:"kamijima";a:0:{}s:6:"kihoku";a:0:{}s:9:"kumakogen";a:0:{}s:6:"masaki";a:0:{}s:7:"matsuno";a:0:{}s:9:"matsuyama";a:0:{}s:8:"namikata";a:0:{}s:7:"niihama";a:0:{}s:3:"ozu";a:0:{}s:5:"saijo";a:0:{}s:5:"seiyo";a:0:{}s:11:"shikokuchuo";a:0:{}s:4:"tobe";a:0:{}s:4:"toon";a:0:{}s:6:"uchiko";a:0:{}s:7:"uwajima";a:0:{}s:10:"yawatahama";a:0:{}}s:5:"fukui";a:15:{s:7:"echizen";a:0:{}s:7:"eiheiji";a:0:{}s:5:"fukui";a:0:{}s:5:"ikeda";a:0:{}s:9:"katsuyama";a:0:{}s:6:"mihama";a:0:{}s:13:"minamiechizen";a:0:{}s:5:"obama";a:0:{}s:3:"ohi";a:0:{}s:3:"ono";a:0:{}s:5:"sabae";a:0:{}s:5:"sakai";a:0:{}s:8:"takahama";a:0:{}s:7:"tsuruga";a:0:{}s:6:"wakasa";a:0:{}}s:7:"fukuoka";a:63:{s:6:"ashiya";a:0:{}s:5:"buzen";a:0:{}s:7:"chikugo";a:0:{}s:7:"chikuho";a:0:{}s:7:"chikujo";a:0:{}s:10:"chikushino";a:0:{}s:8:"chikuzen";a:0:{}s:4:"chuo";a:0:{}s:7:"dazaifu";a:0:{}s:7:"fukuchi";a:0:{}s:6:"hakata";a:0:{}s:7:"higashi";a:0:{}s:8:"hirokawa";a:0:{}s:8:"hisayama";a:0:{}s:6:"iizuka";a:0:{}s:8:"inatsuki";a:0:{}s:4:"kaho";a:0:{}s:6:"kasuga";a:0:{}s:6:"kasuya";a:0:{}s:6:"kawara";a:0:{}s:6:"keisen";a:0:{}s:4:"koga";a:0:{}s:6:"kurate";a:0:{}s:6:"kurogi";a:0:{}s:6:"kurume";a:0:{}s:6:"minami";a:0:{}s:6:"miyako";a:0:{}s:6:"miyama";a:0:{}s:8:"miyawaka";a:0:{}s:8:"mizumaki";a:0:{}s:8:"munakata";a:0:{}s:8:"nakagawa";a:0:{}s:6:"nakama";a:0:{}s:5:"nishi";a:0:{}s:6:"nogata";a:0:{}s:5:"ogori";a:0:{}s:7:"okagaki";a:0:{}s:5:"okawa";a:0:{}s:3:"oki";a:0:{}s:5:"omuta";a:0:{}s:4:"onga";a:0:{}s:5:"onojo";a:0:{}s:3:"oto";a:0:{}s:7:"saigawa";a:0:{}s:8:"sasaguri";a:0:{}s:6:"shingu";a:0:{}s:13:"shinyoshitomi";a:0:{}s:6:"shonai";a:0:{}s:5:"soeda";a:0:{}s:3:"sue";a:0:{}s:9:"tachiarai";a:0:{}s:6:"tagawa";a:0:{}s:6:"takata";a:0:{}s:4:"toho";a:0:{}s:7:"toyotsu";a:0:{}s:6:"tsuiki";a:0:{}s:5:"ukiha";a:0:{}s:3:"umi";a:0:{}s:4:"usui";a:0:{}s:6:"yamada";a:0:{}s:4:"yame";a:0:{}s:8:"yanagawa";a:0:{}s:9:"yukuhashi";a:0:{}}s:9:"fukushima";a:51:{s:9:"aizubange";a:0:{}s:10:"aizumisato";a:0:{}s:13:"aizuwakamatsu";a:0:{}s:7:"asakawa";a:0:{}s:6:"bandai";a:0:{}s:4:"date";a:0:{}s:9:"fukushima";a:0:{}s:8:"furudono";a:0:{}s:6:"futaba";a:0:{}s:6:"hanawa";a:0:{}s:7:"higashi";a:0:{}s:6:"hirata";a:0:{}s:6:"hirono";a:0:{}s:6:"iitate";a:0:{}s:10:"inawashiro";a:0:{}s:8:"ishikawa";a:0:{}s:5:"iwaki";a:0:{}s:9:"izumizaki";a:0:{}s:10:"kagamiishi";a:0:{}s:8:"kaneyama";a:0:{}s:8:"kawamata";a:0:{}s:8:"kitakata";a:0:{}s:12:"kitashiobara";a:0:{}s:5:"koori";a:0:{}s:8:"koriyama";a:0:{}s:6:"kunimi";a:0:{}s:6:"miharu";a:0:{}s:7:"mishima";a:0:{}s:5:"namie";a:0:{}s:5:"nango";a:0:{}s:9:"nishiaizu";a:0:{}s:7:"nishigo";a:0:{}s:5:"okuma";a:0:{}s:7:"omotego";a:0:{}s:3:"ono";a:0:{}s:5:"otama";a:0:{}s:8:"samegawa";a:0:{}s:7:"shimogo";a:0:{}s:9:"shirakawa";a:0:{}s:5:"showa";a:0:{}s:4:"soma";a:0:{}s:8:"sukagawa";a:0:{}s:7:"taishin";a:0:{}s:8:"tamakawa";a:0:{}s:8:"tanagura";a:0:{}s:5:"tenei";a:0:{}s:6:"yabuki";a:0:{}s:6:"yamato";a:0:{}s:9:"yamatsuri";a:0:{}s:7:"yanaizu";a:0:{}s:6:"yugawa";a:0:{}}s:4:"gifu";a:38:{s:7:"anpachi";a:0:{}s:3:"ena";a:0:{}s:4:"gifu";a:0:{}s:5:"ginan";a:0:{}s:4:"godo";a:0:{}s:4:"gujo";a:0:{}s:7:"hashima";a:0:{}s:7:"hichiso";a:0:{}s:4:"hida";a:0:{}s:16:"higashishirakawa";a:0:{}s:7:"ibigawa";a:0:{}s:5:"ikeda";a:0:{}s:12:"kakamigahara";a:0:{}s:4:"kani";a:0:{}s:8:"kasahara";a:0:{}s:9:"kasamatsu";a:0:{}s:6:"kawaue";a:0:{}s:8:"kitagata";a:0:{}s:4:"mino";a:0:{}s:8:"minokamo";a:0:{}s:6:"mitake";a:0:{}s:8:"mizunami";a:0:{}s:6:"motosu";a:0:{}s:11:"nakatsugawa";a:0:{}s:5:"ogaki";a:0:{}s:8:"sakahogi";a:0:{}s:4:"seki";a:0:{}s:10:"sekigahara";a:0:{}s:9:"shirakawa";a:0:{}s:6:"tajimi";a:0:{}s:8:"takayama";a:0:{}s:5:"tarui";a:0:{}s:4:"toki";a:0:{}s:6:"tomika";a:0:{}s:8:"wanouchi";a:0:{}s:8:"yamagata";a:0:{}s:6:"yaotsu";a:0:{}s:4:"yoro";a:0:{}}s:5:"gunma";a:36:{s:6:"annaka";a:0:{}s:7:"chiyoda";a:0:{}s:7:"fujioka";a:0:{}s:15:"higashiagatsuma";a:0:{}s:7:"isesaki";a:0:{}s:7:"itakura";a:0:{}s:5:"kanna";a:0:{}s:5:"kanra";a:0:{}s:9:"katashina";a:0:{}s:6:"kawaba";a:0:{}s:5:"kiryu";a:0:{}s:7:"kusatsu";a:0:{}s:8:"maebashi";a:0:{}s:5:"meiwa";a:0:{}s:6:"midori";a:0:{}s:8:"minakami";a:0:{}s:10:"naganohara";a:0:{}s:8:"nakanojo";a:0:{}s:7:"nanmoku";a:0:{}s:6:"numata";a:0:{}s:6:"oizumi";a:0:{}s:3:"ora";a:0:{}s:3:"ota";a:0:{}s:9:"shibukawa";a:0:{}s:9:"shimonita";a:0:{}s:6:"shinto";a:0:{}s:5:"showa";a:0:{}s:8:"takasaki";a:0:{}s:8:"takayama";a:0:{}s:8:"tamamura";a:0:{}s:11:"tatebayashi";a:0:{}s:7:"tomioka";a:0:{}s:9:"tsukiyono";a:0:{}s:8:"tsumagoi";a:0:{}s:4:"ueno";a:0:{}s:8:"yoshioka";a:0:{}}s:9:"hiroshima";a:25:{s:9:"asaminami";a:0:{}s:5:"daiwa";a:0:{}s:7:"etajima";a:0:{}s:5:"fuchu";a:0:{}s:8:"fukuyama";a:0:{}s:11:"hatsukaichi";a:0:{}s:16:"higashihiroshima";a:0:{}s:5:"hongo";a:0:{}s:12:"jinsekikogen";a:0:{}s:5:"kaita";a:0:{}s:3:"kui";a:0:{}s:6:"kumano";a:0:{}s:4:"kure";a:0:{}s:6:"mihara";a:0:{}s:7:"miyoshi";a:0:{}s:4:"naka";a:0:{}s:8:"onomichi";a:0:{}s:13:"osakikamijima";a:0:{}s:5:"otake";a:0:{}s:4:"saka";a:0:{}s:4:"sera";a:0:{}s:9:"seranishi";a:0:{}s:8:"shinichi";a:0:{}s:7:"shobara";a:0:{}s:8:"takehara";a:0:{}}s:8:"hokkaido";a:142:{s:8:"abashiri";a:0:{}s:5:"abira";a:0:{}s:7:"aibetsu";a:0:{}s:7:"akabira";a:0:{}s:7:"akkeshi";a:0:{}s:9:"asahikawa";a:0:{}s:9:"ashibetsu";a:0:{}s:6:"ashoro";a:0:{}s:6:"assabu";a:0:{}s:6:"atsuma";a:0:{}s:5:"bibai";a:0:{}s:4:"biei";a:0:{}s:6:"bifuka";a:0:{}s:6:"bihoro";a:0:{}s:8:"biratori";a:0:{}s:11:"chippubetsu";a:0:{}s:7:"chitose";a:0:{}s:4:"date";a:0:{}s:6:"ebetsu";a:0:{}s:7:"embetsu";a:0:{}s:5:"eniwa";a:0:{}s:5:"erimo";a:0:{}s:4:"esan";a:0:{}s:6:"esashi";a:0:{}s:8:"fukagawa";a:0:{}s:9:"fukushima";a:0:{}s:6:"furano";a:0:{}s:8:"furubira";a:0:{}s:6:"haboro";a:0:{}s:8:"hakodate";a:0:{}s:12:"hamatonbetsu";a:0:{}s:6:"hidaka";a:0:{}s:13:"higashikagura";a:0:{}s:11:"higashikawa";a:0:{}s:5:"hiroo";a:0:{}s:7:"hokuryu";a:0:{}s:6:"hokuto";a:0:{}s:8:"honbetsu";a:0:{}s:9:"horokanai";a:0:{}s:8:"horonobe";a:0:{}s:5:"ikeda";a:0:{}s:7:"imakane";a:0:{}s:8:"ishikari";a:0:{}s:9:"iwamizawa";a:0:{}s:6:"iwanai";a:0:{}s:10:"kamifurano";a:0:{}s:8:"kamikawa";a:0:{}s:11:"kamishihoro";a:0:{}s:12:"kamisunagawa";a:0:{}s:8:"kamoenai";a:0:{}s:6:"kayabe";a:0:{}s:8:"kembuchi";a:0:{}s:7:"kikonai";a:0:{}s:9:"kimobetsu";a:0:{}s:13:"kitahiroshima";a:0:{}s:6:"kitami";a:0:{}s:8:"kiyosato";a:0:{}s:9:"koshimizu";a:0:{}s:8:"kunneppu";a:0:{}s:8:"kuriyama";a:0:{}s:12:"kuromatsunai";a:0:{}s:7:"kushiro";a:0:{}s:7:"kutchan";a:0:{}s:5:"kyowa";a:0:{}s:7:"mashike";a:0:{}s:8:"matsumae";a:0:{}s:6:"mikasa";a:0:{}s:12:"minamifurano";a:0:{}s:8:"mombetsu";a:0:{}s:8:"moseushi";a:0:{}s:6:"mukawa";a:0:{}s:7:"muroran";a:0:{}s:4:"naie";a:0:{}s:8:"nakagawa";a:0:{}s:12:"nakasatsunai";a:0:{}s:12:"nakatombetsu";a:0:{}s:5:"nanae";a:0:{}s:7:"nanporo";a:0:{}s:6:"nayoro";a:0:{}s:6:"nemuro";a:0:{}s:8:"niikappu";a:0:{}s:4:"niki";a:0:{}s:11:"nishiokoppe";a:0:{}s:11:"noboribetsu";a:0:{}s:6:"numata";a:0:{}s:7:"obihiro";a:0:{}s:5:"obira";a:0:{}s:5:"oketo";a:0:{}s:6:"okoppe";a:0:{}s:5:"otaru";a:0:{}s:5:"otobe";a:0:{}s:7:"otofuke";a:0:{}s:9:"otoineppu";a:0:{}s:4:"oumu";a:0:{}s:5:"ozora";a:0:{}s:5:"pippu";a:0:{}s:8:"rankoshi";a:0:{}s:5:"rebun";a:0:{}s:9:"rikubetsu";a:0:{}s:7:"rishiri";a:0:{}s:11:"rishirifuji";a:0:{}s:6:"saroma";a:0:{}s:9:"sarufutsu";a:0:{}s:8:"shakotan";a:0:{}s:5:"shari";a:0:{}s:8:"shibecha";a:0:{}s:8:"shibetsu";a:0:{}s:7:"shikabe";a:0:{}s:7:"shikaoi";a:0:{}s:9:"shimamaki";a:0:{}s:7:"shimizu";a:0:{}s:9:"shimokawa";a:0:{}s:12:"shinshinotsu";a:0:{}s:8:"shintoku";a:0:{}s:9:"shiranuka";a:0:{}s:7:"shiraoi";a:0:{}s:9:"shiriuchi";a:0:{}s:7:"sobetsu";a:0:{}s:8:"sunagawa";a:0:{}s:5:"taiki";a:0:{}s:6:"takasu";a:0:{}s:8:"takikawa";a:0:{}s:8:"takinoue";a:0:{}s:9:"teshikaga";a:0:{}s:7:"tobetsu";a:0:{}s:5:"tohma";a:0:{}s:9:"tomakomai";a:0:{}s:6:"tomari";a:0:{}s:4:"toya";a:0:{}s:6:"toyako";a:0:{}s:8:"toyotomi";a:0:{}s:7:"toyoura";a:0:{}s:8:"tsubetsu";a:0:{}s:9:"tsukigata";a:0:{}s:7:"urakawa";a:0:{}s:6:"urausu";a:0:{}s:4:"uryu";a:0:{}s:9:"utashinai";a:0:{}s:8:"wakkanai";a:0:{}s:7:"wassamu";a:0:{}s:6:"yakumo";a:0:{}s:6:"yoichi";a:0:{}}s:5:"hyogo";a:46:{s:4:"aioi";a:0:{}s:6:"akashi";a:0:{}s:3:"ako";a:0:{}s:9:"amagasaki";a:0:{}s:6:"aogaki";a:0:{}s:5:"asago";a:0:{}s:6:"ashiya";a:0:{}s:5:"awaji";a:0:{}s:8:"fukusaki";a:0:{}s:7:"goshiki";a:0:{}s:6:"harima";a:0:{}s:6:"himeji";a:0:{}s:8:"ichikawa";a:0:{}s:7:"inagawa";a:0:{}s:5:"itami";a:0:{}s:8:"kakogawa";a:0:{}s:8:"kamigori";a:0:{}s:8:"kamikawa";a:0:{}s:5:"kasai";a:0:{}s:6:"kasuga";a:0:{}s:9:"kawanishi";a:0:{}s:4:"miki";a:0:{}s:11:"minamiawaji";a:0:{}s:11:"nishinomiya";a:0:{}s:9:"nishiwaki";a:0:{}s:3:"ono";a:0:{}s:5:"sanda";a:0:{}s:6:"sannan";a:0:{}s:8:"sasayama";a:0:{}s:4:"sayo";a:0:{}s:6:"shingu";a:0:{}s:9:"shinonsen";a:0:{}s:5:"shiso";a:0:{}s:6:"sumoto";a:0:{}s:6:"taishi";a:0:{}s:4:"taka";a:0:{}s:10:"takarazuka";a:0:{}s:8:"takasago";a:0:{}s:6:"takino";a:0:{}s:5:"tamba";a:0:{}s:7:"tatsuno";a:0:{}s:7:"toyooka";a:0:{}s:4:"yabu";a:0:{}s:7:"yashiro";a:0:{}s:4:"yoka";a:0:{}s:6:"yokawa";a:0:{}}s:7:"ibaraki";a:51:{s:3:"ami";a:0:{}s:5:"asahi";a:0:{}s:5:"bando";a:0:{}s:8:"chikusei";a:0:{}s:5:"daigo";a:0:{}s:9:"fujishiro";a:0:{}s:7:"hitachi";a:0:{}s:11:"hitachinaka";a:0:{}s:12:"hitachiomiya";a:0:{}s:10:"hitachiota";a:0:{}s:7:"ibaraki";a:0:{}s:3:"ina";a:0:{}s:8:"inashiki";a:0:{}s:5:"itako";a:0:{}s:5:"iwama";a:0:{}s:4:"joso";a:0:{}s:6:"kamisu";a:0:{}s:6:"kasama";a:0:{}s:7:"kashima";a:0:{}s:11:"kasumigaura";a:0:{}s:4:"koga";a:0:{}s:4:"miho";a:0:{}s:4:"mito";a:0:{}s:6:"moriya";a:0:{}s:4:"naka";a:0:{}s:8:"namegata";a:0:{}s:5:"oarai";a:0:{}s:5:"ogawa";a:0:{}s:7:"omitama";a:0:{}s:9:"ryugasaki";a:0:{}s:5:"sakai";a:0:{}s:10:"sakuragawa";a:0:{}s:9:"shimodate";a:0:{}s:10:"shimotsuma";a:0:{}s:9:"shirosato";a:0:{}s:4:"sowa";a:0:{}s:5:"suifu";a:0:{}s:8:"takahagi";a:0:{}s:11:"tamatsukuri";a:0:{}s:5:"tokai";a:0:{}s:6:"tomobe";a:0:{}s:4:"tone";a:0:{}s:6:"toride";a:0:{}s:9:"tsuchiura";a:0:{}s:7:"tsukuba";a:0:{}s:8:"uchihara";a:0:{}s:6:"ushiku";a:0:{}s:7:"yachiyo";a:0:{}s:8:"yamagata";a:0:{}s:6:"yawara";a:0:{}s:4:"yuki";a:0:{}}s:8:"ishikawa";a:19:{s:7:"anamizu";a:0:{}s:5:"hakui";a:0:{}s:7:"hakusan";a:0:{}s:4:"kaga";a:0:{}s:6:"kahoku";a:0:{}s:8:"kanazawa";a:0:{}s:8:"kawakita";a:0:{}s:7:"komatsu";a:0:{}s:8:"nakanoto";a:0:{}s:5:"nanao";a:0:{}s:4:"nomi";a:0:{}s:8:"nonoichi";a:0:{}s:4:"noto";a:0:{}s:5:"shika";a:0:{}s:4:"suzu";a:0:{}s:7:"tsubata";a:0:{}s:7:"tsurugi";a:0:{}s:8:"uchinada";a:0:{}s:6:"wajima";a:0:{}}s:5:"iwate";a:34:{s:5:"fudai";a:0:{}s:8:"fujisawa";a:0:{}s:8:"hanamaki";a:0:{}s:9:"hiraizumi";a:0:{}s:6:"hirono";a:0:{}s:8:"ichinohe";a:0:{}s:10:"ichinoseki";a:0:{}s:8:"iwaizumi";a:0:{}s:5:"iwate";a:0:{}s:6:"joboji";a:0:{}s:8:"kamaishi";a:0:{}s:10:"kanegasaki";a:0:{}s:7:"karumai";a:0:{}s:5:"kawai";a:0:{}s:8:"kitakami";a:0:{}s:4:"kuji";a:0:{}s:6:"kunohe";a:0:{}s:8:"kuzumaki";a:0:{}s:6:"miyako";a:0:{}s:8:"mizusawa";a:0:{}s:7:"morioka";a:0:{}s:6:"ninohe";a:0:{}s:4:"noda";a:0:{}s:7:"ofunato";a:0:{}s:4:"oshu";a:0:{}s:7:"otsuchi";a:0:{}s:13:"rikuzentakata";a:0:{}s:5:"shiwa";a:0:{}s:11:"shizukuishi";a:0:{}s:6:"sumita";a:0:{}s:8:"tanohata";a:0:{}s:4:"tono";a:0:{}s:6:"yahaba";a:0:{}s:6:"yamada";a:0:{}}s:6:"kagawa";a:15:{s:7:"ayagawa";a:0:{}s:13:"higashikagawa";a:0:{}s:7:"kanonji";a:0:{}s:8:"kotohira";a:0:{}s:5:"manno";a:0:{}s:8:"marugame";a:0:{}s:6:"mitoyo";a:0:{}s:8:"naoshima";a:0:{}s:6:"sanuki";a:0:{}s:7:"tadotsu";a:0:{}s:9:"takamatsu";a:0:{}s:7:"tonosho";a:0:{}s:8:"uchinomi";a:0:{}s:5:"utazu";a:0:{}s:8:"zentsuji";a:0:{}}s:9:"kagoshima";a:20:{s:5:"akune";a:0:{}s:5:"amami";a:0:{}s:5:"hioki";a:0:{}s:3:"isa";a:0:{}s:4:"isen";a:0:{}s:5:"izumi";a:0:{}s:9:"kagoshima";a:0:{}s:6:"kanoya";a:0:{}s:8:"kawanabe";a:0:{}s:5:"kinko";a:0:{}s:7:"kouyama";a:0:{}s:10:"makurazaki";a:0:{}s:9:"matsumoto";a:0:{}s:10:"minamitane";a:0:{}s:8:"nakatane";a:0:{}s:12:"nishinoomote";a:0:{}s:13:"satsumasendai";a:0:{}s:3:"soo";a:0:{}s:8:"tarumizu";a:0:{}s:5:"yusui";a:0:{}}s:8:"kanagawa";a:30:{s:6:"aikawa";a:0:{}s:6:"atsugi";a:0:{}s:5:"ayase";a:0:{}s:9:"chigasaki";a:0:{}s:5:"ebina";a:0:{}s:8:"fujisawa";a:0:{}s:6:"hadano";a:0:{}s:6:"hakone";a:0:{}s:9:"hiratsuka";a:0:{}s:7:"isehara";a:0:{}s:6:"kaisei";a:0:{}s:8:"kamakura";a:0:{}s:8:"kiyokawa";a:0:{}s:7:"matsuda";a:0:{}s:14:"minamiashigara";a:0:{}s:5:"miura";a:0:{}s:5:"nakai";a:0:{}s:8:"ninomiya";a:0:{}s:7:"odawara";a:0:{}s:2:"oi";a:0:{}s:4:"oiso";a:0:{}s:10:"sagamihara";a:0:{}s:8:"samukawa";a:0:{}s:6:"tsukui";a:0:{}s:8:"yamakita";a:0:{}s:6:"yamato";a:0:{}s:8:"yokosuka";a:0:{}s:8:"yugawara";a:0:{}s:4:"zama";a:0:{}s:5:"zushi";a:0:{}}s:5:"kochi";a:31:{s:3:"aki";a:0:{}s:6:"geisei";a:0:{}s:6:"hidaka";a:0:{}s:12:"higashitsuno";a:0:{}s:3:"ino";a:0:{}s:6:"kagami";a:0:{}s:4:"kami";a:0:{}s:8:"kitagawa";a:0:{}s:5:"kochi";a:0:{}s:6:"mihara";a:0:{}s:8:"motoyama";a:0:{}s:6:"muroto";a:0:{}s:6:"nahari";a:0:{}s:8:"nakamura";a:0:{}s:7:"nankoku";a:0:{}s:9:"nishitosa";a:0:{}s:10:"niyodogawa";a:0:{}s:4:"ochi";a:0:{}s:5:"okawa";a:0:{}s:5:"otoyo";a:0:{}s:6:"otsuki";a:0:{}s:6:"sakawa";a:0:{}s:6:"sukumo";a:0:{}s:6:"susaki";a:0:{}s:4:"tosa";a:0:{}s:11:"tosashimizu";a:0:{}s:4:"toyo";a:0:{}s:5:"tsuno";a:0:{}s:5:"umaji";a:0:{}s:6:"yasuda";a:0:{}s:8:"yusuhara";a:0:{}}s:8:"kumamoto";a:23:{s:7:"amakusa";a:0:{}s:4:"arao";a:0:{}s:3:"aso";a:0:{}s:5:"choyo";a:0:{}s:7:"gyokuto";a:0:{}s:11:"kamiamakusa";a:0:{}s:7:"kikuchi";a:0:{}s:8:"kumamoto";a:0:{}s:7:"mashiki";a:0:{}s:6:"mifune";a:0:{}s:8:"minamata";a:0:{}s:11:"minamioguni";a:0:{}s:6:"nagasu";a:0:{}s:9:"nishihara";a:0:{}s:5:"oguni";a:0:{}s:3:"ozu";a:0:{}s:6:"sumoto";a:0:{}s:8:"takamori";a:0:{}s:3:"uki";a:0:{}s:3:"uto";a:0:{}s:6:"yamaga";a:0:{}s:6:"yamato";a:0:{}s:10:"yatsushiro";a:0:{}}s:5:"kyoto";a:31:{s:5:"ayabe";a:0:{}s:11:"fukuchiyama";a:0:{}s:11:"higashiyama";a:0:{}s:3:"ide";a:0:{}s:3:"ine";a:0:{}s:4:"joyo";a:0:{}s:7:"kameoka";a:0:{}s:4:"kamo";a:0:{}s:4:"kita";a:0:{}s:4:"kizu";a:0:{}s:8:"kumiyama";a:0:{}s:8:"kyotamba";a:0:{}s:9:"kyotanabe";a:0:{}s:8:"kyotango";a:0:{}s:7:"maizuru";a:0:{}s:6:"minami";a:0:{}s:15:"minamiyamashiro";a:0:{}s:6:"miyazu";a:0:{}s:4:"muko";a:0:{}s:10:"nagaokakyo";a:0:{}s:7:"nakagyo";a:0:{}s:6:"nantan";a:0:{}s:9:"oyamazaki";a:0:{}s:5:"sakyo";a:0:{}s:5:"seika";a:0:{}s:6:"tanabe";a:0:{}s:3:"uji";a:0:{}s:9:"ujitawara";a:0:{}s:6:"wazuka";a:0:{}s:9:"yamashina";a:0:{}s:6:"yawata";a:0:{}}s:3:"mie";a:30:{s:5:"asahi";a:0:{}s:5:"inabe";a:0:{}s:3:"ise";a:0:{}s:8:"kameyama";a:0:{}s:7:"kawagoe";a:0:{}s:4:"kiho";a:0:{}s:8:"kisosaki";a:0:{}s:4:"kiwa";a:0:{}s:6:"komono";a:0:{}s:6:"kumano";a:0:{}s:6:"kuwana";a:0:{}s:9:"matsusaka";a:0:{}s:5:"meiwa";a:0:{}s:6:"mihama";a:0:{}s:9:"minamiise";a:0:{}s:6:"misugi";a:0:{}s:6:"miyama";a:0:{}s:6:"nabari";a:0:{}s:5:"shima";a:0:{}s:6:"suzuka";a:0:{}s:4:"tado";a:0:{}s:5:"taiki";a:0:{}s:4:"taki";a:0:{}s:6:"tamaki";a:0:{}s:4:"toba";a:0:{}s:3:"tsu";a:0:{}s:5:"udono";a:0:{}s:8:"ureshino";a:0:{}s:7:"watarai";a:0:{}s:9:"yokkaichi";a:0:{}}s:6:"miyagi";a:32:{s:8:"furukawa";a:0:{}s:17:"higashimatsushima";a:0:{}s:10:"ishinomaki";a:0:{}s:7:"iwanuma";a:0:{}s:6:"kakuda";a:0:{}s:4:"kami";a:0:{}s:8:"kawasaki";a:0:{}s:8:"marumori";a:0:{}s:10:"matsushima";a:0:{}s:13:"minamisanriku";a:0:{}s:6:"misato";a:0:{}s:6:"murata";a:0:{}s:6:"natori";a:0:{}s:7:"ogawara";a:0:{}s:5:"ohira";a:0:{}s:7:"onagawa";a:0:{}s:5:"osaki";a:0:{}s:4:"rifu";a:0:{}s:6:"semine";a:0:{}s:7:"shibata";a:0:{}s:13:"shichikashuku";a:0:{}s:7:"shikama";a:0:{}s:8:"shiogama";a:0:{}s:9:"shiroishi";a:0:{}s:6:"tagajo";a:0:{}s:5:"taiwa";a:0:{}s:4:"tome";a:0:{}s:6:"tomiya";a:0:{}s:6:"wakuya";a:0:{}s:6:"watari";a:0:{}s:8:"yamamoto";a:0:{}s:3:"zao";a:0:{}}s:8:"miyazaki";a:27:{s:3:"aya";a:0:{}s:5:"ebino";a:0:{}s:6:"gokase";a:0:{}s:5:"hyuga";a:0:{}s:8:"kadogawa";a:0:{}s:10:"kawaminami";a:0:{}s:4:"kijo";a:0:{}s:8:"kitagawa";a:0:{}s:8:"kitakata";a:0:{}s:7:"kitaura";a:0:{}s:9:"kobayashi";a:0:{}s:8:"kunitomi";a:0:{}s:7:"kushima";a:0:{}s:6:"mimata";a:0:{}s:10:"miyakonojo";a:0:{}s:8:"miyazaki";a:0:{}s:9:"morotsuka";a:0:{}s:8:"nichinan";a:0:{}s:9:"nishimera";a:0:{}s:7:"nobeoka";a:0:{}s:5:"saito";a:0:{}s:6:"shiiba";a:0:{}s:8:"shintomi";a:0:{}s:8:"takaharu";a:0:{}s:8:"takanabe";a:0:{}s:8:"takazaki";a:0:{}s:5:"tsuno";a:0:{}}s:6:"nagano";a:75:{s:4:"achi";a:0:{}s:8:"agematsu";a:0:{}s:4:"anan";a:0:{}s:4:"aoki";a:0:{}s:5:"asahi";a:0:{}s:7:"azumino";a:0:{}s:9:"chikuhoku";a:0:{}s:7:"chikuma";a:0:{}s:5:"chino";a:0:{}s:6:"fujimi";a:0:{}s:6:"hakuba";a:0:{}s:4:"hara";a:0:{}s:6:"hiraya";a:0:{}s:4:"iida";a:0:{}s:6:"iijima";a:0:{}s:6:"iiyama";a:0:{}s:6:"iizuna";a:0:{}s:5:"ikeda";a:0:{}s:7:"ikusaka";a:0:{}s:3:"ina";a:0:{}s:9:"karuizawa";a:0:{}s:8:"kawakami";a:0:{}s:4:"kiso";a:0:{}s:13:"kisofukushima";a:0:{}s:8:"kitaaiki";a:0:{}s:8:"komagane";a:0:{}s:6:"komoro";a:0:{}s:9:"matsukawa";a:0:{}s:9:"matsumoto";a:0:{}s:5:"miasa";a:0:{}s:10:"minamiaiki";a:0:{}s:10:"minamimaki";a:0:{}s:12:"minamiminowa";a:0:{}s:6:"minowa";a:0:{}s:6:"miyada";a:0:{}s:6:"miyota";a:0:{}s:9:"mochizuki";a:0:{}s:6:"nagano";a:0:{}s:6:"nagawa";a:0:{}s:6:"nagiso";a:0:{}s:8:"nakagawa";a:0:{}s:6:"nakano";a:0:{}s:11:"nozawaonsen";a:0:{}s:5:"obuse";a:0:{}s:5:"ogawa";a:0:{}s:5:"okaya";a:0:{}s:6:"omachi";a:0:{}s:3:"omi";a:0:{}s:6:"ookuwa";a:0:{}s:7:"ooshika";a:0:{}s:5:"otaki";a:0:{}s:5:"otari";a:0:{}s:5:"sakae";a:0:{}s:6:"sakaki";a:0:{}s:4:"saku";a:0:{}s:6:"sakuho";a:0:{}s:9:"shimosuwa";a:0:{}s:12:"shinanomachi";a:0:{}s:8:"shiojiri";a:0:{}s:4:"suwa";a:0:{}s:6:"suzaka";a:0:{}s:6:"takagi";a:0:{}s:8:"takamori";a:0:{}s:8:"takayama";a:0:{}s:9:"tateshina";a:0:{}s:7:"tatsuno";a:0:{}s:9:"togakushi";a:0:{}s:6:"togura";a:0:{}s:4:"tomi";a:0:{}s:4:"ueda";a:0:{}s:4:"wada";a:0:{}s:8:"yamagata";a:0:{}s:10:"yamanouchi";a:0:{}s:6:"yasaka";a:0:{}s:7:"yasuoka";a:0:{}}s:8:"nagasaki";a:22:{s:7:"chijiwa";a:0:{}s:5:"futsu";a:0:{}s:4:"goto";a:0:{}s:6:"hasami";a:0:{}s:6:"hirado";a:0:{}s:3:"iki";a:0:{}s:7:"isahaya";a:0:{}s:8:"kawatana";a:0:{}s:10:"kuchinotsu";a:0:{}s:8:"matsuura";a:0:{}s:8:"nagasaki";a:0:{}s:5:"obama";a:0:{}s:5:"omura";a:0:{}s:5:"oseto";a:0:{}s:6:"saikai";a:0:{}s:6:"sasebo";a:0:{}s:5:"seihi";a:0:{}s:9:"shimabara";a:0:{}s:12:"shinkamigoto";a:0:{}s:7:"togitsu";a:0:{}s:8:"tsushima";a:0:{}s:5:"unzen";a:0:{}}s:4:"nara";a:38:{s:4:"ando";a:0:{}s:4:"gose";a:0:{}s:6:"heguri";a:0:{}s:14:"higashiyoshino";a:0:{}s:7:"ikaruga";a:0:{}s:5:"ikoma";a:0:{}s:12:"kamikitayama";a:0:{}s:7:"kanmaki";a:0:{}s:7:"kashiba";a:0:{}s:9:"kashihara";a:0:{}s:9:"katsuragi";a:0:{}s:5:"kawai";a:0:{}s:8:"kawakami";a:0:{}s:9:"kawanishi";a:0:{}s:5:"koryo";a:0:{}s:8:"kurotaki";a:0:{}s:6:"mitsue";a:0:{}s:6:"miyake";a:0:{}s:4:"nara";a:0:{}s:8:"nosegawa";a:0:{}s:3:"oji";a:0:{}s:4:"ouda";a:0:{}s:5:"oyodo";a:0:{}s:7:"sakurai";a:0:{}s:5:"sango";a:0:{}s:9:"shimoichi";a:0:{}s:13:"shimokitayama";a:0:{}s:6:"shinjo";a:0:{}s:4:"soni";a:0:{}s:8:"takatori";a:0:{}s:10:"tawaramoto";a:0:{}s:7:"tenkawa";a:0:{}s:5:"tenri";a:0:{}s:3:"uda";a:0:{}s:14:"yamatokoriyama";a:0:{}s:12:"yamatotakada";a:0:{}s:7:"yamazoe";a:0:{}s:7:"yoshino";a:0:{}}s:7:"niigata";a:34:{s:3:"aga";a:0:{}s:5:"agano";a:0:{}s:5:"gosen";a:0:{}s:8:"itoigawa";a:0:{}s:9:"izumozaki";a:0:{}s:6:"joetsu";a:0:{}s:4:"kamo";a:0:{}s:6:"kariwa";a:0:{}s:11:"kashiwazaki";a:0:{}s:12:"minamiuonuma";a:0:{}s:7:"mitsuke";a:0:{}s:5:"muika";a:0:{}s:8:"murakami";a:0:{}s:5:"myoko";a:0:{}s:7:"nagaoka";a:0:{}s:7:"niigata";a:0:{}s:5:"ojiya";a:0:{}s:3:"omi";a:0:{}s:4:"sado";a:0:{}s:5:"sanjo";a:0:{}s:5:"seiro";a:0:{}s:6:"seirou";a:0:{}s:8:"sekikawa";a:0:{}s:7:"shibata";a:0:{}s:6:"tagami";a:0:{}s:6:"tainai";a:0:{}s:6:"tochio";a:0:{}s:9:"tokamachi";a:0:{}s:7:"tsubame";a:0:{}s:6:"tsunan";a:0:{}s:6:"uonuma";a:0:{}s:6:"yahiko";a:0:{}s:5:"yoita";a:0:{}s:6:"yuzawa";a:0:{}}s:4:"oita";a:19:{s:5:"beppu";a:0:{}s:8:"bungoono";a:0:{}s:11:"bungotakada";a:0:{}s:6:"hasama";a:0:{}s:4:"hiji";a:0:{}s:9:"himeshima";a:0:{}s:4:"hita";a:0:{}s:8:"kamitsue";a:0:{}s:7:"kokonoe";a:0:{}s:4:"kuju";a:0:{}s:8:"kunisaki";a:0:{}s:4:"kusu";a:0:{}s:4:"oita";a:0:{}s:5:"saiki";a:0:{}s:6:"taketa";a:0:{}s:7:"tsukumi";a:0:{}s:3:"usa";a:0:{}s:5:"usuki";a:0:{}s:4:"yufu";a:0:{}}s:7:"okayama";a:26:{s:6:"akaiwa";a:0:{}s:8:"asakuchi";a:0:{}s:5:"bizen";a:0:{}s:9:"hayashima";a:0:{}s:5:"ibara";a:0:{}s:8:"kagamino";a:0:{}s:7:"kasaoka";a:0:{}s:8:"kibichuo";a:0:{}s:7:"kumenan";a:0:{}s:9:"kurashiki";a:0:{}s:6:"maniwa";a:0:{}s:6:"misaki";a:0:{}s:4:"nagi";a:0:{}s:5:"niimi";a:0:{}s:12:"nishiawakura";a:0:{}s:7:"okayama";a:0:{}s:7:"satosho";a:0:{}s:8:"setouchi";a:0:{}s:6:"shinjo";a:0:{}s:4:"shoo";a:0:{}s:4:"soja";a:0:{}s:9:"takahashi";a:0:{}s:6:"tamano";a:0:{}s:7:"tsuyama";a:0:{}s:4:"wake";a:0:{}s:6:"yakage";a:0:{}}s:7:"okinawa";a:42:{s:5:"aguni";a:0:{}s:7:"ginowan";a:0:{}s:6:"ginoza";a:0:{}s:9:"gushikami";a:0:{}s:7:"haebaru";a:0:{}s:7:"higashi";a:0:{}s:6:"hirara";a:0:{}s:5:"iheya";a:0:{}s:8:"ishigaki";a:0:{}s:8:"ishikawa";a:0:{}s:6:"itoman";a:0:{}s:5:"izena";a:0:{}s:6:"kadena";a:0:{}s:3:"kin";a:0:{}s:9:"kitadaito";a:0:{}s:14:"kitanakagusuku";a:0:{}s:8:"kumejima";a:0:{}s:8:"kunigami";a:0:{}s:11:"minamidaito";a:0:{}s:6:"motobu";a:0:{}s:4:"nago";a:0:{}s:4:"naha";a:0:{}s:10:"nakagusuku";a:0:{}s:7:"nakijin";a:0:{}s:5:"nanjo";a:0:{}s:9:"nishihara";a:0:{}s:5:"ogimi";a:0:{}s:7:"okinawa";a:0:{}s:4:"onna";a:0:{}s:7:"shimoji";a:0:{}s:8:"taketomi";a:0:{}s:6:"tarama";a:0:{}s:9:"tokashiki";a:0:{}s:10:"tomigusuku";a:0:{}s:6:"tonaki";a:0:{}s:6:"urasoe";a:0:{}s:5:"uruma";a:0:{}s:5:"yaese";a:0:{}s:7:"yomitan";a:0:{}s:8:"yonabaru";a:0:{}s:8:"yonaguni";a:0:{}s:6:"zamami";a:0:{}}s:5:"osaka";a:50:{s:5:"abeno";a:0:{}s:14:"chihayaakasaka";a:0:{}s:4:"chuo";a:0:{}s:5:"daito";a:0:{}s:9:"fujiidera";a:0:{}s:8:"habikino";a:0:{}s:6:"hannan";a:0:{}s:12:"higashiosaka";a:0:{}s:16:"higashisumiyoshi";a:0:{}s:15:"higashiyodogawa";a:0:{}s:8:"hirakata";a:0:{}s:7:"ibaraki";a:0:{}s:5:"ikeda";a:0:{}s:5:"izumi";a:0:{}s:9:"izumiotsu";a:0:{}s:9:"izumisano";a:0:{}s:6:"kadoma";a:0:{}s:7:"kaizuka";a:0:{}s:5:"kanan";a:0:{}s:9:"kashiwara";a:0:{}s:6:"katano";a:0:{}s:13:"kawachinagano";a:0:{}s:9:"kishiwada";a:0:{}s:4:"kita";a:0:{}s:8:"kumatori";a:0:{}s:9:"matsubara";a:0:{}s:6:"minato";a:0:{}s:5:"minoh";a:0:{}s:6:"misaki";a:0:{}s:9:"moriguchi";a:0:{}s:8:"neyagawa";a:0:{}s:5:"nishi";a:0:{}s:4:"nose";a:0:{}s:11:"osakasayama";a:0:{}s:5:"sakai";a:0:{}s:6:"sayama";a:0:{}s:6:"sennan";a:0:{}s:6:"settsu";a:0:{}s:11:"shijonawate";a:0:{}s:9:"shimamoto";a:0:{}s:5:"suita";a:0:{}s:7:"tadaoka";a:0:{}s:6:"taishi";a:0:{}s:6:"tajiri";a:0:{}s:8:"takaishi";a:0:{}s:9:"takatsuki";a:0:{}s:12:"tondabayashi";a:0:{}s:8:"toyonaka";a:0:{}s:6:"toyono";a:0:{}s:3:"yao";a:0:{}}s:4:"saga";a:26:{s:6:"ariake";a:0:{}s:5:"arita";a:0:{}s:8:"fukudomi";a:0:{}s:6:"genkai";a:0:{}s:8:"hamatama";a:0:{}s:5:"hizen";a:0:{}s:5:"imari";a:0:{}s:8:"kamimine";a:0:{}s:7:"kanzaki";a:0:{}s:7:"karatsu";a:0:{}s:7:"kashima";a:0:{}s:8:"kitagata";a:0:{}s:8:"kitahata";a:0:{}s:6:"kiyama";a:0:{}s:7:"kouhoku";a:0:{}s:7:"kyuragi";a:0:{}s:10:"nishiarita";a:0:{}s:3:"ogi";a:0:{}s:6:"omachi";a:0:{}s:5:"ouchi";a:0:{}s:4:"saga";a:0:{}s:9:"shiroishi";a:0:{}s:4:"taku";a:0:{}s:4:"tara";a:0:{}s:4:"tosu";a:0:{}s:11:"yoshinogari";a:0:{}}s:7:"saitama";a:69:{s:7:"arakawa";a:0:{}s:5:"asaka";a:0:{}s:8:"chichibu";a:0:{}s:6:"fujimi";a:0:{}s:8:"fujimino";a:0:{}s:6:"fukaya";a:0:{}s:5:"hanno";a:0:{}s:5:"hanyu";a:0:{}s:6:"hasuda";a:0:{}s:8:"hatogaya";a:0:{}s:8:"hatoyama";a:0:{}s:6:"hidaka";a:0:{}s:15:"higashichichibu";a:0:{}s:16:"higashimatsuyama";a:0:{}s:5:"honjo";a:0:{}s:3:"ina";a:0:{}s:5:"iruma";a:0:{}s:8:"iwatsuki";a:0:{}s:9:"kamiizumi";a:0:{}s:8:"kamikawa";a:0:{}s:8:"kamisato";a:0:{}s:8:"kasukabe";a:0:{}s:7:"kawagoe";a:0:{}s:9:"kawaguchi";a:0:{}s:8:"kawajima";a:0:{}s:4:"kazo";a:0:{}s:8:"kitamoto";a:0:{}s:9:"koshigaya";a:0:{}s:7:"kounosu";a:0:{}s:4:"kuki";a:0:{}s:8:"kumagaya";a:0:{}s:10:"matsubushi";a:0:{}s:6:"minano";a:0:{}s:6:"misato";a:0:{}s:9:"miyashiro";a:0:{}s:7:"miyoshi";a:0:{}s:8:"moroyama";a:0:{}s:8:"nagatoro";a:0:{}s:8:"namegawa";a:0:{}s:5:"niiza";a:0:{}s:5:"ogano";a:0:{}s:5:"ogawa";a:0:{}s:5:"ogose";a:0:{}s:7:"okegawa";a:0:{}s:5:"omiya";a:0:{}s:5:"otaki";a:0:{}s:6:"ranzan";a:0:{}s:7:"ryokami";a:0:{}s:7:"saitama";a:0:{}s:6:"sakado";a:0:{}s:5:"satte";a:0:{}s:6:"sayama";a:0:{}s:5:"shiki";a:0:{}s:8:"shiraoka";a:0:{}s:4:"soka";a:0:{}s:6:"sugito";a:0:{}s:4:"toda";a:0:{}s:8:"tokigawa";a:0:{}s:10:"tokorozawa";a:0:{}s:12:"tsurugashima";a:0:{}s:5:"urawa";a:0:{}s:6:"warabi";a:0:{}s:6:"yashio";a:0:{}s:6:"yokoze";a:0:{}s:4:"yono";a:0:{}s:5:"yorii";a:0:{}s:7:"yoshida";a:0:{}s:9:"yoshikawa";a:0:{}s:7:"yoshimi";a:0:{}}s:5:"shiga";a:23:{s:5:"aisho";a:0:{}s:4:"gamo";a:0:{}s:10:"higashiomi";a:0:{}s:6:"hikone";a:0:{}s:4:"koka";a:0:{}s:5:"konan";a:0:{}s:5:"kosei";a:0:{}s:4:"koto";a:0:{}s:7:"kusatsu";a:0:{}s:7:"maibara";a:0:{}s:8:"moriyama";a:0:{}s:8:"nagahama";a:0:{}s:9:"nishiazai";a:0:{}s:8:"notogawa";a:0:{}s:11:"omihachiman";a:0:{}s:4:"otsu";a:0:{}s:5:"ritto";a:0:{}s:5:"ryuoh";a:0:{}s:9:"takashima";a:0:{}s:9:"takatsuki";a:0:{}s:8:"torahime";a:0:{}s:8:"toyosato";a:0:{}s:4:"yasu";a:0:{}}s:7:"shimane";a:23:{s:5:"akagi";a:0:{}s:3:"ama";a:0:{}s:5:"gotsu";a:0:{}s:6:"hamada";a:0:{}s:12:"higashiizumo";a:0:{}s:6:"hikawa";a:0:{}s:6:"hikimi";a:0:{}s:5:"izumo";a:0:{}s:8:"kakinoki";a:0:{}s:6:"masuda";a:0:{}s:6:"matsue";a:0:{}s:6:"misato";a:0:{}s:12:"nishinoshima";a:0:{}s:4:"ohda";a:0:{}s:10:"okinoshima";a:0:{}s:8:"okuizumo";a:0:{}s:7:"shimane";a:0:{}s:6:"tamayu";a:0:{}s:7:"tsuwano";a:0:{}s:5:"unnan";a:0:{}s:6:"yakumo";a:0:{}s:6:"yasugi";a:0:{}s:7:"yatsuka";a:0:{}}s:8:"shizuoka";a:36:{s:4:"arai";a:0:{}s:5:"atami";a:0:{}s:4:"fuji";a:0:{}s:7:"fujieda";a:0:{}s:8:"fujikawa";a:0:{}s:10:"fujinomiya";a:0:{}s:7:"fukuroi";a:0:{}s:7:"gotemba";a:0:{}s:7:"haibara";a:0:{}s:9:"hamamatsu";a:0:{}s:10:"higashiizu";a:0:{}s:3:"ito";a:0:{}s:5:"iwata";a:0:{}s:3:"izu";a:0:{}s:9:"izunokuni";a:0:{}s:8:"kakegawa";a:0:{}s:7:"kannami";a:0:{}s:9:"kawanehon";a:0:{}s:6:"kawazu";a:0:{}s:8:"kikugawa";a:0:{}s:5:"kosai";a:0:{}s:10:"makinohara";a:0:{}s:9:"matsuzaki";a:0:{}s:9:"minamiizu";a:0:{}s:7:"mishima";a:0:{}s:9:"morimachi";a:0:{}s:8:"nishiizu";a:0:{}s:6:"numazu";a:0:{}s:8:"omaezaki";a:0:{}s:7:"shimada";a:0:{}s:7:"shimizu";a:0:{}s:7:"shimoda";a:0:{}s:8:"shizuoka";a:0:{}s:6:"susono";a:0:{}s:5:"yaizu";a:0:{}s:7:"yoshida";a:0:{}}s:7:"tochigi";a:31:{s:8:"ashikaga";a:0:{}s:4:"bato";a:0:{}s:4:"haga";a:0:{}s:7:"ichikai";a:0:{}s:7:"iwafune";a:0:{}s:10:"kaminokawa";a:0:{}s:6:"kanuma";a:0:{}s:10:"karasuyama";a:0:{}s:7:"kuroiso";a:0:{}s:7:"mashiko";a:0:{}s:4:"mibu";a:0:{}s:4:"moka";a:0:{}s:6:"motegi";a:0:{}s:4:"nasu";a:0:{}s:12:"nasushiobara";a:0:{}s:5:"nikko";a:0:{}s:9:"nishikata";a:0:{}s:4:"nogi";a:0:{}s:5:"ohira";a:0:{}s:8:"ohtawara";a:0:{}s:5:"oyama";a:0:{}s:6:"sakura";a:0:{}s:4:"sano";a:0:{}s:10:"shimotsuke";a:0:{}s:6:"shioya";a:0:{}s:10:"takanezawa";a:0:{}s:7:"tochigi";a:0:{}s:5:"tsuga";a:0:{}s:5:"ujiie";a:0:{}s:10:"utsunomiya";a:0:{}s:5:"yaita";a:0:{}}s:9:"tokushima";a:17:{s:6:"aizumi";a:0:{}s:4:"anan";a:0:{}s:6:"ichiba";a:0:{}s:5:"itano";a:0:{}s:6:"kainan";a:0:{}s:12:"komatsushima";a:0:{}s:10:"matsushige";a:0:{}s:4:"mima";a:0:{}s:6:"minami";a:0:{}s:7:"miyoshi";a:0:{}s:4:"mugi";a:0:{}s:8:"nakagawa";a:0:{}s:6:"naruto";a:0:{}s:9:"sanagochi";a:0:{}s:9:"shishikui";a:0:{}s:9:"tokushima";a:0:{}s:6:"wajiki";a:0:{}}s:5:"tokyo";a:57:{s:6:"adachi";a:0:{}s:7:"akiruno";a:0:{}s:8:"akishima";a:0:{}s:9:"aogashima";a:0:{}s:7:"arakawa";a:0:{}s:6:"bunkyo";a:0:{}s:7:"chiyoda";a:0:{}s:5:"chofu";a:0:{}s:4:"chuo";a:0:{}s:7:"edogawa";a:0:{}s:5:"fuchu";a:0:{}s:5:"fussa";a:0:{}s:7:"hachijo";a:0:{}s:8:"hachioji";a:0:{}s:6:"hamura";a:0:{}s:13:"higashikurume";a:0:{}s:15:"higashimurayama";a:0:{}s:13:"higashiyamato";a:0:{}s:4:"hino";a:0:{}s:6:"hinode";a:0:{}s:8:"hinohara";a:0:{}s:5:"inagi";a:0:{}s:8:"itabashi";a:0:{}s:10:"katsushika";a:0:{}s:4:"kita";a:0:{}s:6:"kiyose";a:0:{}s:7:"kodaira";a:0:{}s:7:"koganei";a:0:{}s:9:"kokubunji";a:0:{}s:5:"komae";a:0:{}s:4:"koto";a:0:{}s:10:"kouzushima";a:0:{}s:9:"kunitachi";a:0:{}s:7:"machida";a:0:{}s:6:"meguro";a:0:{}s:6:"minato";a:0:{}s:6:"mitaka";a:0:{}s:6:"mizuho";a:0:{}s:15:"musashimurayama";a:0:{}s:9:"musashino";a:0:{}s:6:"nakano";a:0:{}s:6:"nerima";a:0:{}s:9:"ogasawara";a:0:{}s:7:"okutama";a:0:{}s:3:"ome";a:0:{}s:6:"oshima";a:0:{}s:3:"ota";a:0:{}s:8:"setagaya";a:0:{}s:7:"shibuya";a:0:{}s:9:"shinagawa";a:0:{}s:8:"shinjuku";a:0:{}s:8:"suginami";a:0:{}s:6:"sumida";a:0:{}s:9:"tachikawa";a:0:{}s:5:"taito";a:0:{}s:4:"tama";a:0:{}s:7:"toshima";a:0:{}}s:7:"tottori";a:13:{s:5:"chizu";a:0:{}s:4:"hino";a:0:{}s:8:"kawahara";a:0:{}s:4:"koge";a:0:{}s:7:"kotoura";a:0:{}s:6:"misasa";a:0:{}s:5:"nanbu";a:0:{}s:8:"nichinan";a:0:{}s:11:"sakaiminato";a:0:{}s:7:"tottori";a:0:{}s:6:"wakasa";a:0:{}s:4:"yazu";a:0:{}s:6:"yonago";a:0:{}}s:6:"toyama";a:24:{s:5:"asahi";a:0:{}s:5:"fuchu";a:0:{}s:9:"fukumitsu";a:0:{}s:9:"funahashi";a:0:{}s:4:"himi";a:0:{}s:5:"imizu";a:0:{}s:5:"inami";a:0:{}s:6:"johana";a:0:{}s:8:"kamiichi";a:0:{}s:6:"kurobe";a:0:{}s:11:"nakaniikawa";a:0:{}s:10:"namerikawa";a:0:{}s:5:"nanto";a:0:{}s:6:"nyuzen";a:0:{}s:5:"oyabe";a:0:{}s:5:"taira";a:0:{}s:7:"takaoka";a:0:{}s:8:"tateyama";a:0:{}s:4:"toga";a:0:{}s:6:"tonami";a:0:{}s:6:"toyama";a:0:{}s:7:"unazuki";a:0:{}s:4:"uozu";a:0:{}s:6:"yamada";a:0:{}}s:8:"wakayama";a:29:{s:5:"arida";a:0:{}s:9:"aridagawa";a:0:{}s:4:"gobo";a:0:{}s:9:"hashimoto";a:0:{}s:6:"hidaka";a:0:{}s:8:"hirogawa";a:0:{}s:5:"inami";a:0:{}s:5:"iwade";a:0:{}s:6:"kainan";a:0:{}s:9:"kamitonda";a:0:{}s:9:"katsuragi";a:0:{}s:6:"kimino";a:0:{}s:8:"kinokawa";a:0:{}s:8:"kitayama";a:0:{}s:4:"koya";a:0:{}s:4:"koza";a:0:{}s:8:"kozagawa";a:0:{}s:8:"kudoyama";a:0:{}s:9:"kushimoto";a:0:{}s:6:"mihama";a:0:{}s:6:"misato";a:0:{}s:13:"nachikatsuura";a:0:{}s:6:"shingu";a:0:{}s:9:"shirahama";a:0:{}s:5:"taiji";a:0:{}s:6:"tanabe";a:0:{}s:8:"wakayama";a:0:{}s:5:"yuasa";a:0:{}s:4:"yura";a:0:{}}s:8:"yamagata";a:34:{s:5:"asahi";a:0:{}s:8:"funagata";a:0:{}s:9:"higashine";a:0:{}s:4:"iide";a:0:{}s:6:"kahoku";a:0:{}s:10:"kaminoyama";a:0:{}s:8:"kaneyama";a:0:{}s:9:"kawanishi";a:0:{}s:10:"mamurogawa";a:0:{}s:6:"mikawa";a:0:{}s:8:"murayama";a:0:{}s:5:"nagai";a:0:{}s:8:"nakayama";a:0:{}s:5:"nanyo";a:0:{}s:9:"nishikawa";a:0:{}s:9:"obanazawa";a:0:{}s:2:"oe";a:0:{}s:5:"oguni";a:0:{}s:6:"ohkura";a:0:{}s:7:"oishida";a:0:{}s:5:"sagae";a:0:{}s:6:"sakata";a:0:{}s:8:"sakegawa";a:0:{}s:6:"shinjo";a:0:{}s:9:"shirataka";a:0:{}s:6:"shonai";a:0:{}s:8:"takahata";a:0:{}s:5:"tendo";a:0:{}s:6:"tozawa";a:0:{}s:8:"tsuruoka";a:0:{}s:8:"yamagata";a:0:{}s:8:"yamanobe";a:0:{}s:8:"yonezawa";a:0:{}s:4:"yuza";a:0:{}}s:9:"yamaguchi";a:16:{s:3:"abu";a:0:{}s:4:"hagi";a:0:{}s:6:"hikari";a:0:{}s:4:"hofu";a:0:{}s:7:"iwakuni";a:0:{}s:9:"kudamatsu";a:0:{}s:5:"mitou";a:0:{}s:6:"nagato";a:0:{}s:6:"oshima";a:0:{}s:11:"shimonoseki";a:0:{}s:6:"shunan";a:0:{}s:6:"tabuse";a:0:{}s:8:"tokuyama";a:0:{}s:6:"toyota";a:0:{}s:3:"ube";a:0:{}s:3:"yuu";a:0:{}}s:9:"yamanashi";a:28:{s:4:"chuo";a:0:{}s:5:"doshi";a:0:{}s:7:"fuefuki";a:0:{}s:8:"fujikawa";a:0:{}s:15:"fujikawaguchiko";a:0:{}s:11:"fujiyoshida";a:0:{}s:8:"hayakawa";a:0:{}s:6:"hokuto";a:0:{}s:14:"ichikawamisato";a:0:{}s:3:"kai";a:0:{}s:4:"kofu";a:0:{}s:5:"koshu";a:0:{}s:6:"kosuge";a:0:{}s:11:"minami-alps";a:0:{}s:6:"minobu";a:0:{}s:9:"nakamichi";a:0:{}s:5:"nanbu";a:0:{}s:8:"narusawa";a:0:{}s:8:"nirasaki";a:0:{}s:12:"nishikatsura";a:0:{}s:6:"oshino";a:0:{}s:6:"otsuki";a:0:{}s:5:"showa";a:0:{}s:8:"tabayama";a:0:{}s:5:"tsuru";a:0:{}s:8:"uenohara";a:0:{}s:10:"yamanakako";a:0:{}s:9:"yamanashi";a:0:{}}s:9:"xn--4pvxs";a:0:{}s:11:"xn--vgu402c";a:0:{}s:10:"xn--c3s14m";a:0:{}s:11:"xn--f6qx53a";a:0:{}s:10:"xn--8pvr4u";a:0:{}s:11:"xn--uist22h";a:0:{}s:14:"xn--djrs72d6uy";a:0:{}s:11:"xn--mkru45i";a:0:{}s:13:"xn--0trq7p7nn";a:0:{}s:11:"xn--8ltr62k";a:0:{}s:11:"xn--2m4a15e";a:0:{}s:10:"xn--efvn9s";a:0:{}s:11:"xn--32vp30h";a:0:{}s:11:"xn--4it797k";a:0:{}s:11:"xn--1lqs71d";a:0:{}s:11:"xn--5rtp49c";a:0:{}s:11:"xn--5js045d";a:0:{}s:11:"xn--ehqz56n";a:0:{}s:11:"xn--1lqs03n";a:0:{}s:11:"xn--qqqt11m";a:0:{}s:10:"xn--kbrq7o";a:0:{}s:11:"xn--pssu33l";a:0:{}s:11:"xn--ntsq17g";a:0:{}s:10:"xn--uisz3g";a:0:{}s:10:"xn--6btw5a";a:0:{}s:9:"xn--1ctwo";a:0:{}s:10:"xn--6orx2r";a:0:{}s:10:"xn--rht61e";a:0:{}s:10:"xn--rht27z";a:0:{}s:10:"xn--djty4k";a:0:{}s:11:"xn--nit225k";a:0:{}s:9:"xn--rht3d";a:0:{}s:10:"xn--klty5x";a:0:{}s:10:"xn--kltx9a";a:0:{}s:10:"xn--kltp7d";a:0:{}s:11:"xn--uuwu58a";a:0:{}s:11:"xn--zbx025d";a:0:{}s:14:"xn--ntso0iqx3a";a:0:{}s:11:"xn--elqq16h";a:0:{}s:11:"xn--4it168d";a:0:{}s:11:"xn--klt787d";a:0:{}s:10:"xn--rny31h";a:0:{}s:12:"xn--7t0a264c";a:0:{}s:11:"xn--5rtq34k";a:0:{}s:11:"xn--k7yn95e";a:0:{}s:11:"xn--tor131o";a:0:{}s:14:"xn--d5qv7z876c";a:0:{}s:8:"kawasaki";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:10:"kitakyushu";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:4:"kobe";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:6:"nagoya";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:7:"sapporo";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:6:"sendai";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:8:"yokohama";a:2:{s:1:"*";a:0:{}s:4:"city";a:1:{s:1:"!";s:0:"";}}s:8:"blogspot";a:0:{}}s:2:"ke";a:2:{s:1:"*";a:0:{}s:2:"co";a:1:{s:8:"blogspot";a:0:{}}}s:2:"kg";a:6:{s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}}s:2:"kh";a:1:{s:1:"*";a:0:{}}s:2:"ki";a:7:{s:3:"edu";a:0:{}s:3:"biz";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"com";a:0:{}}s:2:"km";a:17:{s:3:"org";a:0:{}s:3:"nom";a:0:{}s:3:"gov";a:0:{}s:3:"prd";a:0:{}s:2:"tm";a:0:{}s:3:"edu";a:0:{}s:3:"mil";a:0:{}s:3:"ass";a:0:{}s:3:"com";a:0:{}s:4:"coop";a:0:{}s:4:"asso";a:0:{}s:6:"presse";a:0:{}s:7:"medecin";a:0:{}s:8:"notaires";a:0:{}s:11:"pharmaciens";a:0:{}s:11:"veterinaire";a:0:{}s:4:"gouv";a:0:{}}s:2:"kn";a:4:{s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}}s:2:"kp";a:6:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"rep";a:0:{}s:3:"tra";a:0:{}}s:2:"kr";a:30:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"es";a:0:{}s:2:"go";a:0:{}s:2:"hs";a:0:{}s:2:"kg";a:0:{}s:3:"mil";a:0:{}s:2:"ms";a:0:{}s:2:"ne";a:0:{}s:2:"or";a:0:{}s:2:"pe";a:0:{}s:2:"re";a:0:{}s:2:"sc";a:0:{}s:5:"busan";a:0:{}s:8:"chungbuk";a:0:{}s:8:"chungnam";a:0:{}s:5:"daegu";a:0:{}s:7:"daejeon";a:0:{}s:7:"gangwon";a:0:{}s:7:"gwangju";a:0:{}s:9:"gyeongbuk";a:0:{}s:8:"gyeonggi";a:0:{}s:9:"gyeongnam";a:0:{}s:7:"incheon";a:0:{}s:4:"jeju";a:0:{}s:7:"jeonbuk";a:0:{}s:7:"jeonnam";a:0:{}s:5:"seoul";a:0:{}s:5:"ulsan";a:0:{}s:8:"blogspot";a:0:{}}s:2:"kw";a:1:{s:1:"*";a:0:{}}s:2:"ky";a:5:{s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}}s:2:"kz";a:7:{s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:0:{}s:3:"nym";a:0:{}}s:2:"la";a:11:{s:3:"int";a:0:{}s:3:"net";a:0:{}s:4:"info";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"per";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"bnr";a:0:{}s:1:"c";a:0:{}s:3:"nym";a:0:{}}s:2:"lb";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"lc";a:7:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:2:"co";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:2:"oy";a:0:{}}s:2:"li";a:3:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}s:3:"nym";a:0:{}}s:2:"lk";a:15:{s:3:"gov";a:0:{}s:3:"sch";a:0:{}s:3:"net";a:0:{}s:3:"int";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"ngo";a:0:{}s:3:"soc";a:0:{}s:3:"web";a:0:{}s:3:"ltd";a:0:{}s:4:"assn";a:0:{}s:3:"grp";a:0:{}s:5:"hotel";a:0:{}s:2:"ac";a:0:{}}s:2:"lr";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}}s:2:"ls";a:2:{s:2:"co";a:0:{}s:3:"org";a:0:{}}s:2:"lt";a:3:{s:3:"gov";a:0:{}s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"lu";a:2:{s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"lv";a:9:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"mil";a:0:{}s:2:"id";a:0:{}s:3:"net";a:0:{}s:3:"asn";a:0:{}s:4:"conf";a:0:{}}s:2:"ly";a:9:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"plc";a:0:{}s:3:"edu";a:0:{}s:3:"sch";a:0:{}s:3:"med";a:0:{}s:3:"org";a:0:{}s:2:"id";a:0:{}}s:2:"ma";a:6:{s:2:"co";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:2:"ac";a:0:{}s:5:"press";a:0:{}}s:2:"mc";a:2:{s:2:"tm";a:0:{}s:4:"asso";a:0:{}}s:2:"md";a:1:{s:8:"blogspot";a:0:{}}s:2:"me";a:26:{s:2:"co";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:2:"ac";a:0:{}s:3:"gov";a:0:{}s:3:"its";a:0:{}s:4:"priv";a:0:{}s:3:"c66";a:0:{}s:6:"daplie";a:1:{s:9:"localhost";a:0:{}}s:8:"filegear";a:0:{}s:8:"brasilia";a:0:{}s:4:"ddns";a:0:{}s:6:"dnsfor";a:0:{}s:5:"hopto";a:0:{}s:7:"loginto";a:0:{}s:4:"noip";a:0:{}s:6:"webhop";a:0:{}s:3:"nym";a:0:{}s:11:"diskstation";a:0:{}s:7:"dscloud";a:0:{}s:4:"i234";a:0:{}s:4:"myds";a:0:{}s:8:"synology";a:0:{}s:8:"wedeploy";a:0:{}s:5:"yombo";a:0:{}}s:2:"mg";a:9:{s:3:"org";a:0:{}s:3:"nom";a:0:{}s:3:"gov";a:0:{}s:3:"prd";a:0:{}s:2:"tm";a:0:{}s:3:"edu";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:0:{}s:2:"co";a:0:{}}s:2:"mh";a:0:{}s:3:"mil";a:0:{}s:2:"mk";a:9:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"inf";a:0:{}s:4:"name";a:0:{}s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"ml";a:7:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:4:"gouv";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:6:"presse";a:0:{}}s:2:"mm";a:1:{s:1:"*";a:0:{}}s:2:"mn";a:4:{s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:3:"nyc";a:0:{}}s:2:"mo";a:5:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}}s:4:"mobi";a:1:{s:7:"dscloud";a:0:{}}s:2:"mp";a:0:{}s:2:"mq";a:0:{}s:2:"mr";a:2:{s:3:"gov";a:0:{}s:8:"blogspot";a:0:{}}s:2:"ms";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"mt";a:4:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"mu";a:7:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"or";a:0:{}}s:6:"museum";a:548:{s:7:"academy";a:0:{}s:11:"agriculture";a:0:{}s:3:"air";a:0:{}s:8:"airguard";a:0:{}s:7:"alabama";a:0:{}s:6:"alaska";a:0:{}s:5:"amber";a:0:{}s:9:"ambulance";a:0:{}s:8:"american";a:0:{}s:9:"americana";a:0:{}s:16:"americanantiques";a:0:{}s:11:"americanart";a:0:{}s:9:"amsterdam";a:0:{}s:3:"and";a:0:{}s:9:"annefrank";a:0:{}s:6:"anthro";a:0:{}s:12:"anthropology";a:0:{}s:8:"antiques";a:0:{}s:8:"aquarium";a:0:{}s:9:"arboretum";a:0:{}s:14:"archaeological";a:0:{}s:11:"archaeology";a:0:{}s:12:"architecture";a:0:{}s:3:"art";a:0:{}s:12:"artanddesign";a:0:{}s:9:"artcenter";a:0:{}s:7:"artdeco";a:0:{}s:12:"arteducation";a:0:{}s:10:"artgallery";a:0:{}s:4:"arts";a:0:{}s:13:"artsandcrafts";a:0:{}s:8:"asmatart";a:0:{}s:13:"assassination";a:0:{}s:6:"assisi";a:0:{}s:11:"association";a:0:{}s:9:"astronomy";a:0:{}s:7:"atlanta";a:0:{}s:6:"austin";a:0:{}s:9:"australia";a:0:{}s:10:"automotive";a:0:{}s:8:"aviation";a:0:{}s:4:"axis";a:0:{}s:7:"badajoz";a:0:{}s:7:"baghdad";a:0:{}s:4:"bahn";a:0:{}s:4:"bale";a:0:{}s:9:"baltimore";a:0:{}s:9:"barcelona";a:0:{}s:8:"baseball";a:0:{}s:5:"basel";a:0:{}s:5:"baths";a:0:{}s:6:"bauern";a:0:{}s:9:"beauxarts";a:0:{}s:13:"beeldengeluid";a:0:{}s:8:"bellevue";a:0:{}s:7:"bergbau";a:0:{}s:8:"berkeley";a:0:{}s:6:"berlin";a:0:{}s:4:"bern";a:0:{}s:5:"bible";a:0:{}s:6:"bilbao";a:0:{}s:4:"bill";a:0:{}s:7:"birdart";a:0:{}s:10:"birthplace";a:0:{}s:4:"bonn";a:0:{}s:6:"boston";a:0:{}s:9:"botanical";a:0:{}s:15:"botanicalgarden";a:0:{}s:13:"botanicgarden";a:0:{}s:6:"botany";a:0:{}s:16:"brandywinevalley";a:0:{}s:6:"brasil";a:0:{}s:7:"bristol";a:0:{}s:7:"british";a:0:{}s:15:"britishcolumbia";a:0:{}s:9:"broadcast";a:0:{}s:6:"brunel";a:0:{}s:7:"brussel";a:0:{}s:8:"brussels";a:0:{}s:9:"bruxelles";a:0:{}s:8:"building";a:0:{}s:7:"burghof";a:0:{}s:3:"bus";a:0:{}s:6:"bushey";a:0:{}s:8:"cadaques";a:0:{}s:10:"california";a:0:{}s:9:"cambridge";a:0:{}s:3:"can";a:0:{}s:6:"canada";a:0:{}s:10:"capebreton";a:0:{}s:7:"carrier";a:0:{}s:10:"cartoonart";a:0:{}s:14:"casadelamoneda";a:0:{}s:6:"castle";a:0:{}s:7:"castres";a:0:{}s:6:"celtic";a:0:{}s:6:"center";a:0:{}s:11:"chattanooga";a:0:{}s:10:"cheltenham";a:0:{}s:13:"chesapeakebay";a:0:{}s:7:"chicago";a:0:{}s:8:"children";a:0:{}s:9:"childrens";a:0:{}s:15:"childrensgarden";a:0:{}s:12:"chiropractic";a:0:{}s:9:"chocolate";a:0:{}s:14:"christiansburg";a:0:{}s:10:"cincinnati";a:0:{}s:6:"cinema";a:0:{}s:6:"circus";a:0:{}s:12:"civilisation";a:0:{}s:12:"civilization";a:0:{}s:8:"civilwar";a:0:{}s:7:"clinton";a:0:{}s:5:"clock";a:0:{}s:4:"coal";a:0:{}s:14:"coastaldefence";a:0:{}s:4:"cody";a:0:{}s:7:"coldwar";a:0:{}s:10:"collection";a:0:{}s:20:"colonialwilliamsburg";a:0:{}s:15:"coloradoplateau";a:0:{}s:8:"columbia";a:0:{}s:8:"columbus";a:0:{}s:13:"communication";a:0:{}s:14:"communications";a:0:{}s:9:"community";a:0:{}s:8:"computer";a:0:{}s:15:"computerhistory";a:0:{}s:20:"xn--comunicaes-v6a2o";a:0:{}s:12:"contemporary";a:0:{}s:15:"contemporaryart";a:0:{}s:7:"convent";a:0:{}s:10:"copenhagen";a:0:{}s:11:"corporation";a:0:{}s:36:"xn--correios-e-telecomunicaes-ghc29a";a:0:{}s:8:"corvette";a:0:{}s:7:"costume";a:0:{}s:13:"countryestate";a:0:{}s:6:"county";a:0:{}s:6:"crafts";a:0:{}s:9:"cranbrook";a:0:{}s:8:"creation";a:0:{}s:8:"cultural";a:0:{}s:14:"culturalcenter";a:0:{}s:7:"culture";a:0:{}s:5:"cyber";a:0:{}s:5:"cymru";a:0:{}s:4:"dali";a:0:{}s:6:"dallas";a:0:{}s:8:"database";a:0:{}s:3:"ddr";a:0:{}s:14:"decorativearts";a:0:{}s:8:"delaware";a:0:{}s:11:"delmenhorst";a:0:{}s:7:"denmark";a:0:{}s:5:"depot";a:0:{}s:6:"design";a:0:{}s:7:"detroit";a:0:{}s:8:"dinosaur";a:0:{}s:9:"discovery";a:0:{}s:5:"dolls";a:0:{}s:8:"donostia";a:0:{}s:6:"durham";a:0:{}s:10:"eastafrica";a:0:{}s:9:"eastcoast";a:0:{}s:9:"education";a:0:{}s:11:"educational";a:0:{}s:8:"egyptian";a:0:{}s:9:"eisenbahn";a:0:{}s:6:"elburg";a:0:{}s:10:"elvendrell";a:0:{}s:10:"embroidery";a:0:{}s:12:"encyclopedic";a:0:{}s:7:"england";a:0:{}s:10:"entomology";a:0:{}s:11:"environment";a:0:{}s:25:"environmentalconservation";a:0:{}s:8:"epilepsy";a:0:{}s:5:"essex";a:0:{}s:6:"estate";a:0:{}s:9:"ethnology";a:0:{}s:6:"exeter";a:0:{}s:10:"exhibition";a:0:{}s:6:"family";a:0:{}s:4:"farm";a:0:{}s:13:"farmequipment";a:0:{}s:7:"farmers";a:0:{}s:9:"farmstead";a:0:{}s:5:"field";a:0:{}s:8:"figueres";a:0:{}s:9:"filatelia";a:0:{}s:4:"film";a:0:{}s:7:"fineart";a:0:{}s:8:"finearts";a:0:{}s:7:"finland";a:0:{}s:8:"flanders";a:0:{}s:7:"florida";a:0:{}s:5:"force";a:0:{}s:12:"fortmissoula";a:0:{}s:9:"fortworth";a:0:{}s:10:"foundation";a:0:{}s:9:"francaise";a:0:{}s:9:"frankfurt";a:0:{}s:12:"franziskaner";a:0:{}s:11:"freemasonry";a:0:{}s:8:"freiburg";a:0:{}s:8:"fribourg";a:0:{}s:4:"frog";a:0:{}s:8:"fundacio";a:0:{}s:9:"furniture";a:0:{}s:7:"gallery";a:0:{}s:6:"garden";a:0:{}s:7:"gateway";a:0:{}s:9:"geelvinck";a:0:{}s:11:"gemological";a:0:{}s:7:"geology";a:0:{}s:7:"georgia";a:0:{}s:7:"giessen";a:0:{}s:4:"glas";a:0:{}s:5:"glass";a:0:{}s:5:"gorge";a:0:{}s:11:"grandrapids";a:0:{}s:4:"graz";a:0:{}s:8:"guernsey";a:0:{}s:10:"halloffame";a:0:{}s:7:"hamburg";a:0:{}s:7:"handson";a:0:{}s:18:"harvestcelebration";a:0:{}s:6:"hawaii";a:0:{}s:6:"health";a:0:{}s:14:"heimatunduhren";a:0:{}s:6:"hellas";a:0:{}s:8:"helsinki";a:0:{}s:15:"hembygdsforbund";a:0:{}s:8:"heritage";a:0:{}s:8:"histoire";a:0:{}s:10:"historical";a:0:{}s:17:"historicalsociety";a:0:{}s:14:"historichouses";a:0:{}s:10:"historisch";a:0:{}s:12:"historisches";a:0:{}s:7:"history";a:0:{}s:16:"historyofscience";a:0:{}s:8:"horology";a:0:{}s:5:"house";a:0:{}s:10:"humanities";a:0:{}s:12:"illustration";a:0:{}s:13:"imageandsound";a:0:{}s:6:"indian";a:0:{}s:7:"indiana";a:0:{}s:12:"indianapolis";a:0:{}s:12:"indianmarket";a:0:{}s:12:"intelligence";a:0:{}s:11:"interactive";a:0:{}s:4:"iraq";a:0:{}s:4:"iron";a:0:{}s:9:"isleofman";a:0:{}s:7:"jamison";a:0:{}s:9:"jefferson";a:0:{}s:9:"jerusalem";a:0:{}s:7:"jewelry";a:0:{}s:6:"jewish";a:0:{}s:9:"jewishart";a:0:{}s:3:"jfk";a:0:{}s:10:"journalism";a:0:{}s:7:"judaica";a:0:{}s:11:"judygarland";a:0:{}s:10:"juedisches";a:0:{}s:4:"juif";a:0:{}s:6:"karate";a:0:{}s:9:"karikatur";a:0:{}s:4:"kids";a:0:{}s:10:"koebenhavn";a:0:{}s:5:"koeln";a:0:{}s:5:"kunst";a:0:{}s:13:"kunstsammlung";a:0:{}s:14:"kunstunddesign";a:0:{}s:5:"labor";a:0:{}s:6:"labour";a:0:{}s:7:"lajolla";a:0:{}s:10:"lancashire";a:0:{}s:6:"landes";a:0:{}s:4:"lans";a:0:{}s:11:"xn--lns-qla";a:0:{}s:7:"larsson";a:0:{}s:11:"lewismiller";a:0:{}s:7:"lincoln";a:0:{}s:4:"linz";a:0:{}s:6:"living";a:0:{}s:13:"livinghistory";a:0:{}s:12:"localhistory";a:0:{}s:6:"london";a:0:{}s:10:"losangeles";a:0:{}s:6:"louvre";a:0:{}s:8:"loyalist";a:0:{}s:7:"lucerne";a:0:{}s:10:"luxembourg";a:0:{}s:6:"luzern";a:0:{}s:3:"mad";a:0:{}s:6:"madrid";a:0:{}s:8:"mallorca";a:0:{}s:10:"manchester";a:0:{}s:7:"mansion";a:0:{}s:8:"mansions";a:0:{}s:4:"manx";a:0:{}s:7:"marburg";a:0:{}s:8:"maritime";a:0:{}s:8:"maritimo";a:0:{}s:8:"maryland";a:0:{}s:10:"marylhurst";a:0:{}s:5:"media";a:0:{}s:7:"medical";a:0:{}s:19:"medizinhistorisches";a:0:{}s:6:"meeres";a:0:{}s:8:"memorial";a:0:{}s:9:"mesaverde";a:0:{}s:8:"michigan";a:0:{}s:11:"midatlantic";a:0:{}s:8:"military";a:0:{}s:4:"mill";a:0:{}s:6:"miners";a:0:{}s:6:"mining";a:0:{}s:9:"minnesota";a:0:{}s:7:"missile";a:0:{}s:8:"missoula";a:0:{}s:6:"modern";a:0:{}s:4:"moma";a:0:{}s:5:"money";a:0:{}s:8:"monmouth";a:0:{}s:10:"monticello";a:0:{}s:8:"montreal";a:0:{}s:6:"moscow";a:0:{}s:10:"motorcycle";a:0:{}s:8:"muenchen";a:0:{}s:8:"muenster";a:0:{}s:8:"mulhouse";a:0:{}s:6:"muncie";a:0:{}s:6:"museet";a:0:{}s:12:"museumcenter";a:0:{}s:16:"museumvereniging";a:0:{}s:5:"music";a:0:{}s:8:"national";a:0:{}s:16:"nationalfirearms";a:0:{}s:16:"nationalheritage";a:0:{}s:14:"nativeamerican";a:0:{}s:14:"naturalhistory";a:0:{}s:20:"naturalhistorymuseum";a:0:{}s:15:"naturalsciences";a:0:{}s:6:"nature";a:0:{}s:17:"naturhistorisches";a:0:{}s:19:"natuurwetenschappen";a:0:{}s:8:"naumburg";a:0:{}s:5:"naval";a:0:{}s:8:"nebraska";a:0:{}s:5:"neues";a:0:{}s:12:"newhampshire";a:0:{}s:9:"newjersey";a:0:{}s:9:"newmexico";a:0:{}s:7:"newport";a:0:{}s:9:"newspaper";a:0:{}s:7:"newyork";a:0:{}s:6:"niepce";a:0:{}s:7:"norfolk";a:0:{}s:5:"north";a:0:{}s:3:"nrw";a:0:{}s:9:"nuernberg";a:0:{}s:9:"nuremberg";a:0:{}s:3:"nyc";a:0:{}s:4:"nyny";a:0:{}s:13:"oceanographic";a:0:{}s:15:"oceanographique";a:0:{}s:5:"omaha";a:0:{}s:6:"online";a:0:{}s:7:"ontario";a:0:{}s:7:"openair";a:0:{}s:6:"oregon";a:0:{}s:11:"oregontrail";a:0:{}s:5:"otago";a:0:{}s:6:"oxford";a:0:{}s:7:"pacific";a:0:{}s:9:"paderborn";a:0:{}s:6:"palace";a:0:{}s:5:"paleo";a:0:{}s:11:"palmsprings";a:0:{}s:6:"panama";a:0:{}s:5:"paris";a:0:{}s:8:"pasadena";a:0:{}s:8:"pharmacy";a:0:{}s:12:"philadelphia";a:0:{}s:16:"philadelphiaarea";a:0:{}s:9:"philately";a:0:{}s:7:"phoenix";a:0:{}s:11:"photography";a:0:{}s:6:"pilots";a:0:{}s:10:"pittsburgh";a:0:{}s:11:"planetarium";a:0:{}s:10:"plantation";a:0:{}s:6:"plants";a:0:{}s:5:"plaza";a:0:{}s:6:"portal";a:0:{}s:8:"portland";a:0:{}s:10:"portlligat";a:0:{}s:28:"posts-and-telecommunications";a:0:{}s:12:"preservation";a:0:{}s:8:"presidio";a:0:{}s:5:"press";a:0:{}s:7:"project";a:0:{}s:6:"public";a:0:{}s:5:"pubol";a:0:{}s:6:"quebec";a:0:{}s:8:"railroad";a:0:{}s:7:"railway";a:0:{}s:8:"research";a:0:{}s:10:"resistance";a:0:{}s:12:"riodejaneiro";a:0:{}s:9:"rochester";a:0:{}s:7:"rockart";a:0:{}s:4:"roma";a:0:{}s:6:"russia";a:0:{}s:10:"saintlouis";a:0:{}s:5:"salem";a:0:{}s:12:"salvadordali";a:0:{}s:8:"salzburg";a:0:{}s:8:"sandiego";a:0:{}s:12:"sanfrancisco";a:0:{}s:12:"santabarbara";a:0:{}s:9:"santacruz";a:0:{}s:7:"santafe";a:0:{}s:12:"saskatchewan";a:0:{}s:4:"satx";a:0:{}s:10:"savannahga";a:0:{}s:12:"schlesisches";a:0:{}s:11:"schoenbrunn";a:0:{}s:11:"schokoladen";a:0:{}s:6:"school";a:0:{}s:7:"schweiz";a:0:{}s:7:"science";a:0:{}s:17:"scienceandhistory";a:0:{}s:18:"scienceandindustry";a:0:{}s:13:"sciencecenter";a:0:{}s:14:"sciencecenters";a:0:{}s:15:"science-fiction";a:0:{}s:14:"sciencehistory";a:0:{}s:8:"sciences";a:0:{}s:18:"sciencesnaturelles";a:0:{}s:8:"scotland";a:0:{}s:7:"seaport";a:0:{}s:10:"settlement";a:0:{}s:8:"settlers";a:0:{}s:5:"shell";a:0:{}s:10:"sherbrooke";a:0:{}s:7:"sibenik";a:0:{}s:4:"silk";a:0:{}s:3:"ski";a:0:{}s:5:"skole";a:0:{}s:7:"society";a:0:{}s:7:"sologne";a:0:{}s:14:"soundandvision";a:0:{}s:13:"southcarolina";a:0:{}s:9:"southwest";a:0:{}s:5:"space";a:0:{}s:3:"spy";a:0:{}s:6:"square";a:0:{}s:5:"stadt";a:0:{}s:8:"stalbans";a:0:{}s:9:"starnberg";a:0:{}s:5:"state";a:0:{}s:15:"stateofdelaware";a:0:{}s:7:"station";a:0:{}s:5:"steam";a:0:{}s:10:"steiermark";a:0:{}s:6:"stjohn";a:0:{}s:9:"stockholm";a:0:{}s:12:"stpetersburg";a:0:{}s:9:"stuttgart";a:0:{}s:6:"suisse";a:0:{}s:12:"surgeonshall";a:0:{}s:6:"surrey";a:0:{}s:8:"svizzera";a:0:{}s:6:"sweden";a:0:{}s:6:"sydney";a:0:{}s:4:"tank";a:0:{}s:3:"tcm";a:0:{}s:10:"technology";a:0:{}s:17:"telekommunikation";a:0:{}s:10:"television";a:0:{}s:5:"texas";a:0:{}s:7:"textile";a:0:{}s:7:"theater";a:0:{}s:4:"time";a:0:{}s:11:"timekeeping";a:0:{}s:8:"topology";a:0:{}s:6:"torino";a:0:{}s:5:"touch";a:0:{}s:4:"town";a:0:{}s:9:"transport";a:0:{}s:4:"tree";a:0:{}s:7:"trolley";a:0:{}s:5:"trust";a:0:{}s:7:"trustee";a:0:{}s:5:"uhren";a:0:{}s:3:"ulm";a:0:{}s:8:"undersea";a:0:{}s:10:"university";a:0:{}s:3:"usa";a:0:{}s:10:"usantiques";a:0:{}s:6:"usarts";a:0:{}s:15:"uscountryestate";a:0:{}s:9:"usculture";a:0:{}s:16:"usdecorativearts";a:0:{}s:8:"usgarden";a:0:{}s:9:"ushistory";a:0:{}s:7:"ushuaia";a:0:{}s:15:"uslivinghistory";a:0:{}s:4:"utah";a:0:{}s:4:"uvic";a:0:{}s:6:"valley";a:0:{}s:6:"vantaa";a:0:{}s:10:"versailles";a:0:{}s:6:"viking";a:0:{}s:7:"village";a:0:{}s:8:"virginia";a:0:{}s:7:"virtual";a:0:{}s:7:"virtuel";a:0:{}s:10:"vlaanderen";a:0:{}s:11:"volkenkunde";a:0:{}s:5:"wales";a:0:{}s:8:"wallonie";a:0:{}s:3:"war";a:0:{}s:12:"washingtondc";a:0:{}s:13:"watchandclock";a:0:{}s:15:"watch-and-clock";a:0:{}s:7:"western";a:0:{}s:9:"westfalen";a:0:{}s:7:"whaling";a:0:{}s:8:"wildlife";a:0:{}s:12:"williamsburg";a:0:{}s:8:"windmill";a:0:{}s:8:"workshop";a:0:{}s:4:"york";a:0:{}s:9:"yorkshire";a:0:{}s:8:"yosemite";a:0:{}s:5:"youth";a:0:{}s:10:"zoological";a:0:{}s:7:"zoology";a:0:{}s:14:"xn--9dbhblg6di";a:0:{}s:10:"xn--h1aegh";a:0:{}}s:2:"mv";a:14:{s:4:"aero";a:0:{}s:3:"biz";a:0:{}s:3:"com";a:0:{}s:4:"coop";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:6:"museum";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"pro";a:0:{}}s:2:"mw";a:11:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:4:"coop";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"int";a:0:{}s:6:"museum";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"mx";a:7:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"gob";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"my";a:8:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}s:8:"blogspot";a:0:{}}s:2:"mz";a:8:{s:2:"ac";a:0:{}s:3:"adv";a:0:{}s:2:"co";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"na";a:17:{s:4:"info";a:0:{}s:3:"pro";a:0:{}s:4:"name";a:0:{}s:6:"school";a:0:{}s:2:"or";a:0:{}s:2:"dr";a:0:{}s:2:"us";a:0:{}s:2:"mx";a:0:{}s:2:"ca";a:0:{}s:2:"in";a:0:{}s:2:"cc";a:0:{}s:2:"tv";a:0:{}s:2:"ws";a:0:{}s:4:"mobi";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}}s:4:"name";a:2:{s:3:"her";a:1:{s:6:"forgot";a:0:{}}s:3:"his";a:1:{s:6:"forgot";a:0:{}}}s:2:"nc";a:2:{s:4:"asso";a:0:{}s:3:"nom";a:0:{}}s:2:"ne";a:0:{}s:3:"net";a:94:{s:10:"alwaysdata";a:1:{s:1:"*";a:0:{}}s:10:"cloudfront";a:0:{}s:8:"t3l3p0rt";a:0:{}s:7:"myfritz";a:0:{}s:6:"boomla";a:0:{}s:7:"bplaced";a:0:{}s:7:"square7";a:0:{}s:2:"gb";a:0:{}s:2:"hu";a:0:{}s:2:"jp";a:0:{}s:2:"se";a:0:{}s:2:"uk";a:0:{}s:2:"in";a:0:{}s:11:"cloudaccess";a:0:{}s:9:"cdn77-ssl";a:0:{}s:5:"cdn77";a:1:{s:1:"r";a:0:{}}s:8:"feste-ip";a:0:{}s:10:"knx-server";a:0:{}s:13:"static-access";a:0:{}s:11:"cryptonomic";a:1:{s:1:"*";a:0:{}}s:6:"debian";a:0:{}s:12:"at-band-camp";a:0:{}s:7:"blogdns";a:0:{}s:8:"broke-it";a:0:{}s:10:"buyshouses";a:0:{}s:8:"dnsalias";a:0:{}s:7:"dnsdojo";a:0:{}s:7:"does-it";a:0:{}s:9:"dontexist";a:0:{}s:8:"dynalias";a:0:{}s:9:"dynathome";a:0:{}s:13:"endofinternet";a:0:{}s:7:"from-az";a:0:{}s:7:"from-co";a:0:{}s:7:"from-la";a:0:{}s:7:"from-ny";a:0:{}s:7:"gets-it";a:0:{}s:12:"ham-radio-op";a:0:{}s:7:"homeftp";a:0:{}s:6:"homeip";a:0:{}s:9:"homelinux";a:0:{}s:8:"homeunix";a:0:{}s:11:"in-the-band";a:0:{}s:9:"is-a-chef";a:0:{}s:9:"is-a-geek";a:0:{}s:8:"isa-geek";a:0:{}s:9:"kicks-ass";a:0:{}s:13:"office-on-the";a:0:{}s:7:"podzone";a:0:{}s:13:"scrapper-site";a:0:{}s:6:"selfip";a:0:{}s:8:"sells-it";a:0:{}s:8:"servebbs";a:0:{}s:8:"serveftp";a:0:{}s:8:"thruhere";a:0:{}s:6:"webhop";a:0:{}s:8:"definima";a:0:{}s:7:"casacam";a:0:{}s:4:"dynu";a:0:{}s:5:"dynv6";a:0:{}s:6:"twmail";a:0:{}s:2:"ru";a:0:{}s:11:"channelsdvr";a:0:{}s:8:"fastlylb";a:1:{s:3:"map";a:0:{}}s:6:"fastly";a:4:{s:7:"freetls";a:0:{}s:3:"map";a:0:{}s:4:"prod";a:2:{s:1:"a";a:0:{}s:6:"global";a:0:{}}s:3:"ssl";a:3:{s:1:"a";a:0:{}s:1:"b";a:0:{}s:6:"global";a:0:{}}}s:12:"flynnhosting";a:0:{}s:14:"cloudfunctions";a:0:{}s:9:"moonscale";a:0:{}s:7:"ipifony";a:0:{}s:5:"barsy";a:0:{}s:13:"azurewebsites";a:0:{}s:12:"azure-mobile";a:0:{}s:8:"cloudapp";a:0:{}s:14:"eating-organic";a:0:{}s:9:"mydissent";a:0:{}s:8:"myeffect";a:0:{}s:9:"mymediapc";a:0:{}s:5:"mypsx";a:0:{}s:16:"mysecuritycamera";a:0:{}s:6:"nhlfan";a:0:{}s:5:"no-ip";a:0:{}s:6:"pgafan";a:0:{}s:24:"privatizehealthinsurance";a:0:{}s:8:"bounceme";a:0:{}s:4:"ddns";a:0:{}s:10:"redirectme";a:0:{}s:9:"serveblog";a:0:{}s:14:"serveminecraft";a:0:{}s:5:"sytes";a:0:{}s:8:"rackmaze";a:0:{}s:16:"firewall-gateway";a:0:{}s:7:"dsmynas";a:0:{}s:8:"familyds";a:0:{}s:2:"za";a:0:{}}s:2:"nf";a:10:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"per";a:0:{}s:3:"rec";a:0:{}s:3:"web";a:0:{}s:4:"arts";a:0:{}s:4:"firm";a:0:{}s:4:"info";a:0:{}s:5:"other";a:0:{}s:5:"store";a:0:{}}s:2:"ng";a:10:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:1:"i";a:0:{}s:3:"mil";a:0:{}s:4:"mobi";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sch";a:0:{}}s:2:"ni";a:14:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:2:"in";a:0:{}s:4:"info";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"nom";a:0:{}s:3:"org";a:0:{}s:3:"web";a:0:{}}s:2:"nl";a:7:{s:2:"bv";a:0:{}s:14:"virtueeldomein";a:0:{}s:2:"co";a:0:{}s:8:"blogspot";a:0:{}s:8:"transurl";a:1:{s:1:"*";a:0:{}}s:7:"cistron";a:0:{}s:5:"demon";a:0:{}}s:2:"no";a:726:{s:3:"fhs";a:0:{}s:3:"vgs";a:0:{}s:10:"fylkesbibl";a:0:{}s:9:"folkebibl";a:0:{}s:6:"museum";a:0:{}s:6:"idrett";a:0:{}s:4:"priv";a:0:{}s:3:"mil";a:0:{}s:4:"stat";a:0:{}s:3:"dep";a:0:{}s:7:"kommune";a:0:{}s:5:"herad";a:0:{}s:2:"aa";a:1:{s:2:"gs";a:0:{}}s:2:"ah";a:1:{s:2:"gs";a:0:{}}s:2:"bu";a:1:{s:2:"gs";a:0:{}}s:2:"fm";a:1:{s:2:"gs";a:0:{}}s:2:"hl";a:1:{s:2:"gs";a:0:{}}s:2:"hm";a:1:{s:2:"gs";a:0:{}}s:9:"jan-mayen";a:1:{s:2:"gs";a:0:{}}s:2:"mr";a:1:{s:2:"gs";a:0:{}}s:2:"nl";a:1:{s:2:"gs";a:0:{}}s:2:"nt";a:1:{s:2:"gs";a:0:{}}s:2:"of";a:1:{s:2:"gs";a:0:{}}s:2:"ol";a:1:{s:2:"gs";a:0:{}}s:4:"oslo";a:1:{s:2:"gs";a:0:{}}s:2:"rl";a:1:{s:2:"gs";a:0:{}}s:2:"sf";a:1:{s:2:"gs";a:0:{}}s:2:"st";a:1:{s:2:"gs";a:0:{}}s:8:"svalbard";a:1:{s:2:"gs";a:0:{}}s:2:"tm";a:1:{s:2:"gs";a:0:{}}s:2:"tr";a:1:{s:2:"gs";a:0:{}}s:2:"va";a:1:{s:2:"gs";a:0:{}}s:2:"vf";a:1:{s:2:"gs";a:0:{}}s:8:"akrehamn";a:0:{}s:15:"xn--krehamn-dxa";a:0:{}s:6:"algard";a:0:{}s:13:"xn--lgrd-poac";a:0:{}s:4:"arna";a:0:{}s:10:"brumunddal";a:0:{}s:5:"bryne";a:0:{}s:11:"bronnoysund";a:0:{}s:18:"xn--brnnysund-m8ac";a:0:{}s:6:"drobak";a:0:{}s:13:"xn--drbak-wua";a:0:{}s:8:"egersund";a:0:{}s:7:"fetsund";a:0:{}s:5:"floro";a:0:{}s:12:"xn--flor-jra";a:0:{}s:11:"fredrikstad";a:0:{}s:8:"hokksund";a:0:{}s:8:"honefoss";a:0:{}s:15:"xn--hnefoss-q1a";a:0:{}s:8:"jessheim";a:0:{}s:9:"jorpeland";a:0:{}s:16:"xn--jrpeland-54a";a:0:{}s:8:"kirkenes";a:0:{}s:8:"kopervik";a:0:{}s:12:"krokstadelva";a:0:{}s:8:"langevag";a:0:{}s:15:"xn--langevg-jxa";a:0:{}s:7:"leirvik";a:0:{}s:9:"mjondalen";a:0:{}s:16:"xn--mjndalen-64a";a:0:{}s:9:"mo-i-rana";a:0:{}s:7:"mosjoen";a:0:{}s:14:"xn--mosjen-eya";a:0:{}s:12:"nesoddtangen";a:0:{}s:8:"orkanger";a:0:{}s:6:"osoyro";a:0:{}s:13:"xn--osyro-wua";a:0:{}s:6:"raholt";a:0:{}s:13:"xn--rholt-mra";a:0:{}s:12:"sandnessjoen";a:0:{}s:19:"xn--sandnessjen-ogb";a:0:{}s:13:"skedsmokorset";a:0:{}s:7:"slattum";a:0:{}s:10:"spjelkavik";a:0:{}s:9:"stathelle";a:0:{}s:7:"stavern";a:0:{}s:15:"stjordalshalsen";a:0:{}s:22:"xn--stjrdalshalsen-sqb";a:0:{}s:8:"tananger";a:0:{}s:6:"tranby";a:0:{}s:11:"vossevangen";a:0:{}s:6:"afjord";a:0:{}s:13:"xn--fjord-lra";a:0:{}s:7:"agdenes";a:0:{}s:2:"al";a:0:{}s:9:"xn--l-1fa";a:0:{}s:7:"alesund";a:0:{}s:14:"xn--lesund-hua";a:0:{}s:9:"alstahaug";a:0:{}s:4:"alta";a:0:{}s:11:"xn--lt-liac";a:0:{}s:9:"alaheadju";a:0:{}s:16:"xn--laheadju-7ya";a:0:{}s:6:"alvdal";a:0:{}s:4:"amli";a:0:{}s:11:"xn--mli-tla";a:0:{}s:4:"amot";a:0:{}s:11:"xn--mot-tla";a:0:{}s:6:"andebu";a:0:{}s:5:"andoy";a:0:{}s:12:"xn--andy-ira";a:0:{}s:9:"andasuolo";a:0:{}s:5:"ardal";a:0:{}s:12:"xn--rdal-poa";a:0:{}s:7:"aremark";a:0:{}s:7:"arendal";a:0:{}s:9:"xn--s-1fa";a:0:{}s:6:"aseral";a:0:{}s:13:"xn--seral-lra";a:0:{}s:5:"asker";a:0:{}s:5:"askim";a:0:{}s:7:"askvoll";a:0:{}s:5:"askoy";a:0:{}s:12:"xn--asky-ira";a:0:{}s:5:"asnes";a:0:{}s:12:"xn--snes-poa";a:0:{}s:9:"audnedaln";a:0:{}s:5:"aukra";a:0:{}s:4:"aure";a:0:{}s:7:"aurland";a:0:{}s:14:"aurskog-holand";a:0:{}s:21:"xn--aurskog-hland-jnb";a:0:{}s:9:"austevoll";a:0:{}s:9:"austrheim";a:0:{}s:6:"averoy";a:0:{}s:13:"xn--avery-yua";a:0:{}s:10:"balestrand";a:0:{}s:9:"ballangen";a:0:{}s:5:"balat";a:0:{}s:12:"xn--blt-elab";a:0:{}s:9:"balsfjord";a:0:{}s:12:"bahccavuotna";a:0:{}s:19:"xn--bhccavuotna-k7a";a:0:{}s:6:"bamble";a:0:{}s:5:"bardu";a:0:{}s:6:"beardu";a:0:{}s:6:"beiarn";a:0:{}s:7:"bajddar";a:0:{}s:14:"xn--bjddar-pta";a:0:{}s:6:"baidar";a:0:{}s:13:"xn--bidr-5nac";a:0:{}s:4:"berg";a:0:{}s:6:"bergen";a:0:{}s:8:"berlevag";a:0:{}s:15:"xn--berlevg-jxa";a:0:{}s:11:"bearalvahki";a:0:{}s:18:"xn--bearalvhki-y4a";a:0:{}s:6:"bindal";a:0:{}s:8:"birkenes";a:0:{}s:7:"bjarkoy";a:0:{}s:14:"xn--bjarky-fya";a:0:{}s:9:"bjerkreim";a:0:{}s:5:"bjugn";a:0:{}s:4:"bodo";a:0:{}s:11:"xn--bod-2na";a:0:{}s:8:"badaddja";a:0:{}s:15:"xn--bdddj-mrabd";a:0:{}s:7:"budejju";a:0:{}s:4:"bokn";a:0:{}s:9:"bremanger";a:0:{}s:7:"bronnoy";a:0:{}s:14:"xn--brnny-wuac";a:0:{}s:7:"bygland";a:0:{}s:5:"bykle";a:0:{}s:5:"barum";a:0:{}s:12:"xn--brum-voa";a:0:{}s:8:"telemark";a:2:{s:2:"bo";a:0:{}s:9:"xn--b-5ga";a:0:{}}s:8:"nordland";a:4:{s:2:"bo";a:0:{}s:9:"xn--b-5ga";a:0:{}s:5:"heroy";a:0:{}s:12:"xn--hery-ira";a:0:{}}s:6:"bievat";a:0:{}s:13:"xn--bievt-0qa";a:0:{}s:5:"bomlo";a:0:{}s:12:"xn--bmlo-gra";a:0:{}s:9:"batsfjord";a:0:{}s:16:"xn--btsfjord-9za";a:0:{}s:11:"bahcavuotna";a:0:{}s:18:"xn--bhcavuotna-s4a";a:0:{}s:5:"dovre";a:0:{}s:7:"drammen";a:0:{}s:9:"drangedal";a:0:{}s:5:"dyroy";a:0:{}s:12:"xn--dyry-ira";a:0:{}s:5:"donna";a:0:{}s:12:"xn--dnna-gra";a:0:{}s:3:"eid";a:0:{}s:8:"eidfjord";a:0:{}s:8:"eidsberg";a:0:{}s:7:"eidskog";a:0:{}s:8:"eidsvoll";a:0:{}s:9:"eigersund";a:0:{}s:7:"elverum";a:0:{}s:7:"enebakk";a:0:{}s:8:"engerdal";a:0:{}s:4:"etne";a:0:{}s:7:"etnedal";a:0:{}s:6:"evenes";a:0:{}s:8:"evenassi";a:0:{}s:17:"xn--eveni-0qa01ga";a:0:{}s:15:"evje-og-hornnes";a:0:{}s:7:"farsund";a:0:{}s:6:"fauske";a:0:{}s:7:"fuossko";a:0:{}s:7:"fuoisku";a:0:{}s:5:"fedje";a:0:{}s:3:"fet";a:0:{}s:6:"finnoy";a:0:{}s:13:"xn--finny-yua";a:0:{}s:6:"fitjar";a:0:{}s:6:"fjaler";a:0:{}s:5:"fjell";a:0:{}s:8:"flakstad";a:0:{}s:9:"flatanger";a:0:{}s:11:"flekkefjord";a:0:{}s:8:"flesberg";a:0:{}s:5:"flora";a:0:{}s:3:"fla";a:0:{}s:10:"xn--fl-zia";a:0:{}s:7:"folldal";a:0:{}s:7:"forsand";a:0:{}s:6:"fosnes";a:0:{}s:4:"frei";a:0:{}s:5:"frogn";a:0:{}s:7:"froland";a:0:{}s:6:"frosta";a:0:{}s:5:"frana";a:0:{}s:12:"xn--frna-woa";a:0:{}s:5:"froya";a:0:{}s:12:"xn--frya-hra";a:0:{}s:4:"fusa";a:0:{}s:8:"fyresdal";a:0:{}s:5:"forde";a:0:{}s:12:"xn--frde-gra";a:0:{}s:6:"gamvik";a:0:{}s:10:"gangaviika";a:0:{}s:19:"xn--ggaviika-8ya47h";a:0:{}s:6:"gaular";a:0:{}s:7:"gausdal";a:0:{}s:9:"gildeskal";a:0:{}s:16:"xn--gildeskl-g0a";a:0:{}s:5:"giske";a:0:{}s:7:"gjemnes";a:0:{}s:8:"gjerdrum";a:0:{}s:8:"gjerstad";a:0:{}s:7:"gjesdal";a:0:{}s:6:"gjovik";a:0:{}s:13:"xn--gjvik-wua";a:0:{}s:7:"gloppen";a:0:{}s:3:"gol";a:0:{}s:4:"gran";a:0:{}s:5:"grane";a:0:{}s:7:"granvin";a:0:{}s:9:"gratangen";a:0:{}s:8:"grimstad";a:0:{}s:5:"grong";a:0:{}s:9:"kraanghke";a:0:{}s:16:"xn--kranghke-b0a";a:0:{}s:4:"grue";a:0:{}s:5:"gulen";a:0:{}s:6:"hadsel";a:0:{}s:6:"halden";a:0:{}s:5:"halsa";a:0:{}s:5:"hamar";a:0:{}s:7:"hamaroy";a:0:{}s:6:"habmer";a:0:{}s:13:"xn--hbmer-xqa";a:0:{}s:6:"hapmir";a:0:{}s:13:"xn--hpmir-xqa";a:0:{}s:10:"hammerfest";a:0:{}s:12:"hammarfeasta";a:0:{}s:19:"xn--hmmrfeasta-s4ac";a:0:{}s:5:"haram";a:0:{}s:6:"hareid";a:0:{}s:7:"harstad";a:0:{}s:6:"hasvik";a:0:{}s:10:"aknoluokta";a:0:{}s:19:"xn--koluokta-7ya57h";a:0:{}s:12:"hattfjelldal";a:0:{}s:8:"aarborte";a:0:{}s:9:"haugesund";a:0:{}s:5:"hemne";a:0:{}s:6:"hemnes";a:0:{}s:8:"hemsedal";a:0:{}s:15:"more-og-romsdal";a:2:{s:5:"heroy";a:0:{}s:5:"sande";a:0:{}}s:22:"xn--mre-og-romsdal-qqb";a:2:{s:12:"xn--hery-ira";a:0:{}s:5:"sande";a:0:{}}s:5:"hitra";a:0:{}s:8:"hjartdal";a:0:{}s:10:"hjelmeland";a:0:{}s:5:"hobol";a:0:{}s:12:"xn--hobl-ira";a:0:{}s:3:"hof";a:0:{}s:3:"hol";a:0:{}s:4:"hole";a:0:{}s:11:"holmestrand";a:0:{}s:8:"holtalen";a:0:{}s:15:"xn--holtlen-hxa";a:0:{}s:9:"hornindal";a:0:{}s:6:"horten";a:0:{}s:6:"hurdal";a:0:{}s:5:"hurum";a:0:{}s:6:"hvaler";a:0:{}s:9:"hyllestad";a:0:{}s:10:"hagebostad";a:0:{}s:17:"xn--hgebostad-g3a";a:0:{}s:8:"hoyanger";a:0:{}s:15:"xn--hyanger-q1a";a:0:{}s:9:"hoylandet";a:0:{}s:16:"xn--hylandet-54a";a:0:{}s:2:"ha";a:0:{}s:9:"xn--h-2fa";a:0:{}s:7:"ibestad";a:0:{}s:7:"inderoy";a:0:{}s:14:"xn--indery-fya";a:0:{}s:7:"iveland";a:0:{}s:8:"jevnaker";a:0:{}s:6:"jondal";a:0:{}s:7:"jolster";a:0:{}s:14:"xn--jlster-bya";a:0:{}s:8:"karasjok";a:0:{}s:10:"karasjohka";a:0:{}s:19:"xn--krjohka-hwab49j";a:0:{}s:7:"karlsoy";a:0:{}s:5:"galsa";a:0:{}s:12:"xn--gls-elac";a:0:{}s:6:"karmoy";a:0:{}s:13:"xn--karmy-yua";a:0:{}s:10:"kautokeino";a:0:{}s:13:"guovdageaidnu";a:0:{}s:5:"klepp";a:0:{}s:5:"klabu";a:0:{}s:12:"xn--klbu-woa";a:0:{}s:9:"kongsberg";a:0:{}s:11:"kongsvinger";a:0:{}s:7:"kragero";a:0:{}s:14:"xn--krager-gya";a:0:{}s:12:"kristiansand";a:0:{}s:12:"kristiansund";a:0:{}s:10:"krodsherad";a:0:{}s:17:"xn--krdsherad-m8a";a:0:{}s:8:"kvalsund";a:0:{}s:11:"rahkkeravju";a:0:{}s:18:"xn--rhkkervju-01af";a:0:{}s:4:"kvam";a:0:{}s:9:"kvinesdal";a:0:{}s:10:"kvinnherad";a:0:{}s:9:"kviteseid";a:0:{}s:7:"kvitsoy";a:0:{}s:14:"xn--kvitsy-fya";a:0:{}s:8:"kvafjord";a:0:{}s:15:"xn--kvfjord-nxa";a:0:{}s:13:"giehtavuoatna";a:0:{}s:9:"kvanangen";a:0:{}s:16:"xn--kvnangen-k0a";a:0:{}s:8:"navuotna";a:0:{}s:15:"xn--nvuotna-hwa";a:0:{}s:7:"kafjord";a:0:{}s:14:"xn--kfjord-iua";a:0:{}s:9:"gaivuotna";a:0:{}s:16:"xn--givuotna-8ya";a:0:{}s:6:"larvik";a:0:{}s:8:"lavangen";a:0:{}s:7:"lavagis";a:0:{}s:6:"loabat";a:0:{}s:13:"xn--loabt-0qa";a:0:{}s:7:"lebesby";a:0:{}s:10:"davvesiida";a:0:{}s:9:"leikanger";a:0:{}s:9:"leirfjord";a:0:{}s:4:"leka";a:0:{}s:7:"leksvik";a:0:{}s:6:"lenvik";a:0:{}s:11:"leangaviika";a:0:{}s:18:"xn--leagaviika-52b";a:0:{}s:5:"lesja";a:0:{}s:8:"levanger";a:0:{}s:4:"lier";a:0:{}s:6:"lierne";a:0:{}s:11:"lillehammer";a:0:{}s:9:"lillesand";a:0:{}s:9:"lindesnes";a:0:{}s:6:"lindas";a:0:{}s:13:"xn--linds-pra";a:0:{}s:3:"lom";a:0:{}s:5:"loppa";a:0:{}s:6:"lahppi";a:0:{}s:13:"xn--lhppi-xqa";a:0:{}s:4:"lund";a:0:{}s:6:"lunner";a:0:{}s:5:"luroy";a:0:{}s:12:"xn--lury-ira";a:0:{}s:6:"luster";a:0:{}s:7:"lyngdal";a:0:{}s:6:"lyngen";a:0:{}s:4:"ivgu";a:0:{}s:6:"lardal";a:0:{}s:6:"lerdal";a:0:{}s:13:"xn--lrdal-sra";a:0:{}s:8:"lodingen";a:0:{}s:15:"xn--ldingen-q1a";a:0:{}s:9:"lorenskog";a:0:{}s:16:"xn--lrenskog-54a";a:0:{}s:5:"loten";a:0:{}s:12:"xn--lten-gra";a:0:{}s:6:"malvik";a:0:{}s:5:"masoy";a:0:{}s:13:"xn--msy-ula0h";a:0:{}s:6:"muosat";a:0:{}s:13:"xn--muost-0qa";a:0:{}s:6:"mandal";a:0:{}s:6:"marker";a:0:{}s:9:"marnardal";a:0:{}s:10:"masfjorden";a:0:{}s:6:"meland";a:0:{}s:6:"meldal";a:0:{}s:6:"melhus";a:0:{}s:5:"meloy";a:0:{}s:12:"xn--mely-ira";a:0:{}s:7:"meraker";a:0:{}s:14:"xn--merker-kua";a:0:{}s:7:"moareke";a:0:{}s:14:"xn--moreke-jua";a:0:{}s:7:"midsund";a:0:{}s:14:"midtre-gauldal";a:0:{}s:7:"modalen";a:0:{}s:5:"modum";a:0:{}s:5:"molde";a:0:{}s:8:"moskenes";a:0:{}s:4:"moss";a:0:{}s:6:"mosvik";a:0:{}s:7:"malselv";a:0:{}s:14:"xn--mlselv-iua";a:0:{}s:11:"malatvuopmi";a:0:{}s:18:"xn--mlatvuopmi-s4a";a:0:{}s:10:"namdalseid";a:0:{}s:6:"aejrie";a:0:{}s:6:"namsos";a:0:{}s:10:"namsskogan";a:0:{}s:14:"naamesjevuemie";a:0:{}s:21:"xn--nmesjevuemie-tcba";a:0:{}s:12:"laakesvuemie";a:0:{}s:9:"nannestad";a:0:{}s:6:"narvik";a:0:{}s:8:"narviika";a:0:{}s:8:"naustdal";a:0:{}s:11:"nedre-eiker";a:0:{}s:8:"akershus";a:1:{s:3:"nes";a:0:{}}s:8:"buskerud";a:1:{s:3:"nes";a:0:{}}s:5:"nesna";a:0:{}s:8:"nesodden";a:0:{}s:7:"nesseby";a:0:{}s:7:"unjarga";a:0:{}s:14:"xn--unjrga-rta";a:0:{}s:6:"nesset";a:0:{}s:8:"nissedal";a:0:{}s:8:"nittedal";a:0:{}s:11:"nord-aurdal";a:0:{}s:9:"nord-fron";a:0:{}s:9:"nord-odal";a:0:{}s:7:"norddal";a:0:{}s:8:"nordkapp";a:0:{}s:11:"davvenjarga";a:0:{}s:18:"xn--davvenjrga-y4a";a:0:{}s:11:"nordre-land";a:0:{}s:9:"nordreisa";a:0:{}s:5:"raisa";a:0:{}s:12:"xn--risa-5na";a:0:{}s:13:"nore-og-uvdal";a:0:{}s:8:"notodden";a:0:{}s:5:"naroy";a:0:{}s:13:"xn--nry-yla5g";a:0:{}s:8:"notteroy";a:0:{}s:15:"xn--nttery-byae";a:0:{}s:4:"odda";a:0:{}s:6:"oksnes";a:0:{}s:13:"xn--ksnes-uua";a:0:{}s:6:"oppdal";a:0:{}s:8:"oppegard";a:0:{}s:15:"xn--oppegrd-ixa";a:0:{}s:6:"orkdal";a:0:{}s:6:"orland";a:0:{}s:13:"xn--rland-uua";a:0:{}s:6:"orskog";a:0:{}s:13:"xn--rskog-uua";a:0:{}s:5:"orsta";a:0:{}s:12:"xn--rsta-fra";a:0:{}s:7:"hedmark";a:3:{s:2:"os";a:0:{}s:5:"valer";a:0:{}s:12:"xn--vler-qoa";a:0:{}}s:9:"hordaland";a:1:{s:2:"os";a:0:{}}s:4:"osen";a:0:{}s:7:"osteroy";a:0:{}s:14:"xn--ostery-fya";a:0:{}s:11:"ostre-toten";a:0:{}s:18:"xn--stre-toten-zcb";a:0:{}s:9:"overhalla";a:0:{}s:10:"ovre-eiker";a:0:{}s:17:"xn--vre-eiker-k8a";a:0:{}s:4:"oyer";a:0:{}s:11:"xn--yer-zna";a:0:{}s:8:"oygarden";a:0:{}s:15:"xn--ygarden-p1a";a:0:{}s:13:"oystre-slidre";a:0:{}s:20:"xn--ystre-slidre-ujb";a:0:{}s:9:"porsanger";a:0:{}s:8:"porsangu";a:0:{}s:17:"xn--porsgu-sta26f";a:0:{}s:9:"porsgrunn";a:0:{}s:5:"radoy";a:0:{}s:12:"xn--rady-ira";a:0:{}s:9:"rakkestad";a:0:{}s:4:"rana";a:0:{}s:6:"ruovat";a:0:{}s:9:"randaberg";a:0:{}s:5:"rauma";a:0:{}s:8:"rendalen";a:0:{}s:7:"rennebu";a:0:{}s:8:"rennesoy";a:0:{}s:15:"xn--rennesy-v1a";a:0:{}s:6:"rindal";a:0:{}s:7:"ringebu";a:0:{}s:9:"ringerike";a:0:{}s:9:"ringsaker";a:0:{}s:5:"rissa";a:0:{}s:5:"risor";a:0:{}s:12:"xn--risr-ira";a:0:{}s:4:"roan";a:0:{}s:6:"rollag";a:0:{}s:5:"rygge";a:0:{}s:8:"ralingen";a:0:{}s:15:"xn--rlingen-mxa";a:0:{}s:5:"rodoy";a:0:{}s:12:"xn--rdy-0nab";a:0:{}s:7:"romskog";a:0:{}s:14:"xn--rmskog-bya";a:0:{}s:5:"roros";a:0:{}s:12:"xn--rros-gra";a:0:{}s:4:"rost";a:0:{}s:11:"xn--rst-0na";a:0:{}s:6:"royken";a:0:{}s:13:"xn--ryken-vua";a:0:{}s:7:"royrvik";a:0:{}s:14:"xn--ryrvik-bya";a:0:{}s:4:"rade";a:0:{}s:11:"xn--rde-ula";a:0:{}s:8:"salangen";a:0:{}s:7:"siellak";a:0:{}s:7:"saltdal";a:0:{}s:5:"salat";a:0:{}s:12:"xn--slt-elab";a:0:{}s:12:"xn--slat-5na";a:0:{}s:9:"samnanger";a:0:{}s:8:"vestfold";a:1:{s:5:"sande";a:0:{}}s:10:"sandefjord";a:0:{}s:7:"sandnes";a:0:{}s:6:"sandoy";a:0:{}s:13:"xn--sandy-yua";a:0:{}s:9:"sarpsborg";a:0:{}s:5:"sauda";a:0:{}s:8:"sauherad";a:0:{}s:3:"sel";a:0:{}s:5:"selbu";a:0:{}s:5:"selje";a:0:{}s:7:"seljord";a:0:{}s:6:"sigdal";a:0:{}s:6:"siljan";a:0:{}s:6:"sirdal";a:0:{}s:5:"skaun";a:0:{}s:7:"skedsmo";a:0:{}s:3:"ski";a:0:{}s:5:"skien";a:0:{}s:8:"skiptvet";a:0:{}s:8:"skjervoy";a:0:{}s:15:"xn--skjervy-v1a";a:0:{}s:7:"skierva";a:0:{}s:14:"xn--skierv-uta";a:0:{}s:5:"skjak";a:0:{}s:12:"xn--skjk-soa";a:0:{}s:6:"skodje";a:0:{}s:8:"skanland";a:0:{}s:15:"xn--sknland-fxa";a:0:{}s:6:"skanit";a:0:{}s:13:"xn--sknit-yqa";a:0:{}s:5:"smola";a:0:{}s:12:"xn--smla-hra";a:0:{}s:10:"snillfjord";a:0:{}s:5:"snasa";a:0:{}s:12:"xn--snsa-roa";a:0:{}s:6:"snoasa";a:0:{}s:6:"snaase";a:0:{}s:13:"xn--snase-nra";a:0:{}s:7:"sogndal";a:0:{}s:7:"sokndal";a:0:{}s:4:"sola";a:0:{}s:6:"solund";a:0:{}s:9:"songdalen";a:0:{}s:8:"sortland";a:0:{}s:9:"spydeberg";a:0:{}s:6:"stange";a:0:{}s:9:"stavanger";a:0:{}s:7:"steigen";a:0:{}s:9:"steinkjer";a:0:{}s:8:"stjordal";a:0:{}s:15:"xn--stjrdal-s1a";a:0:{}s:6:"stokke";a:0:{}s:11:"stor-elvdal";a:0:{}s:5:"stord";a:0:{}s:7:"stordal";a:0:{}s:9:"storfjord";a:0:{}s:10:"omasvuotna";a:0:{}s:6:"strand";a:0:{}s:7:"stranda";a:0:{}s:5:"stryn";a:0:{}s:4:"sula";a:0:{}s:6:"suldal";a:0:{}s:4:"sund";a:0:{}s:7:"sunndal";a:0:{}s:8:"surnadal";a:0:{}s:5:"sveio";a:0:{}s:7:"svelvik";a:0:{}s:9:"sykkylven";a:0:{}s:5:"sogne";a:0:{}s:12:"xn--sgne-gra";a:0:{}s:5:"somna";a:0:{}s:12:"xn--smna-gra";a:0:{}s:11:"sondre-land";a:0:{}s:18:"xn--sndre-land-0cb";a:0:{}s:10:"sor-aurdal";a:0:{}s:17:"xn--sr-aurdal-l8a";a:0:{}s:8:"sor-fron";a:0:{}s:15:"xn--sr-fron-q1a";a:0:{}s:8:"sor-odal";a:0:{}s:15:"xn--sr-odal-q1a";a:0:{}s:12:"sor-varanger";a:0:{}s:19:"xn--sr-varanger-ggb";a:0:{}s:13:"matta-varjjat";a:0:{}s:20:"xn--mtta-vrjjat-k7af";a:0:{}s:7:"sorfold";a:0:{}s:14:"xn--srfold-bya";a:0:{}s:8:"sorreisa";a:0:{}s:15:"xn--srreisa-q1a";a:0:{}s:5:"sorum";a:0:{}s:12:"xn--srum-gra";a:0:{}s:4:"tana";a:0:{}s:6:"deatnu";a:0:{}s:4:"time";a:0:{}s:8:"tingvoll";a:0:{}s:4:"tinn";a:0:{}s:9:"tjeldsund";a:0:{}s:13:"dielddanuorri";a:0:{}s:5:"tjome";a:0:{}s:12:"xn--tjme-hra";a:0:{}s:5:"tokke";a:0:{}s:5:"tolga";a:0:{}s:7:"torsken";a:0:{}s:6:"tranoy";a:0:{}s:13:"xn--trany-yua";a:0:{}s:6:"tromso";a:0:{}s:13:"xn--troms-zua";a:0:{}s:6:"tromsa";a:0:{}s:5:"romsa";a:0:{}s:9:"trondheim";a:0:{}s:8:"troandin";a:0:{}s:6:"trysil";a:0:{}s:5:"trana";a:0:{}s:12:"xn--trna-woa";a:0:{}s:8:"trogstad";a:0:{}s:15:"xn--trgstad-r1a";a:0:{}s:11:"tvedestrand";a:0:{}s:5:"tydal";a:0:{}s:6:"tynset";a:0:{}s:8:"tysfjord";a:0:{}s:12:"divtasvuodna";a:0:{}s:13:"divttasvuotna";a:0:{}s:6:"tysnes";a:0:{}s:6:"tysvar";a:0:{}s:13:"xn--tysvr-vra";a:0:{}s:8:"tonsberg";a:0:{}s:15:"xn--tnsberg-q1a";a:0:{}s:10:"ullensaker";a:0:{}s:10:"ullensvang";a:0:{}s:5:"ulvik";a:0:{}s:6:"utsira";a:0:{}s:5:"vadso";a:0:{}s:12:"xn--vads-jra";a:0:{}s:10:"cahcesuolo";a:0:{}s:19:"xn--hcesuolo-7ya35b";a:0:{}s:7:"vaksdal";a:0:{}s:5:"valle";a:0:{}s:4:"vang";a:0:{}s:8:"vanylven";a:0:{}s:5:"vardo";a:0:{}s:12:"xn--vard-jra";a:0:{}s:7:"varggat";a:0:{}s:14:"xn--vrggt-xqad";a:0:{}s:5:"vefsn";a:0:{}s:7:"vaapste";a:0:{}s:4:"vega";a:0:{}s:9:"vegarshei";a:0:{}s:16:"xn--vegrshei-c0a";a:0:{}s:8:"vennesla";a:0:{}s:6:"verdal";a:0:{}s:6:"verran";a:0:{}s:6:"vestby";a:0:{}s:7:"vestnes";a:0:{}s:13:"vestre-slidre";a:0:{}s:12:"vestre-toten";a:0:{}s:9:"vestvagoy";a:0:{}s:17:"xn--vestvgy-ixa6o";a:0:{}s:9:"vevelstad";a:0:{}s:3:"vik";a:0:{}s:5:"vikna";a:0:{}s:10:"vindafjord";a:0:{}s:5:"volda";a:0:{}s:4:"voss";a:0:{}s:5:"varoy";a:0:{}s:13:"xn--vry-yla5g";a:0:{}s:5:"vagan";a:0:{}s:12:"xn--vgan-qoa";a:0:{}s:6:"voagat";a:0:{}s:6:"vagsoy";a:0:{}s:14:"xn--vgsy-qoa0j";a:0:{}s:4:"vaga";a:0:{}s:11:"xn--vg-yiab";a:0:{}s:7:"ostfold";a:1:{s:5:"valer";a:0:{}}s:14:"xn--stfold-9xa";a:1:{s:12:"xn--vler-qoa";a:0:{}}s:2:"co";a:0:{}s:8:"blogspot";a:0:{}}s:2:"np";a:1:{s:1:"*";a:0:{}}s:2:"nr";a:7:{s:3:"biz";a:0:{}s:4:"info";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"com";a:0:{}}s:2:"nu";a:4:{s:8:"merseine";a:0:{}s:4:"mine";a:0:{}s:8:"shacknet";a:0:{}s:3:"nom";a:0:{}}s:2:"nz";a:17:{s:2:"ac";a:0:{}s:2:"co";a:1:{s:8:"blogspot";a:0:{}}s:3:"cri";a:0:{}s:4:"geek";a:0:{}s:3:"gen";a:0:{}s:4:"govt";a:0:{}s:6:"health";a:0:{}s:3:"iwi";a:0:{}s:4:"kiwi";a:0:{}s:5:"maori";a:0:{}s:3:"mil";a:0:{}s:12:"xn--mori-qsa";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:10:"parliament";a:0:{}s:6:"school";a:0:{}s:3:"nym";a:0:{}}s:2:"om";a:9:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"med";a:0:{}s:6:"museum";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"pro";a:0:{}}s:5:"onion";a:0:{}s:3:"org";a:99:{s:5:"amune";a:1:{s:4:"tele";a:0:{}}s:8:"pimienta";a:0:{}s:7:"poivron";a:0:{}s:7:"potager";a:0:{}s:11:"sweetpepper";a:0:{}s:2:"ae";a:0:{}s:2:"us";a:0:{}s:7:"certmgr";a:0:{}s:5:"cdn77";a:2:{s:1:"c";a:0:{}s:3:"rsc";a:0:{}}s:12:"cdn77-secure";a:1:{s:6:"origin";a:1:{s:3:"ssl";a:0:{}}}s:7:"cloudns";a:0:{}s:7:"duckdns";a:0:{}s:4:"tunk";a:0:{}s:6:"dyndns";a:2:{s:2:"go";a:0:{}s:4:"home";a:0:{}}s:7:"blogdns";a:0:{}s:8:"blogsite";a:0:{}s:18:"boldlygoingnowhere";a:0:{}s:8:"dnsalias";a:0:{}s:7:"dnsdojo";a:0:{}s:11:"doesntexist";a:0:{}s:9:"dontexist";a:0:{}s:7:"doomdns";a:0:{}s:6:"dvrdns";a:0:{}s:8:"dynalias";a:0:{}s:13:"endofinternet";a:0:{}s:16:"endoftheinternet";a:0:{}s:7:"from-me";a:0:{}s:9:"game-host";a:0:{}s:6:"gotdns";a:0:{}s:10:"hobby-site";a:0:{}s:7:"homedns";a:0:{}s:7:"homeftp";a:0:{}s:9:"homelinux";a:0:{}s:8:"homeunix";a:0:{}s:14:"is-a-bruinsfan";a:0:{}s:14:"is-a-candidate";a:0:{}s:15:"is-a-celticsfan";a:0:{}s:9:"is-a-chef";a:0:{}s:9:"is-a-geek";a:0:{}s:11:"is-a-knight";a:0:{}s:15:"is-a-linux-user";a:0:{}s:12:"is-a-patsfan";a:0:{}s:11:"is-a-soxfan";a:0:{}s:8:"is-found";a:0:{}s:7:"is-lost";a:0:{}s:8:"is-saved";a:0:{}s:11:"is-very-bad";a:0:{}s:12:"is-very-evil";a:0:{}s:12:"is-very-good";a:0:{}s:12:"is-very-nice";a:0:{}s:13:"is-very-sweet";a:0:{}s:8:"isa-geek";a:0:{}s:9:"kicks-ass";a:0:{}s:11:"misconfused";a:0:{}s:7:"podzone";a:0:{}s:10:"readmyblog";a:0:{}s:6:"selfip";a:0:{}s:13:"sellsyourhome";a:0:{}s:8:"servebbs";a:0:{}s:8:"serveftp";a:0:{}s:9:"servegame";a:0:{}s:12:"stuff-4-sale";a:0:{}s:6:"webhop";a:0:{}s:5:"ddnss";a:0:{}s:9:"accesscam";a:0:{}s:6:"camdvr";a:0:{}s:8:"freeddns";a:0:{}s:6:"mywire";a:0:{}s:11:"webredirect";a:0:{}s:2:"eu";a:55:{s:2:"al";a:0:{}s:4:"asso";a:0:{}s:2:"at";a:0:{}s:2:"au";a:0:{}s:2:"be";a:0:{}s:2:"bg";a:0:{}s:2:"ca";a:0:{}s:2:"cd";a:0:{}s:2:"ch";a:0:{}s:2:"cn";a:0:{}s:2:"cy";a:0:{}s:2:"cz";a:0:{}s:2:"de";a:0:{}s:2:"dk";a:0:{}s:3:"edu";a:0:{}s:2:"ee";a:0:{}s:2:"es";a:0:{}s:2:"fi";a:0:{}s:2:"fr";a:0:{}s:2:"gr";a:0:{}s:2:"hr";a:0:{}s:2:"hu";a:0:{}s:2:"ie";a:0:{}s:2:"il";a:0:{}s:2:"in";a:0:{}s:3:"int";a:0:{}s:2:"is";a:0:{}s:2:"it";a:0:{}s:2:"jp";a:0:{}s:2:"kr";a:0:{}s:2:"lt";a:0:{}s:2:"lu";a:0:{}s:2:"lv";a:0:{}s:2:"mc";a:0:{}s:2:"me";a:0:{}s:2:"mk";a:0:{}s:2:"mt";a:0:{}s:2:"my";a:0:{}s:3:"net";a:0:{}s:2:"ng";a:0:{}s:2:"nl";a:0:{}s:2:"no";a:0:{}s:2:"nz";a:0:{}s:5:"paris";a:0:{}s:2:"pl";a:0:{}s:2:"pt";a:0:{}s:3:"q-a";a:0:{}s:2:"ro";a:0:{}s:2:"ru";a:0:{}s:2:"se";a:0:{}s:2:"si";a:0:{}s:2:"sk";a:0:{}s:2:"tr";a:0:{}s:2:"uk";a:0:{}s:2:"us";a:0:{}}s:6:"twmail";a:0:{}s:16:"fedorainfracloud";a:0:{}s:12:"fedorapeople";a:0:{}s:13:"fedoraproject";a:1:{s:5:"cloud";a:0:{}}s:8:"hepforge";a:0:{}s:2:"js";a:0:{}s:14:"bmoattachments";a:0:{}s:11:"cable-modem";a:0:{}s:10:"collegefan";a:0:{}s:16:"couchpotatofries";a:0:{}s:6:"mlbfan";a:0:{}s:16:"mysecuritycamera";a:0:{}s:6:"nflfan";a:0:{}s:10:"read-books";a:0:{}s:6:"ufcfan";a:0:{}s:5:"hopto";a:0:{}s:5:"myftp";a:0:{}s:5:"no-ip";a:0:{}s:5:"zapto";a:0:{}s:11:"my-firewall";a:0:{}s:10:"myfirewall";a:0:{}s:5:"spdns";a:0:{}s:7:"dsmynas";a:0:{}s:8:"familyds";a:0:{}s:9:"tuxfamily";a:0:{}s:11:"diskstation";a:0:{}s:2:"hk";a:0:{}s:7:"wmflabs";a:0:{}s:2:"za";a:0:{}}s:2:"pa";a:11:{s:2:"ac";a:0:{}s:3:"gob";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"sld";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"ing";a:0:{}s:3:"abo";a:0:{}s:3:"med";a:0:{}s:3:"nom";a:0:{}}s:2:"pe";a:9:{s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:3:"nom";a:0:{}s:3:"mil";a:0:{}s:3:"org";a:0:{}s:3:"com";a:0:{}s:3:"net";a:0:{}s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"pf";a:3:{s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}}s:2:"pg";a:1:{s:1:"*";a:0:{}}s:2:"ph";a:8:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"ngo";a:0:{}s:3:"mil";a:0:{}s:1:"i";a:0:{}}s:2:"pk";a:14:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}s:3:"org";a:0:{}s:3:"fam";a:0:{}s:3:"biz";a:0:{}s:3:"web";a:0:{}s:3:"gov";a:0:{}s:3:"gob";a:0:{}s:3:"gok";a:0:{}s:3:"gon";a:0:{}s:3:"gop";a:0:{}s:3:"gos";a:0:{}s:4:"info";a:0:{}}s:2:"pl";a:166:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"aid";a:0:{}s:4:"agro";a:0:{}s:3:"atm";a:0:{}s:4:"auto";a:0:{}s:3:"biz";a:0:{}s:3:"edu";a:0:{}s:5:"gmina";a:0:{}s:3:"gsm";a:0:{}s:4:"info";a:0:{}s:4:"mail";a:0:{}s:6:"miasta";a:0:{}s:5:"media";a:0:{}s:3:"mil";a:0:{}s:13:"nieruchomosci";a:0:{}s:3:"nom";a:0:{}s:2:"pc";a:0:{}s:6:"powiat";a:0:{}s:4:"priv";a:0:{}s:10:"realestate";a:0:{}s:3:"rel";a:0:{}s:3:"sex";a:0:{}s:4:"shop";a:0:{}s:5:"sklep";a:0:{}s:3:"sos";a:0:{}s:6:"szkola";a:0:{}s:5:"targi";a:0:{}s:2:"tm";a:0:{}s:7:"tourism";a:0:{}s:6:"travel";a:0:{}s:9:"turystyka";a:0:{}s:3:"gov";a:47:{s:2:"ap";a:0:{}s:2:"ic";a:0:{}s:2:"is";a:0:{}s:2:"us";a:0:{}s:5:"kmpsp";a:0:{}s:5:"kppsp";a:0:{}s:5:"kwpsp";a:0:{}s:3:"psp";a:0:{}s:4:"wskr";a:0:{}s:3:"kwp";a:0:{}s:2:"mw";a:0:{}s:2:"ug";a:0:{}s:2:"um";a:0:{}s:4:"umig";a:0:{}s:4:"ugim";a:0:{}s:4:"upow";a:0:{}s:2:"uw";a:0:{}s:9:"starostwo";a:0:{}s:2:"pa";a:0:{}s:2:"po";a:0:{}s:4:"psse";a:0:{}s:3:"pup";a:0:{}s:4:"rzgw";a:0:{}s:2:"sa";a:0:{}s:2:"so";a:0:{}s:2:"sr";a:0:{}s:3:"wsa";a:0:{}s:3:"sko";a:0:{}s:3:"uzs";a:0:{}s:4:"wiih";a:0:{}s:4:"winb";a:0:{}s:4:"pinb";a:0:{}s:4:"wios";a:0:{}s:4:"witd";a:0:{}s:6:"wzmiuw";a:0:{}s:3:"piw";a:0:{}s:3:"wiw";a:0:{}s:4:"griw";a:0:{}s:3:"wif";a:0:{}s:3:"oum";a:0:{}s:3:"sdn";a:0:{}s:2:"zp";a:0:{}s:4:"uppo";a:0:{}s:3:"mup";a:0:{}s:4:"wuoz";a:0:{}s:8:"konsulat";a:0:{}s:4:"oirm";a:0:{}}s:8:"augustow";a:0:{}s:10:"babia-gora";a:0:{}s:6:"bedzin";a:0:{}s:7:"beskidy";a:0:{}s:10:"bialowieza";a:0:{}s:9:"bialystok";a:0:{}s:7:"bielawa";a:0:{}s:10:"bieszczady";a:0:{}s:11:"boleslawiec";a:0:{}s:9:"bydgoszcz";a:0:{}s:5:"bytom";a:0:{}s:7:"cieszyn";a:0:{}s:7:"czeladz";a:0:{}s:5:"czest";a:0:{}s:9:"dlugoleka";a:0:{}s:6:"elblag";a:0:{}s:3:"elk";a:0:{}s:6:"glogow";a:0:{}s:7:"gniezno";a:0:{}s:7:"gorlice";a:0:{}s:7:"grajewo";a:0:{}s:5:"ilawa";a:0:{}s:8:"jaworzno";a:0:{}s:12:"jelenia-gora";a:0:{}s:5:"jgora";a:0:{}s:6:"kalisz";a:0:{}s:15:"kazimierz-dolny";a:0:{}s:7:"karpacz";a:0:{}s:7:"kartuzy";a:0:{}s:7:"kaszuby";a:0:{}s:8:"katowice";a:0:{}s:5:"kepno";a:0:{}s:7:"ketrzyn";a:0:{}s:7:"klodzko";a:0:{}s:10:"kobierzyce";a:0:{}s:9:"kolobrzeg";a:0:{}s:5:"konin";a:0:{}s:10:"konskowola";a:0:{}s:5:"kutno";a:0:{}s:4:"lapy";a:0:{}s:6:"lebork";a:0:{}s:7:"legnica";a:0:{}s:7:"lezajsk";a:0:{}s:8:"limanowa";a:0:{}s:5:"lomza";a:0:{}s:6:"lowicz";a:0:{}s:5:"lubin";a:0:{}s:5:"lukow";a:0:{}s:7:"malbork";a:0:{}s:10:"malopolska";a:0:{}s:8:"mazowsze";a:0:{}s:6:"mazury";a:0:{}s:6:"mielec";a:0:{}s:6:"mielno";a:0:{}s:7:"mragowo";a:0:{}s:5:"naklo";a:0:{}s:8:"nowaruda";a:0:{}s:4:"nysa";a:0:{}s:5:"olawa";a:0:{}s:6:"olecko";a:0:{}s:6:"olkusz";a:0:{}s:7:"olsztyn";a:0:{}s:7:"opoczno";a:0:{}s:5:"opole";a:0:{}s:7:"ostroda";a:0:{}s:9:"ostroleka";a:0:{}s:9:"ostrowiec";a:0:{}s:10:"ostrowwlkp";a:0:{}s:4:"pila";a:0:{}s:4:"pisz";a:0:{}s:7:"podhale";a:0:{}s:8:"podlasie";a:0:{}s:9:"polkowice";a:0:{}s:7:"pomorze";a:0:{}s:9:"pomorskie";a:0:{}s:10:"prochowice";a:0:{}s:8:"pruszkow";a:0:{}s:9:"przeworsk";a:0:{}s:6:"pulawy";a:0:{}s:5:"radom";a:0:{}s:8:"rawa-maz";a:0:{}s:6:"rybnik";a:0:{}s:7:"rzeszow";a:0:{}s:5:"sanok";a:0:{}s:5:"sejny";a:0:{}s:5:"slask";a:0:{}s:6:"slupsk";a:0:{}s:9:"sosnowiec";a:0:{}s:12:"stalowa-wola";a:0:{}s:7:"skoczow";a:0:{}s:12:"starachowice";a:0:{}s:8:"stargard";a:0:{}s:7:"suwalki";a:0:{}s:8:"swidnica";a:0:{}s:10:"swiebodzin";a:0:{}s:11:"swinoujscie";a:0:{}s:8:"szczecin";a:0:{}s:8:"szczytno";a:0:{}s:10:"tarnobrzeg";a:0:{}s:5:"tgory";a:0:{}s:5:"turek";a:0:{}s:5:"tychy";a:0:{}s:5:"ustka";a:0:{}s:9:"walbrzych";a:0:{}s:6:"warmia";a:0:{}s:8:"warszawa";a:0:{}s:3:"waw";a:0:{}s:6:"wegrow";a:0:{}s:6:"wielun";a:0:{}s:5:"wlocl";a:0:{}s:9:"wloclawek";a:0:{}s:9:"wodzislaw";a:0:{}s:7:"wolomin";a:0:{}s:7:"wroclaw";a:0:{}s:9:"zachpomor";a:0:{}s:5:"zagan";a:0:{}s:5:"zarow";a:0:{}s:5:"zgora";a:0:{}s:9:"zgorzelec";a:0:{}s:4:"beep";a:0:{}s:2:"co";a:0:{}s:3:"art";a:0:{}s:7:"gliwice";a:0:{}s:6:"krakow";a:0:{}s:6:"poznan";a:0:{}s:4:"wroc";a:0:{}s:8:"zakopane";a:0:{}s:3:"gda";a:0:{}s:6:"gdansk";a:0:{}s:6:"gdynia";a:0:{}s:3:"med";a:0:{}s:5:"sopot";a:0:{}}s:2:"pm";a:0:{}s:2:"pn";a:5:{s:3:"gov";a:0:{}s:2:"co";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}}s:4:"post";a:0:{}s:2:"pr";a:13:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:4:"isla";a:0:{}s:3:"pro";a:0:{}s:3:"biz";a:0:{}s:4:"info";a:0:{}s:4:"name";a:0:{}s:3:"est";a:0:{}s:4:"prof";a:0:{}s:2:"ac";a:0:{}}s:3:"pro";a:12:{s:3:"aaa";a:0:{}s:3:"aca";a:0:{}s:4:"acct";a:0:{}s:6:"avocat";a:0:{}s:3:"bar";a:0:{}s:3:"cpa";a:0:{}s:3:"eng";a:0:{}s:3:"jur";a:0:{}s:3:"law";a:0:{}s:3:"med";a:0:{}s:5:"recht";a:0:{}s:7:"cloudns";a:0:{}}s:2:"ps";a:7:{s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"sec";a:0:{}s:3:"plo";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}}s:2:"pt";a:10:{s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"int";a:0:{}s:4:"publ";a:0:{}s:3:"com";a:0:{}s:4:"nome";a:0:{}s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"pw";a:8:{s:2:"co";a:0:{}s:2:"ne";a:0:{}s:2:"or";a:0:{}s:2:"ed";a:0:{}s:2:"go";a:0:{}s:5:"belau";a:0:{}s:7:"cloudns";a:0:{}s:3:"nom";a:0:{}}s:2:"py";a:7:{s:3:"com";a:0:{}s:4:"coop";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"qa";a:10:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sch";a:0:{}s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"re";a:4:{s:4:"asso";a:0:{}s:3:"com";a:0:{}s:3:"nom";a:0:{}s:8:"blogspot";a:0:{}}s:2:"ro";a:13:{s:4:"arts";a:0:{}s:3:"com";a:0:{}s:4:"firm";a:0:{}s:4:"info";a:0:{}s:3:"nom";a:0:{}s:2:"nt";a:0:{}s:3:"org";a:0:{}s:3:"rec";a:0:{}s:5:"store";a:0:{}s:2:"tm";a:0:{}s:3:"www";a:0:{}s:4:"shop";a:0:{}s:8:"blogspot";a:0:{}}s:2:"rs";a:8:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:2:"in";a:0:{}s:3:"org";a:0:{}s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"ru";a:30:{s:2:"ac";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:4:"test";a:0:{}s:7:"adygeya";a:0:{}s:9:"bashkiria";a:0:{}s:3:"bir";a:0:{}s:3:"cbg";a:0:{}s:3:"com";a:0:{}s:8:"dagestan";a:0:{}s:6:"grozny";a:0:{}s:8:"kalmykia";a:0:{}s:8:"kustanai";a:0:{}s:6:"marine";a:0:{}s:8:"mordovia";a:0:{}s:3:"msk";a:0:{}s:5:"mytis";a:0:{}s:7:"nalchik";a:0:{}s:3:"nov";a:0:{}s:10:"pyatigorsk";a:0:{}s:3:"spb";a:0:{}s:11:"vladikavkaz";a:0:{}s:8:"vladimir";a:0:{}s:8:"blogspot";a:0:{}s:7:"cldmail";a:1:{s:2:"hb";a:0:{}}s:3:"net";a:0:{}s:3:"org";a:0:{}s:2:"pp";a:0:{}}s:2:"rw";a:9:{s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}s:2:"ac";a:0:{}s:3:"com";a:0:{}s:2:"co";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:4:"gouv";a:0:{}}s:2:"sa";a:8:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"med";a:0:{}s:3:"pub";a:0:{}s:3:"edu";a:0:{}s:3:"sch";a:0:{}}s:2:"sb";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"sc";a:5:{s:3:"com";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}}s:2:"sd";a:8:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"med";a:0:{}s:2:"tv";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}}s:2:"se";a:41:{s:1:"a";a:0:{}s:2:"ac";a:0:{}s:1:"b";a:0:{}s:2:"bd";a:0:{}s:5:"brand";a:0:{}s:1:"c";a:0:{}s:1:"d";a:0:{}s:1:"e";a:0:{}s:1:"f";a:0:{}s:2:"fh";a:0:{}s:4:"fhsk";a:0:{}s:3:"fhv";a:0:{}s:1:"g";a:0:{}s:1:"h";a:0:{}s:1:"i";a:0:{}s:1:"k";a:0:{}s:7:"komforb";a:0:{}s:15:"kommunalforbund";a:0:{}s:6:"komvux";a:0:{}s:1:"l";a:0:{}s:6:"lanbib";a:0:{}s:1:"m";a:0:{}s:1:"n";a:0:{}s:14:"naturbruksgymn";a:0:{}s:1:"o";a:0:{}s:3:"org";a:0:{}s:1:"p";a:0:{}s:5:"parti";a:0:{}s:2:"pp";a:0:{}s:5:"press";a:0:{}s:1:"r";a:0:{}s:1:"s";a:0:{}s:1:"t";a:0:{}s:2:"tm";a:0:{}s:1:"u";a:0:{}s:1:"w";a:0:{}s:1:"x";a:0:{}s:1:"y";a:0:{}s:1:"z";a:0:{}s:3:"com";a:0:{}s:8:"blogspot";a:0:{}}s:2:"sg";a:7:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:3:"per";a:0:{}s:8:"blogspot";a:0:{}}s:2:"sh";a:9:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}s:3:"mil";a:0:{}s:8:"hashbang";a:0:{}s:8:"platform";a:1:{s:1:"*";a:0:{}}s:8:"wedeploy";a:0:{}s:3:"now";a:0:{}}s:2:"si";a:2:{s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"sj";a:0:{}s:2:"sk";a:2:{s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"sl";a:5:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"org";a:0:{}}s:2:"sm";a:0:{}s:2:"sn";a:8:{s:3:"art";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:4:"gouv";a:0:{}s:3:"org";a:0:{}s:5:"perso";a:0:{}s:4:"univ";a:0:{}s:8:"blogspot";a:0:{}}s:2:"so";a:3:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"sr";a:0:{}s:2:"st";a:12:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:9:"consulado";a:0:{}s:3:"edu";a:0:{}s:9:"embaixada";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:8:"principe";a:0:{}s:7:"saotome";a:0:{}s:5:"store";a:0:{}}s:2:"su";a:53:{s:8:"abkhazia";a:0:{}s:7:"adygeya";a:0:{}s:10:"aktyubinsk";a:0:{}s:11:"arkhangelsk";a:0:{}s:7:"armenia";a:0:{}s:8:"ashgabad";a:0:{}s:10:"azerbaijan";a:0:{}s:8:"balashov";a:0:{}s:9:"bashkiria";a:0:{}s:7:"bryansk";a:0:{}s:7:"bukhara";a:0:{}s:8:"chimkent";a:0:{}s:8:"dagestan";a:0:{}s:15:"east-kazakhstan";a:0:{}s:5:"exnet";a:0:{}s:7:"georgia";a:0:{}s:6:"grozny";a:0:{}s:7:"ivanovo";a:0:{}s:6:"jambyl";a:0:{}s:8:"kalmykia";a:0:{}s:6:"kaluga";a:0:{}s:7:"karacol";a:0:{}s:9:"karaganda";a:0:{}s:7:"karelia";a:0:{}s:9:"khakassia";a:0:{}s:9:"krasnodar";a:0:{}s:6:"kurgan";a:0:{}s:8:"kustanai";a:0:{}s:5:"lenug";a:0:{}s:10:"mangyshlak";a:0:{}s:8:"mordovia";a:0:{}s:3:"msk";a:0:{}s:8:"murmansk";a:0:{}s:7:"nalchik";a:0:{}s:5:"navoi";a:0:{}s:16:"north-kazakhstan";a:0:{}s:3:"nov";a:0:{}s:7:"obninsk";a:0:{}s:5:"penza";a:0:{}s:8:"pokrovsk";a:0:{}s:5:"sochi";a:0:{}s:3:"spb";a:0:{}s:8:"tashkent";a:0:{}s:6:"termez";a:0:{}s:9:"togliatti";a:0:{}s:7:"troitsk";a:0:{}s:11:"tselinograd";a:0:{}s:4:"tula";a:0:{}s:4:"tuva";a:0:{}s:11:"vladikavkaz";a:0:{}s:8:"vladimir";a:0:{}s:7:"vologda";a:0:{}s:3:"nym";a:0:{}}s:2:"sv";a:5:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gob";a:0:{}s:3:"org";a:0:{}s:3:"red";a:0:{}}s:2:"sx";a:2:{s:3:"gov";a:0:{}s:3:"nym";a:0:{}}s:2:"sy";a:6:{s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}}s:2:"sz";a:3:{s:2:"co";a:0:{}s:2:"ac";a:0:{}s:3:"org";a:0:{}}s:2:"tc";a:0:{}s:2:"td";a:1:{s:8:"blogspot";a:0:{}}s:3:"tel";a:0:{}s:2:"tf";a:0:{}s:2:"tg";a:0:{}s:2:"th";a:7:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"go";a:0:{}s:2:"in";a:0:{}s:2:"mi";a:0:{}s:3:"net";a:0:{}s:2:"or";a:0:{}}s:2:"tj";a:15:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:2:"go";a:0:{}s:3:"gov";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:4:"name";a:0:{}s:3:"net";a:0:{}s:3:"nic";a:0:{}s:3:"org";a:0:{}s:4:"test";a:0:{}s:3:"web";a:0:{}}s:2:"tk";a:0:{}s:2:"tl";a:1:{s:3:"gov";a:0:{}}s:2:"tm";a:8:{s:3:"com";a:0:{}s:2:"co";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"nom";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"edu";a:0:{}}s:2:"tn";a:20:{s:3:"com";a:0:{}s:3:"ens";a:0:{}s:3:"fin";a:0:{}s:3:"gov";a:0:{}s:3:"ind";a:0:{}s:4:"intl";a:0:{}s:3:"nat";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:4:"info";a:0:{}s:5:"perso";a:0:{}s:7:"tourism";a:0:{}s:6:"edunet";a:0:{}s:4:"rnrt";a:0:{}s:3:"rns";a:0:{}s:3:"rnu";a:0:{}s:6:"mincom";a:0:{}s:7:"agrinet";a:0:{}s:7:"defense";a:0:{}s:5:"turen";a:0:{}}s:2:"to";a:7:{s:3:"com";a:0:{}s:3:"gov";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"mil";a:0:{}s:7:"vpnplus";a:0:{}}s:2:"tr";a:21:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:4:"info";a:0:{}s:3:"biz";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"web";a:0:{}s:3:"gen";a:0:{}s:2:"tv";a:0:{}s:2:"av";a:0:{}s:2:"dr";a:0:{}s:3:"bbs";a:0:{}s:4:"name";a:0:{}s:3:"tel";a:0:{}s:3:"gov";a:0:{}s:3:"bel";a:0:{}s:3:"pol";a:0:{}s:3:"mil";a:0:{}s:3:"k12";a:0:{}s:3:"edu";a:0:{}s:3:"kep";a:0:{}s:2:"nc";a:1:{s:3:"gov";a:0:{}}}s:6:"travel";a:0:{}s:2:"tt";a:17:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:3:"net";a:0:{}s:3:"biz";a:0:{}s:4:"info";a:0:{}s:3:"pro";a:0:{}s:3:"int";a:0:{}s:4:"coop";a:0:{}s:4:"jobs";a:0:{}s:4:"mobi";a:0:{}s:6:"travel";a:0:{}s:6:"museum";a:0:{}s:4:"aero";a:0:{}s:4:"name";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}}s:2:"tv";a:4:{s:6:"dyndns";a:0:{}s:11:"better-than";a:0:{}s:10:"on-the-web";a:0:{}s:10:"worse-than";a:0:{}}s:2:"tw";a:16:{s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"com";a:1:{s:8:"mymailer";a:0:{}}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"idv";a:0:{}s:4:"game";a:0:{}s:4:"ebiz";a:0:{}s:4:"club";a:0:{}s:12:"xn--zf0ao64a";a:0:{}s:10:"xn--uc0atv";a:0:{}s:11:"xn--czrw28b";a:0:{}s:3:"url";a:0:{}s:8:"blogspot";a:0:{}s:3:"nym";a:0:{}}s:2:"tz";a:12:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:2:"go";a:0:{}s:5:"hotel";a:0:{}s:4:"info";a:0:{}s:2:"me";a:0:{}s:3:"mil";a:0:{}s:4:"mobi";a:0:{}s:2:"ne";a:0:{}s:2:"or";a:0:{}s:2:"sc";a:0:{}s:2:"tv";a:0:{}}s:2:"ua";a:82:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:2:"in";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:9:"cherkassy";a:0:{}s:8:"cherkasy";a:0:{}s:9:"chernigov";a:0:{}s:9:"chernihiv";a:0:{}s:10:"chernivtsi";a:0:{}s:10:"chernovtsy";a:0:{}s:2:"ck";a:0:{}s:2:"cn";a:0:{}s:2:"cr";a:0:{}s:6:"crimea";a:0:{}s:2:"cv";a:0:{}s:2:"dn";a:0:{}s:14:"dnepropetrovsk";a:0:{}s:14:"dnipropetrovsk";a:0:{}s:7:"dominic";a:0:{}s:7:"donetsk";a:0:{}s:2:"dp";a:0:{}s:2:"if";a:0:{}s:15:"ivano-frankivsk";a:0:{}s:2:"kh";a:0:{}s:7:"kharkiv";a:0:{}s:7:"kharkov";a:0:{}s:7:"kherson";a:0:{}s:12:"khmelnitskiy";a:0:{}s:12:"khmelnytskyi";a:0:{}s:4:"kiev";a:0:{}s:10:"kirovograd";a:0:{}s:2:"km";a:0:{}s:2:"kr";a:0:{}s:4:"krym";a:0:{}s:2:"ks";a:0:{}s:2:"kv";a:0:{}s:4:"kyiv";a:0:{}s:2:"lg";a:0:{}s:2:"lt";a:0:{}s:7:"lugansk";a:0:{}s:5:"lutsk";a:0:{}s:2:"lv";a:0:{}s:4:"lviv";a:0:{}s:2:"mk";a:0:{}s:8:"mykolaiv";a:0:{}s:8:"nikolaev";a:0:{}s:2:"od";a:0:{}s:5:"odesa";a:0:{}s:6:"odessa";a:0:{}s:2:"pl";a:0:{}s:7:"poltava";a:0:{}s:5:"rivne";a:0:{}s:5:"rovno";a:0:{}s:2:"rv";a:0:{}s:2:"sb";a:0:{}s:10:"sebastopol";a:0:{}s:10:"sevastopol";a:0:{}s:2:"sm";a:0:{}s:4:"sumy";a:0:{}s:2:"te";a:0:{}s:8:"ternopil";a:0:{}s:2:"uz";a:0:{}s:8:"uzhgorod";a:0:{}s:7:"vinnica";a:0:{}s:9:"vinnytsia";a:0:{}s:2:"vn";a:0:{}s:5:"volyn";a:0:{}s:5:"yalta";a:0:{}s:11:"zaporizhzhe";a:0:{}s:12:"zaporizhzhia";a:0:{}s:8:"zhitomir";a:0:{}s:8:"zhytomyr";a:0:{}s:2:"zp";a:0:{}s:2:"zt";a:0:{}s:2:"cc";a:0:{}s:3:"inf";a:0:{}s:3:"ltd";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:2:"pp";a:0:{}}s:2:"ug";a:10:{s:2:"co";a:0:{}s:2:"or";a:0:{}s:2:"ac";a:0:{}s:2:"sc";a:0:{}s:2:"go";a:0:{}s:2:"ne";a:0:{}s:3:"com";a:0:{}s:3:"org";a:0:{}s:8:"blogspot";a:0:{}s:3:"nom";a:0:{}}s:2:"uk";a:11:{s:2:"ac";a:0:{}s:2:"co";a:3:{s:8:"blogspot";a:0:{}s:5:"no-ip";a:0:{}s:13:"wellbeingzone";a:0:{}}s:3:"gov";a:2:{s:7:"service";a:0:{}s:10:"homeoffice";a:0:{}}s:3:"ltd";a:0:{}s:2:"me";a:0:{}s:3:"net";a:0:{}s:3:"nhs";a:0:{}s:3:"org";a:0:{}s:3:"plc";a:0:{}s:6:"police";a:0:{}s:3:"sch";a:1:{s:1:"*";a:0:{}}}s:2:"us";a:68:{s:3:"dni";a:0:{}s:3:"fed";a:0:{}s:3:"isa";a:0:{}s:4:"kids";a:0:{}s:3:"nsn";a:0:{}s:2:"ak";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"al";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ar";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"as";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"az";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ca";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"co";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ct";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"dc";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"de";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"fl";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ga";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"gu";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"hi";a:2:{s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ia";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"id";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"il";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"in";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ks";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ky";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"la";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ma";a:3:{s:3:"k12";a:3:{s:3:"pvt";a:0:{}s:4:"chtr";a:0:{}s:6:"paroch";a:0:{}}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"md";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"me";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"mi";a:11:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}s:9:"ann-arbor";a:0:{}s:3:"cog";a:0:{}s:3:"dst";a:0:{}s:5:"eaton";a:0:{}s:3:"gen";a:0:{}s:3:"mus";a:0:{}s:3:"tec";a:0:{}s:9:"washtenaw";a:0:{}}s:2:"mn";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"mo";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ms";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"mt";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nc";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nd";a:2:{s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ne";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nh";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nj";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nm";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"nv";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ny";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"oh";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ok";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"or";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"pa";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"pr";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ri";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"sc";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"sd";a:2:{s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"tn";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"tx";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"ut";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"vi";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"vt";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"va";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"wa";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"wi";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:2:"wv";a:1:{s:2:"cc";a:0:{}}s:2:"wy";a:3:{s:3:"k12";a:0:{}s:2:"cc";a:0:{}s:3:"lib";a:0:{}}s:7:"cloudns";a:0:{}s:4:"drud";a:0:{}s:5:"is-by";a:0:{}s:11:"land-4-sale";a:0:{}s:12:"stuff-4-sale";a:0:{}s:7:"golffan";a:0:{}s:4:"noip";a:0:{}s:7:"pointto";a:0:{}}s:2:"uy";a:7:{s:3:"com";a:1:{s:8:"blogspot";a:0:{}}s:3:"edu";a:0:{}s:3:"gub";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"nom";a:0:{}}s:2:"uz";a:4:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"va";a:0:{}s:2:"vc";a:7:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"edu";a:0:{}s:3:"nom";a:0:{}}s:2:"ve";a:17:{s:4:"arts";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"e12";a:0:{}s:3:"edu";a:0:{}s:4:"firm";a:0:{}s:3:"gob";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"int";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"rec";a:0:{}s:5:"store";a:0:{}s:3:"tec";a:0:{}s:3:"web";a:0:{}}s:2:"vg";a:1:{s:3:"nom";a:0:{}}s:2:"vi";a:5:{s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"k12";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"vn";a:13:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:3:"int";a:0:{}s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:4:"info";a:0:{}s:4:"name";a:0:{}s:3:"pro";a:0:{}s:6:"health";a:0:{}s:8:"blogspot";a:0:{}}s:2:"vu";a:4:{s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}}s:2:"wf";a:0:{}s:2:"ws";a:8:{s:3:"com";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"gov";a:0:{}s:3:"edu";a:0:{}s:7:"advisor";a:1:{s:1:"*";a:0:{}}s:6:"dyndns";a:0:{}s:6:"mypets";a:0:{}}s:2:"yt";a:0:{}s:14:"xn--mgbaam7a8h";a:0:{}s:10:"xn--y9a3aq";a:0:{}s:14:"xn--54b7fta0cc";a:0:{}s:8:"xn--90ae";a:0:{}s:9:"xn--90ais";a:0:{}s:10:"xn--fiqs8s";a:0:{}s:10:"xn--fiqz9s";a:0:{}s:15:"xn--lgbbat1ad8j";a:0:{}s:10:"xn--wgbh1c";a:0:{}s:9:"xn--e1a4c";a:0:{}s:8:"xn--node";a:0:{}s:8:"xn--qxam";a:0:{}s:11:"xn--j6w193g";a:0:{}s:11:"xn--2scrj9c";a:0:{}s:11:"xn--3hcrj9c";a:0:{}s:12:"xn--45br5cyl";a:0:{}s:14:"xn--h2breg3eve";a:0:{}s:13:"xn--h2brj9c8c";a:0:{}s:12:"xn--mgbgu82a";a:0:{}s:14:"xn--rvc1e0am3e";a:0:{}s:11:"xn--h2brj9c";a:0:{}s:14:"xn--mgbbh1a71e";a:0:{}s:13:"xn--fpcrj9c3d";a:0:{}s:11:"xn--gecrj9c";a:0:{}s:11:"xn--s9brj9c";a:0:{}s:11:"xn--45brj9c";a:0:{}s:17:"xn--xkc2dl3a5ee0h";a:0:{}s:15:"xn--mgba3a4f16a";a:0:{}s:14:"xn--mgba3a4fra";a:0:{}s:11:"xn--mgbtx2b";a:0:{}s:14:"xn--mgbayh7gpa";a:0:{}s:12:"xn--3e0b707e";a:0:{}s:11:"xn--80ao21a";a:0:{}s:13:"xn--fzc2c9e2c";a:0:{}s:16:"xn--xkc2al3hye2a";a:0:{}s:15:"xn--mgbc0a9azcg";a:0:{}s:9:"xn--d1alf";a:0:{}s:9:"xn--l1acc";a:0:{}s:11:"xn--mix891f";a:0:{}s:11:"xn--mix082f";a:0:{}s:14:"xn--mgbx4cd0ab";a:0:{}s:12:"xn--mgb9awbf";a:0:{}s:17:"xn--mgbai9azgqp6j";a:0:{}s:18:"xn--mgbai9a5eva00b";a:0:{}s:13:"xn--ygbi2ammx";a:0:{}s:10:"xn--90a3ac";a:6:{s:8:"xn--o1ac";a:0:{}s:9:"xn--c1avg";a:0:{}s:9:"xn--90azh";a:0:{}s:8:"xn--d1at";a:0:{}s:9:"xn--o1ach";a:0:{}s:8:"xn--80au";a:0:{}}s:8:"xn--p1ai";a:0:{}s:10:"xn--wgbl6a";a:0:{}s:17:"xn--mgberp4a5d4ar";a:0:{}s:19:"xn--mgberp4a5d4a87g";a:0:{}s:19:"xn--mgbqly7c0a67fbc";a:0:{}s:16:"xn--mgbqly7cvafr";a:0:{}s:12:"xn--mgbpl2fh";a:0:{}s:13:"xn--yfro4i67o";a:0:{}s:22:"xn--clchc0ea0b2g2a9gcd";a:0:{}s:12:"xn--ogbpf8fl";a:0:{}s:12:"xn--mgbtf8fl";a:0:{}s:10:"xn--o3cw4h";a:6:{s:13:"xn--12c1fe0br";a:0:{}s:16:"xn--12co0c3b4eva";a:0:{}s:13:"xn--h3cuzk1di";a:0:{}s:11:"xn--o3cyx2a";a:0:{}s:12:"xn--m3ch0j3a";a:0:{}s:15:"xn--12cfi8ixb8l";a:0:{}}s:11:"xn--pgbs0dh";a:0:{}s:11:"xn--kpry57d";a:0:{}s:11:"xn--kprw13d";a:0:{}s:11:"xn--nnx388a";a:0:{}s:9:"xn--j1amh";a:0:{}s:12:"xn--mgb2ddes";a:0:{}s:3:"xxx";a:0:{}s:2:"ye";a:1:{s:1:"*";a:0:{}}s:2:"za";a:17:{s:2:"ac";a:0:{}s:5:"agric";a:0:{}s:3:"alt";a:0:{}s:2:"co";a:1:{s:8:"blogspot";a:0:{}}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:7:"grondar";a:0:{}s:3:"law";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"ngo";a:0:{}s:3:"nis";a:0:{}s:3:"nom";a:0:{}s:3:"org";a:0:{}s:6:"school";a:0:{}s:2:"tm";a:0:{}s:3:"web";a:0:{}}s:2:"zm";a:11:{s:2:"ac";a:0:{}s:3:"biz";a:0:{}s:2:"co";a:0:{}s:3:"com";a:0:{}s:3:"edu";a:0:{}s:3:"gov";a:0:{}s:4:"info";a:0:{}s:3:"mil";a:0:{}s:3:"net";a:0:{}s:3:"org";a:0:{}s:3:"sch";a:0:{}}s:2:"zw";a:5:{s:2:"ac";a:0:{}s:2:"co";a:0:{}s:3:"gov";a:0:{}s:3:"mil";a:0:{}s:3:"org";a:0:{}}s:3:"aaa";a:0:{}s:4:"aarp";a:0:{}s:6:"abarth";a:0:{}s:3:"abb";a:0:{}s:6:"abbott";a:0:{}s:6:"abbvie";a:0:{}s:3:"abc";a:0:{}s:4:"able";a:0:{}s:7:"abogado";a:0:{}s:8:"abudhabi";a:0:{}s:7:"academy";a:0:{}s:9:"accenture";a:0:{}s:10:"accountant";a:0:{}s:11:"accountants";a:0:{}s:3:"aco";a:0:{}s:6:"active";a:0:{}s:5:"actor";a:0:{}s:4:"adac";a:0:{}s:3:"ads";a:0:{}s:5:"adult";a:0:{}s:3:"aeg";a:0:{}s:5:"aetna";a:0:{}s:14:"afamilycompany";a:0:{}s:3:"afl";a:0:{}s:6:"africa";a:0:{}s:7:"agakhan";a:0:{}s:6:"agency";a:0:{}s:3:"aig";a:0:{}s:4:"aigo";a:0:{}s:6:"airbus";a:0:{}s:8:"airforce";a:0:{}s:6:"airtel";a:0:{}s:4:"akdn";a:0:{}s:9:"alfaromeo";a:0:{}s:7:"alibaba";a:0:{}s:6:"alipay";a:0:{}s:9:"allfinanz";a:0:{}s:8:"allstate";a:0:{}s:4:"ally";a:0:{}s:6:"alsace";a:0:{}s:6:"alstom";a:0:{}s:15:"americanexpress";a:0:{}s:14:"americanfamily";a:0:{}s:4:"amex";a:0:{}s:5:"amfam";a:0:{}s:5:"amica";a:0:{}s:9:"amsterdam";a:0:{}s:9:"analytics";a:0:{}s:7:"android";a:0:{}s:6:"anquan";a:0:{}s:3:"anz";a:0:{}s:3:"aol";a:0:{}s:10:"apartments";a:0:{}s:3:"app";a:0:{}s:5:"apple";a:0:{}s:9:"aquarelle";a:0:{}s:4:"arab";a:0:{}s:6:"aramco";a:0:{}s:5:"archi";a:0:{}s:4:"army";a:0:{}s:3:"art";a:0:{}s:4:"arte";a:0:{}s:4:"asda";a:0:{}s:10:"associates";a:0:{}s:7:"athleta";a:0:{}s:8:"attorney";a:0:{}s:7:"auction";a:0:{}s:4:"audi";a:0:{}s:7:"audible";a:0:{}s:5:"audio";a:0:{}s:7:"auspost";a:0:{}s:6:"author";a:0:{}s:4:"auto";a:0:{}s:5:"autos";a:0:{}s:7:"avianca";a:0:{}s:3:"aws";a:0:{}s:3:"axa";a:0:{}s:5:"azure";a:0:{}s:4:"baby";a:0:{}s:5:"baidu";a:0:{}s:7:"banamex";a:0:{}s:14:"bananarepublic";a:0:{}s:4:"band";a:0:{}s:4:"bank";a:0:{}s:3:"bar";a:0:{}s:9:"barcelona";a:0:{}s:11:"barclaycard";a:0:{}s:8:"barclays";a:0:{}s:8:"barefoot";a:0:{}s:8:"bargains";a:0:{}s:8:"baseball";a:0:{}s:10:"basketball";a:0:{}s:7:"bauhaus";a:0:{}s:6:"bayern";a:0:{}s:3:"bbc";a:0:{}s:3:"bbt";a:0:{}s:4:"bbva";a:0:{}s:3:"bcg";a:0:{}s:3:"bcn";a:0:{}s:5:"beats";a:0:{}s:6:"beauty";a:0:{}s:4:"beer";a:0:{}s:7:"bentley";a:0:{}s:6:"berlin";a:0:{}s:4:"best";a:0:{}s:7:"bestbuy";a:0:{}s:3:"bet";a:0:{}s:6:"bharti";a:0:{}s:5:"bible";a:0:{}s:3:"bid";a:0:{}s:4:"bike";a:0:{}s:4:"bing";a:0:{}s:5:"bingo";a:0:{}s:3:"bio";a:0:{}s:5:"black";a:0:{}s:11:"blackfriday";a:0:{}s:6:"blanco";a:0:{}s:11:"blockbuster";a:0:{}s:4:"blog";a:0:{}s:9:"bloomberg";a:0:{}s:4:"blue";a:0:{}s:3:"bms";a:0:{}s:3:"bmw";a:0:{}s:3:"bnl";a:0:{}s:10:"bnpparibas";a:0:{}s:5:"boats";a:0:{}s:10:"boehringer";a:0:{}s:4:"bofa";a:0:{}s:3:"bom";a:0:{}s:4:"bond";a:0:{}s:3:"boo";a:0:{}s:4:"book";a:0:{}s:7:"booking";a:0:{}s:5:"boots";a:0:{}s:5:"bosch";a:0:{}s:6:"bostik";a:0:{}s:6:"boston";a:0:{}s:3:"bot";a:0:{}s:8:"boutique";a:0:{}s:3:"box";a:0:{}s:8:"bradesco";a:0:{}s:11:"bridgestone";a:0:{}s:8:"broadway";a:0:{}s:6:"broker";a:0:{}s:7:"brother";a:0:{}s:8:"brussels";a:0:{}s:8:"budapest";a:0:{}s:7:"bugatti";a:0:{}s:5:"build";a:0:{}s:8:"builders";a:0:{}s:8:"business";a:0:{}s:3:"buy";a:0:{}s:4:"buzz";a:0:{}s:3:"bzh";a:0:{}s:3:"cab";a:0:{}s:4:"cafe";a:0:{}s:3:"cal";a:0:{}s:4:"call";a:0:{}s:11:"calvinklein";a:0:{}s:3:"cam";a:0:{}s:6:"camera";a:0:{}s:4:"camp";a:0:{}s:14:"cancerresearch";a:0:{}s:5:"canon";a:0:{}s:8:"capetown";a:0:{}s:7:"capital";a:0:{}s:10:"capitalone";a:0:{}s:3:"car";a:0:{}s:7:"caravan";a:0:{}s:5:"cards";a:0:{}s:4:"care";a:0:{}s:6:"career";a:0:{}s:7:"careers";a:0:{}s:4:"cars";a:0:{}s:7:"cartier";a:0:{}s:4:"casa";a:0:{}s:4:"case";a:0:{}s:6:"caseih";a:0:{}s:4:"cash";a:0:{}s:6:"casino";a:0:{}s:8:"catering";a:0:{}s:8:"catholic";a:0:{}s:3:"cba";a:0:{}s:3:"cbn";a:0:{}s:4:"cbre";a:0:{}s:3:"cbs";a:0:{}s:3:"ceb";a:0:{}s:6:"center";a:0:{}s:3:"ceo";a:0:{}s:4:"cern";a:0:{}s:3:"cfa";a:0:{}s:3:"cfd";a:0:{}s:6:"chanel";a:0:{}s:7:"channel";a:0:{}s:5:"chase";a:0:{}s:4:"chat";a:0:{}s:5:"cheap";a:0:{}s:7:"chintai";a:0:{}s:5:"chloe";a:0:{}s:9:"christmas";a:0:{}s:6:"chrome";a:0:{}s:8:"chrysler";a:0:{}s:6:"church";a:0:{}s:8:"cipriani";a:0:{}s:6:"circle";a:0:{}s:5:"cisco";a:0:{}s:7:"citadel";a:0:{}s:4:"citi";a:0:{}s:5:"citic";a:0:{}s:4:"city";a:0:{}s:8:"cityeats";a:0:{}s:6:"claims";a:0:{}s:8:"cleaning";a:0:{}s:5:"click";a:0:{}s:6:"clinic";a:0:{}s:8:"clinique";a:0:{}s:8:"clothing";a:0:{}s:5:"cloud";a:6:{s:8:"myfusion";a:0:{}s:7:"statics";a:1:{s:1:"*";a:0:{}}s:11:"magentosite";a:1:{s:1:"*";a:0:{}}s:5:"vapor";a:0:{}s:10:"sensiosite";a:1:{s:1:"*";a:0:{}}s:11:"trafficplex";a:0:{}}s:4:"club";a:1:{s:7:"cloudns";a:0:{}}s:7:"clubmed";a:0:{}s:5:"coach";a:0:{}s:5:"codes";a:0:{}s:6:"coffee";a:0:{}s:7:"college";a:0:{}s:7:"cologne";a:0:{}s:7:"comcast";a:0:{}s:8:"commbank";a:0:{}s:9:"community";a:0:{}s:7:"company";a:0:{}s:7:"compare";a:0:{}s:8:"computer";a:0:{}s:6:"comsec";a:0:{}s:6:"condos";a:0:{}s:12:"construction";a:0:{}s:10:"consulting";a:0:{}s:7:"contact";a:0:{}s:11:"contractors";a:0:{}s:7:"cooking";a:0:{}s:14:"cookingchannel";a:0:{}s:4:"cool";a:1:{s:2:"de";a:0:{}}s:7:"corsica";a:0:{}s:7:"country";a:0:{}s:6:"coupon";a:0:{}s:7:"coupons";a:0:{}s:7:"courses";a:0:{}s:6:"credit";a:0:{}s:10:"creditcard";a:0:{}s:11:"creditunion";a:0:{}s:7:"cricket";a:0:{}s:5:"crown";a:0:{}s:3:"crs";a:0:{}s:6:"cruise";a:0:{}s:7:"cruises";a:0:{}s:3:"csc";a:0:{}s:10:"cuisinella";a:0:{}s:5:"cymru";a:0:{}s:4:"cyou";a:0:{}s:5:"dabur";a:0:{}s:3:"dad";a:0:{}s:5:"dance";a:0:{}s:4:"data";a:0:{}s:4:"date";a:0:{}s:6:"dating";a:0:{}s:6:"datsun";a:0:{}s:3:"day";a:0:{}s:4:"dclk";a:0:{}s:3:"dds";a:0:{}s:4:"deal";a:0:{}s:6:"dealer";a:0:{}s:5:"deals";a:0:{}s:6:"degree";a:0:{}s:8:"delivery";a:0:{}s:4:"dell";a:0:{}s:8:"deloitte";a:0:{}s:5:"delta";a:0:{}s:8:"democrat";a:0:{}s:6:"dental";a:0:{}s:7:"dentist";a:0:{}s:4:"desi";a:0:{}s:6:"design";a:0:{}s:3:"dev";a:0:{}s:3:"dhl";a:0:{}s:8:"diamonds";a:0:{}s:4:"diet";a:0:{}s:7:"digital";a:0:{}s:6:"direct";a:0:{}s:9:"directory";a:0:{}s:8:"discount";a:0:{}s:8:"discover";a:0:{}s:4:"dish";a:0:{}s:3:"diy";a:0:{}s:3:"dnp";a:0:{}s:4:"docs";a:0:{}s:6:"doctor";a:0:{}s:5:"dodge";a:0:{}s:3:"dog";a:0:{}s:4:"doha";a:0:{}s:7:"domains";a:0:{}s:3:"dot";a:0:{}s:8:"download";a:0:{}s:5:"drive";a:0:{}s:3:"dtv";a:0:{}s:5:"dubai";a:0:{}s:4:"duck";a:0:{}s:6:"dunlop";a:0:{}s:4:"duns";a:0:{}s:6:"dupont";a:0:{}s:6:"durban";a:0:{}s:4:"dvag";a:0:{}s:3:"dvr";a:0:{}s:5:"earth";a:0:{}s:3:"eat";a:0:{}s:3:"eco";a:0:{}s:5:"edeka";a:0:{}s:9:"education";a:0:{}s:5:"email";a:0:{}s:6:"emerck";a:0:{}s:6:"energy";a:0:{}s:8:"engineer";a:0:{}s:11:"engineering";a:0:{}s:11:"enterprises";a:0:{}s:5:"epost";a:0:{}s:5:"epson";a:0:{}s:9:"equipment";a:0:{}s:8:"ericsson";a:0:{}s:4:"erni";a:0:{}s:3:"esq";a:0:{}s:6:"estate";a:1:{s:7:"compute";a:1:{s:1:"*";a:0:{}}}s:8:"esurance";a:0:{}s:8:"etisalat";a:0:{}s:10:"eurovision";a:0:{}s:3:"eus";a:1:{s:5:"party";a:1:{s:4:"user";a:0:{}}}s:6:"events";a:0:{}s:8:"everbank";a:0:{}s:8:"exchange";a:0:{}s:6:"expert";a:0:{}s:7:"exposed";a:0:{}s:7:"express";a:0:{}s:10:"extraspace";a:0:{}s:4:"fage";a:0:{}s:4:"fail";a:0:{}s:9:"fairwinds";a:0:{}s:5:"faith";a:1:{s:3:"ybo";a:0:{}}s:6:"family";a:0:{}s:3:"fan";a:0:{}s:4:"fans";a:0:{}s:4:"farm";a:1:{s:5:"storj";a:0:{}}s:7:"farmers";a:0:{}s:7:"fashion";a:0:{}s:4:"fast";a:0:{}s:5:"fedex";a:0:{}s:8:"feedback";a:0:{}s:7:"ferrari";a:0:{}s:7:"ferrero";a:0:{}s:4:"fiat";a:0:{}s:8:"fidelity";a:0:{}s:4:"fido";a:0:{}s:4:"film";a:0:{}s:5:"final";a:0:{}s:7:"finance";a:0:{}s:9:"financial";a:0:{}s:4:"fire";a:0:{}s:9:"firestone";a:0:{}s:8:"firmdale";a:0:{}s:4:"fish";a:0:{}s:7:"fishing";a:0:{}s:3:"fit";a:1:{s:6:"ptplus";a:0:{}}s:7:"fitness";a:0:{}s:6:"flickr";a:0:{}s:7:"flights";a:0:{}s:4:"flir";a:0:{}s:7:"florist";a:0:{}s:7:"flowers";a:0:{}s:3:"fly";a:0:{}s:3:"foo";a:0:{}s:4:"food";a:0:{}s:11:"foodnetwork";a:0:{}s:8:"football";a:0:{}s:4:"ford";a:0:{}s:5:"forex";a:0:{}s:7:"forsale";a:0:{}s:5:"forum";a:0:{}s:10:"foundation";a:0:{}s:3:"fox";a:0:{}s:4:"free";a:0:{}s:9:"fresenius";a:0:{}s:3:"frl";a:0:{}s:7:"frogans";a:0:{}s:9:"frontdoor";a:0:{}s:8:"frontier";a:0:{}s:3:"ftr";a:0:{}s:7:"fujitsu";a:0:{}s:9:"fujixerox";a:0:{}s:3:"fun";a:0:{}s:4:"fund";a:0:{}s:9:"furniture";a:0:{}s:6:"futbol";a:0:{}s:3:"fyi";a:0:{}s:3:"gal";a:0:{}s:7:"gallery";a:0:{}s:5:"gallo";a:0:{}s:6:"gallup";a:0:{}s:4:"game";a:0:{}s:5:"games";a:0:{}s:3:"gap";a:0:{}s:6:"garden";a:0:{}s:4:"gbiz";a:0:{}s:3:"gdn";a:0:{}s:3:"gea";a:0:{}s:4:"gent";a:0:{}s:7:"genting";a:0:{}s:6:"george";a:0:{}s:4:"ggee";a:0:{}s:4:"gift";a:0:{}s:5:"gifts";a:0:{}s:5:"gives";a:0:{}s:6:"giving";a:0:{}s:5:"glade";a:0:{}s:5:"glass";a:0:{}s:3:"gle";a:0:{}s:6:"global";a:0:{}s:5:"globo";a:0:{}s:5:"gmail";a:0:{}s:4:"gmbh";a:0:{}s:3:"gmo";a:0:{}s:3:"gmx";a:0:{}s:7:"godaddy";a:0:{}s:4:"gold";a:0:{}s:9:"goldpoint";a:0:{}s:4:"golf";a:0:{}s:3:"goo";a:0:{}s:9:"goodhands";a:0:{}s:8:"goodyear";a:0:{}s:4:"goog";a:1:{s:5:"cloud";a:0:{}}s:6:"google";a:0:{}s:3:"gop";a:0:{}s:3:"got";a:0:{}s:8:"grainger";a:0:{}s:8:"graphics";a:0:{}s:6:"gratis";a:0:{}s:5:"green";a:0:{}s:5:"gripe";a:0:{}s:7:"grocery";a:0:{}s:5:"group";a:0:{}s:8:"guardian";a:0:{}s:5:"gucci";a:0:{}s:4:"guge";a:0:{}s:5:"guide";a:0:{}s:7:"guitars";a:0:{}s:4:"guru";a:0:{}s:4:"hair";a:0:{}s:7:"hamburg";a:0:{}s:7:"hangout";a:0:{}s:4:"haus";a:0:{}s:3:"hbo";a:0:{}s:4:"hdfc";a:0:{}s:8:"hdfcbank";a:0:{}s:6:"health";a:0:{}s:10:"healthcare";a:0:{}s:4:"help";a:0:{}s:8:"helsinki";a:0:{}s:4:"here";a:0:{}s:6:"hermes";a:0:{}s:4:"hgtv";a:0:{}s:6:"hiphop";a:0:{}s:9:"hisamitsu";a:0:{}s:7:"hitachi";a:0:{}s:3:"hiv";a:0:{}s:3:"hkt";a:0:{}s:6:"hockey";a:0:{}s:8:"holdings";a:0:{}s:7:"holiday";a:0:{}s:9:"homedepot";a:0:{}s:9:"homegoods";a:0:{}s:5:"homes";a:0:{}s:9:"homesense";a:0:{}s:5:"honda";a:0:{}s:9:"honeywell";a:0:{}s:5:"horse";a:0:{}s:8:"hospital";a:0:{}s:4:"host";a:2:{s:11:"cloudaccess";a:0:{}s:8:"freesite";a:0:{}}s:7:"hosting";a:1:{s:9:"opencraft";a:0:{}}s:3:"hot";a:0:{}s:7:"hoteles";a:0:{}s:6:"hotels";a:0:{}s:7:"hotmail";a:0:{}s:5:"house";a:0:{}s:3:"how";a:0:{}s:4:"hsbc";a:0:{}s:3:"htc";a:0:{}s:6:"hughes";a:0:{}s:5:"hyatt";a:0:{}s:7:"hyundai";a:0:{}s:3:"ibm";a:0:{}s:4:"icbc";a:0:{}s:3:"ice";a:0:{}s:3:"icu";a:0:{}s:4:"ieee";a:0:{}s:3:"ifm";a:0:{}s:5:"ikano";a:0:{}s:6:"imamat";a:0:{}s:4:"imdb";a:0:{}s:4:"immo";a:0:{}s:10:"immobilien";a:0:{}s:10:"industries";a:0:{}s:8:"infiniti";a:0:{}s:3:"ing";a:0:{}s:3:"ink";a:0:{}s:9:"institute";a:0:{}s:9:"insurance";a:0:{}s:6:"insure";a:0:{}s:5:"intel";a:0:{}s:13:"international";a:0:{}s:6:"intuit";a:0:{}s:11:"investments";a:0:{}s:8:"ipiranga";a:0:{}s:5:"irish";a:0:{}s:7:"iselect";a:0:{}s:7:"ismaili";a:0:{}s:3:"ist";a:0:{}s:8:"istanbul";a:0:{}s:4:"itau";a:0:{}s:3:"itv";a:0:{}s:5:"iveco";a:0:{}s:3:"iwc";a:0:{}s:6:"jaguar";a:0:{}s:4:"java";a:0:{}s:3:"jcb";a:0:{}s:3:"jcp";a:0:{}s:4:"jeep";a:0:{}s:5:"jetzt";a:0:{}s:7:"jewelry";a:0:{}s:3:"jio";a:0:{}s:3:"jlc";a:0:{}s:3:"jll";a:0:{}s:3:"jmp";a:0:{}s:3:"jnj";a:0:{}s:6:"joburg";a:0:{}s:3:"jot";a:0:{}s:3:"joy";a:0:{}s:8:"jpmorgan";a:0:{}s:4:"jprs";a:0:{}s:6:"juegos";a:0:{}s:7:"juniper";a:0:{}s:6:"kaufen";a:0:{}s:4:"kddi";a:0:{}s:11:"kerryhotels";a:0:{}s:14:"kerrylogistics";a:0:{}s:15:"kerryproperties";a:0:{}s:3:"kfh";a:0:{}s:3:"kia";a:0:{}s:3:"kim";a:0:{}s:6:"kinder";a:0:{}s:6:"kindle";a:0:{}s:7:"kitchen";a:0:{}s:4:"kiwi";a:0:{}s:5:"koeln";a:0:{}s:7:"komatsu";a:0:{}s:6:"kosher";a:0:{}s:4:"kpmg";a:0:{}s:3:"kpn";a:0:{}s:3:"krd";a:2:{s:2:"co";a:0:{}s:3:"edu";a:0:{}}s:4:"kred";a:0:{}s:9:"kuokgroup";a:0:{}s:5:"kyoto";a:0:{}s:7:"lacaixa";a:0:{}s:9:"ladbrokes";a:0:{}s:11:"lamborghini";a:0:{}s:5:"lamer";a:0:{}s:9:"lancaster";a:0:{}s:6:"lancia";a:0:{}s:7:"lancome";a:0:{}s:4:"land";a:1:{s:6:"static";a:2:{s:3:"dev";a:0:{}s:5:"sites";a:0:{}}}s:9:"landrover";a:0:{}s:7:"lanxess";a:0:{}s:7:"lasalle";a:0:{}s:3:"lat";a:0:{}s:6:"latino";a:0:{}s:7:"latrobe";a:0:{}s:3:"law";a:0:{}s:6:"lawyer";a:0:{}s:3:"lds";a:0:{}s:5:"lease";a:0:{}s:7:"leclerc";a:0:{}s:6:"lefrak";a:0:{}s:5:"legal";a:0:{}s:4:"lego";a:0:{}s:5:"lexus";a:0:{}s:4:"lgbt";a:0:{}s:7:"liaison";a:0:{}s:4:"lidl";a:0:{}s:4:"life";a:0:{}s:13:"lifeinsurance";a:0:{}s:9:"lifestyle";a:0:{}s:8:"lighting";a:0:{}s:4:"like";a:0:{}s:5:"lilly";a:0:{}s:7:"limited";a:0:{}s:4:"limo";a:0:{}s:7:"lincoln";a:0:{}s:5:"linde";a:0:{}s:4:"link";a:2:{s:4:"cyon";a:0:{}s:5:"mypep";a:0:{}}s:5:"lipsy";a:0:{}s:4:"live";a:0:{}s:6:"living";a:0:{}s:5:"lixil";a:0:{}s:4:"loan";a:0:{}s:5:"loans";a:0:{}s:6:"locker";a:0:{}s:5:"locus";a:0:{}s:4:"loft";a:0:{}s:3:"lol";a:0:{}s:6:"london";a:0:{}s:5:"lotte";a:0:{}s:5:"lotto";a:0:{}s:4:"love";a:0:{}s:3:"lpl";a:0:{}s:12:"lplfinancial";a:0:{}s:3:"ltd";a:0:{}s:4:"ltda";a:0:{}s:8:"lundbeck";a:0:{}s:5:"lupin";a:0:{}s:4:"luxe";a:0:{}s:6:"luxury";a:0:{}s:5:"macys";a:0:{}s:6:"madrid";a:0:{}s:4:"maif";a:0:{}s:6:"maison";a:0:{}s:6:"makeup";a:0:{}s:3:"man";a:0:{}s:10:"management";a:1:{s:6:"router";a:0:{}}s:5:"mango";a:0:{}s:3:"map";a:0:{}s:6:"market";a:0:{}s:9:"marketing";a:0:{}s:7:"markets";a:0:{}s:8:"marriott";a:0:{}s:9:"marshalls";a:0:{}s:8:"maserati";a:0:{}s:6:"mattel";a:0:{}s:3:"mba";a:0:{}s:3:"mcd";a:0:{}s:9:"mcdonalds";a:0:{}s:8:"mckinsey";a:0:{}s:3:"med";a:0:{}s:5:"media";a:0:{}s:4:"meet";a:0:{}s:9:"melbourne";a:0:{}s:4:"meme";a:0:{}s:8:"memorial";a:0:{}s:3:"men";a:0:{}s:4:"menu";a:0:{}s:3:"meo";a:0:{}s:8:"merckmsd";a:0:{}s:7:"metlife";a:0:{}s:5:"miami";a:0:{}s:9:"microsoft";a:0:{}s:4:"mini";a:0:{}s:4:"mint";a:0:{}s:3:"mit";a:0:{}s:10:"mitsubishi";a:0:{}s:3:"mlb";a:0:{}s:3:"mls";a:0:{}s:3:"mma";a:0:{}s:6:"mobile";a:0:{}s:6:"mobily";a:0:{}s:4:"moda";a:0:{}s:3:"moe";a:0:{}s:3:"moi";a:0:{}s:3:"mom";a:0:{}s:6:"monash";a:0:{}s:5:"money";a:0:{}s:7:"monster";a:0:{}s:9:"montblanc";a:0:{}s:5:"mopar";a:0:{}s:6:"mormon";a:0:{}s:8:"mortgage";a:0:{}s:6:"moscow";a:0:{}s:4:"moto";a:0:{}s:11:"motorcycles";a:0:{}s:3:"mov";a:0:{}s:5:"movie";a:0:{}s:8:"movistar";a:0:{}s:3:"msd";a:0:{}s:3:"mtn";a:0:{}s:4:"mtpc";a:0:{}s:3:"mtr";a:0:{}s:6:"mutual";a:0:{}s:3:"nab";a:0:{}s:5:"nadex";a:0:{}s:6:"nagoya";a:0:{}s:10:"nationwide";a:0:{}s:6:"natura";a:0:{}s:4:"navy";a:0:{}s:3:"nba";a:0:{}s:3:"nec";a:0:{}s:7:"netbank";a:0:{}s:7:"netflix";a:0:{}s:7:"network";a:1:{s:5:"alces";a:1:{s:1:"*";a:0:{}}}s:7:"neustar";a:0:{}s:3:"new";a:0:{}s:10:"newholland";a:0:{}s:4:"news";a:0:{}s:4:"next";a:0:{}s:10:"nextdirect";a:0:{}s:5:"nexus";a:0:{}s:3:"nfl";a:0:{}s:3:"ngo";a:0:{}s:3:"nhk";a:0:{}s:4:"nico";a:0:{}s:4:"nike";a:0:{}s:5:"nikon";a:0:{}s:5:"ninja";a:0:{}s:6:"nissan";a:0:{}s:6:"nissay";a:0:{}s:5:"nokia";a:0:{}s:18:"northwesternmutual";a:0:{}s:6:"norton";a:0:{}s:3:"now";a:0:{}s:6:"nowruz";a:0:{}s:5:"nowtv";a:0:{}s:3:"nra";a:0:{}s:3:"nrw";a:0:{}s:3:"ntt";a:0:{}s:3:"nyc";a:0:{}s:3:"obi";a:0:{}s:8:"observer";a:0:{}s:3:"off";a:0:{}s:6:"office";a:0:{}s:7:"okinawa";a:0:{}s:6:"olayan";a:0:{}s:11:"olayangroup";a:0:{}s:7:"oldnavy";a:0:{}s:4:"ollo";a:0:{}s:5:"omega";a:0:{}s:3:"one";a:1:{s:8:"homelink";a:0:{}}s:3:"ong";a:0:{}s:3:"onl";a:0:{}s:6:"online";a:1:{s:5:"barsy";a:0:{}}s:10:"onyourside";a:0:{}s:3:"ooo";a:0:{}s:4:"open";a:0:{}s:6:"oracle";a:0:{}s:6:"orange";a:0:{}s:7:"organic";a:0:{}s:7:"origins";a:0:{}s:5:"osaka";a:0:{}s:6:"otsuka";a:0:{}s:3:"ott";a:0:{}s:3:"ovh";a:1:{s:7:"nerdpol";a:0:{}}s:4:"page";a:0:{}s:12:"pamperedchef";a:0:{}s:9:"panasonic";a:0:{}s:7:"panerai";a:0:{}s:5:"paris";a:0:{}s:4:"pars";a:0:{}s:8:"partners";a:0:{}s:5:"parts";a:0:{}s:5:"party";a:1:{s:3:"ybo";a:0:{}}s:9:"passagens";a:0:{}s:3:"pay";a:0:{}s:4:"pccw";a:0:{}s:3:"pet";a:0:{}s:6:"pfizer";a:0:{}s:8:"pharmacy";a:0:{}s:3:"phd";a:0:{}s:7:"philips";a:0:{}s:5:"phone";a:0:{}s:5:"photo";a:0:{}s:11:"photography";a:0:{}s:6:"photos";a:0:{}s:6:"physio";a:0:{}s:6:"piaget";a:0:{}s:4:"pics";a:0:{}s:6:"pictet";a:0:{}s:8:"pictures";a:1:{i:1337;a:0:{}}s:3:"pid";a:0:{}s:3:"pin";a:0:{}s:4:"ping";a:0:{}s:4:"pink";a:0:{}s:7:"pioneer";a:0:{}s:5:"pizza";a:0:{}s:5:"place";a:0:{}s:4:"play";a:0:{}s:11:"playstation";a:0:{}s:8:"plumbing";a:0:{}s:4:"plus";a:0:{}s:3:"pnc";a:0:{}s:4:"pohl";a:0:{}s:5:"poker";a:0:{}s:7:"politie";a:0:{}s:4:"porn";a:0:{}s:9:"pramerica";a:0:{}s:5:"praxi";a:0:{}s:5:"press";a:0:{}s:5:"prime";a:0:{}s:4:"prod";a:0:{}s:11:"productions";a:0:{}s:4:"prof";a:0:{}s:11:"progressive";a:0:{}s:5:"promo";a:0:{}s:10:"properties";a:0:{}s:8:"property";a:0:{}s:10:"protection";a:0:{}s:3:"pru";a:0:{}s:10:"prudential";a:0:{}s:3:"pub";a:0:{}s:3:"pwc";a:0:{}s:4:"qpon";a:0:{}s:6:"quebec";a:0:{}s:5:"quest";a:0:{}s:3:"qvc";a:0:{}s:6:"racing";a:0:{}s:5:"radio";a:0:{}s:4:"raid";a:0:{}s:4:"read";a:0:{}s:10:"realestate";a:0:{}s:7:"realtor";a:0:{}s:6:"realty";a:0:{}s:7:"recipes";a:0:{}s:3:"red";a:0:{}s:8:"redstone";a:0:{}s:11:"redumbrella";a:0:{}s:5:"rehab";a:0:{}s:5:"reise";a:0:{}s:6:"reisen";a:0:{}s:4:"reit";a:0:{}s:8:"reliance";a:0:{}s:3:"ren";a:0:{}s:4:"rent";a:0:{}s:7:"rentals";a:0:{}s:6:"repair";a:0:{}s:6:"report";a:0:{}s:10:"republican";a:0:{}s:4:"rest";a:0:{}s:10:"restaurant";a:0:{}s:6:"review";a:1:{s:3:"ybo";a:0:{}}s:7:"reviews";a:0:{}s:7:"rexroth";a:0:{}s:4:"rich";a:0:{}s:9:"richardli";a:0:{}s:5:"ricoh";a:0:{}s:11:"rightathome";a:0:{}s:3:"ril";a:0:{}s:3:"rio";a:0:{}s:3:"rip";a:1:{s:4:"clan";a:0:{}}s:4:"rmit";a:0:{}s:6:"rocher";a:0:{}s:5:"rocks";a:3:{s:6:"myddns";a:0:{}s:9:"lima-city";a:0:{}s:8:"webspace";a:0:{}}s:5:"rodeo";a:0:{}s:6:"rogers";a:0:{}s:4:"room";a:0:{}s:4:"rsvp";a:0:{}s:5:"rugby";a:0:{}s:4:"ruhr";a:0:{}s:3:"run";a:0:{}s:3:"rwe";a:0:{}s:6:"ryukyu";a:0:{}s:8:"saarland";a:0:{}s:4:"safe";a:0:{}s:6:"safety";a:0:{}s:6:"sakura";a:0:{}s:4:"sale";a:0:{}s:5:"salon";a:0:{}s:8:"samsclub";a:0:{}s:7:"samsung";a:0:{}s:7:"sandvik";a:0:{}s:15:"sandvikcoromant";a:0:{}s:6:"sanofi";a:0:{}s:3:"sap";a:0:{}s:4:"sapo";a:0:{}s:4:"sarl";a:0:{}s:3:"sas";a:0:{}s:4:"save";a:0:{}s:4:"saxo";a:0:{}s:3:"sbi";a:0:{}s:3:"sbs";a:0:{}s:3:"sca";a:0:{}s:3:"scb";a:0:{}s:10:"schaeffler";a:0:{}s:7:"schmidt";a:0:{}s:12:"scholarships";a:0:{}s:6:"school";a:0:{}s:6:"schule";a:0:{}s:7:"schwarz";a:0:{}s:7:"science";a:1:{s:3:"ybo";a:0:{}}s:9:"scjohnson";a:0:{}s:4:"scor";a:0:{}s:4:"scot";a:0:{}s:6:"search";a:0:{}s:4:"seat";a:0:{}s:6:"secure";a:0:{}s:8:"security";a:0:{}s:4:"seek";a:0:{}s:6:"select";a:0:{}s:5:"sener";a:0:{}s:8:"services";a:0:{}s:3:"ses";a:0:{}s:5:"seven";a:0:{}s:3:"sew";a:0:{}s:3:"sex";a:0:{}s:4:"sexy";a:0:{}s:3:"sfr";a:0:{}s:9:"shangrila";a:0:{}s:5:"sharp";a:0:{}s:4:"shaw";a:0:{}s:5:"shell";a:0:{}s:4:"shia";a:0:{}s:7:"shiksha";a:0:{}s:5:"shoes";a:0:{}s:4:"shop";a:0:{}s:8:"shopping";a:0:{}s:6:"shouji";a:0:{}s:4:"show";a:0:{}s:8:"showtime";a:0:{}s:7:"shriram";a:0:{}s:4:"silk";a:0:{}s:4:"sina";a:0:{}s:7:"singles";a:0:{}s:4:"site";a:3:{s:4:"cyon";a:0:{}s:10:"platformsh";a:1:{s:1:"*";a:0:{}}s:4:"byen";a:0:{}}s:3:"ski";a:0:{}s:4:"skin";a:0:{}s:3:"sky";a:0:{}s:5:"skype";a:0:{}s:5:"sling";a:0:{}s:5:"smart";a:0:{}s:5:"smile";a:0:{}s:4:"sncf";a:0:{}s:6:"soccer";a:0:{}s:6:"social";a:0:{}s:8:"softbank";a:0:{}s:8:"software";a:0:{}s:4:"sohu";a:0:{}s:5:"solar";a:0:{}s:9:"solutions";a:0:{}s:4:"song";a:0:{}s:4:"sony";a:0:{}s:3:"soy";a:0:{}s:5:"space";a:3:{s:10:"stackspace";a:0:{}s:4:"uber";a:0:{}s:6:"xs4all";a:0:{}}s:7:"spiegel";a:0:{}s:4:"spot";a:0:{}s:13:"spreadbetting";a:0:{}s:3:"srl";a:0:{}s:3:"srt";a:0:{}s:5:"stada";a:0:{}s:7:"staples";a:0:{}s:4:"star";a:0:{}s:7:"starhub";a:0:{}s:9:"statebank";a:0:{}s:9:"statefarm";a:0:{}s:7:"statoil";a:0:{}s:3:"stc";a:0:{}s:8:"stcgroup";a:0:{}s:9:"stockholm";a:0:{}s:7:"storage";a:0:{}s:5:"store";a:0:{}s:6:"stream";a:0:{}s:6:"studio";a:0:{}s:5:"study";a:0:{}s:5:"style";a:0:{}s:5:"sucks";a:0:{}s:8:"supplies";a:0:{}s:6:"supply";a:0:{}s:7:"support";a:1:{s:5:"barsy";a:0:{}}s:4:"surf";a:0:{}s:7:"surgery";a:0:{}s:6:"suzuki";a:0:{}s:6:"swatch";a:0:{}s:10:"swiftcover";a:0:{}s:5:"swiss";a:0:{}s:6:"sydney";a:0:{}s:8:"symantec";a:0:{}s:7:"systems";a:1:{s:11:"knightpoint";a:0:{}}s:3:"tab";a:0:{}s:6:"taipei";a:0:{}s:4:"talk";a:0:{}s:6:"taobao";a:0:{}s:6:"target";a:0:{}s:10:"tatamotors";a:0:{}s:5:"tatar";a:0:{}s:6:"tattoo";a:0:{}s:3:"tax";a:0:{}s:4:"taxi";a:0:{}s:3:"tci";a:0:{}s:3:"tdk";a:0:{}s:4:"team";a:0:{}s:4:"tech";a:0:{}s:10:"technology";a:0:{}s:8:"telecity";a:0:{}s:10:"telefonica";a:0:{}s:7:"temasek";a:0:{}s:6:"tennis";a:0:{}s:4:"teva";a:0:{}s:3:"thd";a:0:{}s:7:"theater";a:0:{}s:7:"theatre";a:0:{}s:4:"tiaa";a:0:{}s:7:"tickets";a:0:{}s:6:"tienda";a:0:{}s:7:"tiffany";a:0:{}s:4:"tips";a:0:{}s:5:"tires";a:0:{}s:5:"tirol";a:0:{}s:6:"tjmaxx";a:0:{}s:3:"tjx";a:0:{}s:6:"tkmaxx";a:0:{}s:5:"tmall";a:0:{}s:5:"today";a:0:{}s:5:"tokyo";a:0:{}s:5:"tools";a:0:{}s:3:"top";a:0:{}s:5:"toray";a:0:{}s:7:"toshiba";a:0:{}s:5:"total";a:0:{}s:5:"tours";a:0:{}s:4:"town";a:0:{}s:6:"toyota";a:0:{}s:4:"toys";a:0:{}s:5:"trade";a:1:{s:3:"ybo";a:0:{}}s:7:"trading";a:0:{}s:8:"training";a:0:{}s:13:"travelchannel";a:0:{}s:9:"travelers";a:0:{}s:18:"travelersinsurance";a:0:{}s:5:"trust";a:0:{}s:3:"trv";a:0:{}s:4:"tube";a:0:{}s:3:"tui";a:0:{}s:5:"tunes";a:0:{}s:5:"tushu";a:0:{}s:3:"tvs";a:0:{}s:5:"ubank";a:0:{}s:3:"ubs";a:0:{}s:8:"uconnect";a:0:{}s:6:"unicom";a:0:{}s:10:"university";a:0:{}s:3:"uno";a:0:{}s:3:"uol";a:0:{}s:3:"ups";a:0:{}s:9:"vacations";a:0:{}s:4:"vana";a:0:{}s:8:"vanguard";a:0:{}s:5:"vegas";a:0:{}s:8:"ventures";a:0:{}s:8:"verisign";a:0:{}s:12:"versicherung";a:0:{}s:3:"vet";a:0:{}s:6:"viajes";a:0:{}s:5:"video";a:0:{}s:3:"vig";a:0:{}s:6:"viking";a:0:{}s:6:"villas";a:0:{}s:3:"vin";a:0:{}s:3:"vip";a:0:{}s:6:"virgin";a:0:{}s:4:"visa";a:0:{}s:6:"vision";a:0:{}s:5:"vista";a:0:{}s:10:"vistaprint";a:0:{}s:4:"viva";a:0:{}s:4:"vivo";a:0:{}s:10:"vlaanderen";a:0:{}s:5:"vodka";a:0:{}s:10:"volkswagen";a:0:{}s:5:"volvo";a:0:{}s:4:"vote";a:0:{}s:6:"voting";a:0:{}s:4:"voto";a:0:{}s:6:"voyage";a:0:{}s:6:"vuelos";a:0:{}s:5:"wales";a:0:{}s:7:"walmart";a:0:{}s:6:"walter";a:0:{}s:4:"wang";a:0:{}s:7:"wanggou";a:0:{}s:6:"warman";a:0:{}s:5:"watch";a:0:{}s:7:"watches";a:0:{}s:7:"weather";a:0:{}s:14:"weatherchannel";a:0:{}s:6:"webcam";a:0:{}s:5:"weber";a:0:{}s:7:"website";a:0:{}s:3:"wed";a:0:{}s:7:"wedding";a:0:{}s:5:"weibo";a:0:{}s:4:"weir";a:0:{}s:7:"whoswho";a:0:{}s:4:"wien";a:0:{}s:4:"wiki";a:0:{}s:11:"williamhill";a:0:{}s:3:"win";a:0:{}s:7:"windows";a:0:{}s:4:"wine";a:0:{}s:7:"winners";a:0:{}s:3:"wme";a:0:{}s:13:"wolterskluwer";a:0:{}s:8:"woodside";a:0:{}s:4:"work";a:0:{}s:5:"works";a:0:{}s:5:"world";a:0:{}s:3:"wow";a:0:{}s:3:"wtc";a:0:{}s:3:"wtf";a:0:{}s:4:"xbox";a:0:{}s:5:"xerox";a:0:{}s:7:"xfinity";a:0:{}s:6:"xihuan";a:0:{}s:3:"xin";a:0:{}s:11:"xn--11b4c3d";a:0:{}s:11:"xn--1ck2e1b";a:0:{}s:11:"xn--1qqw23a";a:0:{}s:10:"xn--30rr7y";a:0:{}s:11:"xn--3bst00m";a:0:{}s:11:"xn--3ds443g";a:0:{}s:17:"xn--3oq18vl8pn36a";a:0:{}s:10:"xn--3pxu8k";a:0:{}s:11:"xn--42c2d9a";a:0:{}s:10:"xn--45q11c";a:0:{}s:10:"xn--4gbrim";a:0:{}s:11:"xn--55qw42g";a:0:{}s:10:"xn--55qx5d";a:0:{}s:17:"xn--5su34j936bgsg";a:0:{}s:10:"xn--5tzm5g";a:0:{}s:11:"xn--6frz82g";a:0:{}s:14:"xn--6qq986b3xl";a:0:{}s:12:"xn--80adxhks";a:0:{}s:14:"xn--80aqecdr1a";a:0:{}s:12:"xn--80asehdb";a:0:{}s:10:"xn--80aswg";a:0:{}s:12:"xn--8y0a063a";a:0:{}s:10:"xn--9dbq2a";a:0:{}s:10:"xn--9et52u";a:0:{}s:11:"xn--9krt00a";a:0:{}s:14:"xn--b4w605ferd";a:0:{}s:17:"xn--bck1b9a5dre4c";a:0:{}s:9:"xn--c1avg";a:0:{}s:10:"xn--c2br7g";a:0:{}s:11:"xn--cck2b3b";a:0:{}s:10:"xn--cg4bki";a:0:{}s:11:"xn--czr694b";a:0:{}s:10:"xn--czrs0t";a:0:{}s:10:"xn--czru2d";a:0:{}s:11:"xn--d1acj3b";a:0:{}s:13:"xn--eckvdtc9d";a:0:{}s:11:"xn--efvy88h";a:0:{}s:11:"xn--estv75g";a:0:{}s:11:"xn--fct429k";a:0:{}s:9:"xn--fhbei";a:0:{}s:14:"xn--fiq228c5hs";a:0:{}s:10:"xn--fiq64b";a:0:{}s:11:"xn--fjq720a";a:0:{}s:11:"xn--flw351e";a:0:{}s:16:"xn--fzys8d69uvgm";a:0:{}s:11:"xn--g2xx48c";a:0:{}s:12:"xn--gckr3f0f";a:0:{}s:11:"xn--gk3at1e";a:0:{}s:11:"xn--hxt814e";a:0:{}s:15:"xn--i1b6b1a6a2e";a:0:{}s:11:"xn--imr513n";a:0:{}s:10:"xn--io0a7i";a:0:{}s:9:"xn--j1aef";a:0:{}s:14:"xn--jlq61u9w7b";a:0:{}s:11:"xn--jvr189m";a:0:{}s:15:"xn--kcrx77d1x4a";a:0:{}s:11:"xn--kpu716f";a:0:{}s:10:"xn--kput3i";a:0:{}s:14:"xn--mgba3a3ejt";a:0:{}s:16:"xn--mgba7c0bbn0a";a:0:{}s:15:"xn--mgbaakc7dvf";a:0:{}s:12:"xn--mgbab2bd";a:0:{}s:14:"xn--mgbb9fbpob";a:0:{}s:14:"xn--mgbca7dzdo";a:0:{}s:14:"xn--mgbi4ecexp";a:0:{}s:12:"xn--mgbt3dhd";a:0:{}s:12:"xn--mk1bu44c";a:0:{}s:10:"xn--mxtq1m";a:0:{}s:12:"xn--ngbc5azd";a:0:{}s:12:"xn--ngbe9e0a";a:0:{}s:9:"xn--ngbrx";a:0:{}s:9:"xn--nqv7f";a:0:{}s:15:"xn--nqv7fs00ema";a:0:{}s:11:"xn--nyqy26a";a:0:{}s:9:"xn--p1acf";a:0:{}s:11:"xn--pbt977c";a:0:{}s:10:"xn--pssy2u";a:0:{}s:11:"xn--q9jyb4c";a:0:{}s:12:"xn--qcka1pmc";a:0:{}s:11:"xn--rhqv96g";a:0:{}s:11:"xn--rovu88b";a:0:{}s:11:"xn--ses554g";a:0:{}s:11:"xn--t60b56a";a:0:{}s:9:"xn--tckwe";a:0:{}s:13:"xn--tiq49xqyj";a:0:{}s:10:"xn--unup4y";a:0:{}s:23:"xn--vermgensberater-ctb";a:0:{}s:24:"xn--vermgensberatung-pwb";a:0:{}s:9:"xn--vhquv";a:0:{}s:11:"xn--vuq861b";a:0:{}s:20:"xn--w4r85el8fhu5dnra";a:0:{}s:11:"xn--w4rs40l";a:0:{}s:11:"xn--xhq521b";a:0:{}s:11:"xn--zfr164b";a:0:{}s:6:"xperia";a:0:{}s:3:"xyz";a:2:{s:8:"blogsite";a:0:{}s:5:"fhapp";a:0:{}}s:6:"yachts";a:0:{}s:5:"yahoo";a:0:{}s:7:"yamaxun";a:0:{}s:6:"yandex";a:0:{}s:9:"yodobashi";a:0:{}s:4:"yoga";a:0:{}s:8:"yokohama";a:0:{}s:3:"you";a:0:{}s:7:"youtube";a:0:{}s:3:"yun";a:0:{}s:6:"zappos";a:0:{}s:4:"zara";a:0:{}s:4:"zero";a:0:{}s:3:"zip";a:0:{}s:5:"zippo";a:0:{}s:4:"zone";a:2:{s:6:"triton";a:1:{s:1:"*";a:0:{}}s:4:"lima";a:0:{}}s:7:"zuerich";a:0:{}} \ No newline at end of file +s:102659:"{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[],"blogspot":[],"nom":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[],"nom":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[],"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":{"blogspot":[]},"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":{"cloudns":[]},"at":{"ac":[],"co":{"blogspot":[]},"gv":[],"or":[],"futurecms":{"*":[]},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"au":{"com":{"blogspot":[]},"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[],"blogspot":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[],"blogspot":[],"transurl":{"*":[]}},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[],"blogspot":[],"barsy":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"bj":{"asso":[],"barreau":[],"gouv":[],"blogspot":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gov":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[]},"br":{"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"belem":[],"bio":[],"blog":[],"bmd":[],"bsb":[],"cim":[],"cng":[],"cnt":[],"com":{"blogspot":[]},"coop":[],"cri":[],"cuiaba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"flog":[],"floripa":[],"fortal":[],"fm":[],"fnd":[],"fot":[],"fst":[],"g12":[],"ggf":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jampa":[],"jor":[],"jus":[],"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"lel":[],"londrina":[],"macapa":[],"maceio":[],"mat":[],"med":[],"mil":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"qsl":[],"radio":[],"rec":[],"recife":[],"riobranco":[],"sjc":[],"slg":[],"srv":[],"taxi":[],"teo":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"we":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":{"blogspot":[]},"of":[],"nym":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"za":[],"nym":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"cat":[],"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"cd":{"gov":[]},"cf":{"blogspot":[]},"cg":[],"ch":{"square7":[],"blogspot":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[],"blogspot":[],"nom":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}},"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":{"blogspot":[]},"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[],"nodum":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"se":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"barsyonline":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"yolasite":[]},"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":{"blogspot":[]},"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[],"ath":[],"info":[]},"cy":{"ac":[],"biz":[],"com":{"blogspot":[]},"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]}},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[]},"dj":[],"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":{"blogspot":[]},"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":{"blogspot":[]},"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":{"blogspot":[]},"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"fi":{"aland":[],"dy":[],"blogspot":[],"iki":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[],"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"ga":[],"gb":[],"gd":{"nom":[]},"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[],"cya":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[],"nom":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[],"blogspot":[],"nym":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[],"nom":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[],"blogspot":[],"ltd":[],"inc":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[],"nom":[]},"hr":{"iz":[],"from":[],"name":[],"com":[],"blogspot":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[],"blogspot":[]},"id":{"ac":[],"biz":[],"co":{"blogspot":[]},"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[],"blogspot":[]},"il":{"ac":[],"co":{"blogspot":[]},"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[],"ro":[],"nom":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[],"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"int":{"eu":[]},"io":{"com":[],"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"hzc":[],"sandcats":[],"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"wedeploy":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[],"cupcake":[],"blogspot":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[],"blogspot":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}},"blogspot":[]},"ke":{"*":[],"co":{"blogspot":[]}},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[],"blogspot":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[],"nym":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[],"bnr":[],"c":[],"nym":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[],"oy":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[],"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":{"blogspot":[]},"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[],"c66":[],"daplie":{"localhost":[]},"filegear":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[],"blogspot":[],"nom":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[],"nyc":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":{"dscloud":[]},"mp":[],"mq":[],"mr":{"gov":[],"blogspot":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":{"blogspot":[]},"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[],"blogspot":[],"nym":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[],"blogspot":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nc":{"asso":[],"nom":[]},"ne":[],"net":{"alwaysdata":{"*":[]},"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":{"blogspot":[]},"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[],"virtueeldomein":[],"co":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]},"co":[],"blogspot":[]},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"nz":{"ac":[],"co":{"blogspot":[]},"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[],"nym":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[]},"hepforge":[],"js":[],"bmoattachments":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[],"blogspot":[],"nym":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[],"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[],"cloudns":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[],"blogspot":[],"nym":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[],"cloudns":[],"nom":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[],"blogspot":[],"nom":[]},"re":{"asso":[],"com":[],"nom":[],"blogspot":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[],"shop":[],"blogspot":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[],"blogspot":[],"nom":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[],"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"cldmail":{"hb":[]},"net":[],"org":[],"pp":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[],"com":[],"blogspot":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[],"blogspot":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[],"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"si":{"blogspot":[],"nom":[]},"sj":[],"sk":{"blogspot":[],"nym":[]},"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[],"blogspot":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[],"nym":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":{"blogspot":[]},"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[],"vpnplus":[]},"tr":{"com":{"blogspot":[]},"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"tw":{"edu":[],"gov":[],"mil":[],"com":{"mymailer":[]},"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[],"url":[],"blogspot":[],"nym":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[],"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[],"blogspot":[],"nom":[]},"uk":{"ac":[],"co":{"blogspot":[],"no-ip":[],"wellbeingzone":[]},"gov":{"service":[],"homeoffice":[]},"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[],"lib":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]},"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"golffan":[],"noip":[],"pointto":[]},"uy":{"com":{"blogspot":[]},"edu":[],"gub":[],"mil":[],"net":[],"org":[],"nom":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[],"nom":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":{"nom":[]},"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[],"blogspot":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"advisor":{"*":[]},"dyndns":[],"mypets":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":{"blogspot":[]},"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"boots":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"chloe":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":{"myfusion":[],"statics":{"*":[]},"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"club":{"cloudns":[]},"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":{"de":[]},"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":{"compute":{"*":[]}},"esurance":[],"etisalat":[],"eurovision":[],"eus":{"party":{"user":[]}},"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":{"ybo":[]},"family":[],"fan":[],"fans":[],"farm":{"storj":[]},"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":{"ptplus":[]},"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":{"cloud":[]},"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":{"cloudaccess":[],"freesite":[]},"hosting":{"opencraft":[]},"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"htc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":{"co":[],"edu":[]},"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":{"static":{"dev":[],"sites":[]}},"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":{"cyon":[],"mypep":[]},"lipsy":[],"live":[],"living":[],"lixil":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":{"router":[]},"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mcd":[],"mcdonalds":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"montblanc":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtpc":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":{"alces":{"*":[]}},"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":{"homelink":[]},"ong":[],"onl":[],"online":{"barsy":[]},"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":{"nerdpol":[]},"page":[],"pamperedchef":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":{"ybo":[]},"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":{"1337":[]},"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":{"ybo":[]},"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":{"clan":[]},"rmit":[],"rocher":[],"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":{"ybo":[]},"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":{"cyon":[],"platformsh":{"*":[]},"byen":[]},"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":{"stackspace":[],"uber":[],"xs4all":[]},"spiegel":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":{"barsy":[]},"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":{"knightpoint":[]},"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":{"ybo":[]},"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":{"blogsite":[],"fhapp":[]},"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":{"triton":{"*":[]},"lima":[]},"zuerich":[]}"; \ No newline at end of file diff --git a/src/PublicSuffixListManager.php b/src/PublicSuffixListManager.php index 1a2a33b0..00a0d3ed 100644 --- a/src/PublicSuffixListManager.php +++ b/src/PublicSuffixListManager.php @@ -25,7 +25,6 @@ class PublicSuffixListManager { const PUBLIC_SUFFIX_LIST_URL = 'https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat'; - const PUBLIC_SUFFIX_LIST_DATA = 'RAW'; const ALL_DOMAINS = 'ALL'; const ICANN_DOMAINS = 'ICANN'; const PRIVATE_DOMAINS = 'PRIVATE'; @@ -73,27 +72,20 @@ public function __construct( */ public function getList($type = self::ALL_DOMAINS): PublicSuffixList { - static $type_lists = [self::ALL_DOMAINS => 1, self::ICANN_DOMAINS => 1, self::PRIVATE_DOMAINS => 1]; - - if (!isset($type_lists[$type])) { - $type = self::ALL_DOMAINS; - } - - if (($list = $this->cacheAdapter->get($type)) !== null) { - return new PublicSuffixList($list); - } + static $type_lists = [ + self::ALL_DOMAINS => self::ALL_DOMAINS, + self::ICANN_DOMAINS => self::ICANN_DOMAINS, + self::PRIVATE_DOMAINS => self::PRIVATE_DOMAINS, + ]; - if (($raw = $this->cacheAdapter->get(self::PUBLIC_SUFFIX_LIST_DATA)) !== null - && $this->cachePublicSuffixListTypes($raw)) { - return new PublicSuffixList($this->cacheAdapter->get($type)); - } + $type = $type_lists[$type] ?? self::ALL_DOMAINS; - if ($this->refreshPublicSuffixList()) { - return new PublicSuffixList($this->cacheAdapter->get($type)); + if (($list = $this->cacheAdapter->get($type)) === null) { + $this->refreshPublicSuffixList(); + $list = $this->cacheAdapter->get($type); } - //this should not happen but in rare cases you should be able to cach this one - throw new RuntimeException(sprintf('Unable to return `%s` Public Suffix List', $type)); + return new PublicSuffixList(json_decode($list, true)); } /** @@ -107,23 +99,9 @@ public function getList($type = self::ALL_DOMAINS): PublicSuffixList public function refreshPublicSuffixList(): bool { $publicSuffixList = $this->httpAdapter->getContent($this->sourceUrl); - - return $this->cacheAdapter->set(self::PUBLIC_SUFFIX_LIST_DATA, $publicSuffixList) - && $this->cachePublicSuffixListTypes($publicSuffixList); - } - - /** - * Cache the different public suffix list subtypes. - * - * Returns true if all the public suffix list are correctly refreshed - * - * @return bool - */ - private function cachePublicSuffixListTypes(string $publicSuffixList): bool - { $publicSuffixListTypes = $this->convertListToArray($publicSuffixList); - return $this->cacheAdapter->setMultiple($publicSuffixListTypes); + return $this->cacheAdapter->setMultiple(array_map('json_encode', $publicSuffixListTypes)); } /** From f1aeaf8dd398b9cba4cf99989403914e2f92ddc5 Mon Sep 17 00:00:00 2001 From: Wanderson Date: Mon, 9 Oct 2017 23:35:16 -0300 Subject: [PATCH 041/461] Fix method typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 91ad9979..cdd5570f 100644 --- a/README.md +++ b/README.md @@ -292,7 +292,7 @@ retrieve only the component you're interested in getSubdomain('www.scottwills.co.uk')); -var_dump($parser->getRegistrableDomain('www.scottwills.co.uk')); +var_dump($parser->getRegisterableDomain('www.scottwills.co.uk')); var_dump($parser->getPublicSuffix('www.scottwills.co.uk')); ``` From 5a33ba87a47162e80a24a85543545687b265f6c2 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 10 Oct 2017 14:12:30 +0200 Subject: [PATCH 042/461] Simplify FileCache and PublicSuffixManager --- ...0249e90ffc9895458763fae6885c9ee74fdce5ec90 | 12288 ---------------- ...9c4ea88b00d35adb2ecdfd7 => pdp::ALL.cache} | 0 ...4ed960a467e7e01126243 => pdp::ICANN.cache} | 0 ...7864041f59dfb684fc0 => pdp::PRIVATE.cache} | 0 data/public-suffix-list.txt | 12287 --------------- src/Cache/FileCacheAdapter.php | 26 +- src/PublicSuffixListManager.php | 7 +- 7 files changed, 8 insertions(+), 24600 deletions(-) delete mode 100644 data/A/C/0562bba4a57c6841cba10249e90ffc9895458763fae6885c9ee74fdce5ec90 rename data/{B/5/c7aed7cd2a308523e7d2847b7815909e864b2fd9c4ea88b00d35adb2ecdfd7 => pdp::ALL.cache} (100%) rename data/{A/A/91f9d4d1ae7f5129b52177e1e93475af9f8761ed84ed960a467e7e01126243 => pdp::ICANN.cache} (100%) rename data/{7/1/09ec0807d8f2bd40aa93347ea112977e316242f2d457864041f59dfb684fc0 => pdp::PRIVATE.cache} (100%) delete mode 100644 data/public-suffix-list.txt diff --git a/data/A/C/0562bba4a57c6841cba10249e90ffc9895458763fae6885c9ee74fdce5ec90 b/data/A/C/0562bba4a57c6841cba10249e90ffc9895458763fae6885c9ee74fdce5ec90 deleted file mode 100644 index 1062c548..00000000 --- a/data/A/C/0562bba4a57c6841cba10249e90ffc9895458763fae6885c9ee74fdce5ec90 +++ /dev/null @@ -1,12288 +0,0 @@ -s:200466:"// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at https://mozilla.org/MPL/2.0/. - -// Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat, -// rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported. - -// Instructions on pulling and using this list can be found at https://publicsuffix.org/list/. - -// ===BEGIN ICANN DOMAINS=== - -// ac : https://en.wikipedia.org/wiki/.ac -ac -com.ac -edu.ac -gov.ac -net.ac -mil.ac -org.ac - -// ad : https://en.wikipedia.org/wiki/.ad -ad -nom.ad - -// ae : https://en.wikipedia.org/wiki/.ae -// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php -ae -co.ae -net.ae -org.ae -sch.ae -ac.ae -gov.ae -mil.ae - -// aero : see https://www.information.aero/index.php?id=66 -aero -accident-investigation.aero -accident-prevention.aero -aerobatic.aero -aeroclub.aero -aerodrome.aero -agents.aero -aircraft.aero -airline.aero -airport.aero -air-surveillance.aero -airtraffic.aero -air-traffic-control.aero -ambulance.aero -amusement.aero -association.aero -author.aero -ballooning.aero -broker.aero -caa.aero -cargo.aero -catering.aero -certification.aero -championship.aero -charter.aero -civilaviation.aero -club.aero -conference.aero -consultant.aero -consulting.aero -control.aero -council.aero -crew.aero -design.aero -dgca.aero -educator.aero -emergency.aero -engine.aero -engineer.aero -entertainment.aero -equipment.aero -exchange.aero -express.aero -federation.aero -flight.aero -freight.aero -fuel.aero -gliding.aero -government.aero -groundhandling.aero -group.aero -hanggliding.aero -homebuilt.aero -insurance.aero -journal.aero -journalist.aero -leasing.aero -logistics.aero -magazine.aero -maintenance.aero -media.aero -microlight.aero -modelling.aero -navigation.aero -parachuting.aero -paragliding.aero -passenger-association.aero -pilot.aero -press.aero -production.aero -recreation.aero -repbody.aero -res.aero -research.aero -rotorcraft.aero -safety.aero -scientist.aero -services.aero -show.aero -skydiving.aero -software.aero -student.aero -trader.aero -trading.aero -trainer.aero -union.aero -workinggroup.aero -works.aero - -// af : http://www.nic.af/help.jsp -af -gov.af -com.af -org.af -net.af -edu.af - -// ag : http://www.nic.ag/prices.htm -ag -com.ag -org.ag -net.ag -co.ag -nom.ag - -// ai : http://nic.com.ai/ -ai -off.ai -com.ai -net.ai -org.ai - -// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31 -al -com.al -edu.al -gov.al -mil.al -net.al -org.al - -// am : https://en.wikipedia.org/wiki/.am -am - -// ao : https://en.wikipedia.org/wiki/.ao -// http://www.dns.ao/REGISTR.DOC -ao -ed.ao -gv.ao -og.ao -co.ao -pb.ao -it.ao - -// aq : https://en.wikipedia.org/wiki/.aq -aq - -// ar : https://nic.ar/nic-argentina/normativa-vigente -ar -com.ar -edu.ar -gob.ar -gov.ar -int.ar -mil.ar -musica.ar -net.ar -org.ar -tur.ar - -// arpa : https://en.wikipedia.org/wiki/.arpa -// Confirmed by registry 2008-06-18 -arpa -e164.arpa -in-addr.arpa -ip6.arpa -iris.arpa -uri.arpa -urn.arpa - -// as : https://en.wikipedia.org/wiki/.as -as -gov.as - -// asia : https://en.wikipedia.org/wiki/.asia -asia - -// at : https://en.wikipedia.org/wiki/.at -// Confirmed by registry 2008-06-17 -at -ac.at -co.at -gv.at -or.at - -// au : https://en.wikipedia.org/wiki/.au -// http://www.auda.org.au/ -au -// 2LDs -com.au -net.au -org.au -edu.au -gov.au -asn.au -id.au -// Historic 2LDs (closed to new registration, but sites still exist) -info.au -conf.au -oz.au -// CGDNs - http://www.cgdn.org.au/ -act.au -nsw.au -nt.au -qld.au -sa.au -tas.au -vic.au -wa.au -// 3LDs -act.edu.au -nsw.edu.au -nt.edu.au -qld.edu.au -sa.edu.au -tas.edu.au -vic.edu.au -wa.edu.au -// act.gov.au Bug 984824 - Removed at request of Greg Tankard -// nsw.gov.au Bug 547985 - Removed at request of -// nt.gov.au Bug 940478 - Removed at request of Greg Connors -qld.gov.au -sa.gov.au -tas.gov.au -vic.gov.au -wa.gov.au - -// aw : https://en.wikipedia.org/wiki/.aw -aw -com.aw - -// ax : https://en.wikipedia.org/wiki/.ax -ax - -// az : https://en.wikipedia.org/wiki/.az -az -com.az -net.az -int.az -gov.az -org.az -edu.az -info.az -pp.az -mil.az -name.az -pro.az -biz.az - -// ba : http://nic.ba/users_data/files/pravilnik_o_registraciji.pdf -ba -com.ba -edu.ba -gov.ba -mil.ba -net.ba -org.ba - -// bb : https://en.wikipedia.org/wiki/.bb -bb -biz.bb -co.bb -com.bb -edu.bb -gov.bb -info.bb -net.bb -org.bb -store.bb -tv.bb - -// bd : https://en.wikipedia.org/wiki/.bd -*.bd - -// be : https://en.wikipedia.org/wiki/.be -// Confirmed by registry 2008-06-08 -be -ac.be - -// bf : https://en.wikipedia.org/wiki/.bf -bf -gov.bf - -// bg : https://en.wikipedia.org/wiki/.bg -// https://www.register.bg/user/static/rules/en/index.html -bg -a.bg -b.bg -c.bg -d.bg -e.bg -f.bg -g.bg -h.bg -i.bg -j.bg -k.bg -l.bg -m.bg -n.bg -o.bg -p.bg -q.bg -r.bg -s.bg -t.bg -u.bg -v.bg -w.bg -x.bg -y.bg -z.bg -0.bg -1.bg -2.bg -3.bg -4.bg -5.bg -6.bg -7.bg -8.bg -9.bg - -// bh : https://en.wikipedia.org/wiki/.bh -bh -com.bh -edu.bh -net.bh -org.bh -gov.bh - -// bi : https://en.wikipedia.org/wiki/.bi -// http://whois.nic.bi/ -bi -co.bi -com.bi -edu.bi -or.bi -org.bi - -// biz : https://en.wikipedia.org/wiki/.biz -biz - -// bj : https://en.wikipedia.org/wiki/.bj -bj -asso.bj -barreau.bj -gouv.bj - -// bm : http://www.bermudanic.bm/dnr-text.txt -bm -com.bm -edu.bm -gov.bm -net.bm -org.bm - -// bn : https://en.wikipedia.org/wiki/.bn -*.bn - -// bo : http://www.nic.bo/ -bo -com.bo -edu.bo -gov.bo -gob.bo -int.bo -org.bo -net.bo -mil.bo -tv.bo - -// br : http://registro.br/dominio/categoria.html -// Submitted by registry -br -abc.br -adm.br -adv.br -agr.br -aju.br -am.br -aparecida.br -arq.br -art.br -ato.br -b.br -belem.br -bio.br -blog.br -bmd.br -bsb.br -cim.br -cng.br -cnt.br -com.br -coop.br -cri.br -cuiaba.br -def.br -ecn.br -eco.br -edu.br -emp.br -eng.br -esp.br -etc.br -eti.br -far.br -flog.br -floripa.br -fortal.br -fm.br -fnd.br -fot.br -fst.br -g12.br -ggf.br -gov.br -// gov.br 26 states + df https://en.wikipedia.org/wiki/States_of_Brazil -ac.gov.br -al.gov.br -am.gov.br -ap.gov.br -ba.gov.br -ce.gov.br -df.gov.br -es.gov.br -go.gov.br -ma.gov.br -mg.gov.br -ms.gov.br -mt.gov.br -pa.gov.br -pb.gov.br -pe.gov.br -pi.gov.br -pr.gov.br -rj.gov.br -rn.gov.br -ro.gov.br -rr.gov.br -rs.gov.br -sc.gov.br -se.gov.br -sp.gov.br -to.gov.br -gru.br -imb.br -ind.br -inf.br -jampa.br -jor.br -jus.br -leg.br -lel.br -londrina.br -macapa.br -maceio.br -mat.br -med.br -mil.br -mp.br -mus.br -natal.br -net.br -niteroi.br -*.nom.br -not.br -ntr.br -odo.br -org.br -osasco.br -palmas.br -poa.br -ppg.br -pro.br -psc.br -psi.br -qsl.br -radio.br -rec.br -recife.br -riobranco.br -sjc.br -slg.br -srv.br -taxi.br -teo.br -tmp.br -trd.br -tur.br -tv.br -udi.br -vet.br -vix.br -vlog.br -wiki.br -zlg.br - -// bs : http://www.nic.bs/rules.html -bs -com.bs -net.bs -org.bs -edu.bs -gov.bs - -// bt : https://en.wikipedia.org/wiki/.bt -bt -com.bt -edu.bt -gov.bt -net.bt -org.bt - -// bv : No registrations at this time. -// Submitted by registry -bv - -// bw : https://en.wikipedia.org/wiki/.bw -// http://www.gobin.info/domainname/bw.doc -// list of other 2nd level tlds ? -bw -co.bw -org.bw - -// by : https://en.wikipedia.org/wiki/.by -// http://tld.by/rules_2006_en.html -// list of other 2nd level tlds ? -by -gov.by -mil.by -// Official information does not indicate that com.by is a reserved -// second-level domain, but it's being used as one (see www.google.com.by and -// www.yahoo.com.by, for example), so we list it here for safety's sake. -com.by - -// http://hoster.by/ -of.by - -// bz : https://en.wikipedia.org/wiki/.bz -// http://www.belizenic.bz/ -bz -com.bz -net.bz -org.bz -edu.bz -gov.bz - -// ca : https://en.wikipedia.org/wiki/.ca -ca -// ca geographical names -ab.ca -bc.ca -mb.ca -nb.ca -nf.ca -nl.ca -ns.ca -nt.ca -nu.ca -on.ca -pe.ca -qc.ca -sk.ca -yk.ca -// gc.ca: https://en.wikipedia.org/wiki/.gc.ca -// see also: http://registry.gc.ca/en/SubdomainFAQ -gc.ca - -// cat : https://en.wikipedia.org/wiki/.cat -cat - -// cc : https://en.wikipedia.org/wiki/.cc -cc - -// cd : https://en.wikipedia.org/wiki/.cd -// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 -cd -gov.cd - -// cf : https://en.wikipedia.org/wiki/.cf -cf - -// cg : https://en.wikipedia.org/wiki/.cg -cg - -// ch : https://en.wikipedia.org/wiki/.ch -ch - -// ci : https://en.wikipedia.org/wiki/.ci -// http://www.nic.ci/index.php?page=charte -ci -org.ci -or.ci -com.ci -co.ci -edu.ci -ed.ci -ac.ci -net.ci -go.ci -asso.ci -aéroport.ci -int.ci -presse.ci -md.ci -gouv.ci - -// ck : https://en.wikipedia.org/wiki/.ck -*.ck -!www.ck - -// cl : https://en.wikipedia.org/wiki/.cl -cl -gov.cl -gob.cl -co.cl -mil.cl - -// cm : https://en.wikipedia.org/wiki/.cm plus bug 981927 -cm -co.cm -com.cm -gov.cm -net.cm - -// cn : https://en.wikipedia.org/wiki/.cn -// Submitted by registry -cn -ac.cn -com.cn -edu.cn -gov.cn -net.cn -org.cn -mil.cn -公司.cn -网络.cn -網絡.cn -// cn geographic names -ah.cn -bj.cn -cq.cn -fj.cn -gd.cn -gs.cn -gz.cn -gx.cn -ha.cn -hb.cn -he.cn -hi.cn -hl.cn -hn.cn -jl.cn -js.cn -jx.cn -ln.cn -nm.cn -nx.cn -qh.cn -sc.cn -sd.cn -sh.cn -sn.cn -sx.cn -tj.cn -xj.cn -xz.cn -yn.cn -zj.cn -hk.cn -mo.cn -tw.cn - -// co : https://en.wikipedia.org/wiki/.co -// Submitted by registry -co -arts.co -com.co -edu.co -firm.co -gov.co -info.co -int.co -mil.co -net.co -nom.co -org.co -rec.co -web.co - -// com : https://en.wikipedia.org/wiki/.com -com - -// coop : https://en.wikipedia.org/wiki/.coop -coop - -// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do -cr -ac.cr -co.cr -ed.cr -fi.cr -go.cr -or.cr -sa.cr - -// cu : https://en.wikipedia.org/wiki/.cu -cu -com.cu -edu.cu -org.cu -net.cu -gov.cu -inf.cu - -// cv : https://en.wikipedia.org/wiki/.cv -cv - -// cw : http://www.una.cw/cw_registry/ -// Confirmed by registry 2013-03-26 -cw -com.cw -edu.cw -net.cw -org.cw - -// cx : https://en.wikipedia.org/wiki/.cx -// list of other 2nd level tlds ? -cx -gov.cx - -// cy : http://www.nic.cy/ -// Submitted by registry Panayiotou Fotia -cy -ac.cy -biz.cy -com.cy -ekloges.cy -gov.cy -ltd.cy -name.cy -net.cy -org.cy -parliament.cy -press.cy -pro.cy -tm.cy - -// cz : https://en.wikipedia.org/wiki/.cz -cz - -// de : https://en.wikipedia.org/wiki/.de -// Confirmed by registry (with technical -// reservations) 2008-07-01 -de - -// dj : https://en.wikipedia.org/wiki/.dj -dj - -// dk : https://en.wikipedia.org/wiki/.dk -// Confirmed by registry 2008-06-17 -dk - -// dm : https://en.wikipedia.org/wiki/.dm -dm -com.dm -net.dm -org.dm -edu.dm -gov.dm - -// do : https://en.wikipedia.org/wiki/.do -do -art.do -com.do -edu.do -gob.do -gov.do -mil.do -net.do -org.do -sld.do -web.do - -// dz : https://en.wikipedia.org/wiki/.dz -dz -com.dz -org.dz -net.dz -gov.dz -edu.dz -asso.dz -pol.dz -art.dz - -// ec : http://www.nic.ec/reg/paso1.asp -// Submitted by registry -ec -com.ec -info.ec -net.ec -fin.ec -k12.ec -med.ec -pro.ec -org.ec -edu.ec -gov.ec -gob.ec -mil.ec - -// edu : https://en.wikipedia.org/wiki/.edu -edu - -// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B -ee -edu.ee -gov.ee -riik.ee -lib.ee -med.ee -com.ee -pri.ee -aip.ee -org.ee -fie.ee - -// eg : https://en.wikipedia.org/wiki/.eg -eg -com.eg -edu.eg -eun.eg -gov.eg -mil.eg -name.eg -net.eg -org.eg -sci.eg - -// er : https://en.wikipedia.org/wiki/.er -*.er - -// es : https://www.nic.es/site_ingles/ingles/dominios/index.html -es -com.es -nom.es -org.es -gob.es -edu.es - -// et : https://en.wikipedia.org/wiki/.et -et -com.et -gov.et -org.et -edu.et -biz.et -name.et -info.et -net.et - -// eu : https://en.wikipedia.org/wiki/.eu -eu - -// fi : https://en.wikipedia.org/wiki/.fi -fi -// aland.fi : https://en.wikipedia.org/wiki/.ax -// This domain is being phased out in favor of .ax. As there are still many -// domains under aland.fi, we still keep it on the list until aland.fi is -// completely removed. -// TODO: Check for updates (expected to be phased out around Q1/2009) -aland.fi - -// fj : https://en.wikipedia.org/wiki/.fj -*.fj - -// fk : https://en.wikipedia.org/wiki/.fk -*.fk - -// fm : https://en.wikipedia.org/wiki/.fm -fm - -// fo : https://en.wikipedia.org/wiki/.fo -fo - -// fr : http://www.afnic.fr/ -// domaines descriptifs : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-descriptifs -fr -com.fr -asso.fr -nom.fr -prd.fr -presse.fr -tm.fr -// domaines sectoriels : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-sectoriels -aeroport.fr -assedic.fr -avocat.fr -avoues.fr -cci.fr -chambagri.fr -chirurgiens-dentistes.fr -experts-comptables.fr -geometre-expert.fr -gouv.fr -greta.fr -huissier-justice.fr -medecin.fr -notaires.fr -pharmacien.fr -port.fr -veterinaire.fr - -// ga : https://en.wikipedia.org/wiki/.ga -ga - -// gb : This registry is effectively dormant -// Submitted by registry -gb - -// gd : https://en.wikipedia.org/wiki/.gd -gd - -// ge : http://www.nic.net.ge/policy_en.pdf -ge -com.ge -edu.ge -gov.ge -org.ge -mil.ge -net.ge -pvt.ge - -// gf : https://en.wikipedia.org/wiki/.gf -gf - -// gg : http://www.channelisles.net/register-domains/ -// Confirmed by registry 2013-11-28 -gg -co.gg -net.gg -org.gg - -// gh : https://en.wikipedia.org/wiki/.gh -// see also: http://www.nic.gh/reg_now.php -// Although domains directly at second level are not possible at the moment, -// they have been possible for some time and may come back. -gh -com.gh -edu.gh -gov.gh -org.gh -mil.gh - -// gi : http://www.nic.gi/rules.html -gi -com.gi -ltd.gi -gov.gi -mod.gi -edu.gi -org.gi - -// gl : https://en.wikipedia.org/wiki/.gl -// http://nic.gl -gl -co.gl -com.gl -edu.gl -net.gl -org.gl - -// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm -gm - -// gn : http://psg.com/dns/gn/gn.txt -// Submitted by registry -gn -ac.gn -com.gn -edu.gn -gov.gn -org.gn -net.gn - -// gov : https://en.wikipedia.org/wiki/.gov -gov - -// gp : http://www.nic.gp/index.php?lang=en -gp -com.gp -net.gp -mobi.gp -edu.gp -org.gp -asso.gp - -// gq : https://en.wikipedia.org/wiki/.gq -gq - -// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html -// Submitted by registry -gr -com.gr -edu.gr -net.gr -org.gr -gov.gr - -// gs : https://en.wikipedia.org/wiki/.gs -gs - -// gt : http://www.gt/politicas_de_registro.html -gt -com.gt -edu.gt -gob.gt -ind.gt -mil.gt -net.gt -org.gt - -// gu : http://gadao.gov.gu/registration.txt -*.gu - -// gw : https://en.wikipedia.org/wiki/.gw -gw - -// gy : https://en.wikipedia.org/wiki/.gy -// http://registry.gy/ -gy -co.gy -com.gy -edu.gy -gov.gy -net.gy -org.gy - -// hk : https://www.hkdnr.hk -// Submitted by registry -hk -com.hk -edu.hk -gov.hk -idv.hk -net.hk -org.hk -公司.hk -教育.hk -敎育.hk -政府.hk -個人.hk -个人.hk -箇人.hk -網络.hk -网络.hk -组織.hk -網絡.hk -网絡.hk -组织.hk -組織.hk -組织.hk - -// hm : https://en.wikipedia.org/wiki/.hm -hm - -// hn : http://www.nic.hn/politicas/ps02,,05.html -hn -com.hn -edu.hn -org.hn -net.hn -mil.hn -gob.hn - -// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf -hr -iz.hr -from.hr -name.hr -com.hr - -// ht : http://www.nic.ht/info/charte.cfm -ht -com.ht -shop.ht -firm.ht -info.ht -adult.ht -net.ht -pro.ht -org.ht -med.ht -art.ht -coop.ht -pol.ht -asso.ht -edu.ht -rel.ht -gouv.ht -perso.ht - -// hu : http://www.domain.hu/domain/English/sld.html -// Confirmed by registry 2008-06-12 -hu -co.hu -info.hu -org.hu -priv.hu -sport.hu -tm.hu -2000.hu -agrar.hu -bolt.hu -casino.hu -city.hu -erotica.hu -erotika.hu -film.hu -forum.hu -games.hu -hotel.hu -ingatlan.hu -jogasz.hu -konyvelo.hu -lakas.hu -media.hu -news.hu -reklam.hu -sex.hu -shop.hu -suli.hu -szex.hu -tozsde.hu -utazas.hu -video.hu - -// id : https://register.pandi.or.id/ -id -ac.id -biz.id -co.id -desa.id -go.id -mil.id -my.id -net.id -or.id -sch.id -web.id - -// ie : https://en.wikipedia.org/wiki/.ie -ie -gov.ie - -// il : http://www.isoc.org.il/domains/ -il -ac.il -co.il -gov.il -idf.il -k12.il -muni.il -net.il -org.il - -// im : https://www.nic.im/ -// Submitted by registry -im -ac.im -co.im -com.im -ltd.co.im -net.im -org.im -plc.co.im -tt.im -tv.im - -// in : https://en.wikipedia.org/wiki/.in -// see also: https://registry.in/Policies -// Please note, that nic.in is not an official eTLD, but used by most -// government institutions. -in -co.in -firm.in -net.in -org.in -gen.in -ind.in -nic.in -ac.in -edu.in -res.in -gov.in -mil.in - -// info : https://en.wikipedia.org/wiki/.info -info - -// int : https://en.wikipedia.org/wiki/.int -// Confirmed by registry 2008-06-18 -int -eu.int - -// io : http://www.nic.io/rules.html -// list of other 2nd level tlds ? -io -com.io - -// iq : http://www.cmc.iq/english/iq/iqregister1.htm -iq -gov.iq -edu.iq -mil.iq -com.iq -org.iq -net.iq - -// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules -// Also see http://www.nic.ir/Internationalized_Domain_Names -// Two .ir entries added at request of , 2010-04-16 -ir -ac.ir -co.ir -gov.ir -id.ir -net.ir -org.ir -sch.ir -// xn--mgba3a4f16a.ir (.ir, Persian YEH) -ایران.ir -// xn--mgba3a4fra.ir (.ir, Arabic YEH) -ايران.ir - -// is : http://www.isnic.is/domain/rules.php -// Confirmed by registry 2008-12-06 -is -net.is -com.is -edu.is -gov.is -org.is -int.is - -// it : https://en.wikipedia.org/wiki/.it -it -gov.it -edu.it -// Reserved geo-names: -// http://www.nic.it/documenti/regolamenti-e-linee-guida/regolamento-assegnazione-versione-6.0.pdf -// There is also a list of reserved geo-names corresponding to Italian municipalities -// http://www.nic.it/documenti/appendice-c.pdf, but it is not included here. -// Regions -abr.it -abruzzo.it -aosta-valley.it -aostavalley.it -bas.it -basilicata.it -cal.it -calabria.it -cam.it -campania.it -emilia-romagna.it -emiliaromagna.it -emr.it -friuli-v-giulia.it -friuli-ve-giulia.it -friuli-vegiulia.it -friuli-venezia-giulia.it -friuli-veneziagiulia.it -friuli-vgiulia.it -friuliv-giulia.it -friulive-giulia.it -friulivegiulia.it -friulivenezia-giulia.it -friuliveneziagiulia.it -friulivgiulia.it -fvg.it -laz.it -lazio.it -lig.it -liguria.it -lom.it -lombardia.it -lombardy.it -lucania.it -mar.it -marche.it -mol.it -molise.it -piedmont.it -piemonte.it -pmn.it -pug.it -puglia.it -sar.it -sardegna.it -sardinia.it -sic.it -sicilia.it -sicily.it -taa.it -tos.it -toscana.it -trentino-a-adige.it -trentino-aadige.it -trentino-alto-adige.it -trentino-altoadige.it -trentino-s-tirol.it -trentino-stirol.it -trentino-sud-tirol.it -trentino-sudtirol.it -trentino-sued-tirol.it -trentino-suedtirol.it -trentinoa-adige.it -trentinoaadige.it -trentinoalto-adige.it -trentinoaltoadige.it -trentinos-tirol.it -trentinostirol.it -trentinosud-tirol.it -trentinosudtirol.it -trentinosued-tirol.it -trentinosuedtirol.it -tuscany.it -umb.it -umbria.it -val-d-aosta.it -val-daosta.it -vald-aosta.it -valdaosta.it -valle-aosta.it -valle-d-aosta.it -valle-daosta.it -valleaosta.it -valled-aosta.it -valledaosta.it -vallee-aoste.it -valleeaoste.it -vao.it -vda.it -ven.it -veneto.it -// Provinces -ag.it -agrigento.it -al.it -alessandria.it -alto-adige.it -altoadige.it -an.it -ancona.it -andria-barletta-trani.it -andria-trani-barletta.it -andriabarlettatrani.it -andriatranibarletta.it -ao.it -aosta.it -aoste.it -ap.it -aq.it -aquila.it -ar.it -arezzo.it -ascoli-piceno.it -ascolipiceno.it -asti.it -at.it -av.it -avellino.it -ba.it -balsan.it -bari.it -barletta-trani-andria.it -barlettatraniandria.it -belluno.it -benevento.it -bergamo.it -bg.it -bi.it -biella.it -bl.it -bn.it -bo.it -bologna.it -bolzano.it -bozen.it -br.it -brescia.it -brindisi.it -bs.it -bt.it -bz.it -ca.it -cagliari.it -caltanissetta.it -campidano-medio.it -campidanomedio.it -campobasso.it -carbonia-iglesias.it -carboniaiglesias.it -carrara-massa.it -carraramassa.it -caserta.it -catania.it -catanzaro.it -cb.it -ce.it -cesena-forli.it -cesenaforli.it -ch.it -chieti.it -ci.it -cl.it -cn.it -co.it -como.it -cosenza.it -cr.it -cremona.it -crotone.it -cs.it -ct.it -cuneo.it -cz.it -dell-ogliastra.it -dellogliastra.it -en.it -enna.it -fc.it -fe.it -fermo.it -ferrara.it -fg.it -fi.it -firenze.it -florence.it -fm.it -foggia.it -forli-cesena.it -forlicesena.it -fr.it -frosinone.it -ge.it -genoa.it -genova.it -go.it -gorizia.it -gr.it -grosseto.it -iglesias-carbonia.it -iglesiascarbonia.it -im.it -imperia.it -is.it -isernia.it -kr.it -la-spezia.it -laquila.it -laspezia.it -latina.it -lc.it -le.it -lecce.it -lecco.it -li.it -livorno.it -lo.it -lodi.it -lt.it -lu.it -lucca.it -macerata.it -mantova.it -massa-carrara.it -massacarrara.it -matera.it -mb.it -mc.it -me.it -medio-campidano.it -mediocampidano.it -messina.it -mi.it -milan.it -milano.it -mn.it -mo.it -modena.it -monza-brianza.it -monza-e-della-brianza.it -monza.it -monzabrianza.it -monzaebrianza.it -monzaedellabrianza.it -ms.it -mt.it -na.it -naples.it -napoli.it -no.it -novara.it -nu.it -nuoro.it -og.it -ogliastra.it -olbia-tempio.it -olbiatempio.it -or.it -oristano.it -ot.it -pa.it -padova.it -padua.it -palermo.it -parma.it -pavia.it -pc.it -pd.it -pe.it -perugia.it -pesaro-urbino.it -pesarourbino.it -pescara.it -pg.it -pi.it -piacenza.it -pisa.it -pistoia.it -pn.it -po.it -pordenone.it -potenza.it -pr.it -prato.it -pt.it -pu.it -pv.it -pz.it -ra.it -ragusa.it -ravenna.it -rc.it -re.it -reggio-calabria.it -reggio-emilia.it -reggiocalabria.it -reggioemilia.it -rg.it -ri.it -rieti.it -rimini.it -rm.it -rn.it -ro.it -roma.it -rome.it -rovigo.it -sa.it -salerno.it -sassari.it -savona.it -si.it -siena.it -siracusa.it -so.it -sondrio.it -sp.it -sr.it -ss.it -suedtirol.it -sv.it -ta.it -taranto.it -te.it -tempio-olbia.it -tempioolbia.it -teramo.it -terni.it -tn.it -to.it -torino.it -tp.it -tr.it -trani-andria-barletta.it -trani-barletta-andria.it -traniandriabarletta.it -tranibarlettaandria.it -trapani.it -trentino.it -trento.it -treviso.it -trieste.it -ts.it -turin.it -tv.it -ud.it -udine.it -urbino-pesaro.it -urbinopesaro.it -va.it -varese.it -vb.it -vc.it -ve.it -venezia.it -venice.it -verbania.it -vercelli.it -verona.it -vi.it -vibo-valentia.it -vibovalentia.it -vicenza.it -viterbo.it -vr.it -vs.it -vt.it -vv.it - -// je : http://www.channelisles.net/register-domains/ -// Confirmed by registry 2013-11-28 -je -co.je -net.je -org.je - -// jm : http://www.com.jm/register.html -*.jm - -// jo : http://www.dns.jo/Registration_policy.aspx -jo -com.jo -org.jo -net.jo -edu.jo -sch.jo -gov.jo -mil.jo -name.jo - -// jobs : https://en.wikipedia.org/wiki/.jobs -jobs - -// jp : https://en.wikipedia.org/wiki/.jp -// http://jprs.co.jp/en/jpdomain.html -// Submitted by registry -jp -// jp organizational type names -ac.jp -ad.jp -co.jp -ed.jp -go.jp -gr.jp -lg.jp -ne.jp -or.jp -// jp prefecture type names -aichi.jp -akita.jp -aomori.jp -chiba.jp -ehime.jp -fukui.jp -fukuoka.jp -fukushima.jp -gifu.jp -gunma.jp -hiroshima.jp -hokkaido.jp -hyogo.jp -ibaraki.jp -ishikawa.jp -iwate.jp -kagawa.jp -kagoshima.jp -kanagawa.jp -kochi.jp -kumamoto.jp -kyoto.jp -mie.jp -miyagi.jp -miyazaki.jp -nagano.jp -nagasaki.jp -nara.jp -niigata.jp -oita.jp -okayama.jp -okinawa.jp -osaka.jp -saga.jp -saitama.jp -shiga.jp -shimane.jp -shizuoka.jp -tochigi.jp -tokushima.jp -tokyo.jp -tottori.jp -toyama.jp -wakayama.jp -yamagata.jp -yamaguchi.jp -yamanashi.jp -栃木.jp -愛知.jp -愛媛.jp -兵庫.jp -熊本.jp -茨城.jp -北海道.jp -千葉.jp -和歌山.jp -長崎.jp -長野.jp -新潟.jp -青森.jp -静岡.jp -東京.jp -石川.jp -埼玉.jp -三重.jp -京都.jp -佐賀.jp -大分.jp -大阪.jp -奈良.jp -宮城.jp -宮崎.jp -富山.jp -山口.jp -山形.jp -山梨.jp -岩手.jp -岐阜.jp -岡山.jp -島根.jp -広島.jp -徳島.jp -沖縄.jp -滋賀.jp -神奈川.jp -福井.jp -福岡.jp -福島.jp -秋田.jp -群馬.jp -香川.jp -高知.jp -鳥取.jp -鹿児島.jp -// jp geographic type names -// http://jprs.jp/doc/rule/saisoku-1.html -*.kawasaki.jp -*.kitakyushu.jp -*.kobe.jp -*.nagoya.jp -*.sapporo.jp -*.sendai.jp -*.yokohama.jp -!city.kawasaki.jp -!city.kitakyushu.jp -!city.kobe.jp -!city.nagoya.jp -!city.sapporo.jp -!city.sendai.jp -!city.yokohama.jp -// 4th level registration -aisai.aichi.jp -ama.aichi.jp -anjo.aichi.jp -asuke.aichi.jp -chiryu.aichi.jp -chita.aichi.jp -fuso.aichi.jp -gamagori.aichi.jp -handa.aichi.jp -hazu.aichi.jp -hekinan.aichi.jp -higashiura.aichi.jp -ichinomiya.aichi.jp -inazawa.aichi.jp -inuyama.aichi.jp -isshiki.aichi.jp -iwakura.aichi.jp -kanie.aichi.jp -kariya.aichi.jp -kasugai.aichi.jp -kira.aichi.jp -kiyosu.aichi.jp -komaki.aichi.jp -konan.aichi.jp -kota.aichi.jp -mihama.aichi.jp -miyoshi.aichi.jp -nishio.aichi.jp -nisshin.aichi.jp -obu.aichi.jp -oguchi.aichi.jp -oharu.aichi.jp -okazaki.aichi.jp -owariasahi.aichi.jp -seto.aichi.jp -shikatsu.aichi.jp -shinshiro.aichi.jp -shitara.aichi.jp -tahara.aichi.jp -takahama.aichi.jp -tobishima.aichi.jp -toei.aichi.jp -togo.aichi.jp -tokai.aichi.jp -tokoname.aichi.jp -toyoake.aichi.jp -toyohashi.aichi.jp -toyokawa.aichi.jp -toyone.aichi.jp -toyota.aichi.jp -tsushima.aichi.jp -yatomi.aichi.jp -akita.akita.jp -daisen.akita.jp -fujisato.akita.jp -gojome.akita.jp -hachirogata.akita.jp -happou.akita.jp -higashinaruse.akita.jp -honjo.akita.jp -honjyo.akita.jp -ikawa.akita.jp -kamikoani.akita.jp -kamioka.akita.jp -katagami.akita.jp -kazuno.akita.jp -kitaakita.akita.jp -kosaka.akita.jp -kyowa.akita.jp -misato.akita.jp -mitane.akita.jp -moriyoshi.akita.jp -nikaho.akita.jp -noshiro.akita.jp -odate.akita.jp -oga.akita.jp -ogata.akita.jp -semboku.akita.jp -yokote.akita.jp -yurihonjo.akita.jp -aomori.aomori.jp -gonohe.aomori.jp -hachinohe.aomori.jp -hashikami.aomori.jp -hiranai.aomori.jp -hirosaki.aomori.jp -itayanagi.aomori.jp -kuroishi.aomori.jp -misawa.aomori.jp -mutsu.aomori.jp -nakadomari.aomori.jp -noheji.aomori.jp -oirase.aomori.jp -owani.aomori.jp -rokunohe.aomori.jp -sannohe.aomori.jp -shichinohe.aomori.jp -shingo.aomori.jp -takko.aomori.jp -towada.aomori.jp -tsugaru.aomori.jp -tsuruta.aomori.jp -abiko.chiba.jp -asahi.chiba.jp -chonan.chiba.jp -chosei.chiba.jp -choshi.chiba.jp -chuo.chiba.jp -funabashi.chiba.jp -futtsu.chiba.jp -hanamigawa.chiba.jp -ichihara.chiba.jp -ichikawa.chiba.jp -ichinomiya.chiba.jp -inzai.chiba.jp -isumi.chiba.jp -kamagaya.chiba.jp -kamogawa.chiba.jp -kashiwa.chiba.jp -katori.chiba.jp -katsuura.chiba.jp -kimitsu.chiba.jp -kisarazu.chiba.jp -kozaki.chiba.jp -kujukuri.chiba.jp -kyonan.chiba.jp -matsudo.chiba.jp -midori.chiba.jp -mihama.chiba.jp -minamiboso.chiba.jp -mobara.chiba.jp -mutsuzawa.chiba.jp -nagara.chiba.jp -nagareyama.chiba.jp -narashino.chiba.jp -narita.chiba.jp -noda.chiba.jp -oamishirasato.chiba.jp -omigawa.chiba.jp -onjuku.chiba.jp -otaki.chiba.jp -sakae.chiba.jp -sakura.chiba.jp -shimofusa.chiba.jp -shirako.chiba.jp -shiroi.chiba.jp -shisui.chiba.jp -sodegaura.chiba.jp -sosa.chiba.jp -tako.chiba.jp -tateyama.chiba.jp -togane.chiba.jp -tohnosho.chiba.jp -tomisato.chiba.jp -urayasu.chiba.jp -yachimata.chiba.jp -yachiyo.chiba.jp -yokaichiba.chiba.jp -yokoshibahikari.chiba.jp -yotsukaido.chiba.jp -ainan.ehime.jp -honai.ehime.jp -ikata.ehime.jp -imabari.ehime.jp -iyo.ehime.jp -kamijima.ehime.jp -kihoku.ehime.jp -kumakogen.ehime.jp -masaki.ehime.jp -matsuno.ehime.jp -matsuyama.ehime.jp -namikata.ehime.jp -niihama.ehime.jp -ozu.ehime.jp -saijo.ehime.jp -seiyo.ehime.jp -shikokuchuo.ehime.jp -tobe.ehime.jp -toon.ehime.jp -uchiko.ehime.jp -uwajima.ehime.jp -yawatahama.ehime.jp -echizen.fukui.jp -eiheiji.fukui.jp -fukui.fukui.jp -ikeda.fukui.jp -katsuyama.fukui.jp -mihama.fukui.jp -minamiechizen.fukui.jp -obama.fukui.jp -ohi.fukui.jp -ono.fukui.jp -sabae.fukui.jp -sakai.fukui.jp -takahama.fukui.jp -tsuruga.fukui.jp -wakasa.fukui.jp -ashiya.fukuoka.jp -buzen.fukuoka.jp -chikugo.fukuoka.jp -chikuho.fukuoka.jp -chikujo.fukuoka.jp -chikushino.fukuoka.jp -chikuzen.fukuoka.jp -chuo.fukuoka.jp -dazaifu.fukuoka.jp -fukuchi.fukuoka.jp -hakata.fukuoka.jp -higashi.fukuoka.jp -hirokawa.fukuoka.jp -hisayama.fukuoka.jp -iizuka.fukuoka.jp -inatsuki.fukuoka.jp -kaho.fukuoka.jp -kasuga.fukuoka.jp -kasuya.fukuoka.jp -kawara.fukuoka.jp -keisen.fukuoka.jp -koga.fukuoka.jp -kurate.fukuoka.jp -kurogi.fukuoka.jp -kurume.fukuoka.jp -minami.fukuoka.jp -miyako.fukuoka.jp -miyama.fukuoka.jp -miyawaka.fukuoka.jp -mizumaki.fukuoka.jp -munakata.fukuoka.jp -nakagawa.fukuoka.jp -nakama.fukuoka.jp -nishi.fukuoka.jp -nogata.fukuoka.jp -ogori.fukuoka.jp -okagaki.fukuoka.jp -okawa.fukuoka.jp -oki.fukuoka.jp -omuta.fukuoka.jp -onga.fukuoka.jp -onojo.fukuoka.jp -oto.fukuoka.jp -saigawa.fukuoka.jp -sasaguri.fukuoka.jp -shingu.fukuoka.jp -shinyoshitomi.fukuoka.jp -shonai.fukuoka.jp -soeda.fukuoka.jp -sue.fukuoka.jp -tachiarai.fukuoka.jp -tagawa.fukuoka.jp -takata.fukuoka.jp -toho.fukuoka.jp -toyotsu.fukuoka.jp -tsuiki.fukuoka.jp -ukiha.fukuoka.jp -umi.fukuoka.jp -usui.fukuoka.jp -yamada.fukuoka.jp -yame.fukuoka.jp -yanagawa.fukuoka.jp -yukuhashi.fukuoka.jp -aizubange.fukushima.jp -aizumisato.fukushima.jp -aizuwakamatsu.fukushima.jp -asakawa.fukushima.jp -bandai.fukushima.jp -date.fukushima.jp -fukushima.fukushima.jp -furudono.fukushima.jp -futaba.fukushima.jp -hanawa.fukushima.jp -higashi.fukushima.jp -hirata.fukushima.jp -hirono.fukushima.jp -iitate.fukushima.jp -inawashiro.fukushima.jp -ishikawa.fukushima.jp -iwaki.fukushima.jp -izumizaki.fukushima.jp -kagamiishi.fukushima.jp -kaneyama.fukushima.jp -kawamata.fukushima.jp -kitakata.fukushima.jp -kitashiobara.fukushima.jp -koori.fukushima.jp -koriyama.fukushima.jp -kunimi.fukushima.jp -miharu.fukushima.jp -mishima.fukushima.jp -namie.fukushima.jp -nango.fukushima.jp -nishiaizu.fukushima.jp -nishigo.fukushima.jp -okuma.fukushima.jp -omotego.fukushima.jp -ono.fukushima.jp -otama.fukushima.jp -samegawa.fukushima.jp -shimogo.fukushima.jp -shirakawa.fukushima.jp -showa.fukushima.jp -soma.fukushima.jp -sukagawa.fukushima.jp -taishin.fukushima.jp -tamakawa.fukushima.jp -tanagura.fukushima.jp -tenei.fukushima.jp -yabuki.fukushima.jp -yamato.fukushima.jp -yamatsuri.fukushima.jp -yanaizu.fukushima.jp -yugawa.fukushima.jp -anpachi.gifu.jp -ena.gifu.jp -gifu.gifu.jp -ginan.gifu.jp -godo.gifu.jp -gujo.gifu.jp -hashima.gifu.jp -hichiso.gifu.jp -hida.gifu.jp -higashishirakawa.gifu.jp -ibigawa.gifu.jp -ikeda.gifu.jp -kakamigahara.gifu.jp -kani.gifu.jp -kasahara.gifu.jp -kasamatsu.gifu.jp -kawaue.gifu.jp -kitagata.gifu.jp -mino.gifu.jp -minokamo.gifu.jp -mitake.gifu.jp -mizunami.gifu.jp -motosu.gifu.jp -nakatsugawa.gifu.jp -ogaki.gifu.jp -sakahogi.gifu.jp -seki.gifu.jp -sekigahara.gifu.jp -shirakawa.gifu.jp -tajimi.gifu.jp -takayama.gifu.jp -tarui.gifu.jp -toki.gifu.jp -tomika.gifu.jp -wanouchi.gifu.jp -yamagata.gifu.jp -yaotsu.gifu.jp -yoro.gifu.jp -annaka.gunma.jp -chiyoda.gunma.jp -fujioka.gunma.jp -higashiagatsuma.gunma.jp -isesaki.gunma.jp -itakura.gunma.jp -kanna.gunma.jp -kanra.gunma.jp -katashina.gunma.jp -kawaba.gunma.jp -kiryu.gunma.jp -kusatsu.gunma.jp -maebashi.gunma.jp -meiwa.gunma.jp -midori.gunma.jp -minakami.gunma.jp -naganohara.gunma.jp -nakanojo.gunma.jp -nanmoku.gunma.jp -numata.gunma.jp -oizumi.gunma.jp -ora.gunma.jp -ota.gunma.jp -shibukawa.gunma.jp -shimonita.gunma.jp -shinto.gunma.jp -showa.gunma.jp -takasaki.gunma.jp -takayama.gunma.jp -tamamura.gunma.jp -tatebayashi.gunma.jp -tomioka.gunma.jp -tsukiyono.gunma.jp -tsumagoi.gunma.jp -ueno.gunma.jp -yoshioka.gunma.jp -asaminami.hiroshima.jp -daiwa.hiroshima.jp -etajima.hiroshima.jp -fuchu.hiroshima.jp -fukuyama.hiroshima.jp -hatsukaichi.hiroshima.jp -higashihiroshima.hiroshima.jp -hongo.hiroshima.jp -jinsekikogen.hiroshima.jp -kaita.hiroshima.jp -kui.hiroshima.jp -kumano.hiroshima.jp -kure.hiroshima.jp -mihara.hiroshima.jp -miyoshi.hiroshima.jp -naka.hiroshima.jp -onomichi.hiroshima.jp -osakikamijima.hiroshima.jp -otake.hiroshima.jp -saka.hiroshima.jp -sera.hiroshima.jp -seranishi.hiroshima.jp -shinichi.hiroshima.jp -shobara.hiroshima.jp -takehara.hiroshima.jp -abashiri.hokkaido.jp -abira.hokkaido.jp -aibetsu.hokkaido.jp -akabira.hokkaido.jp -akkeshi.hokkaido.jp -asahikawa.hokkaido.jp -ashibetsu.hokkaido.jp -ashoro.hokkaido.jp -assabu.hokkaido.jp -atsuma.hokkaido.jp -bibai.hokkaido.jp -biei.hokkaido.jp -bifuka.hokkaido.jp -bihoro.hokkaido.jp -biratori.hokkaido.jp -chippubetsu.hokkaido.jp -chitose.hokkaido.jp -date.hokkaido.jp -ebetsu.hokkaido.jp -embetsu.hokkaido.jp -eniwa.hokkaido.jp -erimo.hokkaido.jp -esan.hokkaido.jp -esashi.hokkaido.jp -fukagawa.hokkaido.jp -fukushima.hokkaido.jp -furano.hokkaido.jp -furubira.hokkaido.jp -haboro.hokkaido.jp -hakodate.hokkaido.jp -hamatonbetsu.hokkaido.jp -hidaka.hokkaido.jp -higashikagura.hokkaido.jp -higashikawa.hokkaido.jp -hiroo.hokkaido.jp -hokuryu.hokkaido.jp -hokuto.hokkaido.jp -honbetsu.hokkaido.jp -horokanai.hokkaido.jp -horonobe.hokkaido.jp -ikeda.hokkaido.jp -imakane.hokkaido.jp -ishikari.hokkaido.jp -iwamizawa.hokkaido.jp -iwanai.hokkaido.jp -kamifurano.hokkaido.jp -kamikawa.hokkaido.jp -kamishihoro.hokkaido.jp -kamisunagawa.hokkaido.jp -kamoenai.hokkaido.jp -kayabe.hokkaido.jp -kembuchi.hokkaido.jp -kikonai.hokkaido.jp -kimobetsu.hokkaido.jp -kitahiroshima.hokkaido.jp -kitami.hokkaido.jp -kiyosato.hokkaido.jp -koshimizu.hokkaido.jp -kunneppu.hokkaido.jp -kuriyama.hokkaido.jp -kuromatsunai.hokkaido.jp -kushiro.hokkaido.jp -kutchan.hokkaido.jp -kyowa.hokkaido.jp -mashike.hokkaido.jp -matsumae.hokkaido.jp -mikasa.hokkaido.jp -minamifurano.hokkaido.jp -mombetsu.hokkaido.jp -moseushi.hokkaido.jp -mukawa.hokkaido.jp -muroran.hokkaido.jp -naie.hokkaido.jp -nakagawa.hokkaido.jp -nakasatsunai.hokkaido.jp -nakatombetsu.hokkaido.jp -nanae.hokkaido.jp -nanporo.hokkaido.jp -nayoro.hokkaido.jp -nemuro.hokkaido.jp -niikappu.hokkaido.jp -niki.hokkaido.jp -nishiokoppe.hokkaido.jp -noboribetsu.hokkaido.jp -numata.hokkaido.jp -obihiro.hokkaido.jp -obira.hokkaido.jp -oketo.hokkaido.jp -okoppe.hokkaido.jp -otaru.hokkaido.jp -otobe.hokkaido.jp -otofuke.hokkaido.jp -otoineppu.hokkaido.jp -oumu.hokkaido.jp -ozora.hokkaido.jp -pippu.hokkaido.jp -rankoshi.hokkaido.jp -rebun.hokkaido.jp -rikubetsu.hokkaido.jp -rishiri.hokkaido.jp -rishirifuji.hokkaido.jp -saroma.hokkaido.jp -sarufutsu.hokkaido.jp -shakotan.hokkaido.jp -shari.hokkaido.jp -shibecha.hokkaido.jp -shibetsu.hokkaido.jp -shikabe.hokkaido.jp -shikaoi.hokkaido.jp -shimamaki.hokkaido.jp -shimizu.hokkaido.jp -shimokawa.hokkaido.jp -shinshinotsu.hokkaido.jp -shintoku.hokkaido.jp -shiranuka.hokkaido.jp -shiraoi.hokkaido.jp -shiriuchi.hokkaido.jp -sobetsu.hokkaido.jp -sunagawa.hokkaido.jp -taiki.hokkaido.jp -takasu.hokkaido.jp -takikawa.hokkaido.jp -takinoue.hokkaido.jp -teshikaga.hokkaido.jp -tobetsu.hokkaido.jp -tohma.hokkaido.jp -tomakomai.hokkaido.jp -tomari.hokkaido.jp -toya.hokkaido.jp -toyako.hokkaido.jp -toyotomi.hokkaido.jp -toyoura.hokkaido.jp -tsubetsu.hokkaido.jp -tsukigata.hokkaido.jp -urakawa.hokkaido.jp -urausu.hokkaido.jp -uryu.hokkaido.jp -utashinai.hokkaido.jp -wakkanai.hokkaido.jp -wassamu.hokkaido.jp -yakumo.hokkaido.jp -yoichi.hokkaido.jp -aioi.hyogo.jp -akashi.hyogo.jp -ako.hyogo.jp -amagasaki.hyogo.jp -aogaki.hyogo.jp -asago.hyogo.jp -ashiya.hyogo.jp -awaji.hyogo.jp -fukusaki.hyogo.jp -goshiki.hyogo.jp -harima.hyogo.jp -himeji.hyogo.jp -ichikawa.hyogo.jp -inagawa.hyogo.jp -itami.hyogo.jp -kakogawa.hyogo.jp -kamigori.hyogo.jp -kamikawa.hyogo.jp -kasai.hyogo.jp -kasuga.hyogo.jp -kawanishi.hyogo.jp -miki.hyogo.jp -minamiawaji.hyogo.jp -nishinomiya.hyogo.jp -nishiwaki.hyogo.jp -ono.hyogo.jp -sanda.hyogo.jp -sannan.hyogo.jp -sasayama.hyogo.jp -sayo.hyogo.jp -shingu.hyogo.jp -shinonsen.hyogo.jp -shiso.hyogo.jp -sumoto.hyogo.jp -taishi.hyogo.jp -taka.hyogo.jp -takarazuka.hyogo.jp -takasago.hyogo.jp -takino.hyogo.jp -tamba.hyogo.jp -tatsuno.hyogo.jp -toyooka.hyogo.jp -yabu.hyogo.jp -yashiro.hyogo.jp -yoka.hyogo.jp -yokawa.hyogo.jp -ami.ibaraki.jp -asahi.ibaraki.jp -bando.ibaraki.jp -chikusei.ibaraki.jp -daigo.ibaraki.jp -fujishiro.ibaraki.jp -hitachi.ibaraki.jp -hitachinaka.ibaraki.jp -hitachiomiya.ibaraki.jp -hitachiota.ibaraki.jp -ibaraki.ibaraki.jp -ina.ibaraki.jp -inashiki.ibaraki.jp -itako.ibaraki.jp -iwama.ibaraki.jp -joso.ibaraki.jp -kamisu.ibaraki.jp -kasama.ibaraki.jp -kashima.ibaraki.jp -kasumigaura.ibaraki.jp -koga.ibaraki.jp -miho.ibaraki.jp -mito.ibaraki.jp -moriya.ibaraki.jp -naka.ibaraki.jp -namegata.ibaraki.jp -oarai.ibaraki.jp -ogawa.ibaraki.jp -omitama.ibaraki.jp -ryugasaki.ibaraki.jp -sakai.ibaraki.jp -sakuragawa.ibaraki.jp -shimodate.ibaraki.jp -shimotsuma.ibaraki.jp -shirosato.ibaraki.jp -sowa.ibaraki.jp -suifu.ibaraki.jp -takahagi.ibaraki.jp -tamatsukuri.ibaraki.jp -tokai.ibaraki.jp -tomobe.ibaraki.jp -tone.ibaraki.jp -toride.ibaraki.jp -tsuchiura.ibaraki.jp -tsukuba.ibaraki.jp -uchihara.ibaraki.jp -ushiku.ibaraki.jp -yachiyo.ibaraki.jp -yamagata.ibaraki.jp -yawara.ibaraki.jp -yuki.ibaraki.jp -anamizu.ishikawa.jp -hakui.ishikawa.jp -hakusan.ishikawa.jp -kaga.ishikawa.jp -kahoku.ishikawa.jp -kanazawa.ishikawa.jp -kawakita.ishikawa.jp -komatsu.ishikawa.jp -nakanoto.ishikawa.jp -nanao.ishikawa.jp -nomi.ishikawa.jp -nonoichi.ishikawa.jp -noto.ishikawa.jp -shika.ishikawa.jp -suzu.ishikawa.jp -tsubata.ishikawa.jp -tsurugi.ishikawa.jp -uchinada.ishikawa.jp -wajima.ishikawa.jp -fudai.iwate.jp -fujisawa.iwate.jp -hanamaki.iwate.jp -hiraizumi.iwate.jp -hirono.iwate.jp -ichinohe.iwate.jp -ichinoseki.iwate.jp -iwaizumi.iwate.jp -iwate.iwate.jp -joboji.iwate.jp -kamaishi.iwate.jp -kanegasaki.iwate.jp -karumai.iwate.jp -kawai.iwate.jp -kitakami.iwate.jp -kuji.iwate.jp -kunohe.iwate.jp -kuzumaki.iwate.jp -miyako.iwate.jp -mizusawa.iwate.jp -morioka.iwate.jp -ninohe.iwate.jp -noda.iwate.jp -ofunato.iwate.jp -oshu.iwate.jp -otsuchi.iwate.jp -rikuzentakata.iwate.jp -shiwa.iwate.jp -shizukuishi.iwate.jp -sumita.iwate.jp -tanohata.iwate.jp -tono.iwate.jp -yahaba.iwate.jp -yamada.iwate.jp -ayagawa.kagawa.jp -higashikagawa.kagawa.jp -kanonji.kagawa.jp -kotohira.kagawa.jp -manno.kagawa.jp -marugame.kagawa.jp -mitoyo.kagawa.jp -naoshima.kagawa.jp -sanuki.kagawa.jp -tadotsu.kagawa.jp -takamatsu.kagawa.jp -tonosho.kagawa.jp -uchinomi.kagawa.jp -utazu.kagawa.jp -zentsuji.kagawa.jp -akune.kagoshima.jp -amami.kagoshima.jp -hioki.kagoshima.jp -isa.kagoshima.jp -isen.kagoshima.jp -izumi.kagoshima.jp -kagoshima.kagoshima.jp -kanoya.kagoshima.jp -kawanabe.kagoshima.jp -kinko.kagoshima.jp -kouyama.kagoshima.jp -makurazaki.kagoshima.jp -matsumoto.kagoshima.jp -minamitane.kagoshima.jp -nakatane.kagoshima.jp -nishinoomote.kagoshima.jp -satsumasendai.kagoshima.jp -soo.kagoshima.jp -tarumizu.kagoshima.jp -yusui.kagoshima.jp -aikawa.kanagawa.jp -atsugi.kanagawa.jp -ayase.kanagawa.jp -chigasaki.kanagawa.jp -ebina.kanagawa.jp -fujisawa.kanagawa.jp -hadano.kanagawa.jp -hakone.kanagawa.jp -hiratsuka.kanagawa.jp -isehara.kanagawa.jp -kaisei.kanagawa.jp -kamakura.kanagawa.jp -kiyokawa.kanagawa.jp -matsuda.kanagawa.jp -minamiashigara.kanagawa.jp -miura.kanagawa.jp -nakai.kanagawa.jp -ninomiya.kanagawa.jp -odawara.kanagawa.jp -oi.kanagawa.jp -oiso.kanagawa.jp -sagamihara.kanagawa.jp -samukawa.kanagawa.jp -tsukui.kanagawa.jp -yamakita.kanagawa.jp -yamato.kanagawa.jp -yokosuka.kanagawa.jp -yugawara.kanagawa.jp -zama.kanagawa.jp -zushi.kanagawa.jp -aki.kochi.jp -geisei.kochi.jp -hidaka.kochi.jp -higashitsuno.kochi.jp -ino.kochi.jp -kagami.kochi.jp -kami.kochi.jp -kitagawa.kochi.jp -kochi.kochi.jp -mihara.kochi.jp -motoyama.kochi.jp -muroto.kochi.jp -nahari.kochi.jp -nakamura.kochi.jp -nankoku.kochi.jp -nishitosa.kochi.jp -niyodogawa.kochi.jp -ochi.kochi.jp -okawa.kochi.jp -otoyo.kochi.jp -otsuki.kochi.jp -sakawa.kochi.jp -sukumo.kochi.jp -susaki.kochi.jp -tosa.kochi.jp -tosashimizu.kochi.jp -toyo.kochi.jp -tsuno.kochi.jp -umaji.kochi.jp -yasuda.kochi.jp -yusuhara.kochi.jp -amakusa.kumamoto.jp -arao.kumamoto.jp -aso.kumamoto.jp -choyo.kumamoto.jp -gyokuto.kumamoto.jp -kamiamakusa.kumamoto.jp -kikuchi.kumamoto.jp -kumamoto.kumamoto.jp -mashiki.kumamoto.jp -mifune.kumamoto.jp -minamata.kumamoto.jp -minamioguni.kumamoto.jp -nagasu.kumamoto.jp -nishihara.kumamoto.jp -oguni.kumamoto.jp -ozu.kumamoto.jp -sumoto.kumamoto.jp -takamori.kumamoto.jp -uki.kumamoto.jp -uto.kumamoto.jp -yamaga.kumamoto.jp -yamato.kumamoto.jp -yatsushiro.kumamoto.jp -ayabe.kyoto.jp -fukuchiyama.kyoto.jp -higashiyama.kyoto.jp -ide.kyoto.jp -ine.kyoto.jp -joyo.kyoto.jp -kameoka.kyoto.jp -kamo.kyoto.jp -kita.kyoto.jp -kizu.kyoto.jp -kumiyama.kyoto.jp -kyotamba.kyoto.jp -kyotanabe.kyoto.jp -kyotango.kyoto.jp -maizuru.kyoto.jp -minami.kyoto.jp -minamiyamashiro.kyoto.jp -miyazu.kyoto.jp -muko.kyoto.jp -nagaokakyo.kyoto.jp -nakagyo.kyoto.jp -nantan.kyoto.jp -oyamazaki.kyoto.jp -sakyo.kyoto.jp -seika.kyoto.jp -tanabe.kyoto.jp -uji.kyoto.jp -ujitawara.kyoto.jp -wazuka.kyoto.jp -yamashina.kyoto.jp -yawata.kyoto.jp -asahi.mie.jp -inabe.mie.jp -ise.mie.jp -kameyama.mie.jp -kawagoe.mie.jp -kiho.mie.jp -kisosaki.mie.jp -kiwa.mie.jp -komono.mie.jp -kumano.mie.jp -kuwana.mie.jp -matsusaka.mie.jp -meiwa.mie.jp -mihama.mie.jp -minamiise.mie.jp -misugi.mie.jp -miyama.mie.jp -nabari.mie.jp -shima.mie.jp -suzuka.mie.jp -tado.mie.jp -taiki.mie.jp -taki.mie.jp -tamaki.mie.jp -toba.mie.jp -tsu.mie.jp -udono.mie.jp -ureshino.mie.jp -watarai.mie.jp -yokkaichi.mie.jp -furukawa.miyagi.jp -higashimatsushima.miyagi.jp -ishinomaki.miyagi.jp -iwanuma.miyagi.jp -kakuda.miyagi.jp -kami.miyagi.jp -kawasaki.miyagi.jp -marumori.miyagi.jp -matsushima.miyagi.jp -minamisanriku.miyagi.jp -misato.miyagi.jp -murata.miyagi.jp -natori.miyagi.jp -ogawara.miyagi.jp -ohira.miyagi.jp -onagawa.miyagi.jp -osaki.miyagi.jp -rifu.miyagi.jp -semine.miyagi.jp -shibata.miyagi.jp -shichikashuku.miyagi.jp -shikama.miyagi.jp -shiogama.miyagi.jp -shiroishi.miyagi.jp -tagajo.miyagi.jp -taiwa.miyagi.jp -tome.miyagi.jp -tomiya.miyagi.jp -wakuya.miyagi.jp -watari.miyagi.jp -yamamoto.miyagi.jp -zao.miyagi.jp -aya.miyazaki.jp -ebino.miyazaki.jp -gokase.miyazaki.jp -hyuga.miyazaki.jp -kadogawa.miyazaki.jp -kawaminami.miyazaki.jp -kijo.miyazaki.jp -kitagawa.miyazaki.jp -kitakata.miyazaki.jp -kitaura.miyazaki.jp -kobayashi.miyazaki.jp -kunitomi.miyazaki.jp -kushima.miyazaki.jp -mimata.miyazaki.jp -miyakonojo.miyazaki.jp -miyazaki.miyazaki.jp -morotsuka.miyazaki.jp -nichinan.miyazaki.jp -nishimera.miyazaki.jp -nobeoka.miyazaki.jp -saito.miyazaki.jp -shiiba.miyazaki.jp -shintomi.miyazaki.jp -takaharu.miyazaki.jp -takanabe.miyazaki.jp -takazaki.miyazaki.jp -tsuno.miyazaki.jp -achi.nagano.jp -agematsu.nagano.jp -anan.nagano.jp -aoki.nagano.jp -asahi.nagano.jp -azumino.nagano.jp -chikuhoku.nagano.jp -chikuma.nagano.jp -chino.nagano.jp -fujimi.nagano.jp -hakuba.nagano.jp -hara.nagano.jp -hiraya.nagano.jp -iida.nagano.jp -iijima.nagano.jp -iiyama.nagano.jp -iizuna.nagano.jp -ikeda.nagano.jp -ikusaka.nagano.jp -ina.nagano.jp -karuizawa.nagano.jp -kawakami.nagano.jp -kiso.nagano.jp -kisofukushima.nagano.jp -kitaaiki.nagano.jp -komagane.nagano.jp -komoro.nagano.jp -matsukawa.nagano.jp -matsumoto.nagano.jp -miasa.nagano.jp -minamiaiki.nagano.jp -minamimaki.nagano.jp -minamiminowa.nagano.jp -minowa.nagano.jp -miyada.nagano.jp -miyota.nagano.jp -mochizuki.nagano.jp -nagano.nagano.jp -nagawa.nagano.jp -nagiso.nagano.jp -nakagawa.nagano.jp -nakano.nagano.jp -nozawaonsen.nagano.jp -obuse.nagano.jp -ogawa.nagano.jp -okaya.nagano.jp -omachi.nagano.jp -omi.nagano.jp -ookuwa.nagano.jp -ooshika.nagano.jp -otaki.nagano.jp -otari.nagano.jp -sakae.nagano.jp -sakaki.nagano.jp -saku.nagano.jp -sakuho.nagano.jp -shimosuwa.nagano.jp -shinanomachi.nagano.jp -shiojiri.nagano.jp -suwa.nagano.jp -suzaka.nagano.jp -takagi.nagano.jp -takamori.nagano.jp -takayama.nagano.jp -tateshina.nagano.jp -tatsuno.nagano.jp -togakushi.nagano.jp -togura.nagano.jp -tomi.nagano.jp -ueda.nagano.jp -wada.nagano.jp -yamagata.nagano.jp -yamanouchi.nagano.jp -yasaka.nagano.jp -yasuoka.nagano.jp -chijiwa.nagasaki.jp -futsu.nagasaki.jp -goto.nagasaki.jp -hasami.nagasaki.jp -hirado.nagasaki.jp -iki.nagasaki.jp -isahaya.nagasaki.jp -kawatana.nagasaki.jp -kuchinotsu.nagasaki.jp -matsuura.nagasaki.jp -nagasaki.nagasaki.jp -obama.nagasaki.jp -omura.nagasaki.jp -oseto.nagasaki.jp -saikai.nagasaki.jp -sasebo.nagasaki.jp -seihi.nagasaki.jp -shimabara.nagasaki.jp -shinkamigoto.nagasaki.jp -togitsu.nagasaki.jp -tsushima.nagasaki.jp -unzen.nagasaki.jp -ando.nara.jp -gose.nara.jp -heguri.nara.jp -higashiyoshino.nara.jp -ikaruga.nara.jp -ikoma.nara.jp -kamikitayama.nara.jp -kanmaki.nara.jp -kashiba.nara.jp -kashihara.nara.jp -katsuragi.nara.jp -kawai.nara.jp -kawakami.nara.jp -kawanishi.nara.jp -koryo.nara.jp -kurotaki.nara.jp -mitsue.nara.jp -miyake.nara.jp -nara.nara.jp -nosegawa.nara.jp -oji.nara.jp -ouda.nara.jp -oyodo.nara.jp -sakurai.nara.jp -sango.nara.jp -shimoichi.nara.jp -shimokitayama.nara.jp -shinjo.nara.jp -soni.nara.jp -takatori.nara.jp -tawaramoto.nara.jp -tenkawa.nara.jp -tenri.nara.jp -uda.nara.jp -yamatokoriyama.nara.jp -yamatotakada.nara.jp -yamazoe.nara.jp -yoshino.nara.jp -aga.niigata.jp -agano.niigata.jp -gosen.niigata.jp -itoigawa.niigata.jp -izumozaki.niigata.jp -joetsu.niigata.jp -kamo.niigata.jp -kariwa.niigata.jp -kashiwazaki.niigata.jp -minamiuonuma.niigata.jp -mitsuke.niigata.jp -muika.niigata.jp -murakami.niigata.jp -myoko.niigata.jp -nagaoka.niigata.jp -niigata.niigata.jp -ojiya.niigata.jp -omi.niigata.jp -sado.niigata.jp -sanjo.niigata.jp -seiro.niigata.jp -seirou.niigata.jp -sekikawa.niigata.jp -shibata.niigata.jp -tagami.niigata.jp -tainai.niigata.jp -tochio.niigata.jp -tokamachi.niigata.jp -tsubame.niigata.jp -tsunan.niigata.jp -uonuma.niigata.jp -yahiko.niigata.jp -yoita.niigata.jp -yuzawa.niigata.jp -beppu.oita.jp -bungoono.oita.jp -bungotakada.oita.jp -hasama.oita.jp -hiji.oita.jp -himeshima.oita.jp -hita.oita.jp -kamitsue.oita.jp -kokonoe.oita.jp -kuju.oita.jp -kunisaki.oita.jp -kusu.oita.jp -oita.oita.jp -saiki.oita.jp -taketa.oita.jp -tsukumi.oita.jp -usa.oita.jp -usuki.oita.jp -yufu.oita.jp -akaiwa.okayama.jp -asakuchi.okayama.jp -bizen.okayama.jp -hayashima.okayama.jp -ibara.okayama.jp -kagamino.okayama.jp -kasaoka.okayama.jp -kibichuo.okayama.jp -kumenan.okayama.jp -kurashiki.okayama.jp -maniwa.okayama.jp -misaki.okayama.jp -nagi.okayama.jp -niimi.okayama.jp -nishiawakura.okayama.jp -okayama.okayama.jp -satosho.okayama.jp -setouchi.okayama.jp -shinjo.okayama.jp -shoo.okayama.jp -soja.okayama.jp -takahashi.okayama.jp -tamano.okayama.jp -tsuyama.okayama.jp -wake.okayama.jp -yakage.okayama.jp -aguni.okinawa.jp -ginowan.okinawa.jp -ginoza.okinawa.jp -gushikami.okinawa.jp -haebaru.okinawa.jp -higashi.okinawa.jp -hirara.okinawa.jp -iheya.okinawa.jp -ishigaki.okinawa.jp -ishikawa.okinawa.jp -itoman.okinawa.jp -izena.okinawa.jp -kadena.okinawa.jp -kin.okinawa.jp -kitadaito.okinawa.jp -kitanakagusuku.okinawa.jp -kumejima.okinawa.jp -kunigami.okinawa.jp -minamidaito.okinawa.jp -motobu.okinawa.jp -nago.okinawa.jp -naha.okinawa.jp -nakagusuku.okinawa.jp -nakijin.okinawa.jp -nanjo.okinawa.jp -nishihara.okinawa.jp -ogimi.okinawa.jp -okinawa.okinawa.jp -onna.okinawa.jp -shimoji.okinawa.jp -taketomi.okinawa.jp -tarama.okinawa.jp -tokashiki.okinawa.jp -tomigusuku.okinawa.jp -tonaki.okinawa.jp -urasoe.okinawa.jp -uruma.okinawa.jp -yaese.okinawa.jp -yomitan.okinawa.jp -yonabaru.okinawa.jp -yonaguni.okinawa.jp -zamami.okinawa.jp -abeno.osaka.jp -chihayaakasaka.osaka.jp -chuo.osaka.jp -daito.osaka.jp -fujiidera.osaka.jp -habikino.osaka.jp -hannan.osaka.jp -higashiosaka.osaka.jp -higashisumiyoshi.osaka.jp -higashiyodogawa.osaka.jp -hirakata.osaka.jp -ibaraki.osaka.jp -ikeda.osaka.jp -izumi.osaka.jp -izumiotsu.osaka.jp -izumisano.osaka.jp -kadoma.osaka.jp -kaizuka.osaka.jp -kanan.osaka.jp -kashiwara.osaka.jp -katano.osaka.jp -kawachinagano.osaka.jp -kishiwada.osaka.jp -kita.osaka.jp -kumatori.osaka.jp -matsubara.osaka.jp -minato.osaka.jp -minoh.osaka.jp -misaki.osaka.jp -moriguchi.osaka.jp -neyagawa.osaka.jp -nishi.osaka.jp -nose.osaka.jp -osakasayama.osaka.jp -sakai.osaka.jp -sayama.osaka.jp -sennan.osaka.jp -settsu.osaka.jp -shijonawate.osaka.jp -shimamoto.osaka.jp -suita.osaka.jp -tadaoka.osaka.jp -taishi.osaka.jp -tajiri.osaka.jp -takaishi.osaka.jp -takatsuki.osaka.jp -tondabayashi.osaka.jp -toyonaka.osaka.jp -toyono.osaka.jp -yao.osaka.jp -ariake.saga.jp -arita.saga.jp -fukudomi.saga.jp -genkai.saga.jp -hamatama.saga.jp -hizen.saga.jp -imari.saga.jp -kamimine.saga.jp -kanzaki.saga.jp -karatsu.saga.jp -kashima.saga.jp -kitagata.saga.jp -kitahata.saga.jp -kiyama.saga.jp -kouhoku.saga.jp -kyuragi.saga.jp -nishiarita.saga.jp -ogi.saga.jp -omachi.saga.jp -ouchi.saga.jp -saga.saga.jp -shiroishi.saga.jp -taku.saga.jp -tara.saga.jp -tosu.saga.jp -yoshinogari.saga.jp -arakawa.saitama.jp -asaka.saitama.jp -chichibu.saitama.jp -fujimi.saitama.jp -fujimino.saitama.jp -fukaya.saitama.jp -hanno.saitama.jp -hanyu.saitama.jp -hasuda.saitama.jp -hatogaya.saitama.jp -hatoyama.saitama.jp -hidaka.saitama.jp -higashichichibu.saitama.jp -higashimatsuyama.saitama.jp -honjo.saitama.jp -ina.saitama.jp -iruma.saitama.jp -iwatsuki.saitama.jp -kamiizumi.saitama.jp -kamikawa.saitama.jp -kamisato.saitama.jp -kasukabe.saitama.jp -kawagoe.saitama.jp -kawaguchi.saitama.jp -kawajima.saitama.jp -kazo.saitama.jp -kitamoto.saitama.jp -koshigaya.saitama.jp -kounosu.saitama.jp -kuki.saitama.jp -kumagaya.saitama.jp -matsubushi.saitama.jp -minano.saitama.jp -misato.saitama.jp -miyashiro.saitama.jp -miyoshi.saitama.jp -moroyama.saitama.jp -nagatoro.saitama.jp -namegawa.saitama.jp -niiza.saitama.jp -ogano.saitama.jp -ogawa.saitama.jp -ogose.saitama.jp -okegawa.saitama.jp -omiya.saitama.jp -otaki.saitama.jp -ranzan.saitama.jp -ryokami.saitama.jp -saitama.saitama.jp -sakado.saitama.jp -satte.saitama.jp -sayama.saitama.jp -shiki.saitama.jp -shiraoka.saitama.jp -soka.saitama.jp -sugito.saitama.jp -toda.saitama.jp -tokigawa.saitama.jp -tokorozawa.saitama.jp -tsurugashima.saitama.jp -urawa.saitama.jp -warabi.saitama.jp -yashio.saitama.jp -yokoze.saitama.jp -yono.saitama.jp -yorii.saitama.jp -yoshida.saitama.jp -yoshikawa.saitama.jp -yoshimi.saitama.jp -aisho.shiga.jp -gamo.shiga.jp -higashiomi.shiga.jp -hikone.shiga.jp -koka.shiga.jp -konan.shiga.jp -kosei.shiga.jp -koto.shiga.jp -kusatsu.shiga.jp -maibara.shiga.jp -moriyama.shiga.jp -nagahama.shiga.jp -nishiazai.shiga.jp -notogawa.shiga.jp -omihachiman.shiga.jp -otsu.shiga.jp -ritto.shiga.jp -ryuoh.shiga.jp -takashima.shiga.jp -takatsuki.shiga.jp -torahime.shiga.jp -toyosato.shiga.jp -yasu.shiga.jp -akagi.shimane.jp -ama.shimane.jp -gotsu.shimane.jp -hamada.shimane.jp -higashiizumo.shimane.jp -hikawa.shimane.jp -hikimi.shimane.jp -izumo.shimane.jp -kakinoki.shimane.jp -masuda.shimane.jp -matsue.shimane.jp -misato.shimane.jp -nishinoshima.shimane.jp -ohda.shimane.jp -okinoshima.shimane.jp -okuizumo.shimane.jp -shimane.shimane.jp -tamayu.shimane.jp -tsuwano.shimane.jp -unnan.shimane.jp -yakumo.shimane.jp -yasugi.shimane.jp -yatsuka.shimane.jp -arai.shizuoka.jp -atami.shizuoka.jp -fuji.shizuoka.jp -fujieda.shizuoka.jp -fujikawa.shizuoka.jp -fujinomiya.shizuoka.jp -fukuroi.shizuoka.jp -gotemba.shizuoka.jp -haibara.shizuoka.jp -hamamatsu.shizuoka.jp -higashiizu.shizuoka.jp -ito.shizuoka.jp -iwata.shizuoka.jp -izu.shizuoka.jp -izunokuni.shizuoka.jp -kakegawa.shizuoka.jp -kannami.shizuoka.jp -kawanehon.shizuoka.jp -kawazu.shizuoka.jp -kikugawa.shizuoka.jp -kosai.shizuoka.jp -makinohara.shizuoka.jp -matsuzaki.shizuoka.jp -minamiizu.shizuoka.jp -mishima.shizuoka.jp -morimachi.shizuoka.jp -nishiizu.shizuoka.jp -numazu.shizuoka.jp -omaezaki.shizuoka.jp -shimada.shizuoka.jp -shimizu.shizuoka.jp -shimoda.shizuoka.jp -shizuoka.shizuoka.jp -susono.shizuoka.jp -yaizu.shizuoka.jp -yoshida.shizuoka.jp -ashikaga.tochigi.jp -bato.tochigi.jp -haga.tochigi.jp -ichikai.tochigi.jp -iwafune.tochigi.jp -kaminokawa.tochigi.jp -kanuma.tochigi.jp -karasuyama.tochigi.jp -kuroiso.tochigi.jp -mashiko.tochigi.jp -mibu.tochigi.jp -moka.tochigi.jp -motegi.tochigi.jp -nasu.tochigi.jp -nasushiobara.tochigi.jp -nikko.tochigi.jp -nishikata.tochigi.jp -nogi.tochigi.jp -ohira.tochigi.jp -ohtawara.tochigi.jp -oyama.tochigi.jp -sakura.tochigi.jp -sano.tochigi.jp -shimotsuke.tochigi.jp -shioya.tochigi.jp -takanezawa.tochigi.jp -tochigi.tochigi.jp -tsuga.tochigi.jp -ujiie.tochigi.jp -utsunomiya.tochigi.jp -yaita.tochigi.jp -aizumi.tokushima.jp -anan.tokushima.jp -ichiba.tokushima.jp -itano.tokushima.jp -kainan.tokushima.jp -komatsushima.tokushima.jp -matsushige.tokushima.jp -mima.tokushima.jp -minami.tokushima.jp -miyoshi.tokushima.jp -mugi.tokushima.jp -nakagawa.tokushima.jp -naruto.tokushima.jp -sanagochi.tokushima.jp -shishikui.tokushima.jp -tokushima.tokushima.jp -wajiki.tokushima.jp -adachi.tokyo.jp -akiruno.tokyo.jp -akishima.tokyo.jp -aogashima.tokyo.jp -arakawa.tokyo.jp -bunkyo.tokyo.jp -chiyoda.tokyo.jp -chofu.tokyo.jp -chuo.tokyo.jp -edogawa.tokyo.jp -fuchu.tokyo.jp -fussa.tokyo.jp -hachijo.tokyo.jp -hachioji.tokyo.jp -hamura.tokyo.jp -higashikurume.tokyo.jp -higashimurayama.tokyo.jp -higashiyamato.tokyo.jp -hino.tokyo.jp -hinode.tokyo.jp -hinohara.tokyo.jp -inagi.tokyo.jp -itabashi.tokyo.jp -katsushika.tokyo.jp -kita.tokyo.jp -kiyose.tokyo.jp -kodaira.tokyo.jp -koganei.tokyo.jp -kokubunji.tokyo.jp -komae.tokyo.jp -koto.tokyo.jp -kouzushima.tokyo.jp -kunitachi.tokyo.jp -machida.tokyo.jp -meguro.tokyo.jp -minato.tokyo.jp -mitaka.tokyo.jp -mizuho.tokyo.jp -musashimurayama.tokyo.jp -musashino.tokyo.jp -nakano.tokyo.jp -nerima.tokyo.jp -ogasawara.tokyo.jp -okutama.tokyo.jp -ome.tokyo.jp -oshima.tokyo.jp -ota.tokyo.jp -setagaya.tokyo.jp -shibuya.tokyo.jp -shinagawa.tokyo.jp -shinjuku.tokyo.jp -suginami.tokyo.jp -sumida.tokyo.jp -tachikawa.tokyo.jp -taito.tokyo.jp -tama.tokyo.jp -toshima.tokyo.jp -chizu.tottori.jp -hino.tottori.jp -kawahara.tottori.jp -koge.tottori.jp -kotoura.tottori.jp -misasa.tottori.jp -nanbu.tottori.jp -nichinan.tottori.jp -sakaiminato.tottori.jp -tottori.tottori.jp -wakasa.tottori.jp -yazu.tottori.jp -yonago.tottori.jp -asahi.toyama.jp -fuchu.toyama.jp -fukumitsu.toyama.jp -funahashi.toyama.jp -himi.toyama.jp -imizu.toyama.jp -inami.toyama.jp -johana.toyama.jp -kamiichi.toyama.jp -kurobe.toyama.jp -nakaniikawa.toyama.jp -namerikawa.toyama.jp -nanto.toyama.jp -nyuzen.toyama.jp -oyabe.toyama.jp -taira.toyama.jp -takaoka.toyama.jp -tateyama.toyama.jp -toga.toyama.jp -tonami.toyama.jp -toyama.toyama.jp -unazuki.toyama.jp -uozu.toyama.jp -yamada.toyama.jp -arida.wakayama.jp -aridagawa.wakayama.jp -gobo.wakayama.jp -hashimoto.wakayama.jp -hidaka.wakayama.jp -hirogawa.wakayama.jp -inami.wakayama.jp -iwade.wakayama.jp -kainan.wakayama.jp -kamitonda.wakayama.jp -katsuragi.wakayama.jp -kimino.wakayama.jp -kinokawa.wakayama.jp -kitayama.wakayama.jp -koya.wakayama.jp -koza.wakayama.jp -kozagawa.wakayama.jp -kudoyama.wakayama.jp -kushimoto.wakayama.jp -mihama.wakayama.jp -misato.wakayama.jp -nachikatsuura.wakayama.jp -shingu.wakayama.jp -shirahama.wakayama.jp -taiji.wakayama.jp -tanabe.wakayama.jp -wakayama.wakayama.jp -yuasa.wakayama.jp -yura.wakayama.jp -asahi.yamagata.jp -funagata.yamagata.jp -higashine.yamagata.jp -iide.yamagata.jp -kahoku.yamagata.jp -kaminoyama.yamagata.jp -kaneyama.yamagata.jp -kawanishi.yamagata.jp -mamurogawa.yamagata.jp -mikawa.yamagata.jp -murayama.yamagata.jp -nagai.yamagata.jp -nakayama.yamagata.jp -nanyo.yamagata.jp -nishikawa.yamagata.jp -obanazawa.yamagata.jp -oe.yamagata.jp -oguni.yamagata.jp -ohkura.yamagata.jp -oishida.yamagata.jp -sagae.yamagata.jp -sakata.yamagata.jp -sakegawa.yamagata.jp -shinjo.yamagata.jp -shirataka.yamagata.jp -shonai.yamagata.jp -takahata.yamagata.jp -tendo.yamagata.jp -tozawa.yamagata.jp -tsuruoka.yamagata.jp -yamagata.yamagata.jp -yamanobe.yamagata.jp -yonezawa.yamagata.jp -yuza.yamagata.jp -abu.yamaguchi.jp -hagi.yamaguchi.jp -hikari.yamaguchi.jp -hofu.yamaguchi.jp -iwakuni.yamaguchi.jp -kudamatsu.yamaguchi.jp -mitou.yamaguchi.jp -nagato.yamaguchi.jp -oshima.yamaguchi.jp -shimonoseki.yamaguchi.jp -shunan.yamaguchi.jp -tabuse.yamaguchi.jp -tokuyama.yamaguchi.jp -toyota.yamaguchi.jp -ube.yamaguchi.jp -yuu.yamaguchi.jp -chuo.yamanashi.jp -doshi.yamanashi.jp -fuefuki.yamanashi.jp -fujikawa.yamanashi.jp -fujikawaguchiko.yamanashi.jp -fujiyoshida.yamanashi.jp -hayakawa.yamanashi.jp -hokuto.yamanashi.jp -ichikawamisato.yamanashi.jp -kai.yamanashi.jp -kofu.yamanashi.jp -koshu.yamanashi.jp -kosuge.yamanashi.jp -minami-alps.yamanashi.jp -minobu.yamanashi.jp -nakamichi.yamanashi.jp -nanbu.yamanashi.jp -narusawa.yamanashi.jp -nirasaki.yamanashi.jp -nishikatsura.yamanashi.jp -oshino.yamanashi.jp -otsuki.yamanashi.jp -showa.yamanashi.jp -tabayama.yamanashi.jp -tsuru.yamanashi.jp -uenohara.yamanashi.jp -yamanakako.yamanashi.jp -yamanashi.yamanashi.jp - -// ke : http://www.kenic.or.ke/index.php?option=com_content&task=view&id=117&Itemid=145 -*.ke - -// kg : http://www.domain.kg/dmn_n.html -kg -org.kg -net.kg -com.kg -edu.kg -gov.kg -mil.kg - -// kh : http://www.mptc.gov.kh/dns_registration.htm -*.kh - -// ki : http://www.ki/dns/index.html -ki -edu.ki -biz.ki -net.ki -org.ki -gov.ki -info.ki -com.ki - -// km : https://en.wikipedia.org/wiki/.km -// http://www.domaine.km/documents/charte.doc -km -org.km -nom.km -gov.km -prd.km -tm.km -edu.km -mil.km -ass.km -com.km -// These are only mentioned as proposed suggestions at domaine.km, but -// https://en.wikipedia.org/wiki/.km says they're available for registration: -coop.km -asso.km -presse.km -medecin.km -notaires.km -pharmaciens.km -veterinaire.km -gouv.km - -// kn : https://en.wikipedia.org/wiki/.kn -// http://www.dot.kn/domainRules.html -kn -net.kn -org.kn -edu.kn -gov.kn - -// kp : http://www.kcce.kp/en_index.php -kp -com.kp -edu.kp -gov.kp -org.kp -rep.kp -tra.kp - -// kr : https://en.wikipedia.org/wiki/.kr -// see also: http://domain.nida.or.kr/eng/registration.jsp -kr -ac.kr -co.kr -es.kr -go.kr -hs.kr -kg.kr -mil.kr -ms.kr -ne.kr -or.kr -pe.kr -re.kr -sc.kr -// kr geographical names -busan.kr -chungbuk.kr -chungnam.kr -daegu.kr -daejeon.kr -gangwon.kr -gwangju.kr -gyeongbuk.kr -gyeonggi.kr -gyeongnam.kr -incheon.kr -jeju.kr -jeonbuk.kr -jeonnam.kr -seoul.kr -ulsan.kr - -// kw : https://en.wikipedia.org/wiki/.kw -*.kw - -// ky : http://www.icta.ky/da_ky_reg_dom.php -// Confirmed by registry 2008-06-17 -ky -edu.ky -gov.ky -com.ky -org.ky -net.ky - -// kz : https://en.wikipedia.org/wiki/.kz -// see also: http://www.nic.kz/rules/index.jsp -kz -org.kz -edu.kz -net.kz -gov.kz -mil.kz -com.kz - -// la : https://en.wikipedia.org/wiki/.la -// Submitted by registry -la -int.la -net.la -info.la -edu.la -gov.la -per.la -com.la -org.la - -// lb : https://en.wikipedia.org/wiki/.lb -// Submitted by registry -lb -com.lb -edu.lb -gov.lb -net.lb -org.lb - -// lc : https://en.wikipedia.org/wiki/.lc -// see also: http://www.nic.lc/rules.htm -lc -com.lc -net.lc -co.lc -org.lc -edu.lc -gov.lc - -// li : https://en.wikipedia.org/wiki/.li -li - -// lk : http://www.nic.lk/seclevpr.html -lk -gov.lk -sch.lk -net.lk -int.lk -com.lk -org.lk -edu.lk -ngo.lk -soc.lk -web.lk -ltd.lk -assn.lk -grp.lk -hotel.lk -ac.lk - -// lr : http://psg.com/dns/lr/lr.txt -// Submitted by registry -lr -com.lr -edu.lr -gov.lr -org.lr -net.lr - -// ls : https://en.wikipedia.org/wiki/.ls -ls -co.ls -org.ls - -// lt : https://en.wikipedia.org/wiki/.lt -lt -// gov.lt : http://www.gov.lt/index_en.php -gov.lt - -// lu : http://www.dns.lu/en/ -lu - -// lv : http://www.nic.lv/DNS/En/generic.php -lv -com.lv -edu.lv -gov.lv -org.lv -mil.lv -id.lv -net.lv -asn.lv -conf.lv - -// ly : http://www.nic.ly/regulations.php -ly -com.ly -net.ly -gov.ly -plc.ly -edu.ly -sch.ly -med.ly -org.ly -id.ly - -// ma : https://en.wikipedia.org/wiki/.ma -// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf -ma -co.ma -net.ma -gov.ma -org.ma -ac.ma -press.ma - -// mc : http://www.nic.mc/ -mc -tm.mc -asso.mc - -// md : https://en.wikipedia.org/wiki/.md -md - -// me : https://en.wikipedia.org/wiki/.me -me -co.me -net.me -org.me -edu.me -ac.me -gov.me -its.me -priv.me - -// mg : http://nic.mg/nicmg/?page_id=39 -mg -org.mg -nom.mg -gov.mg -prd.mg -tm.mg -edu.mg -mil.mg -com.mg -co.mg - -// mh : https://en.wikipedia.org/wiki/.mh -mh - -// mil : https://en.wikipedia.org/wiki/.mil -mil - -// mk : https://en.wikipedia.org/wiki/.mk -// see also: http://dns.marnet.net.mk/postapka.php -mk -com.mk -org.mk -net.mk -edu.mk -gov.mk -inf.mk -name.mk - -// ml : http://www.gobin.info/domainname/ml-template.doc -// see also: https://en.wikipedia.org/wiki/.ml -ml -com.ml -edu.ml -gouv.ml -gov.ml -net.ml -org.ml -presse.ml - -// mm : https://en.wikipedia.org/wiki/.mm -*.mm - -// mn : https://en.wikipedia.org/wiki/.mn -mn -gov.mn -edu.mn -org.mn - -// mo : http://www.monic.net.mo/ -mo -com.mo -net.mo -org.mo -edu.mo -gov.mo - -// mobi : https://en.wikipedia.org/wiki/.mobi -mobi - -// mp : http://www.dot.mp/ -// Confirmed by registry 2008-06-17 -mp - -// mq : https://en.wikipedia.org/wiki/.mq -mq - -// mr : https://en.wikipedia.org/wiki/.mr -mr -gov.mr - -// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf -ms -com.ms -edu.ms -gov.ms -net.ms -org.ms - -// mt : https://www.nic.org.mt/go/policy -// Submitted by registry -mt -com.mt -edu.mt -net.mt -org.mt - -// mu : https://en.wikipedia.org/wiki/.mu -mu -com.mu -net.mu -org.mu -gov.mu -ac.mu -co.mu -or.mu - -// museum : http://about.museum/naming/ -// http://index.museum/ -museum -academy.museum -agriculture.museum -air.museum -airguard.museum -alabama.museum -alaska.museum -amber.museum -ambulance.museum -american.museum -americana.museum -americanantiques.museum -americanart.museum -amsterdam.museum -and.museum -annefrank.museum -anthro.museum -anthropology.museum -antiques.museum -aquarium.museum -arboretum.museum -archaeological.museum -archaeology.museum -architecture.museum -art.museum -artanddesign.museum -artcenter.museum -artdeco.museum -arteducation.museum -artgallery.museum -arts.museum -artsandcrafts.museum -asmatart.museum -assassination.museum -assisi.museum -association.museum -astronomy.museum -atlanta.museum -austin.museum -australia.museum -automotive.museum -aviation.museum -axis.museum -badajoz.museum -baghdad.museum -bahn.museum -bale.museum -baltimore.museum -barcelona.museum -baseball.museum -basel.museum -baths.museum -bauern.museum -beauxarts.museum -beeldengeluid.museum -bellevue.museum -bergbau.museum -berkeley.museum -berlin.museum -bern.museum -bible.museum -bilbao.museum -bill.museum -birdart.museum -birthplace.museum -bonn.museum -boston.museum -botanical.museum -botanicalgarden.museum -botanicgarden.museum -botany.museum -brandywinevalley.museum -brasil.museum -bristol.museum -british.museum -britishcolumbia.museum -broadcast.museum -brunel.museum -brussel.museum -brussels.museum -bruxelles.museum -building.museum -burghof.museum -bus.museum -bushey.museum -cadaques.museum -california.museum -cambridge.museum -can.museum -canada.museum -capebreton.museum -carrier.museum -cartoonart.museum -casadelamoneda.museum -castle.museum -castres.museum -celtic.museum -center.museum -chattanooga.museum -cheltenham.museum -chesapeakebay.museum -chicago.museum -children.museum -childrens.museum -childrensgarden.museum -chiropractic.museum -chocolate.museum -christiansburg.museum -cincinnati.museum -cinema.museum -circus.museum -civilisation.museum -civilization.museum -civilwar.museum -clinton.museum -clock.museum -coal.museum -coastaldefence.museum -cody.museum -coldwar.museum -collection.museum -colonialwilliamsburg.museum -coloradoplateau.museum -columbia.museum -columbus.museum -communication.museum -communications.museum -community.museum -computer.museum -computerhistory.museum -comunicações.museum -contemporary.museum -contemporaryart.museum -convent.museum -copenhagen.museum -corporation.museum -correios-e-telecomunicações.museum -corvette.museum -costume.museum -countryestate.museum -county.museum -crafts.museum -cranbrook.museum -creation.museum -cultural.museum -culturalcenter.museum -culture.museum -cyber.museum -cymru.museum -dali.museum -dallas.museum -database.museum -ddr.museum -decorativearts.museum -delaware.museum -delmenhorst.museum -denmark.museum -depot.museum -design.museum -detroit.museum -dinosaur.museum -discovery.museum -dolls.museum -donostia.museum -durham.museum -eastafrica.museum -eastcoast.museum -education.museum -educational.museum -egyptian.museum -eisenbahn.museum -elburg.museum -elvendrell.museum -embroidery.museum -encyclopedic.museum -england.museum -entomology.museum -environment.museum -environmentalconservation.museum -epilepsy.museum -essex.museum -estate.museum -ethnology.museum -exeter.museum -exhibition.museum -family.museum -farm.museum -farmequipment.museum -farmers.museum -farmstead.museum -field.museum -figueres.museum -filatelia.museum -film.museum -fineart.museum -finearts.museum -finland.museum -flanders.museum -florida.museum -force.museum -fortmissoula.museum -fortworth.museum -foundation.museum -francaise.museum -frankfurt.museum -franziskaner.museum -freemasonry.museum -freiburg.museum -fribourg.museum -frog.museum -fundacio.museum -furniture.museum -gallery.museum -garden.museum -gateway.museum -geelvinck.museum -gemological.museum -geology.museum -georgia.museum -giessen.museum -glas.museum -glass.museum -gorge.museum -grandrapids.museum -graz.museum -guernsey.museum -halloffame.museum -hamburg.museum -handson.museum -harvestcelebration.museum -hawaii.museum -health.museum -heimatunduhren.museum -hellas.museum -helsinki.museum -hembygdsforbund.museum -heritage.museum -histoire.museum -historical.museum -historicalsociety.museum -historichouses.museum -historisch.museum -historisches.museum -history.museum -historyofscience.museum -horology.museum -house.museum -humanities.museum -illustration.museum -imageandsound.museum -indian.museum -indiana.museum -indianapolis.museum -indianmarket.museum -intelligence.museum -interactive.museum -iraq.museum -iron.museum -isleofman.museum -jamison.museum -jefferson.museum -jerusalem.museum -jewelry.museum -jewish.museum -jewishart.museum -jfk.museum -journalism.museum -judaica.museum -judygarland.museum -juedisches.museum -juif.museum -karate.museum -karikatur.museum -kids.museum -koebenhavn.museum -koeln.museum -kunst.museum -kunstsammlung.museum -kunstunddesign.museum -labor.museum -labour.museum -lajolla.museum -lancashire.museum -landes.museum -lans.museum -läns.museum -larsson.museum -lewismiller.museum -lincoln.museum -linz.museum -living.museum -livinghistory.museum -localhistory.museum -london.museum -losangeles.museum -louvre.museum -loyalist.museum -lucerne.museum -luxembourg.museum -luzern.museum -mad.museum -madrid.museum -mallorca.museum -manchester.museum -mansion.museum -mansions.museum -manx.museum -marburg.museum -maritime.museum -maritimo.museum -maryland.museum -marylhurst.museum -media.museum -medical.museum -medizinhistorisches.museum -meeres.museum -memorial.museum -mesaverde.museum -michigan.museum -midatlantic.museum -military.museum -mill.museum -miners.museum -mining.museum -minnesota.museum -missile.museum -missoula.museum -modern.museum -moma.museum -money.museum -monmouth.museum -monticello.museum -montreal.museum -moscow.museum -motorcycle.museum -muenchen.museum -muenster.museum -mulhouse.museum -muncie.museum -museet.museum -museumcenter.museum -museumvereniging.museum -music.museum -national.museum -nationalfirearms.museum -nationalheritage.museum -nativeamerican.museum -naturalhistory.museum -naturalhistorymuseum.museum -naturalsciences.museum -nature.museum -naturhistorisches.museum -natuurwetenschappen.museum -naumburg.museum -naval.museum -nebraska.museum -neues.museum -newhampshire.museum -newjersey.museum -newmexico.museum -newport.museum -newspaper.museum -newyork.museum -niepce.museum -norfolk.museum -north.museum -nrw.museum -nuernberg.museum -nuremberg.museum -nyc.museum -nyny.museum -oceanographic.museum -oceanographique.museum -omaha.museum -online.museum -ontario.museum -openair.museum -oregon.museum -oregontrail.museum -otago.museum -oxford.museum -pacific.museum -paderborn.museum -palace.museum -paleo.museum -palmsprings.museum -panama.museum -paris.museum -pasadena.museum -pharmacy.museum -philadelphia.museum -philadelphiaarea.museum -philately.museum -phoenix.museum -photography.museum -pilots.museum -pittsburgh.museum -planetarium.museum -plantation.museum -plants.museum -plaza.museum -portal.museum -portland.museum -portlligat.museum -posts-and-telecommunications.museum -preservation.museum -presidio.museum -press.museum -project.museum -public.museum -pubol.museum -quebec.museum -railroad.museum -railway.museum -research.museum -resistance.museum -riodejaneiro.museum -rochester.museum -rockart.museum -roma.museum -russia.museum -saintlouis.museum -salem.museum -salvadordali.museum -salzburg.museum -sandiego.museum -sanfrancisco.museum -santabarbara.museum -santacruz.museum -santafe.museum -saskatchewan.museum -satx.museum -savannahga.museum -schlesisches.museum -schoenbrunn.museum -schokoladen.museum -school.museum -schweiz.museum -science.museum -scienceandhistory.museum -scienceandindustry.museum -sciencecenter.museum -sciencecenters.museum -science-fiction.museum -sciencehistory.museum -sciences.museum -sciencesnaturelles.museum -scotland.museum -seaport.museum -settlement.museum -settlers.museum -shell.museum -sherbrooke.museum -sibenik.museum -silk.museum -ski.museum -skole.museum -society.museum -sologne.museum -soundandvision.museum -southcarolina.museum -southwest.museum -space.museum -spy.museum -square.museum -stadt.museum -stalbans.museum -starnberg.museum -state.museum -stateofdelaware.museum -station.museum -steam.museum -steiermark.museum -stjohn.museum -stockholm.museum -stpetersburg.museum -stuttgart.museum -suisse.museum -surgeonshall.museum -surrey.museum -svizzera.museum -sweden.museum -sydney.museum -tank.museum -tcm.museum -technology.museum -telekommunikation.museum -television.museum -texas.museum -textile.museum -theater.museum -time.museum -timekeeping.museum -topology.museum -torino.museum -touch.museum -town.museum -transport.museum -tree.museum -trolley.museum -trust.museum -trustee.museum -uhren.museum -ulm.museum -undersea.museum -university.museum -usa.museum -usantiques.museum -usarts.museum -uscountryestate.museum -usculture.museum -usdecorativearts.museum -usgarden.museum -ushistory.museum -ushuaia.museum -uslivinghistory.museum -utah.museum -uvic.museum -valley.museum -vantaa.museum -versailles.museum -viking.museum -village.museum -virginia.museum -virtual.museum -virtuel.museum -vlaanderen.museum -volkenkunde.museum -wales.museum -wallonie.museum -war.museum -washingtondc.museum -watchandclock.museum -watch-and-clock.museum -western.museum -westfalen.museum -whaling.museum -wildlife.museum -williamsburg.museum -windmill.museum -workshop.museum -york.museum -yorkshire.museum -yosemite.museum -youth.museum -zoological.museum -zoology.museum -ירושלים.museum -иком.museum - -// mv : https://en.wikipedia.org/wiki/.mv -// "mv" included because, contra Wikipedia, google.mv exists. -mv -aero.mv -biz.mv -com.mv -coop.mv -edu.mv -gov.mv -info.mv -int.mv -mil.mv -museum.mv -name.mv -net.mv -org.mv -pro.mv - -// mw : http://www.registrar.mw/ -mw -ac.mw -biz.mw -co.mw -com.mw -coop.mw -edu.mw -gov.mw -int.mw -museum.mw -net.mw -org.mw - -// mx : http://www.nic.mx/ -// Submitted by registry -mx -com.mx -org.mx -gob.mx -edu.mx -net.mx - -// my : http://www.mynic.net.my/ -my -com.my -net.my -org.my -gov.my -edu.my -mil.my -name.my - -// mz : http://www.uem.mz/ -// Submitted by registry -mz -ac.mz -adv.mz -co.mz -edu.mz -gov.mz -mil.mz -net.mz -org.mz - -// na : http://www.na-nic.com.na/ -// http://www.info.na/domain/ -na -info.na -pro.na -name.na -school.na -or.na -dr.na -us.na -mx.na -ca.na -in.na -cc.na -tv.na -ws.na -mobi.na -co.na -com.na -org.na - -// name : has 2nd-level tlds, but there's no list of them -name - -// nc : http://www.cctld.nc/ -nc -asso.nc -nom.nc - -// ne : https://en.wikipedia.org/wiki/.ne -ne - -// net : https://en.wikipedia.org/wiki/.net -net - -// nf : https://en.wikipedia.org/wiki/.nf -nf -com.nf -net.nf -per.nf -rec.nf -web.nf -arts.nf -firm.nf -info.nf -other.nf -store.nf - -// ng : http://www.nira.org.ng/index.php/join-us/register-ng-domain/189-nira-slds -ng -com.ng -edu.ng -gov.ng -i.ng -mil.ng -mobi.ng -name.ng -net.ng -org.ng -sch.ng - -// ni : http://www.nic.ni/ -ni -ac.ni -biz.ni -co.ni -com.ni -edu.ni -gob.ni -in.ni -info.ni -int.ni -mil.ni -net.ni -nom.ni -org.ni -web.ni - -// nl : https://en.wikipedia.org/wiki/.nl -// https://www.sidn.nl/ -// ccTLD for the Netherlands -nl - -// BV.nl will be a registry for dutch BV's (besloten vennootschap) -bv.nl - -// no : http://www.norid.no/regelverk/index.en.html -// The Norwegian registry has declined to notify us of updates. The web pages -// referenced below are the official source of the data. There is also an -// announce mailing list: -// https://postlister.uninett.no/sympa/info/norid-diskusjon -no -// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html -fhs.no -vgs.no -fylkesbibl.no -folkebibl.no -museum.no -idrett.no -priv.no -// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html -mil.no -stat.no -dep.no -kommune.no -herad.no -// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html -// counties -aa.no -ah.no -bu.no -fm.no -hl.no -hm.no -jan-mayen.no -mr.no -nl.no -nt.no -of.no -ol.no -oslo.no -rl.no -sf.no -st.no -svalbard.no -tm.no -tr.no -va.no -vf.no -// primary and lower secondary schools per county -gs.aa.no -gs.ah.no -gs.bu.no -gs.fm.no -gs.hl.no -gs.hm.no -gs.jan-mayen.no -gs.mr.no -gs.nl.no -gs.nt.no -gs.of.no -gs.ol.no -gs.oslo.no -gs.rl.no -gs.sf.no -gs.st.no -gs.svalbard.no -gs.tm.no -gs.tr.no -gs.va.no -gs.vf.no -// cities -akrehamn.no -åkrehamn.no -algard.no -ålgård.no -arna.no -brumunddal.no -bryne.no -bronnoysund.no -brønnøysund.no -drobak.no -drøbak.no -egersund.no -fetsund.no -floro.no -florø.no -fredrikstad.no -hokksund.no -honefoss.no -hønefoss.no -jessheim.no -jorpeland.no -jørpeland.no -kirkenes.no -kopervik.no -krokstadelva.no -langevag.no -langevåg.no -leirvik.no -mjondalen.no -mjøndalen.no -mo-i-rana.no -mosjoen.no -mosjøen.no -nesoddtangen.no -orkanger.no -osoyro.no -osøyro.no -raholt.no -råholt.no -sandnessjoen.no -sandnessjøen.no -skedsmokorset.no -slattum.no -spjelkavik.no -stathelle.no -stavern.no -stjordalshalsen.no -stjørdalshalsen.no -tananger.no -tranby.no -vossevangen.no -// communities -afjord.no -åfjord.no -agdenes.no -al.no -ål.no -alesund.no -ålesund.no -alstahaug.no -alta.no -áltá.no -alaheadju.no -álaheadju.no -alvdal.no -amli.no -åmli.no -amot.no -åmot.no -andebu.no -andoy.no -andøy.no -andasuolo.no -ardal.no -årdal.no -aremark.no -arendal.no -ås.no -aseral.no -åseral.no -asker.no -askim.no -askvoll.no -askoy.no -askøy.no -asnes.no -åsnes.no -audnedaln.no -aukra.no -aure.no -aurland.no -aurskog-holand.no -aurskog-høland.no -austevoll.no -austrheim.no -averoy.no -averøy.no -balestrand.no -ballangen.no -balat.no -bálát.no -balsfjord.no -bahccavuotna.no -báhccavuotna.no -bamble.no -bardu.no -beardu.no -beiarn.no -bajddar.no -bájddar.no -baidar.no -báidár.no -berg.no -bergen.no -berlevag.no -berlevåg.no -bearalvahki.no -bearalváhki.no -bindal.no -birkenes.no -bjarkoy.no -bjarkøy.no -bjerkreim.no -bjugn.no -bodo.no -bodø.no -badaddja.no -bådåddjå.no -budejju.no -bokn.no -bremanger.no -bronnoy.no -brønnøy.no -bygland.no -bykle.no -barum.no -bærum.no -bo.telemark.no -bø.telemark.no -bo.nordland.no -bø.nordland.no -bievat.no -bievát.no -bomlo.no -bømlo.no -batsfjord.no -båtsfjord.no -bahcavuotna.no -báhcavuotna.no -dovre.no -drammen.no -drangedal.no -dyroy.no -dyrøy.no -donna.no -dønna.no -eid.no -eidfjord.no -eidsberg.no -eidskog.no -eidsvoll.no -eigersund.no -elverum.no -enebakk.no -engerdal.no -etne.no -etnedal.no -evenes.no -evenassi.no -evenášši.no -evje-og-hornnes.no -farsund.no -fauske.no -fuossko.no -fuoisku.no -fedje.no -fet.no -finnoy.no -finnøy.no -fitjar.no -fjaler.no -fjell.no -flakstad.no -flatanger.no -flekkefjord.no -flesberg.no -flora.no -fla.no -flå.no -folldal.no -forsand.no -fosnes.no -frei.no -frogn.no -froland.no -frosta.no -frana.no -fræna.no -froya.no -frøya.no -fusa.no -fyresdal.no -forde.no -førde.no -gamvik.no -gangaviika.no -gáŋgaviika.no -gaular.no -gausdal.no -gildeskal.no -gildeskål.no -giske.no -gjemnes.no -gjerdrum.no -gjerstad.no -gjesdal.no -gjovik.no -gjøvik.no -gloppen.no -gol.no -gran.no -grane.no -granvin.no -gratangen.no -grimstad.no -grong.no -kraanghke.no -kråanghke.no -grue.no -gulen.no -hadsel.no -halden.no -halsa.no -hamar.no -hamaroy.no -habmer.no -hábmer.no -hapmir.no -hápmir.no -hammerfest.no -hammarfeasta.no -hámmárfeasta.no -haram.no -hareid.no -harstad.no -hasvik.no -aknoluokta.no -ákŋoluokta.no -hattfjelldal.no -aarborte.no -haugesund.no -hemne.no -hemnes.no -hemsedal.no -heroy.more-og-romsdal.no -herøy.møre-og-romsdal.no -heroy.nordland.no -herøy.nordland.no -hitra.no -hjartdal.no -hjelmeland.no -hobol.no -hobøl.no -hof.no -hol.no -hole.no -holmestrand.no -holtalen.no -holtålen.no -hornindal.no -horten.no -hurdal.no -hurum.no -hvaler.no -hyllestad.no -hagebostad.no -hægebostad.no -hoyanger.no -høyanger.no -hoylandet.no -høylandet.no -ha.no -hå.no -ibestad.no -inderoy.no -inderøy.no -iveland.no -jevnaker.no -jondal.no -jolster.no -jølster.no -karasjok.no -karasjohka.no -kárášjohka.no -karlsoy.no -galsa.no -gálsá.no -karmoy.no -karmøy.no -kautokeino.no -guovdageaidnu.no -klepp.no -klabu.no -klæbu.no -kongsberg.no -kongsvinger.no -kragero.no -kragerø.no -kristiansand.no -kristiansund.no -krodsherad.no -krødsherad.no -kvalsund.no -rahkkeravju.no -ráhkkerávju.no -kvam.no -kvinesdal.no -kvinnherad.no -kviteseid.no -kvitsoy.no -kvitsøy.no -kvafjord.no -kvæfjord.no -giehtavuoatna.no -kvanangen.no -kvænangen.no -navuotna.no -návuotna.no -kafjord.no -kåfjord.no -gaivuotna.no -gáivuotna.no -larvik.no -lavangen.no -lavagis.no -loabat.no -loabát.no -lebesby.no -davvesiida.no -leikanger.no -leirfjord.no -leka.no -leksvik.no -lenvik.no -leangaviika.no -leaŋgaviika.no -lesja.no -levanger.no -lier.no -lierne.no -lillehammer.no -lillesand.no -lindesnes.no -lindas.no -lindås.no -lom.no -loppa.no -lahppi.no -láhppi.no -lund.no -lunner.no -luroy.no -lurøy.no -luster.no -lyngdal.no -lyngen.no -ivgu.no -lardal.no -lerdal.no -lærdal.no -lodingen.no -lødingen.no -lorenskog.no -lørenskog.no -loten.no -løten.no -malvik.no -masoy.no -måsøy.no -muosat.no -muosát.no -mandal.no -marker.no -marnardal.no -masfjorden.no -meland.no -meldal.no -melhus.no -meloy.no -meløy.no -meraker.no -meråker.no -moareke.no -moåreke.no -midsund.no -midtre-gauldal.no -modalen.no -modum.no -molde.no -moskenes.no -moss.no -mosvik.no -malselv.no -målselv.no -malatvuopmi.no -málatvuopmi.no -namdalseid.no -aejrie.no -namsos.no -namsskogan.no -naamesjevuemie.no -nååmesjevuemie.no -laakesvuemie.no -nannestad.no -narvik.no -narviika.no -naustdal.no -nedre-eiker.no -nes.akershus.no -nes.buskerud.no -nesna.no -nesodden.no -nesseby.no -unjarga.no -unjárga.no -nesset.no -nissedal.no -nittedal.no -nord-aurdal.no -nord-fron.no -nord-odal.no -norddal.no -nordkapp.no -davvenjarga.no -davvenjárga.no -nordre-land.no -nordreisa.no -raisa.no -ráisa.no -nore-og-uvdal.no -notodden.no -naroy.no -nærøy.no -notteroy.no -nøtterøy.no -odda.no -oksnes.no -øksnes.no -oppdal.no -oppegard.no -oppegård.no -orkdal.no -orland.no -ørland.no -orskog.no -ørskog.no -orsta.no -ørsta.no -os.hedmark.no -os.hordaland.no -osen.no -osteroy.no -osterøy.no -ostre-toten.no -østre-toten.no -overhalla.no -ovre-eiker.no -øvre-eiker.no -oyer.no -øyer.no -oygarden.no -øygarden.no -oystre-slidre.no -øystre-slidre.no -porsanger.no -porsangu.no -porsáŋgu.no -porsgrunn.no -radoy.no -radøy.no -rakkestad.no -rana.no -ruovat.no -randaberg.no -rauma.no -rendalen.no -rennebu.no -rennesoy.no -rennesøy.no -rindal.no -ringebu.no -ringerike.no -ringsaker.no -rissa.no -risor.no -risør.no -roan.no -rollag.no -rygge.no -ralingen.no -rælingen.no -rodoy.no -rødøy.no -romskog.no -rømskog.no -roros.no -røros.no -rost.no -røst.no -royken.no -røyken.no -royrvik.no -røyrvik.no -rade.no -råde.no -salangen.no -siellak.no -saltdal.no -salat.no -sálát.no -sálat.no -samnanger.no -sande.more-og-romsdal.no -sande.møre-og-romsdal.no -sande.vestfold.no -sandefjord.no -sandnes.no -sandoy.no -sandøy.no -sarpsborg.no -sauda.no -sauherad.no -sel.no -selbu.no -selje.no -seljord.no -sigdal.no -siljan.no -sirdal.no -skaun.no -skedsmo.no -ski.no -skien.no -skiptvet.no -skjervoy.no -skjervøy.no -skierva.no -skiervá.no -skjak.no -skjåk.no -skodje.no -skanland.no -skånland.no -skanit.no -skánit.no -smola.no -smøla.no -snillfjord.no -snasa.no -snåsa.no -snoasa.no -snaase.no -snåase.no -sogndal.no -sokndal.no -sola.no -solund.no -songdalen.no -sortland.no -spydeberg.no -stange.no -stavanger.no -steigen.no -steinkjer.no -stjordal.no -stjørdal.no -stokke.no -stor-elvdal.no -stord.no -stordal.no -storfjord.no -omasvuotna.no -strand.no -stranda.no -stryn.no -sula.no -suldal.no -sund.no -sunndal.no -surnadal.no -sveio.no -svelvik.no -sykkylven.no -sogne.no -søgne.no -somna.no -sømna.no -sondre-land.no -søndre-land.no -sor-aurdal.no -sør-aurdal.no -sor-fron.no -sør-fron.no -sor-odal.no -sør-odal.no -sor-varanger.no -sør-varanger.no -matta-varjjat.no -mátta-várjjat.no -sorfold.no -sørfold.no -sorreisa.no -sørreisa.no -sorum.no -sørum.no -tana.no -deatnu.no -time.no -tingvoll.no -tinn.no -tjeldsund.no -dielddanuorri.no -tjome.no -tjøme.no -tokke.no -tolga.no -torsken.no -tranoy.no -tranøy.no -tromso.no -tromsø.no -tromsa.no -romsa.no -trondheim.no -troandin.no -trysil.no -trana.no -træna.no -trogstad.no -trøgstad.no -tvedestrand.no -tydal.no -tynset.no -tysfjord.no -divtasvuodna.no -divttasvuotna.no -tysnes.no -tysvar.no -tysvær.no -tonsberg.no -tønsberg.no -ullensaker.no -ullensvang.no -ulvik.no -utsira.no -vadso.no -vadsø.no -cahcesuolo.no -čáhcesuolo.no -vaksdal.no -valle.no -vang.no -vanylven.no -vardo.no -vardø.no -varggat.no -várggát.no -vefsn.no -vaapste.no -vega.no -vegarshei.no -vegårshei.no -vennesla.no -verdal.no -verran.no -vestby.no -vestnes.no -vestre-slidre.no -vestre-toten.no -vestvagoy.no -vestvågøy.no -vevelstad.no -vik.no -vikna.no -vindafjord.no -volda.no -voss.no -varoy.no -værøy.no -vagan.no -vågan.no -voagat.no -vagsoy.no -vågsøy.no -vaga.no -vågå.no -valer.ostfold.no -våler.østfold.no -valer.hedmark.no -våler.hedmark.no - -// np : http://www.mos.com.np/register.html -*.np - -// nr : http://cenpac.net.nr/dns/index.html -// Submitted by registry -nr -biz.nr -info.nr -gov.nr -edu.nr -org.nr -net.nr -com.nr - -// nu : https://en.wikipedia.org/wiki/.nu -nu - -// nz : https://en.wikipedia.org/wiki/.nz -// Submitted by registry -nz -ac.nz -co.nz -cri.nz -geek.nz -gen.nz -govt.nz -health.nz -iwi.nz -kiwi.nz -maori.nz -mil.nz -māori.nz -net.nz -org.nz -parliament.nz -school.nz - -// om : https://en.wikipedia.org/wiki/.om -om -co.om -com.om -edu.om -gov.om -med.om -museum.om -net.om -org.om -pro.om - -// onion : https://tools.ietf.org/html/rfc7686 -onion - -// org : https://en.wikipedia.org/wiki/.org -org - -// pa : http://www.nic.pa/ -// Some additional second level "domains" resolve directly as hostnames, such as -// pannet.pa, so we add a rule for "pa". -pa -ac.pa -gob.pa -com.pa -org.pa -sld.pa -edu.pa -net.pa -ing.pa -abo.pa -med.pa -nom.pa - -// pe : https://www.nic.pe/InformeFinalComision.pdf -pe -edu.pe -gob.pe -nom.pe -mil.pe -org.pe -com.pe -net.pe - -// pf : http://www.gobin.info/domainname/formulaire-pf.pdf -pf -com.pf -org.pf -edu.pf - -// pg : https://en.wikipedia.org/wiki/.pg -*.pg - -// ph : http://www.domains.ph/FAQ2.asp -// Submitted by registry -ph -com.ph -net.ph -org.ph -gov.ph -edu.ph -ngo.ph -mil.ph -i.ph - -// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK -pk -com.pk -net.pk -edu.pk -org.pk -fam.pk -biz.pk -web.pk -gov.pk -gob.pk -gok.pk -gon.pk -gop.pk -gos.pk -info.pk - -// pl http://www.dns.pl/english/index.html -// Submitted by registry -pl -com.pl -net.pl -org.pl -// pl functional domains (http://www.dns.pl/english/index.html) -aid.pl -agro.pl -atm.pl -auto.pl -biz.pl -edu.pl -gmina.pl -gsm.pl -info.pl -mail.pl -miasta.pl -media.pl -mil.pl -nieruchomosci.pl -nom.pl -pc.pl -powiat.pl -priv.pl -realestate.pl -rel.pl -sex.pl -shop.pl -sklep.pl -sos.pl -szkola.pl -targi.pl -tm.pl -tourism.pl -travel.pl -turystyka.pl -// Government domains -gov.pl -ap.gov.pl -ic.gov.pl -is.gov.pl -us.gov.pl -kmpsp.gov.pl -kppsp.gov.pl -kwpsp.gov.pl -psp.gov.pl -wskr.gov.pl -kwp.gov.pl -mw.gov.pl -ug.gov.pl -um.gov.pl -umig.gov.pl -ugim.gov.pl -upow.gov.pl -uw.gov.pl -starostwo.gov.pl -pa.gov.pl -po.gov.pl -psse.gov.pl -pup.gov.pl -rzgw.gov.pl -sa.gov.pl -so.gov.pl -sr.gov.pl -wsa.gov.pl -sko.gov.pl -uzs.gov.pl -wiih.gov.pl -winb.gov.pl -pinb.gov.pl -wios.gov.pl -witd.gov.pl -wzmiuw.gov.pl -piw.gov.pl -wiw.gov.pl -griw.gov.pl -wif.gov.pl -oum.gov.pl -sdn.gov.pl -zp.gov.pl -uppo.gov.pl -mup.gov.pl -wuoz.gov.pl -konsulat.gov.pl -oirm.gov.pl -// pl regional domains (http://www.dns.pl/english/index.html) -augustow.pl -babia-gora.pl -bedzin.pl -beskidy.pl -bialowieza.pl -bialystok.pl -bielawa.pl -bieszczady.pl -boleslawiec.pl -bydgoszcz.pl -bytom.pl -cieszyn.pl -czeladz.pl -czest.pl -dlugoleka.pl -elblag.pl -elk.pl -glogow.pl -gniezno.pl -gorlice.pl -grajewo.pl -ilawa.pl -jaworzno.pl -jelenia-gora.pl -jgora.pl -kalisz.pl -kazimierz-dolny.pl -karpacz.pl -kartuzy.pl -kaszuby.pl -katowice.pl -kepno.pl -ketrzyn.pl -klodzko.pl -kobierzyce.pl -kolobrzeg.pl -konin.pl -konskowola.pl -kutno.pl -lapy.pl -lebork.pl -legnica.pl -lezajsk.pl -limanowa.pl -lomza.pl -lowicz.pl -lubin.pl -lukow.pl -malbork.pl -malopolska.pl -mazowsze.pl -mazury.pl -mielec.pl -mielno.pl -mragowo.pl -naklo.pl -nowaruda.pl -nysa.pl -olawa.pl -olecko.pl -olkusz.pl -olsztyn.pl -opoczno.pl -opole.pl -ostroda.pl -ostroleka.pl -ostrowiec.pl -ostrowwlkp.pl -pila.pl -pisz.pl -podhale.pl -podlasie.pl -polkowice.pl -pomorze.pl -pomorskie.pl -prochowice.pl -pruszkow.pl -przeworsk.pl -pulawy.pl -radom.pl -rawa-maz.pl -rybnik.pl -rzeszow.pl -sanok.pl -sejny.pl -slask.pl -slupsk.pl -sosnowiec.pl -stalowa-wola.pl -skoczow.pl -starachowice.pl -stargard.pl -suwalki.pl -swidnica.pl -swiebodzin.pl -swinoujscie.pl -szczecin.pl -szczytno.pl -tarnobrzeg.pl -tgory.pl -turek.pl -tychy.pl -ustka.pl -walbrzych.pl -warmia.pl -warszawa.pl -waw.pl -wegrow.pl -wielun.pl -wlocl.pl -wloclawek.pl -wodzislaw.pl -wolomin.pl -wroclaw.pl -zachpomor.pl -zagan.pl -zarow.pl -zgora.pl -zgorzelec.pl - -// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf -pm - -// pn : http://www.government.pn/PnRegistry/policies.htm -pn -gov.pn -co.pn -org.pn -edu.pn -net.pn - -// post : https://en.wikipedia.org/wiki/.post -post - -// pr : http://www.nic.pr/index.asp?f=1 -pr -com.pr -net.pr -org.pr -gov.pr -edu.pr -isla.pr -pro.pr -biz.pr -info.pr -name.pr -// these aren't mentioned on nic.pr, but on https://en.wikipedia.org/wiki/.pr -est.pr -prof.pr -ac.pr - -// pro : http://registry.pro/get-pro -pro -aaa.pro -aca.pro -acct.pro -avocat.pro -bar.pro -cpa.pro -eng.pro -jur.pro -law.pro -med.pro -recht.pro - -// ps : https://en.wikipedia.org/wiki/.ps -// http://www.nic.ps/registration/policy.html#reg -ps -edu.ps -gov.ps -sec.ps -plo.ps -com.ps -org.ps -net.ps - -// pt : http://online.dns.pt/dns/start_dns -pt -net.pt -gov.pt -org.pt -edu.pt -int.pt -publ.pt -com.pt -nome.pt - -// pw : https://en.wikipedia.org/wiki/.pw -pw -co.pw -ne.pw -or.pw -ed.pw -go.pw -belau.pw - -// py : http://www.nic.py/pautas.html#seccion_9 -// Submitted by registry -py -com.py -coop.py -edu.py -gov.py -mil.py -net.py -org.py - -// qa : http://domains.qa/en/ -qa -com.qa -edu.qa -gov.qa -mil.qa -name.qa -net.qa -org.qa -sch.qa - -// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs -re -asso.re -com.re -nom.re - -// ro : http://www.rotld.ro/ -ro -arts.ro -com.ro -firm.ro -info.ro -nom.ro -nt.ro -org.ro -rec.ro -store.ro -tm.ro -www.ro - -// rs : https://www.rnids.rs/en/domains/national-domains -rs -ac.rs -co.rs -edu.rs -gov.rs -in.rs -org.rs - -// ru : https://cctld.ru/en/domains/domens_ru/reserved/ -ru -ac.ru -edu.ru -gov.ru -int.ru -mil.ru -test.ru - -// rw : http://www.nic.rw/cgi-bin/policy.pl -rw -gov.rw -net.rw -edu.rw -ac.rw -com.rw -co.rw -int.rw -mil.rw -gouv.rw - -// sa : http://www.nic.net.sa/ -sa -com.sa -net.sa -org.sa -gov.sa -med.sa -pub.sa -edu.sa -sch.sa - -// sb : http://www.sbnic.net.sb/ -// Submitted by registry -sb -com.sb -edu.sb -gov.sb -net.sb -org.sb - -// sc : http://www.nic.sc/ -sc -com.sc -gov.sc -net.sc -org.sc -edu.sc - -// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm -// Submitted by registry -sd -com.sd -net.sd -org.sd -edu.sd -med.sd -tv.sd -gov.sd -info.sd - -// se : https://en.wikipedia.org/wiki/.se -// Submitted by registry -se -a.se -ac.se -b.se -bd.se -brand.se -c.se -d.se -e.se -f.se -fh.se -fhsk.se -fhv.se -g.se -h.se -i.se -k.se -komforb.se -kommunalforbund.se -komvux.se -l.se -lanbib.se -m.se -n.se -naturbruksgymn.se -o.se -org.se -p.se -parti.se -pp.se -press.se -r.se -s.se -t.se -tm.se -u.se -w.se -x.se -y.se -z.se - -// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines -sg -com.sg -net.sg -org.sg -gov.sg -edu.sg -per.sg - -// sh : http://www.nic.sh/registrar.html -sh -com.sh -net.sh -gov.sh -org.sh -mil.sh - -// si : https://en.wikipedia.org/wiki/.si -si - -// sj : No registrations at this time. -// Submitted by registry -sj - -// sk : https://en.wikipedia.org/wiki/.sk -// list of 2nd level domains ? -sk - -// sl : http://www.nic.sl -// Submitted by registry -sl -com.sl -net.sl -edu.sl -gov.sl -org.sl - -// sm : https://en.wikipedia.org/wiki/.sm -sm - -// sn : https://en.wikipedia.org/wiki/.sn -sn -art.sn -com.sn -edu.sn -gouv.sn -org.sn -perso.sn -univ.sn - -// so : http://www.soregistry.com/ -so -com.so -net.so -org.so - -// sr : https://en.wikipedia.org/wiki/.sr -sr - -// st : http://www.nic.st/html/policyrules/ -st -co.st -com.st -consulado.st -edu.st -embaixada.st -gov.st -mil.st -net.st -org.st -principe.st -saotome.st -store.st - -// su : https://en.wikipedia.org/wiki/.su -su - -// sv : http://www.svnet.org.sv/niveldos.pdf -sv -com.sv -edu.sv -gob.sv -org.sv -red.sv - -// sx : https://en.wikipedia.org/wiki/.sx -// Submitted by registry -sx -gov.sx - -// sy : https://en.wikipedia.org/wiki/.sy -// see also: http://www.gobin.info/domainname/sy.doc -sy -edu.sy -gov.sy -net.sy -mil.sy -com.sy -org.sy - -// sz : https://en.wikipedia.org/wiki/.sz -// http://www.sispa.org.sz/ -sz -co.sz -ac.sz -org.sz - -// tc : https://en.wikipedia.org/wiki/.tc -tc - -// td : https://en.wikipedia.org/wiki/.td -td - -// tel: https://en.wikipedia.org/wiki/.tel -// http://www.telnic.org/ -tel - -// tf : https://en.wikipedia.org/wiki/.tf -tf - -// tg : https://en.wikipedia.org/wiki/.tg -// http://www.nic.tg/ -tg - -// th : https://en.wikipedia.org/wiki/.th -// Submitted by registry -th -ac.th -co.th -go.th -in.th -mi.th -net.th -or.th - -// tj : http://www.nic.tj/policy.html -tj -ac.tj -biz.tj -co.tj -com.tj -edu.tj -go.tj -gov.tj -int.tj -mil.tj -name.tj -net.tj -nic.tj -org.tj -test.tj -web.tj - -// tk : https://en.wikipedia.org/wiki/.tk -tk - -// tl : https://en.wikipedia.org/wiki/.tl -tl -gov.tl - -// tm : http://www.nic.tm/local.html -tm -com.tm -co.tm -org.tm -net.tm -nom.tm -gov.tm -mil.tm -edu.tm - -// tn : https://en.wikipedia.org/wiki/.tn -// http://whois.ati.tn/ -tn -com.tn -ens.tn -fin.tn -gov.tn -ind.tn -intl.tn -nat.tn -net.tn -org.tn -info.tn -perso.tn -tourism.tn -edunet.tn -rnrt.tn -rns.tn -rnu.tn -mincom.tn -agrinet.tn -defense.tn -turen.tn - -// to : https://en.wikipedia.org/wiki/.to -// Submitted by registry -to -com.to -gov.to -net.to -org.to -edu.to -mil.to - -// subTLDs: https://www.nic.tr/forms/eng/policies.pdf -// and: https://www.nic.tr/forms/politikalar.pdf -// Submitted by -tr -com.tr -info.tr -biz.tr -net.tr -org.tr -web.tr -gen.tr -tv.tr -av.tr -dr.tr -bbs.tr -name.tr -tel.tr -gov.tr -bel.tr -pol.tr -mil.tr -k12.tr -edu.tr -kep.tr - -// Used by Northern Cyprus -nc.tr - -// Used by government agencies of Northern Cyprus -gov.nc.tr - -// travel : https://en.wikipedia.org/wiki/.travel -travel - -// tt : http://www.nic.tt/ -tt -co.tt -com.tt -org.tt -net.tt -biz.tt -info.tt -pro.tt -int.tt -coop.tt -jobs.tt -mobi.tt -travel.tt -museum.tt -aero.tt -name.tt -gov.tt -edu.tt - -// tv : https://en.wikipedia.org/wiki/.tv -// Not listing any 2LDs as reserved since none seem to exist in practice, -// Wikipedia notwithstanding. -tv - -// tw : https://en.wikipedia.org/wiki/.tw -tw -edu.tw -gov.tw -mil.tw -com.tw -net.tw -org.tw -idv.tw -game.tw -ebiz.tw -club.tw -網路.tw -組織.tw -商業.tw - -// tz : http://www.tznic.or.tz/index.php/domains -// Submitted by registry -tz -ac.tz -co.tz -go.tz -hotel.tz -info.tz -me.tz -mil.tz -mobi.tz -ne.tz -or.tz -sc.tz -tv.tz - -// ua : https://hostmaster.ua/policy/?ua -// Submitted by registry -ua -// ua 2LD -com.ua -edu.ua -gov.ua -in.ua -net.ua -org.ua -// ua geographic names -// https://hostmaster.ua/2ld/ -cherkassy.ua -cherkasy.ua -chernigov.ua -chernihiv.ua -chernivtsi.ua -chernovtsy.ua -ck.ua -cn.ua -cr.ua -crimea.ua -cv.ua -dn.ua -dnepropetrovsk.ua -dnipropetrovsk.ua -dominic.ua -donetsk.ua -dp.ua -if.ua -ivano-frankivsk.ua -kh.ua -kharkiv.ua -kharkov.ua -kherson.ua -khmelnitskiy.ua -khmelnytskyi.ua -kiev.ua -kirovograd.ua -km.ua -kr.ua -krym.ua -ks.ua -kv.ua -kyiv.ua -lg.ua -lt.ua -lugansk.ua -lutsk.ua -lv.ua -lviv.ua -mk.ua -mykolaiv.ua -nikolaev.ua -od.ua -odesa.ua -odessa.ua -pl.ua -poltava.ua -rivne.ua -rovno.ua -rv.ua -sb.ua -sebastopol.ua -sevastopol.ua -sm.ua -sumy.ua -te.ua -ternopil.ua -uz.ua -uzhgorod.ua -vinnica.ua -vinnytsia.ua -vn.ua -volyn.ua -yalta.ua -zaporizhzhe.ua -zaporizhzhia.ua -zhitomir.ua -zhytomyr.ua -zp.ua -zt.ua - -// ug : https://www.registry.co.ug/ -ug -co.ug -or.ug -ac.ug -sc.ug -go.ug -ne.ug -com.ug -org.ug - -// uk : https://en.wikipedia.org/wiki/.uk -// Submitted by registry -uk -ac.uk -co.uk -gov.uk -ltd.uk -me.uk -net.uk -nhs.uk -org.uk -plc.uk -police.uk -*.sch.uk - -// us : https://en.wikipedia.org/wiki/.us -us -dni.us -fed.us -isa.us -kids.us -nsn.us -// us geographic names -ak.us -al.us -ar.us -as.us -az.us -ca.us -co.us -ct.us -dc.us -de.us -fl.us -ga.us -gu.us -hi.us -ia.us -id.us -il.us -in.us -ks.us -ky.us -la.us -ma.us -md.us -me.us -mi.us -mn.us -mo.us -ms.us -mt.us -nc.us -nd.us -ne.us -nh.us -nj.us -nm.us -nv.us -ny.us -oh.us -ok.us -or.us -pa.us -pr.us -ri.us -sc.us -sd.us -tn.us -tx.us -ut.us -vi.us -vt.us -va.us -wa.us -wi.us -wv.us -wy.us -// The registrar notes several more specific domains available in each state, -// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat -// haphazard; in some states these domains resolve as addresses, while in others -// only subdomains are available, or even nothing at all. We include the -// most common ones where it's clear that different sites are different -// entities. -k12.ak.us -k12.al.us -k12.ar.us -k12.as.us -k12.az.us -k12.ca.us -k12.co.us -k12.ct.us -k12.dc.us -k12.de.us -k12.fl.us -k12.ga.us -k12.gu.us -// k12.hi.us Bug 614565 - Hawaii has a state-wide DOE login -k12.ia.us -k12.id.us -k12.il.us -k12.in.us -k12.ks.us -k12.ky.us -k12.la.us -k12.ma.us -k12.md.us -k12.me.us -k12.mi.us -k12.mn.us -k12.mo.us -k12.ms.us -k12.mt.us -k12.nc.us -// k12.nd.us Bug 1028347 - Removed at request of Travis Rosso -k12.ne.us -k12.nh.us -k12.nj.us -k12.nm.us -k12.nv.us -k12.ny.us -k12.oh.us -k12.ok.us -k12.or.us -k12.pa.us -k12.pr.us -k12.ri.us -k12.sc.us -// k12.sd.us Bug 934131 - Removed at request of James Booze -k12.tn.us -k12.tx.us -k12.ut.us -k12.vi.us -k12.vt.us -k12.va.us -k12.wa.us -k12.wi.us -// k12.wv.us Bug 947705 - Removed at request of Verne Britton -k12.wy.us -cc.ak.us -cc.al.us -cc.ar.us -cc.as.us -cc.az.us -cc.ca.us -cc.co.us -cc.ct.us -cc.dc.us -cc.de.us -cc.fl.us -cc.ga.us -cc.gu.us -cc.hi.us -cc.ia.us -cc.id.us -cc.il.us -cc.in.us -cc.ks.us -cc.ky.us -cc.la.us -cc.ma.us -cc.md.us -cc.me.us -cc.mi.us -cc.mn.us -cc.mo.us -cc.ms.us -cc.mt.us -cc.nc.us -cc.nd.us -cc.ne.us -cc.nh.us -cc.nj.us -cc.nm.us -cc.nv.us -cc.ny.us -cc.oh.us -cc.ok.us -cc.or.us -cc.pa.us -cc.pr.us -cc.ri.us -cc.sc.us -cc.sd.us -cc.tn.us -cc.tx.us -cc.ut.us -cc.vi.us -cc.vt.us -cc.va.us -cc.wa.us -cc.wi.us -cc.wv.us -cc.wy.us -lib.ak.us -lib.al.us -lib.ar.us -lib.as.us -lib.az.us -lib.ca.us -lib.co.us -lib.ct.us -lib.dc.us -// lib.de.us Issue #243 - Moved to Private section at request of Ed Moore -lib.fl.us -lib.ga.us -lib.gu.us -lib.hi.us -lib.ia.us -lib.id.us -lib.il.us -lib.in.us -lib.ks.us -lib.ky.us -lib.la.us -lib.ma.us -lib.md.us -lib.me.us -lib.mi.us -lib.mn.us -lib.mo.us -lib.ms.us -lib.mt.us -lib.nc.us -lib.nd.us -lib.ne.us -lib.nh.us -lib.nj.us -lib.nm.us -lib.nv.us -lib.ny.us -lib.oh.us -lib.ok.us -lib.or.us -lib.pa.us -lib.pr.us -lib.ri.us -lib.sc.us -lib.sd.us -lib.tn.us -lib.tx.us -lib.ut.us -lib.vi.us -lib.vt.us -lib.va.us -lib.wa.us -lib.wi.us -// lib.wv.us Bug 941670 - Removed at request of Larry W Arnold -lib.wy.us -// k12.ma.us contains school districts in Massachusetts. The 4LDs are -// managed independently except for private (PVT), charter (CHTR) and -// parochial (PAROCH) schools. Those are delegated directly to the -// 5LD operators. -pvt.k12.ma.us -chtr.k12.ma.us -paroch.k12.ma.us -// Merit Network, Inc. maintains the registry for =~ /(k12|cc|lib).mi.us/ and the following -// see also: http://domreg.merit.edu -// see also: whois -h whois.domreg.merit.edu help -ann-arbor.mi.us -cog.mi.us -dst.mi.us -eaton.mi.us -gen.mi.us -mus.mi.us -tec.mi.us -washtenaw.mi.us - -// uy : http://www.nic.org.uy/ -uy -com.uy -edu.uy -gub.uy -mil.uy -net.uy -org.uy - -// uz : http://www.reg.uz/ -uz -co.uz -com.uz -net.uz -org.uz - -// va : https://en.wikipedia.org/wiki/.va -va - -// vc : https://en.wikipedia.org/wiki/.vc -// Submitted by registry -vc -com.vc -net.vc -org.vc -gov.vc -mil.vc -edu.vc - -// ve : https://registro.nic.ve/ -// Submitted by registry -ve -arts.ve -co.ve -com.ve -e12.ve -edu.ve -firm.ve -gob.ve -gov.ve -info.ve -int.ve -mil.ve -net.ve -org.ve -rec.ve -store.ve -tec.ve -web.ve - -// vg : https://en.wikipedia.org/wiki/.vg -vg - -// vi : http://www.nic.vi/newdomainform.htm -// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other -// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they -// are available for registration (which they do not seem to be). -vi -co.vi -com.vi -k12.vi -net.vi -org.vi - -// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp -vn -com.vn -net.vn -org.vn -edu.vn -gov.vn -int.vn -ac.vn -biz.vn -info.vn -name.vn -pro.vn -health.vn - -// vu : https://en.wikipedia.org/wiki/.vu -// http://www.vunic.vu/ -vu -com.vu -edu.vu -net.vu -org.vu - -// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf -wf - -// ws : https://en.wikipedia.org/wiki/.ws -// http://samoanic.ws/index.dhtml -ws -com.ws -net.ws -org.ws -gov.ws -edu.ws - -// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf -yt - -// IDN ccTLDs -// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then -// U-label, and follow this format: -// // A-Label ("", [, variant info]) : -// // [sponsoring org] -// U-Label - -// xn--mgbaam7a8h ("Emerat", Arabic) : AE -// http://nic.ae/english/arabicdomain/rules.jsp -امارات - -// xn--y9a3aq ("hye", Armenian) : AM -// ISOC AM (operated by .am Registry) -հայ - -// xn--54b7fta0cc ("Bangla", Bangla) : BD -বাংলা - -// xn--90ae ("bg", Bulgarian) : BG -бг - -// xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY -// Operated by .by registry -бел - -// xn--fiqs8s ("Zhongguo/China", Chinese, Simplified) : CN -// CNNIC -// http://cnnic.cn/html/Dir/2005/10/11/3218.htm -中国 - -// xn--fiqz9s ("Zhongguo/China", Chinese, Traditional) : CN -// CNNIC -// http://cnnic.cn/html/Dir/2005/10/11/3218.htm -中國 - -// xn--lgbbat1ad8j ("Algeria/Al Jazair", Arabic) : DZ -الجزائر - -// xn--wgbh1c ("Egypt/Masr", Arabic) : EG -// http://www.dotmasr.eg/ -مصر - -// xn--e1a4c ("eu", Cyrillic) : EU -ею - -// xn--node ("ge", Georgian Mkhedruli) : GE -გე - -// xn--qxam ("el", Greek) : GR -// Hellenic Ministry of Infrastructure, Transport, and Networks -ελ - -// xn--j6w193g ("Hong Kong", Chinese) : HK -// https://www2.hkirc.hk/register/rules.jsp -香港 - -// xn--2scrj9c ("Bharat", Kannada) : IN -// India -ಭಾರತ - -// xn--3hcrj9c ("Bharat", Oriya) : IN -// India -ଭାରତ - -// xn--45br5cyl ("Bharatam", Assamese) : IN -// India -ভাৰত - -// xn--h2breg3eve ("Bharatam", Sanskrit) : IN -// India -भारतम् - -// xn--h2brj9c8c ("Bharot", Santali) : IN -// India -भारोत - -// xn--mgbgu82a ("Bharat", Sindhi) : IN -// India -ڀارت - -// xn--rvc1e0am3e ("Bharatam", Malayalam) : IN -// India -ഭാരതം - -// xn--h2brj9c ("Bharat", Devanagari) : IN -// India -भारत - -// xn--mgbbh1a71e ("Bharat", Arabic) : IN -// India -بھارت - -// xn--fpcrj9c3d ("Bharat", Telugu) : IN -// India -భారత్ - -// xn--gecrj9c ("Bharat", Gujarati) : IN -// India -ભારત - -// xn--s9brj9c ("Bharat", Gurmukhi) : IN -// India -ਭਾਰਤ - -// xn--45brj9c ("Bharat", Bengali) : IN -// India -ভারত - -// xn--xkc2dl3a5ee0h ("India", Tamil) : IN -// India -இந்தியா - -// xn--mgba3a4f16a ("Iran", Persian) : IR -ایران - -// xn--mgba3a4fra ("Iran", Arabic) : IR -ايران - -// xn--mgbtx2b ("Iraq", Arabic) : IQ -// Communications and Media Commission -عراق - -// xn--mgbayh7gpa ("al-Ordon", Arabic) : JO -// National Information Technology Center (NITC) -// Royal Scientific Society, Al-Jubeiha -الاردن - -// xn--3e0b707e ("Republic of Korea", Hangul) : KR -한국 - -// xn--80ao21a ("Kaz", Kazakh) : KZ -қаз - -// xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK -// http://nic.lk -ලංකා - -// xn--xkc2al3hye2a ("Ilangai", Tamil) : LK -// http://nic.lk -இலங்கை - -// xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA -المغرب - -// xn--d1alf ("mkd", Macedonian) : MK -// MARnet -мкд - -// xn--l1acc ("mon", Mongolian) : MN -мон - -// xn--mix891f ("Macao", Chinese, Traditional) : MO -// MONIC / HNET Asia (Registry Operator for .mo) -澳門 - -// xn--mix082f ("Macao", Chinese, Simplified) : MO -澳门 - -// xn--mgbx4cd0ab ("Malaysia", Malay) : MY -مليسيا - -// xn--mgb9awbf ("Oman", Arabic) : OM -عمان - -// xn--mgbai9azgqp6j ("Pakistan", Urdu/Arabic) : PK -پاکستان - -// xn--mgbai9a5eva00b ("Pakistan", Urdu/Arabic, variant) : PK -پاكستان - -// xn--ygbi2ammx ("Falasteen", Arabic) : PS -// The Palestinian National Internet Naming Authority (PNINA) -// http://www.pnina.ps -فلسطين - -// xn--90a3ac ("srb", Cyrillic) : RS -// https://www.rnids.rs/en/domains/national-domains -срб -пр.срб -орг.срб -обр.срб -од.срб -упр.срб -ак.срб - -// xn--p1ai ("rf", Russian-Cyrillic) : RU -// http://www.cctld.ru/en/docs/rulesrf.php -рф - -// xn--wgbl6a ("Qatar", Arabic) : QA -// http://www.ict.gov.qa/ -قطر - -// xn--mgberp4a5d4ar ("AlSaudiah", Arabic) : SA -// http://www.nic.net.sa/ -السعودية - -// xn--mgberp4a5d4a87g ("AlSaudiah", Arabic, variant) : SA -السعودیة - -// xn--mgbqly7c0a67fbc ("AlSaudiah", Arabic, variant) : SA -السعودیۃ - -// xn--mgbqly7cvafr ("AlSaudiah", Arabic, variant) : SA -السعوديه - -// xn--mgbpl2fh ("sudan", Arabic) : SD -// Operated by .sd registry -سودان - -// xn--yfro4i67o Singapore ("Singapore", Chinese) : SG -新加坡 - -// xn--clchc0ea0b2g2a9gcd ("Singapore", Tamil) : SG -சிங்கப்பூர் - -// xn--ogbpf8fl ("Syria", Arabic) : SY -سورية - -// xn--mgbtf8fl ("Syria", Arabic, variant) : SY -سوريا - -// xn--o3cw4h ("Thai", Thai) : TH -// http://www.thnic.co.th -ไทย -ศึกษา.ไทย -ธุรกิจ.ไทย -รัฐบาล.ไทย -ทหาร.ไทย -เน็ต.ไทย -องค์กร.ไทย - -// xn--pgbs0dh ("Tunisia", Arabic) : TN -// http://nic.tn -تونس - -// xn--kpry57d ("Taiwan", Chinese, Traditional) : TW -// http://www.twnic.net/english/dn/dn_07a.htm -台灣 - -// xn--kprw13d ("Taiwan", Chinese, Simplified) : TW -// http://www.twnic.net/english/dn/dn_07a.htm -台湾 - -// xn--nnx388a ("Taiwan", Chinese, variant) : TW -臺灣 - -// xn--j1amh ("ukr", Cyrillic) : UA -укр - -// xn--mgb2ddes ("AlYemen", Arabic) : YE -اليمن - -// xxx : http://icmregistry.com -xxx - -// ye : http://www.y.net.ye/services/domain_name.htm -*.ye - -// za : http://www.zadna.org.za/content/page/domain-information -ac.za -agric.za -alt.za -co.za -edu.za -gov.za -grondar.za -law.za -mil.za -net.za -ngo.za -nis.za -nom.za -org.za -school.za -tm.za -web.za - -// zm : https://zicta.zm/ -// Submitted by registry -zm -ac.zm -biz.zm -co.zm -com.zm -edu.zm -gov.zm -info.zm -mil.zm -net.zm -org.zm -sch.zm - -// zw : https://www.potraz.gov.zw/ -// Confirmed by registry 2017-01-25 -zw -ac.zw -co.zw -gov.zw -mil.zw -org.zw - -// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2017-02-23T00:46:09Z - -// aaa : 2015-02-26 American Automobile Association, Inc. -aaa - -// aarp : 2015-05-21 AARP -aarp - -// abarth : 2015-07-30 Fiat Chrysler Automobiles N.V. -abarth - -// abb : 2014-10-24 ABB Ltd -abb - -// abbott : 2014-07-24 Abbott Laboratories, Inc. -abbott - -// abbvie : 2015-07-30 AbbVie Inc. -abbvie - -// abc : 2015-07-30 Disney Enterprises, Inc. -abc - -// able : 2015-06-25 Able Inc. -able - -// abogado : 2014-04-24 Top Level Domain Holdings Limited -abogado - -// abudhabi : 2015-07-30 Abu Dhabi Systems and Information Centre -abudhabi - -// academy : 2013-11-07 Half Oaks, LLC -academy - -// accenture : 2014-08-15 Accenture plc -accenture - -// accountant : 2014-11-20 dot Accountant Limited -accountant - -// accountants : 2014-03-20 Knob Town, LLC -accountants - -// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG -aco - -// active : 2014-05-01 The Active Network, Inc -active - -// actor : 2013-12-12 United TLD Holdco Ltd. -actor - -// adac : 2015-07-16 Allgemeiner Deutscher Automobil-Club e.V. (ADAC) -adac - -// ads : 2014-12-04 Charleston Road Registry Inc. -ads - -// adult : 2014-10-16 ICM Registry AD LLC -adult - -// aeg : 2015-03-19 Aktiebolaget Electrolux -aeg - -// aetna : 2015-05-21 Aetna Life Insurance Company -aetna - -// afamilycompany : 2015-07-23 Johnson Shareholdings, Inc. -afamilycompany - -// afl : 2014-10-02 Australian Football League -afl - -// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa -africa - -// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) -agakhan - -// agency : 2013-11-14 Steel Falls, LLC -agency - -// aig : 2014-12-18 American International Group, Inc. -aig - -// aigo : 2015-08-06 aigo Digital Technology Co,Ltd. -aigo - -// airbus : 2015-07-30 Airbus S.A.S. -airbus - -// airforce : 2014-03-06 United TLD Holdco Ltd. -airforce - -// airtel : 2014-10-24 Bharti Airtel Limited -airtel - -// akdn : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) -akdn - -// alfaromeo : 2015-07-31 Fiat Chrysler Automobiles N.V. -alfaromeo - -// alibaba : 2015-01-15 Alibaba Group Holding Limited -alibaba - -// alipay : 2015-01-15 Alibaba Group Holding Limited -alipay - -// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft -allfinanz - -// allstate : 2015-07-31 Allstate Fire and Casualty Insurance Company -allstate - -// ally : 2015-06-18 Ally Financial Inc. -ally - -// alsace : 2014-07-02 REGION D ALSACE -alsace - -// alstom : 2015-07-30 ALSTOM -alstom - -// americanexpress : 2015-07-31 American Express Travel Related Services Company, Inc. -americanexpress - -// americanfamily : 2015-07-23 AmFam, Inc. -americanfamily - -// amex : 2015-07-31 American Express Travel Related Services Company, Inc. -amex - -// amfam : 2015-07-23 AmFam, Inc. -amfam - -// amica : 2015-05-28 Amica Mutual Insurance Company -amica - -// amsterdam : 2014-07-24 Gemeente Amsterdam -amsterdam - -// analytics : 2014-12-18 Campus IP LLC -analytics - -// android : 2014-08-07 Charleston Road Registry Inc. -android - -// anquan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. -anquan - -// anz : 2015-07-31 Australia and New Zealand Banking Group Limited -anz - -// aol : 2015-09-17 AOL Inc. -aol - -// apartments : 2014-12-11 June Maple, LLC -apartments - -// app : 2015-05-14 Charleston Road Registry Inc. -app - -// apple : 2015-05-14 Apple Inc. -apple - -// aquarelle : 2014-07-24 Aquarelle.com -aquarelle - -// arab : 2015-11-12 League of Arab States -arab - -// aramco : 2014-11-20 Aramco Services Company -aramco - -// archi : 2014-02-06 STARTING DOT LIMITED -archi - -// army : 2014-03-06 United TLD Holdco Ltd. -army - -// art : 2016-03-24 UK Creative Ideas Limited -art - -// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E. -arte - -// asda : 2015-07-31 Wal-Mart Stores, Inc. -asda - -// associates : 2014-03-06 Baxter Hill, LLC -associates - -// athleta : 2015-07-30 The Gap, Inc. -athleta - -// attorney : 2014-03-20 -attorney - -// auction : 2014-03-20 -auction - -// audi : 2015-05-21 AUDI Aktiengesellschaft -audi - -// audible : 2015-06-25 Amazon EU S.à r.l. -audible - -// audio : 2014-03-20 Uniregistry, Corp. -audio - -// auspost : 2015-08-13 Australian Postal Corporation -auspost - -// author : 2014-12-18 Amazon EU S.à r.l. -author - -// auto : 2014-11-13 -auto - -// autos : 2014-01-09 DERAutos, LLC -autos - -// avianca : 2015-01-08 Aerovias del Continente Americano S.A. Avianca -avianca - -// aws : 2015-06-25 Amazon EU S.à r.l. -aws - -// axa : 2013-12-19 AXA SA -axa - -// azure : 2014-12-18 Microsoft Corporation -azure - -// baby : 2015-04-09 Johnson & Johnson Services, Inc. -baby - -// baidu : 2015-01-08 Baidu, Inc. -baidu - -// banamex : 2015-07-30 Citigroup Inc. -banamex - -// bananarepublic : 2015-07-31 The Gap, Inc. -bananarepublic - -// band : 2014-06-12 -band - -// bank : 2014-09-25 fTLD Registry Services LLC -bank - -// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable -bar - -// barcelona : 2014-07-24 Municipi de Barcelona -barcelona - -// barclaycard : 2014-11-20 Barclays Bank PLC -barclaycard - -// barclays : 2014-11-20 Barclays Bank PLC -barclays - -// barefoot : 2015-06-11 Gallo Vineyards, Inc. -barefoot - -// bargains : 2013-11-14 Half Hallow, LLC -bargains - -// baseball : 2015-10-29 MLB Advanced Media DH, LLC -baseball - -// basketball : 2015-08-20 Fédération Internationale de Basketball (FIBA) -basketball - -// bauhaus : 2014-04-17 Werkhaus GmbH -bauhaus - -// bayern : 2014-01-23 Bayern Connect GmbH -bayern - -// bbc : 2014-12-18 British Broadcasting Corporation -bbc - -// bbt : 2015-07-23 BB&T Corporation -bbt - -// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A. -bbva - -// bcg : 2015-04-02 The Boston Consulting Group, Inc. -bcg - -// bcn : 2014-07-24 Municipi de Barcelona -bcn - -// beats : 2015-05-14 Beats Electronics, LLC -beats - -// beauty : 2015-12-03 L'Oréal -beauty - -// beer : 2014-01-09 Top Level Domain Holdings Limited -beer - -// bentley : 2014-12-18 Bentley Motors Limited -bentley - -// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG -berlin - -// best : 2013-12-19 BestTLD Pty Ltd -best - -// bestbuy : 2015-07-31 BBY Solutions, Inc. -bestbuy - -// bet : 2015-05-07 Afilias plc -bet - -// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited -bharti - -// bible : 2014-06-19 American Bible Society -bible - -// bid : 2013-12-19 dot Bid Limited -bid - -// bike : 2013-08-27 Grand Hollow, LLC -bike - -// bing : 2014-12-18 Microsoft Corporation -bing - -// bingo : 2014-12-04 Sand Cedar, LLC -bingo - -// bio : 2014-03-06 STARTING DOT LIMITED -bio - -// black : 2014-01-16 Afilias Limited -black - -// blackfriday : 2014-01-16 Uniregistry, Corp. -blackfriday - -// blanco : 2015-07-16 BLANCO GmbH + Co KG -blanco - -// blockbuster : 2015-07-30 Dish DBS Corporation -blockbuster - -// blog : 2015-05-14 -blog - -// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC -bloomberg - -// blue : 2013-11-07 Afilias Limited -blue - -// bms : 2014-10-30 Bristol-Myers Squibb Company -bms - -// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft -bmw - -// bnl : 2014-07-24 Banca Nazionale del Lavoro -bnl - -// bnpparibas : 2014-05-29 BNP Paribas -bnpparibas - -// boats : 2014-12-04 DERBoats, LLC -boats - -// boehringer : 2015-07-09 Boehringer Ingelheim International GmbH -boehringer - -// bofa : 2015-07-31 NMS Services, Inc. -bofa - -// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br -bom - -// bond : 2014-06-05 Bond University Limited -bond - -// boo : 2014-01-30 Charleston Road Registry Inc. -boo - -// book : 2015-08-27 Amazon EU S.à r.l. -book - -// booking : 2015-07-16 Booking.com B.V. -booking - -// boots : 2015-01-08 THE BOOTS COMPANY PLC -boots - -// bosch : 2015-06-18 Robert Bosch GMBH -bosch - -// bostik : 2015-05-28 Bostik SA -bostik - -// boston : 2015-12-10 -boston - -// bot : 2014-12-18 Amazon EU S.à r.l. -bot - -// boutique : 2013-11-14 Over Galley, LLC -boutique - -// box : 2015-11-12 NS1 Limited -box - -// bradesco : 2014-12-18 Banco Bradesco S.A. -bradesco - -// bridgestone : 2014-12-18 Bridgestone Corporation -bridgestone - -// broadway : 2014-12-22 Celebrate Broadway, Inc. -broadway - -// broker : 2014-12-11 IG Group Holdings PLC -broker - -// brother : 2015-01-29 Brother Industries, Ltd. -brother - -// brussels : 2014-02-06 DNS.be vzw -brussels - -// budapest : 2013-11-21 Top Level Domain Holdings Limited -budapest - -// bugatti : 2015-07-23 Bugatti International SA -bugatti - -// build : 2013-11-07 Plan Bee LLC -build - -// builders : 2013-11-07 Atomic Madison, LLC -builders - -// business : 2013-11-07 Spring Cross, LLC -business - -// buy : 2014-12-18 Amazon EU S.à r.l. -buy - -// buzz : 2013-10-02 DOTSTRATEGY CO. -buzz - -// bzh : 2014-02-27 Association www.bzh -bzh - -// cab : 2013-10-24 Half Sunset, LLC -cab - -// cafe : 2015-02-11 Pioneer Canyon, LLC -cafe - -// cal : 2014-07-24 Charleston Road Registry Inc. -cal - -// call : 2014-12-18 Amazon EU S.à r.l. -call - -// calvinklein : 2015-07-30 PVH gTLD Holdings LLC -calvinklein - -// cam : 2016-04-21 AC Webconnecting Holding B.V. -cam - -// camera : 2013-08-27 Atomic Maple, LLC -camera - -// camp : 2013-11-07 Delta Dynamite, LLC -camp - -// cancerresearch : 2014-05-15 Australian Cancer Research Foundation -cancerresearch - -// canon : 2014-09-12 Canon Inc. -canon - -// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry -capetown - -// capital : 2014-03-06 Delta Mill, LLC -capital - -// capitalone : 2015-08-06 Capital One Financial Corporation -capitalone - -// car : 2015-01-22 -car - -// caravan : 2013-12-12 Caravan International, Inc. -caravan - -// cards : 2013-12-05 Foggy Hollow, LLC -cards - -// care : 2014-03-06 Goose Cross -care - -// career : 2013-10-09 dotCareer LLC -career - -// careers : 2013-10-02 Wild Corner, LLC -careers - -// cars : 2014-11-13 -cars - -// cartier : 2014-06-23 Richemont DNS Inc. -cartier - -// casa : 2013-11-21 Top Level Domain Holdings Limited -casa - -// case : 2015-09-03 CNH Industrial N.V. -case - -// caseih : 2015-09-03 CNH Industrial N.V. -caseih - -// cash : 2014-03-06 Delta Lake, LLC -cash - -// casino : 2014-12-18 Binky Sky, LLC -casino - -// catering : 2013-12-05 New Falls. LLC -catering - -// catholic : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) -catholic - -// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA -cba - -// cbn : 2014-08-22 The Christian Broadcasting Network, Inc. -cbn - -// cbre : 2015-07-02 CBRE, Inc. -cbre - -// cbs : 2015-08-06 CBS Domains Inc. -cbs - -// ceb : 2015-04-09 The Corporate Executive Board Company -ceb - -// center : 2013-11-07 Tin Mill, LLC -center - -// ceo : 2013-11-07 CEOTLD Pty Ltd -ceo - -// cern : 2014-06-05 European Organization for Nuclear Research ("CERN") -cern - -// cfa : 2014-08-28 CFA Institute -cfa - -// cfd : 2014-12-11 IG Group Holdings PLC -cfd - -// chanel : 2015-04-09 Chanel International B.V. -chanel - -// channel : 2014-05-08 Charleston Road Registry Inc. -channel - -// chase : 2015-04-30 JPMorgan Chase & Co. -chase - -// chat : 2014-12-04 Sand Fields, LLC -chat - -// cheap : 2013-11-14 Sand Cover, LLC -cheap - -// chintai : 2015-06-11 CHINTAI Corporation -chintai - -// chloe : 2014-10-16 Richemont DNS Inc. -chloe - -// christmas : 2013-11-21 Uniregistry, Corp. -christmas - -// chrome : 2014-07-24 Charleston Road Registry Inc. -chrome - -// chrysler : 2015-07-30 FCA US LLC. -chrysler - -// church : 2014-02-06 Holly Fields, LLC -church - -// cipriani : 2015-02-19 Hotel Cipriani Srl -cipriani - -// circle : 2014-12-18 Amazon EU S.à r.l. -circle - -// cisco : 2014-12-22 Cisco Technology, Inc. -cisco - -// citadel : 2015-07-23 Citadel Domain LLC -citadel - -// citi : 2015-07-30 Citigroup Inc. -citi - -// citic : 2014-01-09 CITIC Group Corporation -citic - -// city : 2014-05-29 Snow Sky, LLC -city - -// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. -cityeats - -// claims : 2014-03-20 Black Corner, LLC -claims - -// cleaning : 2013-12-05 Fox Shadow, LLC -cleaning - -// click : 2014-06-05 Uniregistry, Corp. -click - -// clinic : 2014-03-20 Goose Park, LLC -clinic - -// clinique : 2015-10-01 The Estée Lauder Companies Inc. -clinique - -// clothing : 2013-08-27 Steel Lake, LLC -clothing - -// cloud : 2015-04-16 ARUBA S.p.A. -cloud - -// club : 2013-11-08 .CLUB DOMAINS, LLC -club - -// clubmed : 2015-06-25 Club Méditerranée S.A. -clubmed - -// coach : 2014-10-09 Koko Island, LLC -coach - -// codes : 2013-10-31 Puff Willow, LLC -codes - -// coffee : 2013-10-17 Trixy Cover, LLC -coffee - -// college : 2014-01-16 XYZ.COM LLC -college - -// cologne : 2014-02-05 NetCologne Gesellschaft für Telekommunikation mbH -cologne - -// comcast : 2015-07-23 Comcast IP Holdings I, LLC -comcast - -// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA -commbank - -// community : 2013-12-05 Fox Orchard, LLC -community - -// company : 2013-11-07 Silver Avenue, LLC -company - -// compare : 2015-10-08 iSelect Ltd -compare - -// computer : 2013-10-24 Pine Mill, LLC -computer - -// comsec : 2015-01-08 VeriSign, Inc. -comsec - -// condos : 2013-12-05 Pine House, LLC -condos - -// construction : 2013-09-16 Fox Dynamite, LLC -construction - -// consulting : 2013-12-05 -consulting - -// contact : 2015-01-08 Top Level Spectrum, Inc. -contact - -// contractors : 2013-09-10 Magic Woods, LLC -contractors - -// cooking : 2013-11-21 Top Level Domain Holdings Limited -cooking - -// cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. -cookingchannel - -// cool : 2013-11-14 Koko Lake, LLC -cool - -// corsica : 2014-09-25 Collectivité Territoriale de Corse -corsica - -// country : 2013-12-19 Top Level Domain Holdings Limited -country - -// coupon : 2015-02-26 Amazon EU S.à r.l. -coupon - -// coupons : 2015-03-26 Black Island, LLC -coupons - -// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD -courses - -// credit : 2014-03-20 Snow Shadow, LLC -credit - -// creditcard : 2014-03-20 Binky Frostbite, LLC -creditcard - -// creditunion : 2015-01-22 CUNA Performance Resources, LLC -creditunion - -// cricket : 2014-10-09 dot Cricket Limited -cricket - -// crown : 2014-10-24 Crown Equipment Corporation -crown - -// crs : 2014-04-03 Federated Co-operatives Limited -crs - -// cruise : 2015-12-10 Viking River Cruises (Bermuda) Ltd. -cruise - -// cruises : 2013-12-05 Spring Way, LLC -cruises - -// csc : 2014-09-25 Alliance-One Services, Inc. -csc - -// cuisinella : 2014-04-03 SALM S.A.S. -cuisinella - -// cymru : 2014-05-08 Nominet UK -cymru - -// cyou : 2015-01-22 Beijing Gamease Age Digital Technology Co., Ltd. -cyou - -// dabur : 2014-02-06 Dabur India Limited -dabur - -// dad : 2014-01-23 Charleston Road Registry Inc. -dad - -// dance : 2013-10-24 United TLD Holdco Ltd. -dance - -// data : 2016-06-02 Dish DBS Corporation -data - -// date : 2014-11-20 dot Date Limited -date - -// dating : 2013-12-05 Pine Fest, LLC -dating - -// datsun : 2014-03-27 NISSAN MOTOR CO., LTD. -datsun - -// day : 2014-01-30 Charleston Road Registry Inc. -day - -// dclk : 2014-11-20 Charleston Road Registry Inc. -dclk - -// dds : 2015-05-07 Top Level Domain Holdings Limited -dds - -// deal : 2015-06-25 Amazon EU S.à r.l. -deal - -// dealer : 2014-12-22 Dealer Dot Com, Inc. -dealer - -// deals : 2014-05-22 Sand Sunset, LLC -deals - -// degree : 2014-03-06 -degree - -// delivery : 2014-09-11 Steel Station, LLC -delivery - -// dell : 2014-10-24 Dell Inc. -dell - -// deloitte : 2015-07-31 Deloitte Touche Tohmatsu -deloitte - -// delta : 2015-02-19 Delta Air Lines, Inc. -delta - -// democrat : 2013-10-24 United TLD Holdco Ltd. -democrat - -// dental : 2014-03-20 Tin Birch, LLC -dental - -// dentist : 2014-03-20 -dentist - -// desi : 2013-11-14 Desi Networks LLC -desi - -// design : 2014-11-07 Top Level Design, LLC -design - -// dev : 2014-10-16 Charleston Road Registry Inc. -dev - -// dhl : 2015-07-23 Deutsche Post AG -dhl - -// diamonds : 2013-09-22 John Edge, LLC -diamonds - -// diet : 2014-06-26 Uniregistry, Corp. -diet - -// digital : 2014-03-06 Dash Park, LLC -digital - -// direct : 2014-04-10 Half Trail, LLC -direct - -// directory : 2013-09-20 Extra Madison, LLC -directory - -// discount : 2014-03-06 Holly Hill, LLC -discount - -// discover : 2015-07-23 Discover Financial Services -discover - -// dish : 2015-07-30 Dish DBS Corporation -dish - -// diy : 2015-11-05 Lifestyle Domain Holdings, Inc. -diy - -// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd. -dnp - -// docs : 2014-10-16 Charleston Road Registry Inc. -docs - -// doctor : 2016-06-02 Brice Trail, LLC -doctor - -// dodge : 2015-07-30 FCA US LLC. -dodge - -// dog : 2014-12-04 Koko Mill, LLC -dog - -// doha : 2014-09-18 Communications Regulatory Authority (CRA) -doha - -// domains : 2013-10-17 Sugar Cross, LLC -domains - -// dot : 2015-05-21 Dish DBS Corporation -dot - -// download : 2014-11-20 dot Support Limited -download - -// drive : 2015-03-05 Charleston Road Registry Inc. -drive - -// dtv : 2015-06-04 Dish DBS Corporation -dtv - -// dubai : 2015-01-01 Dubai Smart Government Department -dubai - -// duck : 2015-07-23 Johnson Shareholdings, Inc. -duck - -// dunlop : 2015-07-02 The Goodyear Tire & Rubber Company -dunlop - -// duns : 2015-08-06 The Dun & Bradstreet Corporation -duns - -// dupont : 2015-06-25 E. I. du Pont de Nemours and Company -dupont - -// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry -durban - -// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG -dvag - -// dvr : 2016-05-26 Hughes Satellite Systems Corporation -dvr - -// earth : 2014-12-04 Interlink Co., Ltd. -earth - -// eat : 2014-01-23 Charleston Road Registry Inc. -eat - -// eco : 2016-07-08 Big Room Inc. -eco - -// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. -edeka - -// education : 2013-11-07 Brice Way, LLC -education - -// email : 2013-10-31 Spring Madison, LLC -email - -// emerck : 2014-04-03 Merck KGaA -emerck - -// energy : 2014-09-11 Binky Birch, LLC -energy - -// engineer : 2014-03-06 United TLD Holdco Ltd. -engineer - -// engineering : 2014-03-06 Romeo Canyon -engineering - -// enterprises : 2013-09-20 Snow Oaks, LLC -enterprises - -// epost : 2015-07-23 Deutsche Post AG -epost - -// epson : 2014-12-04 Seiko Epson Corporation -epson - -// equipment : 2013-08-27 Corn Station, LLC -equipment - -// ericsson : 2015-07-09 Telefonaktiebolaget L M Ericsson -ericsson - -// erni : 2014-04-03 ERNI Group Holding AG -erni - -// esq : 2014-05-08 Charleston Road Registry Inc. -esq - -// estate : 2013-08-27 Trixy Park, LLC -estate - -// esurance : 2015-07-23 Esurance Insurance Company -esurance - -// etisalat : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) -etisalat - -// eurovision : 2014-04-24 European Broadcasting Union (EBU) -eurovision - -// eus : 2013-12-12 Puntueus Fundazioa -eus - -// events : 2013-12-05 Pioneer Maple, LLC -events - -// everbank : 2014-05-15 EverBank -everbank - -// exchange : 2014-03-06 Spring Falls, LLC -exchange - -// expert : 2013-11-21 Magic Pass, LLC -expert - -// exposed : 2013-12-05 Victor Beach, LLC -exposed - -// express : 2015-02-11 Sea Sunset, LLC -express - -// extraspace : 2015-05-14 Extra Space Storage LLC -extraspace - -// fage : 2014-12-18 Fage International S.A. -fage - -// fail : 2014-03-06 Atomic Pipe, LLC -fail - -// fairwinds : 2014-11-13 FairWinds Partners, LLC -fairwinds - -// faith : 2014-11-20 dot Faith Limited -faith - -// family : 2015-04-02 -family - -// fan : 2014-03-06 -fan - -// fans : 2014-11-07 Asiamix Digital Limited -fans - -// farm : 2013-11-07 Just Maple, LLC -farm - -// farmers : 2015-07-09 Farmers Insurance Exchange -farmers - -// fashion : 2014-07-03 Top Level Domain Holdings Limited -fashion - -// fast : 2014-12-18 Amazon EU S.à r.l. -fast - -// fedex : 2015-08-06 Federal Express Corporation -fedex - -// feedback : 2013-12-19 Top Level Spectrum, Inc. -feedback - -// ferrari : 2015-07-31 Fiat Chrysler Automobiles N.V. -ferrari - -// ferrero : 2014-12-18 Ferrero Trading Lux S.A. -ferrero - -// fiat : 2015-07-31 Fiat Chrysler Automobiles N.V. -fiat - -// fidelity : 2015-07-30 Fidelity Brokerage Services LLC -fidelity - -// fido : 2015-08-06 Rogers Communications Partnership -fido - -// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd -film - -// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br -final - -// finance : 2014-03-20 Cotton Cypress, LLC -finance - -// financial : 2014-03-06 Just Cover, LLC -financial - -// fire : 2015-06-25 Amazon EU S.à r.l. -fire - -// firestone : 2014-12-18 Bridgestone Corporation -firestone - -// firmdale : 2014-03-27 Firmdale Holdings Limited -firmdale - -// fish : 2013-12-12 Fox Woods, LLC -fish - -// fishing : 2013-11-21 Top Level Domain Holdings Limited -fishing - -// fit : 2014-11-07 Top Level Domain Holdings Limited -fit - -// fitness : 2014-03-06 Brice Orchard, LLC -fitness - -// flickr : 2015-04-02 Yahoo! Domain Services Inc. -flickr - -// flights : 2013-12-05 Fox Station, LLC -flights - -// flir : 2015-07-23 FLIR Systems, Inc. -flir - -// florist : 2013-11-07 Half Cypress, LLC -florist - -// flowers : 2014-10-09 Uniregistry, Corp. -flowers - -// fly : 2014-05-08 Charleston Road Registry Inc. -fly - -// foo : 2014-01-23 Charleston Road Registry Inc. -foo - -// food : 2016-04-21 Lifestyle Domain Holdings, Inc. -food - -// foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc. -foodnetwork - -// football : 2014-12-18 Foggy Farms, LLC -football - -// ford : 2014-11-13 Ford Motor Company -ford - -// forex : 2014-12-11 IG Group Holdings PLC -forex - -// forsale : 2014-05-22 -forsale - -// forum : 2015-04-02 Fegistry, LLC -forum - -// foundation : 2013-12-05 John Dale, LLC -foundation - -// fox : 2015-09-11 FOX Registry, LLC -fox - -// free : 2015-12-10 Amazon EU S.à r.l. -free - -// fresenius : 2015-07-30 Fresenius Immobilien-Verwaltungs-GmbH -fresenius - -// frl : 2014-05-15 FRLregistry B.V. -frl - -// frogans : 2013-12-19 OP3FT -frogans - -// frontdoor : 2015-07-02 Lifestyle Domain Holdings, Inc. -frontdoor - -// frontier : 2015-02-05 Frontier Communications Corporation -frontier - -// ftr : 2015-07-16 Frontier Communications Corporation -ftr - -// fujitsu : 2015-07-30 Fujitsu Limited -fujitsu - -// fujixerox : 2015-07-23 Xerox DNHC LLC -fujixerox - -// fun : 2016-01-14 -fun - -// fund : 2014-03-20 John Castle, LLC -fund - -// furniture : 2014-03-20 Lone Fields, LLC -furniture - -// futbol : 2013-09-20 -futbol - -// fyi : 2015-04-02 Silver Tigers, LLC -fyi - -// gal : 2013-11-07 Asociación puntoGAL -gal - -// gallery : 2013-09-13 Sugar House, LLC -gallery - -// gallo : 2015-06-11 Gallo Vineyards, Inc. -gallo - -// gallup : 2015-02-19 Gallup, Inc. -gallup - -// game : 2015-05-28 Uniregistry, Corp. -game - -// games : 2015-05-28 -games - -// gap : 2015-07-31 The Gap, Inc. -gap - -// garden : 2014-06-26 Top Level Domain Holdings Limited -garden - -// gbiz : 2014-07-17 Charleston Road Registry Inc. -gbiz - -// gdn : 2014-07-31 Joint Stock Company "Navigation-information systems" -gdn - -// gea : 2014-12-04 GEA Group Aktiengesellschaft -gea - -// gent : 2014-01-23 COMBELL GROUP NV/SA -gent - -// genting : 2015-03-12 Resorts World Inc Pte. Ltd. -genting - -// george : 2015-07-31 Wal-Mart Stores, Inc. -george - -// ggee : 2014-01-09 GMO Internet, Inc. -ggee - -// gift : 2013-10-17 Uniregistry, Corp. -gift - -// gifts : 2014-07-03 Goose Sky, LLC -gifts - -// gives : 2014-03-06 United TLD Holdco Ltd. -gives - -// giving : 2014-11-13 Giving Limited -giving - -// glade : 2015-07-23 Johnson Shareholdings, Inc. -glade - -// glass : 2013-11-07 Black Cover, LLC -glass - -// gle : 2014-07-24 Charleston Road Registry Inc. -gle - -// global : 2014-04-17 Dot GLOBAL AS -global - -// globo : 2013-12-19 Globo Comunicação e Participações S.A -globo - -// gmail : 2014-05-01 Charleston Road Registry Inc. -gmail - -// gmbh : 2016-01-29 Extra Dynamite, LLC -gmbh - -// gmo : 2014-01-09 GMO Internet, Inc. -gmo - -// gmx : 2014-04-24 1&1 Mail & Media GmbH -gmx - -// godaddy : 2015-07-23 Go Daddy East, LLC -godaddy - -// gold : 2015-01-22 June Edge, LLC -gold - -// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. -goldpoint - -// golf : 2014-12-18 Lone falls, LLC -golf - -// goo : 2014-12-18 NTT Resonant Inc. -goo - -// goodhands : 2015-07-31 Allstate Fire and Casualty Insurance Company -goodhands - -// goodyear : 2015-07-02 The Goodyear Tire & Rubber Company -goodyear - -// goog : 2014-11-20 Charleston Road Registry Inc. -goog - -// google : 2014-07-24 Charleston Road Registry Inc. -google - -// gop : 2014-01-16 Republican State Leadership Committee, Inc. -gop - -// got : 2014-12-18 Amazon EU S.à r.l. -got - -// grainger : 2015-05-07 Grainger Registry Services, LLC -grainger - -// graphics : 2013-09-13 Over Madison, LLC -graphics - -// gratis : 2014-03-20 Pioneer Tigers, LLC -gratis - -// green : 2014-05-08 Afilias Limited -green - -// gripe : 2014-03-06 Corn Sunset, LLC -gripe - -// grocery : 2016-06-16 Wal-Mart Stores, Inc. -grocery - -// group : 2014-08-15 Romeo Town, LLC -group - -// guardian : 2015-07-30 The Guardian Life Insurance Company of America -guardian - -// gucci : 2014-11-13 Guccio Gucci S.p.a. -gucci - -// guge : 2014-08-28 Charleston Road Registry Inc. -guge - -// guide : 2013-09-13 Snow Moon, LLC -guide - -// guitars : 2013-11-14 Uniregistry, Corp. -guitars - -// guru : 2013-08-27 Pioneer Cypress, LLC -guru - -// hair : 2015-12-03 L'Oréal -hair - -// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH -hamburg - -// hangout : 2014-11-13 Charleston Road Registry Inc. -hangout - -// haus : 2013-12-05 -haus - -// hbo : 2015-07-30 HBO Registry Services, Inc. -hbo - -// hdfc : 2015-07-30 HOUSING DEVELOPMENT FINANCE CORPORATION LIMITED -hdfc - -// hdfcbank : 2015-02-12 HDFC Bank Limited -hdfcbank - -// health : 2015-02-11 DotHealth, LLC -health - -// healthcare : 2014-06-12 Silver Glen, LLC -healthcare - -// help : 2014-06-26 Uniregistry, Corp. -help - -// helsinki : 2015-02-05 City of Helsinki -helsinki - -// here : 2014-02-06 Charleston Road Registry Inc. -here - -// hermes : 2014-07-10 HERMES INTERNATIONAL -hermes - -// hgtv : 2015-07-02 Lifestyle Domain Holdings, Inc. -hgtv - -// hiphop : 2014-03-06 Uniregistry, Corp. -hiphop - -// hisamitsu : 2015-07-16 Hisamitsu Pharmaceutical Co.,Inc. -hisamitsu - -// hitachi : 2014-10-31 Hitachi, Ltd. -hitachi - -// hiv : 2014-03-13 -hiv - -// hkt : 2015-05-14 PCCW-HKT DataCom Services Limited -hkt - -// hockey : 2015-03-19 Half Willow, LLC -hockey - -// holdings : 2013-08-27 John Madison, LLC -holdings - -// holiday : 2013-11-07 Goose Woods, LLC -holiday - -// homedepot : 2015-04-02 Homer TLC, Inc. -homedepot - -// homegoods : 2015-07-16 The TJX Companies, Inc. -homegoods - -// homes : 2014-01-09 DERHomes, LLC -homes - -// homesense : 2015-07-16 The TJX Companies, Inc. -homesense - -// honda : 2014-12-18 Honda Motor Co., Ltd. -honda - -// honeywell : 2015-07-23 Honeywell GTLD LLC -honeywell - -// horse : 2013-11-21 Top Level Domain Holdings Limited -horse - -// hospital : 2016-10-20 Ruby Pike, LLC -hospital - -// host : 2014-04-17 DotHost Inc. -host - -// hosting : 2014-05-29 Uniregistry, Corp. -hosting - -// hot : 2015-08-27 Amazon EU S.à r.l. -hot - -// hoteles : 2015-03-05 Travel Reservations SRL -hoteles - -// hotels : 2016-04-07 Booking.com B.V. -hotels - -// hotmail : 2014-12-18 Microsoft Corporation -hotmail - -// house : 2013-11-07 Sugar Park, LLC -house - -// how : 2014-01-23 Charleston Road Registry Inc. -how - -// hsbc : 2014-10-24 HSBC Holdings PLC -hsbc - -// htc : 2015-04-02 HTC corporation -htc - -// hughes : 2015-07-30 Hughes Satellite Systems Corporation -hughes - -// hyatt : 2015-07-30 Hyatt GTLD, L.L.C. -hyatt - -// hyundai : 2015-07-09 Hyundai Motor Company -hyundai - -// ibm : 2014-07-31 International Business Machines Corporation -ibm - -// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited -icbc - -// ice : 2014-10-30 IntercontinentalExchange, Inc. -ice - -// icu : 2015-01-08 One.com A/S -icu - -// ieee : 2015-07-23 IEEE Global LLC -ieee - -// ifm : 2014-01-30 ifm electronic gmbh -ifm - -// ikano : 2015-07-09 Ikano S.A. -ikano - -// imamat : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) -imamat - -// imdb : 2015-06-25 Amazon EU S.à r.l. -imdb - -// immo : 2014-07-10 Auburn Bloom, LLC -immo - -// immobilien : 2013-11-07 United TLD Holdco Ltd. -immobilien - -// industries : 2013-12-05 Outer House, LLC -industries - -// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD. -infiniti - -// ing : 2014-01-23 Charleston Road Registry Inc. -ing - -// ink : 2013-12-05 Top Level Design, LLC -ink - -// institute : 2013-11-07 Outer Maple, LLC -institute - -// insurance : 2015-02-19 fTLD Registry Services LLC -insurance - -// insure : 2014-03-20 Pioneer Willow, LLC -insure - -// intel : 2015-08-06 Intel Corporation -intel - -// international : 2013-11-07 Wild Way, LLC -international - -// intuit : 2015-07-30 Intuit Administrative Services, Inc. -intuit - -// investments : 2014-03-20 Holly Glen, LLC -investments - -// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. -ipiranga - -// irish : 2014-08-07 Dot-Irish LLC -irish - -// iselect : 2015-02-11 iSelect Ltd -iselect - -// ismaili : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) -ismaili - -// ist : 2014-08-28 Istanbul Metropolitan Municipality -ist - -// istanbul : 2014-08-28 Istanbul Metropolitan Municipality -istanbul - -// itau : 2014-10-02 Itau Unibanco Holding S.A. -itau - -// itv : 2015-07-09 ITV Services Limited -itv - -// iveco : 2015-09-03 CNH Industrial N.V. -iveco - -// iwc : 2014-06-23 Richemont DNS Inc. -iwc - -// jaguar : 2014-11-13 Jaguar Land Rover Ltd -jaguar - -// java : 2014-06-19 Oracle Corporation -java - -// jcb : 2014-11-20 JCB Co., Ltd. -jcb - -// jcp : 2015-04-23 JCP Media, Inc. -jcp - -// jeep : 2015-07-30 FCA US LLC. -jeep - -// jetzt : 2014-01-09 -jetzt - -// jewelry : 2015-03-05 Wild Bloom, LLC -jewelry - -// jio : 2015-04-02 Affinity Names, Inc. -jio - -// jlc : 2014-12-04 Richemont DNS Inc. -jlc - -// jll : 2015-04-02 Jones Lang LaSalle Incorporated -jll - -// jmp : 2015-03-26 Matrix IP LLC -jmp - -// jnj : 2015-06-18 Johnson & Johnson Services, Inc. -jnj - -// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry -joburg - -// jot : 2014-12-18 Amazon EU S.à r.l. -jot - -// joy : 2014-12-18 Amazon EU S.à r.l. -joy - -// jpmorgan : 2015-04-30 JPMorgan Chase & Co. -jpmorgan - -// jprs : 2014-09-18 Japan Registry Services Co., Ltd. -jprs - -// juegos : 2014-03-20 Uniregistry, Corp. -juegos - -// juniper : 2015-07-30 JUNIPER NETWORKS, INC. -juniper - -// kaufen : 2013-11-07 United TLD Holdco Ltd. -kaufen - -// kddi : 2014-09-12 KDDI CORPORATION -kddi - -// kerryhotels : 2015-04-30 Kerry Trading Co. Limited -kerryhotels - -// kerrylogistics : 2015-04-09 Kerry Trading Co. Limited -kerrylogistics - -// kerryproperties : 2015-04-09 Kerry Trading Co. Limited -kerryproperties - -// kfh : 2014-12-04 Kuwait Finance House -kfh - -// kia : 2015-07-09 KIA MOTORS CORPORATION -kia - -// kim : 2013-09-23 Afilias Limited -kim - -// kinder : 2014-11-07 Ferrero Trading Lux S.A. -kinder - -// kindle : 2015-06-25 Amazon EU S.à r.l. -kindle - -// kitchen : 2013-09-20 Just Goodbye, LLC -kitchen - -// kiwi : 2013-09-20 DOT KIWI LIMITED -kiwi - -// koeln : 2014-01-09 NetCologne Gesellschaft für Telekommunikation mbH -koeln - -// komatsu : 2015-01-08 Komatsu Ltd. -komatsu - -// kosher : 2015-08-20 Kosher Marketing Assets LLC -kosher - -// kpmg : 2015-04-23 KPMG International Cooperative (KPMG International Genossenschaft) -kpmg - -// kpn : 2015-01-08 Koninklijke KPN N.V. -kpn - -// krd : 2013-12-05 KRG Department of Information Technology -krd - -// kred : 2013-12-19 KredTLD Pty Ltd -kred - -// kuokgroup : 2015-04-09 Kerry Trading Co. Limited -kuokgroup - -// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen -kyoto - -// lacaixa : 2014-01-09 CAIXA D'ESTALVIS I PENSIONS DE BARCELONA -lacaixa - -// ladbrokes : 2015-08-06 LADBROKES INTERNATIONAL PLC -ladbrokes - -// lamborghini : 2015-06-04 Automobili Lamborghini S.p.A. -lamborghini - -// lamer : 2015-10-01 The Estée Lauder Companies Inc. -lamer - -// lancaster : 2015-02-12 LANCASTER -lancaster - -// lancia : 2015-07-31 Fiat Chrysler Automobiles N.V. -lancia - -// lancome : 2015-07-23 L'Oréal -lancome - -// land : 2013-09-10 Pine Moon, LLC -land - -// landrover : 2014-11-13 Jaguar Land Rover Ltd -landrover - -// lanxess : 2015-07-30 LANXESS Corporation -lanxess - -// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated -lasalle - -// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico -lat - -// latino : 2015-07-30 Dish DBS Corporation -latino - -// latrobe : 2014-06-16 La Trobe University -latrobe - -// law : 2015-01-22 Minds + Machines Group Limited -law - -// lawyer : 2014-03-20 -lawyer - -// lds : 2014-03-20 IRI Domain Management, LLC ("Applicant") -lds - -// lease : 2014-03-06 Victor Trail, LLC -lease - -// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc -leclerc - -// lefrak : 2015-07-16 LeFrak Organization, Inc. -lefrak - -// legal : 2014-10-16 Blue Falls, LLC -legal - -// lego : 2015-07-16 LEGO Juris A/S -lego - -// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION -lexus - -// lgbt : 2014-05-08 Afilias Limited -lgbt - -// liaison : 2014-10-02 Liaison Technologies, Incorporated -liaison - -// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG -lidl - -// life : 2014-02-06 Trixy Oaks, LLC -life - -// lifeinsurance : 2015-01-15 American Council of Life Insurers -lifeinsurance - -// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc. -lifestyle - -// lighting : 2013-08-27 John McCook, LLC -lighting - -// like : 2014-12-18 Amazon EU S.à r.l. -like - -// lilly : 2015-07-31 Eli Lilly and Company -lilly - -// limited : 2014-03-06 Big Fest, LLC -limited - -// limo : 2013-10-17 Hidden Frostbite, LLC -limo - -// lincoln : 2014-11-13 Ford Motor Company -lincoln - -// linde : 2014-12-04 Linde Aktiengesellschaft -linde - -// link : 2013-11-14 Uniregistry, Corp. -link - -// lipsy : 2015-06-25 Lipsy Ltd -lipsy - -// live : 2014-12-04 -live - -// living : 2015-07-30 Lifestyle Domain Holdings, Inc. -living - -// lixil : 2015-03-19 LIXIL Group Corporation -lixil - -// loan : 2014-11-20 dot Loan Limited -loan - -// loans : 2014-03-20 June Woods, LLC -loans - -// locker : 2015-06-04 Dish DBS Corporation -locker - -// locus : 2015-06-25 Locus Analytics LLC -locus - -// loft : 2015-07-30 Annco, Inc. -loft - -// lol : 2015-01-30 Uniregistry, Corp. -lol - -// london : 2013-11-14 Dot London Domains Limited -london - -// lotte : 2014-11-07 Lotte Holdings Co., Ltd. -lotte - -// lotto : 2014-04-10 Afilias Limited -lotto - -// love : 2014-12-22 Merchant Law Group LLP -love - -// lpl : 2015-07-30 LPL Holdings, Inc. -lpl - -// lplfinancial : 2015-07-30 LPL Holdings, Inc. -lplfinancial - -// ltd : 2014-09-25 Over Corner, LLC -ltd - -// ltda : 2014-04-17 DOMAIN ROBOT SERVICOS DE HOSPEDAGEM NA INTERNET LTDA -ltda - -// lundbeck : 2015-08-06 H. Lundbeck A/S -lundbeck - -// lupin : 2014-11-07 LUPIN LIMITED -lupin - -// luxe : 2014-01-09 Top Level Domain Holdings Limited -luxe - -// luxury : 2013-10-17 Luxury Partners, LLC -luxury - -// macys : 2015-07-31 Macys, Inc. -macys - -// madrid : 2014-05-01 Comunidad de Madrid -madrid - -// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF) -maif - -// maison : 2013-12-05 Victor Frostbite, LLC -maison - -// makeup : 2015-01-15 L'Oréal -makeup - -// man : 2014-12-04 MAN SE -man - -// management : 2013-11-07 John Goodbye, LLC -management - -// mango : 2013-10-24 PUNTO FA S.L. -mango - -// map : 2016-06-09 Charleston Road Registry Inc. -map - -// market : 2014-03-06 -market - -// marketing : 2013-11-07 Fern Pass, LLC -marketing - -// markets : 2014-12-11 IG Group Holdings PLC -markets - -// marriott : 2014-10-09 Marriott Worldwide Corporation -marriott - -// marshalls : 2015-07-16 The TJX Companies, Inc. -marshalls - -// maserati : 2015-07-31 Fiat Chrysler Automobiles N.V. -maserati - -// mattel : 2015-08-06 Mattel Sites, Inc. -mattel - -// mba : 2015-04-02 Lone Hollow, LLC -mba - -// mcd : 2015-07-30 McDonald’s Corporation -mcd - -// mcdonalds : 2015-07-30 McDonald’s Corporation -mcdonalds - -// mckinsey : 2015-07-31 McKinsey Holdings, Inc. -mckinsey - -// med : 2015-08-06 Medistry LLC -med - -// media : 2014-03-06 Grand Glen, LLC -media - -// meet : 2014-01-16 -meet - -// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation -melbourne - -// meme : 2014-01-30 Charleston Road Registry Inc. -meme - -// memorial : 2014-10-16 Dog Beach, LLC -memorial - -// men : 2015-02-26 Exclusive Registry Limited -men - -// menu : 2013-09-11 Wedding TLD2, LLC -menu - -// meo : 2014-11-07 PT Comunicacoes S.A. -meo - -// merckmsd : 2016-07-14 MSD Registry Holdings, Inc. -merckmsd - -// metlife : 2015-05-07 MetLife Services and Solutions, LLC -metlife - -// miami : 2013-12-19 Top Level Domain Holdings Limited -miami - -// microsoft : 2014-12-18 Microsoft Corporation -microsoft - -// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft -mini - -// mint : 2015-07-30 Intuit Administrative Services, Inc. -mint - -// mit : 2015-07-02 Massachusetts Institute of Technology -mit - -// mitsubishi : 2015-07-23 Mitsubishi Corporation -mitsubishi - -// mlb : 2015-05-21 MLB Advanced Media DH, LLC -mlb - -// mls : 2015-04-23 The Canadian Real Estate Association -mls - -// mma : 2014-11-07 MMA IARD -mma - -// mobile : 2016-06-02 Dish DBS Corporation -mobile - -// mobily : 2014-12-18 GreenTech Consultancy Company W.L.L. -mobily - -// moda : 2013-11-07 United TLD Holdco Ltd. -moda - -// moe : 2013-11-13 Interlink Co., Ltd. -moe - -// moi : 2014-12-18 Amazon EU S.à r.l. -moi - -// mom : 2015-04-16 Uniregistry, Corp. -mom - -// monash : 2013-09-30 Monash University -monash - -// money : 2014-10-16 Outer McCook, LLC -money - -// monster : 2015-09-11 Monster Worldwide, Inc. -monster - -// montblanc : 2014-06-23 Richemont DNS Inc. -montblanc - -// mopar : 2015-07-30 FCA US LLC. -mopar - -// mormon : 2013-12-05 IRI Domain Management, LLC ("Applicant") -mormon - -// mortgage : 2014-03-20 -mortgage - -// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) -moscow - -// moto : 2015-06-04 -moto - -// motorcycles : 2014-01-09 DERMotorcycles, LLC -motorcycles - -// mov : 2014-01-30 Charleston Road Registry Inc. -mov - -// movie : 2015-02-05 New Frostbite, LLC -movie - -// movistar : 2014-10-16 Telefónica S.A. -movistar - -// msd : 2015-07-23 MSD Registry Holdings, Inc. -msd - -// mtn : 2014-12-04 MTN Dubai Limited -mtn - -// mtpc : 2014-11-20 Mitsubishi Tanabe Pharma Corporation -mtpc - -// mtr : 2015-03-12 MTR Corporation Limited -mtr - -// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC -mutual - -// nab : 2015-08-20 National Australia Bank Limited -nab - -// nadex : 2014-12-11 IG Group Holdings PLC -nadex - -// nagoya : 2013-10-24 GMO Registry, Inc. -nagoya - -// nationwide : 2015-07-23 Nationwide Mutual Insurance Company -nationwide - -// natura : 2015-03-12 NATURA COSMÉTICOS S.A. -natura - -// navy : 2014-03-06 United TLD Holdco Ltd. -navy - -// nba : 2015-07-31 NBA REGISTRY, LLC -nba - -// nec : 2015-01-08 NEC Corporation -nec - -// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA -netbank - -// netflix : 2015-06-18 Netflix, Inc. -netflix - -// network : 2013-11-14 Trixy Manor, LLC -network - -// neustar : 2013-12-05 NeuStar, Inc. -neustar - -// new : 2014-01-30 Charleston Road Registry Inc. -new - -// newholland : 2015-09-03 CNH Industrial N.V. -newholland - -// news : 2014-12-18 -news - -// next : 2015-06-18 Next plc -next - -// nextdirect : 2015-06-18 Next plc -nextdirect - -// nexus : 2014-07-24 Charleston Road Registry Inc. -nexus - -// nfl : 2015-07-23 NFL Reg Ops LLC -nfl - -// ngo : 2014-03-06 Public Interest Registry -ngo - -// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK) -nhk - -// nico : 2014-12-04 DWANGO Co., Ltd. -nico - -// nike : 2015-07-23 NIKE, Inc. -nike - -// nikon : 2015-05-21 NIKON CORPORATION -nikon - -// ninja : 2013-11-07 United TLD Holdco Ltd. -ninja - -// nissan : 2014-03-27 NISSAN MOTOR CO., LTD. -nissan - -// nissay : 2015-10-29 Nippon Life Insurance Company -nissay - -// nokia : 2015-01-08 Nokia Corporation -nokia - -// northwesternmutual : 2015-06-18 Northwestern Mutual Registry, LLC -northwesternmutual - -// norton : 2014-12-04 Symantec Corporation -norton - -// now : 2015-06-25 Amazon EU S.à r.l. -now - -// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. -nowruz - -// nowtv : 2015-05-14 Starbucks (HK) Limited -nowtv - -// nra : 2014-05-22 NRA Holdings Company, INC. -nra - -// nrw : 2013-11-21 Minds + Machines GmbH -nrw - -// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION -ntt - -// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications -nyc - -// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA -obi - -// observer : 2015-04-30 -observer - -// off : 2015-07-23 Johnson Shareholdings, Inc. -off - -// office : 2015-03-12 Microsoft Corporation -office - -// okinawa : 2013-12-05 BusinessRalliart Inc. -okinawa - -// olayan : 2015-05-14 Crescent Holding GmbH -olayan - -// olayangroup : 2015-05-14 Crescent Holding GmbH -olayangroup - -// oldnavy : 2015-07-31 The Gap, Inc. -oldnavy - -// ollo : 2015-06-04 Dish DBS Corporation -ollo - -// omega : 2015-01-08 The Swatch Group Ltd -omega - -// one : 2014-11-07 One.com A/S -one - -// ong : 2014-03-06 Public Interest Registry -ong - -// onl : 2013-09-16 I-Registry Ltd. -onl - -// online : 2015-01-15 DotOnline Inc. -online - -// onyourside : 2015-07-23 Nationwide Mutual Insurance Company -onyourside - -// ooo : 2014-01-09 INFIBEAM INCORPORATION LIMITED -ooo - -// open : 2015-07-31 American Express Travel Related Services Company, Inc. -open - -// oracle : 2014-06-19 Oracle Corporation -oracle - -// orange : 2015-03-12 Orange Brand Services Limited -orange - -// organic : 2014-03-27 Afilias Limited -organic - -// origins : 2015-10-01 The Estée Lauder Companies Inc. -origins - -// osaka : 2014-09-04 Interlink Co., Ltd. -osaka - -// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd. -otsuka - -// ott : 2015-06-04 Dish DBS Corporation -ott - -// ovh : 2014-01-16 OVH SAS -ovh - -// page : 2014-12-04 Charleston Road Registry Inc. -page - -// pamperedchef : 2015-02-05 The Pampered Chef, Ltd. -pamperedchef - -// panasonic : 2015-07-30 Panasonic Corporation -panasonic - -// panerai : 2014-11-07 Richemont DNS Inc. -panerai - -// paris : 2014-01-30 City of Paris -paris - -// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. -pars - -// partners : 2013-12-05 Magic Glen, LLC -partners - -// parts : 2013-12-05 Sea Goodbye, LLC -parts - -// party : 2014-09-11 Blue Sky Registry Limited -party - -// passagens : 2015-03-05 Travel Reservations SRL -passagens - -// pay : 2015-08-27 Amazon EU S.à r.l. -pay - -// pccw : 2015-05-14 PCCW Enterprises Limited -pccw - -// pet : 2015-05-07 Afilias plc -pet - -// pfizer : 2015-09-11 Pfizer Inc. -pfizer - -// pharmacy : 2014-06-19 National Association of Boards of Pharmacy -pharmacy - -// phd : 2016-07-28 Charleston Road Registry Inc. -phd - -// philips : 2014-11-07 Koninklijke Philips N.V. -philips - -// phone : 2016-06-02 Dish DBS Corporation -phone - -// photo : 2013-11-14 Uniregistry, Corp. -photo - -// photography : 2013-09-20 Sugar Glen, LLC -photography - -// photos : 2013-10-17 Sea Corner, LLC -photos - -// physio : 2014-05-01 PhysBiz Pty Ltd -physio - -// piaget : 2014-10-16 Richemont DNS Inc. -piaget - -// pics : 2013-11-14 Uniregistry, Corp. -pics - -// pictet : 2014-06-26 Pictet Europe S.A. -pictet - -// pictures : 2014-03-06 Foggy Sky, LLC -pictures - -// pid : 2015-01-08 Top Level Spectrum, Inc. -pid - -// pin : 2014-12-18 Amazon EU S.à r.l. -pin - -// ping : 2015-06-11 Ping Registry Provider, Inc. -ping - -// pink : 2013-10-01 Afilias Limited -pink - -// pioneer : 2015-07-16 Pioneer Corporation -pioneer - -// pizza : 2014-06-26 Foggy Moon, LLC -pizza - -// place : 2014-04-24 Snow Galley, LLC -place - -// play : 2015-03-05 Charleston Road Registry Inc. -play - -// playstation : 2015-07-02 Sony Computer Entertainment Inc. -playstation - -// plumbing : 2013-09-10 Spring Tigers, LLC -plumbing - -// plus : 2015-02-05 Sugar Mill, LLC -plus - -// pnc : 2015-07-02 PNC Domain Co., LLC -pnc - -// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG -pohl - -// poker : 2014-07-03 Afilias Domains No. 5 Limited -poker - -// politie : 2015-08-20 Politie Nederland -politie - -// porn : 2014-10-16 ICM Registry PN LLC -porn - -// pramerica : 2015-07-30 Prudential Financial, Inc. -pramerica - -// praxi : 2013-12-05 Praxi S.p.A. -praxi - -// press : 2014-04-03 DotPress Inc. -press - -// prime : 2015-06-25 Amazon EU S.à r.l. -prime - -// prod : 2014-01-23 Charleston Road Registry Inc. -prod - -// productions : 2013-12-05 Magic Birch, LLC -productions - -// prof : 2014-07-24 Charleston Road Registry Inc. -prof - -// progressive : 2015-07-23 Progressive Casualty Insurance Company -progressive - -// promo : 2014-12-18 -promo - -// properties : 2013-12-05 Big Pass, LLC -properties - -// property : 2014-05-22 Uniregistry, Corp. -property - -// protection : 2015-04-23 -protection - -// pru : 2015-07-30 Prudential Financial, Inc. -pru - -// prudential : 2015-07-30 Prudential Financial, Inc. -prudential - -// pub : 2013-12-12 United TLD Holdco Ltd. -pub - -// pwc : 2015-10-29 PricewaterhouseCoopers LLP -pwc - -// qpon : 2013-11-14 dotCOOL, Inc. -qpon - -// quebec : 2013-12-19 PointQuébec Inc -quebec - -// quest : 2015-03-26 Quest ION Limited -quest - -// qvc : 2015-07-30 QVC, Inc. -qvc - -// racing : 2014-12-04 Premier Registry Limited -racing - -// radio : 2016-07-21 European Broadcasting Union (EBU) -radio - -// raid : 2015-07-23 Johnson Shareholdings, Inc. -raid - -// read : 2014-12-18 Amazon EU S.à r.l. -read - -// realestate : 2015-09-11 dotRealEstate LLC -realestate - -// realtor : 2014-05-29 Real Estate Domains LLC -realtor - -// realty : 2015-03-19 Fegistry, LLC -realty - -// recipes : 2013-10-17 Grand Island, LLC -recipes - -// red : 2013-11-07 Afilias Limited -red - -// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd. -redstone - -// redumbrella : 2015-03-26 Travelers TLD, LLC -redumbrella - -// rehab : 2014-03-06 United TLD Holdco Ltd. -rehab - -// reise : 2014-03-13 -reise - -// reisen : 2014-03-06 New Cypress, LLC -reisen - -// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc. -reit - -// reliance : 2015-04-02 Reliance Industries Limited -reliance - -// ren : 2013-12-12 Beijing Qianxiang Wangjing Technology Development Co., Ltd. -ren - -// rent : 2014-12-04 DERRent, LLC -rent - -// rentals : 2013-12-05 Big Hollow,LLC -rentals - -// repair : 2013-11-07 Lone Sunset, LLC -repair - -// report : 2013-12-05 Binky Glen, LLC -report - -// republican : 2014-03-20 United TLD Holdco Ltd. -republican - -// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable -rest - -// restaurant : 2014-07-03 Snow Avenue, LLC -restaurant - -// review : 2014-11-20 dot Review Limited -review - -// reviews : 2013-09-13 -reviews - -// rexroth : 2015-06-18 Robert Bosch GMBH -rexroth - -// rich : 2013-11-21 I-Registry Ltd. -rich - -// richardli : 2015-05-14 Pacific Century Asset Management (HK) Limited -richardli - -// ricoh : 2014-11-20 Ricoh Company, Ltd. -ricoh - -// rightathome : 2015-07-23 Johnson Shareholdings, Inc. -rightathome - -// ril : 2015-04-02 Reliance Industries Limited -ril - -// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO -rio - -// rip : 2014-07-10 United TLD Holdco Ltd. -rip - -// rmit : 2015-11-19 Royal Melbourne Institute of Technology -rmit - -// rocher : 2014-12-18 Ferrero Trading Lux S.A. -rocher - -// rocks : 2013-11-14 -rocks - -// rodeo : 2013-12-19 Top Level Domain Holdings Limited -rodeo - -// rogers : 2015-08-06 Rogers Communications Partnership -rogers - -// room : 2014-12-18 Amazon EU S.à r.l. -room - -// rsvp : 2014-05-08 Charleston Road Registry Inc. -rsvp - -// rugby : 2016-12-15 World Rugby Strategic Developments Limited -rugby - -// ruhr : 2013-10-02 regiodot GmbH & Co. KG -ruhr - -// run : 2015-03-19 Snow Park, LLC -run - -// rwe : 2015-04-02 RWE AG -rwe - -// ryukyu : 2014-01-09 BusinessRalliart Inc. -ryukyu - -// saarland : 2013-12-12 dotSaarland GmbH -saarland - -// safe : 2014-12-18 Amazon EU S.à r.l. -safe - -// safety : 2015-01-08 Safety Registry Services, LLC. -safety - -// sakura : 2014-12-18 SAKURA Internet Inc. -sakura - -// sale : 2014-10-16 -sale - -// salon : 2014-12-11 Outer Orchard, LLC -salon - -// samsclub : 2015-07-31 Wal-Mart Stores, Inc. -samsclub - -// samsung : 2014-04-03 SAMSUNG SDS CO., LTD -samsung - -// sandvik : 2014-11-13 Sandvik AB -sandvik - -// sandvikcoromant : 2014-11-07 Sandvik AB -sandvikcoromant - -// sanofi : 2014-10-09 Sanofi -sanofi - -// sap : 2014-03-27 SAP AG -sap - -// sapo : 2014-11-07 PT Comunicacoes S.A. -sapo - -// sarl : 2014-07-03 Delta Orchard, LLC -sarl - -// sas : 2015-04-02 Research IP LLC -sas - -// save : 2015-06-25 Amazon EU S.à r.l. -save - -// saxo : 2014-10-31 Saxo Bank A/S -saxo - -// sbi : 2015-03-12 STATE BANK OF INDIA -sbi - -// sbs : 2014-11-07 SPECIAL BROADCASTING SERVICE CORPORATION -sbs - -// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ) -sca - -// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited ("SCB") -scb - -// schaeffler : 2015-08-06 Schaeffler Technologies AG & Co. KG -schaeffler - -// schmidt : 2014-04-03 SALM S.A.S. -schmidt - -// scholarships : 2014-04-24 Scholarships.com, LLC -scholarships - -// school : 2014-12-18 Little Galley, LLC -school - -// schule : 2014-03-06 Outer Moon, LLC -schule - -// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG -schwarz - -// science : 2014-09-11 dot Science Limited -science - -// scjohnson : 2015-07-23 Johnson Shareholdings, Inc. -scjohnson - -// scor : 2014-10-31 SCOR SE -scor - -// scot : 2014-01-23 Dot Scot Registry Limited -scot - -// search : 2016-06-09 Charleston Road Registry Inc. -search - -// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) -seat - -// secure : 2015-08-27 Amazon EU S.à r.l. -secure - -// security : 2015-05-14 -security - -// seek : 2014-12-04 Seek Limited -seek - -// select : 2015-10-08 iSelect Ltd -select - -// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A. -sener - -// services : 2014-02-27 Fox Castle, LLC -services - -// ses : 2015-07-23 SES -ses - -// seven : 2015-08-06 Seven West Media Ltd -seven - -// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG -sew - -// sex : 2014-11-13 ICM Registry SX LLC -sex - -// sexy : 2013-09-11 Uniregistry, Corp. -sexy - -// sfr : 2015-08-13 Societe Francaise du Radiotelephone - SFR -sfr - -// shangrila : 2015-09-03 Shangri‐La International Hotel Management Limited -shangrila - -// sharp : 2014-05-01 Sharp Corporation -sharp - -// shaw : 2015-04-23 Shaw Cablesystems G.P. -shaw - -// shell : 2015-07-30 Shell Information Technology International Inc -shell - -// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. -shia - -// shiksha : 2013-11-14 Afilias Limited -shiksha - -// shoes : 2013-10-02 Binky Galley, LLC -shoes - -// shop : 2016-04-08 GMO Registry, Inc. -shop - -// shopping : 2016-03-31 -shopping - -// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. -shouji - -// show : 2015-03-05 Snow Beach, LLC -show - -// showtime : 2015-08-06 CBS Domains Inc. -showtime - -// shriram : 2014-01-23 Shriram Capital Ltd. -shriram - -// silk : 2015-06-25 Amazon EU S.à r.l. -silk - -// sina : 2015-03-12 Sina Corporation -sina - -// singles : 2013-08-27 Fern Madison, LLC -singles - -// site : 2015-01-15 DotSite Inc. -site - -// ski : 2015-04-09 STARTING DOT LIMITED -ski - -// skin : 2015-01-15 L'Oréal -skin - -// sky : 2014-06-19 Sky IP International Ltd, a company incorporated in England and Wales, operating via its registered Swiss branch -sky - -// skype : 2014-12-18 Microsoft Corporation -skype - -// sling : 2015-07-30 Hughes Satellite Systems Corporation -sling - -// smart : 2015-07-09 Smart Communications, Inc. (SMART) -smart - -// smile : 2014-12-18 Amazon EU S.à r.l. -smile - -// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F -sncf - -// soccer : 2015-03-26 Foggy Shadow, LLC -soccer - -// social : 2013-11-07 United TLD Holdco Ltd. -social - -// softbank : 2015-07-02 SoftBank Corp. -softbank - -// software : 2014-03-20 -software - -// sohu : 2013-12-19 Sohu.com Limited -sohu - -// solar : 2013-11-07 Ruby Town, LLC -solar - -// solutions : 2013-11-07 Silver Cover, LLC -solutions - -// song : 2015-02-26 Amazon EU S.à r.l. -song - -// sony : 2015-01-08 Sony Corporation -sony - -// soy : 2014-01-23 Charleston Road Registry Inc. -soy - -// space : 2014-04-03 DotSpace Inc. -space - -// spiegel : 2014-02-05 SPIEGEL-Verlag Rudolf Augstein GmbH & Co. KG -spiegel - -// spot : 2015-02-26 Amazon EU S.à r.l. -spot - -// spreadbetting : 2014-12-11 IG Group Holdings PLC -spreadbetting - -// srl : 2015-05-07 mySRL GmbH -srl - -// srt : 2015-07-30 FCA US LLC. -srt - -// stada : 2014-11-13 STADA Arzneimittel AG -stada - -// staples : 2015-07-30 Staples, Inc. -staples - -// star : 2015-01-08 Star India Private Limited -star - -// starhub : 2015-02-05 StarHub Ltd -starhub - -// statebank : 2015-03-12 STATE BANK OF INDIA -statebank - -// statefarm : 2015-07-30 State Farm Mutual Automobile Insurance Company -statefarm - -// statoil : 2014-12-04 Statoil ASA -statoil - -// stc : 2014-10-09 Saudi Telecom Company -stc - -// stcgroup : 2014-10-09 Saudi Telecom Company -stcgroup - -// stockholm : 2014-12-18 Stockholms kommun -stockholm - -// storage : 2014-12-22 Self Storage Company LLC -storage - -// store : 2015-04-09 DotStore Inc. -store - -// stream : 2016-01-08 dot Stream Limited -stream - -// studio : 2015-02-11 -studio - -// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD -study - -// style : 2014-12-04 Binky Moon, LLC -style - -// sucks : 2014-12-22 Vox Populi Registry Inc. -sucks - -// supplies : 2013-12-19 Atomic Fields, LLC -supplies - -// supply : 2013-12-19 Half Falls, LLC -supply - -// support : 2013-10-24 Grand Orchard, LLC -support - -// surf : 2014-01-09 Top Level Domain Holdings Limited -surf - -// surgery : 2014-03-20 Tin Avenue, LLC -surgery - -// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION -suzuki - -// swatch : 2015-01-08 The Swatch Group Ltd -swatch - -// swiftcover : 2015-07-23 Swiftcover Insurance Services Limited -swiftcover - -// swiss : 2014-10-16 Swiss Confederation -swiss - -// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet -sydney - -// symantec : 2014-12-04 Symantec Corporation -symantec - -// systems : 2013-11-07 Dash Cypress, LLC -systems - -// tab : 2014-12-04 Tabcorp Holdings Limited -tab - -// taipei : 2014-07-10 Taipei City Government -taipei - -// talk : 2015-04-09 Amazon EU S.à r.l. -talk - -// taobao : 2015-01-15 Alibaba Group Holding Limited -taobao - -// target : 2015-07-31 Target Domain Holdings, LLC -target - -// tatamotors : 2015-03-12 Tata Motors Ltd -tatamotors - -// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" -tatar - -// tattoo : 2013-08-30 Uniregistry, Corp. -tattoo - -// tax : 2014-03-20 Storm Orchard, LLC -tax - -// taxi : 2015-03-19 Pine Falls, LLC -taxi - -// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. -tci - -// tdk : 2015-06-11 TDK Corporation -tdk - -// team : 2015-03-05 Atomic Lake, LLC -team - -// tech : 2015-01-30 Dot Tech LLC -tech - -// technology : 2013-09-13 Auburn Falls -technology - -// telecity : 2015-02-19 TelecityGroup International Limited -telecity - -// telefonica : 2014-10-16 Telefónica S.A. -telefonica - -// temasek : 2014-08-07 Temasek Holdings (Private) Limited -temasek - -// tennis : 2014-12-04 Cotton Bloom, LLC -tennis - -// teva : 2015-07-02 Teva Pharmaceutical Industries Limited -teva - -// thd : 2015-04-02 Homer TLC, Inc. -thd - -// theater : 2015-03-19 Blue Tigers, LLC -theater - -// theatre : 2015-05-07 -theatre - -// tiaa : 2015-07-23 Teachers Insurance and Annuity Association of America -tiaa - -// tickets : 2015-02-05 Accent Media Limited -tickets - -// tienda : 2013-11-14 Victor Manor, LLC -tienda - -// tiffany : 2015-01-30 Tiffany and Company -tiffany - -// tips : 2013-09-20 Corn Willow, LLC -tips - -// tires : 2014-11-07 Dog Edge, LLC -tires - -// tirol : 2014-04-24 punkt Tirol GmbH -tirol - -// tjmaxx : 2015-07-16 The TJX Companies, Inc. -tjmaxx - -// tjx : 2015-07-16 The TJX Companies, Inc. -tjx - -// tkmaxx : 2015-07-16 The TJX Companies, Inc. -tkmaxx - -// tmall : 2015-01-15 Alibaba Group Holding Limited -tmall - -// today : 2013-09-20 Pearl Woods, LLC -today - -// tokyo : 2013-11-13 GMO Registry, Inc. -tokyo - -// tools : 2013-11-21 Pioneer North, LLC -tools - -// top : 2014-03-20 Jiangsu Bangning Science & Technology Co.,Ltd. -top - -// toray : 2014-12-18 Toray Industries, Inc. -toray - -// toshiba : 2014-04-10 TOSHIBA Corporation -toshiba - -// total : 2015-08-06 Total SA -total - -// tours : 2015-01-22 Sugar Station, LLC -tours - -// town : 2014-03-06 Koko Moon, LLC -town - -// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION -toyota - -// toys : 2014-03-06 Pioneer Orchard, LLC -toys - -// trade : 2014-01-23 Elite Registry Limited -trade - -// trading : 2014-12-11 IG Group Holdings PLC -trading - -// training : 2013-11-07 Wild Willow, LLC -training - -// travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. -travelchannel - -// travelers : 2015-03-26 Travelers TLD, LLC -travelers - -// travelersinsurance : 2015-03-26 Travelers TLD, LLC -travelersinsurance - -// trust : 2014-10-16 -trust - -// trv : 2015-03-26 Travelers TLD, LLC -trv - -// tube : 2015-06-11 Latin American Telecom LLC -tube - -// tui : 2014-07-03 TUI AG -tui - -// tunes : 2015-02-26 Amazon EU S.à r.l. -tunes - -// tushu : 2014-12-18 Amazon EU S.à r.l. -tushu - -// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED -tvs - -// ubank : 2015-08-20 National Australia Bank Limited -ubank - -// ubs : 2014-12-11 UBS AG -ubs - -// uconnect : 2015-07-30 FCA US LLC. -uconnect - -// unicom : 2015-10-15 China United Network Communications Corporation Limited -unicom - -// university : 2014-03-06 Little Station, LLC -university - -// uno : 2013-09-11 Dot Latin LLC -uno - -// uol : 2014-05-01 UBN INTERNET LTDA. -uol - -// ups : 2015-06-25 UPS Market Driver, Inc. -ups - -// vacations : 2013-12-05 Atomic Tigers, LLC -vacations - -// vana : 2014-12-11 Lifestyle Domain Holdings, Inc. -vana - -// vanguard : 2015-09-03 The Vanguard Group, Inc. -vanguard - -// vegas : 2014-01-16 Dot Vegas, Inc. -vegas - -// ventures : 2013-08-27 Binky Lake, LLC -ventures - -// verisign : 2015-08-13 VeriSign, Inc. -verisign - -// versicherung : 2014-03-20 -versicherung - -// vet : 2014-03-06 -vet - -// viajes : 2013-10-17 Black Madison, LLC -viajes - -// video : 2014-10-16 -video - -// vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe -vig - -// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd. -viking - -// villas : 2013-12-05 New Sky, LLC -villas - -// vin : 2015-06-18 Holly Shadow, LLC -vin - -// vip : 2015-01-22 Minds + Machines Group Limited -vip - -// virgin : 2014-09-25 Virgin Enterprises Limited -virgin - -// visa : 2015-07-30 Visa Worldwide Pte. Limited -visa - -// vision : 2013-12-05 Koko Station, LLC -vision - -// vista : 2014-09-18 Vistaprint Limited -vista - -// vistaprint : 2014-09-18 Vistaprint Limited -vistaprint - -// viva : 2014-11-07 Saudi Telecom Company -viva - -// vivo : 2015-07-31 Telefonica Brasil S.A. -vivo - -// vlaanderen : 2014-02-06 DNS.be vzw -vlaanderen - -// vodka : 2013-12-19 Top Level Domain Holdings Limited -vodka - -// volkswagen : 2015-05-14 Volkswagen Group of America Inc. -volkswagen - -// volvo : 2015-11-12 Volvo Holding Sverige Aktiebolag -volvo - -// vote : 2013-11-21 Monolith Registry LLC -vote - -// voting : 2013-11-13 Valuetainment Corp. -voting - -// voto : 2013-11-21 Monolith Registry LLC -voto - -// voyage : 2013-08-27 Ruby House, LLC -voyage - -// vuelos : 2015-03-05 Travel Reservations SRL -vuelos - -// wales : 2014-05-08 Nominet UK -wales - -// walmart : 2015-07-31 Wal-Mart Stores, Inc. -walmart - -// walter : 2014-11-13 Sandvik AB -walter - -// wang : 2013-10-24 Zodiac Leo Limited -wang - -// wanggou : 2014-12-18 Amazon EU S.à r.l. -wanggou - -// warman : 2015-06-18 Weir Group IP Limited -warman - -// watch : 2013-11-14 Sand Shadow, LLC -watch - -// watches : 2014-12-22 Richemont DNS Inc. -watches - -// weather : 2015-01-08 The Weather Channel, LLC -weather - -// weatherchannel : 2015-03-12 The Weather Channel, LLC -weatherchannel - -// webcam : 2014-01-23 dot Webcam Limited -webcam - -// weber : 2015-06-04 Saint-Gobain Weber SA -weber - -// website : 2014-04-03 DotWebsite Inc. -website - -// wed : 2013-10-01 Atgron, Inc. -wed - -// wedding : 2014-04-24 Top Level Domain Holdings Limited -wedding - -// weibo : 2015-03-05 Sina Corporation -weibo - -// weir : 2015-01-29 Weir Group IP Limited -weir - -// whoswho : 2014-02-20 Who's Who Registry -whoswho - -// wien : 2013-10-28 punkt.wien GmbH -wien - -// wiki : 2013-11-07 Top Level Design, LLC -wiki - -// williamhill : 2014-03-13 William Hill Organization Limited -williamhill - -// win : 2014-11-20 First Registry Limited -win - -// windows : 2014-12-18 Microsoft Corporation -windows - -// wine : 2015-06-18 June Station, LLC -wine - -// winners : 2015-07-16 The TJX Companies, Inc. -winners - -// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC -wme - -// wolterskluwer : 2015-08-06 Wolters Kluwer N.V. -wolterskluwer - -// woodside : 2015-07-09 Woodside Petroleum Limited -woodside - -// work : 2013-12-19 Top Level Domain Holdings Limited -work - -// works : 2013-11-14 Little Dynamite, LLC -works - -// world : 2014-06-12 Bitter Fields, LLC -world - -// wow : 2015-10-08 Amazon EU S.à r.l. -wow - -// wtc : 2013-12-19 World Trade Centers Association, Inc. -wtc - -// wtf : 2014-03-06 Hidden Way, LLC -wtf - -// xbox : 2014-12-18 Microsoft Corporation -xbox - -// xerox : 2014-10-24 Xerox DNHC LLC -xerox - -// xfinity : 2015-07-09 Comcast IP Holdings I, LLC -xfinity - -// xihuan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. -xihuan - -// xin : 2014-12-11 Elegant Leader Limited -xin - -// xn--11b4c3d : 2015-01-15 VeriSign Sarl -कॉम - -// xn--1ck2e1b : 2015-02-26 Amazon EU S.à r.l. -セール - -// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd. -佛山 - -// xn--30rr7y : 2014-06-12 Excellent First Limited -慈善 - -// xn--3bst00m : 2013-09-13 Eagle Horizon Limited -集团 - -// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED -在线 - -// xn--3oq18vl8pn36a : 2015-07-02 Volkswagen (China) Investment Co., Ltd. -大众汽车 - -// xn--3pxu8k : 2015-01-15 VeriSign Sarl -点看 - -// xn--42c2d9a : 2015-01-15 VeriSign Sarl -คอม - -// xn--45q11c : 2013-11-21 Zodiac Scorpio Limited -八卦 - -// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment -موقع - -// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center -公益 - -// xn--55qx5d : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) -公司 - -// xn--5su34j936bgsg : 2015-09-03 Shangri‐La International Hotel Management Limited -香格里拉 - -// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited -网站 - -// xn--6frz82g : 2013-09-23 Afilias Limited -移动 - -// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited -我爱你 - -// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) -москва - -// xn--80aqecdr1a : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) -католик - -// xn--80asehdb : 2013-07-14 CORE Association -онлайн - -// xn--80aswg : 2013-07-14 CORE Association -сайт - -// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited -联通 - -// xn--9dbq2a : 2015-01-15 VeriSign Sarl -קום - -// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED -时尚 - -// xn--9krt00a : 2015-03-12 Sina Corporation -微博 - -// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited -淡马锡 - -// xn--bck1b9a5dre4c : 2015-02-26 Amazon EU S.à r.l. -ファッション - -// xn--c1avg : 2013-11-14 Public Interest Registry -орг - -// xn--c2br7g : 2015-01-15 VeriSign Sarl -नेट - -// xn--cck2b3b : 2015-02-26 Amazon EU S.à r.l. -ストア - -// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD -삼성 - -// xn--czr694b : 2014-01-16 Dot Trademark TLD Holding Company Limited -商标 - -// xn--czrs0t : 2013-12-19 Wild Island, LLC -商店 - -// xn--czru2d : 2013-11-21 Zodiac Capricorn Limited -商城 - -// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet” -дети - -// xn--eckvdtc9d : 2014-12-18 Amazon EU S.à r.l. -ポイント - -// xn--efvy88h : 2014-08-22 Xinhua News Agency Guangdong Branch 新华通讯社广东分社 -新闻 - -// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited -工行 - -// xn--fct429k : 2015-04-09 Amazon EU S.à r.l. -家電 - -// xn--fhbei : 2015-01-15 VeriSign Sarl -كوم - -// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED -中文网 - -// xn--fiq64b : 2013-10-14 CITIC Group Corporation -中信 - -// xn--fjq720a : 2014-05-22 Will Bloom, LLC -娱乐 - -// xn--flw351e : 2014-07-31 Charleston Road Registry Inc. -谷歌 - -// xn--fzys8d69uvgm : 2015-05-14 PCCW Enterprises Limited -電訊盈科 - -// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited -购物 - -// xn--gckr3f0f : 2015-02-26 Amazon EU S.à r.l. -クラウド - -// xn--gk3at1e : 2015-10-08 Amazon EU S.à r.l. -通販 - -// xn--hxt814e : 2014-05-15 Zodiac Libra Limited -网店 - -// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry -संगठन - -// xn--imr513n : 2014-12-11 Dot Trademark TLD Holding Company Limited -餐厅 - -// xn--io0a7i : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) -网络 - -// xn--j1aef : 2015-01-15 VeriSign Sarl -ком - -// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation -诺基亚 - -// xn--jvr189m : 2015-02-26 Amazon EU S.à r.l. -食品 - -// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V. -飞利浦 - -// xn--kpu716f : 2014-12-22 Richemont DNS Inc. -手表 - -// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd -手机 - -// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company -ارامكو - -// xn--mgba7c0bbn0a : 2015-05-14 Crescent Holding GmbH -العليان - -// xn--mgbaakc7dvf : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) -اتصالات - -// xn--mgbab2bd : 2013-10-31 CORE Association -بازار - -// xn--mgbb9fbpob : 2014-12-18 GreenTech Consultancy Company W.L.L. -موبايلي - -// xn--mgbca7dzdo : 2015-07-30 Abu Dhabi Systems and Information Centre -ابوظبي - -// xn--mgbi4ecexp : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) -كاثوليك - -// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. -همراه - -// xn--mk1bu44c : 2015-01-15 VeriSign Sarl -닷컴 - -// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd. -政府 - -// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd. -شبكة - -// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House -بيتك - -// xn--ngbrx : 2015-11-12 League of Arab States -عرب - -// xn--nqv7f : 2013-11-14 Public Interest Registry -机构 - -// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry -组织机构 - -// xn--nyqy26a : 2014-11-07 Stable Tone Limited -健康 - -// xn--p1acf : 2013-12-12 Rusnames Limited -рус - -// xn--pbt977c : 2014-12-22 Richemont DNS Inc. -珠宝 - -// xn--pssy2u : 2015-01-15 VeriSign Sarl -大拿 - -// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc. -みんな - -// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc. -グーグル - -// xn--rhqv96g : 2013-09-11 Stable Tone Limited -世界 - -// xn--rovu88b : 2015-02-26 Amazon EU S.à r.l. -書籍 - -// xn--ses554g : 2014-01-16 -网址 - -// xn--t60b56a : 2015-01-15 VeriSign Sarl -닷넷 - -// xn--tckwe : 2015-01-15 VeriSign Sarl -コム - -// xn--tiq49xqyj : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) -天主教 - -// xn--unup4y : 2013-07-14 Spring Fields, LLC -游戏 - -// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG -vermögensberater - -// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG -vermögensberatung - -// xn--vhquv : 2013-08-27 Dash McCook, LLC -企业 - -// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd. -信息 - -// xn--w4r85el8fhu5dnra : 2015-04-30 Kerry Trading Co. Limited -嘉里大酒店 - -// xn--w4rs40l : 2015-07-30 Kerry Trading Co. Limited -嘉里 - -// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd. -广东 - -// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center -政务 - -// xperia : 2015-05-14 Sony Mobile Communications AB -xperia - -// xyz : 2013-12-05 XYZ.COM LLC -xyz - -// yachts : 2014-01-09 DERYachts, LLC -yachts - -// yahoo : 2015-04-02 Yahoo! Domain Services Inc. -yahoo - -// yamaxun : 2014-12-18 Amazon EU S.à r.l. -yamaxun - -// yandex : 2014-04-10 YANDEX, LLC -yandex - -// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. -yodobashi - -// yoga : 2014-05-29 Top Level Domain Holdings Limited -yoga - -// yokohama : 2013-12-12 GMO Registry, Inc. -yokohama - -// you : 2015-04-09 Amazon EU S.à r.l. -you - -// youtube : 2014-05-01 Charleston Road Registry Inc. -youtube - -// yun : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. -yun - -// zappos : 2015-06-25 Amazon EU S.à r.l. -zappos - -// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) -zara - -// zero : 2014-12-18 Amazon EU S.à r.l. -zero - -// zip : 2014-05-08 Charleston Road Registry Inc. -zip - -// zippo : 2015-07-02 Zadco Company -zippo - -// zone : 2013-11-14 Outer Falls, LLC -zone - -// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich) -zuerich - - -// ===END ICANN DOMAINS=== -// ===BEGIN PRIVATE DOMAINS=== -// (Note: these are in alphabetical order by company name) - -// 1GB LLC : https://www.1gb.ua/ -// Submitted by 1GB LLC -cc.ua -inf.ua -ltd.ua - -// Agnat sp. z o.o. : https://domena.pl -// Submitted by Przemyslaw Plewa -beep.pl - -// Alces Software Ltd : http://alces-software.com -// Submitted by Mark J. Titorenko -*.compute.estate -*.alces.network - -// alwaysdata : https://www.alwaysdata.com -// Submitted by Cyril -*.alwaysdata.net - -// Amazon CloudFront : https://aws.amazon.com/cloudfront/ -// Submitted by Donavan Miller -cloudfront.net - -// Amazon Elastic Compute Cloud : https://aws.amazon.com/ec2/ -// Submitted by Luke Wells -*.compute.amazonaws.com -*.compute-1.amazonaws.com -*.compute.amazonaws.com.cn -us-east-1.amazonaws.com - -// Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ -// Submitted by Luke Wells -cn-north-1.eb.amazonaws.com.cn -elasticbeanstalk.com -ap-northeast-1.elasticbeanstalk.com -ap-northeast-2.elasticbeanstalk.com -ap-south-1.elasticbeanstalk.com -ap-southeast-1.elasticbeanstalk.com -ap-southeast-2.elasticbeanstalk.com -ca-central-1.elasticbeanstalk.com -eu-central-1.elasticbeanstalk.com -eu-west-1.elasticbeanstalk.com -eu-west-2.elasticbeanstalk.com -sa-east-1.elasticbeanstalk.com -us-east-1.elasticbeanstalk.com -us-east-2.elasticbeanstalk.com -us-gov-west-1.elasticbeanstalk.com -us-west-1.elasticbeanstalk.com -us-west-2.elasticbeanstalk.com - -// Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/ -// Submitted by Luke Wells -*.elb.amazonaws.com -*.elb.amazonaws.com.cn - -// Amazon S3 : https://aws.amazon.com/s3/ -// Submitted by Luke Wells -s3.amazonaws.com -s3-ap-northeast-1.amazonaws.com -s3-ap-northeast-2.amazonaws.com -s3-ap-south-1.amazonaws.com -s3-ap-southeast-1.amazonaws.com -s3-ap-southeast-2.amazonaws.com -s3-ca-central-1.amazonaws.com -s3-eu-central-1.amazonaws.com -s3-eu-west-1.amazonaws.com -s3-eu-west-2.amazonaws.com -s3-external-1.amazonaws.com -s3-fips-us-gov-west-1.amazonaws.com -s3-sa-east-1.amazonaws.com -s3-us-gov-west-1.amazonaws.com -s3-us-east-2.amazonaws.com -s3-us-west-1.amazonaws.com -s3-us-west-2.amazonaws.com -s3.ap-northeast-2.amazonaws.com -s3.ap-south-1.amazonaws.com -s3.cn-north-1.amazonaws.com.cn -s3.ca-central-1.amazonaws.com -s3.eu-central-1.amazonaws.com -s3.eu-west-2.amazonaws.com -s3.us-east-2.amazonaws.com -s3.dualstack.ap-northeast-1.amazonaws.com -s3.dualstack.ap-northeast-2.amazonaws.com -s3.dualstack.ap-south-1.amazonaws.com -s3.dualstack.ap-southeast-1.amazonaws.com -s3.dualstack.ap-southeast-2.amazonaws.com -s3.dualstack.ca-central-1.amazonaws.com -s3.dualstack.eu-central-1.amazonaws.com -s3.dualstack.eu-west-1.amazonaws.com -s3.dualstack.eu-west-2.amazonaws.com -s3.dualstack.sa-east-1.amazonaws.com -s3.dualstack.us-east-1.amazonaws.com -s3.dualstack.us-east-2.amazonaws.com -s3-website-us-east-1.amazonaws.com -s3-website-us-west-1.amazonaws.com -s3-website-us-west-2.amazonaws.com -s3-website-ap-northeast-1.amazonaws.com -s3-website-ap-southeast-1.amazonaws.com -s3-website-ap-southeast-2.amazonaws.com -s3-website-eu-west-1.amazonaws.com -s3-website-sa-east-1.amazonaws.com -s3-website.ap-northeast-2.amazonaws.com -s3-website.ap-south-1.amazonaws.com -s3-website.ca-central-1.amazonaws.com -s3-website.eu-central-1.amazonaws.com -s3-website.eu-west-2.amazonaws.com -s3-website.us-east-2.amazonaws.com - -// Amune : https://amune.org/ -// Submitted by Team Amune -t3l3p0rt.net -tele.amune.org - -// Aptible : https://www.aptible.com/ -// Submitted by Thomas Orozco -on-aptible.com - -// Asociación Amigos de la Informática "Euskalamiga" : http://encounter.eus/ -// Submitted by Hector Martin -user.party.eus - -// Association potager.org : https://potager.org/ -// Submitted by Lunar -pimienta.org -poivron.org -potager.org -sweetpepper.org - -// ASUSTOR Inc. : http://www.asustor.com -// Submitted by Vincent Tseng -myasustor.com - -// AVM : https://avm.de -// Submitted by Andreas Weise -myfritz.net - -// AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com -// Submitted by James Kennedy -*.awdev.ca -*.advisor.ws - -// backplane : https://www.backplane.io -// Submitted by Anthony Voutas -backplaneapp.io - -// BetaInABox -// Submitted by Adrian -betainabox.com - -// BinaryLane : http://www.binarylane.com -// Submitted by Nathan O'Sullivan -bnr.la - -// Boomla : https://boomla.com -// Submitted by Tibor Halter -boomla.net - -// Boxfuse : https://boxfuse.com -// Submitted by Axel Fontaine -boxfuse.io - -// bplaced : https://www.bplaced.net/ -// Submitted by Miroslav Bozic -square7.ch -bplaced.com -bplaced.de -square7.de -bplaced.net -square7.net - -// BrowserSafetyMark -// Submitted by Dave Tharp -browsersafetymark.io - -// callidomus : https://www.callidomus.com/ -// Submitted by Marcus Popp -mycd.eu - -// CentralNic : http://www.centralnic.com/names/domains -// Submitted by registry -ae.org -ar.com -br.com -cn.com -com.de -com.se -de.com -eu.com -gb.com -gb.net -hu.com -hu.net -jp.net -jpn.com -kr.com -mex.com -no.com -qc.com -ru.com -sa.com -se.com -se.net -uk.com -uk.net -us.com -uy.com -za.bz -za.com - -// Africa.com Web Solutions Ltd : https://registry.africa.com -// Submitted by Gavin Brown -africa.com - -// iDOT Services Limited : http://www.domain.gr.com -// Submitted by Gavin Brown -gr.com - -// Radix FZC : http://domains.in.net -// Submitted by Gavin Brown -in.net - -// US REGISTRY LLC : http://us.org -// Submitted by Gavin Brown -us.org - -// co.com Registry, LLC : https://registry.co.com -// Submitted by Gavin Brown -co.com - -// c.la : http://www.c.la/ -c.la - -// certmgr.org : https://certmgr.org -// Submitted by B. Blechschmidt -certmgr.org - -// Citrix : https://citrix.com -// Submitted by Alex Stoddard -xenapponazure.com - -// ClearVox : http://www.clearvox.nl/ -// Submitted by Leon Rowland -virtueeldomein.nl - -// Cloud66 : https://www.cloud66.com/ -// Submitted by Khash Sajadi -c66.me - -// CloudAccess.net : https://www.cloudaccess.net/ -// Submitted by Pawel Panek -jdevcloud.com -wpdevcloud.com -cloudaccess.host -freesite.host -cloudaccess.net - -// cloudControl : https://www.cloudcontrol.com/ -// Submitted by Tobias Wilken -cloudcontrolled.com -cloudcontrolapp.com - -// co.ca : http://registry.co.ca/ -co.ca - -// i-registry s.r.o. : http://www.i-registry.cz/ -// Submitted by Martin Semrad -co.cz - -// CDN77.com : http://www.cdn77.com -// Submitted by Jan Krpes -c.cdn77.org -cdn77-ssl.net -r.cdn77.net -rsc.cdn77.org -ssl.origin.cdn77-secure.org - -// Cloud DNS Ltd : http://www.cloudns.net -// Submitted by Aleksander Hristov -cloudns.asia -cloudns.biz -cloudns.club -cloudns.cc -cloudns.eu -cloudns.in -cloudns.info -cloudns.org -cloudns.pro -cloudns.pw -cloudns.us - -// CoDNS B.V. -co.nl -co.no - -// COSIMO GmbH : http://www.cosimo.de -// Submitted by Rene Marticke -dyn.cosidns.de -dynamisches-dns.de -dnsupdater.de -internet-dns.de -l-o-g-i-n.de -dynamic-dns.info -feste-ip.net -knx-server.net -static-access.net - -// Craynic, s.r.o. : http://www.craynic.com/ -// Submitted by Ales Krajnik -realm.cz - -// Cryptonomic : https://cryptonomic.net/ -// Submitted by Andrew Cady -*.cryptonomic.net - -// Cupcake : https://cupcake.io/ -// Submitted by Jonathan Rudenberg -cupcake.is - -// cyon GmbH : https://www.cyon.ch/ -// Submitted by Dominic Luechinger -cyon.link -cyon.site - -// Daplie, Inc : https://daplie.com -// Submitted by AJ ONeal -daplie.me -localhost.daplie.me - -// Dansk.net : http://www.dansk.net/ -// Submitted by Anani Voule -biz.dk -co.dk -firm.dk -reg.dk -store.dk - -// Debian : https://www.debian.org/ -// Submitted by Peter Palfrader / Debian Sysadmin Team -debian.net - -// deSEC : https://desec.io/ -// Submitted by Peter Thomassen -dedyn.io - -// DNShome : https://www.dnshome.de/ -// Submitted by Norbert Auler -dnshome.de - -// DrayTek Corp. : https://www.draytek.com/ -// Submitted by Paul Fang -drayddns.com - -// DreamHost : http://www.dreamhost.com/ -// Submitted by Andrew Farmer -dreamhosters.com - -// Drobo : http://www.drobo.com/ -// Submitted by Ricardo Padilha -mydrobo.com - -// Drud Holdings, LLC. : https://www.drud.com/ -// Submitted by Kevin Bridges -drud.io -drud.us - -// DuckDNS : http://www.duckdns.org/ -// Submitted by Richard Harper -duckdns.org - -// dy.fi : http://dy.fi/ -// Submitted by Heikki Hannikainen -dy.fi -tunk.org - -// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/ -dyndns-at-home.com -dyndns-at-work.com -dyndns-blog.com -dyndns-free.com -dyndns-home.com -dyndns-ip.com -dyndns-mail.com -dyndns-office.com -dyndns-pics.com -dyndns-remote.com -dyndns-server.com -dyndns-web.com -dyndns-wiki.com -dyndns-work.com -dyndns.biz -dyndns.info -dyndns.org -dyndns.tv -at-band-camp.net -ath.cx -barrel-of-knowledge.info -barrell-of-knowledge.info -better-than.tv -blogdns.com -blogdns.net -blogdns.org -blogsite.org -boldlygoingnowhere.org -broke-it.net -buyshouses.net -cechire.com -dnsalias.com -dnsalias.net -dnsalias.org -dnsdojo.com -dnsdojo.net -dnsdojo.org -does-it.net -doesntexist.com -doesntexist.org -dontexist.com -dontexist.net -dontexist.org -doomdns.com -doomdns.org -dvrdns.org -dyn-o-saur.com -dynalias.com -dynalias.net -dynalias.org -dynathome.net -dyndns.ws -endofinternet.net -endofinternet.org -endoftheinternet.org -est-a-la-maison.com -est-a-la-masion.com -est-le-patron.com -est-mon-blogueur.com -for-better.biz -for-more.biz -for-our.info -for-some.biz -for-the.biz -forgot.her.name -forgot.his.name -from-ak.com -from-al.com -from-ar.com -from-az.net -from-ca.com -from-co.net -from-ct.com -from-dc.com -from-de.com -from-fl.com -from-ga.com -from-hi.com -from-ia.com -from-id.com -from-il.com -from-in.com -from-ks.com -from-ky.com -from-la.net -from-ma.com -from-md.com -from-me.org -from-mi.com -from-mn.com -from-mo.com -from-ms.com -from-mt.com -from-nc.com -from-nd.com -from-ne.com -from-nh.com -from-nj.com -from-nm.com -from-nv.com -from-ny.net -from-oh.com -from-ok.com -from-or.com -from-pa.com -from-pr.com -from-ri.com -from-sc.com -from-sd.com -from-tn.com -from-tx.com -from-ut.com -from-va.com -from-vt.com -from-wa.com -from-wi.com -from-wv.com -from-wy.com -ftpaccess.cc -fuettertdasnetz.de -game-host.org -game-server.cc -getmyip.com -gets-it.net -go.dyndns.org -gotdns.com -gotdns.org -groks-the.info -groks-this.info -ham-radio-op.net -here-for-more.info -hobby-site.com -hobby-site.org -home.dyndns.org -homedns.org -homeftp.net -homeftp.org -homeip.net -homelinux.com -homelinux.net -homelinux.org -homeunix.com -homeunix.net -homeunix.org -iamallama.com -in-the-band.net -is-a-anarchist.com -is-a-blogger.com -is-a-bookkeeper.com -is-a-bruinsfan.org -is-a-bulls-fan.com -is-a-candidate.org -is-a-caterer.com -is-a-celticsfan.org -is-a-chef.com -is-a-chef.net -is-a-chef.org -is-a-conservative.com -is-a-cpa.com -is-a-cubicle-slave.com -is-a-democrat.com -is-a-designer.com -is-a-doctor.com -is-a-financialadvisor.com -is-a-geek.com -is-a-geek.net -is-a-geek.org -is-a-green.com -is-a-guru.com -is-a-hard-worker.com -is-a-hunter.com -is-a-knight.org -is-a-landscaper.com -is-a-lawyer.com -is-a-liberal.com -is-a-libertarian.com -is-a-linux-user.org -is-a-llama.com -is-a-musician.com -is-a-nascarfan.com -is-a-nurse.com -is-a-painter.com -is-a-patsfan.org -is-a-personaltrainer.com -is-a-photographer.com -is-a-player.com -is-a-republican.com -is-a-rockstar.com -is-a-socialist.com -is-a-soxfan.org -is-a-student.com -is-a-teacher.com -is-a-techie.com -is-a-therapist.com -is-an-accountant.com -is-an-actor.com -is-an-actress.com -is-an-anarchist.com -is-an-artist.com -is-an-engineer.com -is-an-entertainer.com -is-by.us -is-certified.com -is-found.org -is-gone.com -is-into-anime.com -is-into-cars.com -is-into-cartoons.com -is-into-games.com -is-leet.com -is-lost.org -is-not-certified.com -is-saved.org -is-slick.com -is-uberleet.com -is-very-bad.org -is-very-evil.org -is-very-good.org -is-very-nice.org -is-very-sweet.org -is-with-theband.com -isa-geek.com -isa-geek.net -isa-geek.org -isa-hockeynut.com -issmarterthanyou.com -isteingeek.de -istmein.de -kicks-ass.net -kicks-ass.org -knowsitall.info -land-4-sale.us -lebtimnetz.de -leitungsen.de -likes-pie.com -likescandy.com -merseine.nu -mine.nu -misconfused.org -mypets.ws -myphotos.cc -neat-url.com -office-on-the.net -on-the-web.tv -podzone.net -podzone.org -readmyblog.org -saves-the-whales.com -scrapper-site.net -scrapping.cc -selfip.biz -selfip.com -selfip.info -selfip.net -selfip.org -sells-for-less.com -sells-for-u.com -sells-it.net -sellsyourhome.org -servebbs.com -servebbs.net -servebbs.org -serveftp.net -serveftp.org -servegame.org -shacknet.nu -simple-url.com -space-to-rent.com -stuff-4-sale.org -stuff-4-sale.us -teaches-yoga.com -thruhere.net -traeumtgerade.de -webhop.biz -webhop.info -webhop.net -webhop.org -worse-than.tv -writesthisblog.com - -// ddnss.de : https://www.ddnss.de/ -// Submitted by Robert Niedziela -ddnss.de -dyn.ddnss.de -dyndns.ddnss.de -dyndns1.de -dyn-ip24.de -home-webserver.de -dyn.home-webserver.de -myhome-server.de -ddnss.org - -// Definima : http://www.definima.com/ -// Submitted by Maxence Bitterli -definima.net -definima.io - -// Dynu.com : https://www.dynu.com/ -// Submitted by Sue Ye -ddnsfree.com -ddnsgeek.com -giize.com -gleeze.com -kozow.com -loseyourip.com -ooguy.com -theworkpc.com -casacam.net -dynu.net -accesscam.org -camdvr.org -freeddns.org -mywire.org -webredirect.org -myddns.rocks -blogsite.xyz - -// dynv6 : https://dynv6.com -// Submitted by Dominik Menke -dynv6.net - -// E4YOU spol. s.r.o. : https://e4you.cz/ -// Submitted by Vladimir Dudr -e4.cz - -// Enalean SAS: https://www.enalean.com -// Submitted by Thomas Cottier -mytuleap.com - -// Enonic : http://enonic.com/ -// Submitted by Erik Kaareng-Sunde -enonic.io -customer.enonic.io - -// EU.org https://eu.org/ -// Submitted by Pierre Beyssac -eu.org -al.eu.org -asso.eu.org -at.eu.org -au.eu.org -be.eu.org -bg.eu.org -ca.eu.org -cd.eu.org -ch.eu.org -cn.eu.org -cy.eu.org -cz.eu.org -de.eu.org -dk.eu.org -edu.eu.org -ee.eu.org -es.eu.org -fi.eu.org -fr.eu.org -gr.eu.org -hr.eu.org -hu.eu.org -ie.eu.org -il.eu.org -in.eu.org -int.eu.org -is.eu.org -it.eu.org -jp.eu.org -kr.eu.org -lt.eu.org -lu.eu.org -lv.eu.org -mc.eu.org -me.eu.org -mk.eu.org -mt.eu.org -my.eu.org -net.eu.org -ng.eu.org -nl.eu.org -no.eu.org -nz.eu.org -paris.eu.org -pl.eu.org -pt.eu.org -q-a.eu.org -ro.eu.org -ru.eu.org -se.eu.org -si.eu.org -sk.eu.org -tr.eu.org -uk.eu.org -us.eu.org - -// Evennode : http://www.evennode.com/ -// Submitted by Michal Kralik -eu-1.evennode.com -eu-2.evennode.com -eu-3.evennode.com -eu-4.evennode.com -us-1.evennode.com -us-2.evennode.com -us-3.evennode.com -us-4.evennode.com - -// eDirect Corp. : https://hosting.url.com.tw/ -// Submitted by C.S. chang -twmail.cc -twmail.net -twmail.org -mymailer.com.tw -url.tw - -// Facebook, Inc. -// Submitted by Peter Ruibal -apps.fbsbx.com - -// FAITID : https://faitid.org/ -// Submitted by Maxim Alzoba -// https://www.flexireg.net/stat_info -ru.net -adygeya.ru -bashkiria.ru -bir.ru -cbg.ru -com.ru -dagestan.ru -grozny.ru -kalmykia.ru -kustanai.ru -marine.ru -mordovia.ru -msk.ru -mytis.ru -nalchik.ru -nov.ru -pyatigorsk.ru -spb.ru -vladikavkaz.ru -vladimir.ru -abkhazia.su -adygeya.su -aktyubinsk.su -arkhangelsk.su -armenia.su -ashgabad.su -azerbaijan.su -balashov.su -bashkiria.su -bryansk.su -bukhara.su -chimkent.su -dagestan.su -east-kazakhstan.su -exnet.su -georgia.su -grozny.su -ivanovo.su -jambyl.su -kalmykia.su -kaluga.su -karacol.su -karaganda.su -karelia.su -khakassia.su -krasnodar.su -kurgan.su -kustanai.su -lenug.su -mangyshlak.su -mordovia.su -msk.su -murmansk.su -nalchik.su -navoi.su -north-kazakhstan.su -nov.su -obninsk.su -penza.su -pokrovsk.su -sochi.su -spb.su -tashkent.su -termez.su -togliatti.su -troitsk.su -tselinograd.su -tula.su -tuva.su -vladikavkaz.su -vladimir.su -vologda.su - -// Fancy Bits, LLC : http://getchannels.com -// Submitted by Aman Gupta -channelsdvr.net - -// Fastly Inc. : http://www.fastly.com/ -// Submitted by Fastly Security -fastlylb.net -map.fastlylb.net -freetls.fastly.net -map.fastly.net -a.prod.fastly.net -global.prod.fastly.net -a.ssl.fastly.net -b.ssl.fastly.net -global.ssl.fastly.net - -// Featherhead : https://featherhead.xyz/ -// Submitted by Simon Menke -fhapp.xyz - -// Fedora : https://fedoraproject.org/ -// submitted by Patrick Uiterwijk -fedorainfracloud.org -fedorapeople.org -cloud.fedoraproject.org - -// Filegear Inc. : https://www.filegear.com -// Submitted by Jason Zhu -filegear.me - -// Firebase, Inc. -// Submitted by Chris Raynor -firebaseapp.com - -// Flynn : https://flynn.io -// Submitted by Jonathan Rudenberg -flynnhub.com -flynnhosting.net - -// Freebox : http://www.freebox.fr -// Submitted by Romain Fliedel -freebox-os.com -freeboxos.com -fbx-os.fr -fbxos.fr -freebox-os.fr -freeboxos.fr - -// Fusion Intranet : https://www.fusion-intranet.com -// Submitted by Matthias Burtscher -myfusion.cloud - -// Futureweb OG : http://www.futureweb.at -// Submitted by Andreas Schnederle-Wagner -*.futurecms.at -futurehosting.at -futuremailing.at -*.ex.ortsinfo.at -*.kunden.ortsinfo.at -*.statics.cloud - -// GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains -// Submitted by David Illsley -service.gov.uk - -// GitHub, Inc. -// Submitted by Patrick Toomey -github.io -githubusercontent.com - -// GitLab, Inc. -// Submitted by Alex Hanselka -gitlab.io - -// UKHomeOffice : https://www.gov.uk/government/organisations/home-office -// Submitted by Jon Shanks -homeoffice.gov.uk - -// GlobeHosting, Inc. -// Submitted by Zoltan Egresi -ro.im -shop.ro - -// GoIP DNS Services : http://www.goip.de -// Submitted by Christian Poulter -goip.de - -// Google, Inc. -// Submitted by Eduardo Vela -*.0emm.com -appspot.com -blogspot.ae -blogspot.al -blogspot.am -blogspot.ba -blogspot.be -blogspot.bg -blogspot.bj -blogspot.ca -blogspot.cf -blogspot.ch -blogspot.cl -blogspot.co.at -blogspot.co.id -blogspot.co.il -blogspot.co.ke -blogspot.co.nz -blogspot.co.uk -blogspot.co.za -blogspot.com -blogspot.com.ar -blogspot.com.au -blogspot.com.br -blogspot.com.by -blogspot.com.co -blogspot.com.cy -blogspot.com.ee -blogspot.com.eg -blogspot.com.es -blogspot.com.mt -blogspot.com.ng -blogspot.com.tr -blogspot.com.uy -blogspot.cv -blogspot.cz -blogspot.de -blogspot.dk -blogspot.fi -blogspot.fr -blogspot.gr -blogspot.hk -blogspot.hr -blogspot.hu -blogspot.ie -blogspot.in -blogspot.is -blogspot.it -blogspot.jp -blogspot.kr -blogspot.li -blogspot.lt -blogspot.lu -blogspot.md -blogspot.mk -blogspot.mr -blogspot.mx -blogspot.my -blogspot.nl -blogspot.no -blogspot.pe -blogspot.pt -blogspot.qa -blogspot.re -blogspot.ro -blogspot.rs -blogspot.ru -blogspot.se -blogspot.sg -blogspot.si -blogspot.sk -blogspot.sn -blogspot.td -blogspot.tw -blogspot.ug -blogspot.vn -cloudfunctions.net -cloud.goog -codespot.com -googleapis.com -googlecode.com -pagespeedmobilizer.com -publishproxy.com -withgoogle.com -withyoutube.com - -// Hashbang : https://hashbang.sh -hashbang.sh - -// Hasura : https://hasura.io -// Submitted by Shahidh K Muhammed -hasura-app.io - -// Hepforge : https://www.hepforge.org -// Submitted by David Grellscheid -hepforge.org - -// Heroku : https://www.heroku.com/ -// Submitted by Tom Maher -herokuapp.com -herokussl.com - -// Ici la Lune : http://www.icilalune.com/ -// Submitted by Simon Morvan -moonscale.net - -// iki.fi -// Submitted by Hannu Aronsson -iki.fi - -// info.at : http://www.info.at/ -biz.at -info.at - -// info.cx : http://info.cx -// Submitted by Jacob Slater -info.cx - -// Interlegis : http://www.interlegis.leg.br -// Submitted by Gabriel Ferreira -ac.leg.br -al.leg.br -am.leg.br -ap.leg.br -ba.leg.br -ce.leg.br -df.leg.br -es.leg.br -go.leg.br -ma.leg.br -mg.leg.br -ms.leg.br -mt.leg.br -pa.leg.br -pb.leg.br -pe.leg.br -pi.leg.br -pr.leg.br -rj.leg.br -rn.leg.br -ro.leg.br -rr.leg.br -rs.leg.br -sc.leg.br -se.leg.br -sp.leg.br -to.leg.br - -// intermetrics GmbH : https://pixolino.com/ -// Submitted by Wolfgang Schwarz -pixolino.com - -// IPiFony Systems, Inc. : https://www.ipifony.com/ -// Submitted by Matthew Hardeman -ipifony.net - -// Joyent : https://www.joyent.com/ -// Submitted by Brian Bennett -*.triton.zone -*.cns.joyent.com - -// JS.ORG : http://dns.js.org -// Submitted by Stefan Keim -js.org - -// Keyweb AG : https://www.keyweb.de -// Submitted by Martin Dannehl -keymachine.de - -// KnightPoint Systems, LLC : http://www.knightpoint.com/ -// Submitted by Roy Keene -knightpoint.systems - -// .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf -co.krd -edu.krd - -// LCube - Professional hosting e.K. : https://www.lcube-webhosting.de -// Submitted by Lars Laehn -git-repos.de -lcube-server.de -svn-repos.de - -// LiquidNet Ltd : http://www.liquidnetlimited.com/ -// Submitted by Victor Velchev -we.bs - -// Lukanet Ltd : https://lukanet.com -// Submitted by Anton Avramov -barsy.bg -barsyonline.com -barsy.de -barsy.eu -barsy.in -barsy.net -barsy.online -barsy.support - -// Magento Commerce -// Submitted by Damien Tournoud -*.magentosite.cloud - -// Mail.Ru Group : https://hb.cldmail.ru -// Submitted by Ilya Zaretskiy -hb.cldmail.ru - -// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ -// Submitted by Zdeněk Šustr -cloud.metacentrum.cz -custom.metacentrum.cz - -// Meteor Development Group : https://www.meteor.com/hosting -// Submitted by Pierre Carrier -meteorapp.com -eu.meteorapp.com - -// Michau Enterprises Limited : http://www.co.pl/ -co.pl - -// Microsoft : http://microsoft.com -// Submitted by Barry Dorrans -azurewebsites.net -azure-mobile.net -cloudapp.net - -// Mozilla Foundation : https://mozilla.org/ -// Submitted by glob -bmoattachments.org - -// MSK-IX : https://www.msk-ix.ru/ -// Submitted by Khannanov Roman -net.ru -org.ru -pp.ru - -// Netlify : https://www.netlify.com -// Submitted by Jessica Parsons -bitballoon.com -netlify.com - -// Neustar Inc. -// Submitted by Trung Tran -4u.com - -// ngrok : https://ngrok.com/ -// Submitted by Alan Shreve -ngrok.io - -// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/ -// Submitted by Jeff Wheelhouse -nfshost.com - -// nsupdate.info : https://www.nsupdate.info/ -// Submitted by Thomas Waldmann -nsupdate.info -nerdpol.ovh - -// No-IP.com : https://noip.com/ -// Submitted by Deven Reza -blogsyte.com -brasilia.me -cable-modem.org -ciscofreak.com -collegefan.org -couchpotatofries.org -damnserver.com -ddns.me -ditchyourip.com -dnsfor.me -dnsiskinky.com -dvrcam.info -dynns.com -eating-organic.net -fantasyleague.cc -geekgalaxy.com -golffan.us -health-carereform.com -homesecuritymac.com -homesecuritypc.com -hopto.me -ilovecollege.info -loginto.me -mlbfan.org -mmafan.biz -myactivedirectory.com -mydissent.net -myeffect.net -mymediapc.net -mypsx.net -mysecuritycamera.com -mysecuritycamera.net -mysecuritycamera.org -net-freaks.com -nflfan.org -nhlfan.net -no-ip.ca -no-ip.co.uk -no-ip.net -noip.us -onthewifi.com -pgafan.net -point2this.com -pointto.us -privatizehealthinsurance.net -quicksytes.com -read-books.org -securitytactics.com -serveexchange.com -servehumour.com -servep2p.com -servesarcasm.com -stufftoread.com -ufcfan.org -unusualperson.com -workisboring.com -3utilities.com -bounceme.net -ddns.net -ddnsking.com -gotdns.ch -hopto.org -myftp.biz -myftp.org -myvnc.com -no-ip.biz -no-ip.info -no-ip.org -noip.me -redirectme.net -servebeer.com -serveblog.net -servecounterstrike.com -serveftp.com -servegame.com -servehalflife.com -servehttp.com -serveirc.com -serveminecraft.net -servemp3.com -servepics.com -servequake.com -sytes.net -webhop.me -zapto.org - -// NodeArt : https://nodeart.io -// Submitted by Konstantin Nosov -stage.nodeart.io - -// Nodum B.V. : https://nodum.io/ -// Submitted by Wietse Wind -nodum.co -nodum.io - -// NYC.mn : http://www.information.nyc.mn -// Submitted by Matthew Brown -nyc.mn - -// NymNom : https://nymnom.com/ -// Submitted by Dave McCormack -nom.ae -nom.ai -nom.al -nym.by -nym.bz -nom.cl -nom.gd -nom.gl -nym.gr -nom.gt -nom.hn -nom.im -nym.kz -nym.la -nom.li -nym.li -nym.lt -nym.lu -nym.me -nom.mk -nym.mx -nom.nu -nym.nz -nym.pe -nym.pt -nom.pw -nom.qa -nom.rs -nom.si -nym.sk -nym.su -nym.sx -nym.tw -nom.ug -nom.uy -nom.vc -nom.vg - -// Octopodal Solutions, LLC. : https://ulterius.io/ -// Submitted by Andrew Sampson -cya.gg - -// One Fold Media : http://www.onefoldmedia.com/ -// Submitted by Eddie Jones -nid.io - -// OpenCraft GmbH : http://opencraft.com/ -// Submitted by Sven Marnach -opencraft.hosting - -// Opera Software, A.S.A. -// Submitted by Yngve Pettersen -operaunite.com - -// OutSystems -// Submitted by Duarte Santos -outsystemscloud.com - -// OwnProvider : http://www.ownprovider.com -// Submitted by Jan Moennich -ownprovider.com - -// oy.lc -// Submitted by Charly Coste -oy.lc - -// Pagefog : https://pagefog.com/ -// Submitted by Derek Myers -pgfog.com - -// Pagefront : https://www.pagefronthq.com/ -// Submitted by Jason Kriss -pagefrontapp.com - -// .pl domains (grandfathered) -art.pl -gliwice.pl -krakow.pl -poznan.pl -wroc.pl -zakopane.pl - -// Pantheon Systems, Inc. : https://pantheon.io/ -// Submitted by Gary Dylina -pantheonsite.io -gotpantheon.com - -// Peplink | Pepwave : http://peplink.com/ -// Submitted by Steve Leung -mypep.link - -// Planet-Work : https://www.planet-work.com/ -// Submitted by Frédéric VANNIÈRE -on-web.fr - -// Platform.sh : https://platform.sh -// Submitted by Nikola Kotur -*.platform.sh -*.platformsh.site - -// prgmr.com : https://prgmr.com/ -// Submitted by Sarah Newman -xen.prgmr.com - -// priv.at : http://www.nic.priv.at/ -// Submitted by registry -priv.at - -// Protonet GmbH : http://protonet.io -// Submitted by Martin Meier -protonet.io - -// Publication Presse Communication SARL : https://ppcom.fr -// Submitted by Yaacov Akiba Slama -chirurgiens-dentistes-en-france.fr -byen.site - -// QA2 -// Submitted by Daniel Dent (https://www.danieldent.com/) -qa2.com - -// QNAP System Inc : https://www.qnap.com -// Submitted by Nick Chang -dev-myqnapcloud.com -alpha-myqnapcloud.com -myqnapcloud.com - -// Quip : https://quip.com -// Submitted by Patrick Linehan -*.quipelements.com - -// Qutheory LLC : http://qutheory.io -// Submitted by Jonas Schwartz -vapor.cloud -vaporcloud.io - -// Rackmaze LLC : https://www.rackmaze.com -// Submitted by Kirill Pertsev -rackmaze.com -rackmaze.net - -// Red Hat, Inc. OpenShift : https://openshift.redhat.com/ -// Submitted by Tim Kramer -rhcloud.com - -// RethinkDB : https://www.rethinkdb.com/ -// Submitted by Chris Kastorff -hzc.io - -// Revitalised Limited : http://www.revitalised.co.uk -// Submitted by Jack Price -wellbeingzone.eu -ptplus.fit -wellbeingzone.co.uk - -// Sandstorm Development Group, Inc. : https://sandcats.io/ -// Submitted by Asheesh Laroia -sandcats.io - -// SBE network solutions GmbH : https://www.sbe.de/ -// Submitted by Norman Meilick -logoip.de -logoip.com - -// Securepoint GmbH : https://www.securepoint.de -// Submitted by Erik Anders -firewall-gateway.com -firewall-gateway.de -my-gateway.de -my-router.de -spdns.de -spdns.eu -firewall-gateway.net -my-firewall.org -myfirewall.org -spdns.org - -// SensioLabs, SAS : https://sensiolabs.com/ -// Submitted by Fabien Potencier -*.sensiosite.cloud - -// Service Online LLC : http://drs.ua/ -// Submitted by Serhii Bulakh -biz.ua -co.ua -pp.ua - -// ShiftEdit : https://shiftedit.net/ -// Submitted by Adam Jimenez -shiftedit.io - -// Shopblocks : http://www.shopblocks.com/ -// Submitted by Alex Bowers -myshopblocks.com - -// SinaAppEngine : http://sae.sina.com.cn/ -// Submitted by SinaAppEngine -1kapp.com -appchizi.com -applinzi.com -sinaapp.com -vipsinaapp.com - -// Skyhat : http://www.skyhat.io -// Submitted by Shante Adam -bounty-full.com -alpha.bounty-full.com -beta.bounty-full.com - -// staticland : https://static.land -// Submitted by Seth Vincent -static.land -dev.static.land -sites.static.land - -// SourceLair PC : https://www.sourcelair.com -// Submitted by Antonis Kalipetis -apps.lair.io -*.stolos.io - -// SpaceKit : https://www.spacekit.io/ -// Submitted by Reza Akhavan -spacekit.io - -// Stackspace : https://www.stackspace.io/ -// Submitted by Lina He -stackspace.space - -// Storj Labs Inc. : https://storj.io/ -// Submitted by Philip Hutchins -storj.farm - -// Sub 6 Limited: http://www.sub6.com -// Submitted by Dan Miller -temp-dns.com - -// Synology, Inc. : https://www.synology.com/ -// Submitted by Rony Weng -diskstation.me -dscloud.biz -dscloud.me -dscloud.mobi -dsmynas.com -dsmynas.net -dsmynas.org -familyds.com -familyds.net -familyds.org -i234.me -myds.me -synology.me -vpnplus.to - -// TAIFUN Software AG : http://taifun-software.de -// Submitted by Bjoern Henke -taifun-dns.de - -// TASK geographical domains (www.task.gda.pl/uslugi/dns) -gda.pl -gdansk.pl -gdynia.pl -med.pl -sopot.pl - -// Thingdust AG : https://thingdust.com/ -// Submitted by Adrian Imboden -cust.dev.thingdust.io -cust.disrec.thingdust.io -cust.prod.thingdust.io -cust.testing.thingdust.io - -// TownNews.com : http://www.townnews.com -// Submitted by Dustin Ward -bloxcms.com -townnews-staging.com - -// TrafficPlex GmbH : https://www.trafficplex.de/ -// Submitted by Phillipp Röll -12hp.at -2ix.at -4lima.at -lima-city.at -12hp.ch -2ix.ch -4lima.ch -lima-city.ch -trafficplex.cloud -de.cool -12hp.de -2ix.de -4lima.de -lima-city.de -1337.pictures -clan.rip -lima-city.rocks -webspace.rocks -lima.zone - -// TransIP : htts://www.transip.nl -// Submitted by Rory Breuk -*.transurl.be -*.transurl.eu -*.transurl.nl - -// TuxFamily : http://tuxfamily.org -// Submitted by TuxFamily administrators -tuxfamily.org - -// TwoDNS : https://www.twodns.de/ -// Submitted by TwoDNS-Support -dd-dns.de -diskstation.eu -diskstation.org -dray-dns.de -draydns.de -dyn-vpn.de -dynvpn.de -mein-vigor.de -my-vigor.de -my-wan.de -syno-ds.de -synology-diskstation.de -synology-ds.de - -// Uberspace : https://uberspace.de -// Submitted by Moritz Werner -uber.space - -// UDR Limited : http://www.udr.hk.com -// Submitted by registry -hk.com -hk.org -ltd.hk -inc.hk - -// .US -// Submitted by Ed Moore -lib.de.us - -// Viprinet Europe GmbH : http://www.viprinet.com -// Submitted by Simon Kissel -router.management - -// Virtual-Info : https://www.virtual-info.info/ -// Submitted by Adnan RIHAN -v-info.info - -// WeDeploy by Liferay, Inc. : https://www.wedeploy.com -// Submitted by Henrique Vicente -wedeploy.io -wedeploy.me -wedeploy.sh - -// Western Digital Technologies, Inc : https://www.wdc.com -// Submitted by Jung Jin -remotewd.com - -// Wikimedia Labs : https://wikitech.wikimedia.org -// Submitted by Yuvi Panda -wmflabs.org - -// XS4ALL Internet bv : https://www.xs4all.nl/ -// Submitted by Daniel Mostertman -cistron.nl -demon.nl -xs4all.space - -// Yola : https://www.yola.com/ -// Submitted by Stefano Rivera -yolasite.com - -// Yombo : https://yombo.net -// Submitted by Mitch Schwenk -ybo.faith -yombo.me -homelink.one -ybo.party -ybo.review -ybo.science -ybo.trade - -// ZaNiC : http://www.za.net/ -// Submitted by registry -za.net -za.org - -// Zeit, Inc. : https://zeit.domains/ -// Submitted by Olli Vanhoja -now.sh - -// ===END PRIVATE DOMAINS=== -"; \ No newline at end of file diff --git a/data/B/5/c7aed7cd2a308523e7d2847b7815909e864b2fd9c4ea88b00d35adb2ecdfd7 b/data/pdp::ALL.cache similarity index 100% rename from data/B/5/c7aed7cd2a308523e7d2847b7815909e864b2fd9c4ea88b00d35adb2ecdfd7 rename to data/pdp::ALL.cache diff --git a/data/A/A/91f9d4d1ae7f5129b52177e1e93475af9f8761ed84ed960a467e7e01126243 b/data/pdp::ICANN.cache similarity index 100% rename from data/A/A/91f9d4d1ae7f5129b52177e1e93475af9f8761ed84ed960a467e7e01126243 rename to data/pdp::ICANN.cache diff --git a/data/7/1/09ec0807d8f2bd40aa93347ea112977e316242f2d457864041f59dfb684fc0 b/data/pdp::PRIVATE.cache similarity index 100% rename from data/7/1/09ec0807d8f2bd40aa93347ea112977e316242f2d457864041f59dfb684fc0 rename to data/pdp::PRIVATE.cache diff --git a/data/public-suffix-list.txt b/data/public-suffix-list.txt deleted file mode 100644 index 5797b164..00000000 --- a/data/public-suffix-list.txt +++ /dev/null @@ -1,12287 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at https://mozilla.org/MPL/2.0/. - -// Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat, -// rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported. - -// Instructions on pulling and using this list can be found at https://publicsuffix.org/list/. - -// ===BEGIN ICANN DOMAINS=== - -// ac : https://en.wikipedia.org/wiki/.ac -ac -com.ac -edu.ac -gov.ac -net.ac -mil.ac -org.ac - -// ad : https://en.wikipedia.org/wiki/.ad -ad -nom.ad - -// ae : https://en.wikipedia.org/wiki/.ae -// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php -ae -co.ae -net.ae -org.ae -sch.ae -ac.ae -gov.ae -mil.ae - -// aero : see https://www.information.aero/index.php?id=66 -aero -accident-investigation.aero -accident-prevention.aero -aerobatic.aero -aeroclub.aero -aerodrome.aero -agents.aero -aircraft.aero -airline.aero -airport.aero -air-surveillance.aero -airtraffic.aero -air-traffic-control.aero -ambulance.aero -amusement.aero -association.aero -author.aero -ballooning.aero -broker.aero -caa.aero -cargo.aero -catering.aero -certification.aero -championship.aero -charter.aero -civilaviation.aero -club.aero -conference.aero -consultant.aero -consulting.aero -control.aero -council.aero -crew.aero -design.aero -dgca.aero -educator.aero -emergency.aero -engine.aero -engineer.aero -entertainment.aero -equipment.aero -exchange.aero -express.aero -federation.aero -flight.aero -freight.aero -fuel.aero -gliding.aero -government.aero -groundhandling.aero -group.aero -hanggliding.aero -homebuilt.aero -insurance.aero -journal.aero -journalist.aero -leasing.aero -logistics.aero -magazine.aero -maintenance.aero -media.aero -microlight.aero -modelling.aero -navigation.aero -parachuting.aero -paragliding.aero -passenger-association.aero -pilot.aero -press.aero -production.aero -recreation.aero -repbody.aero -res.aero -research.aero -rotorcraft.aero -safety.aero -scientist.aero -services.aero -show.aero -skydiving.aero -software.aero -student.aero -trader.aero -trading.aero -trainer.aero -union.aero -workinggroup.aero -works.aero - -// af : http://www.nic.af/help.jsp -af -gov.af -com.af -org.af -net.af -edu.af - -// ag : http://www.nic.ag/prices.htm -ag -com.ag -org.ag -net.ag -co.ag -nom.ag - -// ai : http://nic.com.ai/ -ai -off.ai -com.ai -net.ai -org.ai - -// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31 -al -com.al -edu.al -gov.al -mil.al -net.al -org.al - -// am : https://en.wikipedia.org/wiki/.am -am - -// ao : https://en.wikipedia.org/wiki/.ao -// http://www.dns.ao/REGISTR.DOC -ao -ed.ao -gv.ao -og.ao -co.ao -pb.ao -it.ao - -// aq : https://en.wikipedia.org/wiki/.aq -aq - -// ar : https://nic.ar/nic-argentina/normativa-vigente -ar -com.ar -edu.ar -gob.ar -gov.ar -int.ar -mil.ar -musica.ar -net.ar -org.ar -tur.ar - -// arpa : https://en.wikipedia.org/wiki/.arpa -// Confirmed by registry 2008-06-18 -arpa -e164.arpa -in-addr.arpa -ip6.arpa -iris.arpa -uri.arpa -urn.arpa - -// as : https://en.wikipedia.org/wiki/.as -as -gov.as - -// asia : https://en.wikipedia.org/wiki/.asia -asia - -// at : https://en.wikipedia.org/wiki/.at -// Confirmed by registry 2008-06-17 -at -ac.at -co.at -gv.at -or.at - -// au : https://en.wikipedia.org/wiki/.au -// http://www.auda.org.au/ -au -// 2LDs -com.au -net.au -org.au -edu.au -gov.au -asn.au -id.au -// Historic 2LDs (closed to new registration, but sites still exist) -info.au -conf.au -oz.au -// CGDNs - http://www.cgdn.org.au/ -act.au -nsw.au -nt.au -qld.au -sa.au -tas.au -vic.au -wa.au -// 3LDs -act.edu.au -nsw.edu.au -nt.edu.au -qld.edu.au -sa.edu.au -tas.edu.au -vic.edu.au -wa.edu.au -// act.gov.au Bug 984824 - Removed at request of Greg Tankard -// nsw.gov.au Bug 547985 - Removed at request of -// nt.gov.au Bug 940478 - Removed at request of Greg Connors -qld.gov.au -sa.gov.au -tas.gov.au -vic.gov.au -wa.gov.au - -// aw : https://en.wikipedia.org/wiki/.aw -aw -com.aw - -// ax : https://en.wikipedia.org/wiki/.ax -ax - -// az : https://en.wikipedia.org/wiki/.az -az -com.az -net.az -int.az -gov.az -org.az -edu.az -info.az -pp.az -mil.az -name.az -pro.az -biz.az - -// ba : http://nic.ba/users_data/files/pravilnik_o_registraciji.pdf -ba -com.ba -edu.ba -gov.ba -mil.ba -net.ba -org.ba - -// bb : https://en.wikipedia.org/wiki/.bb -bb -biz.bb -co.bb -com.bb -edu.bb -gov.bb -info.bb -net.bb -org.bb -store.bb -tv.bb - -// bd : https://en.wikipedia.org/wiki/.bd -*.bd - -// be : https://en.wikipedia.org/wiki/.be -// Confirmed by registry 2008-06-08 -be -ac.be - -// bf : https://en.wikipedia.org/wiki/.bf -bf -gov.bf - -// bg : https://en.wikipedia.org/wiki/.bg -// https://www.register.bg/user/static/rules/en/index.html -bg -a.bg -b.bg -c.bg -d.bg -e.bg -f.bg -g.bg -h.bg -i.bg -j.bg -k.bg -l.bg -m.bg -n.bg -o.bg -p.bg -q.bg -r.bg -s.bg -t.bg -u.bg -v.bg -w.bg -x.bg -y.bg -z.bg -0.bg -1.bg -2.bg -3.bg -4.bg -5.bg -6.bg -7.bg -8.bg -9.bg - -// bh : https://en.wikipedia.org/wiki/.bh -bh -com.bh -edu.bh -net.bh -org.bh -gov.bh - -// bi : https://en.wikipedia.org/wiki/.bi -// http://whois.nic.bi/ -bi -co.bi -com.bi -edu.bi -or.bi -org.bi - -// biz : https://en.wikipedia.org/wiki/.biz -biz - -// bj : https://en.wikipedia.org/wiki/.bj -bj -asso.bj -barreau.bj -gouv.bj - -// bm : http://www.bermudanic.bm/dnr-text.txt -bm -com.bm -edu.bm -gov.bm -net.bm -org.bm - -// bn : https://en.wikipedia.org/wiki/.bn -*.bn - -// bo : http://www.nic.bo/ -bo -com.bo -edu.bo -gov.bo -gob.bo -int.bo -org.bo -net.bo -mil.bo -tv.bo - -// br : http://registro.br/dominio/categoria.html -// Submitted by registry -br -abc.br -adm.br -adv.br -agr.br -aju.br -am.br -aparecida.br -arq.br -art.br -ato.br -b.br -belem.br -bio.br -blog.br -bmd.br -bsb.br -cim.br -cng.br -cnt.br -com.br -coop.br -cri.br -cuiaba.br -def.br -ecn.br -eco.br -edu.br -emp.br -eng.br -esp.br -etc.br -eti.br -far.br -flog.br -floripa.br -fortal.br -fm.br -fnd.br -fot.br -fst.br -g12.br -ggf.br -gov.br -// gov.br 26 states + df https://en.wikipedia.org/wiki/States_of_Brazil -ac.gov.br -al.gov.br -am.gov.br -ap.gov.br -ba.gov.br -ce.gov.br -df.gov.br -es.gov.br -go.gov.br -ma.gov.br -mg.gov.br -ms.gov.br -mt.gov.br -pa.gov.br -pb.gov.br -pe.gov.br -pi.gov.br -pr.gov.br -rj.gov.br -rn.gov.br -ro.gov.br -rr.gov.br -rs.gov.br -sc.gov.br -se.gov.br -sp.gov.br -to.gov.br -gru.br -imb.br -ind.br -inf.br -jampa.br -jor.br -jus.br -leg.br -lel.br -londrina.br -macapa.br -maceio.br -mat.br -med.br -mil.br -mp.br -mus.br -natal.br -net.br -niteroi.br -*.nom.br -not.br -ntr.br -odo.br -org.br -osasco.br -palmas.br -poa.br -ppg.br -pro.br -psc.br -psi.br -qsl.br -radio.br -rec.br -recife.br -riobranco.br -sjc.br -slg.br -srv.br -taxi.br -teo.br -tmp.br -trd.br -tur.br -tv.br -udi.br -vet.br -vix.br -vlog.br -wiki.br -zlg.br - -// bs : http://www.nic.bs/rules.html -bs -com.bs -net.bs -org.bs -edu.bs -gov.bs - -// bt : https://en.wikipedia.org/wiki/.bt -bt -com.bt -edu.bt -gov.bt -net.bt -org.bt - -// bv : No registrations at this time. -// Submitted by registry -bv - -// bw : https://en.wikipedia.org/wiki/.bw -// http://www.gobin.info/domainname/bw.doc -// list of other 2nd level tlds ? -bw -co.bw -org.bw - -// by : https://en.wikipedia.org/wiki/.by -// http://tld.by/rules_2006_en.html -// list of other 2nd level tlds ? -by -gov.by -mil.by -// Official information does not indicate that com.by is a reserved -// second-level domain, but it's being used as one (see www.google.com.by and -// www.yahoo.com.by, for example), so we list it here for safety's sake. -com.by - -// http://hoster.by/ -of.by - -// bz : https://en.wikipedia.org/wiki/.bz -// http://www.belizenic.bz/ -bz -com.bz -net.bz -org.bz -edu.bz -gov.bz - -// ca : https://en.wikipedia.org/wiki/.ca -ca -// ca geographical names -ab.ca -bc.ca -mb.ca -nb.ca -nf.ca -nl.ca -ns.ca -nt.ca -nu.ca -on.ca -pe.ca -qc.ca -sk.ca -yk.ca -// gc.ca: https://en.wikipedia.org/wiki/.gc.ca -// see also: http://registry.gc.ca/en/SubdomainFAQ -gc.ca - -// cat : https://en.wikipedia.org/wiki/.cat -cat - -// cc : https://en.wikipedia.org/wiki/.cc -cc - -// cd : https://en.wikipedia.org/wiki/.cd -// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 -cd -gov.cd - -// cf : https://en.wikipedia.org/wiki/.cf -cf - -// cg : https://en.wikipedia.org/wiki/.cg -cg - -// ch : https://en.wikipedia.org/wiki/.ch -ch - -// ci : https://en.wikipedia.org/wiki/.ci -// http://www.nic.ci/index.php?page=charte -ci -org.ci -or.ci -com.ci -co.ci -edu.ci -ed.ci -ac.ci -net.ci -go.ci -asso.ci -aéroport.ci -int.ci -presse.ci -md.ci -gouv.ci - -// ck : https://en.wikipedia.org/wiki/.ck -*.ck -!www.ck - -// cl : https://en.wikipedia.org/wiki/.cl -cl -gov.cl -gob.cl -co.cl -mil.cl - -// cm : https://en.wikipedia.org/wiki/.cm plus bug 981927 -cm -co.cm -com.cm -gov.cm -net.cm - -// cn : https://en.wikipedia.org/wiki/.cn -// Submitted by registry -cn -ac.cn -com.cn -edu.cn -gov.cn -net.cn -org.cn -mil.cn -公司.cn -网络.cn -網絡.cn -// cn geographic names -ah.cn -bj.cn -cq.cn -fj.cn -gd.cn -gs.cn -gz.cn -gx.cn -ha.cn -hb.cn -he.cn -hi.cn -hl.cn -hn.cn -jl.cn -js.cn -jx.cn -ln.cn -nm.cn -nx.cn -qh.cn -sc.cn -sd.cn -sh.cn -sn.cn -sx.cn -tj.cn -xj.cn -xz.cn -yn.cn -zj.cn -hk.cn -mo.cn -tw.cn - -// co : https://en.wikipedia.org/wiki/.co -// Submitted by registry -co -arts.co -com.co -edu.co -firm.co -gov.co -info.co -int.co -mil.co -net.co -nom.co -org.co -rec.co -web.co - -// com : https://en.wikipedia.org/wiki/.com -com - -// coop : https://en.wikipedia.org/wiki/.coop -coop - -// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do -cr -ac.cr -co.cr -ed.cr -fi.cr -go.cr -or.cr -sa.cr - -// cu : https://en.wikipedia.org/wiki/.cu -cu -com.cu -edu.cu -org.cu -net.cu -gov.cu -inf.cu - -// cv : https://en.wikipedia.org/wiki/.cv -cv - -// cw : http://www.una.cw/cw_registry/ -// Confirmed by registry 2013-03-26 -cw -com.cw -edu.cw -net.cw -org.cw - -// cx : https://en.wikipedia.org/wiki/.cx -// list of other 2nd level tlds ? -cx -gov.cx - -// cy : http://www.nic.cy/ -// Submitted by registry Panayiotou Fotia -cy -ac.cy -biz.cy -com.cy -ekloges.cy -gov.cy -ltd.cy -name.cy -net.cy -org.cy -parliament.cy -press.cy -pro.cy -tm.cy - -// cz : https://en.wikipedia.org/wiki/.cz -cz - -// de : https://en.wikipedia.org/wiki/.de -// Confirmed by registry (with technical -// reservations) 2008-07-01 -de - -// dj : https://en.wikipedia.org/wiki/.dj -dj - -// dk : https://en.wikipedia.org/wiki/.dk -// Confirmed by registry 2008-06-17 -dk - -// dm : https://en.wikipedia.org/wiki/.dm -dm -com.dm -net.dm -org.dm -edu.dm -gov.dm - -// do : https://en.wikipedia.org/wiki/.do -do -art.do -com.do -edu.do -gob.do -gov.do -mil.do -net.do -org.do -sld.do -web.do - -// dz : https://en.wikipedia.org/wiki/.dz -dz -com.dz -org.dz -net.dz -gov.dz -edu.dz -asso.dz -pol.dz -art.dz - -// ec : http://www.nic.ec/reg/paso1.asp -// Submitted by registry -ec -com.ec -info.ec -net.ec -fin.ec -k12.ec -med.ec -pro.ec -org.ec -edu.ec -gov.ec -gob.ec -mil.ec - -// edu : https://en.wikipedia.org/wiki/.edu -edu - -// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B -ee -edu.ee -gov.ee -riik.ee -lib.ee -med.ee -com.ee -pri.ee -aip.ee -org.ee -fie.ee - -// eg : https://en.wikipedia.org/wiki/.eg -eg -com.eg -edu.eg -eun.eg -gov.eg -mil.eg -name.eg -net.eg -org.eg -sci.eg - -// er : https://en.wikipedia.org/wiki/.er -*.er - -// es : https://www.nic.es/site_ingles/ingles/dominios/index.html -es -com.es -nom.es -org.es -gob.es -edu.es - -// et : https://en.wikipedia.org/wiki/.et -et -com.et -gov.et -org.et -edu.et -biz.et -name.et -info.et -net.et - -// eu : https://en.wikipedia.org/wiki/.eu -eu - -// fi : https://en.wikipedia.org/wiki/.fi -fi -// aland.fi : https://en.wikipedia.org/wiki/.ax -// This domain is being phased out in favor of .ax. As there are still many -// domains under aland.fi, we still keep it on the list until aland.fi is -// completely removed. -// TODO: Check for updates (expected to be phased out around Q1/2009) -aland.fi - -// fj : https://en.wikipedia.org/wiki/.fj -*.fj - -// fk : https://en.wikipedia.org/wiki/.fk -*.fk - -// fm : https://en.wikipedia.org/wiki/.fm -fm - -// fo : https://en.wikipedia.org/wiki/.fo -fo - -// fr : http://www.afnic.fr/ -// domaines descriptifs : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-descriptifs -fr -com.fr -asso.fr -nom.fr -prd.fr -presse.fr -tm.fr -// domaines sectoriels : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-sectoriels -aeroport.fr -assedic.fr -avocat.fr -avoues.fr -cci.fr -chambagri.fr -chirurgiens-dentistes.fr -experts-comptables.fr -geometre-expert.fr -gouv.fr -greta.fr -huissier-justice.fr -medecin.fr -notaires.fr -pharmacien.fr -port.fr -veterinaire.fr - -// ga : https://en.wikipedia.org/wiki/.ga -ga - -// gb : This registry is effectively dormant -// Submitted by registry -gb - -// gd : https://en.wikipedia.org/wiki/.gd -gd - -// ge : http://www.nic.net.ge/policy_en.pdf -ge -com.ge -edu.ge -gov.ge -org.ge -mil.ge -net.ge -pvt.ge - -// gf : https://en.wikipedia.org/wiki/.gf -gf - -// gg : http://www.channelisles.net/register-domains/ -// Confirmed by registry 2013-11-28 -gg -co.gg -net.gg -org.gg - -// gh : https://en.wikipedia.org/wiki/.gh -// see also: http://www.nic.gh/reg_now.php -// Although domains directly at second level are not possible at the moment, -// they have been possible for some time and may come back. -gh -com.gh -edu.gh -gov.gh -org.gh -mil.gh - -// gi : http://www.nic.gi/rules.html -gi -com.gi -ltd.gi -gov.gi -mod.gi -edu.gi -org.gi - -// gl : https://en.wikipedia.org/wiki/.gl -// http://nic.gl -gl -co.gl -com.gl -edu.gl -net.gl -org.gl - -// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm -gm - -// gn : http://psg.com/dns/gn/gn.txt -// Submitted by registry -gn -ac.gn -com.gn -edu.gn -gov.gn -org.gn -net.gn - -// gov : https://en.wikipedia.org/wiki/.gov -gov - -// gp : http://www.nic.gp/index.php?lang=en -gp -com.gp -net.gp -mobi.gp -edu.gp -org.gp -asso.gp - -// gq : https://en.wikipedia.org/wiki/.gq -gq - -// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html -// Submitted by registry -gr -com.gr -edu.gr -net.gr -org.gr -gov.gr - -// gs : https://en.wikipedia.org/wiki/.gs -gs - -// gt : http://www.gt/politicas_de_registro.html -gt -com.gt -edu.gt -gob.gt -ind.gt -mil.gt -net.gt -org.gt - -// gu : http://gadao.gov.gu/registration.txt -*.gu - -// gw : https://en.wikipedia.org/wiki/.gw -gw - -// gy : https://en.wikipedia.org/wiki/.gy -// http://registry.gy/ -gy -co.gy -com.gy -edu.gy -gov.gy -net.gy -org.gy - -// hk : https://www.hkdnr.hk -// Submitted by registry -hk -com.hk -edu.hk -gov.hk -idv.hk -net.hk -org.hk -公司.hk -教育.hk -敎育.hk -政府.hk -個人.hk -个人.hk -箇人.hk -網络.hk -网络.hk -组織.hk -網絡.hk -网絡.hk -组织.hk -組織.hk -組织.hk - -// hm : https://en.wikipedia.org/wiki/.hm -hm - -// hn : http://www.nic.hn/politicas/ps02,,05.html -hn -com.hn -edu.hn -org.hn -net.hn -mil.hn -gob.hn - -// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf -hr -iz.hr -from.hr -name.hr -com.hr - -// ht : http://www.nic.ht/info/charte.cfm -ht -com.ht -shop.ht -firm.ht -info.ht -adult.ht -net.ht -pro.ht -org.ht -med.ht -art.ht -coop.ht -pol.ht -asso.ht -edu.ht -rel.ht -gouv.ht -perso.ht - -// hu : http://www.domain.hu/domain/English/sld.html -// Confirmed by registry 2008-06-12 -hu -co.hu -info.hu -org.hu -priv.hu -sport.hu -tm.hu -2000.hu -agrar.hu -bolt.hu -casino.hu -city.hu -erotica.hu -erotika.hu -film.hu -forum.hu -games.hu -hotel.hu -ingatlan.hu -jogasz.hu -konyvelo.hu -lakas.hu -media.hu -news.hu -reklam.hu -sex.hu -shop.hu -suli.hu -szex.hu -tozsde.hu -utazas.hu -video.hu - -// id : https://register.pandi.or.id/ -id -ac.id -biz.id -co.id -desa.id -go.id -mil.id -my.id -net.id -or.id -sch.id -web.id - -// ie : https://en.wikipedia.org/wiki/.ie -ie -gov.ie - -// il : http://www.isoc.org.il/domains/ -il -ac.il -co.il -gov.il -idf.il -k12.il -muni.il -net.il -org.il - -// im : https://www.nic.im/ -// Submitted by registry -im -ac.im -co.im -com.im -ltd.co.im -net.im -org.im -plc.co.im -tt.im -tv.im - -// in : https://en.wikipedia.org/wiki/.in -// see also: https://registry.in/Policies -// Please note, that nic.in is not an official eTLD, but used by most -// government institutions. -in -co.in -firm.in -net.in -org.in -gen.in -ind.in -nic.in -ac.in -edu.in -res.in -gov.in -mil.in - -// info : https://en.wikipedia.org/wiki/.info -info - -// int : https://en.wikipedia.org/wiki/.int -// Confirmed by registry 2008-06-18 -int -eu.int - -// io : http://www.nic.io/rules.html -// list of other 2nd level tlds ? -io -com.io - -// iq : http://www.cmc.iq/english/iq/iqregister1.htm -iq -gov.iq -edu.iq -mil.iq -com.iq -org.iq -net.iq - -// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules -// Also see http://www.nic.ir/Internationalized_Domain_Names -// Two .ir entries added at request of , 2010-04-16 -ir -ac.ir -co.ir -gov.ir -id.ir -net.ir -org.ir -sch.ir -// xn--mgba3a4f16a.ir (.ir, Persian YEH) -ایران.ir -// xn--mgba3a4fra.ir (.ir, Arabic YEH) -ايران.ir - -// is : http://www.isnic.is/domain/rules.php -// Confirmed by registry 2008-12-06 -is -net.is -com.is -edu.is -gov.is -org.is -int.is - -// it : https://en.wikipedia.org/wiki/.it -it -gov.it -edu.it -// Reserved geo-names: -// http://www.nic.it/documenti/regolamenti-e-linee-guida/regolamento-assegnazione-versione-6.0.pdf -// There is also a list of reserved geo-names corresponding to Italian municipalities -// http://www.nic.it/documenti/appendice-c.pdf, but it is not included here. -// Regions -abr.it -abruzzo.it -aosta-valley.it -aostavalley.it -bas.it -basilicata.it -cal.it -calabria.it -cam.it -campania.it -emilia-romagna.it -emiliaromagna.it -emr.it -friuli-v-giulia.it -friuli-ve-giulia.it -friuli-vegiulia.it -friuli-venezia-giulia.it -friuli-veneziagiulia.it -friuli-vgiulia.it -friuliv-giulia.it -friulive-giulia.it -friulivegiulia.it -friulivenezia-giulia.it -friuliveneziagiulia.it -friulivgiulia.it -fvg.it -laz.it -lazio.it -lig.it -liguria.it -lom.it -lombardia.it -lombardy.it -lucania.it -mar.it -marche.it -mol.it -molise.it -piedmont.it -piemonte.it -pmn.it -pug.it -puglia.it -sar.it -sardegna.it -sardinia.it -sic.it -sicilia.it -sicily.it -taa.it -tos.it -toscana.it -trentino-a-adige.it -trentino-aadige.it -trentino-alto-adige.it -trentino-altoadige.it -trentino-s-tirol.it -trentino-stirol.it -trentino-sud-tirol.it -trentino-sudtirol.it -trentino-sued-tirol.it -trentino-suedtirol.it -trentinoa-adige.it -trentinoaadige.it -trentinoalto-adige.it -trentinoaltoadige.it -trentinos-tirol.it -trentinostirol.it -trentinosud-tirol.it -trentinosudtirol.it -trentinosued-tirol.it -trentinosuedtirol.it -tuscany.it -umb.it -umbria.it -val-d-aosta.it -val-daosta.it -vald-aosta.it -valdaosta.it -valle-aosta.it -valle-d-aosta.it -valle-daosta.it -valleaosta.it -valled-aosta.it -valledaosta.it -vallee-aoste.it -valleeaoste.it -vao.it -vda.it -ven.it -veneto.it -// Provinces -ag.it -agrigento.it -al.it -alessandria.it -alto-adige.it -altoadige.it -an.it -ancona.it -andria-barletta-trani.it -andria-trani-barletta.it -andriabarlettatrani.it -andriatranibarletta.it -ao.it -aosta.it -aoste.it -ap.it -aq.it -aquila.it -ar.it -arezzo.it -ascoli-piceno.it -ascolipiceno.it -asti.it -at.it -av.it -avellino.it -ba.it -balsan.it -bari.it -barletta-trani-andria.it -barlettatraniandria.it -belluno.it -benevento.it -bergamo.it -bg.it -bi.it -biella.it -bl.it -bn.it -bo.it -bologna.it -bolzano.it -bozen.it -br.it -brescia.it -brindisi.it -bs.it -bt.it -bz.it -ca.it -cagliari.it -caltanissetta.it -campidano-medio.it -campidanomedio.it -campobasso.it -carbonia-iglesias.it -carboniaiglesias.it -carrara-massa.it -carraramassa.it -caserta.it -catania.it -catanzaro.it -cb.it -ce.it -cesena-forli.it -cesenaforli.it -ch.it -chieti.it -ci.it -cl.it -cn.it -co.it -como.it -cosenza.it -cr.it -cremona.it -crotone.it -cs.it -ct.it -cuneo.it -cz.it -dell-ogliastra.it -dellogliastra.it -en.it -enna.it -fc.it -fe.it -fermo.it -ferrara.it -fg.it -fi.it -firenze.it -florence.it -fm.it -foggia.it -forli-cesena.it -forlicesena.it -fr.it -frosinone.it -ge.it -genoa.it -genova.it -go.it -gorizia.it -gr.it -grosseto.it -iglesias-carbonia.it -iglesiascarbonia.it -im.it -imperia.it -is.it -isernia.it -kr.it -la-spezia.it -laquila.it -laspezia.it -latina.it -lc.it -le.it -lecce.it -lecco.it -li.it -livorno.it -lo.it -lodi.it -lt.it -lu.it -lucca.it -macerata.it -mantova.it -massa-carrara.it -massacarrara.it -matera.it -mb.it -mc.it -me.it -medio-campidano.it -mediocampidano.it -messina.it -mi.it -milan.it -milano.it -mn.it -mo.it -modena.it -monza-brianza.it -monza-e-della-brianza.it -monza.it -monzabrianza.it -monzaebrianza.it -monzaedellabrianza.it -ms.it -mt.it -na.it -naples.it -napoli.it -no.it -novara.it -nu.it -nuoro.it -og.it -ogliastra.it -olbia-tempio.it -olbiatempio.it -or.it -oristano.it -ot.it -pa.it -padova.it -padua.it -palermo.it -parma.it -pavia.it -pc.it -pd.it -pe.it -perugia.it -pesaro-urbino.it -pesarourbino.it -pescara.it -pg.it -pi.it -piacenza.it -pisa.it -pistoia.it -pn.it -po.it -pordenone.it -potenza.it -pr.it -prato.it -pt.it -pu.it -pv.it -pz.it -ra.it -ragusa.it -ravenna.it -rc.it -re.it -reggio-calabria.it -reggio-emilia.it -reggiocalabria.it -reggioemilia.it -rg.it -ri.it -rieti.it -rimini.it -rm.it -rn.it -ro.it -roma.it -rome.it -rovigo.it -sa.it -salerno.it -sassari.it -savona.it -si.it -siena.it -siracusa.it -so.it -sondrio.it -sp.it -sr.it -ss.it -suedtirol.it -sv.it -ta.it -taranto.it -te.it -tempio-olbia.it -tempioolbia.it -teramo.it -terni.it -tn.it -to.it -torino.it -tp.it -tr.it -trani-andria-barletta.it -trani-barletta-andria.it -traniandriabarletta.it -tranibarlettaandria.it -trapani.it -trentino.it -trento.it -treviso.it -trieste.it -ts.it -turin.it -tv.it -ud.it -udine.it -urbino-pesaro.it -urbinopesaro.it -va.it -varese.it -vb.it -vc.it -ve.it -venezia.it -venice.it -verbania.it -vercelli.it -verona.it -vi.it -vibo-valentia.it -vibovalentia.it -vicenza.it -viterbo.it -vr.it -vs.it -vt.it -vv.it - -// je : http://www.channelisles.net/register-domains/ -// Confirmed by registry 2013-11-28 -je -co.je -net.je -org.je - -// jm : http://www.com.jm/register.html -*.jm - -// jo : http://www.dns.jo/Registration_policy.aspx -jo -com.jo -org.jo -net.jo -edu.jo -sch.jo -gov.jo -mil.jo -name.jo - -// jobs : https://en.wikipedia.org/wiki/.jobs -jobs - -// jp : https://en.wikipedia.org/wiki/.jp -// http://jprs.co.jp/en/jpdomain.html -// Submitted by registry -jp -// jp organizational type names -ac.jp -ad.jp -co.jp -ed.jp -go.jp -gr.jp -lg.jp -ne.jp -or.jp -// jp prefecture type names -aichi.jp -akita.jp -aomori.jp -chiba.jp -ehime.jp -fukui.jp -fukuoka.jp -fukushima.jp -gifu.jp -gunma.jp -hiroshima.jp -hokkaido.jp -hyogo.jp -ibaraki.jp -ishikawa.jp -iwate.jp -kagawa.jp -kagoshima.jp -kanagawa.jp -kochi.jp -kumamoto.jp -kyoto.jp -mie.jp -miyagi.jp -miyazaki.jp -nagano.jp -nagasaki.jp -nara.jp -niigata.jp -oita.jp -okayama.jp -okinawa.jp -osaka.jp -saga.jp -saitama.jp -shiga.jp -shimane.jp -shizuoka.jp -tochigi.jp -tokushima.jp -tokyo.jp -tottori.jp -toyama.jp -wakayama.jp -yamagata.jp -yamaguchi.jp -yamanashi.jp -栃木.jp -愛知.jp -愛媛.jp -兵庫.jp -熊本.jp -茨城.jp -北海道.jp -千葉.jp -和歌山.jp -長崎.jp -長野.jp -新潟.jp -青森.jp -静岡.jp -東京.jp -石川.jp -埼玉.jp -三重.jp -京都.jp -佐賀.jp -大分.jp -大阪.jp -奈良.jp -宮城.jp -宮崎.jp -富山.jp -山口.jp -山形.jp -山梨.jp -岩手.jp -岐阜.jp -岡山.jp -島根.jp -広島.jp -徳島.jp -沖縄.jp -滋賀.jp -神奈川.jp -福井.jp -福岡.jp -福島.jp -秋田.jp -群馬.jp -香川.jp -高知.jp -鳥取.jp -鹿児島.jp -// jp geographic type names -// http://jprs.jp/doc/rule/saisoku-1.html -*.kawasaki.jp -*.kitakyushu.jp -*.kobe.jp -*.nagoya.jp -*.sapporo.jp -*.sendai.jp -*.yokohama.jp -!city.kawasaki.jp -!city.kitakyushu.jp -!city.kobe.jp -!city.nagoya.jp -!city.sapporo.jp -!city.sendai.jp -!city.yokohama.jp -// 4th level registration -aisai.aichi.jp -ama.aichi.jp -anjo.aichi.jp -asuke.aichi.jp -chiryu.aichi.jp -chita.aichi.jp -fuso.aichi.jp -gamagori.aichi.jp -handa.aichi.jp -hazu.aichi.jp -hekinan.aichi.jp -higashiura.aichi.jp -ichinomiya.aichi.jp -inazawa.aichi.jp -inuyama.aichi.jp -isshiki.aichi.jp -iwakura.aichi.jp -kanie.aichi.jp -kariya.aichi.jp -kasugai.aichi.jp -kira.aichi.jp -kiyosu.aichi.jp -komaki.aichi.jp -konan.aichi.jp -kota.aichi.jp -mihama.aichi.jp -miyoshi.aichi.jp -nishio.aichi.jp -nisshin.aichi.jp -obu.aichi.jp -oguchi.aichi.jp -oharu.aichi.jp -okazaki.aichi.jp -owariasahi.aichi.jp -seto.aichi.jp -shikatsu.aichi.jp -shinshiro.aichi.jp -shitara.aichi.jp -tahara.aichi.jp -takahama.aichi.jp -tobishima.aichi.jp -toei.aichi.jp -togo.aichi.jp -tokai.aichi.jp -tokoname.aichi.jp -toyoake.aichi.jp -toyohashi.aichi.jp -toyokawa.aichi.jp -toyone.aichi.jp -toyota.aichi.jp -tsushima.aichi.jp -yatomi.aichi.jp -akita.akita.jp -daisen.akita.jp -fujisato.akita.jp -gojome.akita.jp -hachirogata.akita.jp -happou.akita.jp -higashinaruse.akita.jp -honjo.akita.jp -honjyo.akita.jp -ikawa.akita.jp -kamikoani.akita.jp -kamioka.akita.jp -katagami.akita.jp -kazuno.akita.jp -kitaakita.akita.jp -kosaka.akita.jp -kyowa.akita.jp -misato.akita.jp -mitane.akita.jp -moriyoshi.akita.jp -nikaho.akita.jp -noshiro.akita.jp -odate.akita.jp -oga.akita.jp -ogata.akita.jp -semboku.akita.jp -yokote.akita.jp -yurihonjo.akita.jp -aomori.aomori.jp -gonohe.aomori.jp -hachinohe.aomori.jp -hashikami.aomori.jp -hiranai.aomori.jp -hirosaki.aomori.jp -itayanagi.aomori.jp -kuroishi.aomori.jp -misawa.aomori.jp -mutsu.aomori.jp -nakadomari.aomori.jp -noheji.aomori.jp -oirase.aomori.jp -owani.aomori.jp -rokunohe.aomori.jp -sannohe.aomori.jp -shichinohe.aomori.jp -shingo.aomori.jp -takko.aomori.jp -towada.aomori.jp -tsugaru.aomori.jp -tsuruta.aomori.jp -abiko.chiba.jp -asahi.chiba.jp -chonan.chiba.jp -chosei.chiba.jp -choshi.chiba.jp -chuo.chiba.jp -funabashi.chiba.jp -futtsu.chiba.jp -hanamigawa.chiba.jp -ichihara.chiba.jp -ichikawa.chiba.jp -ichinomiya.chiba.jp -inzai.chiba.jp -isumi.chiba.jp -kamagaya.chiba.jp -kamogawa.chiba.jp -kashiwa.chiba.jp -katori.chiba.jp -katsuura.chiba.jp -kimitsu.chiba.jp -kisarazu.chiba.jp -kozaki.chiba.jp -kujukuri.chiba.jp -kyonan.chiba.jp -matsudo.chiba.jp -midori.chiba.jp -mihama.chiba.jp -minamiboso.chiba.jp -mobara.chiba.jp -mutsuzawa.chiba.jp -nagara.chiba.jp -nagareyama.chiba.jp -narashino.chiba.jp -narita.chiba.jp -noda.chiba.jp -oamishirasato.chiba.jp -omigawa.chiba.jp -onjuku.chiba.jp -otaki.chiba.jp -sakae.chiba.jp -sakura.chiba.jp -shimofusa.chiba.jp -shirako.chiba.jp -shiroi.chiba.jp -shisui.chiba.jp -sodegaura.chiba.jp -sosa.chiba.jp -tako.chiba.jp -tateyama.chiba.jp -togane.chiba.jp -tohnosho.chiba.jp -tomisato.chiba.jp -urayasu.chiba.jp -yachimata.chiba.jp -yachiyo.chiba.jp -yokaichiba.chiba.jp -yokoshibahikari.chiba.jp -yotsukaido.chiba.jp -ainan.ehime.jp -honai.ehime.jp -ikata.ehime.jp -imabari.ehime.jp -iyo.ehime.jp -kamijima.ehime.jp -kihoku.ehime.jp -kumakogen.ehime.jp -masaki.ehime.jp -matsuno.ehime.jp -matsuyama.ehime.jp -namikata.ehime.jp -niihama.ehime.jp -ozu.ehime.jp -saijo.ehime.jp -seiyo.ehime.jp -shikokuchuo.ehime.jp -tobe.ehime.jp -toon.ehime.jp -uchiko.ehime.jp -uwajima.ehime.jp -yawatahama.ehime.jp -echizen.fukui.jp -eiheiji.fukui.jp -fukui.fukui.jp -ikeda.fukui.jp -katsuyama.fukui.jp -mihama.fukui.jp -minamiechizen.fukui.jp -obama.fukui.jp -ohi.fukui.jp -ono.fukui.jp -sabae.fukui.jp -sakai.fukui.jp -takahama.fukui.jp -tsuruga.fukui.jp -wakasa.fukui.jp -ashiya.fukuoka.jp -buzen.fukuoka.jp -chikugo.fukuoka.jp -chikuho.fukuoka.jp -chikujo.fukuoka.jp -chikushino.fukuoka.jp -chikuzen.fukuoka.jp -chuo.fukuoka.jp -dazaifu.fukuoka.jp -fukuchi.fukuoka.jp -hakata.fukuoka.jp -higashi.fukuoka.jp -hirokawa.fukuoka.jp -hisayama.fukuoka.jp -iizuka.fukuoka.jp -inatsuki.fukuoka.jp -kaho.fukuoka.jp -kasuga.fukuoka.jp -kasuya.fukuoka.jp -kawara.fukuoka.jp -keisen.fukuoka.jp -koga.fukuoka.jp -kurate.fukuoka.jp -kurogi.fukuoka.jp -kurume.fukuoka.jp -minami.fukuoka.jp -miyako.fukuoka.jp -miyama.fukuoka.jp -miyawaka.fukuoka.jp -mizumaki.fukuoka.jp -munakata.fukuoka.jp -nakagawa.fukuoka.jp -nakama.fukuoka.jp -nishi.fukuoka.jp -nogata.fukuoka.jp -ogori.fukuoka.jp -okagaki.fukuoka.jp -okawa.fukuoka.jp -oki.fukuoka.jp -omuta.fukuoka.jp -onga.fukuoka.jp -onojo.fukuoka.jp -oto.fukuoka.jp -saigawa.fukuoka.jp -sasaguri.fukuoka.jp -shingu.fukuoka.jp -shinyoshitomi.fukuoka.jp -shonai.fukuoka.jp -soeda.fukuoka.jp -sue.fukuoka.jp -tachiarai.fukuoka.jp -tagawa.fukuoka.jp -takata.fukuoka.jp -toho.fukuoka.jp -toyotsu.fukuoka.jp -tsuiki.fukuoka.jp -ukiha.fukuoka.jp -umi.fukuoka.jp -usui.fukuoka.jp -yamada.fukuoka.jp -yame.fukuoka.jp -yanagawa.fukuoka.jp -yukuhashi.fukuoka.jp -aizubange.fukushima.jp -aizumisato.fukushima.jp -aizuwakamatsu.fukushima.jp -asakawa.fukushima.jp -bandai.fukushima.jp -date.fukushima.jp -fukushima.fukushima.jp -furudono.fukushima.jp -futaba.fukushima.jp -hanawa.fukushima.jp -higashi.fukushima.jp -hirata.fukushima.jp -hirono.fukushima.jp -iitate.fukushima.jp -inawashiro.fukushima.jp -ishikawa.fukushima.jp -iwaki.fukushima.jp -izumizaki.fukushima.jp -kagamiishi.fukushima.jp -kaneyama.fukushima.jp -kawamata.fukushima.jp -kitakata.fukushima.jp -kitashiobara.fukushima.jp -koori.fukushima.jp -koriyama.fukushima.jp -kunimi.fukushima.jp -miharu.fukushima.jp -mishima.fukushima.jp -namie.fukushima.jp -nango.fukushima.jp -nishiaizu.fukushima.jp -nishigo.fukushima.jp -okuma.fukushima.jp -omotego.fukushima.jp -ono.fukushima.jp -otama.fukushima.jp -samegawa.fukushima.jp -shimogo.fukushima.jp -shirakawa.fukushima.jp -showa.fukushima.jp -soma.fukushima.jp -sukagawa.fukushima.jp -taishin.fukushima.jp -tamakawa.fukushima.jp -tanagura.fukushima.jp -tenei.fukushima.jp -yabuki.fukushima.jp -yamato.fukushima.jp -yamatsuri.fukushima.jp -yanaizu.fukushima.jp -yugawa.fukushima.jp -anpachi.gifu.jp -ena.gifu.jp -gifu.gifu.jp -ginan.gifu.jp -godo.gifu.jp -gujo.gifu.jp -hashima.gifu.jp -hichiso.gifu.jp -hida.gifu.jp -higashishirakawa.gifu.jp -ibigawa.gifu.jp -ikeda.gifu.jp -kakamigahara.gifu.jp -kani.gifu.jp -kasahara.gifu.jp -kasamatsu.gifu.jp -kawaue.gifu.jp -kitagata.gifu.jp -mino.gifu.jp -minokamo.gifu.jp -mitake.gifu.jp -mizunami.gifu.jp -motosu.gifu.jp -nakatsugawa.gifu.jp -ogaki.gifu.jp -sakahogi.gifu.jp -seki.gifu.jp -sekigahara.gifu.jp -shirakawa.gifu.jp -tajimi.gifu.jp -takayama.gifu.jp -tarui.gifu.jp -toki.gifu.jp -tomika.gifu.jp -wanouchi.gifu.jp -yamagata.gifu.jp -yaotsu.gifu.jp -yoro.gifu.jp -annaka.gunma.jp -chiyoda.gunma.jp -fujioka.gunma.jp -higashiagatsuma.gunma.jp -isesaki.gunma.jp -itakura.gunma.jp -kanna.gunma.jp -kanra.gunma.jp -katashina.gunma.jp -kawaba.gunma.jp -kiryu.gunma.jp -kusatsu.gunma.jp -maebashi.gunma.jp -meiwa.gunma.jp -midori.gunma.jp -minakami.gunma.jp -naganohara.gunma.jp -nakanojo.gunma.jp -nanmoku.gunma.jp -numata.gunma.jp -oizumi.gunma.jp -ora.gunma.jp -ota.gunma.jp -shibukawa.gunma.jp -shimonita.gunma.jp -shinto.gunma.jp -showa.gunma.jp -takasaki.gunma.jp -takayama.gunma.jp -tamamura.gunma.jp -tatebayashi.gunma.jp -tomioka.gunma.jp -tsukiyono.gunma.jp -tsumagoi.gunma.jp -ueno.gunma.jp -yoshioka.gunma.jp -asaminami.hiroshima.jp -daiwa.hiroshima.jp -etajima.hiroshima.jp -fuchu.hiroshima.jp -fukuyama.hiroshima.jp -hatsukaichi.hiroshima.jp -higashihiroshima.hiroshima.jp -hongo.hiroshima.jp -jinsekikogen.hiroshima.jp -kaita.hiroshima.jp -kui.hiroshima.jp -kumano.hiroshima.jp -kure.hiroshima.jp -mihara.hiroshima.jp -miyoshi.hiroshima.jp -naka.hiroshima.jp -onomichi.hiroshima.jp -osakikamijima.hiroshima.jp -otake.hiroshima.jp -saka.hiroshima.jp -sera.hiroshima.jp -seranishi.hiroshima.jp -shinichi.hiroshima.jp -shobara.hiroshima.jp -takehara.hiroshima.jp -abashiri.hokkaido.jp -abira.hokkaido.jp -aibetsu.hokkaido.jp -akabira.hokkaido.jp -akkeshi.hokkaido.jp -asahikawa.hokkaido.jp -ashibetsu.hokkaido.jp -ashoro.hokkaido.jp -assabu.hokkaido.jp -atsuma.hokkaido.jp -bibai.hokkaido.jp -biei.hokkaido.jp -bifuka.hokkaido.jp -bihoro.hokkaido.jp -biratori.hokkaido.jp -chippubetsu.hokkaido.jp -chitose.hokkaido.jp -date.hokkaido.jp -ebetsu.hokkaido.jp -embetsu.hokkaido.jp -eniwa.hokkaido.jp -erimo.hokkaido.jp -esan.hokkaido.jp -esashi.hokkaido.jp -fukagawa.hokkaido.jp -fukushima.hokkaido.jp -furano.hokkaido.jp -furubira.hokkaido.jp -haboro.hokkaido.jp -hakodate.hokkaido.jp -hamatonbetsu.hokkaido.jp -hidaka.hokkaido.jp -higashikagura.hokkaido.jp -higashikawa.hokkaido.jp -hiroo.hokkaido.jp -hokuryu.hokkaido.jp -hokuto.hokkaido.jp -honbetsu.hokkaido.jp -horokanai.hokkaido.jp -horonobe.hokkaido.jp -ikeda.hokkaido.jp -imakane.hokkaido.jp -ishikari.hokkaido.jp -iwamizawa.hokkaido.jp -iwanai.hokkaido.jp -kamifurano.hokkaido.jp -kamikawa.hokkaido.jp -kamishihoro.hokkaido.jp -kamisunagawa.hokkaido.jp -kamoenai.hokkaido.jp -kayabe.hokkaido.jp -kembuchi.hokkaido.jp -kikonai.hokkaido.jp -kimobetsu.hokkaido.jp -kitahiroshima.hokkaido.jp -kitami.hokkaido.jp -kiyosato.hokkaido.jp -koshimizu.hokkaido.jp -kunneppu.hokkaido.jp -kuriyama.hokkaido.jp -kuromatsunai.hokkaido.jp -kushiro.hokkaido.jp -kutchan.hokkaido.jp -kyowa.hokkaido.jp -mashike.hokkaido.jp -matsumae.hokkaido.jp -mikasa.hokkaido.jp -minamifurano.hokkaido.jp -mombetsu.hokkaido.jp -moseushi.hokkaido.jp -mukawa.hokkaido.jp -muroran.hokkaido.jp -naie.hokkaido.jp -nakagawa.hokkaido.jp -nakasatsunai.hokkaido.jp -nakatombetsu.hokkaido.jp -nanae.hokkaido.jp -nanporo.hokkaido.jp -nayoro.hokkaido.jp -nemuro.hokkaido.jp -niikappu.hokkaido.jp -niki.hokkaido.jp -nishiokoppe.hokkaido.jp -noboribetsu.hokkaido.jp -numata.hokkaido.jp -obihiro.hokkaido.jp -obira.hokkaido.jp -oketo.hokkaido.jp -okoppe.hokkaido.jp -otaru.hokkaido.jp -otobe.hokkaido.jp -otofuke.hokkaido.jp -otoineppu.hokkaido.jp -oumu.hokkaido.jp -ozora.hokkaido.jp -pippu.hokkaido.jp -rankoshi.hokkaido.jp -rebun.hokkaido.jp -rikubetsu.hokkaido.jp -rishiri.hokkaido.jp -rishirifuji.hokkaido.jp -saroma.hokkaido.jp -sarufutsu.hokkaido.jp -shakotan.hokkaido.jp -shari.hokkaido.jp -shibecha.hokkaido.jp -shibetsu.hokkaido.jp -shikabe.hokkaido.jp -shikaoi.hokkaido.jp -shimamaki.hokkaido.jp -shimizu.hokkaido.jp -shimokawa.hokkaido.jp -shinshinotsu.hokkaido.jp -shintoku.hokkaido.jp -shiranuka.hokkaido.jp -shiraoi.hokkaido.jp -shiriuchi.hokkaido.jp -sobetsu.hokkaido.jp -sunagawa.hokkaido.jp -taiki.hokkaido.jp -takasu.hokkaido.jp -takikawa.hokkaido.jp -takinoue.hokkaido.jp -teshikaga.hokkaido.jp -tobetsu.hokkaido.jp -tohma.hokkaido.jp -tomakomai.hokkaido.jp -tomari.hokkaido.jp -toya.hokkaido.jp -toyako.hokkaido.jp -toyotomi.hokkaido.jp -toyoura.hokkaido.jp -tsubetsu.hokkaido.jp -tsukigata.hokkaido.jp -urakawa.hokkaido.jp -urausu.hokkaido.jp -uryu.hokkaido.jp -utashinai.hokkaido.jp -wakkanai.hokkaido.jp -wassamu.hokkaido.jp -yakumo.hokkaido.jp -yoichi.hokkaido.jp -aioi.hyogo.jp -akashi.hyogo.jp -ako.hyogo.jp -amagasaki.hyogo.jp -aogaki.hyogo.jp -asago.hyogo.jp -ashiya.hyogo.jp -awaji.hyogo.jp -fukusaki.hyogo.jp -goshiki.hyogo.jp -harima.hyogo.jp -himeji.hyogo.jp -ichikawa.hyogo.jp -inagawa.hyogo.jp -itami.hyogo.jp -kakogawa.hyogo.jp -kamigori.hyogo.jp -kamikawa.hyogo.jp -kasai.hyogo.jp -kasuga.hyogo.jp -kawanishi.hyogo.jp -miki.hyogo.jp -minamiawaji.hyogo.jp -nishinomiya.hyogo.jp -nishiwaki.hyogo.jp -ono.hyogo.jp -sanda.hyogo.jp -sannan.hyogo.jp -sasayama.hyogo.jp -sayo.hyogo.jp -shingu.hyogo.jp -shinonsen.hyogo.jp -shiso.hyogo.jp -sumoto.hyogo.jp -taishi.hyogo.jp -taka.hyogo.jp -takarazuka.hyogo.jp -takasago.hyogo.jp -takino.hyogo.jp -tamba.hyogo.jp -tatsuno.hyogo.jp -toyooka.hyogo.jp -yabu.hyogo.jp -yashiro.hyogo.jp -yoka.hyogo.jp -yokawa.hyogo.jp -ami.ibaraki.jp -asahi.ibaraki.jp -bando.ibaraki.jp -chikusei.ibaraki.jp -daigo.ibaraki.jp -fujishiro.ibaraki.jp -hitachi.ibaraki.jp -hitachinaka.ibaraki.jp -hitachiomiya.ibaraki.jp -hitachiota.ibaraki.jp -ibaraki.ibaraki.jp -ina.ibaraki.jp -inashiki.ibaraki.jp -itako.ibaraki.jp -iwama.ibaraki.jp -joso.ibaraki.jp -kamisu.ibaraki.jp -kasama.ibaraki.jp -kashima.ibaraki.jp -kasumigaura.ibaraki.jp -koga.ibaraki.jp -miho.ibaraki.jp -mito.ibaraki.jp -moriya.ibaraki.jp -naka.ibaraki.jp -namegata.ibaraki.jp -oarai.ibaraki.jp -ogawa.ibaraki.jp -omitama.ibaraki.jp -ryugasaki.ibaraki.jp -sakai.ibaraki.jp -sakuragawa.ibaraki.jp -shimodate.ibaraki.jp -shimotsuma.ibaraki.jp -shirosato.ibaraki.jp -sowa.ibaraki.jp -suifu.ibaraki.jp -takahagi.ibaraki.jp -tamatsukuri.ibaraki.jp -tokai.ibaraki.jp -tomobe.ibaraki.jp -tone.ibaraki.jp -toride.ibaraki.jp -tsuchiura.ibaraki.jp -tsukuba.ibaraki.jp -uchihara.ibaraki.jp -ushiku.ibaraki.jp -yachiyo.ibaraki.jp -yamagata.ibaraki.jp -yawara.ibaraki.jp -yuki.ibaraki.jp -anamizu.ishikawa.jp -hakui.ishikawa.jp -hakusan.ishikawa.jp -kaga.ishikawa.jp -kahoku.ishikawa.jp -kanazawa.ishikawa.jp -kawakita.ishikawa.jp -komatsu.ishikawa.jp -nakanoto.ishikawa.jp -nanao.ishikawa.jp -nomi.ishikawa.jp -nonoichi.ishikawa.jp -noto.ishikawa.jp -shika.ishikawa.jp -suzu.ishikawa.jp -tsubata.ishikawa.jp -tsurugi.ishikawa.jp -uchinada.ishikawa.jp -wajima.ishikawa.jp -fudai.iwate.jp -fujisawa.iwate.jp -hanamaki.iwate.jp -hiraizumi.iwate.jp -hirono.iwate.jp -ichinohe.iwate.jp -ichinoseki.iwate.jp -iwaizumi.iwate.jp -iwate.iwate.jp -joboji.iwate.jp -kamaishi.iwate.jp -kanegasaki.iwate.jp -karumai.iwate.jp -kawai.iwate.jp -kitakami.iwate.jp -kuji.iwate.jp -kunohe.iwate.jp -kuzumaki.iwate.jp -miyako.iwate.jp -mizusawa.iwate.jp -morioka.iwate.jp -ninohe.iwate.jp -noda.iwate.jp -ofunato.iwate.jp -oshu.iwate.jp -otsuchi.iwate.jp -rikuzentakata.iwate.jp -shiwa.iwate.jp -shizukuishi.iwate.jp -sumita.iwate.jp -tanohata.iwate.jp -tono.iwate.jp -yahaba.iwate.jp -yamada.iwate.jp -ayagawa.kagawa.jp -higashikagawa.kagawa.jp -kanonji.kagawa.jp -kotohira.kagawa.jp -manno.kagawa.jp -marugame.kagawa.jp -mitoyo.kagawa.jp -naoshima.kagawa.jp -sanuki.kagawa.jp -tadotsu.kagawa.jp -takamatsu.kagawa.jp -tonosho.kagawa.jp -uchinomi.kagawa.jp -utazu.kagawa.jp -zentsuji.kagawa.jp -akune.kagoshima.jp -amami.kagoshima.jp -hioki.kagoshima.jp -isa.kagoshima.jp -isen.kagoshima.jp -izumi.kagoshima.jp -kagoshima.kagoshima.jp -kanoya.kagoshima.jp -kawanabe.kagoshima.jp -kinko.kagoshima.jp -kouyama.kagoshima.jp -makurazaki.kagoshima.jp -matsumoto.kagoshima.jp -minamitane.kagoshima.jp -nakatane.kagoshima.jp -nishinoomote.kagoshima.jp -satsumasendai.kagoshima.jp -soo.kagoshima.jp -tarumizu.kagoshima.jp -yusui.kagoshima.jp -aikawa.kanagawa.jp -atsugi.kanagawa.jp -ayase.kanagawa.jp -chigasaki.kanagawa.jp -ebina.kanagawa.jp -fujisawa.kanagawa.jp -hadano.kanagawa.jp -hakone.kanagawa.jp -hiratsuka.kanagawa.jp -isehara.kanagawa.jp -kaisei.kanagawa.jp -kamakura.kanagawa.jp -kiyokawa.kanagawa.jp -matsuda.kanagawa.jp -minamiashigara.kanagawa.jp -miura.kanagawa.jp -nakai.kanagawa.jp -ninomiya.kanagawa.jp -odawara.kanagawa.jp -oi.kanagawa.jp -oiso.kanagawa.jp -sagamihara.kanagawa.jp -samukawa.kanagawa.jp -tsukui.kanagawa.jp -yamakita.kanagawa.jp -yamato.kanagawa.jp -yokosuka.kanagawa.jp -yugawara.kanagawa.jp -zama.kanagawa.jp -zushi.kanagawa.jp -aki.kochi.jp -geisei.kochi.jp -hidaka.kochi.jp -higashitsuno.kochi.jp -ino.kochi.jp -kagami.kochi.jp -kami.kochi.jp -kitagawa.kochi.jp -kochi.kochi.jp -mihara.kochi.jp -motoyama.kochi.jp -muroto.kochi.jp -nahari.kochi.jp -nakamura.kochi.jp -nankoku.kochi.jp -nishitosa.kochi.jp -niyodogawa.kochi.jp -ochi.kochi.jp -okawa.kochi.jp -otoyo.kochi.jp -otsuki.kochi.jp -sakawa.kochi.jp -sukumo.kochi.jp -susaki.kochi.jp -tosa.kochi.jp -tosashimizu.kochi.jp -toyo.kochi.jp -tsuno.kochi.jp -umaji.kochi.jp -yasuda.kochi.jp -yusuhara.kochi.jp -amakusa.kumamoto.jp -arao.kumamoto.jp -aso.kumamoto.jp -choyo.kumamoto.jp -gyokuto.kumamoto.jp -kamiamakusa.kumamoto.jp -kikuchi.kumamoto.jp -kumamoto.kumamoto.jp -mashiki.kumamoto.jp -mifune.kumamoto.jp -minamata.kumamoto.jp -minamioguni.kumamoto.jp -nagasu.kumamoto.jp -nishihara.kumamoto.jp -oguni.kumamoto.jp -ozu.kumamoto.jp -sumoto.kumamoto.jp -takamori.kumamoto.jp -uki.kumamoto.jp -uto.kumamoto.jp -yamaga.kumamoto.jp -yamato.kumamoto.jp -yatsushiro.kumamoto.jp -ayabe.kyoto.jp -fukuchiyama.kyoto.jp -higashiyama.kyoto.jp -ide.kyoto.jp -ine.kyoto.jp -joyo.kyoto.jp -kameoka.kyoto.jp -kamo.kyoto.jp -kita.kyoto.jp -kizu.kyoto.jp -kumiyama.kyoto.jp -kyotamba.kyoto.jp -kyotanabe.kyoto.jp -kyotango.kyoto.jp -maizuru.kyoto.jp -minami.kyoto.jp -minamiyamashiro.kyoto.jp -miyazu.kyoto.jp -muko.kyoto.jp -nagaokakyo.kyoto.jp -nakagyo.kyoto.jp -nantan.kyoto.jp -oyamazaki.kyoto.jp -sakyo.kyoto.jp -seika.kyoto.jp -tanabe.kyoto.jp -uji.kyoto.jp -ujitawara.kyoto.jp -wazuka.kyoto.jp -yamashina.kyoto.jp -yawata.kyoto.jp -asahi.mie.jp -inabe.mie.jp -ise.mie.jp -kameyama.mie.jp -kawagoe.mie.jp -kiho.mie.jp -kisosaki.mie.jp -kiwa.mie.jp -komono.mie.jp -kumano.mie.jp -kuwana.mie.jp -matsusaka.mie.jp -meiwa.mie.jp -mihama.mie.jp -minamiise.mie.jp -misugi.mie.jp -miyama.mie.jp -nabari.mie.jp -shima.mie.jp -suzuka.mie.jp -tado.mie.jp -taiki.mie.jp -taki.mie.jp -tamaki.mie.jp -toba.mie.jp -tsu.mie.jp -udono.mie.jp -ureshino.mie.jp -watarai.mie.jp -yokkaichi.mie.jp -furukawa.miyagi.jp -higashimatsushima.miyagi.jp -ishinomaki.miyagi.jp -iwanuma.miyagi.jp -kakuda.miyagi.jp -kami.miyagi.jp -kawasaki.miyagi.jp -marumori.miyagi.jp -matsushima.miyagi.jp -minamisanriku.miyagi.jp -misato.miyagi.jp -murata.miyagi.jp -natori.miyagi.jp -ogawara.miyagi.jp -ohira.miyagi.jp -onagawa.miyagi.jp -osaki.miyagi.jp -rifu.miyagi.jp -semine.miyagi.jp -shibata.miyagi.jp -shichikashuku.miyagi.jp -shikama.miyagi.jp -shiogama.miyagi.jp -shiroishi.miyagi.jp -tagajo.miyagi.jp -taiwa.miyagi.jp -tome.miyagi.jp -tomiya.miyagi.jp -wakuya.miyagi.jp -watari.miyagi.jp -yamamoto.miyagi.jp -zao.miyagi.jp -aya.miyazaki.jp -ebino.miyazaki.jp -gokase.miyazaki.jp -hyuga.miyazaki.jp -kadogawa.miyazaki.jp -kawaminami.miyazaki.jp -kijo.miyazaki.jp -kitagawa.miyazaki.jp -kitakata.miyazaki.jp -kitaura.miyazaki.jp -kobayashi.miyazaki.jp -kunitomi.miyazaki.jp -kushima.miyazaki.jp -mimata.miyazaki.jp -miyakonojo.miyazaki.jp -miyazaki.miyazaki.jp -morotsuka.miyazaki.jp -nichinan.miyazaki.jp -nishimera.miyazaki.jp -nobeoka.miyazaki.jp -saito.miyazaki.jp -shiiba.miyazaki.jp -shintomi.miyazaki.jp -takaharu.miyazaki.jp -takanabe.miyazaki.jp -takazaki.miyazaki.jp -tsuno.miyazaki.jp -achi.nagano.jp -agematsu.nagano.jp -anan.nagano.jp -aoki.nagano.jp -asahi.nagano.jp -azumino.nagano.jp -chikuhoku.nagano.jp -chikuma.nagano.jp -chino.nagano.jp -fujimi.nagano.jp -hakuba.nagano.jp -hara.nagano.jp -hiraya.nagano.jp -iida.nagano.jp -iijima.nagano.jp -iiyama.nagano.jp -iizuna.nagano.jp -ikeda.nagano.jp -ikusaka.nagano.jp -ina.nagano.jp -karuizawa.nagano.jp -kawakami.nagano.jp -kiso.nagano.jp -kisofukushima.nagano.jp -kitaaiki.nagano.jp -komagane.nagano.jp -komoro.nagano.jp -matsukawa.nagano.jp -matsumoto.nagano.jp -miasa.nagano.jp -minamiaiki.nagano.jp -minamimaki.nagano.jp -minamiminowa.nagano.jp -minowa.nagano.jp -miyada.nagano.jp -miyota.nagano.jp -mochizuki.nagano.jp -nagano.nagano.jp -nagawa.nagano.jp -nagiso.nagano.jp -nakagawa.nagano.jp -nakano.nagano.jp -nozawaonsen.nagano.jp -obuse.nagano.jp -ogawa.nagano.jp -okaya.nagano.jp -omachi.nagano.jp -omi.nagano.jp -ookuwa.nagano.jp -ooshika.nagano.jp -otaki.nagano.jp -otari.nagano.jp -sakae.nagano.jp -sakaki.nagano.jp -saku.nagano.jp -sakuho.nagano.jp -shimosuwa.nagano.jp -shinanomachi.nagano.jp -shiojiri.nagano.jp -suwa.nagano.jp -suzaka.nagano.jp -takagi.nagano.jp -takamori.nagano.jp -takayama.nagano.jp -tateshina.nagano.jp -tatsuno.nagano.jp -togakushi.nagano.jp -togura.nagano.jp -tomi.nagano.jp -ueda.nagano.jp -wada.nagano.jp -yamagata.nagano.jp -yamanouchi.nagano.jp -yasaka.nagano.jp -yasuoka.nagano.jp -chijiwa.nagasaki.jp -futsu.nagasaki.jp -goto.nagasaki.jp -hasami.nagasaki.jp -hirado.nagasaki.jp -iki.nagasaki.jp -isahaya.nagasaki.jp -kawatana.nagasaki.jp -kuchinotsu.nagasaki.jp -matsuura.nagasaki.jp -nagasaki.nagasaki.jp -obama.nagasaki.jp -omura.nagasaki.jp -oseto.nagasaki.jp -saikai.nagasaki.jp -sasebo.nagasaki.jp -seihi.nagasaki.jp -shimabara.nagasaki.jp -shinkamigoto.nagasaki.jp -togitsu.nagasaki.jp -tsushima.nagasaki.jp -unzen.nagasaki.jp -ando.nara.jp -gose.nara.jp -heguri.nara.jp -higashiyoshino.nara.jp -ikaruga.nara.jp -ikoma.nara.jp -kamikitayama.nara.jp -kanmaki.nara.jp -kashiba.nara.jp -kashihara.nara.jp -katsuragi.nara.jp -kawai.nara.jp -kawakami.nara.jp -kawanishi.nara.jp -koryo.nara.jp -kurotaki.nara.jp -mitsue.nara.jp -miyake.nara.jp -nara.nara.jp -nosegawa.nara.jp -oji.nara.jp -ouda.nara.jp -oyodo.nara.jp -sakurai.nara.jp -sango.nara.jp -shimoichi.nara.jp -shimokitayama.nara.jp -shinjo.nara.jp -soni.nara.jp -takatori.nara.jp -tawaramoto.nara.jp -tenkawa.nara.jp -tenri.nara.jp -uda.nara.jp -yamatokoriyama.nara.jp -yamatotakada.nara.jp -yamazoe.nara.jp -yoshino.nara.jp -aga.niigata.jp -agano.niigata.jp -gosen.niigata.jp -itoigawa.niigata.jp -izumozaki.niigata.jp -joetsu.niigata.jp -kamo.niigata.jp -kariwa.niigata.jp -kashiwazaki.niigata.jp -minamiuonuma.niigata.jp -mitsuke.niigata.jp -muika.niigata.jp -murakami.niigata.jp -myoko.niigata.jp -nagaoka.niigata.jp -niigata.niigata.jp -ojiya.niigata.jp -omi.niigata.jp -sado.niigata.jp -sanjo.niigata.jp -seiro.niigata.jp -seirou.niigata.jp -sekikawa.niigata.jp -shibata.niigata.jp -tagami.niigata.jp -tainai.niigata.jp -tochio.niigata.jp -tokamachi.niigata.jp -tsubame.niigata.jp -tsunan.niigata.jp -uonuma.niigata.jp -yahiko.niigata.jp -yoita.niigata.jp -yuzawa.niigata.jp -beppu.oita.jp -bungoono.oita.jp -bungotakada.oita.jp -hasama.oita.jp -hiji.oita.jp -himeshima.oita.jp -hita.oita.jp -kamitsue.oita.jp -kokonoe.oita.jp -kuju.oita.jp -kunisaki.oita.jp -kusu.oita.jp -oita.oita.jp -saiki.oita.jp -taketa.oita.jp -tsukumi.oita.jp -usa.oita.jp -usuki.oita.jp -yufu.oita.jp -akaiwa.okayama.jp -asakuchi.okayama.jp -bizen.okayama.jp -hayashima.okayama.jp -ibara.okayama.jp -kagamino.okayama.jp -kasaoka.okayama.jp -kibichuo.okayama.jp -kumenan.okayama.jp -kurashiki.okayama.jp -maniwa.okayama.jp -misaki.okayama.jp -nagi.okayama.jp -niimi.okayama.jp -nishiawakura.okayama.jp -okayama.okayama.jp -satosho.okayama.jp -setouchi.okayama.jp -shinjo.okayama.jp -shoo.okayama.jp -soja.okayama.jp -takahashi.okayama.jp -tamano.okayama.jp -tsuyama.okayama.jp -wake.okayama.jp -yakage.okayama.jp -aguni.okinawa.jp -ginowan.okinawa.jp -ginoza.okinawa.jp -gushikami.okinawa.jp -haebaru.okinawa.jp -higashi.okinawa.jp -hirara.okinawa.jp -iheya.okinawa.jp -ishigaki.okinawa.jp -ishikawa.okinawa.jp -itoman.okinawa.jp -izena.okinawa.jp -kadena.okinawa.jp -kin.okinawa.jp -kitadaito.okinawa.jp -kitanakagusuku.okinawa.jp -kumejima.okinawa.jp -kunigami.okinawa.jp -minamidaito.okinawa.jp -motobu.okinawa.jp -nago.okinawa.jp -naha.okinawa.jp -nakagusuku.okinawa.jp -nakijin.okinawa.jp -nanjo.okinawa.jp -nishihara.okinawa.jp -ogimi.okinawa.jp -okinawa.okinawa.jp -onna.okinawa.jp -shimoji.okinawa.jp -taketomi.okinawa.jp -tarama.okinawa.jp -tokashiki.okinawa.jp -tomigusuku.okinawa.jp -tonaki.okinawa.jp -urasoe.okinawa.jp -uruma.okinawa.jp -yaese.okinawa.jp -yomitan.okinawa.jp -yonabaru.okinawa.jp -yonaguni.okinawa.jp -zamami.okinawa.jp -abeno.osaka.jp -chihayaakasaka.osaka.jp -chuo.osaka.jp -daito.osaka.jp -fujiidera.osaka.jp -habikino.osaka.jp -hannan.osaka.jp -higashiosaka.osaka.jp -higashisumiyoshi.osaka.jp -higashiyodogawa.osaka.jp -hirakata.osaka.jp -ibaraki.osaka.jp -ikeda.osaka.jp -izumi.osaka.jp -izumiotsu.osaka.jp -izumisano.osaka.jp -kadoma.osaka.jp -kaizuka.osaka.jp -kanan.osaka.jp -kashiwara.osaka.jp -katano.osaka.jp -kawachinagano.osaka.jp -kishiwada.osaka.jp -kita.osaka.jp -kumatori.osaka.jp -matsubara.osaka.jp -minato.osaka.jp -minoh.osaka.jp -misaki.osaka.jp -moriguchi.osaka.jp -neyagawa.osaka.jp -nishi.osaka.jp -nose.osaka.jp -osakasayama.osaka.jp -sakai.osaka.jp -sayama.osaka.jp -sennan.osaka.jp -settsu.osaka.jp -shijonawate.osaka.jp -shimamoto.osaka.jp -suita.osaka.jp -tadaoka.osaka.jp -taishi.osaka.jp -tajiri.osaka.jp -takaishi.osaka.jp -takatsuki.osaka.jp -tondabayashi.osaka.jp -toyonaka.osaka.jp -toyono.osaka.jp -yao.osaka.jp -ariake.saga.jp -arita.saga.jp -fukudomi.saga.jp -genkai.saga.jp -hamatama.saga.jp -hizen.saga.jp -imari.saga.jp -kamimine.saga.jp -kanzaki.saga.jp -karatsu.saga.jp -kashima.saga.jp -kitagata.saga.jp -kitahata.saga.jp -kiyama.saga.jp -kouhoku.saga.jp -kyuragi.saga.jp -nishiarita.saga.jp -ogi.saga.jp -omachi.saga.jp -ouchi.saga.jp -saga.saga.jp -shiroishi.saga.jp -taku.saga.jp -tara.saga.jp -tosu.saga.jp -yoshinogari.saga.jp -arakawa.saitama.jp -asaka.saitama.jp -chichibu.saitama.jp -fujimi.saitama.jp -fujimino.saitama.jp -fukaya.saitama.jp -hanno.saitama.jp -hanyu.saitama.jp -hasuda.saitama.jp -hatogaya.saitama.jp -hatoyama.saitama.jp -hidaka.saitama.jp -higashichichibu.saitama.jp -higashimatsuyama.saitama.jp -honjo.saitama.jp -ina.saitama.jp -iruma.saitama.jp -iwatsuki.saitama.jp -kamiizumi.saitama.jp -kamikawa.saitama.jp -kamisato.saitama.jp -kasukabe.saitama.jp -kawagoe.saitama.jp -kawaguchi.saitama.jp -kawajima.saitama.jp -kazo.saitama.jp -kitamoto.saitama.jp -koshigaya.saitama.jp -kounosu.saitama.jp -kuki.saitama.jp -kumagaya.saitama.jp -matsubushi.saitama.jp -minano.saitama.jp -misato.saitama.jp -miyashiro.saitama.jp -miyoshi.saitama.jp -moroyama.saitama.jp -nagatoro.saitama.jp -namegawa.saitama.jp -niiza.saitama.jp -ogano.saitama.jp -ogawa.saitama.jp -ogose.saitama.jp -okegawa.saitama.jp -omiya.saitama.jp -otaki.saitama.jp -ranzan.saitama.jp -ryokami.saitama.jp -saitama.saitama.jp -sakado.saitama.jp -satte.saitama.jp -sayama.saitama.jp -shiki.saitama.jp -shiraoka.saitama.jp -soka.saitama.jp -sugito.saitama.jp -toda.saitama.jp -tokigawa.saitama.jp -tokorozawa.saitama.jp -tsurugashima.saitama.jp -urawa.saitama.jp -warabi.saitama.jp -yashio.saitama.jp -yokoze.saitama.jp -yono.saitama.jp -yorii.saitama.jp -yoshida.saitama.jp -yoshikawa.saitama.jp -yoshimi.saitama.jp -aisho.shiga.jp -gamo.shiga.jp -higashiomi.shiga.jp -hikone.shiga.jp -koka.shiga.jp -konan.shiga.jp -kosei.shiga.jp -koto.shiga.jp -kusatsu.shiga.jp -maibara.shiga.jp -moriyama.shiga.jp -nagahama.shiga.jp -nishiazai.shiga.jp -notogawa.shiga.jp -omihachiman.shiga.jp -otsu.shiga.jp -ritto.shiga.jp -ryuoh.shiga.jp -takashima.shiga.jp -takatsuki.shiga.jp -torahime.shiga.jp -toyosato.shiga.jp -yasu.shiga.jp -akagi.shimane.jp -ama.shimane.jp -gotsu.shimane.jp -hamada.shimane.jp -higashiizumo.shimane.jp -hikawa.shimane.jp -hikimi.shimane.jp -izumo.shimane.jp -kakinoki.shimane.jp -masuda.shimane.jp -matsue.shimane.jp -misato.shimane.jp -nishinoshima.shimane.jp -ohda.shimane.jp -okinoshima.shimane.jp -okuizumo.shimane.jp -shimane.shimane.jp -tamayu.shimane.jp -tsuwano.shimane.jp -unnan.shimane.jp -yakumo.shimane.jp -yasugi.shimane.jp -yatsuka.shimane.jp -arai.shizuoka.jp -atami.shizuoka.jp -fuji.shizuoka.jp -fujieda.shizuoka.jp -fujikawa.shizuoka.jp -fujinomiya.shizuoka.jp -fukuroi.shizuoka.jp -gotemba.shizuoka.jp -haibara.shizuoka.jp -hamamatsu.shizuoka.jp -higashiizu.shizuoka.jp -ito.shizuoka.jp -iwata.shizuoka.jp -izu.shizuoka.jp -izunokuni.shizuoka.jp -kakegawa.shizuoka.jp -kannami.shizuoka.jp -kawanehon.shizuoka.jp -kawazu.shizuoka.jp -kikugawa.shizuoka.jp -kosai.shizuoka.jp -makinohara.shizuoka.jp -matsuzaki.shizuoka.jp -minamiizu.shizuoka.jp -mishima.shizuoka.jp -morimachi.shizuoka.jp -nishiizu.shizuoka.jp -numazu.shizuoka.jp -omaezaki.shizuoka.jp -shimada.shizuoka.jp -shimizu.shizuoka.jp -shimoda.shizuoka.jp -shizuoka.shizuoka.jp -susono.shizuoka.jp -yaizu.shizuoka.jp -yoshida.shizuoka.jp -ashikaga.tochigi.jp -bato.tochigi.jp -haga.tochigi.jp -ichikai.tochigi.jp -iwafune.tochigi.jp -kaminokawa.tochigi.jp -kanuma.tochigi.jp -karasuyama.tochigi.jp -kuroiso.tochigi.jp -mashiko.tochigi.jp -mibu.tochigi.jp -moka.tochigi.jp -motegi.tochigi.jp -nasu.tochigi.jp -nasushiobara.tochigi.jp -nikko.tochigi.jp -nishikata.tochigi.jp -nogi.tochigi.jp -ohira.tochigi.jp -ohtawara.tochigi.jp -oyama.tochigi.jp -sakura.tochigi.jp -sano.tochigi.jp -shimotsuke.tochigi.jp -shioya.tochigi.jp -takanezawa.tochigi.jp -tochigi.tochigi.jp -tsuga.tochigi.jp -ujiie.tochigi.jp -utsunomiya.tochigi.jp -yaita.tochigi.jp -aizumi.tokushima.jp -anan.tokushima.jp -ichiba.tokushima.jp -itano.tokushima.jp -kainan.tokushima.jp -komatsushima.tokushima.jp -matsushige.tokushima.jp -mima.tokushima.jp -minami.tokushima.jp -miyoshi.tokushima.jp -mugi.tokushima.jp -nakagawa.tokushima.jp -naruto.tokushima.jp -sanagochi.tokushima.jp -shishikui.tokushima.jp -tokushima.tokushima.jp -wajiki.tokushima.jp -adachi.tokyo.jp -akiruno.tokyo.jp -akishima.tokyo.jp -aogashima.tokyo.jp -arakawa.tokyo.jp -bunkyo.tokyo.jp -chiyoda.tokyo.jp -chofu.tokyo.jp -chuo.tokyo.jp -edogawa.tokyo.jp -fuchu.tokyo.jp -fussa.tokyo.jp -hachijo.tokyo.jp -hachioji.tokyo.jp -hamura.tokyo.jp -higashikurume.tokyo.jp -higashimurayama.tokyo.jp -higashiyamato.tokyo.jp -hino.tokyo.jp -hinode.tokyo.jp -hinohara.tokyo.jp -inagi.tokyo.jp -itabashi.tokyo.jp -katsushika.tokyo.jp -kita.tokyo.jp -kiyose.tokyo.jp -kodaira.tokyo.jp -koganei.tokyo.jp -kokubunji.tokyo.jp -komae.tokyo.jp -koto.tokyo.jp -kouzushima.tokyo.jp -kunitachi.tokyo.jp -machida.tokyo.jp -meguro.tokyo.jp -minato.tokyo.jp -mitaka.tokyo.jp -mizuho.tokyo.jp -musashimurayama.tokyo.jp -musashino.tokyo.jp -nakano.tokyo.jp -nerima.tokyo.jp -ogasawara.tokyo.jp -okutama.tokyo.jp -ome.tokyo.jp -oshima.tokyo.jp -ota.tokyo.jp -setagaya.tokyo.jp -shibuya.tokyo.jp -shinagawa.tokyo.jp -shinjuku.tokyo.jp -suginami.tokyo.jp -sumida.tokyo.jp -tachikawa.tokyo.jp -taito.tokyo.jp -tama.tokyo.jp -toshima.tokyo.jp -chizu.tottori.jp -hino.tottori.jp -kawahara.tottori.jp -koge.tottori.jp -kotoura.tottori.jp -misasa.tottori.jp -nanbu.tottori.jp -nichinan.tottori.jp -sakaiminato.tottori.jp -tottori.tottori.jp -wakasa.tottori.jp -yazu.tottori.jp -yonago.tottori.jp -asahi.toyama.jp -fuchu.toyama.jp -fukumitsu.toyama.jp -funahashi.toyama.jp -himi.toyama.jp -imizu.toyama.jp -inami.toyama.jp -johana.toyama.jp -kamiichi.toyama.jp -kurobe.toyama.jp -nakaniikawa.toyama.jp -namerikawa.toyama.jp -nanto.toyama.jp -nyuzen.toyama.jp -oyabe.toyama.jp -taira.toyama.jp -takaoka.toyama.jp -tateyama.toyama.jp -toga.toyama.jp -tonami.toyama.jp -toyama.toyama.jp -unazuki.toyama.jp -uozu.toyama.jp -yamada.toyama.jp -arida.wakayama.jp -aridagawa.wakayama.jp -gobo.wakayama.jp -hashimoto.wakayama.jp -hidaka.wakayama.jp -hirogawa.wakayama.jp -inami.wakayama.jp -iwade.wakayama.jp -kainan.wakayama.jp -kamitonda.wakayama.jp -katsuragi.wakayama.jp -kimino.wakayama.jp -kinokawa.wakayama.jp -kitayama.wakayama.jp -koya.wakayama.jp -koza.wakayama.jp -kozagawa.wakayama.jp -kudoyama.wakayama.jp -kushimoto.wakayama.jp -mihama.wakayama.jp -misato.wakayama.jp -nachikatsuura.wakayama.jp -shingu.wakayama.jp -shirahama.wakayama.jp -taiji.wakayama.jp -tanabe.wakayama.jp -wakayama.wakayama.jp -yuasa.wakayama.jp -yura.wakayama.jp -asahi.yamagata.jp -funagata.yamagata.jp -higashine.yamagata.jp -iide.yamagata.jp -kahoku.yamagata.jp -kaminoyama.yamagata.jp -kaneyama.yamagata.jp -kawanishi.yamagata.jp -mamurogawa.yamagata.jp -mikawa.yamagata.jp -murayama.yamagata.jp -nagai.yamagata.jp -nakayama.yamagata.jp -nanyo.yamagata.jp -nishikawa.yamagata.jp -obanazawa.yamagata.jp -oe.yamagata.jp -oguni.yamagata.jp -ohkura.yamagata.jp -oishida.yamagata.jp -sagae.yamagata.jp -sakata.yamagata.jp -sakegawa.yamagata.jp -shinjo.yamagata.jp -shirataka.yamagata.jp -shonai.yamagata.jp -takahata.yamagata.jp -tendo.yamagata.jp -tozawa.yamagata.jp -tsuruoka.yamagata.jp -yamagata.yamagata.jp -yamanobe.yamagata.jp -yonezawa.yamagata.jp -yuza.yamagata.jp -abu.yamaguchi.jp -hagi.yamaguchi.jp -hikari.yamaguchi.jp -hofu.yamaguchi.jp -iwakuni.yamaguchi.jp -kudamatsu.yamaguchi.jp -mitou.yamaguchi.jp -nagato.yamaguchi.jp -oshima.yamaguchi.jp -shimonoseki.yamaguchi.jp -shunan.yamaguchi.jp -tabuse.yamaguchi.jp -tokuyama.yamaguchi.jp -toyota.yamaguchi.jp -ube.yamaguchi.jp -yuu.yamaguchi.jp -chuo.yamanashi.jp -doshi.yamanashi.jp -fuefuki.yamanashi.jp -fujikawa.yamanashi.jp -fujikawaguchiko.yamanashi.jp -fujiyoshida.yamanashi.jp -hayakawa.yamanashi.jp -hokuto.yamanashi.jp -ichikawamisato.yamanashi.jp -kai.yamanashi.jp -kofu.yamanashi.jp -koshu.yamanashi.jp -kosuge.yamanashi.jp -minami-alps.yamanashi.jp -minobu.yamanashi.jp -nakamichi.yamanashi.jp -nanbu.yamanashi.jp -narusawa.yamanashi.jp -nirasaki.yamanashi.jp -nishikatsura.yamanashi.jp -oshino.yamanashi.jp -otsuki.yamanashi.jp -showa.yamanashi.jp -tabayama.yamanashi.jp -tsuru.yamanashi.jp -uenohara.yamanashi.jp -yamanakako.yamanashi.jp -yamanashi.yamanashi.jp - -// ke : http://www.kenic.or.ke/index.php?option=com_content&task=view&id=117&Itemid=145 -*.ke - -// kg : http://www.domain.kg/dmn_n.html -kg -org.kg -net.kg -com.kg -edu.kg -gov.kg -mil.kg - -// kh : http://www.mptc.gov.kh/dns_registration.htm -*.kh - -// ki : http://www.ki/dns/index.html -ki -edu.ki -biz.ki -net.ki -org.ki -gov.ki -info.ki -com.ki - -// km : https://en.wikipedia.org/wiki/.km -// http://www.domaine.km/documents/charte.doc -km -org.km -nom.km -gov.km -prd.km -tm.km -edu.km -mil.km -ass.km -com.km -// These are only mentioned as proposed suggestions at domaine.km, but -// https://en.wikipedia.org/wiki/.km says they're available for registration: -coop.km -asso.km -presse.km -medecin.km -notaires.km -pharmaciens.km -veterinaire.km -gouv.km - -// kn : https://en.wikipedia.org/wiki/.kn -// http://www.dot.kn/domainRules.html -kn -net.kn -org.kn -edu.kn -gov.kn - -// kp : http://www.kcce.kp/en_index.php -kp -com.kp -edu.kp -gov.kp -org.kp -rep.kp -tra.kp - -// kr : https://en.wikipedia.org/wiki/.kr -// see also: http://domain.nida.or.kr/eng/registration.jsp -kr -ac.kr -co.kr -es.kr -go.kr -hs.kr -kg.kr -mil.kr -ms.kr -ne.kr -or.kr -pe.kr -re.kr -sc.kr -// kr geographical names -busan.kr -chungbuk.kr -chungnam.kr -daegu.kr -daejeon.kr -gangwon.kr -gwangju.kr -gyeongbuk.kr -gyeonggi.kr -gyeongnam.kr -incheon.kr -jeju.kr -jeonbuk.kr -jeonnam.kr -seoul.kr -ulsan.kr - -// kw : https://en.wikipedia.org/wiki/.kw -*.kw - -// ky : http://www.icta.ky/da_ky_reg_dom.php -// Confirmed by registry 2008-06-17 -ky -edu.ky -gov.ky -com.ky -org.ky -net.ky - -// kz : https://en.wikipedia.org/wiki/.kz -// see also: http://www.nic.kz/rules/index.jsp -kz -org.kz -edu.kz -net.kz -gov.kz -mil.kz -com.kz - -// la : https://en.wikipedia.org/wiki/.la -// Submitted by registry -la -int.la -net.la -info.la -edu.la -gov.la -per.la -com.la -org.la - -// lb : https://en.wikipedia.org/wiki/.lb -// Submitted by registry -lb -com.lb -edu.lb -gov.lb -net.lb -org.lb - -// lc : https://en.wikipedia.org/wiki/.lc -// see also: http://www.nic.lc/rules.htm -lc -com.lc -net.lc -co.lc -org.lc -edu.lc -gov.lc - -// li : https://en.wikipedia.org/wiki/.li -li - -// lk : http://www.nic.lk/seclevpr.html -lk -gov.lk -sch.lk -net.lk -int.lk -com.lk -org.lk -edu.lk -ngo.lk -soc.lk -web.lk -ltd.lk -assn.lk -grp.lk -hotel.lk -ac.lk - -// lr : http://psg.com/dns/lr/lr.txt -// Submitted by registry -lr -com.lr -edu.lr -gov.lr -org.lr -net.lr - -// ls : https://en.wikipedia.org/wiki/.ls -ls -co.ls -org.ls - -// lt : https://en.wikipedia.org/wiki/.lt -lt -// gov.lt : http://www.gov.lt/index_en.php -gov.lt - -// lu : http://www.dns.lu/en/ -lu - -// lv : http://www.nic.lv/DNS/En/generic.php -lv -com.lv -edu.lv -gov.lv -org.lv -mil.lv -id.lv -net.lv -asn.lv -conf.lv - -// ly : http://www.nic.ly/regulations.php -ly -com.ly -net.ly -gov.ly -plc.ly -edu.ly -sch.ly -med.ly -org.ly -id.ly - -// ma : https://en.wikipedia.org/wiki/.ma -// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf -ma -co.ma -net.ma -gov.ma -org.ma -ac.ma -press.ma - -// mc : http://www.nic.mc/ -mc -tm.mc -asso.mc - -// md : https://en.wikipedia.org/wiki/.md -md - -// me : https://en.wikipedia.org/wiki/.me -me -co.me -net.me -org.me -edu.me -ac.me -gov.me -its.me -priv.me - -// mg : http://nic.mg/nicmg/?page_id=39 -mg -org.mg -nom.mg -gov.mg -prd.mg -tm.mg -edu.mg -mil.mg -com.mg -co.mg - -// mh : https://en.wikipedia.org/wiki/.mh -mh - -// mil : https://en.wikipedia.org/wiki/.mil -mil - -// mk : https://en.wikipedia.org/wiki/.mk -// see also: http://dns.marnet.net.mk/postapka.php -mk -com.mk -org.mk -net.mk -edu.mk -gov.mk -inf.mk -name.mk - -// ml : http://www.gobin.info/domainname/ml-template.doc -// see also: https://en.wikipedia.org/wiki/.ml -ml -com.ml -edu.ml -gouv.ml -gov.ml -net.ml -org.ml -presse.ml - -// mm : https://en.wikipedia.org/wiki/.mm -*.mm - -// mn : https://en.wikipedia.org/wiki/.mn -mn -gov.mn -edu.mn -org.mn - -// mo : http://www.monic.net.mo/ -mo -com.mo -net.mo -org.mo -edu.mo -gov.mo - -// mobi : https://en.wikipedia.org/wiki/.mobi -mobi - -// mp : http://www.dot.mp/ -// Confirmed by registry 2008-06-17 -mp - -// mq : https://en.wikipedia.org/wiki/.mq -mq - -// mr : https://en.wikipedia.org/wiki/.mr -mr -gov.mr - -// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf -ms -com.ms -edu.ms -gov.ms -net.ms -org.ms - -// mt : https://www.nic.org.mt/go/policy -// Submitted by registry -mt -com.mt -edu.mt -net.mt -org.mt - -// mu : https://en.wikipedia.org/wiki/.mu -mu -com.mu -net.mu -org.mu -gov.mu -ac.mu -co.mu -or.mu - -// museum : http://about.museum/naming/ -// http://index.museum/ -museum -academy.museum -agriculture.museum -air.museum -airguard.museum -alabama.museum -alaska.museum -amber.museum -ambulance.museum -american.museum -americana.museum -americanantiques.museum -americanart.museum -amsterdam.museum -and.museum -annefrank.museum -anthro.museum -anthropology.museum -antiques.museum -aquarium.museum -arboretum.museum -archaeological.museum -archaeology.museum -architecture.museum -art.museum -artanddesign.museum -artcenter.museum -artdeco.museum -arteducation.museum -artgallery.museum -arts.museum -artsandcrafts.museum -asmatart.museum -assassination.museum -assisi.museum -association.museum -astronomy.museum -atlanta.museum -austin.museum -australia.museum -automotive.museum -aviation.museum -axis.museum -badajoz.museum -baghdad.museum -bahn.museum -bale.museum -baltimore.museum -barcelona.museum -baseball.museum -basel.museum -baths.museum -bauern.museum -beauxarts.museum -beeldengeluid.museum -bellevue.museum -bergbau.museum -berkeley.museum -berlin.museum -bern.museum -bible.museum -bilbao.museum -bill.museum -birdart.museum -birthplace.museum -bonn.museum -boston.museum -botanical.museum -botanicalgarden.museum -botanicgarden.museum -botany.museum -brandywinevalley.museum -brasil.museum -bristol.museum -british.museum -britishcolumbia.museum -broadcast.museum -brunel.museum -brussel.museum -brussels.museum -bruxelles.museum -building.museum -burghof.museum -bus.museum -bushey.museum -cadaques.museum -california.museum -cambridge.museum -can.museum -canada.museum -capebreton.museum -carrier.museum -cartoonart.museum -casadelamoneda.museum -castle.museum -castres.museum -celtic.museum -center.museum -chattanooga.museum -cheltenham.museum -chesapeakebay.museum -chicago.museum -children.museum -childrens.museum -childrensgarden.museum -chiropractic.museum -chocolate.museum -christiansburg.museum -cincinnati.museum -cinema.museum -circus.museum -civilisation.museum -civilization.museum -civilwar.museum -clinton.museum -clock.museum -coal.museum -coastaldefence.museum -cody.museum -coldwar.museum -collection.museum -colonialwilliamsburg.museum -coloradoplateau.museum -columbia.museum -columbus.museum -communication.museum -communications.museum -community.museum -computer.museum -computerhistory.museum -comunicações.museum -contemporary.museum -contemporaryart.museum -convent.museum -copenhagen.museum -corporation.museum -correios-e-telecomunicações.museum -corvette.museum -costume.museum -countryestate.museum -county.museum -crafts.museum -cranbrook.museum -creation.museum -cultural.museum -culturalcenter.museum -culture.museum -cyber.museum -cymru.museum -dali.museum -dallas.museum -database.museum -ddr.museum -decorativearts.museum -delaware.museum -delmenhorst.museum -denmark.museum -depot.museum -design.museum -detroit.museum -dinosaur.museum -discovery.museum -dolls.museum -donostia.museum -durham.museum -eastafrica.museum -eastcoast.museum -education.museum -educational.museum -egyptian.museum -eisenbahn.museum -elburg.museum -elvendrell.museum -embroidery.museum -encyclopedic.museum -england.museum -entomology.museum -environment.museum -environmentalconservation.museum -epilepsy.museum -essex.museum -estate.museum -ethnology.museum -exeter.museum -exhibition.museum -family.museum -farm.museum -farmequipment.museum -farmers.museum -farmstead.museum -field.museum -figueres.museum -filatelia.museum -film.museum -fineart.museum -finearts.museum -finland.museum -flanders.museum -florida.museum -force.museum -fortmissoula.museum -fortworth.museum -foundation.museum -francaise.museum -frankfurt.museum -franziskaner.museum -freemasonry.museum -freiburg.museum -fribourg.museum -frog.museum -fundacio.museum -furniture.museum -gallery.museum -garden.museum -gateway.museum -geelvinck.museum -gemological.museum -geology.museum -georgia.museum -giessen.museum -glas.museum -glass.museum -gorge.museum -grandrapids.museum -graz.museum -guernsey.museum -halloffame.museum -hamburg.museum -handson.museum -harvestcelebration.museum -hawaii.museum -health.museum -heimatunduhren.museum -hellas.museum -helsinki.museum -hembygdsforbund.museum -heritage.museum -histoire.museum -historical.museum -historicalsociety.museum -historichouses.museum -historisch.museum -historisches.museum -history.museum -historyofscience.museum -horology.museum -house.museum -humanities.museum -illustration.museum -imageandsound.museum -indian.museum -indiana.museum -indianapolis.museum -indianmarket.museum -intelligence.museum -interactive.museum -iraq.museum -iron.museum -isleofman.museum -jamison.museum -jefferson.museum -jerusalem.museum -jewelry.museum -jewish.museum -jewishart.museum -jfk.museum -journalism.museum -judaica.museum -judygarland.museum -juedisches.museum -juif.museum -karate.museum -karikatur.museum -kids.museum -koebenhavn.museum -koeln.museum -kunst.museum -kunstsammlung.museum -kunstunddesign.museum -labor.museum -labour.museum -lajolla.museum -lancashire.museum -landes.museum -lans.museum -läns.museum -larsson.museum -lewismiller.museum -lincoln.museum -linz.museum -living.museum -livinghistory.museum -localhistory.museum -london.museum -losangeles.museum -louvre.museum -loyalist.museum -lucerne.museum -luxembourg.museum -luzern.museum -mad.museum -madrid.museum -mallorca.museum -manchester.museum -mansion.museum -mansions.museum -manx.museum -marburg.museum -maritime.museum -maritimo.museum -maryland.museum -marylhurst.museum -media.museum -medical.museum -medizinhistorisches.museum -meeres.museum -memorial.museum -mesaverde.museum -michigan.museum -midatlantic.museum -military.museum -mill.museum -miners.museum -mining.museum -minnesota.museum -missile.museum -missoula.museum -modern.museum -moma.museum -money.museum -monmouth.museum -monticello.museum -montreal.museum -moscow.museum -motorcycle.museum -muenchen.museum -muenster.museum -mulhouse.museum -muncie.museum -museet.museum -museumcenter.museum -museumvereniging.museum -music.museum -national.museum -nationalfirearms.museum -nationalheritage.museum -nativeamerican.museum -naturalhistory.museum -naturalhistorymuseum.museum -naturalsciences.museum -nature.museum -naturhistorisches.museum -natuurwetenschappen.museum -naumburg.museum -naval.museum -nebraska.museum -neues.museum -newhampshire.museum -newjersey.museum -newmexico.museum -newport.museum -newspaper.museum -newyork.museum -niepce.museum -norfolk.museum -north.museum -nrw.museum -nuernberg.museum -nuremberg.museum -nyc.museum -nyny.museum -oceanographic.museum -oceanographique.museum -omaha.museum -online.museum -ontario.museum -openair.museum -oregon.museum -oregontrail.museum -otago.museum -oxford.museum -pacific.museum -paderborn.museum -palace.museum -paleo.museum -palmsprings.museum -panama.museum -paris.museum -pasadena.museum -pharmacy.museum -philadelphia.museum -philadelphiaarea.museum -philately.museum -phoenix.museum -photography.museum -pilots.museum -pittsburgh.museum -planetarium.museum -plantation.museum -plants.museum -plaza.museum -portal.museum -portland.museum -portlligat.museum -posts-and-telecommunications.museum -preservation.museum -presidio.museum -press.museum -project.museum -public.museum -pubol.museum -quebec.museum -railroad.museum -railway.museum -research.museum -resistance.museum -riodejaneiro.museum -rochester.museum -rockart.museum -roma.museum -russia.museum -saintlouis.museum -salem.museum -salvadordali.museum -salzburg.museum -sandiego.museum -sanfrancisco.museum -santabarbara.museum -santacruz.museum -santafe.museum -saskatchewan.museum -satx.museum -savannahga.museum -schlesisches.museum -schoenbrunn.museum -schokoladen.museum -school.museum -schweiz.museum -science.museum -scienceandhistory.museum -scienceandindustry.museum -sciencecenter.museum -sciencecenters.museum -science-fiction.museum -sciencehistory.museum -sciences.museum -sciencesnaturelles.museum -scotland.museum -seaport.museum -settlement.museum -settlers.museum -shell.museum -sherbrooke.museum -sibenik.museum -silk.museum -ski.museum -skole.museum -society.museum -sologne.museum -soundandvision.museum -southcarolina.museum -southwest.museum -space.museum -spy.museum -square.museum -stadt.museum -stalbans.museum -starnberg.museum -state.museum -stateofdelaware.museum -station.museum -steam.museum -steiermark.museum -stjohn.museum -stockholm.museum -stpetersburg.museum -stuttgart.museum -suisse.museum -surgeonshall.museum -surrey.museum -svizzera.museum -sweden.museum -sydney.museum -tank.museum -tcm.museum -technology.museum -telekommunikation.museum -television.museum -texas.museum -textile.museum -theater.museum -time.museum -timekeeping.museum -topology.museum -torino.museum -touch.museum -town.museum -transport.museum -tree.museum -trolley.museum -trust.museum -trustee.museum -uhren.museum -ulm.museum -undersea.museum -university.museum -usa.museum -usantiques.museum -usarts.museum -uscountryestate.museum -usculture.museum -usdecorativearts.museum -usgarden.museum -ushistory.museum -ushuaia.museum -uslivinghistory.museum -utah.museum -uvic.museum -valley.museum -vantaa.museum -versailles.museum -viking.museum -village.museum -virginia.museum -virtual.museum -virtuel.museum -vlaanderen.museum -volkenkunde.museum -wales.museum -wallonie.museum -war.museum -washingtondc.museum -watchandclock.museum -watch-and-clock.museum -western.museum -westfalen.museum -whaling.museum -wildlife.museum -williamsburg.museum -windmill.museum -workshop.museum -york.museum -yorkshire.museum -yosemite.museum -youth.museum -zoological.museum -zoology.museum -ירושלים.museum -иком.museum - -// mv : https://en.wikipedia.org/wiki/.mv -// "mv" included because, contra Wikipedia, google.mv exists. -mv -aero.mv -biz.mv -com.mv -coop.mv -edu.mv -gov.mv -info.mv -int.mv -mil.mv -museum.mv -name.mv -net.mv -org.mv -pro.mv - -// mw : http://www.registrar.mw/ -mw -ac.mw -biz.mw -co.mw -com.mw -coop.mw -edu.mw -gov.mw -int.mw -museum.mw -net.mw -org.mw - -// mx : http://www.nic.mx/ -// Submitted by registry -mx -com.mx -org.mx -gob.mx -edu.mx -net.mx - -// my : http://www.mynic.net.my/ -my -com.my -net.my -org.my -gov.my -edu.my -mil.my -name.my - -// mz : http://www.uem.mz/ -// Submitted by registry -mz -ac.mz -adv.mz -co.mz -edu.mz -gov.mz -mil.mz -net.mz -org.mz - -// na : http://www.na-nic.com.na/ -// http://www.info.na/domain/ -na -info.na -pro.na -name.na -school.na -or.na -dr.na -us.na -mx.na -ca.na -in.na -cc.na -tv.na -ws.na -mobi.na -co.na -com.na -org.na - -// name : has 2nd-level tlds, but there's no list of them -name - -// nc : http://www.cctld.nc/ -nc -asso.nc -nom.nc - -// ne : https://en.wikipedia.org/wiki/.ne -ne - -// net : https://en.wikipedia.org/wiki/.net -net - -// nf : https://en.wikipedia.org/wiki/.nf -nf -com.nf -net.nf -per.nf -rec.nf -web.nf -arts.nf -firm.nf -info.nf -other.nf -store.nf - -// ng : http://www.nira.org.ng/index.php/join-us/register-ng-domain/189-nira-slds -ng -com.ng -edu.ng -gov.ng -i.ng -mil.ng -mobi.ng -name.ng -net.ng -org.ng -sch.ng - -// ni : http://www.nic.ni/ -ni -ac.ni -biz.ni -co.ni -com.ni -edu.ni -gob.ni -in.ni -info.ni -int.ni -mil.ni -net.ni -nom.ni -org.ni -web.ni - -// nl : https://en.wikipedia.org/wiki/.nl -// https://www.sidn.nl/ -// ccTLD for the Netherlands -nl - -// BV.nl will be a registry for dutch BV's (besloten vennootschap) -bv.nl - -// no : http://www.norid.no/regelverk/index.en.html -// The Norwegian registry has declined to notify us of updates. The web pages -// referenced below are the official source of the data. There is also an -// announce mailing list: -// https://postlister.uninett.no/sympa/info/norid-diskusjon -no -// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html -fhs.no -vgs.no -fylkesbibl.no -folkebibl.no -museum.no -idrett.no -priv.no -// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html -mil.no -stat.no -dep.no -kommune.no -herad.no -// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html -// counties -aa.no -ah.no -bu.no -fm.no -hl.no -hm.no -jan-mayen.no -mr.no -nl.no -nt.no -of.no -ol.no -oslo.no -rl.no -sf.no -st.no -svalbard.no -tm.no -tr.no -va.no -vf.no -// primary and lower secondary schools per county -gs.aa.no -gs.ah.no -gs.bu.no -gs.fm.no -gs.hl.no -gs.hm.no -gs.jan-mayen.no -gs.mr.no -gs.nl.no -gs.nt.no -gs.of.no -gs.ol.no -gs.oslo.no -gs.rl.no -gs.sf.no -gs.st.no -gs.svalbard.no -gs.tm.no -gs.tr.no -gs.va.no -gs.vf.no -// cities -akrehamn.no -åkrehamn.no -algard.no -ålgård.no -arna.no -brumunddal.no -bryne.no -bronnoysund.no -brønnøysund.no -drobak.no -drøbak.no -egersund.no -fetsund.no -floro.no -florø.no -fredrikstad.no -hokksund.no -honefoss.no -hønefoss.no -jessheim.no -jorpeland.no -jørpeland.no -kirkenes.no -kopervik.no -krokstadelva.no -langevag.no -langevåg.no -leirvik.no -mjondalen.no -mjøndalen.no -mo-i-rana.no -mosjoen.no -mosjøen.no -nesoddtangen.no -orkanger.no -osoyro.no -osøyro.no -raholt.no -råholt.no -sandnessjoen.no -sandnessjøen.no -skedsmokorset.no -slattum.no -spjelkavik.no -stathelle.no -stavern.no -stjordalshalsen.no -stjørdalshalsen.no -tananger.no -tranby.no -vossevangen.no -// communities -afjord.no -åfjord.no -agdenes.no -al.no -ål.no -alesund.no -ålesund.no -alstahaug.no -alta.no -áltá.no -alaheadju.no -álaheadju.no -alvdal.no -amli.no -åmli.no -amot.no -åmot.no -andebu.no -andoy.no -andøy.no -andasuolo.no -ardal.no -årdal.no -aremark.no -arendal.no -ås.no -aseral.no -åseral.no -asker.no -askim.no -askvoll.no -askoy.no -askøy.no -asnes.no -åsnes.no -audnedaln.no -aukra.no -aure.no -aurland.no -aurskog-holand.no -aurskog-høland.no -austevoll.no -austrheim.no -averoy.no -averøy.no -balestrand.no -ballangen.no -balat.no -bálát.no -balsfjord.no -bahccavuotna.no -báhccavuotna.no -bamble.no -bardu.no -beardu.no -beiarn.no -bajddar.no -bájddar.no -baidar.no -báidár.no -berg.no -bergen.no -berlevag.no -berlevåg.no -bearalvahki.no -bearalváhki.no -bindal.no -birkenes.no -bjarkoy.no -bjarkøy.no -bjerkreim.no -bjugn.no -bodo.no -bodø.no -badaddja.no -bådåddjå.no -budejju.no -bokn.no -bremanger.no -bronnoy.no -brønnøy.no -bygland.no -bykle.no -barum.no -bærum.no -bo.telemark.no -bø.telemark.no -bo.nordland.no -bø.nordland.no -bievat.no -bievát.no -bomlo.no -bømlo.no -batsfjord.no -båtsfjord.no -bahcavuotna.no -báhcavuotna.no -dovre.no -drammen.no -drangedal.no -dyroy.no -dyrøy.no -donna.no -dønna.no -eid.no -eidfjord.no -eidsberg.no -eidskog.no -eidsvoll.no -eigersund.no -elverum.no -enebakk.no -engerdal.no -etne.no -etnedal.no -evenes.no -evenassi.no -evenášši.no -evje-og-hornnes.no -farsund.no -fauske.no -fuossko.no -fuoisku.no -fedje.no -fet.no -finnoy.no -finnøy.no -fitjar.no -fjaler.no -fjell.no -flakstad.no -flatanger.no -flekkefjord.no -flesberg.no -flora.no -fla.no -flå.no -folldal.no -forsand.no -fosnes.no -frei.no -frogn.no -froland.no -frosta.no -frana.no -fræna.no -froya.no -frøya.no -fusa.no -fyresdal.no -forde.no -førde.no -gamvik.no -gangaviika.no -gáŋgaviika.no -gaular.no -gausdal.no -gildeskal.no -gildeskål.no -giske.no -gjemnes.no -gjerdrum.no -gjerstad.no -gjesdal.no -gjovik.no -gjøvik.no -gloppen.no -gol.no -gran.no -grane.no -granvin.no -gratangen.no -grimstad.no -grong.no -kraanghke.no -kråanghke.no -grue.no -gulen.no -hadsel.no -halden.no -halsa.no -hamar.no -hamaroy.no -habmer.no -hábmer.no -hapmir.no -hápmir.no -hammerfest.no -hammarfeasta.no -hámmárfeasta.no -haram.no -hareid.no -harstad.no -hasvik.no -aknoluokta.no -ákŋoluokta.no -hattfjelldal.no -aarborte.no -haugesund.no -hemne.no -hemnes.no -hemsedal.no -heroy.more-og-romsdal.no -herøy.møre-og-romsdal.no -heroy.nordland.no -herøy.nordland.no -hitra.no -hjartdal.no -hjelmeland.no -hobol.no -hobøl.no -hof.no -hol.no -hole.no -holmestrand.no -holtalen.no -holtålen.no -hornindal.no -horten.no -hurdal.no -hurum.no -hvaler.no -hyllestad.no -hagebostad.no -hægebostad.no -hoyanger.no -høyanger.no -hoylandet.no -høylandet.no -ha.no -hå.no -ibestad.no -inderoy.no -inderøy.no -iveland.no -jevnaker.no -jondal.no -jolster.no -jølster.no -karasjok.no -karasjohka.no -kárášjohka.no -karlsoy.no -galsa.no -gálsá.no -karmoy.no -karmøy.no -kautokeino.no -guovdageaidnu.no -klepp.no -klabu.no -klæbu.no -kongsberg.no -kongsvinger.no -kragero.no -kragerø.no -kristiansand.no -kristiansund.no -krodsherad.no -krødsherad.no -kvalsund.no -rahkkeravju.no -ráhkkerávju.no -kvam.no -kvinesdal.no -kvinnherad.no -kviteseid.no -kvitsoy.no -kvitsøy.no -kvafjord.no -kvæfjord.no -giehtavuoatna.no -kvanangen.no -kvænangen.no -navuotna.no -návuotna.no -kafjord.no -kåfjord.no -gaivuotna.no -gáivuotna.no -larvik.no -lavangen.no -lavagis.no -loabat.no -loabát.no -lebesby.no -davvesiida.no -leikanger.no -leirfjord.no -leka.no -leksvik.no -lenvik.no -leangaviika.no -leaŋgaviika.no -lesja.no -levanger.no -lier.no -lierne.no -lillehammer.no -lillesand.no -lindesnes.no -lindas.no -lindås.no -lom.no -loppa.no -lahppi.no -láhppi.no -lund.no -lunner.no -luroy.no -lurøy.no -luster.no -lyngdal.no -lyngen.no -ivgu.no -lardal.no -lerdal.no -lærdal.no -lodingen.no -lødingen.no -lorenskog.no -lørenskog.no -loten.no -løten.no -malvik.no -masoy.no -måsøy.no -muosat.no -muosát.no -mandal.no -marker.no -marnardal.no -masfjorden.no -meland.no -meldal.no -melhus.no -meloy.no -meløy.no -meraker.no -meråker.no -moareke.no -moåreke.no -midsund.no -midtre-gauldal.no -modalen.no -modum.no -molde.no -moskenes.no -moss.no -mosvik.no -malselv.no -målselv.no -malatvuopmi.no -málatvuopmi.no -namdalseid.no -aejrie.no -namsos.no -namsskogan.no -naamesjevuemie.no -nååmesjevuemie.no -laakesvuemie.no -nannestad.no -narvik.no -narviika.no -naustdal.no -nedre-eiker.no -nes.akershus.no -nes.buskerud.no -nesna.no -nesodden.no -nesseby.no -unjarga.no -unjárga.no -nesset.no -nissedal.no -nittedal.no -nord-aurdal.no -nord-fron.no -nord-odal.no -norddal.no -nordkapp.no -davvenjarga.no -davvenjárga.no -nordre-land.no -nordreisa.no -raisa.no -ráisa.no -nore-og-uvdal.no -notodden.no -naroy.no -nærøy.no -notteroy.no -nøtterøy.no -odda.no -oksnes.no -øksnes.no -oppdal.no -oppegard.no -oppegård.no -orkdal.no -orland.no -ørland.no -orskog.no -ørskog.no -orsta.no -ørsta.no -os.hedmark.no -os.hordaland.no -osen.no -osteroy.no -osterøy.no -ostre-toten.no -østre-toten.no -overhalla.no -ovre-eiker.no -øvre-eiker.no -oyer.no -øyer.no -oygarden.no -øygarden.no -oystre-slidre.no -øystre-slidre.no -porsanger.no -porsangu.no -porsáŋgu.no -porsgrunn.no -radoy.no -radøy.no -rakkestad.no -rana.no -ruovat.no -randaberg.no -rauma.no -rendalen.no -rennebu.no -rennesoy.no -rennesøy.no -rindal.no -ringebu.no -ringerike.no -ringsaker.no -rissa.no -risor.no -risør.no -roan.no -rollag.no -rygge.no -ralingen.no -rælingen.no -rodoy.no -rødøy.no -romskog.no -rømskog.no -roros.no -røros.no -rost.no -røst.no -royken.no -røyken.no -royrvik.no -røyrvik.no -rade.no -råde.no -salangen.no -siellak.no -saltdal.no -salat.no -sálát.no -sálat.no -samnanger.no -sande.more-og-romsdal.no -sande.møre-og-romsdal.no -sande.vestfold.no -sandefjord.no -sandnes.no -sandoy.no -sandøy.no -sarpsborg.no -sauda.no -sauherad.no -sel.no -selbu.no -selje.no -seljord.no -sigdal.no -siljan.no -sirdal.no -skaun.no -skedsmo.no -ski.no -skien.no -skiptvet.no -skjervoy.no -skjervøy.no -skierva.no -skiervá.no -skjak.no -skjåk.no -skodje.no -skanland.no -skånland.no -skanit.no -skánit.no -smola.no -smøla.no -snillfjord.no -snasa.no -snåsa.no -snoasa.no -snaase.no -snåase.no -sogndal.no -sokndal.no -sola.no -solund.no -songdalen.no -sortland.no -spydeberg.no -stange.no -stavanger.no -steigen.no -steinkjer.no -stjordal.no -stjørdal.no -stokke.no -stor-elvdal.no -stord.no -stordal.no -storfjord.no -omasvuotna.no -strand.no -stranda.no -stryn.no -sula.no -suldal.no -sund.no -sunndal.no -surnadal.no -sveio.no -svelvik.no -sykkylven.no -sogne.no -søgne.no -somna.no -sømna.no -sondre-land.no -søndre-land.no -sor-aurdal.no -sør-aurdal.no -sor-fron.no -sør-fron.no -sor-odal.no -sør-odal.no -sor-varanger.no -sør-varanger.no -matta-varjjat.no -mátta-várjjat.no -sorfold.no -sørfold.no -sorreisa.no -sørreisa.no -sorum.no -sørum.no -tana.no -deatnu.no -time.no -tingvoll.no -tinn.no -tjeldsund.no -dielddanuorri.no -tjome.no -tjøme.no -tokke.no -tolga.no -torsken.no -tranoy.no -tranøy.no -tromso.no -tromsø.no -tromsa.no -romsa.no -trondheim.no -troandin.no -trysil.no -trana.no -træna.no -trogstad.no -trøgstad.no -tvedestrand.no -tydal.no -tynset.no -tysfjord.no -divtasvuodna.no -divttasvuotna.no -tysnes.no -tysvar.no -tysvær.no -tonsberg.no -tønsberg.no -ullensaker.no -ullensvang.no -ulvik.no -utsira.no -vadso.no -vadsø.no -cahcesuolo.no -čáhcesuolo.no -vaksdal.no -valle.no -vang.no -vanylven.no -vardo.no -vardø.no -varggat.no -várggát.no -vefsn.no -vaapste.no -vega.no -vegarshei.no -vegårshei.no -vennesla.no -verdal.no -verran.no -vestby.no -vestnes.no -vestre-slidre.no -vestre-toten.no -vestvagoy.no -vestvågøy.no -vevelstad.no -vik.no -vikna.no -vindafjord.no -volda.no -voss.no -varoy.no -værøy.no -vagan.no -vågan.no -voagat.no -vagsoy.no -vågsøy.no -vaga.no -vågå.no -valer.ostfold.no -våler.østfold.no -valer.hedmark.no -våler.hedmark.no - -// np : http://www.mos.com.np/register.html -*.np - -// nr : http://cenpac.net.nr/dns/index.html -// Submitted by registry -nr -biz.nr -info.nr -gov.nr -edu.nr -org.nr -net.nr -com.nr - -// nu : https://en.wikipedia.org/wiki/.nu -nu - -// nz : https://en.wikipedia.org/wiki/.nz -// Submitted by registry -nz -ac.nz -co.nz -cri.nz -geek.nz -gen.nz -govt.nz -health.nz -iwi.nz -kiwi.nz -maori.nz -mil.nz -māori.nz -net.nz -org.nz -parliament.nz -school.nz - -// om : https://en.wikipedia.org/wiki/.om -om -co.om -com.om -edu.om -gov.om -med.om -museum.om -net.om -org.om -pro.om - -// onion : https://tools.ietf.org/html/rfc7686 -onion - -// org : https://en.wikipedia.org/wiki/.org -org - -// pa : http://www.nic.pa/ -// Some additional second level "domains" resolve directly as hostnames, such as -// pannet.pa, so we add a rule for "pa". -pa -ac.pa -gob.pa -com.pa -org.pa -sld.pa -edu.pa -net.pa -ing.pa -abo.pa -med.pa -nom.pa - -// pe : https://www.nic.pe/InformeFinalComision.pdf -pe -edu.pe -gob.pe -nom.pe -mil.pe -org.pe -com.pe -net.pe - -// pf : http://www.gobin.info/domainname/formulaire-pf.pdf -pf -com.pf -org.pf -edu.pf - -// pg : https://en.wikipedia.org/wiki/.pg -*.pg - -// ph : http://www.domains.ph/FAQ2.asp -// Submitted by registry -ph -com.ph -net.ph -org.ph -gov.ph -edu.ph -ngo.ph -mil.ph -i.ph - -// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK -pk -com.pk -net.pk -edu.pk -org.pk -fam.pk -biz.pk -web.pk -gov.pk -gob.pk -gok.pk -gon.pk -gop.pk -gos.pk -info.pk - -// pl http://www.dns.pl/english/index.html -// Submitted by registry -pl -com.pl -net.pl -org.pl -// pl functional domains (http://www.dns.pl/english/index.html) -aid.pl -agro.pl -atm.pl -auto.pl -biz.pl -edu.pl -gmina.pl -gsm.pl -info.pl -mail.pl -miasta.pl -media.pl -mil.pl -nieruchomosci.pl -nom.pl -pc.pl -powiat.pl -priv.pl -realestate.pl -rel.pl -sex.pl -shop.pl -sklep.pl -sos.pl -szkola.pl -targi.pl -tm.pl -tourism.pl -travel.pl -turystyka.pl -// Government domains -gov.pl -ap.gov.pl -ic.gov.pl -is.gov.pl -us.gov.pl -kmpsp.gov.pl -kppsp.gov.pl -kwpsp.gov.pl -psp.gov.pl -wskr.gov.pl -kwp.gov.pl -mw.gov.pl -ug.gov.pl -um.gov.pl -umig.gov.pl -ugim.gov.pl -upow.gov.pl -uw.gov.pl -starostwo.gov.pl -pa.gov.pl -po.gov.pl -psse.gov.pl -pup.gov.pl -rzgw.gov.pl -sa.gov.pl -so.gov.pl -sr.gov.pl -wsa.gov.pl -sko.gov.pl -uzs.gov.pl -wiih.gov.pl -winb.gov.pl -pinb.gov.pl -wios.gov.pl -witd.gov.pl -wzmiuw.gov.pl -piw.gov.pl -wiw.gov.pl -griw.gov.pl -wif.gov.pl -oum.gov.pl -sdn.gov.pl -zp.gov.pl -uppo.gov.pl -mup.gov.pl -wuoz.gov.pl -konsulat.gov.pl -oirm.gov.pl -// pl regional domains (http://www.dns.pl/english/index.html) -augustow.pl -babia-gora.pl -bedzin.pl -beskidy.pl -bialowieza.pl -bialystok.pl -bielawa.pl -bieszczady.pl -boleslawiec.pl -bydgoszcz.pl -bytom.pl -cieszyn.pl -czeladz.pl -czest.pl -dlugoleka.pl -elblag.pl -elk.pl -glogow.pl -gniezno.pl -gorlice.pl -grajewo.pl -ilawa.pl -jaworzno.pl -jelenia-gora.pl -jgora.pl -kalisz.pl -kazimierz-dolny.pl -karpacz.pl -kartuzy.pl -kaszuby.pl -katowice.pl -kepno.pl -ketrzyn.pl -klodzko.pl -kobierzyce.pl -kolobrzeg.pl -konin.pl -konskowola.pl -kutno.pl -lapy.pl -lebork.pl -legnica.pl -lezajsk.pl -limanowa.pl -lomza.pl -lowicz.pl -lubin.pl -lukow.pl -malbork.pl -malopolska.pl -mazowsze.pl -mazury.pl -mielec.pl -mielno.pl -mragowo.pl -naklo.pl -nowaruda.pl -nysa.pl -olawa.pl -olecko.pl -olkusz.pl -olsztyn.pl -opoczno.pl -opole.pl -ostroda.pl -ostroleka.pl -ostrowiec.pl -ostrowwlkp.pl -pila.pl -pisz.pl -podhale.pl -podlasie.pl -polkowice.pl -pomorze.pl -pomorskie.pl -prochowice.pl -pruszkow.pl -przeworsk.pl -pulawy.pl -radom.pl -rawa-maz.pl -rybnik.pl -rzeszow.pl -sanok.pl -sejny.pl -slask.pl -slupsk.pl -sosnowiec.pl -stalowa-wola.pl -skoczow.pl -starachowice.pl -stargard.pl -suwalki.pl -swidnica.pl -swiebodzin.pl -swinoujscie.pl -szczecin.pl -szczytno.pl -tarnobrzeg.pl -tgory.pl -turek.pl -tychy.pl -ustka.pl -walbrzych.pl -warmia.pl -warszawa.pl -waw.pl -wegrow.pl -wielun.pl -wlocl.pl -wloclawek.pl -wodzislaw.pl -wolomin.pl -wroclaw.pl -zachpomor.pl -zagan.pl -zarow.pl -zgora.pl -zgorzelec.pl - -// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf -pm - -// pn : http://www.government.pn/PnRegistry/policies.htm -pn -gov.pn -co.pn -org.pn -edu.pn -net.pn - -// post : https://en.wikipedia.org/wiki/.post -post - -// pr : http://www.nic.pr/index.asp?f=1 -pr -com.pr -net.pr -org.pr -gov.pr -edu.pr -isla.pr -pro.pr -biz.pr -info.pr -name.pr -// these aren't mentioned on nic.pr, but on https://en.wikipedia.org/wiki/.pr -est.pr -prof.pr -ac.pr - -// pro : http://registry.pro/get-pro -pro -aaa.pro -aca.pro -acct.pro -avocat.pro -bar.pro -cpa.pro -eng.pro -jur.pro -law.pro -med.pro -recht.pro - -// ps : https://en.wikipedia.org/wiki/.ps -// http://www.nic.ps/registration/policy.html#reg -ps -edu.ps -gov.ps -sec.ps -plo.ps -com.ps -org.ps -net.ps - -// pt : http://online.dns.pt/dns/start_dns -pt -net.pt -gov.pt -org.pt -edu.pt -int.pt -publ.pt -com.pt -nome.pt - -// pw : https://en.wikipedia.org/wiki/.pw -pw -co.pw -ne.pw -or.pw -ed.pw -go.pw -belau.pw - -// py : http://www.nic.py/pautas.html#seccion_9 -// Submitted by registry -py -com.py -coop.py -edu.py -gov.py -mil.py -net.py -org.py - -// qa : http://domains.qa/en/ -qa -com.qa -edu.qa -gov.qa -mil.qa -name.qa -net.qa -org.qa -sch.qa - -// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs -re -asso.re -com.re -nom.re - -// ro : http://www.rotld.ro/ -ro -arts.ro -com.ro -firm.ro -info.ro -nom.ro -nt.ro -org.ro -rec.ro -store.ro -tm.ro -www.ro - -// rs : https://www.rnids.rs/en/domains/national-domains -rs -ac.rs -co.rs -edu.rs -gov.rs -in.rs -org.rs - -// ru : https://cctld.ru/en/domains/domens_ru/reserved/ -ru -ac.ru -edu.ru -gov.ru -int.ru -mil.ru -test.ru - -// rw : http://www.nic.rw/cgi-bin/policy.pl -rw -gov.rw -net.rw -edu.rw -ac.rw -com.rw -co.rw -int.rw -mil.rw -gouv.rw - -// sa : http://www.nic.net.sa/ -sa -com.sa -net.sa -org.sa -gov.sa -med.sa -pub.sa -edu.sa -sch.sa - -// sb : http://www.sbnic.net.sb/ -// Submitted by registry -sb -com.sb -edu.sb -gov.sb -net.sb -org.sb - -// sc : http://www.nic.sc/ -sc -com.sc -gov.sc -net.sc -org.sc -edu.sc - -// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm -// Submitted by registry -sd -com.sd -net.sd -org.sd -edu.sd -med.sd -tv.sd -gov.sd -info.sd - -// se : https://en.wikipedia.org/wiki/.se -// Submitted by registry -se -a.se -ac.se -b.se -bd.se -brand.se -c.se -d.se -e.se -f.se -fh.se -fhsk.se -fhv.se -g.se -h.se -i.se -k.se -komforb.se -kommunalforbund.se -komvux.se -l.se -lanbib.se -m.se -n.se -naturbruksgymn.se -o.se -org.se -p.se -parti.se -pp.se -press.se -r.se -s.se -t.se -tm.se -u.se -w.se -x.se -y.se -z.se - -// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines -sg -com.sg -net.sg -org.sg -gov.sg -edu.sg -per.sg - -// sh : http://www.nic.sh/registrar.html -sh -com.sh -net.sh -gov.sh -org.sh -mil.sh - -// si : https://en.wikipedia.org/wiki/.si -si - -// sj : No registrations at this time. -// Submitted by registry -sj - -// sk : https://en.wikipedia.org/wiki/.sk -// list of 2nd level domains ? -sk - -// sl : http://www.nic.sl -// Submitted by registry -sl -com.sl -net.sl -edu.sl -gov.sl -org.sl - -// sm : https://en.wikipedia.org/wiki/.sm -sm - -// sn : https://en.wikipedia.org/wiki/.sn -sn -art.sn -com.sn -edu.sn -gouv.sn -org.sn -perso.sn -univ.sn - -// so : http://www.soregistry.com/ -so -com.so -net.so -org.so - -// sr : https://en.wikipedia.org/wiki/.sr -sr - -// st : http://www.nic.st/html/policyrules/ -st -co.st -com.st -consulado.st -edu.st -embaixada.st -gov.st -mil.st -net.st -org.st -principe.st -saotome.st -store.st - -// su : https://en.wikipedia.org/wiki/.su -su - -// sv : http://www.svnet.org.sv/niveldos.pdf -sv -com.sv -edu.sv -gob.sv -org.sv -red.sv - -// sx : https://en.wikipedia.org/wiki/.sx -// Submitted by registry -sx -gov.sx - -// sy : https://en.wikipedia.org/wiki/.sy -// see also: http://www.gobin.info/domainname/sy.doc -sy -edu.sy -gov.sy -net.sy -mil.sy -com.sy -org.sy - -// sz : https://en.wikipedia.org/wiki/.sz -// http://www.sispa.org.sz/ -sz -co.sz -ac.sz -org.sz - -// tc : https://en.wikipedia.org/wiki/.tc -tc - -// td : https://en.wikipedia.org/wiki/.td -td - -// tel: https://en.wikipedia.org/wiki/.tel -// http://www.telnic.org/ -tel - -// tf : https://en.wikipedia.org/wiki/.tf -tf - -// tg : https://en.wikipedia.org/wiki/.tg -// http://www.nic.tg/ -tg - -// th : https://en.wikipedia.org/wiki/.th -// Submitted by registry -th -ac.th -co.th -go.th -in.th -mi.th -net.th -or.th - -// tj : http://www.nic.tj/policy.html -tj -ac.tj -biz.tj -co.tj -com.tj -edu.tj -go.tj -gov.tj -int.tj -mil.tj -name.tj -net.tj -nic.tj -org.tj -test.tj -web.tj - -// tk : https://en.wikipedia.org/wiki/.tk -tk - -// tl : https://en.wikipedia.org/wiki/.tl -tl -gov.tl - -// tm : http://www.nic.tm/local.html -tm -com.tm -co.tm -org.tm -net.tm -nom.tm -gov.tm -mil.tm -edu.tm - -// tn : https://en.wikipedia.org/wiki/.tn -// http://whois.ati.tn/ -tn -com.tn -ens.tn -fin.tn -gov.tn -ind.tn -intl.tn -nat.tn -net.tn -org.tn -info.tn -perso.tn -tourism.tn -edunet.tn -rnrt.tn -rns.tn -rnu.tn -mincom.tn -agrinet.tn -defense.tn -turen.tn - -// to : https://en.wikipedia.org/wiki/.to -// Submitted by registry -to -com.to -gov.to -net.to -org.to -edu.to -mil.to - -// subTLDs: https://www.nic.tr/forms/eng/policies.pdf -// and: https://www.nic.tr/forms/politikalar.pdf -// Submitted by -tr -com.tr -info.tr -biz.tr -net.tr -org.tr -web.tr -gen.tr -tv.tr -av.tr -dr.tr -bbs.tr -name.tr -tel.tr -gov.tr -bel.tr -pol.tr -mil.tr -k12.tr -edu.tr -kep.tr - -// Used by Northern Cyprus -nc.tr - -// Used by government agencies of Northern Cyprus -gov.nc.tr - -// travel : https://en.wikipedia.org/wiki/.travel -travel - -// tt : http://www.nic.tt/ -tt -co.tt -com.tt -org.tt -net.tt -biz.tt -info.tt -pro.tt -int.tt -coop.tt -jobs.tt -mobi.tt -travel.tt -museum.tt -aero.tt -name.tt -gov.tt -edu.tt - -// tv : https://en.wikipedia.org/wiki/.tv -// Not listing any 2LDs as reserved since none seem to exist in practice, -// Wikipedia notwithstanding. -tv - -// tw : https://en.wikipedia.org/wiki/.tw -tw -edu.tw -gov.tw -mil.tw -com.tw -net.tw -org.tw -idv.tw -game.tw -ebiz.tw -club.tw -網路.tw -組織.tw -商業.tw - -// tz : http://www.tznic.or.tz/index.php/domains -// Submitted by registry -tz -ac.tz -co.tz -go.tz -hotel.tz -info.tz -me.tz -mil.tz -mobi.tz -ne.tz -or.tz -sc.tz -tv.tz - -// ua : https://hostmaster.ua/policy/?ua -// Submitted by registry -ua -// ua 2LD -com.ua -edu.ua -gov.ua -in.ua -net.ua -org.ua -// ua geographic names -// https://hostmaster.ua/2ld/ -cherkassy.ua -cherkasy.ua -chernigov.ua -chernihiv.ua -chernivtsi.ua -chernovtsy.ua -ck.ua -cn.ua -cr.ua -crimea.ua -cv.ua -dn.ua -dnepropetrovsk.ua -dnipropetrovsk.ua -dominic.ua -donetsk.ua -dp.ua -if.ua -ivano-frankivsk.ua -kh.ua -kharkiv.ua -kharkov.ua -kherson.ua -khmelnitskiy.ua -khmelnytskyi.ua -kiev.ua -kirovograd.ua -km.ua -kr.ua -krym.ua -ks.ua -kv.ua -kyiv.ua -lg.ua -lt.ua -lugansk.ua -lutsk.ua -lv.ua -lviv.ua -mk.ua -mykolaiv.ua -nikolaev.ua -od.ua -odesa.ua -odessa.ua -pl.ua -poltava.ua -rivne.ua -rovno.ua -rv.ua -sb.ua -sebastopol.ua -sevastopol.ua -sm.ua -sumy.ua -te.ua -ternopil.ua -uz.ua -uzhgorod.ua -vinnica.ua -vinnytsia.ua -vn.ua -volyn.ua -yalta.ua -zaporizhzhe.ua -zaporizhzhia.ua -zhitomir.ua -zhytomyr.ua -zp.ua -zt.ua - -// ug : https://www.registry.co.ug/ -ug -co.ug -or.ug -ac.ug -sc.ug -go.ug -ne.ug -com.ug -org.ug - -// uk : https://en.wikipedia.org/wiki/.uk -// Submitted by registry -uk -ac.uk -co.uk -gov.uk -ltd.uk -me.uk -net.uk -nhs.uk -org.uk -plc.uk -police.uk -*.sch.uk - -// us : https://en.wikipedia.org/wiki/.us -us -dni.us -fed.us -isa.us -kids.us -nsn.us -// us geographic names -ak.us -al.us -ar.us -as.us -az.us -ca.us -co.us -ct.us -dc.us -de.us -fl.us -ga.us -gu.us -hi.us -ia.us -id.us -il.us -in.us -ks.us -ky.us -la.us -ma.us -md.us -me.us -mi.us -mn.us -mo.us -ms.us -mt.us -nc.us -nd.us -ne.us -nh.us -nj.us -nm.us -nv.us -ny.us -oh.us -ok.us -or.us -pa.us -pr.us -ri.us -sc.us -sd.us -tn.us -tx.us -ut.us -vi.us -vt.us -va.us -wa.us -wi.us -wv.us -wy.us -// The registrar notes several more specific domains available in each state, -// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat -// haphazard; in some states these domains resolve as addresses, while in others -// only subdomains are available, or even nothing at all. We include the -// most common ones where it's clear that different sites are different -// entities. -k12.ak.us -k12.al.us -k12.ar.us -k12.as.us -k12.az.us -k12.ca.us -k12.co.us -k12.ct.us -k12.dc.us -k12.de.us -k12.fl.us -k12.ga.us -k12.gu.us -// k12.hi.us Bug 614565 - Hawaii has a state-wide DOE login -k12.ia.us -k12.id.us -k12.il.us -k12.in.us -k12.ks.us -k12.ky.us -k12.la.us -k12.ma.us -k12.md.us -k12.me.us -k12.mi.us -k12.mn.us -k12.mo.us -k12.ms.us -k12.mt.us -k12.nc.us -// k12.nd.us Bug 1028347 - Removed at request of Travis Rosso -k12.ne.us -k12.nh.us -k12.nj.us -k12.nm.us -k12.nv.us -k12.ny.us -k12.oh.us -k12.ok.us -k12.or.us -k12.pa.us -k12.pr.us -k12.ri.us -k12.sc.us -// k12.sd.us Bug 934131 - Removed at request of James Booze -k12.tn.us -k12.tx.us -k12.ut.us -k12.vi.us -k12.vt.us -k12.va.us -k12.wa.us -k12.wi.us -// k12.wv.us Bug 947705 - Removed at request of Verne Britton -k12.wy.us -cc.ak.us -cc.al.us -cc.ar.us -cc.as.us -cc.az.us -cc.ca.us -cc.co.us -cc.ct.us -cc.dc.us -cc.de.us -cc.fl.us -cc.ga.us -cc.gu.us -cc.hi.us -cc.ia.us -cc.id.us -cc.il.us -cc.in.us -cc.ks.us -cc.ky.us -cc.la.us -cc.ma.us -cc.md.us -cc.me.us -cc.mi.us -cc.mn.us -cc.mo.us -cc.ms.us -cc.mt.us -cc.nc.us -cc.nd.us -cc.ne.us -cc.nh.us -cc.nj.us -cc.nm.us -cc.nv.us -cc.ny.us -cc.oh.us -cc.ok.us -cc.or.us -cc.pa.us -cc.pr.us -cc.ri.us -cc.sc.us -cc.sd.us -cc.tn.us -cc.tx.us -cc.ut.us -cc.vi.us -cc.vt.us -cc.va.us -cc.wa.us -cc.wi.us -cc.wv.us -cc.wy.us -lib.ak.us -lib.al.us -lib.ar.us -lib.as.us -lib.az.us -lib.ca.us -lib.co.us -lib.ct.us -lib.dc.us -// lib.de.us Issue #243 - Moved to Private section at request of Ed Moore -lib.fl.us -lib.ga.us -lib.gu.us -lib.hi.us -lib.ia.us -lib.id.us -lib.il.us -lib.in.us -lib.ks.us -lib.ky.us -lib.la.us -lib.ma.us -lib.md.us -lib.me.us -lib.mi.us -lib.mn.us -lib.mo.us -lib.ms.us -lib.mt.us -lib.nc.us -lib.nd.us -lib.ne.us -lib.nh.us -lib.nj.us -lib.nm.us -lib.nv.us -lib.ny.us -lib.oh.us -lib.ok.us -lib.or.us -lib.pa.us -lib.pr.us -lib.ri.us -lib.sc.us -lib.sd.us -lib.tn.us -lib.tx.us -lib.ut.us -lib.vi.us -lib.vt.us -lib.va.us -lib.wa.us -lib.wi.us -// lib.wv.us Bug 941670 - Removed at request of Larry W Arnold -lib.wy.us -// k12.ma.us contains school districts in Massachusetts. The 4LDs are -// managed independently except for private (PVT), charter (CHTR) and -// parochial (PAROCH) schools. Those are delegated directly to the -// 5LD operators. -pvt.k12.ma.us -chtr.k12.ma.us -paroch.k12.ma.us -// Merit Network, Inc. maintains the registry for =~ /(k12|cc|lib).mi.us/ and the following -// see also: http://domreg.merit.edu -// see also: whois -h whois.domreg.merit.edu help -ann-arbor.mi.us -cog.mi.us -dst.mi.us -eaton.mi.us -gen.mi.us -mus.mi.us -tec.mi.us -washtenaw.mi.us - -// uy : http://www.nic.org.uy/ -uy -com.uy -edu.uy -gub.uy -mil.uy -net.uy -org.uy - -// uz : http://www.reg.uz/ -uz -co.uz -com.uz -net.uz -org.uz - -// va : https://en.wikipedia.org/wiki/.va -va - -// vc : https://en.wikipedia.org/wiki/.vc -// Submitted by registry -vc -com.vc -net.vc -org.vc -gov.vc -mil.vc -edu.vc - -// ve : https://registro.nic.ve/ -// Submitted by registry -ve -arts.ve -co.ve -com.ve -e12.ve -edu.ve -firm.ve -gob.ve -gov.ve -info.ve -int.ve -mil.ve -net.ve -org.ve -rec.ve -store.ve -tec.ve -web.ve - -// vg : https://en.wikipedia.org/wiki/.vg -vg - -// vi : http://www.nic.vi/newdomainform.htm -// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other -// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they -// are available for registration (which they do not seem to be). -vi -co.vi -com.vi -k12.vi -net.vi -org.vi - -// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp -vn -com.vn -net.vn -org.vn -edu.vn -gov.vn -int.vn -ac.vn -biz.vn -info.vn -name.vn -pro.vn -health.vn - -// vu : https://en.wikipedia.org/wiki/.vu -// http://www.vunic.vu/ -vu -com.vu -edu.vu -net.vu -org.vu - -// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf -wf - -// ws : https://en.wikipedia.org/wiki/.ws -// http://samoanic.ws/index.dhtml -ws -com.ws -net.ws -org.ws -gov.ws -edu.ws - -// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf -yt - -// IDN ccTLDs -// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then -// U-label, and follow this format: -// // A-Label ("", [, variant info]) : -// // [sponsoring org] -// U-Label - -// xn--mgbaam7a8h ("Emerat", Arabic) : AE -// http://nic.ae/english/arabicdomain/rules.jsp -امارات - -// xn--y9a3aq ("hye", Armenian) : AM -// ISOC AM (operated by .am Registry) -հայ - -// xn--54b7fta0cc ("Bangla", Bangla) : BD -বাংলা - -// xn--90ae ("bg", Bulgarian) : BG -бг - -// xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY -// Operated by .by registry -бел - -// xn--fiqs8s ("Zhongguo/China", Chinese, Simplified) : CN -// CNNIC -// http://cnnic.cn/html/Dir/2005/10/11/3218.htm -中国 - -// xn--fiqz9s ("Zhongguo/China", Chinese, Traditional) : CN -// CNNIC -// http://cnnic.cn/html/Dir/2005/10/11/3218.htm -中國 - -// xn--lgbbat1ad8j ("Algeria/Al Jazair", Arabic) : DZ -الجزائر - -// xn--wgbh1c ("Egypt/Masr", Arabic) : EG -// http://www.dotmasr.eg/ -مصر - -// xn--e1a4c ("eu", Cyrillic) : EU -ею - -// xn--node ("ge", Georgian Mkhedruli) : GE -გე - -// xn--qxam ("el", Greek) : GR -// Hellenic Ministry of Infrastructure, Transport, and Networks -ελ - -// xn--j6w193g ("Hong Kong", Chinese) : HK -// https://www2.hkirc.hk/register/rules.jsp -香港 - -// xn--2scrj9c ("Bharat", Kannada) : IN -// India -ಭಾರತ - -// xn--3hcrj9c ("Bharat", Oriya) : IN -// India -ଭାରତ - -// xn--45br5cyl ("Bharatam", Assamese) : IN -// India -ভাৰত - -// xn--h2breg3eve ("Bharatam", Sanskrit) : IN -// India -भारतम् - -// xn--h2brj9c8c ("Bharot", Santali) : IN -// India -भारोत - -// xn--mgbgu82a ("Bharat", Sindhi) : IN -// India -ڀارت - -// xn--rvc1e0am3e ("Bharatam", Malayalam) : IN -// India -ഭാരതം - -// xn--h2brj9c ("Bharat", Devanagari) : IN -// India -भारत - -// xn--mgbbh1a71e ("Bharat", Arabic) : IN -// India -بھارت - -// xn--fpcrj9c3d ("Bharat", Telugu) : IN -// India -భారత్ - -// xn--gecrj9c ("Bharat", Gujarati) : IN -// India -ભારત - -// xn--s9brj9c ("Bharat", Gurmukhi) : IN -// India -ਭਾਰਤ - -// xn--45brj9c ("Bharat", Bengali) : IN -// India -ভারত - -// xn--xkc2dl3a5ee0h ("India", Tamil) : IN -// India -இந்தியா - -// xn--mgba3a4f16a ("Iran", Persian) : IR -ایران - -// xn--mgba3a4fra ("Iran", Arabic) : IR -ايران - -// xn--mgbtx2b ("Iraq", Arabic) : IQ -// Communications and Media Commission -عراق - -// xn--mgbayh7gpa ("al-Ordon", Arabic) : JO -// National Information Technology Center (NITC) -// Royal Scientific Society, Al-Jubeiha -الاردن - -// xn--3e0b707e ("Republic of Korea", Hangul) : KR -한국 - -// xn--80ao21a ("Kaz", Kazakh) : KZ -қаз - -// xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK -// http://nic.lk -ලංකා - -// xn--xkc2al3hye2a ("Ilangai", Tamil) : LK -// http://nic.lk -இலங்கை - -// xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA -المغرب - -// xn--d1alf ("mkd", Macedonian) : MK -// MARnet -мкд - -// xn--l1acc ("mon", Mongolian) : MN -мон - -// xn--mix891f ("Macao", Chinese, Traditional) : MO -// MONIC / HNET Asia (Registry Operator for .mo) -澳門 - -// xn--mix082f ("Macao", Chinese, Simplified) : MO -澳门 - -// xn--mgbx4cd0ab ("Malaysia", Malay) : MY -مليسيا - -// xn--mgb9awbf ("Oman", Arabic) : OM -عمان - -// xn--mgbai9azgqp6j ("Pakistan", Urdu/Arabic) : PK -پاکستان - -// xn--mgbai9a5eva00b ("Pakistan", Urdu/Arabic, variant) : PK -پاكستان - -// xn--ygbi2ammx ("Falasteen", Arabic) : PS -// The Palestinian National Internet Naming Authority (PNINA) -// http://www.pnina.ps -فلسطين - -// xn--90a3ac ("srb", Cyrillic) : RS -// https://www.rnids.rs/en/domains/national-domains -срб -пр.срб -орг.срб -обр.срб -од.срб -упр.срб -ак.срб - -// xn--p1ai ("rf", Russian-Cyrillic) : RU -// http://www.cctld.ru/en/docs/rulesrf.php -рф - -// xn--wgbl6a ("Qatar", Arabic) : QA -// http://www.ict.gov.qa/ -قطر - -// xn--mgberp4a5d4ar ("AlSaudiah", Arabic) : SA -// http://www.nic.net.sa/ -السعودية - -// xn--mgberp4a5d4a87g ("AlSaudiah", Arabic, variant) : SA -السعودیة - -// xn--mgbqly7c0a67fbc ("AlSaudiah", Arabic, variant) : SA -السعودیۃ - -// xn--mgbqly7cvafr ("AlSaudiah", Arabic, variant) : SA -السعوديه - -// xn--mgbpl2fh ("sudan", Arabic) : SD -// Operated by .sd registry -سودان - -// xn--yfro4i67o Singapore ("Singapore", Chinese) : SG -新加坡 - -// xn--clchc0ea0b2g2a9gcd ("Singapore", Tamil) : SG -சிங்கப்பூர் - -// xn--ogbpf8fl ("Syria", Arabic) : SY -سورية - -// xn--mgbtf8fl ("Syria", Arabic, variant) : SY -سوريا - -// xn--o3cw4h ("Thai", Thai) : TH -// http://www.thnic.co.th -ไทย -ศึกษา.ไทย -ธุรกิจ.ไทย -รัฐบาล.ไทย -ทหาร.ไทย -เน็ต.ไทย -องค์กร.ไทย - -// xn--pgbs0dh ("Tunisia", Arabic) : TN -// http://nic.tn -تونس - -// xn--kpry57d ("Taiwan", Chinese, Traditional) : TW -// http://www.twnic.net/english/dn/dn_07a.htm -台灣 - -// xn--kprw13d ("Taiwan", Chinese, Simplified) : TW -// http://www.twnic.net/english/dn/dn_07a.htm -台湾 - -// xn--nnx388a ("Taiwan", Chinese, variant) : TW -臺灣 - -// xn--j1amh ("ukr", Cyrillic) : UA -укр - -// xn--mgb2ddes ("AlYemen", Arabic) : YE -اليمن - -// xxx : http://icmregistry.com -xxx - -// ye : http://www.y.net.ye/services/domain_name.htm -*.ye - -// za : http://www.zadna.org.za/content/page/domain-information -ac.za -agric.za -alt.za -co.za -edu.za -gov.za -grondar.za -law.za -mil.za -net.za -ngo.za -nis.za -nom.za -org.za -school.za -tm.za -web.za - -// zm : https://zicta.zm/ -// Submitted by registry -zm -ac.zm -biz.zm -co.zm -com.zm -edu.zm -gov.zm -info.zm -mil.zm -net.zm -org.zm -sch.zm - -// zw : https://www.potraz.gov.zw/ -// Confirmed by registry 2017-01-25 -zw -ac.zw -co.zw -gov.zw -mil.zw -org.zw - -// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2017-02-23T00:46:09Z - -// aaa : 2015-02-26 American Automobile Association, Inc. -aaa - -// aarp : 2015-05-21 AARP -aarp - -// abarth : 2015-07-30 Fiat Chrysler Automobiles N.V. -abarth - -// abb : 2014-10-24 ABB Ltd -abb - -// abbott : 2014-07-24 Abbott Laboratories, Inc. -abbott - -// abbvie : 2015-07-30 AbbVie Inc. -abbvie - -// abc : 2015-07-30 Disney Enterprises, Inc. -abc - -// able : 2015-06-25 Able Inc. -able - -// abogado : 2014-04-24 Top Level Domain Holdings Limited -abogado - -// abudhabi : 2015-07-30 Abu Dhabi Systems and Information Centre -abudhabi - -// academy : 2013-11-07 Half Oaks, LLC -academy - -// accenture : 2014-08-15 Accenture plc -accenture - -// accountant : 2014-11-20 dot Accountant Limited -accountant - -// accountants : 2014-03-20 Knob Town, LLC -accountants - -// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG -aco - -// active : 2014-05-01 The Active Network, Inc -active - -// actor : 2013-12-12 United TLD Holdco Ltd. -actor - -// adac : 2015-07-16 Allgemeiner Deutscher Automobil-Club e.V. (ADAC) -adac - -// ads : 2014-12-04 Charleston Road Registry Inc. -ads - -// adult : 2014-10-16 ICM Registry AD LLC -adult - -// aeg : 2015-03-19 Aktiebolaget Electrolux -aeg - -// aetna : 2015-05-21 Aetna Life Insurance Company -aetna - -// afamilycompany : 2015-07-23 Johnson Shareholdings, Inc. -afamilycompany - -// afl : 2014-10-02 Australian Football League -afl - -// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa -africa - -// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) -agakhan - -// agency : 2013-11-14 Steel Falls, LLC -agency - -// aig : 2014-12-18 American International Group, Inc. -aig - -// aigo : 2015-08-06 aigo Digital Technology Co,Ltd. -aigo - -// airbus : 2015-07-30 Airbus S.A.S. -airbus - -// airforce : 2014-03-06 United TLD Holdco Ltd. -airforce - -// airtel : 2014-10-24 Bharti Airtel Limited -airtel - -// akdn : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) -akdn - -// alfaromeo : 2015-07-31 Fiat Chrysler Automobiles N.V. -alfaromeo - -// alibaba : 2015-01-15 Alibaba Group Holding Limited -alibaba - -// alipay : 2015-01-15 Alibaba Group Holding Limited -alipay - -// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft -allfinanz - -// allstate : 2015-07-31 Allstate Fire and Casualty Insurance Company -allstate - -// ally : 2015-06-18 Ally Financial Inc. -ally - -// alsace : 2014-07-02 REGION D ALSACE -alsace - -// alstom : 2015-07-30 ALSTOM -alstom - -// americanexpress : 2015-07-31 American Express Travel Related Services Company, Inc. -americanexpress - -// americanfamily : 2015-07-23 AmFam, Inc. -americanfamily - -// amex : 2015-07-31 American Express Travel Related Services Company, Inc. -amex - -// amfam : 2015-07-23 AmFam, Inc. -amfam - -// amica : 2015-05-28 Amica Mutual Insurance Company -amica - -// amsterdam : 2014-07-24 Gemeente Amsterdam -amsterdam - -// analytics : 2014-12-18 Campus IP LLC -analytics - -// android : 2014-08-07 Charleston Road Registry Inc. -android - -// anquan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. -anquan - -// anz : 2015-07-31 Australia and New Zealand Banking Group Limited -anz - -// aol : 2015-09-17 AOL Inc. -aol - -// apartments : 2014-12-11 June Maple, LLC -apartments - -// app : 2015-05-14 Charleston Road Registry Inc. -app - -// apple : 2015-05-14 Apple Inc. -apple - -// aquarelle : 2014-07-24 Aquarelle.com -aquarelle - -// arab : 2015-11-12 League of Arab States -arab - -// aramco : 2014-11-20 Aramco Services Company -aramco - -// archi : 2014-02-06 STARTING DOT LIMITED -archi - -// army : 2014-03-06 United TLD Holdco Ltd. -army - -// art : 2016-03-24 UK Creative Ideas Limited -art - -// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E. -arte - -// asda : 2015-07-31 Wal-Mart Stores, Inc. -asda - -// associates : 2014-03-06 Baxter Hill, LLC -associates - -// athleta : 2015-07-30 The Gap, Inc. -athleta - -// attorney : 2014-03-20 -attorney - -// auction : 2014-03-20 -auction - -// audi : 2015-05-21 AUDI Aktiengesellschaft -audi - -// audible : 2015-06-25 Amazon EU S.à r.l. -audible - -// audio : 2014-03-20 Uniregistry, Corp. -audio - -// auspost : 2015-08-13 Australian Postal Corporation -auspost - -// author : 2014-12-18 Amazon EU S.à r.l. -author - -// auto : 2014-11-13 -auto - -// autos : 2014-01-09 DERAutos, LLC -autos - -// avianca : 2015-01-08 Aerovias del Continente Americano S.A. Avianca -avianca - -// aws : 2015-06-25 Amazon EU S.à r.l. -aws - -// axa : 2013-12-19 AXA SA -axa - -// azure : 2014-12-18 Microsoft Corporation -azure - -// baby : 2015-04-09 Johnson & Johnson Services, Inc. -baby - -// baidu : 2015-01-08 Baidu, Inc. -baidu - -// banamex : 2015-07-30 Citigroup Inc. -banamex - -// bananarepublic : 2015-07-31 The Gap, Inc. -bananarepublic - -// band : 2014-06-12 -band - -// bank : 2014-09-25 fTLD Registry Services LLC -bank - -// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable -bar - -// barcelona : 2014-07-24 Municipi de Barcelona -barcelona - -// barclaycard : 2014-11-20 Barclays Bank PLC -barclaycard - -// barclays : 2014-11-20 Barclays Bank PLC -barclays - -// barefoot : 2015-06-11 Gallo Vineyards, Inc. -barefoot - -// bargains : 2013-11-14 Half Hallow, LLC -bargains - -// baseball : 2015-10-29 MLB Advanced Media DH, LLC -baseball - -// basketball : 2015-08-20 Fédération Internationale de Basketball (FIBA) -basketball - -// bauhaus : 2014-04-17 Werkhaus GmbH -bauhaus - -// bayern : 2014-01-23 Bayern Connect GmbH -bayern - -// bbc : 2014-12-18 British Broadcasting Corporation -bbc - -// bbt : 2015-07-23 BB&T Corporation -bbt - -// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A. -bbva - -// bcg : 2015-04-02 The Boston Consulting Group, Inc. -bcg - -// bcn : 2014-07-24 Municipi de Barcelona -bcn - -// beats : 2015-05-14 Beats Electronics, LLC -beats - -// beauty : 2015-12-03 L'Oréal -beauty - -// beer : 2014-01-09 Top Level Domain Holdings Limited -beer - -// bentley : 2014-12-18 Bentley Motors Limited -bentley - -// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG -berlin - -// best : 2013-12-19 BestTLD Pty Ltd -best - -// bestbuy : 2015-07-31 BBY Solutions, Inc. -bestbuy - -// bet : 2015-05-07 Afilias plc -bet - -// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited -bharti - -// bible : 2014-06-19 American Bible Society -bible - -// bid : 2013-12-19 dot Bid Limited -bid - -// bike : 2013-08-27 Grand Hollow, LLC -bike - -// bing : 2014-12-18 Microsoft Corporation -bing - -// bingo : 2014-12-04 Sand Cedar, LLC -bingo - -// bio : 2014-03-06 STARTING DOT LIMITED -bio - -// black : 2014-01-16 Afilias Limited -black - -// blackfriday : 2014-01-16 Uniregistry, Corp. -blackfriday - -// blanco : 2015-07-16 BLANCO GmbH + Co KG -blanco - -// blockbuster : 2015-07-30 Dish DBS Corporation -blockbuster - -// blog : 2015-05-14 -blog - -// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC -bloomberg - -// blue : 2013-11-07 Afilias Limited -blue - -// bms : 2014-10-30 Bristol-Myers Squibb Company -bms - -// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft -bmw - -// bnl : 2014-07-24 Banca Nazionale del Lavoro -bnl - -// bnpparibas : 2014-05-29 BNP Paribas -bnpparibas - -// boats : 2014-12-04 DERBoats, LLC -boats - -// boehringer : 2015-07-09 Boehringer Ingelheim International GmbH -boehringer - -// bofa : 2015-07-31 NMS Services, Inc. -bofa - -// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br -bom - -// bond : 2014-06-05 Bond University Limited -bond - -// boo : 2014-01-30 Charleston Road Registry Inc. -boo - -// book : 2015-08-27 Amazon EU S.à r.l. -book - -// booking : 2015-07-16 Booking.com B.V. -booking - -// boots : 2015-01-08 THE BOOTS COMPANY PLC -boots - -// bosch : 2015-06-18 Robert Bosch GMBH -bosch - -// bostik : 2015-05-28 Bostik SA -bostik - -// boston : 2015-12-10 -boston - -// bot : 2014-12-18 Amazon EU S.à r.l. -bot - -// boutique : 2013-11-14 Over Galley, LLC -boutique - -// box : 2015-11-12 NS1 Limited -box - -// bradesco : 2014-12-18 Banco Bradesco S.A. -bradesco - -// bridgestone : 2014-12-18 Bridgestone Corporation -bridgestone - -// broadway : 2014-12-22 Celebrate Broadway, Inc. -broadway - -// broker : 2014-12-11 IG Group Holdings PLC -broker - -// brother : 2015-01-29 Brother Industries, Ltd. -brother - -// brussels : 2014-02-06 DNS.be vzw -brussels - -// budapest : 2013-11-21 Top Level Domain Holdings Limited -budapest - -// bugatti : 2015-07-23 Bugatti International SA -bugatti - -// build : 2013-11-07 Plan Bee LLC -build - -// builders : 2013-11-07 Atomic Madison, LLC -builders - -// business : 2013-11-07 Spring Cross, LLC -business - -// buy : 2014-12-18 Amazon EU S.à r.l. -buy - -// buzz : 2013-10-02 DOTSTRATEGY CO. -buzz - -// bzh : 2014-02-27 Association www.bzh -bzh - -// cab : 2013-10-24 Half Sunset, LLC -cab - -// cafe : 2015-02-11 Pioneer Canyon, LLC -cafe - -// cal : 2014-07-24 Charleston Road Registry Inc. -cal - -// call : 2014-12-18 Amazon EU S.à r.l. -call - -// calvinklein : 2015-07-30 PVH gTLD Holdings LLC -calvinklein - -// cam : 2016-04-21 AC Webconnecting Holding B.V. -cam - -// camera : 2013-08-27 Atomic Maple, LLC -camera - -// camp : 2013-11-07 Delta Dynamite, LLC -camp - -// cancerresearch : 2014-05-15 Australian Cancer Research Foundation -cancerresearch - -// canon : 2014-09-12 Canon Inc. -canon - -// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry -capetown - -// capital : 2014-03-06 Delta Mill, LLC -capital - -// capitalone : 2015-08-06 Capital One Financial Corporation -capitalone - -// car : 2015-01-22 -car - -// caravan : 2013-12-12 Caravan International, Inc. -caravan - -// cards : 2013-12-05 Foggy Hollow, LLC -cards - -// care : 2014-03-06 Goose Cross -care - -// career : 2013-10-09 dotCareer LLC -career - -// careers : 2013-10-02 Wild Corner, LLC -careers - -// cars : 2014-11-13 -cars - -// cartier : 2014-06-23 Richemont DNS Inc. -cartier - -// casa : 2013-11-21 Top Level Domain Holdings Limited -casa - -// case : 2015-09-03 CNH Industrial N.V. -case - -// caseih : 2015-09-03 CNH Industrial N.V. -caseih - -// cash : 2014-03-06 Delta Lake, LLC -cash - -// casino : 2014-12-18 Binky Sky, LLC -casino - -// catering : 2013-12-05 New Falls. LLC -catering - -// catholic : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) -catholic - -// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA -cba - -// cbn : 2014-08-22 The Christian Broadcasting Network, Inc. -cbn - -// cbre : 2015-07-02 CBRE, Inc. -cbre - -// cbs : 2015-08-06 CBS Domains Inc. -cbs - -// ceb : 2015-04-09 The Corporate Executive Board Company -ceb - -// center : 2013-11-07 Tin Mill, LLC -center - -// ceo : 2013-11-07 CEOTLD Pty Ltd -ceo - -// cern : 2014-06-05 European Organization for Nuclear Research ("CERN") -cern - -// cfa : 2014-08-28 CFA Institute -cfa - -// cfd : 2014-12-11 IG Group Holdings PLC -cfd - -// chanel : 2015-04-09 Chanel International B.V. -chanel - -// channel : 2014-05-08 Charleston Road Registry Inc. -channel - -// chase : 2015-04-30 JPMorgan Chase & Co. -chase - -// chat : 2014-12-04 Sand Fields, LLC -chat - -// cheap : 2013-11-14 Sand Cover, LLC -cheap - -// chintai : 2015-06-11 CHINTAI Corporation -chintai - -// chloe : 2014-10-16 Richemont DNS Inc. -chloe - -// christmas : 2013-11-21 Uniregistry, Corp. -christmas - -// chrome : 2014-07-24 Charleston Road Registry Inc. -chrome - -// chrysler : 2015-07-30 FCA US LLC. -chrysler - -// church : 2014-02-06 Holly Fields, LLC -church - -// cipriani : 2015-02-19 Hotel Cipriani Srl -cipriani - -// circle : 2014-12-18 Amazon EU S.à r.l. -circle - -// cisco : 2014-12-22 Cisco Technology, Inc. -cisco - -// citadel : 2015-07-23 Citadel Domain LLC -citadel - -// citi : 2015-07-30 Citigroup Inc. -citi - -// citic : 2014-01-09 CITIC Group Corporation -citic - -// city : 2014-05-29 Snow Sky, LLC -city - -// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. -cityeats - -// claims : 2014-03-20 Black Corner, LLC -claims - -// cleaning : 2013-12-05 Fox Shadow, LLC -cleaning - -// click : 2014-06-05 Uniregistry, Corp. -click - -// clinic : 2014-03-20 Goose Park, LLC -clinic - -// clinique : 2015-10-01 The Estée Lauder Companies Inc. -clinique - -// clothing : 2013-08-27 Steel Lake, LLC -clothing - -// cloud : 2015-04-16 ARUBA S.p.A. -cloud - -// club : 2013-11-08 .CLUB DOMAINS, LLC -club - -// clubmed : 2015-06-25 Club Méditerranée S.A. -clubmed - -// coach : 2014-10-09 Koko Island, LLC -coach - -// codes : 2013-10-31 Puff Willow, LLC -codes - -// coffee : 2013-10-17 Trixy Cover, LLC -coffee - -// college : 2014-01-16 XYZ.COM LLC -college - -// cologne : 2014-02-05 NetCologne Gesellschaft für Telekommunikation mbH -cologne - -// comcast : 2015-07-23 Comcast IP Holdings I, LLC -comcast - -// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA -commbank - -// community : 2013-12-05 Fox Orchard, LLC -community - -// company : 2013-11-07 Silver Avenue, LLC -company - -// compare : 2015-10-08 iSelect Ltd -compare - -// computer : 2013-10-24 Pine Mill, LLC -computer - -// comsec : 2015-01-08 VeriSign, Inc. -comsec - -// condos : 2013-12-05 Pine House, LLC -condos - -// construction : 2013-09-16 Fox Dynamite, LLC -construction - -// consulting : 2013-12-05 -consulting - -// contact : 2015-01-08 Top Level Spectrum, Inc. -contact - -// contractors : 2013-09-10 Magic Woods, LLC -contractors - -// cooking : 2013-11-21 Top Level Domain Holdings Limited -cooking - -// cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. -cookingchannel - -// cool : 2013-11-14 Koko Lake, LLC -cool - -// corsica : 2014-09-25 Collectivité Territoriale de Corse -corsica - -// country : 2013-12-19 Top Level Domain Holdings Limited -country - -// coupon : 2015-02-26 Amazon EU S.à r.l. -coupon - -// coupons : 2015-03-26 Black Island, LLC -coupons - -// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD -courses - -// credit : 2014-03-20 Snow Shadow, LLC -credit - -// creditcard : 2014-03-20 Binky Frostbite, LLC -creditcard - -// creditunion : 2015-01-22 CUNA Performance Resources, LLC -creditunion - -// cricket : 2014-10-09 dot Cricket Limited -cricket - -// crown : 2014-10-24 Crown Equipment Corporation -crown - -// crs : 2014-04-03 Federated Co-operatives Limited -crs - -// cruise : 2015-12-10 Viking River Cruises (Bermuda) Ltd. -cruise - -// cruises : 2013-12-05 Spring Way, LLC -cruises - -// csc : 2014-09-25 Alliance-One Services, Inc. -csc - -// cuisinella : 2014-04-03 SALM S.A.S. -cuisinella - -// cymru : 2014-05-08 Nominet UK -cymru - -// cyou : 2015-01-22 Beijing Gamease Age Digital Technology Co., Ltd. -cyou - -// dabur : 2014-02-06 Dabur India Limited -dabur - -// dad : 2014-01-23 Charleston Road Registry Inc. -dad - -// dance : 2013-10-24 United TLD Holdco Ltd. -dance - -// data : 2016-06-02 Dish DBS Corporation -data - -// date : 2014-11-20 dot Date Limited -date - -// dating : 2013-12-05 Pine Fest, LLC -dating - -// datsun : 2014-03-27 NISSAN MOTOR CO., LTD. -datsun - -// day : 2014-01-30 Charleston Road Registry Inc. -day - -// dclk : 2014-11-20 Charleston Road Registry Inc. -dclk - -// dds : 2015-05-07 Top Level Domain Holdings Limited -dds - -// deal : 2015-06-25 Amazon EU S.à r.l. -deal - -// dealer : 2014-12-22 Dealer Dot Com, Inc. -dealer - -// deals : 2014-05-22 Sand Sunset, LLC -deals - -// degree : 2014-03-06 -degree - -// delivery : 2014-09-11 Steel Station, LLC -delivery - -// dell : 2014-10-24 Dell Inc. -dell - -// deloitte : 2015-07-31 Deloitte Touche Tohmatsu -deloitte - -// delta : 2015-02-19 Delta Air Lines, Inc. -delta - -// democrat : 2013-10-24 United TLD Holdco Ltd. -democrat - -// dental : 2014-03-20 Tin Birch, LLC -dental - -// dentist : 2014-03-20 -dentist - -// desi : 2013-11-14 Desi Networks LLC -desi - -// design : 2014-11-07 Top Level Design, LLC -design - -// dev : 2014-10-16 Charleston Road Registry Inc. -dev - -// dhl : 2015-07-23 Deutsche Post AG -dhl - -// diamonds : 2013-09-22 John Edge, LLC -diamonds - -// diet : 2014-06-26 Uniregistry, Corp. -diet - -// digital : 2014-03-06 Dash Park, LLC -digital - -// direct : 2014-04-10 Half Trail, LLC -direct - -// directory : 2013-09-20 Extra Madison, LLC -directory - -// discount : 2014-03-06 Holly Hill, LLC -discount - -// discover : 2015-07-23 Discover Financial Services -discover - -// dish : 2015-07-30 Dish DBS Corporation -dish - -// diy : 2015-11-05 Lifestyle Domain Holdings, Inc. -diy - -// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd. -dnp - -// docs : 2014-10-16 Charleston Road Registry Inc. -docs - -// doctor : 2016-06-02 Brice Trail, LLC -doctor - -// dodge : 2015-07-30 FCA US LLC. -dodge - -// dog : 2014-12-04 Koko Mill, LLC -dog - -// doha : 2014-09-18 Communications Regulatory Authority (CRA) -doha - -// domains : 2013-10-17 Sugar Cross, LLC -domains - -// dot : 2015-05-21 Dish DBS Corporation -dot - -// download : 2014-11-20 dot Support Limited -download - -// drive : 2015-03-05 Charleston Road Registry Inc. -drive - -// dtv : 2015-06-04 Dish DBS Corporation -dtv - -// dubai : 2015-01-01 Dubai Smart Government Department -dubai - -// duck : 2015-07-23 Johnson Shareholdings, Inc. -duck - -// dunlop : 2015-07-02 The Goodyear Tire & Rubber Company -dunlop - -// duns : 2015-08-06 The Dun & Bradstreet Corporation -duns - -// dupont : 2015-06-25 E. I. du Pont de Nemours and Company -dupont - -// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry -durban - -// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG -dvag - -// dvr : 2016-05-26 Hughes Satellite Systems Corporation -dvr - -// earth : 2014-12-04 Interlink Co., Ltd. -earth - -// eat : 2014-01-23 Charleston Road Registry Inc. -eat - -// eco : 2016-07-08 Big Room Inc. -eco - -// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. -edeka - -// education : 2013-11-07 Brice Way, LLC -education - -// email : 2013-10-31 Spring Madison, LLC -email - -// emerck : 2014-04-03 Merck KGaA -emerck - -// energy : 2014-09-11 Binky Birch, LLC -energy - -// engineer : 2014-03-06 United TLD Holdco Ltd. -engineer - -// engineering : 2014-03-06 Romeo Canyon -engineering - -// enterprises : 2013-09-20 Snow Oaks, LLC -enterprises - -// epost : 2015-07-23 Deutsche Post AG -epost - -// epson : 2014-12-04 Seiko Epson Corporation -epson - -// equipment : 2013-08-27 Corn Station, LLC -equipment - -// ericsson : 2015-07-09 Telefonaktiebolaget L M Ericsson -ericsson - -// erni : 2014-04-03 ERNI Group Holding AG -erni - -// esq : 2014-05-08 Charleston Road Registry Inc. -esq - -// estate : 2013-08-27 Trixy Park, LLC -estate - -// esurance : 2015-07-23 Esurance Insurance Company -esurance - -// etisalat : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) -etisalat - -// eurovision : 2014-04-24 European Broadcasting Union (EBU) -eurovision - -// eus : 2013-12-12 Puntueus Fundazioa -eus - -// events : 2013-12-05 Pioneer Maple, LLC -events - -// everbank : 2014-05-15 EverBank -everbank - -// exchange : 2014-03-06 Spring Falls, LLC -exchange - -// expert : 2013-11-21 Magic Pass, LLC -expert - -// exposed : 2013-12-05 Victor Beach, LLC -exposed - -// express : 2015-02-11 Sea Sunset, LLC -express - -// extraspace : 2015-05-14 Extra Space Storage LLC -extraspace - -// fage : 2014-12-18 Fage International S.A. -fage - -// fail : 2014-03-06 Atomic Pipe, LLC -fail - -// fairwinds : 2014-11-13 FairWinds Partners, LLC -fairwinds - -// faith : 2014-11-20 dot Faith Limited -faith - -// family : 2015-04-02 -family - -// fan : 2014-03-06 -fan - -// fans : 2014-11-07 Asiamix Digital Limited -fans - -// farm : 2013-11-07 Just Maple, LLC -farm - -// farmers : 2015-07-09 Farmers Insurance Exchange -farmers - -// fashion : 2014-07-03 Top Level Domain Holdings Limited -fashion - -// fast : 2014-12-18 Amazon EU S.à r.l. -fast - -// fedex : 2015-08-06 Federal Express Corporation -fedex - -// feedback : 2013-12-19 Top Level Spectrum, Inc. -feedback - -// ferrari : 2015-07-31 Fiat Chrysler Automobiles N.V. -ferrari - -// ferrero : 2014-12-18 Ferrero Trading Lux S.A. -ferrero - -// fiat : 2015-07-31 Fiat Chrysler Automobiles N.V. -fiat - -// fidelity : 2015-07-30 Fidelity Brokerage Services LLC -fidelity - -// fido : 2015-08-06 Rogers Communications Partnership -fido - -// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd -film - -// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br -final - -// finance : 2014-03-20 Cotton Cypress, LLC -finance - -// financial : 2014-03-06 Just Cover, LLC -financial - -// fire : 2015-06-25 Amazon EU S.à r.l. -fire - -// firestone : 2014-12-18 Bridgestone Corporation -firestone - -// firmdale : 2014-03-27 Firmdale Holdings Limited -firmdale - -// fish : 2013-12-12 Fox Woods, LLC -fish - -// fishing : 2013-11-21 Top Level Domain Holdings Limited -fishing - -// fit : 2014-11-07 Top Level Domain Holdings Limited -fit - -// fitness : 2014-03-06 Brice Orchard, LLC -fitness - -// flickr : 2015-04-02 Yahoo! Domain Services Inc. -flickr - -// flights : 2013-12-05 Fox Station, LLC -flights - -// flir : 2015-07-23 FLIR Systems, Inc. -flir - -// florist : 2013-11-07 Half Cypress, LLC -florist - -// flowers : 2014-10-09 Uniregistry, Corp. -flowers - -// fly : 2014-05-08 Charleston Road Registry Inc. -fly - -// foo : 2014-01-23 Charleston Road Registry Inc. -foo - -// food : 2016-04-21 Lifestyle Domain Holdings, Inc. -food - -// foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc. -foodnetwork - -// football : 2014-12-18 Foggy Farms, LLC -football - -// ford : 2014-11-13 Ford Motor Company -ford - -// forex : 2014-12-11 IG Group Holdings PLC -forex - -// forsale : 2014-05-22 -forsale - -// forum : 2015-04-02 Fegistry, LLC -forum - -// foundation : 2013-12-05 John Dale, LLC -foundation - -// fox : 2015-09-11 FOX Registry, LLC -fox - -// free : 2015-12-10 Amazon EU S.à r.l. -free - -// fresenius : 2015-07-30 Fresenius Immobilien-Verwaltungs-GmbH -fresenius - -// frl : 2014-05-15 FRLregistry B.V. -frl - -// frogans : 2013-12-19 OP3FT -frogans - -// frontdoor : 2015-07-02 Lifestyle Domain Holdings, Inc. -frontdoor - -// frontier : 2015-02-05 Frontier Communications Corporation -frontier - -// ftr : 2015-07-16 Frontier Communications Corporation -ftr - -// fujitsu : 2015-07-30 Fujitsu Limited -fujitsu - -// fujixerox : 2015-07-23 Xerox DNHC LLC -fujixerox - -// fun : 2016-01-14 -fun - -// fund : 2014-03-20 John Castle, LLC -fund - -// furniture : 2014-03-20 Lone Fields, LLC -furniture - -// futbol : 2013-09-20 -futbol - -// fyi : 2015-04-02 Silver Tigers, LLC -fyi - -// gal : 2013-11-07 Asociación puntoGAL -gal - -// gallery : 2013-09-13 Sugar House, LLC -gallery - -// gallo : 2015-06-11 Gallo Vineyards, Inc. -gallo - -// gallup : 2015-02-19 Gallup, Inc. -gallup - -// game : 2015-05-28 Uniregistry, Corp. -game - -// games : 2015-05-28 -games - -// gap : 2015-07-31 The Gap, Inc. -gap - -// garden : 2014-06-26 Top Level Domain Holdings Limited -garden - -// gbiz : 2014-07-17 Charleston Road Registry Inc. -gbiz - -// gdn : 2014-07-31 Joint Stock Company "Navigation-information systems" -gdn - -// gea : 2014-12-04 GEA Group Aktiengesellschaft -gea - -// gent : 2014-01-23 COMBELL GROUP NV/SA -gent - -// genting : 2015-03-12 Resorts World Inc Pte. Ltd. -genting - -// george : 2015-07-31 Wal-Mart Stores, Inc. -george - -// ggee : 2014-01-09 GMO Internet, Inc. -ggee - -// gift : 2013-10-17 Uniregistry, Corp. -gift - -// gifts : 2014-07-03 Goose Sky, LLC -gifts - -// gives : 2014-03-06 United TLD Holdco Ltd. -gives - -// giving : 2014-11-13 Giving Limited -giving - -// glade : 2015-07-23 Johnson Shareholdings, Inc. -glade - -// glass : 2013-11-07 Black Cover, LLC -glass - -// gle : 2014-07-24 Charleston Road Registry Inc. -gle - -// global : 2014-04-17 Dot GLOBAL AS -global - -// globo : 2013-12-19 Globo Comunicação e Participações S.A -globo - -// gmail : 2014-05-01 Charleston Road Registry Inc. -gmail - -// gmbh : 2016-01-29 Extra Dynamite, LLC -gmbh - -// gmo : 2014-01-09 GMO Internet, Inc. -gmo - -// gmx : 2014-04-24 1&1 Mail & Media GmbH -gmx - -// godaddy : 2015-07-23 Go Daddy East, LLC -godaddy - -// gold : 2015-01-22 June Edge, LLC -gold - -// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. -goldpoint - -// golf : 2014-12-18 Lone falls, LLC -golf - -// goo : 2014-12-18 NTT Resonant Inc. -goo - -// goodhands : 2015-07-31 Allstate Fire and Casualty Insurance Company -goodhands - -// goodyear : 2015-07-02 The Goodyear Tire & Rubber Company -goodyear - -// goog : 2014-11-20 Charleston Road Registry Inc. -goog - -// google : 2014-07-24 Charleston Road Registry Inc. -google - -// gop : 2014-01-16 Republican State Leadership Committee, Inc. -gop - -// got : 2014-12-18 Amazon EU S.à r.l. -got - -// grainger : 2015-05-07 Grainger Registry Services, LLC -grainger - -// graphics : 2013-09-13 Over Madison, LLC -graphics - -// gratis : 2014-03-20 Pioneer Tigers, LLC -gratis - -// green : 2014-05-08 Afilias Limited -green - -// gripe : 2014-03-06 Corn Sunset, LLC -gripe - -// grocery : 2016-06-16 Wal-Mart Stores, Inc. -grocery - -// group : 2014-08-15 Romeo Town, LLC -group - -// guardian : 2015-07-30 The Guardian Life Insurance Company of America -guardian - -// gucci : 2014-11-13 Guccio Gucci S.p.a. -gucci - -// guge : 2014-08-28 Charleston Road Registry Inc. -guge - -// guide : 2013-09-13 Snow Moon, LLC -guide - -// guitars : 2013-11-14 Uniregistry, Corp. -guitars - -// guru : 2013-08-27 Pioneer Cypress, LLC -guru - -// hair : 2015-12-03 L'Oréal -hair - -// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH -hamburg - -// hangout : 2014-11-13 Charleston Road Registry Inc. -hangout - -// haus : 2013-12-05 -haus - -// hbo : 2015-07-30 HBO Registry Services, Inc. -hbo - -// hdfc : 2015-07-30 HOUSING DEVELOPMENT FINANCE CORPORATION LIMITED -hdfc - -// hdfcbank : 2015-02-12 HDFC Bank Limited -hdfcbank - -// health : 2015-02-11 DotHealth, LLC -health - -// healthcare : 2014-06-12 Silver Glen, LLC -healthcare - -// help : 2014-06-26 Uniregistry, Corp. -help - -// helsinki : 2015-02-05 City of Helsinki -helsinki - -// here : 2014-02-06 Charleston Road Registry Inc. -here - -// hermes : 2014-07-10 HERMES INTERNATIONAL -hermes - -// hgtv : 2015-07-02 Lifestyle Domain Holdings, Inc. -hgtv - -// hiphop : 2014-03-06 Uniregistry, Corp. -hiphop - -// hisamitsu : 2015-07-16 Hisamitsu Pharmaceutical Co.,Inc. -hisamitsu - -// hitachi : 2014-10-31 Hitachi, Ltd. -hitachi - -// hiv : 2014-03-13 -hiv - -// hkt : 2015-05-14 PCCW-HKT DataCom Services Limited -hkt - -// hockey : 2015-03-19 Half Willow, LLC -hockey - -// holdings : 2013-08-27 John Madison, LLC -holdings - -// holiday : 2013-11-07 Goose Woods, LLC -holiday - -// homedepot : 2015-04-02 Homer TLC, Inc. -homedepot - -// homegoods : 2015-07-16 The TJX Companies, Inc. -homegoods - -// homes : 2014-01-09 DERHomes, LLC -homes - -// homesense : 2015-07-16 The TJX Companies, Inc. -homesense - -// honda : 2014-12-18 Honda Motor Co., Ltd. -honda - -// honeywell : 2015-07-23 Honeywell GTLD LLC -honeywell - -// horse : 2013-11-21 Top Level Domain Holdings Limited -horse - -// hospital : 2016-10-20 Ruby Pike, LLC -hospital - -// host : 2014-04-17 DotHost Inc. -host - -// hosting : 2014-05-29 Uniregistry, Corp. -hosting - -// hot : 2015-08-27 Amazon EU S.à r.l. -hot - -// hoteles : 2015-03-05 Travel Reservations SRL -hoteles - -// hotels : 2016-04-07 Booking.com B.V. -hotels - -// hotmail : 2014-12-18 Microsoft Corporation -hotmail - -// house : 2013-11-07 Sugar Park, LLC -house - -// how : 2014-01-23 Charleston Road Registry Inc. -how - -// hsbc : 2014-10-24 HSBC Holdings PLC -hsbc - -// htc : 2015-04-02 HTC corporation -htc - -// hughes : 2015-07-30 Hughes Satellite Systems Corporation -hughes - -// hyatt : 2015-07-30 Hyatt GTLD, L.L.C. -hyatt - -// hyundai : 2015-07-09 Hyundai Motor Company -hyundai - -// ibm : 2014-07-31 International Business Machines Corporation -ibm - -// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited -icbc - -// ice : 2014-10-30 IntercontinentalExchange, Inc. -ice - -// icu : 2015-01-08 One.com A/S -icu - -// ieee : 2015-07-23 IEEE Global LLC -ieee - -// ifm : 2014-01-30 ifm electronic gmbh -ifm - -// ikano : 2015-07-09 Ikano S.A. -ikano - -// imamat : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) -imamat - -// imdb : 2015-06-25 Amazon EU S.à r.l. -imdb - -// immo : 2014-07-10 Auburn Bloom, LLC -immo - -// immobilien : 2013-11-07 United TLD Holdco Ltd. -immobilien - -// industries : 2013-12-05 Outer House, LLC -industries - -// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD. -infiniti - -// ing : 2014-01-23 Charleston Road Registry Inc. -ing - -// ink : 2013-12-05 Top Level Design, LLC -ink - -// institute : 2013-11-07 Outer Maple, LLC -institute - -// insurance : 2015-02-19 fTLD Registry Services LLC -insurance - -// insure : 2014-03-20 Pioneer Willow, LLC -insure - -// intel : 2015-08-06 Intel Corporation -intel - -// international : 2013-11-07 Wild Way, LLC -international - -// intuit : 2015-07-30 Intuit Administrative Services, Inc. -intuit - -// investments : 2014-03-20 Holly Glen, LLC -investments - -// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. -ipiranga - -// irish : 2014-08-07 Dot-Irish LLC -irish - -// iselect : 2015-02-11 iSelect Ltd -iselect - -// ismaili : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) -ismaili - -// ist : 2014-08-28 Istanbul Metropolitan Municipality -ist - -// istanbul : 2014-08-28 Istanbul Metropolitan Municipality -istanbul - -// itau : 2014-10-02 Itau Unibanco Holding S.A. -itau - -// itv : 2015-07-09 ITV Services Limited -itv - -// iveco : 2015-09-03 CNH Industrial N.V. -iveco - -// iwc : 2014-06-23 Richemont DNS Inc. -iwc - -// jaguar : 2014-11-13 Jaguar Land Rover Ltd -jaguar - -// java : 2014-06-19 Oracle Corporation -java - -// jcb : 2014-11-20 JCB Co., Ltd. -jcb - -// jcp : 2015-04-23 JCP Media, Inc. -jcp - -// jeep : 2015-07-30 FCA US LLC. -jeep - -// jetzt : 2014-01-09 -jetzt - -// jewelry : 2015-03-05 Wild Bloom, LLC -jewelry - -// jio : 2015-04-02 Affinity Names, Inc. -jio - -// jlc : 2014-12-04 Richemont DNS Inc. -jlc - -// jll : 2015-04-02 Jones Lang LaSalle Incorporated -jll - -// jmp : 2015-03-26 Matrix IP LLC -jmp - -// jnj : 2015-06-18 Johnson & Johnson Services, Inc. -jnj - -// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry -joburg - -// jot : 2014-12-18 Amazon EU S.à r.l. -jot - -// joy : 2014-12-18 Amazon EU S.à r.l. -joy - -// jpmorgan : 2015-04-30 JPMorgan Chase & Co. -jpmorgan - -// jprs : 2014-09-18 Japan Registry Services Co., Ltd. -jprs - -// juegos : 2014-03-20 Uniregistry, Corp. -juegos - -// juniper : 2015-07-30 JUNIPER NETWORKS, INC. -juniper - -// kaufen : 2013-11-07 United TLD Holdco Ltd. -kaufen - -// kddi : 2014-09-12 KDDI CORPORATION -kddi - -// kerryhotels : 2015-04-30 Kerry Trading Co. Limited -kerryhotels - -// kerrylogistics : 2015-04-09 Kerry Trading Co. Limited -kerrylogistics - -// kerryproperties : 2015-04-09 Kerry Trading Co. Limited -kerryproperties - -// kfh : 2014-12-04 Kuwait Finance House -kfh - -// kia : 2015-07-09 KIA MOTORS CORPORATION -kia - -// kim : 2013-09-23 Afilias Limited -kim - -// kinder : 2014-11-07 Ferrero Trading Lux S.A. -kinder - -// kindle : 2015-06-25 Amazon EU S.à r.l. -kindle - -// kitchen : 2013-09-20 Just Goodbye, LLC -kitchen - -// kiwi : 2013-09-20 DOT KIWI LIMITED -kiwi - -// koeln : 2014-01-09 NetCologne Gesellschaft für Telekommunikation mbH -koeln - -// komatsu : 2015-01-08 Komatsu Ltd. -komatsu - -// kosher : 2015-08-20 Kosher Marketing Assets LLC -kosher - -// kpmg : 2015-04-23 KPMG International Cooperative (KPMG International Genossenschaft) -kpmg - -// kpn : 2015-01-08 Koninklijke KPN N.V. -kpn - -// krd : 2013-12-05 KRG Department of Information Technology -krd - -// kred : 2013-12-19 KredTLD Pty Ltd -kred - -// kuokgroup : 2015-04-09 Kerry Trading Co. Limited -kuokgroup - -// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen -kyoto - -// lacaixa : 2014-01-09 CAIXA D'ESTALVIS I PENSIONS DE BARCELONA -lacaixa - -// ladbrokes : 2015-08-06 LADBROKES INTERNATIONAL PLC -ladbrokes - -// lamborghini : 2015-06-04 Automobili Lamborghini S.p.A. -lamborghini - -// lamer : 2015-10-01 The Estée Lauder Companies Inc. -lamer - -// lancaster : 2015-02-12 LANCASTER -lancaster - -// lancia : 2015-07-31 Fiat Chrysler Automobiles N.V. -lancia - -// lancome : 2015-07-23 L'Oréal -lancome - -// land : 2013-09-10 Pine Moon, LLC -land - -// landrover : 2014-11-13 Jaguar Land Rover Ltd -landrover - -// lanxess : 2015-07-30 LANXESS Corporation -lanxess - -// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated -lasalle - -// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico -lat - -// latino : 2015-07-30 Dish DBS Corporation -latino - -// latrobe : 2014-06-16 La Trobe University -latrobe - -// law : 2015-01-22 Minds + Machines Group Limited -law - -// lawyer : 2014-03-20 -lawyer - -// lds : 2014-03-20 IRI Domain Management, LLC ("Applicant") -lds - -// lease : 2014-03-06 Victor Trail, LLC -lease - -// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc -leclerc - -// lefrak : 2015-07-16 LeFrak Organization, Inc. -lefrak - -// legal : 2014-10-16 Blue Falls, LLC -legal - -// lego : 2015-07-16 LEGO Juris A/S -lego - -// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION -lexus - -// lgbt : 2014-05-08 Afilias Limited -lgbt - -// liaison : 2014-10-02 Liaison Technologies, Incorporated -liaison - -// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG -lidl - -// life : 2014-02-06 Trixy Oaks, LLC -life - -// lifeinsurance : 2015-01-15 American Council of Life Insurers -lifeinsurance - -// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc. -lifestyle - -// lighting : 2013-08-27 John McCook, LLC -lighting - -// like : 2014-12-18 Amazon EU S.à r.l. -like - -// lilly : 2015-07-31 Eli Lilly and Company -lilly - -// limited : 2014-03-06 Big Fest, LLC -limited - -// limo : 2013-10-17 Hidden Frostbite, LLC -limo - -// lincoln : 2014-11-13 Ford Motor Company -lincoln - -// linde : 2014-12-04 Linde Aktiengesellschaft -linde - -// link : 2013-11-14 Uniregistry, Corp. -link - -// lipsy : 2015-06-25 Lipsy Ltd -lipsy - -// live : 2014-12-04 -live - -// living : 2015-07-30 Lifestyle Domain Holdings, Inc. -living - -// lixil : 2015-03-19 LIXIL Group Corporation -lixil - -// loan : 2014-11-20 dot Loan Limited -loan - -// loans : 2014-03-20 June Woods, LLC -loans - -// locker : 2015-06-04 Dish DBS Corporation -locker - -// locus : 2015-06-25 Locus Analytics LLC -locus - -// loft : 2015-07-30 Annco, Inc. -loft - -// lol : 2015-01-30 Uniregistry, Corp. -lol - -// london : 2013-11-14 Dot London Domains Limited -london - -// lotte : 2014-11-07 Lotte Holdings Co., Ltd. -lotte - -// lotto : 2014-04-10 Afilias Limited -lotto - -// love : 2014-12-22 Merchant Law Group LLP -love - -// lpl : 2015-07-30 LPL Holdings, Inc. -lpl - -// lplfinancial : 2015-07-30 LPL Holdings, Inc. -lplfinancial - -// ltd : 2014-09-25 Over Corner, LLC -ltd - -// ltda : 2014-04-17 DOMAIN ROBOT SERVICOS DE HOSPEDAGEM NA INTERNET LTDA -ltda - -// lundbeck : 2015-08-06 H. Lundbeck A/S -lundbeck - -// lupin : 2014-11-07 LUPIN LIMITED -lupin - -// luxe : 2014-01-09 Top Level Domain Holdings Limited -luxe - -// luxury : 2013-10-17 Luxury Partners, LLC -luxury - -// macys : 2015-07-31 Macys, Inc. -macys - -// madrid : 2014-05-01 Comunidad de Madrid -madrid - -// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF) -maif - -// maison : 2013-12-05 Victor Frostbite, LLC -maison - -// makeup : 2015-01-15 L'Oréal -makeup - -// man : 2014-12-04 MAN SE -man - -// management : 2013-11-07 John Goodbye, LLC -management - -// mango : 2013-10-24 PUNTO FA S.L. -mango - -// map : 2016-06-09 Charleston Road Registry Inc. -map - -// market : 2014-03-06 -market - -// marketing : 2013-11-07 Fern Pass, LLC -marketing - -// markets : 2014-12-11 IG Group Holdings PLC -markets - -// marriott : 2014-10-09 Marriott Worldwide Corporation -marriott - -// marshalls : 2015-07-16 The TJX Companies, Inc. -marshalls - -// maserati : 2015-07-31 Fiat Chrysler Automobiles N.V. -maserati - -// mattel : 2015-08-06 Mattel Sites, Inc. -mattel - -// mba : 2015-04-02 Lone Hollow, LLC -mba - -// mcd : 2015-07-30 McDonald’s Corporation -mcd - -// mcdonalds : 2015-07-30 McDonald’s Corporation -mcdonalds - -// mckinsey : 2015-07-31 McKinsey Holdings, Inc. -mckinsey - -// med : 2015-08-06 Medistry LLC -med - -// media : 2014-03-06 Grand Glen, LLC -media - -// meet : 2014-01-16 -meet - -// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation -melbourne - -// meme : 2014-01-30 Charleston Road Registry Inc. -meme - -// memorial : 2014-10-16 Dog Beach, LLC -memorial - -// men : 2015-02-26 Exclusive Registry Limited -men - -// menu : 2013-09-11 Wedding TLD2, LLC -menu - -// meo : 2014-11-07 PT Comunicacoes S.A. -meo - -// merckmsd : 2016-07-14 MSD Registry Holdings, Inc. -merckmsd - -// metlife : 2015-05-07 MetLife Services and Solutions, LLC -metlife - -// miami : 2013-12-19 Top Level Domain Holdings Limited -miami - -// microsoft : 2014-12-18 Microsoft Corporation -microsoft - -// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft -mini - -// mint : 2015-07-30 Intuit Administrative Services, Inc. -mint - -// mit : 2015-07-02 Massachusetts Institute of Technology -mit - -// mitsubishi : 2015-07-23 Mitsubishi Corporation -mitsubishi - -// mlb : 2015-05-21 MLB Advanced Media DH, LLC -mlb - -// mls : 2015-04-23 The Canadian Real Estate Association -mls - -// mma : 2014-11-07 MMA IARD -mma - -// mobile : 2016-06-02 Dish DBS Corporation -mobile - -// mobily : 2014-12-18 GreenTech Consultancy Company W.L.L. -mobily - -// moda : 2013-11-07 United TLD Holdco Ltd. -moda - -// moe : 2013-11-13 Interlink Co., Ltd. -moe - -// moi : 2014-12-18 Amazon EU S.à r.l. -moi - -// mom : 2015-04-16 Uniregistry, Corp. -mom - -// monash : 2013-09-30 Monash University -monash - -// money : 2014-10-16 Outer McCook, LLC -money - -// monster : 2015-09-11 Monster Worldwide, Inc. -monster - -// montblanc : 2014-06-23 Richemont DNS Inc. -montblanc - -// mopar : 2015-07-30 FCA US LLC. -mopar - -// mormon : 2013-12-05 IRI Domain Management, LLC ("Applicant") -mormon - -// mortgage : 2014-03-20 -mortgage - -// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) -moscow - -// moto : 2015-06-04 -moto - -// motorcycles : 2014-01-09 DERMotorcycles, LLC -motorcycles - -// mov : 2014-01-30 Charleston Road Registry Inc. -mov - -// movie : 2015-02-05 New Frostbite, LLC -movie - -// movistar : 2014-10-16 Telefónica S.A. -movistar - -// msd : 2015-07-23 MSD Registry Holdings, Inc. -msd - -// mtn : 2014-12-04 MTN Dubai Limited -mtn - -// mtpc : 2014-11-20 Mitsubishi Tanabe Pharma Corporation -mtpc - -// mtr : 2015-03-12 MTR Corporation Limited -mtr - -// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC -mutual - -// nab : 2015-08-20 National Australia Bank Limited -nab - -// nadex : 2014-12-11 IG Group Holdings PLC -nadex - -// nagoya : 2013-10-24 GMO Registry, Inc. -nagoya - -// nationwide : 2015-07-23 Nationwide Mutual Insurance Company -nationwide - -// natura : 2015-03-12 NATURA COSMÉTICOS S.A. -natura - -// navy : 2014-03-06 United TLD Holdco Ltd. -navy - -// nba : 2015-07-31 NBA REGISTRY, LLC -nba - -// nec : 2015-01-08 NEC Corporation -nec - -// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA -netbank - -// netflix : 2015-06-18 Netflix, Inc. -netflix - -// network : 2013-11-14 Trixy Manor, LLC -network - -// neustar : 2013-12-05 NeuStar, Inc. -neustar - -// new : 2014-01-30 Charleston Road Registry Inc. -new - -// newholland : 2015-09-03 CNH Industrial N.V. -newholland - -// news : 2014-12-18 -news - -// next : 2015-06-18 Next plc -next - -// nextdirect : 2015-06-18 Next plc -nextdirect - -// nexus : 2014-07-24 Charleston Road Registry Inc. -nexus - -// nfl : 2015-07-23 NFL Reg Ops LLC -nfl - -// ngo : 2014-03-06 Public Interest Registry -ngo - -// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK) -nhk - -// nico : 2014-12-04 DWANGO Co., Ltd. -nico - -// nike : 2015-07-23 NIKE, Inc. -nike - -// nikon : 2015-05-21 NIKON CORPORATION -nikon - -// ninja : 2013-11-07 United TLD Holdco Ltd. -ninja - -// nissan : 2014-03-27 NISSAN MOTOR CO., LTD. -nissan - -// nissay : 2015-10-29 Nippon Life Insurance Company -nissay - -// nokia : 2015-01-08 Nokia Corporation -nokia - -// northwesternmutual : 2015-06-18 Northwestern Mutual Registry, LLC -northwesternmutual - -// norton : 2014-12-04 Symantec Corporation -norton - -// now : 2015-06-25 Amazon EU S.à r.l. -now - -// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. -nowruz - -// nowtv : 2015-05-14 Starbucks (HK) Limited -nowtv - -// nra : 2014-05-22 NRA Holdings Company, INC. -nra - -// nrw : 2013-11-21 Minds + Machines GmbH -nrw - -// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION -ntt - -// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications -nyc - -// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA -obi - -// observer : 2015-04-30 -observer - -// off : 2015-07-23 Johnson Shareholdings, Inc. -off - -// office : 2015-03-12 Microsoft Corporation -office - -// okinawa : 2013-12-05 BusinessRalliart Inc. -okinawa - -// olayan : 2015-05-14 Crescent Holding GmbH -olayan - -// olayangroup : 2015-05-14 Crescent Holding GmbH -olayangroup - -// oldnavy : 2015-07-31 The Gap, Inc. -oldnavy - -// ollo : 2015-06-04 Dish DBS Corporation -ollo - -// omega : 2015-01-08 The Swatch Group Ltd -omega - -// one : 2014-11-07 One.com A/S -one - -// ong : 2014-03-06 Public Interest Registry -ong - -// onl : 2013-09-16 I-Registry Ltd. -onl - -// online : 2015-01-15 DotOnline Inc. -online - -// onyourside : 2015-07-23 Nationwide Mutual Insurance Company -onyourside - -// ooo : 2014-01-09 INFIBEAM INCORPORATION LIMITED -ooo - -// open : 2015-07-31 American Express Travel Related Services Company, Inc. -open - -// oracle : 2014-06-19 Oracle Corporation -oracle - -// orange : 2015-03-12 Orange Brand Services Limited -orange - -// organic : 2014-03-27 Afilias Limited -organic - -// origins : 2015-10-01 The Estée Lauder Companies Inc. -origins - -// osaka : 2014-09-04 Interlink Co., Ltd. -osaka - -// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd. -otsuka - -// ott : 2015-06-04 Dish DBS Corporation -ott - -// ovh : 2014-01-16 OVH SAS -ovh - -// page : 2014-12-04 Charleston Road Registry Inc. -page - -// pamperedchef : 2015-02-05 The Pampered Chef, Ltd. -pamperedchef - -// panasonic : 2015-07-30 Panasonic Corporation -panasonic - -// panerai : 2014-11-07 Richemont DNS Inc. -panerai - -// paris : 2014-01-30 City of Paris -paris - -// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. -pars - -// partners : 2013-12-05 Magic Glen, LLC -partners - -// parts : 2013-12-05 Sea Goodbye, LLC -parts - -// party : 2014-09-11 Blue Sky Registry Limited -party - -// passagens : 2015-03-05 Travel Reservations SRL -passagens - -// pay : 2015-08-27 Amazon EU S.à r.l. -pay - -// pccw : 2015-05-14 PCCW Enterprises Limited -pccw - -// pet : 2015-05-07 Afilias plc -pet - -// pfizer : 2015-09-11 Pfizer Inc. -pfizer - -// pharmacy : 2014-06-19 National Association of Boards of Pharmacy -pharmacy - -// phd : 2016-07-28 Charleston Road Registry Inc. -phd - -// philips : 2014-11-07 Koninklijke Philips N.V. -philips - -// phone : 2016-06-02 Dish DBS Corporation -phone - -// photo : 2013-11-14 Uniregistry, Corp. -photo - -// photography : 2013-09-20 Sugar Glen, LLC -photography - -// photos : 2013-10-17 Sea Corner, LLC -photos - -// physio : 2014-05-01 PhysBiz Pty Ltd -physio - -// piaget : 2014-10-16 Richemont DNS Inc. -piaget - -// pics : 2013-11-14 Uniregistry, Corp. -pics - -// pictet : 2014-06-26 Pictet Europe S.A. -pictet - -// pictures : 2014-03-06 Foggy Sky, LLC -pictures - -// pid : 2015-01-08 Top Level Spectrum, Inc. -pid - -// pin : 2014-12-18 Amazon EU S.à r.l. -pin - -// ping : 2015-06-11 Ping Registry Provider, Inc. -ping - -// pink : 2013-10-01 Afilias Limited -pink - -// pioneer : 2015-07-16 Pioneer Corporation -pioneer - -// pizza : 2014-06-26 Foggy Moon, LLC -pizza - -// place : 2014-04-24 Snow Galley, LLC -place - -// play : 2015-03-05 Charleston Road Registry Inc. -play - -// playstation : 2015-07-02 Sony Computer Entertainment Inc. -playstation - -// plumbing : 2013-09-10 Spring Tigers, LLC -plumbing - -// plus : 2015-02-05 Sugar Mill, LLC -plus - -// pnc : 2015-07-02 PNC Domain Co., LLC -pnc - -// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG -pohl - -// poker : 2014-07-03 Afilias Domains No. 5 Limited -poker - -// politie : 2015-08-20 Politie Nederland -politie - -// porn : 2014-10-16 ICM Registry PN LLC -porn - -// pramerica : 2015-07-30 Prudential Financial, Inc. -pramerica - -// praxi : 2013-12-05 Praxi S.p.A. -praxi - -// press : 2014-04-03 DotPress Inc. -press - -// prime : 2015-06-25 Amazon EU S.à r.l. -prime - -// prod : 2014-01-23 Charleston Road Registry Inc. -prod - -// productions : 2013-12-05 Magic Birch, LLC -productions - -// prof : 2014-07-24 Charleston Road Registry Inc. -prof - -// progressive : 2015-07-23 Progressive Casualty Insurance Company -progressive - -// promo : 2014-12-18 -promo - -// properties : 2013-12-05 Big Pass, LLC -properties - -// property : 2014-05-22 Uniregistry, Corp. -property - -// protection : 2015-04-23 -protection - -// pru : 2015-07-30 Prudential Financial, Inc. -pru - -// prudential : 2015-07-30 Prudential Financial, Inc. -prudential - -// pub : 2013-12-12 United TLD Holdco Ltd. -pub - -// pwc : 2015-10-29 PricewaterhouseCoopers LLP -pwc - -// qpon : 2013-11-14 dotCOOL, Inc. -qpon - -// quebec : 2013-12-19 PointQuébec Inc -quebec - -// quest : 2015-03-26 Quest ION Limited -quest - -// qvc : 2015-07-30 QVC, Inc. -qvc - -// racing : 2014-12-04 Premier Registry Limited -racing - -// radio : 2016-07-21 European Broadcasting Union (EBU) -radio - -// raid : 2015-07-23 Johnson Shareholdings, Inc. -raid - -// read : 2014-12-18 Amazon EU S.à r.l. -read - -// realestate : 2015-09-11 dotRealEstate LLC -realestate - -// realtor : 2014-05-29 Real Estate Domains LLC -realtor - -// realty : 2015-03-19 Fegistry, LLC -realty - -// recipes : 2013-10-17 Grand Island, LLC -recipes - -// red : 2013-11-07 Afilias Limited -red - -// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd. -redstone - -// redumbrella : 2015-03-26 Travelers TLD, LLC -redumbrella - -// rehab : 2014-03-06 United TLD Holdco Ltd. -rehab - -// reise : 2014-03-13 -reise - -// reisen : 2014-03-06 New Cypress, LLC -reisen - -// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc. -reit - -// reliance : 2015-04-02 Reliance Industries Limited -reliance - -// ren : 2013-12-12 Beijing Qianxiang Wangjing Technology Development Co., Ltd. -ren - -// rent : 2014-12-04 DERRent, LLC -rent - -// rentals : 2013-12-05 Big Hollow,LLC -rentals - -// repair : 2013-11-07 Lone Sunset, LLC -repair - -// report : 2013-12-05 Binky Glen, LLC -report - -// republican : 2014-03-20 United TLD Holdco Ltd. -republican - -// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable -rest - -// restaurant : 2014-07-03 Snow Avenue, LLC -restaurant - -// review : 2014-11-20 dot Review Limited -review - -// reviews : 2013-09-13 -reviews - -// rexroth : 2015-06-18 Robert Bosch GMBH -rexroth - -// rich : 2013-11-21 I-Registry Ltd. -rich - -// richardli : 2015-05-14 Pacific Century Asset Management (HK) Limited -richardli - -// ricoh : 2014-11-20 Ricoh Company, Ltd. -ricoh - -// rightathome : 2015-07-23 Johnson Shareholdings, Inc. -rightathome - -// ril : 2015-04-02 Reliance Industries Limited -ril - -// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO -rio - -// rip : 2014-07-10 United TLD Holdco Ltd. -rip - -// rmit : 2015-11-19 Royal Melbourne Institute of Technology -rmit - -// rocher : 2014-12-18 Ferrero Trading Lux S.A. -rocher - -// rocks : 2013-11-14 -rocks - -// rodeo : 2013-12-19 Top Level Domain Holdings Limited -rodeo - -// rogers : 2015-08-06 Rogers Communications Partnership -rogers - -// room : 2014-12-18 Amazon EU S.à r.l. -room - -// rsvp : 2014-05-08 Charleston Road Registry Inc. -rsvp - -// rugby : 2016-12-15 World Rugby Strategic Developments Limited -rugby - -// ruhr : 2013-10-02 regiodot GmbH & Co. KG -ruhr - -// run : 2015-03-19 Snow Park, LLC -run - -// rwe : 2015-04-02 RWE AG -rwe - -// ryukyu : 2014-01-09 BusinessRalliart Inc. -ryukyu - -// saarland : 2013-12-12 dotSaarland GmbH -saarland - -// safe : 2014-12-18 Amazon EU S.à r.l. -safe - -// safety : 2015-01-08 Safety Registry Services, LLC. -safety - -// sakura : 2014-12-18 SAKURA Internet Inc. -sakura - -// sale : 2014-10-16 -sale - -// salon : 2014-12-11 Outer Orchard, LLC -salon - -// samsclub : 2015-07-31 Wal-Mart Stores, Inc. -samsclub - -// samsung : 2014-04-03 SAMSUNG SDS CO., LTD -samsung - -// sandvik : 2014-11-13 Sandvik AB -sandvik - -// sandvikcoromant : 2014-11-07 Sandvik AB -sandvikcoromant - -// sanofi : 2014-10-09 Sanofi -sanofi - -// sap : 2014-03-27 SAP AG -sap - -// sapo : 2014-11-07 PT Comunicacoes S.A. -sapo - -// sarl : 2014-07-03 Delta Orchard, LLC -sarl - -// sas : 2015-04-02 Research IP LLC -sas - -// save : 2015-06-25 Amazon EU S.à r.l. -save - -// saxo : 2014-10-31 Saxo Bank A/S -saxo - -// sbi : 2015-03-12 STATE BANK OF INDIA -sbi - -// sbs : 2014-11-07 SPECIAL BROADCASTING SERVICE CORPORATION -sbs - -// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ) -sca - -// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited ("SCB") -scb - -// schaeffler : 2015-08-06 Schaeffler Technologies AG & Co. KG -schaeffler - -// schmidt : 2014-04-03 SALM S.A.S. -schmidt - -// scholarships : 2014-04-24 Scholarships.com, LLC -scholarships - -// school : 2014-12-18 Little Galley, LLC -school - -// schule : 2014-03-06 Outer Moon, LLC -schule - -// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG -schwarz - -// science : 2014-09-11 dot Science Limited -science - -// scjohnson : 2015-07-23 Johnson Shareholdings, Inc. -scjohnson - -// scor : 2014-10-31 SCOR SE -scor - -// scot : 2014-01-23 Dot Scot Registry Limited -scot - -// search : 2016-06-09 Charleston Road Registry Inc. -search - -// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) -seat - -// secure : 2015-08-27 Amazon EU S.à r.l. -secure - -// security : 2015-05-14 -security - -// seek : 2014-12-04 Seek Limited -seek - -// select : 2015-10-08 iSelect Ltd -select - -// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A. -sener - -// services : 2014-02-27 Fox Castle, LLC -services - -// ses : 2015-07-23 SES -ses - -// seven : 2015-08-06 Seven West Media Ltd -seven - -// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG -sew - -// sex : 2014-11-13 ICM Registry SX LLC -sex - -// sexy : 2013-09-11 Uniregistry, Corp. -sexy - -// sfr : 2015-08-13 Societe Francaise du Radiotelephone - SFR -sfr - -// shangrila : 2015-09-03 Shangri‐La International Hotel Management Limited -shangrila - -// sharp : 2014-05-01 Sharp Corporation -sharp - -// shaw : 2015-04-23 Shaw Cablesystems G.P. -shaw - -// shell : 2015-07-30 Shell Information Technology International Inc -shell - -// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. -shia - -// shiksha : 2013-11-14 Afilias Limited -shiksha - -// shoes : 2013-10-02 Binky Galley, LLC -shoes - -// shop : 2016-04-08 GMO Registry, Inc. -shop - -// shopping : 2016-03-31 -shopping - -// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. -shouji - -// show : 2015-03-05 Snow Beach, LLC -show - -// showtime : 2015-08-06 CBS Domains Inc. -showtime - -// shriram : 2014-01-23 Shriram Capital Ltd. -shriram - -// silk : 2015-06-25 Amazon EU S.à r.l. -silk - -// sina : 2015-03-12 Sina Corporation -sina - -// singles : 2013-08-27 Fern Madison, LLC -singles - -// site : 2015-01-15 DotSite Inc. -site - -// ski : 2015-04-09 STARTING DOT LIMITED -ski - -// skin : 2015-01-15 L'Oréal -skin - -// sky : 2014-06-19 Sky IP International Ltd, a company incorporated in England and Wales, operating via its registered Swiss branch -sky - -// skype : 2014-12-18 Microsoft Corporation -skype - -// sling : 2015-07-30 Hughes Satellite Systems Corporation -sling - -// smart : 2015-07-09 Smart Communications, Inc. (SMART) -smart - -// smile : 2014-12-18 Amazon EU S.à r.l. -smile - -// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F -sncf - -// soccer : 2015-03-26 Foggy Shadow, LLC -soccer - -// social : 2013-11-07 United TLD Holdco Ltd. -social - -// softbank : 2015-07-02 SoftBank Corp. -softbank - -// software : 2014-03-20 -software - -// sohu : 2013-12-19 Sohu.com Limited -sohu - -// solar : 2013-11-07 Ruby Town, LLC -solar - -// solutions : 2013-11-07 Silver Cover, LLC -solutions - -// song : 2015-02-26 Amazon EU S.à r.l. -song - -// sony : 2015-01-08 Sony Corporation -sony - -// soy : 2014-01-23 Charleston Road Registry Inc. -soy - -// space : 2014-04-03 DotSpace Inc. -space - -// spiegel : 2014-02-05 SPIEGEL-Verlag Rudolf Augstein GmbH & Co. KG -spiegel - -// spot : 2015-02-26 Amazon EU S.à r.l. -spot - -// spreadbetting : 2014-12-11 IG Group Holdings PLC -spreadbetting - -// srl : 2015-05-07 mySRL GmbH -srl - -// srt : 2015-07-30 FCA US LLC. -srt - -// stada : 2014-11-13 STADA Arzneimittel AG -stada - -// staples : 2015-07-30 Staples, Inc. -staples - -// star : 2015-01-08 Star India Private Limited -star - -// starhub : 2015-02-05 StarHub Ltd -starhub - -// statebank : 2015-03-12 STATE BANK OF INDIA -statebank - -// statefarm : 2015-07-30 State Farm Mutual Automobile Insurance Company -statefarm - -// statoil : 2014-12-04 Statoil ASA -statoil - -// stc : 2014-10-09 Saudi Telecom Company -stc - -// stcgroup : 2014-10-09 Saudi Telecom Company -stcgroup - -// stockholm : 2014-12-18 Stockholms kommun -stockholm - -// storage : 2014-12-22 Self Storage Company LLC -storage - -// store : 2015-04-09 DotStore Inc. -store - -// stream : 2016-01-08 dot Stream Limited -stream - -// studio : 2015-02-11 -studio - -// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD -study - -// style : 2014-12-04 Binky Moon, LLC -style - -// sucks : 2014-12-22 Vox Populi Registry Inc. -sucks - -// supplies : 2013-12-19 Atomic Fields, LLC -supplies - -// supply : 2013-12-19 Half Falls, LLC -supply - -// support : 2013-10-24 Grand Orchard, LLC -support - -// surf : 2014-01-09 Top Level Domain Holdings Limited -surf - -// surgery : 2014-03-20 Tin Avenue, LLC -surgery - -// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION -suzuki - -// swatch : 2015-01-08 The Swatch Group Ltd -swatch - -// swiftcover : 2015-07-23 Swiftcover Insurance Services Limited -swiftcover - -// swiss : 2014-10-16 Swiss Confederation -swiss - -// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet -sydney - -// symantec : 2014-12-04 Symantec Corporation -symantec - -// systems : 2013-11-07 Dash Cypress, LLC -systems - -// tab : 2014-12-04 Tabcorp Holdings Limited -tab - -// taipei : 2014-07-10 Taipei City Government -taipei - -// talk : 2015-04-09 Amazon EU S.à r.l. -talk - -// taobao : 2015-01-15 Alibaba Group Holding Limited -taobao - -// target : 2015-07-31 Target Domain Holdings, LLC -target - -// tatamotors : 2015-03-12 Tata Motors Ltd -tatamotors - -// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" -tatar - -// tattoo : 2013-08-30 Uniregistry, Corp. -tattoo - -// tax : 2014-03-20 Storm Orchard, LLC -tax - -// taxi : 2015-03-19 Pine Falls, LLC -taxi - -// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. -tci - -// tdk : 2015-06-11 TDK Corporation -tdk - -// team : 2015-03-05 Atomic Lake, LLC -team - -// tech : 2015-01-30 Dot Tech LLC -tech - -// technology : 2013-09-13 Auburn Falls -technology - -// telecity : 2015-02-19 TelecityGroup International Limited -telecity - -// telefonica : 2014-10-16 Telefónica S.A. -telefonica - -// temasek : 2014-08-07 Temasek Holdings (Private) Limited -temasek - -// tennis : 2014-12-04 Cotton Bloom, LLC -tennis - -// teva : 2015-07-02 Teva Pharmaceutical Industries Limited -teva - -// thd : 2015-04-02 Homer TLC, Inc. -thd - -// theater : 2015-03-19 Blue Tigers, LLC -theater - -// theatre : 2015-05-07 -theatre - -// tiaa : 2015-07-23 Teachers Insurance and Annuity Association of America -tiaa - -// tickets : 2015-02-05 Accent Media Limited -tickets - -// tienda : 2013-11-14 Victor Manor, LLC -tienda - -// tiffany : 2015-01-30 Tiffany and Company -tiffany - -// tips : 2013-09-20 Corn Willow, LLC -tips - -// tires : 2014-11-07 Dog Edge, LLC -tires - -// tirol : 2014-04-24 punkt Tirol GmbH -tirol - -// tjmaxx : 2015-07-16 The TJX Companies, Inc. -tjmaxx - -// tjx : 2015-07-16 The TJX Companies, Inc. -tjx - -// tkmaxx : 2015-07-16 The TJX Companies, Inc. -tkmaxx - -// tmall : 2015-01-15 Alibaba Group Holding Limited -tmall - -// today : 2013-09-20 Pearl Woods, LLC -today - -// tokyo : 2013-11-13 GMO Registry, Inc. -tokyo - -// tools : 2013-11-21 Pioneer North, LLC -tools - -// top : 2014-03-20 Jiangsu Bangning Science & Technology Co.,Ltd. -top - -// toray : 2014-12-18 Toray Industries, Inc. -toray - -// toshiba : 2014-04-10 TOSHIBA Corporation -toshiba - -// total : 2015-08-06 Total SA -total - -// tours : 2015-01-22 Sugar Station, LLC -tours - -// town : 2014-03-06 Koko Moon, LLC -town - -// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION -toyota - -// toys : 2014-03-06 Pioneer Orchard, LLC -toys - -// trade : 2014-01-23 Elite Registry Limited -trade - -// trading : 2014-12-11 IG Group Holdings PLC -trading - -// training : 2013-11-07 Wild Willow, LLC -training - -// travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. -travelchannel - -// travelers : 2015-03-26 Travelers TLD, LLC -travelers - -// travelersinsurance : 2015-03-26 Travelers TLD, LLC -travelersinsurance - -// trust : 2014-10-16 -trust - -// trv : 2015-03-26 Travelers TLD, LLC -trv - -// tube : 2015-06-11 Latin American Telecom LLC -tube - -// tui : 2014-07-03 TUI AG -tui - -// tunes : 2015-02-26 Amazon EU S.à r.l. -tunes - -// tushu : 2014-12-18 Amazon EU S.à r.l. -tushu - -// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED -tvs - -// ubank : 2015-08-20 National Australia Bank Limited -ubank - -// ubs : 2014-12-11 UBS AG -ubs - -// uconnect : 2015-07-30 FCA US LLC. -uconnect - -// unicom : 2015-10-15 China United Network Communications Corporation Limited -unicom - -// university : 2014-03-06 Little Station, LLC -university - -// uno : 2013-09-11 Dot Latin LLC -uno - -// uol : 2014-05-01 UBN INTERNET LTDA. -uol - -// ups : 2015-06-25 UPS Market Driver, Inc. -ups - -// vacations : 2013-12-05 Atomic Tigers, LLC -vacations - -// vana : 2014-12-11 Lifestyle Domain Holdings, Inc. -vana - -// vanguard : 2015-09-03 The Vanguard Group, Inc. -vanguard - -// vegas : 2014-01-16 Dot Vegas, Inc. -vegas - -// ventures : 2013-08-27 Binky Lake, LLC -ventures - -// verisign : 2015-08-13 VeriSign, Inc. -verisign - -// versicherung : 2014-03-20 -versicherung - -// vet : 2014-03-06 -vet - -// viajes : 2013-10-17 Black Madison, LLC -viajes - -// video : 2014-10-16 -video - -// vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe -vig - -// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd. -viking - -// villas : 2013-12-05 New Sky, LLC -villas - -// vin : 2015-06-18 Holly Shadow, LLC -vin - -// vip : 2015-01-22 Minds + Machines Group Limited -vip - -// virgin : 2014-09-25 Virgin Enterprises Limited -virgin - -// visa : 2015-07-30 Visa Worldwide Pte. Limited -visa - -// vision : 2013-12-05 Koko Station, LLC -vision - -// vista : 2014-09-18 Vistaprint Limited -vista - -// vistaprint : 2014-09-18 Vistaprint Limited -vistaprint - -// viva : 2014-11-07 Saudi Telecom Company -viva - -// vivo : 2015-07-31 Telefonica Brasil S.A. -vivo - -// vlaanderen : 2014-02-06 DNS.be vzw -vlaanderen - -// vodka : 2013-12-19 Top Level Domain Holdings Limited -vodka - -// volkswagen : 2015-05-14 Volkswagen Group of America Inc. -volkswagen - -// volvo : 2015-11-12 Volvo Holding Sverige Aktiebolag -volvo - -// vote : 2013-11-21 Monolith Registry LLC -vote - -// voting : 2013-11-13 Valuetainment Corp. -voting - -// voto : 2013-11-21 Monolith Registry LLC -voto - -// voyage : 2013-08-27 Ruby House, LLC -voyage - -// vuelos : 2015-03-05 Travel Reservations SRL -vuelos - -// wales : 2014-05-08 Nominet UK -wales - -// walmart : 2015-07-31 Wal-Mart Stores, Inc. -walmart - -// walter : 2014-11-13 Sandvik AB -walter - -// wang : 2013-10-24 Zodiac Leo Limited -wang - -// wanggou : 2014-12-18 Amazon EU S.à r.l. -wanggou - -// warman : 2015-06-18 Weir Group IP Limited -warman - -// watch : 2013-11-14 Sand Shadow, LLC -watch - -// watches : 2014-12-22 Richemont DNS Inc. -watches - -// weather : 2015-01-08 The Weather Channel, LLC -weather - -// weatherchannel : 2015-03-12 The Weather Channel, LLC -weatherchannel - -// webcam : 2014-01-23 dot Webcam Limited -webcam - -// weber : 2015-06-04 Saint-Gobain Weber SA -weber - -// website : 2014-04-03 DotWebsite Inc. -website - -// wed : 2013-10-01 Atgron, Inc. -wed - -// wedding : 2014-04-24 Top Level Domain Holdings Limited -wedding - -// weibo : 2015-03-05 Sina Corporation -weibo - -// weir : 2015-01-29 Weir Group IP Limited -weir - -// whoswho : 2014-02-20 Who's Who Registry -whoswho - -// wien : 2013-10-28 punkt.wien GmbH -wien - -// wiki : 2013-11-07 Top Level Design, LLC -wiki - -// williamhill : 2014-03-13 William Hill Organization Limited -williamhill - -// win : 2014-11-20 First Registry Limited -win - -// windows : 2014-12-18 Microsoft Corporation -windows - -// wine : 2015-06-18 June Station, LLC -wine - -// winners : 2015-07-16 The TJX Companies, Inc. -winners - -// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC -wme - -// wolterskluwer : 2015-08-06 Wolters Kluwer N.V. -wolterskluwer - -// woodside : 2015-07-09 Woodside Petroleum Limited -woodside - -// work : 2013-12-19 Top Level Domain Holdings Limited -work - -// works : 2013-11-14 Little Dynamite, LLC -works - -// world : 2014-06-12 Bitter Fields, LLC -world - -// wow : 2015-10-08 Amazon EU S.à r.l. -wow - -// wtc : 2013-12-19 World Trade Centers Association, Inc. -wtc - -// wtf : 2014-03-06 Hidden Way, LLC -wtf - -// xbox : 2014-12-18 Microsoft Corporation -xbox - -// xerox : 2014-10-24 Xerox DNHC LLC -xerox - -// xfinity : 2015-07-09 Comcast IP Holdings I, LLC -xfinity - -// xihuan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. -xihuan - -// xin : 2014-12-11 Elegant Leader Limited -xin - -// xn--11b4c3d : 2015-01-15 VeriSign Sarl -कॉम - -// xn--1ck2e1b : 2015-02-26 Amazon EU S.à r.l. -セール - -// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd. -佛山 - -// xn--30rr7y : 2014-06-12 Excellent First Limited -慈善 - -// xn--3bst00m : 2013-09-13 Eagle Horizon Limited -集团 - -// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED -在线 - -// xn--3oq18vl8pn36a : 2015-07-02 Volkswagen (China) Investment Co., Ltd. -大众汽车 - -// xn--3pxu8k : 2015-01-15 VeriSign Sarl -点看 - -// xn--42c2d9a : 2015-01-15 VeriSign Sarl -คอม - -// xn--45q11c : 2013-11-21 Zodiac Scorpio Limited -八卦 - -// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment -موقع - -// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center -公益 - -// xn--55qx5d : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) -公司 - -// xn--5su34j936bgsg : 2015-09-03 Shangri‐La International Hotel Management Limited -香格里拉 - -// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited -网站 - -// xn--6frz82g : 2013-09-23 Afilias Limited -移动 - -// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited -我爱你 - -// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) -москва - -// xn--80aqecdr1a : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) -католик - -// xn--80asehdb : 2013-07-14 CORE Association -онлайн - -// xn--80aswg : 2013-07-14 CORE Association -сайт - -// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited -联通 - -// xn--9dbq2a : 2015-01-15 VeriSign Sarl -קום - -// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED -时尚 - -// xn--9krt00a : 2015-03-12 Sina Corporation -微博 - -// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited -淡马锡 - -// xn--bck1b9a5dre4c : 2015-02-26 Amazon EU S.à r.l. -ファッション - -// xn--c1avg : 2013-11-14 Public Interest Registry -орг - -// xn--c2br7g : 2015-01-15 VeriSign Sarl -नेट - -// xn--cck2b3b : 2015-02-26 Amazon EU S.à r.l. -ストア - -// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD -삼성 - -// xn--czr694b : 2014-01-16 Dot Trademark TLD Holding Company Limited -商标 - -// xn--czrs0t : 2013-12-19 Wild Island, LLC -商店 - -// xn--czru2d : 2013-11-21 Zodiac Capricorn Limited -商城 - -// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet” -дети - -// xn--eckvdtc9d : 2014-12-18 Amazon EU S.à r.l. -ポイント - -// xn--efvy88h : 2014-08-22 Xinhua News Agency Guangdong Branch 新华通讯社广东分社 -新闻 - -// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited -工行 - -// xn--fct429k : 2015-04-09 Amazon EU S.à r.l. -家電 - -// xn--fhbei : 2015-01-15 VeriSign Sarl -كوم - -// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED -中文网 - -// xn--fiq64b : 2013-10-14 CITIC Group Corporation -中信 - -// xn--fjq720a : 2014-05-22 Will Bloom, LLC -娱乐 - -// xn--flw351e : 2014-07-31 Charleston Road Registry Inc. -谷歌 - -// xn--fzys8d69uvgm : 2015-05-14 PCCW Enterprises Limited -電訊盈科 - -// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited -购物 - -// xn--gckr3f0f : 2015-02-26 Amazon EU S.à r.l. -クラウド - -// xn--gk3at1e : 2015-10-08 Amazon EU S.à r.l. -通販 - -// xn--hxt814e : 2014-05-15 Zodiac Libra Limited -网店 - -// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry -संगठन - -// xn--imr513n : 2014-12-11 Dot Trademark TLD Holding Company Limited -餐厅 - -// xn--io0a7i : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) -网络 - -// xn--j1aef : 2015-01-15 VeriSign Sarl -ком - -// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation -诺基亚 - -// xn--jvr189m : 2015-02-26 Amazon EU S.à r.l. -食品 - -// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V. -飞利浦 - -// xn--kpu716f : 2014-12-22 Richemont DNS Inc. -手表 - -// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd -手机 - -// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company -ارامكو - -// xn--mgba7c0bbn0a : 2015-05-14 Crescent Holding GmbH -العليان - -// xn--mgbaakc7dvf : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) -اتصالات - -// xn--mgbab2bd : 2013-10-31 CORE Association -بازار - -// xn--mgbb9fbpob : 2014-12-18 GreenTech Consultancy Company W.L.L. -موبايلي - -// xn--mgbca7dzdo : 2015-07-30 Abu Dhabi Systems and Information Centre -ابوظبي - -// xn--mgbi4ecexp : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) -كاثوليك - -// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. -همراه - -// xn--mk1bu44c : 2015-01-15 VeriSign Sarl -닷컴 - -// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd. -政府 - -// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd. -شبكة - -// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House -بيتك - -// xn--ngbrx : 2015-11-12 League of Arab States -عرب - -// xn--nqv7f : 2013-11-14 Public Interest Registry -机构 - -// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry -组织机构 - -// xn--nyqy26a : 2014-11-07 Stable Tone Limited -健康 - -// xn--p1acf : 2013-12-12 Rusnames Limited -рус - -// xn--pbt977c : 2014-12-22 Richemont DNS Inc. -珠宝 - -// xn--pssy2u : 2015-01-15 VeriSign Sarl -大拿 - -// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc. -みんな - -// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc. -グーグル - -// xn--rhqv96g : 2013-09-11 Stable Tone Limited -世界 - -// xn--rovu88b : 2015-02-26 Amazon EU S.à r.l. -書籍 - -// xn--ses554g : 2014-01-16 -网址 - -// xn--t60b56a : 2015-01-15 VeriSign Sarl -닷넷 - -// xn--tckwe : 2015-01-15 VeriSign Sarl -コム - -// xn--tiq49xqyj : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) -天主教 - -// xn--unup4y : 2013-07-14 Spring Fields, LLC -游戏 - -// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG -vermögensberater - -// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG -vermögensberatung - -// xn--vhquv : 2013-08-27 Dash McCook, LLC -企业 - -// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd. -信息 - -// xn--w4r85el8fhu5dnra : 2015-04-30 Kerry Trading Co. Limited -嘉里大酒店 - -// xn--w4rs40l : 2015-07-30 Kerry Trading Co. Limited -嘉里 - -// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd. -广东 - -// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center -政务 - -// xperia : 2015-05-14 Sony Mobile Communications AB -xperia - -// xyz : 2013-12-05 XYZ.COM LLC -xyz - -// yachts : 2014-01-09 DERYachts, LLC -yachts - -// yahoo : 2015-04-02 Yahoo! Domain Services Inc. -yahoo - -// yamaxun : 2014-12-18 Amazon EU S.à r.l. -yamaxun - -// yandex : 2014-04-10 YANDEX, LLC -yandex - -// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. -yodobashi - -// yoga : 2014-05-29 Top Level Domain Holdings Limited -yoga - -// yokohama : 2013-12-12 GMO Registry, Inc. -yokohama - -// you : 2015-04-09 Amazon EU S.à r.l. -you - -// youtube : 2014-05-01 Charleston Road Registry Inc. -youtube - -// yun : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. -yun - -// zappos : 2015-06-25 Amazon EU S.à r.l. -zappos - -// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) -zara - -// zero : 2014-12-18 Amazon EU S.à r.l. -zero - -// zip : 2014-05-08 Charleston Road Registry Inc. -zip - -// zippo : 2015-07-02 Zadco Company -zippo - -// zone : 2013-11-14 Outer Falls, LLC -zone - -// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich) -zuerich - - -// ===END ICANN DOMAINS=== -// ===BEGIN PRIVATE DOMAINS=== -// (Note: these are in alphabetical order by company name) - -// 1GB LLC : https://www.1gb.ua/ -// Submitted by 1GB LLC -cc.ua -inf.ua -ltd.ua - -// Agnat sp. z o.o. : https://domena.pl -// Submitted by Przemyslaw Plewa -beep.pl - -// Alces Software Ltd : http://alces-software.com -// Submitted by Mark J. Titorenko -*.compute.estate -*.alces.network - -// alwaysdata : https://www.alwaysdata.com -// Submitted by Cyril -*.alwaysdata.net - -// Amazon CloudFront : https://aws.amazon.com/cloudfront/ -// Submitted by Donavan Miller -cloudfront.net - -// Amazon Elastic Compute Cloud : https://aws.amazon.com/ec2/ -// Submitted by Luke Wells -*.compute.amazonaws.com -*.compute-1.amazonaws.com -*.compute.amazonaws.com.cn -us-east-1.amazonaws.com - -// Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ -// Submitted by Luke Wells -cn-north-1.eb.amazonaws.com.cn -elasticbeanstalk.com -ap-northeast-1.elasticbeanstalk.com -ap-northeast-2.elasticbeanstalk.com -ap-south-1.elasticbeanstalk.com -ap-southeast-1.elasticbeanstalk.com -ap-southeast-2.elasticbeanstalk.com -ca-central-1.elasticbeanstalk.com -eu-central-1.elasticbeanstalk.com -eu-west-1.elasticbeanstalk.com -eu-west-2.elasticbeanstalk.com -sa-east-1.elasticbeanstalk.com -us-east-1.elasticbeanstalk.com -us-east-2.elasticbeanstalk.com -us-gov-west-1.elasticbeanstalk.com -us-west-1.elasticbeanstalk.com -us-west-2.elasticbeanstalk.com - -// Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/ -// Submitted by Luke Wells -*.elb.amazonaws.com -*.elb.amazonaws.com.cn - -// Amazon S3 : https://aws.amazon.com/s3/ -// Submitted by Luke Wells -s3.amazonaws.com -s3-ap-northeast-1.amazonaws.com -s3-ap-northeast-2.amazonaws.com -s3-ap-south-1.amazonaws.com -s3-ap-southeast-1.amazonaws.com -s3-ap-southeast-2.amazonaws.com -s3-ca-central-1.amazonaws.com -s3-eu-central-1.amazonaws.com -s3-eu-west-1.amazonaws.com -s3-eu-west-2.amazonaws.com -s3-external-1.amazonaws.com -s3-fips-us-gov-west-1.amazonaws.com -s3-sa-east-1.amazonaws.com -s3-us-gov-west-1.amazonaws.com -s3-us-east-2.amazonaws.com -s3-us-west-1.amazonaws.com -s3-us-west-2.amazonaws.com -s3.ap-northeast-2.amazonaws.com -s3.ap-south-1.amazonaws.com -s3.cn-north-1.amazonaws.com.cn -s3.ca-central-1.amazonaws.com -s3.eu-central-1.amazonaws.com -s3.eu-west-2.amazonaws.com -s3.us-east-2.amazonaws.com -s3.dualstack.ap-northeast-1.amazonaws.com -s3.dualstack.ap-northeast-2.amazonaws.com -s3.dualstack.ap-south-1.amazonaws.com -s3.dualstack.ap-southeast-1.amazonaws.com -s3.dualstack.ap-southeast-2.amazonaws.com -s3.dualstack.ca-central-1.amazonaws.com -s3.dualstack.eu-central-1.amazonaws.com -s3.dualstack.eu-west-1.amazonaws.com -s3.dualstack.eu-west-2.amazonaws.com -s3.dualstack.sa-east-1.amazonaws.com -s3.dualstack.us-east-1.amazonaws.com -s3.dualstack.us-east-2.amazonaws.com -s3-website-us-east-1.amazonaws.com -s3-website-us-west-1.amazonaws.com -s3-website-us-west-2.amazonaws.com -s3-website-ap-northeast-1.amazonaws.com -s3-website-ap-southeast-1.amazonaws.com -s3-website-ap-southeast-2.amazonaws.com -s3-website-eu-west-1.amazonaws.com -s3-website-sa-east-1.amazonaws.com -s3-website.ap-northeast-2.amazonaws.com -s3-website.ap-south-1.amazonaws.com -s3-website.ca-central-1.amazonaws.com -s3-website.eu-central-1.amazonaws.com -s3-website.eu-west-2.amazonaws.com -s3-website.us-east-2.amazonaws.com - -// Amune : https://amune.org/ -// Submitted by Team Amune -t3l3p0rt.net -tele.amune.org - -// Aptible : https://www.aptible.com/ -// Submitted by Thomas Orozco -on-aptible.com - -// Asociación Amigos de la Informática "Euskalamiga" : http://encounter.eus/ -// Submitted by Hector Martin -user.party.eus - -// Association potager.org : https://potager.org/ -// Submitted by Lunar -pimienta.org -poivron.org -potager.org -sweetpepper.org - -// ASUSTOR Inc. : http://www.asustor.com -// Submitted by Vincent Tseng -myasustor.com - -// AVM : https://avm.de -// Submitted by Andreas Weise -myfritz.net - -// AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com -// Submitted by James Kennedy -*.awdev.ca -*.advisor.ws - -// backplane : https://www.backplane.io -// Submitted by Anthony Voutas -backplaneapp.io - -// BetaInABox -// Submitted by Adrian -betainabox.com - -// BinaryLane : http://www.binarylane.com -// Submitted by Nathan O'Sullivan -bnr.la - -// Boomla : https://boomla.com -// Submitted by Tibor Halter -boomla.net - -// Boxfuse : https://boxfuse.com -// Submitted by Axel Fontaine -boxfuse.io - -// bplaced : https://www.bplaced.net/ -// Submitted by Miroslav Bozic -square7.ch -bplaced.com -bplaced.de -square7.de -bplaced.net -square7.net - -// BrowserSafetyMark -// Submitted by Dave Tharp -browsersafetymark.io - -// callidomus : https://www.callidomus.com/ -// Submitted by Marcus Popp -mycd.eu - -// CentralNic : http://www.centralnic.com/names/domains -// Submitted by registry -ae.org -ar.com -br.com -cn.com -com.de -com.se -de.com -eu.com -gb.com -gb.net -hu.com -hu.net -jp.net -jpn.com -kr.com -mex.com -no.com -qc.com -ru.com -sa.com -se.com -se.net -uk.com -uk.net -us.com -uy.com -za.bz -za.com - -// Africa.com Web Solutions Ltd : https://registry.africa.com -// Submitted by Gavin Brown -africa.com - -// iDOT Services Limited : http://www.domain.gr.com -// Submitted by Gavin Brown -gr.com - -// Radix FZC : http://domains.in.net -// Submitted by Gavin Brown -in.net - -// US REGISTRY LLC : http://us.org -// Submitted by Gavin Brown -us.org - -// co.com Registry, LLC : https://registry.co.com -// Submitted by Gavin Brown -co.com - -// c.la : http://www.c.la/ -c.la - -// certmgr.org : https://certmgr.org -// Submitted by B. Blechschmidt -certmgr.org - -// Citrix : https://citrix.com -// Submitted by Alex Stoddard -xenapponazure.com - -// ClearVox : http://www.clearvox.nl/ -// Submitted by Leon Rowland -virtueeldomein.nl - -// Cloud66 : https://www.cloud66.com/ -// Submitted by Khash Sajadi -c66.me - -// CloudAccess.net : https://www.cloudaccess.net/ -// Submitted by Pawel Panek -jdevcloud.com -wpdevcloud.com -cloudaccess.host -freesite.host -cloudaccess.net - -// cloudControl : https://www.cloudcontrol.com/ -// Submitted by Tobias Wilken -cloudcontrolled.com -cloudcontrolapp.com - -// co.ca : http://registry.co.ca/ -co.ca - -// i-registry s.r.o. : http://www.i-registry.cz/ -// Submitted by Martin Semrad -co.cz - -// CDN77.com : http://www.cdn77.com -// Submitted by Jan Krpes -c.cdn77.org -cdn77-ssl.net -r.cdn77.net -rsc.cdn77.org -ssl.origin.cdn77-secure.org - -// Cloud DNS Ltd : http://www.cloudns.net -// Submitted by Aleksander Hristov -cloudns.asia -cloudns.biz -cloudns.club -cloudns.cc -cloudns.eu -cloudns.in -cloudns.info -cloudns.org -cloudns.pro -cloudns.pw -cloudns.us - -// CoDNS B.V. -co.nl -co.no - -// COSIMO GmbH : http://www.cosimo.de -// Submitted by Rene Marticke -dyn.cosidns.de -dynamisches-dns.de -dnsupdater.de -internet-dns.de -l-o-g-i-n.de -dynamic-dns.info -feste-ip.net -knx-server.net -static-access.net - -// Craynic, s.r.o. : http://www.craynic.com/ -// Submitted by Ales Krajnik -realm.cz - -// Cryptonomic : https://cryptonomic.net/ -// Submitted by Andrew Cady -*.cryptonomic.net - -// Cupcake : https://cupcake.io/ -// Submitted by Jonathan Rudenberg -cupcake.is - -// cyon GmbH : https://www.cyon.ch/ -// Submitted by Dominic Luechinger -cyon.link -cyon.site - -// Daplie, Inc : https://daplie.com -// Submitted by AJ ONeal -daplie.me -localhost.daplie.me - -// Dansk.net : http://www.dansk.net/ -// Submitted by Anani Voule -biz.dk -co.dk -firm.dk -reg.dk -store.dk - -// Debian : https://www.debian.org/ -// Submitted by Peter Palfrader / Debian Sysadmin Team -debian.net - -// deSEC : https://desec.io/ -// Submitted by Peter Thomassen -dedyn.io - -// DNShome : https://www.dnshome.de/ -// Submitted by Norbert Auler -dnshome.de - -// DrayTek Corp. : https://www.draytek.com/ -// Submitted by Paul Fang -drayddns.com - -// DreamHost : http://www.dreamhost.com/ -// Submitted by Andrew Farmer -dreamhosters.com - -// Drobo : http://www.drobo.com/ -// Submitted by Ricardo Padilha -mydrobo.com - -// Drud Holdings, LLC. : https://www.drud.com/ -// Submitted by Kevin Bridges -drud.io -drud.us - -// DuckDNS : http://www.duckdns.org/ -// Submitted by Richard Harper -duckdns.org - -// dy.fi : http://dy.fi/ -// Submitted by Heikki Hannikainen -dy.fi -tunk.org - -// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/ -dyndns-at-home.com -dyndns-at-work.com -dyndns-blog.com -dyndns-free.com -dyndns-home.com -dyndns-ip.com -dyndns-mail.com -dyndns-office.com -dyndns-pics.com -dyndns-remote.com -dyndns-server.com -dyndns-web.com -dyndns-wiki.com -dyndns-work.com -dyndns.biz -dyndns.info -dyndns.org -dyndns.tv -at-band-camp.net -ath.cx -barrel-of-knowledge.info -barrell-of-knowledge.info -better-than.tv -blogdns.com -blogdns.net -blogdns.org -blogsite.org -boldlygoingnowhere.org -broke-it.net -buyshouses.net -cechire.com -dnsalias.com -dnsalias.net -dnsalias.org -dnsdojo.com -dnsdojo.net -dnsdojo.org -does-it.net -doesntexist.com -doesntexist.org -dontexist.com -dontexist.net -dontexist.org -doomdns.com -doomdns.org -dvrdns.org -dyn-o-saur.com -dynalias.com -dynalias.net -dynalias.org -dynathome.net -dyndns.ws -endofinternet.net -endofinternet.org -endoftheinternet.org -est-a-la-maison.com -est-a-la-masion.com -est-le-patron.com -est-mon-blogueur.com -for-better.biz -for-more.biz -for-our.info -for-some.biz -for-the.biz -forgot.her.name -forgot.his.name -from-ak.com -from-al.com -from-ar.com -from-az.net -from-ca.com -from-co.net -from-ct.com -from-dc.com -from-de.com -from-fl.com -from-ga.com -from-hi.com -from-ia.com -from-id.com -from-il.com -from-in.com -from-ks.com -from-ky.com -from-la.net -from-ma.com -from-md.com -from-me.org -from-mi.com -from-mn.com -from-mo.com -from-ms.com -from-mt.com -from-nc.com -from-nd.com -from-ne.com -from-nh.com -from-nj.com -from-nm.com -from-nv.com -from-ny.net -from-oh.com -from-ok.com -from-or.com -from-pa.com -from-pr.com -from-ri.com -from-sc.com -from-sd.com -from-tn.com -from-tx.com -from-ut.com -from-va.com -from-vt.com -from-wa.com -from-wi.com -from-wv.com -from-wy.com -ftpaccess.cc -fuettertdasnetz.de -game-host.org -game-server.cc -getmyip.com -gets-it.net -go.dyndns.org -gotdns.com -gotdns.org -groks-the.info -groks-this.info -ham-radio-op.net -here-for-more.info -hobby-site.com -hobby-site.org -home.dyndns.org -homedns.org -homeftp.net -homeftp.org -homeip.net -homelinux.com -homelinux.net -homelinux.org -homeunix.com -homeunix.net -homeunix.org -iamallama.com -in-the-band.net -is-a-anarchist.com -is-a-blogger.com -is-a-bookkeeper.com -is-a-bruinsfan.org -is-a-bulls-fan.com -is-a-candidate.org -is-a-caterer.com -is-a-celticsfan.org -is-a-chef.com -is-a-chef.net -is-a-chef.org -is-a-conservative.com -is-a-cpa.com -is-a-cubicle-slave.com -is-a-democrat.com -is-a-designer.com -is-a-doctor.com -is-a-financialadvisor.com -is-a-geek.com -is-a-geek.net -is-a-geek.org -is-a-green.com -is-a-guru.com -is-a-hard-worker.com -is-a-hunter.com -is-a-knight.org -is-a-landscaper.com -is-a-lawyer.com -is-a-liberal.com -is-a-libertarian.com -is-a-linux-user.org -is-a-llama.com -is-a-musician.com -is-a-nascarfan.com -is-a-nurse.com -is-a-painter.com -is-a-patsfan.org -is-a-personaltrainer.com -is-a-photographer.com -is-a-player.com -is-a-republican.com -is-a-rockstar.com -is-a-socialist.com -is-a-soxfan.org -is-a-student.com -is-a-teacher.com -is-a-techie.com -is-a-therapist.com -is-an-accountant.com -is-an-actor.com -is-an-actress.com -is-an-anarchist.com -is-an-artist.com -is-an-engineer.com -is-an-entertainer.com -is-by.us -is-certified.com -is-found.org -is-gone.com -is-into-anime.com -is-into-cars.com -is-into-cartoons.com -is-into-games.com -is-leet.com -is-lost.org -is-not-certified.com -is-saved.org -is-slick.com -is-uberleet.com -is-very-bad.org -is-very-evil.org -is-very-good.org -is-very-nice.org -is-very-sweet.org -is-with-theband.com -isa-geek.com -isa-geek.net -isa-geek.org -isa-hockeynut.com -issmarterthanyou.com -isteingeek.de -istmein.de -kicks-ass.net -kicks-ass.org -knowsitall.info -land-4-sale.us -lebtimnetz.de -leitungsen.de -likes-pie.com -likescandy.com -merseine.nu -mine.nu -misconfused.org -mypets.ws -myphotos.cc -neat-url.com -office-on-the.net -on-the-web.tv -podzone.net -podzone.org -readmyblog.org -saves-the-whales.com -scrapper-site.net -scrapping.cc -selfip.biz -selfip.com -selfip.info -selfip.net -selfip.org -sells-for-less.com -sells-for-u.com -sells-it.net -sellsyourhome.org -servebbs.com -servebbs.net -servebbs.org -serveftp.net -serveftp.org -servegame.org -shacknet.nu -simple-url.com -space-to-rent.com -stuff-4-sale.org -stuff-4-sale.us -teaches-yoga.com -thruhere.net -traeumtgerade.de -webhop.biz -webhop.info -webhop.net -webhop.org -worse-than.tv -writesthisblog.com - -// ddnss.de : https://www.ddnss.de/ -// Submitted by Robert Niedziela -ddnss.de -dyn.ddnss.de -dyndns.ddnss.de -dyndns1.de -dyn-ip24.de -home-webserver.de -dyn.home-webserver.de -myhome-server.de -ddnss.org - -// Definima : http://www.definima.com/ -// Submitted by Maxence Bitterli -definima.net -definima.io - -// Dynu.com : https://www.dynu.com/ -// Submitted by Sue Ye -ddnsfree.com -ddnsgeek.com -giize.com -gleeze.com -kozow.com -loseyourip.com -ooguy.com -theworkpc.com -casacam.net -dynu.net -accesscam.org -camdvr.org -freeddns.org -mywire.org -webredirect.org -myddns.rocks -blogsite.xyz - -// dynv6 : https://dynv6.com -// Submitted by Dominik Menke -dynv6.net - -// E4YOU spol. s.r.o. : https://e4you.cz/ -// Submitted by Vladimir Dudr -e4.cz - -// Enalean SAS: https://www.enalean.com -// Submitted by Thomas Cottier -mytuleap.com - -// Enonic : http://enonic.com/ -// Submitted by Erik Kaareng-Sunde -enonic.io -customer.enonic.io - -// EU.org https://eu.org/ -// Submitted by Pierre Beyssac -eu.org -al.eu.org -asso.eu.org -at.eu.org -au.eu.org -be.eu.org -bg.eu.org -ca.eu.org -cd.eu.org -ch.eu.org -cn.eu.org -cy.eu.org -cz.eu.org -de.eu.org -dk.eu.org -edu.eu.org -ee.eu.org -es.eu.org -fi.eu.org -fr.eu.org -gr.eu.org -hr.eu.org -hu.eu.org -ie.eu.org -il.eu.org -in.eu.org -int.eu.org -is.eu.org -it.eu.org -jp.eu.org -kr.eu.org -lt.eu.org -lu.eu.org -lv.eu.org -mc.eu.org -me.eu.org -mk.eu.org -mt.eu.org -my.eu.org -net.eu.org -ng.eu.org -nl.eu.org -no.eu.org -nz.eu.org -paris.eu.org -pl.eu.org -pt.eu.org -q-a.eu.org -ro.eu.org -ru.eu.org -se.eu.org -si.eu.org -sk.eu.org -tr.eu.org -uk.eu.org -us.eu.org - -// Evennode : http://www.evennode.com/ -// Submitted by Michal Kralik -eu-1.evennode.com -eu-2.evennode.com -eu-3.evennode.com -eu-4.evennode.com -us-1.evennode.com -us-2.evennode.com -us-3.evennode.com -us-4.evennode.com - -// eDirect Corp. : https://hosting.url.com.tw/ -// Submitted by C.S. chang -twmail.cc -twmail.net -twmail.org -mymailer.com.tw -url.tw - -// Facebook, Inc. -// Submitted by Peter Ruibal -apps.fbsbx.com - -// FAITID : https://faitid.org/ -// Submitted by Maxim Alzoba -// https://www.flexireg.net/stat_info -ru.net -adygeya.ru -bashkiria.ru -bir.ru -cbg.ru -com.ru -dagestan.ru -grozny.ru -kalmykia.ru -kustanai.ru -marine.ru -mordovia.ru -msk.ru -mytis.ru -nalchik.ru -nov.ru -pyatigorsk.ru -spb.ru -vladikavkaz.ru -vladimir.ru -abkhazia.su -adygeya.su -aktyubinsk.su -arkhangelsk.su -armenia.su -ashgabad.su -azerbaijan.su -balashov.su -bashkiria.su -bryansk.su -bukhara.su -chimkent.su -dagestan.su -east-kazakhstan.su -exnet.su -georgia.su -grozny.su -ivanovo.su -jambyl.su -kalmykia.su -kaluga.su -karacol.su -karaganda.su -karelia.su -khakassia.su -krasnodar.su -kurgan.su -kustanai.su -lenug.su -mangyshlak.su -mordovia.su -msk.su -murmansk.su -nalchik.su -navoi.su -north-kazakhstan.su -nov.su -obninsk.su -penza.su -pokrovsk.su -sochi.su -spb.su -tashkent.su -termez.su -togliatti.su -troitsk.su -tselinograd.su -tula.su -tuva.su -vladikavkaz.su -vladimir.su -vologda.su - -// Fancy Bits, LLC : http://getchannels.com -// Submitted by Aman Gupta -channelsdvr.net - -// Fastly Inc. : http://www.fastly.com/ -// Submitted by Fastly Security -fastlylb.net -map.fastlylb.net -freetls.fastly.net -map.fastly.net -a.prod.fastly.net -global.prod.fastly.net -a.ssl.fastly.net -b.ssl.fastly.net -global.ssl.fastly.net - -// Featherhead : https://featherhead.xyz/ -// Submitted by Simon Menke -fhapp.xyz - -// Fedora : https://fedoraproject.org/ -// submitted by Patrick Uiterwijk -fedorainfracloud.org -fedorapeople.org -cloud.fedoraproject.org - -// Filegear Inc. : https://www.filegear.com -// Submitted by Jason Zhu -filegear.me - -// Firebase, Inc. -// Submitted by Chris Raynor -firebaseapp.com - -// Flynn : https://flynn.io -// Submitted by Jonathan Rudenberg -flynnhub.com -flynnhosting.net - -// Freebox : http://www.freebox.fr -// Submitted by Romain Fliedel -freebox-os.com -freeboxos.com -fbx-os.fr -fbxos.fr -freebox-os.fr -freeboxos.fr - -// Fusion Intranet : https://www.fusion-intranet.com -// Submitted by Matthias Burtscher -myfusion.cloud - -// Futureweb OG : http://www.futureweb.at -// Submitted by Andreas Schnederle-Wagner -*.futurecms.at -futurehosting.at -futuremailing.at -*.ex.ortsinfo.at -*.kunden.ortsinfo.at -*.statics.cloud - -// GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains -// Submitted by David Illsley -service.gov.uk - -// GitHub, Inc. -// Submitted by Patrick Toomey -github.io -githubusercontent.com - -// GitLab, Inc. -// Submitted by Alex Hanselka -gitlab.io - -// UKHomeOffice : https://www.gov.uk/government/organisations/home-office -// Submitted by Jon Shanks -homeoffice.gov.uk - -// GlobeHosting, Inc. -// Submitted by Zoltan Egresi -ro.im -shop.ro - -// GoIP DNS Services : http://www.goip.de -// Submitted by Christian Poulter -goip.de - -// Google, Inc. -// Submitted by Eduardo Vela -*.0emm.com -appspot.com -blogspot.ae -blogspot.al -blogspot.am -blogspot.ba -blogspot.be -blogspot.bg -blogspot.bj -blogspot.ca -blogspot.cf -blogspot.ch -blogspot.cl -blogspot.co.at -blogspot.co.id -blogspot.co.il -blogspot.co.ke -blogspot.co.nz -blogspot.co.uk -blogspot.co.za -blogspot.com -blogspot.com.ar -blogspot.com.au -blogspot.com.br -blogspot.com.by -blogspot.com.co -blogspot.com.cy -blogspot.com.ee -blogspot.com.eg -blogspot.com.es -blogspot.com.mt -blogspot.com.ng -blogspot.com.tr -blogspot.com.uy -blogspot.cv -blogspot.cz -blogspot.de -blogspot.dk -blogspot.fi -blogspot.fr -blogspot.gr -blogspot.hk -blogspot.hr -blogspot.hu -blogspot.ie -blogspot.in -blogspot.is -blogspot.it -blogspot.jp -blogspot.kr -blogspot.li -blogspot.lt -blogspot.lu -blogspot.md -blogspot.mk -blogspot.mr -blogspot.mx -blogspot.my -blogspot.nl -blogspot.no -blogspot.pe -blogspot.pt -blogspot.qa -blogspot.re -blogspot.ro -blogspot.rs -blogspot.ru -blogspot.se -blogspot.sg -blogspot.si -blogspot.sk -blogspot.sn -blogspot.td -blogspot.tw -blogspot.ug -blogspot.vn -cloudfunctions.net -cloud.goog -codespot.com -googleapis.com -googlecode.com -pagespeedmobilizer.com -publishproxy.com -withgoogle.com -withyoutube.com - -// Hashbang : https://hashbang.sh -hashbang.sh - -// Hasura : https://hasura.io -// Submitted by Shahidh K Muhammed -hasura-app.io - -// Hepforge : https://www.hepforge.org -// Submitted by David Grellscheid -hepforge.org - -// Heroku : https://www.heroku.com/ -// Submitted by Tom Maher -herokuapp.com -herokussl.com - -// Ici la Lune : http://www.icilalune.com/ -// Submitted by Simon Morvan -moonscale.net - -// iki.fi -// Submitted by Hannu Aronsson -iki.fi - -// info.at : http://www.info.at/ -biz.at -info.at - -// info.cx : http://info.cx -// Submitted by Jacob Slater -info.cx - -// Interlegis : http://www.interlegis.leg.br -// Submitted by Gabriel Ferreira -ac.leg.br -al.leg.br -am.leg.br -ap.leg.br -ba.leg.br -ce.leg.br -df.leg.br -es.leg.br -go.leg.br -ma.leg.br -mg.leg.br -ms.leg.br -mt.leg.br -pa.leg.br -pb.leg.br -pe.leg.br -pi.leg.br -pr.leg.br -rj.leg.br -rn.leg.br -ro.leg.br -rr.leg.br -rs.leg.br -sc.leg.br -se.leg.br -sp.leg.br -to.leg.br - -// intermetrics GmbH : https://pixolino.com/ -// Submitted by Wolfgang Schwarz -pixolino.com - -// IPiFony Systems, Inc. : https://www.ipifony.com/ -// Submitted by Matthew Hardeman -ipifony.net - -// Joyent : https://www.joyent.com/ -// Submitted by Brian Bennett -*.triton.zone -*.cns.joyent.com - -// JS.ORG : http://dns.js.org -// Submitted by Stefan Keim -js.org - -// Keyweb AG : https://www.keyweb.de -// Submitted by Martin Dannehl -keymachine.de - -// KnightPoint Systems, LLC : http://www.knightpoint.com/ -// Submitted by Roy Keene -knightpoint.systems - -// .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf -co.krd -edu.krd - -// LCube - Professional hosting e.K. : https://www.lcube-webhosting.de -// Submitted by Lars Laehn -git-repos.de -lcube-server.de -svn-repos.de - -// LiquidNet Ltd : http://www.liquidnetlimited.com/ -// Submitted by Victor Velchev -we.bs - -// Lukanet Ltd : https://lukanet.com -// Submitted by Anton Avramov -barsy.bg -barsyonline.com -barsy.de -barsy.eu -barsy.in -barsy.net -barsy.online -barsy.support - -// Magento Commerce -// Submitted by Damien Tournoud -*.magentosite.cloud - -// Mail.Ru Group : https://hb.cldmail.ru -// Submitted by Ilya Zaretskiy -hb.cldmail.ru - -// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ -// Submitted by Zdeněk Šustr -cloud.metacentrum.cz -custom.metacentrum.cz - -// Meteor Development Group : https://www.meteor.com/hosting -// Submitted by Pierre Carrier -meteorapp.com -eu.meteorapp.com - -// Michau Enterprises Limited : http://www.co.pl/ -co.pl - -// Microsoft : http://microsoft.com -// Submitted by Barry Dorrans -azurewebsites.net -azure-mobile.net -cloudapp.net - -// Mozilla Foundation : https://mozilla.org/ -// Submitted by glob -bmoattachments.org - -// MSK-IX : https://www.msk-ix.ru/ -// Submitted by Khannanov Roman -net.ru -org.ru -pp.ru - -// Netlify : https://www.netlify.com -// Submitted by Jessica Parsons -bitballoon.com -netlify.com - -// Neustar Inc. -// Submitted by Trung Tran -4u.com - -// ngrok : https://ngrok.com/ -// Submitted by Alan Shreve -ngrok.io - -// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/ -// Submitted by Jeff Wheelhouse -nfshost.com - -// nsupdate.info : https://www.nsupdate.info/ -// Submitted by Thomas Waldmann -nsupdate.info -nerdpol.ovh - -// No-IP.com : https://noip.com/ -// Submitted by Deven Reza -blogsyte.com -brasilia.me -cable-modem.org -ciscofreak.com -collegefan.org -couchpotatofries.org -damnserver.com -ddns.me -ditchyourip.com -dnsfor.me -dnsiskinky.com -dvrcam.info -dynns.com -eating-organic.net -fantasyleague.cc -geekgalaxy.com -golffan.us -health-carereform.com -homesecuritymac.com -homesecuritypc.com -hopto.me -ilovecollege.info -loginto.me -mlbfan.org -mmafan.biz -myactivedirectory.com -mydissent.net -myeffect.net -mymediapc.net -mypsx.net -mysecuritycamera.com -mysecuritycamera.net -mysecuritycamera.org -net-freaks.com -nflfan.org -nhlfan.net -no-ip.ca -no-ip.co.uk -no-ip.net -noip.us -onthewifi.com -pgafan.net -point2this.com -pointto.us -privatizehealthinsurance.net -quicksytes.com -read-books.org -securitytactics.com -serveexchange.com -servehumour.com -servep2p.com -servesarcasm.com -stufftoread.com -ufcfan.org -unusualperson.com -workisboring.com -3utilities.com -bounceme.net -ddns.net -ddnsking.com -gotdns.ch -hopto.org -myftp.biz -myftp.org -myvnc.com -no-ip.biz -no-ip.info -no-ip.org -noip.me -redirectme.net -servebeer.com -serveblog.net -servecounterstrike.com -serveftp.com -servegame.com -servehalflife.com -servehttp.com -serveirc.com -serveminecraft.net -servemp3.com -servepics.com -servequake.com -sytes.net -webhop.me -zapto.org - -// NodeArt : https://nodeart.io -// Submitted by Konstantin Nosov -stage.nodeart.io - -// Nodum B.V. : https://nodum.io/ -// Submitted by Wietse Wind -nodum.co -nodum.io - -// NYC.mn : http://www.information.nyc.mn -// Submitted by Matthew Brown -nyc.mn - -// NymNom : https://nymnom.com/ -// Submitted by Dave McCormack -nom.ae -nom.ai -nom.al -nym.by -nym.bz -nom.cl -nom.gd -nom.gl -nym.gr -nom.gt -nom.hn -nom.im -nym.kz -nym.la -nom.li -nym.li -nym.lt -nym.lu -nym.me -nom.mk -nym.mx -nom.nu -nym.nz -nym.pe -nym.pt -nom.pw -nom.qa -nom.rs -nom.si -nym.sk -nym.su -nym.sx -nym.tw -nom.ug -nom.uy -nom.vc -nom.vg - -// Octopodal Solutions, LLC. : https://ulterius.io/ -// Submitted by Andrew Sampson -cya.gg - -// One Fold Media : http://www.onefoldmedia.com/ -// Submitted by Eddie Jones -nid.io - -// OpenCraft GmbH : http://opencraft.com/ -// Submitted by Sven Marnach -opencraft.hosting - -// Opera Software, A.S.A. -// Submitted by Yngve Pettersen -operaunite.com - -// OutSystems -// Submitted by Duarte Santos -outsystemscloud.com - -// OwnProvider : http://www.ownprovider.com -// Submitted by Jan Moennich -ownprovider.com - -// oy.lc -// Submitted by Charly Coste -oy.lc - -// Pagefog : https://pagefog.com/ -// Submitted by Derek Myers -pgfog.com - -// Pagefront : https://www.pagefronthq.com/ -// Submitted by Jason Kriss -pagefrontapp.com - -// .pl domains (grandfathered) -art.pl -gliwice.pl -krakow.pl -poznan.pl -wroc.pl -zakopane.pl - -// Pantheon Systems, Inc. : https://pantheon.io/ -// Submitted by Gary Dylina -pantheonsite.io -gotpantheon.com - -// Peplink | Pepwave : http://peplink.com/ -// Submitted by Steve Leung -mypep.link - -// Planet-Work : https://www.planet-work.com/ -// Submitted by Frédéric VANNIÈRE -on-web.fr - -// Platform.sh : https://platform.sh -// Submitted by Nikola Kotur -*.platform.sh -*.platformsh.site - -// prgmr.com : https://prgmr.com/ -// Submitted by Sarah Newman -xen.prgmr.com - -// priv.at : http://www.nic.priv.at/ -// Submitted by registry -priv.at - -// Protonet GmbH : http://protonet.io -// Submitted by Martin Meier -protonet.io - -// Publication Presse Communication SARL : https://ppcom.fr -// Submitted by Yaacov Akiba Slama -chirurgiens-dentistes-en-france.fr -byen.site - -// QA2 -// Submitted by Daniel Dent (https://www.danieldent.com/) -qa2.com - -// QNAP System Inc : https://www.qnap.com -// Submitted by Nick Chang -dev-myqnapcloud.com -alpha-myqnapcloud.com -myqnapcloud.com - -// Quip : https://quip.com -// Submitted by Patrick Linehan -*.quipelements.com - -// Qutheory LLC : http://qutheory.io -// Submitted by Jonas Schwartz -vapor.cloud -vaporcloud.io - -// Rackmaze LLC : https://www.rackmaze.com -// Submitted by Kirill Pertsev -rackmaze.com -rackmaze.net - -// Red Hat, Inc. OpenShift : https://openshift.redhat.com/ -// Submitted by Tim Kramer -rhcloud.com - -// RethinkDB : https://www.rethinkdb.com/ -// Submitted by Chris Kastorff -hzc.io - -// Revitalised Limited : http://www.revitalised.co.uk -// Submitted by Jack Price -wellbeingzone.eu -ptplus.fit -wellbeingzone.co.uk - -// Sandstorm Development Group, Inc. : https://sandcats.io/ -// Submitted by Asheesh Laroia -sandcats.io - -// SBE network solutions GmbH : https://www.sbe.de/ -// Submitted by Norman Meilick -logoip.de -logoip.com - -// Securepoint GmbH : https://www.securepoint.de -// Submitted by Erik Anders -firewall-gateway.com -firewall-gateway.de -my-gateway.de -my-router.de -spdns.de -spdns.eu -firewall-gateway.net -my-firewall.org -myfirewall.org -spdns.org - -// SensioLabs, SAS : https://sensiolabs.com/ -// Submitted by Fabien Potencier -*.sensiosite.cloud - -// Service Online LLC : http://drs.ua/ -// Submitted by Serhii Bulakh -biz.ua -co.ua -pp.ua - -// ShiftEdit : https://shiftedit.net/ -// Submitted by Adam Jimenez -shiftedit.io - -// Shopblocks : http://www.shopblocks.com/ -// Submitted by Alex Bowers -myshopblocks.com - -// SinaAppEngine : http://sae.sina.com.cn/ -// Submitted by SinaAppEngine -1kapp.com -appchizi.com -applinzi.com -sinaapp.com -vipsinaapp.com - -// Skyhat : http://www.skyhat.io -// Submitted by Shante Adam -bounty-full.com -alpha.bounty-full.com -beta.bounty-full.com - -// staticland : https://static.land -// Submitted by Seth Vincent -static.land -dev.static.land -sites.static.land - -// SourceLair PC : https://www.sourcelair.com -// Submitted by Antonis Kalipetis -apps.lair.io -*.stolos.io - -// SpaceKit : https://www.spacekit.io/ -// Submitted by Reza Akhavan -spacekit.io - -// Stackspace : https://www.stackspace.io/ -// Submitted by Lina He -stackspace.space - -// Storj Labs Inc. : https://storj.io/ -// Submitted by Philip Hutchins -storj.farm - -// Sub 6 Limited: http://www.sub6.com -// Submitted by Dan Miller -temp-dns.com - -// Synology, Inc. : https://www.synology.com/ -// Submitted by Rony Weng -diskstation.me -dscloud.biz -dscloud.me -dscloud.mobi -dsmynas.com -dsmynas.net -dsmynas.org -familyds.com -familyds.net -familyds.org -i234.me -myds.me -synology.me -vpnplus.to - -// TAIFUN Software AG : http://taifun-software.de -// Submitted by Bjoern Henke -taifun-dns.de - -// TASK geographical domains (www.task.gda.pl/uslugi/dns) -gda.pl -gdansk.pl -gdynia.pl -med.pl -sopot.pl - -// Thingdust AG : https://thingdust.com/ -// Submitted by Adrian Imboden -cust.dev.thingdust.io -cust.disrec.thingdust.io -cust.prod.thingdust.io -cust.testing.thingdust.io - -// TownNews.com : http://www.townnews.com -// Submitted by Dustin Ward -bloxcms.com -townnews-staging.com - -// TrafficPlex GmbH : https://www.trafficplex.de/ -// Submitted by Phillipp Röll -12hp.at -2ix.at -4lima.at -lima-city.at -12hp.ch -2ix.ch -4lima.ch -lima-city.ch -trafficplex.cloud -de.cool -12hp.de -2ix.de -4lima.de -lima-city.de -1337.pictures -clan.rip -lima-city.rocks -webspace.rocks -lima.zone - -// TransIP : htts://www.transip.nl -// Submitted by Rory Breuk -*.transurl.be -*.transurl.eu -*.transurl.nl - -// TuxFamily : http://tuxfamily.org -// Submitted by TuxFamily administrators -tuxfamily.org - -// TwoDNS : https://www.twodns.de/ -// Submitted by TwoDNS-Support -dd-dns.de -diskstation.eu -diskstation.org -dray-dns.de -draydns.de -dyn-vpn.de -dynvpn.de -mein-vigor.de -my-vigor.de -my-wan.de -syno-ds.de -synology-diskstation.de -synology-ds.de - -// Uberspace : https://uberspace.de -// Submitted by Moritz Werner -uber.space - -// UDR Limited : http://www.udr.hk.com -// Submitted by registry -hk.com -hk.org -ltd.hk -inc.hk - -// .US -// Submitted by Ed Moore -lib.de.us - -// Viprinet Europe GmbH : http://www.viprinet.com -// Submitted by Simon Kissel -router.management - -// Virtual-Info : https://www.virtual-info.info/ -// Submitted by Adnan RIHAN -v-info.info - -// WeDeploy by Liferay, Inc. : https://www.wedeploy.com -// Submitted by Henrique Vicente -wedeploy.io -wedeploy.me -wedeploy.sh - -// Western Digital Technologies, Inc : https://www.wdc.com -// Submitted by Jung Jin -remotewd.com - -// Wikimedia Labs : https://wikitech.wikimedia.org -// Submitted by Yuvi Panda -wmflabs.org - -// XS4ALL Internet bv : https://www.xs4all.nl/ -// Submitted by Daniel Mostertman -cistron.nl -demon.nl -xs4all.space - -// Yola : https://www.yola.com/ -// Submitted by Stefano Rivera -yolasite.com - -// Yombo : https://yombo.net -// Submitted by Mitch Schwenk -ybo.faith -yombo.me -homelink.one -ybo.party -ybo.review -ybo.science -ybo.trade - -// ZaNiC : http://www.za.net/ -// Submitted by registry -za.net -za.org - -// Zeit, Inc. : https://zeit.domains/ -// Submitted by Olli Vanhoja -now.sh - -// ===END PRIVATE DOMAINS=== diff --git a/src/Cache/FileCacheAdapter.php b/src/Cache/FileCacheAdapter.php index 3454bdae..6f91fa20 100644 --- a/src/Cache/FileCacheAdapter.php +++ b/src/Cache/FileCacheAdapter.php @@ -15,8 +15,6 @@ use FilesystemIterator; use Generator; use Psr\SimpleCache\CacheInterface; -use RecursiveDirectoryIterator; -use RecursiveIteratorIterator; use Traversable; /** @@ -32,17 +30,15 @@ final class FileCacheAdapter implements CacheInterface * @var string control characters for keys, reserved by PSR-16 */ const PSR16_RESERVED = '/\{|\}|\(|\)|\/|\\\\|\@|\:/u'; + const FILE_PREFIX = 'pdp::'; + const FILE_EXTENSION = '.cache'; + const CACHE_TTL = 86400 * 365 * 5; /** * @var string */ private $cache_path; - /** - * @var int - */ - private $default_ttl = 86400; - /** * @var int */ @@ -157,7 +153,7 @@ private function getExpireAt($ttl): int } if ($ttl === null) { - return time() + $this->default_ttl; + return time() + self::CACHE_TTL; } throw new InvalidArgumentException(sprintf('Expected TTL to be an int, a DateInterval or null; received "%s"', is_object($ttl) ? get_class($ttl) : gettype($ttl))); @@ -260,15 +256,7 @@ private function getPath($key): string { $this->validateKey($key); - $hash = hash('sha256', $key); - - return $this->cache_path - . DIRECTORY_SEPARATOR - . strtoupper($hash[0]) - . DIRECTORY_SEPARATOR - . strtoupper($hash[1]) - . DIRECTORY_SEPARATOR - . substr($hash, 2); + return $this->cache_path . DIRECTORY_SEPARATOR . self::FILE_PREFIX . $key . self::FILE_EXTENSION; } /** @@ -276,13 +264,11 @@ private function getPath($key): string */ private function listPaths(): Generator { - $iterator = new RecursiveDirectoryIterator( + $iterator = new FilesystemIterator( $this->cache_path, FilesystemIterator::CURRENT_AS_PATHNAME | FilesystemIterator::SKIP_DOTS ); - $iterator = new RecursiveIteratorIterator($iterator); - foreach ($iterator as $path) { if (!is_dir($path)) { yield $path; diff --git a/src/PublicSuffixListManager.php b/src/PublicSuffixListManager.php index 763d6454..0f1a271d 100644 --- a/src/PublicSuffixListManager.php +++ b/src/PublicSuffixListManager.php @@ -13,7 +13,6 @@ use Pdp\Http\HttpAdapter; use Psr\SimpleCache\CacheInterface; -use RuntimeException; use SplTempFileObject; /** @@ -66,8 +65,6 @@ public function __construct( * * @param string $type the Public Suffix List type * - * @throws RuntimeException if no PublicSuffixList can be returned - * * @return PublicSuffixList */ public function getList($type = self::ALL_DOMAINS): PublicSuffixList @@ -79,8 +76,8 @@ public function getList($type = self::ALL_DOMAINS): PublicSuffixList ]; $type = $type_lists[$type] ?? self::ALL_DOMAINS; - - if (($list = $this->cacheAdapter->get($type)) === null) { + $list = $this->cacheAdapter->get($type); + if ($list === null) { $this->refreshPublicSuffixList(); $list = $this->cacheAdapter->get($type); } From 07ffb7a2e19d32298bdd34dd3b815f691e466c2b Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 12 Oct 2017 10:10:34 +0200 Subject: [PATCH 043/461] move constants from PublicSuffixManager to PublicSuffixList --- src/LabelsTrait.php | 13 +++++++ src/MatchedDomain.php | 29 +++------------ src/PublicSuffixList.php | 49 +++++++++++++++++++++---- src/PublicSuffixListManager.php | 51 +++++++++++++-------------- src/UnmatchedDomain.php | 25 ++----------- tests/DomainTest.php | 1 - tests/PublicSuffixListManagerTest.php | 21 +++++------ tests/PublicSuffixListTest.php | 35 +++++++++++++++--- 8 files changed, 125 insertions(+), 99 deletions(-) diff --git a/src/LabelsTrait.php b/src/LabelsTrait.php index 68a2664c..f2c2731d 100644 --- a/src/LabelsTrait.php +++ b/src/LabelsTrait.php @@ -60,4 +60,17 @@ private function isSingleLabelDomain(string $domain): bool { return !$this->hasLabels($domain); } + + /** + * Returns the additional label to generate the registrable domain. + * + * @param string[] $domainLabels + * @param string[] $publicSuffixLabels + * + * @return string[] + */ + private function getAdditionalLabel($domainLabels, $publicSuffixLabels): array + { + return array_slice($domainLabels, count($domainLabels) - count($publicSuffixLabels) - 1, 1); + } } diff --git a/src/MatchedDomain.php b/src/MatchedDomain.php index b009f20c..fb661248 100644 --- a/src/MatchedDomain.php +++ b/src/MatchedDomain.php @@ -28,10 +28,10 @@ final class MatchedDomain implements Domain /** * New instance. * - * @param string|null $domain - * @param string|null $publicSuffix + * @param string $domain + * @param string $publicSuffix */ - public function __construct(string $domain = null, string $publicSuffix = null) + public function __construct(string $domain, string $publicSuffix) { $this->domain = $domain; $this->publicSuffix = $publicSuffix; @@ -88,27 +88,6 @@ private function hasRegistrableDomain(): bool return false; } - if ($this->publicSuffix === null) { - return false; - } - - if ($this->publicSuffix === $this->domain) { - return false; - } - - return true; - } - - /** - * Returns the additional label to generate the registrable domain. - * - * @param string[] $domainLabels - * @param string[] $publicSuffixLabels - * - * @return string[] - */ - private function getAdditionalLabel($domainLabels, $publicSuffixLabels): array - { - return array_slice($domainLabels, count($domainLabels) - count($publicSuffixLabels) - 1, 1); + return $this->publicSuffix !== $this->domain; } } diff --git a/src/PublicSuffixList.php b/src/PublicSuffixList.php index 90b15bd7..999d17fb 100644 --- a/src/PublicSuffixList.php +++ b/src/PublicSuffixList.php @@ -11,10 +11,16 @@ namespace Pdp; +use OutOfRangeException; + final class PublicSuffixList { use LabelsTrait; + const ALL_DOMAINS = 'ALL'; + const ICANN_DOMAINS = 'ICANN'; + const PRIVATE_DOMAINS = 'PRIVATE'; + /** * @var array */ @@ -23,21 +29,52 @@ final class PublicSuffixList /** * PublicSuffixList constructor. * - * @param array $rules + * @param string $type Tje PSL type 'ALL, ICANN or PRIVATE' + * @param array $rules */ - public function __construct(array $rules) + public function __construct(string $type, array $rules) { + static $type_lists = [ + self::ALL_DOMAINS => 1, + self::ICANN_DOMAINS => 1, + self::PRIVATE_DOMAINS => 1, + ]; + + if (!isset($type_lists[$type])) { + throw new OutOfRangeException(sprintf('Unknown PSL type %s', $type)); + } + $this->type = $type; $this->rules = $rules; } /** - * Returns PSL rules. + * Tell whether the PSL resolves ICANN domains only. * - * @return array + * @return bool + */ + public function isICANN() + { + return $this->type === self::ICANN_DOMAINS; + } + + /** + * Tell whether the PSL resolves private domains only. + * + * @return bool + */ + public function isPrivate() + { + return $this->type === self::PRIVATE_DOMAINS; + } + + /** + * Tell whether the PSL resolves all domains. + * + * @return bool */ - public function getRules(): array + public function isAll() { - return $this->rules; + return $this->type === self::ALL_DOMAINS; } /** diff --git a/src/PublicSuffixListManager.php b/src/PublicSuffixListManager.php index 0f1a271d..aaeeb48a 100644 --- a/src/PublicSuffixListManager.php +++ b/src/PublicSuffixListManager.php @@ -24,9 +24,6 @@ class PublicSuffixListManager { const PUBLIC_SUFFIX_LIST_URL = 'https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat'; - const ALL_DOMAINS = 'ALL'; - const ICANN_DOMAINS = 'ICANN'; - const PRIVATE_DOMAINS = 'PRIVATE'; /** * @var string Public Suffix List Source URL @@ -67,22 +64,22 @@ public function __construct( * * @return PublicSuffixList */ - public function getList($type = self::ALL_DOMAINS): PublicSuffixList + public function getList($type = PublicSuffixList::ALL_DOMAINS): PublicSuffixList { static $type_lists = [ - self::ALL_DOMAINS => self::ALL_DOMAINS, - self::ICANN_DOMAINS => self::ICANN_DOMAINS, - self::PRIVATE_DOMAINS => self::PRIVATE_DOMAINS, + PublicSuffixList::ALL_DOMAINS => PublicSuffixList::ALL_DOMAINS, + PublicSuffixList::ICANN_DOMAINS => PublicSuffixList::ICANN_DOMAINS, + PublicSuffixList::PRIVATE_DOMAINS => PublicSuffixList::PRIVATE_DOMAINS, ]; - $type = $type_lists[$type] ?? self::ALL_DOMAINS; + $type = $type_lists[$type] ?? PublicSuffixList::ALL_DOMAINS; $list = $this->cacheAdapter->get($type); if ($list === null) { $this->refreshPublicSuffixList(); $list = $this->cacheAdapter->get($type); } - return new PublicSuffixList(json_decode($list, true)); + return new PublicSuffixList($type, json_decode($list, true)); } /** @@ -112,14 +109,14 @@ public function refreshPublicSuffixList(): bool private function convertListToArray(string $publicSuffixList): array { $addDomain = [ - self::ICANN_DOMAINS => false, - self::PRIVATE_DOMAINS => false, + PublicSuffixList::ICANN_DOMAINS => false, + PublicSuffixList::PRIVATE_DOMAINS => false, ]; $publicSuffixListTypes = [ - self::ALL_DOMAINS => [], - self::ICANN_DOMAINS => [], - self::PRIVATE_DOMAINS => [], + PublicSuffixList::ALL_DOMAINS => [], + PublicSuffixList::ICANN_DOMAINS => [], + PublicSuffixList::PRIVATE_DOMAINS => [], ]; $data = new SplTempFileObject(); @@ -178,21 +175,21 @@ private function isValidSection(bool $previousStatus, string $line, string $sect /** * Convert a line from the Public Suffix list. * - * @param string $textLine Public Suffix List text line + * @param string $rule Public Suffix List text line * @param array $publicSuffixListTypes Associative, multidimensional array representation of the * public suffx list - * @param array $addDomain Tell which section should be converted + * @param array $validTypes Tell which section should be converted * * @return array Associative, multidimensional array representation of the * public suffx list */ - private function convertLineToArray(string $textLine, array $publicSuffixListTypes, array $addDomain): array + private function convertLineToArray(string $line, array $publicSuffixListTypes, array $validTypes): array { - $ruleParts = explode('.', $textLine); - $this->buildArray($publicSuffixListTypes[self::ALL_DOMAINS], $ruleParts); - $domainNames = array_keys(array_filter($addDomain)); - foreach ($domainNames as $domainName) { - $this->buildArray($publicSuffixListTypes[$domainName], $ruleParts); + $ruleParts = explode('.', $line); + $validTypes = array_keys(array_filter($validTypes)); + $validTypes[] = PublicSuffixList::ALL_DOMAINS; + foreach ($validTypes as $type) { + $publicSuffixListTypes[$type] = $this->buildArray($publicSuffixListTypes[$type], $ruleParts); } return $publicSuffixListTypes; @@ -212,7 +209,7 @@ private function convertLineToArray(string $textLine, array $publicSuffixListTyp * @param array $ruleParts One line (rule) from the Public Suffix List * exploded on '.', or the remaining portion of that array during recursion */ - private function buildArray(array &$publicSuffixList, array $ruleParts) + private function buildArray(array $publicSuffixList, array $ruleParts): array { $isDomain = true; @@ -229,12 +226,12 @@ private function buildArray(array &$publicSuffixList, array $ruleParts) $isDomain = false; } - if (!array_key_exists($part, $publicSuffixList)) { - $publicSuffixList[$part] = $isDomain ? [] : ['!' => '']; - } + $publicSuffixList[$part] = $publicSuffixList[$part] ?? ($isDomain ? [] : ['!' => '']); if ($isDomain && !empty($ruleParts)) { - $this->buildArray($publicSuffixList[$part], $ruleParts); + $publicSuffixList[$part] = $this->buildArray($publicSuffixList[$part], $ruleParts); } + + return $publicSuffixList; } } diff --git a/src/UnmatchedDomain.php b/src/UnmatchedDomain.php index 55565a00..8a9f46cb 100644 --- a/src/UnmatchedDomain.php +++ b/src/UnmatchedDomain.php @@ -31,7 +31,7 @@ final class UnmatchedDomain implements Domain * @param string|null $domain * @param string|null $publicSuffix */ - public function __construct(string $domain = null, string $publicSuffix = null) + public function __construct(string $domain, string $publicSuffix) { $this->domain = $domain; $this->publicSuffix = $publicSuffix; @@ -88,27 +88,6 @@ private function hasRegistrableDomain(): bool return false; } - if ($this->publicSuffix === null) { - return false; - } - - if ($this->publicSuffix === $this->domain) { - return false; - } - - return true; - } - - /** - * Returns the additional label to generate the registrable domain. - * - * @param string[] $domainLabels - * @param string[] $publicSuffixLabels - * - * @return string[] - */ - private function getAdditionalLabel($domainLabels, $publicSuffixLabels): array - { - return array_slice($domainLabels, count($domainLabels) - count($publicSuffixLabels) - 1, 1); + return $this->publicSuffix !== $this->domain; } } diff --git a/tests/DomainTest.php b/tests/DomainTest.php index bf8a715e..b5bea361 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -34,7 +34,6 @@ public function invalidRegistrableDomainProvider() { return [ 'domain and suffix are the same' => ['co.uk', 'co.uk'], - 'publicSuffix is null' => ['example.faketld', null], 'domain has no labels' => ['faketld', 'faketld'], ]; } diff --git a/tests/PublicSuffixListManagerTest.php b/tests/PublicSuffixListManagerTest.php index 05343e33..83bdbf3c 100644 --- a/tests/PublicSuffixListManagerTest.php +++ b/tests/PublicSuffixListManagerTest.php @@ -7,6 +7,7 @@ use org\bovigo\vfs\vfsStream; use Pdp\Cache\FileCacheAdapter; use Pdp\Http\CurlHttpAdapter; +use Pdp\PublicSuffixList; use Pdp\PublicSuffixListManager; use PHPUnit\Framework\TestCase; @@ -41,12 +42,6 @@ public function tearDown() $this->root = null; } - public function testGetProvidedListFromDefaultCacheDir() - { - $publicSuffixList = $this->manager->getList(); - $this->assertGreaterThanOrEqual(300, count($publicSuffixList->getRules())); - } - public function testGetDifferentPublicList() { $publicSuffixList = $this->manager->getList(); @@ -63,17 +58,17 @@ public function testRefreshList() public function testGetListRebuildListFromLocalCache() { - $previous = $this->manager->getList(PublicSuffixListManager::ICANN_DOMAINS); - $this->cachePool->delete(PublicSuffixListManager::ICANN_DOMAINS); //delete local copy of ICAN DOMAINS RULES - $list = $this->manager->getList(PublicSuffixListManager::ICANN_DOMAINS); - $this->assertEquals($previous, $this->manager->getList(PublicSuffixListManager::ICANN_DOMAINS)); + $previous = $this->manager->getList(PublicSuffixList::ICANN_DOMAINS); + $this->cachePool->delete(PublicSuffixList::ICANN_DOMAINS); //delete local copy of ICAN DOMAINS RULES + $list = $this->manager->getList(PublicSuffixList::ICANN_DOMAINS); + $this->assertEquals($previous, $this->manager->getList(PublicSuffixList::ICANN_DOMAINS)); } public function testGetListRebuildListFromRemoveSource() { - $previous = $this->manager->getList(PublicSuffixListManager::ICANN_DOMAINS); + $previous = $this->manager->getList(PublicSuffixList::ICANN_DOMAINS); $this->cachePool->clear(); //delete all local cache - $list = $this->manager->getList(PublicSuffixListManager::ICANN_DOMAINS); - $this->assertEquals($previous, $this->manager->getList(PublicSuffixListManager::ICANN_DOMAINS)); + $list = $this->manager->getList(PublicSuffixList::ICANN_DOMAINS); + $this->assertEquals($previous, $this->manager->getList(PublicSuffixList::ICANN_DOMAINS)); } } diff --git a/tests/PublicSuffixListTest.php b/tests/PublicSuffixListTest.php index e2b0773d..bf23a112 100644 --- a/tests/PublicSuffixListTest.php +++ b/tests/PublicSuffixListTest.php @@ -12,6 +12,7 @@ */ namespace Pdp\Tests; +use OutOfRangeException; use Pdp\Cache\FileCacheAdapter; use Pdp\Http\CurlHttpAdapter; use Pdp\MatchedDomain; @@ -28,15 +29,41 @@ class PublicSuffixListTest extends TestCase */ private $list; + private $manager; + public function setUp() { - $manager = new PublicSuffixListManager(new FileCacheAdapter(), new CurlHttpAdapter()); - $this->list = $manager->getList(); + $this->manager = new PublicSuffixListManager(new FileCacheAdapter(), new CurlHttpAdapter()); + $this->list = $this->manager->getList(); + } + + public function testConstructorThrowsExceptionOnUnsupportedType() + { + $this->expectException(OutOfRangeException::class); + new PublicSuffixList('foo', []); + } + + public function testFullDomainList() + { + $this->assertTrue($this->list->isAll()); + $this->assertFalse($this->list->isICANN()); + $this->assertFalse($this->list->isPrivate()); + } + + public function testICANNDomainList() + { + $list = $this->manager->getList(PublicSuffixList::ICANN_DOMAINS); + $this->assertFalse($list->isAll()); + $this->assertTrue($list->isICANN()); + $this->assertFalse($list->isPrivate()); } - public function testGetRules() + public function testPrivateDomainList() { - $this->assertInternalType('array', $this->list->getRules()); + $list = $this->manager->getList(PublicSuffixList::PRIVATE_DOMAINS); + $this->assertFalse($list->isAll()); + $this->assertFalse($list->isICANN()); + $this->assertTrue($list->isPrivate()); } public function testNullWillReturnNullDomain() From 6143445796b431d0040acf05f0eb3e13db1bac32 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 12 Oct 2017 13:38:35 +0200 Subject: [PATCH 044/461] Moved FileCache to tests directory - update-psl uses temporary FileCache from tests --- bin/update-psl | 2 +- src/PublicSuffixList.php | 26 +- src/PublicSuffixListManager.php | 108 ++-- src/UnmatchedDomain.php | 4 +- {src => tests}/Cache/FileCacheAdapter.php | 2 +- tests/Cache/FileCacheAdapterTest.php | 474 ------------------ .../Cache/InvalidArgumentException.php | 5 +- tests/CheckPublicSuffixTest.php | 2 +- tests/DomainTest.php | 8 +- tests/PublicSuffixListManagerTest.php | 27 +- tests/PublicSuffixListTest.php | 2 +- 11 files changed, 86 insertions(+), 574 deletions(-) rename {src => tests}/Cache/FileCacheAdapter.php (99%) delete mode 100644 tests/Cache/FileCacheAdapterTest.php rename {src => tests}/Cache/InvalidArgumentException.php (75%) diff --git a/bin/update-psl b/bin/update-psl index 247fb2ad..3f9e295a 100755 --- a/bin/update-psl +++ b/bin/update-psl @@ -3,7 +3,7 @@ use Pdp\PublicSuffixListManager; use Pdp\Http\CurlHttpAdapter; -use Pdp\Cache\FileCacheAdapter; +use Pdp\Tests\Cache\FileCacheAdapter; function getVendorPath() { diff --git a/src/PublicSuffixList.php b/src/PublicSuffixList.php index 999d17fb..92a8061b 100644 --- a/src/PublicSuffixList.php +++ b/src/PublicSuffixList.php @@ -189,18 +189,17 @@ private function findPublicSuffix(array $labels) break; } - if ($this->matchExists($label, $rules)) { - array_unshift($matches, $label); - $rules = $rules[$label]; - continue; + if (!$this->matchExists($label, $rules)) { + // Avoids improper parsing when $domain's subdomain + public suffix === + // a valid public suffix (e.g. domain 'us.example.com' and public suffix 'us.com') + // + // Added by @goodhabit in https://github.com/jeremykendall/php-domain-parser/pull/15 + // Resolves https://github.com/jeremykendall/php-domain-parser/issues/16 + break; } - // Avoids improper parsing when $domain's subdomain + public suffix === - // a valid public suffix (e.g. domain 'us.example.com' and public suffix 'us.com') - // - // Added by @goodhabit in https://github.com/jeremykendall/php-domain-parser/pull/15 - // Resolves https://github.com/jeremykendall/php-domain-parser/issues/16 - break; + array_unshift($matches, $label); + $rules = $rules[$label]; } return empty($matches) ? null : implode('.', array_filter($matches, 'strlen')); @@ -216,8 +215,7 @@ private function findPublicSuffix(array $labels) */ private function isExceptionRule(string $label, array $rules): bool { - return $this->matchExists($label, $rules) - && array_key_exists('!', $rules[$label]); + return isset($rules[$label], $rules[$label]['!']); } /** @@ -229,7 +227,7 @@ private function isExceptionRule(string $label, array $rules): bool */ private function isWildcardRule(array $rules): bool { - return array_key_exists('*', $rules); + return isset($rules['*']); } /** @@ -242,7 +240,7 @@ private function isWildcardRule(array $rules): bool */ private function matchExists(string $label, array $rules): bool { - return array_key_exists($label, $rules); + return isset($rules[$label]); } /** diff --git a/src/PublicSuffixListManager.php b/src/PublicSuffixListManager.php index aaeeb48a..5dba993e 100644 --- a/src/PublicSuffixListManager.php +++ b/src/PublicSuffixListManager.php @@ -23,12 +23,7 @@ */ class PublicSuffixListManager { - const PUBLIC_SUFFIX_LIST_URL = 'https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat'; - - /** - * @var string Public Suffix List Source URL - */ - private $sourceUrl; + const PSL_URL = 'https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat'; /** * @var CacheInterface PSR-16 cache adapter @@ -45,16 +40,11 @@ class PublicSuffixListManager * * @param CacheInterface $cacheAdapter * @param HttpAdapter $httpAdapter - * @param string $sourceUrl */ - public function __construct( - CacheInterface $cacheAdapter, - HttpAdapter $httpAdapter, - string $sourceUrl = self::PUBLIC_SUFFIX_LIST_URL - ) { + public function __construct(CacheInterface $cacheAdapter, HttpAdapter $httpAdapter) + { $this->cacheAdapter = $cacheAdapter; $this->httpAdapter = $httpAdapter; - $this->sourceUrl = $sourceUrl; } /** @@ -64,18 +54,18 @@ public function __construct( * * @return PublicSuffixList */ - public function getList($type = PublicSuffixList::ALL_DOMAINS): PublicSuffixList + public function getList(string $type = PublicSuffixList::ALL_DOMAINS, string $sourceUrl = self::PSL_URL): PublicSuffixList { - static $type_lists = [ + static $availableTypes = [ PublicSuffixList::ALL_DOMAINS => PublicSuffixList::ALL_DOMAINS, PublicSuffixList::ICANN_DOMAINS => PublicSuffixList::ICANN_DOMAINS, PublicSuffixList::PRIVATE_DOMAINS => PublicSuffixList::PRIVATE_DOMAINS, ]; - $type = $type_lists[$type] ?? PublicSuffixList::ALL_DOMAINS; + $type = $availableTypes[$type] ?? PublicSuffixList::ALL_DOMAINS; $list = $this->cacheAdapter->get($type); if ($list === null) { - $this->refreshPublicSuffixList(); + $this->refreshPublicSuffixList($sourceUrl); $list = $this->cacheAdapter->get($type); } @@ -90,64 +80,64 @@ public function getList($type = PublicSuffixList::ALL_DOMAINS): PublicSuffixList * * @return bool */ - public function refreshPublicSuffixList(): bool + public function refreshPublicSuffixList(string $sourceUrl = self::PSL_URL): bool { - $publicSuffixList = $this->httpAdapter->getContent($this->sourceUrl); - $publicSuffixListTypes = $this->convertListToArray($publicSuffixList); + $content = $this->httpAdapter->getContent($sourceUrl); + $list = $this->parse($content); - return $this->cacheAdapter->setMultiple(array_map('json_encode', $publicSuffixListTypes)); + return $this->cacheAdapter->setMultiple(array_map('json_encode', $list)); } /** * Parses text representation of list to associative, multidimensional array. * - * @param string $publicSuffixList + * @param string $content the Public SUffix List as a SplFileObject * * @return array Associative, multidimensional array representation of the * public suffx list */ - private function convertListToArray(string $publicSuffixList): array + private function parse(string $content): array { - $addDomain = [ + $sectionList = [ + PublicSuffixList::ALL_DOMAINS => true, PublicSuffixList::ICANN_DOMAINS => false, PublicSuffixList::PRIVATE_DOMAINS => false, ]; - $publicSuffixListTypes = [ + $lists = [ PublicSuffixList::ALL_DOMAINS => [], PublicSuffixList::ICANN_DOMAINS => [], PublicSuffixList::PRIVATE_DOMAINS => [], ]; - $data = new SplTempFileObject(); - $data->fwrite($publicSuffixList); - $data->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); - foreach ($data as $line) { - $addDomain = $this->validateDomainAddition($line, $addDomain); - if (strstr($line, '//') !== false) { - continue; + $fileObj = new SplTempFileObject(); + $fileObj->fwrite($content); + $fileObj->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); + foreach ($fileObj as $line) { + $sectionList = $this->validateAddingSection($line, $sectionList); + if (strpos($line, '//') === false) { + $lists = $this->convertLine($line, $lists, $sectionList); } - $publicSuffixListTypes = $this->convertLineToArray($line, $publicSuffixListTypes, $addDomain); } - return $publicSuffixListTypes; + return $lists; } /** * Update the addition status for a given line against the domain list (ICANN and PRIVATE). * - * @param string $line the current file line - * @param array $addDomain the domain addition status + * @param string $line the current file line + * @param array $sectionList the domain addition status * * @return array */ - private function validateDomainAddition(string $line, array $addDomain): array + private function validateAddingSection(string $line, array $sectionList): array { - foreach ($addDomain as $section => $status) { - $addDomain[$section] = $this->isValidSection($status, $line, $section); + foreach ($sectionList as $section => $status) { + $sectionList[$section] = $this->isValidSection($status, $line, $section); } - return $addDomain; + return $sectionList; } /** @@ -175,24 +165,23 @@ private function isValidSection(bool $previousStatus, string $line, string $sect /** * Convert a line from the Public Suffix list. * - * @param string $rule Public Suffix List text line - * @param array $publicSuffixListTypes Associative, multidimensional array representation of the - * public suffx list - * @param array $validTypes Tell which section should be converted + * @param string $rule Public Suffix List text line + * @param array $lists Associative, multidimensional array representation of the + * public suffx list + * @param array $validTypes Tell which section should be converted * * @return array Associative, multidimensional array representation of the * public suffx list */ - private function convertLineToArray(string $line, array $publicSuffixListTypes, array $validTypes): array + private function convertLine(string $line, array $lists, array $validTypes): array { $ruleParts = explode('.', $line); $validTypes = array_keys(array_filter($validTypes)); - $validTypes[] = PublicSuffixList::ALL_DOMAINS; foreach ($validTypes as $type) { - $publicSuffixListTypes[$type] = $this->buildArray($publicSuffixListTypes[$type], $ruleParts); + $lists[$type] = $this->addRule($lists[$type], $ruleParts); } - return $publicSuffixListTypes; + return $lists; } /** @@ -204,15 +193,15 @@ private function convertLineToArray(string $line, array $publicSuffixListTypes, * A copy of the Apache License, Version 2.0, is provided with this * distribution * - * @param array $publicSuffixList Initially an empty array, this eventually - * becomes the array representation of the Public Suffix List - * @param array $ruleParts One line (rule) from the Public Suffix List - * exploded on '.', or the remaining portion of that array during recursion + * @param array $list Initially an empty array, this eventually + * becomes the array representation of the Public Suffix List + * @param array $ruleParts One line (rule) from the Public Suffix List + * exploded on '.', or the remaining portion of that array during recursion + * + * @return array */ - private function buildArray(array $publicSuffixList, array $ruleParts): array + private function addRule(array $list, array $ruleParts): array { - $isDomain = true; - $part = array_pop($ruleParts); // Adheres to canonicalization rule from the "Formal Algorithm" section @@ -221,17 +210,20 @@ private function buildArray(array $publicSuffixList, array $ruleParts): array // for hostnames - lower-case, Punycode (RFC 3492)." $part = idn_to_ascii($part, 0, INTL_IDNA_VARIANT_UTS46); + $isDomain = true; if (strpos($part, '!') === 0) { $part = substr($part, 1); $isDomain = false; } - $publicSuffixList[$part] = $publicSuffixList[$part] ?? ($isDomain ? [] : ['!' => '']); + if (!isset($list[$part])) { + $list[$part] = $isDomain ? [] : ['!' => '']; + } if ($isDomain && !empty($ruleParts)) { - $publicSuffixList[$part] = $this->buildArray($publicSuffixList[$part], $ruleParts); + $list[$part] = $this->addRule($list[$part], $ruleParts); } - return $publicSuffixList; + return $list; } } diff --git a/src/UnmatchedDomain.php b/src/UnmatchedDomain.php index 8a9f46cb..df803191 100644 --- a/src/UnmatchedDomain.php +++ b/src/UnmatchedDomain.php @@ -28,8 +28,8 @@ final class UnmatchedDomain implements Domain /** * New instance. * - * @param string|null $domain - * @param string|null $publicSuffix + * @param string $domain + * @param string $publicSuffix */ public function __construct(string $domain, string $publicSuffix) { diff --git a/src/Cache/FileCacheAdapter.php b/tests/Cache/FileCacheAdapter.php similarity index 99% rename from src/Cache/FileCacheAdapter.php rename to tests/Cache/FileCacheAdapter.php index 6f91fa20..e1600070 100644 --- a/src/Cache/FileCacheAdapter.php +++ b/tests/Cache/FileCacheAdapter.php @@ -9,7 +9,7 @@ */ declare(strict_types=1); -namespace Pdp\Cache; +namespace Pdp\Tests\Cache; use DateInterval; use FilesystemIterator; diff --git a/tests/Cache/FileCacheAdapterTest.php b/tests/Cache/FileCacheAdapterTest.php deleted file mode 100644 index 99bd6b38..00000000 --- a/tests/Cache/FileCacheAdapterTest.php +++ /dev/null @@ -1,474 +0,0 @@ -root = vfsStream::setup('pdp'); - vfsStream::create(['cache' => []], $this->root); - $this->cacheDir = vfsStream::url('pdp/cache'); - $this->cache = new FileCacheAdapter($this->cacheDir); - } - - public function tearDown() - { - $this->cache = null; - $this->cacheDir = null; - $this->root = null; - } - - /** - * @dataProvider storableValuesProvider - * - * @param mixed $expected - * @param string $key - */ - public function testSetGet($expected) - { - $this->cache->set('foo', $expected); - $this->assertEquals($expected, $this->cache->get('foo')); - } - - public function storableValuesProvider() - { - return [ - 'string' => ['bar'], - 'boolean' => [false], - 'array' => [['foo', 'bar']], - 'class' => [date_create()], - 'null' => [null], - 'float' => [1.1], - ]; - } - - /** - * @depends testSetGet - */ - public function testDelete() - { - $this->cache->set('foo', 'bar'); - $this->assertEquals('bar', $this->cache->get('foo')); - $this->cache->delete('foo'); - $this->assertNull($this->cache->get('foo')); - } - - public function testGetInvalidArg() - { - $this->expectException(InvalidArgumentException::class); - $this->cache->get(null); - } - - public function testInvalidKey() - { - $this->expectException(InvalidArgumentException::class); - $this->cache->get('foo:bar', 'bar'); - } - - public function testSetInvalidTTL() - { - $this->expectException(InvalidArgumentException::class); - $this->cache->set('foo', 'bar', date_create()); - } - - /** - * @depends testDelete - */ - public function testGetNotFound() - { - $this->assertNull($this->cache->get('notfound')); - } - - /** - * @depends testDelete - */ - public function testGetNotFoundDefault() - { - $default = 'chickpeas'; - $this->assertEquals( - $default, - $this->cache->get('notfound', $default) - ); - } - - /** - * @depends testSetGet - * @slow - */ - public function testSetExpire() - { - $this->cache->set('foo', 'bar', 1); - $this->assertEquals('bar', $this->cache->get('foo')); - - // Wait 2 seconds so the cache expires - usleep(2000000); - $this->assertNull($this->cache->get('foo')); - } - - /** - * @depends testSetGet - * @slow - */ - public function testSetExpireDateInterval() - { - $this->cache->set('foo', 'bar', new DateInterval('PT1S')); - $this->assertEquals('bar', $this->cache->get('foo')); - - // Wait 2 seconds so the cache expires - usleep(2000000); - $this->assertNull($this->cache->get('foo')); - } - - public function testSetInvalidArg() - { - $this->expectException(InvalidArgumentException::class); - $this->cache->set(null, 'bar'); - } - - public function testDeleteInvalidArg() - { - $this->expectException(InvalidArgumentException::class); - $this->cache->delete(null); - } - - /** - * @depends testSetGet - */ - public function testClearCache() - { - $this->cache->set('foo', 'bar'); - $this->cache->clear(); - $this->assertNull($this->cache->get('foo')); - } - - /** - * @depends testSetGet - */ - public function testHas() - { - $this->cache->set('foo', 'bar'); - $this->assertTrue($this->cache->has('foo')); - } - - /** - * @depends testHas - */ - public function testHasNot() - { - $this->assertFalse($this->cache->has('not-found')); - } - - public function testHasInvalidArg() - { - $this->expectException(InvalidArgumentException::class); - $this->cache->has(null); - } - - /** - * @depends testSetGet - */ - public function testSetGetMultiple() - { - $values = [ - 'key1' => 'value1', - 'key2' => 'value2', - 'key3' => 'value3', - ]; - - $this->cache->setMultiple($values); - $result = $this->cache->getMultiple(array_keys($values)); - foreach ($result as $key => $value) { - $this->assertTrue(isset($values[$key])); - $this->assertEquals($values[$key], $value); - unset($values[$key]); - } - - // The list of values should now be empty - $this->assertEquals([], $values); - } - - /** - * @depends testSetGet - */ - public function testSetGetMultipleGenerator() - { - $values = [ - 'key1' => 'value1', - 'key2' => 'value2', - 'key3' => 'value3', - ]; - - $gen = function () use ($values) { - foreach ($values as $key => $value) { - yield $key => $value; - } - }; - - $this->cache->setMultiple($gen()); - - $result = $this->cache->getMultiple(array_keys($values)); - foreach ($result as $key => $value) { - $this->assertTrue(isset($values[$key])); - $this->assertEquals($values[$key], $value); - unset($values[$key]); - } - - // The list of values should now be empty - $this->assertEquals([], $values); - } - - /** - * @depends testSetGet - */ - public function testSetGetMultipleGenerator2() - { - $values = [ - 'key1' => 'value1', - 'key2' => 'value2', - 'key3' => 'value3', - ]; - - $gen = function () use ($values) { - foreach ($values as $key => $value) { - yield $key; - } - }; - - $this->cache->setMultiple($values); - $result = $this->cache->getMultiple($gen()); - foreach ($result as $key => $value) { - $this->assertTrue(isset($values[$key])); - $this->assertEquals($values[$key], $value); - unset($values[$key]); - } - - // The list of values should now be empty - $this->assertEquals([], $values); - } - - /** - * @depends testSetGetMultiple - * @depends testSetExpire - * @slow - */ - public function testSetMultipleExpireDateIntervalNotExpired() - { - $values = [ - 'key1' => 'value1', - 'key2' => 'value2', - 'key3' => 'value3', - ]; - - $this->cache->setMultiple($values, new DateInterval('PT5S')); - $result = $this->cache->getMultiple(array_keys($values)); - $count = 0; - foreach ($result as $key => $value) { - $count++; - $this->assertTrue(isset($values[$key])); - $this->assertEquals($values[$key], $value); - unset($values[$key]); - } - $this->assertEquals(3, $count); - // The list of values should now be empty - $this->assertEquals([], $values); - } - - /** - * @slow - */ - public function testSetMultipleExpireDateIntervalExpired() - { - $values = [ - 'key1' => 'value1', - 'key2' => 'value2', - 'key3' => 'value3', - ]; - - $this->cache->setMultiple($values, new \DateInterval('PT1S')); - - // Wait 2 seconds so the cache expires - sleep(2); - - $result = $this->cache->getMultiple(array_keys($values), 'not-found'); - $count = 0; - - $expected = [ - 'key1' => 'not-found', - 'key2' => 'not-found', - 'key3' => 'not-found', - ]; - - foreach ($result as $key => $value) { - $count++; - $this->assertTrue(isset($expected[$key])); - $this->assertEquals($expected[$key], $value); - unset($expected[$key]); - } - $this->assertEquals(3, $count); - - // The list of values should now be empty - $this->assertEquals([], $expected); - } - - /** - * @slow - */ - public function testSetMultipleExpireDateIntervalInt() - { - $values = [ - 'key1' => 'value1', - 'key2' => 'value2', - 'key3' => 'value3', - ]; - - $this->cache->setMultiple($values, 1); - - // Wait 2 seconds so the cache expires - sleep(2); - - $result = $this->cache->getMultiple(array_keys($values), 'not-found'); - $count = 0; - - $expected = [ - 'key1' => 'not-found', - 'key2' => 'not-found', - 'key3' => 'not-found', - ]; - - foreach ($result as $key => $value) { - $count++; - $this->assertTrue(isset($expected[$key])); - $this->assertEquals($expected[$key], $value); - unset($expected[$key]); - } - $this->assertEquals(3, $count); - - // The list of values should now be empty - $this->assertEquals([], $expected); - } - - public function testSetMultipleInvalidArg() - { - $this->expectException(InvalidArgumentException::class); - $this->cache->setMultiple(null); - } - - public function testGetMultipleInvalidArg() - { - $this->expectException(InvalidArgumentException::class); - $result = $this->cache->getMultiple(null); - // If $result was a generator, the generator will only error once the - // first value is requested. - // - // This extra line is just a precaution for that - if ($result instanceof Traversable) { - $result->current(); - } - } - - /** - * @depends testSetGetMultiple - */ - public function testDeleteMultipleDefaultGet() - { - $values = [ - 'key1' => 'value1', - 'key2' => 'value2', - 'key3' => 'value3', - ]; - - $this->cache->setMultiple($values); - - $this->cache->deleteMultiple(['key1', 'key3']); - - $result = $this->cache->getMultiple(array_keys($values), 'tea'); - - $expected = [ - 'key1' => 'tea', - 'key2' => 'value2', - 'key3' => 'tea', - ]; - - foreach ($result as $key => $value) { - $this->assertTrue(isset($expected[$key])); - $this->assertEquals($expected[$key], $value); - unset($expected[$key]); - } - - // The list of values should now be empty - $this->assertEquals([], $expected); - } - - /** - * @depends testSetGetMultiple - */ - public function testDeleteMultipleGenerator() - { - $values = [ - 'key1' => 'value1', - 'key2' => 'value2', - 'key3' => 'value3', - ]; - - $this->cache->setMultiple($values); - - $gen = function () { - yield 'key1'; - yield 'key3'; - }; - - $this->cache->deleteMultiple($gen()); - - $result = $this->cache->getMultiple(array_keys($values), 'tea'); - - $expected = [ - 'key1' => 'tea', - 'key2' => 'value2', - 'key3' => 'tea', - ]; - - foreach ($result as $key => $value) { - $this->assertTrue(isset($expected[$key])); - $this->assertEquals($expected[$key], $value); - unset($expected[$key]); - } - - // The list of values should now be empty - $this->assertEquals([], $expected); - } - - /** - * @expectException \Psr\SimpleCache\InvalidArgumentException - */ - public function testDeleteMultipleInvalidArg() - { - $this->expectException(InvalidArgumentException::class); - $this->cache->deleteMultiple(null); - } -} diff --git a/src/Cache/InvalidArgumentException.php b/tests/Cache/InvalidArgumentException.php similarity index 75% rename from src/Cache/InvalidArgumentException.php rename to tests/Cache/InvalidArgumentException.php index 29b9478e..48b5557e 100644 --- a/src/Cache/InvalidArgumentException.php +++ b/tests/Cache/InvalidArgumentException.php @@ -9,11 +9,10 @@ */ declare(strict_types=1); -namespace Pdp\Cache; +namespace Pdp\Tests\Cache; -use InvalidArgumentException as PhpException; use Psr\SimpleCache\InvalidArgumentException as CacheException; -class InvalidArgumentException extends PhpException implements CacheException +class InvalidArgumentException extends \InvalidArgumentException implements CacheException { } diff --git a/tests/CheckPublicSuffixTest.php b/tests/CheckPublicSuffixTest.php index 6b9f37a7..5ad0652f 100644 --- a/tests/CheckPublicSuffixTest.php +++ b/tests/CheckPublicSuffixTest.php @@ -2,10 +2,10 @@ namespace Pdp\Tests; -use Pdp\Cache\FileCacheAdapter; use Pdp\Http\CurlHttpAdapter; use Pdp\PublicSuffixList; use Pdp\PublicSuffixListManager; +use Pdp\Tests\Cache\FileCacheAdapter; use PHPUnit\Framework\TestCase; /** diff --git a/tests/DomainTest.php b/tests/DomainTest.php index b5bea361..337be268 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -21,8 +21,8 @@ class DomainTest extends TestCase /** * @dataProvider invalidRegistrableDomainProvider * - * @param string $domain - * @param string|null $publicSuffix + * @param string $domain + * @param string $publicSuffix */ public function testRegistrableDomainIsNullWithMatchedDomain(string $domain, $publicSuffix) { @@ -41,8 +41,8 @@ public function invalidRegistrableDomainProvider() /** * @dataProvider invalidRegistrableDomainProvider * - * @param string $domain - * @param string|null $publicSuffix + * @param string $domain + * @param string $publicSuffix */ public function testRegistrableDomainIsNullWithUnMatchedDomain(string $domain, $publicSuffix) { diff --git a/tests/PublicSuffixListManagerTest.php b/tests/PublicSuffixListManagerTest.php index 83bdbf3c..1db3da5a 100644 --- a/tests/PublicSuffixListManagerTest.php +++ b/tests/PublicSuffixListManagerTest.php @@ -5,10 +5,10 @@ namespace Pdp\Tests; use org\bovigo\vfs\vfsStream; -use Pdp\Cache\FileCacheAdapter; use Pdp\Http\CurlHttpAdapter; use Pdp\PublicSuffixList; use Pdp\PublicSuffixListManager; +use Pdp\Tests\Cache\FileCacheAdapter; use PHPUnit\Framework\TestCase; class PublicSuffixListManagerTest extends TestCase @@ -20,6 +20,7 @@ class PublicSuffixListManagerTest extends TestCase protected $cachePool; protected $cacheDir; protected $root; + protected $sourceUrl = 'https://publicsuffix.org/list/public_suffix_list.dat'; public function setUp() { @@ -27,11 +28,7 @@ public function setUp() vfsStream::create(['cache' => []], $this->root); $this->cacheDir = vfsStream::url('pdp/cache'); $this->cachePool = new FileCacheAdapter($this->cacheDir); - $this->manager = new PublicSuffixListManager( - $this->cachePool, - new CurlHttpAdapter(), - 'https://publicsuffix.org/list/public_suffix_list.dat' - ); + $this->manager = new PublicSuffixListManager($this->cachePool, new CurlHttpAdapter()); } public function tearDown() @@ -44,7 +41,7 @@ public function tearDown() public function testGetDifferentPublicList() { - $publicSuffixList = $this->manager->getList(); + $publicSuffixList = $this->manager->getList(PublicSuffixList::ALL_DOMAINS, $this->sourceUrl); $invalidList = $this->manager->getList('invalid type'); $this->assertEquals($publicSuffixList, $invalidList); } @@ -52,23 +49,23 @@ public function testGetDifferentPublicList() public function testRefreshList() { $previous = $this->manager->getList(); - $this->assertTrue($this->manager->refreshPublicSuffixList()); + $this->assertTrue($this->manager->refreshPublicSuffixList($this->sourceUrl)); $this->assertEquals($previous, $this->manager->getList()); } public function testGetListRebuildListFromLocalCache() { - $previous = $this->manager->getList(PublicSuffixList::ICANN_DOMAINS); - $this->cachePool->delete(PublicSuffixList::ICANN_DOMAINS); //delete local copy of ICAN DOMAINS RULES - $list = $this->manager->getList(PublicSuffixList::ICANN_DOMAINS); - $this->assertEquals($previous, $this->manager->getList(PublicSuffixList::ICANN_DOMAINS)); + $previous = $this->manager->getList(PublicSuffixList::ICANN_DOMAINS, $this->sourceUrl); + $this->cachePool->delete(PublicSuffixList::ICANN_DOMAINS, $this->sourceUrl); //delete local copy of ICAN DOMAINS RULES + $list = $this->manager->getList(PublicSuffixList::ICANN_DOMAINS, $this->sourceUrl); + $this->assertEquals($previous, $this->manager->getList(PublicSuffixList::ICANN_DOMAINS, $this->sourceUrl)); } public function testGetListRebuildListFromRemoveSource() { - $previous = $this->manager->getList(PublicSuffixList::ICANN_DOMAINS); + $previous = $this->manager->getList(PublicSuffixList::ICANN_DOMAINS, $this->sourceUrl); $this->cachePool->clear(); //delete all local cache - $list = $this->manager->getList(PublicSuffixList::ICANN_DOMAINS); - $this->assertEquals($previous, $this->manager->getList(PublicSuffixList::ICANN_DOMAINS)); + $list = $this->manager->getList(PublicSuffixList::ICANN_DOMAINS, $this->sourceUrl); + $this->assertEquals($previous, $this->manager->getList(PublicSuffixList::ICANN_DOMAINS, $this->sourceUrl)); } } diff --git a/tests/PublicSuffixListTest.php b/tests/PublicSuffixListTest.php index bf23a112..cc7bef68 100644 --- a/tests/PublicSuffixListTest.php +++ b/tests/PublicSuffixListTest.php @@ -13,12 +13,12 @@ namespace Pdp\Tests; use OutOfRangeException; -use Pdp\Cache\FileCacheAdapter; use Pdp\Http\CurlHttpAdapter; use Pdp\MatchedDomain; use Pdp\NullDomain; use Pdp\PublicSuffixList; use Pdp\PublicSuffixListManager; +use Pdp\Tests\Cache\FileCacheAdapter; use Pdp\UnmatchedDomain; use PHPUnit\Framework\TestCase; From dd48f840efcf4d6ece62a970ae2aaf551b9e1e3e Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 8 Dec 2017 15:16:23 +0100 Subject: [PATCH 045/461] improve v5 Use league/uri-hostname-parser 1.0.4 as basis and adds the ability to resolve the domain against a sub section of the PSL --- .editorconfig | 12 + .gitattributes | 14 + .github/CONTRIBUTING.md | 49 ++ .github/ISSUE_TEMPLATE.md | 22 + .github/PULL_REQUEST_TEMPLATE.md | 25 + .php_cs | 45 +- .travis.yml | 13 +- CONTRIBUTING.md | 22 - README.md | 520 ++++++++---------- bin/update-psl | 44 +- build.properties | 2 - build.xml | 43 -- composer.json | 15 +- ...ULL-5a3cc7f81795bb2e48e848af42d287b4.cache | 1 + data/pdp::ALL.cache | 1 - data/pdp::ICANN.cache | 2 +- phpunit.xml.dist | 38 +- .../FileCacheAdapter.php => src/Cache.php | 42 +- .../CacheException.php | 6 +- ...CurlHttpAdapter.php => CurlHttpClient.php} | 28 +- src/Domain.php | 255 ++++++++- src/Exception.php | 18 + src/Http/HttpAdapter.php | 35 -- src/HttpClient.php | 41 ++ src/HttpClientException.php | 18 + src/Installer.php | 131 +++++ src/LabelsTrait.php | 76 --- src/Manager.php | 205 +++++++ src/MatchedDomain.php | 93 ---- src/NullDomain.php | 47 -- src/PublicSuffixList.php | 292 ---------- src/PublicSuffixListManager.php | 229 -------- src/Rules.php | 226 ++++++++ src/UnmatchedDomain.php | 93 ---- tests/CacheTest.php | 474 ++++++++++++++++ tests/CheckPublicSuffixTest.php | 148 ----- ...AdapterTest.php => CurlHttpClientTest.php} | 26 +- tests/DomainTest.php | 30 +- tests/ManagerTest.php | 62 +++ tests/PublicSuffixListManagerTest.php | 71 --- tests/PublicSuffixListTest.php | 154 ------ tests/RulesTest.php | 314 +++++++++++ 42 files changed, 2216 insertions(+), 1766 deletions(-) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 CONTRIBUTING.md delete mode 100644 build.properties delete mode 100644 build.xml create mode 100644 data/pdp-PSL-FULL-5a3cc7f81795bb2e48e848af42d287b4.cache delete mode 100644 data/pdp::ALL.cache rename tests/Cache/FileCacheAdapter.php => src/Cache.php (79%) rename tests/Cache/InvalidArgumentException.php => src/CacheException.php (67%) rename src/{Http/CurlHttpAdapter.php => CurlHttpClient.php} (50%) create mode 100644 src/Exception.php delete mode 100644 src/Http/HttpAdapter.php create mode 100644 src/HttpClient.php create mode 100644 src/HttpClientException.php create mode 100644 src/Installer.php delete mode 100644 src/LabelsTrait.php create mode 100644 src/Manager.php delete mode 100644 src/MatchedDomain.php delete mode 100644 src/NullDomain.php delete mode 100644 src/PublicSuffixList.php delete mode 100644 src/PublicSuffixListManager.php create mode 100644 src/Rules.php delete mode 100644 src/UnmatchedDomain.php create mode 100644 tests/CacheTest.php delete mode 100644 tests/CheckPublicSuffixTest.php rename tests/{Http/CurlHttpAdapterTest.php => CurlHttpClientTest.php} (52%) create mode 100644 tests/ManagerTest.php delete mode 100644 tests/PublicSuffixListManagerTest.php delete mode 100644 tests/PublicSuffixListTest.php create mode 100644 tests/RulesTest.php diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..56f3b6bf --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..231a7053 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,14 @@ +* text=auto + +/.editorconfig export-ignore +/.gitattributes export-ignore +/.github export-ignore +/.gitignore export-ignore +/.php_cs export-ignore +/.scrutinizer.yml export-ignore +/.travis.yml export-ignore +/README.md export-ignore +/CHANGELOG.md export-ignore +/CONDUCT.md export-ignore +/phpunit.xml export-ignore +/tests export-ignore diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000..fb6de647 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,49 @@ +# Contributing + +Contributions are **welcome** and will be fully **credited**. + +## Bug Report + +We accept bug reports via issues created on [Github](https://github.com/jeremykendall/php-domain-parser/issues). + +### Prior to submitting your report + +- **Always search the issue or pull request list first** - The odds are good that if you've found a problem, someone else has found it, too. + +- **Always try the [master branch](https://github.com/jeremykendall/php-domain-parser)** - to see if the reported bug has not already been fixed. + +### When submitting your report + +- **Open a new bug report for each issue.** + +- **Write a clear summary in english** - A good summary should quickly and uniquely identify a bug report. It should explain the problem, not your suggested solution. + +- **Be brief, but don't leave any important details out** - Tell us what you did, what you expected to happen, and what happened. Do not forget to mention your PHP version, the OS Platform and the package version you were using. + +## Pull Request + +We accept contributions via Pull Requests on [Github](https://github.com/jeremykendall/php-domain-parser/pull). + +- **[PSR-2 Coding Standard](http://www.php-fig.org/psr/psr-2/)** - Your patch won't be accepted if it doesn't pass the package coding style test suite. + +- **Add tests!** - Your patch won't be accepted if it doesn't have tests. + +- **Document any change in behaviour** - Make sure the README and any other relevant documentation are kept up-to-date. + +- **Consider our release cycle** - We try to follow semver. Randomly breaking public APIs is not an option. + +- **Create topic branches** - Don't ask us to pull from your master branch. + +- **One pull request per feature** - If you want to do more than one thing, send multiple pull requests. + +- **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please squash them before submitting. + + +## Running Tests + +``` bash +$ composer test +``` + + +**Happy coding**! diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..b52aa102 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,22 @@ +## Issue summary + +_(Please explain in plain english your issue)_ + +### System informations + +_(In case of a bug report Please complete the table below)_ + +| Information | Description | +|--------------|---------| +| Pdp version | | +| PHP version | | +| OS Platform | | + + +## Standalone code, or other way to reproduce the problem + +_(Please complete the text below to help us fix the issue)_ + +### Expected result + +### Actual result diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..06752e87 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,25 @@ +## Introduction + +_(Please explain the library current status regarding your PR.)_ + +## Proposal + +### Describe the new/upated/fixed feature + +_(Please explain your proposal. If this is a issue fix, please provide the issue number. If you have not yet created an issue, please do so now)_ + +### Backward Incompatible Changes + +_(Describe if they exists BC break)_ + +### Targeted release version + +_(Indicate the release version targeted for your PR)_ + +### PR Impact + +_(Describe the PR impact on the current public API)_ + +## Open issues + +_(Describe possible open issues and/or future scope if any depending on this RFC acceptance)_ diff --git a/.php_cs b/.php_cs index 602ff979..bb1a8a13 100644 --- a/.php_cs +++ b/.php_cs @@ -1,28 +1,39 @@ in('src') - ->in('tests'); + ->in(__DIR__.'/src') + ->in(__DIR__.'/tests') +; return PhpCsFixer\Config::create() - ->setRiskyAllowed(true) - ->setUsingCache(true) ->setRules([ '@PSR2' => true, - '@Symfony' => true, 'array_syntax' => ['syntax' => 'short'], - 'concat_space' => ['spacing' => 'one'], - 'yoda_style' => false, - 'is_null' => true, - 'modernize_types_casting' => true, - 'no_alias_functions' => true, - 'ordered_imports' => true, + 'concat_space' => ['spacing' => 'none'], + 'new_with_braces' => true, + 'no_blank_lines_after_phpdoc' => true, + 'no_empty_phpdoc' => true, + 'no_empty_comment' => true, + 'no_leading_import_slash' => true, + 'no_trailing_comma_in_singleline_array' => true, + 'no_unused_imports' => true, + 'ordered_imports' => ['importsOrder' => null, 'sortAlgorithm' => 'alpha'], + 'phpdoc_add_missing_param_annotation' => ['only_untyped' => false], + 'phpdoc_align' => true, + 'phpdoc_no_empty_return' => true, 'phpdoc_order' => true, - 'pre_increment' => false, + 'phpdoc_scalar' => true, + 'phpdoc_to_comment' => true, + 'psr0' => true, 'psr4' => true, - 'random_api_migration' => true, - 'single_blank_line_before_namespace' => false, + 'return_type_declaration' => ['space_before' => 'none'], + 'single_blank_line_before_namespace' => true, + 'single_quote' => true, + 'space_after_semicolon' => true, + 'ternary_operator_spaces' => true, + 'trailing_comma_in_multiline_array' => true, + 'trim_array_spaces' => true, + 'whitespace_after_comma_in_array' => true, ]) - ->setFinder($finder); + ->setFinder($finder) +; \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 9e183f9d..b393c0a1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,13 +5,15 @@ sudo: false matrix: include: - php: 7.0 - env: VALIDATE_CODING_STYLE=true IGNORE_PLATFORMS=false + env: COLLECT_COVERAGE=true VALIDATE_CODING_STYLE=true IGNORE_PLATFORMS=false - php: 7.1 - env: VALIDATE_CODING_STYLE=true IGNORE_PLATFORMS=false - - php: master - env: VALIDATE_CODING_STYLE=false IGNORE_PLATFORMS=true + env: COLLECT_COVERAGE=true VALIDATE_CODING_STYLE=true IGNORE_PLATFORMS=false + - php: 7.2 + env: COLLECT_COVERAGE=false VALIDATE_CODING_STYLE=false IGNORE_PLATFORMS=true + - php: nightly + env: COLLECT_COVERAGE=false VALIDATE_CODING_STYLE=false IGNORE_PLATFORMS=true allow_failures: - - php: master + - php: nightly fast_finish: true cache: @@ -29,4 +31,5 @@ script: - composer phpunit after_script: + - if [ "$COLLECT_COVERAGE" == "true" ]; then wget https://scrutinizer-ci.com/ocular.phar && php ocular.phar code-coverage:upload --format=php-clover build/clover.xml; fi - if [ "$VALIDATE_CODING_STYLE" == "true" ]; then composer phpcs; fi \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 2513f4ef..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,22 +0,0 @@ -# How to Contribute - -## Pull Requests - -1. Create your own [fork](https://help.github.com/articles/fork-a-repo) of this repo -2. Create a new branch for each feature or improvement -3. Send a pull request from each feature branch to the **develop** branch - -It is very important to separate new features or improvements into separate -feature branches, and to send a pull request for each branch. This allows me to -review and pull in new features or improvements individually. - -## Style Guide - -All pull requests must adhere to the [PSR-2 standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md). - -## Unit Testing - -All pull requests must be accompanied by passing PHPUnit unit tests and -complete code coverage. - -[Learn about PHPUnit](https://github.com/sebastianbergmann/phpunit/) diff --git a/README.md b/README.md index 91ad9979..9645c967 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,8 @@ domain parser implemented in PHP. [![Total Downloads](https://poser.pugx.org/jeremykendall/php-domain-parser/downloads.png)](https://packagist.org/packages/jeremykendall/php-domain-parser) [![Latest Stable Version](https://poser.pugx.org/jeremykendall/php-domain-parser/v/stable.png)](https://packagist.org/packages/jeremykendall/php-domain-parser) -## Motivation +Motivation +------- While there are plenty of excellent URL parsers and builders available, there are very few projects that can accurately parse a url into its component @@ -22,380 +23,313 @@ manipulation and additionally include public suffix domain parsing. PHP Domain Parser was built around accurate Public Suffix List based parsing from the very beginning, adding a URL object simply for the sake of completeness. -## Installation +System Requirements +------- -The only (currently) supported method of installation is via -[Composer](http://getcomposer.org). +You need: -Create a `composer.json` file in the root of your project: +- **PHP >= 7.0** but the latest stable version of PHP is recommended +- the `mbstring` extension +- the `intl` extension +- the `curl` extension -``` json +Dependencies +------- + +- [PSR-16](http://www.php-fig.org/psr/psr-16/) + +Installation +-------- + +~~~ +$ composer require jeremykendall/php-domain-parser +~~~ + +Documentation +-------- + +### Public Suffix Manager + + +~~~php +getList()); -$host = 'http://user:pass@www.pref.okinawa.jp:8080/path/to/page.html?query=string#fragment'; -$url = $parser->parseUrl($host); -var_dump($url); -``` +This method returns a `Rules` object which is instantiated with the PSL rules. -The above will output: +The method takes an optional `$source_url` argument which specifies the PSL source URL. If no local cache exists for the submitted source URL, the method will: -``` -class Pdp\Uri\Url#6 (8) { - private $scheme => - string(4) "http" - private $host => - class Pdp\Uri\Url\Host#5 (3) { - private $subdomain => - string(3) "www" - private $registrableDomain => - string(15) "pref.okinawa.jp" - private $publicSuffix => - string(10) "okinawa.jp" - } - private $port => - int(8080) - private $user => - string(4) "user" - private $pass => - string(4) "pass" - private $path => - string(18) "/path/to/page.html" - private $query => - string(12) "query=string" - private $fragment => - string(8) "fragment" -} -``` +1. call `Manager::refreshRules` with the given URL to update its local cache +2. instantiate the `Rules` object with the newly cached data. -### Convenience Methods +On error, the method throws an `Pdp\Exception`. -A magic [`__get()`](http://php.net/manual/en/language.oop5.overloading.php#object.get) -method is provided to access the above object properties. Obtaining the public -suffix for a parsed domain is as simple as: - -``` php +~~~php parseUrl($host); -$publicSuffix = $url->host->publicSuffix; +use Pdp\Cache; +use Pdp\CurlHttpClient; +use Pdp\Manager; -// $publicSuffix = 'com.au' -``` +$manager = new Manager(new Cache(), new CurlHttpClient()); +$rules = $manager->getRules('https://publicsuffix.org/list/public_suffix_list.dat'); +$rules->resolve('www.bébé.be'); +~~~ -### IDNA Support +#### Refreshing the cached rules -[IDN (Internationalized Domain Name)](http://en.wikipedia.org/wiki/Internationalized_domain_name) -support was added in version `1.4.0`. Both unicode domains and their ASCII -equivalents are supported. +This method enables refreshing your local copy of the PSL stored with your [PSR-16](http://www.php-fig.org/psr/psr-16/) Cache and retrieved using the Http Client. By default the method will use the `Manager::PSL_URL` as the source URL but you are free to substitute this URL with your own. +The method returns a boolean value which is `true` on success. -**IMPORTANT**: +~~~php +refreshRules('https://publicsuffix.org/list/public_suffix_list.dat'); +~~~ -Parsing IDNA hosts is no different that parsing standard hosts. Setting `$host -= 'Яндекс.РФ';` (Russian-Cyrillic) in the *Parsing URLs* example would return: +## Automatic Updates -``` -class Pdp\Uri\Url#6 (8) { - private $scheme => - string(0) "" - private $host => - class Pdp\Uri\Url\Host#5 (4) { - private $subdomain => - NULL - private $registrableDomain => - string(17) "яндекс.рф" - private $publicSuffix => - string(4) "рф" - private $host => - string(17) "яндекс.рф" - } - private $port => - NULL - private $user => - NULL - private $pass => - NULL - private $path => - NULL - private $query => - NULL - private $fragment => - NULL -} -``` +It is important to always have an up to date PSL ICANN Section. In order to do so the library comes bundle with an auto-update script located in the `bin` directory. -#### ASCII (Punycode) +~~~bash +$ php ./bin/update-psl +~~~ -If you choose to provide the ASCII equivalent of the unicode domain name -(`$host = 'http://xn--d1acpjx3f.xn--p1ai';` in the case of the *Parsing URLs* example), -the ASCII equivalent will be returned by the parser: +This script requires that: -``` -class Pdp\Uri\Url#6 (8) { - private $scheme => - string(4) "http" - private $host => - class Pdp\Uri\Url\Host#5 (4) { - private $subdomain => - NULL - private $registrableDomain => - string(22) "xn--d1acpjx3f.xn--p1ai" - private $publicSuffix => - string(8) "xn--p1ai" - private $host => - string(22) "xn--d1acpjx3f.xn--p1ai" - } - private $port => - NULL - private $user => - NULL - private $pass => - NULL - private $path => - NULL - private $query => - NULL - private $fragment => - NULL -} -``` +- The `Pdp\Installer` class which comes bundle with this package +- The use of the Cache and HTTP Client implementations bundle with the package. -### IPv6 Support +If you prefer using your own implementations you should: -Parsing IPv6 hosts is no different that parsing standard hosts. Setting `$host -= 'http://[2001:db8:85a3:8d3:1319:8a2e:370:7348]:8080/';` -in the *Parsing URLs* example would return: +1. Copy the `Pdp\Installer` class +2. Adapt its code to reflect your requirements. -``` -class Pdp\Uri\Url#6 (8) { - private $scheme => - string(4) "http" - private $host => - class Pdp\Uri\Url\Host#5 (4) { - private $subdomain => - NULL - private $registrableDomain => - NULL - private $publicSuffix => - NULL - private $host => - string(38) "[2001:db8:85a3:8d3:1319:8a2e:370:7348]" - } - private $port => - string(4) "8080" - private $user => - NULL - private $pass => - NULL - private $path => - string(1) "/" - private $query => - NULL - private $fragment => - NULL -} -``` -**IMPORTANT**: IPv6 url host names *must* be enclosed in square brackets. They -will not be parsed properly otherwise. +In any cases your are required to register a cron with your chosen script to keep your data up to date + +For example, below I'm using the `Manager` with -> Hat tip to [@geekwright](https://github.com/geekwright) for adding IPv6 support in a -> [bugfix pull request](https://github.com/jeremykendall/php-domain-parser/pull/35). +- the [Symfony Cache component](https://github.com/symfony/cache) +- the [Guzzle](https://github.com/guzzle/guzzle) client. -### Parsing Domains +Of course you can add more setups depending on your usage. -If you'd like to parse the domain (or host) portion only, you can use -`Parser::parseHost()`. +

Be sure to adapt the following code to your own framework/situation. The following code is given as an example without warranty of it working out of the box.

-```php +~~~php parseHost('a.b.c.cy'); -var_dump($host); -``` +use GuzzleHttp\Client as GuzzleClient; +use Pdp\HttpClient; +use Pdp\HttpClientException; +use Pdp\Manager; +use Symfony\Component\Cache\Simple\PDOCache; -The above will output: +final class GuzzleHttpClientAdapter implements HttpClient +{ + private $client; -``` -class Pdp\Uri\Url\Host#7 (3) { - private $subdomain => - string(1) "a" - private $registrableDomain => - string(6) "b.c.cy" - private $publicSuffix => - string(4) "c.cy" + public function __construct(GuzzleClient $client) + { + $this->client = $client; + } + + public function getContent(string $url): string + { + try { + return $client->get($url)->getBody()->getContents(); + } catch (Throwable $e) { + throw new HttpClientException($e->getMessage(), $e->getCode(), $e); + } + } } -``` -### Validation of Public Suffixes +$dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbuser', 'dbpass'); +$symfonyCache = new PDOCache($dbh, 'league-psl-icann', 86400); +$guzzleAdapter = new GuzzleHttpClientAdapter(new GuzzleClient()); +$manager = new Manager($symfonyCache, $guzzleAdapter); +$manager->refreshRules(); +//the rules are saved to the database for 1 day +//the rules are fetched using GuzzlClient -Public Suffix validation is available by calling `Parser::isSuffixValid()`: +$rules = $manager->getRules(); +$domain = $rules->resolve('nl.shop.bébé.faketld'); +$domain->getDomain(); //returns 'nl.shop.bébé.faketld' +$domain->getPublicSuffix(); //returns 'faketld' +$domain->getRegistrableDomain(); //returns 'bébé.faketld' +$domain->getSubDomain(); //returns 'nl.shop' +$domain->isValid(); //returns false +~~~ -``` -var_dump($parser->isSuffixValid('www.example.faketld'); -// false +In any case, you should setup a cron to regularly update your local cache. -var_dump($parser->isSuffixValid('www.example.com.au'); -// true -``` -A suffix is considered invalid if it is not contained in the -[Public Suffix List](http://publicsuffix.org/). +### Public Suffix Resolver -> Huge thanks to [@SmellyFish](https://github.com/SmellyFish) for submitting -> [Add a way to validate TLDs](https://github.com/jeremykendall/php-domain-parser/pull/36) -> to add public suffix validation to the project. -### Retrieving Domain Components Only ### +#### Rules and Domain -If you're only interested in a domain component, you can use the parser to -retrieve only the component you're interested in -```php +~~~php getSubdomain('www.scottwills.co.uk')); -var_dump($parser->getRegistrableDomain('www.scottwills.co.uk')); -var_dump($parser->getPublicSuffix('www.scottwills.co.uk')); -``` - -The above will output: +namespace Pdp; -``` -string(3) "www" -string(16) "scottwills.co.uk" -string(5) "co.uk" -``` +final class Rules +{ + public function __construct(array $rules) + public function resolve(string $domain = null, string $type = Domain::UNKNOWN_DOMAIN): Domain +} +~~~ -### Sanity Check +The `Rules` constructor expects a `array` representation of the Public Suffix List. This `array` representation is constructed by the `Manager` and stored using a PSR-16 compliant cache. -You can quickly parse a url from the command line with the provided `parse` -vendor binary. From the root of your project, simply call: +The `Rules` class resolves the submitted domain against the parsed rules from the PSL. This is done using the `Rules::resolve` method which returns a `Pdp\Domain` object. The method expect a valid domain and you can optionnally specify against which section of rules you want to validate the given domain. By default all section are used (ie `PRIVATE_DOMAIN` and `ICANN_DOMAIN`) if the submitted section is invalid or unknown, the resolver will fallback to use the entire list. -``` bash -$ ./vendor/bin/parse -``` +~~~php + http - [user] => - [pass] => - [host] => www.waxaudio.com.au - [subdomain] => www - [registrableDomain] => waxaudio.com.au - [publicSuffix] => com.au - [port] => - [path] => / - [query] => - [fragment] => -) -Host: http://www.waxaudio.com.au/ -``` +final class Domain +{ -### Example Script + const ICANN_DOMAIN = 'ICANN_DOMAIN'; + const PRIVATE_DOMAIN = 'PRIVATE_DOMAIN'; + const UNKNOWN_DOMAIN = 'UNKNOWN_DOMAIN'; + + public function __construct(?string $domain = null, ?string $publicSuffix = null, string $type = self::UNKNOWN_DOMAIN); + public function getDomain(): ?string + public function getPublicSuffix(): ?string + public function getRegistrableDomain(): ?string + public function getSubDomain(); ?string + public function isValid(): bool; + public function isICANN(): bool; + public function isPrivate(): bool; +} +~~~ -For more information on using the PHP Domain Parser, please see the provided -[example script](https://github.com/jeremykendall/php-domain-parser/blob/master/example.php). +The `Domain` getters method always return normalized value according to the domain status against the PSL rules. -### Refreshing the Public Suffix List +

Domain::isValid status depends on the PSL rules used. For the same domain, depending on the rules used a domain public suffix may be valid or not.

-While a cached PHP copy of the Public Suffix List is provided for you in the -`data` directory, that copy may or may not be up to date (Mozilla provides an -[Atom change feed](http://hg.mozilla.org/mozilla-central/atom-log/default/netwerk/dns/effective_tld_names.dat) -to keep up with changes to the list). Please use the provided vendor binary to -refresh your cached copy of the Public Suffix List. +~~~php +getRules('https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat'); +//$rules is a Pdp\Rules object -You may verify the update by checking the timestamp on the files located in the -`data` directory. +$domain = $rules->resolve('www.ulb.ac.be'); +$domain->getDomain(); //returns 'www.ulb.ac.be' +$domain->getPublicSuffix(); //returns 'ac.be' +$domain->getRegistrableDomain(); //returns 'ulb.ac.be' +$domain->getSubDomain(); //returns 'www' +$domain->isValid(); //returns true +$domain->isICANN(); //returns true +$domain->isPrivate(); //returns false -**Important**: The vendor binary `update-psl` depends on an internet connection to -update the cached Public Suffix List. +//let's resolve the same URI againts the PRIVATE DOMAIN SECTION -## Possible Unexpected Behavior +$domain = $rules->resolve('www.ulb.ac.be', Domain::PRIVATE_DOMAIN); +$domain->getDomain(); //returns 'www.ulb.ac.be' +$domain->getPublicSuffix(); //returns 'be' +$domain->getRegistrableDomain(); //returns 'ac.be' +$domain->getSubDomain(); //returns 'www.ulb' +$domain->isValid(); //returns false +$domain->isICANN(); //returns false +$domain->isPrivate(); //returns false +~~~ -PHP Domain Parser is built around PHP's -[`parse_url()`](http://php.net/parse_url) function and, as such, exhibits most -of the same behaviors of that function. Just like `parse_url()`, this library -is not meant to validate URLs, but rather to break a URL into its component -parts. +

Warning: Some people use the PSL to determine what is a valid domain name and what isn't. This is dangerous, particularly in these days where new gTLDs are arriving at a rapid pace, if your software does not regularly receive PSL updates, because it will erroneously think new gTLDs are not valid. The DNS is the proper source for this information. If you must use it for this purpose, please do not bake static copies of the PSL into your software with no update mechanism.

-One specific, counterintuitive behavior is that PHP Domain Parser will happily -parse a URL with [spaces in the host part](https://github.com/jeremykendall/php-domain-parser/issues/45). +Contributing +------- -## Contributing +Contributions are welcome and will be fully credited. Please see [CONTRIBUTING](.github/CONTRIBUTING.md) for details. -Pull requests are *always* welcome! Please review the CONTRIBUTING.md document before -submitting pull requests. +Credits +------- -## Heads up: BC Break In All 1.4 Versions +- [Jeremy Kendall](https://github.com/jeremykendall) +- [ignace nyamagana butera](https://github.com/nyamsprod) +- [All Contributors](https://github.com/thephpleague/uri/contributors) -The 1.4 series introduced a backwards incompatible change by adding PHP's `ext-mbstring` -and `ext-intl` as dependencies. This should have resulted in a major version -bump. Instead I bumped the minor version from 1.3.1 to 1.4. +License +------- -I highly recommend reverting to 1.3.1 if you're running into extension issues and -do not want to or cannot install `ext-mbstring` and `ext-intl`. You will lose -IDNA and IPv6 support, however. Those are only available in versions >= 1.4. +The MIT License (MIT). Please see [License File](LICENSE) for more information. -I apologize for any issues you may have encountered due my -[semver](http://semver.org/) error. -## Attribution +Attribution +------- The HTTP adapter interface and the cURL HTTP adapter were inspired by (er, lifted from) Will Durand's excellent diff --git a/bin/update-psl b/bin/update-psl index 3f9e295a..2b25cecf 100755 --- a/bin/update-psl +++ b/bin/update-psl @@ -1,46 +1,8 @@ #!/usr/bin/env php refreshPublicSuffixList(); - echo 'Update complete.' . PHP_EOL; - exit(0); -} catch (Exception $e) { - echo 'An error occurred while updating the Public Suffix List.' . PHP_EOL; - echo $e->getMessage() . PHP_EOL; - exit(1); -} +Installer::updateLocalCache(); \ No newline at end of file diff --git a/build.properties b/build.properties deleted file mode 100644 index 16caf0e8..00000000 --- a/build.properties +++ /dev/null @@ -1,2 +0,0 @@ -project.basedir = . -passthru = true diff --git a/build.xml b/build.xml deleted file mode 100644 index 85d0143f..00000000 --- a/build.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/composer.json b/composer.json index 14dcfe2f..d1d2e107 100644 --- a/composer.json +++ b/composer.json @@ -13,6 +13,11 @@ "homepage": "http://about.me/jeremykendall", "role": "Developer" }, + { + "name": "Ignace Nyamagana Butera", + "homepage": "http://nyamsprod.com", + "role": "Developer" + }, { "name": "Contributors", "homepage": "https://github.com/jeremykendall/php-domain-parser/graphs/contributors" @@ -37,6 +42,9 @@ "mikey179/vfsStream": "^1.6", "friendsofphp/php-cs-fixer": "^2.7" }, + "suggest": { + "psr/simple-cache-implementation": "To enable using other cache providers" + }, "autoload": { "psr-4": { "Pdp\\": "src/" @@ -48,9 +56,10 @@ } }, "scripts": { - "post-install-cmd": "php bin/update-psl", - "test": "phpunit --coverage-text; php-cs-fixer fix -v --diff --dry-run", + "post-install-cmd": "\\Pdp\\Installer::updateLocalCache", + "post-update-cmd": "\\Pdp\\Installer::updateLocalCache", + "test": "phpunit --coverage-text; php-cs-fixer fix -vv --diff --dry-run --allow-risky=yes", "phpunit": "phpunit --coverage-text", - "phpcs": "php-cs-fixer fix -v --diff --dry-run" + "phpcs": "php-cs-fixer fix -vv --diff --dry-run --allow-risky=yes" } } diff --git a/data/pdp-PSL-FULL-5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL-FULL-5a3cc7f81795bb2e48e848af42d287b4.cache new file mode 100644 index 00000000..01abca41 --- /dev/null +++ b/data/pdp-PSL-FULL-5a3cc7f81795bb2e48e848af42d287b4.cache @@ -0,0 +1 @@ +s:104236:"{"ICANN_DOMAIN":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gov":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[]},"br":{"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"salvador":[],"sampa":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"*":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"boots":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtpc":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAIN":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":{"*":[]},"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"se":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"barsyonline":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[]},"hepforge":[],"js":[],"bmoattachments":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ca":{"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"ws":{"advisor":{"*":[]},"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"hzc":[],"sandcats":[],"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[]},"host":{"cloudaccess":[],"freesite":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[]},"pw":{"cloudns":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"no":{"co":[],"blogspot":[]},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"cldmail":{"hb":[]},"net":[],"org":[],"pp":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"cloud":{"myfusion":[],"statics":{"*":[]},"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"at":{"futurecms":{"*":[]},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"no-ip":[],"wellbeingzone":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"be":{"blogspot":[],"transurl":{"*":[]}},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]}},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"co":{"com":{"blogspot":[]},"nodum":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[]},"it":{"blogspot":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"bs":{"we":[]},"online":{"barsy":[]},"support":{"barsy":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[]},"ai":{"nom":[]},"gd":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"hn":{"nom":[]},"kz":{"nym":[]},"sx":{"nym":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"lc":{"oy":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"space":{"stackspace":[],"uber":[],"xs4all":[]},"farm":{"storj":[]},"mobi":{"dscloud":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file diff --git a/data/pdp::ALL.cache b/data/pdp::ALL.cache deleted file mode 100644 index 2a5cb4e9..00000000 --- a/data/pdp::ALL.cache +++ /dev/null @@ -1 +0,0 @@ -s:102659:"{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[],"blogspot":[],"nom":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[],"nom":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[],"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":{"blogspot":[]},"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":{"cloudns":[]},"at":{"ac":[],"co":{"blogspot":[]},"gv":[],"or":[],"futurecms":{"*":[]},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"au":{"com":{"blogspot":[]},"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[],"blogspot":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[],"blogspot":[],"transurl":{"*":[]}},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[],"blogspot":[],"barsy":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"bj":{"asso":[],"barreau":[],"gouv":[],"blogspot":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gov":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[]},"br":{"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"belem":[],"bio":[],"blog":[],"bmd":[],"bsb":[],"cim":[],"cng":[],"cnt":[],"com":{"blogspot":[]},"coop":[],"cri":[],"cuiaba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"flog":[],"floripa":[],"fortal":[],"fm":[],"fnd":[],"fot":[],"fst":[],"g12":[],"ggf":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jampa":[],"jor":[],"jus":[],"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"lel":[],"londrina":[],"macapa":[],"maceio":[],"mat":[],"med":[],"mil":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"qsl":[],"radio":[],"rec":[],"recife":[],"riobranco":[],"sjc":[],"slg":[],"srv":[],"taxi":[],"teo":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"we":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":{"blogspot":[]},"of":[],"nym":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"za":[],"nym":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"cat":[],"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"cd":{"gov":[]},"cf":{"blogspot":[]},"cg":[],"ch":{"square7":[],"blogspot":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[],"blogspot":[],"nom":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}},"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":{"blogspot":[]},"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[],"nodum":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"se":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"barsyonline":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"yolasite":[]},"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":{"blogspot":[]},"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[],"ath":[],"info":[]},"cy":{"ac":[],"biz":[],"com":{"blogspot":[]},"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]}},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[]},"dj":[],"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":{"blogspot":[]},"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":{"blogspot":[]},"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":{"blogspot":[]},"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"fi":{"aland":[],"dy":[],"blogspot":[],"iki":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[],"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"ga":[],"gb":[],"gd":{"nom":[]},"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[],"cya":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[],"nom":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[],"blogspot":[],"nym":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[],"nom":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[],"blogspot":[],"ltd":[],"inc":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[],"nom":[]},"hr":{"iz":[],"from":[],"name":[],"com":[],"blogspot":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[],"blogspot":[]},"id":{"ac":[],"biz":[],"co":{"blogspot":[]},"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[],"blogspot":[]},"il":{"ac":[],"co":{"blogspot":[]},"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[],"ro":[],"nom":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[],"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"int":{"eu":[]},"io":{"com":[],"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"hzc":[],"sandcats":[],"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"wedeploy":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[],"cupcake":[],"blogspot":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[],"blogspot":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}},"blogspot":[]},"ke":{"*":[],"co":{"blogspot":[]}},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[],"blogspot":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[],"nym":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[],"bnr":[],"c":[],"nym":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[],"oy":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[],"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":{"blogspot":[]},"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[],"c66":[],"daplie":{"localhost":[]},"filegear":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[],"blogspot":[],"nom":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[],"nyc":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":{"dscloud":[]},"mp":[],"mq":[],"mr":{"gov":[],"blogspot":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":{"blogspot":[]},"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[],"blogspot":[],"nym":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[],"blogspot":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nc":{"asso":[],"nom":[]},"ne":[],"net":{"alwaysdata":{"*":[]},"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":{"blogspot":[]},"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[],"virtueeldomein":[],"co":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]},"co":[],"blogspot":[]},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"nz":{"ac":[],"co":{"blogspot":[]},"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[],"nym":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[]},"hepforge":[],"js":[],"bmoattachments":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[],"blogspot":[],"nym":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[],"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[],"cloudns":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[],"blogspot":[],"nym":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[],"cloudns":[],"nom":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[],"blogspot":[],"nom":[]},"re":{"asso":[],"com":[],"nom":[],"blogspot":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[],"shop":[],"blogspot":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[],"blogspot":[],"nom":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[],"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"cldmail":{"hb":[]},"net":[],"org":[],"pp":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[],"com":[],"blogspot":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[],"blogspot":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[],"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"si":{"blogspot":[],"nom":[]},"sj":[],"sk":{"blogspot":[],"nym":[]},"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[],"blogspot":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[],"nym":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":{"blogspot":[]},"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[],"vpnplus":[]},"tr":{"com":{"blogspot":[]},"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"tw":{"edu":[],"gov":[],"mil":[],"com":{"mymailer":[]},"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[],"url":[],"blogspot":[],"nym":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[],"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[],"blogspot":[],"nom":[]},"uk":{"ac":[],"co":{"blogspot":[],"no-ip":[],"wellbeingzone":[]},"gov":{"service":[],"homeoffice":[]},"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[],"lib":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]},"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"golffan":[],"noip":[],"pointto":[]},"uy":{"com":{"blogspot":[]},"edu":[],"gub":[],"mil":[],"net":[],"org":[],"nom":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[],"nom":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":{"nom":[]},"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[],"blogspot":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"advisor":{"*":[]},"dyndns":[],"mypets":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":{"blogspot":[]},"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"boots":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"chloe":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":{"myfusion":[],"statics":{"*":[]},"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"club":{"cloudns":[]},"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":{"de":[]},"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":{"compute":{"*":[]}},"esurance":[],"etisalat":[],"eurovision":[],"eus":{"party":{"user":[]}},"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":{"ybo":[]},"family":[],"fan":[],"fans":[],"farm":{"storj":[]},"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":{"ptplus":[]},"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":{"cloud":[]},"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":{"cloudaccess":[],"freesite":[]},"hosting":{"opencraft":[]},"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"htc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":{"co":[],"edu":[]},"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":{"static":{"dev":[],"sites":[]}},"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":{"cyon":[],"mypep":[]},"lipsy":[],"live":[],"living":[],"lixil":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":{"router":[]},"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mcd":[],"mcdonalds":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"montblanc":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtpc":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":{"alces":{"*":[]}},"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":{"homelink":[]},"ong":[],"onl":[],"online":{"barsy":[]},"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":{"nerdpol":[]},"page":[],"pamperedchef":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":{"ybo":[]},"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":{"1337":[]},"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":{"ybo":[]},"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":{"clan":[]},"rmit":[],"rocher":[],"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":{"ybo":[]},"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":{"cyon":[],"platformsh":{"*":[]},"byen":[]},"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":{"stackspace":[],"uber":[],"xs4all":[]},"spiegel":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":{"barsy":[]},"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":{"knightpoint":[]},"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":{"ybo":[]},"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":{"blogsite":[],"fhapp":[]},"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":{"triton":{"*":[]},"lima":[]},"zuerich":[]}"; \ No newline at end of file diff --git a/data/pdp::ICANN.cache b/data/pdp::ICANN.cache index 19f0df11..f6353b73 100644 --- a/data/pdp::ICANN.cache +++ b/data/pdp::ICANN.cache @@ -1 +1 @@ -s:86397:"{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gov":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[]},"br":{"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"belem":[],"bio":[],"blog":[],"bmd":[],"bsb":[],"cim":[],"cng":[],"cnt":[],"com":[],"coop":[],"cri":[],"cuiaba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"flog":[],"floripa":[],"fortal":[],"fm":[],"fnd":[],"fot":[],"fst":[],"g12":[],"ggf":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jampa":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"mat":[],"med":[],"mil":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"qsl":[],"radio":[],"rec":[],"recife":[],"riobranco":[],"sjc":[],"slg":[],"srv":[],"taxi":[],"teo":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"*":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"boots":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"chloe":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"htc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mcd":[],"mcdonalds":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"montblanc":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtpc":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"pamperedchef":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]}"; \ No newline at end of file +s:86541:"{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gov":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[]},"br":{"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"salvador":[],"sampa":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"*":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"boots":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtpc":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]}"; \ No newline at end of file diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 1c1ed9a0..f49fa9fd 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,31 +1,37 @@ - - - - + - - ./tests - + + + tests + + - ./src + src + + src + + src/Installer - - + + diff --git a/tests/Cache/FileCacheAdapter.php b/src/Cache.php similarity index 79% rename from tests/Cache/FileCacheAdapter.php rename to src/Cache.php index e1600070..877b47c3 100644 --- a/tests/Cache/FileCacheAdapter.php +++ b/src/Cache.php @@ -9,7 +9,7 @@ */ declare(strict_types=1); -namespace Pdp\Tests\Cache; +namespace Pdp; use DateInterval; use FilesystemIterator; @@ -24,15 +24,15 @@ * * @see https://github.com/kodus/file-cache/blob/master/src/FileCache.php */ -final class FileCacheAdapter implements CacheInterface +final class Cache implements CacheInterface { /** * @var string control characters for keys, reserved by PSR-16 */ const PSR16_RESERVED = '/\{|\}|\(|\)|\/|\\\\|\@|\:/u'; - const FILE_PREFIX = 'pdp::'; + const FILE_PREFIX = 'pdp-'; const FILE_EXTENSION = '.cache'; - const CACHE_TTL = 86400 * 365 * 5; + const CACHE_TTL = 86400 * 7; /** * @var string @@ -54,18 +54,14 @@ final class FileCacheAdapter implements CacheInterface */ public function __construct(string $cache_path = '') { - if ($cache_path === '') { - $cache_path = realpath(dirname(__DIR__, 2) . DIRECTORY_SEPARATOR . 'data'); + if ('' === $cache_path) { + $cache_path = realpath(dirname(__DIR__).DIRECTORY_SEPARATOR.'data'); } if (!file_exists($cache_path) && file_exists(dirname($cache_path))) { $this->mkdir($cache_path); // ensure that the parent path exists } - if (!is_writable($cache_path . DIRECTORY_SEPARATOR)) { - throw new InvalidArgumentException(sprintf('cache path is not writable: %s', $cache_path)); - } - $this->cache_path = $cache_path; } @@ -108,6 +104,10 @@ public function get($key, $default = null) */ public function set($key, $value, $ttl = null) { + if (!is_writable($this->cache_path.DIRECTORY_SEPARATOR)) { + return false; + } + $expires_at = $this->getExpireAt($ttl); $path = $this->getPath($key); $dir = dirname($path); @@ -117,7 +117,7 @@ public function set($key, $value, $ttl = null) $this->mkdir($dir); } - $temp_path = $this->cache_path . DIRECTORY_SEPARATOR . uniqid('', true); + $temp_path = $this->cache_path.DIRECTORY_SEPARATOR.uniqid('', true); if (false === @file_put_contents($temp_path, serialize($value))) { return false; } @@ -149,14 +149,14 @@ private function getExpireAt($ttl): int } if ($ttl instanceof DateInterval) { - return date_create_immutable('@' . time())->add($ttl)->getTimestamp(); + return date_create_immutable('@'.time())->add($ttl)->getTimestamp(); } if ($ttl === null) { return time() + self::CACHE_TTL; } - throw new InvalidArgumentException(sprintf('Expected TTL to be an int, a DateInterval or null; received "%s"', is_object($ttl) ? get_class($ttl) : gettype($ttl))); + throw new CacheException(sprintf('Expected TTL to be an int, a DateInterval or null; received "%s"', is_object($ttl) ? get_class($ttl) : gettype($ttl))); } /** @@ -190,7 +190,7 @@ public function clear() public function getMultiple($keys, $default = null) { if (!is_array($keys) && !$keys instanceof Traversable) { - throw new InvalidArgumentException('keys must be either of type array or Traversable'); + throw new CacheException('keys must be either of type array or Traversable'); } $values = []; @@ -207,7 +207,7 @@ public function getMultiple($keys, $default = null) public function setMultiple($values, $ttl = null) { if (!is_array($values) && !$values instanceof Traversable) { - throw new InvalidArgumentException('keys must be either of type array or Traversable'); + throw new CacheException('keys must be either of type array or Traversable'); } $ok = true; @@ -226,7 +226,7 @@ public function setMultiple($values, $ttl = null) public function deleteMultiple($keys) { if (!is_array($keys) && !$keys instanceof Traversable) { - throw new InvalidArgumentException('keys must be either of type array or Traversable'); + throw new CacheException('keys must be either of type array or Traversable'); } foreach ($keys as $key) { @@ -248,7 +248,7 @@ public function has($key) * * @param string $key * - * @throws InvalidArgumentException if the specified key contains a character reserved by PSR-16 + * @throws CacheException if the specified key contains a character reserved by PSR-16 * * @return string absolute path to cache-file */ @@ -256,7 +256,7 @@ private function getPath($key): string { $this->validateKey($key); - return $this->cache_path . DIRECTORY_SEPARATOR . self::FILE_PREFIX . $key . self::FILE_EXTENSION; + return $this->cache_path.DIRECTORY_SEPARATOR.self::FILE_PREFIX.$key.self::FILE_EXTENSION; } /** @@ -279,16 +279,16 @@ private function listPaths(): Generator /** * @param string $key * - * @throws InvalidArgumentException + * @throws CacheException */ private function validateKey($key) { if (!is_string($key)) { - throw new InvalidArgumentException(sprintf('Expected key to be a string; received "%s"', is_object($key) ? get_class($key) : gettype($key))); + throw new CacheException(sprintf('Expected key to be a string; received "%s"', is_object($key) ? get_class($key) : gettype($key))); } if (preg_match(self::PSR16_RESERVED, $key, $match) === 1) { - throw new InvalidArgumentException(sprintf('invalid character in key: %s', $match[0])); + throw new CacheException(sprintf('invalid character in key: %s', $match[0])); } } diff --git a/tests/Cache/InvalidArgumentException.php b/src/CacheException.php similarity index 67% rename from tests/Cache/InvalidArgumentException.php rename to src/CacheException.php index 48b5557e..d23650a6 100644 --- a/tests/Cache/InvalidArgumentException.php +++ b/src/CacheException.php @@ -9,10 +9,10 @@ */ declare(strict_types=1); -namespace Pdp\Tests\Cache; +namespace Pdp; -use Psr\SimpleCache\InvalidArgumentException as CacheException; +use Psr\SimpleCache\InvalidArgumentException as PsrCacheException; -class InvalidArgumentException extends \InvalidArgumentException implements CacheException +class CacheException extends \InvalidArgumentException implements PsrCacheException { } diff --git a/src/Http/CurlHttpAdapter.php b/src/CurlHttpClient.php similarity index 50% rename from src/Http/CurlHttpAdapter.php rename to src/CurlHttpClient.php index 4a0ba0ab..62690369 100644 --- a/src/Http/CurlHttpAdapter.php +++ b/src/CurlHttpClient.php @@ -9,10 +9,10 @@ */ declare(strict_types=1); -namespace Pdp\Http; +namespace Pdp; /** - * cURL http adapter. + * Simple cURL Http client * * Lifted pretty much completely from William Durand's excellent Geocoder * project @@ -21,19 +21,29 @@ * * @author William Durand * @author Jeremy Kendall + * @author Ignace Nyamagana Butera */ -class CurlHttpAdapter implements HttpAdapter +final class CurlHttpClient implements HttpClient { /** * {@inheritdoc} */ - public function getContent(string $url) + public function getContent(string $url): string { - $ch = curl_init(); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_URL, $url); - $content = curl_exec($ch); - curl_close($ch); + $curl = curl_init(); + curl_setopt_array($curl, [ + CURLOPT_FAILONERROR => true, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_URL => $url, + ]); + $content = curl_exec($curl); + if (CURLE_OK !== ($code = curl_errno($curl))) { + $message = curl_error($curl); + curl_close($curl); + throw new HttpClientException($message, $code); + } + curl_close($curl); return $content; } diff --git a/src/Domain.php b/src/Domain.php index 32ceefa3..2866664a 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -11,42 +11,230 @@ namespace Pdp; -interface Domain +/** + * Domain Value Object + * + * Lifted pretty much completely from Jeremy Kendall PDP + * project + * + * @author Jeremy Kendall + * @author Ignace Nyamagana Butera + */ +final class Domain { + const ICANN_DOMAIN = 'ICANN_DOMAIN'; + const PRIVATE_DOMAIN = 'PRIVATE_DOMAIN'; + const UNKNOWN_DOMAIN = 'UNKNOWN_DOMAIN'; + + /** + * @var string|null + */ + private $domain; + + /** + * @var string|null + */ + private $publicSuffix; + + /** + * @var string|null + */ + private $registrableDomain; + /** + * @var string|null + */ + private $subDomain; + + /** + * @var string + */ + private $type = self::UNKNOWN_DOMAIN; + + /** + * New instance. + * + * @param string|null $domain + * @param string|null $publicSuffix + * @param string $type + */ + public function __construct( + $domain = null, + $publicSuffix = null, + string $type = self::UNKNOWN_DOMAIN + ) { + $this->domain = $domain; + $this->setPublicSuffix($publicSuffix); + $this->setType($type); + $this->setRegistrableDomain(); + $this->setSubDomain(); + } + + /** + * Compute the public suffix part + * + * @param string|null $publicSuffix + */ + private function setPublicSuffix($publicSuffix) + { + if (null === $this->domain) { + return; + } + + $this->publicSuffix = $publicSuffix; + } + + /** + * Compute the domain validity + * + * @param string $type + */ + private function setType(string $type) + { + if (null === $this->publicSuffix) { + return; + } + + if (!in_array($type, [self::PRIVATE_DOMAIN, self::ICANN_DOMAIN], true)) { + $type = self::UNKNOWN_DOMAIN; + } + + $this->type = $type; + } + + /** + * Compute the registrable domain part + */ + private function setRegistrableDomain() + { + if (!$this->hasRegistrableDomain()) { + return; + } + + $countLabelsToRemove = count(explode('.', $this->publicSuffix)) + 1; + $domainLabels = explode('.', $this->domain); + $domain = implode('.', array_slice($domainLabels, count($domainLabels) - $countLabelsToRemove)); + $this->registrableDomain = $this->normalize($domain); + } + + /** + * Tells whether the domain has a registrable domain part. + * + * @return bool + */ + private function hasRegistrableDomain(): bool + { + return null !== $this->publicSuffix + && strpos($this->domain, '.') > 0 + && $this->publicSuffix !== $this->domain; + } + + /** + * Normalize the domain according to its representation. + * + * @param string $domain + * * @return string|null */ - public function getDomain(); + private function normalize(string $domain) + { + $func = 'idn_to_utf8'; + if (strpos($domain, 'xn--') !== false) { + $func = 'idn_to_ascii'; + } + + $domain = $func($domain, 0, INTL_IDNA_VARIANT_UTS46); + if (false === $domain) { + return null; + } + + return strtolower($domain); + } + + /** + * Compute the sub domain part + */ + private function setSubDomain() + { + if (!$this->hasRegistrableDomain()) { + return; + } + + $domainLabels = explode('.', $this->domain); + $countLabels = count($domainLabels); + $countLabelsToRemove = count(explode('.', $this->publicSuffix)) + 1; + if ($countLabels === $countLabelsToRemove) { + return; + } + + $domain = implode('.', array_slice($domainLabels, 0, $countLabels - $countLabelsToRemove)); + $this->subDomain = $this->normalize($domain); + } /** * @return string|null */ - public function getPublicSuffix(); + public function getDomain() + { + return $this->domain; + } /** - * Get registrable domain. + * @return string|null + */ + public function getPublicSuffix() + { + return $this->publicSuffix; + } + + /** + * Does the domain have a matching rule in the Public Suffix List? * - * Algorithm #7: The registered or registrable domain is the public suffix - * plus one additional label. + * WARNING: "Some people use the PSL to determine what is a valid domain name + * and what isn't. This is dangerous, particularly in these days where new + * gTLDs are arriving at a rapid pace, if your software does not regularly + * receive PSL updates, because it will erroneously think new gTLDs are not + * valid. The DNS is the proper source for this innormalizeion. If you must use + * it for this purpose, please do not bake static copies of the PSL into your + * software with no update mechanism." * - * This method should return null if the domain provided is a public suffix, - * per the test cases provided by Mozilla. + * @see https://publicsuffix.org/learn/ * - * @see https://publicsuffix.org/list/ - * @see https://raw.githubusercontent.com/publicsuffix/list/master/tests/test_psl.txt + * @return bool + */ + public function isValid(): bool + { + return $this->type !== self::UNKNOWN_DOMAIN; + } + + /** + * Does the domain have a matching rule in the Public Suffix List ICANN section * - * @return string|null registrable domain + * WARNING: "Some people use the PSL to determine what is a valid domain name + * and what isn't. This is dangerous, particularly in these days where new + * gTLDs are arriving at a rapid pace, if your software does not regularly + * receive PSL updates, because it will erroneously think new gTLDs are not + * valid. The DNS is the proper source for this innormalizeion. If you must use + * it for this purpose, please do not bake static copies of the PSL into your + * software with no update mechanism." + * + * @see https://publicsuffix.org/learn/ + * + * @return bool */ - public function getRegistrableDomain(); + public function isICANN(): bool + { + return $this->type === self::ICANN_DOMAIN; + } /** - * Does the domain have a matching rule in the Public Suffix List? + * Does the domain have a matching rule in the Public Suffix List Private section * * WARNING: "Some people use the PSL to determine what is a valid domain name * and what isn't. This is dangerous, particularly in these days where new * gTLDs are arriving at a rapid pace, if your software does not regularly * receive PSL updates, because it will erroneously think new gTLDs are not - * valid. The DNS is the proper source for this information. If you must use + * valid. The DNS is the proper source for this innormalizeion. If you must use * it for this purpose, please do not bake static copies of the PSL into your * software with no update mechanism." * @@ -54,5 +242,42 @@ public function getRegistrableDomain(); * * @return bool */ - public function isValid(): bool; + public function isPrivate(): bool + { + return $this->type === self::PRIVATE_DOMAIN; + } + + /** + * Get registrable domain. + * + * Algorithm #7: The registered or registrable domain is the public suffix + * plus one additional label. + * + * This method should return null if the domain provided is a public suffix, + * per the test cases provided by Mozilla. + * + * @see https://publicsuffix.org/list/ + * @see https://raw.githubusercontent.com/publicsuffix/list/master/tests/test_psl.txt + * + * @return string|null registrable domain + */ + public function getRegistrableDomain() + { + return $this->registrableDomain; + } + + /** + * Get the sub domain. + * + * This method should return null if + * + * - the registrable domain is null + * - the registrable domain is the same as the public suffix + * + * @return string|null registrable domain + */ + public function getSubDomain() + { + return $this->subDomain; + } } diff --git a/src/Exception.php b/src/Exception.php new file mode 100644 index 00000000..56dd5246 --- /dev/null +++ b/src/Exception.php @@ -0,0 +1,18 @@ + - * @author Jeremy Kendall - */ -interface HttpAdapter -{ - /** - * Returns the content fetched from a given URL. - * - * @param string $url - * - * @return string Retrieved content - */ - public function getContent(string $url); -} diff --git a/src/HttpClient.php b/src/HttpClient.php new file mode 100644 index 00000000..ea6501e1 --- /dev/null +++ b/src/HttpClient.php @@ -0,0 +1,41 @@ + + * @license https://github.com/thephpleague/uri-hostname-parser/blob/master/LICENSE (MIT License) + * @version 1.0.4 + * @link https://github.com/thephpleague/uri-hostname-parser + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Pdp; + +/** + * Interface for http adapters. + * + * Lifted pretty much completely from William Durand's excellent Geocoder + * project + * + * @see https://github.com/willdurand/Geocoder Geocoder on GitHub + * + * @author William Durand + * @author Jeremy Kendall + */ +interface HttpClient +{ + /** + * Returns the content fetched from a given URL. + * + * @param string $url + * + * @throws HttpClientException If an errors occurs while fetching the content from a given URL + * + * @return string Retrieved content + */ + public function getContent(string $url): string; +} diff --git a/src/HttpClientException.php b/src/HttpClientException.php new file mode 100644 index 00000000..829611d7 --- /dev/null +++ b/src/HttpClientException.php @@ -0,0 +1,18 @@ +writeError([ + 'You must set up the project dependencies using composer', + 'see https://getcomposer.org', + ]); + die(1); + } + + require $vendor.'/autoload.php'; + + $io->write('Updating your Public Suffix List ICANN Section local cache.'); + if (!extension_loaded('curl')) { + $io->writeError([ + '😓 😓 😓 Your local cache could not be updated. 😓 😓 😓', + 'The PHP cURL extension is missing.', + ]); + die(1); + } + + try { + $manager = new Manager(new Cache(), new CurlHttpClient()); + if ($manager->refreshRules()) { + $io->write([ + '💪 💪 💪 Your local cache has been successfully updated. 💪 💪 💪', + 'Have a nice day!', + ]); + die(0); + } + $io->writeError([ + '😓 😓 😓 Your local cache could not be updated. 😓 😓 😓', + 'Please verify you can write in your local cache directory.', + ]); + die(1); + } catch (Throwable $e) { + $io->writeError([ + '😓 😓 😓 Your local cache could not be updated. 😓 😓 😓', + 'An error occurred during the update.', + '----- Error Trace ----', + ]); + $io->writeError($e->getMessage()); + die(1); + } + } + + /** + * Detect the vendor path + * + * @param Event $event + * + * @return string|null + */ + private static function getVendorPath(Event $event = null) + { + if ($event instanceof Event) { + return $event->getComposer()->getConfig()->get('vendor-dir'); + } + + if (is_dir($vendor = dirname(__DIR__, 2).'/vendor')) { + return $vendor; + } + + if (is_dir($vendor = dirname(__DIR__, 5).'/vendor')) { + return $vendor; + } + + return null; + } + + /** + * Detect the I/O interface to use + * + * @param Event|null $event + * + * @return object + */ + private static function getIO(Event $event = null) + { + if ($event instanceof Event) { + return $event->getIO(); + } + + return new class() { + public function write($messages, bool $newline = true, int $verbosity = 2) + { + $this->doWrite($messages, $newline, false, $verbosity); + } + + public function writeError($messages, bool $newline = true, int $verbosity = 2) + { + $this->doWrite($messages, $newline, true, $verbosity); + } + + private function doWrite($messages, bool $newline, bool $stderr, int $verbosity) + { + fwrite( + $stderr ? STDERR : STDOUT, + implode($newline ? PHP_EOL : '', (array) $messages).PHP_EOL + ); + } + }; + } +} diff --git a/src/LabelsTrait.php b/src/LabelsTrait.php deleted file mode 100644 index f2c2731d..00000000 --- a/src/LabelsTrait.php +++ /dev/null @@ -1,76 +0,0 @@ -getLabels($input)); - } - - /** - * Tells whether the domain contains multiple labels. - * - * @param string $domain - * - * @return bool - */ - private function hasLabels(string $domain): bool - { - return strpos($domain, '.') !== false; - } - - /** - * Tells whether the domain contains one single label. - * - * @param string $domain - * - * @return bool - */ - private function isSingleLabelDomain(string $domain): bool - { - return !$this->hasLabels($domain); - } - - /** - * Returns the additional label to generate the registrable domain. - * - * @param string[] $domainLabels - * @param string[] $publicSuffixLabels - * - * @return string[] - */ - private function getAdditionalLabel($domainLabels, $publicSuffixLabels): array - { - return array_slice($domainLabels, count($domainLabels) - count($publicSuffixLabels) - 1, 1); - } -} diff --git a/src/Manager.php b/src/Manager.php new file mode 100644 index 00000000..61bb1aea --- /dev/null +++ b/src/Manager.php @@ -0,0 +1,205 @@ +cache = $cache; + $this->http = $http; + } + + /** + * Gets ICANN Public Suffix List Rules. + * + * @param string $source_url the Public Suffix List URL + * + * @return Rules + */ + public function getRules(string $source_url = self::PSL_URL): Rules + { + $cacheKey = $this->getCacheKey($source_url); + $rules = $this->cache->get($cacheKey); + if (null !== $rules) { + return new Rules(json_decode($rules, true)); + } + + if (!$this->refreshRules($source_url)) { + throw new Exception(sprintf('Unable to load the public suffix list rules for %s', $source_url)); + } + + $rules = $this->cache->get($cacheKey); + + + return new Rules(json_decode($rules, true)); + } + + /** + * Returns the cache key according to the source URL. + * + * @param string $str + * + * @return string + */ + private function getCacheKey(string $str): string + { + static $cacheKeyPrefix = 'PSL-FULL'; + + return $cacheKeyPrefix.'-'.md5(strtolower($str)); + } + + /** + * Downloads Public Suffix List and writes text cache and PHP cache. If these files + * already exist, they will be overwritten. + * + * Returns true if all list are correctly refreshed + * + * @param string $source_url the Public Suffix List URL + * + * @return bool + */ + public function refreshRules(string $source_url = self::PSL_URL): bool + { + $content = $this->http->getContent($source_url); + $rules = $this->parse($content); + if (empty($rules[Domain::ICANN_DOMAIN]) || empty($rules[Domain::PRIVATE_DOMAIN])) { + return false; + } + + return $this->cache->set($this->getCacheKey($source_url), json_encode($rules)); + } + + /** + * Parses text representation of list to associative, multidimensional array. + * + * @param string $content the Public SUffix List as a SplFileObject + * + * @return array Associative, multidimensional array representation of the + * public suffx list + */ + private function parse(string $content): array + { + $section = Domain::UNKNOWN_DOMAIN; + $rules = [Domain::ICANN_DOMAIN => [], Domain::PRIVATE_DOMAIN => []]; + $file = new SplTempFileObject(); + $file->fwrite($content); + $file->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); + foreach ($file as $line) { + $section = $this->getPslSection($section, $line); + if ($section !== Domain::UNKNOWN_DOMAIN && strpos($line, '//') === false) { + $rules[$section] = $this->addRule($rules[$section], explode('.', $line)); + } + } + + return $rules; + } + + /** + * Tell whether the line can be converted for a given domain. + * + * @param bool $section the previous status + * @param string $line the current file line + * + * @return string + */ + private function getPslSection(string $section, string $line): string + { + if ($section == Domain::UNKNOWN_DOMAIN && strpos($line, '// ===BEGIN ICANN DOMAINS===') === 0) { + return Domain::ICANN_DOMAIN; + } + + if ($section == Domain::ICANN_DOMAIN && strpos($line, '// ===END ICANN DOMAINS===') === 0) { + return Domain::UNKNOWN_DOMAIN; + } + + if ($section == Domain::UNKNOWN_DOMAIN && strpos($line, '// ===BEGIN PRIVATE DOMAINS===') === 0) { + return Domain::PRIVATE_DOMAIN; + } + + if ($section == Domain::PRIVATE_DOMAIN && strpos($line, '// ===END PRIVATE DOMAINS===') === 0) { + return Domain::UNKNOWN_DOMAIN; + } + + return $section; + } + + /** + * Recursive method to build the array representation of the Public Suffix List. + * + * This method is based heavily on the code found in generateEffectiveTLDs.php + * + * @see https://github.com/usrflo/registered-domain-libs/blob/master/generateEffectiveTLDs.php + * A copy of the Apache License, Version 2.0, is provided with this + * distribution + * + * @param array $list Initially an empty array, this eventually + * becomes the array representation of the Public Suffix List + * @param array $rule_parts One line (rule) from the Public Suffix List + * exploded on '.', or the remaining portion of that array during recursion + * + * @return array + */ + private function addRule(array $list, array $rule_parts): array + { + $part = array_pop($rule_parts); + + // Adheres to canonicalization rule from the "Formal Algorithm" section + // of https://publicsuffix.org/list/ + // "The domain and all rules must be canonicalized in the normal way + // for hostnames - lower-case, Punycode (RFC 3492)." + + $part = idn_to_ascii($part, 0, INTL_IDNA_VARIANT_UTS46); + $isDomain = true; + if (strpos($part, '!') === 0) { + $part = substr($part, 1); + $isDomain = false; + } + + if (!isset($list[$part])) { + $list[$part] = $isDomain ? [] : ['!' => '']; + } + + if ($isDomain && !empty($rule_parts)) { + $list[$part] = $this->addRule($list[$part], $rule_parts); + } + + return $list; + } +} diff --git a/src/MatchedDomain.php b/src/MatchedDomain.php deleted file mode 100644 index fb661248..00000000 --- a/src/MatchedDomain.php +++ /dev/null @@ -1,93 +0,0 @@ -domain = $domain; - $this->publicSuffix = $publicSuffix; - } - - /** - * {@inheritdoc} - */ - public function getDomain() - { - return $this->domain; - } - - /** - * {@inheritdoc} - */ - public function getPublicSuffix() - { - return $this->publicSuffix; - } - - /** - * {@inheritdoc} - */ - public function isValid(): bool - { - return true; - } - - /** - * {@inheritdoc} - */ - public function getRegistrableDomain() - { - if (!$this->hasRegistrableDomain()) { - return null; - } - - $publicSuffixLabels = $this->getLabels($this->publicSuffix); - $domainLabels = $this->getLabels($this->domain); - $additionalLabel = $this->getAdditionalLabel($domainLabels, $publicSuffixLabels); - - return implode('.', array_merge($additionalLabel, $publicSuffixLabels)); - } - - /** - * Tells whether the domain has a registrable domain part. - * - * @return bool - */ - private function hasRegistrableDomain(): bool - { - if (!$this->hasLabels($this->domain)) { - return false; - } - - return $this->publicSuffix !== $this->domain; - } -} diff --git a/src/NullDomain.php b/src/NullDomain.php deleted file mode 100644 index 52ec66da..00000000 --- a/src/NullDomain.php +++ /dev/null @@ -1,47 +0,0 @@ - 1, - self::ICANN_DOMAINS => 1, - self::PRIVATE_DOMAINS => 1, - ]; - - if (!isset($type_lists[$type])) { - throw new OutOfRangeException(sprintf('Unknown PSL type %s', $type)); - } - $this->type = $type; - $this->rules = $rules; - } - - /** - * Tell whether the PSL resolves ICANN domains only. - * - * @return bool - */ - public function isICANN() - { - return $this->type === self::ICANN_DOMAINS; - } - - /** - * Tell whether the PSL resolves private domains only. - * - * @return bool - */ - public function isPrivate() - { - return $this->type === self::PRIVATE_DOMAINS; - } - - /** - * Tell whether the PSL resolves all domains. - * - * @return bool - */ - public function isAll() - { - return $this->type === self::ALL_DOMAINS; - } - - /** - * Returns PSL public info for a given domain. - * - * @param string|null $domain - * - * @return Domain - */ - public function query(string $domain = null): Domain - { - if (!$this->isMatchable($domain)) { - return new NullDomain(); - } - - $normalizedDomain = $this->normalize($domain); - $publicSuffix = $this->findPublicSuffix($this->getLabelsReverse($normalizedDomain)); - if ($publicSuffix === null) { - return $this->handleNoMatches($domain); - } - - return $this->handleMatches($domain, $publicSuffix); - } - - /** - * Tells whether the given domain is valid. - * - * @param string|null $domain - * - * @return bool - */ - private function isMatchable($domain): bool - { - if ($domain === null) { - return false; - } - - if ($this->hasLeadingDot($domain)) { - return false; - } - - if ($this->isSingleLabelDomain($domain)) { - return false; - } - - if ($this->isIpAddress($domain)) { - return false; - } - - return true; - } - - /** - * Tells whether the domain starts with a dot character. - * - * @param string $domain - * - * @return bool - */ - private function hasLeadingDot($domain): bool - { - return strpos($domain, '.') === 0; - } - - /** - * Tells whether the submitted domain is an IP address. - * - * @param string $domain - * - * @return bool - */ - private function isIpAddress(string $domain): bool - { - return filter_var($domain, FILTER_VALIDATE_IP) !== false; - } - - /** - * Normalize domain. - * - * "The domain must be canonicalized in the normal way for hostnames - lower-case, Punycode." - * - * @see http://www.ietf.org/rfc/rfc3492.txt - * - * @param string $domain - * - * @return string - */ - private function normalize(string $domain): string - { - return strtolower(idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46)); - } - - /** - * Returns the matched public suffix or null - * if none found. - * - * @param array $labels - * - * @return string|null - */ - private function findPublicSuffix(array $labels) - { - $matches = []; - $rules = $this->rules; - foreach ($labels as $label) { - if ($this->isExceptionRule($label, $rules)) { - break; - } - - if ($this->isWildcardRule($rules)) { - array_unshift($matches, $label); - break; - } - - if (!$this->matchExists($label, $rules)) { - // Avoids improper parsing when $domain's subdomain + public suffix === - // a valid public suffix (e.g. domain 'us.example.com' and public suffix 'us.com') - // - // Added by @goodhabit in https://github.com/jeremykendall/php-domain-parser/pull/15 - // Resolves https://github.com/jeremykendall/php-domain-parser/issues/16 - break; - } - - array_unshift($matches, $label); - $rules = $rules[$label]; - } - - return empty($matches) ? null : implode('.', array_filter($matches, 'strlen')); - } - - /** - * Tells whether a PSL exception rule is found. - * - * @param string $label - * @param array $rules - * - * @return bool - */ - private function isExceptionRule(string $label, array $rules): bool - { - return isset($rules[$label], $rules[$label]['!']); - } - - /** - * Tells whether a PSL wildcard rule is found. - * - * @param array $rules - * - * @return bool - */ - private function isWildcardRule(array $rules): bool - { - return isset($rules['*']); - } - - /** - * Tells whether a PSL label matches the given domain label. - * - * @param string $label - * @param array $rules - * - * @return bool - */ - private function matchExists(string $label, array $rules): bool - { - return isset($rules[$label]); - } - - /** - * Returns the MatchedDomain value object. - * - * @param string $domain - * @param string $publicSuffix - * - * @return MatchedDomain - */ - private function handleMatches(string $domain, string $publicSuffix): MatchedDomain - { - if (!$this->isPunycoded($domain)) { - $publicSuffix = idn_to_utf8($publicSuffix, 0, INTL_IDNA_VARIANT_UTS46); - } - - return new MatchedDomain($domain, $publicSuffix); - } - - /** - * Tells whether the domain is punycoded. - * - * @param string $domain - * - * @return bool - */ - private function isPunycoded(string $domain): bool - { - return strpos($domain, 'xn--') !== false; - } - - /** - * Returns the UnmatchedDomain value object. - * - * @param string $domain - * - * @return UnmatchedDomain - */ - private function handleNoMatches(string $domain): UnmatchedDomain - { - $labels = $this->getLabels($domain); - $publicSuffix = array_pop($labels); - if (!$this->isPunycoded($domain) && $publicSuffix !== null) { - $publicSuffix = idn_to_utf8($publicSuffix, 0, INTL_IDNA_VARIANT_UTS46); - } - - return new UnmatchedDomain($domain, $publicSuffix); - } -} diff --git a/src/PublicSuffixListManager.php b/src/PublicSuffixListManager.php deleted file mode 100644 index 5dba993e..00000000 --- a/src/PublicSuffixListManager.php +++ /dev/null @@ -1,229 +0,0 @@ -cacheAdapter = $cacheAdapter; - $this->httpAdapter = $httpAdapter; - } - - /** - * Gets Public Suffix List. - * - * @param string $type the Public Suffix List type - * - * @return PublicSuffixList - */ - public function getList(string $type = PublicSuffixList::ALL_DOMAINS, string $sourceUrl = self::PSL_URL): PublicSuffixList - { - static $availableTypes = [ - PublicSuffixList::ALL_DOMAINS => PublicSuffixList::ALL_DOMAINS, - PublicSuffixList::ICANN_DOMAINS => PublicSuffixList::ICANN_DOMAINS, - PublicSuffixList::PRIVATE_DOMAINS => PublicSuffixList::PRIVATE_DOMAINS, - ]; - - $type = $availableTypes[$type] ?? PublicSuffixList::ALL_DOMAINS; - $list = $this->cacheAdapter->get($type); - if ($list === null) { - $this->refreshPublicSuffixList($sourceUrl); - $list = $this->cacheAdapter->get($type); - } - - return new PublicSuffixList($type, json_decode($list, true)); - } - - /** - * Downloads Public Suffix List and writes text cache and PHP cache. If these files - * already exist, they will be overwritten. - * - * Returns true if all list are correctly refreshed - * - * @return bool - */ - public function refreshPublicSuffixList(string $sourceUrl = self::PSL_URL): bool - { - $content = $this->httpAdapter->getContent($sourceUrl); - $list = $this->parse($content); - - return $this->cacheAdapter->setMultiple(array_map('json_encode', $list)); - } - - /** - * Parses text representation of list to associative, multidimensional array. - * - * @param string $content the Public SUffix List as a SplFileObject - * - * @return array Associative, multidimensional array representation of the - * public suffx list - */ - private function parse(string $content): array - { - $sectionList = [ - PublicSuffixList::ALL_DOMAINS => true, - PublicSuffixList::ICANN_DOMAINS => false, - PublicSuffixList::PRIVATE_DOMAINS => false, - ]; - - $lists = [ - PublicSuffixList::ALL_DOMAINS => [], - PublicSuffixList::ICANN_DOMAINS => [], - PublicSuffixList::PRIVATE_DOMAINS => [], - ]; - - $fileObj = new SplTempFileObject(); - $fileObj->fwrite($content); - $fileObj->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); - foreach ($fileObj as $line) { - $sectionList = $this->validateAddingSection($line, $sectionList); - if (strpos($line, '//') === false) { - $lists = $this->convertLine($line, $lists, $sectionList); - } - } - - return $lists; - } - - /** - * Update the addition status for a given line against the domain list (ICANN and PRIVATE). - * - * @param string $line the current file line - * @param array $sectionList the domain addition status - * - * @return array - */ - private function validateAddingSection(string $line, array $sectionList): array - { - foreach ($sectionList as $section => $status) { - $sectionList[$section] = $this->isValidSection($status, $line, $section); - } - - return $sectionList; - } - - /** - * Tell whether the line can be converted for a given domain. - * - * @param bool $previousStatus the previous status - * @param string $line the current file line - * @param string $section the section to be considered - * - * @return bool - */ - private function isValidSection(bool $previousStatus, string $line, string $section): bool - { - if (!$previousStatus && strpos($line, '// ===BEGIN ' . $section . ' DOMAINS===') === 0) { - return true; - } - - if ($previousStatus && strpos($line, '// ===END ' . $section . ' DOMAINS===') === 0) { - return false; - } - - return $previousStatus; - } - - /** - * Convert a line from the Public Suffix list. - * - * @param string $rule Public Suffix List text line - * @param array $lists Associative, multidimensional array representation of the - * public suffx list - * @param array $validTypes Tell which section should be converted - * - * @return array Associative, multidimensional array representation of the - * public suffx list - */ - private function convertLine(string $line, array $lists, array $validTypes): array - { - $ruleParts = explode('.', $line); - $validTypes = array_keys(array_filter($validTypes)); - foreach ($validTypes as $type) { - $lists[$type] = $this->addRule($lists[$type], $ruleParts); - } - - return $lists; - } - - /** - * Recursive method to build the array representation of the Public Suffix List. - * - * This method is based heavily on the code found in generateEffectiveTLDs.php - * - * @see https://github.com/usrflo/registered-domain-libs/blob/master/generateEffectiveTLDs.php - * A copy of the Apache License, Version 2.0, is provided with this - * distribution - * - * @param array $list Initially an empty array, this eventually - * becomes the array representation of the Public Suffix List - * @param array $ruleParts One line (rule) from the Public Suffix List - * exploded on '.', or the remaining portion of that array during recursion - * - * @return array - */ - private function addRule(array $list, array $ruleParts): array - { - $part = array_pop($ruleParts); - - // Adheres to canonicalization rule from the "Formal Algorithm" section - // of https://publicsuffix.org/list/ - // "The domain and all rules must be canonicalized in the normal way - // for hostnames - lower-case, Punycode (RFC 3492)." - - $part = idn_to_ascii($part, 0, INTL_IDNA_VARIANT_UTS46); - $isDomain = true; - if (strpos($part, '!') === 0) { - $part = substr($part, 1); - $isDomain = false; - } - - if (!isset($list[$part])) { - $list[$part] = $isDomain ? [] : ['!' => '']; - } - - if ($isDomain && !empty($ruleParts)) { - $list[$part] = $this->addRule($list[$part], $ruleParts); - } - - return $list; - } -} diff --git a/src/Rules.php b/src/Rules.php new file mode 100644 index 00000000..eac19859 --- /dev/null +++ b/src/Rules.php @@ -0,0 +1,226 @@ +rules = $rules; + } + + /** + * Returns PSL ICANN public info for a given domain. + * + * @param string|null $domain + * @param string $type + * + * @return Domain + */ + public function resolve(string $domain = null, string $type = Domain::UNKNOWN_DOMAIN): Domain + { + if (!$this->isMatchable($domain)) { + return new Domain(); + } + + $normalizedDomain = $this->normalize($domain); + $reverseLabels = array_reverse(explode('.', $normalizedDomain)); + list($publicSuffix, $type) = $this->findPublicSuffix($type, $reverseLabels); + if (null === $publicSuffix) { + return $this->handleNoMatches($domain); + } + + return $this->handleMatches($domain, $publicSuffix, $type); + } + + /** + * Tells whether the given domain is valid. + * + * @param string|null $domain + * + * @return bool + */ + private function isMatchable($domain): bool + { + return $domain !== null + && strpos($domain, '.') > 0 + && strlen($domain) === strcspn($domain, '][') + && !filter_var($domain, FILTER_VALIDATE_IP); + } + + /** + * Normalize domain. + * + * "The domain must be canonicalized in the normal way for hostnames - lower-case, Punycode." + * + * @see http://www.ietf.org/rfc/rfc3492.txt + * + * @param string $domain + * + * @return string + */ + private function normalize(string $domain): string + { + if (false !== strpos($domain, '%')) { + $domain = rawurldecode($domain); + } + + $normalize = idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46); + if (false === $normalize) { + return ''; + } + + return strtolower($normalize); + } + + /** + * Returns the matched public suffix and its type + * + * @param string $type + * @param array $labels + * + * @return array + */ + private function findPublicSuffix(string $type, array $labels): array + { + if (in_array($type, [Domain::PRIVATE_DOMAIN, Domain::ICANN_DOMAIN], true)) { + return $this->findPublicSuffixFromSection($type, $labels); + } + + $resultPrivate = $this->findPublicSuffixFromSection(Domain::PRIVATE_DOMAIN, $labels); + $resultIcann = $this->findPublicSuffixFromSection(Domain::ICANN_DOMAIN, $labels); + + $privateSuffix = $resultPrivate[0]; + $icannSuffix = $resultIcann[0]; + + if (isset($icannSuffix, $privateSuffix)) { + return strlen($privateSuffix) > strlen($icannSuffix) ? $resultPrivate : $resultIcann; + } + + if (null === $privateSuffix && null === $icannSuffix) { + return [null, Domain::UNKNOWN_DOMAIN]; + } + + return null === $privateSuffix ? $resultIcann : $resultPrivate; + } + + /** + * Returns the matched public suffix using a given section type + * + * @param string $type + * @param array $labels + * + * @return array + */ + private function findPublicSuffixFromSection(string $type, array $labels): array + { + $rules = $this->rules[$type]; + $matches = []; + foreach ($labels as $label) { + //match exception rule + if (isset($rules[$label], $rules[$label]['!'])) { + break; + } + + //match wildcard rule + if (isset($rules['*'])) { + array_unshift($matches, $label); + break; + } + + //no match found + if (!isset($rules[$label])) { + // Avoids improper parsing when $domain's subdomain + public suffix === + // a valid public suffix (e.g. domain 'us.example.com' and public suffix 'us.com') + // + // Added by @goodhabit in https://github.com/jeremykendall/php-domain-parser/pull/15 + // Resolves https://github.com/jeremykendall/php-domain-parser/issues/16 + break; + } + + array_unshift($matches, $label); + $rules = $rules[$label]; + } + + $found = array_filter($matches, 'strlen'); + if (count($found) == 1 && $type === Domain::PRIVATE_DOMAIN) { + return [null, $type = Domain::UNKNOWN_DOMAIN]; + } + + $publicSuffix = empty($matches) ? null : implode('.', $found); + + return [$publicSuffix, $type]; + } + + + /** + * Returns the Domain value object. + * + * @param string $domain + * @param string $publicSuffix + * @param string $type + * + * @return Domain + */ + private function handleMatches(string $domain, string $publicSuffix, string $type): Domain + { + if (!$this->isPunycoded($domain)) { + $publicSuffix = idn_to_utf8($publicSuffix, 0, INTL_IDNA_VARIANT_UTS46); + } + + return new Domain($domain, $publicSuffix, $type); + } + + /** + * Tells whether the domain is punycoded. + * + * @param string $domain + * + * @return bool + */ + private function isPunycoded(string $domain): bool + { + return strpos($domain, 'xn--') !== false; + } + + /** + * Returns the Domain value object. + * + * @param string $domain + * + * @return Domain + */ + private function handleNoMatches(string $domain): Domain + { + $labels = explode('.', $domain); + $publicSuffix = array_pop($labels); + + if (!$this->isPunycoded($domain)) { + $publicSuffix = idn_to_utf8($publicSuffix, 0, INTL_IDNA_VARIANT_UTS46); + if (false === $publicSuffix) { + $publicSuffix = null; + } + } + + return new Domain($domain, $publicSuffix); + } +} diff --git a/src/UnmatchedDomain.php b/src/UnmatchedDomain.php deleted file mode 100644 index df803191..00000000 --- a/src/UnmatchedDomain.php +++ /dev/null @@ -1,93 +0,0 @@ -domain = $domain; - $this->publicSuffix = $publicSuffix; - } - - /** - * {@inheritdoc} - */ - public function getDomain() - { - return $this->domain; - } - - /** - * {@inheritdoc} - */ - public function getPublicSuffix() - { - return $this->publicSuffix; - } - - /** - * {@inheritdoc} - */ - public function isValid(): bool - { - return false; - } - - /** - * {@inheritdoc} - */ - public function getRegistrableDomain() - { - if (!$this->hasRegistrableDomain()) { - return null; - } - - $publicSuffixLabels = $this->getLabels($this->publicSuffix); - $domainLabels = $this->getLabels($this->domain); - $additionalLabel = $this->getAdditionalLabel($domainLabels, $publicSuffixLabels); - - return implode('.', array_merge($additionalLabel, $publicSuffixLabels)); - } - - /** - * Tells whether the domain has a registrable domain part. - * - * @return bool - */ - private function hasRegistrableDomain(): bool - { - if (!$this->hasLabels($this->domain)) { - return false; - } - - return $this->publicSuffix !== $this->domain; - } -} diff --git a/tests/CacheTest.php b/tests/CacheTest.php new file mode 100644 index 00000000..b801cd1d --- /dev/null +++ b/tests/CacheTest.php @@ -0,0 +1,474 @@ +root = vfsStream::setup('pdp'); + vfsStream::create(['cache' => []], $this->root); + $this->cacheDir = vfsStream::url('pdp/cache'); + $this->cache = new Cache($this->cacheDir); + } + + public function tearDown() + { + $this->cache = null; + $this->cacheDir = null; + $this->root = null; + } + + /** + * @dataProvider storableValuesProvider + * + * @param mixed $expected + * @param string $key + */ + public function testSetGet($expected) + { + $this->cache->set('foo', $expected); + $this->assertEquals($expected, $this->cache->get('foo')); + } + + public function storableValuesProvider() + { + return [ + 'string' => ['bar'], + 'boolean' => [false], + 'array' => [['foo', 'bar']], + 'class' => [date_create()], + 'null' => [null], + 'float' => [1.1], + ]; + } + + /** + * @depends testSetGet + */ + public function testDelete() + { + $this->cache->set('foo', 'bar'); + $this->assertEquals('bar', $this->cache->get('foo')); + $this->cache->delete('foo'); + $this->assertNull($this->cache->get('foo')); + } + + public function testGetInvalidArg() + { + $this->expectException(InvalidArgumentException::class); + $this->cache->get(null); + } + + public function testInvalidKey() + { + $this->expectException(InvalidArgumentException::class); + $this->cache->get('foo:bar', 'bar'); + } + + public function testSetInvalidTTL() + { + $this->expectException(InvalidArgumentException::class); + $this->cache->set('foo', 'bar', date_create()); + } + + /** + * @depends testDelete + */ + public function testGetNotFound() + { + $this->assertNull($this->cache->get('notfound')); + } + + /** + * @depends testDelete + */ + public function testGetNotFoundDefault() + { + $default = 'chickpeas'; + $this->assertEquals( + $default, + $this->cache->get('notfound', $default) + ); + } + + /** + * @depends testSetGet + * @slow + */ + public function testSetExpire() + { + $this->cache->set('foo', 'bar', 1); + $this->assertEquals('bar', $this->cache->get('foo')); + + // Wait 2 seconds so the cache expires + usleep(2000000); + $this->assertNull($this->cache->get('foo')); + } + + /** + * @depends testSetGet + * @slow + */ + public function testSetExpireDateInterval() + { + $this->cache->set('foo', 'bar', new DateInterval('PT1S')); + $this->assertEquals('bar', $this->cache->get('foo')); + + // Wait 2 seconds so the cache expires + usleep(2000000); + $this->assertNull($this->cache->get('foo')); + } + + public function testSetInvalidArg() + { + $this->expectException(InvalidArgumentException::class); + $this->cache->set(null, 'bar'); + } + + public function testDeleteInvalidArg() + { + $this->expectException(InvalidArgumentException::class); + $this->cache->delete(null); + } + + /** + * @depends testSetGet + */ + public function testClearCache() + { + $this->cache->set('foo', 'bar'); + $this->cache->clear(); + $this->assertNull($this->cache->get('foo')); + } + + /** + * @depends testSetGet + */ + public function testHas() + { + $this->cache->set('foo', 'bar'); + $this->assertTrue($this->cache->has('foo')); + } + + /** + * @depends testHas + */ + public function testHasNot() + { + $this->assertFalse($this->cache->has('not-found')); + } + + public function testHasInvalidArg() + { + $this->expectException(InvalidArgumentException::class); + $this->cache->has(null); + } + + /** + * @depends testSetGet + */ + public function testSetGetMultiple() + { + $values = [ + 'key1' => 'value1', + 'key2' => 'value2', + 'key3' => 'value3', + ]; + + $this->cache->setMultiple($values); + $result = $this->cache->getMultiple(array_keys($values)); + foreach ($result as $key => $value) { + $this->assertTrue(isset($values[$key])); + $this->assertEquals($values[$key], $value); + unset($values[$key]); + } + + // The list of values should now be empty + $this->assertEquals([], $values); + } + + /** + * @depends testSetGet + */ + public function testSetGetMultipleGenerator() + { + $values = [ + 'key1' => 'value1', + 'key2' => 'value2', + 'key3' => 'value3', + ]; + + $gen = function () use ($values) { + foreach ($values as $key => $value) { + yield $key => $value; + } + }; + + $this->cache->setMultiple($gen()); + + $result = $this->cache->getMultiple(array_keys($values)); + foreach ($result as $key => $value) { + $this->assertTrue(isset($values[$key])); + $this->assertEquals($values[$key], $value); + unset($values[$key]); + } + + // The list of values should now be empty + $this->assertEquals([], $values); + } + + /** + * @depends testSetGet + */ + public function testSetGetMultipleGenerator2() + { + $values = [ + 'key1' => 'value1', + 'key2' => 'value2', + 'key3' => 'value3', + ]; + + $gen = function () use ($values) { + foreach ($values as $key => $value) { + yield $key; + } + }; + + $this->cache->setMultiple($values); + $result = $this->cache->getMultiple($gen()); + foreach ($result as $key => $value) { + $this->assertTrue(isset($values[$key])); + $this->assertEquals($values[$key], $value); + unset($values[$key]); + } + + // The list of values should now be empty + $this->assertEquals([], $values); + } + + /** + * @depends testSetGetMultiple + * @depends testSetExpire + * @slow + */ + public function testSetMultipleExpireDateIntervalNotExpired() + { + $values = [ + 'key1' => 'value1', + 'key2' => 'value2', + 'key3' => 'value3', + ]; + + $this->cache->setMultiple($values, new DateInterval('PT5S')); + $result = $this->cache->getMultiple(array_keys($values)); + $count = 0; + foreach ($result as $key => $value) { + ++$count; + $this->assertTrue(isset($values[$key])); + $this->assertEquals($values[$key], $value); + unset($values[$key]); + } + $this->assertEquals(3, $count); + // The list of values should now be empty + $this->assertEquals([], $values); + } + + /** + * @slow + */ + public function testSetMultipleExpireDateIntervalExpired() + { + $values = [ + 'key1' => 'value1', + 'key2' => 'value2', + 'key3' => 'value3', + ]; + + $this->cache->setMultiple($values, new \DateInterval('PT1S')); + + // Wait 2 seconds so the cache expires + sleep(2); + + $result = $this->cache->getMultiple(array_keys($values), 'not-found'); + $count = 0; + + $expected = [ + 'key1' => 'not-found', + 'key2' => 'not-found', + 'key3' => 'not-found', + ]; + + foreach ($result as $key => $value) { + ++$count; + $this->assertTrue(isset($expected[$key])); + $this->assertEquals($expected[$key], $value); + unset($expected[$key]); + } + $this->assertEquals(3, $count); + + // The list of values should now be empty + $this->assertEquals([], $expected); + } + + /** + * @slow + */ + public function testSetMultipleExpireDateIntervalInt() + { + $values = [ + 'key1' => 'value1', + 'key2' => 'value2', + 'key3' => 'value3', + ]; + + $this->cache->setMultiple($values, 1); + + // Wait 2 seconds so the cache expires + sleep(2); + + $result = $this->cache->getMultiple(array_keys($values), 'not-found'); + $count = 0; + + $expected = [ + 'key1' => 'not-found', + 'key2' => 'not-found', + 'key3' => 'not-found', + ]; + + foreach ($result as $key => $value) { + ++$count; + $this->assertTrue(isset($expected[$key])); + $this->assertEquals($expected[$key], $value); + unset($expected[$key]); + } + $this->assertEquals(3, $count); + + // The list of values should now be empty + $this->assertEquals([], $expected); + } + + public function testSetMultipleInvalidArg() + { + $this->expectException(InvalidArgumentException::class); + $this->cache->setMultiple(null); + } + + public function testGetMultipleInvalidArg() + { + $this->expectException(InvalidArgumentException::class); + $result = $this->cache->getMultiple(null); + // If $result was a generator, the generator will only error once the + // first value is requested. + // + // This extra line is just a precaution for that + if ($result instanceof Traversable) { + $result->current(); + } + } + + /** + * @depends testSetGetMultiple + */ + public function testDeleteMultipleDefaultGet() + { + $values = [ + 'key1' => 'value1', + 'key2' => 'value2', + 'key3' => 'value3', + ]; + + $this->cache->setMultiple($values); + + $this->cache->deleteMultiple(['key1', 'key3']); + + $result = $this->cache->getMultiple(array_keys($values), 'tea'); + + $expected = [ + 'key1' => 'tea', + 'key2' => 'value2', + 'key3' => 'tea', + ]; + + foreach ($result as $key => $value) { + $this->assertTrue(isset($expected[$key])); + $this->assertEquals($expected[$key], $value); + unset($expected[$key]); + } + + // The list of values should now be empty + $this->assertEquals([], $expected); + } + + /** + * @depends testSetGetMultiple + */ + public function testDeleteMultipleGenerator() + { + $values = [ + 'key1' => 'value1', + 'key2' => 'value2', + 'key3' => 'value3', + ]; + + $this->cache->setMultiple($values); + + $gen = function () { + yield 'key1'; + yield 'key3'; + }; + + $this->cache->deleteMultiple($gen()); + + $result = $this->cache->getMultiple(array_keys($values), 'tea'); + + $expected = [ + 'key1' => 'tea', + 'key2' => 'value2', + 'key3' => 'tea', + ]; + + foreach ($result as $key => $value) { + $this->assertTrue(isset($expected[$key])); + $this->assertEquals($expected[$key], $value); + unset($expected[$key]); + } + + // The list of values should now be empty + $this->assertEquals([], $expected); + } + + /** + * @expectException \Psr\SimpleCache\InvalidArgumentException + */ + public function testDeleteMultipleInvalidArg() + { + $this->expectException(InvalidArgumentException::class); + $this->cache->deleteMultiple(null); + } +} diff --git a/tests/CheckPublicSuffixTest.php b/tests/CheckPublicSuffixTest.php deleted file mode 100644 index 5ad0652f..00000000 --- a/tests/CheckPublicSuffixTest.php +++ /dev/null @@ -1,148 +0,0 @@ -list = $manager->getList(); - } - - /** - * This is my version of the checkPublicSuffix function referred to in the - * test instructions at the Public Suffix List project. - * - * "You will need to define a checkPublicSuffix() function which takes as a - * parameter a domain name and the public suffix, runs your implementation - * on the domain name and checks the result is the public suffix expected." - * - * @see http://publicsuffix.org/list/ - * - * @param string $input Domain and public suffix - * @param string $expected Expected result - */ - public function checkPublicSuffix($input, $expected) - { - $this->assertSame($expected, $this->list->query($input)->getRegistrableDomain()); - } - - public function testPublicSuffixSpec() - { - // Test data from Rob Stradling at Comodo - // http://mxr.mozilla.org/mozilla-central/source/netwerk/test/unit/data/test_psl.txt?raw=1 - // Any copyright is dedicated to the Public Domain. - // http://creativecommons.org/publicdomain/zero/1.0/ - - // null input. - $this->checkPublicSuffix(null, null); - // Mixed case. - $this->checkPublicSuffix('COM', null); - $this->checkPublicSuffix('example.COM', 'example.com'); - $this->checkPublicSuffix('WwW.example.COM', 'example.com'); - // Leading dot. - $this->checkPublicSuffix('.com', null); - $this->checkPublicSuffix('.example', null); - $this->checkPublicSuffix('.example.com', null); - $this->checkPublicSuffix('.example.example', null); - // Unlisted TLD. - // Addresses algorithm rule #2: If no rules match, the prevailing rule is "*". - $this->checkPublicSuffix('example', null); - $this->checkPublicSuffix('example.example', 'example.example'); - $this->checkPublicSuffix('b.example.example', 'example.example'); - $this->checkPublicSuffix('a.b.example.example', 'example.example'); - // TLD with only 1 rule. - $this->checkPublicSuffix('biz', null); - $this->checkPublicSuffix('domain.biz', 'domain.biz'); - $this->checkPublicSuffix('b.domain.biz', 'domain.biz'); - $this->checkPublicSuffix('a.b.domain.biz', 'domain.biz'); - // TLD with some 2-level rules. - $this->checkPublicSuffix('com', null); - $this->checkPublicSuffix('example.com', 'example.com'); - $this->checkPublicSuffix('b.example.com', 'example.com'); - $this->checkPublicSuffix('a.b.example.com', 'example.com'); - $this->checkPublicSuffix('uk.com', null); - $this->checkPublicSuffix('example.uk.com', 'example.uk.com'); - $this->checkPublicSuffix('b.example.uk.com', 'example.uk.com'); - $this->checkPublicSuffix('a.b.example.uk.com', 'example.uk.com'); - $this->checkPublicSuffix('test.ac', 'test.ac'); - // TLD with only 1 (wildcard) rule. - $this->checkPublicSuffix('mm', null); - $this->checkPublicSuffix('c.mm', null); - $this->checkPublicSuffix('b.c.mm', 'b.c.mm'); - $this->checkPublicSuffix('a.b.c.mm', 'b.c.mm'); - // More complex TLD. - $this->checkPublicSuffix('jp', null); - $this->checkPublicSuffix('test.jp', 'test.jp'); - $this->checkPublicSuffix('www.test.jp', 'test.jp'); - $this->checkPublicSuffix('ac.jp', null); - $this->checkPublicSuffix('test.ac.jp', 'test.ac.jp'); - $this->checkPublicSuffix('www.test.ac.jp', 'test.ac.jp'); - $this->checkPublicSuffix('kyoto.jp', null); - $this->checkPublicSuffix('test.kyoto.jp', 'test.kyoto.jp'); - $this->checkPublicSuffix('ide.kyoto.jp', null); - $this->checkPublicSuffix('b.ide.kyoto.jp', 'b.ide.kyoto.jp'); - $this->checkPublicSuffix('a.b.ide.kyoto.jp', 'b.ide.kyoto.jp'); - $this->checkPublicSuffix('c.kobe.jp', null); - $this->checkPublicSuffix('b.c.kobe.jp', 'b.c.kobe.jp'); - $this->checkPublicSuffix('a.b.c.kobe.jp', 'b.c.kobe.jp'); - $this->checkPublicSuffix('city.kobe.jp', 'city.kobe.jp'); - $this->checkPublicSuffix('www.city.kobe.jp', 'city.kobe.jp'); - // TLD with a wildcard rule and exceptions. - $this->checkPublicSuffix('ck', null); - $this->checkPublicSuffix('test.ck', null); - $this->checkPublicSuffix('b.test.ck', 'b.test.ck'); - $this->checkPublicSuffix('a.b.test.ck', 'b.test.ck'); - $this->checkPublicSuffix('www.ck', 'www.ck'); - $this->checkPublicSuffix('www.www.ck', 'www.ck'); - // US K12. - $this->checkPublicSuffix('us', null); - $this->checkPublicSuffix('test.us', 'test.us'); - $this->checkPublicSuffix('www.test.us', 'test.us'); - $this->checkPublicSuffix('ak.us', null); - $this->checkPublicSuffix('test.ak.us', 'test.ak.us'); - $this->checkPublicSuffix('www.test.ak.us', 'test.ak.us'); - $this->checkPublicSuffix('k12.ak.us', null); - $this->checkPublicSuffix('test.k12.ak.us', 'test.k12.ak.us'); - $this->checkPublicSuffix('www.test.k12.ak.us', 'test.k12.ak.us'); - // IDN labels. - $this->checkPublicSuffix('食狮.com.cn', '食狮.com.cn'); - $this->checkPublicSuffix('食狮.公司.cn', '食狮.公司.cn'); - $this->checkPublicSuffix('www.食狮.公司.cn', '食狮.公司.cn'); - $this->checkPublicSuffix('shishi.公司.cn', 'shishi.公司.cn'); - $this->checkPublicSuffix('公司.cn', null); - $this->checkPublicSuffix('食狮.中国', '食狮.中国'); - $this->checkPublicSuffix('www.食狮.中国', '食狮.中国'); - $this->checkPublicSuffix('shishi.中国', 'shishi.中国'); - $this->checkPublicSuffix('中国', null); - // Same as above, but punycoded. - $this->checkPublicSuffix('xn--85x722f.com.cn', 'xn--85x722f.com.cn'); - $this->checkPublicSuffix('xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn'); - $this->checkPublicSuffix('www.xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn'); - $this->checkPublicSuffix('shishi.xn--55qx5d.cn', 'shishi.xn--55qx5d.cn'); - $this->checkPublicSuffix('xn--55qx5d.cn', null); - $this->checkPublicSuffix('xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s'); - $this->checkPublicSuffix('www.xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s'); - $this->checkPublicSuffix('shishi.xn--fiqs8s', 'shishi.xn--fiqs8s'); - $this->checkPublicSuffix('xn--fiqs8s', null); - } -} diff --git a/tests/Http/CurlHttpAdapterTest.php b/tests/CurlHttpClientTest.php similarity index 52% rename from tests/Http/CurlHttpAdapterTest.php rename to tests/CurlHttpClientTest.php index 3164d458..f9fcd97d 100644 --- a/tests/Http/CurlHttpAdapterTest.php +++ b/tests/CurlHttpClientTest.php @@ -1,27 +1,23 @@ markTestSkipped('cURL has to be enabled.'); - } - - $this->adapter = new CurlHttpAdapter(); + $this->adapter = new CurlHttpClient(); } protected function tearDown() @@ -35,4 +31,10 @@ public function testGetContent() $this->assertNotNull($content); $this->assertContains('google', $content); } + + public function testThrowsException() + { + $this->expectException(HttpClientException::class); + $this->adapter->getContent('https://qsfsdfqdf.dfsf'); + } } diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 337be268..a487277d 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -2,18 +2,9 @@ declare(strict_types=1); -/** - * Public Suffix List PHP: Public Suffix List based URL parsing. - * - * @see http://github.com/jeremykendall/publicsuffixlist-php for the canonical source repository - * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * @license http://github.com/jeremykendall/publicsuffixlist-php/blob/master/LICENSE MIT License - */ namespace Pdp\Tests; -use Pdp\MatchedDomain; -use Pdp\UnmatchedDomain; +use Pdp\Domain; use PHPUnit\Framework\TestCase; class DomainTest extends TestCase @@ -24,10 +15,11 @@ class DomainTest extends TestCase * @param string $domain * @param string $publicSuffix */ - public function testRegistrableDomainIsNullWithMatchedDomain(string $domain, $publicSuffix) + public function testRegistrableDomainIsNullWithFoundDomain(string $domain, $publicSuffix) { - $domain = new MatchedDomain($domain, $publicSuffix); + $domain = new Domain($domain, $publicSuffix, Domain::ICANN_DOMAIN); $this->assertNull($domain->getRegistrableDomain()); + $this->assertNull($domain->getSubDomain()); } public function invalidRegistrableDomainProvider() @@ -35,18 +27,8 @@ public function invalidRegistrableDomainProvider() return [ 'domain and suffix are the same' => ['co.uk', 'co.uk'], 'domain has no labels' => ['faketld', 'faketld'], + 'public suffix is null' => ['faketld', null], + 'public suffix is invalid' => ['_b%C3%A9bé.be-', 'be-'], ]; } - - /** - * @dataProvider invalidRegistrableDomainProvider - * - * @param string $domain - * @param string $publicSuffix - */ - public function testRegistrableDomainIsNullWithUnMatchedDomain(string $domain, $publicSuffix) - { - $domain = new UnmatchedDomain($domain, $publicSuffix); - $this->assertNull($domain->getRegistrableDomain()); - } } diff --git a/tests/ManagerTest.php b/tests/ManagerTest.php new file mode 100644 index 00000000..e0d83e97 --- /dev/null +++ b/tests/ManagerTest.php @@ -0,0 +1,62 @@ +root = vfsStream::setup('pdp'); + vfsStream::create(['cache' => []], $this->root); + $this->cacheDir = vfsStream::url('pdp/cache'); + $this->cachePool = new Cache($this->cacheDir); + $this->manager = new Manager($this->cachePool, new CurlHttpClient()); + } + + public function tearDown() + { + $this->manager = null; + $this->cachePool = null; + $this->cacheDir = null; + $this->root = null; + } + + public function testRefreshRules() + { + $previous = $this->manager->getRules(); + $this->assertTrue($this->manager->refreshRules($this->sourceUrl)); + $this->assertEquals($previous, $this->manager->getRules()); + } + + public function testRebuildRulesFromRemoveSource() + { + $previous = $this->manager->getRules($this->sourceUrl); + $this->cachePool->clear(); //delete all local cache + $list = $this->manager->getRules($this->sourceUrl); + $this->assertEquals($previous, $this->manager->getRules($this->sourceUrl)); + } + + public function testGetRulesThrowsException() + { + $this->expectException(Exception::class); + $this->manager->getRules('https://google.com'); + } +} diff --git a/tests/PublicSuffixListManagerTest.php b/tests/PublicSuffixListManagerTest.php deleted file mode 100644 index 1db3da5a..00000000 --- a/tests/PublicSuffixListManagerTest.php +++ /dev/null @@ -1,71 +0,0 @@ -root = vfsStream::setup('pdp'); - vfsStream::create(['cache' => []], $this->root); - $this->cacheDir = vfsStream::url('pdp/cache'); - $this->cachePool = new FileCacheAdapter($this->cacheDir); - $this->manager = new PublicSuffixListManager($this->cachePool, new CurlHttpAdapter()); - } - - public function tearDown() - { - $this->manager = null; - $this->cachePool = null; - $this->cacheDir = null; - $this->root = null; - } - - public function testGetDifferentPublicList() - { - $publicSuffixList = $this->manager->getList(PublicSuffixList::ALL_DOMAINS, $this->sourceUrl); - $invalidList = $this->manager->getList('invalid type'); - $this->assertEquals($publicSuffixList, $invalidList); - } - - public function testRefreshList() - { - $previous = $this->manager->getList(); - $this->assertTrue($this->manager->refreshPublicSuffixList($this->sourceUrl)); - $this->assertEquals($previous, $this->manager->getList()); - } - - public function testGetListRebuildListFromLocalCache() - { - $previous = $this->manager->getList(PublicSuffixList::ICANN_DOMAINS, $this->sourceUrl); - $this->cachePool->delete(PublicSuffixList::ICANN_DOMAINS, $this->sourceUrl); //delete local copy of ICAN DOMAINS RULES - $list = $this->manager->getList(PublicSuffixList::ICANN_DOMAINS, $this->sourceUrl); - $this->assertEquals($previous, $this->manager->getList(PublicSuffixList::ICANN_DOMAINS, $this->sourceUrl)); - } - - public function testGetListRebuildListFromRemoveSource() - { - $previous = $this->manager->getList(PublicSuffixList::ICANN_DOMAINS, $this->sourceUrl); - $this->cachePool->clear(); //delete all local cache - $list = $this->manager->getList(PublicSuffixList::ICANN_DOMAINS, $this->sourceUrl); - $this->assertEquals($previous, $this->manager->getList(PublicSuffixList::ICANN_DOMAINS, $this->sourceUrl)); - } -} diff --git a/tests/PublicSuffixListTest.php b/tests/PublicSuffixListTest.php deleted file mode 100644 index cc7bef68..00000000 --- a/tests/PublicSuffixListTest.php +++ /dev/null @@ -1,154 +0,0 @@ -manager = new PublicSuffixListManager(new FileCacheAdapter(), new CurlHttpAdapter()); - $this->list = $this->manager->getList(); - } - - public function testConstructorThrowsExceptionOnUnsupportedType() - { - $this->expectException(OutOfRangeException::class); - new PublicSuffixList('foo', []); - } - - public function testFullDomainList() - { - $this->assertTrue($this->list->isAll()); - $this->assertFalse($this->list->isICANN()); - $this->assertFalse($this->list->isPrivate()); - } - - public function testICANNDomainList() - { - $list = $this->manager->getList(PublicSuffixList::ICANN_DOMAINS); - $this->assertFalse($list->isAll()); - $this->assertTrue($list->isICANN()); - $this->assertFalse($list->isPrivate()); - } - - public function testPrivateDomainList() - { - $list = $this->manager->getList(PublicSuffixList::PRIVATE_DOMAINS); - $this->assertFalse($list->isAll()); - $this->assertFalse($list->isICANN()); - $this->assertTrue($list->isPrivate()); - } - - public function testNullWillReturnNullDomain() - { - $domain = $this->list->query('COM'); - $this->assertFalse($domain->isValid()); - $this->assertInstanceOf(NullDomain::class, $domain); - } - - public function testIsSuffixValidFalse() - { - $domain = $this->list->query('www.example.faketld'); - $this->assertFalse($domain->isValid()); - $this->assertInstanceOf(UnmatchedDomain::class, $domain); - } - - public function testIsSuffixValidTrue() - { - $domain = $this->list->query('www.example.com'); - $this->assertTrue($domain->isValid()); - $this->assertInstanceOf(MatchedDomain::class, $domain); - } - - public function testIsSuffixValidFalseWithPunycoded() - { - $domain = $this->list->query('www.example.xn--85x722f'); - $this->assertFalse($domain->isValid()); - $this->assertInstanceOf(UnmatchedDomain::class, $domain); - $this->assertSame('xn--85x722f', $domain->getPublicSuffix()); - } - - /** - * @dataProvider parseDataProvider - */ - public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) - { - $this->assertSame($registrableDomain, $this->list->query($domain)->getRegistrableDomain()); - } - - /** - * @dataProvider parseDataProvider - */ - public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, $expectedDomain) - { - $this->assertSame($publicSuffix, $this->list->query($domain)->getPublicSuffix()); - } - - /** - * @dataProvider parseDataProvider - */ - public function testGetDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) - { - $this->assertSame($expectedDomain, $this->list->query($domain)->getDomain()); - } - - public function parseDataProvider() - { - return [ - // public suffix, registrable domain, domain - // BEGIN https://github.com/jeremykendall/php-domain-parser/issues/16 - 'com tld' => ['com', 'example.com', 'us.example.com', 'us.example.com'], - 'na tld' => ['na', 'example.na', 'us.example.na', 'us.example.na'], - 'us.na tld' => ['us.na', 'example.us.na', 'www.example.us.na', 'www.example.us.na'], - 'org tld' => ['org', 'example.org', 'us.example.org', 'us.example.org'], - 'biz tld (1)' => ['biz', 'broken.biz', 'webhop.broken.biz', 'webhop.broken.biz'], - 'biz tld (2)' => ['webhop.biz', 'broken.webhop.biz', 'www.broken.webhop.biz', 'www.broken.webhop.biz'], - // END https://github.com/jeremykendall/php-domain-parser/issues/16 - // Test ipv6 URL - 'IP (1)' => [null, null, '[::1]', null], - 'IP (2)' => [null, null, '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', null], - 'IP (3)' => [null, null, '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', null], - // Test IP address: Fixes #43 - 'IP (4)' => [null, null, '192.168.1.2', null], - // Link-local addresses and zone indices - 'IP (5)' => [null, null, '[fe80::3%25eth0]', null], - 'IP (6)' => [null, null, '[fe80::1%2511]', null], - 'fake tld' => ['faketld', 'example.faketld', 'example.faketld', 'example.faketld'], - ]; - } - - public function testGetPublicSuffixHandlesWrongCaseProperly() - { - $publicSuffix = 'рф'; - $domain = 'Яндекс.РФ'; - - $this->assertSame($publicSuffix, $this->list->query($domain)->getPublicSuffix()); - } -} diff --git a/tests/RulesTest.php b/tests/RulesTest.php new file mode 100644 index 00000000..e764b0b1 --- /dev/null +++ b/tests/RulesTest.php @@ -0,0 +1,314 @@ +rules = $manager->getRules(); + } + + public function testNullWillReturnNullDomain() + { + $domain = $this->rules->resolve('COM'); + $this->assertFalse($domain->isValid()); + } + + public function testIsSuffixValidFalse() + { + $domain = $this->rules->resolve('www.example.faketld'); + $this->assertFalse($domain->isValid()); + $this->assertSame('www', $domain->getSubDomain()); + } + + public function testIsSuffixValidTrue() + { + $domain = $this->rules->resolve('www.example.com', Domain::ICANN_DOMAIN); + $this->assertTrue($domain->isValid()); + $this->assertTrue($domain->isICANN()); + $this->assertFalse($domain->isPrivate()); + $this->assertSame('www', $domain->getSubDomain()); + } + + public function testIsSuffixValidFalseWithPunycoded() + { + $domain = $this->rules->resolve('www.example.xn--85x722f'); + $this->assertFalse($domain->isValid()); + $this->assertFalse($domain->isICANN()); + $this->assertFalse($domain->isPrivate()); + $this->assertSame('xn--85x722f', $domain->getPublicSuffix()); + $this->assertSame('www', $domain->getSubDomain()); + } + + public function testSudDomainIsNull() + { + $domain = $this->rules->resolve('ulb.ac.be', Domain::ICANN_DOMAIN); + $this->assertTrue($domain->isValid()); + $this->assertTrue($domain->isICANN()); + $this->assertFalse($domain->isPrivate()); + $this->assertSame('ac.be', $domain->getPublicSuffix()); + $this->assertSame('ulb.ac.be', $domain->getRegistrableDomain()); + $this->assertNull($domain->getSubDomain()); + } + + public function testWithInvalidDomainName() + { + $domain = $this->rules->resolve('_b%C3%A9bé.be-'); + $this->assertSame('_b%C3%A9bé.be-', $domain->getDomain()); + $this->assertFalse($domain->isValid()); + $this->assertFalse($domain->isICANN()); + $this->assertFalse($domain->isPrivate()); + $this->assertNull($domain->getPublicSuffix()); + $this->assertNull($domain->getRegistrableDomain()); + } + + public function testWithPrivateDomain() + { + $domain = $this->rules->resolve('thephpleague.github.io'); + $this->assertSame('thephpleague.github.io', $domain->getDomain()); + $this->assertTrue($domain->isValid()); + $this->assertFalse($domain->isICANN()); + $this->assertTrue($domain->isPrivate()); + $this->assertSame('github.io', $domain->getPublicSuffix()); + $this->assertSame('thephpleague.github.io', $domain->getRegistrableDomain()); + $this->assertNull($domain->getSubDomain()); + } + + public function testWithPrivateDomainInvalid() + { + $domain = $this->rules->resolve('private.ulb.ac.be', Domain::PRIVATE_DOMAIN); + $this->assertSame('private.ulb.ac.be', $domain->getDomain()); + $this->assertFalse($domain->isValid()); + $this->assertFalse($domain->isICANN()); + $this->assertFalse($domain->isPrivate()); + $this->assertSame('be', $domain->getPublicSuffix()); + $this->assertSame('ac.be', $domain->getRegistrableDomain()); + $this->assertSame('private.ulb', $domain->getSubDomain()); + } + + + public function testWithICANNDomainInvalid() + { + $domain = $this->rules->resolve('private.ulb.ac.be'); + $this->assertSame('private.ulb.ac.be', $domain->getDomain()); + $this->assertTrue($domain->isValid()); + $this->assertTrue($domain->isICANN()); + $this->assertFalse($domain->isPrivate()); + $this->assertSame('ac.be', $domain->getPublicSuffix()); + $this->assertSame('ulb.ac.be', $domain->getRegistrableDomain()); + $this->assertSame('private', $domain->getSubDomain()); + } + + /** + * @dataProvider parseDataProvider + * @param mixed $publicSuffix + * @param mixed $registrableDomain + * @param mixed $domain + * @param mixed $expectedDomain + */ + public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) + { + $this->assertSame($registrableDomain, $this->rules->resolve($domain, Domain::ICANN_DOMAIN)->getRegistrableDomain()); + } + + /** + * @dataProvider parseDataProvider + * @param mixed $publicSuffix + * @param mixed $registrableDomain + * @param mixed $domain + * @param mixed $expectedDomain + */ + public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, $expectedDomain) + { + $this->assertSame($publicSuffix, $this->rules->resolve($domain, Domain::ICANN_DOMAIN)->getPublicSuffix()); + } + + /** + * @dataProvider parseDataProvider + * @param mixed $publicSuffix + * @param mixed $registrableDomain + * @param mixed $domain + * @param mixed $expectedDomain + */ + public function testGetDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) + { + $this->assertSame($expectedDomain, $this->rules->resolve($domain, Domain::ICANN_DOMAIN)->getDomain()); + } + + public function parseDataProvider() + { + return [ + // public suffix, registrable domain, domain + // BEGIN https://github.com/jeremykendall/php-domain-parser/issues/16 + 'com tld' => ['com', 'example.com', 'us.example.com', 'us.example.com'], + 'na tld' => ['na', 'example.na', 'us.example.na', 'us.example.na'], + 'us.na tld' => ['us.na', 'example.us.na', 'www.example.us.na', 'www.example.us.na'], + 'org tld' => ['org', 'example.org', 'us.example.org', 'us.example.org'], + 'biz tld (1)' => ['biz', 'broken.biz', 'webhop.broken.biz', 'webhop.broken.biz'], + 'biz tld (2)' => ['biz', 'webhop.biz', 'www.broken.webhop.biz', 'www.broken.webhop.biz'], + // END https://github.com/jeremykendall/php-domain-parser/issues/16 + // Test ipv6 URL + 'IP (1)' => [null, null, '[::1]', null], + 'IP (2)' => [null, null, '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', null], + 'IP (3)' => [null, null, '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', null], + // Test IP address: Fixes #43 + 'IP (4)' => [null, null, '192.168.1.2', null], + // Link-local addresses and zone indices + 'IP (5)' => [null, null, '[fe80::3%25eth0]', null], + 'IP (6)' => [null, null, '[fe80::1%2511]', null], + 'fake tld' => ['faketld', 'example.faketld', 'example.faketld', 'example.faketld'], + ]; + } + + public function testGetPublicSuffixHandlesWrongCaseProperly() + { + $publicSuffix = 'рф'; + $domain = 'Яндекс.РФ'; + + $this->assertSame($publicSuffix, $this->rules->resolve($domain, Domain::ICANN_DOMAIN)->getPublicSuffix()); + } + + /** + * This is my version of the checkPublicSuffix function referred to in the + * test instructions at the Public Suffix List project. + * + * "You will need to define a checkPublicSuffix() function which takes as a + * parameter a domain name and the public suffix, runs your implementation + * on the domain name and checks the result is the public suffix expected." + * + * @see http://publicsuffix.org/list/ + * + * @param string $input Domain and public suffix + * @param string $expected Expected result + */ + public function checkPublicSuffix($input, $expected) + { + $this->assertSame($expected, $this->rules->resolve($input, Domain::ICANN_DOMAIN)->getRegistrableDomain()); + } + + /** + * This test case is based on the test data linked at + * http://publicsuffix.org/list/ and provided by Rob Strading of Comodo. + * + * @see + * http://mxr.mozilla.org/mozilla-central/source/netwerk/test/unit/data/test_psl.txt?raw=1 + */ + public function testPublicSuffixSpec() + { + // Test data from Rob Stradling at Comodo + // http://mxr.mozilla.org/mozilla-central/source/netwerk/test/unit/data/test_psl.txt?raw=1 + // Any copyright is dedicated to the Public Domain. + // http://creativecommons.org/publicdomain/zero/1.0/ + + // null input. + $this->checkPublicSuffix(null, null); + // Mixed case. + $this->checkPublicSuffix('COM', null); + $this->checkPublicSuffix('example.COM', 'example.com'); + $this->checkPublicSuffix('WwW.example.COM', 'example.com'); + // Leading dot. + $this->checkPublicSuffix('.com', null); + $this->checkPublicSuffix('.example', null); + $this->checkPublicSuffix('.example.com', null); + $this->checkPublicSuffix('.example.example', null); + // Unlisted TLD. + // Addresses algorithm rule #2: If no rules match, the prevailing rule is "*". + $this->checkPublicSuffix('example', null); + $this->checkPublicSuffix('example.example', 'example.example'); + $this->checkPublicSuffix('b.example.example', 'example.example'); + $this->checkPublicSuffix('a.b.example.example', 'example.example'); + // TLD with only 1 rule. + $this->checkPublicSuffix('biz', null); + $this->checkPublicSuffix('domain.biz', 'domain.biz'); + $this->checkPublicSuffix('b.domain.biz', 'domain.biz'); + $this->checkPublicSuffix('a.b.domain.biz', 'domain.biz'); + // TLD with some 2-level rules. + $this->checkPublicSuffix('com', null); + $this->checkPublicSuffix('example.com', 'example.com'); + $this->checkPublicSuffix('b.example.com', 'example.com'); + $this->checkPublicSuffix('a.b.example.com', 'example.com'); + + /* REPLACE uk.com by ac.be because uk.com is a PRIVATE DOMAIN */ + $this->checkPublicSuffix('ac.be', null); + $this->checkPublicSuffix('ulb.ac.be', 'ulb.ac.be'); + $this->checkPublicSuffix('b.ulb.ac.be', 'ulb.ac.be'); + $this->checkPublicSuffix('a.b.ulb.ac.be', 'ulb.ac.be'); + + $this->checkPublicSuffix('test.ac', 'test.ac'); + // TLD with only 1 (wildcard) rule. + $this->checkPublicSuffix('mm', null); + $this->checkPublicSuffix('c.mm', null); + $this->checkPublicSuffix('b.c.mm', 'b.c.mm'); + $this->checkPublicSuffix('a.b.c.mm', 'b.c.mm'); + // More complex TLD. + $this->checkPublicSuffix('jp', null); + $this->checkPublicSuffix('test.jp', 'test.jp'); + $this->checkPublicSuffix('www.test.jp', 'test.jp'); + $this->checkPublicSuffix('ac.jp', null); + $this->checkPublicSuffix('test.ac.jp', 'test.ac.jp'); + $this->checkPublicSuffix('www.test.ac.jp', 'test.ac.jp'); + $this->checkPublicSuffix('kyoto.jp', null); + $this->checkPublicSuffix('test.kyoto.jp', 'test.kyoto.jp'); + $this->checkPublicSuffix('ide.kyoto.jp', null); + $this->checkPublicSuffix('b.ide.kyoto.jp', 'b.ide.kyoto.jp'); + $this->checkPublicSuffix('a.b.ide.kyoto.jp', 'b.ide.kyoto.jp'); + $this->checkPublicSuffix('c.kobe.jp', null); + $this->checkPublicSuffix('b.c.kobe.jp', 'b.c.kobe.jp'); + $this->checkPublicSuffix('a.b.c.kobe.jp', 'b.c.kobe.jp'); + $this->checkPublicSuffix('city.kobe.jp', 'city.kobe.jp'); + $this->checkPublicSuffix('www.city.kobe.jp', 'city.kobe.jp'); + // TLD with a wildcard rule and exceptions. + $this->checkPublicSuffix('ck', null); + $this->checkPublicSuffix('test.ck', null); + $this->checkPublicSuffix('b.test.ck', 'b.test.ck'); + $this->checkPublicSuffix('a.b.test.ck', 'b.test.ck'); + $this->checkPublicSuffix('www.ck', 'www.ck'); + $this->checkPublicSuffix('www.www.ck', 'www.ck'); + // US K12. + $this->checkPublicSuffix('us', null); + $this->checkPublicSuffix('test.us', 'test.us'); + $this->checkPublicSuffix('www.test.us', 'test.us'); + $this->checkPublicSuffix('ak.us', null); + $this->checkPublicSuffix('test.ak.us', 'test.ak.us'); + $this->checkPublicSuffix('www.test.ak.us', 'test.ak.us'); + $this->checkPublicSuffix('k12.ak.us', null); + $this->checkPublicSuffix('test.k12.ak.us', 'test.k12.ak.us'); + $this->checkPublicSuffix('www.test.k12.ak.us', 'test.k12.ak.us'); + // IDN labels. + $this->checkPublicSuffix('食狮.com.cn', '食狮.com.cn'); + $this->checkPublicSuffix('食狮.公司.cn', '食狮.公司.cn'); + $this->checkPublicSuffix('www.食狮.公司.cn', '食狮.公司.cn'); + $this->checkPublicSuffix('shishi.公司.cn', 'shishi.公司.cn'); + $this->checkPublicSuffix('公司.cn', null); + $this->checkPublicSuffix('食狮.中国', '食狮.中国'); + $this->checkPublicSuffix('www.食狮.中国', '食狮.中国'); + $this->checkPublicSuffix('shishi.中国', 'shishi.中国'); + $this->checkPublicSuffix('中国', null); + // Same as above, but punycoded. + $this->checkPublicSuffix('xn--85x722f.com.cn', 'xn--85x722f.com.cn'); + $this->checkPublicSuffix('xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn'); + $this->checkPublicSuffix('www.xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn'); + $this->checkPublicSuffix('shishi.xn--55qx5d.cn', 'shishi.xn--55qx5d.cn'); + $this->checkPublicSuffix('xn--55qx5d.cn', null); + $this->checkPublicSuffix('xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s'); + $this->checkPublicSuffix('www.xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s'); + $this->checkPublicSuffix('shishi.xn--fiqs8s', 'shishi.xn--fiqs8s'); + $this->checkPublicSuffix('xn--fiqs8s', null); + } +} From c1f164cbdb9e1205e23c884c591b4d0c82599737 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 8 Dec 2017 15:19:36 +0100 Subject: [PATCH 046/461] remove old local cache --- data/pdp::ICANN.cache | 1 - data/pdp::PRIVATE.cache | 1 - 2 files changed, 2 deletions(-) delete mode 100644 data/pdp::ICANN.cache delete mode 100644 data/pdp::PRIVATE.cache diff --git a/data/pdp::ICANN.cache b/data/pdp::ICANN.cache deleted file mode 100644 index f6353b73..00000000 --- a/data/pdp::ICANN.cache +++ /dev/null @@ -1 +0,0 @@ -s:86541:"{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gov":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[]},"br":{"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"salvador":[],"sampa":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"*":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"boots":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtpc":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]}"; \ No newline at end of file diff --git a/data/pdp::PRIVATE.cache b/data/pdp::PRIVATE.cache deleted file mode 100644 index 26ed497a..00000000 --- a/data/pdp::PRIVATE.cache +++ /dev/null @@ -1 +0,0 @@ -s:17660:"{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":{"*":[]},"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"se":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"barsyonline":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[]},"hepforge":[],"js":[],"bmoattachments":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ca":{"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"ws":{"advisor":{"*":[]},"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"hzc":[],"sandcats":[],"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[]},"host":{"cloudaccess":[],"freesite":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[]},"pw":{"cloudns":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"no":{"co":[],"blogspot":[]},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"cldmail":{"hb":[]},"net":[],"org":[],"pp":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"cloud":{"myfusion":[],"statics":{"*":[]},"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"at":{"futurecms":{"*":[]},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"no-ip":[],"wellbeingzone":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"be":{"blogspot":[],"transurl":{"*":[]}},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]}},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"co":{"com":{"blogspot":[]},"nodum":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[]},"it":{"blogspot":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"bs":{"we":[]},"online":{"barsy":[]},"support":{"barsy":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[]},"ai":{"nom":[]},"gd":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"hn":{"nom":[]},"kz":{"nym":[]},"sx":{"nym":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"lc":{"oy":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"space":{"stackspace":[],"uber":[],"xs4all":[]},"farm":{"storj":[]},"mobi":{"dscloud":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}"; \ No newline at end of file From 9e3e8943d6b78113fe4690842e99c57646d56f66 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 10 Dec 2017 21:51:12 +0100 Subject: [PATCH 047/461] adding more decoupling --- README.md | 31 +++++-- src/Domain.php | 99 +++++++++------------- src/Manager.php | 104 +---------------------- src/Parser.php | 122 +++++++++++++++++++++++++++ src/PublicSuffix.php | 155 +++++++++++++++++++++++++++++++++++ src/Rules.php | 64 +++++++-------- tests/CacheTest.php | 2 +- tests/CurlHttpClientTest.php | 2 +- tests/DomainTest.php | 5 +- tests/ManagerTest.php | 2 +- tests/RulesTest.php | 37 +++++---- 11 files changed, 398 insertions(+), 225 deletions(-) create mode 100644 src/Parser.php create mode 100644 src/PublicSuffix.php diff --git a/README.md b/README.md index 9645c967..49f0fb22 100644 --- a/README.md +++ b/README.md @@ -231,8 +231,7 @@ In any case, you should setup a cron to regularly update your local cache. ### Public Suffix Resolver -#### Rules and Domain - +#### Public Suffix, Domain and Resolution ~~~php domain = $domain; - $this->setPublicSuffix($publicSuffix); - $this->setType($type); + $this->publicSuffix = $publicSuffix; $this->setRegistrableDomain(); $this->setSubDomain(); } - /** - * Compute the public suffix part - * - * @param string|null $publicSuffix - */ - private function setPublicSuffix($publicSuffix) - { - if (null === $this->domain) { - return; - } - - $this->publicSuffix = $publicSuffix; - } - - /** - * Compute the domain validity - * - * @param string $type - */ - private function setType(string $type) - { - if (null === $this->publicSuffix) { - return; - } - - if (!in_array($type, [self::PRIVATE_DOMAIN, self::ICANN_DOMAIN], true)) { - $type = self::UNKNOWN_DOMAIN; - } - - $this->type = $type; - } - /** * Compute the registrable domain part */ @@ -111,7 +65,7 @@ private function setRegistrableDomain() return; } - $countLabelsToRemove = count(explode('.', $this->publicSuffix)) + 1; + $countLabelsToRemove = count($this->publicSuffix) + 1; $domainLabels = explode('.', $this->domain); $domain = implode('.', array_slice($domainLabels, count($domainLabels) - $countLabelsToRemove)); $this->registrableDomain = $this->normalize($domain); @@ -124,9 +78,8 @@ private function setRegistrableDomain() */ private function hasRegistrableDomain(): bool { - return null !== $this->publicSuffix - && strpos($this->domain, '.') > 0 - && $this->publicSuffix !== $this->domain; + return strpos((string) $this->domain, '.') > 0 + && !in_array($this->publicSuffix->getContent(), [null, $this->domain], true); } /** @@ -162,7 +115,7 @@ private function setSubDomain() $domainLabels = explode('.', $this->domain); $countLabels = count($domainLabels); - $countLabelsToRemove = count(explode('.', $this->publicSuffix)) + 1; + $countLabelsToRemove = count($this->publicSuffix) + 1; if ($countLabels === $countLabelsToRemove) { return; } @@ -184,7 +137,7 @@ public function getDomain() */ public function getPublicSuffix() { - return $this->publicSuffix; + return $this->publicSuffix->getContent(); } /** @@ -202,9 +155,9 @@ public function getPublicSuffix() * * @return bool */ - public function isValid(): bool + public function isKnown(): bool { - return $this->type !== self::UNKNOWN_DOMAIN; + return $this->publicSuffix->isKnown(); } /** @@ -224,7 +177,7 @@ public function isValid(): bool */ public function isICANN(): bool { - return $this->type === self::ICANN_DOMAIN; + return $this->publicSuffix->isICANN(); } /** @@ -244,7 +197,7 @@ public function isICANN(): bool */ public function isPrivate(): bool { - return $this->type === self::PRIVATE_DOMAIN; + return $this->publicSuffix->isPrivate(); } /** @@ -280,4 +233,28 @@ public function getSubDomain() { return $this->subDomain; } + + /** + * {@inheritdoc} + */ + public function __debugInfo() + { + return [ + 'domain' => $this->domain, + 'publicSuffix' => $this->publicSuffix->getContent(), + 'registrableDomain' => $this->registrableDomain, + 'subDomain' => $this->subDomain, + 'isKnown' => $this->isKnown(), + 'isICANN' => $this->isICANN(), + 'isPrivate' => $this->isPrivate(), + ]; + } + + /** + * {@inheritdoc} + */ + public function __set_state(array $properties) + { + return new self($properties['domain'], $properties['publicSuffix']); + } } diff --git a/src/Manager.php b/src/Manager.php index 61bb1aea..b8f3c726 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -12,7 +12,6 @@ namespace Pdp; use Psr\SimpleCache\CacheInterface; -use SplTempFileObject; /** * Public Suffix List Manager. @@ -97,109 +96,14 @@ private function getCacheKey(string $str): string */ public function refreshRules(string $source_url = self::PSL_URL): bool { + static $parser; + $parser = $parser ?? new Parser(); $content = $this->http->getContent($source_url); - $rules = $this->parse($content); - if (empty($rules[Domain::ICANN_DOMAIN]) || empty($rules[Domain::PRIVATE_DOMAIN])) { + $rules = $parser->parse($content); + if (empty($rules[PublicSuffix::ICANN]) || empty($rules[PublicSuffix::PRIVATE])) { return false; } return $this->cache->set($this->getCacheKey($source_url), json_encode($rules)); } - - /** - * Parses text representation of list to associative, multidimensional array. - * - * @param string $content the Public SUffix List as a SplFileObject - * - * @return array Associative, multidimensional array representation of the - * public suffx list - */ - private function parse(string $content): array - { - $section = Domain::UNKNOWN_DOMAIN; - $rules = [Domain::ICANN_DOMAIN => [], Domain::PRIVATE_DOMAIN => []]; - $file = new SplTempFileObject(); - $file->fwrite($content); - $file->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); - foreach ($file as $line) { - $section = $this->getPslSection($section, $line); - if ($section !== Domain::UNKNOWN_DOMAIN && strpos($line, '//') === false) { - $rules[$section] = $this->addRule($rules[$section], explode('.', $line)); - } - } - - return $rules; - } - - /** - * Tell whether the line can be converted for a given domain. - * - * @param bool $section the previous status - * @param string $line the current file line - * - * @return string - */ - private function getPslSection(string $section, string $line): string - { - if ($section == Domain::UNKNOWN_DOMAIN && strpos($line, '// ===BEGIN ICANN DOMAINS===') === 0) { - return Domain::ICANN_DOMAIN; - } - - if ($section == Domain::ICANN_DOMAIN && strpos($line, '// ===END ICANN DOMAINS===') === 0) { - return Domain::UNKNOWN_DOMAIN; - } - - if ($section == Domain::UNKNOWN_DOMAIN && strpos($line, '// ===BEGIN PRIVATE DOMAINS===') === 0) { - return Domain::PRIVATE_DOMAIN; - } - - if ($section == Domain::PRIVATE_DOMAIN && strpos($line, '// ===END PRIVATE DOMAINS===') === 0) { - return Domain::UNKNOWN_DOMAIN; - } - - return $section; - } - - /** - * Recursive method to build the array representation of the Public Suffix List. - * - * This method is based heavily on the code found in generateEffectiveTLDs.php - * - * @see https://github.com/usrflo/registered-domain-libs/blob/master/generateEffectiveTLDs.php - * A copy of the Apache License, Version 2.0, is provided with this - * distribution - * - * @param array $list Initially an empty array, this eventually - * becomes the array representation of the Public Suffix List - * @param array $rule_parts One line (rule) from the Public Suffix List - * exploded on '.', or the remaining portion of that array during recursion - * - * @return array - */ - private function addRule(array $list, array $rule_parts): array - { - $part = array_pop($rule_parts); - - // Adheres to canonicalization rule from the "Formal Algorithm" section - // of https://publicsuffix.org/list/ - // "The domain and all rules must be canonicalized in the normal way - // for hostnames - lower-case, Punycode (RFC 3492)." - - $part = idn_to_ascii($part, 0, INTL_IDNA_VARIANT_UTS46); - $isDomain = true; - if (strpos($part, '!') === 0) { - $part = substr($part, 1); - $isDomain = false; - } - - if (!isset($list[$part])) { - $list[$part] = $isDomain ? [] : ['!' => '']; - } - - if ($isDomain && !empty($rule_parts)) { - $list[$part] = $this->addRule($list[$part], $rule_parts); - } - - return $list; - } } diff --git a/src/Parser.php b/src/Parser.php new file mode 100644 index 00000000..2c84e616 --- /dev/null +++ b/src/Parser.php @@ -0,0 +1,122 @@ + [], + PublicSuffix::PRIVATE => [], + ]; + $file = new SplTempFileObject(); + $file->fwrite($content); + $file->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); + $section = ''; + foreach ($file as $line) { + $section = $this->getSection($section, $line); + if ('' !== $section && false === strpos($line, '//')) { + $rules[$section] = $this->addRule($rules[$section], explode('.', $line)); + } + } + + return $rules; + } + + /** + * Returns the section type for a given line. + * + * @param string $section the current status + * @param string $line the current file line + * + * @return string + */ + private function getSection(string $section, string $line): string + { + if ($section == '' && strpos($line, '// ===BEGIN ICANN DOMAINS===') === 0) { + return PublicSuffix::ICANN; + } + + if ($section == PublicSuffix::ICANN && strpos($line, '// ===END ICANN DOMAINS===') === 0) { + return ''; + } + + if ($section == '' && strpos($line, '// ===BEGIN PRIVATE DOMAINS===') === 0) { + return PublicSuffix::PRIVATE; + } + + if ($section == PublicSuffix::PRIVATE && strpos($line, '// ===END PRIVATE DOMAINS===') === 0) { + return ''; + } + + return $section; + } + + /** + * Recursive method to build the array representation of the Public Suffix List. + * + * This method is based heavily on the code found in generateEffectiveTLDs.php + * + * @see https://github.com/usrflo/registered-domain-libs/blob/master/generateEffectiveTLDs.php + * A copy of the Apache License, Version 2.0, is provided with this + * distribution + * + * @param array $list Initially an empty array, this eventually + * becomes the array representation of the Public Suffix List + * @param array $rule_parts One line (rule) from the Public Suffix List + * exploded on '.', or the remaining portion of that array during recursion + * + * @return array + */ + private function addRule(array $list, array $rule_parts): array + { + $part = array_pop($rule_parts); + + // Adheres to canonicalization rule from the "Formal Algorithm" section + // of https://publicsuffix.org/list/ + // "The domain and all rules must be canonicalized in the normal way + // for hostnames - lower-case, Punycode (RFC 3492)." + + $part = idn_to_ascii($part, 0, INTL_IDNA_VARIANT_UTS46); + $isDomain = true; + if (strpos($part, '!') === 0) { + $part = substr($part, 1); + $isDomain = false; + } + + if (!isset($list[$part])) { + $list[$part] = $isDomain ? [] : ['!' => '']; + } + + if ($isDomain && !empty($rule_parts)) { + $list[$part] = $this->addRule($list[$part], $rule_parts); + } + + return $list; + } +} diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php new file mode 100644 index 00000000..ff73349b --- /dev/null +++ b/src/PublicSuffix.php @@ -0,0 +1,155 @@ + + * @author Ignace Nyamagana Butera + */ +final class PublicSuffix implements Countable +{ + const ICANN = 'ICANN_DOMAIN'; + const PRIVATE = 'PRIVATE_DOMAIN'; + const ALL = 'ALL_DOMAIN'; + const UNKNOWN = 'UNKNOWN_DOMAIN'; + + /** + * @var string|null + */ + private $publicSuffix; + + /** + * @var string + */ + private $type = ''; + + /** + * New instance. + * + * @param string|null $publicSuffix + * @param string $type + */ + public function __construct(string $publicSuffix = null, string $type = self::UNKNOWN) + { + $this->publicSuffix = $publicSuffix; + if (!in_array($type, [self::UNKNOWN, self::PRIVATE, self::ICANN], true)) { + $type = self::UNKNOWN; + } + + $this->type = $type; + } + + /** + * @return string|null + */ + public function getContent() + { + return $this->publicSuffix; + } + + /** + * {@inheritdoc} + */ + public function count() + { + if (null === $this->publicSuffix) { + return 0; + } + + return count(explode('.', $this->publicSuffix)); + } + + /** + * Does the domain have a matching rule in the Public Suffix List? + * + * WARNING: "Some people use the PSL to determine what is a valid domain name + * and what isn't. This is dangerous, particularly in these days where new + * gTLDs are arriving at a rapid pace, if your software does not regularly + * receive PSL updates, because it will erroneously think new gTLDs are not + * valid. The DNS is the proper source for this innormalizeion. If you must use + * it for this purpose, please do not bake static copies of the PSL into your + * software with no update mechanism." + * + * @see https://publicsuffix.org/learn/ + * + * @return bool + */ + public function isKnown(): bool + { + return self::UNKNOWN !== $this->type; + } + + /** + * Does the domain have a matching rule in the Public Suffix List ICANN section + * + * WARNING: "Some people use the PSL to determine what is a valid domain name + * and what isn't. This is dangerous, particularly in these days where new + * gTLDs are arriving at a rapid pace, if your software does not regularly + * receive PSL updates, because it will erroneously think new gTLDs are not + * valid. The DNS is the proper source for this innormalizeion. If you must use + * it for this purpose, please do not bake static copies of the PSL into your + * software with no update mechanism." + * + * @see https://publicsuffix.org/learn/ + * + * @return bool + */ + public function isICANN(): bool + { + return self::ICANN === $this->type; + } + + /** + * Does the domain have a matching rule in the Public Suffix List Private section + * + * WARNING: "Some people use the PSL to determine what is a valid domain name + * and what isn't. This is dangerous, particularly in these days where new + * gTLDs are arriving at a rapid pace, if your software does not regularly + * receive PSL updates, because it will erroneously think new gTLDs are not + * valid. The DNS is the proper source for this innormalizeion. If you must use + * it for this purpose, please do not bake static copies of the PSL into your + * software with no update mechanism." + * + * @see https://publicsuffix.org/learn/ + * + * @return bool + */ + public function isPrivate(): bool + { + return self::PRIVATE === $this->type; + } + + /** + * {@inheritdoc} + */ + public function __debugInfo() + { + return [ + 'publicSuffix' => $this->getContent(), + 'isKnown' => $this->isKnown(), + 'isICANN' => $this->isICANN(), + 'isPrivate' => $this->isPrivate(), + ]; + } + + /** + * {@inheritdoc} + */ + public function __set_state(array $properties) + { + return new self($properties['publicSuffix'], $properties['type']); + } +} diff --git a/src/Rules.php b/src/Rules.php index eac19859..aad7928f 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -36,20 +36,24 @@ public function __construct(array $rules) * * @return Domain */ - public function resolve(string $domain = null, string $type = Domain::UNKNOWN_DOMAIN): Domain + public function resolve(string $domain = null, string $type = PublicSuffix::ALL): Domain { + if (!in_array($type, [PublicSuffix::PRIVATE, PublicSuffix::ICANN, PublicSuffix::ALL], true)) { + throw new Exception(sprintf('%s is an unknown Public Suffix Section', $type)); + } + if (!$this->isMatchable($domain)) { - return new Domain(); + return new Domain(null, new PublicSuffix()); } $normalizedDomain = $this->normalize($domain); $reverseLabels = array_reverse(explode('.', $normalizedDomain)); - list($publicSuffix, $type) = $this->findPublicSuffix($type, $reverseLabels); - if (null === $publicSuffix) { + $publicSuffix = $this->findPublicSuffix($type, $reverseLabels); + if (null === $publicSuffix->getContent()) { return $this->handleNoMatches($domain); } - return $this->handleMatches($domain, $publicSuffix, $type); + return $this->handleMatches($domain, $publicSuffix); } /** @@ -98,29 +102,25 @@ private function normalize(string $domain): string * @param string $type * @param array $labels * - * @return array + * @return PublicSuffix */ - private function findPublicSuffix(string $type, array $labels): array + private function findPublicSuffix(string $type, array $labels): PublicSuffix { - if (in_array($type, [Domain::PRIVATE_DOMAIN, Domain::ICANN_DOMAIN], true)) { - return $this->findPublicSuffixFromSection($type, $labels); + $resultIcann = $this->findPublicSuffixFromSection(PublicSuffix::ICANN, $labels); + if (PublicSuffix::ICANN === $type) { + return $resultIcann; } - $resultPrivate = $this->findPublicSuffixFromSection(Domain::PRIVATE_DOMAIN, $labels); - $resultIcann = $this->findPublicSuffixFromSection(Domain::ICANN_DOMAIN, $labels); - - $privateSuffix = $resultPrivate[0]; - $icannSuffix = $resultIcann[0]; - - if (isset($icannSuffix, $privateSuffix)) { - return strlen($privateSuffix) > strlen($icannSuffix) ? $resultPrivate : $resultIcann; + $resultPrivate = $this->findPublicSuffixFromSection(PublicSuffix::PRIVATE, $labels); + if (PublicSuffix::ALL === $type) { + return count($resultIcann) >= count($resultPrivate) ? $resultIcann : $resultPrivate; } - if (null === $privateSuffix && null === $icannSuffix) { - return [null, Domain::UNKNOWN_DOMAIN]; + if (count($resultPrivate) > count($resultIcann)) { + return $resultPrivate; } - return null === $privateSuffix ? $resultIcann : $resultPrivate; + return new PublicSuffix(); } /** @@ -129,9 +129,9 @@ private function findPublicSuffix(string $type, array $labels): array * @param string $type * @param array $labels * - * @return array + * @return PublicSuffix */ - private function findPublicSuffixFromSection(string $type, array $labels): array + private function findPublicSuffixFromSection(string $type, array $labels): PublicSuffix { $rules = $this->rules[$type]; $matches = []; @@ -162,16 +162,13 @@ private function findPublicSuffixFromSection(string $type, array $labels): array } $found = array_filter($matches, 'strlen'); - if (count($found) == 1 && $type === Domain::PRIVATE_DOMAIN) { - return [null, $type = Domain::UNKNOWN_DOMAIN]; + if (empty($found)) { + return new PublicSuffix(); } - $publicSuffix = empty($matches) ? null : implode('.', $found); - - return [$publicSuffix, $type]; + return new PublicSuffix(implode('.', $found), $type); } - /** * Returns the Domain value object. * @@ -181,13 +178,16 @@ private function findPublicSuffixFromSection(string $type, array $labels): array * * @return Domain */ - private function handleMatches(string $domain, string $publicSuffix, string $type): Domain + private function handleMatches(string $domain, PublicSuffix $publicSuffix): Domain { if (!$this->isPunycoded($domain)) { - $publicSuffix = idn_to_utf8($publicSuffix, 0, INTL_IDNA_VARIANT_UTS46); + $publicSuffix = new PublicSuffix( + idn_to_utf8($publicSuffix->getContent(), 0, INTL_IDNA_VARIANT_UTS46), + $publicSuffix->isICANN() ? PublicSuffix::ICANN : PublicSuffix::PRIVATE + ); } - return new Domain($domain, $publicSuffix, $type); + return new Domain($domain, $publicSuffix); } /** @@ -221,6 +221,6 @@ private function handleNoMatches(string $domain): Domain } } - return new Domain($domain, $publicSuffix); + return new Domain($domain, new PublicSuffix($publicSuffix)); } } diff --git a/tests/CacheTest.php b/tests/CacheTest.php index b801cd1d..18e6802b 100644 --- a/tests/CacheTest.php +++ b/tests/CacheTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Pdp\Tests; +namespace pdp\tests; use DateInterval; use org\bovigo\vfs\vfsStream; diff --git a/tests/CurlHttpClientTest.php b/tests/CurlHttpClientTest.php index f9fcd97d..c3b784f8 100644 --- a/tests/CurlHttpClientTest.php +++ b/tests/CurlHttpClientTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Pdp\Tests; +namespace pdp\tests; use Pdp\CurlHttpClient; use Pdp\HttpClientException; diff --git a/tests/DomainTest.php b/tests/DomainTest.php index a487277d..ccbc07f1 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -2,9 +2,10 @@ declare(strict_types=1); -namespace Pdp\Tests; +namespace pdp\tests; use Pdp\Domain; +use Pdp\PublicSuffix; use PHPUnit\Framework\TestCase; class DomainTest extends TestCase @@ -17,7 +18,7 @@ class DomainTest extends TestCase */ public function testRegistrableDomainIsNullWithFoundDomain(string $domain, $publicSuffix) { - $domain = new Domain($domain, $publicSuffix, Domain::ICANN_DOMAIN); + $domain = new Domain($domain, new PublicSuffix($publicSuffix, PublicSuffix::ICANN)); $this->assertNull($domain->getRegistrableDomain()); $this->assertNull($domain->getSubDomain()); } diff --git a/tests/ManagerTest.php b/tests/ManagerTest.php index e0d83e97..e5f5925a 100644 --- a/tests/ManagerTest.php +++ b/tests/ManagerTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Pdp\Tests; +namespace pdp\tests; use org\bovigo\vfs\vfsStream; use Pdp\Cache; diff --git a/tests/RulesTest.php b/tests/RulesTest.php index e764b0b1..325ae127 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -2,12 +2,13 @@ declare(strict_types=1); -namespace Pdp\Tests; +namespace pdp\tests; use Pdp\Cache; use Pdp\CurlHttpClient; use Pdp\Domain; use Pdp\Manager; +use Pdp\PublicSuffix; use Pdp\Rules; use PHPUnit\Framework\TestCase; @@ -27,20 +28,20 @@ public function setUp() public function testNullWillReturnNullDomain() { $domain = $this->rules->resolve('COM'); - $this->assertFalse($domain->isValid()); + $this->assertFalse($domain->isKnown()); } public function testIsSuffixValidFalse() { $domain = $this->rules->resolve('www.example.faketld'); - $this->assertFalse($domain->isValid()); + $this->assertFalse($domain->isKnown()); $this->assertSame('www', $domain->getSubDomain()); } public function testIsSuffixValidTrue() { - $domain = $this->rules->resolve('www.example.com', Domain::ICANN_DOMAIN); - $this->assertTrue($domain->isValid()); + $domain = $this->rules->resolve('www.example.com', PublicSuffix::ICANN); + $this->assertTrue($domain->isKnown()); $this->assertTrue($domain->isICANN()); $this->assertFalse($domain->isPrivate()); $this->assertSame('www', $domain->getSubDomain()); @@ -49,7 +50,7 @@ public function testIsSuffixValidTrue() public function testIsSuffixValidFalseWithPunycoded() { $domain = $this->rules->resolve('www.example.xn--85x722f'); - $this->assertFalse($domain->isValid()); + $this->assertFalse($domain->isKnown()); $this->assertFalse($domain->isICANN()); $this->assertFalse($domain->isPrivate()); $this->assertSame('xn--85x722f', $domain->getPublicSuffix()); @@ -58,8 +59,8 @@ public function testIsSuffixValidFalseWithPunycoded() public function testSudDomainIsNull() { - $domain = $this->rules->resolve('ulb.ac.be', Domain::ICANN_DOMAIN); - $this->assertTrue($domain->isValid()); + $domain = $this->rules->resolve('ulb.ac.be', PublicSuffix::ICANN); + $this->assertTrue($domain->isKnown()); $this->assertTrue($domain->isICANN()); $this->assertFalse($domain->isPrivate()); $this->assertSame('ac.be', $domain->getPublicSuffix()); @@ -71,7 +72,7 @@ public function testWithInvalidDomainName() { $domain = $this->rules->resolve('_b%C3%A9bé.be-'); $this->assertSame('_b%C3%A9bé.be-', $domain->getDomain()); - $this->assertFalse($domain->isValid()); + $this->assertFalse($domain->isKnown()); $this->assertFalse($domain->isICANN()); $this->assertFalse($domain->isPrivate()); $this->assertNull($domain->getPublicSuffix()); @@ -82,7 +83,7 @@ public function testWithPrivateDomain() { $domain = $this->rules->resolve('thephpleague.github.io'); $this->assertSame('thephpleague.github.io', $domain->getDomain()); - $this->assertTrue($domain->isValid()); + $this->assertTrue($domain->isKnown()); $this->assertFalse($domain->isICANN()); $this->assertTrue($domain->isPrivate()); $this->assertSame('github.io', $domain->getPublicSuffix()); @@ -92,9 +93,9 @@ public function testWithPrivateDomain() public function testWithPrivateDomainInvalid() { - $domain = $this->rules->resolve('private.ulb.ac.be', Domain::PRIVATE_DOMAIN); + $domain = $this->rules->resolve('private.ulb.ac.be', PublicSuffix::PRIVATE); $this->assertSame('private.ulb.ac.be', $domain->getDomain()); - $this->assertFalse($domain->isValid()); + $this->assertFalse($domain->isKnown()); $this->assertFalse($domain->isICANN()); $this->assertFalse($domain->isPrivate()); $this->assertSame('be', $domain->getPublicSuffix()); @@ -107,7 +108,7 @@ public function testWithICANNDomainInvalid() { $domain = $this->rules->resolve('private.ulb.ac.be'); $this->assertSame('private.ulb.ac.be', $domain->getDomain()); - $this->assertTrue($domain->isValid()); + $this->assertTrue($domain->isKnown()); $this->assertTrue($domain->isICANN()); $this->assertFalse($domain->isPrivate()); $this->assertSame('ac.be', $domain->getPublicSuffix()); @@ -124,7 +125,7 @@ public function testWithICANNDomainInvalid() */ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) { - $this->assertSame($registrableDomain, $this->rules->resolve($domain, Domain::ICANN_DOMAIN)->getRegistrableDomain()); + $this->assertSame($registrableDomain, $this->rules->resolve($domain, PublicSuffix::ICANN)->getRegistrableDomain()); } /** @@ -136,7 +137,7 @@ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $dom */ public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, $expectedDomain) { - $this->assertSame($publicSuffix, $this->rules->resolve($domain, Domain::ICANN_DOMAIN)->getPublicSuffix()); + $this->assertSame($publicSuffix, $this->rules->resolve($domain, PublicSuffix::ICANN)->getPublicSuffix()); } /** @@ -148,7 +149,7 @@ public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, */ public function testGetDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) { - $this->assertSame($expectedDomain, $this->rules->resolve($domain, Domain::ICANN_DOMAIN)->getDomain()); + $this->assertSame($expectedDomain, $this->rules->resolve($domain, PublicSuffix::ICANN)->getDomain()); } public function parseDataProvider() @@ -181,7 +182,7 @@ public function testGetPublicSuffixHandlesWrongCaseProperly() $publicSuffix = 'рф'; $domain = 'Яндекс.РФ'; - $this->assertSame($publicSuffix, $this->rules->resolve($domain, Domain::ICANN_DOMAIN)->getPublicSuffix()); + $this->assertSame($publicSuffix, $this->rules->resolve($domain, PublicSuffix::ICANN)->getPublicSuffix()); } /** @@ -199,7 +200,7 @@ public function testGetPublicSuffixHandlesWrongCaseProperly() */ public function checkPublicSuffix($input, $expected) { - $this->assertSame($expected, $this->rules->resolve($input, Domain::ICANN_DOMAIN)->getRegistrableDomain()); + $this->assertSame($expected, $this->rules->resolve($input, PublicSuffix::ICANN)->getRegistrableDomain()); } /** From 7d8a4f7b6726afc0f6d92ef214f2a66be1c9bfe3 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 11 Dec 2017 11:28:17 +0100 Subject: [PATCH 048/461] Improve Rules code - Constants are now attached to the `Rules` class instead of the `PublicSuffix` class - The `Parser` class is renamed `Converter` to avoid BC break usage - The `PublicSuffix` class is made internal --- CHANGELOG.md | 32 +++++++ README.md | 49 ++++------ composer.json | 8 +- ...ULL-5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- src/{Parser.php => Converter.php} | 19 ++-- src/Domain.php | 34 ++++--- src/Manager.php | 8 +- src/PublicSuffix.php | 22 ++--- src/Rules.php | 91 ++++++++++--------- tests/DomainTest.php | 23 ++++- tests/RulesTest.php | 35 +++++-- 11 files changed, 192 insertions(+), 131 deletions(-) create mode 100644 CHANGELOG.md rename src/{Parser.php => Converter.php} (86%) diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..e160b456 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,32 @@ +# Changelog + +All Notable changes to `PHP Domain Parser` will be documented in this file + +## 4.0.0 - TBD + +### Added + +- `Pdp\Exception` a base exception for the library +- `Pdp\Rules` a class to resolve domain name against the public suffix list +- `Pdp\Domain` an immutable value object to represents a parsed domain name +- `Pdp\Installer` a class to enable improve PSL maintenance +- `Pdp\Cache` a PSR-16 file cache implementation to cache a local copy of the PSL +- `Pdp\Manager` a class to enable managing PSL sources and `Rules` objects creation +- `Pdp\Converter` a class to convert the PSL into a PHP array + +### Fixed + +- Domain class with invalid domain names improved supported +- idn_* conversion error better handled + +### Deprecated + +- None + +### Removed + +- URL Parsing capabilities API is removed +- `Pdp\PublicSuffixList` class replaced by the `Pdp\Rules` class +- `Pdp\PublicSuffixManager` class replaced by the `Pdp\Manager` class +- `Pdp\HttpAdapter\HttpAdapterInterface` interface replaced by the `Pdp\HttpClient` interface +- `Pdp\HttpAdapter\CurlHttpAdapter` class replaced by the `Pdp\CurlHttpClient` class \ No newline at end of file diff --git a/README.md b/README.md index 49f0fb22..99f5c90c 100644 --- a/README.md +++ b/README.md @@ -18,10 +18,8 @@ Consider the domain www.pref.okinawa.jp. In this domain, the *public suffix* portion is **okinawa.jp**, the *registrable domain* is **pref.okinawa.jp**, and the *subdomain* is **www**. You can't regex that. -Other similar libraries focus primarily on URL building, parsing, and -manipulation and additionally include public suffix domain parsing. PHP Domain -Parser was built around accurate Public Suffix List based parsing from the very -beginning, adding a URL object simply for the sake of completeness. +PHP Domain Parser was built around accurate Public Suffix List based parsing from the very +beginning. For URL parsing, building or manipulation please refer to [better libraries](https://packagist.org/packages/sabre/uri?q=uri%20rfc3986&p=0) who are more focus on those area of development System Requirements ------- @@ -50,7 +48,6 @@ Documentation ### Public Suffix Manager - ~~~php Domain::isValid status depends on the PSL rules used. For the same domain, depending on the rules used a domain public suffix may be valid or not.

+

Domain::isKnown status depends on the PSL rules used. For the same domain, depending on the rules used a domain public suffix may be known or not.

~~~php getDomain(); //returns 'www.ulb.ac.be' $domain->getPublicSuffix(); //returns 'ac.be' $domain->getRegistrableDomain(); //returns 'ulb.ac.be' $domain->getSubDomain(); //returns 'www' -$domain->isValid(); //returns true +$domain->isKnown(); //returns true $domain->isICANN(); //returns true $domain->isPrivate(); //returns false -//let's resolve the same URI againts the PRIVATE DOMAIN SECTION +//let's resolve the same domain against the PRIVATE DOMAIN SECTION -$domain = $rules->resolve('www.ulb.ac.be', Domain::PRIVATE_DOMAIN); +$domain = $rules->resolve('www.ulb.ac.be', Rules::PRIVATE_DOMAINS); $domain->getDomain(); //returns 'www.ulb.ac.be' $domain->getPublicSuffix(); //returns 'be' $domain->getRegistrableDomain(); //returns 'ac.be' $domain->getSubDomain(); //returns 'www.ulb' -$domain->isValid(); //returns false +$domain->isKnown(); //returns false $domain->isICANN(); //returns false $domain->isPrivate(); //returns false ~~~ -

Warning: Some people use the PSL to determine what is a valid domain name and what isn't. This is dangerous, particularly in these days where new gTLDs are arriving at a rapid pace, if your software does not regularly receive PSL updates, because it will erroneously think new gTLDs are not valid. The DNS is the proper source for this information. If you must use it for this purpose, please do not bake static copies of the PSL into your software with no update mechanism.

+

Warning: Some people use the PSL to determine what is a valid domain name and what isn't. This is dangerous, particularly in these days where new gTLDs are arriving at a rapid pace, if your software does not regularly receive PSL updates, it may erroneously think new gTLDs are not known. The DNS is the proper source for this information. If you must use it for this purpose, please do not bake static copies of the PSL into your software with no update mechanism.

Contributing ------- diff --git a/composer.json b/composer.json index d1d2e107..85cebeda 100644 --- a/composer.json +++ b/composer.json @@ -29,11 +29,12 @@ "keywords": [ "Public Suffix List", "domain parsing", - "url parsing" + "icann", + "idn", + "psl" ], "require": { "php": ">=7.0", - "ext-curl": "*", "ext-intl": "*", "psr/simple-cache": "^1" }, @@ -43,7 +44,8 @@ "friendsofphp/php-cs-fixer": "^2.7" }, "suggest": { - "psr/simple-cache-implementation": "To enable using other cache providers" + "psr/simple-cache-implementation": "To enable using other cache providers", + "ext-curl": "To use the package http client" }, "autoload": { "psr-4": { diff --git a/data/pdp-PSL-FULL-5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL-FULL-5a3cc7f81795bb2e48e848af42d287b4.cache index 01abca41..a232c9c8 100644 --- a/data/pdp-PSL-FULL-5a3cc7f81795bb2e48e848af42d287b4.cache +++ b/data/pdp-PSL-FULL-5a3cc7f81795bb2e48e848af42d287b4.cache @@ -1 +1 @@ -s:104236:"{"ICANN_DOMAIN":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gov":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[]},"br":{"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"salvador":[],"sampa":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"*":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"boots":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtpc":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAIN":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":{"*":[]},"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"se":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"barsyonline":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[]},"hepforge":[],"js":[],"bmoattachments":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ca":{"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"ws":{"advisor":{"*":[]},"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"hzc":[],"sandcats":[],"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[]},"host":{"cloudaccess":[],"freesite":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[]},"pw":{"cloudns":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"no":{"co":[],"blogspot":[]},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"cldmail":{"hb":[]},"net":[],"org":[],"pp":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"cloud":{"myfusion":[],"statics":{"*":[]},"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"at":{"futurecms":{"*":[]},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"no-ip":[],"wellbeingzone":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"be":{"blogspot":[],"transurl":{"*":[]}},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]}},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"co":{"com":{"blogspot":[]},"nodum":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[]},"it":{"blogspot":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"bs":{"we":[]},"online":{"barsy":[]},"support":{"barsy":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[]},"ai":{"nom":[]},"gd":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"hn":{"nom":[]},"kz":{"nym":[]},"sx":{"nym":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"lc":{"oy":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"space":{"stackspace":[],"uber":[],"xs4all":[]},"farm":{"storj":[]},"mobi":{"dscloud":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file +s:104238:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gov":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[]},"br":{"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"salvador":[],"sampa":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"*":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"boots":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtpc":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":{"*":[]},"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"se":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"barsyonline":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[]},"hepforge":[],"js":[],"bmoattachments":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ca":{"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"ws":{"advisor":{"*":[]},"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"hzc":[],"sandcats":[],"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[]},"host":{"cloudaccess":[],"freesite":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[]},"pw":{"cloudns":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"no":{"co":[],"blogspot":[]},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"cldmail":{"hb":[]},"net":[],"org":[],"pp":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"cloud":{"myfusion":[],"statics":{"*":[]},"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"at":{"futurecms":{"*":[]},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"no-ip":[],"wellbeingzone":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"be":{"blogspot":[],"transurl":{"*":[]}},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]}},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"co":{"com":{"blogspot":[]},"nodum":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[]},"it":{"blogspot":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"bs":{"we":[]},"online":{"barsy":[]},"support":{"barsy":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[]},"ai":{"nom":[]},"gd":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"hn":{"nom":[]},"kz":{"nym":[]},"sx":{"nym":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"lc":{"oy":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"space":{"stackspace":[],"uber":[],"xs4all":[]},"farm":{"storj":[]},"mobi":{"dscloud":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file diff --git a/src/Parser.php b/src/Converter.php similarity index 86% rename from src/Parser.php rename to src/Converter.php index 2c84e616..21a0f27b 100644 --- a/src/Parser.php +++ b/src/Converter.php @@ -16,9 +16,9 @@ /** * Public Suffix List Parser. * - * This class parses the Public Suffix List + * This class convert the Public Suffix List into an associative, multidimensional array */ -final class Parser +final class Converter { /** * Convert the Public Suffix List into @@ -28,12 +28,9 @@ final class Parser * * @return array */ - public function parse(string $content): array + public function convert(string $content): array { - $rules = [ - PublicSuffix::ICANN => [], - PublicSuffix::PRIVATE => [], - ]; + $rules = [Rules::ICANN_DOMAINS => [], Rules::PRIVATE_DOMAINS => []]; $file = new SplTempFileObject(); $file->fwrite($content); $file->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); @@ -59,18 +56,18 @@ public function parse(string $content): array private function getSection(string $section, string $line): string { if ($section == '' && strpos($line, '// ===BEGIN ICANN DOMAINS===') === 0) { - return PublicSuffix::ICANN; + return Rules::ICANN_DOMAINS; } - if ($section == PublicSuffix::ICANN && strpos($line, '// ===END ICANN DOMAINS===') === 0) { + if ($section == Rules::ICANN_DOMAINS && strpos($line, '// ===END ICANN DOMAINS===') === 0) { return ''; } if ($section == '' && strpos($line, '// ===BEGIN PRIVATE DOMAINS===') === 0) { - return PublicSuffix::PRIVATE; + return Rules::PRIVATE_DOMAINS; } - if ($section == PublicSuffix::PRIVATE && strpos($line, '// ===END PRIVATE DOMAINS===') === 0) { + if ($section == Rules::PRIVATE_DOMAINS && strpos($line, '// ===END PRIVATE DOMAINS===') === 0) { return ''; } diff --git a/src/Domain.php b/src/Domain.php index e8ee2dd0..9f11634a 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -28,7 +28,7 @@ final class Domain private $domain; /** - * @var string|null + * @var PublicSuffix */ private $publicSuffix; @@ -52,12 +52,14 @@ public function __construct($domain = null, PublicSuffix $publicSuffix) { $this->domain = $domain; $this->publicSuffix = $publicSuffix; - $this->setRegistrableDomain(); - $this->setSubDomain(); + $this->registrableDomain = $this->setRegistrableDomain(); + $this->subDomain = $this->setSubDomain(); } /** - * Compute the registrable domain part + * Compute the registrable domain part. + * + * @return string|null */ private function setRegistrableDomain() { @@ -65,10 +67,11 @@ private function setRegistrableDomain() return; } - $countLabelsToRemove = count($this->publicSuffix) + 1; + $nbLabelsToRemove = count($this->publicSuffix) + 1; $domainLabels = explode('.', $this->domain); - $domain = implode('.', array_slice($domainLabels, count($domainLabels) - $countLabelsToRemove)); - $this->registrableDomain = $this->normalize($domain); + $registrableDomain = implode('.', array_slice($domainLabels, count($domainLabels) - $nbLabelsToRemove)); + + return $this->normalize($registrableDomain); } /** @@ -105,23 +108,26 @@ private function normalize(string $domain) } /** - * Compute the sub domain part + * Compute the sub domain part. + * + * @return string|null */ private function setSubDomain() { if (!$this->hasRegistrableDomain()) { - return; + return null; } + $nbLabelsToRemove = count($this->publicSuffix) + 1; $domainLabels = explode('.', $this->domain); $countLabels = count($domainLabels); - $countLabelsToRemove = count($this->publicSuffix) + 1; - if ($countLabels === $countLabelsToRemove) { - return; + if ($countLabels === $nbLabelsToRemove) { + return null; } - $domain = implode('.', array_slice($domainLabels, 0, $countLabels - $countLabelsToRemove)); - $this->subDomain = $this->normalize($domain); + $domain = implode('.', array_slice($domainLabels, 0, $countLabels - $nbLabelsToRemove)); + + return $this->normalize($domain); } /** diff --git a/src/Manager.php b/src/Manager.php index b8f3c726..f9cf362c 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -96,11 +96,11 @@ private function getCacheKey(string $str): string */ public function refreshRules(string $source_url = self::PSL_URL): bool { - static $parser; - $parser = $parser ?? new Parser(); + static $converter; + $converter = $converter ?? new Converter(); $content = $this->http->getContent($source_url); - $rules = $parser->parse($content); - if (empty($rules[PublicSuffix::ICANN]) || empty($rules[PublicSuffix::PRIVATE])) { + $rules = $converter->convert($content); + if (empty($rules[Rules::ICANN_DOMAINS]) || empty($rules[Rules::PRIVATE_DOMAINS])) { return false; } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index ff73349b..ce53fb47 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -16,16 +16,12 @@ /** * Public Suffix Value Object * - * @author Jeremy Kendall * @author Ignace Nyamagana Butera + * + * @internal */ final class PublicSuffix implements Countable { - const ICANN = 'ICANN_DOMAIN'; - const PRIVATE = 'PRIVATE_DOMAIN'; - const ALL = 'ALL_DOMAIN'; - const UNKNOWN = 'UNKNOWN_DOMAIN'; - /** * @var string|null */ @@ -34,7 +30,7 @@ final class PublicSuffix implements Countable /** * @var string */ - private $type = ''; + private $type; /** * New instance. @@ -42,13 +38,9 @@ final class PublicSuffix implements Countable * @param string|null $publicSuffix * @param string $type */ - public function __construct(string $publicSuffix = null, string $type = self::UNKNOWN) + public function __construct(string $publicSuffix = null, string $type = '') { $this->publicSuffix = $publicSuffix; - if (!in_array($type, [self::UNKNOWN, self::PRIVATE, self::ICANN], true)) { - $type = self::UNKNOWN; - } - $this->type = $type; } @@ -89,7 +81,7 @@ public function count() */ public function isKnown(): bool { - return self::UNKNOWN !== $this->type; + return '' !== $this->type; } /** @@ -109,7 +101,7 @@ public function isKnown(): bool */ public function isICANN(): bool { - return self::ICANN === $this->type; + return Rules::ICANN_DOMAINS === $this->type; } /** @@ -129,7 +121,7 @@ public function isICANN(): bool */ public function isPrivate(): bool { - return self::PRIVATE === $this->type; + return Rules::PRIVATE_DOMAINS === $this->type; } /** diff --git a/src/Rules.php b/src/Rules.php index aad7928f..2f641ff6 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -11,8 +11,15 @@ namespace Pdp; +/** + * A class to resolve domain name against the Public Suffix list + */ final class Rules { + const ALL_DOMAINS = 'ALL_DOMAINS'; + const ICANN_DOMAINS = 'ICANN_DOMAINS'; + const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; + /** * @var array */ @@ -36,24 +43,22 @@ public function __construct(array $rules) * * @return Domain */ - public function resolve(string $domain = null, string $type = PublicSuffix::ALL): Domain + public function resolve(string $domain = null, string $type = self::ALL_DOMAINS): Domain { - if (!in_array($type, [PublicSuffix::PRIVATE, PublicSuffix::ICANN, PublicSuffix::ALL], true)) { - throw new Exception(sprintf('%s is an unknown Public Suffix Section', $type)); + if (!in_array($type, [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, self::ALL_DOMAINS], true)) { + throw new Exception(sprintf('%s is an unknown Domain type', $type)); } if (!$this->isMatchable($domain)) { return new Domain(null, new PublicSuffix()); } - $normalizedDomain = $this->normalize($domain); - $reverseLabels = array_reverse(explode('.', $normalizedDomain)); - $publicSuffix = $this->findPublicSuffix($type, $reverseLabels); + $publicSuffix = $this->findPublicSuffix($type, $domain); if (null === $publicSuffix->getContent()) { - return $this->handleNoMatches($domain); + return new Domain($domain, $this->handleNoMatches($domain)); } - return $this->handleMatches($domain, $publicSuffix); + return new Domain($domain, $this->handleMatches($domain, $publicSuffix)); } /** @@ -100,26 +105,29 @@ private function normalize(string $domain): string * Returns the matched public suffix and its type * * @param string $type - * @param array $labels + * @param string $domain * * @return PublicSuffix */ - private function findPublicSuffix(string $type, array $labels): PublicSuffix + private function findPublicSuffix(string $type, string $domain): PublicSuffix { - $resultIcann = $this->findPublicSuffixFromSection(PublicSuffix::ICANN, $labels); - if (PublicSuffix::ICANN === $type) { - return $resultIcann; - } + $normalizedDomain = $this->normalize($domain); + $reverseLabels = array_reverse(explode('.', $normalizedDomain)); - $resultPrivate = $this->findPublicSuffixFromSection(PublicSuffix::PRIVATE, $labels); - if (PublicSuffix::ALL === $type) { - return count($resultIcann) >= count($resultPrivate) ? $resultIcann : $resultPrivate; + $resultIcann = $this->findPublicSuffixFromSection(self::ICANN_DOMAINS, $reverseLabels); + if (self::ICANN_DOMAINS === $type) { + return $resultIcann; } + $resultPrivate = $this->findPublicSuffixFromSection(self::PRIVATE_DOMAINS, $reverseLabels); if (count($resultPrivate) > count($resultIcann)) { return $resultPrivate; } + if (self::ALL_DOMAINS === $type) { + return $resultIcann; + } + return new PublicSuffix(); } @@ -170,24 +178,27 @@ private function findPublicSuffixFromSection(string $type, array $labels): Publi } /** - * Returns the Domain value object. + * Returns the PublicSuffix value object if no public suffix was found. * * @param string $domain - * @param string $publicSuffix - * @param string $type * - * @return Domain + * @return PublicSuffix */ - private function handleMatches(string $domain, PublicSuffix $publicSuffix): Domain + private function handleNoMatches(string $domain): PublicSuffix { - if (!$this->isPunycoded($domain)) { - $publicSuffix = new PublicSuffix( - idn_to_utf8($publicSuffix->getContent(), 0, INTL_IDNA_VARIANT_UTS46), - $publicSuffix->isICANN() ? PublicSuffix::ICANN : PublicSuffix::PRIVATE - ); + $labels = explode('.', $domain); + $publicSuffix = array_pop($labels); + + if ($this->isPunycoded($domain)) { + return new PublicSuffix($publicSuffix); + } + + $publicSuffix = idn_to_utf8($publicSuffix, 0, INTL_IDNA_VARIANT_UTS46); + if (false !== $publicSuffix) { + return new PublicSuffix($publicSuffix); } - return new Domain($domain, $publicSuffix); + return new PublicSuffix(); } /** @@ -203,24 +214,22 @@ private function isPunycoded(string $domain): bool } /** - * Returns the Domain value object. + * Returns the PublicSuffix value object if a known public suffix was found. * - * @param string $domain + * @param string $domain + * @param PublicSuffix $publicSuffix * - * @return Domain + * @return PublicSuffix */ - private function handleNoMatches(string $domain): Domain + private function handleMatches($domain, PublicSuffix $publicSuffix): PublicSuffix { - $labels = explode('.', $domain); - $publicSuffix = array_pop($labels); - - if (!$this->isPunycoded($domain)) { - $publicSuffix = idn_to_utf8($publicSuffix, 0, INTL_IDNA_VARIANT_UTS46); - if (false === $publicSuffix) { - $publicSuffix = null; - } + if ($this->isPunycoded($domain)) { + return $publicSuffix; } - return new Domain($domain, new PublicSuffix($publicSuffix)); + return new PublicSuffix( + idn_to_utf8($publicSuffix->getContent(), 0, INTL_IDNA_VARIANT_UTS46), + $publicSuffix->isICANN() ? self::ICANN_DOMAINS : self::PRIVATE_DOMAINS + ); } } diff --git a/tests/DomainTest.php b/tests/DomainTest.php index ccbc07f1..4d1351c4 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -4,8 +4,12 @@ namespace pdp\tests; +use Pdp\Cache; +use Pdp\CurlHttpClient; use Pdp\Domain; +use Pdp\Manager; use Pdp\PublicSuffix; +use Pdp\Rules; use PHPUnit\Framework\TestCase; class DomainTest extends TestCase @@ -18,7 +22,7 @@ class DomainTest extends TestCase */ public function testRegistrableDomainIsNullWithFoundDomain(string $domain, $publicSuffix) { - $domain = new Domain($domain, new PublicSuffix($publicSuffix, PublicSuffix::ICANN)); + $domain = new Domain($domain, new PublicSuffix($publicSuffix)); $this->assertNull($domain->getRegistrableDomain()); $this->assertNull($domain->getSubDomain()); } @@ -32,4 +36,21 @@ public function invalidRegistrableDomainProvider() 'public suffix is invalid' => ['_b%C3%A9bé.be-', 'be-'], ]; } + + public function testDomainInternalPhpMethod() + { + $rules = (new Manager(new Cache(), new CurlHttpClient()))->getRules(); + $domain = $rules->resolve('contoso.com'); + $generateDomain = eval('return '.var_export($domain, true).';'); + $this->assertInternalType('array', $domain->__debugInfo()); + $this->assertEquals($domain, $generateDomain); + } + + public function testPublicSuffixnternalPhpMethod() + { + $publicSuffix = new PublicSuffix('co.uk', Rules::ICANN_DOMAINS); + $generatePublicSuffix = eval('return '.var_export($publicSuffix, true).';'); + $this->assertInternalType('array', $publicSuffix->__debugInfo()); + $this->assertEquals($publicSuffix, $generatePublicSuffix); + } } diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 325ae127..ca84dc82 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -7,8 +7,8 @@ use Pdp\Cache; use Pdp\CurlHttpClient; use Pdp\Domain; +use Pdp\Exception; use Pdp\Manager; -use Pdp\PublicSuffix; use Pdp\Rules; use PHPUnit\Framework\TestCase; @@ -31,6 +31,12 @@ public function testNullWillReturnNullDomain() $this->assertFalse($domain->isKnown()); } + public function testResolveThrowsExceptionOnWrongDomainType() + { + $this->expectException(Exception::class); + $this->rules->resolve('www.example.com', 'foobar'); + } + public function testIsSuffixValidFalse() { $domain = $this->rules->resolve('www.example.faketld'); @@ -40,7 +46,7 @@ public function testIsSuffixValidFalse() public function testIsSuffixValidTrue() { - $domain = $this->rules->resolve('www.example.com', PublicSuffix::ICANN); + $domain = $this->rules->resolve('www.example.com', Rules::ICANN_DOMAINS); $this->assertTrue($domain->isKnown()); $this->assertTrue($domain->isICANN()); $this->assertFalse($domain->isPrivate()); @@ -59,7 +65,7 @@ public function testIsSuffixValidFalseWithPunycoded() public function testSudDomainIsNull() { - $domain = $this->rules->resolve('ulb.ac.be', PublicSuffix::ICANN); + $domain = $this->rules->resolve('ulb.ac.be', Rules::ICANN_DOMAINS); $this->assertTrue($domain->isKnown()); $this->assertTrue($domain->isICANN()); $this->assertFalse($domain->isPrivate()); @@ -93,7 +99,7 @@ public function testWithPrivateDomain() public function testWithPrivateDomainInvalid() { - $domain = $this->rules->resolve('private.ulb.ac.be', PublicSuffix::PRIVATE); + $domain = $this->rules->resolve('private.ulb.ac.be', Rules::PRIVATE_DOMAINS); $this->assertSame('private.ulb.ac.be', $domain->getDomain()); $this->assertFalse($domain->isKnown()); $this->assertFalse($domain->isICANN()); @@ -103,6 +109,17 @@ public function testWithPrivateDomainInvalid() $this->assertSame('private.ulb', $domain->getSubDomain()); } + public function testWithPrivateDomainValid() + { + $domain = $this->rules->resolve('thephpleague.github.io', Rules::PRIVATE_DOMAINS); + $this->assertSame('thephpleague.github.io', $domain->getDomain()); + $this->assertTrue($domain->isKnown()); + $this->assertFalse($domain->isICANN()); + $this->assertTrue($domain->isPrivate()); + $this->assertSame('github.io', $domain->getPublicSuffix()); + $this->assertSame('thephpleague.github.io', $domain->getRegistrableDomain()); + $this->assertNull($domain->getSubDomain()); + } public function testWithICANNDomainInvalid() { @@ -125,7 +142,7 @@ public function testWithICANNDomainInvalid() */ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) { - $this->assertSame($registrableDomain, $this->rules->resolve($domain, PublicSuffix::ICANN)->getRegistrableDomain()); + $this->assertSame($registrableDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getRegistrableDomain()); } /** @@ -137,7 +154,7 @@ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $dom */ public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, $expectedDomain) { - $this->assertSame($publicSuffix, $this->rules->resolve($domain, PublicSuffix::ICANN)->getPublicSuffix()); + $this->assertSame($publicSuffix, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getPublicSuffix()); } /** @@ -149,7 +166,7 @@ public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, */ public function testGetDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) { - $this->assertSame($expectedDomain, $this->rules->resolve($domain, PublicSuffix::ICANN)->getDomain()); + $this->assertSame($expectedDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getDomain()); } public function parseDataProvider() @@ -182,7 +199,7 @@ public function testGetPublicSuffixHandlesWrongCaseProperly() $publicSuffix = 'рф'; $domain = 'Яндекс.РФ'; - $this->assertSame($publicSuffix, $this->rules->resolve($domain, PublicSuffix::ICANN)->getPublicSuffix()); + $this->assertSame($publicSuffix, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getPublicSuffix()); } /** @@ -200,7 +217,7 @@ public function testGetPublicSuffixHandlesWrongCaseProperly() */ public function checkPublicSuffix($input, $expected) { - $this->assertSame($expected, $this->rules->resolve($input, PublicSuffix::ICANN)->getRegistrableDomain()); + $this->assertSame($expected, $this->rules->resolve($input, Rules::ICANN_DOMAINS)->getRegistrableDomain()); } /** From a28afa7171d502b68f8148fc7db938b2e28d7554 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 11 Dec 2017 11:44:05 +0100 Subject: [PATCH 049/461] improve documentation --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 99f5c90c..4a712ff0 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,6 @@ You need: - **PHP >= 7.0** but the latest stable version of PHP is recommended - the `mbstring` extension - the `intl` extension -- the `curl` extension Dependencies ------- @@ -228,7 +227,7 @@ In any case, you should setup a cron to regularly update your local cache. ### Public Suffix Resolver -#### Public Suffix, Domain and Resolution +#### Public Suffix and Domain Resolution ~~~php Date: Mon, 11 Dec 2017 11:51:12 +0100 Subject: [PATCH 050/461] bug fix adding static keyword --- src/Domain.php | 2 +- src/PublicSuffix.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 9f11634a..1763f877 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -259,7 +259,7 @@ public function __debugInfo() /** * {@inheritdoc} */ - public function __set_state(array $properties) + public static function __set_state(array $properties) { return new self($properties['domain'], $properties['publicSuffix']); } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index ce53fb47..c16aafeb 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -140,7 +140,7 @@ public function __debugInfo() /** * {@inheritdoc} */ - public function __set_state(array $properties) + public static function __set_state(array $properties) { return new self($properties['publicSuffix'], $properties['type']); } From a52c6c9e4e24cefc53d58d71b4c8380b0e453973 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 11 Dec 2017 13:09:17 +0100 Subject: [PATCH 051/461] update composer manifest --- composer.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/composer.json b/composer.json index 85cebeda..ac060144 100644 --- a/composer.json +++ b/composer.json @@ -63,5 +63,13 @@ "test": "phpunit --coverage-text; php-cs-fixer fix -vv --diff --dry-run --allow-risky=yes", "phpunit": "phpunit --coverage-text", "phpcs": "php-cs-fixer fix -vv --diff --dry-run --allow-risky=yes" + }, + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "config": { + "sort-packages": true } } From f88994c88f0c4cdfe1eeb45ed3b55e90fc85f8fe Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 11 Dec 2017 13:14:56 +0100 Subject: [PATCH 052/461] update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4a712ff0..4e979785 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,7 @@ Consider the domain www.pref.okinawa.jp. In this domain, the *public suffix* portion is **okinawa.jp**, the *registrable domain* is **pref.okinawa.jp**, and the *subdomain* is **www**. You can't regex that. -PHP Domain Parser was built around accurate Public Suffix List based parsing from the very -beginning. For URL parsing, building or manipulation please refer to [better libraries](https://packagist.org/packages/sabre/uri?q=uri%20rfc3986&p=0) who are more focus on those area of development +PHP Domain Parser is built around accurate Public Suffix List based parsing. For URL parsing, building or manipulation please refer to [libraries](https://packagist.org/packages/sabre/uri?q=uri%20rfc3986&p=0) focused on those area of development. System Requirements ------- @@ -156,6 +155,7 @@ $ php ./bin/update-psl This script requires that: +- the PHP `curl` extension - The `Pdp\Installer` class which comes bundle with this package - The use of the Cache and HTTP Client implementations bundle with the package. From c270b9d858d41c0c6534918e41ac265218f77523 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 11 Dec 2017 17:47:45 +0100 Subject: [PATCH 053/461] improve dockblock --- CHANGELOG.md | 5 +- README.md | 13 ++- composer.json | 2 +- src/Domain.php | 184 ++++++++++++++++++++----------------------- src/Installer.php | 2 + src/Manager.php | 10 +-- src/PublicSuffix.php | 40 +++------- src/Rules.php | 17 ++-- 8 files changed, 133 insertions(+), 140 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e160b456..2594b55c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All Notable changes to `PHP Domain Parser` will be documented in this file -## 4.0.0 - TBD +## 5.0.0 - TBD ### Added @@ -16,8 +16,9 @@ All Notable changes to `PHP Domain Parser` will be documented in this file ### Fixed -- Domain class with invalid domain names improved supported +- invalid domain names improved supported - idn_* conversion error better handled +- domain name with RFC3986 encoded string improved supported ### Deprecated diff --git a/README.md b/README.md index 4e979785..ea46b344 100644 --- a/README.md +++ b/README.md @@ -256,7 +256,7 @@ The `Rules` class resolves the submitted domain against the parsed rules from th ~~~php getSubDomain(); //returns 'www' $domain->isKnown(); //returns true $domain->isICANN(); //returns true $domain->isPrivate(); //returns false +echo json_encode($domain, JSON_PRETTY_PRINT); +// returns +// { +// "domain": "www.ulb.ac.be", +// "registrableDomain": "ulb.ac.be", +// "subDomain": "www", +// "publicSuffix": "ac.be", +// "isKnown": true, +// "isICANN": true, +// "isPrivate": false +// } //let's resolve the same domain against the PRIVATE DOMAIN SECTION diff --git a/composer.json b/composer.json index ac060144..709d1617 100644 --- a/composer.json +++ b/composer.json @@ -66,7 +66,7 @@ }, "extra": { "branch-alias": { - "dev-master": "4.x-dev" + "dev-master": "5.x-dev" } }, "config": { diff --git a/src/Domain.php b/src/Domain.php index 1763f877..39b184cb 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -11,16 +11,23 @@ namespace Pdp; +use JsonSerializable; + /** * Domain Value Object * - * Lifted pretty much completely from Jeremy Kendall PDP - * project + * WARNING: "Some people use the PSL to determine what is a valid domain name + * and what isn't. This is dangerous, particularly in these days where new + * gTLDs are arriving at a rapid pace, if your software does not regularly + * receive PSL updates, it will erroneously think new gTLDs are not + * valid. The DNS is the proper source for this innormalizeion. If you must use + * it for this purpose, please do not bake static copies of the PSL into your + * software with no update mechanism." * * @author Jeremy Kendall * @author Ignace Nyamagana Butera */ -final class Domain +final class Domain implements JsonSerializable { /** * @var string|null @@ -63,8 +70,12 @@ public function __construct($domain = null, PublicSuffix $publicSuffix) */ private function setRegistrableDomain() { - if (!$this->hasRegistrableDomain()) { - return; + if (strpos((string) $this->domain, '.') === false) { + return null; + } + + if (in_array($this->publicSuffix->getContent(), [null, $this->domain], true)) { + return null; } $nbLabelsToRemove = count($this->publicSuffix) + 1; @@ -75,18 +86,7 @@ private function setRegistrableDomain() } /** - * Tells whether the domain has a registrable domain part. - * - * @return bool - */ - private function hasRegistrableDomain(): bool - { - return strpos((string) $this->domain, '.') > 0 - && !in_array($this->publicSuffix->getContent(), [null, $this->domain], true); - } - - /** - * Normalize the domain according to its representation. + * Normalizes the domain according to its representation. * * @param string $domain * @@ -108,13 +108,13 @@ private function normalize(string $domain) } /** - * Compute the sub domain part. + * Computes the sub domain part. * * @return string|null */ private function setSubDomain() { - if (!$this->hasRegistrableDomain()) { + if (null === $this->registrableDomain) { return null; } @@ -125,95 +125,61 @@ private function setSubDomain() return null; } - $domain = implode('.', array_slice($domainLabels, 0, $countLabels - $nbLabelsToRemove)); + $subDomain = implode('.', array_slice($domainLabels, 0, $countLabels - $nbLabelsToRemove)); - return $this->normalize($domain); + return $this->normalize($subDomain); } /** - * @return string|null - */ - public function getDomain() - { - return $this->domain; - } - - /** - * @return string|null + * {@inheritdoc} */ - public function getPublicSuffix() + public function jsonSerialize() { - return $this->publicSuffix->getContent(); + return [ + 'domain' => $this->domain, + 'registrableDomain' => $this->registrableDomain, + 'subDomain' => $this->subDomain, + 'publicSuffix' => $this->publicSuffix->getContent(), + 'isKnown' => $this->publicSuffix->isKnown(), + 'isICANN' => $this->publicSuffix->isICANN(), + 'isPrivate' => $this->publicSuffix->isPrivate(), + ]; } /** - * Does the domain have a matching rule in the Public Suffix List? - * - * WARNING: "Some people use the PSL to determine what is a valid domain name - * and what isn't. This is dangerous, particularly in these days where new - * gTLDs are arriving at a rapid pace, if your software does not regularly - * receive PSL updates, because it will erroneously think new gTLDs are not - * valid. The DNS is the proper source for this innormalizeion. If you must use - * it for this purpose, please do not bake static copies of the PSL into your - * software with no update mechanism." - * - * @see https://publicsuffix.org/learn/ - * - * @return bool + * {@inheritdoc} */ - public function isKnown(): bool + public function __debugInfo() { - return $this->publicSuffix->isKnown(); + return $this->jsonSerialize(); } /** - * Does the domain have a matching rule in the Public Suffix List ICANN section - * - * WARNING: "Some people use the PSL to determine what is a valid domain name - * and what isn't. This is dangerous, particularly in these days where new - * gTLDs are arriving at a rapid pace, if your software does not regularly - * receive PSL updates, because it will erroneously think new gTLDs are not - * valid. The DNS is the proper source for this innormalizeion. If you must use - * it for this purpose, please do not bake static copies of the PSL into your - * software with no update mechanism." - * - * @see https://publicsuffix.org/learn/ - * - * @return bool + * {@inheritdoc} */ - public function isICANN(): bool + public static function __set_state(array $properties) { - return $this->publicSuffix->isICANN(); + return new self($properties['domain'], $properties['publicSuffix']); } /** - * Does the domain have a matching rule in the Public Suffix List Private section - * - * WARNING: "Some people use the PSL to determine what is a valid domain name - * and what isn't. This is dangerous, particularly in these days where new - * gTLDs are arriving at a rapid pace, if your software does not regularly - * receive PSL updates, because it will erroneously think new gTLDs are not - * valid. The DNS is the proper source for this innormalizeion. If you must use - * it for this purpose, please do not bake static copies of the PSL into your - * software with no update mechanism." + * Returns the full domain name. * - * @see https://publicsuffix.org/learn/ + * This method should return null on seriously malformed domain name * - * @return bool + * @return string|null */ - public function isPrivate(): bool + public function getDomain() { - return $this->publicSuffix->isPrivate(); + return $this->domain; } /** - * Get registrable domain. + * Returns the registrable domain. * - * Algorithm #7: The registered or registrable domain is the public suffix - * plus one additional label. + * The registered or registrable domain is the public suffix plus one additional label. * - * This method should return null if the domain provided is a public suffix, - * per the test cases provided by Mozilla. + * This method should return null if the registrable domain is the same as the public suffix. * * @see https://publicsuffix.org/list/ * @see https://raw.githubusercontent.com/publicsuffix/list/master/tests/test_psl.txt @@ -226,12 +192,12 @@ public function getRegistrableDomain() } /** - * Get the sub domain. + * Returns the sub domain. * - * This method should return null if + * The sub domain represents the remaining labels without the registrable domain. * - * - the registrable domain is null - * - the registrable domain is the same as the public suffix + * This method should return null if the registrable domain is null + * This method should return null if the registrable domain is the same as the public suffix * * @return string|null registrable domain */ @@ -241,26 +207,48 @@ public function getSubDomain() } /** - * {@inheritdoc} + * Returns the public suffix. + * + * @return string|null */ - public function __debugInfo() + public function getPublicSuffix() { - return [ - 'domain' => $this->domain, - 'publicSuffix' => $this->publicSuffix->getContent(), - 'registrableDomain' => $this->registrableDomain, - 'subDomain' => $this->subDomain, - 'isKnown' => $this->isKnown(), - 'isICANN' => $this->isICANN(), - 'isPrivate' => $this->isPrivate(), - ]; + return $this->publicSuffix->getContent(); } /** - * {@inheritdoc} + * Tells whether the public suffix has a matching rule in a Public Suffix List. + * + * @see https://publicsuffix.org/learn/ + * + * @return bool */ - public static function __set_state(array $properties) + public function isKnown(): bool { - return new self($properties['domain'], $properties['publicSuffix']); + return $this->publicSuffix->isKnown(); + } + + /** + * Tells whether the public suffix has a matching rule in a Public Suffix List ICANN Section. + * + * @see https://publicsuffix.org/learn/ + * + * @return bool + */ + public function isICANN(): bool + { + return $this->publicSuffix->isICANN(); + } + + /** + * Tells whether the public suffix has a matching rule in a Public Suffix List Private Section. + * + * @see https://publicsuffix.org/learn/ + * + * @return bool + */ + public function isPrivate(): bool + { + return $this->publicSuffix->isPrivate(); } } diff --git a/src/Installer.php b/src/Installer.php index f4a89e70..a429c46b 100644 --- a/src/Installer.php +++ b/src/Installer.php @@ -15,6 +15,8 @@ /** * A class to manage PSL ICANN Section rules updates + * + * @author Ignace Nyamagana Butera */ final class Installer { diff --git a/src/Manager.php b/src/Manager.php index f9cf362c..61e6cbf1 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -46,7 +46,7 @@ public function __construct(CacheInterface $cache, HttpClient $http) } /** - * Gets ICANN Public Suffix List Rules. + * Gets the Public Suffix List Rules. * * @param string $source_url the Public Suffix List URL * @@ -66,7 +66,6 @@ public function getRules(string $source_url = self::PSL_URL): Rules $rules = $this->cache->get($cacheKey); - return new Rules(json_decode($rules, true)); } @@ -85,10 +84,11 @@ private function getCacheKey(string $str): string } /** - * Downloads Public Suffix List and writes text cache and PHP cache. If these files - * already exist, they will be overwritten. + * Downloads, converts and cache the Public Suffix. + * + * If a local cache already exists, it will be overwritten. * - * Returns true if all list are correctly refreshed + * Returns true if the refresh was successful * * @param string $source_url the Public Suffix List URL * diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index c16aafeb..ab9bf956 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -16,6 +16,14 @@ /** * Public Suffix Value Object * + * WARNING: "Some people use the PSL to determine what is a valid domain name + * and what isn't. This is dangerous, particularly in these days where new + * gTLDs are arriving at a rapid pace, if your software does not regularly + * receive PSL updates, it will erroneously think new gTLDs are not + * valid. The DNS is the proper source for this innormalizeion. If you must use + * it for this purpose, please do not bake static copies of the PSL into your + * software with no update mechanism." + * * @author Ignace Nyamagana Butera * * @internal @@ -45,6 +53,8 @@ public function __construct(string $publicSuffix = null, string $type = '') } /** + * Returns the public suffix content. + * * @return string|null */ public function getContent() @@ -65,15 +75,7 @@ public function count() } /** - * Does the domain have a matching rule in the Public Suffix List? - * - * WARNING: "Some people use the PSL to determine what is a valid domain name - * and what isn't. This is dangerous, particularly in these days where new - * gTLDs are arriving at a rapid pace, if your software does not regularly - * receive PSL updates, because it will erroneously think new gTLDs are not - * valid. The DNS is the proper source for this innormalizeion. If you must use - * it for this purpose, please do not bake static copies of the PSL into your - * software with no update mechanism." + * Tells whether the public suffix has a matching rule in a Public Suffix List. * * @see https://publicsuffix.org/learn/ * @@ -85,15 +87,7 @@ public function isKnown(): bool } /** - * Does the domain have a matching rule in the Public Suffix List ICANN section - * - * WARNING: "Some people use the PSL to determine what is a valid domain name - * and what isn't. This is dangerous, particularly in these days where new - * gTLDs are arriving at a rapid pace, if your software does not regularly - * receive PSL updates, because it will erroneously think new gTLDs are not - * valid. The DNS is the proper source for this innormalizeion. If you must use - * it for this purpose, please do not bake static copies of the PSL into your - * software with no update mechanism." + * Tells whether the public suffix has a matching rule in a Public Suffix List ICANN Section. * * @see https://publicsuffix.org/learn/ * @@ -105,15 +99,7 @@ public function isICANN(): bool } /** - * Does the domain have a matching rule in the Public Suffix List Private section - * - * WARNING: "Some people use the PSL to determine what is a valid domain name - * and what isn't. This is dangerous, particularly in these days where new - * gTLDs are arriving at a rapid pace, if your software does not regularly - * receive PSL updates, because it will erroneously think new gTLDs are not - * valid. The DNS is the proper source for this innormalizeion. If you must use - * it for this purpose, please do not bake static copies of the PSL into your - * software with no update mechanism." + * Tells whether the public suffix has a matching rule in a Public Suffix List Private Section. * * @see https://publicsuffix.org/learn/ * diff --git a/src/Rules.php b/src/Rules.php index 2f641ff6..bc5b9682 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -13,6 +13,9 @@ /** * A class to resolve domain name against the Public Suffix list + * + * @author Jeremy Kendall + * @author Ignace Nyamagana Butera */ final class Rules { @@ -21,6 +24,8 @@ final class Rules const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; /** + * PSL rules as a multidimentional associative array + * * @var array */ private $rules; @@ -62,7 +67,7 @@ public function resolve(string $domain = null, string $type = self::ALL_DOMAINS) } /** - * Tells whether the given domain is valid. + * Tells whether the given domain can be resolved. * * @param string|null $domain * @@ -77,7 +82,7 @@ private function isMatchable($domain): bool } /** - * Normalize domain. + * Normalizes a domain name. * * "The domain must be canonicalized in the normal way for hostnames - lower-case, Punycode." * @@ -102,7 +107,7 @@ private function normalize(string $domain): string } /** - * Returns the matched public suffix and its type + * Returns the matched public suffix. * * @param string $type * @param string $domain @@ -132,7 +137,7 @@ private function findPublicSuffix(string $type, string $domain): PublicSuffix } /** - * Returns the matched public suffix using a given section type + * Returns the public suffix matched against a given PSL section. * * @param string $type * @param array $labels @@ -178,7 +183,7 @@ private function findPublicSuffixFromSection(string $type, array $labels): Publi } /** - * Returns the PublicSuffix value object if no public suffix was found. + * Returns a PublicSuffix if none was found using the PSL. * * @param string $domain * @@ -214,7 +219,7 @@ private function isPunycoded(string $domain): bool } /** - * Returns the PublicSuffix value object if a known public suffix was found. + * Returns a PublicSuffix if one was found using the PSL. * * @param string $domain * @param PublicSuffix $publicSuffix From 633af368df7f18b17c6963fb022e23376ee3dc4a Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 11 Dec 2017 17:55:22 +0100 Subject: [PATCH 054/461] improve documentation --- README.md | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index ea46b344..393ce016 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ $ composer require jeremykendall/php-domain-parser Documentation -------- -### Public Suffix Manager +### Public Suffix List Maintenance ~~~php getRules('https://publicsuffix.org/list/public_suffix_list.dat'); -$rules->resolve('www.bébé.be'); +$domain = $rules->resolve('www.bébé.be'); ~~~ #### Refreshing the cached rules @@ -165,7 +165,7 @@ If you prefer using your own implementations you should: 2. Adapt its code to reflect your requirements. -In any cases your are required to register a cron with your chosen script to keep your data up to date +In any cases your are required to update regularly your PSL information with your chosen script to keep your data up to date. For example, below I'm using the `Manager` with @@ -205,7 +205,7 @@ final class GuzzleHttpClientAdapter implements HttpClient } $dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbuser', 'dbpass'); -$symfonyCache = new PDOCache($dbh, 'league-psl-icann', 86400); +$symfonyCache = new PDOCache($dbh, 'psl', 86400); $guzzleAdapter = new GuzzleHttpClientAdapter(new GuzzleClient()); $manager = new Manager($symfonyCache, $guzzleAdapter); $manager->refreshRules(); @@ -218,16 +218,13 @@ $domain->getDomain(); //returns 'nl.shop.bébé.faketld' $domain->getPublicSuffix(); //returns 'faketld' $domain->getRegistrableDomain(); //returns 'bébé.faketld' $domain->getSubDomain(); //returns 'nl.shop' -$domain->isValid(); //returns false +$domain->isKnown(); //returns false ~~~ In any case, you should setup a cron to regularly update your local cache. -### Public Suffix Resolver - - -#### Public Suffix and Domain Resolution +### Domain Resolution ~~~php Date: Mon, 11 Dec 2017 17:58:41 +0100 Subject: [PATCH 055/461] improve documentation --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 393ce016..8cdbac10 100644 --- a/README.md +++ b/README.md @@ -363,8 +363,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -Portions of the PublicSuffixListManager and the DomainParser are derivative -works of the PHP +Portions of the `Pdp\Converter` and `Pdp\Rules` are derivative works of the PHP [registered-domain-libs](https://github.com/usrflo/registered-domain-libs). Those parts of this codebase are heavily commented, and I've included a copy of the Apache Software Foundation License 2.0 in this project. From 12029395f152dee8a1b037d8ea3a4fd67098185b Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 11 Dec 2017 18:24:42 +0100 Subject: [PATCH 056/461] improve code --- src/Domain.php | 9 --------- src/Manager.php | 4 +++- src/PublicSuffix.php | 11 ++--------- src/Rules.php | 4 +--- 4 files changed, 6 insertions(+), 22 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 39b184cb..b53615cb 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -181,9 +181,6 @@ public function getDomain() * * This method should return null if the registrable domain is the same as the public suffix. * - * @see https://publicsuffix.org/list/ - * @see https://raw.githubusercontent.com/publicsuffix/list/master/tests/test_psl.txt - * * @return string|null registrable domain */ public function getRegistrableDomain() @@ -219,8 +216,6 @@ public function getPublicSuffix() /** * Tells whether the public suffix has a matching rule in a Public Suffix List. * - * @see https://publicsuffix.org/learn/ - * * @return bool */ public function isKnown(): bool @@ -231,8 +226,6 @@ public function isKnown(): bool /** * Tells whether the public suffix has a matching rule in a Public Suffix List ICANN Section. * - * @see https://publicsuffix.org/learn/ - * * @return bool */ public function isICANN(): bool @@ -243,8 +236,6 @@ public function isICANN(): bool /** * Tells whether the public suffix has a matching rule in a Public Suffix List Private Section. * - * @see https://publicsuffix.org/learn/ - * * @return bool */ public function isPrivate(): bool diff --git a/src/Manager.php b/src/Manager.php index 61e6cbf1..d42d31b8 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -104,6 +104,8 @@ public function refreshRules(string $source_url = self::PSL_URL): bool return false; } - return $this->cache->set($this->getCacheKey($source_url), json_encode($rules)); + $cacheKey = $this->getCacheKey($source_url); + + return $this->cache->set($cacheKey, json_encode($rules)); } } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index ab9bf956..fb0af46e 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -24,9 +24,8 @@ * it for this purpose, please do not bake static copies of the PSL into your * software with no update mechanism." * - * @author Ignace Nyamagana Butera - * - * @internal + * @author Ignace Nyamagana Butera + * @internal used internally to represent a public suffix */ final class PublicSuffix implements Countable { @@ -77,8 +76,6 @@ public function count() /** * Tells whether the public suffix has a matching rule in a Public Suffix List. * - * @see https://publicsuffix.org/learn/ - * * @return bool */ public function isKnown(): bool @@ -89,8 +86,6 @@ public function isKnown(): bool /** * Tells whether the public suffix has a matching rule in a Public Suffix List ICANN Section. * - * @see https://publicsuffix.org/learn/ - * * @return bool */ public function isICANN(): bool @@ -101,8 +96,6 @@ public function isICANN(): bool /** * Tells whether the public suffix has a matching rule in a Public Suffix List Private Section. * - * @see https://publicsuffix.org/learn/ - * * @return bool */ public function isPrivate(): bool diff --git a/src/Rules.php b/src/Rules.php index bc5b9682..108c20af 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -86,7 +86,7 @@ private function isMatchable($domain): bool * * "The domain must be canonicalized in the normal way for hostnames - lower-case, Punycode." * - * @see http://www.ietf.org/rfc/rfc3492.txt + * @see https://tools.ietf.org/html/rfc3492 * * @param string $domain * @@ -118,7 +118,6 @@ private function findPublicSuffix(string $type, string $domain): PublicSuffix { $normalizedDomain = $this->normalize($domain); $reverseLabels = array_reverse(explode('.', $normalizedDomain)); - $resultIcann = $this->findPublicSuffixFromSection(self::ICANN_DOMAINS, $reverseLabels); if (self::ICANN_DOMAINS === $type) { return $resultIcann; @@ -193,7 +192,6 @@ private function handleNoMatches(string $domain): PublicSuffix { $labels = explode('.', $domain); $publicSuffix = array_pop($labels); - if ($this->isPunycoded($domain)) { return new PublicSuffix($publicSuffix); } From bd920e953c1a8d6dde6f3ecb25d0812815669b77 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 12 Dec 2017 09:12:27 +0100 Subject: [PATCH 057/461] adding Converter to documentation --- README.md | 217 +++++++++++++++++++++++++++---------------------- src/Domain.php | 4 +- src/Rules.php | 2 +- 3 files changed, 125 insertions(+), 98 deletions(-) diff --git a/README.md b/README.md index 8cdbac10..2f2db6bc 100644 --- a/README.md +++ b/README.md @@ -44,8 +44,127 @@ $ composer require jeremykendall/php-domain-parser Documentation -------- +### Public Suffix List conversion + +~~~php +convert($raw); +$rules = new Rules($arr_rules); +~~~ + +### Domain name resolution + +~~~php +Domain::isKnown status depends on the PSL rules used. For the same domain, depending on the rules used a domain public suffix may be known or not.

+ +~~~php +convert($raw); +$rules = new Rules($arr); + +$domain = $rules->resolve('www.ulb.ac.be'); +$domain->getDomain(); //returns 'www.ulb.ac.be' +$domain->getPublicSuffix(); //returns 'ac.be' +$domain->getRegistrableDomain(); //returns 'ulb.ac.be' +$domain->getSubDomain(); //returns 'www' +$domain->isKnown(); //returns true +$domain->isICANN(); //returns true +$domain->isPrivate(); //returns false +echo json_encode($domain, JSON_PRETTY_PRINT); +// returns +// { +// "domain": "www.ulb.ac.be", +// "registrableDomain": "ulb.ac.be", +// "subDomain": "www", +// "publicSuffix": "ac.be", +// "isKnown": true, +// "isICANN": true, +// "isPrivate": false +// } + +//let's resolve the same domain against the PRIVATE DOMAIN SECTION + +$domain = $rules->resolve('www.ulb.ac.be', Rules::PRIVATE_DOMAINS); +$domain->getDomain(); //returns 'www.ulb.ac.be' +$domain->getPublicSuffix(); //returns 'be' +$domain->getRegistrableDomain(); //returns 'ac.be' +$domain->getSubDomain(); //returns 'www.ulb' +$domain->isKnown(); //returns false +$domain->isICANN(); //returns false +$domain->isPrivate(); //returns false +~~~ + +

Warning: Some people use the PSL to determine what is a valid domain name and what isn't. This is dangerous, particularly in these days where new gTLDs are arriving at a rapid pace, if your software does not regularly receive PSL updates, it may erroneously think new gTLDs are not known. The DNS is the proper source for this information. If you must use it for this purpose, please do not bake static copies of the PSL into your software with no update mechanism.

+ ### Public Suffix List Maintenance +**Directly fetching the Public Suffix List without caching the result is not recommend** . For that reason, the package comes bundle with a `Pdp\Manager` class which retrieves, convert and cache the Public Suffix List for you. + + ~~~php getSubDomain(); //returns 'nl.shop' $domain->isKnown(); //returns false ~~~ -In any case, you should setup a cron to regularly update your local cache. - - -### Domain Resolution - -~~~php -Domain::isKnown status depends on the PSL rules used. For the same domain, depending on the rules used a domain public suffix may be known or not.

- -~~~php -getRules('https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat'); -//$rules is a Pdp\Rules object - -$domain = $rules->resolve('www.ulb.ac.be'); -$domain->getDomain(); //returns 'www.ulb.ac.be' -$domain->getPublicSuffix(); //returns 'ac.be' -$domain->getRegistrableDomain(); //returns 'ulb.ac.be' -$domain->getSubDomain(); //returns 'www' -$domain->isKnown(); //returns true -$domain->isICANN(); //returns true -$domain->isPrivate(); //returns false -echo json_encode($domain, JSON_PRETTY_PRINT); -// returns -// { -// "domain": "www.ulb.ac.be", -// "registrableDomain": "ulb.ac.be", -// "subDomain": "www", -// "publicSuffix": "ac.be", -// "isKnown": true, -// "isICANN": true, -// "isPrivate": false -// } - -//let's resolve the same domain against the PRIVATE DOMAIN SECTION - -$domain = $rules->resolve('www.ulb.ac.be', Rules::PRIVATE_DOMAINS); -$domain->getDomain(); //returns 'www.ulb.ac.be' -$domain->getPublicSuffix(); //returns 'be' -$domain->getRegistrableDomain(); //returns 'ac.be' -$domain->getSubDomain(); //returns 'www.ulb' -$domain->isKnown(); //returns false -$domain->isICANN(); //returns false -$domain->isPrivate(); //returns false -~~~ - -

Warning: Some people use the PSL to determine what is a valid domain name and what isn't. This is dangerous, particularly in these days where new gTLDs are arriving at a rapid pace, if your software does not regularly receive PSL updates, it may erroneously think new gTLDs are not known. The DNS is the proper source for this information. If you must use it for this purpose, please do not bake static copies of the PSL into your software with no update mechanism.

+In any case, you should setup a reccurent job to regularly update your local cache. Contributing ------- diff --git a/src/Domain.php b/src/Domain.php index b53615cb..72cc4d1f 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -55,10 +55,10 @@ final class Domain implements JsonSerializable * @param string|null $domain * @param PublicSuffix $publicSuffix */ - public function __construct($domain = null, PublicSuffix $publicSuffix) + public function __construct($domain = null, PublicSuffix $publicSuffix = null) { $this->domain = $domain; - $this->publicSuffix = $publicSuffix; + $this->publicSuffix = $publicSuffix ?? new PublicSuffix(); $this->registrableDomain = $this->setRegistrableDomain(); $this->subDomain = $this->setSubDomain(); } diff --git a/src/Rules.php b/src/Rules.php index 108c20af..8dc82857 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -55,7 +55,7 @@ public function resolve(string $domain = null, string $type = self::ALL_DOMAINS) } if (!$this->isMatchable($domain)) { - return new Domain(null, new PublicSuffix()); + return new Domain(); } $publicSuffix = $this->findPublicSuffix($type, $domain); From 68b646199275ff3dea474d86ccfaa1850edc5197 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 12 Dec 2017 10:20:42 +0100 Subject: [PATCH 058/461] improve documentation --- README.md | 41 +++++++++++++++++++++++++---------------- composer.json | 3 ++- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 2f2db6bc..f58edc3b 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,15 @@ $ composer require jeremykendall/php-domain-parser Documentation -------- -### Public Suffix List conversion +### Domain name resolution + + +In order to resolve a domain name we must: + +- Convert the Public Suffix List into a structure usable in PHP +- Resolve the domain against the given PSL rules + +Conversion is done using the `Pdp\Converter` class. ~~~php convert($raw); -$rules = new Rules($arr_rules); ~~~ -### Domain name resolution +Once the PSL has been converted we can feed its data to a `Pdp\Rules` object which is responsible for resolving a given domain name against the PSL rules. ~~~php Domain::isKnown status depends on the PSL rules used. For the same domain, depending on the rules used a domain public suffix may be known or not.

+**Warning:** `Domain::isKnown`, `Domain::isICANN` status depends on the PSL rules used. +For the same domain, depending on the rules used a domain public suffix status may be known or not, may be ICANN or not. ~~~php convert($raw); $rules = new Rules($arr); -$domain = $rules->resolve('www.ulb.ac.be'); +$domain = $rules->resolve('www.ulb.ac.be'); //using Rules::ALL_DOMAINS $domain->getDomain(); //returns 'www.ulb.ac.be' $domain->getPublicSuffix(); //returns 'ac.be' $domain->getRegistrableDomain(); //returns 'ulb.ac.be' @@ -158,12 +171,11 @@ $domain->isICANN(); //returns false $domain->isPrivate(); //returns false ~~~ -

Warning: Some people use the PSL to determine what is a valid domain name and what isn't. This is dangerous, particularly in these days where new gTLDs are arriving at a rapid pace, if your software does not regularly receive PSL updates, it may erroneously think new gTLDs are not known. The DNS is the proper source for this information. If you must use it for this purpose, please do not bake static copies of the PSL into your software with no update mechanism.

+**Warning:** Some people use the PSL to determine what is a valid domain name and what isn't. This is dangerous, particularly in these days where new gTLDs are arriving at a rapid pace, if your software does not regularly receive PSL updates, it may erroneously think new gTLDs are not known. The DNS is the proper source for this information. If you must use it for this purpose, please do not bake static copies of the PSL into your software with no update mechanism. ### Public Suffix List Maintenance -**Directly fetching the Public Suffix List without caching the result is not recommend** . For that reason, the package comes bundle with a `Pdp\Manager` class which retrieves, convert and cache the Public Suffix List for you. - +**Directly fetching the Public Suffix List without caching the result is not recommend**. For that reason, the package comes bundle with a `Pdp\Manager` class which retrieves, converts and caches the Public Suffix List for you as well as create a `Pdp\Rules` object on demand. ~~~php Date: Tue, 12 Dec 2017 11:03:19 +0100 Subject: [PATCH 059/461] yoda style --- README.md | 2 +- src/Cache.php | 10 +++++----- src/Converter.php | 10 +++++----- src/CurlHttpClient.php | 12 ++++++------ src/Domain.php | 4 ++-- src/Manager.php | 4 +--- src/Rules.php | 28 ++++++++++++++-------------- 7 files changed, 34 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index f58edc3b..641298de 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ use Pdp\Converter; $content = file_get_contents('https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat'); $converter = new Converter(); -$arr_rules = $converter->convert($raw); +$arr_rules = $converter->convert($content); ~~~ Once the PSL has been converted we can feed its data to a `Pdp\Rules` object which is responsible for resolving a given domain name against the PSL rules. diff --git a/src/Cache.php b/src/Cache.php index 877b47c3..44c28ee7 100644 --- a/src/Cache.php +++ b/src/Cache.php @@ -72,7 +72,7 @@ public function get($key, $default = null) { $path = $this->getPath($key); $expires_at = @filemtime($path); - if ($expires_at === false) { + if (false === $expires_at) { return $default; // file not found } @@ -83,16 +83,16 @@ public function get($key, $default = null) } $data = @file_get_contents($path); - if ($data === false) { + if (false === $data) { return $default; // race condition: file not found } - if ($data === 'b:0;') { + if ('b:0;' === $data) { return false; // because we can't otherwise distinguish a FALSE return-value from unserialize() } $value = @unserialize($data); - if ($value === false) { + if (false === $value) { return $default; // unserialize() failed } @@ -152,7 +152,7 @@ private function getExpireAt($ttl): int return date_create_immutable('@'.time())->add($ttl)->getTimestamp(); } - if ($ttl === null) { + if (null === $ttl) { return time() + self::CACHE_TTL; } diff --git a/src/Converter.php b/src/Converter.php index 21a0f27b..d4079802 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -55,19 +55,19 @@ public function convert(string $content): array */ private function getSection(string $section, string $line): string { - if ($section == '' && strpos($line, '// ===BEGIN ICANN DOMAINS===') === 0) { + if ('' === $section && 0 === strpos($line, '// ===BEGIN ICANN DOMAINS===')) { return Rules::ICANN_DOMAINS; } - if ($section == Rules::ICANN_DOMAINS && strpos($line, '// ===END ICANN DOMAINS===') === 0) { + if (Rules::ICANN_DOMAINS === $section && 0 === strpos($line, '// ===END ICANN DOMAINS===')) { return ''; } - if ($section == '' && strpos($line, '// ===BEGIN PRIVATE DOMAINS===') === 0) { + if ('' === $section && 0 === strpos($line, '// ===BEGIN PRIVATE DOMAINS===')) { return Rules::PRIVATE_DOMAINS; } - if ($section == Rules::PRIVATE_DOMAINS && strpos($line, '// ===END PRIVATE DOMAINS===') === 0) { + if (Rules::PRIVATE_DOMAINS === $section && 0 === strpos($line, '// ===END PRIVATE DOMAINS===')) { return ''; } @@ -101,7 +101,7 @@ private function addRule(array $list, array $rule_parts): array $part = idn_to_ascii($part, 0, INTL_IDNA_VARIANT_UTS46); $isDomain = true; - if (strpos($part, '!') === 0) { + if (0 === strpos($part, '!')) { $part = substr($part, 1); $isDomain = false; } diff --git a/src/CurlHttpClient.php b/src/CurlHttpClient.php index 62690369..43925c04 100644 --- a/src/CurlHttpClient.php +++ b/src/CurlHttpClient.php @@ -38,13 +38,13 @@ public function getContent(string $url): string CURLOPT_URL => $url, ]); $content = curl_exec($curl); - if (CURLE_OK !== ($code = curl_errno($curl))) { - $message = curl_error($curl); - curl_close($curl); - throw new HttpClientException($message, $code); - } + $code = curl_errno($curl); + $message = curl_error($curl); curl_close($curl); + if (CURLE_OK === $code) { + return $content; + } - return $content; + throw new HttpClientException($message, $code); } } diff --git a/src/Domain.php b/src/Domain.php index 72cc4d1f..24c88944 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -70,7 +70,7 @@ public function __construct($domain = null, PublicSuffix $publicSuffix = null) */ private function setRegistrableDomain() { - if (strpos((string) $this->domain, '.') === false) { + if (false === strpos((string) $this->domain, '.')) { return null; } @@ -95,7 +95,7 @@ private function setRegistrableDomain() private function normalize(string $domain) { $func = 'idn_to_utf8'; - if (strpos($domain, 'xn--') !== false) { + if (false !== strpos($domain, 'xn--')) { $func = 'idn_to_ascii'; } diff --git a/src/Manager.php b/src/Manager.php index d42d31b8..a483e50a 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -96,10 +96,8 @@ private function getCacheKey(string $str): string */ public function refreshRules(string $source_url = self::PSL_URL): bool { - static $converter; - $converter = $converter ?? new Converter(); $content = $this->http->getContent($source_url); - $rules = $converter->convert($content); + $rules = (new Converter())->convert($content); if (empty($rules[Rules::ICANN_DOMAINS]) || empty($rules[Rules::PRIVATE_DOMAINS])) { return false; } diff --git a/src/Rules.php b/src/Rules.php index 8dc82857..440339e0 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -58,7 +58,7 @@ public function resolve(string $domain = null, string $type = self::ALL_DOMAINS) return new Domain(); } - $publicSuffix = $this->findPublicSuffix($type, $domain); + $publicSuffix = $this->findPublicSuffix($domain, $type); if (null === $publicSuffix->getContent()) { return new Domain($domain, $this->handleNoMatches($domain)); } @@ -75,7 +75,7 @@ public function resolve(string $domain = null, string $type = self::ALL_DOMAINS) */ private function isMatchable($domain): bool { - return $domain !== null + return null !== $domain && strpos($domain, '.') > 0 && strlen($domain) === strcspn($domain, '][') && !filter_var($domain, FILTER_VALIDATE_IP); @@ -109,21 +109,21 @@ private function normalize(string $domain): string /** * Returns the matched public suffix. * - * @param string $type * @param string $domain + * @param string $type * * @return PublicSuffix */ - private function findPublicSuffix(string $type, string $domain): PublicSuffix + private function findPublicSuffix(string $domain, string $type): PublicSuffix { $normalizedDomain = $this->normalize($domain); $reverseLabels = array_reverse(explode('.', $normalizedDomain)); - $resultIcann = $this->findPublicSuffixFromSection(self::ICANN_DOMAINS, $reverseLabels); + $resultIcann = $this->findPublicSuffixFromSection($reverseLabels, self::ICANN_DOMAINS); if (self::ICANN_DOMAINS === $type) { return $resultIcann; } - $resultPrivate = $this->findPublicSuffixFromSection(self::PRIVATE_DOMAINS, $reverseLabels); + $resultPrivate = $this->findPublicSuffixFromSection($reverseLabels, self::PRIVATE_DOMAINS); if (count($resultPrivate) > count($resultIcann)) { return $resultPrivate; } @@ -138,12 +138,12 @@ private function findPublicSuffix(string $type, string $domain): PublicSuffix /** * Returns the public suffix matched against a given PSL section. * - * @param string $type * @param array $labels + * @param string $type * * @return PublicSuffix */ - private function findPublicSuffixFromSection(string $type, array $labels): PublicSuffix + private function findPublicSuffixFromSection(array $labels, string $type): PublicSuffix { $rules = $this->rules[$type]; $matches = []; @@ -155,7 +155,7 @@ private function findPublicSuffixFromSection(string $type, array $labels): Publi //match wildcard rule if (isset($rules['*'])) { - array_unshift($matches, $label); + $matches[] = $label; break; } @@ -169,16 +169,16 @@ private function findPublicSuffixFromSection(string $type, array $labels): Publi break; } - array_unshift($matches, $label); + $matches[] = $label; $rules = $rules[$label]; } - $found = array_filter($matches, 'strlen'); - if (empty($found)) { + $foundLabels = array_reverse(array_filter($matches, 'strlen')); + if (empty($foundLabels)) { return new PublicSuffix(); } - return new PublicSuffix(implode('.', $found), $type); + return new PublicSuffix(implode('.', $foundLabels), $type); } /** @@ -213,7 +213,7 @@ private function handleNoMatches(string $domain): PublicSuffix */ private function isPunycoded(string $domain): bool { - return strpos($domain, 'xn--') !== false; + return false !== strpos($domain, 'xn--'); } /** From d5ff1a44670455680395b0b65dee6da65175497b Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 12 Dec 2017 11:30:14 +0100 Subject: [PATCH 060/461] improve documentation --- README.md | 83 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 46 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 641298de..a81eb6b4 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ Documentation In order to resolve a domain name we must: -- Convert the Public Suffix List into a structure usable in PHP +- Convert the Public Suffix List (PSL) into a structure usable in PHP - Resolve the domain against the given PSL rules Conversion is done using the `Pdp\Converter` class. @@ -65,19 +65,9 @@ final class Converter } ~~~ -The `Pdp\Converter::convert` method expect the raw content of a public suffix list and returns its `array` representation. +The `Pdp\Converter::convert` method expects the raw content of a PSL and returns its `array` representation. -~~~php -convert($content); -~~~ - -Once the PSL has been converted we can feed its data to a `Pdp\Rules` object which is responsible for resolving a given domain name against the PSL rules. +Once the PSL has been converted we can feed its data to a `Pdp\Rules` object which is responsable for resolving a given domain name against the PSL rules. ~~~php resolve('www.ulb.ac.be', Rules::PRIVATE_DOMAINS); -$domain->getDomain(); //returns 'www.ulb.ac.be' -$domain->getPublicSuffix(); //returns 'be' -$domain->getRegistrableDomain(); //returns 'ac.be' -$domain->getSubDomain(); //returns 'www.ulb' -$domain->isKnown(); //returns false -$domain->isICANN(); //returns false -$domain->isPrivate(); //returns false +echo json_encode($domain, JSON_PRETTY_PRINT); +// returns +// { +// "domain": "www.ulb.ac.be", +// "registrableDomain": "ac.be", +// "subDomain": "www.ulb", +// "publicSuffix": "be", +// "isKnown": false, +// "isICANN": false, +// "isPrivate": false +// } ~~~ -**Warning:** Some people use the PSL to determine what is a valid domain name and what isn't. This is dangerous, particularly in these days where new gTLDs are arriving at a rapid pace, if your software does not regularly receive PSL updates, it may erroneously think new gTLDs are not known. The DNS is the proper source for this information. If you must use it for this purpose, please do not bake static copies of the PSL into your software with no update mechanism. +**Warning: While the above example works it is highly discouraged to use the library in a productive application this way, without a caching mechanism to load the PSL.** + +**Warning: `Domain::isKnown`, `Domain::isICANN` status depends on the PSL rules used. For the same domain, depending on the rules used a domain public suffix status may be known or not, may be ICANN or not.** + +**Warning: Some people use the PSL to determine what is a valid domain name and what isn't. This is dangerous, particularly in these days where new gTLDs are arriving at a rapid pace, if your software does not regularly receive PSL updates, it may erroneously think new gTLDs are not known. The DNS is the proper source for this information. If you must use it for this purpose, please do not bake static copies of the PSL into your software with no update mechanism.** ### Public Suffix List Maintenance -**Directly fetching the Public Suffix List without caching the result is not recommend**. For that reason, the package comes bundle with a `Pdp\Manager` class which retrieves, converts and caches the Public Suffix List for you as well as create a `Pdp\Rules` object on demand. +**Directly fetching the PSL without caching the result is not recommend**. For that reason, the library comes bundle with a `Pdp\Manager` class. This class is a service which enables resolving domain name without the constant network overhead of continously downloading the PSL. The class retrieves, converts and caches the PSL as well as creates the corresponding `Pdp\Rules` object on demand. It uses internally a `Pdp\Converter` object to convert the fetched PSL into its `array` representation when required. ~~~php getRules('https://publicsuffix.org/list/public_suffix_list.dat'); -$domain = $rules->resolve('www.bébé.be'); +$rules = $manager->getRules('https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat'); +$domain = $rules->resolve('www.ulb.ac.be'); +echo json_encode($domain, JSON_PRETTY_PRINT); +// returns +// { +// "domain": "www.ulb.ac.be", +// "registrableDomain": "ulb.ac.be", +// "subDomain": "www", +// "publicSuffix": "ac.be", +// "isKnown": true, +// "isICANN": true, +// "isPrivate": false +// } ~~~ #### Refreshing the cached rules -This method enables refreshing your local copy of the PSL stored with your [PSR-16](http://www.php-fig.org/psr/psr-16/) Cache and retrieved using the Http Client. By default the method will use the `Manager::PSL_URL` as the source URL but you are free to substitute this URL with your own. +The `Manager::refreshRules` method enables refreshing your local copy of the PSL stored with your [PSR-16](http://www.php-fig.org/psr/psr-16/) Cache and retrieved using the Http Client. By default the method will use the `Manager::PSL_URL` as the source URL but you are free to substitute this URL with your own. The method returns a boolean value which is `true` on success. ~~~php @@ -271,12 +275,17 @@ use Pdp\CurlHttpClient; use Pdp\Manager; $manager = new Manager(new Cache(), new CurlHttpClient()); -$manager->refreshRules('https://publicsuffix.org/list/public_suffix_list.dat'); +$res = $manager->refreshRules('https://publicsuffix.org/list/public_suffix_list.dat'); +if ($res === true) { + //the local cache has been updated +} else { + //the local cache has not been updated +} ~~~ ## Automatic Updates -It is important to always have an up to date PSL ICANN Section. In order to do so the library comes bundle with an auto-update script located in the `bin` directory. +It is important to always have an up to date PSL. In order to do so the library comes bundle with an auto-update script located in the `bin` directory. ~~~bash $ php ./bin/update-psl @@ -293,7 +302,7 @@ If you prefer using your own implementations you should: 1. Copy the `Pdp\Installer` class 2. Adapt its code to reflect your requirements. -In any cases your are required to update regularly your PSL information with your chosen script to keep your data up to date. +In any case, your are required to update regularly your PSL information with your chosen script to keep your data up to date. For example, below I'm using the `Manager` with From c5a5197a7b8dfa98e06d7fb5d09b70e707b3da94 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 12 Dec 2017 17:29:12 +0100 Subject: [PATCH 061/461] Improve CurlHttpClient --- README.md | 38 +++++++++++++++++++++++++--------- src/CurlHttpClient.php | 40 ++++++++++++++++++++++++++++++------ tests/CurlHttpClientTest.php | 26 ++++++++--------------- 3 files changed, 71 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index a81eb6b4..ce8a92ed 100644 --- a/README.md +++ b/README.md @@ -47,10 +47,10 @@ Documentation ### Domain name resolution -In order to resolve a domain name we must: +In order to resolve a domain name one we must: - Convert the Public Suffix List (PSL) into a structure usable in PHP -- Resolve the domain against the given PSL rules +- Resolve the domain name against the PSL rules Conversion is done using the `Pdp\Converter` class. @@ -67,7 +67,7 @@ final class Converter The `Pdp\Converter::convert` method expects the raw content of a PSL and returns its `array` representation. -Once the PSL has been converted we can feed its data to a `Pdp\Rules` object which is responsable for resolving a given domain name against the PSL rules. +Once the PSL has been converted we can feed its data to a `Pdp\Rules` object which is responsable for resolving a given domain name against its rules. ~~~php resolve('www.ulb.ac.be', Rules::PRIVATE_DOMAINS); echo json_encode($domain, JSON_PRETTY_PRINT); @@ -160,15 +178,15 @@ echo json_encode($domain, JSON_PRETTY_PRINT); // } ~~~ -**Warning: While the above example works it is highly discouraged to use the library in a productive application this way, without a caching mechanism to load the PSL.** +**WARNING:** -**Warning: `Domain::isKnown`, `Domain::isICANN` status depends on the PSL rules used. For the same domain, depending on the rules used a domain public suffix status may be known or not, may be ICANN or not.** +**Yous should never user the library this way in a productive application, without at least a caching mechanism to load the PSL.** -**Warning: Some people use the PSL to determine what is a valid domain name and what isn't. This is dangerous, particularly in these days where new gTLDs are arriving at a rapid pace, if your software does not regularly receive PSL updates, it may erroneously think new gTLDs are not known. The DNS is the proper source for this information. If you must use it for this purpose, please do not bake static copies of the PSL into your software with no update mechanism.** +**Some people use the PSL to determine what is a valid domain name and what isn't. This is dangerous, particularly in these days where new gTLDs are arriving at a rapid pace, if your software does not regularly receive PSL updates, it may erroneously think new gTLDs are not known. The DNS is the proper source for this information. If you must use it for this purpose, please do not bake static copies of the PSL into your software with no update mechanism.** ### Public Suffix List Maintenance -**Directly fetching the PSL without caching the result is not recommend**. For that reason, the library comes bundle with a `Pdp\Manager` class. This class is a service which enables resolving domain name without the constant network overhead of continously downloading the PSL. The class retrieves, converts and caches the PSL as well as creates the corresponding `Pdp\Rules` object on demand. It uses internally a `Pdp\Converter` object to convert the fetched PSL into its `array` representation when required. +Since **directly fetching the PSL without caching the result is not recommend**, the library comes bundle with a `Pdp\Manager` class. This class is a service which enables resolving domain name without the constant network overhead of continously downloading the PSL. The class retrieves, converts and caches the PSL as well as creates the corresponding `Pdp\Rules` object on demand. It internally uses a `Pdp\Converter` object to convert the fetched PSL into its `array` representation when required. ~~~php options = $options + [ CURLOPT_FAILONERROR => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_RETURNTRANSFER => true, - CURLOPT_URL => $url, - ]); + CURLOPT_HTTPGET => true, + ]; + + $curl = curl_init(); + $res = @curl_setopt_array($curl, $this->options); + curl_close($curl); + if (!$res) { + throw new InvalidArgumentException('Please verify your curl additionnal options'); + } + } + + /** + * {@inheritdoc} + */ + public function getContent(string $url): string + { + $options = $this->options; + $options[CURLOPT_URL] = $url; + $curl = curl_init(); + curl_setopt_array($curl, $options); $content = curl_exec($curl); $code = curl_errno($curl); $message = curl_error($curl); diff --git a/tests/CurlHttpClientTest.php b/tests/CurlHttpClientTest.php index c3b784f8..74dad1cf 100644 --- a/tests/CurlHttpClientTest.php +++ b/tests/CurlHttpClientTest.php @@ -4,30 +4,16 @@ namespace pdp\tests; +use InvalidArgumentException; use Pdp\CurlHttpClient; use Pdp\HttpClientException; use PHPUnit\Framework\TestCase; class CurlHttpClientTest extends TestCase { - /** - * @var HttpClient - */ - protected $adapter; - - protected function setUp() - { - $this->adapter = new CurlHttpClient(); - } - - protected function tearDown() - { - $this->adapter = null; - } - public function testGetContent() { - $content = $this->adapter->getContent('https://www.google.com'); + $content = (new CurlHttpClient())->getContent('https://www.google.com'); $this->assertNotNull($content); $this->assertContains('google', $content); } @@ -35,6 +21,12 @@ public function testGetContent() public function testThrowsException() { $this->expectException(HttpClientException::class); - $this->adapter->getContent('https://qsfsdfqdf.dfsf'); + (new CurlHttpClient())->getContent('https://qsfsdfqdf.dfsf'); + } + + public function testConstructorThrowsException() + { + $this->expectException(InvalidArgumentException::class); + new CurlHttpClient(['foo' => 'bar']); } } From 91d24af42671ae60286374276d5cfdb504d482d8 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 12 Dec 2017 18:21:33 +0100 Subject: [PATCH 062/461] improve documentation --- README.md | 64 ++++++++++++++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index ce8a92ed..420dbccc 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ In order to resolve a domain name one we must: - Convert the Public Suffix List (PSL) into a structure usable in PHP - Resolve the domain name against the PSL rules -Conversion is done using the `Pdp\Converter` class. +PSL Conversion is done using the `Pdp\Converter` class. ~~~php resolve('www.ulb.ac.be', Rules::PRIVATE_DOMAINS); echo json_encode($domain, JSON_PRETTY_PRINT); @@ -180,13 +178,13 @@ echo json_encode($domain, JSON_PRETTY_PRINT); **WARNING:** -**Yous should never user the library this way in a productive application, without at least a caching mechanism to load the PSL.** +**As already stated, you should never user the library this way in a productive application, without at least a caching mechanism to load the PSL.** **Some people use the PSL to determine what is a valid domain name and what isn't. This is dangerous, particularly in these days where new gTLDs are arriving at a rapid pace, if your software does not regularly receive PSL updates, it may erroneously think new gTLDs are not known. The DNS is the proper source for this information. If you must use it for this purpose, please do not bake static copies of the PSL into your software with no update mechanism.** ### Public Suffix List Maintenance -Since **directly fetching the PSL without caching the result is not recommend**, the library comes bundle with a `Pdp\Manager` class. This class is a service which enables resolving domain name without the constant network overhead of continously downloading the PSL. The class retrieves, converts and caches the PSL as well as creates the corresponding `Pdp\Rules` object on demand. It internally uses a `Pdp\Converter` object to convert the fetched PSL into its `array` representation when required. +Since **directly fetching the PSL without caching the result is not recommend**, the library comes bundle with a service which enables resolving domain name without the constant network overhead of continously downloading the PSL. The `Pdp\Manager` class retrieves, converts and caches the PSL as well as creates the corresponding `Pdp\Rules` object on demand. It internally uses a `Pdp\Converter` object to convert the fetched PSL into its `array` representation when required. ~~~php refreshRules('https://publicsuffix.org/list/public_suffix_list.dat'); -if ($res === true) { +$retval = $manager->refreshRules('https://publicsuffix.org/list/public_suffix_list.dat'); +if ($retval) { //the local cache has been updated } else { //the local cache has not been updated } ~~~ -## Automatic Updates +### Automatic Updates It is important to always have an up to date PSL. In order to do so the library comes bundle with an auto-update script located in the `bin` directory. @@ -309,11 +307,11 @@ It is important to always have an up to date PSL. In order to do so the library $ php ./bin/update-psl ~~~ -This script requires that: +This script requires: -- the PHP `curl` extension +- The PHP `curl` extension - The `Pdp\Installer` class which comes bundle with this package -- The use of the Cache and HTTP Client implementations bundle with the package. +- The use of the Cache and HTTP Client implementations bundle with this package. If you prefer using your own implementations you should: @@ -376,8 +374,6 @@ $domain->getSubDomain(); //returns 'nl.shop' $domain->isKnown(); //returns false ~~~ -In any case, you should setup a reccurent job to regularly update your local cache. - Contributing ------- From 41793750cfc549df5ad5271143231bcf2a919dc0 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 13 Dec 2017 08:59:51 +0100 Subject: [PATCH 063/461] bug fix Rules and CurlHttpClient --- README.md | 28 ++++++++++++++-------------- src/CurlHttpClient.php | 4 +--- src/Rules.php | 7 +------ tests/CurlHttpClientTest.php | 4 ++-- 4 files changed, 18 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 420dbccc..210c9627 100644 --- a/README.md +++ b/README.md @@ -87,13 +87,13 @@ final class Rules Domain name resolution is done using the `Pdp\Rules::resolve` method which expects at most two parameters: -- `$domain` a valid domain name as a string -- `$type` a string to optionnally specify which section of the PSL you want to validate the given domain against. The possible values are: +- `$domain` a domain name as a string +- `$type` a string which specifies which section of the PSL you want to validate the given domain against. The possible values are: - `Rules::ALL_DOMAINS`, to validate against the full PSL. - - `Rules::ICANN_DOMAINS`, to validate against the PSL ICANN section only. - - `Rules::PRIVATE_DOMAINS`, to validate against the PSL PRIVATE section only. + - `Rules::ICANN_DOMAINS`, to validate against the PSL ICANN DOMAINS section only. + - `Rules::PRIVATE_DOMAINS`, to validate against the PSL PRIVATE DOMAINS section only. - By default, the `$type` argument is equal to `Rules::ALL_DOMAINS`. If an unrecognized section is submitted otherwise, a `Pdp\Exception` exception will be thrown. + By default, the `$type` argument is equal to `Rules::ALL_DOMAINS`. If an unsupported section is submitted otherwise, a `Pdp\Exception` exception will be thrown. The `Pdp\Rules::resolve` returns a `Pdp\Domain` object. @@ -118,15 +118,15 @@ The `Pdp\Domain` getter methods returns: - the submitted domain name using `Pdp\Domain::getDomain` - the public suffix part normalized according to the domain using `Pdp\Domain::getPublicSuffix` - the registrable domain part using `Pdp\Domain::getRegistrableDomain` -- the subdomain part usung `Pdp\Domain::getSubDomain`. +- the subdomain part using `Pdp\Domain::getSubDomain`. If the domain name or some of its part are seriously malformed or unrecognized, the getter methods will return `null`. -**The Domain name public status status depends on the PSL section used to resolve them:** +**The Domain name status depends on the PSL section used to resolve it:** -- `Pdp\Domain::isKnown` returns `true` if the public suffix is found in the selected PSL -- `Pdp\Domain::isICANN` returns `true` if the domain name resolution is done against a PSL which includes the ICANN DOMAINS section and its public suffix is found in it; -- `Pdp\Domain::isPrivate` returns `true` if the domain name resolution is done against a PSL which includes the PRIVATE DOMAINS section and its public suffix is found in it; +- `Pdp\Domain::isKnown` returns `true` if the public suffix is found in the selected PSL; +- `Pdp\Domain::isICANN` returns `true` if the public suffix is found in a selected PSL which includes the ICANN DOMAINS section; +- `Pdp\Domain::isPrivate` returns `true` if the public suffix is found in a selected PSL which includes the PRIVATE DOMAINS section; **THIS EXAMPLE ILLUSTRATES HOW EACH OBJECT IS USED BUT SHOULD BE AVOID IN A PRODUCTIVE ENVIRONMENT** @@ -137,8 +137,8 @@ use Pdp\Converter; use Pdp\Rules; $content = file_get_contents('https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat'); -$arr = (new Converter())->convert($raw); -$rules = new Rules($arr); +$arr_rules = (new Converter())->convert($content); +$rules = new Rules($arr_rules); $domain = $rules->resolve('www.ulb.ac.be'); //using Rules::ALL_DOMAINS $domain->getDomain(); //returns 'www.ulb.ac.be' @@ -278,9 +278,9 @@ echo json_encode($domain, JSON_PRETTY_PRINT); // } ~~~ -#### Refreshing the cached rules +#### Refreshing the cached PSL -The `Manager::refreshRules` method enables refreshing your local copy of the PSL stored with your [PSR-16](http://www.php-fig.org/psr/psr-16/) Cache and retrieved using the Http Client. By default the method will use the `Manager::PSL_URL` as the source URL but you are free to substitute this URL with your own. +The `Pdp\Manager::refreshRules` method enables refreshing your local copy of the PSL stored with your [PSR-16](http://www.php-fig.org/psr/psr-16/) Cache and retrieved using the Http Client. By default the method will use the `Manager::PSL_URL` as the source URL but you are free to substitute this URL with your own. The method returns a boolean value which is `true` on success. ~~~php diff --git a/src/CurlHttpClient.php b/src/CurlHttpClient.php index 31c46f14..7d90f51c 100644 --- a/src/CurlHttpClient.php +++ b/src/CurlHttpClient.php @@ -11,8 +11,6 @@ namespace Pdp; -use InvalidArgumentException; - /** * Simple cURL Http client * @@ -52,7 +50,7 @@ public function __construct(array $options = []) $res = @curl_setopt_array($curl, $this->options); curl_close($curl); if (!$res) { - throw new InvalidArgumentException('Please verify your curl additionnal options'); + throw new Exception('Please verify your curl additionnal options'); } } diff --git a/src/Rules.php b/src/Rules.php index 440339e0..c6e0f954 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -145,7 +145,7 @@ private function findPublicSuffix(string $domain, string $type): PublicSuffix */ private function findPublicSuffixFromSection(array $labels, string $type): PublicSuffix { - $rules = $this->rules[$type]; + $rules = $this->rules[$type] ?? null; $matches = []; foreach ($labels as $label) { //match exception rule @@ -161,11 +161,6 @@ private function findPublicSuffixFromSection(array $labels, string $type): Publi //no match found if (!isset($rules[$label])) { - // Avoids improper parsing when $domain's subdomain + public suffix === - // a valid public suffix (e.g. domain 'us.example.com' and public suffix 'us.com') - // - // Added by @goodhabit in https://github.com/jeremykendall/php-domain-parser/pull/15 - // Resolves https://github.com/jeremykendall/php-domain-parser/issues/16 break; } diff --git a/tests/CurlHttpClientTest.php b/tests/CurlHttpClientTest.php index 74dad1cf..ac419d81 100644 --- a/tests/CurlHttpClientTest.php +++ b/tests/CurlHttpClientTest.php @@ -4,8 +4,8 @@ namespace pdp\tests; -use InvalidArgumentException; use Pdp\CurlHttpClient; +use Pdp\Exception; use Pdp\HttpClientException; use PHPUnit\Framework\TestCase; @@ -26,7 +26,7 @@ public function testThrowsException() public function testConstructorThrowsException() { - $this->expectException(InvalidArgumentException::class); + $this->expectException(Exception::class); new CurlHttpClient(['foo' => 'bar']); } } From 7fc2857bc92bd2a7e22c33179d29885b7a54459c Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 13 Dec 2017 09:55:27 +0100 Subject: [PATCH 064/461] Improve CurlHttpClient --- src/CurlHttpClient.php | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/CurlHttpClient.php b/src/CurlHttpClient.php index 7d90f51c..944a50f0 100644 --- a/src/CurlHttpClient.php +++ b/src/CurlHttpClient.php @@ -43,6 +43,7 @@ public function __construct(array $options = []) CURLOPT_FAILONERROR => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_RETURNTRANSFER => true, + CURLOPT_SSL_VERIFYPEER => false, CURLOPT_HTTPGET => true, ]; @@ -59,18 +60,16 @@ public function __construct(array $options = []) */ public function getContent(string $url): string { - $options = $this->options; - $options[CURLOPT_URL] = $url; - $curl = curl_init(); - curl_setopt_array($curl, $options); + $curl = curl_init($url); + curl_setopt_array($curl, $this->options); $content = curl_exec($curl); - $code = curl_errno($curl); - $message = curl_error($curl); + $error_code = curl_errno($curl); + $error_message = curl_error($curl); curl_close($curl); - if (CURLE_OK === $code) { + if (CURLE_OK === $error_code) { return $content; } - throw new HttpClientException($message, $code); + throw new HttpClientException($error_message, $error_code); } } From 030f314bd40f16600898def0f8fd56efb0cf863e Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 13 Dec 2017 11:52:18 +0100 Subject: [PATCH 065/461] improve documentation --- README.md | 71 ++++++++++++++++++++++++++------------------------- src/Rules.php | 26 +++++++++---------- 2 files changed, 49 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 210c9627..c5e331b1 100644 --- a/README.md +++ b/README.md @@ -81,19 +81,19 @@ final class Rules const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; public function __construct(array $rules) - public function resolve(string $domain = null, string $type = self::ALL_DOMAINS): Domain + public function resolve(string $domain = null, string $section = self::ALL_DOMAINS): Domain } ~~~ Domain name resolution is done using the `Pdp\Rules::resolve` method which expects at most two parameters: - `$domain` a domain name as a string -- `$type` a string which specifies which section of the PSL you want to validate the given domain against. The possible values are: +- `$section` a string which specifies which section of the PSL you want to validate the given domain against. The possible values are: - `Rules::ALL_DOMAINS`, to validate against the full PSL. - `Rules::ICANN_DOMAINS`, to validate against the PSL ICANN DOMAINS section only. - `Rules::PRIVATE_DOMAINS`, to validate against the PSL PRIVATE DOMAINS section only. - By default, the `$type` argument is equal to `Rules::ALL_DOMAINS`. If an unsupported section is submitted otherwise, a `Pdp\Exception` exception will be thrown. + By default, the `$section` argument is equal to `Rules::ALL_DOMAINS`. If an unsupported section is submitted a `Pdp\Exception` exception will be thrown. The `Pdp\Rules::resolve` returns a `Pdp\Domain` object. @@ -128,7 +128,7 @@ If the domain name or some of its part are seriously malformed or unrecognized, - `Pdp\Domain::isICANN` returns `true` if the public suffix is found in a selected PSL which includes the ICANN DOMAINS section; - `Pdp\Domain::isPrivate` returns `true` if the public suffix is found in a selected PSL which includes the PRIVATE DOMAINS section; -**THIS EXAMPLE ILLUSTRATES HOW EACH OBJECT IS USED BUT SHOULD BE AVOID IN A PRODUCTIVE ENVIRONMENT** +**THIS EXAMPLE ILLUSTRATES HOW EACH OBJECT IS USED BUT SHOULD BE AVOID IN A PRODUCTON** ~~~php refreshRules('https://publicsuffix.org/list/public_suffix_list.dat'); +if ($retval) { + //the local cache has been updated +} else { + //the local cache has not been updated +} +~~~ + #### Returning a `Pdp\Rules` object ~~~php @@ -278,27 +300,6 @@ echo json_encode($domain, JSON_PRETTY_PRINT); // } ~~~ -#### Refreshing the cached PSL - -The `Pdp\Manager::refreshRules` method enables refreshing your local copy of the PSL stored with your [PSR-16](http://www.php-fig.org/psr/psr-16/) Cache and retrieved using the Http Client. By default the method will use the `Manager::PSL_URL` as the source URL but you are free to substitute this URL with your own. -The method returns a boolean value which is `true` on success. - -~~~php -refreshRules('https://publicsuffix.org/list/public_suffix_list.dat'); -if ($retval) { - //the local cache has been updated -} else { - //the local cache has not been updated -} -~~~ - ### Automatic Updates It is important to always have an up to date PSL. In order to do so the library comes bundle with an auto-update script located in the `bin` directory. @@ -310,8 +311,8 @@ $ php ./bin/update-psl This script requires: - The PHP `curl` extension -- The `Pdp\Installer` class which comes bundle with this package -- The use of the Cache and HTTP Client implementations bundle with this package. +- The `Pdp\Installer` class which organizes how to update the cache. +- The `Pdp\Cache` and `Pdp\CurlHttpClient` classes to retrieve and cache the PSL If you prefer using your own implementations you should: diff --git a/src/Rules.php b/src/Rules.php index c6e0f954..df47809f 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -44,21 +44,21 @@ public function __construct(array $rules) * Returns PSL ICANN public info for a given domain. * * @param string|null $domain - * @param string $type + * @param string $section * * @return Domain */ - public function resolve(string $domain = null, string $type = self::ALL_DOMAINS): Domain + public function resolve(string $domain = null, string $section = self::ALL_DOMAINS): Domain { - if (!in_array($type, [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, self::ALL_DOMAINS], true)) { - throw new Exception(sprintf('%s is an unknown Domain type', $type)); + if (!in_array($section, [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, self::ALL_DOMAINS], true)) { + throw new Exception(sprintf('%s is an unknown Domain section', $section)); } if (!$this->isMatchable($domain)) { return new Domain(); } - $publicSuffix = $this->findPublicSuffix($domain, $type); + $publicSuffix = $this->findPublicSuffix($domain, $section); if (null === $publicSuffix->getContent()) { return new Domain($domain, $this->handleNoMatches($domain)); } @@ -110,16 +110,16 @@ private function normalize(string $domain): string * Returns the matched public suffix. * * @param string $domain - * @param string $type + * @param string $section * * @return PublicSuffix */ - private function findPublicSuffix(string $domain, string $type): PublicSuffix + private function findPublicSuffix(string $domain, string $section): PublicSuffix { $normalizedDomain = $this->normalize($domain); $reverseLabels = array_reverse(explode('.', $normalizedDomain)); $resultIcann = $this->findPublicSuffixFromSection($reverseLabels, self::ICANN_DOMAINS); - if (self::ICANN_DOMAINS === $type) { + if (self::ICANN_DOMAINS === $section) { return $resultIcann; } @@ -128,7 +128,7 @@ private function findPublicSuffix(string $domain, string $type): PublicSuffix return $resultPrivate; } - if (self::ALL_DOMAINS === $type) { + if (self::ALL_DOMAINS === $section) { return $resultIcann; } @@ -139,13 +139,13 @@ private function findPublicSuffix(string $domain, string $type): PublicSuffix * Returns the public suffix matched against a given PSL section. * * @param array $labels - * @param string $type + * @param string $section * * @return PublicSuffix */ - private function findPublicSuffixFromSection(array $labels, string $type): PublicSuffix + private function findPublicSuffixFromSection(array $labels, string $section): PublicSuffix { - $rules = $this->rules[$type] ?? null; + $rules = $this->rules[$section] ?? null; $matches = []; foreach ($labels as $label) { //match exception rule @@ -173,7 +173,7 @@ private function findPublicSuffixFromSection(array $labels, string $type): Publi return new PublicSuffix(); } - return new PublicSuffix(implode('.', $foundLabels), $type); + return new PublicSuffix(implode('.', $foundLabels), $section); } /** From a68ffbfa1cc42d554390b5755bb7f9614a4550ac Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 13 Dec 2017 12:02:43 +0100 Subject: [PATCH 066/461] adding composer script documentation --- .gitattributes | 4 +--- README.md | 22 ++++++++++++++++++++-- tests/DomainTest.php | 6 +----- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/.gitattributes b/.gitattributes index 231a7053..28d84bb5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5,10 +5,8 @@ /.github export-ignore /.gitignore export-ignore /.php_cs export-ignore -/.scrutinizer.yml export-ignore /.travis.yml export-ignore /README.md export-ignore /CHANGELOG.md export-ignore -/CONDUCT.md export-ignore -/phpunit.xml export-ignore +/phpunit.xml.dist export-ignore /tests export-ignore diff --git a/README.md b/README.md index c5e331b1..b4b1613a 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ If the domain name or some of its part are seriously malformed or unrecognized, - `Pdp\Domain::isICANN` returns `true` if the public suffix is found in a selected PSL which includes the ICANN DOMAINS section; - `Pdp\Domain::isPrivate` returns `true` if the public suffix is found in a selected PSL which includes the PRIVATE DOMAINS section; -**THIS EXAMPLE ILLUSTRATES HOW EACH OBJECT IS USED BUT SHOULD BE AVOID IN A PRODUCTON** +**THIS EXAMPLE ILLUSTRATES HOW EACH OBJECT IS USED BUT SHOULD BE AVOID IN PRODUCTON** ~~~php getRules(); - $domain = $rules->resolve('contoso.com'); + $domain = new Domain('www.ulb.ac.be', new PublicSuffix('ac.be', Rules::ICANN_DOMAINS)); $generateDomain = eval('return '.var_export($domain, true).';'); $this->assertInternalType('array', $domain->__debugInfo()); $this->assertEquals($domain, $generateDomain); From d9e4b48447f5fb71fe9439907f16bf484eedd41c Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 13 Dec 2017 12:43:24 +0100 Subject: [PATCH 067/461] prepare 5.0.0 release --- CHANGELOG.md | 5 +++-- src/Installer.php | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2594b55c..fc53f726 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All Notable changes to `PHP Domain Parser` will be documented in this file -## 5.0.0 - TBD +## 5.0.0 - 2017-12-13 ### Added @@ -26,7 +26,8 @@ All Notable changes to `PHP Domain Parser` will be documented in this file ### Removed -- URL Parsing capabilities API is removed +- PHP5 support +- URL Parsing capabilities and domain name validation - `Pdp\PublicSuffixList` class replaced by the `Pdp\Rules` class - `Pdp\PublicSuffixManager` class replaced by the `Pdp\Manager` class - `Pdp\HttpAdapter\HttpAdapterInterface` interface replaced by the `Pdp\HttpClient` interface diff --git a/src/Installer.php b/src/Installer.php index a429c46b..49aff609 100644 --- a/src/Installer.php +++ b/src/Installer.php @@ -7,6 +7,7 @@ * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) * @license http://github.com/jeremykendall/php-domain-parser/blob/master/LICENSE MIT License */ +declare(strict_types=1); namespace Pdp; From 24e9b5e54725acb62c67576f6252d9151cbbecca Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 13 Dec 2017 14:21:08 +0100 Subject: [PATCH 068/461] update badges --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b4b1613a..0d18178e 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,11 @@ **PHP Domain Parser** is a [Public Suffix List](http://publicsuffix.org/) based domain parser implemented in PHP. -[![Build Status](https://travis-ci.org/jeremykendall/php-domain-parser.png?branch=master)](https://travis-ci.org/jeremykendall/php-domain-parser) -[![Total Downloads](https://poser.pugx.org/jeremykendall/php-domain-parser/downloads.png)](https://packagist.org/packages/jeremykendall/php-domain-parser) -[![Latest Stable Version](https://poser.pugx.org/jeremykendall/php-domain-parser/v/stable.png)](https://packagist.org/packages/jeremykendall/php-domain-parser) +[![Build Status](https://img.shields.io/travis/jeremykendall/php-domain-parser/master.svg?style=flat-square)](https://travis-ci.org/jeremykendall/php-domain-parser) +[![Total Downloads](https://img.shields.io/packagist/dt/jeremykendall/php-domain-parser.svg?style=flat-square)](https://packagist.org/packages/jeremykendall/php-domain-parser) +[![Latest Stable Version](https://img.shields.io/github/release/jeremykendall/php-domain-parser.svg?style=flat-square)](https://github.com/jeremykendall/php-domain-parser/releases) +[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](https://github.com/jeremykendall/php-domain-parser/blob/master/LICENSE) + Motivation ------- From 525c2d319cb7a2133410d4544c117e90c78c0e1b Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 13 Dec 2017 18:14:14 +0100 Subject: [PATCH 069/461] improve documentation --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0d18178e..cfc21359 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,6 @@ Documentation ### Domain name resolution - In order to resolve a domain name one we must: - Convert the Public Suffix List (PSL) into a structure usable in PHP @@ -97,6 +96,7 @@ Domain name resolution is done using the `Pdp\Rules::resolve` method which expec By default, the `$section` argument is equal to `Rules::ALL_DOMAINS`. If an unsupported section is submitted a `Pdp\Exception` exception will be thrown. +**WARNING: The `Pdp\Rules::resolve` does not validate the submitted host. You are require to use a host validator prior to using this library.** The `Pdp\Rules::resolve` returns a `Pdp\Domain` object. From fca2a874665462eefd88849a5996c92cdc3de688 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 14 Dec 2017 09:14:55 +0100 Subject: [PATCH 070/461] Adding Rules named contructors --- CHANGELOG.md | 19 + src/Rules.php | 33 +- tests/RulesTest.php | 12 + tests/data/public_suffix_list.dat | 12288 ++++++++++++++++++++++++++++ 4 files changed, 12351 insertions(+), 1 deletion(-) create mode 100644 tests/data/public_suffix_list.dat diff --git a/CHANGELOG.md b/CHANGELOG.md index fc53f726..f0df2eb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,25 @@ All Notable changes to `PHP Domain Parser` will be documented in this file +## Next - TBD + +### Added + +- `Pdp\Rules::createFromPath` named constructor to returns a new instance from a path +- `Pdp\Rules::createFromString` named constructor to returns a new instance from a string + +### Fixed + +- None + +### Deprecated + +- None + +### Removed + +- None + ## 5.0.0 - 2017-12-13 ### Added diff --git a/src/Rules.php b/src/Rules.php index df47809f..b32a1053 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -30,6 +30,37 @@ final class Rules */ private $rules; + /** + * Returns a new instance from a file path. + * + * @param string $path + * + * @return self + */ + public static function createFromPath(string $path): self + { + if (!($resource = @fopen($path, 'r'))) { + throw new Exception(sprintf('`%s`: failed to open stream: No such file or directory', $path)); + } + + $content = stream_get_contents($resource); + fclose($resource); + + return self::createFromString($content); + } + + /** + * Returns a new instance from a string. + * + * @param string $content + * + * @return self + */ + public static function createFromString(string $content): self + { + return new self((new Converter())->convert($content)); + } + /** * new instance. * @@ -51,7 +82,7 @@ public function __construct(array $rules) public function resolve(string $domain = null, string $section = self::ALL_DOMAINS): Domain { if (!in_array($section, [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, self::ALL_DOMAINS], true)) { - throw new Exception(sprintf('%s is an unknown Domain section', $section)); + throw new Exception(sprintf('%s is an unknown Public Suffix List section', $section)); } if (!$this->isMatchable($domain)) { diff --git a/tests/RulesTest.php b/tests/RulesTest.php index ca84dc82..c7bc952f 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -25,6 +25,18 @@ public function setUp() $this->rules = $manager->getRules(); } + public function testCreateFromPath() + { + $rules = Rules::createFromPath(__DIR__.'/data/public_suffix_list.dat'); + $this->assertInstanceOf(Rules::class, $rules); + } + + public function testCreateFromPathThrowsException() + { + $this->expectException(Exception::class); + Rules::createFromPath('/foo/bar.dat'); + } + public function testNullWillReturnNullDomain() { $domain = $this->rules->resolve('COM'); diff --git a/tests/data/public_suffix_list.dat b/tests/data/public_suffix_list.dat new file mode 100644 index 00000000..ebd88d4c --- /dev/null +++ b/tests/data/public_suffix_list.dat @@ -0,0 +1,12288 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +// Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat, +// rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported. + +// Instructions on pulling and using this list can be found at https://publicsuffix.org/list/. + +// ===BEGIN ICANN DOMAINS=== + +// ac : https://en.wikipedia.org/wiki/.ac +ac +com.ac +edu.ac +gov.ac +net.ac +mil.ac +org.ac + +// ad : https://en.wikipedia.org/wiki/.ad +ad +nom.ad + +// ae : https://en.wikipedia.org/wiki/.ae +// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php +ae +co.ae +net.ae +org.ae +sch.ae +ac.ae +gov.ae +mil.ae + +// aero : see https://www.information.aero/index.php?id=66 +aero +accident-investigation.aero +accident-prevention.aero +aerobatic.aero +aeroclub.aero +aerodrome.aero +agents.aero +aircraft.aero +airline.aero +airport.aero +air-surveillance.aero +airtraffic.aero +air-traffic-control.aero +ambulance.aero +amusement.aero +association.aero +author.aero +ballooning.aero +broker.aero +caa.aero +cargo.aero +catering.aero +certification.aero +championship.aero +charter.aero +civilaviation.aero +club.aero +conference.aero +consultant.aero +consulting.aero +control.aero +council.aero +crew.aero +design.aero +dgca.aero +educator.aero +emergency.aero +engine.aero +engineer.aero +entertainment.aero +equipment.aero +exchange.aero +express.aero +federation.aero +flight.aero +freight.aero +fuel.aero +gliding.aero +government.aero +groundhandling.aero +group.aero +hanggliding.aero +homebuilt.aero +insurance.aero +journal.aero +journalist.aero +leasing.aero +logistics.aero +magazine.aero +maintenance.aero +media.aero +microlight.aero +modelling.aero +navigation.aero +parachuting.aero +paragliding.aero +passenger-association.aero +pilot.aero +press.aero +production.aero +recreation.aero +repbody.aero +res.aero +research.aero +rotorcraft.aero +safety.aero +scientist.aero +services.aero +show.aero +skydiving.aero +software.aero +student.aero +trader.aero +trading.aero +trainer.aero +union.aero +workinggroup.aero +works.aero + +// af : http://www.nic.af/help.jsp +af +gov.af +com.af +org.af +net.af +edu.af + +// ag : http://www.nic.ag/prices.htm +ag +com.ag +org.ag +net.ag +co.ag +nom.ag + +// ai : http://nic.com.ai/ +ai +off.ai +com.ai +net.ai +org.ai + +// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31 +al +com.al +edu.al +gov.al +mil.al +net.al +org.al + +// am : https://en.wikipedia.org/wiki/.am +am + +// ao : https://en.wikipedia.org/wiki/.ao +// http://www.dns.ao/REGISTR.DOC +ao +ed.ao +gv.ao +og.ao +co.ao +pb.ao +it.ao + +// aq : https://en.wikipedia.org/wiki/.aq +aq + +// ar : https://nic.ar/nic-argentina/normativa-vigente +ar +com.ar +edu.ar +gob.ar +gov.ar +int.ar +mil.ar +musica.ar +net.ar +org.ar +tur.ar + +// arpa : https://en.wikipedia.org/wiki/.arpa +// Confirmed by registry 2008-06-18 +arpa +e164.arpa +in-addr.arpa +ip6.arpa +iris.arpa +uri.arpa +urn.arpa + +// as : https://en.wikipedia.org/wiki/.as +as +gov.as + +// asia : https://en.wikipedia.org/wiki/.asia +asia + +// at : https://en.wikipedia.org/wiki/.at +// Confirmed by registry 2008-06-17 +at +ac.at +co.at +gv.at +or.at + +// au : https://en.wikipedia.org/wiki/.au +// http://www.auda.org.au/ +au +// 2LDs +com.au +net.au +org.au +edu.au +gov.au +asn.au +id.au +// Historic 2LDs (closed to new registration, but sites still exist) +info.au +conf.au +oz.au +// CGDNs - http://www.cgdn.org.au/ +act.au +nsw.au +nt.au +qld.au +sa.au +tas.au +vic.au +wa.au +// 3LDs +act.edu.au +nsw.edu.au +nt.edu.au +qld.edu.au +sa.edu.au +tas.edu.au +vic.edu.au +wa.edu.au +// act.gov.au Bug 984824 - Removed at request of Greg Tankard +// nsw.gov.au Bug 547985 - Removed at request of +// nt.gov.au Bug 940478 - Removed at request of Greg Connors +qld.gov.au +sa.gov.au +tas.gov.au +vic.gov.au +wa.gov.au + +// aw : https://en.wikipedia.org/wiki/.aw +aw +com.aw + +// ax : https://en.wikipedia.org/wiki/.ax +ax + +// az : https://en.wikipedia.org/wiki/.az +az +com.az +net.az +int.az +gov.az +org.az +edu.az +info.az +pp.az +mil.az +name.az +pro.az +biz.az + +// ba : http://nic.ba/users_data/files/pravilnik_o_registraciji.pdf +ba +com.ba +edu.ba +gov.ba +mil.ba +net.ba +org.ba + +// bb : https://en.wikipedia.org/wiki/.bb +bb +biz.bb +co.bb +com.bb +edu.bb +gov.bb +info.bb +net.bb +org.bb +store.bb +tv.bb + +// bd : https://en.wikipedia.org/wiki/.bd +*.bd + +// be : https://en.wikipedia.org/wiki/.be +// Confirmed by registry 2008-06-08 +be +ac.be + +// bf : https://en.wikipedia.org/wiki/.bf +bf +gov.bf + +// bg : https://en.wikipedia.org/wiki/.bg +// https://www.register.bg/user/static/rules/en/index.html +bg +a.bg +b.bg +c.bg +d.bg +e.bg +f.bg +g.bg +h.bg +i.bg +j.bg +k.bg +l.bg +m.bg +n.bg +o.bg +p.bg +q.bg +r.bg +s.bg +t.bg +u.bg +v.bg +w.bg +x.bg +y.bg +z.bg +0.bg +1.bg +2.bg +3.bg +4.bg +5.bg +6.bg +7.bg +8.bg +9.bg + +// bh : https://en.wikipedia.org/wiki/.bh +bh +com.bh +edu.bh +net.bh +org.bh +gov.bh + +// bi : https://en.wikipedia.org/wiki/.bi +// http://whois.nic.bi/ +bi +co.bi +com.bi +edu.bi +or.bi +org.bi + +// biz : https://en.wikipedia.org/wiki/.biz +biz + +// bj : https://en.wikipedia.org/wiki/.bj +bj +asso.bj +barreau.bj +gouv.bj + +// bm : http://www.bermudanic.bm/dnr-text.txt +bm +com.bm +edu.bm +gov.bm +net.bm +org.bm + +// bn : https://en.wikipedia.org/wiki/.bn +*.bn + +// bo : http://www.nic.bo/ +bo +com.bo +edu.bo +gov.bo +gob.bo +int.bo +org.bo +net.bo +mil.bo +tv.bo + +// br : http://registro.br/dominio/categoria.html +// Submitted by registry +br +abc.br +adm.br +adv.br +agr.br +aju.br +am.br +aparecida.br +arq.br +art.br +ato.br +b.br +belem.br +bhz.br +bio.br +blog.br +bmd.br +boavista.br +bsb.br +campinas.br +caxias.br +cim.br +cng.br +cnt.br +com.br +contagem.br +coop.br +cri.br +cuiaba.br +def.br +ecn.br +eco.br +edu.br +emp.br +eng.br +esp.br +etc.br +eti.br +far.br +feira.br +flog.br +floripa.br +fm.br +fnd.br +fortal.br +fot.br +fst.br +g12.br +ggf.br +goiania.br +gov.br +// gov.br 26 states + df https://en.wikipedia.org/wiki/States_of_Brazil +ac.gov.br +al.gov.br +am.gov.br +ap.gov.br +ba.gov.br +ce.gov.br +df.gov.br +es.gov.br +go.gov.br +ma.gov.br +mg.gov.br +ms.gov.br +mt.gov.br +pa.gov.br +pb.gov.br +pe.gov.br +pi.gov.br +pr.gov.br +rj.gov.br +rn.gov.br +ro.gov.br +rr.gov.br +rs.gov.br +sc.gov.br +se.gov.br +sp.gov.br +to.gov.br +gru.br +imb.br +ind.br +inf.br +jab.br +jampa.br +jdf.br +joinville.br +jor.br +jus.br +leg.br +lel.br +londrina.br +macapa.br +maceio.br +mat.br +med.br +mil.br +morena.br +mp.br +mus.br +natal.br +net.br +niteroi.br +*.nom.br +not.br +ntr.br +odo.br +org.br +osasco.br +palmas.br +poa.br +ppg.br +pro.br +psc.br +psi.br +pvh.br +qsl.br +radio.br +rec.br +recife.br +ribeirao.br +rio.br +riobranco.br +salvador.br +sampa.br +sjc.br +slg.br +slz.br +sorocaba.br +srv.br +taxi.br +teo.br +the.br +tmp.br +trd.br +tur.br +tv.br +udi.br +vet.br +vix.br +vlog.br +wiki.br +zlg.br + +// bs : http://www.nic.bs/rules.html +bs +com.bs +net.bs +org.bs +edu.bs +gov.bs + +// bt : https://en.wikipedia.org/wiki/.bt +bt +com.bt +edu.bt +gov.bt +net.bt +org.bt + +// bv : No registrations at this time. +// Submitted by registry +bv + +// bw : https://en.wikipedia.org/wiki/.bw +// http://www.gobin.info/domainname/bw.doc +// list of other 2nd level tlds ? +bw +co.bw +org.bw + +// by : https://en.wikipedia.org/wiki/.by +// http://tld.by/rules_2006_en.html +// list of other 2nd level tlds ? +by +gov.by +mil.by +// Official information does not indicate that com.by is a reserved +// second-level domain, but it's being used as one (see www.google.com.by and +// www.yahoo.com.by, for example), so we list it here for safety's sake. +com.by + +// http://hoster.by/ +of.by + +// bz : https://en.wikipedia.org/wiki/.bz +// http://www.belizenic.bz/ +bz +com.bz +net.bz +org.bz +edu.bz +gov.bz + +// ca : https://en.wikipedia.org/wiki/.ca +ca +// ca geographical names +ab.ca +bc.ca +mb.ca +nb.ca +nf.ca +nl.ca +ns.ca +nt.ca +nu.ca +on.ca +pe.ca +qc.ca +sk.ca +yk.ca +// gc.ca: https://en.wikipedia.org/wiki/.gc.ca +// see also: http://registry.gc.ca/en/SubdomainFAQ +gc.ca + +// cat : https://en.wikipedia.org/wiki/.cat +cat + +// cc : https://en.wikipedia.org/wiki/.cc +cc + +// cd : https://en.wikipedia.org/wiki/.cd +// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 +cd +gov.cd + +// cf : https://en.wikipedia.org/wiki/.cf +cf + +// cg : https://en.wikipedia.org/wiki/.cg +cg + +// ch : https://en.wikipedia.org/wiki/.ch +ch + +// ci : https://en.wikipedia.org/wiki/.ci +// http://www.nic.ci/index.php?page=charte +ci +org.ci +or.ci +com.ci +co.ci +edu.ci +ed.ci +ac.ci +net.ci +go.ci +asso.ci +aéroport.ci +int.ci +presse.ci +md.ci +gouv.ci + +// ck : https://en.wikipedia.org/wiki/.ck +*.ck +!www.ck + +// cl : https://en.wikipedia.org/wiki/.cl +cl +gov.cl +gob.cl +co.cl +mil.cl + +// cm : https://en.wikipedia.org/wiki/.cm plus bug 981927 +cm +co.cm +com.cm +gov.cm +net.cm + +// cn : https://en.wikipedia.org/wiki/.cn +// Submitted by registry +cn +ac.cn +com.cn +edu.cn +gov.cn +net.cn +org.cn +mil.cn +公司.cn +网络.cn +網絡.cn +// cn geographic names +ah.cn +bj.cn +cq.cn +fj.cn +gd.cn +gs.cn +gz.cn +gx.cn +ha.cn +hb.cn +he.cn +hi.cn +hl.cn +hn.cn +jl.cn +js.cn +jx.cn +ln.cn +nm.cn +nx.cn +qh.cn +sc.cn +sd.cn +sh.cn +sn.cn +sx.cn +tj.cn +xj.cn +xz.cn +yn.cn +zj.cn +hk.cn +mo.cn +tw.cn + +// co : https://en.wikipedia.org/wiki/.co +// Submitted by registry +co +arts.co +com.co +edu.co +firm.co +gov.co +info.co +int.co +mil.co +net.co +nom.co +org.co +rec.co +web.co + +// com : https://en.wikipedia.org/wiki/.com +com + +// coop : https://en.wikipedia.org/wiki/.coop +coop + +// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do +cr +ac.cr +co.cr +ed.cr +fi.cr +go.cr +or.cr +sa.cr + +// cu : https://en.wikipedia.org/wiki/.cu +cu +com.cu +edu.cu +org.cu +net.cu +gov.cu +inf.cu + +// cv : https://en.wikipedia.org/wiki/.cv +cv + +// cw : http://www.una.cw/cw_registry/ +// Confirmed by registry 2013-03-26 +cw +com.cw +edu.cw +net.cw +org.cw + +// cx : https://en.wikipedia.org/wiki/.cx +// list of other 2nd level tlds ? +cx +gov.cx + +// cy : http://www.nic.cy/ +// Submitted by registry Panayiotou Fotia +cy +ac.cy +biz.cy +com.cy +ekloges.cy +gov.cy +ltd.cy +name.cy +net.cy +org.cy +parliament.cy +press.cy +pro.cy +tm.cy + +// cz : https://en.wikipedia.org/wiki/.cz +cz + +// de : https://en.wikipedia.org/wiki/.de +// Confirmed by registry (with technical +// reservations) 2008-07-01 +de + +// dj : https://en.wikipedia.org/wiki/.dj +dj + +// dk : https://en.wikipedia.org/wiki/.dk +// Confirmed by registry 2008-06-17 +dk + +// dm : https://en.wikipedia.org/wiki/.dm +dm +com.dm +net.dm +org.dm +edu.dm +gov.dm + +// do : https://en.wikipedia.org/wiki/.do +do +art.do +com.do +edu.do +gob.do +gov.do +mil.do +net.do +org.do +sld.do +web.do + +// dz : https://en.wikipedia.org/wiki/.dz +dz +com.dz +org.dz +net.dz +gov.dz +edu.dz +asso.dz +pol.dz +art.dz + +// ec : http://www.nic.ec/reg/paso1.asp +// Submitted by registry +ec +com.ec +info.ec +net.ec +fin.ec +k12.ec +med.ec +pro.ec +org.ec +edu.ec +gov.ec +gob.ec +mil.ec + +// edu : https://en.wikipedia.org/wiki/.edu +edu + +// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B +ee +edu.ee +gov.ee +riik.ee +lib.ee +med.ee +com.ee +pri.ee +aip.ee +org.ee +fie.ee + +// eg : https://en.wikipedia.org/wiki/.eg +eg +com.eg +edu.eg +eun.eg +gov.eg +mil.eg +name.eg +net.eg +org.eg +sci.eg + +// er : https://en.wikipedia.org/wiki/.er +*.er + +// es : https://www.nic.es/site_ingles/ingles/dominios/index.html +es +com.es +nom.es +org.es +gob.es +edu.es + +// et : https://en.wikipedia.org/wiki/.et +et +com.et +gov.et +org.et +edu.et +biz.et +name.et +info.et +net.et + +// eu : https://en.wikipedia.org/wiki/.eu +eu + +// fi : https://en.wikipedia.org/wiki/.fi +fi +// aland.fi : https://en.wikipedia.org/wiki/.ax +// This domain is being phased out in favor of .ax. As there are still many +// domains under aland.fi, we still keep it on the list until aland.fi is +// completely removed. +// TODO: Check for updates (expected to be phased out around Q1/2009) +aland.fi + +// fj : https://en.wikipedia.org/wiki/.fj +*.fj + +// fk : https://en.wikipedia.org/wiki/.fk +*.fk + +// fm : https://en.wikipedia.org/wiki/.fm +fm + +// fo : https://en.wikipedia.org/wiki/.fo +fo + +// fr : http://www.afnic.fr/ +// domaines descriptifs : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-descriptifs +fr +com.fr +asso.fr +nom.fr +prd.fr +presse.fr +tm.fr +// domaines sectoriels : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-sectoriels +aeroport.fr +assedic.fr +avocat.fr +avoues.fr +cci.fr +chambagri.fr +chirurgiens-dentistes.fr +experts-comptables.fr +geometre-expert.fr +gouv.fr +greta.fr +huissier-justice.fr +medecin.fr +notaires.fr +pharmacien.fr +port.fr +veterinaire.fr + +// ga : https://en.wikipedia.org/wiki/.ga +ga + +// gb : This registry is effectively dormant +// Submitted by registry +gb + +// gd : https://en.wikipedia.org/wiki/.gd +gd + +// ge : http://www.nic.net.ge/policy_en.pdf +ge +com.ge +edu.ge +gov.ge +org.ge +mil.ge +net.ge +pvt.ge + +// gf : https://en.wikipedia.org/wiki/.gf +gf + +// gg : http://www.channelisles.net/register-domains/ +// Confirmed by registry 2013-11-28 +gg +co.gg +net.gg +org.gg + +// gh : https://en.wikipedia.org/wiki/.gh +// see also: http://www.nic.gh/reg_now.php +// Although domains directly at second level are not possible at the moment, +// they have been possible for some time and may come back. +gh +com.gh +edu.gh +gov.gh +org.gh +mil.gh + +// gi : http://www.nic.gi/rules.html +gi +com.gi +ltd.gi +gov.gi +mod.gi +edu.gi +org.gi + +// gl : https://en.wikipedia.org/wiki/.gl +// http://nic.gl +gl +co.gl +com.gl +edu.gl +net.gl +org.gl + +// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm +gm + +// gn : http://psg.com/dns/gn/gn.txt +// Submitted by registry +gn +ac.gn +com.gn +edu.gn +gov.gn +org.gn +net.gn + +// gov : https://en.wikipedia.org/wiki/.gov +gov + +// gp : http://www.nic.gp/index.php?lang=en +gp +com.gp +net.gp +mobi.gp +edu.gp +org.gp +asso.gp + +// gq : https://en.wikipedia.org/wiki/.gq +gq + +// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html +// Submitted by registry +gr +com.gr +edu.gr +net.gr +org.gr +gov.gr + +// gs : https://en.wikipedia.org/wiki/.gs +gs + +// gt : http://www.gt/politicas_de_registro.html +gt +com.gt +edu.gt +gob.gt +ind.gt +mil.gt +net.gt +org.gt + +// gu : http://gadao.gov.gu/registration.txt +*.gu + +// gw : https://en.wikipedia.org/wiki/.gw +gw + +// gy : https://en.wikipedia.org/wiki/.gy +// http://registry.gy/ +gy +co.gy +com.gy +edu.gy +gov.gy +net.gy +org.gy + +// hk : https://www.hkdnr.hk +// Submitted by registry +hk +com.hk +edu.hk +gov.hk +idv.hk +net.hk +org.hk +公司.hk +教育.hk +敎育.hk +政府.hk +個人.hk +个人.hk +箇人.hk +網络.hk +网络.hk +组織.hk +網絡.hk +网絡.hk +组织.hk +組織.hk +組织.hk + +// hm : https://en.wikipedia.org/wiki/.hm +hm + +// hn : http://www.nic.hn/politicas/ps02,,05.html +hn +com.hn +edu.hn +org.hn +net.hn +mil.hn +gob.hn + +// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf +hr +iz.hr +from.hr +name.hr +com.hr + +// ht : http://www.nic.ht/info/charte.cfm +ht +com.ht +shop.ht +firm.ht +info.ht +adult.ht +net.ht +pro.ht +org.ht +med.ht +art.ht +coop.ht +pol.ht +asso.ht +edu.ht +rel.ht +gouv.ht +perso.ht + +// hu : http://www.domain.hu/domain/English/sld.html +// Confirmed by registry 2008-06-12 +hu +co.hu +info.hu +org.hu +priv.hu +sport.hu +tm.hu +2000.hu +agrar.hu +bolt.hu +casino.hu +city.hu +erotica.hu +erotika.hu +film.hu +forum.hu +games.hu +hotel.hu +ingatlan.hu +jogasz.hu +konyvelo.hu +lakas.hu +media.hu +news.hu +reklam.hu +sex.hu +shop.hu +suli.hu +szex.hu +tozsde.hu +utazas.hu +video.hu + +// id : https://register.pandi.or.id/ +id +ac.id +biz.id +co.id +desa.id +go.id +mil.id +my.id +net.id +or.id +sch.id +web.id + +// ie : https://en.wikipedia.org/wiki/.ie +ie +gov.ie + +// il : http://www.isoc.org.il/domains/ +il +ac.il +co.il +gov.il +idf.il +k12.il +muni.il +net.il +org.il + +// im : https://www.nic.im/ +// Submitted by registry +im +ac.im +co.im +com.im +ltd.co.im +net.im +org.im +plc.co.im +tt.im +tv.im + +// in : https://en.wikipedia.org/wiki/.in +// see also: https://registry.in/Policies +// Please note, that nic.in is not an official eTLD, but used by most +// government institutions. +in +co.in +firm.in +net.in +org.in +gen.in +ind.in +nic.in +ac.in +edu.in +res.in +gov.in +mil.in + +// info : https://en.wikipedia.org/wiki/.info +info + +// int : https://en.wikipedia.org/wiki/.int +// Confirmed by registry 2008-06-18 +int +eu.int + +// io : http://www.nic.io/rules.html +// list of other 2nd level tlds ? +io +com.io + +// iq : http://www.cmc.iq/english/iq/iqregister1.htm +iq +gov.iq +edu.iq +mil.iq +com.iq +org.iq +net.iq + +// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules +// Also see http://www.nic.ir/Internationalized_Domain_Names +// Two .ir entries added at request of , 2010-04-16 +ir +ac.ir +co.ir +gov.ir +id.ir +net.ir +org.ir +sch.ir +// xn--mgba3a4f16a.ir (.ir, Persian YEH) +ایران.ir +// xn--mgba3a4fra.ir (.ir, Arabic YEH) +ايران.ir + +// is : http://www.isnic.is/domain/rules.php +// Confirmed by registry 2008-12-06 +is +net.is +com.is +edu.is +gov.is +org.is +int.is + +// it : https://en.wikipedia.org/wiki/.it +it +gov.it +edu.it +// Reserved geo-names: +// http://www.nic.it/documenti/regolamenti-e-linee-guida/regolamento-assegnazione-versione-6.0.pdf +// There is also a list of reserved geo-names corresponding to Italian municipalities +// http://www.nic.it/documenti/appendice-c.pdf, but it is not included here. +// Regions +abr.it +abruzzo.it +aosta-valley.it +aostavalley.it +bas.it +basilicata.it +cal.it +calabria.it +cam.it +campania.it +emilia-romagna.it +emiliaromagna.it +emr.it +friuli-v-giulia.it +friuli-ve-giulia.it +friuli-vegiulia.it +friuli-venezia-giulia.it +friuli-veneziagiulia.it +friuli-vgiulia.it +friuliv-giulia.it +friulive-giulia.it +friulivegiulia.it +friulivenezia-giulia.it +friuliveneziagiulia.it +friulivgiulia.it +fvg.it +laz.it +lazio.it +lig.it +liguria.it +lom.it +lombardia.it +lombardy.it +lucania.it +mar.it +marche.it +mol.it +molise.it +piedmont.it +piemonte.it +pmn.it +pug.it +puglia.it +sar.it +sardegna.it +sardinia.it +sic.it +sicilia.it +sicily.it +taa.it +tos.it +toscana.it +trentino-a-adige.it +trentino-aadige.it +trentino-alto-adige.it +trentino-altoadige.it +trentino-s-tirol.it +trentino-stirol.it +trentino-sud-tirol.it +trentino-sudtirol.it +trentino-sued-tirol.it +trentino-suedtirol.it +trentinoa-adige.it +trentinoaadige.it +trentinoalto-adige.it +trentinoaltoadige.it +trentinos-tirol.it +trentinostirol.it +trentinosud-tirol.it +trentinosudtirol.it +trentinosued-tirol.it +trentinosuedtirol.it +tuscany.it +umb.it +umbria.it +val-d-aosta.it +val-daosta.it +vald-aosta.it +valdaosta.it +valle-aosta.it +valle-d-aosta.it +valle-daosta.it +valleaosta.it +valled-aosta.it +valledaosta.it +vallee-aoste.it +valleeaoste.it +vao.it +vda.it +ven.it +veneto.it +// Provinces +ag.it +agrigento.it +al.it +alessandria.it +alto-adige.it +altoadige.it +an.it +ancona.it +andria-barletta-trani.it +andria-trani-barletta.it +andriabarlettatrani.it +andriatranibarletta.it +ao.it +aosta.it +aoste.it +ap.it +aq.it +aquila.it +ar.it +arezzo.it +ascoli-piceno.it +ascolipiceno.it +asti.it +at.it +av.it +avellino.it +ba.it +balsan.it +bari.it +barletta-trani-andria.it +barlettatraniandria.it +belluno.it +benevento.it +bergamo.it +bg.it +bi.it +biella.it +bl.it +bn.it +bo.it +bologna.it +bolzano.it +bozen.it +br.it +brescia.it +brindisi.it +bs.it +bt.it +bz.it +ca.it +cagliari.it +caltanissetta.it +campidano-medio.it +campidanomedio.it +campobasso.it +carbonia-iglesias.it +carboniaiglesias.it +carrara-massa.it +carraramassa.it +caserta.it +catania.it +catanzaro.it +cb.it +ce.it +cesena-forli.it +cesenaforli.it +ch.it +chieti.it +ci.it +cl.it +cn.it +co.it +como.it +cosenza.it +cr.it +cremona.it +crotone.it +cs.it +ct.it +cuneo.it +cz.it +dell-ogliastra.it +dellogliastra.it +en.it +enna.it +fc.it +fe.it +fermo.it +ferrara.it +fg.it +fi.it +firenze.it +florence.it +fm.it +foggia.it +forli-cesena.it +forlicesena.it +fr.it +frosinone.it +ge.it +genoa.it +genova.it +go.it +gorizia.it +gr.it +grosseto.it +iglesias-carbonia.it +iglesiascarbonia.it +im.it +imperia.it +is.it +isernia.it +kr.it +la-spezia.it +laquila.it +laspezia.it +latina.it +lc.it +le.it +lecce.it +lecco.it +li.it +livorno.it +lo.it +lodi.it +lt.it +lu.it +lucca.it +macerata.it +mantova.it +massa-carrara.it +massacarrara.it +matera.it +mb.it +mc.it +me.it +medio-campidano.it +mediocampidano.it +messina.it +mi.it +milan.it +milano.it +mn.it +mo.it +modena.it +monza-brianza.it +monza-e-della-brianza.it +monza.it +monzabrianza.it +monzaebrianza.it +monzaedellabrianza.it +ms.it +mt.it +na.it +naples.it +napoli.it +no.it +novara.it +nu.it +nuoro.it +og.it +ogliastra.it +olbia-tempio.it +olbiatempio.it +or.it +oristano.it +ot.it +pa.it +padova.it +padua.it +palermo.it +parma.it +pavia.it +pc.it +pd.it +pe.it +perugia.it +pesaro-urbino.it +pesarourbino.it +pescara.it +pg.it +pi.it +piacenza.it +pisa.it +pistoia.it +pn.it +po.it +pordenone.it +potenza.it +pr.it +prato.it +pt.it +pu.it +pv.it +pz.it +ra.it +ragusa.it +ravenna.it +rc.it +re.it +reggio-calabria.it +reggio-emilia.it +reggiocalabria.it +reggioemilia.it +rg.it +ri.it +rieti.it +rimini.it +rm.it +rn.it +ro.it +roma.it +rome.it +rovigo.it +sa.it +salerno.it +sassari.it +savona.it +si.it +siena.it +siracusa.it +so.it +sondrio.it +sp.it +sr.it +ss.it +suedtirol.it +sv.it +ta.it +taranto.it +te.it +tempio-olbia.it +tempioolbia.it +teramo.it +terni.it +tn.it +to.it +torino.it +tp.it +tr.it +trani-andria-barletta.it +trani-barletta-andria.it +traniandriabarletta.it +tranibarlettaandria.it +trapani.it +trentino.it +trento.it +treviso.it +trieste.it +ts.it +turin.it +tv.it +ud.it +udine.it +urbino-pesaro.it +urbinopesaro.it +va.it +varese.it +vb.it +vc.it +ve.it +venezia.it +venice.it +verbania.it +vercelli.it +verona.it +vi.it +vibo-valentia.it +vibovalentia.it +vicenza.it +viterbo.it +vr.it +vs.it +vt.it +vv.it + +// je : http://www.channelisles.net/register-domains/ +// Confirmed by registry 2013-11-28 +je +co.je +net.je +org.je + +// jm : http://www.com.jm/register.html +*.jm + +// jo : http://www.dns.jo/Registration_policy.aspx +jo +com.jo +org.jo +net.jo +edu.jo +sch.jo +gov.jo +mil.jo +name.jo + +// jobs : https://en.wikipedia.org/wiki/.jobs +jobs + +// jp : https://en.wikipedia.org/wiki/.jp +// http://jprs.co.jp/en/jpdomain.html +// Submitted by registry +jp +// jp organizational type names +ac.jp +ad.jp +co.jp +ed.jp +go.jp +gr.jp +lg.jp +ne.jp +or.jp +// jp prefecture type names +aichi.jp +akita.jp +aomori.jp +chiba.jp +ehime.jp +fukui.jp +fukuoka.jp +fukushima.jp +gifu.jp +gunma.jp +hiroshima.jp +hokkaido.jp +hyogo.jp +ibaraki.jp +ishikawa.jp +iwate.jp +kagawa.jp +kagoshima.jp +kanagawa.jp +kochi.jp +kumamoto.jp +kyoto.jp +mie.jp +miyagi.jp +miyazaki.jp +nagano.jp +nagasaki.jp +nara.jp +niigata.jp +oita.jp +okayama.jp +okinawa.jp +osaka.jp +saga.jp +saitama.jp +shiga.jp +shimane.jp +shizuoka.jp +tochigi.jp +tokushima.jp +tokyo.jp +tottori.jp +toyama.jp +wakayama.jp +yamagata.jp +yamaguchi.jp +yamanashi.jp +栃木.jp +愛知.jp +愛媛.jp +兵庫.jp +熊本.jp +茨城.jp +北海道.jp +千葉.jp +和歌山.jp +長崎.jp +長野.jp +新潟.jp +青森.jp +静岡.jp +東京.jp +石川.jp +埼玉.jp +三重.jp +京都.jp +佐賀.jp +大分.jp +大阪.jp +奈良.jp +宮城.jp +宮崎.jp +富山.jp +山口.jp +山形.jp +山梨.jp +岩手.jp +岐阜.jp +岡山.jp +島根.jp +広島.jp +徳島.jp +沖縄.jp +滋賀.jp +神奈川.jp +福井.jp +福岡.jp +福島.jp +秋田.jp +群馬.jp +香川.jp +高知.jp +鳥取.jp +鹿児島.jp +// jp geographic type names +// http://jprs.jp/doc/rule/saisoku-1.html +*.kawasaki.jp +*.kitakyushu.jp +*.kobe.jp +*.nagoya.jp +*.sapporo.jp +*.sendai.jp +*.yokohama.jp +!city.kawasaki.jp +!city.kitakyushu.jp +!city.kobe.jp +!city.nagoya.jp +!city.sapporo.jp +!city.sendai.jp +!city.yokohama.jp +// 4th level registration +aisai.aichi.jp +ama.aichi.jp +anjo.aichi.jp +asuke.aichi.jp +chiryu.aichi.jp +chita.aichi.jp +fuso.aichi.jp +gamagori.aichi.jp +handa.aichi.jp +hazu.aichi.jp +hekinan.aichi.jp +higashiura.aichi.jp +ichinomiya.aichi.jp +inazawa.aichi.jp +inuyama.aichi.jp +isshiki.aichi.jp +iwakura.aichi.jp +kanie.aichi.jp +kariya.aichi.jp +kasugai.aichi.jp +kira.aichi.jp +kiyosu.aichi.jp +komaki.aichi.jp +konan.aichi.jp +kota.aichi.jp +mihama.aichi.jp +miyoshi.aichi.jp +nishio.aichi.jp +nisshin.aichi.jp +obu.aichi.jp +oguchi.aichi.jp +oharu.aichi.jp +okazaki.aichi.jp +owariasahi.aichi.jp +seto.aichi.jp +shikatsu.aichi.jp +shinshiro.aichi.jp +shitara.aichi.jp +tahara.aichi.jp +takahama.aichi.jp +tobishima.aichi.jp +toei.aichi.jp +togo.aichi.jp +tokai.aichi.jp +tokoname.aichi.jp +toyoake.aichi.jp +toyohashi.aichi.jp +toyokawa.aichi.jp +toyone.aichi.jp +toyota.aichi.jp +tsushima.aichi.jp +yatomi.aichi.jp +akita.akita.jp +daisen.akita.jp +fujisato.akita.jp +gojome.akita.jp +hachirogata.akita.jp +happou.akita.jp +higashinaruse.akita.jp +honjo.akita.jp +honjyo.akita.jp +ikawa.akita.jp +kamikoani.akita.jp +kamioka.akita.jp +katagami.akita.jp +kazuno.akita.jp +kitaakita.akita.jp +kosaka.akita.jp +kyowa.akita.jp +misato.akita.jp +mitane.akita.jp +moriyoshi.akita.jp +nikaho.akita.jp +noshiro.akita.jp +odate.akita.jp +oga.akita.jp +ogata.akita.jp +semboku.akita.jp +yokote.akita.jp +yurihonjo.akita.jp +aomori.aomori.jp +gonohe.aomori.jp +hachinohe.aomori.jp +hashikami.aomori.jp +hiranai.aomori.jp +hirosaki.aomori.jp +itayanagi.aomori.jp +kuroishi.aomori.jp +misawa.aomori.jp +mutsu.aomori.jp +nakadomari.aomori.jp +noheji.aomori.jp +oirase.aomori.jp +owani.aomori.jp +rokunohe.aomori.jp +sannohe.aomori.jp +shichinohe.aomori.jp +shingo.aomori.jp +takko.aomori.jp +towada.aomori.jp +tsugaru.aomori.jp +tsuruta.aomori.jp +abiko.chiba.jp +asahi.chiba.jp +chonan.chiba.jp +chosei.chiba.jp +choshi.chiba.jp +chuo.chiba.jp +funabashi.chiba.jp +futtsu.chiba.jp +hanamigawa.chiba.jp +ichihara.chiba.jp +ichikawa.chiba.jp +ichinomiya.chiba.jp +inzai.chiba.jp +isumi.chiba.jp +kamagaya.chiba.jp +kamogawa.chiba.jp +kashiwa.chiba.jp +katori.chiba.jp +katsuura.chiba.jp +kimitsu.chiba.jp +kisarazu.chiba.jp +kozaki.chiba.jp +kujukuri.chiba.jp +kyonan.chiba.jp +matsudo.chiba.jp +midori.chiba.jp +mihama.chiba.jp +minamiboso.chiba.jp +mobara.chiba.jp +mutsuzawa.chiba.jp +nagara.chiba.jp +nagareyama.chiba.jp +narashino.chiba.jp +narita.chiba.jp +noda.chiba.jp +oamishirasato.chiba.jp +omigawa.chiba.jp +onjuku.chiba.jp +otaki.chiba.jp +sakae.chiba.jp +sakura.chiba.jp +shimofusa.chiba.jp +shirako.chiba.jp +shiroi.chiba.jp +shisui.chiba.jp +sodegaura.chiba.jp +sosa.chiba.jp +tako.chiba.jp +tateyama.chiba.jp +togane.chiba.jp +tohnosho.chiba.jp +tomisato.chiba.jp +urayasu.chiba.jp +yachimata.chiba.jp +yachiyo.chiba.jp +yokaichiba.chiba.jp +yokoshibahikari.chiba.jp +yotsukaido.chiba.jp +ainan.ehime.jp +honai.ehime.jp +ikata.ehime.jp +imabari.ehime.jp +iyo.ehime.jp +kamijima.ehime.jp +kihoku.ehime.jp +kumakogen.ehime.jp +masaki.ehime.jp +matsuno.ehime.jp +matsuyama.ehime.jp +namikata.ehime.jp +niihama.ehime.jp +ozu.ehime.jp +saijo.ehime.jp +seiyo.ehime.jp +shikokuchuo.ehime.jp +tobe.ehime.jp +toon.ehime.jp +uchiko.ehime.jp +uwajima.ehime.jp +yawatahama.ehime.jp +echizen.fukui.jp +eiheiji.fukui.jp +fukui.fukui.jp +ikeda.fukui.jp +katsuyama.fukui.jp +mihama.fukui.jp +minamiechizen.fukui.jp +obama.fukui.jp +ohi.fukui.jp +ono.fukui.jp +sabae.fukui.jp +sakai.fukui.jp +takahama.fukui.jp +tsuruga.fukui.jp +wakasa.fukui.jp +ashiya.fukuoka.jp +buzen.fukuoka.jp +chikugo.fukuoka.jp +chikuho.fukuoka.jp +chikujo.fukuoka.jp +chikushino.fukuoka.jp +chikuzen.fukuoka.jp +chuo.fukuoka.jp +dazaifu.fukuoka.jp +fukuchi.fukuoka.jp +hakata.fukuoka.jp +higashi.fukuoka.jp +hirokawa.fukuoka.jp +hisayama.fukuoka.jp +iizuka.fukuoka.jp +inatsuki.fukuoka.jp +kaho.fukuoka.jp +kasuga.fukuoka.jp +kasuya.fukuoka.jp +kawara.fukuoka.jp +keisen.fukuoka.jp +koga.fukuoka.jp +kurate.fukuoka.jp +kurogi.fukuoka.jp +kurume.fukuoka.jp +minami.fukuoka.jp +miyako.fukuoka.jp +miyama.fukuoka.jp +miyawaka.fukuoka.jp +mizumaki.fukuoka.jp +munakata.fukuoka.jp +nakagawa.fukuoka.jp +nakama.fukuoka.jp +nishi.fukuoka.jp +nogata.fukuoka.jp +ogori.fukuoka.jp +okagaki.fukuoka.jp +okawa.fukuoka.jp +oki.fukuoka.jp +omuta.fukuoka.jp +onga.fukuoka.jp +onojo.fukuoka.jp +oto.fukuoka.jp +saigawa.fukuoka.jp +sasaguri.fukuoka.jp +shingu.fukuoka.jp +shinyoshitomi.fukuoka.jp +shonai.fukuoka.jp +soeda.fukuoka.jp +sue.fukuoka.jp +tachiarai.fukuoka.jp +tagawa.fukuoka.jp +takata.fukuoka.jp +toho.fukuoka.jp +toyotsu.fukuoka.jp +tsuiki.fukuoka.jp +ukiha.fukuoka.jp +umi.fukuoka.jp +usui.fukuoka.jp +yamada.fukuoka.jp +yame.fukuoka.jp +yanagawa.fukuoka.jp +yukuhashi.fukuoka.jp +aizubange.fukushima.jp +aizumisato.fukushima.jp +aizuwakamatsu.fukushima.jp +asakawa.fukushima.jp +bandai.fukushima.jp +date.fukushima.jp +fukushima.fukushima.jp +furudono.fukushima.jp +futaba.fukushima.jp +hanawa.fukushima.jp +higashi.fukushima.jp +hirata.fukushima.jp +hirono.fukushima.jp +iitate.fukushima.jp +inawashiro.fukushima.jp +ishikawa.fukushima.jp +iwaki.fukushima.jp +izumizaki.fukushima.jp +kagamiishi.fukushima.jp +kaneyama.fukushima.jp +kawamata.fukushima.jp +kitakata.fukushima.jp +kitashiobara.fukushima.jp +koori.fukushima.jp +koriyama.fukushima.jp +kunimi.fukushima.jp +miharu.fukushima.jp +mishima.fukushima.jp +namie.fukushima.jp +nango.fukushima.jp +nishiaizu.fukushima.jp +nishigo.fukushima.jp +okuma.fukushima.jp +omotego.fukushima.jp +ono.fukushima.jp +otama.fukushima.jp +samegawa.fukushima.jp +shimogo.fukushima.jp +shirakawa.fukushima.jp +showa.fukushima.jp +soma.fukushima.jp +sukagawa.fukushima.jp +taishin.fukushima.jp +tamakawa.fukushima.jp +tanagura.fukushima.jp +tenei.fukushima.jp +yabuki.fukushima.jp +yamato.fukushima.jp +yamatsuri.fukushima.jp +yanaizu.fukushima.jp +yugawa.fukushima.jp +anpachi.gifu.jp +ena.gifu.jp +gifu.gifu.jp +ginan.gifu.jp +godo.gifu.jp +gujo.gifu.jp +hashima.gifu.jp +hichiso.gifu.jp +hida.gifu.jp +higashishirakawa.gifu.jp +ibigawa.gifu.jp +ikeda.gifu.jp +kakamigahara.gifu.jp +kani.gifu.jp +kasahara.gifu.jp +kasamatsu.gifu.jp +kawaue.gifu.jp +kitagata.gifu.jp +mino.gifu.jp +minokamo.gifu.jp +mitake.gifu.jp +mizunami.gifu.jp +motosu.gifu.jp +nakatsugawa.gifu.jp +ogaki.gifu.jp +sakahogi.gifu.jp +seki.gifu.jp +sekigahara.gifu.jp +shirakawa.gifu.jp +tajimi.gifu.jp +takayama.gifu.jp +tarui.gifu.jp +toki.gifu.jp +tomika.gifu.jp +wanouchi.gifu.jp +yamagata.gifu.jp +yaotsu.gifu.jp +yoro.gifu.jp +annaka.gunma.jp +chiyoda.gunma.jp +fujioka.gunma.jp +higashiagatsuma.gunma.jp +isesaki.gunma.jp +itakura.gunma.jp +kanna.gunma.jp +kanra.gunma.jp +katashina.gunma.jp +kawaba.gunma.jp +kiryu.gunma.jp +kusatsu.gunma.jp +maebashi.gunma.jp +meiwa.gunma.jp +midori.gunma.jp +minakami.gunma.jp +naganohara.gunma.jp +nakanojo.gunma.jp +nanmoku.gunma.jp +numata.gunma.jp +oizumi.gunma.jp +ora.gunma.jp +ota.gunma.jp +shibukawa.gunma.jp +shimonita.gunma.jp +shinto.gunma.jp +showa.gunma.jp +takasaki.gunma.jp +takayama.gunma.jp +tamamura.gunma.jp +tatebayashi.gunma.jp +tomioka.gunma.jp +tsukiyono.gunma.jp +tsumagoi.gunma.jp +ueno.gunma.jp +yoshioka.gunma.jp +asaminami.hiroshima.jp +daiwa.hiroshima.jp +etajima.hiroshima.jp +fuchu.hiroshima.jp +fukuyama.hiroshima.jp +hatsukaichi.hiroshima.jp +higashihiroshima.hiroshima.jp +hongo.hiroshima.jp +jinsekikogen.hiroshima.jp +kaita.hiroshima.jp +kui.hiroshima.jp +kumano.hiroshima.jp +kure.hiroshima.jp +mihara.hiroshima.jp +miyoshi.hiroshima.jp +naka.hiroshima.jp +onomichi.hiroshima.jp +osakikamijima.hiroshima.jp +otake.hiroshima.jp +saka.hiroshima.jp +sera.hiroshima.jp +seranishi.hiroshima.jp +shinichi.hiroshima.jp +shobara.hiroshima.jp +takehara.hiroshima.jp +abashiri.hokkaido.jp +abira.hokkaido.jp +aibetsu.hokkaido.jp +akabira.hokkaido.jp +akkeshi.hokkaido.jp +asahikawa.hokkaido.jp +ashibetsu.hokkaido.jp +ashoro.hokkaido.jp +assabu.hokkaido.jp +atsuma.hokkaido.jp +bibai.hokkaido.jp +biei.hokkaido.jp +bifuka.hokkaido.jp +bihoro.hokkaido.jp +biratori.hokkaido.jp +chippubetsu.hokkaido.jp +chitose.hokkaido.jp +date.hokkaido.jp +ebetsu.hokkaido.jp +embetsu.hokkaido.jp +eniwa.hokkaido.jp +erimo.hokkaido.jp +esan.hokkaido.jp +esashi.hokkaido.jp +fukagawa.hokkaido.jp +fukushima.hokkaido.jp +furano.hokkaido.jp +furubira.hokkaido.jp +haboro.hokkaido.jp +hakodate.hokkaido.jp +hamatonbetsu.hokkaido.jp +hidaka.hokkaido.jp +higashikagura.hokkaido.jp +higashikawa.hokkaido.jp +hiroo.hokkaido.jp +hokuryu.hokkaido.jp +hokuto.hokkaido.jp +honbetsu.hokkaido.jp +horokanai.hokkaido.jp +horonobe.hokkaido.jp +ikeda.hokkaido.jp +imakane.hokkaido.jp +ishikari.hokkaido.jp +iwamizawa.hokkaido.jp +iwanai.hokkaido.jp +kamifurano.hokkaido.jp +kamikawa.hokkaido.jp +kamishihoro.hokkaido.jp +kamisunagawa.hokkaido.jp +kamoenai.hokkaido.jp +kayabe.hokkaido.jp +kembuchi.hokkaido.jp +kikonai.hokkaido.jp +kimobetsu.hokkaido.jp +kitahiroshima.hokkaido.jp +kitami.hokkaido.jp +kiyosato.hokkaido.jp +koshimizu.hokkaido.jp +kunneppu.hokkaido.jp +kuriyama.hokkaido.jp +kuromatsunai.hokkaido.jp +kushiro.hokkaido.jp +kutchan.hokkaido.jp +kyowa.hokkaido.jp +mashike.hokkaido.jp +matsumae.hokkaido.jp +mikasa.hokkaido.jp +minamifurano.hokkaido.jp +mombetsu.hokkaido.jp +moseushi.hokkaido.jp +mukawa.hokkaido.jp +muroran.hokkaido.jp +naie.hokkaido.jp +nakagawa.hokkaido.jp +nakasatsunai.hokkaido.jp +nakatombetsu.hokkaido.jp +nanae.hokkaido.jp +nanporo.hokkaido.jp +nayoro.hokkaido.jp +nemuro.hokkaido.jp +niikappu.hokkaido.jp +niki.hokkaido.jp +nishiokoppe.hokkaido.jp +noboribetsu.hokkaido.jp +numata.hokkaido.jp +obihiro.hokkaido.jp +obira.hokkaido.jp +oketo.hokkaido.jp +okoppe.hokkaido.jp +otaru.hokkaido.jp +otobe.hokkaido.jp +otofuke.hokkaido.jp +otoineppu.hokkaido.jp +oumu.hokkaido.jp +ozora.hokkaido.jp +pippu.hokkaido.jp +rankoshi.hokkaido.jp +rebun.hokkaido.jp +rikubetsu.hokkaido.jp +rishiri.hokkaido.jp +rishirifuji.hokkaido.jp +saroma.hokkaido.jp +sarufutsu.hokkaido.jp +shakotan.hokkaido.jp +shari.hokkaido.jp +shibecha.hokkaido.jp +shibetsu.hokkaido.jp +shikabe.hokkaido.jp +shikaoi.hokkaido.jp +shimamaki.hokkaido.jp +shimizu.hokkaido.jp +shimokawa.hokkaido.jp +shinshinotsu.hokkaido.jp +shintoku.hokkaido.jp +shiranuka.hokkaido.jp +shiraoi.hokkaido.jp +shiriuchi.hokkaido.jp +sobetsu.hokkaido.jp +sunagawa.hokkaido.jp +taiki.hokkaido.jp +takasu.hokkaido.jp +takikawa.hokkaido.jp +takinoue.hokkaido.jp +teshikaga.hokkaido.jp +tobetsu.hokkaido.jp +tohma.hokkaido.jp +tomakomai.hokkaido.jp +tomari.hokkaido.jp +toya.hokkaido.jp +toyako.hokkaido.jp +toyotomi.hokkaido.jp +toyoura.hokkaido.jp +tsubetsu.hokkaido.jp +tsukigata.hokkaido.jp +urakawa.hokkaido.jp +urausu.hokkaido.jp +uryu.hokkaido.jp +utashinai.hokkaido.jp +wakkanai.hokkaido.jp +wassamu.hokkaido.jp +yakumo.hokkaido.jp +yoichi.hokkaido.jp +aioi.hyogo.jp +akashi.hyogo.jp +ako.hyogo.jp +amagasaki.hyogo.jp +aogaki.hyogo.jp +asago.hyogo.jp +ashiya.hyogo.jp +awaji.hyogo.jp +fukusaki.hyogo.jp +goshiki.hyogo.jp +harima.hyogo.jp +himeji.hyogo.jp +ichikawa.hyogo.jp +inagawa.hyogo.jp +itami.hyogo.jp +kakogawa.hyogo.jp +kamigori.hyogo.jp +kamikawa.hyogo.jp +kasai.hyogo.jp +kasuga.hyogo.jp +kawanishi.hyogo.jp +miki.hyogo.jp +minamiawaji.hyogo.jp +nishinomiya.hyogo.jp +nishiwaki.hyogo.jp +ono.hyogo.jp +sanda.hyogo.jp +sannan.hyogo.jp +sasayama.hyogo.jp +sayo.hyogo.jp +shingu.hyogo.jp +shinonsen.hyogo.jp +shiso.hyogo.jp +sumoto.hyogo.jp +taishi.hyogo.jp +taka.hyogo.jp +takarazuka.hyogo.jp +takasago.hyogo.jp +takino.hyogo.jp +tamba.hyogo.jp +tatsuno.hyogo.jp +toyooka.hyogo.jp +yabu.hyogo.jp +yashiro.hyogo.jp +yoka.hyogo.jp +yokawa.hyogo.jp +ami.ibaraki.jp +asahi.ibaraki.jp +bando.ibaraki.jp +chikusei.ibaraki.jp +daigo.ibaraki.jp +fujishiro.ibaraki.jp +hitachi.ibaraki.jp +hitachinaka.ibaraki.jp +hitachiomiya.ibaraki.jp +hitachiota.ibaraki.jp +ibaraki.ibaraki.jp +ina.ibaraki.jp +inashiki.ibaraki.jp +itako.ibaraki.jp +iwama.ibaraki.jp +joso.ibaraki.jp +kamisu.ibaraki.jp +kasama.ibaraki.jp +kashima.ibaraki.jp +kasumigaura.ibaraki.jp +koga.ibaraki.jp +miho.ibaraki.jp +mito.ibaraki.jp +moriya.ibaraki.jp +naka.ibaraki.jp +namegata.ibaraki.jp +oarai.ibaraki.jp +ogawa.ibaraki.jp +omitama.ibaraki.jp +ryugasaki.ibaraki.jp +sakai.ibaraki.jp +sakuragawa.ibaraki.jp +shimodate.ibaraki.jp +shimotsuma.ibaraki.jp +shirosato.ibaraki.jp +sowa.ibaraki.jp +suifu.ibaraki.jp +takahagi.ibaraki.jp +tamatsukuri.ibaraki.jp +tokai.ibaraki.jp +tomobe.ibaraki.jp +tone.ibaraki.jp +toride.ibaraki.jp +tsuchiura.ibaraki.jp +tsukuba.ibaraki.jp +uchihara.ibaraki.jp +ushiku.ibaraki.jp +yachiyo.ibaraki.jp +yamagata.ibaraki.jp +yawara.ibaraki.jp +yuki.ibaraki.jp +anamizu.ishikawa.jp +hakui.ishikawa.jp +hakusan.ishikawa.jp +kaga.ishikawa.jp +kahoku.ishikawa.jp +kanazawa.ishikawa.jp +kawakita.ishikawa.jp +komatsu.ishikawa.jp +nakanoto.ishikawa.jp +nanao.ishikawa.jp +nomi.ishikawa.jp +nonoichi.ishikawa.jp +noto.ishikawa.jp +shika.ishikawa.jp +suzu.ishikawa.jp +tsubata.ishikawa.jp +tsurugi.ishikawa.jp +uchinada.ishikawa.jp +wajima.ishikawa.jp +fudai.iwate.jp +fujisawa.iwate.jp +hanamaki.iwate.jp +hiraizumi.iwate.jp +hirono.iwate.jp +ichinohe.iwate.jp +ichinoseki.iwate.jp +iwaizumi.iwate.jp +iwate.iwate.jp +joboji.iwate.jp +kamaishi.iwate.jp +kanegasaki.iwate.jp +karumai.iwate.jp +kawai.iwate.jp +kitakami.iwate.jp +kuji.iwate.jp +kunohe.iwate.jp +kuzumaki.iwate.jp +miyako.iwate.jp +mizusawa.iwate.jp +morioka.iwate.jp +ninohe.iwate.jp +noda.iwate.jp +ofunato.iwate.jp +oshu.iwate.jp +otsuchi.iwate.jp +rikuzentakata.iwate.jp +shiwa.iwate.jp +shizukuishi.iwate.jp +sumita.iwate.jp +tanohata.iwate.jp +tono.iwate.jp +yahaba.iwate.jp +yamada.iwate.jp +ayagawa.kagawa.jp +higashikagawa.kagawa.jp +kanonji.kagawa.jp +kotohira.kagawa.jp +manno.kagawa.jp +marugame.kagawa.jp +mitoyo.kagawa.jp +naoshima.kagawa.jp +sanuki.kagawa.jp +tadotsu.kagawa.jp +takamatsu.kagawa.jp +tonosho.kagawa.jp +uchinomi.kagawa.jp +utazu.kagawa.jp +zentsuji.kagawa.jp +akune.kagoshima.jp +amami.kagoshima.jp +hioki.kagoshima.jp +isa.kagoshima.jp +isen.kagoshima.jp +izumi.kagoshima.jp +kagoshima.kagoshima.jp +kanoya.kagoshima.jp +kawanabe.kagoshima.jp +kinko.kagoshima.jp +kouyama.kagoshima.jp +makurazaki.kagoshima.jp +matsumoto.kagoshima.jp +minamitane.kagoshima.jp +nakatane.kagoshima.jp +nishinoomote.kagoshima.jp +satsumasendai.kagoshima.jp +soo.kagoshima.jp +tarumizu.kagoshima.jp +yusui.kagoshima.jp +aikawa.kanagawa.jp +atsugi.kanagawa.jp +ayase.kanagawa.jp +chigasaki.kanagawa.jp +ebina.kanagawa.jp +fujisawa.kanagawa.jp +hadano.kanagawa.jp +hakone.kanagawa.jp +hiratsuka.kanagawa.jp +isehara.kanagawa.jp +kaisei.kanagawa.jp +kamakura.kanagawa.jp +kiyokawa.kanagawa.jp +matsuda.kanagawa.jp +minamiashigara.kanagawa.jp +miura.kanagawa.jp +nakai.kanagawa.jp +ninomiya.kanagawa.jp +odawara.kanagawa.jp +oi.kanagawa.jp +oiso.kanagawa.jp +sagamihara.kanagawa.jp +samukawa.kanagawa.jp +tsukui.kanagawa.jp +yamakita.kanagawa.jp +yamato.kanagawa.jp +yokosuka.kanagawa.jp +yugawara.kanagawa.jp +zama.kanagawa.jp +zushi.kanagawa.jp +aki.kochi.jp +geisei.kochi.jp +hidaka.kochi.jp +higashitsuno.kochi.jp +ino.kochi.jp +kagami.kochi.jp +kami.kochi.jp +kitagawa.kochi.jp +kochi.kochi.jp +mihara.kochi.jp +motoyama.kochi.jp +muroto.kochi.jp +nahari.kochi.jp +nakamura.kochi.jp +nankoku.kochi.jp +nishitosa.kochi.jp +niyodogawa.kochi.jp +ochi.kochi.jp +okawa.kochi.jp +otoyo.kochi.jp +otsuki.kochi.jp +sakawa.kochi.jp +sukumo.kochi.jp +susaki.kochi.jp +tosa.kochi.jp +tosashimizu.kochi.jp +toyo.kochi.jp +tsuno.kochi.jp +umaji.kochi.jp +yasuda.kochi.jp +yusuhara.kochi.jp +amakusa.kumamoto.jp +arao.kumamoto.jp +aso.kumamoto.jp +choyo.kumamoto.jp +gyokuto.kumamoto.jp +kamiamakusa.kumamoto.jp +kikuchi.kumamoto.jp +kumamoto.kumamoto.jp +mashiki.kumamoto.jp +mifune.kumamoto.jp +minamata.kumamoto.jp +minamioguni.kumamoto.jp +nagasu.kumamoto.jp +nishihara.kumamoto.jp +oguni.kumamoto.jp +ozu.kumamoto.jp +sumoto.kumamoto.jp +takamori.kumamoto.jp +uki.kumamoto.jp +uto.kumamoto.jp +yamaga.kumamoto.jp +yamato.kumamoto.jp +yatsushiro.kumamoto.jp +ayabe.kyoto.jp +fukuchiyama.kyoto.jp +higashiyama.kyoto.jp +ide.kyoto.jp +ine.kyoto.jp +joyo.kyoto.jp +kameoka.kyoto.jp +kamo.kyoto.jp +kita.kyoto.jp +kizu.kyoto.jp +kumiyama.kyoto.jp +kyotamba.kyoto.jp +kyotanabe.kyoto.jp +kyotango.kyoto.jp +maizuru.kyoto.jp +minami.kyoto.jp +minamiyamashiro.kyoto.jp +miyazu.kyoto.jp +muko.kyoto.jp +nagaokakyo.kyoto.jp +nakagyo.kyoto.jp +nantan.kyoto.jp +oyamazaki.kyoto.jp +sakyo.kyoto.jp +seika.kyoto.jp +tanabe.kyoto.jp +uji.kyoto.jp +ujitawara.kyoto.jp +wazuka.kyoto.jp +yamashina.kyoto.jp +yawata.kyoto.jp +asahi.mie.jp +inabe.mie.jp +ise.mie.jp +kameyama.mie.jp +kawagoe.mie.jp +kiho.mie.jp +kisosaki.mie.jp +kiwa.mie.jp +komono.mie.jp +kumano.mie.jp +kuwana.mie.jp +matsusaka.mie.jp +meiwa.mie.jp +mihama.mie.jp +minamiise.mie.jp +misugi.mie.jp +miyama.mie.jp +nabari.mie.jp +shima.mie.jp +suzuka.mie.jp +tado.mie.jp +taiki.mie.jp +taki.mie.jp +tamaki.mie.jp +toba.mie.jp +tsu.mie.jp +udono.mie.jp +ureshino.mie.jp +watarai.mie.jp +yokkaichi.mie.jp +furukawa.miyagi.jp +higashimatsushima.miyagi.jp +ishinomaki.miyagi.jp +iwanuma.miyagi.jp +kakuda.miyagi.jp +kami.miyagi.jp +kawasaki.miyagi.jp +marumori.miyagi.jp +matsushima.miyagi.jp +minamisanriku.miyagi.jp +misato.miyagi.jp +murata.miyagi.jp +natori.miyagi.jp +ogawara.miyagi.jp +ohira.miyagi.jp +onagawa.miyagi.jp +osaki.miyagi.jp +rifu.miyagi.jp +semine.miyagi.jp +shibata.miyagi.jp +shichikashuku.miyagi.jp +shikama.miyagi.jp +shiogama.miyagi.jp +shiroishi.miyagi.jp +tagajo.miyagi.jp +taiwa.miyagi.jp +tome.miyagi.jp +tomiya.miyagi.jp +wakuya.miyagi.jp +watari.miyagi.jp +yamamoto.miyagi.jp +zao.miyagi.jp +aya.miyazaki.jp +ebino.miyazaki.jp +gokase.miyazaki.jp +hyuga.miyazaki.jp +kadogawa.miyazaki.jp +kawaminami.miyazaki.jp +kijo.miyazaki.jp +kitagawa.miyazaki.jp +kitakata.miyazaki.jp +kitaura.miyazaki.jp +kobayashi.miyazaki.jp +kunitomi.miyazaki.jp +kushima.miyazaki.jp +mimata.miyazaki.jp +miyakonojo.miyazaki.jp +miyazaki.miyazaki.jp +morotsuka.miyazaki.jp +nichinan.miyazaki.jp +nishimera.miyazaki.jp +nobeoka.miyazaki.jp +saito.miyazaki.jp +shiiba.miyazaki.jp +shintomi.miyazaki.jp +takaharu.miyazaki.jp +takanabe.miyazaki.jp +takazaki.miyazaki.jp +tsuno.miyazaki.jp +achi.nagano.jp +agematsu.nagano.jp +anan.nagano.jp +aoki.nagano.jp +asahi.nagano.jp +azumino.nagano.jp +chikuhoku.nagano.jp +chikuma.nagano.jp +chino.nagano.jp +fujimi.nagano.jp +hakuba.nagano.jp +hara.nagano.jp +hiraya.nagano.jp +iida.nagano.jp +iijima.nagano.jp +iiyama.nagano.jp +iizuna.nagano.jp +ikeda.nagano.jp +ikusaka.nagano.jp +ina.nagano.jp +karuizawa.nagano.jp +kawakami.nagano.jp +kiso.nagano.jp +kisofukushima.nagano.jp +kitaaiki.nagano.jp +komagane.nagano.jp +komoro.nagano.jp +matsukawa.nagano.jp +matsumoto.nagano.jp +miasa.nagano.jp +minamiaiki.nagano.jp +minamimaki.nagano.jp +minamiminowa.nagano.jp +minowa.nagano.jp +miyada.nagano.jp +miyota.nagano.jp +mochizuki.nagano.jp +nagano.nagano.jp +nagawa.nagano.jp +nagiso.nagano.jp +nakagawa.nagano.jp +nakano.nagano.jp +nozawaonsen.nagano.jp +obuse.nagano.jp +ogawa.nagano.jp +okaya.nagano.jp +omachi.nagano.jp +omi.nagano.jp +ookuwa.nagano.jp +ooshika.nagano.jp +otaki.nagano.jp +otari.nagano.jp +sakae.nagano.jp +sakaki.nagano.jp +saku.nagano.jp +sakuho.nagano.jp +shimosuwa.nagano.jp +shinanomachi.nagano.jp +shiojiri.nagano.jp +suwa.nagano.jp +suzaka.nagano.jp +takagi.nagano.jp +takamori.nagano.jp +takayama.nagano.jp +tateshina.nagano.jp +tatsuno.nagano.jp +togakushi.nagano.jp +togura.nagano.jp +tomi.nagano.jp +ueda.nagano.jp +wada.nagano.jp +yamagata.nagano.jp +yamanouchi.nagano.jp +yasaka.nagano.jp +yasuoka.nagano.jp +chijiwa.nagasaki.jp +futsu.nagasaki.jp +goto.nagasaki.jp +hasami.nagasaki.jp +hirado.nagasaki.jp +iki.nagasaki.jp +isahaya.nagasaki.jp +kawatana.nagasaki.jp +kuchinotsu.nagasaki.jp +matsuura.nagasaki.jp +nagasaki.nagasaki.jp +obama.nagasaki.jp +omura.nagasaki.jp +oseto.nagasaki.jp +saikai.nagasaki.jp +sasebo.nagasaki.jp +seihi.nagasaki.jp +shimabara.nagasaki.jp +shinkamigoto.nagasaki.jp +togitsu.nagasaki.jp +tsushima.nagasaki.jp +unzen.nagasaki.jp +ando.nara.jp +gose.nara.jp +heguri.nara.jp +higashiyoshino.nara.jp +ikaruga.nara.jp +ikoma.nara.jp +kamikitayama.nara.jp +kanmaki.nara.jp +kashiba.nara.jp +kashihara.nara.jp +katsuragi.nara.jp +kawai.nara.jp +kawakami.nara.jp +kawanishi.nara.jp +koryo.nara.jp +kurotaki.nara.jp +mitsue.nara.jp +miyake.nara.jp +nara.nara.jp +nosegawa.nara.jp +oji.nara.jp +ouda.nara.jp +oyodo.nara.jp +sakurai.nara.jp +sango.nara.jp +shimoichi.nara.jp +shimokitayama.nara.jp +shinjo.nara.jp +soni.nara.jp +takatori.nara.jp +tawaramoto.nara.jp +tenkawa.nara.jp +tenri.nara.jp +uda.nara.jp +yamatokoriyama.nara.jp +yamatotakada.nara.jp +yamazoe.nara.jp +yoshino.nara.jp +aga.niigata.jp +agano.niigata.jp +gosen.niigata.jp +itoigawa.niigata.jp +izumozaki.niigata.jp +joetsu.niigata.jp +kamo.niigata.jp +kariwa.niigata.jp +kashiwazaki.niigata.jp +minamiuonuma.niigata.jp +mitsuke.niigata.jp +muika.niigata.jp +murakami.niigata.jp +myoko.niigata.jp +nagaoka.niigata.jp +niigata.niigata.jp +ojiya.niigata.jp +omi.niigata.jp +sado.niigata.jp +sanjo.niigata.jp +seiro.niigata.jp +seirou.niigata.jp +sekikawa.niigata.jp +shibata.niigata.jp +tagami.niigata.jp +tainai.niigata.jp +tochio.niigata.jp +tokamachi.niigata.jp +tsubame.niigata.jp +tsunan.niigata.jp +uonuma.niigata.jp +yahiko.niigata.jp +yoita.niigata.jp +yuzawa.niigata.jp +beppu.oita.jp +bungoono.oita.jp +bungotakada.oita.jp +hasama.oita.jp +hiji.oita.jp +himeshima.oita.jp +hita.oita.jp +kamitsue.oita.jp +kokonoe.oita.jp +kuju.oita.jp +kunisaki.oita.jp +kusu.oita.jp +oita.oita.jp +saiki.oita.jp +taketa.oita.jp +tsukumi.oita.jp +usa.oita.jp +usuki.oita.jp +yufu.oita.jp +akaiwa.okayama.jp +asakuchi.okayama.jp +bizen.okayama.jp +hayashima.okayama.jp +ibara.okayama.jp +kagamino.okayama.jp +kasaoka.okayama.jp +kibichuo.okayama.jp +kumenan.okayama.jp +kurashiki.okayama.jp +maniwa.okayama.jp +misaki.okayama.jp +nagi.okayama.jp +niimi.okayama.jp +nishiawakura.okayama.jp +okayama.okayama.jp +satosho.okayama.jp +setouchi.okayama.jp +shinjo.okayama.jp +shoo.okayama.jp +soja.okayama.jp +takahashi.okayama.jp +tamano.okayama.jp +tsuyama.okayama.jp +wake.okayama.jp +yakage.okayama.jp +aguni.okinawa.jp +ginowan.okinawa.jp +ginoza.okinawa.jp +gushikami.okinawa.jp +haebaru.okinawa.jp +higashi.okinawa.jp +hirara.okinawa.jp +iheya.okinawa.jp +ishigaki.okinawa.jp +ishikawa.okinawa.jp +itoman.okinawa.jp +izena.okinawa.jp +kadena.okinawa.jp +kin.okinawa.jp +kitadaito.okinawa.jp +kitanakagusuku.okinawa.jp +kumejima.okinawa.jp +kunigami.okinawa.jp +minamidaito.okinawa.jp +motobu.okinawa.jp +nago.okinawa.jp +naha.okinawa.jp +nakagusuku.okinawa.jp +nakijin.okinawa.jp +nanjo.okinawa.jp +nishihara.okinawa.jp +ogimi.okinawa.jp +okinawa.okinawa.jp +onna.okinawa.jp +shimoji.okinawa.jp +taketomi.okinawa.jp +tarama.okinawa.jp +tokashiki.okinawa.jp +tomigusuku.okinawa.jp +tonaki.okinawa.jp +urasoe.okinawa.jp +uruma.okinawa.jp +yaese.okinawa.jp +yomitan.okinawa.jp +yonabaru.okinawa.jp +yonaguni.okinawa.jp +zamami.okinawa.jp +abeno.osaka.jp +chihayaakasaka.osaka.jp +chuo.osaka.jp +daito.osaka.jp +fujiidera.osaka.jp +habikino.osaka.jp +hannan.osaka.jp +higashiosaka.osaka.jp +higashisumiyoshi.osaka.jp +higashiyodogawa.osaka.jp +hirakata.osaka.jp +ibaraki.osaka.jp +ikeda.osaka.jp +izumi.osaka.jp +izumiotsu.osaka.jp +izumisano.osaka.jp +kadoma.osaka.jp +kaizuka.osaka.jp +kanan.osaka.jp +kashiwara.osaka.jp +katano.osaka.jp +kawachinagano.osaka.jp +kishiwada.osaka.jp +kita.osaka.jp +kumatori.osaka.jp +matsubara.osaka.jp +minato.osaka.jp +minoh.osaka.jp +misaki.osaka.jp +moriguchi.osaka.jp +neyagawa.osaka.jp +nishi.osaka.jp +nose.osaka.jp +osakasayama.osaka.jp +sakai.osaka.jp +sayama.osaka.jp +sennan.osaka.jp +settsu.osaka.jp +shijonawate.osaka.jp +shimamoto.osaka.jp +suita.osaka.jp +tadaoka.osaka.jp +taishi.osaka.jp +tajiri.osaka.jp +takaishi.osaka.jp +takatsuki.osaka.jp +tondabayashi.osaka.jp +toyonaka.osaka.jp +toyono.osaka.jp +yao.osaka.jp +ariake.saga.jp +arita.saga.jp +fukudomi.saga.jp +genkai.saga.jp +hamatama.saga.jp +hizen.saga.jp +imari.saga.jp +kamimine.saga.jp +kanzaki.saga.jp +karatsu.saga.jp +kashima.saga.jp +kitagata.saga.jp +kitahata.saga.jp +kiyama.saga.jp +kouhoku.saga.jp +kyuragi.saga.jp +nishiarita.saga.jp +ogi.saga.jp +omachi.saga.jp +ouchi.saga.jp +saga.saga.jp +shiroishi.saga.jp +taku.saga.jp +tara.saga.jp +tosu.saga.jp +yoshinogari.saga.jp +arakawa.saitama.jp +asaka.saitama.jp +chichibu.saitama.jp +fujimi.saitama.jp +fujimino.saitama.jp +fukaya.saitama.jp +hanno.saitama.jp +hanyu.saitama.jp +hasuda.saitama.jp +hatogaya.saitama.jp +hatoyama.saitama.jp +hidaka.saitama.jp +higashichichibu.saitama.jp +higashimatsuyama.saitama.jp +honjo.saitama.jp +ina.saitama.jp +iruma.saitama.jp +iwatsuki.saitama.jp +kamiizumi.saitama.jp +kamikawa.saitama.jp +kamisato.saitama.jp +kasukabe.saitama.jp +kawagoe.saitama.jp +kawaguchi.saitama.jp +kawajima.saitama.jp +kazo.saitama.jp +kitamoto.saitama.jp +koshigaya.saitama.jp +kounosu.saitama.jp +kuki.saitama.jp +kumagaya.saitama.jp +matsubushi.saitama.jp +minano.saitama.jp +misato.saitama.jp +miyashiro.saitama.jp +miyoshi.saitama.jp +moroyama.saitama.jp +nagatoro.saitama.jp +namegawa.saitama.jp +niiza.saitama.jp +ogano.saitama.jp +ogawa.saitama.jp +ogose.saitama.jp +okegawa.saitama.jp +omiya.saitama.jp +otaki.saitama.jp +ranzan.saitama.jp +ryokami.saitama.jp +saitama.saitama.jp +sakado.saitama.jp +satte.saitama.jp +sayama.saitama.jp +shiki.saitama.jp +shiraoka.saitama.jp +soka.saitama.jp +sugito.saitama.jp +toda.saitama.jp +tokigawa.saitama.jp +tokorozawa.saitama.jp +tsurugashima.saitama.jp +urawa.saitama.jp +warabi.saitama.jp +yashio.saitama.jp +yokoze.saitama.jp +yono.saitama.jp +yorii.saitama.jp +yoshida.saitama.jp +yoshikawa.saitama.jp +yoshimi.saitama.jp +aisho.shiga.jp +gamo.shiga.jp +higashiomi.shiga.jp +hikone.shiga.jp +koka.shiga.jp +konan.shiga.jp +kosei.shiga.jp +koto.shiga.jp +kusatsu.shiga.jp +maibara.shiga.jp +moriyama.shiga.jp +nagahama.shiga.jp +nishiazai.shiga.jp +notogawa.shiga.jp +omihachiman.shiga.jp +otsu.shiga.jp +ritto.shiga.jp +ryuoh.shiga.jp +takashima.shiga.jp +takatsuki.shiga.jp +torahime.shiga.jp +toyosato.shiga.jp +yasu.shiga.jp +akagi.shimane.jp +ama.shimane.jp +gotsu.shimane.jp +hamada.shimane.jp +higashiizumo.shimane.jp +hikawa.shimane.jp +hikimi.shimane.jp +izumo.shimane.jp +kakinoki.shimane.jp +masuda.shimane.jp +matsue.shimane.jp +misato.shimane.jp +nishinoshima.shimane.jp +ohda.shimane.jp +okinoshima.shimane.jp +okuizumo.shimane.jp +shimane.shimane.jp +tamayu.shimane.jp +tsuwano.shimane.jp +unnan.shimane.jp +yakumo.shimane.jp +yasugi.shimane.jp +yatsuka.shimane.jp +arai.shizuoka.jp +atami.shizuoka.jp +fuji.shizuoka.jp +fujieda.shizuoka.jp +fujikawa.shizuoka.jp +fujinomiya.shizuoka.jp +fukuroi.shizuoka.jp +gotemba.shizuoka.jp +haibara.shizuoka.jp +hamamatsu.shizuoka.jp +higashiizu.shizuoka.jp +ito.shizuoka.jp +iwata.shizuoka.jp +izu.shizuoka.jp +izunokuni.shizuoka.jp +kakegawa.shizuoka.jp +kannami.shizuoka.jp +kawanehon.shizuoka.jp +kawazu.shizuoka.jp +kikugawa.shizuoka.jp +kosai.shizuoka.jp +makinohara.shizuoka.jp +matsuzaki.shizuoka.jp +minamiizu.shizuoka.jp +mishima.shizuoka.jp +morimachi.shizuoka.jp +nishiizu.shizuoka.jp +numazu.shizuoka.jp +omaezaki.shizuoka.jp +shimada.shizuoka.jp +shimizu.shizuoka.jp +shimoda.shizuoka.jp +shizuoka.shizuoka.jp +susono.shizuoka.jp +yaizu.shizuoka.jp +yoshida.shizuoka.jp +ashikaga.tochigi.jp +bato.tochigi.jp +haga.tochigi.jp +ichikai.tochigi.jp +iwafune.tochigi.jp +kaminokawa.tochigi.jp +kanuma.tochigi.jp +karasuyama.tochigi.jp +kuroiso.tochigi.jp +mashiko.tochigi.jp +mibu.tochigi.jp +moka.tochigi.jp +motegi.tochigi.jp +nasu.tochigi.jp +nasushiobara.tochigi.jp +nikko.tochigi.jp +nishikata.tochigi.jp +nogi.tochigi.jp +ohira.tochigi.jp +ohtawara.tochigi.jp +oyama.tochigi.jp +sakura.tochigi.jp +sano.tochigi.jp +shimotsuke.tochigi.jp +shioya.tochigi.jp +takanezawa.tochigi.jp +tochigi.tochigi.jp +tsuga.tochigi.jp +ujiie.tochigi.jp +utsunomiya.tochigi.jp +yaita.tochigi.jp +aizumi.tokushima.jp +anan.tokushima.jp +ichiba.tokushima.jp +itano.tokushima.jp +kainan.tokushima.jp +komatsushima.tokushima.jp +matsushige.tokushima.jp +mima.tokushima.jp +minami.tokushima.jp +miyoshi.tokushima.jp +mugi.tokushima.jp +nakagawa.tokushima.jp +naruto.tokushima.jp +sanagochi.tokushima.jp +shishikui.tokushima.jp +tokushima.tokushima.jp +wajiki.tokushima.jp +adachi.tokyo.jp +akiruno.tokyo.jp +akishima.tokyo.jp +aogashima.tokyo.jp +arakawa.tokyo.jp +bunkyo.tokyo.jp +chiyoda.tokyo.jp +chofu.tokyo.jp +chuo.tokyo.jp +edogawa.tokyo.jp +fuchu.tokyo.jp +fussa.tokyo.jp +hachijo.tokyo.jp +hachioji.tokyo.jp +hamura.tokyo.jp +higashikurume.tokyo.jp +higashimurayama.tokyo.jp +higashiyamato.tokyo.jp +hino.tokyo.jp +hinode.tokyo.jp +hinohara.tokyo.jp +inagi.tokyo.jp +itabashi.tokyo.jp +katsushika.tokyo.jp +kita.tokyo.jp +kiyose.tokyo.jp +kodaira.tokyo.jp +koganei.tokyo.jp +kokubunji.tokyo.jp +komae.tokyo.jp +koto.tokyo.jp +kouzushima.tokyo.jp +kunitachi.tokyo.jp +machida.tokyo.jp +meguro.tokyo.jp +minato.tokyo.jp +mitaka.tokyo.jp +mizuho.tokyo.jp +musashimurayama.tokyo.jp +musashino.tokyo.jp +nakano.tokyo.jp +nerima.tokyo.jp +ogasawara.tokyo.jp +okutama.tokyo.jp +ome.tokyo.jp +oshima.tokyo.jp +ota.tokyo.jp +setagaya.tokyo.jp +shibuya.tokyo.jp +shinagawa.tokyo.jp +shinjuku.tokyo.jp +suginami.tokyo.jp +sumida.tokyo.jp +tachikawa.tokyo.jp +taito.tokyo.jp +tama.tokyo.jp +toshima.tokyo.jp +chizu.tottori.jp +hino.tottori.jp +kawahara.tottori.jp +koge.tottori.jp +kotoura.tottori.jp +misasa.tottori.jp +nanbu.tottori.jp +nichinan.tottori.jp +sakaiminato.tottori.jp +tottori.tottori.jp +wakasa.tottori.jp +yazu.tottori.jp +yonago.tottori.jp +asahi.toyama.jp +fuchu.toyama.jp +fukumitsu.toyama.jp +funahashi.toyama.jp +himi.toyama.jp +imizu.toyama.jp +inami.toyama.jp +johana.toyama.jp +kamiichi.toyama.jp +kurobe.toyama.jp +nakaniikawa.toyama.jp +namerikawa.toyama.jp +nanto.toyama.jp +nyuzen.toyama.jp +oyabe.toyama.jp +taira.toyama.jp +takaoka.toyama.jp +tateyama.toyama.jp +toga.toyama.jp +tonami.toyama.jp +toyama.toyama.jp +unazuki.toyama.jp +uozu.toyama.jp +yamada.toyama.jp +arida.wakayama.jp +aridagawa.wakayama.jp +gobo.wakayama.jp +hashimoto.wakayama.jp +hidaka.wakayama.jp +hirogawa.wakayama.jp +inami.wakayama.jp +iwade.wakayama.jp +kainan.wakayama.jp +kamitonda.wakayama.jp +katsuragi.wakayama.jp +kimino.wakayama.jp +kinokawa.wakayama.jp +kitayama.wakayama.jp +koya.wakayama.jp +koza.wakayama.jp +kozagawa.wakayama.jp +kudoyama.wakayama.jp +kushimoto.wakayama.jp +mihama.wakayama.jp +misato.wakayama.jp +nachikatsuura.wakayama.jp +shingu.wakayama.jp +shirahama.wakayama.jp +taiji.wakayama.jp +tanabe.wakayama.jp +wakayama.wakayama.jp +yuasa.wakayama.jp +yura.wakayama.jp +asahi.yamagata.jp +funagata.yamagata.jp +higashine.yamagata.jp +iide.yamagata.jp +kahoku.yamagata.jp +kaminoyama.yamagata.jp +kaneyama.yamagata.jp +kawanishi.yamagata.jp +mamurogawa.yamagata.jp +mikawa.yamagata.jp +murayama.yamagata.jp +nagai.yamagata.jp +nakayama.yamagata.jp +nanyo.yamagata.jp +nishikawa.yamagata.jp +obanazawa.yamagata.jp +oe.yamagata.jp +oguni.yamagata.jp +ohkura.yamagata.jp +oishida.yamagata.jp +sagae.yamagata.jp +sakata.yamagata.jp +sakegawa.yamagata.jp +shinjo.yamagata.jp +shirataka.yamagata.jp +shonai.yamagata.jp +takahata.yamagata.jp +tendo.yamagata.jp +tozawa.yamagata.jp +tsuruoka.yamagata.jp +yamagata.yamagata.jp +yamanobe.yamagata.jp +yonezawa.yamagata.jp +yuza.yamagata.jp +abu.yamaguchi.jp +hagi.yamaguchi.jp +hikari.yamaguchi.jp +hofu.yamaguchi.jp +iwakuni.yamaguchi.jp +kudamatsu.yamaguchi.jp +mitou.yamaguchi.jp +nagato.yamaguchi.jp +oshima.yamaguchi.jp +shimonoseki.yamaguchi.jp +shunan.yamaguchi.jp +tabuse.yamaguchi.jp +tokuyama.yamaguchi.jp +toyota.yamaguchi.jp +ube.yamaguchi.jp +yuu.yamaguchi.jp +chuo.yamanashi.jp +doshi.yamanashi.jp +fuefuki.yamanashi.jp +fujikawa.yamanashi.jp +fujikawaguchiko.yamanashi.jp +fujiyoshida.yamanashi.jp +hayakawa.yamanashi.jp +hokuto.yamanashi.jp +ichikawamisato.yamanashi.jp +kai.yamanashi.jp +kofu.yamanashi.jp +koshu.yamanashi.jp +kosuge.yamanashi.jp +minami-alps.yamanashi.jp +minobu.yamanashi.jp +nakamichi.yamanashi.jp +nanbu.yamanashi.jp +narusawa.yamanashi.jp +nirasaki.yamanashi.jp +nishikatsura.yamanashi.jp +oshino.yamanashi.jp +otsuki.yamanashi.jp +showa.yamanashi.jp +tabayama.yamanashi.jp +tsuru.yamanashi.jp +uenohara.yamanashi.jp +yamanakako.yamanashi.jp +yamanashi.yamanashi.jp + +// ke : http://www.kenic.or.ke/index.php?option=com_content&task=view&id=117&Itemid=145 +*.ke + +// kg : http://www.domain.kg/dmn_n.html +kg +org.kg +net.kg +com.kg +edu.kg +gov.kg +mil.kg + +// kh : http://www.mptc.gov.kh/dns_registration.htm +*.kh + +// ki : http://www.ki/dns/index.html +ki +edu.ki +biz.ki +net.ki +org.ki +gov.ki +info.ki +com.ki + +// km : https://en.wikipedia.org/wiki/.km +// http://www.domaine.km/documents/charte.doc +km +org.km +nom.km +gov.km +prd.km +tm.km +edu.km +mil.km +ass.km +com.km +// These are only mentioned as proposed suggestions at domaine.km, but +// https://en.wikipedia.org/wiki/.km says they're available for registration: +coop.km +asso.km +presse.km +medecin.km +notaires.km +pharmaciens.km +veterinaire.km +gouv.km + +// kn : https://en.wikipedia.org/wiki/.kn +// http://www.dot.kn/domainRules.html +kn +net.kn +org.kn +edu.kn +gov.kn + +// kp : http://www.kcce.kp/en_index.php +kp +com.kp +edu.kp +gov.kp +org.kp +rep.kp +tra.kp + +// kr : https://en.wikipedia.org/wiki/.kr +// see also: http://domain.nida.or.kr/eng/registration.jsp +kr +ac.kr +co.kr +es.kr +go.kr +hs.kr +kg.kr +mil.kr +ms.kr +ne.kr +or.kr +pe.kr +re.kr +sc.kr +// kr geographical names +busan.kr +chungbuk.kr +chungnam.kr +daegu.kr +daejeon.kr +gangwon.kr +gwangju.kr +gyeongbuk.kr +gyeonggi.kr +gyeongnam.kr +incheon.kr +jeju.kr +jeonbuk.kr +jeonnam.kr +seoul.kr +ulsan.kr + +// kw : https://en.wikipedia.org/wiki/.kw +*.kw + +// ky : http://www.icta.ky/da_ky_reg_dom.php +// Confirmed by registry 2008-06-17 +ky +edu.ky +gov.ky +com.ky +org.ky +net.ky + +// kz : https://en.wikipedia.org/wiki/.kz +// see also: http://www.nic.kz/rules/index.jsp +kz +org.kz +edu.kz +net.kz +gov.kz +mil.kz +com.kz + +// la : https://en.wikipedia.org/wiki/.la +// Submitted by registry +la +int.la +net.la +info.la +edu.la +gov.la +per.la +com.la +org.la + +// lb : https://en.wikipedia.org/wiki/.lb +// Submitted by registry +lb +com.lb +edu.lb +gov.lb +net.lb +org.lb + +// lc : https://en.wikipedia.org/wiki/.lc +// see also: http://www.nic.lc/rules.htm +lc +com.lc +net.lc +co.lc +org.lc +edu.lc +gov.lc + +// li : https://en.wikipedia.org/wiki/.li +li + +// lk : http://www.nic.lk/seclevpr.html +lk +gov.lk +sch.lk +net.lk +int.lk +com.lk +org.lk +edu.lk +ngo.lk +soc.lk +web.lk +ltd.lk +assn.lk +grp.lk +hotel.lk +ac.lk + +// lr : http://psg.com/dns/lr/lr.txt +// Submitted by registry +lr +com.lr +edu.lr +gov.lr +org.lr +net.lr + +// ls : https://en.wikipedia.org/wiki/.ls +ls +co.ls +org.ls + +// lt : https://en.wikipedia.org/wiki/.lt +lt +// gov.lt : http://www.gov.lt/index_en.php +gov.lt + +// lu : http://www.dns.lu/en/ +lu + +// lv : http://www.nic.lv/DNS/En/generic.php +lv +com.lv +edu.lv +gov.lv +org.lv +mil.lv +id.lv +net.lv +asn.lv +conf.lv + +// ly : http://www.nic.ly/regulations.php +ly +com.ly +net.ly +gov.ly +plc.ly +edu.ly +sch.ly +med.ly +org.ly +id.ly + +// ma : https://en.wikipedia.org/wiki/.ma +// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf +ma +co.ma +net.ma +gov.ma +org.ma +ac.ma +press.ma + +// mc : http://www.nic.mc/ +mc +tm.mc +asso.mc + +// md : https://en.wikipedia.org/wiki/.md +md + +// me : https://en.wikipedia.org/wiki/.me +me +co.me +net.me +org.me +edu.me +ac.me +gov.me +its.me +priv.me + +// mg : http://nic.mg/nicmg/?page_id=39 +mg +org.mg +nom.mg +gov.mg +prd.mg +tm.mg +edu.mg +mil.mg +com.mg +co.mg + +// mh : https://en.wikipedia.org/wiki/.mh +mh + +// mil : https://en.wikipedia.org/wiki/.mil +mil + +// mk : https://en.wikipedia.org/wiki/.mk +// see also: http://dns.marnet.net.mk/postapka.php +mk +com.mk +org.mk +net.mk +edu.mk +gov.mk +inf.mk +name.mk + +// ml : http://www.gobin.info/domainname/ml-template.doc +// see also: https://en.wikipedia.org/wiki/.ml +ml +com.ml +edu.ml +gouv.ml +gov.ml +net.ml +org.ml +presse.ml + +// mm : https://en.wikipedia.org/wiki/.mm +*.mm + +// mn : https://en.wikipedia.org/wiki/.mn +mn +gov.mn +edu.mn +org.mn + +// mo : http://www.monic.net.mo/ +mo +com.mo +net.mo +org.mo +edu.mo +gov.mo + +// mobi : https://en.wikipedia.org/wiki/.mobi +mobi + +// mp : http://www.dot.mp/ +// Confirmed by registry 2008-06-17 +mp + +// mq : https://en.wikipedia.org/wiki/.mq +mq + +// mr : https://en.wikipedia.org/wiki/.mr +mr +gov.mr + +// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf +ms +com.ms +edu.ms +gov.ms +net.ms +org.ms + +// mt : https://www.nic.org.mt/go/policy +// Submitted by registry +mt +com.mt +edu.mt +net.mt +org.mt + +// mu : https://en.wikipedia.org/wiki/.mu +mu +com.mu +net.mu +org.mu +gov.mu +ac.mu +co.mu +or.mu + +// museum : http://about.museum/naming/ +// http://index.museum/ +museum +academy.museum +agriculture.museum +air.museum +airguard.museum +alabama.museum +alaska.museum +amber.museum +ambulance.museum +american.museum +americana.museum +americanantiques.museum +americanart.museum +amsterdam.museum +and.museum +annefrank.museum +anthro.museum +anthropology.museum +antiques.museum +aquarium.museum +arboretum.museum +archaeological.museum +archaeology.museum +architecture.museum +art.museum +artanddesign.museum +artcenter.museum +artdeco.museum +arteducation.museum +artgallery.museum +arts.museum +artsandcrafts.museum +asmatart.museum +assassination.museum +assisi.museum +association.museum +astronomy.museum +atlanta.museum +austin.museum +australia.museum +automotive.museum +aviation.museum +axis.museum +badajoz.museum +baghdad.museum +bahn.museum +bale.museum +baltimore.museum +barcelona.museum +baseball.museum +basel.museum +baths.museum +bauern.museum +beauxarts.museum +beeldengeluid.museum +bellevue.museum +bergbau.museum +berkeley.museum +berlin.museum +bern.museum +bible.museum +bilbao.museum +bill.museum +birdart.museum +birthplace.museum +bonn.museum +boston.museum +botanical.museum +botanicalgarden.museum +botanicgarden.museum +botany.museum +brandywinevalley.museum +brasil.museum +bristol.museum +british.museum +britishcolumbia.museum +broadcast.museum +brunel.museum +brussel.museum +brussels.museum +bruxelles.museum +building.museum +burghof.museum +bus.museum +bushey.museum +cadaques.museum +california.museum +cambridge.museum +can.museum +canada.museum +capebreton.museum +carrier.museum +cartoonart.museum +casadelamoneda.museum +castle.museum +castres.museum +celtic.museum +center.museum +chattanooga.museum +cheltenham.museum +chesapeakebay.museum +chicago.museum +children.museum +childrens.museum +childrensgarden.museum +chiropractic.museum +chocolate.museum +christiansburg.museum +cincinnati.museum +cinema.museum +circus.museum +civilisation.museum +civilization.museum +civilwar.museum +clinton.museum +clock.museum +coal.museum +coastaldefence.museum +cody.museum +coldwar.museum +collection.museum +colonialwilliamsburg.museum +coloradoplateau.museum +columbia.museum +columbus.museum +communication.museum +communications.museum +community.museum +computer.museum +computerhistory.museum +comunicações.museum +contemporary.museum +contemporaryart.museum +convent.museum +copenhagen.museum +corporation.museum +correios-e-telecomunicações.museum +corvette.museum +costume.museum +countryestate.museum +county.museum +crafts.museum +cranbrook.museum +creation.museum +cultural.museum +culturalcenter.museum +culture.museum +cyber.museum +cymru.museum +dali.museum +dallas.museum +database.museum +ddr.museum +decorativearts.museum +delaware.museum +delmenhorst.museum +denmark.museum +depot.museum +design.museum +detroit.museum +dinosaur.museum +discovery.museum +dolls.museum +donostia.museum +durham.museum +eastafrica.museum +eastcoast.museum +education.museum +educational.museum +egyptian.museum +eisenbahn.museum +elburg.museum +elvendrell.museum +embroidery.museum +encyclopedic.museum +england.museum +entomology.museum +environment.museum +environmentalconservation.museum +epilepsy.museum +essex.museum +estate.museum +ethnology.museum +exeter.museum +exhibition.museum +family.museum +farm.museum +farmequipment.museum +farmers.museum +farmstead.museum +field.museum +figueres.museum +filatelia.museum +film.museum +fineart.museum +finearts.museum +finland.museum +flanders.museum +florida.museum +force.museum +fortmissoula.museum +fortworth.museum +foundation.museum +francaise.museum +frankfurt.museum +franziskaner.museum +freemasonry.museum +freiburg.museum +fribourg.museum +frog.museum +fundacio.museum +furniture.museum +gallery.museum +garden.museum +gateway.museum +geelvinck.museum +gemological.museum +geology.museum +georgia.museum +giessen.museum +glas.museum +glass.museum +gorge.museum +grandrapids.museum +graz.museum +guernsey.museum +halloffame.museum +hamburg.museum +handson.museum +harvestcelebration.museum +hawaii.museum +health.museum +heimatunduhren.museum +hellas.museum +helsinki.museum +hembygdsforbund.museum +heritage.museum +histoire.museum +historical.museum +historicalsociety.museum +historichouses.museum +historisch.museum +historisches.museum +history.museum +historyofscience.museum +horology.museum +house.museum +humanities.museum +illustration.museum +imageandsound.museum +indian.museum +indiana.museum +indianapolis.museum +indianmarket.museum +intelligence.museum +interactive.museum +iraq.museum +iron.museum +isleofman.museum +jamison.museum +jefferson.museum +jerusalem.museum +jewelry.museum +jewish.museum +jewishart.museum +jfk.museum +journalism.museum +judaica.museum +judygarland.museum +juedisches.museum +juif.museum +karate.museum +karikatur.museum +kids.museum +koebenhavn.museum +koeln.museum +kunst.museum +kunstsammlung.museum +kunstunddesign.museum +labor.museum +labour.museum +lajolla.museum +lancashire.museum +landes.museum +lans.museum +läns.museum +larsson.museum +lewismiller.museum +lincoln.museum +linz.museum +living.museum +livinghistory.museum +localhistory.museum +london.museum +losangeles.museum +louvre.museum +loyalist.museum +lucerne.museum +luxembourg.museum +luzern.museum +mad.museum +madrid.museum +mallorca.museum +manchester.museum +mansion.museum +mansions.museum +manx.museum +marburg.museum +maritime.museum +maritimo.museum +maryland.museum +marylhurst.museum +media.museum +medical.museum +medizinhistorisches.museum +meeres.museum +memorial.museum +mesaverde.museum +michigan.museum +midatlantic.museum +military.museum +mill.museum +miners.museum +mining.museum +minnesota.museum +missile.museum +missoula.museum +modern.museum +moma.museum +money.museum +monmouth.museum +monticello.museum +montreal.museum +moscow.museum +motorcycle.museum +muenchen.museum +muenster.museum +mulhouse.museum +muncie.museum +museet.museum +museumcenter.museum +museumvereniging.museum +music.museum +national.museum +nationalfirearms.museum +nationalheritage.museum +nativeamerican.museum +naturalhistory.museum +naturalhistorymuseum.museum +naturalsciences.museum +nature.museum +naturhistorisches.museum +natuurwetenschappen.museum +naumburg.museum +naval.museum +nebraska.museum +neues.museum +newhampshire.museum +newjersey.museum +newmexico.museum +newport.museum +newspaper.museum +newyork.museum +niepce.museum +norfolk.museum +north.museum +nrw.museum +nuernberg.museum +nuremberg.museum +nyc.museum +nyny.museum +oceanographic.museum +oceanographique.museum +omaha.museum +online.museum +ontario.museum +openair.museum +oregon.museum +oregontrail.museum +otago.museum +oxford.museum +pacific.museum +paderborn.museum +palace.museum +paleo.museum +palmsprings.museum +panama.museum +paris.museum +pasadena.museum +pharmacy.museum +philadelphia.museum +philadelphiaarea.museum +philately.museum +phoenix.museum +photography.museum +pilots.museum +pittsburgh.museum +planetarium.museum +plantation.museum +plants.museum +plaza.museum +portal.museum +portland.museum +portlligat.museum +posts-and-telecommunications.museum +preservation.museum +presidio.museum +press.museum +project.museum +public.museum +pubol.museum +quebec.museum +railroad.museum +railway.museum +research.museum +resistance.museum +riodejaneiro.museum +rochester.museum +rockart.museum +roma.museum +russia.museum +saintlouis.museum +salem.museum +salvadordali.museum +salzburg.museum +sandiego.museum +sanfrancisco.museum +santabarbara.museum +santacruz.museum +santafe.museum +saskatchewan.museum +satx.museum +savannahga.museum +schlesisches.museum +schoenbrunn.museum +schokoladen.museum +school.museum +schweiz.museum +science.museum +scienceandhistory.museum +scienceandindustry.museum +sciencecenter.museum +sciencecenters.museum +science-fiction.museum +sciencehistory.museum +sciences.museum +sciencesnaturelles.museum +scotland.museum +seaport.museum +settlement.museum +settlers.museum +shell.museum +sherbrooke.museum +sibenik.museum +silk.museum +ski.museum +skole.museum +society.museum +sologne.museum +soundandvision.museum +southcarolina.museum +southwest.museum +space.museum +spy.museum +square.museum +stadt.museum +stalbans.museum +starnberg.museum +state.museum +stateofdelaware.museum +station.museum +steam.museum +steiermark.museum +stjohn.museum +stockholm.museum +stpetersburg.museum +stuttgart.museum +suisse.museum +surgeonshall.museum +surrey.museum +svizzera.museum +sweden.museum +sydney.museum +tank.museum +tcm.museum +technology.museum +telekommunikation.museum +television.museum +texas.museum +textile.museum +theater.museum +time.museum +timekeeping.museum +topology.museum +torino.museum +touch.museum +town.museum +transport.museum +tree.museum +trolley.museum +trust.museum +trustee.museum +uhren.museum +ulm.museum +undersea.museum +university.museum +usa.museum +usantiques.museum +usarts.museum +uscountryestate.museum +usculture.museum +usdecorativearts.museum +usgarden.museum +ushistory.museum +ushuaia.museum +uslivinghistory.museum +utah.museum +uvic.museum +valley.museum +vantaa.museum +versailles.museum +viking.museum +village.museum +virginia.museum +virtual.museum +virtuel.museum +vlaanderen.museum +volkenkunde.museum +wales.museum +wallonie.museum +war.museum +washingtondc.museum +watchandclock.museum +watch-and-clock.museum +western.museum +westfalen.museum +whaling.museum +wildlife.museum +williamsburg.museum +windmill.museum +workshop.museum +york.museum +yorkshire.museum +yosemite.museum +youth.museum +zoological.museum +zoology.museum +ירושלים.museum +иком.museum + +// mv : https://en.wikipedia.org/wiki/.mv +// "mv" included because, contra Wikipedia, google.mv exists. +mv +aero.mv +biz.mv +com.mv +coop.mv +edu.mv +gov.mv +info.mv +int.mv +mil.mv +museum.mv +name.mv +net.mv +org.mv +pro.mv + +// mw : http://www.registrar.mw/ +mw +ac.mw +biz.mw +co.mw +com.mw +coop.mw +edu.mw +gov.mw +int.mw +museum.mw +net.mw +org.mw + +// mx : http://www.nic.mx/ +// Submitted by registry +mx +com.mx +org.mx +gob.mx +edu.mx +net.mx + +// my : http://www.mynic.net.my/ +my +com.my +net.my +org.my +gov.my +edu.my +mil.my +name.my + +// mz : http://www.uem.mz/ +// Submitted by registry +mz +ac.mz +adv.mz +co.mz +edu.mz +gov.mz +mil.mz +net.mz +org.mz + +// na : http://www.na-nic.com.na/ +// http://www.info.na/domain/ +na +info.na +pro.na +name.na +school.na +or.na +dr.na +us.na +mx.na +ca.na +in.na +cc.na +tv.na +ws.na +mobi.na +co.na +com.na +org.na + +// name : has 2nd-level tlds, but there's no list of them +name + +// nc : http://www.cctld.nc/ +nc +asso.nc +nom.nc + +// ne : https://en.wikipedia.org/wiki/.ne +ne + +// net : https://en.wikipedia.org/wiki/.net +net + +// nf : https://en.wikipedia.org/wiki/.nf +nf +com.nf +net.nf +per.nf +rec.nf +web.nf +arts.nf +firm.nf +info.nf +other.nf +store.nf + +// ng : http://www.nira.org.ng/index.php/join-us/register-ng-domain/189-nira-slds +ng +com.ng +edu.ng +gov.ng +i.ng +mil.ng +mobi.ng +name.ng +net.ng +org.ng +sch.ng + +// ni : http://www.nic.ni/ +ni +ac.ni +biz.ni +co.ni +com.ni +edu.ni +gob.ni +in.ni +info.ni +int.ni +mil.ni +net.ni +nom.ni +org.ni +web.ni + +// nl : https://en.wikipedia.org/wiki/.nl +// https://www.sidn.nl/ +// ccTLD for the Netherlands +nl + +// BV.nl will be a registry for dutch BV's (besloten vennootschap) +bv.nl + +// no : http://www.norid.no/regelverk/index.en.html +// The Norwegian registry has declined to notify us of updates. The web pages +// referenced below are the official source of the data. There is also an +// announce mailing list: +// https://postlister.uninett.no/sympa/info/norid-diskusjon +no +// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html +fhs.no +vgs.no +fylkesbibl.no +folkebibl.no +museum.no +idrett.no +priv.no +// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html +mil.no +stat.no +dep.no +kommune.no +herad.no +// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html +// counties +aa.no +ah.no +bu.no +fm.no +hl.no +hm.no +jan-mayen.no +mr.no +nl.no +nt.no +of.no +ol.no +oslo.no +rl.no +sf.no +st.no +svalbard.no +tm.no +tr.no +va.no +vf.no +// primary and lower secondary schools per county +gs.aa.no +gs.ah.no +gs.bu.no +gs.fm.no +gs.hl.no +gs.hm.no +gs.jan-mayen.no +gs.mr.no +gs.nl.no +gs.nt.no +gs.of.no +gs.ol.no +gs.oslo.no +gs.rl.no +gs.sf.no +gs.st.no +gs.svalbard.no +gs.tm.no +gs.tr.no +gs.va.no +gs.vf.no +// cities +akrehamn.no +åkrehamn.no +algard.no +ålgård.no +arna.no +brumunddal.no +bryne.no +bronnoysund.no +brønnøysund.no +drobak.no +drøbak.no +egersund.no +fetsund.no +floro.no +florø.no +fredrikstad.no +hokksund.no +honefoss.no +hønefoss.no +jessheim.no +jorpeland.no +jørpeland.no +kirkenes.no +kopervik.no +krokstadelva.no +langevag.no +langevåg.no +leirvik.no +mjondalen.no +mjøndalen.no +mo-i-rana.no +mosjoen.no +mosjøen.no +nesoddtangen.no +orkanger.no +osoyro.no +osøyro.no +raholt.no +råholt.no +sandnessjoen.no +sandnessjøen.no +skedsmokorset.no +slattum.no +spjelkavik.no +stathelle.no +stavern.no +stjordalshalsen.no +stjørdalshalsen.no +tananger.no +tranby.no +vossevangen.no +// communities +afjord.no +åfjord.no +agdenes.no +al.no +ål.no +alesund.no +ålesund.no +alstahaug.no +alta.no +áltá.no +alaheadju.no +álaheadju.no +alvdal.no +amli.no +åmli.no +amot.no +åmot.no +andebu.no +andoy.no +andøy.no +andasuolo.no +ardal.no +årdal.no +aremark.no +arendal.no +ås.no +aseral.no +åseral.no +asker.no +askim.no +askvoll.no +askoy.no +askøy.no +asnes.no +åsnes.no +audnedaln.no +aukra.no +aure.no +aurland.no +aurskog-holand.no +aurskog-høland.no +austevoll.no +austrheim.no +averoy.no +averøy.no +balestrand.no +ballangen.no +balat.no +bálát.no +balsfjord.no +bahccavuotna.no +báhccavuotna.no +bamble.no +bardu.no +beardu.no +beiarn.no +bajddar.no +bájddar.no +baidar.no +báidár.no +berg.no +bergen.no +berlevag.no +berlevåg.no +bearalvahki.no +bearalváhki.no +bindal.no +birkenes.no +bjarkoy.no +bjarkøy.no +bjerkreim.no +bjugn.no +bodo.no +bodø.no +badaddja.no +bådåddjå.no +budejju.no +bokn.no +bremanger.no +bronnoy.no +brønnøy.no +bygland.no +bykle.no +barum.no +bærum.no +bo.telemark.no +bø.telemark.no +bo.nordland.no +bø.nordland.no +bievat.no +bievát.no +bomlo.no +bømlo.no +batsfjord.no +båtsfjord.no +bahcavuotna.no +báhcavuotna.no +dovre.no +drammen.no +drangedal.no +dyroy.no +dyrøy.no +donna.no +dønna.no +eid.no +eidfjord.no +eidsberg.no +eidskog.no +eidsvoll.no +eigersund.no +elverum.no +enebakk.no +engerdal.no +etne.no +etnedal.no +evenes.no +evenassi.no +evenášši.no +evje-og-hornnes.no +farsund.no +fauske.no +fuossko.no +fuoisku.no +fedje.no +fet.no +finnoy.no +finnøy.no +fitjar.no +fjaler.no +fjell.no +flakstad.no +flatanger.no +flekkefjord.no +flesberg.no +flora.no +fla.no +flå.no +folldal.no +forsand.no +fosnes.no +frei.no +frogn.no +froland.no +frosta.no +frana.no +fræna.no +froya.no +frøya.no +fusa.no +fyresdal.no +forde.no +førde.no +gamvik.no +gangaviika.no +gáŋgaviika.no +gaular.no +gausdal.no +gildeskal.no +gildeskål.no +giske.no +gjemnes.no +gjerdrum.no +gjerstad.no +gjesdal.no +gjovik.no +gjøvik.no +gloppen.no +gol.no +gran.no +grane.no +granvin.no +gratangen.no +grimstad.no +grong.no +kraanghke.no +kråanghke.no +grue.no +gulen.no +hadsel.no +halden.no +halsa.no +hamar.no +hamaroy.no +habmer.no +hábmer.no +hapmir.no +hápmir.no +hammerfest.no +hammarfeasta.no +hámmárfeasta.no +haram.no +hareid.no +harstad.no +hasvik.no +aknoluokta.no +ákŋoluokta.no +hattfjelldal.no +aarborte.no +haugesund.no +hemne.no +hemnes.no +hemsedal.no +heroy.more-og-romsdal.no +herøy.møre-og-romsdal.no +heroy.nordland.no +herøy.nordland.no +hitra.no +hjartdal.no +hjelmeland.no +hobol.no +hobøl.no +hof.no +hol.no +hole.no +holmestrand.no +holtalen.no +holtålen.no +hornindal.no +horten.no +hurdal.no +hurum.no +hvaler.no +hyllestad.no +hagebostad.no +hægebostad.no +hoyanger.no +høyanger.no +hoylandet.no +høylandet.no +ha.no +hå.no +ibestad.no +inderoy.no +inderøy.no +iveland.no +jevnaker.no +jondal.no +jolster.no +jølster.no +karasjok.no +karasjohka.no +kárášjohka.no +karlsoy.no +galsa.no +gálsá.no +karmoy.no +karmøy.no +kautokeino.no +guovdageaidnu.no +klepp.no +klabu.no +klæbu.no +kongsberg.no +kongsvinger.no +kragero.no +kragerø.no +kristiansand.no +kristiansund.no +krodsherad.no +krødsherad.no +kvalsund.no +rahkkeravju.no +ráhkkerávju.no +kvam.no +kvinesdal.no +kvinnherad.no +kviteseid.no +kvitsoy.no +kvitsøy.no +kvafjord.no +kvæfjord.no +giehtavuoatna.no +kvanangen.no +kvænangen.no +navuotna.no +návuotna.no +kafjord.no +kåfjord.no +gaivuotna.no +gáivuotna.no +larvik.no +lavangen.no +lavagis.no +loabat.no +loabát.no +lebesby.no +davvesiida.no +leikanger.no +leirfjord.no +leka.no +leksvik.no +lenvik.no +leangaviika.no +leaŋgaviika.no +lesja.no +levanger.no +lier.no +lierne.no +lillehammer.no +lillesand.no +lindesnes.no +lindas.no +lindås.no +lom.no +loppa.no +lahppi.no +láhppi.no +lund.no +lunner.no +luroy.no +lurøy.no +luster.no +lyngdal.no +lyngen.no +ivgu.no +lardal.no +lerdal.no +lærdal.no +lodingen.no +lødingen.no +lorenskog.no +lørenskog.no +loten.no +løten.no +malvik.no +masoy.no +måsøy.no +muosat.no +muosát.no +mandal.no +marker.no +marnardal.no +masfjorden.no +meland.no +meldal.no +melhus.no +meloy.no +meløy.no +meraker.no +meråker.no +moareke.no +moåreke.no +midsund.no +midtre-gauldal.no +modalen.no +modum.no +molde.no +moskenes.no +moss.no +mosvik.no +malselv.no +målselv.no +malatvuopmi.no +málatvuopmi.no +namdalseid.no +aejrie.no +namsos.no +namsskogan.no +naamesjevuemie.no +nååmesjevuemie.no +laakesvuemie.no +nannestad.no +narvik.no +narviika.no +naustdal.no +nedre-eiker.no +nes.akershus.no +nes.buskerud.no +nesna.no +nesodden.no +nesseby.no +unjarga.no +unjárga.no +nesset.no +nissedal.no +nittedal.no +nord-aurdal.no +nord-fron.no +nord-odal.no +norddal.no +nordkapp.no +davvenjarga.no +davvenjárga.no +nordre-land.no +nordreisa.no +raisa.no +ráisa.no +nore-og-uvdal.no +notodden.no +naroy.no +nærøy.no +notteroy.no +nøtterøy.no +odda.no +oksnes.no +øksnes.no +oppdal.no +oppegard.no +oppegård.no +orkdal.no +orland.no +ørland.no +orskog.no +ørskog.no +orsta.no +ørsta.no +os.hedmark.no +os.hordaland.no +osen.no +osteroy.no +osterøy.no +ostre-toten.no +østre-toten.no +overhalla.no +ovre-eiker.no +øvre-eiker.no +oyer.no +øyer.no +oygarden.no +øygarden.no +oystre-slidre.no +øystre-slidre.no +porsanger.no +porsangu.no +porsáŋgu.no +porsgrunn.no +radoy.no +radøy.no +rakkestad.no +rana.no +ruovat.no +randaberg.no +rauma.no +rendalen.no +rennebu.no +rennesoy.no +rennesøy.no +rindal.no +ringebu.no +ringerike.no +ringsaker.no +rissa.no +risor.no +risør.no +roan.no +rollag.no +rygge.no +ralingen.no +rælingen.no +rodoy.no +rødøy.no +romskog.no +rømskog.no +roros.no +røros.no +rost.no +røst.no +royken.no +røyken.no +royrvik.no +røyrvik.no +rade.no +råde.no +salangen.no +siellak.no +saltdal.no +salat.no +sálát.no +sálat.no +samnanger.no +sande.more-og-romsdal.no +sande.møre-og-romsdal.no +sande.vestfold.no +sandefjord.no +sandnes.no +sandoy.no +sandøy.no +sarpsborg.no +sauda.no +sauherad.no +sel.no +selbu.no +selje.no +seljord.no +sigdal.no +siljan.no +sirdal.no +skaun.no +skedsmo.no +ski.no +skien.no +skiptvet.no +skjervoy.no +skjervøy.no +skierva.no +skiervá.no +skjak.no +skjåk.no +skodje.no +skanland.no +skånland.no +skanit.no +skánit.no +smola.no +smøla.no +snillfjord.no +snasa.no +snåsa.no +snoasa.no +snaase.no +snåase.no +sogndal.no +sokndal.no +sola.no +solund.no +songdalen.no +sortland.no +spydeberg.no +stange.no +stavanger.no +steigen.no +steinkjer.no +stjordal.no +stjørdal.no +stokke.no +stor-elvdal.no +stord.no +stordal.no +storfjord.no +omasvuotna.no +strand.no +stranda.no +stryn.no +sula.no +suldal.no +sund.no +sunndal.no +surnadal.no +sveio.no +svelvik.no +sykkylven.no +sogne.no +søgne.no +somna.no +sømna.no +sondre-land.no +søndre-land.no +sor-aurdal.no +sør-aurdal.no +sor-fron.no +sør-fron.no +sor-odal.no +sør-odal.no +sor-varanger.no +sør-varanger.no +matta-varjjat.no +mátta-várjjat.no +sorfold.no +sørfold.no +sorreisa.no +sørreisa.no +sorum.no +sørum.no +tana.no +deatnu.no +time.no +tingvoll.no +tinn.no +tjeldsund.no +dielddanuorri.no +tjome.no +tjøme.no +tokke.no +tolga.no +torsken.no +tranoy.no +tranøy.no +tromso.no +tromsø.no +tromsa.no +romsa.no +trondheim.no +troandin.no +trysil.no +trana.no +træna.no +trogstad.no +trøgstad.no +tvedestrand.no +tydal.no +tynset.no +tysfjord.no +divtasvuodna.no +divttasvuotna.no +tysnes.no +tysvar.no +tysvær.no +tonsberg.no +tønsberg.no +ullensaker.no +ullensvang.no +ulvik.no +utsira.no +vadso.no +vadsø.no +cahcesuolo.no +čáhcesuolo.no +vaksdal.no +valle.no +vang.no +vanylven.no +vardo.no +vardø.no +varggat.no +várggát.no +vefsn.no +vaapste.no +vega.no +vegarshei.no +vegårshei.no +vennesla.no +verdal.no +verran.no +vestby.no +vestnes.no +vestre-slidre.no +vestre-toten.no +vestvagoy.no +vestvågøy.no +vevelstad.no +vik.no +vikna.no +vindafjord.no +volda.no +voss.no +varoy.no +værøy.no +vagan.no +vågan.no +voagat.no +vagsoy.no +vågsøy.no +vaga.no +vågå.no +valer.ostfold.no +våler.østfold.no +valer.hedmark.no +våler.hedmark.no + +// np : http://www.mos.com.np/register.html +*.np + +// nr : http://cenpac.net.nr/dns/index.html +// Submitted by registry +nr +biz.nr +info.nr +gov.nr +edu.nr +org.nr +net.nr +com.nr + +// nu : https://en.wikipedia.org/wiki/.nu +nu + +// nz : https://en.wikipedia.org/wiki/.nz +// Submitted by registry +nz +ac.nz +co.nz +cri.nz +geek.nz +gen.nz +govt.nz +health.nz +iwi.nz +kiwi.nz +maori.nz +mil.nz +māori.nz +net.nz +org.nz +parliament.nz +school.nz + +// om : https://en.wikipedia.org/wiki/.om +om +co.om +com.om +edu.om +gov.om +med.om +museum.om +net.om +org.om +pro.om + +// onion : https://tools.ietf.org/html/rfc7686 +onion + +// org : https://en.wikipedia.org/wiki/.org +org + +// pa : http://www.nic.pa/ +// Some additional second level "domains" resolve directly as hostnames, such as +// pannet.pa, so we add a rule for "pa". +pa +ac.pa +gob.pa +com.pa +org.pa +sld.pa +edu.pa +net.pa +ing.pa +abo.pa +med.pa +nom.pa + +// pe : https://www.nic.pe/InformeFinalComision.pdf +pe +edu.pe +gob.pe +nom.pe +mil.pe +org.pe +com.pe +net.pe + +// pf : http://www.gobin.info/domainname/formulaire-pf.pdf +pf +com.pf +org.pf +edu.pf + +// pg : https://en.wikipedia.org/wiki/.pg +*.pg + +// ph : http://www.domains.ph/FAQ2.asp +// Submitted by registry +ph +com.ph +net.ph +org.ph +gov.ph +edu.ph +ngo.ph +mil.ph +i.ph + +// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK +pk +com.pk +net.pk +edu.pk +org.pk +fam.pk +biz.pk +web.pk +gov.pk +gob.pk +gok.pk +gon.pk +gop.pk +gos.pk +info.pk + +// pl http://www.dns.pl/english/index.html +// Submitted by registry +pl +com.pl +net.pl +org.pl +// pl functional domains (http://www.dns.pl/english/index.html) +aid.pl +agro.pl +atm.pl +auto.pl +biz.pl +edu.pl +gmina.pl +gsm.pl +info.pl +mail.pl +miasta.pl +media.pl +mil.pl +nieruchomosci.pl +nom.pl +pc.pl +powiat.pl +priv.pl +realestate.pl +rel.pl +sex.pl +shop.pl +sklep.pl +sos.pl +szkola.pl +targi.pl +tm.pl +tourism.pl +travel.pl +turystyka.pl +// Government domains +gov.pl +ap.gov.pl +ic.gov.pl +is.gov.pl +us.gov.pl +kmpsp.gov.pl +kppsp.gov.pl +kwpsp.gov.pl +psp.gov.pl +wskr.gov.pl +kwp.gov.pl +mw.gov.pl +ug.gov.pl +um.gov.pl +umig.gov.pl +ugim.gov.pl +upow.gov.pl +uw.gov.pl +starostwo.gov.pl +pa.gov.pl +po.gov.pl +psse.gov.pl +pup.gov.pl +rzgw.gov.pl +sa.gov.pl +so.gov.pl +sr.gov.pl +wsa.gov.pl +sko.gov.pl +uzs.gov.pl +wiih.gov.pl +winb.gov.pl +pinb.gov.pl +wios.gov.pl +witd.gov.pl +wzmiuw.gov.pl +piw.gov.pl +wiw.gov.pl +griw.gov.pl +wif.gov.pl +oum.gov.pl +sdn.gov.pl +zp.gov.pl +uppo.gov.pl +mup.gov.pl +wuoz.gov.pl +konsulat.gov.pl +oirm.gov.pl +// pl regional domains (http://www.dns.pl/english/index.html) +augustow.pl +babia-gora.pl +bedzin.pl +beskidy.pl +bialowieza.pl +bialystok.pl +bielawa.pl +bieszczady.pl +boleslawiec.pl +bydgoszcz.pl +bytom.pl +cieszyn.pl +czeladz.pl +czest.pl +dlugoleka.pl +elblag.pl +elk.pl +glogow.pl +gniezno.pl +gorlice.pl +grajewo.pl +ilawa.pl +jaworzno.pl +jelenia-gora.pl +jgora.pl +kalisz.pl +kazimierz-dolny.pl +karpacz.pl +kartuzy.pl +kaszuby.pl +katowice.pl +kepno.pl +ketrzyn.pl +klodzko.pl +kobierzyce.pl +kolobrzeg.pl +konin.pl +konskowola.pl +kutno.pl +lapy.pl +lebork.pl +legnica.pl +lezajsk.pl +limanowa.pl +lomza.pl +lowicz.pl +lubin.pl +lukow.pl +malbork.pl +malopolska.pl +mazowsze.pl +mazury.pl +mielec.pl +mielno.pl +mragowo.pl +naklo.pl +nowaruda.pl +nysa.pl +olawa.pl +olecko.pl +olkusz.pl +olsztyn.pl +opoczno.pl +opole.pl +ostroda.pl +ostroleka.pl +ostrowiec.pl +ostrowwlkp.pl +pila.pl +pisz.pl +podhale.pl +podlasie.pl +polkowice.pl +pomorze.pl +pomorskie.pl +prochowice.pl +pruszkow.pl +przeworsk.pl +pulawy.pl +radom.pl +rawa-maz.pl +rybnik.pl +rzeszow.pl +sanok.pl +sejny.pl +slask.pl +slupsk.pl +sosnowiec.pl +stalowa-wola.pl +skoczow.pl +starachowice.pl +stargard.pl +suwalki.pl +swidnica.pl +swiebodzin.pl +swinoujscie.pl +szczecin.pl +szczytno.pl +tarnobrzeg.pl +tgory.pl +turek.pl +tychy.pl +ustka.pl +walbrzych.pl +warmia.pl +warszawa.pl +waw.pl +wegrow.pl +wielun.pl +wlocl.pl +wloclawek.pl +wodzislaw.pl +wolomin.pl +wroclaw.pl +zachpomor.pl +zagan.pl +zarow.pl +zgora.pl +zgorzelec.pl + +// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +pm + +// pn : http://www.government.pn/PnRegistry/policies.htm +pn +gov.pn +co.pn +org.pn +edu.pn +net.pn + +// post : https://en.wikipedia.org/wiki/.post +post + +// pr : http://www.nic.pr/index.asp?f=1 +pr +com.pr +net.pr +org.pr +gov.pr +edu.pr +isla.pr +pro.pr +biz.pr +info.pr +name.pr +// these aren't mentioned on nic.pr, but on https://en.wikipedia.org/wiki/.pr +est.pr +prof.pr +ac.pr + +// pro : http://registry.pro/get-pro +pro +aaa.pro +aca.pro +acct.pro +avocat.pro +bar.pro +cpa.pro +eng.pro +jur.pro +law.pro +med.pro +recht.pro + +// ps : https://en.wikipedia.org/wiki/.ps +// http://www.nic.ps/registration/policy.html#reg +ps +edu.ps +gov.ps +sec.ps +plo.ps +com.ps +org.ps +net.ps + +// pt : http://online.dns.pt/dns/start_dns +pt +net.pt +gov.pt +org.pt +edu.pt +int.pt +publ.pt +com.pt +nome.pt + +// pw : https://en.wikipedia.org/wiki/.pw +pw +co.pw +ne.pw +or.pw +ed.pw +go.pw +belau.pw + +// py : http://www.nic.py/pautas.html#seccion_9 +// Submitted by registry +py +com.py +coop.py +edu.py +gov.py +mil.py +net.py +org.py + +// qa : http://domains.qa/en/ +qa +com.qa +edu.qa +gov.qa +mil.qa +name.qa +net.qa +org.qa +sch.qa + +// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs +re +asso.re +com.re +nom.re + +// ro : http://www.rotld.ro/ +ro +arts.ro +com.ro +firm.ro +info.ro +nom.ro +nt.ro +org.ro +rec.ro +store.ro +tm.ro +www.ro + +// rs : https://www.rnids.rs/en/domains/national-domains +rs +ac.rs +co.rs +edu.rs +gov.rs +in.rs +org.rs + +// ru : https://cctld.ru/en/domains/domens_ru/reserved/ +ru +ac.ru +edu.ru +gov.ru +int.ru +mil.ru +test.ru + +// rw : http://www.nic.rw/cgi-bin/policy.pl +rw +gov.rw +net.rw +edu.rw +ac.rw +com.rw +co.rw +int.rw +mil.rw +gouv.rw + +// sa : http://www.nic.net.sa/ +sa +com.sa +net.sa +org.sa +gov.sa +med.sa +pub.sa +edu.sa +sch.sa + +// sb : http://www.sbnic.net.sb/ +// Submitted by registry +sb +com.sb +edu.sb +gov.sb +net.sb +org.sb + +// sc : http://www.nic.sc/ +sc +com.sc +gov.sc +net.sc +org.sc +edu.sc + +// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm +// Submitted by registry +sd +com.sd +net.sd +org.sd +edu.sd +med.sd +tv.sd +gov.sd +info.sd + +// se : https://en.wikipedia.org/wiki/.se +// Submitted by registry +se +a.se +ac.se +b.se +bd.se +brand.se +c.se +d.se +e.se +f.se +fh.se +fhsk.se +fhv.se +g.se +h.se +i.se +k.se +komforb.se +kommunalforbund.se +komvux.se +l.se +lanbib.se +m.se +n.se +naturbruksgymn.se +o.se +org.se +p.se +parti.se +pp.se +press.se +r.se +s.se +t.se +tm.se +u.se +w.se +x.se +y.se +z.se + +// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines +sg +com.sg +net.sg +org.sg +gov.sg +edu.sg +per.sg + +// sh : http://www.nic.sh/registrar.html +sh +com.sh +net.sh +gov.sh +org.sh +mil.sh + +// si : https://en.wikipedia.org/wiki/.si +si + +// sj : No registrations at this time. +// Submitted by registry +sj + +// sk : https://en.wikipedia.org/wiki/.sk +// list of 2nd level domains ? +sk + +// sl : http://www.nic.sl +// Submitted by registry +sl +com.sl +net.sl +edu.sl +gov.sl +org.sl + +// sm : https://en.wikipedia.org/wiki/.sm +sm + +// sn : https://en.wikipedia.org/wiki/.sn +sn +art.sn +com.sn +edu.sn +gouv.sn +org.sn +perso.sn +univ.sn + +// so : http://www.soregistry.com/ +so +com.so +net.so +org.so + +// sr : https://en.wikipedia.org/wiki/.sr +sr + +// st : http://www.nic.st/html/policyrules/ +st +co.st +com.st +consulado.st +edu.st +embaixada.st +gov.st +mil.st +net.st +org.st +principe.st +saotome.st +store.st + +// su : https://en.wikipedia.org/wiki/.su +su + +// sv : http://www.svnet.org.sv/niveldos.pdf +sv +com.sv +edu.sv +gob.sv +org.sv +red.sv + +// sx : https://en.wikipedia.org/wiki/.sx +// Submitted by registry +sx +gov.sx + +// sy : https://en.wikipedia.org/wiki/.sy +// see also: http://www.gobin.info/domainname/sy.doc +sy +edu.sy +gov.sy +net.sy +mil.sy +com.sy +org.sy + +// sz : https://en.wikipedia.org/wiki/.sz +// http://www.sispa.org.sz/ +sz +co.sz +ac.sz +org.sz + +// tc : https://en.wikipedia.org/wiki/.tc +tc + +// td : https://en.wikipedia.org/wiki/.td +td + +// tel: https://en.wikipedia.org/wiki/.tel +// http://www.telnic.org/ +tel + +// tf : https://en.wikipedia.org/wiki/.tf +tf + +// tg : https://en.wikipedia.org/wiki/.tg +// http://www.nic.tg/ +tg + +// th : https://en.wikipedia.org/wiki/.th +// Submitted by registry +th +ac.th +co.th +go.th +in.th +mi.th +net.th +or.th + +// tj : http://www.nic.tj/policy.html +tj +ac.tj +biz.tj +co.tj +com.tj +edu.tj +go.tj +gov.tj +int.tj +mil.tj +name.tj +net.tj +nic.tj +org.tj +test.tj +web.tj + +// tk : https://en.wikipedia.org/wiki/.tk +tk + +// tl : https://en.wikipedia.org/wiki/.tl +tl +gov.tl + +// tm : http://www.nic.tm/local.html +tm +com.tm +co.tm +org.tm +net.tm +nom.tm +gov.tm +mil.tm +edu.tm + +// tn : https://en.wikipedia.org/wiki/.tn +// http://whois.ati.tn/ +tn +com.tn +ens.tn +fin.tn +gov.tn +ind.tn +intl.tn +nat.tn +net.tn +org.tn +info.tn +perso.tn +tourism.tn +edunet.tn +rnrt.tn +rns.tn +rnu.tn +mincom.tn +agrinet.tn +defense.tn +turen.tn + +// to : https://en.wikipedia.org/wiki/.to +// Submitted by registry +to +com.to +gov.to +net.to +org.to +edu.to +mil.to + +// subTLDs: https://www.nic.tr/forms/eng/policies.pdf +// and: https://www.nic.tr/forms/politikalar.pdf +// Submitted by +tr +com.tr +info.tr +biz.tr +net.tr +org.tr +web.tr +gen.tr +tv.tr +av.tr +dr.tr +bbs.tr +name.tr +tel.tr +gov.tr +bel.tr +pol.tr +mil.tr +k12.tr +edu.tr +kep.tr + +// Used by Northern Cyprus +nc.tr + +// Used by government agencies of Northern Cyprus +gov.nc.tr + +// travel : https://en.wikipedia.org/wiki/.travel +travel + +// tt : http://www.nic.tt/ +tt +co.tt +com.tt +org.tt +net.tt +biz.tt +info.tt +pro.tt +int.tt +coop.tt +jobs.tt +mobi.tt +travel.tt +museum.tt +aero.tt +name.tt +gov.tt +edu.tt + +// tv : https://en.wikipedia.org/wiki/.tv +// Not listing any 2LDs as reserved since none seem to exist in practice, +// Wikipedia notwithstanding. +tv + +// tw : https://en.wikipedia.org/wiki/.tw +tw +edu.tw +gov.tw +mil.tw +com.tw +net.tw +org.tw +idv.tw +game.tw +ebiz.tw +club.tw +網路.tw +組織.tw +商業.tw + +// tz : http://www.tznic.or.tz/index.php/domains +// Submitted by registry +tz +ac.tz +co.tz +go.tz +hotel.tz +info.tz +me.tz +mil.tz +mobi.tz +ne.tz +or.tz +sc.tz +tv.tz + +// ua : https://hostmaster.ua/policy/?ua +// Submitted by registry +ua +// ua 2LD +com.ua +edu.ua +gov.ua +in.ua +net.ua +org.ua +// ua geographic names +// https://hostmaster.ua/2ld/ +cherkassy.ua +cherkasy.ua +chernigov.ua +chernihiv.ua +chernivtsi.ua +chernovtsy.ua +ck.ua +cn.ua +cr.ua +crimea.ua +cv.ua +dn.ua +dnepropetrovsk.ua +dnipropetrovsk.ua +dominic.ua +donetsk.ua +dp.ua +if.ua +ivano-frankivsk.ua +kh.ua +kharkiv.ua +kharkov.ua +kherson.ua +khmelnitskiy.ua +khmelnytskyi.ua +kiev.ua +kirovograd.ua +km.ua +kr.ua +krym.ua +ks.ua +kv.ua +kyiv.ua +lg.ua +lt.ua +lugansk.ua +lutsk.ua +lv.ua +lviv.ua +mk.ua +mykolaiv.ua +nikolaev.ua +od.ua +odesa.ua +odessa.ua +pl.ua +poltava.ua +rivne.ua +rovno.ua +rv.ua +sb.ua +sebastopol.ua +sevastopol.ua +sm.ua +sumy.ua +te.ua +ternopil.ua +uz.ua +uzhgorod.ua +vinnica.ua +vinnytsia.ua +vn.ua +volyn.ua +yalta.ua +zaporizhzhe.ua +zaporizhzhia.ua +zhitomir.ua +zhytomyr.ua +zp.ua +zt.ua + +// ug : https://www.registry.co.ug/ +ug +co.ug +or.ug +ac.ug +sc.ug +go.ug +ne.ug +com.ug +org.ug + +// uk : https://en.wikipedia.org/wiki/.uk +// Submitted by registry +uk +ac.uk +co.uk +gov.uk +ltd.uk +me.uk +net.uk +nhs.uk +org.uk +plc.uk +police.uk +*.sch.uk + +// us : https://en.wikipedia.org/wiki/.us +us +dni.us +fed.us +isa.us +kids.us +nsn.us +// us geographic names +ak.us +al.us +ar.us +as.us +az.us +ca.us +co.us +ct.us +dc.us +de.us +fl.us +ga.us +gu.us +hi.us +ia.us +id.us +il.us +in.us +ks.us +ky.us +la.us +ma.us +md.us +me.us +mi.us +mn.us +mo.us +ms.us +mt.us +nc.us +nd.us +ne.us +nh.us +nj.us +nm.us +nv.us +ny.us +oh.us +ok.us +or.us +pa.us +pr.us +ri.us +sc.us +sd.us +tn.us +tx.us +ut.us +vi.us +vt.us +va.us +wa.us +wi.us +wv.us +wy.us +// The registrar notes several more specific domains available in each state, +// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat +// haphazard; in some states these domains resolve as addresses, while in others +// only subdomains are available, or even nothing at all. We include the +// most common ones where it's clear that different sites are different +// entities. +k12.ak.us +k12.al.us +k12.ar.us +k12.as.us +k12.az.us +k12.ca.us +k12.co.us +k12.ct.us +k12.dc.us +k12.de.us +k12.fl.us +k12.ga.us +k12.gu.us +// k12.hi.us Bug 614565 - Hawaii has a state-wide DOE login +k12.ia.us +k12.id.us +k12.il.us +k12.in.us +k12.ks.us +k12.ky.us +k12.la.us +k12.ma.us +k12.md.us +k12.me.us +k12.mi.us +k12.mn.us +k12.mo.us +k12.ms.us +k12.mt.us +k12.nc.us +// k12.nd.us Bug 1028347 - Removed at request of Travis Rosso +k12.ne.us +k12.nh.us +k12.nj.us +k12.nm.us +k12.nv.us +k12.ny.us +k12.oh.us +k12.ok.us +k12.or.us +k12.pa.us +k12.pr.us +k12.ri.us +k12.sc.us +// k12.sd.us Bug 934131 - Removed at request of James Booze +k12.tn.us +k12.tx.us +k12.ut.us +k12.vi.us +k12.vt.us +k12.va.us +k12.wa.us +k12.wi.us +// k12.wv.us Bug 947705 - Removed at request of Verne Britton +k12.wy.us +cc.ak.us +cc.al.us +cc.ar.us +cc.as.us +cc.az.us +cc.ca.us +cc.co.us +cc.ct.us +cc.dc.us +cc.de.us +cc.fl.us +cc.ga.us +cc.gu.us +cc.hi.us +cc.ia.us +cc.id.us +cc.il.us +cc.in.us +cc.ks.us +cc.ky.us +cc.la.us +cc.ma.us +cc.md.us +cc.me.us +cc.mi.us +cc.mn.us +cc.mo.us +cc.ms.us +cc.mt.us +cc.nc.us +cc.nd.us +cc.ne.us +cc.nh.us +cc.nj.us +cc.nm.us +cc.nv.us +cc.ny.us +cc.oh.us +cc.ok.us +cc.or.us +cc.pa.us +cc.pr.us +cc.ri.us +cc.sc.us +cc.sd.us +cc.tn.us +cc.tx.us +cc.ut.us +cc.vi.us +cc.vt.us +cc.va.us +cc.wa.us +cc.wi.us +cc.wv.us +cc.wy.us +lib.ak.us +lib.al.us +lib.ar.us +lib.as.us +lib.az.us +lib.ca.us +lib.co.us +lib.ct.us +lib.dc.us +// lib.de.us Issue #243 - Moved to Private section at request of Ed Moore +lib.fl.us +lib.ga.us +lib.gu.us +lib.hi.us +lib.ia.us +lib.id.us +lib.il.us +lib.in.us +lib.ks.us +lib.ky.us +lib.la.us +lib.ma.us +lib.md.us +lib.me.us +lib.mi.us +lib.mn.us +lib.mo.us +lib.ms.us +lib.mt.us +lib.nc.us +lib.nd.us +lib.ne.us +lib.nh.us +lib.nj.us +lib.nm.us +lib.nv.us +lib.ny.us +lib.oh.us +lib.ok.us +lib.or.us +lib.pa.us +lib.pr.us +lib.ri.us +lib.sc.us +lib.sd.us +lib.tn.us +lib.tx.us +lib.ut.us +lib.vi.us +lib.vt.us +lib.va.us +lib.wa.us +lib.wi.us +// lib.wv.us Bug 941670 - Removed at request of Larry W Arnold +lib.wy.us +// k12.ma.us contains school districts in Massachusetts. The 4LDs are +// managed independently except for private (PVT), charter (CHTR) and +// parochial (PAROCH) schools. Those are delegated directly to the +// 5LD operators. +pvt.k12.ma.us +chtr.k12.ma.us +paroch.k12.ma.us +// Merit Network, Inc. maintains the registry for =~ /(k12|cc|lib).mi.us/ and the following +// see also: http://domreg.merit.edu +// see also: whois -h whois.domreg.merit.edu help +ann-arbor.mi.us +cog.mi.us +dst.mi.us +eaton.mi.us +gen.mi.us +mus.mi.us +tec.mi.us +washtenaw.mi.us + +// uy : http://www.nic.org.uy/ +uy +com.uy +edu.uy +gub.uy +mil.uy +net.uy +org.uy + +// uz : http://www.reg.uz/ +uz +co.uz +com.uz +net.uz +org.uz + +// va : https://en.wikipedia.org/wiki/.va +va + +// vc : https://en.wikipedia.org/wiki/.vc +// Submitted by registry +vc +com.vc +net.vc +org.vc +gov.vc +mil.vc +edu.vc + +// ve : https://registro.nic.ve/ +// Submitted by registry +ve +arts.ve +co.ve +com.ve +e12.ve +edu.ve +firm.ve +gob.ve +gov.ve +info.ve +int.ve +mil.ve +net.ve +org.ve +rec.ve +store.ve +tec.ve +web.ve + +// vg : https://en.wikipedia.org/wiki/.vg +vg + +// vi : http://www.nic.vi/newdomainform.htm +// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other +// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they +// are available for registration (which they do not seem to be). +vi +co.vi +com.vi +k12.vi +net.vi +org.vi + +// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp +vn +com.vn +net.vn +org.vn +edu.vn +gov.vn +int.vn +ac.vn +biz.vn +info.vn +name.vn +pro.vn +health.vn + +// vu : https://en.wikipedia.org/wiki/.vu +// http://www.vunic.vu/ +vu +com.vu +edu.vu +net.vu +org.vu + +// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +wf + +// ws : https://en.wikipedia.org/wiki/.ws +// http://samoanic.ws/index.dhtml +ws +com.ws +net.ws +org.ws +gov.ws +edu.ws + +// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +yt + +// IDN ccTLDs +// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then +// U-label, and follow this format: +// // A-Label ("", [, variant info]) : +// // [sponsoring org] +// U-Label + +// xn--mgbaam7a8h ("Emerat", Arabic) : AE +// http://nic.ae/english/arabicdomain/rules.jsp +امارات + +// xn--y9a3aq ("hye", Armenian) : AM +// ISOC AM (operated by .am Registry) +հայ + +// xn--54b7fta0cc ("Bangla", Bangla) : BD +বাংলা + +// xn--90ae ("bg", Bulgarian) : BG +бг + +// xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY +// Operated by .by registry +бел + +// xn--fiqs8s ("Zhongguo/China", Chinese, Simplified) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中国 + +// xn--fiqz9s ("Zhongguo/China", Chinese, Traditional) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中國 + +// xn--lgbbat1ad8j ("Algeria/Al Jazair", Arabic) : DZ +الجزائر + +// xn--wgbh1c ("Egypt/Masr", Arabic) : EG +// http://www.dotmasr.eg/ +مصر + +// xn--e1a4c ("eu", Cyrillic) : EU +ею + +// xn--node ("ge", Georgian Mkhedruli) : GE +გე + +// xn--qxam ("el", Greek) : GR +// Hellenic Ministry of Infrastructure, Transport, and Networks +ελ + +// xn--j6w193g ("Hong Kong", Chinese) : HK +// https://www2.hkirc.hk/register/rules.jsp +香港 + +// xn--2scrj9c ("Bharat", Kannada) : IN +// India +ಭಾರತ + +// xn--3hcrj9c ("Bharat", Oriya) : IN +// India +ଭାରତ + +// xn--45br5cyl ("Bharatam", Assamese) : IN +// India +ভাৰত + +// xn--h2breg3eve ("Bharatam", Sanskrit) : IN +// India +भारतम् + +// xn--h2brj9c8c ("Bharot", Santali) : IN +// India +भारोत + +// xn--mgbgu82a ("Bharat", Sindhi) : IN +// India +ڀارت + +// xn--rvc1e0am3e ("Bharatam", Malayalam) : IN +// India +ഭാരതം + +// xn--h2brj9c ("Bharat", Devanagari) : IN +// India +भारत + +// xn--mgbbh1a71e ("Bharat", Arabic) : IN +// India +بھارت + +// xn--fpcrj9c3d ("Bharat", Telugu) : IN +// India +భారత్ + +// xn--gecrj9c ("Bharat", Gujarati) : IN +// India +ભારત + +// xn--s9brj9c ("Bharat", Gurmukhi) : IN +// India +ਭਾਰਤ + +// xn--45brj9c ("Bharat", Bengali) : IN +// India +ভারত + +// xn--xkc2dl3a5ee0h ("India", Tamil) : IN +// India +இந்தியா + +// xn--mgba3a4f16a ("Iran", Persian) : IR +ایران + +// xn--mgba3a4fra ("Iran", Arabic) : IR +ايران + +// xn--mgbtx2b ("Iraq", Arabic) : IQ +// Communications and Media Commission +عراق + +// xn--mgbayh7gpa ("al-Ordon", Arabic) : JO +// National Information Technology Center (NITC) +// Royal Scientific Society, Al-Jubeiha +الاردن + +// xn--3e0b707e ("Republic of Korea", Hangul) : KR +한국 + +// xn--80ao21a ("Kaz", Kazakh) : KZ +қаз + +// xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK +// http://nic.lk +ලංකා + +// xn--xkc2al3hye2a ("Ilangai", Tamil) : LK +// http://nic.lk +இலங்கை + +// xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA +المغرب + +// xn--d1alf ("mkd", Macedonian) : MK +// MARnet +мкд + +// xn--l1acc ("mon", Mongolian) : MN +мон + +// xn--mix891f ("Macao", Chinese, Traditional) : MO +// MONIC / HNET Asia (Registry Operator for .mo) +澳門 + +// xn--mix082f ("Macao", Chinese, Simplified) : MO +澳门 + +// xn--mgbx4cd0ab ("Malaysia", Malay) : MY +مليسيا + +// xn--mgb9awbf ("Oman", Arabic) : OM +عمان + +// xn--mgbai9azgqp6j ("Pakistan", Urdu/Arabic) : PK +پاکستان + +// xn--mgbai9a5eva00b ("Pakistan", Urdu/Arabic, variant) : PK +پاكستان + +// xn--ygbi2ammx ("Falasteen", Arabic) : PS +// The Palestinian National Internet Naming Authority (PNINA) +// http://www.pnina.ps +فلسطين + +// xn--90a3ac ("srb", Cyrillic) : RS +// https://www.rnids.rs/en/domains/national-domains +срб +пр.срб +орг.срб +обр.срб +од.срб +упр.срб +ак.срб + +// xn--p1ai ("rf", Russian-Cyrillic) : RU +// http://www.cctld.ru/en/docs/rulesrf.php +рф + +// xn--wgbl6a ("Qatar", Arabic) : QA +// http://www.ict.gov.qa/ +قطر + +// xn--mgberp4a5d4ar ("AlSaudiah", Arabic) : SA +// http://www.nic.net.sa/ +السعودية + +// xn--mgberp4a5d4a87g ("AlSaudiah", Arabic, variant) : SA +السعودیة + +// xn--mgbqly7c0a67fbc ("AlSaudiah", Arabic, variant) : SA +السعودیۃ + +// xn--mgbqly7cvafr ("AlSaudiah", Arabic, variant) : SA +السعوديه + +// xn--mgbpl2fh ("sudan", Arabic) : SD +// Operated by .sd registry +سودان + +// xn--yfro4i67o Singapore ("Singapore", Chinese) : SG +新加坡 + +// xn--clchc0ea0b2g2a9gcd ("Singapore", Tamil) : SG +சிங்கப்பூர் + +// xn--ogbpf8fl ("Syria", Arabic) : SY +سورية + +// xn--mgbtf8fl ("Syria", Arabic, variant) : SY +سوريا + +// xn--o3cw4h ("Thai", Thai) : TH +// http://www.thnic.co.th +ไทย +ศึกษา.ไทย +ธุรกิจ.ไทย +รัฐบาล.ไทย +ทหาร.ไทย +เน็ต.ไทย +องค์กร.ไทย + +// xn--pgbs0dh ("Tunisia", Arabic) : TN +// http://nic.tn +تونس + +// xn--kpry57d ("Taiwan", Chinese, Traditional) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台灣 + +// xn--kprw13d ("Taiwan", Chinese, Simplified) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台湾 + +// xn--nnx388a ("Taiwan", Chinese, variant) : TW +臺灣 + +// xn--j1amh ("ukr", Cyrillic) : UA +укр + +// xn--mgb2ddes ("AlYemen", Arabic) : YE +اليمن + +// xxx : http://icmregistry.com +xxx + +// ye : http://www.y.net.ye/services/domain_name.htm +*.ye + +// za : http://www.zadna.org.za/content/page/domain-information +ac.za +agric.za +alt.za +co.za +edu.za +gov.za +grondar.za +law.za +mil.za +net.za +ngo.za +nis.za +nom.za +org.za +school.za +tm.za +web.za + +// zm : https://zicta.zm/ +// Submitted by registry +zm +ac.zm +biz.zm +co.zm +com.zm +edu.zm +gov.zm +info.zm +mil.zm +net.zm +org.zm +sch.zm + +// zw : https://www.potraz.gov.zw/ +// Confirmed by registry 2017-01-25 +zw +ac.zw +co.zw +gov.zw +mil.zw +org.zw + +// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2017-02-23T00:46:09Z + +// aaa : 2015-02-26 American Automobile Association, Inc. +aaa + +// aarp : 2015-05-21 AARP +aarp + +// abarth : 2015-07-30 Fiat Chrysler Automobiles N.V. +abarth + +// abb : 2014-10-24 ABB Ltd +abb + +// abbott : 2014-07-24 Abbott Laboratories, Inc. +abbott + +// abbvie : 2015-07-30 AbbVie Inc. +abbvie + +// abc : 2015-07-30 Disney Enterprises, Inc. +abc + +// able : 2015-06-25 Able Inc. +able + +// abogado : 2014-04-24 Top Level Domain Holdings Limited +abogado + +// abudhabi : 2015-07-30 Abu Dhabi Systems and Information Centre +abudhabi + +// academy : 2013-11-07 Half Oaks, LLC +academy + +// accenture : 2014-08-15 Accenture plc +accenture + +// accountant : 2014-11-20 dot Accountant Limited +accountant + +// accountants : 2014-03-20 Knob Town, LLC +accountants + +// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG +aco + +// active : 2014-05-01 The Active Network, Inc +active + +// actor : 2013-12-12 United TLD Holdco Ltd. +actor + +// adac : 2015-07-16 Allgemeiner Deutscher Automobil-Club e.V. (ADAC) +adac + +// ads : 2014-12-04 Charleston Road Registry Inc. +ads + +// adult : 2014-10-16 ICM Registry AD LLC +adult + +// aeg : 2015-03-19 Aktiebolaget Electrolux +aeg + +// aetna : 2015-05-21 Aetna Life Insurance Company +aetna + +// afamilycompany : 2015-07-23 Johnson Shareholdings, Inc. +afamilycompany + +// afl : 2014-10-02 Australian Football League +afl + +// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa +africa + +// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +agakhan + +// agency : 2013-11-14 Steel Falls, LLC +agency + +// aig : 2014-12-18 American International Group, Inc. +aig + +// aigo : 2015-08-06 aigo Digital Technology Co,Ltd. +aigo + +// airbus : 2015-07-30 Airbus S.A.S. +airbus + +// airforce : 2014-03-06 United TLD Holdco Ltd. +airforce + +// airtel : 2014-10-24 Bharti Airtel Limited +airtel + +// akdn : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) +akdn + +// alfaromeo : 2015-07-31 Fiat Chrysler Automobiles N.V. +alfaromeo + +// alibaba : 2015-01-15 Alibaba Group Holding Limited +alibaba + +// alipay : 2015-01-15 Alibaba Group Holding Limited +alipay + +// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft +allfinanz + +// allstate : 2015-07-31 Allstate Fire and Casualty Insurance Company +allstate + +// ally : 2015-06-18 Ally Financial Inc. +ally + +// alsace : 2014-07-02 REGION D ALSACE +alsace + +// alstom : 2015-07-30 ALSTOM +alstom + +// americanexpress : 2015-07-31 American Express Travel Related Services Company, Inc. +americanexpress + +// americanfamily : 2015-07-23 AmFam, Inc. +americanfamily + +// amex : 2015-07-31 American Express Travel Related Services Company, Inc. +amex + +// amfam : 2015-07-23 AmFam, Inc. +amfam + +// amica : 2015-05-28 Amica Mutual Insurance Company +amica + +// amsterdam : 2014-07-24 Gemeente Amsterdam +amsterdam + +// analytics : 2014-12-18 Campus IP LLC +analytics + +// android : 2014-08-07 Charleston Road Registry Inc. +android + +// anquan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +anquan + +// anz : 2015-07-31 Australia and New Zealand Banking Group Limited +anz + +// aol : 2015-09-17 AOL Inc. +aol + +// apartments : 2014-12-11 June Maple, LLC +apartments + +// app : 2015-05-14 Charleston Road Registry Inc. +app + +// apple : 2015-05-14 Apple Inc. +apple + +// aquarelle : 2014-07-24 Aquarelle.com +aquarelle + +// arab : 2015-11-12 League of Arab States +arab + +// aramco : 2014-11-20 Aramco Services Company +aramco + +// archi : 2014-02-06 STARTING DOT LIMITED +archi + +// army : 2014-03-06 United TLD Holdco Ltd. +army + +// art : 2016-03-24 UK Creative Ideas Limited +art + +// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E. +arte + +// asda : 2015-07-31 Wal-Mart Stores, Inc. +asda + +// associates : 2014-03-06 Baxter Hill, LLC +associates + +// athleta : 2015-07-30 The Gap, Inc. +athleta + +// attorney : 2014-03-20 +attorney + +// auction : 2014-03-20 +auction + +// audi : 2015-05-21 AUDI Aktiengesellschaft +audi + +// audible : 2015-06-25 Amazon EU S.à r.l. +audible + +// audio : 2014-03-20 Uniregistry, Corp. +audio + +// auspost : 2015-08-13 Australian Postal Corporation +auspost + +// author : 2014-12-18 Amazon EU S.à r.l. +author + +// auto : 2014-11-13 +auto + +// autos : 2014-01-09 DERAutos, LLC +autos + +// avianca : 2015-01-08 Aerovias del Continente Americano S.A. Avianca +avianca + +// aws : 2015-06-25 Amazon EU S.à r.l. +aws + +// axa : 2013-12-19 AXA SA +axa + +// azure : 2014-12-18 Microsoft Corporation +azure + +// baby : 2015-04-09 Johnson & Johnson Services, Inc. +baby + +// baidu : 2015-01-08 Baidu, Inc. +baidu + +// banamex : 2015-07-30 Citigroup Inc. +banamex + +// bananarepublic : 2015-07-31 The Gap, Inc. +bananarepublic + +// band : 2014-06-12 +band + +// bank : 2014-09-25 fTLD Registry Services LLC +bank + +// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +bar + +// barcelona : 2014-07-24 Municipi de Barcelona +barcelona + +// barclaycard : 2014-11-20 Barclays Bank PLC +barclaycard + +// barclays : 2014-11-20 Barclays Bank PLC +barclays + +// barefoot : 2015-06-11 Gallo Vineyards, Inc. +barefoot + +// bargains : 2013-11-14 Half Hallow, LLC +bargains + +// baseball : 2015-10-29 MLB Advanced Media DH, LLC +baseball + +// basketball : 2015-08-20 Fédération Internationale de Basketball (FIBA) +basketball + +// bauhaus : 2014-04-17 Werkhaus GmbH +bauhaus + +// bayern : 2014-01-23 Bayern Connect GmbH +bayern + +// bbc : 2014-12-18 British Broadcasting Corporation +bbc + +// bbt : 2015-07-23 BB&T Corporation +bbt + +// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A. +bbva + +// bcg : 2015-04-02 The Boston Consulting Group, Inc. +bcg + +// bcn : 2014-07-24 Municipi de Barcelona +bcn + +// beats : 2015-05-14 Beats Electronics, LLC +beats + +// beauty : 2015-12-03 L'Oréal +beauty + +// beer : 2014-01-09 Top Level Domain Holdings Limited +beer + +// bentley : 2014-12-18 Bentley Motors Limited +bentley + +// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG +berlin + +// best : 2013-12-19 BestTLD Pty Ltd +best + +// bestbuy : 2015-07-31 BBY Solutions, Inc. +bestbuy + +// bet : 2015-05-07 Afilias plc +bet + +// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited +bharti + +// bible : 2014-06-19 American Bible Society +bible + +// bid : 2013-12-19 dot Bid Limited +bid + +// bike : 2013-08-27 Grand Hollow, LLC +bike + +// bing : 2014-12-18 Microsoft Corporation +bing + +// bingo : 2014-12-04 Sand Cedar, LLC +bingo + +// bio : 2014-03-06 STARTING DOT LIMITED +bio + +// black : 2014-01-16 Afilias Limited +black + +// blackfriday : 2014-01-16 Uniregistry, Corp. +blackfriday + +// blanco : 2015-07-16 BLANCO GmbH + Co KG +blanco + +// blockbuster : 2015-07-30 Dish DBS Corporation +blockbuster + +// blog : 2015-05-14 +blog + +// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC +bloomberg + +// blue : 2013-11-07 Afilias Limited +blue + +// bms : 2014-10-30 Bristol-Myers Squibb Company +bms + +// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +bmw + +// bnl : 2014-07-24 Banca Nazionale del Lavoro +bnl + +// bnpparibas : 2014-05-29 BNP Paribas +bnpparibas + +// boats : 2014-12-04 DERBoats, LLC +boats + +// boehringer : 2015-07-09 Boehringer Ingelheim International GmbH +boehringer + +// bofa : 2015-07-31 NMS Services, Inc. +bofa + +// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +bom + +// bond : 2014-06-05 Bond University Limited +bond + +// boo : 2014-01-30 Charleston Road Registry Inc. +boo + +// book : 2015-08-27 Amazon EU S.à r.l. +book + +// booking : 2015-07-16 Booking.com B.V. +booking + +// boots : 2015-01-08 THE BOOTS COMPANY PLC +boots + +// bosch : 2015-06-18 Robert Bosch GMBH +bosch + +// bostik : 2015-05-28 Bostik SA +bostik + +// boston : 2015-12-10 +boston + +// bot : 2014-12-18 Amazon EU S.à r.l. +bot + +// boutique : 2013-11-14 Over Galley, LLC +boutique + +// box : 2015-11-12 NS1 Limited +box + +// bradesco : 2014-12-18 Banco Bradesco S.A. +bradesco + +// bridgestone : 2014-12-18 Bridgestone Corporation +bridgestone + +// broadway : 2014-12-22 Celebrate Broadway, Inc. +broadway + +// broker : 2014-12-11 IG Group Holdings PLC +broker + +// brother : 2015-01-29 Brother Industries, Ltd. +brother + +// brussels : 2014-02-06 DNS.be vzw +brussels + +// budapest : 2013-11-21 Top Level Domain Holdings Limited +budapest + +// bugatti : 2015-07-23 Bugatti International SA +bugatti + +// build : 2013-11-07 Plan Bee LLC +build + +// builders : 2013-11-07 Atomic Madison, LLC +builders + +// business : 2013-11-07 Spring Cross, LLC +business + +// buy : 2014-12-18 Amazon EU S.à r.l. +buy + +// buzz : 2013-10-02 DOTSTRATEGY CO. +buzz + +// bzh : 2014-02-27 Association www.bzh +bzh + +// cab : 2013-10-24 Half Sunset, LLC +cab + +// cafe : 2015-02-11 Pioneer Canyon, LLC +cafe + +// cal : 2014-07-24 Charleston Road Registry Inc. +cal + +// call : 2014-12-18 Amazon EU S.à r.l. +call + +// calvinklein : 2015-07-30 PVH gTLD Holdings LLC +calvinklein + +// cam : 2016-04-21 AC Webconnecting Holding B.V. +cam + +// camera : 2013-08-27 Atomic Maple, LLC +camera + +// camp : 2013-11-07 Delta Dynamite, LLC +camp + +// cancerresearch : 2014-05-15 Australian Cancer Research Foundation +cancerresearch + +// canon : 2014-09-12 Canon Inc. +canon + +// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +capetown + +// capital : 2014-03-06 Delta Mill, LLC +capital + +// capitalone : 2015-08-06 Capital One Financial Corporation +capitalone + +// car : 2015-01-22 +car + +// caravan : 2013-12-12 Caravan International, Inc. +caravan + +// cards : 2013-12-05 Foggy Hollow, LLC +cards + +// care : 2014-03-06 Goose Cross +care + +// career : 2013-10-09 dotCareer LLC +career + +// careers : 2013-10-02 Wild Corner, LLC +careers + +// cars : 2014-11-13 +cars + +// cartier : 2014-06-23 Richemont DNS Inc. +cartier + +// casa : 2013-11-21 Top Level Domain Holdings Limited +casa + +// case : 2015-09-03 CNH Industrial N.V. +case + +// caseih : 2015-09-03 CNH Industrial N.V. +caseih + +// cash : 2014-03-06 Delta Lake, LLC +cash + +// casino : 2014-12-18 Binky Sky, LLC +casino + +// catering : 2013-12-05 New Falls. LLC +catering + +// catholic : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +catholic + +// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +cba + +// cbn : 2014-08-22 The Christian Broadcasting Network, Inc. +cbn + +// cbre : 2015-07-02 CBRE, Inc. +cbre + +// cbs : 2015-08-06 CBS Domains Inc. +cbs + +// ceb : 2015-04-09 The Corporate Executive Board Company +ceb + +// center : 2013-11-07 Tin Mill, LLC +center + +// ceo : 2013-11-07 CEOTLD Pty Ltd +ceo + +// cern : 2014-06-05 European Organization for Nuclear Research ("CERN") +cern + +// cfa : 2014-08-28 CFA Institute +cfa + +// cfd : 2014-12-11 IG Group Holdings PLC +cfd + +// chanel : 2015-04-09 Chanel International B.V. +chanel + +// channel : 2014-05-08 Charleston Road Registry Inc. +channel + +// chase : 2015-04-30 JPMorgan Chase & Co. +chase + +// chat : 2014-12-04 Sand Fields, LLC +chat + +// cheap : 2013-11-14 Sand Cover, LLC +cheap + +// chintai : 2015-06-11 CHINTAI Corporation +chintai + +// christmas : 2013-11-21 Uniregistry, Corp. +christmas + +// chrome : 2014-07-24 Charleston Road Registry Inc. +chrome + +// chrysler : 2015-07-30 FCA US LLC. +chrysler + +// church : 2014-02-06 Holly Fields, LLC +church + +// cipriani : 2015-02-19 Hotel Cipriani Srl +cipriani + +// circle : 2014-12-18 Amazon EU S.à r.l. +circle + +// cisco : 2014-12-22 Cisco Technology, Inc. +cisco + +// citadel : 2015-07-23 Citadel Domain LLC +citadel + +// citi : 2015-07-30 Citigroup Inc. +citi + +// citic : 2014-01-09 CITIC Group Corporation +citic + +// city : 2014-05-29 Snow Sky, LLC +city + +// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. +cityeats + +// claims : 2014-03-20 Black Corner, LLC +claims + +// cleaning : 2013-12-05 Fox Shadow, LLC +cleaning + +// click : 2014-06-05 Uniregistry, Corp. +click + +// clinic : 2014-03-20 Goose Park, LLC +clinic + +// clinique : 2015-10-01 The Estée Lauder Companies Inc. +clinique + +// clothing : 2013-08-27 Steel Lake, LLC +clothing + +// cloud : 2015-04-16 ARUBA S.p.A. +cloud + +// club : 2013-11-08 .CLUB DOMAINS, LLC +club + +// clubmed : 2015-06-25 Club Méditerranée S.A. +clubmed + +// coach : 2014-10-09 Koko Island, LLC +coach + +// codes : 2013-10-31 Puff Willow, LLC +codes + +// coffee : 2013-10-17 Trixy Cover, LLC +coffee + +// college : 2014-01-16 XYZ.COM LLC +college + +// cologne : 2014-02-05 NetCologne Gesellschaft für Telekommunikation mbH +cologne + +// comcast : 2015-07-23 Comcast IP Holdings I, LLC +comcast + +// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +commbank + +// community : 2013-12-05 Fox Orchard, LLC +community + +// company : 2013-11-07 Silver Avenue, LLC +company + +// compare : 2015-10-08 iSelect Ltd +compare + +// computer : 2013-10-24 Pine Mill, LLC +computer + +// comsec : 2015-01-08 VeriSign, Inc. +comsec + +// condos : 2013-12-05 Pine House, LLC +condos + +// construction : 2013-09-16 Fox Dynamite, LLC +construction + +// consulting : 2013-12-05 +consulting + +// contact : 2015-01-08 Top Level Spectrum, Inc. +contact + +// contractors : 2013-09-10 Magic Woods, LLC +contractors + +// cooking : 2013-11-21 Top Level Domain Holdings Limited +cooking + +// cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +cookingchannel + +// cool : 2013-11-14 Koko Lake, LLC +cool + +// corsica : 2014-09-25 Collectivité Territoriale de Corse +corsica + +// country : 2013-12-19 Top Level Domain Holdings Limited +country + +// coupon : 2015-02-26 Amazon EU S.à r.l. +coupon + +// coupons : 2015-03-26 Black Island, LLC +coupons + +// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD +courses + +// credit : 2014-03-20 Snow Shadow, LLC +credit + +// creditcard : 2014-03-20 Binky Frostbite, LLC +creditcard + +// creditunion : 2015-01-22 CUNA Performance Resources, LLC +creditunion + +// cricket : 2014-10-09 dot Cricket Limited +cricket + +// crown : 2014-10-24 Crown Equipment Corporation +crown + +// crs : 2014-04-03 Federated Co-operatives Limited +crs + +// cruise : 2015-12-10 Viking River Cruises (Bermuda) Ltd. +cruise + +// cruises : 2013-12-05 Spring Way, LLC +cruises + +// csc : 2014-09-25 Alliance-One Services, Inc. +csc + +// cuisinella : 2014-04-03 SALM S.A.S. +cuisinella + +// cymru : 2014-05-08 Nominet UK +cymru + +// cyou : 2015-01-22 Beijing Gamease Age Digital Technology Co., Ltd. +cyou + +// dabur : 2014-02-06 Dabur India Limited +dabur + +// dad : 2014-01-23 Charleston Road Registry Inc. +dad + +// dance : 2013-10-24 United TLD Holdco Ltd. +dance + +// data : 2016-06-02 Dish DBS Corporation +data + +// date : 2014-11-20 dot Date Limited +date + +// dating : 2013-12-05 Pine Fest, LLC +dating + +// datsun : 2014-03-27 NISSAN MOTOR CO., LTD. +datsun + +// day : 2014-01-30 Charleston Road Registry Inc. +day + +// dclk : 2014-11-20 Charleston Road Registry Inc. +dclk + +// dds : 2015-05-07 Top Level Domain Holdings Limited +dds + +// deal : 2015-06-25 Amazon EU S.à r.l. +deal + +// dealer : 2014-12-22 Dealer Dot Com, Inc. +dealer + +// deals : 2014-05-22 Sand Sunset, LLC +deals + +// degree : 2014-03-06 +degree + +// delivery : 2014-09-11 Steel Station, LLC +delivery + +// dell : 2014-10-24 Dell Inc. +dell + +// deloitte : 2015-07-31 Deloitte Touche Tohmatsu +deloitte + +// delta : 2015-02-19 Delta Air Lines, Inc. +delta + +// democrat : 2013-10-24 United TLD Holdco Ltd. +democrat + +// dental : 2014-03-20 Tin Birch, LLC +dental + +// dentist : 2014-03-20 +dentist + +// desi : 2013-11-14 Desi Networks LLC +desi + +// design : 2014-11-07 Top Level Design, LLC +design + +// dev : 2014-10-16 Charleston Road Registry Inc. +dev + +// dhl : 2015-07-23 Deutsche Post AG +dhl + +// diamonds : 2013-09-22 John Edge, LLC +diamonds + +// diet : 2014-06-26 Uniregistry, Corp. +diet + +// digital : 2014-03-06 Dash Park, LLC +digital + +// direct : 2014-04-10 Half Trail, LLC +direct + +// directory : 2013-09-20 Extra Madison, LLC +directory + +// discount : 2014-03-06 Holly Hill, LLC +discount + +// discover : 2015-07-23 Discover Financial Services +discover + +// dish : 2015-07-30 Dish DBS Corporation +dish + +// diy : 2015-11-05 Lifestyle Domain Holdings, Inc. +diy + +// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd. +dnp + +// docs : 2014-10-16 Charleston Road Registry Inc. +docs + +// doctor : 2016-06-02 Brice Trail, LLC +doctor + +// dodge : 2015-07-30 FCA US LLC. +dodge + +// dog : 2014-12-04 Koko Mill, LLC +dog + +// doha : 2014-09-18 Communications Regulatory Authority (CRA) +doha + +// domains : 2013-10-17 Sugar Cross, LLC +domains + +// dot : 2015-05-21 Dish DBS Corporation +dot + +// download : 2014-11-20 dot Support Limited +download + +// drive : 2015-03-05 Charleston Road Registry Inc. +drive + +// dtv : 2015-06-04 Dish DBS Corporation +dtv + +// dubai : 2015-01-01 Dubai Smart Government Department +dubai + +// duck : 2015-07-23 Johnson Shareholdings, Inc. +duck + +// dunlop : 2015-07-02 The Goodyear Tire & Rubber Company +dunlop + +// duns : 2015-08-06 The Dun & Bradstreet Corporation +duns + +// dupont : 2015-06-25 E. I. du Pont de Nemours and Company +dupont + +// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +durban + +// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +dvag + +// dvr : 2016-05-26 Hughes Satellite Systems Corporation +dvr + +// earth : 2014-12-04 Interlink Co., Ltd. +earth + +// eat : 2014-01-23 Charleston Road Registry Inc. +eat + +// eco : 2016-07-08 Big Room Inc. +eco + +// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. +edeka + +// education : 2013-11-07 Brice Way, LLC +education + +// email : 2013-10-31 Spring Madison, LLC +email + +// emerck : 2014-04-03 Merck KGaA +emerck + +// energy : 2014-09-11 Binky Birch, LLC +energy + +// engineer : 2014-03-06 United TLD Holdco Ltd. +engineer + +// engineering : 2014-03-06 Romeo Canyon +engineering + +// enterprises : 2013-09-20 Snow Oaks, LLC +enterprises + +// epost : 2015-07-23 Deutsche Post AG +epost + +// epson : 2014-12-04 Seiko Epson Corporation +epson + +// equipment : 2013-08-27 Corn Station, LLC +equipment + +// ericsson : 2015-07-09 Telefonaktiebolaget L M Ericsson +ericsson + +// erni : 2014-04-03 ERNI Group Holding AG +erni + +// esq : 2014-05-08 Charleston Road Registry Inc. +esq + +// estate : 2013-08-27 Trixy Park, LLC +estate + +// esurance : 2015-07-23 Esurance Insurance Company +esurance + +// etisalat : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +etisalat + +// eurovision : 2014-04-24 European Broadcasting Union (EBU) +eurovision + +// eus : 2013-12-12 Puntueus Fundazioa +eus + +// events : 2013-12-05 Pioneer Maple, LLC +events + +// everbank : 2014-05-15 EverBank +everbank + +// exchange : 2014-03-06 Spring Falls, LLC +exchange + +// expert : 2013-11-21 Magic Pass, LLC +expert + +// exposed : 2013-12-05 Victor Beach, LLC +exposed + +// express : 2015-02-11 Sea Sunset, LLC +express + +// extraspace : 2015-05-14 Extra Space Storage LLC +extraspace + +// fage : 2014-12-18 Fage International S.A. +fage + +// fail : 2014-03-06 Atomic Pipe, LLC +fail + +// fairwinds : 2014-11-13 FairWinds Partners, LLC +fairwinds + +// faith : 2014-11-20 dot Faith Limited +faith + +// family : 2015-04-02 +family + +// fan : 2014-03-06 +fan + +// fans : 2014-11-07 Asiamix Digital Limited +fans + +// farm : 2013-11-07 Just Maple, LLC +farm + +// farmers : 2015-07-09 Farmers Insurance Exchange +farmers + +// fashion : 2014-07-03 Top Level Domain Holdings Limited +fashion + +// fast : 2014-12-18 Amazon EU S.à r.l. +fast + +// fedex : 2015-08-06 Federal Express Corporation +fedex + +// feedback : 2013-12-19 Top Level Spectrum, Inc. +feedback + +// ferrari : 2015-07-31 Fiat Chrysler Automobiles N.V. +ferrari + +// ferrero : 2014-12-18 Ferrero Trading Lux S.A. +ferrero + +// fiat : 2015-07-31 Fiat Chrysler Automobiles N.V. +fiat + +// fidelity : 2015-07-30 Fidelity Brokerage Services LLC +fidelity + +// fido : 2015-08-06 Rogers Communications Partnership +fido + +// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd +film + +// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br +final + +// finance : 2014-03-20 Cotton Cypress, LLC +finance + +// financial : 2014-03-06 Just Cover, LLC +financial + +// fire : 2015-06-25 Amazon EU S.à r.l. +fire + +// firestone : 2014-12-18 Bridgestone Corporation +firestone + +// firmdale : 2014-03-27 Firmdale Holdings Limited +firmdale + +// fish : 2013-12-12 Fox Woods, LLC +fish + +// fishing : 2013-11-21 Top Level Domain Holdings Limited +fishing + +// fit : 2014-11-07 Top Level Domain Holdings Limited +fit + +// fitness : 2014-03-06 Brice Orchard, LLC +fitness + +// flickr : 2015-04-02 Yahoo! Domain Services Inc. +flickr + +// flights : 2013-12-05 Fox Station, LLC +flights + +// flir : 2015-07-23 FLIR Systems, Inc. +flir + +// florist : 2013-11-07 Half Cypress, LLC +florist + +// flowers : 2014-10-09 Uniregistry, Corp. +flowers + +// fly : 2014-05-08 Charleston Road Registry Inc. +fly + +// foo : 2014-01-23 Charleston Road Registry Inc. +foo + +// food : 2016-04-21 Lifestyle Domain Holdings, Inc. +food + +// foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc. +foodnetwork + +// football : 2014-12-18 Foggy Farms, LLC +football + +// ford : 2014-11-13 Ford Motor Company +ford + +// forex : 2014-12-11 IG Group Holdings PLC +forex + +// forsale : 2014-05-22 +forsale + +// forum : 2015-04-02 Fegistry, LLC +forum + +// foundation : 2013-12-05 John Dale, LLC +foundation + +// fox : 2015-09-11 FOX Registry, LLC +fox + +// free : 2015-12-10 Amazon EU S.à r.l. +free + +// fresenius : 2015-07-30 Fresenius Immobilien-Verwaltungs-GmbH +fresenius + +// frl : 2014-05-15 FRLregistry B.V. +frl + +// frogans : 2013-12-19 OP3FT +frogans + +// frontdoor : 2015-07-02 Lifestyle Domain Holdings, Inc. +frontdoor + +// frontier : 2015-02-05 Frontier Communications Corporation +frontier + +// ftr : 2015-07-16 Frontier Communications Corporation +ftr + +// fujitsu : 2015-07-30 Fujitsu Limited +fujitsu + +// fujixerox : 2015-07-23 Xerox DNHC LLC +fujixerox + +// fun : 2016-01-14 +fun + +// fund : 2014-03-20 John Castle, LLC +fund + +// furniture : 2014-03-20 Lone Fields, LLC +furniture + +// futbol : 2013-09-20 +futbol + +// fyi : 2015-04-02 Silver Tigers, LLC +fyi + +// gal : 2013-11-07 Asociación puntoGAL +gal + +// gallery : 2013-09-13 Sugar House, LLC +gallery + +// gallo : 2015-06-11 Gallo Vineyards, Inc. +gallo + +// gallup : 2015-02-19 Gallup, Inc. +gallup + +// game : 2015-05-28 Uniregistry, Corp. +game + +// games : 2015-05-28 +games + +// gap : 2015-07-31 The Gap, Inc. +gap + +// garden : 2014-06-26 Top Level Domain Holdings Limited +garden + +// gbiz : 2014-07-17 Charleston Road Registry Inc. +gbiz + +// gdn : 2014-07-31 Joint Stock Company "Navigation-information systems" +gdn + +// gea : 2014-12-04 GEA Group Aktiengesellschaft +gea + +// gent : 2014-01-23 COMBELL GROUP NV/SA +gent + +// genting : 2015-03-12 Resorts World Inc Pte. Ltd. +genting + +// george : 2015-07-31 Wal-Mart Stores, Inc. +george + +// ggee : 2014-01-09 GMO Internet, Inc. +ggee + +// gift : 2013-10-17 Uniregistry, Corp. +gift + +// gifts : 2014-07-03 Goose Sky, LLC +gifts + +// gives : 2014-03-06 United TLD Holdco Ltd. +gives + +// giving : 2014-11-13 Giving Limited +giving + +// glade : 2015-07-23 Johnson Shareholdings, Inc. +glade + +// glass : 2013-11-07 Black Cover, LLC +glass + +// gle : 2014-07-24 Charleston Road Registry Inc. +gle + +// global : 2014-04-17 Dot GLOBAL AS +global + +// globo : 2013-12-19 Globo Comunicação e Participações S.A +globo + +// gmail : 2014-05-01 Charleston Road Registry Inc. +gmail + +// gmbh : 2016-01-29 Extra Dynamite, LLC +gmbh + +// gmo : 2014-01-09 GMO Internet, Inc. +gmo + +// gmx : 2014-04-24 1&1 Mail & Media GmbH +gmx + +// godaddy : 2015-07-23 Go Daddy East, LLC +godaddy + +// gold : 2015-01-22 June Edge, LLC +gold + +// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +goldpoint + +// golf : 2014-12-18 Lone falls, LLC +golf + +// goo : 2014-12-18 NTT Resonant Inc. +goo + +// goodhands : 2015-07-31 Allstate Fire and Casualty Insurance Company +goodhands + +// goodyear : 2015-07-02 The Goodyear Tire & Rubber Company +goodyear + +// goog : 2014-11-20 Charleston Road Registry Inc. +goog + +// google : 2014-07-24 Charleston Road Registry Inc. +google + +// gop : 2014-01-16 Republican State Leadership Committee, Inc. +gop + +// got : 2014-12-18 Amazon EU S.à r.l. +got + +// grainger : 2015-05-07 Grainger Registry Services, LLC +grainger + +// graphics : 2013-09-13 Over Madison, LLC +graphics + +// gratis : 2014-03-20 Pioneer Tigers, LLC +gratis + +// green : 2014-05-08 Afilias Limited +green + +// gripe : 2014-03-06 Corn Sunset, LLC +gripe + +// grocery : 2016-06-16 Wal-Mart Stores, Inc. +grocery + +// group : 2014-08-15 Romeo Town, LLC +group + +// guardian : 2015-07-30 The Guardian Life Insurance Company of America +guardian + +// gucci : 2014-11-13 Guccio Gucci S.p.a. +gucci + +// guge : 2014-08-28 Charleston Road Registry Inc. +guge + +// guide : 2013-09-13 Snow Moon, LLC +guide + +// guitars : 2013-11-14 Uniregistry, Corp. +guitars + +// guru : 2013-08-27 Pioneer Cypress, LLC +guru + +// hair : 2015-12-03 L'Oréal +hair + +// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH +hamburg + +// hangout : 2014-11-13 Charleston Road Registry Inc. +hangout + +// haus : 2013-12-05 +haus + +// hbo : 2015-07-30 HBO Registry Services, Inc. +hbo + +// hdfc : 2015-07-30 HOUSING DEVELOPMENT FINANCE CORPORATION LIMITED +hdfc + +// hdfcbank : 2015-02-12 HDFC Bank Limited +hdfcbank + +// health : 2015-02-11 DotHealth, LLC +health + +// healthcare : 2014-06-12 Silver Glen, LLC +healthcare + +// help : 2014-06-26 Uniregistry, Corp. +help + +// helsinki : 2015-02-05 City of Helsinki +helsinki + +// here : 2014-02-06 Charleston Road Registry Inc. +here + +// hermes : 2014-07-10 HERMES INTERNATIONAL +hermes + +// hgtv : 2015-07-02 Lifestyle Domain Holdings, Inc. +hgtv + +// hiphop : 2014-03-06 Uniregistry, Corp. +hiphop + +// hisamitsu : 2015-07-16 Hisamitsu Pharmaceutical Co.,Inc. +hisamitsu + +// hitachi : 2014-10-31 Hitachi, Ltd. +hitachi + +// hiv : 2014-03-13 +hiv + +// hkt : 2015-05-14 PCCW-HKT DataCom Services Limited +hkt + +// hockey : 2015-03-19 Half Willow, LLC +hockey + +// holdings : 2013-08-27 John Madison, LLC +holdings + +// holiday : 2013-11-07 Goose Woods, LLC +holiday + +// homedepot : 2015-04-02 Homer TLC, Inc. +homedepot + +// homegoods : 2015-07-16 The TJX Companies, Inc. +homegoods + +// homes : 2014-01-09 DERHomes, LLC +homes + +// homesense : 2015-07-16 The TJX Companies, Inc. +homesense + +// honda : 2014-12-18 Honda Motor Co., Ltd. +honda + +// honeywell : 2015-07-23 Honeywell GTLD LLC +honeywell + +// horse : 2013-11-21 Top Level Domain Holdings Limited +horse + +// hospital : 2016-10-20 Ruby Pike, LLC +hospital + +// host : 2014-04-17 DotHost Inc. +host + +// hosting : 2014-05-29 Uniregistry, Corp. +hosting + +// hot : 2015-08-27 Amazon EU S.à r.l. +hot + +// hoteles : 2015-03-05 Travel Reservations SRL +hoteles + +// hotels : 2016-04-07 Booking.com B.V. +hotels + +// hotmail : 2014-12-18 Microsoft Corporation +hotmail + +// house : 2013-11-07 Sugar Park, LLC +house + +// how : 2014-01-23 Charleston Road Registry Inc. +how + +// hsbc : 2014-10-24 HSBC Holdings PLC +hsbc + +// hughes : 2015-07-30 Hughes Satellite Systems Corporation +hughes + +// hyatt : 2015-07-30 Hyatt GTLD, L.L.C. +hyatt + +// hyundai : 2015-07-09 Hyundai Motor Company +hyundai + +// ibm : 2014-07-31 International Business Machines Corporation +ibm + +// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited +icbc + +// ice : 2014-10-30 IntercontinentalExchange, Inc. +ice + +// icu : 2015-01-08 One.com A/S +icu + +// ieee : 2015-07-23 IEEE Global LLC +ieee + +// ifm : 2014-01-30 ifm electronic gmbh +ifm + +// ikano : 2015-07-09 Ikano S.A. +ikano + +// imamat : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +imamat + +// imdb : 2015-06-25 Amazon EU S.à r.l. +imdb + +// immo : 2014-07-10 Auburn Bloom, LLC +immo + +// immobilien : 2013-11-07 United TLD Holdco Ltd. +immobilien + +// industries : 2013-12-05 Outer House, LLC +industries + +// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD. +infiniti + +// ing : 2014-01-23 Charleston Road Registry Inc. +ing + +// ink : 2013-12-05 Top Level Design, LLC +ink + +// institute : 2013-11-07 Outer Maple, LLC +institute + +// insurance : 2015-02-19 fTLD Registry Services LLC +insurance + +// insure : 2014-03-20 Pioneer Willow, LLC +insure + +// intel : 2015-08-06 Intel Corporation +intel + +// international : 2013-11-07 Wild Way, LLC +international + +// intuit : 2015-07-30 Intuit Administrative Services, Inc. +intuit + +// investments : 2014-03-20 Holly Glen, LLC +investments + +// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. +ipiranga + +// irish : 2014-08-07 Dot-Irish LLC +irish + +// iselect : 2015-02-11 iSelect Ltd +iselect + +// ismaili : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) +ismaili + +// ist : 2014-08-28 Istanbul Metropolitan Municipality +ist + +// istanbul : 2014-08-28 Istanbul Metropolitan Municipality +istanbul + +// itau : 2014-10-02 Itau Unibanco Holding S.A. +itau + +// itv : 2015-07-09 ITV Services Limited +itv + +// iveco : 2015-09-03 CNH Industrial N.V. +iveco + +// iwc : 2014-06-23 Richemont DNS Inc. +iwc + +// jaguar : 2014-11-13 Jaguar Land Rover Ltd +jaguar + +// java : 2014-06-19 Oracle Corporation +java + +// jcb : 2014-11-20 JCB Co., Ltd. +jcb + +// jcp : 2015-04-23 JCP Media, Inc. +jcp + +// jeep : 2015-07-30 FCA US LLC. +jeep + +// jetzt : 2014-01-09 +jetzt + +// jewelry : 2015-03-05 Wild Bloom, LLC +jewelry + +// jio : 2015-04-02 Affinity Names, Inc. +jio + +// jlc : 2014-12-04 Richemont DNS Inc. +jlc + +// jll : 2015-04-02 Jones Lang LaSalle Incorporated +jll + +// jmp : 2015-03-26 Matrix IP LLC +jmp + +// jnj : 2015-06-18 Johnson & Johnson Services, Inc. +jnj + +// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry +joburg + +// jot : 2014-12-18 Amazon EU S.à r.l. +jot + +// joy : 2014-12-18 Amazon EU S.à r.l. +joy + +// jpmorgan : 2015-04-30 JPMorgan Chase & Co. +jpmorgan + +// jprs : 2014-09-18 Japan Registry Services Co., Ltd. +jprs + +// juegos : 2014-03-20 Uniregistry, Corp. +juegos + +// juniper : 2015-07-30 JUNIPER NETWORKS, INC. +juniper + +// kaufen : 2013-11-07 United TLD Holdco Ltd. +kaufen + +// kddi : 2014-09-12 KDDI CORPORATION +kddi + +// kerryhotels : 2015-04-30 Kerry Trading Co. Limited +kerryhotels + +// kerrylogistics : 2015-04-09 Kerry Trading Co. Limited +kerrylogistics + +// kerryproperties : 2015-04-09 Kerry Trading Co. Limited +kerryproperties + +// kfh : 2014-12-04 Kuwait Finance House +kfh + +// kia : 2015-07-09 KIA MOTORS CORPORATION +kia + +// kim : 2013-09-23 Afilias Limited +kim + +// kinder : 2014-11-07 Ferrero Trading Lux S.A. +kinder + +// kindle : 2015-06-25 Amazon EU S.à r.l. +kindle + +// kitchen : 2013-09-20 Just Goodbye, LLC +kitchen + +// kiwi : 2013-09-20 DOT KIWI LIMITED +kiwi + +// koeln : 2014-01-09 NetCologne Gesellschaft für Telekommunikation mbH +koeln + +// komatsu : 2015-01-08 Komatsu Ltd. +komatsu + +// kosher : 2015-08-20 Kosher Marketing Assets LLC +kosher + +// kpmg : 2015-04-23 KPMG International Cooperative (KPMG International Genossenschaft) +kpmg + +// kpn : 2015-01-08 Koninklijke KPN N.V. +kpn + +// krd : 2013-12-05 KRG Department of Information Technology +krd + +// kred : 2013-12-19 KredTLD Pty Ltd +kred + +// kuokgroup : 2015-04-09 Kerry Trading Co. Limited +kuokgroup + +// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen +kyoto + +// lacaixa : 2014-01-09 CAIXA D'ESTALVIS I PENSIONS DE BARCELONA +lacaixa + +// ladbrokes : 2015-08-06 LADBROKES INTERNATIONAL PLC +ladbrokes + +// lamborghini : 2015-06-04 Automobili Lamborghini S.p.A. +lamborghini + +// lamer : 2015-10-01 The Estée Lauder Companies Inc. +lamer + +// lancaster : 2015-02-12 LANCASTER +lancaster + +// lancia : 2015-07-31 Fiat Chrysler Automobiles N.V. +lancia + +// lancome : 2015-07-23 L'Oréal +lancome + +// land : 2013-09-10 Pine Moon, LLC +land + +// landrover : 2014-11-13 Jaguar Land Rover Ltd +landrover + +// lanxess : 2015-07-30 LANXESS Corporation +lanxess + +// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated +lasalle + +// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico +lat + +// latino : 2015-07-30 Dish DBS Corporation +latino + +// latrobe : 2014-06-16 La Trobe University +latrobe + +// law : 2015-01-22 Minds + Machines Group Limited +law + +// lawyer : 2014-03-20 +lawyer + +// lds : 2014-03-20 IRI Domain Management, LLC ("Applicant") +lds + +// lease : 2014-03-06 Victor Trail, LLC +lease + +// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc +leclerc + +// lefrak : 2015-07-16 LeFrak Organization, Inc. +lefrak + +// legal : 2014-10-16 Blue Falls, LLC +legal + +// lego : 2015-07-16 LEGO Juris A/S +lego + +// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION +lexus + +// lgbt : 2014-05-08 Afilias Limited +lgbt + +// liaison : 2014-10-02 Liaison Technologies, Incorporated +liaison + +// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +lidl + +// life : 2014-02-06 Trixy Oaks, LLC +life + +// lifeinsurance : 2015-01-15 American Council of Life Insurers +lifeinsurance + +// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc. +lifestyle + +// lighting : 2013-08-27 John McCook, LLC +lighting + +// like : 2014-12-18 Amazon EU S.à r.l. +like + +// lilly : 2015-07-31 Eli Lilly and Company +lilly + +// limited : 2014-03-06 Big Fest, LLC +limited + +// limo : 2013-10-17 Hidden Frostbite, LLC +limo + +// lincoln : 2014-11-13 Ford Motor Company +lincoln + +// linde : 2014-12-04 Linde Aktiengesellschaft +linde + +// link : 2013-11-14 Uniregistry, Corp. +link + +// lipsy : 2015-06-25 Lipsy Ltd +lipsy + +// live : 2014-12-04 +live + +// living : 2015-07-30 Lifestyle Domain Holdings, Inc. +living + +// lixil : 2015-03-19 LIXIL Group Corporation +lixil + +// loan : 2014-11-20 dot Loan Limited +loan + +// loans : 2014-03-20 June Woods, LLC +loans + +// locker : 2015-06-04 Dish DBS Corporation +locker + +// locus : 2015-06-25 Locus Analytics LLC +locus + +// loft : 2015-07-30 Annco, Inc. +loft + +// lol : 2015-01-30 Uniregistry, Corp. +lol + +// london : 2013-11-14 Dot London Domains Limited +london + +// lotte : 2014-11-07 Lotte Holdings Co., Ltd. +lotte + +// lotto : 2014-04-10 Afilias Limited +lotto + +// love : 2014-12-22 Merchant Law Group LLP +love + +// lpl : 2015-07-30 LPL Holdings, Inc. +lpl + +// lplfinancial : 2015-07-30 LPL Holdings, Inc. +lplfinancial + +// ltd : 2014-09-25 Over Corner, LLC +ltd + +// ltda : 2014-04-17 DOMAIN ROBOT SERVICOS DE HOSPEDAGEM NA INTERNET LTDA +ltda + +// lundbeck : 2015-08-06 H. Lundbeck A/S +lundbeck + +// lupin : 2014-11-07 LUPIN LIMITED +lupin + +// luxe : 2014-01-09 Top Level Domain Holdings Limited +luxe + +// luxury : 2013-10-17 Luxury Partners, LLC +luxury + +// macys : 2015-07-31 Macys, Inc. +macys + +// madrid : 2014-05-01 Comunidad de Madrid +madrid + +// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF) +maif + +// maison : 2013-12-05 Victor Frostbite, LLC +maison + +// makeup : 2015-01-15 L'Oréal +makeup + +// man : 2014-12-04 MAN SE +man + +// management : 2013-11-07 John Goodbye, LLC +management + +// mango : 2013-10-24 PUNTO FA S.L. +mango + +// map : 2016-06-09 Charleston Road Registry Inc. +map + +// market : 2014-03-06 +market + +// marketing : 2013-11-07 Fern Pass, LLC +marketing + +// markets : 2014-12-11 IG Group Holdings PLC +markets + +// marriott : 2014-10-09 Marriott Worldwide Corporation +marriott + +// marshalls : 2015-07-16 The TJX Companies, Inc. +marshalls + +// maserati : 2015-07-31 Fiat Chrysler Automobiles N.V. +maserati + +// mattel : 2015-08-06 Mattel Sites, Inc. +mattel + +// mba : 2015-04-02 Lone Hollow, LLC +mba + +// mckinsey : 2015-07-31 McKinsey Holdings, Inc. +mckinsey + +// med : 2015-08-06 Medistry LLC +med + +// media : 2014-03-06 Grand Glen, LLC +media + +// meet : 2014-01-16 +meet + +// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation +melbourne + +// meme : 2014-01-30 Charleston Road Registry Inc. +meme + +// memorial : 2014-10-16 Dog Beach, LLC +memorial + +// men : 2015-02-26 Exclusive Registry Limited +men + +// menu : 2013-09-11 Wedding TLD2, LLC +menu + +// meo : 2014-11-07 PT Comunicacoes S.A. +meo + +// merckmsd : 2016-07-14 MSD Registry Holdings, Inc. +merckmsd + +// metlife : 2015-05-07 MetLife Services and Solutions, LLC +metlife + +// miami : 2013-12-19 Top Level Domain Holdings Limited +miami + +// microsoft : 2014-12-18 Microsoft Corporation +microsoft + +// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft +mini + +// mint : 2015-07-30 Intuit Administrative Services, Inc. +mint + +// mit : 2015-07-02 Massachusetts Institute of Technology +mit + +// mitsubishi : 2015-07-23 Mitsubishi Corporation +mitsubishi + +// mlb : 2015-05-21 MLB Advanced Media DH, LLC +mlb + +// mls : 2015-04-23 The Canadian Real Estate Association +mls + +// mma : 2014-11-07 MMA IARD +mma + +// mobile : 2016-06-02 Dish DBS Corporation +mobile + +// mobily : 2014-12-18 GreenTech Consultancy Company W.L.L. +mobily + +// moda : 2013-11-07 United TLD Holdco Ltd. +moda + +// moe : 2013-11-13 Interlink Co., Ltd. +moe + +// moi : 2014-12-18 Amazon EU S.à r.l. +moi + +// mom : 2015-04-16 Uniregistry, Corp. +mom + +// monash : 2013-09-30 Monash University +monash + +// money : 2014-10-16 Outer McCook, LLC +money + +// monster : 2015-09-11 Monster Worldwide, Inc. +monster + +// mopar : 2015-07-30 FCA US LLC. +mopar + +// mormon : 2013-12-05 IRI Domain Management, LLC ("Applicant") +mormon + +// mortgage : 2014-03-20 +mortgage + +// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +moscow + +// moto : 2015-06-04 +moto + +// motorcycles : 2014-01-09 DERMotorcycles, LLC +motorcycles + +// mov : 2014-01-30 Charleston Road Registry Inc. +mov + +// movie : 2015-02-05 New Frostbite, LLC +movie + +// movistar : 2014-10-16 Telefónica S.A. +movistar + +// msd : 2015-07-23 MSD Registry Holdings, Inc. +msd + +// mtn : 2014-12-04 MTN Dubai Limited +mtn + +// mtpc : 2014-11-20 Mitsubishi Tanabe Pharma Corporation +mtpc + +// mtr : 2015-03-12 MTR Corporation Limited +mtr + +// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC +mutual + +// nab : 2015-08-20 National Australia Bank Limited +nab + +// nadex : 2014-12-11 IG Group Holdings PLC +nadex + +// nagoya : 2013-10-24 GMO Registry, Inc. +nagoya + +// nationwide : 2015-07-23 Nationwide Mutual Insurance Company +nationwide + +// natura : 2015-03-12 NATURA COSMÉTICOS S.A. +natura + +// navy : 2014-03-06 United TLD Holdco Ltd. +navy + +// nba : 2015-07-31 NBA REGISTRY, LLC +nba + +// nec : 2015-01-08 NEC Corporation +nec + +// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA +netbank + +// netflix : 2015-06-18 Netflix, Inc. +netflix + +// network : 2013-11-14 Trixy Manor, LLC +network + +// neustar : 2013-12-05 NeuStar, Inc. +neustar + +// new : 2014-01-30 Charleston Road Registry Inc. +new + +// newholland : 2015-09-03 CNH Industrial N.V. +newholland + +// news : 2014-12-18 +news + +// next : 2015-06-18 Next plc +next + +// nextdirect : 2015-06-18 Next plc +nextdirect + +// nexus : 2014-07-24 Charleston Road Registry Inc. +nexus + +// nfl : 2015-07-23 NFL Reg Ops LLC +nfl + +// ngo : 2014-03-06 Public Interest Registry +ngo + +// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK) +nhk + +// nico : 2014-12-04 DWANGO Co., Ltd. +nico + +// nike : 2015-07-23 NIKE, Inc. +nike + +// nikon : 2015-05-21 NIKON CORPORATION +nikon + +// ninja : 2013-11-07 United TLD Holdco Ltd. +ninja + +// nissan : 2014-03-27 NISSAN MOTOR CO., LTD. +nissan + +// nissay : 2015-10-29 Nippon Life Insurance Company +nissay + +// nokia : 2015-01-08 Nokia Corporation +nokia + +// northwesternmutual : 2015-06-18 Northwestern Mutual Registry, LLC +northwesternmutual + +// norton : 2014-12-04 Symantec Corporation +norton + +// now : 2015-06-25 Amazon EU S.à r.l. +now + +// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +nowruz + +// nowtv : 2015-05-14 Starbucks (HK) Limited +nowtv + +// nra : 2014-05-22 NRA Holdings Company, INC. +nra + +// nrw : 2013-11-21 Minds + Machines GmbH +nrw + +// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION +ntt + +// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications +nyc + +// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA +obi + +// observer : 2015-04-30 +observer + +// off : 2015-07-23 Johnson Shareholdings, Inc. +off + +// office : 2015-03-12 Microsoft Corporation +office + +// okinawa : 2013-12-05 BusinessRalliart Inc. +okinawa + +// olayan : 2015-05-14 Crescent Holding GmbH +olayan + +// olayangroup : 2015-05-14 Crescent Holding GmbH +olayangroup + +// oldnavy : 2015-07-31 The Gap, Inc. +oldnavy + +// ollo : 2015-06-04 Dish DBS Corporation +ollo + +// omega : 2015-01-08 The Swatch Group Ltd +omega + +// one : 2014-11-07 One.com A/S +one + +// ong : 2014-03-06 Public Interest Registry +ong + +// onl : 2013-09-16 I-Registry Ltd. +onl + +// online : 2015-01-15 DotOnline Inc. +online + +// onyourside : 2015-07-23 Nationwide Mutual Insurance Company +onyourside + +// ooo : 2014-01-09 INFIBEAM INCORPORATION LIMITED +ooo + +// open : 2015-07-31 American Express Travel Related Services Company, Inc. +open + +// oracle : 2014-06-19 Oracle Corporation +oracle + +// orange : 2015-03-12 Orange Brand Services Limited +orange + +// organic : 2014-03-27 Afilias Limited +organic + +// origins : 2015-10-01 The Estée Lauder Companies Inc. +origins + +// osaka : 2014-09-04 Interlink Co., Ltd. +osaka + +// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd. +otsuka + +// ott : 2015-06-04 Dish DBS Corporation +ott + +// ovh : 2014-01-16 OVH SAS +ovh + +// page : 2014-12-04 Charleston Road Registry Inc. +page + +// panasonic : 2015-07-30 Panasonic Corporation +panasonic + +// panerai : 2014-11-07 Richemont DNS Inc. +panerai + +// paris : 2014-01-30 City of Paris +paris + +// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +pars + +// partners : 2013-12-05 Magic Glen, LLC +partners + +// parts : 2013-12-05 Sea Goodbye, LLC +parts + +// party : 2014-09-11 Blue Sky Registry Limited +party + +// passagens : 2015-03-05 Travel Reservations SRL +passagens + +// pay : 2015-08-27 Amazon EU S.à r.l. +pay + +// pccw : 2015-05-14 PCCW Enterprises Limited +pccw + +// pet : 2015-05-07 Afilias plc +pet + +// pfizer : 2015-09-11 Pfizer Inc. +pfizer + +// pharmacy : 2014-06-19 National Association of Boards of Pharmacy +pharmacy + +// phd : 2016-07-28 Charleston Road Registry Inc. +phd + +// philips : 2014-11-07 Koninklijke Philips N.V. +philips + +// phone : 2016-06-02 Dish DBS Corporation +phone + +// photo : 2013-11-14 Uniregistry, Corp. +photo + +// photography : 2013-09-20 Sugar Glen, LLC +photography + +// photos : 2013-10-17 Sea Corner, LLC +photos + +// physio : 2014-05-01 PhysBiz Pty Ltd +physio + +// piaget : 2014-10-16 Richemont DNS Inc. +piaget + +// pics : 2013-11-14 Uniregistry, Corp. +pics + +// pictet : 2014-06-26 Pictet Europe S.A. +pictet + +// pictures : 2014-03-06 Foggy Sky, LLC +pictures + +// pid : 2015-01-08 Top Level Spectrum, Inc. +pid + +// pin : 2014-12-18 Amazon EU S.à r.l. +pin + +// ping : 2015-06-11 Ping Registry Provider, Inc. +ping + +// pink : 2013-10-01 Afilias Limited +pink + +// pioneer : 2015-07-16 Pioneer Corporation +pioneer + +// pizza : 2014-06-26 Foggy Moon, LLC +pizza + +// place : 2014-04-24 Snow Galley, LLC +place + +// play : 2015-03-05 Charleston Road Registry Inc. +play + +// playstation : 2015-07-02 Sony Computer Entertainment Inc. +playstation + +// plumbing : 2013-09-10 Spring Tigers, LLC +plumbing + +// plus : 2015-02-05 Sugar Mill, LLC +plus + +// pnc : 2015-07-02 PNC Domain Co., LLC +pnc + +// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +pohl + +// poker : 2014-07-03 Afilias Domains No. 5 Limited +poker + +// politie : 2015-08-20 Politie Nederland +politie + +// porn : 2014-10-16 ICM Registry PN LLC +porn + +// pramerica : 2015-07-30 Prudential Financial, Inc. +pramerica + +// praxi : 2013-12-05 Praxi S.p.A. +praxi + +// press : 2014-04-03 DotPress Inc. +press + +// prime : 2015-06-25 Amazon EU S.à r.l. +prime + +// prod : 2014-01-23 Charleston Road Registry Inc. +prod + +// productions : 2013-12-05 Magic Birch, LLC +productions + +// prof : 2014-07-24 Charleston Road Registry Inc. +prof + +// progressive : 2015-07-23 Progressive Casualty Insurance Company +progressive + +// promo : 2014-12-18 +promo + +// properties : 2013-12-05 Big Pass, LLC +properties + +// property : 2014-05-22 Uniregistry, Corp. +property + +// protection : 2015-04-23 +protection + +// pru : 2015-07-30 Prudential Financial, Inc. +pru + +// prudential : 2015-07-30 Prudential Financial, Inc. +prudential + +// pub : 2013-12-12 United TLD Holdco Ltd. +pub + +// pwc : 2015-10-29 PricewaterhouseCoopers LLP +pwc + +// qpon : 2013-11-14 dotCOOL, Inc. +qpon + +// quebec : 2013-12-19 PointQuébec Inc +quebec + +// quest : 2015-03-26 Quest ION Limited +quest + +// qvc : 2015-07-30 QVC, Inc. +qvc + +// racing : 2014-12-04 Premier Registry Limited +racing + +// radio : 2016-07-21 European Broadcasting Union (EBU) +radio + +// raid : 2015-07-23 Johnson Shareholdings, Inc. +raid + +// read : 2014-12-18 Amazon EU S.à r.l. +read + +// realestate : 2015-09-11 dotRealEstate LLC +realestate + +// realtor : 2014-05-29 Real Estate Domains LLC +realtor + +// realty : 2015-03-19 Fegistry, LLC +realty + +// recipes : 2013-10-17 Grand Island, LLC +recipes + +// red : 2013-11-07 Afilias Limited +red + +// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd. +redstone + +// redumbrella : 2015-03-26 Travelers TLD, LLC +redumbrella + +// rehab : 2014-03-06 United TLD Holdco Ltd. +rehab + +// reise : 2014-03-13 +reise + +// reisen : 2014-03-06 New Cypress, LLC +reisen + +// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc. +reit + +// reliance : 2015-04-02 Reliance Industries Limited +reliance + +// ren : 2013-12-12 Beijing Qianxiang Wangjing Technology Development Co., Ltd. +ren + +// rent : 2014-12-04 DERRent, LLC +rent + +// rentals : 2013-12-05 Big Hollow,LLC +rentals + +// repair : 2013-11-07 Lone Sunset, LLC +repair + +// report : 2013-12-05 Binky Glen, LLC +report + +// republican : 2014-03-20 United TLD Holdco Ltd. +republican + +// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable +rest + +// restaurant : 2014-07-03 Snow Avenue, LLC +restaurant + +// review : 2014-11-20 dot Review Limited +review + +// reviews : 2013-09-13 +reviews + +// rexroth : 2015-06-18 Robert Bosch GMBH +rexroth + +// rich : 2013-11-21 I-Registry Ltd. +rich + +// richardli : 2015-05-14 Pacific Century Asset Management (HK) Limited +richardli + +// ricoh : 2014-11-20 Ricoh Company, Ltd. +ricoh + +// rightathome : 2015-07-23 Johnson Shareholdings, Inc. +rightathome + +// ril : 2015-04-02 Reliance Industries Limited +ril + +// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO +rio + +// rip : 2014-07-10 United TLD Holdco Ltd. +rip + +// rmit : 2015-11-19 Royal Melbourne Institute of Technology +rmit + +// rocher : 2014-12-18 Ferrero Trading Lux S.A. +rocher + +// rocks : 2013-11-14 +rocks + +// rodeo : 2013-12-19 Top Level Domain Holdings Limited +rodeo + +// rogers : 2015-08-06 Rogers Communications Partnership +rogers + +// room : 2014-12-18 Amazon EU S.à r.l. +room + +// rsvp : 2014-05-08 Charleston Road Registry Inc. +rsvp + +// rugby : 2016-12-15 World Rugby Strategic Developments Limited +rugby + +// ruhr : 2013-10-02 regiodot GmbH & Co. KG +ruhr + +// run : 2015-03-19 Snow Park, LLC +run + +// rwe : 2015-04-02 RWE AG +rwe + +// ryukyu : 2014-01-09 BusinessRalliart Inc. +ryukyu + +// saarland : 2013-12-12 dotSaarland GmbH +saarland + +// safe : 2014-12-18 Amazon EU S.à r.l. +safe + +// safety : 2015-01-08 Safety Registry Services, LLC. +safety + +// sakura : 2014-12-18 SAKURA Internet Inc. +sakura + +// sale : 2014-10-16 +sale + +// salon : 2014-12-11 Outer Orchard, LLC +salon + +// samsclub : 2015-07-31 Wal-Mart Stores, Inc. +samsclub + +// samsung : 2014-04-03 SAMSUNG SDS CO., LTD +samsung + +// sandvik : 2014-11-13 Sandvik AB +sandvik + +// sandvikcoromant : 2014-11-07 Sandvik AB +sandvikcoromant + +// sanofi : 2014-10-09 Sanofi +sanofi + +// sap : 2014-03-27 SAP AG +sap + +// sapo : 2014-11-07 PT Comunicacoes S.A. +sapo + +// sarl : 2014-07-03 Delta Orchard, LLC +sarl + +// sas : 2015-04-02 Research IP LLC +sas + +// save : 2015-06-25 Amazon EU S.à r.l. +save + +// saxo : 2014-10-31 Saxo Bank A/S +saxo + +// sbi : 2015-03-12 STATE BANK OF INDIA +sbi + +// sbs : 2014-11-07 SPECIAL BROADCASTING SERVICE CORPORATION +sbs + +// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ) +sca + +// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited ("SCB") +scb + +// schaeffler : 2015-08-06 Schaeffler Technologies AG & Co. KG +schaeffler + +// schmidt : 2014-04-03 SALM S.A.S. +schmidt + +// scholarships : 2014-04-24 Scholarships.com, LLC +scholarships + +// school : 2014-12-18 Little Galley, LLC +school + +// schule : 2014-03-06 Outer Moon, LLC +schule + +// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG +schwarz + +// science : 2014-09-11 dot Science Limited +science + +// scjohnson : 2015-07-23 Johnson Shareholdings, Inc. +scjohnson + +// scor : 2014-10-31 SCOR SE +scor + +// scot : 2014-01-23 Dot Scot Registry Limited +scot + +// search : 2016-06-09 Charleston Road Registry Inc. +search + +// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) +seat + +// secure : 2015-08-27 Amazon EU S.à r.l. +secure + +// security : 2015-05-14 +security + +// seek : 2014-12-04 Seek Limited +seek + +// select : 2015-10-08 iSelect Ltd +select + +// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A. +sener + +// services : 2014-02-27 Fox Castle, LLC +services + +// ses : 2015-07-23 SES +ses + +// seven : 2015-08-06 Seven West Media Ltd +seven + +// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG +sew + +// sex : 2014-11-13 ICM Registry SX LLC +sex + +// sexy : 2013-09-11 Uniregistry, Corp. +sexy + +// sfr : 2015-08-13 Societe Francaise du Radiotelephone - SFR +sfr + +// shangrila : 2015-09-03 Shangri‐La International Hotel Management Limited +shangrila + +// sharp : 2014-05-01 Sharp Corporation +sharp + +// shaw : 2015-04-23 Shaw Cablesystems G.P. +shaw + +// shell : 2015-07-30 Shell Information Technology International Inc +shell + +// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +shia + +// shiksha : 2013-11-14 Afilias Limited +shiksha + +// shoes : 2013-10-02 Binky Galley, LLC +shoes + +// shop : 2016-04-08 GMO Registry, Inc. +shop + +// shopping : 2016-03-31 +shopping + +// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +shouji + +// show : 2015-03-05 Snow Beach, LLC +show + +// showtime : 2015-08-06 CBS Domains Inc. +showtime + +// shriram : 2014-01-23 Shriram Capital Ltd. +shriram + +// silk : 2015-06-25 Amazon EU S.à r.l. +silk + +// sina : 2015-03-12 Sina Corporation +sina + +// singles : 2013-08-27 Fern Madison, LLC +singles + +// site : 2015-01-15 DotSite Inc. +site + +// ski : 2015-04-09 STARTING DOT LIMITED +ski + +// skin : 2015-01-15 L'Oréal +skin + +// sky : 2014-06-19 Sky IP International Ltd, a company incorporated in England and Wales, operating via its registered Swiss branch +sky + +// skype : 2014-12-18 Microsoft Corporation +skype + +// sling : 2015-07-30 Hughes Satellite Systems Corporation +sling + +// smart : 2015-07-09 Smart Communications, Inc. (SMART) +smart + +// smile : 2014-12-18 Amazon EU S.à r.l. +smile + +// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F +sncf + +// soccer : 2015-03-26 Foggy Shadow, LLC +soccer + +// social : 2013-11-07 United TLD Holdco Ltd. +social + +// softbank : 2015-07-02 SoftBank Corp. +softbank + +// software : 2014-03-20 +software + +// sohu : 2013-12-19 Sohu.com Limited +sohu + +// solar : 2013-11-07 Ruby Town, LLC +solar + +// solutions : 2013-11-07 Silver Cover, LLC +solutions + +// song : 2015-02-26 Amazon EU S.à r.l. +song + +// sony : 2015-01-08 Sony Corporation +sony + +// soy : 2014-01-23 Charleston Road Registry Inc. +soy + +// space : 2014-04-03 DotSpace Inc. +space + +// spiegel : 2014-02-05 SPIEGEL-Verlag Rudolf Augstein GmbH & Co. KG +spiegel + +// spot : 2015-02-26 Amazon EU S.à r.l. +spot + +// spreadbetting : 2014-12-11 IG Group Holdings PLC +spreadbetting + +// srl : 2015-05-07 mySRL GmbH +srl + +// srt : 2015-07-30 FCA US LLC. +srt + +// stada : 2014-11-13 STADA Arzneimittel AG +stada + +// staples : 2015-07-30 Staples, Inc. +staples + +// star : 2015-01-08 Star India Private Limited +star + +// starhub : 2015-02-05 StarHub Ltd +starhub + +// statebank : 2015-03-12 STATE BANK OF INDIA +statebank + +// statefarm : 2015-07-30 State Farm Mutual Automobile Insurance Company +statefarm + +// statoil : 2014-12-04 Statoil ASA +statoil + +// stc : 2014-10-09 Saudi Telecom Company +stc + +// stcgroup : 2014-10-09 Saudi Telecom Company +stcgroup + +// stockholm : 2014-12-18 Stockholms kommun +stockholm + +// storage : 2014-12-22 Self Storage Company LLC +storage + +// store : 2015-04-09 DotStore Inc. +store + +// stream : 2016-01-08 dot Stream Limited +stream + +// studio : 2015-02-11 +studio + +// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD +study + +// style : 2014-12-04 Binky Moon, LLC +style + +// sucks : 2014-12-22 Vox Populi Registry Inc. +sucks + +// supplies : 2013-12-19 Atomic Fields, LLC +supplies + +// supply : 2013-12-19 Half Falls, LLC +supply + +// support : 2013-10-24 Grand Orchard, LLC +support + +// surf : 2014-01-09 Top Level Domain Holdings Limited +surf + +// surgery : 2014-03-20 Tin Avenue, LLC +surgery + +// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION +suzuki + +// swatch : 2015-01-08 The Swatch Group Ltd +swatch + +// swiftcover : 2015-07-23 Swiftcover Insurance Services Limited +swiftcover + +// swiss : 2014-10-16 Swiss Confederation +swiss + +// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet +sydney + +// symantec : 2014-12-04 Symantec Corporation +symantec + +// systems : 2013-11-07 Dash Cypress, LLC +systems + +// tab : 2014-12-04 Tabcorp Holdings Limited +tab + +// taipei : 2014-07-10 Taipei City Government +taipei + +// talk : 2015-04-09 Amazon EU S.à r.l. +talk + +// taobao : 2015-01-15 Alibaba Group Holding Limited +taobao + +// target : 2015-07-31 Target Domain Holdings, LLC +target + +// tatamotors : 2015-03-12 Tata Motors Ltd +tatamotors + +// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" +tatar + +// tattoo : 2013-08-30 Uniregistry, Corp. +tattoo + +// tax : 2014-03-20 Storm Orchard, LLC +tax + +// taxi : 2015-03-19 Pine Falls, LLC +taxi + +// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +tci + +// tdk : 2015-06-11 TDK Corporation +tdk + +// team : 2015-03-05 Atomic Lake, LLC +team + +// tech : 2015-01-30 Dot Tech LLC +tech + +// technology : 2013-09-13 Auburn Falls +technology + +// telecity : 2015-02-19 TelecityGroup International Limited +telecity + +// telefonica : 2014-10-16 Telefónica S.A. +telefonica + +// temasek : 2014-08-07 Temasek Holdings (Private) Limited +temasek + +// tennis : 2014-12-04 Cotton Bloom, LLC +tennis + +// teva : 2015-07-02 Teva Pharmaceutical Industries Limited +teva + +// thd : 2015-04-02 Homer TLC, Inc. +thd + +// theater : 2015-03-19 Blue Tigers, LLC +theater + +// theatre : 2015-05-07 +theatre + +// tiaa : 2015-07-23 Teachers Insurance and Annuity Association of America +tiaa + +// tickets : 2015-02-05 Accent Media Limited +tickets + +// tienda : 2013-11-14 Victor Manor, LLC +tienda + +// tiffany : 2015-01-30 Tiffany and Company +tiffany + +// tips : 2013-09-20 Corn Willow, LLC +tips + +// tires : 2014-11-07 Dog Edge, LLC +tires + +// tirol : 2014-04-24 punkt Tirol GmbH +tirol + +// tjmaxx : 2015-07-16 The TJX Companies, Inc. +tjmaxx + +// tjx : 2015-07-16 The TJX Companies, Inc. +tjx + +// tkmaxx : 2015-07-16 The TJX Companies, Inc. +tkmaxx + +// tmall : 2015-01-15 Alibaba Group Holding Limited +tmall + +// today : 2013-09-20 Pearl Woods, LLC +today + +// tokyo : 2013-11-13 GMO Registry, Inc. +tokyo + +// tools : 2013-11-21 Pioneer North, LLC +tools + +// top : 2014-03-20 Jiangsu Bangning Science & Technology Co.,Ltd. +top + +// toray : 2014-12-18 Toray Industries, Inc. +toray + +// toshiba : 2014-04-10 TOSHIBA Corporation +toshiba + +// total : 2015-08-06 Total SA +total + +// tours : 2015-01-22 Sugar Station, LLC +tours + +// town : 2014-03-06 Koko Moon, LLC +town + +// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION +toyota + +// toys : 2014-03-06 Pioneer Orchard, LLC +toys + +// trade : 2014-01-23 Elite Registry Limited +trade + +// trading : 2014-12-11 IG Group Holdings PLC +trading + +// training : 2013-11-07 Wild Willow, LLC +training + +// travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. +travelchannel + +// travelers : 2015-03-26 Travelers TLD, LLC +travelers + +// travelersinsurance : 2015-03-26 Travelers TLD, LLC +travelersinsurance + +// trust : 2014-10-16 +trust + +// trv : 2015-03-26 Travelers TLD, LLC +trv + +// tube : 2015-06-11 Latin American Telecom LLC +tube + +// tui : 2014-07-03 TUI AG +tui + +// tunes : 2015-02-26 Amazon EU S.à r.l. +tunes + +// tushu : 2014-12-18 Amazon EU S.à r.l. +tushu + +// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED +tvs + +// ubank : 2015-08-20 National Australia Bank Limited +ubank + +// ubs : 2014-12-11 UBS AG +ubs + +// uconnect : 2015-07-30 FCA US LLC. +uconnect + +// unicom : 2015-10-15 China United Network Communications Corporation Limited +unicom + +// university : 2014-03-06 Little Station, LLC +university + +// uno : 2013-09-11 Dot Latin LLC +uno + +// uol : 2014-05-01 UBN INTERNET LTDA. +uol + +// ups : 2015-06-25 UPS Market Driver, Inc. +ups + +// vacations : 2013-12-05 Atomic Tigers, LLC +vacations + +// vana : 2014-12-11 Lifestyle Domain Holdings, Inc. +vana + +// vanguard : 2015-09-03 The Vanguard Group, Inc. +vanguard + +// vegas : 2014-01-16 Dot Vegas, Inc. +vegas + +// ventures : 2013-08-27 Binky Lake, LLC +ventures + +// verisign : 2015-08-13 VeriSign, Inc. +verisign + +// versicherung : 2014-03-20 +versicherung + +// vet : 2014-03-06 +vet + +// viajes : 2013-10-17 Black Madison, LLC +viajes + +// video : 2014-10-16 +video + +// vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe +vig + +// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd. +viking + +// villas : 2013-12-05 New Sky, LLC +villas + +// vin : 2015-06-18 Holly Shadow, LLC +vin + +// vip : 2015-01-22 Minds + Machines Group Limited +vip + +// virgin : 2014-09-25 Virgin Enterprises Limited +virgin + +// visa : 2015-07-30 Visa Worldwide Pte. Limited +visa + +// vision : 2013-12-05 Koko Station, LLC +vision + +// vista : 2014-09-18 Vistaprint Limited +vista + +// vistaprint : 2014-09-18 Vistaprint Limited +vistaprint + +// viva : 2014-11-07 Saudi Telecom Company +viva + +// vivo : 2015-07-31 Telefonica Brasil S.A. +vivo + +// vlaanderen : 2014-02-06 DNS.be vzw +vlaanderen + +// vodka : 2013-12-19 Top Level Domain Holdings Limited +vodka + +// volkswagen : 2015-05-14 Volkswagen Group of America Inc. +volkswagen + +// volvo : 2015-11-12 Volvo Holding Sverige Aktiebolag +volvo + +// vote : 2013-11-21 Monolith Registry LLC +vote + +// voting : 2013-11-13 Valuetainment Corp. +voting + +// voto : 2013-11-21 Monolith Registry LLC +voto + +// voyage : 2013-08-27 Ruby House, LLC +voyage + +// vuelos : 2015-03-05 Travel Reservations SRL +vuelos + +// wales : 2014-05-08 Nominet UK +wales + +// walmart : 2015-07-31 Wal-Mart Stores, Inc. +walmart + +// walter : 2014-11-13 Sandvik AB +walter + +// wang : 2013-10-24 Zodiac Leo Limited +wang + +// wanggou : 2014-12-18 Amazon EU S.à r.l. +wanggou + +// warman : 2015-06-18 Weir Group IP Limited +warman + +// watch : 2013-11-14 Sand Shadow, LLC +watch + +// watches : 2014-12-22 Richemont DNS Inc. +watches + +// weather : 2015-01-08 The Weather Channel, LLC +weather + +// weatherchannel : 2015-03-12 The Weather Channel, LLC +weatherchannel + +// webcam : 2014-01-23 dot Webcam Limited +webcam + +// weber : 2015-06-04 Saint-Gobain Weber SA +weber + +// website : 2014-04-03 DotWebsite Inc. +website + +// wed : 2013-10-01 Atgron, Inc. +wed + +// wedding : 2014-04-24 Top Level Domain Holdings Limited +wedding + +// weibo : 2015-03-05 Sina Corporation +weibo + +// weir : 2015-01-29 Weir Group IP Limited +weir + +// whoswho : 2014-02-20 Who's Who Registry +whoswho + +// wien : 2013-10-28 punkt.wien GmbH +wien + +// wiki : 2013-11-07 Top Level Design, LLC +wiki + +// williamhill : 2014-03-13 William Hill Organization Limited +williamhill + +// win : 2014-11-20 First Registry Limited +win + +// windows : 2014-12-18 Microsoft Corporation +windows + +// wine : 2015-06-18 June Station, LLC +wine + +// winners : 2015-07-16 The TJX Companies, Inc. +winners + +// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC +wme + +// wolterskluwer : 2015-08-06 Wolters Kluwer N.V. +wolterskluwer + +// woodside : 2015-07-09 Woodside Petroleum Limited +woodside + +// work : 2013-12-19 Top Level Domain Holdings Limited +work + +// works : 2013-11-14 Little Dynamite, LLC +works + +// world : 2014-06-12 Bitter Fields, LLC +world + +// wow : 2015-10-08 Amazon EU S.à r.l. +wow + +// wtc : 2013-12-19 World Trade Centers Association, Inc. +wtc + +// wtf : 2014-03-06 Hidden Way, LLC +wtf + +// xbox : 2014-12-18 Microsoft Corporation +xbox + +// xerox : 2014-10-24 Xerox DNHC LLC +xerox + +// xfinity : 2015-07-09 Comcast IP Holdings I, LLC +xfinity + +// xihuan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +xihuan + +// xin : 2014-12-11 Elegant Leader Limited +xin + +// xn--11b4c3d : 2015-01-15 VeriSign Sarl +कॉम + +// xn--1ck2e1b : 2015-02-26 Amazon EU S.à r.l. +セール + +// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd. +佛山 + +// xn--30rr7y : 2014-06-12 Excellent First Limited +慈善 + +// xn--3bst00m : 2013-09-13 Eagle Horizon Limited +集团 + +// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED +在线 + +// xn--3oq18vl8pn36a : 2015-07-02 Volkswagen (China) Investment Co., Ltd. +大众汽车 + +// xn--3pxu8k : 2015-01-15 VeriSign Sarl +点看 + +// xn--42c2d9a : 2015-01-15 VeriSign Sarl +คอม + +// xn--45q11c : 2013-11-21 Zodiac Scorpio Limited +八卦 + +// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment +موقع + +// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center +公益 + +// xn--55qx5d : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) +公司 + +// xn--5su34j936bgsg : 2015-09-03 Shangri‐La International Hotel Management Limited +香格里拉 + +// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited +网站 + +// xn--6frz82g : 2013-09-23 Afilias Limited +移动 + +// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited +我爱你 + +// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) +москва + +// xn--80aqecdr1a : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +католик + +// xn--80asehdb : 2013-07-14 CORE Association +онлайн + +// xn--80aswg : 2013-07-14 CORE Association +сайт + +// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited +联通 + +// xn--9dbq2a : 2015-01-15 VeriSign Sarl +קום + +// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED +时尚 + +// xn--9krt00a : 2015-03-12 Sina Corporation +微博 + +// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited +淡马锡 + +// xn--bck1b9a5dre4c : 2015-02-26 Amazon EU S.à r.l. +ファッション + +// xn--c1avg : 2013-11-14 Public Interest Registry +орг + +// xn--c2br7g : 2015-01-15 VeriSign Sarl +नेट + +// xn--cck2b3b : 2015-02-26 Amazon EU S.à r.l. +ストア + +// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD +삼성 + +// xn--czr694b : 2014-01-16 Dot Trademark TLD Holding Company Limited +商标 + +// xn--czrs0t : 2013-12-19 Wild Island, LLC +商店 + +// xn--czru2d : 2013-11-21 Zodiac Capricorn Limited +商城 + +// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet” +дети + +// xn--eckvdtc9d : 2014-12-18 Amazon EU S.à r.l. +ポイント + +// xn--efvy88h : 2014-08-22 Xinhua News Agency Guangdong Branch 新华通讯社广东分社 +新闻 + +// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited +工行 + +// xn--fct429k : 2015-04-09 Amazon EU S.à r.l. +家電 + +// xn--fhbei : 2015-01-15 VeriSign Sarl +كوم + +// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED +中文网 + +// xn--fiq64b : 2013-10-14 CITIC Group Corporation +中信 + +// xn--fjq720a : 2014-05-22 Will Bloom, LLC +娱乐 + +// xn--flw351e : 2014-07-31 Charleston Road Registry Inc. +谷歌 + +// xn--fzys8d69uvgm : 2015-05-14 PCCW Enterprises Limited +電訊盈科 + +// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited +购物 + +// xn--gckr3f0f : 2015-02-26 Amazon EU S.à r.l. +クラウド + +// xn--gk3at1e : 2015-10-08 Amazon EU S.à r.l. +通販 + +// xn--hxt814e : 2014-05-15 Zodiac Libra Limited +网店 + +// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry +संगठन + +// xn--imr513n : 2014-12-11 Dot Trademark TLD Holding Company Limited +餐厅 + +// xn--io0a7i : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) +网络 + +// xn--j1aef : 2015-01-15 VeriSign Sarl +ком + +// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation +诺基亚 + +// xn--jvr189m : 2015-02-26 Amazon EU S.à r.l. +食品 + +// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V. +飞利浦 + +// xn--kpu716f : 2014-12-22 Richemont DNS Inc. +手表 + +// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd +手机 + +// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company +ارامكو + +// xn--mgba7c0bbn0a : 2015-05-14 Crescent Holding GmbH +العليان + +// xn--mgbaakc7dvf : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) +اتصالات + +// xn--mgbab2bd : 2013-10-31 CORE Association +بازار + +// xn--mgbb9fbpob : 2014-12-18 GreenTech Consultancy Company W.L.L. +موبايلي + +// xn--mgbca7dzdo : 2015-07-30 Abu Dhabi Systems and Information Centre +ابوظبي + +// xn--mgbi4ecexp : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +كاثوليك + +// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. +همراه + +// xn--mk1bu44c : 2015-01-15 VeriSign Sarl +닷컴 + +// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd. +政府 + +// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd. +شبكة + +// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House +بيتك + +// xn--ngbrx : 2015-11-12 League of Arab States +عرب + +// xn--nqv7f : 2013-11-14 Public Interest Registry +机构 + +// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry +组织机构 + +// xn--nyqy26a : 2014-11-07 Stable Tone Limited +健康 + +// xn--p1acf : 2013-12-12 Rusnames Limited +рус + +// xn--pbt977c : 2014-12-22 Richemont DNS Inc. +珠宝 + +// xn--pssy2u : 2015-01-15 VeriSign Sarl +大拿 + +// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc. +みんな + +// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc. +グーグル + +// xn--rhqv96g : 2013-09-11 Stable Tone Limited +世界 + +// xn--rovu88b : 2015-02-26 Amazon EU S.à r.l. +書籍 + +// xn--ses554g : 2014-01-16 +网址 + +// xn--t60b56a : 2015-01-15 VeriSign Sarl +닷넷 + +// xn--tckwe : 2015-01-15 VeriSign Sarl +コム + +// xn--tiq49xqyj : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) +天主教 + +// xn--unup4y : 2013-07-14 Spring Fields, LLC +游戏 + +// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberater + +// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG +vermögensberatung + +// xn--vhquv : 2013-08-27 Dash McCook, LLC +企业 + +// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd. +信息 + +// xn--w4r85el8fhu5dnra : 2015-04-30 Kerry Trading Co. Limited +嘉里大酒店 + +// xn--w4rs40l : 2015-07-30 Kerry Trading Co. Limited +嘉里 + +// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd. +广东 + +// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center +政务 + +// xperia : 2015-05-14 Sony Mobile Communications AB +xperia + +// xyz : 2013-12-05 XYZ.COM LLC +xyz + +// yachts : 2014-01-09 DERYachts, LLC +yachts + +// yahoo : 2015-04-02 Yahoo! Domain Services Inc. +yahoo + +// yamaxun : 2014-12-18 Amazon EU S.à r.l. +yamaxun + +// yandex : 2014-04-10 YANDEX, LLC +yandex + +// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. +yodobashi + +// yoga : 2014-05-29 Top Level Domain Holdings Limited +yoga + +// yokohama : 2013-12-12 GMO Registry, Inc. +yokohama + +// you : 2015-04-09 Amazon EU S.à r.l. +you + +// youtube : 2014-05-01 Charleston Road Registry Inc. +youtube + +// yun : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +yun + +// zappos : 2015-06-25 Amazon EU S.à r.l. +zappos + +// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) +zara + +// zero : 2014-12-18 Amazon EU S.à r.l. +zero + +// zip : 2014-05-08 Charleston Road Registry Inc. +zip + +// zippo : 2015-07-02 Zadco Company +zippo + +// zone : 2013-11-14 Outer Falls, LLC +zone + +// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich) +zuerich + + +// ===END ICANN DOMAINS=== +// ===BEGIN PRIVATE DOMAINS=== +// (Note: these are in alphabetical order by company name) + +// 1GB LLC : https://www.1gb.ua/ +// Submitted by 1GB LLC +cc.ua +inf.ua +ltd.ua + +// Agnat sp. z o.o. : https://domena.pl +// Submitted by Przemyslaw Plewa +beep.pl + +// Alces Software Ltd : http://alces-software.com +// Submitted by Mark J. Titorenko +*.compute.estate +*.alces.network + +// alwaysdata : https://www.alwaysdata.com +// Submitted by Cyril +*.alwaysdata.net + +// Amazon CloudFront : https://aws.amazon.com/cloudfront/ +// Submitted by Donavan Miller +cloudfront.net + +// Amazon Elastic Compute Cloud : https://aws.amazon.com/ec2/ +// Submitted by Luke Wells +*.compute.amazonaws.com +*.compute-1.amazonaws.com +*.compute.amazonaws.com.cn +us-east-1.amazonaws.com + +// Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ +// Submitted by Luke Wells +cn-north-1.eb.amazonaws.com.cn +elasticbeanstalk.com +ap-northeast-1.elasticbeanstalk.com +ap-northeast-2.elasticbeanstalk.com +ap-south-1.elasticbeanstalk.com +ap-southeast-1.elasticbeanstalk.com +ap-southeast-2.elasticbeanstalk.com +ca-central-1.elasticbeanstalk.com +eu-central-1.elasticbeanstalk.com +eu-west-1.elasticbeanstalk.com +eu-west-2.elasticbeanstalk.com +sa-east-1.elasticbeanstalk.com +us-east-1.elasticbeanstalk.com +us-east-2.elasticbeanstalk.com +us-gov-west-1.elasticbeanstalk.com +us-west-1.elasticbeanstalk.com +us-west-2.elasticbeanstalk.com + +// Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/ +// Submitted by Luke Wells +*.elb.amazonaws.com +*.elb.amazonaws.com.cn + +// Amazon S3 : https://aws.amazon.com/s3/ +// Submitted by Luke Wells +s3.amazonaws.com +s3-ap-northeast-1.amazonaws.com +s3-ap-northeast-2.amazonaws.com +s3-ap-south-1.amazonaws.com +s3-ap-southeast-1.amazonaws.com +s3-ap-southeast-2.amazonaws.com +s3-ca-central-1.amazonaws.com +s3-eu-central-1.amazonaws.com +s3-eu-west-1.amazonaws.com +s3-eu-west-2.amazonaws.com +s3-external-1.amazonaws.com +s3-fips-us-gov-west-1.amazonaws.com +s3-sa-east-1.amazonaws.com +s3-us-gov-west-1.amazonaws.com +s3-us-east-2.amazonaws.com +s3-us-west-1.amazonaws.com +s3-us-west-2.amazonaws.com +s3.ap-northeast-2.amazonaws.com +s3.ap-south-1.amazonaws.com +s3.cn-north-1.amazonaws.com.cn +s3.ca-central-1.amazonaws.com +s3.eu-central-1.amazonaws.com +s3.eu-west-2.amazonaws.com +s3.us-east-2.amazonaws.com +s3.dualstack.ap-northeast-1.amazonaws.com +s3.dualstack.ap-northeast-2.amazonaws.com +s3.dualstack.ap-south-1.amazonaws.com +s3.dualstack.ap-southeast-1.amazonaws.com +s3.dualstack.ap-southeast-2.amazonaws.com +s3.dualstack.ca-central-1.amazonaws.com +s3.dualstack.eu-central-1.amazonaws.com +s3.dualstack.eu-west-1.amazonaws.com +s3.dualstack.eu-west-2.amazonaws.com +s3.dualstack.sa-east-1.amazonaws.com +s3.dualstack.us-east-1.amazonaws.com +s3.dualstack.us-east-2.amazonaws.com +s3-website-us-east-1.amazonaws.com +s3-website-us-west-1.amazonaws.com +s3-website-us-west-2.amazonaws.com +s3-website-ap-northeast-1.amazonaws.com +s3-website-ap-southeast-1.amazonaws.com +s3-website-ap-southeast-2.amazonaws.com +s3-website-eu-west-1.amazonaws.com +s3-website-sa-east-1.amazonaws.com +s3-website.ap-northeast-2.amazonaws.com +s3-website.ap-south-1.amazonaws.com +s3-website.ca-central-1.amazonaws.com +s3-website.eu-central-1.amazonaws.com +s3-website.eu-west-2.amazonaws.com +s3-website.us-east-2.amazonaws.com + +// Amune : https://amune.org/ +// Submitted by Team Amune +t3l3p0rt.net +tele.amune.org + +// Aptible : https://www.aptible.com/ +// Submitted by Thomas Orozco +on-aptible.com + +// Asociación Amigos de la Informática "Euskalamiga" : http://encounter.eus/ +// Submitted by Hector Martin +user.party.eus + +// Association potager.org : https://potager.org/ +// Submitted by Lunar +pimienta.org +poivron.org +potager.org +sweetpepper.org + +// ASUSTOR Inc. : http://www.asustor.com +// Submitted by Vincent Tseng +myasustor.com + +// AVM : https://avm.de +// Submitted by Andreas Weise +myfritz.net + +// AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com +// Submitted by James Kennedy +*.awdev.ca +*.advisor.ws + +// backplane : https://www.backplane.io +// Submitted by Anthony Voutas +backplaneapp.io + +// BetaInABox +// Submitted by Adrian +betainabox.com + +// BinaryLane : http://www.binarylane.com +// Submitted by Nathan O'Sullivan +bnr.la + +// Boomla : https://boomla.com +// Submitted by Tibor Halter +boomla.net + +// Boxfuse : https://boxfuse.com +// Submitted by Axel Fontaine +boxfuse.io + +// bplaced : https://www.bplaced.net/ +// Submitted by Miroslav Bozic +square7.ch +bplaced.com +bplaced.de +square7.de +bplaced.net +square7.net + +// BrowserSafetyMark +// Submitted by Dave Tharp +browsersafetymark.io + +// callidomus : https://www.callidomus.com/ +// Submitted by Marcus Popp +mycd.eu + +// CentralNic : http://www.centralnic.com/names/domains +// Submitted by registry +ae.org +ar.com +br.com +cn.com +com.de +com.se +de.com +eu.com +gb.com +gb.net +hu.com +hu.net +jp.net +jpn.com +kr.com +mex.com +no.com +qc.com +ru.com +sa.com +se.com +se.net +uk.com +uk.net +us.com +uy.com +za.bz +za.com + +// Africa.com Web Solutions Ltd : https://registry.africa.com +// Submitted by Gavin Brown +africa.com + +// iDOT Services Limited : http://www.domain.gr.com +// Submitted by Gavin Brown +gr.com + +// Radix FZC : http://domains.in.net +// Submitted by Gavin Brown +in.net + +// US REGISTRY LLC : http://us.org +// Submitted by Gavin Brown +us.org + +// co.com Registry, LLC : https://registry.co.com +// Submitted by Gavin Brown +co.com + +// c.la : http://www.c.la/ +c.la + +// certmgr.org : https://certmgr.org +// Submitted by B. Blechschmidt +certmgr.org + +// Citrix : https://citrix.com +// Submitted by Alex Stoddard +xenapponazure.com + +// ClearVox : http://www.clearvox.nl/ +// Submitted by Leon Rowland +virtueeldomein.nl + +// Cloud66 : https://www.cloud66.com/ +// Submitted by Khash Sajadi +c66.me + +// CloudAccess.net : https://www.cloudaccess.net/ +// Submitted by Pawel Panek +jdevcloud.com +wpdevcloud.com +cloudaccess.host +freesite.host +cloudaccess.net + +// cloudControl : https://www.cloudcontrol.com/ +// Submitted by Tobias Wilken +cloudcontrolled.com +cloudcontrolapp.com + +// co.ca : http://registry.co.ca/ +co.ca + +// i-registry s.r.o. : http://www.i-registry.cz/ +// Submitted by Martin Semrad +co.cz + +// CDN77.com : http://www.cdn77.com +// Submitted by Jan Krpes +c.cdn77.org +cdn77-ssl.net +r.cdn77.net +rsc.cdn77.org +ssl.origin.cdn77-secure.org + +// Cloud DNS Ltd : http://www.cloudns.net +// Submitted by Aleksander Hristov +cloudns.asia +cloudns.biz +cloudns.club +cloudns.cc +cloudns.eu +cloudns.in +cloudns.info +cloudns.org +cloudns.pro +cloudns.pw +cloudns.us + +// CoDNS B.V. +co.nl +co.no + +// COSIMO GmbH : http://www.cosimo.de +// Submitted by Rene Marticke +dyn.cosidns.de +dynamisches-dns.de +dnsupdater.de +internet-dns.de +l-o-g-i-n.de +dynamic-dns.info +feste-ip.net +knx-server.net +static-access.net + +// Craynic, s.r.o. : http://www.craynic.com/ +// Submitted by Ales Krajnik +realm.cz + +// Cryptonomic : https://cryptonomic.net/ +// Submitted by Andrew Cady +*.cryptonomic.net + +// Cupcake : https://cupcake.io/ +// Submitted by Jonathan Rudenberg +cupcake.is + +// cyon GmbH : https://www.cyon.ch/ +// Submitted by Dominic Luechinger +cyon.link +cyon.site + +// Daplie, Inc : https://daplie.com +// Submitted by AJ ONeal +daplie.me +localhost.daplie.me + +// Dansk.net : http://www.dansk.net/ +// Submitted by Anani Voule +biz.dk +co.dk +firm.dk +reg.dk +store.dk + +// Debian : https://www.debian.org/ +// Submitted by Peter Palfrader / Debian Sysadmin Team +debian.net + +// deSEC : https://desec.io/ +// Submitted by Peter Thomassen +dedyn.io + +// DNShome : https://www.dnshome.de/ +// Submitted by Norbert Auler +dnshome.de + +// DrayTek Corp. : https://www.draytek.com/ +// Submitted by Paul Fang +drayddns.com + +// DreamHost : http://www.dreamhost.com/ +// Submitted by Andrew Farmer +dreamhosters.com + +// Drobo : http://www.drobo.com/ +// Submitted by Ricardo Padilha +mydrobo.com + +// Drud Holdings, LLC. : https://www.drud.com/ +// Submitted by Kevin Bridges +drud.io +drud.us + +// DuckDNS : http://www.duckdns.org/ +// Submitted by Richard Harper +duckdns.org + +// dy.fi : http://dy.fi/ +// Submitted by Heikki Hannikainen +dy.fi +tunk.org + +// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/ +dyndns-at-home.com +dyndns-at-work.com +dyndns-blog.com +dyndns-free.com +dyndns-home.com +dyndns-ip.com +dyndns-mail.com +dyndns-office.com +dyndns-pics.com +dyndns-remote.com +dyndns-server.com +dyndns-web.com +dyndns-wiki.com +dyndns-work.com +dyndns.biz +dyndns.info +dyndns.org +dyndns.tv +at-band-camp.net +ath.cx +barrel-of-knowledge.info +barrell-of-knowledge.info +better-than.tv +blogdns.com +blogdns.net +blogdns.org +blogsite.org +boldlygoingnowhere.org +broke-it.net +buyshouses.net +cechire.com +dnsalias.com +dnsalias.net +dnsalias.org +dnsdojo.com +dnsdojo.net +dnsdojo.org +does-it.net +doesntexist.com +doesntexist.org +dontexist.com +dontexist.net +dontexist.org +doomdns.com +doomdns.org +dvrdns.org +dyn-o-saur.com +dynalias.com +dynalias.net +dynalias.org +dynathome.net +dyndns.ws +endofinternet.net +endofinternet.org +endoftheinternet.org +est-a-la-maison.com +est-a-la-masion.com +est-le-patron.com +est-mon-blogueur.com +for-better.biz +for-more.biz +for-our.info +for-some.biz +for-the.biz +forgot.her.name +forgot.his.name +from-ak.com +from-al.com +from-ar.com +from-az.net +from-ca.com +from-co.net +from-ct.com +from-dc.com +from-de.com +from-fl.com +from-ga.com +from-hi.com +from-ia.com +from-id.com +from-il.com +from-in.com +from-ks.com +from-ky.com +from-la.net +from-ma.com +from-md.com +from-me.org +from-mi.com +from-mn.com +from-mo.com +from-ms.com +from-mt.com +from-nc.com +from-nd.com +from-ne.com +from-nh.com +from-nj.com +from-nm.com +from-nv.com +from-ny.net +from-oh.com +from-ok.com +from-or.com +from-pa.com +from-pr.com +from-ri.com +from-sc.com +from-sd.com +from-tn.com +from-tx.com +from-ut.com +from-va.com +from-vt.com +from-wa.com +from-wi.com +from-wv.com +from-wy.com +ftpaccess.cc +fuettertdasnetz.de +game-host.org +game-server.cc +getmyip.com +gets-it.net +go.dyndns.org +gotdns.com +gotdns.org +groks-the.info +groks-this.info +ham-radio-op.net +here-for-more.info +hobby-site.com +hobby-site.org +home.dyndns.org +homedns.org +homeftp.net +homeftp.org +homeip.net +homelinux.com +homelinux.net +homelinux.org +homeunix.com +homeunix.net +homeunix.org +iamallama.com +in-the-band.net +is-a-anarchist.com +is-a-blogger.com +is-a-bookkeeper.com +is-a-bruinsfan.org +is-a-bulls-fan.com +is-a-candidate.org +is-a-caterer.com +is-a-celticsfan.org +is-a-chef.com +is-a-chef.net +is-a-chef.org +is-a-conservative.com +is-a-cpa.com +is-a-cubicle-slave.com +is-a-democrat.com +is-a-designer.com +is-a-doctor.com +is-a-financialadvisor.com +is-a-geek.com +is-a-geek.net +is-a-geek.org +is-a-green.com +is-a-guru.com +is-a-hard-worker.com +is-a-hunter.com +is-a-knight.org +is-a-landscaper.com +is-a-lawyer.com +is-a-liberal.com +is-a-libertarian.com +is-a-linux-user.org +is-a-llama.com +is-a-musician.com +is-a-nascarfan.com +is-a-nurse.com +is-a-painter.com +is-a-patsfan.org +is-a-personaltrainer.com +is-a-photographer.com +is-a-player.com +is-a-republican.com +is-a-rockstar.com +is-a-socialist.com +is-a-soxfan.org +is-a-student.com +is-a-teacher.com +is-a-techie.com +is-a-therapist.com +is-an-accountant.com +is-an-actor.com +is-an-actress.com +is-an-anarchist.com +is-an-artist.com +is-an-engineer.com +is-an-entertainer.com +is-by.us +is-certified.com +is-found.org +is-gone.com +is-into-anime.com +is-into-cars.com +is-into-cartoons.com +is-into-games.com +is-leet.com +is-lost.org +is-not-certified.com +is-saved.org +is-slick.com +is-uberleet.com +is-very-bad.org +is-very-evil.org +is-very-good.org +is-very-nice.org +is-very-sweet.org +is-with-theband.com +isa-geek.com +isa-geek.net +isa-geek.org +isa-hockeynut.com +issmarterthanyou.com +isteingeek.de +istmein.de +kicks-ass.net +kicks-ass.org +knowsitall.info +land-4-sale.us +lebtimnetz.de +leitungsen.de +likes-pie.com +likescandy.com +merseine.nu +mine.nu +misconfused.org +mypets.ws +myphotos.cc +neat-url.com +office-on-the.net +on-the-web.tv +podzone.net +podzone.org +readmyblog.org +saves-the-whales.com +scrapper-site.net +scrapping.cc +selfip.biz +selfip.com +selfip.info +selfip.net +selfip.org +sells-for-less.com +sells-for-u.com +sells-it.net +sellsyourhome.org +servebbs.com +servebbs.net +servebbs.org +serveftp.net +serveftp.org +servegame.org +shacknet.nu +simple-url.com +space-to-rent.com +stuff-4-sale.org +stuff-4-sale.us +teaches-yoga.com +thruhere.net +traeumtgerade.de +webhop.biz +webhop.info +webhop.net +webhop.org +worse-than.tv +writesthisblog.com + +// ddnss.de : https://www.ddnss.de/ +// Submitted by Robert Niedziela +ddnss.de +dyn.ddnss.de +dyndns.ddnss.de +dyndns1.de +dyn-ip24.de +home-webserver.de +dyn.home-webserver.de +myhome-server.de +ddnss.org + +// Definima : http://www.definima.com/ +// Submitted by Maxence Bitterli +definima.net +definima.io + +// Dynu.com : https://www.dynu.com/ +// Submitted by Sue Ye +ddnsfree.com +ddnsgeek.com +giize.com +gleeze.com +kozow.com +loseyourip.com +ooguy.com +theworkpc.com +casacam.net +dynu.net +accesscam.org +camdvr.org +freeddns.org +mywire.org +webredirect.org +myddns.rocks +blogsite.xyz + +// dynv6 : https://dynv6.com +// Submitted by Dominik Menke +dynv6.net + +// E4YOU spol. s.r.o. : https://e4you.cz/ +// Submitted by Vladimir Dudr +e4.cz + +// Enalean SAS: https://www.enalean.com +// Submitted by Thomas Cottier +mytuleap.com + +// Enonic : http://enonic.com/ +// Submitted by Erik Kaareng-Sunde +enonic.io +customer.enonic.io + +// EU.org https://eu.org/ +// Submitted by Pierre Beyssac +eu.org +al.eu.org +asso.eu.org +at.eu.org +au.eu.org +be.eu.org +bg.eu.org +ca.eu.org +cd.eu.org +ch.eu.org +cn.eu.org +cy.eu.org +cz.eu.org +de.eu.org +dk.eu.org +edu.eu.org +ee.eu.org +es.eu.org +fi.eu.org +fr.eu.org +gr.eu.org +hr.eu.org +hu.eu.org +ie.eu.org +il.eu.org +in.eu.org +int.eu.org +is.eu.org +it.eu.org +jp.eu.org +kr.eu.org +lt.eu.org +lu.eu.org +lv.eu.org +mc.eu.org +me.eu.org +mk.eu.org +mt.eu.org +my.eu.org +net.eu.org +ng.eu.org +nl.eu.org +no.eu.org +nz.eu.org +paris.eu.org +pl.eu.org +pt.eu.org +q-a.eu.org +ro.eu.org +ru.eu.org +se.eu.org +si.eu.org +sk.eu.org +tr.eu.org +uk.eu.org +us.eu.org + +// Evennode : http://www.evennode.com/ +// Submitted by Michal Kralik +eu-1.evennode.com +eu-2.evennode.com +eu-3.evennode.com +eu-4.evennode.com +us-1.evennode.com +us-2.evennode.com +us-3.evennode.com +us-4.evennode.com + +// eDirect Corp. : https://hosting.url.com.tw/ +// Submitted by C.S. chang +twmail.cc +twmail.net +twmail.org +mymailer.com.tw +url.tw + +// Facebook, Inc. +// Submitted by Peter Ruibal +apps.fbsbx.com + +// FAITID : https://faitid.org/ +// Submitted by Maxim Alzoba +// https://www.flexireg.net/stat_info +ru.net +adygeya.ru +bashkiria.ru +bir.ru +cbg.ru +com.ru +dagestan.ru +grozny.ru +kalmykia.ru +kustanai.ru +marine.ru +mordovia.ru +msk.ru +mytis.ru +nalchik.ru +nov.ru +pyatigorsk.ru +spb.ru +vladikavkaz.ru +vladimir.ru +abkhazia.su +adygeya.su +aktyubinsk.su +arkhangelsk.su +armenia.su +ashgabad.su +azerbaijan.su +balashov.su +bashkiria.su +bryansk.su +bukhara.su +chimkent.su +dagestan.su +east-kazakhstan.su +exnet.su +georgia.su +grozny.su +ivanovo.su +jambyl.su +kalmykia.su +kaluga.su +karacol.su +karaganda.su +karelia.su +khakassia.su +krasnodar.su +kurgan.su +kustanai.su +lenug.su +mangyshlak.su +mordovia.su +msk.su +murmansk.su +nalchik.su +navoi.su +north-kazakhstan.su +nov.su +obninsk.su +penza.su +pokrovsk.su +sochi.su +spb.su +tashkent.su +termez.su +togliatti.su +troitsk.su +tselinograd.su +tula.su +tuva.su +vladikavkaz.su +vladimir.su +vologda.su + +// Fancy Bits, LLC : http://getchannels.com +// Submitted by Aman Gupta +channelsdvr.net + +// Fastly Inc. : http://www.fastly.com/ +// Submitted by Fastly Security +fastlylb.net +map.fastlylb.net +freetls.fastly.net +map.fastly.net +a.prod.fastly.net +global.prod.fastly.net +a.ssl.fastly.net +b.ssl.fastly.net +global.ssl.fastly.net + +// Featherhead : https://featherhead.xyz/ +// Submitted by Simon Menke +fhapp.xyz + +// Fedora : https://fedoraproject.org/ +// submitted by Patrick Uiterwijk +fedorainfracloud.org +fedorapeople.org +cloud.fedoraproject.org + +// Filegear Inc. : https://www.filegear.com +// Submitted by Jason Zhu +filegear.me + +// Firebase, Inc. +// Submitted by Chris Raynor +firebaseapp.com + +// Flynn : https://flynn.io +// Submitted by Jonathan Rudenberg +flynnhub.com +flynnhosting.net + +// Freebox : http://www.freebox.fr +// Submitted by Romain Fliedel +freebox-os.com +freeboxos.com +fbx-os.fr +fbxos.fr +freebox-os.fr +freeboxos.fr + +// Fusion Intranet : https://www.fusion-intranet.com +// Submitted by Matthias Burtscher +myfusion.cloud + +// Futureweb OG : http://www.futureweb.at +// Submitted by Andreas Schnederle-Wagner +*.futurecms.at +futurehosting.at +futuremailing.at +*.ex.ortsinfo.at +*.kunden.ortsinfo.at +*.statics.cloud + +// GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains +// Submitted by David Illsley +service.gov.uk + +// GitHub, Inc. +// Submitted by Patrick Toomey +github.io +githubusercontent.com + +// GitLab, Inc. +// Submitted by Alex Hanselka +gitlab.io + +// UKHomeOffice : https://www.gov.uk/government/organisations/home-office +// Submitted by Jon Shanks +homeoffice.gov.uk + +// GlobeHosting, Inc. +// Submitted by Zoltan Egresi +ro.im +shop.ro + +// GoIP DNS Services : http://www.goip.de +// Submitted by Christian Poulter +goip.de + +// Google, Inc. +// Submitted by Eduardo Vela +*.0emm.com +appspot.com +blogspot.ae +blogspot.al +blogspot.am +blogspot.ba +blogspot.be +blogspot.bg +blogspot.bj +blogspot.ca +blogspot.cf +blogspot.ch +blogspot.cl +blogspot.co.at +blogspot.co.id +blogspot.co.il +blogspot.co.ke +blogspot.co.nz +blogspot.co.uk +blogspot.co.za +blogspot.com +blogspot.com.ar +blogspot.com.au +blogspot.com.br +blogspot.com.by +blogspot.com.co +blogspot.com.cy +blogspot.com.ee +blogspot.com.eg +blogspot.com.es +blogspot.com.mt +blogspot.com.ng +blogspot.com.tr +blogspot.com.uy +blogspot.cv +blogspot.cz +blogspot.de +blogspot.dk +blogspot.fi +blogspot.fr +blogspot.gr +blogspot.hk +blogspot.hr +blogspot.hu +blogspot.ie +blogspot.in +blogspot.is +blogspot.it +blogspot.jp +blogspot.kr +blogspot.li +blogspot.lt +blogspot.lu +blogspot.md +blogspot.mk +blogspot.mr +blogspot.mx +blogspot.my +blogspot.nl +blogspot.no +blogspot.pe +blogspot.pt +blogspot.qa +blogspot.re +blogspot.ro +blogspot.rs +blogspot.ru +blogspot.se +blogspot.sg +blogspot.si +blogspot.sk +blogspot.sn +blogspot.td +blogspot.tw +blogspot.ug +blogspot.vn +cloudfunctions.net +cloud.goog +codespot.com +googleapis.com +googlecode.com +pagespeedmobilizer.com +publishproxy.com +withgoogle.com +withyoutube.com + +// Hashbang : https://hashbang.sh +hashbang.sh + +// Hasura : https://hasura.io +// Submitted by Shahidh K Muhammed +hasura-app.io + +// Hepforge : https://www.hepforge.org +// Submitted by David Grellscheid +hepforge.org + +// Heroku : https://www.heroku.com/ +// Submitted by Tom Maher +herokuapp.com +herokussl.com + +// Ici la Lune : http://www.icilalune.com/ +// Submitted by Simon Morvan +moonscale.net + +// iki.fi +// Submitted by Hannu Aronsson +iki.fi + +// info.at : http://www.info.at/ +biz.at +info.at + +// info.cx : http://info.cx +// Submitted by Jacob Slater +info.cx + +// Interlegis : http://www.interlegis.leg.br +// Submitted by Gabriel Ferreira +ac.leg.br +al.leg.br +am.leg.br +ap.leg.br +ba.leg.br +ce.leg.br +df.leg.br +es.leg.br +go.leg.br +ma.leg.br +mg.leg.br +ms.leg.br +mt.leg.br +pa.leg.br +pb.leg.br +pe.leg.br +pi.leg.br +pr.leg.br +rj.leg.br +rn.leg.br +ro.leg.br +rr.leg.br +rs.leg.br +sc.leg.br +se.leg.br +sp.leg.br +to.leg.br + +// intermetrics GmbH : https://pixolino.com/ +// Submitted by Wolfgang Schwarz +pixolino.com + +// IPiFony Systems, Inc. : https://www.ipifony.com/ +// Submitted by Matthew Hardeman +ipifony.net + +// Joyent : https://www.joyent.com/ +// Submitted by Brian Bennett +*.triton.zone +*.cns.joyent.com + +// JS.ORG : http://dns.js.org +// Submitted by Stefan Keim +js.org + +// Keyweb AG : https://www.keyweb.de +// Submitted by Martin Dannehl +keymachine.de + +// KnightPoint Systems, LLC : http://www.knightpoint.com/ +// Submitted by Roy Keene +knightpoint.systems + +// .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf +co.krd +edu.krd + +// LCube - Professional hosting e.K. : https://www.lcube-webhosting.de +// Submitted by Lars Laehn +git-repos.de +lcube-server.de +svn-repos.de + +// LiquidNet Ltd : http://www.liquidnetlimited.com/ +// Submitted by Victor Velchev +we.bs + +// Lukanet Ltd : https://lukanet.com +// Submitted by Anton Avramov +barsy.bg +barsyonline.com +barsy.de +barsy.eu +barsy.in +barsy.net +barsy.online +barsy.support + +// Magento Commerce +// Submitted by Damien Tournoud +*.magentosite.cloud + +// Mail.Ru Group : https://hb.cldmail.ru +// Submitted by Ilya Zaretskiy +hb.cldmail.ru + +// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ +// Submitted by Zdeněk Šustr +cloud.metacentrum.cz +custom.metacentrum.cz + +// Meteor Development Group : https://www.meteor.com/hosting +// Submitted by Pierre Carrier +meteorapp.com +eu.meteorapp.com + +// Michau Enterprises Limited : http://www.co.pl/ +co.pl + +// Microsoft : http://microsoft.com +// Submitted by Barry Dorrans +azurewebsites.net +azure-mobile.net +cloudapp.net + +// Mozilla Foundation : https://mozilla.org/ +// Submitted by glob +bmoattachments.org + +// MSK-IX : https://www.msk-ix.ru/ +// Submitted by Khannanov Roman +net.ru +org.ru +pp.ru + +// Netlify : https://www.netlify.com +// Submitted by Jessica Parsons +bitballoon.com +netlify.com + +// Neustar Inc. +// Submitted by Trung Tran +4u.com + +// ngrok : https://ngrok.com/ +// Submitted by Alan Shreve +ngrok.io + +// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/ +// Submitted by Jeff Wheelhouse +nfshost.com + +// nsupdate.info : https://www.nsupdate.info/ +// Submitted by Thomas Waldmann +nsupdate.info +nerdpol.ovh + +// No-IP.com : https://noip.com/ +// Submitted by Deven Reza +blogsyte.com +brasilia.me +cable-modem.org +ciscofreak.com +collegefan.org +couchpotatofries.org +damnserver.com +ddns.me +ditchyourip.com +dnsfor.me +dnsiskinky.com +dvrcam.info +dynns.com +eating-organic.net +fantasyleague.cc +geekgalaxy.com +golffan.us +health-carereform.com +homesecuritymac.com +homesecuritypc.com +hopto.me +ilovecollege.info +loginto.me +mlbfan.org +mmafan.biz +myactivedirectory.com +mydissent.net +myeffect.net +mymediapc.net +mypsx.net +mysecuritycamera.com +mysecuritycamera.net +mysecuritycamera.org +net-freaks.com +nflfan.org +nhlfan.net +no-ip.ca +no-ip.co.uk +no-ip.net +noip.us +onthewifi.com +pgafan.net +point2this.com +pointto.us +privatizehealthinsurance.net +quicksytes.com +read-books.org +securitytactics.com +serveexchange.com +servehumour.com +servep2p.com +servesarcasm.com +stufftoread.com +ufcfan.org +unusualperson.com +workisboring.com +3utilities.com +bounceme.net +ddns.net +ddnsking.com +gotdns.ch +hopto.org +myftp.biz +myftp.org +myvnc.com +no-ip.biz +no-ip.info +no-ip.org +noip.me +redirectme.net +servebeer.com +serveblog.net +servecounterstrike.com +serveftp.com +servegame.com +servehalflife.com +servehttp.com +serveirc.com +serveminecraft.net +servemp3.com +servepics.com +servequake.com +sytes.net +webhop.me +zapto.org + +// NodeArt : https://nodeart.io +// Submitted by Konstantin Nosov +stage.nodeart.io + +// Nodum B.V. : https://nodum.io/ +// Submitted by Wietse Wind +nodum.co +nodum.io + +// NYC.mn : http://www.information.nyc.mn +// Submitted by Matthew Brown +nyc.mn + +// NymNom : https://nymnom.com/ +// Submitted by Dave McCormack +nom.ae +nom.ai +nom.al +nym.by +nym.bz +nom.cl +nom.gd +nom.gl +nym.gr +nom.gt +nom.hn +nom.im +nym.kz +nym.la +nom.li +nym.li +nym.lt +nym.lu +nym.me +nom.mk +nym.mx +nom.nu +nym.nz +nym.pe +nym.pt +nom.pw +nom.qa +nom.rs +nom.si +nym.sk +nym.su +nym.sx +nym.tw +nom.ug +nom.uy +nom.vc +nom.vg + +// Octopodal Solutions, LLC. : https://ulterius.io/ +// Submitted by Andrew Sampson +cya.gg + +// One Fold Media : http://www.onefoldmedia.com/ +// Submitted by Eddie Jones +nid.io + +// OpenCraft GmbH : http://opencraft.com/ +// Submitted by Sven Marnach +opencraft.hosting + +// Opera Software, A.S.A. +// Submitted by Yngve Pettersen +operaunite.com + +// OutSystems +// Submitted by Duarte Santos +outsystemscloud.com + +// OwnProvider : http://www.ownprovider.com +// Submitted by Jan Moennich +ownprovider.com + +// oy.lc +// Submitted by Charly Coste +oy.lc + +// Pagefog : https://pagefog.com/ +// Submitted by Derek Myers +pgfog.com + +// Pagefront : https://www.pagefronthq.com/ +// Submitted by Jason Kriss +pagefrontapp.com + +// .pl domains (grandfathered) +art.pl +gliwice.pl +krakow.pl +poznan.pl +wroc.pl +zakopane.pl + +// Pantheon Systems, Inc. : https://pantheon.io/ +// Submitted by Gary Dylina +pantheonsite.io +gotpantheon.com + +// Peplink | Pepwave : http://peplink.com/ +// Submitted by Steve Leung +mypep.link + +// Planet-Work : https://www.planet-work.com/ +// Submitted by Frédéric VANNIÈRE +on-web.fr + +// Platform.sh : https://platform.sh +// Submitted by Nikola Kotur +*.platform.sh +*.platformsh.site + +// prgmr.com : https://prgmr.com/ +// Submitted by Sarah Newman +xen.prgmr.com + +// priv.at : http://www.nic.priv.at/ +// Submitted by registry +priv.at + +// Protonet GmbH : http://protonet.io +// Submitted by Martin Meier +protonet.io + +// Publication Presse Communication SARL : https://ppcom.fr +// Submitted by Yaacov Akiba Slama +chirurgiens-dentistes-en-france.fr +byen.site + +// QA2 +// Submitted by Daniel Dent (https://www.danieldent.com/) +qa2.com + +// QNAP System Inc : https://www.qnap.com +// Submitted by Nick Chang +dev-myqnapcloud.com +alpha-myqnapcloud.com +myqnapcloud.com + +// Quip : https://quip.com +// Submitted by Patrick Linehan +*.quipelements.com + +// Qutheory LLC : http://qutheory.io +// Submitted by Jonas Schwartz +vapor.cloud +vaporcloud.io + +// Rackmaze LLC : https://www.rackmaze.com +// Submitted by Kirill Pertsev +rackmaze.com +rackmaze.net + +// Red Hat, Inc. OpenShift : https://openshift.redhat.com/ +// Submitted by Tim Kramer +rhcloud.com + +// RethinkDB : https://www.rethinkdb.com/ +// Submitted by Chris Kastorff +hzc.io + +// Revitalised Limited : http://www.revitalised.co.uk +// Submitted by Jack Price +wellbeingzone.eu +ptplus.fit +wellbeingzone.co.uk + +// Sandstorm Development Group, Inc. : https://sandcats.io/ +// Submitted by Asheesh Laroia +sandcats.io + +// SBE network solutions GmbH : https://www.sbe.de/ +// Submitted by Norman Meilick +logoip.de +logoip.com + +// Securepoint GmbH : https://www.securepoint.de +// Submitted by Erik Anders +firewall-gateway.com +firewall-gateway.de +my-gateway.de +my-router.de +spdns.de +spdns.eu +firewall-gateway.net +my-firewall.org +myfirewall.org +spdns.org + +// SensioLabs, SAS : https://sensiolabs.com/ +// Submitted by Fabien Potencier +*.sensiosite.cloud + +// Service Online LLC : http://drs.ua/ +// Submitted by Serhii Bulakh +biz.ua +co.ua +pp.ua + +// ShiftEdit : https://shiftedit.net/ +// Submitted by Adam Jimenez +shiftedit.io + +// Shopblocks : http://www.shopblocks.com/ +// Submitted by Alex Bowers +myshopblocks.com + +// SinaAppEngine : http://sae.sina.com.cn/ +// Submitted by SinaAppEngine +1kapp.com +appchizi.com +applinzi.com +sinaapp.com +vipsinaapp.com + +// Skyhat : http://www.skyhat.io +// Submitted by Shante Adam +bounty-full.com +alpha.bounty-full.com +beta.bounty-full.com + +// staticland : https://static.land +// Submitted by Seth Vincent +static.land +dev.static.land +sites.static.land + +// SourceLair PC : https://www.sourcelair.com +// Submitted by Antonis Kalipetis +apps.lair.io +*.stolos.io + +// SpaceKit : https://www.spacekit.io/ +// Submitted by Reza Akhavan +spacekit.io + +// Stackspace : https://www.stackspace.io/ +// Submitted by Lina He +stackspace.space + +// Storj Labs Inc. : https://storj.io/ +// Submitted by Philip Hutchins +storj.farm + +// Sub 6 Limited: http://www.sub6.com +// Submitted by Dan Miller +temp-dns.com + +// Synology, Inc. : https://www.synology.com/ +// Submitted by Rony Weng +diskstation.me +dscloud.biz +dscloud.me +dscloud.mobi +dsmynas.com +dsmynas.net +dsmynas.org +familyds.com +familyds.net +familyds.org +i234.me +myds.me +synology.me +vpnplus.to + +// TAIFUN Software AG : http://taifun-software.de +// Submitted by Bjoern Henke +taifun-dns.de + +// TASK geographical domains (www.task.gda.pl/uslugi/dns) +gda.pl +gdansk.pl +gdynia.pl +med.pl +sopot.pl + +// Thingdust AG : https://thingdust.com/ +// Submitted by Adrian Imboden +cust.dev.thingdust.io +cust.disrec.thingdust.io +cust.prod.thingdust.io +cust.testing.thingdust.io + +// TownNews.com : http://www.townnews.com +// Submitted by Dustin Ward +bloxcms.com +townnews-staging.com + +// TrafficPlex GmbH : https://www.trafficplex.de/ +// Submitted by Phillipp Röll +12hp.at +2ix.at +4lima.at +lima-city.at +12hp.ch +2ix.ch +4lima.ch +lima-city.ch +trafficplex.cloud +de.cool +12hp.de +2ix.de +4lima.de +lima-city.de +1337.pictures +clan.rip +lima-city.rocks +webspace.rocks +lima.zone + +// TransIP : htts://www.transip.nl +// Submitted by Rory Breuk +*.transurl.be +*.transurl.eu +*.transurl.nl + +// TuxFamily : http://tuxfamily.org +// Submitted by TuxFamily administrators +tuxfamily.org + +// TwoDNS : https://www.twodns.de/ +// Submitted by TwoDNS-Support +dd-dns.de +diskstation.eu +diskstation.org +dray-dns.de +draydns.de +dyn-vpn.de +dynvpn.de +mein-vigor.de +my-vigor.de +my-wan.de +syno-ds.de +synology-diskstation.de +synology-ds.de + +// Uberspace : https://uberspace.de +// Submitted by Moritz Werner +uber.space + +// UDR Limited : http://www.udr.hk.com +// Submitted by registry +hk.com +hk.org +ltd.hk +inc.hk + +// .US +// Submitted by Ed Moore +lib.de.us + +// Viprinet Europe GmbH : http://www.viprinet.com +// Submitted by Simon Kissel +router.management + +// Virtual-Info : https://www.virtual-info.info/ +// Submitted by Adnan RIHAN +v-info.info + +// WeDeploy by Liferay, Inc. : https://www.wedeploy.com +// Submitted by Henrique Vicente +wedeploy.io +wedeploy.me +wedeploy.sh + +// Western Digital Technologies, Inc : https://www.wdc.com +// Submitted by Jung Jin +remotewd.com + +// Wikimedia Labs : https://wikitech.wikimedia.org +// Submitted by Yuvi Panda +wmflabs.org + +// XS4ALL Internet bv : https://www.xs4all.nl/ +// Submitted by Daniel Mostertman +cistron.nl +demon.nl +xs4all.space + +// Yola : https://www.yola.com/ +// Submitted by Stefano Rivera +yolasite.com + +// Yombo : https://yombo.net +// Submitted by Mitch Schwenk +ybo.faith +yombo.me +homelink.one +ybo.party +ybo.review +ybo.science +ybo.trade + +// ZaNiC : http://www.za.net/ +// Submitted by registry +za.net +za.org + +// Zeit, Inc. : https://zeit.domains/ +// Submitted by Olli Vanhoja +now.sh + +// ===END PRIVATE DOMAINS=== From 63dc577dd228579f680579b8caf7fa6adfe1a5ff Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 14 Dec 2017 17:14:40 +0100 Subject: [PATCH 071/461] adding context argument to Rules::createFromPath --- src/Rules.php | 12 +++++++++--- tests/RulesTest.php | 9 ++++++++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/Rules.php b/src/Rules.php index b32a1053..db1dc4dc 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -33,13 +33,19 @@ final class Rules /** * Returns a new instance from a file path. * - * @param string $path + * @param string $path + * @param null|resource $context * * @return self */ - public static function createFromPath(string $path): self + public static function createFromPath(string $path, $context = null): self { - if (!($resource = @fopen($path, 'r'))) { + $args = [$path, 'r', false]; + if (null !== $context) { + $args[] = $context; + } + + if (!($resource = @fopen(...$args))) { throw new Exception(sprintf('`%s`: failed to open stream: No such file or directory', $path)); } diff --git a/tests/RulesTest.php b/tests/RulesTest.php index c7bc952f..f3667d31 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -27,7 +27,14 @@ public function setUp() public function testCreateFromPath() { - $rules = Rules::createFromPath(__DIR__.'/data/public_suffix_list.dat'); + $context = stream_context_create([ + 'http'=> [ + 'method' => 'GET', + 'header' => "Accept-language: en\r\nCookie: foo=bar\r\n", + ], + ]); + + $rules = Rules::createFromPath(__DIR__.'/data/public_suffix_list.dat', $context); $this->assertInstanceOf(Rules::class, $rules); } From 2309d81f6452d03564c178850edbfc4365066142 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 18 Dec 2017 08:36:26 +0100 Subject: [PATCH 072/461] update documentation --- README.md | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index cfc21359..e18d0a03 100644 --- a/README.md +++ b/README.md @@ -81,11 +81,25 @@ final class Rules const ICANN_DOMAINS = 'ICANN_DOMAINS'; const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; + public static function createFromPath(string $path, $context = null): self + public static function createFromString(string $content): self public function __construct(array $rules) public function resolve(string $domain = null, string $section = self::ALL_DOMAINS): Domain } ~~~ +Starting with version 5.1.0, the following named constructors arre added to ease `Rules` instantiation. + +- `Rules::createFromString` expects a string content which follows [the PSL format](https://publicsuffix.org/list/#list-format); + +- `Rules::createFromPath` expects a valid path to a readable PSL. You can optionnally submit a context resource as defined in PHP's `fopen` function; + +Both named constructors: + +- uses internally a `Pdp\Converter` object to convert the raw content into a suitable array to instantiate a valid `Pdp\Rules`; +- do not have any cache functionnality; + + Domain name resolution is done using the `Pdp\Rules::resolve` method which expects at most two parameters: - `$domain` a domain name as a string @@ -135,12 +149,9 @@ If the domain name or some of its part are seriously malformed or unrecognized, ~~~php convert($content); -$rules = new Rules($arr_rules); +$rules = Rules::createFromPath('https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat'); $domain = $rules->resolve('www.ulb.ac.be'); //using Rules::ALL_DOMAINS $domain->getDomain(); //returns 'www.ulb.ac.be' From f702a887bf85065a83f6c89fa840aa8a334fbe1f Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 18 Dec 2017 09:19:29 +0100 Subject: [PATCH 073/461] prepare 5.1.0 release --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f0df2eb3..f3b9c163 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All Notable changes to `PHP Domain Parser` will be documented in this file -## Next - TBD +## 5.1.0 - 2017-12-18 ### Added From 40135b73c62556f19aeb11bc618ea99554d2e9e2 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 18 Dec 2017 10:29:34 +0100 Subject: [PATCH 074/461] improve curl default options --- src/CurlHttpClient.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CurlHttpClient.php b/src/CurlHttpClient.php index 944a50f0..89545d45 100644 --- a/src/CurlHttpClient.php +++ b/src/CurlHttpClient.php @@ -44,6 +44,7 @@ public function __construct(array $options = []) CURLOPT_FOLLOWLOCATION => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_SSL_VERIFYHOST => false, CURLOPT_HTTPGET => true, ]; From f3f4275a8ea85115b77786b184dd9810b15f239b Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 26 Dec 2017 18:00:33 +0100 Subject: [PATCH 075/461] documentation simplification --- README.md | 70 +++++++++++++++++++++---------------------------------- 1 file changed, 26 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index e18d0a03..11ac14f2 100644 --- a/README.md +++ b/README.md @@ -48,27 +48,7 @@ Documentation ### Domain name resolution -In order to resolve a domain name one we must: - -- Convert the Public Suffix List (PSL) into a structure usable in PHP -- Resolve the domain name against the PSL rules - -PSL Conversion is done using the `Pdp\Converter` class. - -~~~php -resolve('www.ulb.ac.be'); //using Rules::ALL_DOMAINS $domain->getDomain(); //returns 'www.ulb.ac.be' @@ -189,11 +154,28 @@ echo json_encode($domain, JSON_PRETTY_PRINT); // } ~~~ +The `Pdp\Domain` getter methods returns: + +- the submitted domain name using `Pdp\Domain::getDomain` +- the public suffix part normalized according to the domain using `Pdp\Domain::getPublicSuffix` +- the registrable domain part using `Pdp\Domain::getRegistrableDomain` +- the subdomain part using `Pdp\Domain::getSubDomain`. + +If the domain name or some of its part are seriously malformed or unrecognized, the getter methods will return `null`. + +**The Domain name status depends on the PSL section used to resolve it:** + +- `Pdp\Domain::isKnown` returns `true` if the public suffix is found in the selected PSL; +- `Pdp\Domain::isICANN` returns `true` if the public suffix is found using a PSL which includes the ICANN DOMAINS section; +- `Pdp\Domain::isPrivate` returns `true` if the public suffix is found using a PSL which includes the PRIVATE DOMAINS section; + **WARNING:** +**The `Pdp\Rules::resolve` does not validate the submitted host. You are require to use a host validator prior to using this library.** + **You should never use the library this way in production, without, at least, a caching mechanism to reduce PSL downloads.** -**Some people use the PSL to determine what is a valid domain name and what isn't. This is dangerous, particularly in these days where new gTLDs are arriving at a rapid pace, if your software does not regularly receive PSL updates, it may erroneously think new gTLDs are not known. The DNS is the proper source for this information. If you must use it for this purpose, please do not bake static copies of the PSL into your software with no update mechanism.** +**Using the PSL to determine what is a valid domain name and what isn't is dangerous, particularly in these days where new gTLDs are arriving at a rapid pace. The DNS is the proper source for this information. If you must use this library for this purpose, please consider integrating a PSL update mechanism into your software.** ### Public Suffix List Maintenance From ad3eef8bfb7a428594cb5995efd813062b51ebe1 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 2 Feb 2018 14:17:57 +0100 Subject: [PATCH 076/461] Introduce Rules::getPublicSuffix Because Rules::resolve try to comply to PublicSuffix List algorithm some exception are not always caught Rules::getPublicSuffix is more strict than Rules::resolve and only returns the public suffix information for a given domain. The Domain and PublicSuffix value object now implements two modifiers ::toUnicode and ::toAscii to convers their value according to IDN UTS 46 algorithm. Domain names are still not validated but if the conversion can not be perform an Exception is thrown. --- CHANGELOG.md | 29 ++- README.md | 38 ++++ ...ULL-5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- src/Converter.php | 3 + src/Domain.php | 136 +++++++++---- src/Installer.php | 2 +- src/Manager.php | 3 + src/PublicSuffix.php | 112 +++++++++-- src/Rules.php | 180 ++++++++++-------- tests/DomainTest.php | 159 +++++++++++++++- tests/PublicSuffixTest.php | 26 +++ tests/RulesTest.php | 41 +++- 12 files changed, 582 insertions(+), 149 deletions(-) create mode 100644 tests/PublicSuffixTest.php diff --git a/CHANGELOG.md b/CHANGELOG.md index f3b9c163..3a229700 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,33 @@ # Changelog -All Notable changes to `PHP Domain Parser` will be documented in this file +All Notable changes to `PHP Domain Parser` **5.x** series will be documented in this file + +## Next - TBD + +### Added + +- `Pdp\Rules::supports` returns a boolean to indicates if a given section is supported +- `Pdp\Rules::getPublicSuffix` returns a `Pdp\PublicSuffix` value object +- `Pdp\Rules::__set_state` is implemented +- `Pdp\Domain::getSection` returns a string containing the section name used to determine the public suffix +- `Pdp\Domain::toUnicode` returns a `Pdp\Domain` with its value converted to its Unicode form +- `Pdp\Domain::toAscii` returns a `Pdp\Domain` with its value converted to its AScii form +- `Pdp\PublicSuffix::getSection` returns a string containing the section name used to determine the public suffix +- `Pdp\PublicSuffix::toUnicode` returns a `Pdp\PublicSuffix` with its value converted to its Unicode form +- `Pdp\PublicSuffix::toAscii` returns a `Pdp\PublicSuffix` with its value converted to its AScii form + +### Fixed + +- `Pdp\Domain::getDomain` returns the normalized form of the domain name +- `Pdp\PublicSuffix` is no longer internal. + +### Deprecated + +- None + +### Removed + +- None ## 5.1.0 - 2017-12-18 diff --git a/README.md b/README.md index 11ac14f2..02a8b578 100644 --- a/README.md +++ b/README.md @@ -64,10 +64,17 @@ final class Rules public static function createFromPath(string $path, $context = null): self public static function createFromString(string $content): self public function __construct(array $rules) + public function supports(string $section): bool + public function getPublicSuffix(string $domain = null, string $section = self::ALL_DOMAINS): PublicSuffix public function resolve(string $domain = null, string $section = self::ALL_DOMAINS): Domain } ~~~ +**NEW IN VERSION 5.2:** + +- `Rules::supports` returns a boolean to tell whether the specific section is present in the `Rules` object; +- `Rules::getPublicSuffix` returns a `PublicSuffix` object determined from the `Rules` object; + **NEW IN VERSION 5.1:** - `Rules::createFromString` expects a string content which follows [the PSL format](https://publicsuffix.org/list/#list-format); @@ -104,9 +111,18 @@ final class Domain implements JsonSerializable public function isKnown(): bool; public function isICANN(): bool; public function isPrivate(): bool; + public function getSection(): string; + public function toUnicode(): self; + public function toAscii(): self; } ~~~ +**NEW IN VERSION 5.2:** + +- `Domain::getSection` returns the section string name if presents else returns an empty string; +- `Domain::toUnicode` returns an instance with the domain converted to its unicode representation; +- `Domain::toAscii` returns an instance with the domain converted to its ascii representation; + **THIS EXAMPLE ILLUSTRATES HOW THE OBJECT WORK BUT SHOULD BE AVOIDED IN PRODUCTON** ~~~php @@ -169,6 +185,28 @@ If the domain name or some of its part are seriously malformed or unrecognized, - `Pdp\Domain::isICANN` returns `true` if the public suffix is found using a PSL which includes the ICANN DOMAINS section; - `Pdp\Domain::isPrivate` returns `true` if the public suffix is found using a PSL which includes the PRIVATE DOMAINS section; +The `Rules::getPublicSuffix` method expects the same arguments as `Rules::resolve` but returns a `Pdp\PublicSuffix` object instead. + +~~~php + + * @author Ignace Nyamagana Butera */ final class Converter { diff --git a/src/Domain.php b/src/Domain.php index 24c88944..13d6d4c9 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -49,6 +49,14 @@ final class Domain implements JsonSerializable */ private $subDomain; + /** + * {@inheritdoc} + */ + public static function __set_state(array $properties): self + { + return new self($properties['domain'], $properties['publicSuffix']); + } + /** * New instance. * @@ -57,12 +65,36 @@ final class Domain implements JsonSerializable */ public function __construct($domain = null, PublicSuffix $publicSuffix = null) { + if (false !== strpos((string) $domain, '%')) { + $domain = rawurldecode($domain); + } + + if (null !== $domain) { + $domain = strtolower($domain); + } + $this->domain = $domain; - $this->publicSuffix = $publicSuffix ?? new PublicSuffix(); + $this->publicSuffix = $this->setPublicSuffix($publicSuffix); $this->registrableDomain = $this->setRegistrableDomain(); $this->subDomain = $this->setSubDomain(); } + /** + * Filter the PublicSuffix + * + * @param PublicSuffix|null $publicSuffix + * + * @return PublicSuffix + */ + private function setPublicSuffix(PublicSuffix $publicSuffix = null): PublicSuffix + { + if (null === $publicSuffix || null === $this->domain) { + return new PublicSuffix(); + } + + return $publicSuffix; + } + /** * Compute the registrable domain part. * @@ -82,29 +114,7 @@ private function setRegistrableDomain() $domainLabels = explode('.', $this->domain); $registrableDomain = implode('.', array_slice($domainLabels, count($domainLabels) - $nbLabelsToRemove)); - return $this->normalize($registrableDomain); - } - - /** - * Normalizes the domain according to its representation. - * - * @param string $domain - * - * @return string|null - */ - private function normalize(string $domain) - { - $func = 'idn_to_utf8'; - if (false !== strpos($domain, 'xn--')) { - $func = 'idn_to_ascii'; - } - - $domain = $func($domain, 0, INTL_IDNA_VARIANT_UTS46); - if (false === $domain) { - return null; - } - - return strtolower($domain); + return $registrableDomain; } /** @@ -127,7 +137,7 @@ private function setSubDomain() $subDomain = implode('.', array_slice($domainLabels, 0, $countLabels - $nbLabelsToRemove)); - return $this->normalize($subDomain); + return $subDomain; } /** @@ -135,15 +145,11 @@ private function setSubDomain() */ public function jsonSerialize() { - return [ + return array_merge([ 'domain' => $this->domain, 'registrableDomain' => $this->registrableDomain, 'subDomain' => $this->subDomain, - 'publicSuffix' => $this->publicSuffix->getContent(), - 'isKnown' => $this->publicSuffix->isKnown(), - 'isICANN' => $this->publicSuffix->isICANN(), - 'isPrivate' => $this->publicSuffix->isPrivate(), - ]; + ], $this->publicSuffix->jsonSerialize()); } /** @@ -154,14 +160,6 @@ public function __debugInfo() return $this->jsonSerialize(); } - /** - * {@inheritdoc} - */ - public static function __set_state(array $properties) - { - return new self($properties['domain'], $properties['publicSuffix']); - } - /** * Returns the full domain name. * @@ -214,7 +212,7 @@ public function getPublicSuffix() } /** - * Tells whether the public suffix has a matching rule in a Public Suffix List. + * Tells whether the public suffix has been matching rule in a Public Suffix List. * * @return bool */ @@ -242,4 +240,62 @@ public function isPrivate(): bool { return $this->publicSuffix->isPrivate(); } + + /** + * Returns the public suffix section name used to determine the public suffix. + * + * @return string + */ + public function getSection(): string + { + return $this->publicSuffix->getSection(); + } + + /** + * Converts the domain to its IDNA ASCII form. + * + * This method MUST retain the state of the current instance, and return + * an instance with is content converted to its IDNA ASCII form + * + * @throws Exception if the domain can not be converted to ASCII using IDN UTS46 algorithm + * + * @return self + */ + public function toAscii(): self + { + if (null === $this->domain || false !== strpos($this->domain, 'xn--')) { + return $this; + } + + $domain = idn_to_ascii($this->domain, 0, INTL_IDNA_VARIANT_UTS46, $arr); + if (!$arr['errors']) { + return new self($domain, $this->publicSuffix->toAscii()); + } + + throw new Exception(sprintf('The following domain `%s` can not be converted to ascii', $this->domain)); + } + + /** + * Converts the domain to its IDNA UTF8 form. + * + * This method MUST retain the state of the current instance, and return + * an instance with is content converted to its IDNA UTF8 form + * + * @throws Exception if the domain can not be converted to Unicode using IDN UTS46 algorithm + * + * @return self + */ + public function toUnicode(): self + { + if (null === $this->domain || false === strpos($this->domain, 'xn--')) { + return $this; + } + + $domain = idn_to_utf8($this->domain, 0, INTL_IDNA_VARIANT_UTS46, $arr); + if (!$arr['errors']) { + return new self($domain, $this->publicSuffix->toUnicode()); + } + + throw new Exception(sprintf('The following domain `%s` can not be converted to unicode', $this->domain)); + } } diff --git a/src/Installer.php b/src/Installer.php index 49aff609..96898752 100644 --- a/src/Installer.php +++ b/src/Installer.php @@ -40,7 +40,7 @@ public static function updateLocalCache(Event $event = null) require $vendor.'/autoload.php'; - $io->write('Updating your Public Suffix List ICANN Section local cache.'); + $io->write('Updating your Public Suffix List local cache.'); if (!extension_loaded('curl')) { $io->writeError([ '😓 😓 😓 Your local cache could not be updated. 😓 😓 😓', diff --git a/src/Manager.php b/src/Manager.php index a483e50a..34cbd350 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -18,6 +18,9 @@ * * This class obtains, writes, caches, and returns PHP representations * of the Public Suffix List ICANN section + * + * @author Jeremy Kendall + * @author Ignace Nyamagana Butera */ final class Manager { diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index fb0af46e..1464c19e 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -12,6 +12,7 @@ namespace Pdp; use Countable; +use JsonSerializable; /** * Public Suffix Value Object @@ -25,9 +26,8 @@ * software with no update mechanism." * * @author Ignace Nyamagana Butera - * @internal used internally to represent a public suffix */ -final class PublicSuffix implements Countable +final class PublicSuffix implements Countable, JsonSerializable { /** * @var string|null @@ -37,18 +37,47 @@ final class PublicSuffix implements Countable /** * @var string */ - private $type; + private $section; + + /** + * {@inheritdoc} + */ + public static function __set_state(array $properties): self + { + return new self($properties['publicSuffix'], $properties['section']); + } /** * New instance. * * @param string|null $publicSuffix - * @param string $type + * @param string $section */ - public function __construct(string $publicSuffix = null, string $type = '') + public function __construct(string $publicSuffix = null, string $section = '') { $this->publicSuffix = $publicSuffix; - $this->type = $type; + $this->section = $section; + } + + /** + * {@inheritdoc} + */ + public function jsonSerialize() + { + return [ + 'publicSuffix' => $this->getContent(), + 'isKnown' => $this->isKnown(), + 'isICANN' => $this->isICANN(), + 'isPrivate' => $this->isPrivate(), + ]; + } + + /** + * {@inheritdoc} + */ + public function __debugInfo() + { + return $this->jsonSerialize(); } /** @@ -61,6 +90,16 @@ public function getContent() return $this->publicSuffix; } + /** + * Returns the public suffix section name used to determine the public suffix. + * + * @return string + */ + public function getSection(): string + { + return $this->section; + } + /** * {@inheritdoc} */ @@ -80,7 +119,7 @@ public function count() */ public function isKnown(): bool { - return '' !== $this->type; + return '' !== $this->section; } /** @@ -90,7 +129,7 @@ public function isKnown(): bool */ public function isICANN(): bool { - return Rules::ICANN_DOMAINS === $this->type; + return Rules::ICANN_DOMAINS === $this->section; } /** @@ -100,27 +139,60 @@ public function isICANN(): bool */ public function isPrivate(): bool { - return Rules::PRIVATE_DOMAINS === $this->type; + return Rules::PRIVATE_DOMAINS === $this->section; } /** - * {@inheritdoc} + * Converts the domain to its IDNA UTF8 form. + * + * This method MUST retain the state of the current instance, and return + * an instance with is content converted to its IDNA UTF8 form + * + * @throws Exception if the domain can not be converted to Unicode using IDN UTS46 algorithm + * + * @return self */ - public function __debugInfo() + public function toUnicode(): self { - return [ - 'publicSuffix' => $this->getContent(), - 'isKnown' => $this->isKnown(), - 'isICANN' => $this->isICANN(), - 'isPrivate' => $this->isPrivate(), - ]; + if (null === $this->publicSuffix) { + return $this; + } + + $publicSuffix = idn_to_utf8($this->publicSuffix, 0, INTL_IDNA_VARIANT_UTS46, $arr); + if (!$arr['errors']) { + $clone = clone $this; + $clone->publicSuffix = $publicSuffix; + + return $clone; + } + + throw new Exception(sprintf('The following public suffix `%s` can not be converted to unicode', $this->publicSuffix)); } /** - * {@inheritdoc} + * Converts the domain to its IDNA ASCII form. + * + * This method MUST retain the state of the current instance, and return + * an instance with is content converted to its IDNA ASCII form + * + * @throws Exception if the domain can not be converted to ASCII using IDN UTS46 algorithm + * + * @return self */ - public static function __set_state(array $properties) + public function toAscii(): self { - return new self($properties['publicSuffix'], $properties['type']); + if (null === $this->publicSuffix) { + return $this; + } + + $publicSuffix = idn_to_ascii($this->publicSuffix, 0, INTL_IDNA_VARIANT_UTS46, $arr); + if (!$arr['errors']) { + $clone = clone $this; + $clone->publicSuffix = $publicSuffix; + + return $clone; + } + + throw new Exception(sprintf('The following public suffix `%s` can not be converted to ascii', $this->publicSuffix)); } } diff --git a/src/Rules.php b/src/Rules.php index db1dc4dc..29640688 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -67,6 +67,14 @@ public static function createFromString(string $content): self return new self((new Converter())->convert($content)); } + /** + * {@inheritdoc} + */ + public static function __set_state(array $properties): self + { + return new self($properties['rules']); + } + /** * new instance. * @@ -78,29 +86,61 @@ public function __construct(array $rules) } /** - * Returns PSL ICANN public info for a given domain. + * Tell whether the submitted section if supported by the current object + * + * @param string $section + * + * @return bool + */ + public function supports(string $section): bool + { + return self::ALL_DOMAINS === $section + || (isset($this->rules[$section]) && is_array($this->rules[$section]) && !empty($this->rules[$section])); + } + + /** + * Determines the public suffix for a given domain. * * @param string|null $domain * @param string $section * - * @return Domain + * @throws Exception + * If the Domain is invalid or malformed + * If the section is invalid or not supported + * If the PublicSuffix can not be converted using against the domain encoding. + * + * @return PublicSuffix */ - public function resolve(string $domain = null, string $section = self::ALL_DOMAINS): Domain + public function getPublicSuffix(string $domain = null, string $section = self::ALL_DOMAINS): PublicSuffix { - if (!in_array($section, [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, self::ALL_DOMAINS], true)) { - throw new Exception(sprintf('%s is an unknown Public Suffix List section', $section)); + if (!$this->isMatchable($domain)) { + throw new Exception(sprintf('The submitted domain `%s` is invalid or malformed', $domain)); } + $this->validateSection($section); + + return $this->findPublicSuffix($domain, $section); + } + /** + * Returns PSL info for a given domain. + * + * @param string|null $domain + * @param string $section + * + * @return Domain + */ + public function resolve(string $domain = null, string $section = self::ALL_DOMAINS): Domain + { + $this->validateSection($section); if (!$this->isMatchable($domain)) { return new Domain(); } - $publicSuffix = $this->findPublicSuffix($domain, $section); - if (null === $publicSuffix->getContent()) { - return new Domain($domain, $this->handleNoMatches($domain)); + try { + return new Domain($domain, $this->findPublicSuffix($domain, $section)); + } catch (Exception $e) { + return new Domain($domain); } - - return new Domain($domain, $this->handleMatches($domain, $publicSuffix)); } /** @@ -119,28 +159,17 @@ private function isMatchable($domain): bool } /** - * Normalizes a domain name. - * - * "The domain must be canonicalized in the normal way for hostnames - lower-case, Punycode." + * Assert the section status. * - * @see https://tools.ietf.org/html/rfc3492 - * - * @param string $domain + * @param string $section * - * @return string + * @throws Exception if the submitted section is not supported */ - private function normalize(string $domain): string + private function validateSection(string $section) { - if (false !== strpos($domain, '%')) { - $domain = rawurldecode($domain); - } - - $normalize = idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46); - if (false === $normalize) { - return ''; + if (!$this->supports($section)) { + throw new Exception(sprintf('%s is an unknown Public Suffix List section', $section)); } - - return strtolower($normalize); } /** @@ -153,23 +182,47 @@ private function normalize(string $domain): string */ private function findPublicSuffix(string $domain, string $section): PublicSuffix { - $normalizedDomain = $this->normalize($domain); - $reverseLabels = array_reverse(explode('.', $normalizedDomain)); - $resultIcann = $this->findPublicSuffixFromSection($reverseLabels, self::ICANN_DOMAINS); + $reverseLabels = array_reverse(explode('.', $this->normalizeDomain($domain))); + $icann = $this->findPublicSuffixFromSection($reverseLabels, self::ICANN_DOMAINS); if (self::ICANN_DOMAINS === $section) { - return $resultIcann; + return $this->normalizePublicSuffix($icann, $domain); } - $resultPrivate = $this->findPublicSuffixFromSection($reverseLabels, self::PRIVATE_DOMAINS); - if (count($resultPrivate) > count($resultIcann)) { - return $resultPrivate; + $private = $this->findPublicSuffixFromSection($reverseLabels, self::PRIVATE_DOMAINS); + if (count($private) > count($icann)) { + return $this->normalizePublicSuffix($private, $domain); } if (self::ALL_DOMAINS === $section) { - return $resultIcann; + return $this->normalizePublicSuffix($icann, $domain); + } + + return $this->normalizePublicSuffix(new PublicSuffix(), $domain); + } + + /** + * Normalizes a domain name. + * + * "The domain must be canonicalized in the normal way for hostnames - lower-case, Punycode." + * + * @see https://tools.ietf.org/html/rfc3492 + * + * @param string $domain + * + * @return string + */ + private function normalizeDomain(string $domain): string + { + if (false !== strpos($domain, '%')) { + $domain = rawurldecode($domain); + } + + $normalize = idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46, $arr); + if ($arr['errors'] > 0) { + return ''; } - return new PublicSuffix(); + return strtolower($normalize); } /** @@ -182,7 +235,7 @@ private function findPublicSuffix(string $domain, string $section): PublicSuffix */ private function findPublicSuffixFromSection(array $labels, string $section): PublicSuffix { - $rules = $this->rules[$section] ?? null; + $rules = $this->rules[$section] ?? []; $matches = []; foreach ($labels as $label) { //match exception rule @@ -214,57 +267,24 @@ private function findPublicSuffixFromSection(array $labels, string $section): Pu } /** - * Returns a PublicSuffix if none was found using the PSL. + * Normalize the found Public Suffix against its domain name. * - * @param string $domain + * @param PublicSuffix $publicSuffix + * @param string $domain * * @return PublicSuffix */ - private function handleNoMatches(string $domain): PublicSuffix + private function normalizePublicSuffix(PublicSuffix $publicSuffix, string $domain): PublicSuffix { - $labels = explode('.', $domain); - $publicSuffix = array_pop($labels); - if ($this->isPunycoded($domain)) { - return new PublicSuffix($publicSuffix); - } - - $publicSuffix = idn_to_utf8($publicSuffix, 0, INTL_IDNA_VARIANT_UTS46); - if (false !== $publicSuffix) { - return new PublicSuffix($publicSuffix); + if (null === $publicSuffix->getContent()) { + $labels = explode('.', $domain); + $publicSuffix = new PublicSuffix(array_pop($labels)); } - return new PublicSuffix(); - } - - /** - * Tells whether the domain is punycoded. - * - * @param string $domain - * - * @return bool - */ - private function isPunycoded(string $domain): bool - { - return false !== strpos($domain, 'xn--'); - } - - /** - * Returns a PublicSuffix if one was found using the PSL. - * - * @param string $domain - * @param PublicSuffix $publicSuffix - * - * @return PublicSuffix - */ - private function handleMatches($domain, PublicSuffix $publicSuffix): PublicSuffix - { - if ($this->isPunycoded($domain)) { - return $publicSuffix; + if (false === strpos($domain, 'xn--')) { + return $publicSuffix->toUnicode(); } - return new PublicSuffix( - idn_to_utf8($publicSuffix->getContent(), 0, INTL_IDNA_VARIANT_UTS46), - $publicSuffix->isICANN() ? self::ICANN_DOMAINS : self::PRIVATE_DOMAINS - ); + return $publicSuffix; } } diff --git a/tests/DomainTest.php b/tests/DomainTest.php index f39c4bfa..29e0410a 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -5,6 +5,7 @@ namespace pdp\tests; use Pdp\Domain; +use Pdp\Exception; use Pdp\PublicSuffix; use Pdp\Rules; use PHPUnit\Framework\TestCase; @@ -22,6 +23,19 @@ public function testRegistrableDomainIsNullWithFoundDomain(string $domain, $publ $domain = new Domain($domain, new PublicSuffix($publicSuffix)); $this->assertNull($domain->getRegistrableDomain()); $this->assertNull($domain->getSubDomain()); + $this->assertEmpty($domain->getSection()); + } + + public function testToAsciiThrowsException() + { + $this->expectException(Exception::class); + (new Domain('_b%C3%A9bé.be-'))->toAscii(); + } + + public function testToUnicodeThrowsException() + { + $this->expectException(Exception::class); + (new Domain('xn--a-ecp.ru'))->toUnicode(); } public function invalidRegistrableDomainProvider() @@ -30,7 +44,6 @@ public function invalidRegistrableDomainProvider() 'domain and suffix are the same' => ['co.uk', 'co.uk'], 'domain has no labels' => ['faketld', 'faketld'], 'public suffix is null' => ['faketld', null], - 'public suffix is invalid' => ['_b%C3%A9bé.be-', 'be-'], ]; } @@ -49,4 +62,148 @@ public function testPublicSuffixnternalPhpMethod() $this->assertInternalType('array', $publicSuffix->__debugInfo()); $this->assertEquals($publicSuffix, $generatePublicSuffix); } + + /** + * @dataProvider toUnicodeProvider + * @param null|string $domain + * @param null|string $publicSuffix + * @param null|string $expectedDomain + * @param null|string $expectedSuffix + * @param null|string $expectedIDNDomain + * @param null|string $expectedIDNSuffix + */ + public function testToIDN( + $domain, + $publicSuffix, + $expectedDomain, + $expectedSuffix, + $expectedIDNDomain, + $expectedIDNSuffix + ) { + $domain = new Domain($domain, new PublicSuffix($publicSuffix)); + $this->assertSame($expectedDomain, $domain->getDomain()); + $this->assertSame($expectedSuffix, $domain->getPublicSuffix()); + + $domainIDN = $domain->toUnicode(); + $this->assertSame($expectedIDNDomain, $domainIDN->getDomain()); + $this->assertSame($expectedIDNSuffix, $domainIDN->getPublicSuffix()); + } + + public function toUnicodeProvider() + { + return [ + 'simple domain' => [ + 'domain' => 'www.ulb.ac.be', + 'publicSuffix' => 'ac.be', + 'expectedDomain' => 'www.ulb.ac.be', + 'expectedSuffix' => 'ac.be', + 'expectedIDNDomain' => 'www.ulb.ac.be', + 'expectedIDNSuffix' => 'ac.be', + ], + 'ASCII to IDN domain' => [ + 'domain' => 'www.xn--85x722f.xn--55qx5d.cn', + 'publicSuffix' => 'xn--85x722f.xn--55qx5d.cn', + 'expectedDomain' => 'www.xn--85x722f.xn--55qx5d.cn', + 'expectedSuffix' => 'xn--85x722f.xn--55qx5d.cn', + 'expectedIDNDomain' => 'www.食狮.公司.cn', + 'expectedIDNSuffix' => '食狮.公司.cn', + ], + 'IDN to IDN domain' => [ + 'domain' => 'www.食狮.公司.cn', + 'publicSuffix' => '食狮.公司.cn', + 'expectedDomain' => 'www.食狮.公司.cn', + 'expectedSuffix' => '食狮.公司.cn', + 'expectedIDNDomain' => 'www.食狮.公司.cn', + 'expectedIDNSuffix' => '食狮.公司.cn', + ], + 'null domain and suffix' => [ + 'domain' => null, + 'publicSuffix' => null, + 'expectedDomain' => null, + 'expectedSuffix' => null, + 'expectedIDNDomain' => null, + 'expectedIDNSuffix' => null, + ], + 'domain with null suffix' => [ + 'domain' => 'www.xn--85x722f.xn--55qx5d.cn', + 'publicSuffix' => null, + 'expectedDomain' => 'www.xn--85x722f.xn--55qx5d.cn', + 'expectedSuffix' => null, + 'expectedIDNDomain' => 'www.食狮.公司.cn', + 'expectedIDNSuffix' => null, + ], + ]; + } + + /** + * @dataProvider toAsciiProvider + * @param null|string $domain + * @param null|string $publicSuffix + * @param null|string $expectedDomain + * @param null|string $expectedSuffix + * @param null|string $expectedAsciiDomain + * @param null|string $expectedAsciiSuffix + */ + public function testToAscii( + $domain, + $publicSuffix, + $expectedDomain, + $expectedSuffix, + $expectedAsciiDomain, + $expectedAsciiSuffix + ) { + $domain = new Domain($domain, new PublicSuffix($publicSuffix)); + $this->assertSame($expectedDomain, $domain->getDomain()); + $this->assertSame($expectedSuffix, $domain->getPublicSuffix()); + + $domainIDN = $domain->toAscii(); + $this->assertSame($expectedAsciiDomain, $domainIDN->getDomain()); + $this->assertSame($expectedAsciiSuffix, $domainIDN->getPublicSuffix()); + } + + public function toAsciiProvider() + { + return [ + 'simple domain' => [ + 'domain' => 'www.ulb.ac.be', + 'publicSuffix' => 'ac.be', + 'expectedDomain' => 'www.ulb.ac.be', + 'expectedSuffix' => 'ac.be', + 'expectedIDNDomain' => 'www.ulb.ac.be', + 'expectedIDNSuffix' => 'ac.be', + ], + 'ASCII to ASCII domain' => [ + 'domain' => 'www.xn--85x722f.xn--55qx5d.cn', + 'publicSuffix' => 'xn--85x722f.xn--55qx5d.cn', + 'expectedDomain' => 'www.xn--85x722f.xn--55qx5d.cn', + 'expectedSuffix' => 'xn--85x722f.xn--55qx5d.cn', + 'expectedIDNDomain' => 'www.xn--85x722f.xn--55qx5d.cn', + 'expectedIDNSuffix' => 'xn--85x722f.xn--55qx5d.cn', + ], + 'ASCII to IDN domain' => [ + 'domain' => 'www.食狮.公司.cn', + 'publicSuffix' => '食狮.公司.cn', + 'expectedDomain' => 'www.食狮.公司.cn', + 'expectedSuffix' => '食狮.公司.cn', + 'expectedIDNDomain' => 'www.xn--85x722f.xn--55qx5d.cn', + 'expectedIDNSuffix' => 'xn--85x722f.xn--55qx5d.cn', + ], + 'null domain and suffix' => [ + 'domain' => null, + 'publicSuffix' => null, + 'expectedDomain' => null, + 'expectedSuffix' => null, + 'expectedIDNDomain' => null, + 'expectedIDNSuffix' => null, + ], + 'domain with null suffix' => [ + 'domain' => 'www.食狮.公司.cn', + 'publicSuffix' => null, + 'expectedDomain' => 'www.食狮.公司.cn', + 'expectedSuffix' => null, + 'expectedIDNDomain' => 'www.xn--85x722f.xn--55qx5d.cn', + 'expectedIDNSuffix' => null, + ], + ]; + } } diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php new file mode 100644 index 00000000..06ba3ad0 --- /dev/null +++ b/tests/PublicSuffixTest.php @@ -0,0 +1,26 @@ +assertEquals($publicSuffix, $generatePublicSuffix); + } + + public function testPSToAsciiThrowsException() + { + $this->expectException(Exception::class); + (new PublicSuffix('_b%C3%A9bé.be-'))->toAscii(); + } +} diff --git a/tests/RulesTest.php b/tests/RulesTest.php index f3667d31..7b41d8fa 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -44,6 +44,12 @@ public function testCreateFromPathThrowsException() Rules::createFromPath('/foo/bar.dat'); } + public function testDomainInternalPhpMethod() + { + $generateRules = eval('return '.var_export($this->rules, true).';'); + $this->assertEquals($this->rules, $generateRules); + } + public function testNullWillReturnNullDomain() { $domain = $this->rules->resolve('COM'); @@ -96,7 +102,7 @@ public function testSudDomainIsNull() public function testWithInvalidDomainName() { $domain = $this->rules->resolve('_b%C3%A9bé.be-'); - $this->assertSame('_b%C3%A9bé.be-', $domain->getDomain()); + $this->assertSame('_bébé.be-', $domain->getDomain()); $this->assertFalse($domain->isKnown()); $this->assertFalse($domain->isICANN()); $this->assertFalse($domain->isPrivate()); @@ -111,6 +117,7 @@ public function testWithPrivateDomain() $this->assertTrue($domain->isKnown()); $this->assertFalse($domain->isICANN()); $this->assertTrue($domain->isPrivate()); + $this->assertSame(Rules::PRIVATE_DOMAINS, $domain->getSection()); $this->assertSame('github.io', $domain->getPublicSuffix()); $this->assertSame('thephpleague.github.io', $domain->getRegistrableDomain()); $this->assertNull($domain->getSubDomain()); @@ -123,6 +130,7 @@ public function testWithPrivateDomainInvalid() $this->assertFalse($domain->isKnown()); $this->assertFalse($domain->isICANN()); $this->assertFalse($domain->isPrivate()); + $this->assertSame('', $domain->getSection()); $this->assertSame('be', $domain->getPublicSuffix()); $this->assertSame('ac.be', $domain->getRegistrableDomain()); $this->assertSame('private.ulb', $domain->getSubDomain()); @@ -135,6 +143,7 @@ public function testWithPrivateDomainValid() $this->assertTrue($domain->isKnown()); $this->assertFalse($domain->isICANN()); $this->assertTrue($domain->isPrivate()); + $this->assertSame(Rules::PRIVATE_DOMAINS, $domain->getSection()); $this->assertSame('github.io', $domain->getPublicSuffix()); $this->assertSame('thephpleague.github.io', $domain->getRegistrableDomain()); $this->assertNull($domain->getSubDomain()); @@ -147,6 +156,7 @@ public function testWithICANNDomainInvalid() $this->assertTrue($domain->isKnown()); $this->assertTrue($domain->isICANN()); $this->assertFalse($domain->isPrivate()); + $this->assertSame(Rules::ICANN_DOMAINS, $domain->getSection()); $this->assertSame('ac.be', $domain->getPublicSuffix()); $this->assertSame('ulb.ac.be', $domain->getRegistrableDomain()); $this->assertSame('private', $domain->getSubDomain()); @@ -213,12 +223,33 @@ public function parseDataProvider() ]; } - public function testGetPublicSuffixHandlesWrongCaseProperly() + /** + * @dataProvider invalidParseProvider + * @param mixed $domain + * @param mixed $section + */ + public function testDetermine($domain, $section) { - $publicSuffix = 'рф'; - $domain = 'Яндекс.РФ'; + $this->expectException(Exception::class); + $this->rules->getPublicSuffix($domain, $section); + } - $this->assertSame($publicSuffix, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getPublicSuffix()); + public function invalidParseProvider() + { + return [ + 'IPv6' => ['[::1]', Rules::ICANN_DOMAINS], + 'IPv4' => ['192.168.1.2', Rules::ICANN_DOMAINS], + 'single label host' => ['localhost', Rules::ICANN_DOMAINS], + ]; + } + + public function testPublicSuffixSection() + { + $expected = 'рф'; + $domain = 'Яндекс.РФ'; + $publicSuffix = $this->rules->getPublicSuffix($domain); + $this->assertSame(Rules::ICANN_DOMAINS, $publicSuffix->getSection()); + $this->assertSame($expected, $publicSuffix->getContent()); } /** From e4a0b2b7985f2603941308b1742f0c9d5d7c5317 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 8 Feb 2018 14:00:31 +0100 Subject: [PATCH 077/461] Improve IDNA conversion support - add IDNAConvertrait to normalize internally IDN conversion as well as IDN error reporting --- CHANGELOG.md | 1 + src/Converter.php | 4 +- src/Domain.php | 26 ++------- src/IDNAConverterTrait.php | 109 +++++++++++++++++++++++++++++++++++++ src/PublicSuffix.php | 32 ++--------- src/Rules.php | 11 ++-- tests/DomainTest.php | 1 - tests/RulesTest.php | 7 +-- 8 files changed, 128 insertions(+), 63 deletions(-) create mode 100644 src/IDNAConverterTrait.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a229700..0a07e5cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\Domain::getDomain` returns the normalized form of the domain name - `Pdp\PublicSuffix` is no longer internal. +- normalizes IDN conversion using a internal `IDNConverterTrait` ### Deprecated diff --git a/src/Converter.php b/src/Converter.php index fb19ddea..fcebf700 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -23,6 +23,8 @@ */ final class Converter { + use IDNAConverterTrait; + /** * Convert the Public Suffix List into * an associative, multidimensional array @@ -102,7 +104,7 @@ private function addRule(array $list, array $rule_parts): array // "The domain and all rules must be canonicalized in the normal way // for hostnames - lower-case, Punycode (RFC 3492)." - $part = idn_to_ascii($part, 0, INTL_IDNA_VARIANT_UTS46); + $part = $this->idnToAscii($part); $isDomain = true; if (0 === strpos($part, '!')) { $part = substr($part, 1); diff --git a/src/Domain.php b/src/Domain.php index 13d6d4c9..8ea4e407 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -29,6 +29,8 @@ */ final class Domain implements JsonSerializable { + use IDNAConverterTrait; + /** * @var string|null */ @@ -241,16 +243,6 @@ public function isPrivate(): bool return $this->publicSuffix->isPrivate(); } - /** - * Returns the public suffix section name used to determine the public suffix. - * - * @return string - */ - public function getSection(): string - { - return $this->publicSuffix->getSection(); - } - /** * Converts the domain to its IDNA ASCII form. * @@ -267,12 +259,7 @@ public function toAscii(): self return $this; } - $domain = idn_to_ascii($this->domain, 0, INTL_IDNA_VARIANT_UTS46, $arr); - if (!$arr['errors']) { - return new self($domain, $this->publicSuffix->toAscii()); - } - - throw new Exception(sprintf('The following domain `%s` can not be converted to ascii', $this->domain)); + return new self($this->idnToAscii($this->domain), $this->publicSuffix->toAscii()); } /** @@ -291,11 +278,6 @@ public function toUnicode(): self return $this; } - $domain = idn_to_utf8($this->domain, 0, INTL_IDNA_VARIANT_UTS46, $arr); - if (!$arr['errors']) { - return new self($domain, $this->publicSuffix->toUnicode()); - } - - throw new Exception(sprintf('The following domain `%s` can not be converted to unicode', $this->domain)); + return new self($this->idnToUnicode($this->domain), $this->publicSuffix->toUnicode()); } } diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php new file mode 100644 index 00000000..4bb68690 --- /dev/null +++ b/src/IDNAConverterTrait.php @@ -0,0 +1,109 @@ + + */ +trait IDNAConverterTrait +{ + /** + * IDNA errors + * + * @see http://icu-project.org/apiref/icu4j/com/ibm/icu/text/IDNA.Error.html + * @var array + */ + private static $idn_errors = [ + IDNA_ERROR_EMPTY_LABEL => 'a non-final domain name label (or the whole domain name) is empty', + IDNA_ERROR_LABEL_TOO_LONG => 'a domain name label is longer than 63 bytes', + IDNA_ERROR_DOMAIN_NAME_TOO_LONG => 'a domain name is longer than 255 bytes in its storage form', + IDNA_ERROR_LEADING_HYPHEN => 'a label starts with a hyphen-minus ("-")', + IDNA_ERROR_TRAILING_HYPHEN => 'a label ends with a hyphen-minus ("-")', + IDNA_ERROR_HYPHEN_3_4 => 'a label contains hyphen-minus ("-") in the third and fourth positions', + IDNA_ERROR_LEADING_COMBINING_MARK => 'a label starts with a combining mark', + IDNA_ERROR_DISALLOWED => 'a label or domain name contains disallowed characters', + IDNA_ERROR_PUNYCODE => 'a label starts with "xn--" but does not contain valid Punycode', + IDNA_ERROR_LABEL_HAS_DOT => 'a label contains a dot=full stop', + IDNA_ERROR_INVALID_ACE_LABEL => 'An ACE label does not contain a valid label string', + IDNA_ERROR_BIDI => 'a label does not meet the IDNA BiDi requirements (for right-to-left characters)', + IDNA_ERROR_CONTEXTJ => 'a label does not meet the IDNA CONTEXTJ requirements', + ]; + + /** + * Get and format IDN conversion error message + * + * @param int $error_bit + * + * @return string + */ + private static function getIdnErrors(int $error_bit): string + { + $res = []; + foreach (self::$idn_errors as $error => $reason) { + if ($error_bit & $error) { + $res[] = $reason; + } + } + + return empty($res) ? 'Unknown IDNA conversion error.' : implode(', ', $res).'.'; + } + + /** + * Converts the input to its IDNA ASCII form. + * + * This method returns the string converted to IDN ASCII form + * + * @param string $host + * @throws Exception if the string can not be converted to ASCII using IDN UTS46 algorithm + * + * @return string + */ + private function idnToAscii(string $host): string + { + if (false !== strpos($host, 'xn--')) { + return $host; + } + + $output = idn_to_ascii($host, 0, INTL_IDNA_VARIANT_UTS46, $arr); + if (!$arr['errors']) { + return $output; + } + + throw new Exception(sprintf('The host `%s` is invalid : %s', $host, self::getIdnErrors($arr['errors']))); + } + + /** + * Converts the input to its IDNA UNICODE form. + * + * This method returns the string converted to IDN UNICODE form + * + * @param string $host + * @throws Exception if the string can not be converted to UNICODE using IDN UTS46 algorithm + * + * @return string + */ + private function idnToUnicode(string $host): string + { + if (false === strpos($host, 'xn--')) { + return $host; + } + + $output = idn_to_utf8($host, 0, INTL_IDNA_VARIANT_UTS46, $arr); + if (!$arr['errors']) { + return $output; + } + + throw new Exception(sprintf('The host `%s` is invalid : %s', $host, self::getIdnErrors($arr['errors']))); + } +} diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 1464c19e..130fadc5 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -29,6 +29,8 @@ */ final class PublicSuffix implements Countable, JsonSerializable { + use IDNAConverterTrait; + /** * @var string|null */ @@ -90,16 +92,6 @@ public function getContent() return $this->publicSuffix; } - /** - * Returns the public suffix section name used to determine the public suffix. - * - * @return string - */ - public function getSection(): string - { - return $this->section; - } - /** * {@inheritdoc} */ @@ -158,15 +150,7 @@ public function toUnicode(): self return $this; } - $publicSuffix = idn_to_utf8($this->publicSuffix, 0, INTL_IDNA_VARIANT_UTS46, $arr); - if (!$arr['errors']) { - $clone = clone $this; - $clone->publicSuffix = $publicSuffix; - - return $clone; - } - - throw new Exception(sprintf('The following public suffix `%s` can not be converted to unicode', $this->publicSuffix)); + return new self($this->idnToUnicode($this->publicSuffix), $this->section); } /** @@ -185,14 +169,6 @@ public function toAscii(): self return $this; } - $publicSuffix = idn_to_ascii($this->publicSuffix, 0, INTL_IDNA_VARIANT_UTS46, $arr); - if (!$arr['errors']) { - $clone = clone $this; - $clone->publicSuffix = $publicSuffix; - - return $clone; - } - - throw new Exception(sprintf('The following public suffix `%s` can not be converted to ascii', $this->publicSuffix)); + return new self($this->idnToAscii($this->publicSuffix), $this->section); } } diff --git a/src/Rules.php b/src/Rules.php index 29640688..65a81597 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -19,6 +19,8 @@ */ final class Rules { + use IDNAConverterTrait; + const ALL_DOMAINS = 'ALL_DOMAINS'; const ICANN_DOMAINS = 'ICANN_DOMAINS'; const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; @@ -217,12 +219,11 @@ private function normalizeDomain(string $domain): string $domain = rawurldecode($domain); } - $normalize = idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46, $arr); - if ($arr['errors'] > 0) { + try { + return strtolower($this->idnToAscii($domain)); + } catch (Exception $e) { return ''; } - - return strtolower($normalize); } /** @@ -278,7 +279,7 @@ private function normalizePublicSuffix(PublicSuffix $publicSuffix, string $domai { if (null === $publicSuffix->getContent()) { $labels = explode('.', $domain); - $publicSuffix = new PublicSuffix(array_pop($labels)); + $publicSuffix = new PublicSuffix($this->idnToAscii(array_pop($labels))); } if (false === strpos($domain, 'xn--')) { diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 29e0410a..c8c8b87e 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -23,7 +23,6 @@ public function testRegistrableDomainIsNullWithFoundDomain(string $domain, $publ $domain = new Domain($domain, new PublicSuffix($publicSuffix)); $this->assertNull($domain->getRegistrableDomain()); $this->assertNull($domain->getSubDomain()); - $this->assertEmpty($domain->getSection()); } public function testToAsciiThrowsException() diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 7b41d8fa..36504515 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -117,7 +117,6 @@ public function testWithPrivateDomain() $this->assertTrue($domain->isKnown()); $this->assertFalse($domain->isICANN()); $this->assertTrue($domain->isPrivate()); - $this->assertSame(Rules::PRIVATE_DOMAINS, $domain->getSection()); $this->assertSame('github.io', $domain->getPublicSuffix()); $this->assertSame('thephpleague.github.io', $domain->getRegistrableDomain()); $this->assertNull($domain->getSubDomain()); @@ -130,7 +129,6 @@ public function testWithPrivateDomainInvalid() $this->assertFalse($domain->isKnown()); $this->assertFalse($domain->isICANN()); $this->assertFalse($domain->isPrivate()); - $this->assertSame('', $domain->getSection()); $this->assertSame('be', $domain->getPublicSuffix()); $this->assertSame('ac.be', $domain->getRegistrableDomain()); $this->assertSame('private.ulb', $domain->getSubDomain()); @@ -143,7 +141,6 @@ public function testWithPrivateDomainValid() $this->assertTrue($domain->isKnown()); $this->assertFalse($domain->isICANN()); $this->assertTrue($domain->isPrivate()); - $this->assertSame(Rules::PRIVATE_DOMAINS, $domain->getSection()); $this->assertSame('github.io', $domain->getPublicSuffix()); $this->assertSame('thephpleague.github.io', $domain->getRegistrableDomain()); $this->assertNull($domain->getSubDomain()); @@ -156,7 +153,6 @@ public function testWithICANNDomainInvalid() $this->assertTrue($domain->isKnown()); $this->assertTrue($domain->isICANN()); $this->assertFalse($domain->isPrivate()); - $this->assertSame(Rules::ICANN_DOMAINS, $domain->getSection()); $this->assertSame('ac.be', $domain->getPublicSuffix()); $this->assertSame('ulb.ac.be', $domain->getRegistrableDomain()); $this->assertSame('private', $domain->getSubDomain()); @@ -248,7 +244,6 @@ public function testPublicSuffixSection() $expected = 'рф'; $domain = 'Яндекс.РФ'; $publicSuffix = $this->rules->getPublicSuffix($domain); - $this->assertSame(Rules::ICANN_DOMAINS, $publicSuffix->getSection()); $this->assertSame($expected, $publicSuffix->getContent()); } @@ -267,7 +262,7 @@ public function testPublicSuffixSection() */ public function checkPublicSuffix($input, $expected) { - $this->assertSame($expected, $this->rules->resolve($input, Rules::ICANN_DOMAINS)->getRegistrableDomain()); + $this->assertSame($expected, $this->rules->resolve($input)->getRegistrableDomain()); } /** From 6d0cbdda61bda19e8b1d0ef2bff57814da8987c9 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 9 Feb 2018 12:35:27 +0100 Subject: [PATCH 078/461] Improve code --- src/Rules.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Rules.php b/src/Rules.php index 65a81597..b26bb0de 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -96,8 +96,13 @@ public function __construct(array $rules) */ public function supports(string $section): bool { - return self::ALL_DOMAINS === $section - || (isset($this->rules[$section]) && is_array($this->rules[$section]) && !empty($this->rules[$section])); + if (self::ALL_DOMAINS === $section) { + return true; + } + + $rules = $this->rules[$section] ?? null; + + return !(null === $rules || !is_array($rules) || empty($rules)); } /** From feb39a71a092a840108c50fae1e316dc20abfcd8 Mon Sep 17 00:00:00 2001 From: Doug Date: Wed, 14 Feb 2018 17:11:04 +0000 Subject: [PATCH 079/461] updated cache-key to be universally psr-16 compliant --- src/Manager.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Manager.php b/src/Manager.php index 34cbd350..119060e3 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -81,9 +81,9 @@ public function getRules(string $source_url = self::PSL_URL): Rules */ private function getCacheKey(string $str): string { - static $cacheKeyPrefix = 'PSL-FULL'; + static $cacheKeyPrefix = 'PSL_FULL'; - return $cacheKeyPrefix.'-'.md5(strtolower($str)); + return $cacheKeyPrefix.'_'.md5(strtolower($str)); } /** From 47281ed827638c4315b76378441f9daed7194601 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 15 Feb 2018 08:29:28 +0100 Subject: [PATCH 080/461] update embedded cache file --- ....cache => pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename data/{pdp-PSL-FULL-5a3cc7f81795bb2e48e848af42d287b4.cache => pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache} (100%) diff --git a/data/pdp-PSL-FULL-5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache similarity index 100% rename from data/pdp-PSL-FULL-5a3cc7f81795bb2e48e848af42d287b4.cache rename to data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache From fc579c028e074abfd1a071367e700babb7b7e7c5 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 15 Feb 2018 09:53:55 +0100 Subject: [PATCH 081/461] Improve domain conversion --- src/IDNAConverterTrait.php | 10 +++++++++- src/Rules.php | 4 ---- tests/PublicSuffixTest.php | 5 +++++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index 4bb68690..4e495143 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -71,7 +71,11 @@ private static function getIdnErrors(int $error_bit): string */ private function idnToAscii(string $host): string { - if (false !== strpos($host, 'xn--')) { + if (false !== strpos($host, '%')) { + $host = rawurldecode($host); + } + + if (!preg_match('/[\pL]+/u', $host)) { return $host; } @@ -95,6 +99,10 @@ private function idnToAscii(string $host): string */ private function idnToUnicode(string $host): string { + if (false !== strpos($host, '%')) { + $host = $this->idnToAscii($host); + } + if (false === strpos($host, 'xn--')) { return $host; } diff --git a/src/Rules.php b/src/Rules.php index b26bb0de..34be86fc 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -220,10 +220,6 @@ private function findPublicSuffix(string $domain, string $section): PublicSuffix */ private function normalizeDomain(string $domain): string { - if (false !== strpos($domain, '%')) { - $domain = rawurldecode($domain); - } - try { return strtolower($this->idnToAscii($domain)); } catch (Exception $e) { diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 06ba3ad0..f37c5942 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -18,6 +18,11 @@ public function testDomainInternalPhpMethod() $this->assertEquals($publicSuffix, $generatePublicSuffix); } + public function testPSToUnicodeWithUrlEncode() + { + $this->assertSame('bébe', (new PublicSuffix('b%C3%A9be'))->toUnicode()->getContent()); + } + public function testPSToAsciiThrowsException() { $this->expectException(Exception::class); From e47fccb0224b287bab69d5ede55b8501d2bb06ff Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 16 Feb 2018 14:54:30 +0100 Subject: [PATCH 082/461] remove supports and getSection methods --- CHANGELOG.md | 3 --- README.md | 19 ++++++++----------- src/Rules.php | 29 +++++++++-------------------- 3 files changed, 17 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a07e5cf..d5393c0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,13 +6,10 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in ### Added -- `Pdp\Rules::supports` returns a boolean to indicates if a given section is supported - `Pdp\Rules::getPublicSuffix` returns a `Pdp\PublicSuffix` value object - `Pdp\Rules::__set_state` is implemented -- `Pdp\Domain::getSection` returns a string containing the section name used to determine the public suffix - `Pdp\Domain::toUnicode` returns a `Pdp\Domain` with its value converted to its Unicode form - `Pdp\Domain::toAscii` returns a `Pdp\Domain` with its value converted to its AScii form -- `Pdp\PublicSuffix::getSection` returns a string containing the section name used to determine the public suffix - `Pdp\PublicSuffix::toUnicode` returns a `Pdp\PublicSuffix` with its value converted to its Unicode form - `Pdp\PublicSuffix::toAscii` returns a `Pdp\PublicSuffix` with its value converted to its AScii form diff --git a/README.md b/README.md index 02a8b578..a650a0db 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,6 @@ final class Rules public static function createFromPath(string $path, $context = null): self public static function createFromString(string $content): self public function __construct(array $rules) - public function supports(string $section): bool public function getPublicSuffix(string $domain = null, string $section = self::ALL_DOMAINS): PublicSuffix public function resolve(string $domain = null, string $section = self::ALL_DOMAINS): Domain } @@ -72,7 +71,6 @@ final class Rules **NEW IN VERSION 5.2:** -- `Rules::supports` returns a boolean to tell whether the specific section is present in the `Rules` object; - `Rules::getPublicSuffix` returns a `PublicSuffix` object determined from the `Rules` object; **NEW IN VERSION 5.1:** @@ -111,7 +109,6 @@ final class Domain implements JsonSerializable public function isKnown(): bool; public function isICANN(): bool; public function isPrivate(): bool; - public function getSection(): string; public function toUnicode(): self; public function toAscii(): self; } @@ -119,9 +116,9 @@ final class Domain implements JsonSerializable **NEW IN VERSION 5.2:** -- `Domain::getSection` returns the section string name if presents else returns an empty string; - `Domain::toUnicode` returns an instance with the domain converted to its unicode representation; - `Domain::toAscii` returns an instance with the domain converted to its ascii representation; +- `Domain::getDomain` will lowercase the domain name to normalize its content; **THIS EXAMPLE ILLUSTRATES HOW THE OBJECT WORK BUT SHOULD BE AVOIDED IN PRODUCTON** @@ -134,7 +131,7 @@ use Pdp\Converter; $pdp_url = 'https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat'; $rules = Rules::createFromPath($pdp_url); -$domain = $rules->resolve('www.ulb.ac.be'); //using Rules::ALL_DOMAINS +$domain = $rules->resolve('www.Ulb.AC.be'); //using Rules::ALL_DOMAINS $domain->getDomain(); //returns 'www.ulb.ac.be' $domain->getPublicSuffix(); //returns 'ac.be' $domain->getRegistrableDomain(); //returns 'ulb.ac.be' @@ -156,7 +153,7 @@ echo json_encode($domain, JSON_PRETTY_PRINT); //The same domain will yield a different result using the PSL PRIVATE DOMAIN SECTION only -$domain = $rules->resolve('www.ulb.ac.be', Rules::PRIVATE_DOMAINS); +$domain = $rules->resolve('www.Ulb.AC.be', Rules::PRIVATE_DOMAINS); echo json_encode($domain, JSON_PRETTY_PRINT); // returns // { @@ -196,7 +193,6 @@ final class PublicSuffix implements Countable, JsonSerializable public function isKnown(): bool; public function isICANN(): bool; public function isPrivate(): bool; - public function getSection(): string; public function toUnicode(): self; public function toAscii(): self; } @@ -204,8 +200,8 @@ final class PublicSuffix implements Countable, JsonSerializable While `Rules::resolve` will only throws an exception if the section value is invalid, the `Rules::getPublicSuffix` is more restrictive and will additionnally throw if: -- If the Domain is invalid or seriously malformed -- If the PublicSuffix can not be normalized and converted using the domain encoding. +- The domain name is invalid or seriously malformed +- The public suffix can not be normalized and converted using the domain encoding. **WARNING:** @@ -241,8 +237,9 @@ To work as intended, the `Pdp\Manager` constructor requires: - a [PSR-16](http://www.php-fig.org/psr/psr-16/) Cache object to store the rules locally. -- a `Pdp\HttpClient` object to retrieve the PSL. -the `Pdp\HttpClient` is a simple interface which exposes the `HttpClient::getContent` method. This method expects a string URL representation has its sole argument and returns the body from the given URL resource as a string. +- a `Pdp\HttpClient` object to retrieve the PSL. + +The `Pdp\HttpClient` is a simple interface which exposes the `HttpClient::getContent` method. This method expects a string URL representation has its sole argument and returns the body from the given URL resource as a string. If an error occurs while retrieving such body a `HttpClientException` exception is thrown. ~~~php diff --git a/src/Rules.php b/src/Rules.php index 34be86fc..c9e68306 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -87,24 +87,6 @@ public function __construct(array $rules) $this->rules = $rules; } - /** - * Tell whether the submitted section if supported by the current object - * - * @param string $section - * - * @return bool - */ - public function supports(string $section): bool - { - if (self::ALL_DOMAINS === $section) { - return true; - } - - $rules = $this->rules[$section] ?? null; - - return !(null === $rules || !is_array($rules) || empty($rules)); - } - /** * Determines the public suffix for a given domain. * @@ -174,9 +156,16 @@ private function isMatchable($domain): bool */ private function validateSection(string $section) { - if (!$this->supports($section)) { - throw new Exception(sprintf('%s is an unknown Public Suffix List section', $section)); + if (self::ALL_DOMAINS === $section) { + return; } + + $rules = $this->rules[$section] ?? null; + if (null !== $rules && is_array($rules)) { + return; + } + + throw new Exception(sprintf('%s is an unknown Public Suffix List section', $section)); } /** From 0388188b098bb2d9c8fb13cdc5ce438c285b396a Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 16 Feb 2018 15:39:04 +0100 Subject: [PATCH 083/461] Improve IDN conversion --- src/Domain.php | 7 ++++- src/IDNAConverterTrait.php | 57 +++++++++++++++++--------------------- src/PublicSuffix.php | 19 +++++++++++-- src/Rules.php | 2 +- tests/PublicSuffixTest.php | 7 +++++ 5 files changed, 55 insertions(+), 37 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 8ea4e407..687a324a 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -259,7 +259,12 @@ public function toAscii(): self return $this; } - return new self($this->idnToAscii($this->domain), $this->publicSuffix->toAscii()); + $newDomain = $this->idnToAscii($this->domain); + if ($newDomain === $this->domain) { + return $this; + } + + return new self($newDomain, $this->publicSuffix->toAscii()); } /** diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index 4e495143..d4f5c981 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -18,28 +18,6 @@ */ trait IDNAConverterTrait { - /** - * IDNA errors - * - * @see http://icu-project.org/apiref/icu4j/com/ibm/icu/text/IDNA.Error.html - * @var array - */ - private static $idn_errors = [ - IDNA_ERROR_EMPTY_LABEL => 'a non-final domain name label (or the whole domain name) is empty', - IDNA_ERROR_LABEL_TOO_LONG => 'a domain name label is longer than 63 bytes', - IDNA_ERROR_DOMAIN_NAME_TOO_LONG => 'a domain name is longer than 255 bytes in its storage form', - IDNA_ERROR_LEADING_HYPHEN => 'a label starts with a hyphen-minus ("-")', - IDNA_ERROR_TRAILING_HYPHEN => 'a label ends with a hyphen-minus ("-")', - IDNA_ERROR_HYPHEN_3_4 => 'a label contains hyphen-minus ("-") in the third and fourth positions', - IDNA_ERROR_LEADING_COMBINING_MARK => 'a label starts with a combining mark', - IDNA_ERROR_DISALLOWED => 'a label or domain name contains disallowed characters', - IDNA_ERROR_PUNYCODE => 'a label starts with "xn--" but does not contain valid Punycode', - IDNA_ERROR_LABEL_HAS_DOT => 'a label contains a dot=full stop', - IDNA_ERROR_INVALID_ACE_LABEL => 'An ACE label does not contain a valid label string', - IDNA_ERROR_BIDI => 'a label does not meet the IDNA BiDi requirements (for right-to-left characters)', - IDNA_ERROR_CONTEXTJ => 'a label does not meet the IDNA CONTEXTJ requirements', - ]; - /** * Get and format IDN conversion error message * @@ -49,8 +27,29 @@ trait IDNAConverterTrait */ private static function getIdnErrors(int $error_bit): string { + /** + * IDNA errors + * + * @see http://icu-project.org/apiref/icu4j/com/ibm/icu/text/IDNA.Error.html + */ + static $idn_errors = [ + IDNA_ERROR_EMPTY_LABEL => 'a non-final domain name label (or the whole domain name) is empty', + IDNA_ERROR_LABEL_TOO_LONG => 'a domain name label is longer than 63 bytes', + IDNA_ERROR_DOMAIN_NAME_TOO_LONG => 'a domain name is longer than 255 bytes in its storage form', + IDNA_ERROR_LEADING_HYPHEN => 'a label starts with a hyphen-minus ("-")', + IDNA_ERROR_TRAILING_HYPHEN => 'a label ends with a hyphen-minus ("-")', + IDNA_ERROR_HYPHEN_3_4 => 'a label contains hyphen-minus ("-") in the third and fourth positions', + IDNA_ERROR_LEADING_COMBINING_MARK => 'a label starts with a combining mark', + IDNA_ERROR_DISALLOWED => 'a label or domain name contains disallowed characters', + IDNA_ERROR_PUNYCODE => 'a label starts with "xn--" but does not contain valid Punycode', + IDNA_ERROR_LABEL_HAS_DOT => 'a label contains a dot=full stop', + IDNA_ERROR_INVALID_ACE_LABEL => 'An ACE label does not contain a valid label string', + IDNA_ERROR_BIDI => 'a label does not meet the IDNA BiDi requirements (for right-to-left characters)', + IDNA_ERROR_CONTEXTJ => 'a label does not meet the IDNA CONTEXTJ requirements', + ]; + $res = []; - foreach (self::$idn_errors as $error => $reason) { + foreach ($idn_errors as $error => $reason) { if ($error_bit & $error) { $res[] = $reason; } @@ -75,7 +74,9 @@ private function idnToAscii(string $host): string $host = rawurldecode($host); } - if (!preg_match('/[\pL]+/u', $host)) { + $host = strtolower($host); + static $pattern = '/[\pL]+/u'; + if (!preg_match($pattern, $host)) { return $host; } @@ -99,14 +100,6 @@ private function idnToAscii(string $host): string */ private function idnToUnicode(string $host): string { - if (false !== strpos($host, '%')) { - $host = $this->idnToAscii($host); - } - - if (false === strpos($host, 'xn--')) { - return $host; - } - $output = idn_to_utf8($host, 0, INTL_IDNA_VARIANT_UTS46, $arr); if (!$arr['errors']) { return $output; diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 130fadc5..dea2960b 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -57,6 +57,14 @@ public static function __set_state(array $properties): self */ public function __construct(string $publicSuffix = null, string $section = '') { + if (false !== strpos((string) $publicSuffix, '%')) { + $publicSuffix = rawurldecode($publicSuffix); + } + + if (null !== $publicSuffix) { + $publicSuffix = strtolower($publicSuffix); + } + $this->publicSuffix = $publicSuffix; $this->section = $section; } @@ -146,7 +154,7 @@ public function isPrivate(): bool */ public function toUnicode(): self { - if (null === $this->publicSuffix) { + if (null === $this->publicSuffix || false === strpos($this->publicSuffix, 'xn--')) { return $this; } @@ -165,10 +173,15 @@ public function toUnicode(): self */ public function toAscii(): self { - if (null === $this->publicSuffix) { + if (null === $this->publicSuffix || false !== strpos($this->publicSuffix, 'xn--')) { + return $this; + } + + $newPublicSuffix = $this->idnToAscii($this->publicSuffix); + if ($newPublicSuffix === $this->publicSuffix) { return $this; } - return new self($this->idnToAscii($this->publicSuffix), $this->section); + return new self($newPublicSuffix, $this->section); } } diff --git a/src/Rules.php b/src/Rules.php index c9e68306..f5c3fc4e 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -210,7 +210,7 @@ private function findPublicSuffix(string $domain, string $section): PublicSuffix private function normalizeDomain(string $domain): string { try { - return strtolower($this->idnToAscii($domain)); + return $this->idnToAscii($domain); } catch (Exception $e) { return ''; } diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index f37c5942..e16357da 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -28,4 +28,11 @@ public function testPSToAsciiThrowsException() $this->expectException(Exception::class); (new PublicSuffix('_b%C3%A9bé.be-'))->toAscii(); } + + public function testConversionReturnsTheSameInstance() + { + $instance = new PublicSuffix('ac.be', Rules::ICANN_DOMAINS); + $this->assertSame($instance->toUnicode(), $instance); + $this->assertSame($instance->toAscii(), $instance); + } } From a8173ec3607257419e616ec351131c7c09590097 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 23 Feb 2018 09:02:55 +0100 Subject: [PATCH 084/461] adding a coding static analysis tools with PHPStan --- .gitattributes | 21 ++++++++-------- .travis.yml | 12 +++++----- CHANGELOG.md | 5 ++-- README.md | 20 ++++++++++++++++ composer.json | 24 +++++++++++++++---- ...ULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- phpstan.src.neon | 6 +++++ phpstan.tests.neon | 5 ++++ src/Installer.php | 8 +++---- src/Rules.php | 9 ++++--- tests/CacheTest.php | 9 ++++--- tests/CurlHttpClientTest.php | 2 +- tests/DomainTest.php | 2 +- tests/ManagerTest.php | 5 +--- tests/PublicSuffixTest.php | 2 +- tests/RulesTest.php | 6 ++--- 16 files changed, 90 insertions(+), 48 deletions(-) create mode 100644 phpstan.src.neon create mode 100644 phpstan.tests.neon diff --git a/.gitattributes b/.gitattributes index 28d84bb5..a19fc681 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,12 +1,13 @@ * text=auto -/.editorconfig export-ignore -/.gitattributes export-ignore -/.github export-ignore -/.gitignore export-ignore -/.php_cs export-ignore -/.travis.yml export-ignore -/README.md export-ignore -/CHANGELOG.md export-ignore -/phpunit.xml.dist export-ignore -/tests export-ignore +/.editorconfig export-ignore +/.gitattributes export-ignore +/.github export-ignore +/.gitignore export-ignore +/.php_cs export-ignore +/.phpstan.src.neon export-ignore +/.phpstan.tests.neon export-ignore +/.travis.yml export-ignore +/README.md export-ignore +/phpunit.xml.dist export-ignore +/tests export-ignore diff --git a/.travis.yml b/.travis.yml index b393c0a1..04c351dc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,13 +5,13 @@ sudo: false matrix: include: - php: 7.0 - env: COLLECT_COVERAGE=true VALIDATE_CODING_STYLE=true IGNORE_PLATFORMS=false + env: VALIDATE_CODING_STYLE=false RUN_PHPSTAN=false IGNORE_PLATFORMS=false - php: 7.1 - env: COLLECT_COVERAGE=true VALIDATE_CODING_STYLE=true IGNORE_PLATFORMS=false + env: VALIDATE_CODING_STYLE=false RUN_PHPSTAN=false IGNORE_PLATFORMS=false - php: 7.2 - env: COLLECT_COVERAGE=false VALIDATE_CODING_STYLE=false IGNORE_PLATFORMS=true + env: VALIDATE_CODING_STYLE=true RUN_PHPSTAN=true IGNORE_PLATFORMS=false - php: nightly - env: COLLECT_COVERAGE=false VALIDATE_CODING_STYLE=false IGNORE_PLATFORMS=true + env: VALIDATE_CODING_STYLE=false RUN_PHPSTAN=false IGNORE_PLATFORMS=true allow_failures: - php: nightly fast_finish: true @@ -31,5 +31,5 @@ script: - composer phpunit after_script: - - if [ "$COLLECT_COVERAGE" == "true" ]; then wget https://scrutinizer-ci.com/ocular.phar && php ocular.phar code-coverage:upload --format=php-clover build/clover.xml; fi - - if [ "$VALIDATE_CODING_STYLE" == "true" ]; then composer phpcs; fi \ No newline at end of file + - if [ "$VALIDATE_CODING_STYLE" == "true" ]; then composer phpcs; fi + - if [ "$RUN_PHPSTAN" == "true" ]; then composer phpstan; fi \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index d5393c0f..f26b25d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in this file -## Next - TBD +## 5.2.0 - 2018-02-23 ### Added @@ -17,7 +17,8 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\Domain::getDomain` returns the normalized form of the domain name - `Pdp\PublicSuffix` is no longer internal. -- normalizes IDN conversion using a internal `IDNConverterTrait` +- Normalizes IDN conversion using a internal `IDNConverterTrait` +- Internal code improved by requiring PHPStan for development ### Deprecated diff --git a/README.md b/README.md index a650a0db..bf0455ff 100644 --- a/README.md +++ b/README.md @@ -428,6 +428,26 @@ Contributing Contributions are welcome and will be fully credited. Please see [CONTRIBUTING](.github/CONTRIBUTING.md) for details. +Testing +------- + +`pdp-domain-parser` has: + +- a [PHPUnit](https://phpunit.de) test suite +- a coding style compliance test suite using [PHP CS Fixer](http://cs.sensiolabs.org/). +- a code analysis compliance test suite using [PHPStan](https://github.com/phpstan/phpstan). + +To run the tests, run the following command from the project folder. + +``` bash +$ composer test +``` + +Security +------- + +If you discover any security related issues, please email nyamsprod@gmail.com instead of using the issue tracker. + Credits ------- diff --git a/composer.json b/composer.json index 6f166680..fc7f74f3 100644 --- a/composer.json +++ b/composer.json @@ -39,9 +39,13 @@ "psr/simple-cache": "^1" }, "require-dev": { - "phpunit/phpunit": "^6.3", + "composer/composer": "^1.6", + "friendsofphp/php-cs-fixer": "^2.7", "mikey179/vfsStream": "^1.6", - "friendsofphp/php-cs-fixer": "^2.7" + "phpstan/phpstan": "^0.9.2", + "phpstan/phpstan-phpunit": "^0.9.4", + "phpstan/phpstan-strict-rules": "^0.9.0", + "phpunit/phpunit": "^6.3" }, "suggest": { "psr/simple-cache-implementation": "To enable using other cache providers", @@ -59,11 +63,21 @@ } }, "scripts": { + "phpcs": "php-cs-fixer fix -vv --diff --dry-run --allow-risky=yes", + "phpstan-src": "phpstan analyse -l 7 -c phpstan.src.neon src", + "phpstan-tests": "phpstan analyse -l 7 -c phpstan.tests.neon tests", + "phpstan": [ + "@phpstan-src", + "@phpstan-tests" + ], + "phpunit": "phpunit --coverage-text", "post-install-cmd": "\\Pdp\\Installer::updateLocalCache", "post-update-cmd": "\\Pdp\\Installer::updateLocalCache", - "test": "phpunit --coverage-text; php-cs-fixer fix -vv --diff --dry-run --allow-risky=yes", - "phpunit": "phpunit --coverage-text", - "phpcs": "php-cs-fixer fix -vv --diff --dry-run --allow-risky=yes" + "test": [ + "@phpunit", + "@phpcs", + "@phpstan" + ] }, "extra": { "branch-alias": { diff --git a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache index 1c41ad9f..7d8c7f0a 100644 --- a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache +++ b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache @@ -1 +1 @@ -s:105185:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"boots":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtpc":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"ca":{"1password":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"com":{"1password":[],"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"se":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"barsyonline":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"yolasite":[]},"eu":{"1password":[],"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"hepforge":[],"js":[],"bmoattachments":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ws":{"advisor":{"*":[]},"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[]},"host":{"cloudaccess":[],"freesite":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[]},"pw":{"cloudns":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"cldmail":{"hb":[]},"net":[],"org":[],"pp":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[]},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]}},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"co":{"com":{"blogspot":[]},"nodum":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[]},"it":{"blogspot":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"bs":{"we":[]},"online":{"barsy":[]},"support":{"barsy":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[]},"ai":{"nom":[]},"gd":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"hn":{"nom":[]},"kz":{"nym":[]},"sx":{"nym":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"lc":{"oy":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"space":{"stackspace":[],"uber":[],"xs4all":[]},"farm":{"storj":[]},"mobi":{"dscloud":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file +s:105284:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"boots":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtpc":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"ca":{"1password":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"com":{"1password":[],"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"se":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"barsyonline":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"yolasite":[]},"eu":{"1password":[],"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"hepforge":[],"js":[],"bmoattachments":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[]},"host":{"cloudaccess":[],"freesite":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[]},"pw":{"cloudns":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"cldmail":{"hb":[]},"net":[],"org":[],"pp":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[]},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]}},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"co":{"com":{"blogspot":[]},"nodum":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[]},"it":{"blogspot":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"bs":{"we":[]},"online":{"barsy":[]},"support":{"barsy":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[]},"ai":{"nom":[]},"gd":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"hn":{"nom":[]},"kz":{"nym":[]},"sx":{"nym":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"lc":{"oy":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"space":{"stackspace":[],"uber":[],"xs4all":[]},"farm":{"storj":[]},"mobi":{"dscloud":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file diff --git a/phpstan.src.neon b/phpstan.src.neon new file mode 100644 index 00000000..955c9f76 --- /dev/null +++ b/phpstan.src.neon @@ -0,0 +1,6 @@ +includes: +- vendor/phpstan/phpstan-strict-rules/rules.neon +parameters: + ignoreErrors: + - '#has invalid typehint type Psr\\SimpleCache\\DateInterval#' + reportUnmatchedIgnoredErrors: false \ No newline at end of file diff --git a/phpstan.tests.neon b/phpstan.tests.neon new file mode 100644 index 00000000..9687471f --- /dev/null +++ b/phpstan.tests.neon @@ -0,0 +1,5 @@ +includes: + - vendor/phpstan/phpstan-strict-rules/rules.neon + - vendor/phpstan/phpstan-phpunit/extension.neon + - vendor/phpstan/phpstan-phpunit/rules.neon + - vendor/phpstan/phpstan-phpunit/strictRules.neon \ No newline at end of file diff --git a/src/Installer.php b/src/Installer.php index 96898752..4da93e13 100644 --- a/src/Installer.php +++ b/src/Installer.php @@ -67,7 +67,7 @@ public static function updateLocalCache(Event $event = null) $io->writeError([ '😓 😓 😓 Your local cache could not be updated. 😓 😓 😓', 'An error occurred during the update.', - '----- Error Trace ----', + '----- Error Message ----', ]); $io->writeError($e->getMessage()); die(1); @@ -83,7 +83,7 @@ public static function updateLocalCache(Event $event = null) */ private static function getVendorPath(Event $event = null) { - if ($event instanceof Event) { + if (null !== $event) { return $event->getComposer()->getConfig()->get('vendor-dir'); } @@ -103,11 +103,11 @@ private static function getVendorPath(Event $event = null) * * @param Event|null $event * - * @return object + * @return mixed */ private static function getIO(Event $event = null) { - if ($event instanceof Event) { + if (null !== $event) { return $event->getIO(); } diff --git a/src/Rules.php b/src/Rules.php index f5c3fc4e..8c721b87 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -102,7 +102,7 @@ public function __construct(array $rules) */ public function getPublicSuffix(string $domain = null, string $section = self::ALL_DOMAINS): PublicSuffix { - if (!$this->isMatchable($domain)) { + if (null === $domain || !$this->isMatchable($domain)) { throw new Exception(sprintf('The submitted domain `%s` is invalid or malformed', $domain)); } $this->validateSection($section); @@ -121,7 +121,7 @@ public function getPublicSuffix(string $domain = null, string $section = self::A public function resolve(string $domain = null, string $section = self::ALL_DOMAINS): Domain { $this->validateSection($section); - if (!$this->isMatchable($domain)) { + if (null === $domain || !$this->isMatchable($domain)) { return new Domain(); } @@ -135,14 +135,13 @@ public function resolve(string $domain = null, string $section = self::ALL_DOMAI /** * Tells whether the given domain can be resolved. * - * @param string|null $domain + * @param string $domain * * @return bool */ private function isMatchable($domain): bool { - return null !== $domain - && strpos($domain, '.') > 0 + return strpos($domain, '.') > 0 && strlen($domain) === strcspn($domain, '][') && !filter_var($domain, FILTER_VALIDATE_IP); } diff --git a/tests/CacheTest.php b/tests/CacheTest.php index 18e6802b..0e5bbb84 100644 --- a/tests/CacheTest.php +++ b/tests/CacheTest.php @@ -2,14 +2,14 @@ declare(strict_types=1); -namespace pdp\tests; +namespace Pdp\Tests; use DateInterval; +use Iterator; use org\bovigo\vfs\vfsStream; use Pdp\Cache; use PHPUnit\Framework\TestCase; use Psr\SimpleCache\InvalidArgumentException; -use Traversable; /** * Abstract PSR-16 tester. @@ -47,8 +47,7 @@ public function tearDown() /** * @dataProvider storableValuesProvider * - * @param mixed $expected - * @param string $key + * @param mixed $expected */ public function testSetGet($expected) { @@ -387,7 +386,7 @@ public function testGetMultipleInvalidArg() // first value is requested. // // This extra line is just a precaution for that - if ($result instanceof Traversable) { + if ($result instanceof Iterator) { $result->current(); } } diff --git a/tests/CurlHttpClientTest.php b/tests/CurlHttpClientTest.php index ac419d81..436b2701 100644 --- a/tests/CurlHttpClientTest.php +++ b/tests/CurlHttpClientTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace pdp\tests; +namespace Pdp\Tests; use Pdp\CurlHttpClient; use Pdp\Exception; diff --git a/tests/DomainTest.php b/tests/DomainTest.php index c8c8b87e..081f2149 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace pdp\tests; +namespace Pdp\Tests; use Pdp\Domain; use Pdp\Exception; diff --git a/tests/ManagerTest.php b/tests/ManagerTest.php index e5f5925a..0a552b47 100644 --- a/tests/ManagerTest.php +++ b/tests/ManagerTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace pdp\tests; +namespace Pdp\Tests; use org\bovigo\vfs\vfsStream; use Pdp\Cache; @@ -13,9 +13,6 @@ class ManagerTest extends TestCase { - /** - * @var Manager - */ protected $manager; protected $cachePool; protected $cacheDir; diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index e16357da..71b26615 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace pdp\tests; +namespace Pdp\Tests; use Pdp\Exception; use Pdp\PublicSuffix; diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 36504515..50c81699 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace pdp\tests; +namespace Pdp\Tests; use Pdp\Cache; use Pdp\CurlHttpClient; @@ -257,8 +257,8 @@ public function testPublicSuffixSection() * * @see http://publicsuffix.org/list/ * - * @param string $input Domain and public suffix - * @param string $expected Expected result + * @param string|null $input Domain and public suffix + * @param string|null $expected Expected result */ public function checkPublicSuffix($input, $expected) { From 758dfa2a44b42670e8fb47d3b224cfa0a7dae850 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 23 Feb 2018 09:30:01 +0100 Subject: [PATCH 085/461] remove mb_string extension requirement --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index bf0455ff..f8674d7c 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,6 @@ System Requirements You need: - **PHP >= 7.0** but the latest stable version of PHP is recommended -- the `mbstring` extension - the `intl` extension Dependencies From bbd49b8429a1e2b2b790f259de7b8d190d055115 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 25 Feb 2018 20:59:15 +0100 Subject: [PATCH 086/461] Improve Domain Value Object --- CHANGELOG.md | 19 ++++ ...ULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- src/Domain.php | 98 ++++++++++++++----- src/PublicSuffix.php | 20 ++-- tests/DomainTest.php | 6 ++ 5 files changed, 107 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f26b25d7..a4c94bd2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,25 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in this file +## Next - TBD + +### Added + +- `Pdp\Domain::getContent` returns the Domain name value replaces `Pdp\Domain::getDomain` +- `Pdp\Domain` implements the `Countable` interface. + +### Fixed + +- `Pdp\Domain` domain part computation (public suffix, registrable domain and sub domain) + +### Deprecated + +- `Pdp\Domain::getDomain` use instead `Pdp\Domain::getContent` + +### Removed + +- None + ## 5.2.0 - 2018-02-23 ### Added diff --git a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache index 7d8c7f0a..453e276c 100644 --- a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache +++ b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache @@ -1 +1 @@ -s:105284:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"boots":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtpc":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"ca":{"1password":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"com":{"1password":[],"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"se":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"barsyonline":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"yolasite":[]},"eu":{"1password":[],"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"hepforge":[],"js":[],"bmoattachments":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[]},"host":{"cloudaccess":[],"freesite":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[]},"pw":{"cloudns":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"cldmail":{"hb":[]},"net":[],"org":[],"pp":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[]},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]}},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"co":{"com":{"blogspot":[]},"nodum":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[]},"it":{"blogspot":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"bs":{"we":[]},"online":{"barsy":[]},"support":{"barsy":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[]},"ai":{"nom":[]},"gd":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"hn":{"nom":[]},"kz":{"nym":[]},"sx":{"nym":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"lc":{"oy":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"space":{"stackspace":[],"uber":[],"xs4all":[]},"farm":{"storj":[]},"mobi":{"dscloud":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file +s:105301:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"boots":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtpc":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"ca":{"1password":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"com":{"1password":[],"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"se":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"barsyonline":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"yolasite":[]},"eu":{"1password":[],"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"hepforge":[],"js":[],"mozilla-iot":[],"bmoattachments":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[]},"host":{"cloudaccess":[],"freesite":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[]},"pw":{"cloudns":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"cldmail":{"hb":[]},"net":[],"org":[],"pp":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[]},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]}},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"co":{"com":{"blogspot":[]},"nodum":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[]},"it":{"blogspot":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"bs":{"we":[]},"online":{"barsy":[]},"support":{"barsy":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[]},"ai":{"nom":[]},"gd":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"hn":{"nom":[]},"kz":{"nym":[]},"sx":{"nym":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"lc":{"oy":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"space":{"stackspace":[],"uber":[],"xs4all":[]},"farm":{"storj":[]},"mobi":{"dscloud":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file diff --git a/src/Domain.php b/src/Domain.php index 687a324a..df42e325 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -11,6 +11,7 @@ namespace Pdp; +use Countable; use JsonSerializable; /** @@ -27,7 +28,7 @@ * @author Jeremy Kendall * @author Ignace Nyamagana Butera */ -final class Domain implements JsonSerializable +final class Domain implements Countable, JsonSerializable { use IDNAConverterTrait; @@ -67,22 +68,34 @@ public static function __set_state(array $properties): self */ public function __construct($domain = null, PublicSuffix $publicSuffix = null) { - if (false !== strpos((string) $domain, '%')) { - $domain = rawurldecode($domain); + $this->domain = $this->setDomain($domain); + $this->publicSuffix = $this->setPublicSuffix($publicSuffix); + $this->registrableDomain = $this->setRegistrableDomain(); + $this->subDomain = $this->setSubDomain(); + } + + /** + * Normalize the given domain. + * + * @param string|null $domain + * + * @return string|null + */ + private function setDomain(string $domain = null) + { + if (null === $domain) { + return null; } - if (null !== $domain) { - $domain = strtolower($domain); + if (false !== strpos($domain, '%')) { + $domain = rawurldecode($domain); } - $this->domain = $domain; - $this->publicSuffix = $this->setPublicSuffix($publicSuffix); - $this->registrableDomain = $this->setRegistrableDomain(); - $this->subDomain = $this->setSubDomain(); + return strtolower($domain); } /** - * Filter the PublicSuffix + * Sets the public suffix domain part. * * @param PublicSuffix|null $publicSuffix * @@ -90,7 +103,12 @@ public function __construct($domain = null, PublicSuffix $publicSuffix = null) */ private function setPublicSuffix(PublicSuffix $publicSuffix = null): PublicSuffix { - if (null === $publicSuffix || null === $this->domain) { + $publicSuffix = $publicSuffix ?? new PublicSuffix(); + if (null === $publicSuffix->getContent()) { + return $publicSuffix; + } + + if (null === $this->domain || false === strpos($this->domain, '.')) { return new PublicSuffix(); } @@ -98,25 +116,24 @@ private function setPublicSuffix(PublicSuffix $publicSuffix = null): PublicSuffi } /** - * Compute the registrable domain part. + * Computes the registrable domain part. * * @return string|null */ private function setRegistrableDomain() { - if (false === strpos((string) $this->domain, '.')) { + if (null === $this->publicSuffix->getContent()) { return null; } - if (in_array($this->publicSuffix->getContent(), [null, $this->domain], true)) { + $labels = explode('.', $this->domain); + $countLabels = count($labels); + $countPublicSuffixLabels = count($this->publicSuffix); + if ($countLabels === $countPublicSuffixLabels) { return null; } - $nbLabelsToRemove = count($this->publicSuffix) + 1; - $domainLabels = explode('.', $this->domain); - $registrableDomain = implode('.', array_slice($domainLabels, count($domainLabels) - $nbLabelsToRemove)); - - return $registrableDomain; + return implode('.', array_slice($labels, $countLabels - $countPublicSuffixLabels - 1)); } /** @@ -130,16 +147,14 @@ private function setSubDomain() return null; } - $nbLabelsToRemove = count($this->publicSuffix) + 1; - $domainLabels = explode('.', $this->domain); - $countLabels = count($domainLabels); - if ($countLabels === $nbLabelsToRemove) { + $labels = explode('.', $this->domain); + $countLabels = count($labels); + $countLabelsToRemove = count(explode('.', $this->registrableDomain)); + if ($countLabels === $countLabelsToRemove) { return null; } - $subDomain = implode('.', array_slice($domainLabels, 0, $countLabels - $nbLabelsToRemove)); - - return $subDomain; + return implode('.', array_slice($labels, 0, $countLabels - $countLabelsToRemove)); } /** @@ -162,16 +177,45 @@ public function __debugInfo() return $this->jsonSerialize(); } + /** + * {@inheritdoc} + */ + public function count() + { + if (null === $this->domain) { + return 0; + } + + return count(explode('.', $this->domain)); + } + + /** + * Returns the domain content. + * + * This method should return null on seriously malformed domain name + * + * @return string|null + */ + public function getContent() + { + return $this->domain; + } + /** * Returns the full domain name. * + * DEPRECATION WARNING! This method will be removed in the next major point release + * + * @deprecated deprecated since version 5.3 + * @see Domain::getContent + * * This method should return null on seriously malformed domain name * * @return string|null */ public function getDomain() { - return $this->domain; + return $this->getContent(); } /** diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index dea2960b..57f8a446 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -90,16 +90,6 @@ public function __debugInfo() return $this->jsonSerialize(); } - /** - * Returns the public suffix content. - * - * @return string|null - */ - public function getContent() - { - return $this->publicSuffix; - } - /** * {@inheritdoc} */ @@ -112,6 +102,16 @@ public function count() return count(explode('.', $this->publicSuffix)); } + /** + * Returns the public suffix content. + * + * @return string|null + */ + public function getContent() + { + return $this->publicSuffix; + } + /** * Tells whether the public suffix has a matching rule in a Public Suffix List. * diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 081f2149..a1d0ae02 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -52,6 +52,12 @@ public function testDomainInternalPhpMethod() $generateDomain = eval('return '.var_export($domain, true).';'); $this->assertInternalType('array', $domain->__debugInfo()); $this->assertEquals($domain, $generateDomain); + $this->assertCount(4, $domain); + } + + public function testDomainWithNullLabels() + { + $this->assertCount(0, new Domain()); } public function testPublicSuffixnternalPhpMethod() From c1cbf66209541ea9c3613fcc3fff3ab444fb3fd4 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 9 Mar 2018 14:47:07 +0100 Subject: [PATCH 087/461] Introduce DomainInterface - Domain and PublicSuffix implements DomainInterface - Improve internal code for Domain PublicSuffix and Rules class - Domain validation is now supported on instanciation --- CHANGELOG.md | 2 + ...ULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- src/Converter.php | 2 +- src/Domain.php | 161 +++++++++------- src/DomainInterface.php | 84 ++++++++ src/IDNAConverterTrait.php | 63 +++++- src/Manager.php | 11 +- src/PublicSuffix.php | 116 ++++++----- src/Rules.php | 108 ++++------- tests/CurlHttpClientTest.php | 14 ++ tests/DomainTest.php | 165 +++++++++++++--- tests/ManagerTest.php | 58 +++++- tests/PublicSuffixTest.php | 108 ++++++++++- tests/RulesTest.php | 181 +++++++++++++++--- tests/data/invalid_suffix_list_content.dat | 10 + 15 files changed, 822 insertions(+), 263 deletions(-) create mode 100644 src/DomainInterface.php create mode 100644 tests/data/invalid_suffix_list_content.dat diff --git a/CHANGELOG.md b/CHANGELOG.md index a4c94bd2..ad9404dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,12 +6,14 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in ### Added +- `Pdp\DomainInterface` interface implemented by `Pdp\Domain` and `Pdp\PublicSuffix` - `Pdp\Domain::getContent` returns the Domain name value replaces `Pdp\Domain::getDomain` - `Pdp\Domain` implements the `Countable` interface. ### Fixed - `Pdp\Domain` domain part computation (public suffix, registrable domain and sub domain) +- `Pdp\Domain` and `Pdp\PublicSuffix` host validation compliance to RFC improved ### Deprecated diff --git a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache index 453e276c..1e4b1860 100644 --- a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache +++ b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache @@ -1 +1 @@ -s:105301:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"boots":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtpc":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"ca":{"1password":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"com":{"1password":[],"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"se":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"barsyonline":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"yolasite":[]},"eu":{"1password":[],"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"hepforge":[],"js":[],"mozilla-iot":[],"bmoattachments":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[]},"host":{"cloudaccess":[],"freesite":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[]},"pw":{"cloudns":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"cldmail":{"hb":[]},"net":[],"org":[],"pp":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[]},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]}},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"co":{"com":{"blogspot":[]},"nodum":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[]},"it":{"blogspot":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"bs":{"we":[]},"online":{"barsy":[]},"support":{"barsy":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[]},"ai":{"nom":[]},"gd":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"hn":{"nom":[]},"kz":{"nym":[]},"sx":{"nym":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"lc":{"oy":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"space":{"stackspace":[],"uber":[],"xs4all":[]},"farm":{"storj":[]},"mobi":{"dscloud":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file +s:105308:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"boots":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtpc":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"ca":{"1password":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"com":{"1password":[],"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"barsyonline":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"yolasite":[]},"eu":{"1password":[],"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"hepforge":[],"js":[],"mozilla-iot":[],"bmoattachments":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[]},"host":{"cloudaccess":[],"freesite":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[]},"pw":{"cloudns":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"cldmail":{"hb":[]},"net":[],"org":[],"pp":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[]},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]}},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"co":{"com":{"blogspot":[]},"nodum":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[]},"it":{"blogspot":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"bs":{"we":[]},"online":{"barsy":[]},"support":{"barsy":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[]},"ai":{"nom":[]},"gd":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"hn":{"nom":[]},"kz":{"nym":[]},"sx":{"nym":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"lc":{"oy":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"space":{"stackspace":[],"uber":[],"xs4all":[]},"farm":{"storj":[]},"mobi":{"dscloud":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file diff --git a/src/Converter.php b/src/Converter.php index fcebf700..1c97728d 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -104,7 +104,7 @@ private function addRule(array $list, array $rule_parts): array // "The domain and all rules must be canonicalized in the normal way // for hostnames - lower-case, Punycode (RFC 3492)." - $part = $this->idnToAscii($part); + $part = $this->idnToAscii(strtolower($part)); $isDomain = true; if (0 === strpos($part, '!')) { $part = substr($part, 1); diff --git a/src/Domain.php b/src/Domain.php index df42e325..9a08e37c 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -11,7 +11,6 @@ namespace Pdp; -use Countable; use JsonSerializable; /** @@ -28,7 +27,7 @@ * @author Jeremy Kendall * @author Ignace Nyamagana Butera */ -final class Domain implements Countable, JsonSerializable +final class Domain implements DomainInterface, JsonSerializable { use IDNAConverterTrait; @@ -37,6 +36,11 @@ final class Domain implements Countable, JsonSerializable */ private $domain; + /** + * @var string[] + */ + private $labels; + /** * @var PublicSuffix */ @@ -66,59 +70,51 @@ public static function __set_state(array $properties): self * @param string|null $domain * @param PublicSuffix $publicSuffix */ - public function __construct($domain = null, PublicSuffix $publicSuffix = null) + public function __construct(string $domain = null, PublicSuffix $publicSuffix = null) { - $this->domain = $this->setDomain($domain); + list($this->domain, $this->labels) = $this->setDomain($domain); $this->publicSuffix = $this->setPublicSuffix($publicSuffix); + $this->assertValidState(); $this->registrableDomain = $this->setRegistrableDomain(); $this->subDomain = $this->setSubDomain(); } /** - * Normalize the given domain. + * Sets the public suffix domain part. * - * @param string|null $domain + * @param PublicSuffix|null $publicSuffix * - * @return string|null + * @return PublicSuffix */ - private function setDomain(string $domain = null) + private function setPublicSuffix(PublicSuffix $publicSuffix = null): PublicSuffix { - if (null === $domain) { - return null; - } - - if (false !== strpos($domain, '%')) { - $domain = rawurldecode($domain); + if (null === $publicSuffix + || null === $this->domain + || false === strpos($this->domain, '.') + || count($this->labels) === count($publicSuffix) + ) { + return new PublicSuffix(); } - return strtolower($domain); + return $publicSuffix; } /** - * Sets the public suffix domain part. - * - * @param PublicSuffix|null $publicSuffix + * assert the domain internal state is valid * - * @return PublicSuffix + * @throws Exception if the public suffix does not match the domain */ - private function setPublicSuffix(PublicSuffix $publicSuffix = null): PublicSuffix + protected function assertValidState() { - $publicSuffix = $publicSuffix ?? new PublicSuffix(); - if (null === $publicSuffix->getContent()) { - return $publicSuffix; - } - - if (null === $this->domain || false === strpos($this->domain, '.')) { - return new PublicSuffix(); + foreach ($this->publicSuffix as $offset => $label) { + if ($label !== $this->labels[$offset]) { + throw new Exception(sprintf('The submitted public suffix `%s` is invalid for the given domain `%s`', $this->publicSuffix->getContent(), $this->domain)); + } } - - return $publicSuffix; } /** * Computes the registrable domain part. - * - * @return string|null */ private function setRegistrableDomain() { @@ -129,9 +125,6 @@ private function setRegistrableDomain() $labels = explode('.', $this->domain); $countLabels = count($labels); $countPublicSuffixLabels = count($this->publicSuffix); - if ($countLabels === $countPublicSuffixLabels) { - return null; - } return implode('.', array_slice($labels, $countLabels - $countPublicSuffixLabels - 1)); } @@ -157,16 +150,30 @@ private function setSubDomain() return implode('.', array_slice($labels, 0, $countLabels - $countLabelsToRemove)); } + /** + * {@inheritdoc} + */ + public function getIterator() + { + foreach ($this->labels as $offset => $label) { + yield $label; + } + } + /** * {@inheritdoc} */ public function jsonSerialize() { - return array_merge([ + return [ 'domain' => $this->domain, 'registrableDomain' => $this->registrableDomain, 'subDomain' => $this->subDomain, - ], $this->publicSuffix->jsonSerialize()); + 'publicSuffix' => $this->publicSuffix->getContent(), + 'isKnown' => $this->isKnown(), + 'isICANN' => $this->isICANN(), + 'isPrivate' => $this->isPrivate(), + ]; } /** @@ -182,19 +189,11 @@ public function __debugInfo() */ public function count() { - if (null === $this->domain) { - return 0; - } - - return count(explode('.', $this->domain)); + return count($this->labels); } /** - * Returns the domain content. - * - * This method should return null on seriously malformed domain name - * - * @return string|null + * {@inheritdoc} */ public function getContent() { @@ -206,7 +205,7 @@ public function getContent() * * DEPRECATION WARNING! This method will be removed in the next major point release * - * @deprecated deprecated since version 5.3 + * @deprecated 5.3 deprecated * @see Domain::getContent * * This method should return null on seriously malformed domain name @@ -218,6 +217,26 @@ public function getDomain() return $this->getContent(); } + /** + * {@inheritdoc} + */ + public function getLabel(int $offset) + { + if ($offset < 0) { + $offset += count($this->labels); + } + + return $this->labels[$offset] ?? null; + } + + /** + * {@inheritdoc} + */ + public function keys(string $label): array + { + return array_keys($this->labels, $label, true); + } + /** * Returns the registrable domain. * @@ -258,7 +277,7 @@ public function getPublicSuffix() } /** - * Tells whether the public suffix has been matching rule in a Public Suffix List. + * Tells whether the public suffix has a matching rule in a Public Suffix List. * * @return bool */ @@ -288,45 +307,41 @@ public function isPrivate(): bool } /** - * Converts the domain to its IDNA ASCII form. - * - * This method MUST retain the state of the current instance, and return - * an instance with is content converted to its IDNA ASCII form - * - * @throws Exception if the domain can not be converted to ASCII using IDN UTS46 algorithm - * - * @return self + * {@inheritdoc} */ - public function toAscii(): self + public function toAscii() { - if (null === $this->domain || false !== strpos($this->domain, 'xn--')) { + static $pattern = '/[^\x20-\x7f]/'; + if (null === $this->domain || !preg_match($pattern, $this->domain)) { return $this; } - $newDomain = $this->idnToAscii($this->domain); - if ($newDomain === $this->domain) { - return $this; - } + $clone = clone $this; + $clone->domain = $this->idnToAscii($this->domain); + $clone->labels = array_reverse(explode('.', $clone->domain)); + $clone->publicSuffix = $this->publicSuffix->toAscii(); + $clone->registrableDomain = $clone->setRegistrableDomain(); + $clone->subDomain = $clone->setSubDomain(); - return new self($newDomain, $this->publicSuffix->toAscii()); + return $clone; } /** - * Converts the domain to its IDNA UTF8 form. - * - * This method MUST retain the state of the current instance, and return - * an instance with is content converted to its IDNA UTF8 form - * - * @throws Exception if the domain can not be converted to Unicode using IDN UTS46 algorithm - * - * @return self + * {@inheritdoc} */ - public function toUnicode(): self + public function toUnicode() { if (null === $this->domain || false === strpos($this->domain, 'xn--')) { return $this; } - return new self($this->idnToUnicode($this->domain), $this->publicSuffix->toUnicode()); + $clone = clone $this; + $clone->domain = $this->idnToUnicode($this->domain); + $clone->labels = array_reverse(explode('.', $clone->domain)); + $clone->publicSuffix = $this->publicSuffix->toUnicode(); + $clone->registrableDomain = $clone->setRegistrableDomain(); + $clone->subDomain = $clone->setSubDomain(); + + return $clone; } } diff --git a/src/DomainInterface.php b/src/DomainInterface.php new file mode 100644 index 00000000..f22dd5ba --- /dev/null +++ b/src/DomainInterface.php @@ -0,0 +1,84 @@ + + */ +interface DomainInterface extends Countable, IteratorAggregate +{ + /** + * Returns the domain content. + * + * @return string|null + */ + public function getContent(); + + /** + * Retrieves a single domain label. + * + * If $offset is non-negative, the returned value will be the label at $offset position. + * If $offset is negative, the returned value will be the label at $offset position from the end. + * + * If no label is found the submitted $offset the returned value will be null. + * + * @param int $offset the label offset + * + * @return string|null + */ + public function getLabel(int $offset); + + /** + * Returns the associated key for each label. + * + * If a value is specified only the keys associated with + * the given value will be returned + * + * @param string $label the total number of argument given to the method + * + * @return int[] + */ + public function keys(string $label): array; + + /** + * Converts the domain to its IDNA ASCII form. + * + * This method MUST retain the state of the current instance, and return + * an instance with its content converted to its IDNA ASCII form + * + * @throws Exception if the domain can not be converted to ASCII using IDN UTS46 algorithm + * + * @return static + */ + public function toAscii(); + + /** + * Converts the domain to its IDNA UTF8 form. + * + * This method MUST retain the state of the current instance, and return + * an instance with its content converted to its IDNA UTF8 form + * + * @throws Exception if the domain can not be converted to Unicode using IDN UTS46 algorithm + * + * @return static + */ + public function toUnicode(); +} diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index d4f5c981..241dbcb9 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -70,12 +70,7 @@ private static function getIdnErrors(int $error_bit): string */ private function idnToAscii(string $host): string { - if (false !== strpos($host, '%')) { - $host = rawurldecode($host); - } - - $host = strtolower($host); - static $pattern = '/[\pL]+/u'; + static $pattern = '/[^\x20-\x7f]/'; if (!preg_match($pattern, $host)) { return $host; } @@ -107,4 +102,60 @@ private function idnToUnicode(string $host): string throw new Exception(sprintf('The host `%s` is invalid : %s', $host, self::getIdnErrors($arr['errors']))); } + + /** + * Validate the given domain + * + * @param string|null $domain + * + * @return array + */ + private function setDomain(string $domain = null): array + { + if (null === $domain) { + return [$domain, []]; + } + + if ('' === $domain) { + return [$domain, ['']]; + } + + if (filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { + throw new Exception(sprintf('The domain `%s` is invalid: this is an IPv4 host', $domain)); + } + + $formatted_domain = strtolower(rawurldecode($domain)); + + // Note that unreserved is purposely missing . as it is used to separate labels. + static $reg_name = '/(?(DEFINE) + (?[a-z0-9_~\-]) + (?[!$&\'()*+,;=]) + (?%[A-F0-9]{2}) + (?(?:(?&unreserved)|(?&sub_delims)|(?&encoded)){1,63}) + ) + ^(?:(?®_name)\.){0,126}(?®_name)\.?$/ix'; + if (preg_match($reg_name, $formatted_domain)) { + return [$formatted_domain, array_reverse(explode('.', $formatted_domain))]; + } + + // a domain name can not contains URI delimiters or space + static $gen_delims = '/[:\/?#\[\]@ ]/'; + if (preg_match($gen_delims, $formatted_domain)) { + throw new Exception(sprintf('The domain `%s` is invalid: it contains invalid characters', $domain)); + } + + // if the domain name does not contains UTF-8 chars then it is malformed + static $pattern = '/[^\x20-\x7f]/'; + if (!preg_match($pattern, $formatted_domain)) { + throw new Exception(sprintf('The domain `%s` is invalid: the labels are malformed', $domain)); + } + + //if a domain name contains UTF-8 chars it must be convertible using IDNA UTS46 + idn_to_ascii($formatted_domain, 0, INTL_IDNA_VARIANT_UTS46, $arr); + if (0 === $arr['errors']) { + return [$formatted_domain, array_reverse(explode('.', $formatted_domain))]; + } + + throw new Exception(sprintf('The domain `%s` is invalid : %s', $domain, self::getIdnErrors($arr['errors']))); + } } diff --git a/src/Manager.php b/src/Manager.php index 119060e3..7e8b0f56 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -58,8 +58,7 @@ public function __construct(CacheInterface $cache, HttpClient $http) public function getRules(string $source_url = self::PSL_URL): Rules { $cacheKey = $this->getCacheKey($source_url); - $rules = $this->cache->get($cacheKey); - if (null !== $rules) { + if (null !== ($rules = $this->cache->get($cacheKey))) { return new Rules(json_decode($rules, true)); } @@ -67,9 +66,7 @@ public function getRules(string $source_url = self::PSL_URL): Rules throw new Exception(sprintf('Unable to load the public suffix list rules for %s', $source_url)); } - $rules = $this->cache->get($cacheKey); - - return new Rules(json_decode($rules, true)); + return new Rules(json_decode($this->cache->get($cacheKey), true)); } /** @@ -105,8 +102,6 @@ public function refreshRules(string $source_url = self::PSL_URL): bool return false; } - $cacheKey = $this->getCacheKey($source_url); - - return $this->cache->set($cacheKey, json_encode($rules)); + return $this->cache->set($this->getCacheKey($source_url), json_encode($rules)); } } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 57f8a446..13704f5a 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -11,7 +11,6 @@ namespace Pdp; -use Countable; use JsonSerializable; /** @@ -25,9 +24,9 @@ * it for this purpose, please do not bake static copies of the PSL into your * software with no update mechanism." * - * @author Ignace Nyamagana Butera + * @author Ignace Nyamagana Butera */ -final class PublicSuffix implements Countable, JsonSerializable +final class PublicSuffix implements DomainInterface, JsonSerializable { use IDNAConverterTrait; @@ -41,6 +40,11 @@ final class PublicSuffix implements Countable, JsonSerializable */ private $section; + /** + * @var string[] + */ + private $labels; + /** * {@inheritdoc} */ @@ -57,16 +61,34 @@ public static function __set_state(array $properties): self */ public function __construct(string $publicSuffix = null, string $section = '') { - if (false !== strpos((string) $publicSuffix, '%')) { - $publicSuffix = rawurldecode($publicSuffix); - } + list($this->publicSuffix, $this->labels) = $this->setDomain($publicSuffix); + $this->section = $this->setSection($section); + } - if (null !== $publicSuffix) { - $publicSuffix = strtolower($publicSuffix); + /** + * Set the public suffix section + * + * @param string $section + * + * @return string + */ + private function setSection(string $section): string + { + if ('' === $this->publicSuffix || null === $this->publicSuffix) { + return ''; } - $this->publicSuffix = $publicSuffix; - $this->section = $section; + return $section; + } + + /** + * {@inheritdoc} + */ + public function getIterator() + { + foreach ($this->labels as $offset => $label) { + yield $label; + } } /** @@ -75,7 +97,7 @@ public function __construct(string $publicSuffix = null, string $section = '') public function jsonSerialize() { return [ - 'publicSuffix' => $this->getContent(), + 'publicSuffix' => $this->publicSuffix, 'isKnown' => $this->isKnown(), 'isICANN' => $this->isICANN(), 'isPrivate' => $this->isPrivate(), @@ -95,23 +117,37 @@ public function __debugInfo() */ public function count() { - if (null === $this->publicSuffix) { - return 0; - } - - return count(explode('.', $this->publicSuffix)); + return count($this->labels); } /** - * Returns the public suffix content. - * - * @return string|null + * {@inheritdoc} */ public function getContent() { return $this->publicSuffix; } + /** + * {@inheritdoc} + */ + public function getLabel(int $offset) + { + if ($offset < 0) { + $offset += count($this->labels); + } + + return $this->labels[$offset] ?? null; + } + + /** + * {@inheritdoc} + */ + public function keys(string $label): array + { + return array_keys($this->labels, $label, true); + } + /** * Tells whether the public suffix has a matching rule in a Public Suffix List. * @@ -143,45 +179,35 @@ public function isPrivate(): bool } /** - * Converts the domain to its IDNA UTF8 form. - * - * This method MUST retain the state of the current instance, and return - * an instance with is content converted to its IDNA UTF8 form - * - * @throws Exception if the domain can not be converted to Unicode using IDN UTS46 algorithm - * - * @return self + * {@inheritdoc} */ - public function toUnicode(): self + public function toAscii() { - if (null === $this->publicSuffix || false === strpos($this->publicSuffix, 'xn--')) { + static $pattern = '/[^\x20-\x7f]/'; + if (null === $this->publicSuffix || !preg_match($pattern, $this->publicSuffix)) { return $this; } - return new self($this->idnToUnicode($this->publicSuffix), $this->section); + $clone = clone $this; + $clone->publicSuffix = $this->idnToAscii($this->publicSuffix); + $clone->labels = array_reverse(explode('.', $clone->publicSuffix)); + + return $clone; } /** - * Converts the domain to its IDNA ASCII form. - * - * This method MUST retain the state of the current instance, and return - * an instance with is content converted to its IDNA ASCII form - * - * @throws Exception if the domain can not be converted to ASCII using IDN UTS46 algorithm - * - * @return self + * {@inheritdoc} */ - public function toAscii(): self + public function toUnicode() { - if (null === $this->publicSuffix || false !== strpos($this->publicSuffix, 'xn--')) { + if (null === $this->publicSuffix || false === strpos($this->publicSuffix, 'xn--')) { return $this; } - $newPublicSuffix = $this->idnToAscii($this->publicSuffix); - if ($newPublicSuffix === $this->publicSuffix) { - return $this; - } + $clone = clone $this; + $clone->publicSuffix = $this->idnToUnicode($this->publicSuffix); + $clone->labels = array_reverse(explode('.', $clone->publicSuffix)); - return new self($newPublicSuffix, $this->section); + return $clone; } } diff --git a/src/Rules.php b/src/Rules.php index 8c721b87..80b618af 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -19,8 +19,6 @@ */ final class Rules { - use IDNAConverterTrait; - const ALL_DOMAINS = 'ALL_DOMAINS'; const ICANN_DOMAINS = 'ICANN_DOMAINS'; const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; @@ -78,7 +76,7 @@ public static function __set_state(array $properties): self } /** - * new instance. + * New instance. * * @param array $rules */ @@ -102,12 +100,12 @@ public function __construct(array $rules) */ public function getPublicSuffix(string $domain = null, string $section = self::ALL_DOMAINS): PublicSuffix { - if (null === $domain || !$this->isMatchable($domain)) { - throw new Exception(sprintf('The submitted domain `%s` is invalid or malformed', $domain)); - } $this->validateSection($section); + if (!$this->isMatchable($domainObj = new Domain($domain))) { + throw new Exception(sprintf('The domain `%s` can not contain a public suffix', $domain)); + } - return $this->findPublicSuffix($domain, $section); + return $this->findPublicSuffix($domainObj, $section); } /** @@ -121,31 +119,18 @@ public function getPublicSuffix(string $domain = null, string $section = self::A public function resolve(string $domain = null, string $section = self::ALL_DOMAINS): Domain { $this->validateSection($section); - if (null === $domain || !$this->isMatchable($domain)) { - return new Domain(); - } - try { - return new Domain($domain, $this->findPublicSuffix($domain, $section)); + $domain = new Domain($domain); + if (!$this->isMatchable($domain)) { + return $domain; + } + + return new Domain($domain->getContent(), $this->findPublicSuffix($domain, $section)); } catch (Exception $e) { - return new Domain($domain); + return new Domain(); } } - /** - * Tells whether the given domain can be resolved. - * - * @param string $domain - * - * @return bool - */ - private function isMatchable($domain): bool - { - return strpos($domain, '.') > 0 - && strlen($domain) === strcspn($domain, '][') - && !filter_var($domain, FILTER_VALIDATE_IP); - } - /** * Assert the section status. * @@ -167,23 +152,36 @@ private function validateSection(string $section) throw new Exception(sprintf('%s is an unknown Public Suffix List section', $section)); } + /** + * Tells whether the given domain can be resolved. + * + * @param DomainInterface $domain + * + * @return bool + */ + private function isMatchable(DomainInterface $domain): bool + { + return 1 < count($domain) + && 0 < strpos($domain->getContent(), '.'); + } + /** * Returns the matched public suffix. * - * @param string $domain - * @param string $section + * @param DomainInterface $domain + * @param string $section * * @return PublicSuffix */ - private function findPublicSuffix(string $domain, string $section): PublicSuffix + private function findPublicSuffix(DomainInterface $domain, string $section): PublicSuffix { - $reverseLabels = array_reverse(explode('.', $this->normalizeDomain($domain))); - $icann = $this->findPublicSuffixFromSection($reverseLabels, self::ICANN_DOMAINS); + $asciiDomain = $domain->toAscii(); + $icann = $this->findPublicSuffixFromSection($asciiDomain, self::ICANN_DOMAINS); if (self::ICANN_DOMAINS === $section) { return $this->normalizePublicSuffix($icann, $domain); } - $private = $this->findPublicSuffixFromSection($reverseLabels, self::PRIVATE_DOMAINS); + $private = $this->findPublicSuffixFromSection($asciiDomain, self::PRIVATE_DOMAINS); if (count($private) > count($icann)) { return $this->normalizePublicSuffix($private, $domain); } @@ -195,39 +193,19 @@ private function findPublicSuffix(string $domain, string $section): PublicSuffix return $this->normalizePublicSuffix(new PublicSuffix(), $domain); } - /** - * Normalizes a domain name. - * - * "The domain must be canonicalized in the normal way for hostnames - lower-case, Punycode." - * - * @see https://tools.ietf.org/html/rfc3492 - * - * @param string $domain - * - * @return string - */ - private function normalizeDomain(string $domain): string - { - try { - return $this->idnToAscii($domain); - } catch (Exception $e) { - return ''; - } - } - /** * Returns the public suffix matched against a given PSL section. * - * @param array $labels - * @param string $section + * @param DomainInterface $domain + * @param string $section * * @return PublicSuffix */ - private function findPublicSuffixFromSection(array $labels, string $section): PublicSuffix + private function findPublicSuffixFromSection(DomainInterface $domain, string $section): PublicSuffix { $rules = $this->rules[$section] ?? []; $matches = []; - foreach ($labels as $label) { + foreach ($domain as $label) { //match exception rule if (isset($rules[$label], $rules[$label]['!'])) { break; @@ -248,30 +226,28 @@ private function findPublicSuffixFromSection(array $labels, string $section): Pu $rules = $rules[$label]; } - $foundLabels = array_reverse(array_filter($matches, 'strlen')); - if (empty($foundLabels)) { + if (empty($matches)) { return new PublicSuffix(); } - return new PublicSuffix(implode('.', $foundLabels), $section); + return new PublicSuffix(implode('.', array_reverse($matches)), $section); } /** * Normalize the found Public Suffix against its domain name. * - * @param PublicSuffix $publicSuffix - * @param string $domain + * @param PublicSuffix $publicSuffix + * @param DomainInterface $domain * * @return PublicSuffix */ - private function normalizePublicSuffix(PublicSuffix $publicSuffix, string $domain): PublicSuffix + private function normalizePublicSuffix(PublicSuffix $publicSuffix, DomainInterface $domain): PublicSuffix { if (null === $publicSuffix->getContent()) { - $labels = explode('.', $domain); - $publicSuffix = new PublicSuffix($this->idnToAscii(array_pop($labels))); + $publicSuffix = new PublicSuffix($domain->getLabel(0)); } - if (false === strpos($domain, 'xn--')) { + if (false === strpos($domain->getContent() ?? '', 'xn--')) { return $publicSuffix->toUnicode(); } diff --git a/tests/CurlHttpClientTest.php b/tests/CurlHttpClientTest.php index 436b2701..6024f6ff 100644 --- a/tests/CurlHttpClientTest.php +++ b/tests/CurlHttpClientTest.php @@ -9,8 +9,15 @@ use Pdp\HttpClientException; use PHPUnit\Framework\TestCase; +/** + * @coversDefaultClass Pdp\CurlHttpClient + */ class CurlHttpClientTest extends TestCase { + /** + * @covers ::__construct + * @covers ::getContent + */ public function testGetContent() { $content = (new CurlHttpClient())->getContent('https://www.google.com'); @@ -18,12 +25,19 @@ public function testGetContent() $this->assertContains('google', $content); } + /** + * @covers ::__construct + * @covers ::getContent + */ public function testThrowsException() { $this->expectException(HttpClientException::class); (new CurlHttpClient())->getContent('https://qsfsdfqdf.dfsf'); } + /** + * @covers ::__construct + */ public function testConstructorThrowsException() { $this->expectException(Exception::class); diff --git a/tests/DomainTest.php b/tests/DomainTest.php index a1d0ae02..cd275aa9 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -7,65 +7,144 @@ use Pdp\Domain; use Pdp\Exception; use Pdp\PublicSuffix; -use Pdp\Rules; use PHPUnit\Framework\TestCase; +/** + * @coversDefaultClass Pdp\Domain + */ class DomainTest extends TestCase { /** * @dataProvider invalidRegistrableDomainProvider * - * @param string $domain - * @param string $publicSuffix + * @param string|null $domain + * @param string|null $publicSuffix + * + * @covers ::__construct + * @covers ::setPublicSuffix + * @covers ::setRegistrableDomain + * @covers ::setSubDomain + * @covers ::assertValidState + * @covers ::getPublicSuffix + * @covers ::getRegistrableDomain + * @covers ::getSubDomain */ - public function testRegistrableDomainIsNullWithFoundDomain(string $domain, $publicSuffix) + public function testRegistrableDomainIsNullWithFoundDomain($domain, $publicSuffix) { $domain = new Domain($domain, new PublicSuffix($publicSuffix)); + $this->assertNull($domain->getPublicSuffix()); $this->assertNull($domain->getRegistrableDomain()); $this->assertNull($domain->getSubDomain()); } - public function testToAsciiThrowsException() + public function invalidRegistrableDomainProvider() + { + return [ + 'domain and suffix are the same' => ['co.uk', 'co.uk'], + 'domain has no labels' => ['faketld', 'faketld'], + 'public suffix is null' => ['faketld', null], + 'domain is null' => [null, 'faketld'], + ]; + } + + /** + * @covers ::__construct + * @covers ::assertValidState + */ + public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain() { $this->expectException(Exception::class); - (new Domain('_b%C3%A9bé.be-'))->toAscii(); + new Domain('www.ulb.ac.be', new PublicSuffix('com')); } - public function testToUnicodeThrowsException() + /** + * @covers ::__construct + * @covers ::setDomain + * @covers ::getIdnErrors + */ + public function testToAsciiThrowsException() { $this->expectException(Exception::class); - (new Domain('xn--a-ecp.ru'))->toUnicode(); + new Domain('a⒈com'); } - public function invalidRegistrableDomainProvider() + /** + * @covers ::toUnicode + * @covers ::idnToUnicode + * @covers ::getIdnErrors + */ + public function testToUnicodeThrowsException() { - return [ - 'domain and suffix are the same' => ['co.uk', 'co.uk'], - 'domain has no labels' => ['faketld', 'faketld'], - 'public suffix is null' => ['faketld', null], - ]; + $this->expectException(Exception::class); + (new Domain('xn--a-ecp.ru'))->toUnicode(); } + /** + * @covers ::__construct + * @covers ::__set_state + * @covers ::__debugInfo + * @covers ::jsonSerialize + * @covers ::getIterator + */ public function testDomainInternalPhpMethod() { - $domain = new Domain('www.ulb.ac.be', new PublicSuffix('ac.be', Rules::ICANN_DOMAINS)); + $domain = new Domain('www.ulb.ac.be', new PublicSuffix('ac.be')); $generateDomain = eval('return '.var_export($domain, true).';'); $this->assertInternalType('array', $domain->__debugInfo()); $this->assertEquals($domain, $generateDomain); - $this->assertCount(4, $domain); + $this->assertSame(['be', 'ac', 'ulb', 'www'], iterator_to_array($domain)); + $this->assertJsonStringEqualsJsonString( + json_encode($domain->__debugInfo()), + json_encode($domain) + ); + } + + /** + * @dataProvider countableProvider + * @param string|null $domain + * @param int $nbLabels + * @param string[] $labels + * @covers ::getIterator + * @covers ::count + */ + public function testCountable($domain, $nbLabels, $labels) + { + $domain = new Domain($domain); + $this->assertCount($nbLabels, $domain); + $this->assertSame($labels, iterator_to_array($domain)); + } + + public function countableProvider() + { + return [ + 'null' => [null, 0, []], + 'empty string' => ['', 1, ['']], + 'simple' => ['foo.bar.baz', 3, ['baz', 'bar', 'foo']], + 'unicode' => ['www.食狮.公司.cn', 4, ['cn', '公司', '食狮', 'www']], + ]; } - public function testDomainWithNullLabels() + /** + * @covers ::getLabel + */ + public function testGetLabel() { - $this->assertCount(0, new Domain()); + $domain = new Domain('master.example.com'); + $this->assertSame('com', $domain->getLabel(0)); + $this->assertSame('example', $domain->getLabel(1)); + $this->assertSame('master', $domain->getLabel(-1)); + $this->assertNull($domain->getLabel(23)); + $this->assertNull($domain->getLabel(-23)); } - public function testPublicSuffixnternalPhpMethod() + /** + * @covers ::keys + */ + public function testOffsets() { - $publicSuffix = new PublicSuffix('co.uk', Rules::ICANN_DOMAINS); - $generatePublicSuffix = eval('return '.var_export($publicSuffix, true).';'); - $this->assertInternalType('array', $publicSuffix->__debugInfo()); - $this->assertEquals($publicSuffix, $generatePublicSuffix); + $domain = new Domain('master.com.example.com'); + $this->assertSame([0, 2], $domain->keys('com')); + $this->assertSame([], $domain->keys('toto')); } /** @@ -76,6 +155,18 @@ public function testPublicSuffixnternalPhpMethod() * @param null|string $expectedSuffix * @param null|string $expectedIDNDomain * @param null|string $expectedIDNSuffix + * + * @covers ::setDomain + * @covers ::setPublicSuffix + * @covers ::assertValidState + * @covers ::setRegistrableDomain + * @covers ::setSubDomain + * @covers ::getDomain + * @covers ::getContent + * @covers ::getPublicSuffix + * @covers ::idnToUnicode + * @covers ::toUnicode + * @covers \Pdp\PublicSuffix::toUnicode */ public function testToIDN( $domain, @@ -121,6 +212,14 @@ public function toUnicodeProvider() 'expectedIDNDomain' => 'www.食狮.公司.cn', 'expectedIDNSuffix' => '食狮.公司.cn', ], + 'empty string domain and null suffix' => [ + 'domain' => '', + 'publicSuffix' => null, + 'expectedDomain' => '', + 'expectedSuffix' => null, + 'expectedIDNDomain' => '', + 'expectedIDNSuffix' => null, + ], 'null domain and suffix' => [ 'domain' => null, 'publicSuffix' => null, @@ -137,6 +236,14 @@ public function toUnicodeProvider() 'expectedIDNDomain' => 'www.食狮.公司.cn', 'expectedIDNSuffix' => null, ], + 'domain with URLencoded data' => [ + 'domain' => 'b%C3%A9b%C3%A9.be', + 'publicSuffix' => 'be', + 'expectedDomain' => 'bébé.be', + 'expectedSuffix' => 'be', + 'expectedIDNDomain' => 'bébé.be', + 'expectedIDNSuffix' => 'be', + ], ]; } @@ -148,6 +255,18 @@ public function toUnicodeProvider() * @param null|string $expectedSuffix * @param null|string $expectedAsciiDomain * @param null|string $expectedAsciiSuffix + * + * @covers ::setDomain + * @covers ::setPublicSuffix + * @covers ::assertValidState + * @covers ::setRegistrableDomain + * @covers ::setSubDomain + * @covers ::getDomain + * @covers ::getContent + * @covers ::getPublicSuffix + * @covers ::idnToAscii + * @covers ::toAscii + * @covers \Pdp\PublicSuffix::toAscii */ public function testToAscii( $domain, diff --git a/tests/ManagerTest.php b/tests/ManagerTest.php index 0a552b47..18831a55 100644 --- a/tests/ManagerTest.php +++ b/tests/ManagerTest.php @@ -6,14 +6,17 @@ use org\bovigo\vfs\vfsStream; use Pdp\Cache; +use Pdp\Converter; use Pdp\CurlHttpClient; use Pdp\Exception; use Pdp\Manager; use PHPUnit\Framework\TestCase; +/** + * @coversDefaultClass Pdp\Manager + */ class ManagerTest extends TestCase { - protected $manager; protected $cachePool; protected $cacheDir; protected $root; @@ -25,35 +28,70 @@ public function setUp() vfsStream::create(['cache' => []], $this->root); $this->cacheDir = vfsStream::url('pdp/cache'); $this->cachePool = new Cache($this->cacheDir); - $this->manager = new Manager($this->cachePool, new CurlHttpClient()); } public function tearDown() { - $this->manager = null; $this->cachePool = null; $this->cacheDir = null; $this->root = null; } + /** + * @covers ::__construct + * @covers ::getRules + * @covers ::getCacheKey + * @covers ::refreshRules + * @covers \Pdp\Converter + */ public function testRefreshRules() { - $previous = $this->manager->getRules(); - $this->assertTrue($this->manager->refreshRules($this->sourceUrl)); - $this->assertEquals($previous, $this->manager->getRules()); + $manager = new Manager($this->cachePool, new CurlHttpClient()); + $previous = $manager->getRules(); + $this->assertTrue($manager->refreshRules($this->sourceUrl)); + $this->assertEquals($previous, $manager->getRules()); } + /** + * @covers ::__construct + * @covers ::getRules + * @covers ::getCacheKey + * @covers ::refreshRules + * @covers \Pdp\Converter + */ public function testRebuildRulesFromRemoveSource() { - $previous = $this->manager->getRules($this->sourceUrl); + $manager = new Manager($this->cachePool, new CurlHttpClient()); + $previous = $manager->getRules($this->sourceUrl); $this->cachePool->clear(); //delete all local cache - $list = $this->manager->getRules($this->sourceUrl); - $this->assertEquals($previous, $this->manager->getRules($this->sourceUrl)); + $list = $manager->getRules($this->sourceUrl); + $this->assertEquals($previous, $manager->getRules($this->sourceUrl)); } + /** + * @covers ::__construct + * @covers ::getRules + * @covers ::getCacheKey + * @covers ::refreshRules + * @covers \Pdp\Converter + */ public function testGetRulesThrowsException() { $this->expectException(Exception::class); - $this->manager->getRules('https://google.com'); + $manager = new Manager($this->cachePool, new CurlHttpClient()); + $manager->getRules('https://google.com'); + } + + /** + * @covers \Pdp\Converter::convert + * @covers \Pdp\Converter::getSection + * @covers \Pdp\Converter::addRule + * @covers \Pdp\Converter::idnToAscii + */ + public function testConvertThrowsExceptionWithInvalidContent() + { + $this->expectException(Exception::class); + $content = file_get_contents(__DIR__.'/data/invalid_suffix_list_content.dat'); + (new Converter())->convert($content); } } diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 71b26615..19eb5742 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -6,33 +6,131 @@ use Pdp\Exception; use Pdp\PublicSuffix; -use Pdp\Rules; use PHPUnit\Framework\TestCase; +/** + * @coversDefaultClass Pdp\PublicSuffix + */ class PublicSuffixTest extends TestCase { - public function testDomainInternalPhpMethod() + /** + * @covers ::__construct + * @covers ::__set_state + * @covers ::__debugInfo + * @covers ::jsonSerialize + * @covers ::getIterator + */ + public function testInternalPhpMethod() { - $publicSuffix = new PublicSuffix('ac.be', Rules::ICANN_DOMAINS); + $publicSuffix = new PublicSuffix('ac.be'); $generatePublicSuffix = eval('return '.var_export($publicSuffix, true).';'); $this->assertEquals($publicSuffix, $generatePublicSuffix); + $this->assertSame(['be', 'ac'], iterator_to_array($publicSuffix)); + $this->assertJsonStringEqualsJsonString( + json_encode($publicSuffix->__debugInfo()), + json_encode($publicSuffix) + ); } + /** + * @covers ::__construct + * @covers ::setDomain + * @covers ::setSection + * @covers ::getContent + * @covers ::toUnicode + */ public function testPSToUnicodeWithUrlEncode() { $this->assertSame('bébe', (new PublicSuffix('b%C3%A9be'))->toUnicode()->getContent()); } + /** + * @covers ::__construct + * @covers ::setDomain + * @covers ::idnToAscii + */ public function testPSToAsciiThrowsException() { $this->expectException(Exception::class); - (new PublicSuffix('_b%C3%A9bé.be-'))->toAscii(); + new PublicSuffix('a⒈com'); } + /** + * @covers ::toUnicode + * @covers ::idnToUnicode + */ + public function testToUnicodeThrowsException() + { + $this->expectException(Exception::class); + (new PublicSuffix('xn--a-ecp.ru'))->toUnicode(); + } + + /** + * @covers ::toAscii + * @covers ::toUnicode + * @covers ::idnToAscii + * @covers ::idnToUnicode + */ public function testConversionReturnsTheSameInstance() { - $instance = new PublicSuffix('ac.be', Rules::ICANN_DOMAINS); + $instance = new PublicSuffix('ac.be'); $this->assertSame($instance->toUnicode(), $instance); $this->assertSame($instance->toAscii(), $instance); } + + /** + * @covers ::toUnicode + * @covers ::idnToUnicode + */ + public function testToUnicodeReturnsSameInstance() + { + $instance = new PublicSuffix('食狮.公司.cn'); + $this->assertSame($instance->toUnicode(), $instance); + } + + /** + * @dataProvider countableProvider + * @param string|null $domain + * @param int $nbLabels + * @param string[] $labels + * @covers ::count + */ + public function testCountable($domain, $nbLabels, $labels) + { + $domain = new PublicSuffix($domain); + $this->assertCount($nbLabels, $domain); + $this->assertSame($labels, iterator_to_array($domain)); + } + + public function countableProvider() + { + return [ + 'null' => [null, 0, []], + 'empty string' => ['', 1, ['']], + 'simple' => ['foo.bar.baz', 3, ['baz', 'bar', 'foo']], + 'unicode' => ['www.食狮.公司.cn', 4, ['cn', '公司', '食狮', 'www']], + ]; + } + + /** + * @covers ::getLabel + */ + public function testGetLabel() + { + $domain = new PublicSuffix('master.example.com'); + $this->assertSame('com', $domain->getLabel(0)); + $this->assertSame('example', $domain->getLabel(1)); + $this->assertSame('master', $domain->getLabel(-1)); + $this->assertNull($domain->getLabel(23)); + $this->assertNull($domain->getLabel(-23)); + } + + /** + * @covers ::keys + */ + public function testOffsets() + { + $domain = new PublicSuffix('master.example.com'); + $this->assertSame([2], $domain->keys('master')); + } } diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 50c81699..43cde8df 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -12,6 +12,9 @@ use Pdp\Rules; use PHPUnit\Framework\TestCase; +/** + * @coversDefaultClass Pdp\Rules + */ class RulesTest extends TestCase { /** @@ -25,6 +28,11 @@ public function setUp() $this->rules = $manager->getRules(); } + /** + * @covers ::createFromPath + * @covers ::createFromString + * @covers ::__construct + */ public function testCreateFromPath() { $context = stream_context_create([ @@ -38,90 +46,171 @@ public function testCreateFromPath() $this->assertInstanceOf(Rules::class, $rules); } + /** + * @covers ::createFromPath + */ public function testCreateFromPathThrowsException() { $this->expectException(Exception::class); Rules::createFromPath('/foo/bar.dat'); } + /** + * @covers ::__set_state + * @covers ::__construct + */ public function testDomainInternalPhpMethod() { $generateRules = eval('return '.var_export($this->rules, true).';'); $this->assertEquals($this->rules, $generateRules); } + /** + * @covers ::resolve + * @covers ::validateSection + * @covers ::isMatchable + * @covers \Pdp\PublicSuffix::setSection + * @covers \Pdp\PublicSuffix::isKnown + * @covers \Pdp\Domain::isKnown + */ public function testNullWillReturnNullDomain() { $domain = $this->rules->resolve('COM'); $this->assertFalse($domain->isKnown()); } + /** + * @covers ::resolve + * @covers ::validateSection + */ public function testResolveThrowsExceptionOnWrongDomainType() { $this->expectException(Exception::class); $this->rules->resolve('www.example.com', 'foobar'); } + /** + * @covers ::resolve + * @covers ::validateSection + * @covers ::isMatchable + * @covers ::findPublicSuffix + * @covers ::findPublicSuffixFromSection + * @covers ::normalizePublicSuffix + * @covers \Pdp\PublicSuffix::setSection + * @covers \Pdp\PublicSuffix::isKnown + * @covers \Pdp\Domain::isKnown + */ public function testIsSuffixValidFalse() { $domain = $this->rules->resolve('www.example.faketld'); $this->assertFalse($domain->isKnown()); - $this->assertSame('www', $domain->getSubDomain()); } + /** + * @covers ::resolve + * @covers ::validateSection + * @covers ::isMatchable + * @covers ::findPublicSuffix + * @covers ::findPublicSuffixFromSection + * @covers ::normalizePublicSuffix + * @covers \Pdp\PublicSuffix::setSection + * @covers \Pdp\PublicSuffix::isKnown + * @covers \Pdp\PublicSuffix::isICANN + * @covers \Pdp\PublicSuffix::isPrivate + * @covers \Pdp\Domain::isKnown + * @covers \Pdp\Domain::isICANN + * @covers \Pdp\Domain::isPrivate + */ public function testIsSuffixValidTrue() { $domain = $this->rules->resolve('www.example.com', Rules::ICANN_DOMAINS); $this->assertTrue($domain->isKnown()); $this->assertTrue($domain->isICANN()); $this->assertFalse($domain->isPrivate()); - $this->assertSame('www', $domain->getSubDomain()); } + /** + * @covers ::resolve + * @covers ::validateSection + * @covers ::isMatchable + * @covers ::findPublicSuffix + * @covers ::findPublicSuffixFromSection + * @covers ::normalizePublicSuffix + * @covers \Pdp\PublicSuffix::setSection + * @covers \Pdp\PublicSuffix::isKnown + * @covers \Pdp\PublicSuffix::isICANN + * @covers \Pdp\PublicSuffix::isPrivate + * @covers \Pdp\Domain::isKnown + * @covers \Pdp\Domain::isICANN + * @covers \Pdp\Domain::isPrivate + */ public function testIsSuffixValidFalseWithPunycoded() { $domain = $this->rules->resolve('www.example.xn--85x722f'); $this->assertFalse($domain->isKnown()); $this->assertFalse($domain->isICANN()); $this->assertFalse($domain->isPrivate()); - $this->assertSame('xn--85x722f', $domain->getPublicSuffix()); - $this->assertSame('www', $domain->getSubDomain()); } - public function testSudDomainIsNull() + /** + * @covers ::resolve + * @covers ::validateSection + * @covers ::isMatchable + * @covers ::findPublicSuffix + * @covers ::findPublicSuffixFromSection + * @covers ::normalizePublicSuffix + * @covers \Pdp\PublicSuffix::setSection + * @covers \Pdp\PublicSuffix::isKnown + * @covers \Pdp\PublicSuffix::isICANN + * @covers \Pdp\PublicSuffix::isPrivate + * @covers \Pdp\Domain::isKnown + * @covers \Pdp\Domain::isICANN + * @covers \Pdp\Domain::isPrivate + */ + public function testSubDomainIsNull() { $domain = $this->rules->resolve('ulb.ac.be', Rules::ICANN_DOMAINS); $this->assertTrue($domain->isKnown()); $this->assertTrue($domain->isICANN()); $this->assertFalse($domain->isPrivate()); - $this->assertSame('ac.be', $domain->getPublicSuffix()); - $this->assertSame('ulb.ac.be', $domain->getRegistrableDomain()); - $this->assertNull($domain->getSubDomain()); } + /** + * @covers ::resolve + * @covers ::validateSection + * @covers \Pdp\Domain::setDomain + */ public function testWithInvalidDomainName() { $domain = $this->rules->resolve('_b%C3%A9bé.be-'); - $this->assertSame('_bébé.be-', $domain->getDomain()); - $this->assertFalse($domain->isKnown()); - $this->assertFalse($domain->isICANN()); - $this->assertFalse($domain->isPrivate()); - $this->assertNull($domain->getPublicSuffix()); - $this->assertNull($domain->getRegistrableDomain()); + $this->assertNull($domain->getContent()); } + /** + * @covers ::resolve + * @covers ::validateSection + * @covers ::findPublicSuffix + * @covers ::findPublicSuffixFromSection + * @covers ::normalizePublicSuffix + * @covers \Pdp\PublicSuffix::setSection + */ public function testWithPrivateDomain() { $domain = $this->rules->resolve('thephpleague.github.io'); - $this->assertSame('thephpleague.github.io', $domain->getDomain()); $this->assertTrue($domain->isKnown()); $this->assertFalse($domain->isICANN()); $this->assertTrue($domain->isPrivate()); $this->assertSame('github.io', $domain->getPublicSuffix()); - $this->assertSame('thephpleague.github.io', $domain->getRegistrableDomain()); - $this->assertNull($domain->getSubDomain()); } + /** + * @covers ::resolve + * @covers ::validateSection + * @covers ::findPublicSuffix + * @covers ::findPublicSuffixFromSection + * @covers ::normalizePublicSuffix + * @covers \Pdp\PublicSuffix::setSection + */ public function testWithPrivateDomainInvalid() { $domain = $this->rules->resolve('private.ulb.ac.be', Rules::PRIVATE_DOMAINS); @@ -130,10 +219,16 @@ public function testWithPrivateDomainInvalid() $this->assertFalse($domain->isICANN()); $this->assertFalse($domain->isPrivate()); $this->assertSame('be', $domain->getPublicSuffix()); - $this->assertSame('ac.be', $domain->getRegistrableDomain()); - $this->assertSame('private.ulb', $domain->getSubDomain()); } + /** + * @covers ::resolve + * @covers ::validateSection + * @covers ::findPublicSuffix + * @covers ::findPublicSuffixFromSection + * @covers ::normalizePublicSuffix + * @covers \Pdp\PublicSuffix::setSection + */ public function testWithPrivateDomainValid() { $domain = $this->rules->resolve('thephpleague.github.io', Rules::PRIVATE_DOMAINS); @@ -142,10 +237,16 @@ public function testWithPrivateDomainValid() $this->assertFalse($domain->isICANN()); $this->assertTrue($domain->isPrivate()); $this->assertSame('github.io', $domain->getPublicSuffix()); - $this->assertSame('thephpleague.github.io', $domain->getRegistrableDomain()); - $this->assertNull($domain->getSubDomain()); } + /** + * @covers ::resolve + * @covers ::validateSection + * @covers ::findPublicSuffix + * @covers ::findPublicSuffixFromSection + * @covers ::normalizePublicSuffix + * @covers \Pdp\PublicSuffix::setSection + */ public function testWithICANNDomainInvalid() { $domain = $this->rules->resolve('private.ulb.ac.be'); @@ -154,8 +255,6 @@ public function testWithICANNDomainInvalid() $this->assertTrue($domain->isICANN()); $this->assertFalse($domain->isPrivate()); $this->assertSame('ac.be', $domain->getPublicSuffix()); - $this->assertSame('ulb.ac.be', $domain->getRegistrableDomain()); - $this->assertSame('private', $domain->getSubDomain()); } /** @@ -164,6 +263,9 @@ public function testWithICANNDomainInvalid() * @param mixed $registrableDomain * @param mixed $domain * @param mixed $expectedDomain + * @covers ::resolve + * @covers \Pdp\Domain::setRegistrableDomain + * @covers \Pdp\Domain::getRegistrableDomain */ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) { @@ -176,6 +278,9 @@ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $dom * @param mixed $registrableDomain * @param mixed $domain * @param mixed $expectedDomain + * @covers ::resolve + * @covers \Pdp\Domain::setPublicSuffix + * @covers \Pdp\Domain::getPublicSuffix */ public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, $expectedDomain) { @@ -188,10 +293,13 @@ public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, * @param mixed $registrableDomain * @param mixed $domain * @param mixed $expectedDomain + * @covers ::resolve + * @covers \Pdp\Domain::setDomain + * @covers \Pdp\Domain::getContent */ public function testGetDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) { - $this->assertSame($expectedDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getDomain()); + $this->assertSame($expectedDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getContent()); } public function parseDataProvider() @@ -216,6 +324,7 @@ public function parseDataProvider() 'IP (5)' => [null, null, '[fe80::3%25eth0]', null], 'IP (6)' => [null, null, '[fe80::1%2511]', null], 'fake tld' => ['faketld', 'example.faketld', 'example.faketld', 'example.faketld'], + 'fake tld with space' => [null, null, 'fake.t ld', null], ]; } @@ -223,8 +332,13 @@ public function parseDataProvider() * @dataProvider invalidParseProvider * @param mixed $domain * @param mixed $section + * + * @covers ::getPublicSuffix + * @covers ::validateSection + * @covers \Pdp\Domain::setDomain + * @covers ::isMatchable */ - public function testDetermine($domain, $section) + public function testGetPublicSuffixThrowsException($domain, $section) { $this->expectException(Exception::class); $this->rules->getPublicSuffix($domain, $section); @@ -232,13 +346,26 @@ public function testDetermine($domain, $section) public function invalidParseProvider() { + $long_label = implode('.', array_fill(0, 62, 'a')); + return [ 'IPv6' => ['[::1]', Rules::ICANN_DOMAINS], 'IPv4' => ['192.168.1.2', Rules::ICANN_DOMAINS], 'single label host' => ['localhost', Rules::ICANN_DOMAINS], + 'multiple label with URI delimiter' => ['local.ho/st', Rules::ICANN_DOMAINS], + 'invalid host: label too long' => [implode('', array_fill(0, 64, 'a')).'.com', Rules::ICANN_DOMAINS], + 'invalid host: host too long' => ["$long_label.$long_label.$long_label. $long_label.$long_label", Rules::ICANN_DOMAINS], + 'invalid host: invalid label according to RFC3986' => ['www.fußball.com-', Rules::ICANN_DOMAINS], + 'invalid host: host contains space' => ['re view.com', Rules::ICANN_DOMAINS], ]; } + /** + * @covers ::getPublicSuffix + * @covers ::validateSection + * @covers ::isMatchable + * @covers \Pdp\PublicSuffix::setDomain + */ public function testPublicSuffixSection() { $expected = 'рф'; @@ -271,6 +398,10 @@ public function checkPublicSuffix($input, $expected) * * @see * http://mxr.mozilla.org/mozilla-central/source/netwerk/test/unit/data/test_psl.txt?raw=1 + * + * @covers ::resolve + * @covers ::findPublicSuffixFromSection + * @covers \Pdp\Domain::getRegistrableDomain */ public function testPublicSuffixSpec() { diff --git a/tests/data/invalid_suffix_list_content.dat b/tests/data/invalid_suffix_list_content.dat new file mode 100644 index 00000000..3312f098 --- /dev/null +++ b/tests/data/invalid_suffix_list_content.dat @@ -0,0 +1,10 @@ +// ===BEGIN ICANN DOMAINS=== +com +a⒈com +// ===END ICANN DOMAINS=== + +// ===BEGIN PRIVATE DOMAINS=== +github.io +githubusercontent.com +gitlab.io +// ===END PRIVATE DOMAINS=== From ca50d502ca6b799d35ad32c93d8ae400373c6f7d Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 9 Mar 2018 15:07:05 +0100 Subject: [PATCH 088/461] Improve docblock --- src/Domain.php | 2 +- src/IDNAConverterTrait.php | 37 +++++++++++++++++++++++-------------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 9a08e37c..76d1e6bb 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -108,7 +108,7 @@ protected function assertValidState() { foreach ($this->publicSuffix as $offset => $label) { if ($label !== $this->labels[$offset]) { - throw new Exception(sprintf('The submitted public suffix `%s` is invalid for the given domain `%s`', $this->publicSuffix->getContent(), $this->domain)); + throw new Exception(sprintf('The public suffix `%s` is invalid for the domain `%s`', $this->publicSuffix->getContent(), $this->domain)); } } } diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index 241dbcb9..67583c9f 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -12,7 +12,7 @@ namespace Pdp; /** - * A Wrapper around INTL IDNA function + * @internal Domain name validator * * @author Ignace Nyamagana Butera */ @@ -63,24 +63,25 @@ private static function getIdnErrors(int $error_bit): string * * This method returns the string converted to IDN ASCII form * - * @param string $host + * @param string $domain + * * @throws Exception if the string can not be converted to ASCII using IDN UTS46 algorithm * * @return string */ - private function idnToAscii(string $host): string + private function idnToAscii(string $domain): string { static $pattern = '/[^\x20-\x7f]/'; - if (!preg_match($pattern, $host)) { - return $host; + if (!preg_match($pattern, $domain)) { + return $domain; } - $output = idn_to_ascii($host, 0, INTL_IDNA_VARIANT_UTS46, $arr); + $output = idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46, $arr); if (!$arr['errors']) { return $output; } - throw new Exception(sprintf('The host `%s` is invalid : %s', $host, self::getIdnErrors($arr['errors']))); + throw new Exception(sprintf('The host `%s` is invalid : %s', $domain, self::getIdnErrors($arr['errors']))); } /** @@ -88,26 +89,34 @@ private function idnToAscii(string $host): string * * This method returns the string converted to IDN UNICODE form * - * @param string $host + * @param string $domain + * * @throws Exception if the string can not be converted to UNICODE using IDN UTS46 algorithm * * @return string */ - private function idnToUnicode(string $host): string + private function idnToUnicode(string $domain): string { - $output = idn_to_utf8($host, 0, INTL_IDNA_VARIANT_UTS46, $arr); + $output = idn_to_utf8($domain, 0, INTL_IDNA_VARIANT_UTS46, $arr); if (!$arr['errors']) { return $output; } - throw new Exception(sprintf('The host `%s` is invalid : %s', $host, self::getIdnErrors($arr['errors']))); + throw new Exception(sprintf('The host `%s` is invalid : %s', $domain, self::getIdnErrors($arr['errors']))); } /** - * Validate the given domain + * Filter and format the domain to ensure it is valid + * + * Returns an array containing the formatted domain name in lowercase + * with its associated labels in reverse order + * + * For example: setDomain('wWw.uLb.Ac.be') should return ['www.ulb.ac.be', ['be', 'ac', 'ulb', 'www']]; * * @param string|null $domain * + * @throws Exception If the domain is invalid + * * @return array */ private function setDomain(string $domain = null): array @@ -127,14 +136,14 @@ private function setDomain(string $domain = null): array $formatted_domain = strtolower(rawurldecode($domain)); // Note that unreserved is purposely missing . as it is used to separate labels. - static $reg_name = '/(?(DEFINE) + static $domain_name = '/(?(DEFINE) (?[a-z0-9_~\-]) (?[!$&\'()*+,;=]) (?%[A-F0-9]{2}) (?(?:(?&unreserved)|(?&sub_delims)|(?&encoded)){1,63}) ) ^(?:(?®_name)\.){0,126}(?®_name)\.?$/ix'; - if (preg_match($reg_name, $formatted_domain)) { + if (preg_match($domain_name, $formatted_domain)) { return [$formatted_domain, array_reverse(explode('.', $formatted_domain))]; } From 2fb624a2d1e923bcaf385425398a0858afdba322 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 9 Mar 2018 15:39:07 +0100 Subject: [PATCH 089/461] update documentation --- README.md | 88 +++++++++++++++++++++++++++---------------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index f8674d7c..9da4f9cc 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ Documentation ### Domain name resolution -The `Pdp\Rules` object is responsible for domain name resolution. +The `Pdp\Rules` object is responsible for public suffix resolution for a given domain. ~~~php resolve('www.Ulb.AC.be'); //using Rules::ALL_DOMAINS -$domain->getDomain(); //returns 'www.ulb.ac.be' +$domain->getContent(); //returns 'www.ulb.ac.be' $domain->getPublicSuffix(); //returns 'ac.be' $domain->getRegistrableDomain(); //returns 'ulb.ac.be' $domain->getSubDomain(); //returns 'www' +$domain->getLabel(0) //returns 'be' +$domain->getLabel(-1) //returns 'www' +$domain->keys('ulb') //returns [2] $domain->isKnown(); //returns true $domain->isICANN(); //returns true $domain->isPrivate(); //returns false +echo json_encode(iterator_to_array($domain), JSON_PRETTY_PRINT); +// returns +// [ +// 'be', +// 'ac', +// 'ulb', +// 'www' +// ] + echo json_encode($domain, JSON_PRETTY_PRINT); // returns // { @@ -166,16 +172,9 @@ echo json_encode($domain, JSON_PRETTY_PRINT); // } ~~~ -The `Pdp\Domain` getter methods returns: - -- the submitted domain name using `Pdp\Domain::getDomain` -- the public suffix part normalized according to the domain using `Pdp\Domain::getPublicSuffix` -- the registrable domain part using `Pdp\Domain::getRegistrableDomain` -- the subdomain part using `Pdp\Domain::getSubDomain`. +- All `Pdp\Domain` getter methods returns normalized and lowercased domain labels or `null` if no value was found for a particular domain part. -If the domain name or some of its part are seriously malformed or unrecognized, the getter methods will return `null`. - -**The Domain name status depends on the PSL section used to resolve it:** +**The domain public suffix status depends on the PSL section used to resolve it:** - `Pdp\Domain::isKnown` returns `true` if the public suffix is found in the selected PSL; - `Pdp\Domain::isICANN` returns `true` if the public suffix is found using a PSL which includes the ICANN DOMAINS section; @@ -186,26 +185,22 @@ The `Rules::getPublicSuffix` method expects the same arguments as `Rules::resolv ~~~php Be sure to adapt the following code to your own framework/situation. The following code is given as an example without warranty of it working out of the box.

+**Be sure to adapt the following code to your own framework/situation. The following code is given as an example without warranty of it working out of the box.** ~~~php getSubDomain(); //returns 'nl.shop' $domain->isKnown(); //returns false ~~~ +Changelog +------- + +Please see [CHANGELOG](CHANGELOG.md) for more information about what has been changed since version **5.0.0** was released. + Contributing ------- From 01a3780f4c3ed981f2c45bf48bb5d4f80aee53db Mon Sep 17 00:00:00 2001 From: peter279k Date: Sat, 17 Mar 2018 23:58:32 +0800 Subject: [PATCH 090/461] add more tests --- ...FULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- tests/CacheTest.php | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache index 1e4b1860..e348a6db 100644 --- a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache +++ b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache @@ -1 +1 @@ -s:105308:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"boots":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtpc":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"ca":{"1password":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"com":{"1password":[],"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"barsyonline":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"yolasite":[]},"eu":{"1password":[],"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"hepforge":[],"js":[],"mozilla-iot":[],"bmoattachments":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[]},"host":{"cloudaccess":[],"freesite":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[]},"pw":{"cloudns":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"cldmail":{"hb":[]},"net":[],"org":[],"pp":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[]},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]}},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"co":{"com":{"blogspot":[]},"nodum":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[]},"it":{"blogspot":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"bs":{"we":[]},"online":{"barsy":[]},"support":{"barsy":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[]},"ai":{"nom":[]},"gd":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"hn":{"nom":[]},"kz":{"nym":[]},"sx":{"nym":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"lc":{"oy":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"space":{"stackspace":[],"uber":[],"xs4all":[]},"farm":{"storj":[]},"mobi":{"dscloud":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file +s:105321:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"boots":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtpc":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"ca":{"1password":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"com":{"1password":[],"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"barsyonline":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"yolasite":[]},"eu":{"1password":[],"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"hepforge":[],"js":[],"mozilla-iot":[],"bmoattachments":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[]},"host":{"cloudaccess":[],"freesite":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[]},"pw":{"cloudns":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"cldmail":{"hb":[]},"net":[],"org":[],"pp":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[]},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]}},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"co":{"com":{"blogspot":[]},"nodum":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[]},"it":{"blogspot":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"bs":{"we":[]},"online":{"barsy":[]},"support":{"barsy":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[]},"ai":{"nom":[]},"gd":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"hn":{"nom":[]},"kz":{"nym":[]},"sx":{"nym":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"lc":{"oy":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"space":{"stackspace":[],"uber":[],"xs4all":[]},"farm":{"storj":[]},"mobi":{"dscloud":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file diff --git a/tests/CacheTest.php b/tests/CacheTest.php index 0e5bbb84..0e86f538 100644 --- a/tests/CacheTest.php +++ b/tests/CacheTest.php @@ -44,6 +44,24 @@ public function tearDown() $this->root = null; } + public function testConstructorOnEmptyCachePath() + { + $cache = new Cache(''); + $this->assertNull($cache->get('invalid_key')); + } + + public function testConstructorOnParentCachePathIsNotExisted() + { + $cache = new Cache(vfsStream::url('pdp/cache_not_exist')); + $this->assertNull($cache->get('invalid_key')); + } + + public function testSetOnNotWritableCachePath() + { + $cache = new Cache('/bin'); + $this->assertFalse($cache->set('key', 'value')); + } + /** * @dataProvider storableValuesProvider * From 4da6c1e1c99e945aa79f8ad14f807a0e5a7cb124 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 26 Mar 2018 14:29:23 +0200 Subject: [PATCH 091/461] Improve Manager user-input validation - New check is done on the JSON cache integrity before saving in the cache and on retrieving from the backend cache --- src/Manager.php | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/Manager.php b/src/Manager.php index 7e8b0f56..d693c84a 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -53,20 +53,26 @@ public function __construct(CacheInterface $cache, HttpClient $http) * * @param string $source_url the Public Suffix List URL * + * @throws Exception If the PSL can not be fetch from the source URL and its cache backend + * @throws Exception If the PSL cache copy is corrupted + * * @return Rules */ public function getRules(string $source_url = self::PSL_URL): Rules { $cacheKey = $this->getCacheKey($source_url); - if (null !== ($rules = $this->cache->get($cacheKey))) { - return new Rules(json_decode($rules, true)); - } + $rules = $this->cache->get($cacheKey); - if (!$this->refreshRules($source_url)) { + if (null === $rules && !$this->refreshRules($source_url)) { throw new Exception(sprintf('Unable to load the public suffix list rules for %s', $source_url)); } - return new Rules(json_decode($this->cache->get($cacheKey), true)); + $rules = json_decode($rules ?? $this->cache->get($cacheKey), true); + if (JSON_ERROR_NONE === json_last_error()) { + return new Rules($rules); + } + + throw new Exception('The public suffix list cache is corrupted: '.json_last_error_msg(), json_last_error()); } /** @@ -92,16 +98,18 @@ private function getCacheKey(string $str): string * * @param string $source_url the Public Suffix List URL * + * @throws If the PSL can not be converted to JSON format + * * @return bool */ public function refreshRules(string $source_url = self::PSL_URL): bool { $content = $this->http->getContent($source_url); - $rules = (new Converter())->convert($content); - if (empty($rules[Rules::ICANN_DOMAINS]) || empty($rules[Rules::PRIVATE_DOMAINS])) { - return false; + $rules = json_encode((new Converter())->convert($content)); + if (JSON_ERROR_NONE === json_last_error()) { + return $this->cache->set($this->getCacheKey($source_url), $rules); } - return $this->cache->set($this->getCacheKey($source_url), json_encode($rules)); + throw new Exception('The public suffix list JSON conversion failed: '.json_last_error_msg(), json_last_error()); } } From 500e06b3d4f226f3508aef29f01946cc9cd83f46 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 28 Mar 2018 21:50:12 +0200 Subject: [PATCH 092/461] Improve Converter and Manager - strtolower apply after Domain validation - improve Manager Test Suite --- src/Converter.php | 2 +- src/IDNAConverterTrait.php | 8 +-- src/Manager.php | 7 +-- tests/ManagerTest.php | 99 +++++++++++++++++++++++++++++++++++++- 4 files changed, 104 insertions(+), 12 deletions(-) diff --git a/src/Converter.php b/src/Converter.php index 1c97728d..4914bab9 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -104,7 +104,7 @@ private function addRule(array $list, array $rule_parts): array // "The domain and all rules must be canonicalized in the normal way // for hostnames - lower-case, Punycode (RFC 3492)." - $part = $this->idnToAscii(strtolower($part)); + $part = strtolower($this->idnToAscii($part)); $isDomain = true; if (0 === strpos($part, '!')) { $part = substr($part, 1); diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index 67583c9f..fb80a33d 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -133,7 +133,7 @@ private function setDomain(string $domain = null): array throw new Exception(sprintf('The domain `%s` is invalid: this is an IPv4 host', $domain)); } - $formatted_domain = strtolower(rawurldecode($domain)); + $formatted_domain = rawurldecode($domain); // Note that unreserved is purposely missing . as it is used to separate labels. static $domain_name = '/(?(DEFINE) @@ -144,7 +144,8 @@ private function setDomain(string $domain = null): array ) ^(?:(?®_name)\.){0,126}(?®_name)\.?$/ix'; if (preg_match($domain_name, $formatted_domain)) { - return [$formatted_domain, array_reverse(explode('.', $formatted_domain))]; + $domain = strtolower($formatted_domain); + return [$domain, array_reverse(explode('.', $domain))]; } // a domain name can not contains URI delimiters or space @@ -162,7 +163,8 @@ private function setDomain(string $domain = null): array //if a domain name contains UTF-8 chars it must be convertible using IDNA UTS46 idn_to_ascii($formatted_domain, 0, INTL_IDNA_VARIANT_UTS46, $arr); if (0 === $arr['errors']) { - return [$formatted_domain, array_reverse(explode('.', $formatted_domain))]; + $domain = strtolower($formatted_domain); + return [$domain, array_reverse(explode('.', $domain))]; } throw new Exception(sprintf('The domain `%s` is invalid : %s', $domain, self::getIdnErrors($arr['errors']))); diff --git a/src/Manager.php b/src/Manager.php index d693c84a..2863b277 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -98,18 +98,13 @@ private function getCacheKey(string $str): string * * @param string $source_url the Public Suffix List URL * - * @throws If the PSL can not be converted to JSON format - * * @return bool */ public function refreshRules(string $source_url = self::PSL_URL): bool { $content = $this->http->getContent($source_url); $rules = json_encode((new Converter())->convert($content)); - if (JSON_ERROR_NONE === json_last_error()) { - return $this->cache->set($this->getCacheKey($source_url), $rules); - } - throw new Exception('The public suffix list JSON conversion failed: '.json_last_error_msg(), json_last_error()); + return $this->cache->set($this->getCacheKey($source_url), $rules); } } diff --git a/tests/ManagerTest.php b/tests/ManagerTest.php index 18831a55..c55324ae 100644 --- a/tests/ManagerTest.php +++ b/tests/ManagerTest.php @@ -11,6 +11,7 @@ use Pdp\Exception; use Pdp\Manager; use PHPUnit\Framework\TestCase; +use Psr\SimpleCache\CacheInterface; /** * @coversDefaultClass Pdp\Manager @@ -75,13 +76,107 @@ public function testRebuildRulesFromRemoveSource() * @covers ::refreshRules * @covers \Pdp\Converter */ - public function testGetRulesThrowsException() + public function testGetRulesThrowsExceptionIfNotCacheCanBeRetrieveOrRefresh() { + $cachePool = new class() implements CacheInterface { + public function get($key, $default = null) + { + return null; + } + + public function set($key, $value, $ttl = null) + { + return false; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + $this->expectException(Exception::class); - $manager = new Manager($this->cachePool, new CurlHttpClient()); + $manager = new Manager($cachePool, new CurlHttpClient()); $manager->getRules('https://google.com'); } + + /** + * @covers ::__construct + * @covers ::getRules + */ + public function testGetRulesThrowsExceptionIfTheCacheIsCorrupted() + { + $cachePool = new class() implements CacheInterface { + public function get($key, $default = null) + { + return '{"foo":"bar",}'; //malformed json + } + + public function set($key, $value, $ttl = null) + { + return false; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + $this->expectException(Exception::class); + $manager = new Manager($cachePool, new CurlHttpClient()); + $manager->getRules(); + } + /** * @covers \Pdp\Converter::convert * @covers \Pdp\Converter::getSection From 082a198d3632bca4d59bbdc3e1dbe82ad05355e2 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 29 Mar 2018 10:18:20 +0200 Subject: [PATCH 093/461] Adding Domain::withPublicSuffix method - Improve Domain usage - Simplify public suffix detection - Reduce strtolower usage --- ...ULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- src/Converter.php | 2 +- src/Domain.php | 44 +++++++++++- src/IDNAConverterTrait.php | 10 +-- src/Rules.php | 48 ++++++------- tests/DomainTest.php | 72 +++++++++++++++++++ tests/RulesTest.php | 39 +++++++--- 7 files changed, 171 insertions(+), 46 deletions(-) diff --git a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache index e348a6db..e299cfb3 100644 --- a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache +++ b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache @@ -1 +1 @@ -s:105321:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"boots":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtpc":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"ca":{"1password":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"com":{"1password":[],"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"barsyonline":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"yolasite":[]},"eu":{"1password":[],"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"hepforge":[],"js":[],"mozilla-iot":[],"bmoattachments":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[]},"host":{"cloudaccess":[],"freesite":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[]},"pw":{"cloudns":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"cldmail":{"hb":[]},"net":[],"org":[],"pp":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[]},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]}},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"co":{"com":{"blogspot":[]},"nodum":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[]},"it":{"blogspot":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"bs":{"we":[]},"online":{"barsy":[]},"support":{"barsy":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[]},"ai":{"nom":[]},"gd":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"hn":{"nom":[]},"kz":{"nym":[]},"sx":{"nym":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"lc":{"oy":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"space":{"stackspace":[],"uber":[],"xs4all":[]},"farm":{"storj":[]},"mobi":{"dscloud":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file +s:105455:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"boots":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtpc":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"ca":{"1password":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"com":{"1password":[],"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"barsyonline":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"yolasite":[]},"eu":{"1password":[],"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"hepforge":[],"js":[],"mozilla-iot":[],"bmoattachments":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[]},"host":{"cloudaccess":[],"freesite":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[]},"pw":{"cloudns":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[]},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]}},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"co":{"com":{"blogspot":[]},"nodum":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[]},"it":{"blogspot":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"bs":{"we":[]},"online":{"barsy":[]},"support":{"barsy":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[]},"ai":{"nom":[]},"gd":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"hn":{"nom":[]},"kz":{"nym":[]},"sx":{"nym":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"lc":{"oy":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"space":{"stackspace":[],"uber":[],"xs4all":[]},"farm":{"storj":[]},"mobi":{"dscloud":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file diff --git a/src/Converter.php b/src/Converter.php index 4914bab9..fcebf700 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -104,7 +104,7 @@ private function addRule(array $list, array $rule_parts): array // "The domain and all rules must be canonicalized in the normal way // for hostnames - lower-case, Punycode (RFC 3492)." - $part = strtolower($this->idnToAscii($part)); + $part = $this->idnToAscii($part); $isDomain = true; if (0 === strpos($part, '!')) { $part = substr($part, 1); diff --git a/src/Domain.php b/src/Domain.php index 76d1e6bb..5fb0ef15 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -309,7 +309,7 @@ public function isPrivate(): bool /** * {@inheritdoc} */ - public function toAscii() + public function toAscii(): self { static $pattern = '/[^\x20-\x7f]/'; if (null === $this->domain || !preg_match($pattern, $this->domain)) { @@ -329,7 +329,7 @@ public function toAscii() /** * {@inheritdoc} */ - public function toUnicode() + public function toUnicode(): self { if (null === $this->domain || false === strpos($this->domain, 'xn--')) { return $this; @@ -344,4 +344,44 @@ public function toUnicode() return $clone; } + + public function withPublicSuffix(PublicSuffix $publicSuffix): self + { + if ($this->publicSuffix == $publicSuffix) { + return $this; + } + + if (null === $publicSuffix->getContent()) { + $clone = clone $this; + $clone->publicSuffix = $publicSuffix; + $clone->registrableDomain = $clone->setRegistrableDomain(); + $clone->subDomain = $clone->setSubDomain(); + + return $clone; + } + + static $pattern = '/[^\x20-\x7f]/'; + if (preg_match($pattern, $this->domain)) { + $publicSuffix = $publicSuffix->toUnicode(); + } + + if (null === $this->domain || false === strpos($this->domain, '.') || $this->domain === $publicSuffix->getContent()) { + throw new Exception(sprintf('The domain `%s` can not contain a public suffix', $this->domain)); + } + + if ($publicSuffix->getContent() !== substr($this->domain, - strlen($publicSuffix->getContent()))) { + throw new Exception(sprintf( + 'the public suffix `%s` can not be assign to the domain name `%s`', + $publicSuffix->getContent(), + $this->domain + )); + } + + $clone = clone $this; + $clone->publicSuffix = $publicSuffix; + $clone->registrableDomain = $clone->setRegistrableDomain(); + $clone->subDomain = $clone->setSubDomain(); + + return $clone; + } } diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index fb80a33d..dd6dc23b 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -73,7 +73,7 @@ private function idnToAscii(string $domain): string { static $pattern = '/[^\x20-\x7f]/'; if (!preg_match($pattern, $domain)) { - return $domain; + return strtolower($domain); } $output = idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46, $arr); @@ -145,6 +145,7 @@ private function setDomain(string $domain = null): array ^(?:(?®_name)\.){0,126}(?®_name)\.?$/ix'; if (preg_match($domain_name, $formatted_domain)) { $domain = strtolower($formatted_domain); + return [$domain, array_reverse(explode('.', $domain))]; } @@ -161,10 +162,11 @@ private function setDomain(string $domain = null): array } //if a domain name contains UTF-8 chars it must be convertible using IDNA UTS46 - idn_to_ascii($formatted_domain, 0, INTL_IDNA_VARIANT_UTS46, $arr); + $ascii_domain = idn_to_ascii($formatted_domain, 0, INTL_IDNA_VARIANT_UTS46, $arr); if (0 === $arr['errors']) { - $domain = strtolower($formatted_domain); - return [$domain, array_reverse(explode('.', $domain))]; + $idn_domain = $this->idnToUnicode($ascii_domain); + + return [$idn_domain, array_reverse(explode('.', $idn_domain))]; } throw new Exception(sprintf('The domain `%s` is invalid : %s', $domain, self::getIdnErrors($arr['errors']))); diff --git a/src/Rules.php b/src/Rules.php index 80b618af..fa11bf2f 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -105,7 +105,17 @@ public function getPublicSuffix(string $domain = null, string $section = self::A throw new Exception(sprintf('The domain `%s` can not contain a public suffix', $domain)); } - return $this->findPublicSuffix($domainObj, $section); + $publicSuffix = $this->findPublicSuffix($domainObj, $section); + if (null === $publicSuffix->getContent()) { + $publicSuffix = new PublicSuffix($domainObj->getLabel(0)); + } + + static $pattern = '/[^\x20-\x7f]/'; + if (preg_match($pattern, $domainObj->getContent())) { + return $publicSuffix->toUnicode(); + } + + return $publicSuffix; } /** @@ -125,7 +135,12 @@ public function resolve(string $domain = null, string $section = self::ALL_DOMAI return $domain; } - return new Domain($domain->getContent(), $this->findPublicSuffix($domain, $section)); + $publicSuffix = $this->findPublicSuffix($domain, $section); + if (null === $publicSuffix->getContent()) { + $publicSuffix = new PublicSuffix($domain->getLabel(0)); + } + + return $domain->withPublicSuffix($publicSuffix); } catch (Exception $e) { return new Domain(); } @@ -178,19 +193,19 @@ private function findPublicSuffix(DomainInterface $domain, string $section): Pub $asciiDomain = $domain->toAscii(); $icann = $this->findPublicSuffixFromSection($asciiDomain, self::ICANN_DOMAINS); if (self::ICANN_DOMAINS === $section) { - return $this->normalizePublicSuffix($icann, $domain); + return $icann; } $private = $this->findPublicSuffixFromSection($asciiDomain, self::PRIVATE_DOMAINS); if (count($private) > count($icann)) { - return $this->normalizePublicSuffix($private, $domain); + return $private; } if (self::ALL_DOMAINS === $section) { - return $this->normalizePublicSuffix($icann, $domain); + return $icann; } - return $this->normalizePublicSuffix(new PublicSuffix(), $domain); + return new PublicSuffix(); } /** @@ -232,25 +247,4 @@ private function findPublicSuffixFromSection(DomainInterface $domain, string $se return new PublicSuffix(implode('.', array_reverse($matches)), $section); } - - /** - * Normalize the found Public Suffix against its domain name. - * - * @param PublicSuffix $publicSuffix - * @param DomainInterface $domain - * - * @return PublicSuffix - */ - private function normalizePublicSuffix(PublicSuffix $publicSuffix, DomainInterface $domain): PublicSuffix - { - if (null === $publicSuffix->getContent()) { - $publicSuffix = new PublicSuffix($domain->getLabel(0)); - } - - if (false === strpos($domain->getContent() ?? '', 'xn--')) { - return $publicSuffix->toUnicode(); - } - - return $publicSuffix; - } } diff --git a/tests/DomainTest.php b/tests/DomainTest.php index cd275aa9..1216d616 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -7,6 +7,7 @@ use Pdp\Domain; use Pdp\Exception; use Pdp\PublicSuffix; +use Pdp\Rules; use PHPUnit\Framework\TestCase; /** @@ -330,4 +331,75 @@ public function toAsciiProvider() ], ]; } + + /** + * @param Domain $domain + * @param PublicSuffix $publicSuffix + * @param string|null $expected + * + * @covers ::withPublicSuffix + * @dataProvider withPublicSuffixWorksProvider + */ + public function testWithPublicSuffixWorks(Domain $domain, PublicSuffix $publicSuffix, $expected) + { + $this->assertSame($expected, $domain->withPublicSuffix($publicSuffix)->getPublicSuffix()); + } + + public function withPublicSuffixWorksProvider() + { + $publicSuffix = new PublicSuffix('ac.be', Rules::ICANN_DOMAINS); + $domain = new Domain('ulb.ac.be', $publicSuffix); + + return [ + 'null public suffix' => [ + 'domain' => $domain, + 'public suffix' => new PublicSuffix(), + 'expected' => null, + ], + 'same public suffix' => [ + 'domain' => $domain, + 'public suffix' => $publicSuffix, + 'expected' => 'ac.be', + ], + 'update public suffix' => [ + 'domain' => $domain, + 'public suffix' => new PublicSuffix('be', Rules::ICANN_DOMAINS), + 'expected' => 'be', + ], + ]; + } + + /** + * @param Domain $domain + * @param PublicSuffix $publicSuffix + * + * @covers ::withPublicSuffix + * @dataProvider withPublicSuffixFailsProvider + */ + public function testWithPublicSuffixFails(Domain $domain, PublicSuffix $publicSuffix) + { + $this->expectException(Exception::class); + $domain->withPublicSuffix($publicSuffix); + } + + public function withPublicSuffixFailsProvider() + { + $publicSuffix = new PublicSuffix('ac.be', Rules::ICANN_DOMAINS); + $domain = new Domain('ulb.ac.be', $publicSuffix); + + return [ + 'public suffix mismatch' => [ + 'domain' => $domain, + 'public suffix' => new PublicSuffix('ac.fr'), + ], + 'domain name can not contains public suffix' => [ + 'domain' => new Domain('localhost'), + 'public suffix' => $publicSuffix, + ], + 'domain name is equal to public suffix' => [ + 'domain' => new Domain('ac.be'), + 'public suffix' => $publicSuffix, + ], + ]; + } } diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 43cde8df..ac576a4a 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -95,7 +95,6 @@ public function testResolveThrowsExceptionOnWrongDomainType() * @covers ::isMatchable * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection - * @covers ::normalizePublicSuffix * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\Domain::isKnown @@ -112,11 +111,11 @@ public function testIsSuffixValidFalse() * @covers ::isMatchable * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection - * @covers ::normalizePublicSuffix * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\PublicSuffix::isICANN * @covers \Pdp\PublicSuffix::isPrivate + * @covers \Pdp\Domain::withPublicSuffix * @covers \Pdp\Domain::isKnown * @covers \Pdp\Domain::isICANN * @covers \Pdp\Domain::isPrivate @@ -135,11 +134,11 @@ public function testIsSuffixValidTrue() * @covers ::isMatchable * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection - * @covers ::normalizePublicSuffix * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\PublicSuffix::isICANN * @covers \Pdp\PublicSuffix::isPrivate + * @covers \Pdp\Domain::withPublicSuffix * @covers \Pdp\Domain::isKnown * @covers \Pdp\Domain::isICANN * @covers \Pdp\Domain::isPrivate @@ -158,11 +157,11 @@ public function testIsSuffixValidFalseWithPunycoded() * @covers ::isMatchable * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection - * @covers ::normalizePublicSuffix * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\PublicSuffix::isICANN * @covers \Pdp\PublicSuffix::isPrivate + * @covers \Pdp\Domain::withPublicSuffix * @covers \Pdp\Domain::isKnown * @covers \Pdp\Domain::isICANN * @covers \Pdp\Domain::isPrivate @@ -191,7 +190,6 @@ public function testWithInvalidDomainName() * @covers ::validateSection * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection - * @covers ::normalizePublicSuffix * @covers \Pdp\PublicSuffix::setSection */ public function testWithPrivateDomain() @@ -208,7 +206,6 @@ public function testWithPrivateDomain() * @covers ::validateSection * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection - * @covers ::normalizePublicSuffix * @covers \Pdp\PublicSuffix::setSection */ public function testWithPrivateDomainInvalid() @@ -226,7 +223,6 @@ public function testWithPrivateDomainInvalid() * @covers ::validateSection * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection - * @covers ::normalizePublicSuffix * @covers \Pdp\PublicSuffix::setSection */ public function testWithPrivateDomainValid() @@ -244,7 +240,6 @@ public function testWithPrivateDomainValid() * @covers ::validateSection * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection - * @covers ::normalizePublicSuffix * @covers \Pdp\PublicSuffix::setSection */ public function testWithICANNDomainInvalid() @@ -294,6 +289,7 @@ public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, * @param mixed $domain * @param mixed $expectedDomain * @covers ::resolve + * @covers \Pdp\Domain::withPublicSuffix * @covers \Pdp\Domain::setDomain * @covers \Pdp\Domain::getContent */ @@ -365,15 +361,35 @@ public function invalidParseProvider() * @covers ::validateSection * @covers ::isMatchable * @covers \Pdp\PublicSuffix::setDomain + * @dataProvider validPublicSectionProvider + * + * @param string|null $domain + * @param string|null $expected */ - public function testPublicSuffixSection() + public function testPublicSuffixSection($domain, $expected) { - $expected = 'рф'; - $domain = 'Яндекс.РФ'; $publicSuffix = $this->rules->getPublicSuffix($domain); $this->assertSame($expected, $publicSuffix->getContent()); } + public function validPublicSectionProvider() + { + return [ + 'idn domain' => [ + 'domain' => 'Яндекс.РФ', + 'expected' => 'рф', + ], + 'ascii domain' => [ + 'domain' => 'ulb.ac.be', + 'expected' => 'ac.be', + ], + 'unknown tld' => [ + 'domain' => 'yours.truly.faketld', + 'expected' => 'faketld', + ], + ]; + } + /** * This is my version of the checkPublicSuffix function referred to in the * test instructions at the Public Suffix List project. @@ -401,6 +417,7 @@ public function checkPublicSuffix($input, $expected) * * @covers ::resolve * @covers ::findPublicSuffixFromSection + * @covers \Pdp\Domain::withPublicSuffix * @covers \Pdp\Domain::getRegistrableDomain */ public function testPublicSuffixSpec() From f94da6b8d663701f3375cb709cc238f71958182e Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 29 Mar 2018 11:21:05 +0200 Subject: [PATCH 094/461] Improve added features --- CHANGELOG.md | 1 + README.md | 3 ++- src/Domain.php | 39 +++++++++++++++++++++++---------------- src/PublicSuffix.php | 8 ++++---- tests/DomainTest.php | 21 +++++++++++++++++++++ 5 files changed, 51 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad9404dc..e9a48f37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\DomainInterface` interface implemented by `Pdp\Domain` and `Pdp\PublicSuffix` - `Pdp\Domain::getContent` returns the Domain name value replaces `Pdp\Domain::getDomain` - `Pdp\Domain` implements the `Countable` interface. +- `Pdp\Domain::withPublicSuffix` returns a new Domain object with a different Public Suffix ### Fixed diff --git a/README.md b/README.md index 9da4f9cc..04ad9de5 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ The `Pdp\Domain` implements the `Pdp\DomainInterface` interface DomainInterface extends Countable, IteratorAggregate { public function getContent(): ?string - public function getLabel(int $offset): ?string + public function getLabel(int $key): ?string public function keys(string $label): int[] public function toUnicode(): static; public function toAscii(): static; @@ -110,6 +110,7 @@ final class Domain implements DomainInterface, JsonSerializable public function isKnown(): bool; public function isICANN(): bool; public function isPrivate(): bool; + public function withPublicSuffix(PublicSuffix $publicSuffix): self; } ~~~ diff --git a/src/Domain.php b/src/Domain.php index 5fb0ef15..9d9981db 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -220,13 +220,13 @@ public function getDomain() /** * {@inheritdoc} */ - public function getLabel(int $offset) + public function getLabel(int $key) { - if ($offset < 0) { - $offset += count($this->labels); + if ($key < 0) { + $key += count($this->labels); } - return $this->labels[$offset] ?? null; + return $this->labels[$key] ?? null; } /** @@ -309,7 +309,7 @@ public function isPrivate(): bool /** * {@inheritdoc} */ - public function toAscii(): self + public function toAscii() { static $pattern = '/[^\x20-\x7f]/'; if (null === $this->domain || !preg_match($pattern, $this->domain)) { @@ -329,7 +329,7 @@ public function toAscii(): self /** * {@inheritdoc} */ - public function toUnicode(): self + public function toUnicode() { if (null === $this->domain || false === strpos($this->domain, 'xn--')) { return $this; @@ -345,6 +345,16 @@ public function toUnicode(): self return $clone; } + /** + * Returns a new domain name with a different public suffix. + * + * @param PublicSuffix $publicSuffix + * + * @throws Exception if the domain can not contain a public suffix + * @throws Exception if the public suffix can not be assign to the domain name + * + * @return self + */ public function withPublicSuffix(PublicSuffix $publicSuffix): self { if ($this->publicSuffix == $publicSuffix) { @@ -360,21 +370,18 @@ public function withPublicSuffix(PublicSuffix $publicSuffix): self return $clone; } + if (null === $this->domain || false === strpos($this->domain, '.')) { + throw new Exception(sprintf('The domain `%s` can not contain a public suffix', $this->domain)); + } + static $pattern = '/[^\x20-\x7f]/'; if (preg_match($pattern, $this->domain)) { $publicSuffix = $publicSuffix->toUnicode(); } - if (null === $this->domain || false === strpos($this->domain, '.') || $this->domain === $publicSuffix->getContent()) { - throw new Exception(sprintf('The domain `%s` can not contain a public suffix', $this->domain)); - } - - if ($publicSuffix->getContent() !== substr($this->domain, - strlen($publicSuffix->getContent()))) { - throw new Exception(sprintf( - 'the public suffix `%s` can not be assign to the domain name `%s`', - $publicSuffix->getContent(), - $this->domain - )); + $publicSuffixContent = $publicSuffix->getContent(); + if ($this->domain === $publicSuffixContent || $publicSuffixContent !== substr($this->domain, - strlen($publicSuffixContent))) { + throw new Exception(sprintf('the public suffix `%s` can not be assign to the domain name `%s`', $publicSuffixContent, $this->domain)); } $clone = clone $this; diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 13704f5a..bea2e16d 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -131,13 +131,13 @@ public function getContent() /** * {@inheritdoc} */ - public function getLabel(int $offset) + public function getLabel(int $key) { - if ($offset < 0) { - $offset += count($this->labels); + if ($key < 0) { + $key += count($this->labels); } - return $this->labels[$offset] ?? null; + return $this->labels[$key] ?? null; } /** diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 1216d616..7bfce466 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -366,6 +366,16 @@ public function withPublicSuffixWorksProvider() 'public suffix' => new PublicSuffix('be', Rules::ICANN_DOMAINS), 'expected' => 'be', ], + 'idn domain name' => [ + 'domain' => new Domain('Яндекс.РФ', new PublicSuffix('рф', Rules::ICANN_DOMAINS)), + 'public suffix' => new PublicSuffix('рф', Rules::ICANN_DOMAINS), + 'expected' => 'рф', + ], + 'idn domain name with ascii public suffix' => [ + 'domain' => new Domain('Яндекс.РФ', new PublicSuffix('рф', Rules::ICANN_DOMAINS)), + 'public suffix' => new PublicSuffix('xn--p1ai', Rules::ICANN_DOMAINS), + 'expected' => 'рф', + ], ]; } @@ -402,4 +412,15 @@ public function withPublicSuffixFailsProvider() ], ]; } + + /** + * @covers ::withPublicSuffix + */ + public function testWithPublicSuffixReturnsInstance() + { + $publicSuffix = new PublicSuffix('ac.be', Rules::ICANN_DOMAINS); + $domain = new Domain('ulb.ac.be', $publicSuffix); + $this->assertSame($domain, $domain->withPublicSuffix($publicSuffix)); + $this->assertNotSame($domain, $domain->withPublicSuffix(new PublicSuffix('ac.be', Rules::PRIVATE_DOMAINS))); + } } From 8489bd2bc9926333e9373bcfbda0f78a425fea72 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 29 Mar 2018 12:05:13 +0200 Subject: [PATCH 095/461] improve Domain::withPublicSuffix --- src/Domain.php | 2 +- src/Manager.php | 16 ++++++++++------ src/Rules.php | 6 +++++- tests/DomainTest.php | 4 ++++ 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 9d9981db..54c9a3bc 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -380,7 +380,7 @@ public function withPublicSuffix(PublicSuffix $publicSuffix): self } $publicSuffixContent = $publicSuffix->getContent(); - if ($this->domain === $publicSuffixContent || $publicSuffixContent !== substr($this->domain, - strlen($publicSuffixContent))) { + if ($this->domain === $publicSuffixContent || '.'.$publicSuffixContent !== substr($this->domain, - strlen($publicSuffixContent) - 1)) { throw new Exception(sprintf('the public suffix `%s` can not be assign to the domain name `%s`', $publicSuffixContent, $this->domain)); } diff --git a/src/Manager.php b/src/Manager.php index 2863b277..a1584b44 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -61,13 +61,13 @@ public function __construct(CacheInterface $cache, HttpClient $http) public function getRules(string $source_url = self::PSL_URL): Rules { $cacheKey = $this->getCacheKey($source_url); - $rules = $this->cache->get($cacheKey); + $cacheRules = $this->cache->get($cacheKey); - if (null === $rules && !$this->refreshRules($source_url)) { + if (null === $cacheRules && !$this->refreshRules($source_url)) { throw new Exception(sprintf('Unable to load the public suffix list rules for %s', $source_url)); } - $rules = json_decode($rules ?? $this->cache->get($cacheKey), true); + $rules = json_decode($cacheRules ?? $this->cache->get($cacheKey), true); if (JSON_ERROR_NONE === json_last_error()) { return new Rules($rules); } @@ -102,9 +102,13 @@ private function getCacheKey(string $str): string */ public function refreshRules(string $source_url = self::PSL_URL): bool { - $content = $this->http->getContent($source_url); - $rules = json_encode((new Converter())->convert($content)); + static $converter; - return $this->cache->set($this->getCacheKey($source_url), $rules); + $converter = $converter ?? new Converter(); + + return $this->cache->set( + $this->getCacheKey($source_url), + json_encode($converter->convert($this->http->getContent($source_url))) + ); } } diff --git a/src/Rules.php b/src/Rules.php index fa11bf2f..f7ef8e8e 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -64,7 +64,11 @@ public static function createFromPath(string $path, $context = null): self */ public static function createFromString(string $content): self { - return new self((new Converter())->convert($content)); + static $converter; + + $converter = $converter ?? new Converter(); + + return new self($converter->convert($content)); } /** diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 7bfce466..dd59cceb 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -410,6 +410,10 @@ public function withPublicSuffixFailsProvider() 'domain' => new Domain('ac.be'), 'public suffix' => $publicSuffix, ], + 'partial public suffix' => [ + 'domain' => $domain, + 'public suffix' => new PublicSuffix('c.be'), + ], ]; } From 7e42d27517a0d01bea670856e66f869da3963720 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 29 Mar 2018 13:03:20 +0200 Subject: [PATCH 096/461] Improve PublicSuffix validation in the Domain object --- composer.json | 2 +- phpstan.src.neon | 6 +--- src/Domain.php | 75 +++++++++++++++----------------------------- tests/DomainTest.php | 58 ++++++++++++++++++++-------------- 4 files changed, 63 insertions(+), 78 deletions(-) diff --git a/composer.json b/composer.json index fc7f74f3..6e87c122 100644 --- a/composer.json +++ b/composer.json @@ -36,7 +36,7 @@ "require": { "php": ">=7.0", "ext-intl": "*", - "psr/simple-cache": "^1" + "psr/simple-cache": "^1.0.1" }, "require-dev": { "composer/composer": "^1.6", diff --git a/phpstan.src.neon b/phpstan.src.neon index 955c9f76..ee6abb0e 100644 --- a/phpstan.src.neon +++ b/phpstan.src.neon @@ -1,6 +1,2 @@ includes: -- vendor/phpstan/phpstan-strict-rules/rules.neon -parameters: - ignoreErrors: - - '#has invalid typehint type Psr\\SimpleCache\\DateInterval#' - reportUnmatchedIgnoredErrors: false \ No newline at end of file +- vendor/phpstan/phpstan-strict-rules/rules.neon \ No newline at end of file diff --git a/src/Domain.php b/src/Domain.php index 54c9a3bc..500d3606 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -73,8 +73,7 @@ public static function __set_state(array $properties): self public function __construct(string $domain = null, PublicSuffix $publicSuffix = null) { list($this->domain, $this->labels) = $this->setDomain($domain); - $this->publicSuffix = $this->setPublicSuffix($publicSuffix); - $this->assertValidState(); + $this->publicSuffix = $this->setPublicSuffix($publicSuffix ?? new PublicSuffix()); $this->registrableDomain = $this->setRegistrableDomain(); $this->subDomain = $this->setSubDomain(); } @@ -82,35 +81,39 @@ public function __construct(string $domain = null, PublicSuffix $publicSuffix = /** * Sets the public suffix domain part. * - * @param PublicSuffix|null $publicSuffix + * @param PublicSuffix $publicSuffix + * + * @throws Exception If the domain can not contain a public suffix + * @throws Exception If the domain value is the same as the public suffix value + * @throws Exception If the domain can not be match with the public suffix * * @return PublicSuffix */ - private function setPublicSuffix(PublicSuffix $publicSuffix = null): PublicSuffix + private function setPublicSuffix(PublicSuffix $publicSuffix): PublicSuffix { - if (null === $publicSuffix - || null === $this->domain - || false === strpos($this->domain, '.') - || count($this->labels) === count($publicSuffix) - ) { + if (null === $publicSuffix->getContent()) { return new PublicSuffix(); } - return $publicSuffix; - } + if (null === $this->domain || false === strpos($this->domain, '.')) { + throw new Exception(sprintf('The domain `%s` can not contain a public suffix', $this->domain)); + } - /** - * assert the domain internal state is valid - * - * @throws Exception if the public suffix does not match the domain - */ - protected function assertValidState() - { - foreach ($this->publicSuffix as $offset => $label) { - if ($label !== $this->labels[$offset]) { - throw new Exception(sprintf('The public suffix `%s` is invalid for the domain `%s`', $this->publicSuffix->getContent(), $this->domain)); - } + static $pattern = '/[^\x20-\x7f]/'; + if (preg_match($pattern, $this->domain)) { + $publicSuffix = $publicSuffix->toUnicode(); + } + + $publicSuffixContent = $publicSuffix->getContent(); + if ($this->domain === $publicSuffixContent) { + throw new Exception(sprintf('The public suffix `%s` can not be equal to the domain name `%s`', $publicSuffixContent, $this->domain)); + } + + if ('.'.$publicSuffixContent !== substr($this->domain, - strlen($publicSuffixContent) - 1)) { + throw new Exception(sprintf('The public suffix `%s` can not be assign to the domain name `%s`', $publicSuffixContent, $this->domain)); } + + return $publicSuffix; } /** @@ -350,9 +353,6 @@ public function toUnicode() * * @param PublicSuffix $publicSuffix * - * @throws Exception if the domain can not contain a public suffix - * @throws Exception if the public suffix can not be assign to the domain name - * * @return self */ public function withPublicSuffix(PublicSuffix $publicSuffix): self @@ -361,31 +361,8 @@ public function withPublicSuffix(PublicSuffix $publicSuffix): self return $this; } - if (null === $publicSuffix->getContent()) { - $clone = clone $this; - $clone->publicSuffix = $publicSuffix; - $clone->registrableDomain = $clone->setRegistrableDomain(); - $clone->subDomain = $clone->setSubDomain(); - - return $clone; - } - - if (null === $this->domain || false === strpos($this->domain, '.')) { - throw new Exception(sprintf('The domain `%s` can not contain a public suffix', $this->domain)); - } - - static $pattern = '/[^\x20-\x7f]/'; - if (preg_match($pattern, $this->domain)) { - $publicSuffix = $publicSuffix->toUnicode(); - } - - $publicSuffixContent = $publicSuffix->getContent(); - if ($this->domain === $publicSuffixContent || '.'.$publicSuffixContent !== substr($this->domain, - strlen($publicSuffixContent) - 1)) { - throw new Exception(sprintf('the public suffix `%s` can not be assign to the domain name `%s`', $publicSuffixContent, $this->domain)); - } - $clone = clone $this; - $clone->publicSuffix = $publicSuffix; + $clone->publicSuffix = $clone->setPublicSuffix($publicSuffix); $clone->registrableDomain = $clone->setRegistrableDomain(); $clone->subDomain = $clone->setSubDomain(); diff --git a/tests/DomainTest.php b/tests/DomainTest.php index dd59cceb..2ce91c3e 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -16,46 +16,56 @@ class DomainTest extends TestCase { /** - * @dataProvider invalidRegistrableDomainProvider - * - * @param string|null $domain - * @param string|null $publicSuffix - * * @covers ::__construct * @covers ::setPublicSuffix * @covers ::setRegistrableDomain * @covers ::setSubDomain - * @covers ::assertValidState * @covers ::getPublicSuffix * @covers ::getRegistrableDomain * @covers ::getSubDomain */ - public function testRegistrableDomainIsNullWithFoundDomain($domain, $publicSuffix) + public function testRegistrableDomainIsNullWithFoundDomain() { - $domain = new Domain($domain, new PublicSuffix($publicSuffix)); + $domain = new Domain('faketld', null); $this->assertNull($domain->getPublicSuffix()); $this->assertNull($domain->getRegistrableDomain()); $this->assertNull($domain->getSubDomain()); } - public function invalidRegistrableDomainProvider() - { - return [ - 'domain and suffix are the same' => ['co.uk', 'co.uk'], - 'domain has no labels' => ['faketld', 'faketld'], - 'public suffix is null' => ['faketld', null], - 'domain is null' => [null, 'faketld'], - ]; - } - /** * @covers ::__construct - * @covers ::assertValidState + * @covers ::setPublicSuffix + * + * @dataProvider provideWrongConstructor + * @param mixed $domain + * @param mixed $publicSuffix */ - public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain() + public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain($domain, $publicSuffix) { $this->expectException(Exception::class); - new Domain('www.ulb.ac.be', new PublicSuffix('com')); + new Domain($domain, new PublicSuffix($publicSuffix)); + } + + public function provideWrongConstructor() + { + return [ + 'public suffix mismatch' => [ + 'domain' => 'www.ulb.ac.be', + 'publicSuffix' => 'com', + ], + 'domain and public suffix are the same' => [ + 'domain' => 'co.uk', + 'publicSuffix' => 'co.uk', + ], + 'domain has no labels' => [ + 'domain' => 'localhost', + 'publicSuffix' => 'localhost', + ], + 'domain is null' => [ + 'domain' => null, + 'publicSuffix' => 'com', + ], + ]; } /** @@ -159,7 +169,6 @@ public function testOffsets() * * @covers ::setDomain * @covers ::setPublicSuffix - * @covers ::assertValidState * @covers ::setRegistrableDomain * @covers ::setSubDomain * @covers ::getDomain @@ -259,7 +268,6 @@ public function toUnicodeProvider() * * @covers ::setDomain * @covers ::setPublicSuffix - * @covers ::assertValidState * @covers ::setRegistrableDomain * @covers ::setSubDomain * @covers ::getDomain @@ -414,6 +422,10 @@ public function withPublicSuffixFailsProvider() 'domain' => $domain, 'public suffix' => new PublicSuffix('c.be'), ], + 'mismatch idn public suffix' => [ + 'domain' => new Domain('www.食狮.公司.cn'), + 'public suffix' => new PublicSuffix('cn.公司'), + ], ]; } From ac9c3fa8248fa9bffdd0d8f5d2469807967a577c Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 29 Mar 2018 14:05:34 +0200 Subject: [PATCH 097/461] Rules::resolve and Rules::getPublicSuffix allow wider type parameters --- README.md | 6 ++-- bin/update-psl | 4 +-- src/Domain.php | 26 ++++++++-------- src/IDNAConverterTrait.php | 15 +++++++-- src/PublicSuffix.php | 6 ++-- src/Rules.php | 25 +++++++-------- tests/RulesTest.php | 63 +++++++++++++++++++++++++++++++++++--- 7 files changed, 107 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index 04ad9de5..e081d587 100644 --- a/README.md +++ b/README.md @@ -63,8 +63,8 @@ final class Rules public static function createFromPath(string $path, $context = null): self public static function createFromString(string $content): self public function __construct(array $rules) - public function getPublicSuffix(string $domain = null, string $section = self::ALL_DOMAINS): PublicSuffix - public function resolve(string $domain = null, string $section = self::ALL_DOMAINS): Domain + public function getPublicSuffix($domain = null, string $section = self::ALL_DOMAINS): PublicSuffix + public function resolve($domain = null, string $section = self::ALL_DOMAINS): Domain } ~~~ @@ -104,6 +104,7 @@ But also enable returns informations about the domain parts and its public suffi final class Domain implements DomainInterface, JsonSerializable { + public function __construct($domain = null, PublicSuffix $publicSuffix = null) public function getPublicSuffix(): ?string public function getRegistrableDomain(): ?string public function getSubDomain(); ?string @@ -188,6 +189,7 @@ The `Rules::getPublicSuffix` method expects the same arguments as `Rules::resolv final class PublicSuffix implements DomainInterface, JsonSerializable { + public function __construct($publicSuffix = null) public function isKnown(): bool; public function isICANN(): bool; public function isPrivate(): bool; diff --git a/bin/update-psl b/bin/update-psl index 2b25cecf..284b1abe 100755 --- a/bin/update-psl +++ b/bin/update-psl @@ -1,8 +1,6 @@ #!/usr/bin/env php domain, $this->labels) = $this->setDomain($domain); $this->publicSuffix = $this->setPublicSuffix($publicSuffix ?? new PublicSuffix()); @@ -125,11 +125,10 @@ private function setRegistrableDomain() return null; } - $labels = explode('.', $this->domain); - $countLabels = count($labels); - $countPublicSuffixLabels = count($this->publicSuffix); - - return implode('.', array_slice($labels, $countLabels - $countPublicSuffixLabels - 1)); + return implode('.', array_slice( + explode('.', $this->domain), + count($this->labels) - count($this->publicSuffix) - 1 + )); } /** @@ -143,14 +142,17 @@ private function setSubDomain() return null; } - $labels = explode('.', $this->domain); - $countLabels = count($labels); - $countLabelsToRemove = count(explode('.', $this->registrableDomain)); - if ($countLabels === $countLabelsToRemove) { + $nbLabels = count($this->labels); + $nbRegistrableLabels = count($this->publicSuffix) + 1; + if ($nbLabels === $nbRegistrableLabels) { return null; } - return implode('.', array_slice($labels, 0, $countLabels - $countLabelsToRemove)); + return implode('.', array_slice( + explode('.', $this->domain), + 0, + $nbLabels - $nbRegistrableLabels + )); } /** diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index dd6dc23b..9e43135d 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -11,6 +11,8 @@ namespace Pdp; +use TypeError; + /** * @internal Domain name validator * @@ -113,14 +115,18 @@ private function idnToUnicode(string $domain): string * * For example: setDomain('wWw.uLb.Ac.be') should return ['www.ulb.ac.be', ['be', 'ac', 'ulb', 'www']]; * - * @param string|null $domain + * @param mixed $domain * * @throws Exception If the domain is invalid * * @return array */ - private function setDomain(string $domain = null): array + private function setDomain($domain = null): array { + if ($domain instanceof DomainInterface) { + return [$domain->getContent(), iterator_to_array($domain, false)]; + } + if (null === $domain) { return [$domain, []]; } @@ -129,6 +135,11 @@ private function setDomain(string $domain = null): array return [$domain, ['']]; } + if (!is_scalar($domain) && !method_exists($domain, '__toString')) { + throw new TypeError(sprintf('The domain must be a scalar, a stringable object, a DomainInterface object or null; `%s` given', gettype($domain))); + } + + $domain = (string) $domain; if (filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { throw new Exception(sprintf('The domain `%s` is invalid: this is an IPv4 host', $domain)); } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index bea2e16d..e375a883 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -56,10 +56,10 @@ public static function __set_state(array $properties): self /** * New instance. * - * @param string|null $publicSuffix - * @param string $section + * @param mixed $publicSuffix + * @param string $section */ - public function __construct(string $publicSuffix = null, string $section = '') + public function __construct($publicSuffix = null, string $section = '') { list($this->publicSuffix, $this->labels) = $this->setDomain($publicSuffix); $this->section = $this->setSection($section); diff --git a/src/Rules.php b/src/Rules.php index f7ef8e8e..d34f73da 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -92,8 +92,8 @@ public function __construct(array $rules) /** * Determines the public suffix for a given domain. * - * @param string|null $domain - * @param string $section + * @param mixed $domain + * @param string $section * * @throws Exception * If the Domain is invalid or malformed @@ -102,20 +102,21 @@ public function __construct(array $rules) * * @return PublicSuffix */ - public function getPublicSuffix(string $domain = null, string $section = self::ALL_DOMAINS): PublicSuffix + public function getPublicSuffix($domain = null, string $section = self::ALL_DOMAINS): PublicSuffix { $this->validateSection($section); - if (!$this->isMatchable($domainObj = new Domain($domain))) { - throw new Exception(sprintf('The domain `%s` can not contain a public suffix', $domain)); + $domain = $domain instanceof Domain ? $domain : new Domain($domain); + if (!$this->isMatchable($domain)) { + throw new Exception(sprintf('The domain `%s` can not contain a public suffix', $domain->getContent())); } - $publicSuffix = $this->findPublicSuffix($domainObj, $section); + $publicSuffix = $this->findPublicSuffix($domain, $section); if (null === $publicSuffix->getContent()) { - $publicSuffix = new PublicSuffix($domainObj->getLabel(0)); + $publicSuffix = new PublicSuffix($domain->getLabel(0)); } static $pattern = '/[^\x20-\x7f]/'; - if (preg_match($pattern, $domainObj->getContent())) { + if (preg_match($pattern, $domain->getContent())) { return $publicSuffix->toUnicode(); } @@ -125,16 +126,16 @@ public function getPublicSuffix(string $domain = null, string $section = self::A /** * Returns PSL info for a given domain. * - * @param string|null $domain - * @param string $section + * @param mixed $domain + * @param string $section * * @return Domain */ - public function resolve(string $domain = null, string $section = self::ALL_DOMAINS): Domain + public function resolve($domain = null, string $section = self::ALL_DOMAINS): Domain { $this->validateSection($section); try { - $domain = new Domain($domain); + $domain = $domain instanceof Domain ? $domain : new Domain($domain); if (!$this->isMatchable($domain)) { return $domain; } diff --git a/tests/RulesTest.php b/tests/RulesTest.php index ac576a4a..1598c599 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -9,8 +9,10 @@ use Pdp\Domain; use Pdp\Exception; use Pdp\Manager; +use Pdp\PublicSuffix; use Pdp\Rules; use PHPUnit\Framework\TestCase; +use TypeError; /** * @coversDefaultClass Pdp\Rules @@ -72,6 +74,7 @@ public function testDomainInternalPhpMethod() * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\Domain::isKnown + * @covers \Pdp\IDNAConverterTrait::setDomain */ public function testNullWillReturnNullDomain() { @@ -79,6 +82,17 @@ public function testNullWillReturnNullDomain() $this->assertFalse($domain->isKnown()); } + + /** + * @covers ::resolve + * @covers \Pdp\IDNAConverterTrait::setDomain + */ + public function testThrowsTypeErrorOnWrongInput() + { + $this->expectException(TypeError::class); + $this->rules->resolve(date_create()); + } + /** * @covers ::resolve * @covers ::validateSection @@ -98,6 +112,7 @@ public function testResolveThrowsExceptionOnWrongDomainType() * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\Domain::isKnown + * @covers \Pdp\IDNAConverterTrait::setDomain */ public function testIsSuffixValidFalse() { @@ -119,6 +134,7 @@ public function testIsSuffixValidFalse() * @covers \Pdp\Domain::isKnown * @covers \Pdp\Domain::isICANN * @covers \Pdp\Domain::isPrivate + * @covers \Pdp\IDNAConverterTrait::setDomain */ public function testIsSuffixValidTrue() { @@ -142,6 +158,7 @@ public function testIsSuffixValidTrue() * @covers \Pdp\Domain::isKnown * @covers \Pdp\Domain::isICANN * @covers \Pdp\Domain::isPrivate + * @covers \Pdp\IDNAConverterTrait::setDomain */ public function testIsSuffixValidFalseWithPunycoded() { @@ -165,6 +182,7 @@ public function testIsSuffixValidFalseWithPunycoded() * @covers \Pdp\Domain::isKnown * @covers \Pdp\Domain::isICANN * @covers \Pdp\Domain::isPrivate + * @covers \Pdp\IDNAConverterTrait::setDomain */ public function testSubDomainIsNull() { @@ -177,7 +195,7 @@ public function testSubDomainIsNull() /** * @covers ::resolve * @covers ::validateSection - * @covers \Pdp\Domain::setDomain + * @covers \Pdp\IDNAConverterTrait::setDomain */ public function testWithInvalidDomainName() { @@ -191,6 +209,7 @@ public function testWithInvalidDomainName() * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection + * @covers \Pdp\IDNAConverterTrait::setDomain */ public function testWithPrivateDomain() { @@ -207,6 +226,7 @@ public function testWithPrivateDomain() * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection + * @covers \Pdp\IDNAConverterTrait::setDomain */ public function testWithPrivateDomainInvalid() { @@ -224,6 +244,7 @@ public function testWithPrivateDomainInvalid() * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection + * @covers \Pdp\IDNAConverterTrait::setDomain */ public function testWithPrivateDomainValid() { @@ -241,6 +262,7 @@ public function testWithPrivateDomainValid() * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection + * @covers \Pdp\IDNAConverterTrait::setDomain */ public function testWithICANNDomainInvalid() { @@ -252,6 +274,37 @@ public function testWithICANNDomainInvalid() $this->assertSame('ac.be', $domain->getPublicSuffix()); } + /** + * @covers ::resolve + * @covers ::validateSection + * @covers ::findPublicSuffix + * @covers ::findPublicSuffixFromSection + * @covers \Pdp\PublicSuffix::setSection + * @covers \Pdp\IDNAConverterTrait::setDomain + */ + public function testWithDomainObject() + { + $domain = new Domain('private.ulb.ac.be', new PublicSuffix('ac.be', Rules::ICANN_DOMAINS)); + $newDomain = $this->rules->resolve($domain); + $this->assertSame('private.ulb.ac.be', $domain->getDomain()); + $this->assertTrue($domain->isKnown()); + $this->assertTrue($domain->isICANN()); + $this->assertFalse($domain->isPrivate()); + $this->assertSame('ac.be', $domain->getPublicSuffix()); + $this->assertSame($domain, $newDomain); + } + + /** + * @covers ::getPublicSuffix + * @covers \Pdp\IDNAConverterTrait::setDomain + */ + public function testWithDomainInterfaceObject() + { + $publicSuffix = new PublicSuffix('ac.be', Rules::ICANN_DOMAINS); + $psl = $this->rules->getPublicSuffix($publicSuffix); + $this->assertEquals($publicSuffix, $psl); + } + /** * @dataProvider parseDataProvider * @param mixed $publicSuffix @@ -274,6 +327,7 @@ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $dom * @param mixed $domain * @param mixed $expectedDomain * @covers ::resolve + * @covers \Pdp\IDNAConverterTrait::setDomain * @covers \Pdp\Domain::setPublicSuffix * @covers \Pdp\Domain::getPublicSuffix */ @@ -289,8 +343,8 @@ public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, * @param mixed $domain * @param mixed $expectedDomain * @covers ::resolve + * @covers \Pdp\IDNAConverterTrait::setDomain * @covers \Pdp\Domain::withPublicSuffix - * @covers \Pdp\Domain::setDomain * @covers \Pdp\Domain::getContent */ public function testGetDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) @@ -331,8 +385,8 @@ public function parseDataProvider() * * @covers ::getPublicSuffix * @covers ::validateSection - * @covers \Pdp\Domain::setDomain * @covers ::isMatchable + * @covers \Pdp\IDNAConverterTrait::setDomain */ public function testGetPublicSuffixThrowsException($domain, $section) { @@ -360,7 +414,7 @@ public function invalidParseProvider() * @covers ::getPublicSuffix * @covers ::validateSection * @covers ::isMatchable - * @covers \Pdp\PublicSuffix::setDomain + * @covers \Pdp\IDNAConverterTrait::setDomain * @dataProvider validPublicSectionProvider * * @param string|null $domain @@ -419,6 +473,7 @@ public function checkPublicSuffix($input, $expected) * @covers ::findPublicSuffixFromSection * @covers \Pdp\Domain::withPublicSuffix * @covers \Pdp\Domain::getRegistrableDomain + * @covers \Pdp\IDNAConverterTrait::setDomain */ public function testPublicSuffixSpec() { From c79cf7fa7bb8997da9a3a11bde0f9bbc7e980ce1 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 29 Mar 2018 18:05:44 +0200 Subject: [PATCH 098/461] Simplify Converter --- src/Converter.php | 38 +++++++++++++------------------------- 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/src/Converter.php b/src/Converter.php index fcebf700..d1b5adf6 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -36,10 +36,10 @@ final class Converter public function convert(string $content): array { $rules = [Rules::ICANN_DOMAINS => [], Rules::PRIVATE_DOMAINS => []]; + $section = ''; $file = new SplTempFileObject(); $file->fwrite($content); $file->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); - $section = ''; foreach ($file as $line) { $section = $this->getSection($section, $line); if ('' !== $section && false === strpos($line, '//')) { @@ -60,20 +60,13 @@ public function convert(string $content): array */ private function getSection(string $section, string $line): string { - if ('' === $section && 0 === strpos($line, '// ===BEGIN ICANN DOMAINS===')) { - return Rules::ICANN_DOMAINS; - } - - if (Rules::ICANN_DOMAINS === $section && 0 === strpos($line, '// ===END ICANN DOMAINS===')) { - return ''; - } - - if ('' === $section && 0 === strpos($line, '// ===BEGIN PRIVATE DOMAINS===')) { - return Rules::PRIVATE_DOMAINS; - } - - if (Rules::PRIVATE_DOMAINS === $section && 0 === strpos($line, '// ===END PRIVATE DOMAINS===')) { - return ''; + static $section_list = [ + 'ICANN' => ['BEGIN' => Rules::ICANN_DOMAINS, 'END' => ''], + 'PRIVATE' => ['BEGIN' => Rules::PRIVATE_DOMAINS, 'END' => ''], + ]; + static $pattern = ',^// ===(?BEGIN|END) (?ICANN|PRIVATE) DOMAINS===,'; + if (preg_match($pattern, $line, $matches)) { + return $section_list[$matches['type']][$matches['point']]; } return $section; @@ -97,26 +90,21 @@ private function getSection(string $section, string $line): string */ private function addRule(array $list, array $rule_parts): array { - $part = array_pop($rule_parts); - // Adheres to canonicalization rule from the "Formal Algorithm" section // of https://publicsuffix.org/list/ // "The domain and all rules must be canonicalized in the normal way // for hostnames - lower-case, Punycode (RFC 3492)." - $part = $this->idnToAscii($part); + $rule = $this->idnToAscii(array_pop($rule_parts)); $isDomain = true; - if (0 === strpos($part, '!')) { - $part = substr($part, 1); + if (0 === strpos($rule, '!')) { + $rule = substr($rule, 1); $isDomain = false; } - if (!isset($list[$part])) { - $list[$part] = $isDomain ? [] : ['!' => '']; - } - + $list[$rule] = $list[$rule] ?? ($isDomain ? [] : ['!' => '']); if ($isDomain && !empty($rule_parts)) { - $list[$part] = $this->addRule($list[$part], $rule_parts); + $list[$rule] = $this->addRule($list[$rule], $rule_parts); } return $list; From 62a89a481147b9c83c3923a665b69739a8083388 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 30 Mar 2018 14:29:32 +0200 Subject: [PATCH 099/461] adding domain modifiers functions --- CHANGELOG.md | 6 + composer.json | 3 +- phpunit.xml.dist | 1 + src/PublicSuffix.php | 20 ++ src/functions.php | 183 ++++++++++++++ src/functions_include.php | 6 + tests/FunctionsTest.php | 510 ++++++++++++++++++++++++++++++++++++++ 7 files changed, 728 insertions(+), 1 deletion(-) create mode 100644 src/functions.php create mode 100644 src/functions_include.php create mode 100644 tests/FunctionsTest.php diff --git a/CHANGELOG.md b/CHANGELOG.md index e9a48f37..84f70aad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,11 +10,17 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\Domain::getContent` returns the Domain name value replaces `Pdp\Domain::getDomain` - `Pdp\Domain` implements the `Countable` interface. - `Pdp\Domain::withPublicSuffix` returns a new Domain object with a different Public Suffix +- `Pdp\PublicSuffix::createFromDomain` returns a new `Pdp\PublicSuffix` object from a `Pdp\Domain`object +- `Pdp\append` append a host to a domain name +- `Pdp\prepend` prepend a host to a domain name +- `Pdp\replace` replace a label from the domain name +- `Pdp\public_suffix_replace` replace the domain name public suffix ### Fixed - `Pdp\Domain` domain part computation (public suffix, registrable domain and sub domain) - `Pdp\Domain` and `Pdp\PublicSuffix` host validation compliance to RFC improved +- Improved `Pdp\Converter` and `Pdp\Manager` class to better report error on IDN conversion. ### Deprecated diff --git a/composer.json b/composer.json index 6e87c122..4e4b46ad 100644 --- a/composer.json +++ b/composer.json @@ -55,7 +55,8 @@ "autoload": { "psr-4": { "Pdp\\": "src/" - } + }, + "files": ["src/functions_include.php"] }, "autoload-dev": { "psr-4": { diff --git a/phpunit.xml.dist b/phpunit.xml.dist index f49fa9fd..f1e2c5fc 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -22,6 +22,7 @@ src src + src src/Installer diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index e375a883..766bd72f 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -53,6 +53,26 @@ public static function __set_state(array $properties): self return new self($properties['publicSuffix'], $properties['section']); } + /** + * Create an new instance from a Domain object + * + * @param Domain $domain + * + * @return self + */ + public static function createFromDomain(Domain $domain): self + { + if (!$domain->isKnown()) { + return new self($domain->getPublicSuffix()); + } + + if ($domain->isICANN()) { + return new self($domain->getPublicSuffix(), Rules::ICANN_DOMAINS); + } + + return new self($domain->getPublicSuffix(), Rules::PRIVATE_DOMAINS); + } + /** * New instance. * diff --git a/src/functions.php b/src/functions.php new file mode 100644 index 00000000..e3cf9085 --- /dev/null +++ b/src/functions.php @@ -0,0 +1,183 @@ +getContent()) { + return $subject; + } + + static $pattern = '/[^\x20-\x7f]/'; + $dContent = $subject->getContent(); + $host = preg_match($pattern, $dContent) ? $host->toUnicode() : $host->toAscii(); + $domain = new Domain($dContent.'.'.$host->getContent()); + + if ($host instanceof PublicSuffix) { + return $domain->withPublicSuffix($host); + } + + if ($host instanceof Domain) { + return $domain->withPublicSuffix(PublicSuffix::createFromDomain($host)); + } + + return $domain; +} + +/** + * Prepend a domain name to another domain name. + * + * @param mixed $host + * @param mixed $subject + * + * @return Domain + */ +function prepend($host, $subject): Domain +{ + if (!$subject instanceof Domain) { + $subject = new Domain($subject); + } + + if (!$host instanceof DomainInterface) { + $host = new PublicSuffix($host); + } + + if (null === $host->getContent()) { + return $subject; + } + + $dContent = $subject->getContent(); + static $pattern = '/[^\x20-\x7f]/'; + $host = preg_match($pattern, $dContent) ? $host->toUnicode() : $host->toAscii(); + + return new Domain($host->getContent().'.'.$dContent, PublicSuffix::createFromDomain($subject)); +} + +/** + * Replace a label from the domain with a domain name + * + * @param int $key + * @param mixed $label + * @param mixed $subject + * + * @return Domain + */ +function replace(int $key, $label, $subject): Domain +{ + if (!$subject instanceof Domain) { + $subject = new Domain($subject); + } + + if (!$label instanceof DomainInterface) { + $label = new Domain($label); + } + + if (null === $label->getContent()) { + return $subject; + } + + $nb_labels = count($subject); + $offset = filter_var($key, FILTER_VALIDATE_INT, ['options' => ['min_range' => - $nb_labels, 'max_range' => $nb_labels - 1]]); + if (false === $offset) { + throw new Exception(sprintf('no label was found for the given key `%s`', $key)); + } + + if ($offset < 0) { + $offset = $nb_labels + $offset; + } + + static $pattern = '/[^\x20-\x7f]/'; + $label = preg_match($pattern, $subject->getContent()) ? $label->toUnicode() : $label->toAscii(); + if ($label->getContent() === $subject->getLabel($offset)) { + return $subject; + } + + $labels = iterator_to_array($subject, false); + $labels[$offset] = $label->getContent(); + $domain = new Domain(implode('.', array_reverse($labels))); + + $subjectPS = PublicSuffix::createFromDomain($subject); + if ($key >= count($subjectPS)) { + return $domain->withPublicSuffix($subjectPS); + } + + if ($key !== 0) { + return $domain; + } + + if ($label instanceof PublicSuffix) { + return $domain->withPublicSuffix($label); + } + + if ($label instanceof Domain) { + return $domain->withPublicSuffix(PublicSuffix::createFromDomain($label)); + } + + return $domain->withPublicSuffix(new PublicSuffix($label->getContent())); +} + +/** + * Replace the public suffix for a given Domain name. + * + * If the domain has no information regarding its public suffix + * its last label will be considered as its public suffix label and will + * be replaced. + * + * @param mixed $publicSuffix + * @param mixed $subject + * + * @return Domain + */ +function public_suffix_replace($publicSuffix, $subject): Domain +{ + if (!$subject instanceof Domain) { + $subject = new Domain($subject); + $subject = $subject->withPublicSuffix(new PublicSuffix($subject->getLabel(0))); + } + + if (!$publicSuffix instanceof PublicSuffix) { + $publicSuffix = new PublicSuffix($publicSuffix); + } + + if (null === $publicSuffix->getContent()) { + return $subject->withPublicSuffix($publicSuffix); + } + + $dContent = $subject->getContent(); + $dPublicSuffix = $subject->getPublicSuffix(); + + static $pattern = '/[^\x20-\x7f]/'; + $publicSuffix = preg_match($pattern, $dContent) ? $publicSuffix->toUnicode() : $publicSuffix->toAscii(); + + $psContent = $publicSuffix->getContent(); + if ($dPublicSuffix === $psContent) { + return $subject; + } + + return new Domain(substr($dContent, 0, - strlen($dPublicSuffix)).$psContent, $publicSuffix); +} diff --git a/src/functions_include.php b/src/functions_include.php new file mode 100644 index 00000000..1b604cb3 --- /dev/null +++ b/src/functions_include.php @@ -0,0 +1,6 @@ +assertSame($expected, $result->getContent()); + $this->assertSame($isKnown, $result->isKnown()); + $this->assertSame($isIcann, $result->isICANN()); + $this->assertSame($isPrivate, $result->isPrivate()); + } + + public function prependProvider() + { + return [ + 'simple prepend' => [ + 'domain' => 'example.com', + 'host' => 'www', + 'expected' => 'www.example.com', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + 'prepend a null domain' => [ + 'domain' => 'example.com', + 'host' => null, + 'expected' => 'example.com', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + 'prepend does not change PSL info (1)' => [ + 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), + 'host' => new Domain(), + 'expected' => 'example.com', + 'isKnown' => true, + 'isIcann' => true, + 'isPrivate' => false, + ], + 'prepend does not change PSL info (2)' => [ + 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), + 'host' => new PublicSuffix('bar', Rules::PRIVATE_DOMAINS), + 'expected' => 'bar.example.com', + 'isKnown' => true, + 'isIcann' => true, + 'isPrivate' => false, + ], + 'prepend convert host format: IDN to ASCII process' => [ + 'domain' => 'example.com', + 'host' => '中国', + 'expected' => 'xn--fiqs8s.example.com', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + 'prepend convert host format: ASCII to IDN process' => [ + 'domain' => '食狮.中国', + 'host' => 'xn--fiqs8s', + 'expected' => '中国.食狮.中国', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + 'test general DomainInterface object' => [ + 'domain' => 'example.com', + 'host' => new class() implements DomainInterface { + public function getContent() + { + return 'be'; + } + + public function count() + { + return 1; + } + + public function getIterator() + { + foreach (['be'] as $label) { + yield $label; + } + } + + public function toUnicode() + { + return clone $this; + } + + public function toAscii() + { + return clone $this; + } + + public function keys(string $label): array + { + return []; + } + + public function getLabel(int $key) + { + return null; + } + }, + 'expected' => 'be.example.com', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + ]; + } + + /** + * @dataProvider appendProvider + * @covers \Pdp\append + * @covers \Pdp\PublicSuffix::createFromDomain + * + * @param mixed $domain + * @param mixed $host + * @param null|string $expected + * @param bool $isKnown + * @param bool $isIcann + * @param bool $isPrivate + */ + public function testAppend( + $domain, + $host, + $expected, + bool $isKnown, + bool $isIcann, + bool $isPrivate + ) { + $result = Pdp\append($host, $domain); + $this->assertSame($expected, $result->getContent()); + $this->assertSame($isKnown, $result->isKnown()); + $this->assertSame($isPrivate, $result->isPrivate()); + $this->assertSame($isIcann, $result->isICANN()); + } + + public function appendProvider() + { + return [ + 'simple append' => [ + 'domain' => 'example.com', + 'host' => 'be', + 'expected' => 'example.com.be', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + 'adding a null public suffix returns the domain only' => [ + 'domain' => 'example.com', + 'host' => null, + 'expected' => 'example.com', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + 'adding a null public suffix returns the domain without PSL info changed' => [ + 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), + 'host' => new PublicSuffix(), + 'expected' => 'example.com', + 'isKnown' => true, + 'isIcann' => true, + 'isPrivate' => false, + ], + 'new domain inherit the new PublicSuffix PSL info' => [ + 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), + 'host' => new PublicSuffix('bar', Rules::PRIVATE_DOMAINS), + 'expected' => 'example.com.bar', + 'isKnown' => true, + 'isIcann' => false, + 'isPrivate' => true, + ], + 'Publix suffix is converted to the domain format: IDN to ASCII process' => [ + 'domain' => 'example.com', + 'host' => '中国', + 'expected' => 'example.com.xn--fiqs8s', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + 'Publix suffix is converted to the domain format: ASCII to IDN process' => [ + 'domain' => '食狮.中国', + 'host' => 'xn--fiqs8s', + 'expected' => '食狮.中国.中国', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + 'test general DomainInterface object' => [ + 'domain' => 'example.com', + 'host' => new class() implements DomainInterface { + public function getContent() + { + return 'be'; + } + + public function count() + { + return 1; + } + + public function getIterator() + { + foreach (['be'] as $label) { + yield $label; + } + } + + public function toUnicode() + { + return clone $this; + } + + public function toAscii() + { + return clone $this; + } + + public function keys(string $label): array + { + return []; + } + + public function getLabel(int $key) + { + return null; + } + }, + 'expected' => 'example.com.be', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + ]; + } + + /** + * @dataProvider publicSuffixReplaceProvider + * @covers \Pdp\public_suffix_replace + * + * @param mixed $domain + * @param mixed $publicSuffix + * @param null|string $expected + * @param bool $isKnown + * @param bool $isIcann + * @param bool $isPrivate + */ + public function testPublicSuffixReplace( + $domain, + $publicSuffix, + $expected, + bool $isKnown, + bool $isIcann, + bool $isPrivate + ) { + $result = Pdp\public_suffix_replace($publicSuffix, $domain); + $this->assertSame($expected, $result->getContent()); + $this->assertSame($isKnown, $result->isKnown()); + $this->assertSame($isPrivate, $result->isPrivate()); + $this->assertSame($isIcann, $result->isICANN()); + } + + public function publicSuffixReplaceProvider() + { + return [ + 'simple replace' => [ + 'domain' => 'example.com', + 'host' => 'be', + 'expected' => 'example.be', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + 'replace with null public suffix returns the domain only' => [ + 'domain' => 'example.com', + 'host' => null, + 'expected' => 'example.com', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + 'Publix suffix is converted to the domain format: IDN to ASCII process' => [ + 'domain' => 'example.com', + 'host' => '中国', + 'expected' => 'example.xn--fiqs8s', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + 'Publix suffix is converted to the domain format: ASCII to IDN process' => [ + 'domain' => '食狮.中国', + 'host' => 'xn--fiqs8s', + 'expected' => '食狮.中国', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + 'new domain inherit the new PublicSuffix PSL info' => [ + 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), + 'host' => new PublicSuffix('bar', Rules::PRIVATE_DOMAINS), + 'expected' => 'example.bar', + 'isKnown' => true, + 'isIcann' => false, + 'isPrivate' => true, + ], + 'replacing with a null public suffix returns the domain without PSL info' => [ + 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), + 'host' => new PublicSuffix(), + 'expected' => 'example.com', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + ]; + } + + /** + * @covers \Pdp\public_suffix_replace + */ + public function testPublicSuffixReplaceThrowsException() + { + $this->expectException(Exception::class); + Pdp\public_suffix_replace('com', 'localhost'); + } + + /** + * @dataProvider replaceProvider + * @covers \Pdp\replace + * @covers \Pdp\PublicSuffix::createFromDomain + * + * @param mixed $domain + * @param mixed $host + * @param int $key + * @param null|string $expected + * @param bool $isKnown + * @param bool $isIcann + * @param bool $isPrivate + */ + public function testReplace( + $domain, + $host, + $key, + $expected, + bool $isKnown, + bool $isIcann, + bool $isPrivate + ) { + $result = Pdp\replace($key, $host, $domain); + $this->assertSame($expected, $result->getContent()); + $this->assertSame($isKnown, $result->isKnown()); + $this->assertSame($isIcann, $result->isICANN()); + $this->assertSame($isPrivate, $result->isPrivate()); + } + + public function replaceProvider() + { + return [ + 'simple replace' => [ + 'domain' => 'example.com', + 'host' => 'be', + 'key' => 0, + 'expected' => 'example.be', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + 'replace with null public suffix (1)' => [ + 'domain' => 'example.com', + 'host' => null, + 'key' => 1, + 'expected' => 'example.com', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + 'replace with null public suffix (2)' => [ + 'domain' => new Domain('www.ulb.ac.be', new PublicSuffix('ac.be', Rules::ICANN_DOMAINS)), + 'host' => new Domain('Foo'), + 'key' => -3, + 'expected' => 'www.ulb.foo.be', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + 'Publix suffix conversion: IDN to ASCII process' => [ + 'domain' => 'example.com', + 'host' => '中国', + 'key' => 0, + 'expected' => 'example.xn--fiqs8s', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + 'Publix suffix conversion: ASCII to IDN process' => [ + 'domain' => '食狮.中国', + 'host' => 'xn--fiqs8s', + 'key' => 0, + 'expected' => '食狮.中国', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + 'Domain inherits PublicSuffix PSL info' => [ + 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), + 'host' => new PublicSuffix('bar', Rules::PRIVATE_DOMAINS), + 'key' => 0, + 'expected' => 'example.bar', + 'isKnown' => true, + 'isIcann' => false, + 'isPrivate' => true, + ], + 'test Domain object' => [ + 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), + 'host' => new Domain('ulb.ac.be', new PublicSuffix('ac.be', Rules::PRIVATE_DOMAINS)), + 'key' => 0, + 'expected' => 'example.ulb.ac.be', + 'isKnown' => true, + 'isIcann' => false, + 'isPrivate' => true, + ], + 'test general DomainInterface object' => [ + 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), + 'host' => new class() implements DomainInterface { + public function getContent() + { + return 'be'; + } + + public function count() + { + return 1; + } + + public function getIterator() + { + foreach (['be'] as $label) { + yield $label; + } + } + + public function toUnicode() + { + return clone $this; + } + + public function toAscii() + { + return clone $this; + } + + public function keys(string $label): array + { + return []; + } + + public function getLabel(int $key) + { + return null; + } + }, + 'key' => 0, + 'expected' => 'example.be', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + ]; + } + + /** + * @covers \Pdp\replace + */ + public function testReplaceThrowsException() + { + $this->expectException(Exception::class); + Pdp\replace(-23, 'com', 'localhost'); + } +} From df5e2c2726ad3df4dc16a33e6d929be476085403 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 30 Mar 2018 15:34:24 +0200 Subject: [PATCH 100/461] Improve functions with null domains --- src/functions.php | 12 ++++++++++-- tests/FunctionsTest.php | 20 ++++++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/functions.php b/src/functions.php index e3cf9085..1b7be7cd 100644 --- a/src/functions.php +++ b/src/functions.php @@ -33,8 +33,12 @@ function append($host, $subject): Domain return $subject; } - static $pattern = '/[^\x20-\x7f]/'; $dContent = $subject->getContent(); + if (null === $dContent) { + return $host instanceof DomainInterface ? new Domain($host) : $host; + } + + static $pattern = '/[^\x20-\x7f]/'; $host = preg_match($pattern, $dContent) ? $host->toUnicode() : $host->toAscii(); $domain = new Domain($dContent.'.'.$host->getContent()); @@ -64,7 +68,7 @@ function prepend($host, $subject): Domain } if (!$host instanceof DomainInterface) { - $host = new PublicSuffix($host); + $host = new Domain($host); } if (null === $host->getContent()) { @@ -72,6 +76,10 @@ function prepend($host, $subject): Domain } $dContent = $subject->getContent(); + if (null === $dContent) { + return $host instanceof DomainInterface ? new Domain($host) : $host; + } + static $pattern = '/[^\x20-\x7f]/'; $host = preg_match($pattern, $dContent) ? $host->toUnicode() : $host->toAscii(); diff --git a/tests/FunctionsTest.php b/tests/FunctionsTest.php index 8e35f1e9..b2cc8167 100644 --- a/tests/FunctionsTest.php +++ b/tests/FunctionsTest.php @@ -52,7 +52,7 @@ public function prependProvider() 'isIcann' => false, 'isPrivate' => false, ], - 'prepend a null domain' => [ + 'prepend with a null domain' => [ 'domain' => 'example.com', 'host' => null, 'expected' => 'example.com', @@ -60,6 +60,14 @@ public function prependProvider() 'isIcann' => false, 'isPrivate' => false, ], + 'prepend a null domain' => [ + 'domain' => null, + 'host' => 'example.com', + 'expected' => 'example.com', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], 'prepend does not change PSL info (1)' => [ 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), 'host' => new Domain(), @@ -178,7 +186,15 @@ public function appendProvider() 'isIcann' => false, 'isPrivate' => false, ], - 'adding a null public suffix returns the domain only' => [ + 'append a null domain' => [ + 'domain' => null, + 'host' => 'example.com', + 'expected' => 'example.com', + 'isKnown' => false, + 'isIcann' => false, + 'isPrivate' => false, + ], + 'append with a null domain' => [ 'domain' => 'example.com', 'host' => null, 'expected' => 'example.com', From f54d63951206af00cb96f9f99c4d8359170630c9 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 30 Mar 2018 15:41:11 +0200 Subject: [PATCH 101/461] Improve withPublicSuffix docbloc --- src/Domain.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Domain.php b/src/Domain.php index 64922731..3a4485d2 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -353,6 +353,14 @@ public function toUnicode() /** * Returns a new domain name with a different public suffix. * + * The Public Suffix must be valid for the given domain name. + * ex: if the domain name is www.ulb.ac.be the only valid public suffixes + * are: be, ac.be, ulb.ac.be, or the null public suffix. Any other public + * suffix will throw an Exception. + * + * This method does not change the domain name value it only updates/changes/removes + * a valid public suffix for the given domain name. + * * @param PublicSuffix $publicSuffix * * @return self From 7db81b107d93aeb24e65b93c998634e6a6126c30 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 30 Mar 2018 16:05:57 +0200 Subject: [PATCH 102/461] simplify withPublicSuffix usage --- .php_cs | 1 + CHANGELOG.md | 12 +- README.md | 194 +++++++------- composer.json | 3 +- src/Converter.php | 10 +- src/CurlHttpClient.php | 6 +- src/Domain.php | 193 +++++++++++++- src/DomainInterface.php | 2 +- src/HttpClient.php | 2 +- src/IDNAConverterTrait.php | 6 +- src/Installer.php | 8 +- src/PublicSuffix.php | 16 +- src/Rules.php | 12 +- src/SectionInterface.php | 24 ++ src/functions.php | 191 -------------- src/functions_include.php | 6 - tests/DomainTest.php | 431 ++++++++++++++++++++++++++++-- tests/FunctionsTest.php | 526 ------------------------------------- tests/PublicSuffixTest.php | 36 +++ 19 files changed, 799 insertions(+), 880 deletions(-) create mode 100644 src/SectionInterface.php delete mode 100644 src/functions.php delete mode 100644 src/functions_include.php delete mode 100644 tests/FunctionsTest.php diff --git a/.php_cs b/.php_cs index bb1a8a13..66b9fedd 100644 --- a/.php_cs +++ b/.php_cs @@ -24,6 +24,7 @@ return PhpCsFixer\Config::create() 'phpdoc_order' => true, 'phpdoc_scalar' => true, 'phpdoc_to_comment' => true, + 'phpdoc_summary' => true, 'psr0' => true, 'psr4' => true, 'return_type_declaration' => ['space_before' => 'none'], diff --git a/CHANGELOG.md b/CHANGELOG.md index 84f70aad..41a4502f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,15 +6,15 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in ### Added +- `Pdp\SectionInterface` interface implemented by `Pdp\Rules` and `Pdp\PublicSuffix` - `Pdp\DomainInterface` interface implemented by `Pdp\Domain` and `Pdp\PublicSuffix` -- `Pdp\Domain::getContent` returns the Domain name value replaces `Pdp\Domain::getDomain` - `Pdp\Domain` implements the `Countable` interface. -- `Pdp\Domain::withPublicSuffix` returns a new Domain object with a different Public Suffix +- `Pdp\Domain::getContent` returns the Domain name value replaces `Pdp\Domain::getDomain` +- `Pdp\Domain::withPublicSuffix` updates the `Pdp\Domain` public suffix part. +- `Pdp\Domain::withSubDomain` updates the `Pdp\Domain` sub domain part. +- `Pdp\Domain::withLabel` adds a new label to the `Pdp\Domain`. +- `Pdp\Domain::withoutLabel` removes a label from the `Pdp\Domain`. - `Pdp\PublicSuffix::createFromDomain` returns a new `Pdp\PublicSuffix` object from a `Pdp\Domain`object -- `Pdp\append` append a host to a domain name -- `Pdp\prepend` prepend a host to a domain name -- `Pdp\replace` replace a label from the domain name -- `Pdp\public_suffix_replace` replace the domain name public suffix ### Fixed diff --git a/README.md b/README.md index e081d587..6a1e6ec0 100644 --- a/README.md +++ b/README.md @@ -42,79 +42,129 @@ Installation $ composer require jeremykendall/php-domain-parser ~~~ -Documentation +Usage -------- -### Domain name resolution - -The `Pdp\Rules` object is responsible for public suffix resolution for a given domain. +### Parsing a domain name. ~~~php getRules(); //$rules is a Pdp\Rules object + +$domain = $rules->resolve('www.ulb.ac.be'); +echo json_encode($domain, JSON_PRETTY_PRINT); +// returns +// { +// "domain": "www.ulb.ac.be", +// "registrableDomain": "ulb.ac.be", +// "subDomain": "www", +// "publicSuffix": "ac.be", +// "isKnown": true, +// "isICANN": true, +// "isPrivate": false +// } + +$publicSuffix = $rules->getPublicSuffix('www.ulb.ac.be'); +echo json_encode($publicSuffix, JSON_PRETTY_PRINT); +// returns +// { +// "publicSuffix": "ac.be", +// "isKnown": true, +// "isICANN": true, +// "isPrivate": false +// } ~~~ -#### Usage +Using the above code you can parse and get public suffix informations about any valid domain name. -Public suffix resolution is done using the `Pdp\Rules::resolve` method which expects at most two parameters: +### Manipulating the domain name -- `$domain` a domain name as a string -- `$section` a string which specifies which section of the PSL you want to validate the given domain against. The possible values are: - - `Rules::ALL_DOMAINS`, to validate against the full PSL. - - `Rules::ICANN_DOMAINS`, to validate against the PSL ICANN DOMAINS section only. - - `Rules::PRIVATE_DOMAINS`, to validate against the PSL PRIVATE DOMAINS section only. +The `Pdp\Domain` returned by the `Pdp\Rules::resolve` method is an immutable value object representing a valid domain name. This object let's you access all the domain name properties as well as the public suffix informations attached to it using the following methods. -By default, the `$section` argument is equal to `Rules::ALL_DOMAINS`. If an unsupported section is submitted a `Pdp\Exception` exception will be thrown. +~~~php +public function Domain::getLabel(int $key): ?string +public function Domain::keys(?string $label): int[] +public function Domain::getContent(): ?string +public function Domain::getPublicSuffix(): ?string +public function Domain::getRegistrableDomain(): ?string +public function Domain::getSubDomain(); ?string +public function Domain::isKnown(): bool; +public function Domain::isICANN(): bool; +public function Domain::isPrivate(): bool; +~~~ -The `Pdp\Rules::resolve` returns a `Pdp\Domain` object. +*The getter methods returns normalized and lowercased domain labels or `null` if no value was found for a particular domain part.* -The `Pdp\Domain` implements the `Pdp\DomainInterface` +The `Pdp\Domain` object also implements PHP's `Countable` and `IteratorAggregate` interfaces to ease counting and iterating over the domain labels as well as PHP's `JsonSerializable` interfaces to output a JSON array with all the useful informations regarding the domain name. -~~~php -getRules(); +$domain = $rules->resolve('www.bbc.co.uk'); +$newDomain = $domain + ->withPublicSuffix('com') + ->withSubDomain('shop') + ->withLabel(-2, 'example') +; +$newDomain->getContent(); //returns shop.example.com; +$newDomain->isKnown(); //return false; +~~~ -final class Domain implements DomainInterface, JsonSerializable -{ - public function __construct($domain = null, PublicSuffix $publicSuffix = null) - public function getPublicSuffix(): ?string - public function getRegistrableDomain(): ?string - public function getSubDomain(); ?string - public function isKnown(): bool; - public function isICANN(): bool; - public function isPrivate(): bool; - public function withPublicSuffix(PublicSuffix $publicSuffix): self; -} +**WARNING: in the example above the PSL info are lost because the newly attached public suffix had none.** + +To avoid this data loss you should use an already resolved public suffix. + +~~~php +$manager = new Manager(new Cache(), new CurlHttpClient()); +$rules = $manager->getRules(); +$domain = $rules->resolve('www.bbc.co.uk'); +$newPublicSuffix = $rules->getPublicSuffix('example.com'); +$newDomain = $domain + ->withPublicSuffix($newPublicSuffix) + ->withSubDomain('shop') + ->withLabel(-2, 'example') +; +$newDomain->getContent(); //returns shop.example.com; +$newDomain->isKnown(); //return true; ~~~ +### Getting the domain public suffix information. + +The `Pdp\Rules` object is responsible for public suffix resolution for a given domain. Public suffix resolution is done using the `Pdp\Rules::resolve` or `Pdp\Rules::getPublicSuffix` methods which expects at most two parameters: + +- `$domain` a domain name as a string +- `$section` a string which specifies which section of the PSL you want to validate the given domain against. The possible values are: + - `Rules::ALL_DOMAINS`, to validate against the full PSL. + - `Rules::ICANN_DOMAINS`, to validate against the PSL ICANN DOMAINS section only. + - `Rules::PRIVATE_DOMAINS`, to validate against the PSL PRIVATE DOMAINS section only. + +By default, the `$section` argument is equal to `Rules::ALL_DOMAINS`. If an unsupported section is submitted a `Pdp\Exception` exception will be thrown. + +While the `Pdp\Rules::resolve` returns a `Pdp\Domain` object, the `Pdp\Rules::getPublicSuffix` returns a `Pdp\PublicSuffix` object. + **THIS EXAMPLE ILLUSTRATES HOW THE OBJECT WORK BUT SHOULD BE AVOIDED IN PRODUCTON** ~~~php @@ -127,25 +177,6 @@ $pdp_url = 'https://raw.githubusercontent.com/publicsuffix/list/master/public_su $rules = Rules::createFromPath($pdp_url); $domain = $rules->resolve('www.Ulb.AC.be'); //using Rules::ALL_DOMAINS -$domain->getContent(); //returns 'www.ulb.ac.be' -$domain->getPublicSuffix(); //returns 'ac.be' -$domain->getRegistrableDomain(); //returns 'ulb.ac.be' -$domain->getSubDomain(); //returns 'www' -$domain->getLabel(0) //returns 'be' -$domain->getLabel(-1) //returns 'www' -$domain->keys('ulb') //returns [2] -$domain->isKnown(); //returns true -$domain->isICANN(); //returns true -$domain->isPrivate(); //returns false -echo json_encode(iterator_to_array($domain), JSON_PRETTY_PRINT); -// returns -// [ -// 'be', -// 'ac', -// 'ulb', -// 'www' -// ] - echo json_encode($domain, JSON_PRETTY_PRINT); // returns // { @@ -174,34 +205,12 @@ echo json_encode($domain, JSON_PRETTY_PRINT); // } ~~~ -- All `Pdp\Domain` getter methods returns normalized and lowercased domain labels or `null` if no value was found for a particular domain part. - **The domain public suffix status depends on the PSL section used to resolve it:** - `Pdp\Domain::isKnown` returns `true` if the public suffix is found in the selected PSL; - `Pdp\Domain::isICANN` returns `true` if the public suffix is found using a PSL which includes the ICANN DOMAINS section; - `Pdp\Domain::isPrivate` returns `true` if the public suffix is found using a PSL which includes the PRIVATE DOMAINS section; -The `Rules::getPublicSuffix` method expects the same arguments as `Rules::resolve` but returns a `Pdp\PublicSuffix` object instead. - -~~~php -refreshRules('https://publicsuffix.org/list/public_suffix_li if ($retval) { //the local cache has been updated } else { - //the local cache has not been updated + //the local cache was not updated } ~~~ @@ -358,7 +367,6 @@ You can also add a composer script in your `composer.json` file to update the PS } ~~~ - If you prefer using your own implementations you should: 1. Copy the `Pdp\Installer` class diff --git a/composer.json b/composer.json index 4e4b46ad..6e87c122 100644 --- a/composer.json +++ b/composer.json @@ -55,8 +55,7 @@ "autoload": { "psr-4": { "Pdp\\": "src/" - }, - "files": ["src/functions_include.php"] + } }, "autoload-dev": { "psr-4": { diff --git a/src/Converter.php b/src/Converter.php index d1b5adf6..b32844a1 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -21,13 +21,13 @@ * @author Jeremy Kendall * @author Ignace Nyamagana Butera */ -final class Converter +final class Converter implements SectionInterface { use IDNAConverterTrait; /** * Convert the Public Suffix List into - * an associative, multidimensional array + * an associative, multidimensional array. * * @param string $content * @@ -35,7 +35,7 @@ final class Converter */ public function convert(string $content): array { - $rules = [Rules::ICANN_DOMAINS => [], Rules::PRIVATE_DOMAINS => []]; + $rules = [self::ICANN_DOMAINS => [], self::PRIVATE_DOMAINS => []]; $section = ''; $file = new SplTempFileObject(); $file->fwrite($content); @@ -61,8 +61,8 @@ public function convert(string $content): array private function getSection(string $section, string $line): string { static $section_list = [ - 'ICANN' => ['BEGIN' => Rules::ICANN_DOMAINS, 'END' => ''], - 'PRIVATE' => ['BEGIN' => Rules::PRIVATE_DOMAINS, 'END' => ''], + 'ICANN' => ['BEGIN' => self::ICANN_DOMAINS, 'END' => ''], + 'PRIVATE' => ['BEGIN' => self::PRIVATE_DOMAINS, 'END' => ''], ]; static $pattern = ',^// ===(?BEGIN|END) (?ICANN|PRIVATE) DOMAINS===,'; if (preg_match($pattern, $line, $matches)) { diff --git a/src/CurlHttpClient.php b/src/CurlHttpClient.php index 89545d45..ad0e7747 100644 --- a/src/CurlHttpClient.php +++ b/src/CurlHttpClient.php @@ -12,7 +12,7 @@ namespace Pdp; /** - * Simple cURL Http client + * Simple cURL Http client. * * Lifted pretty much completely from William Durand's excellent Geocoder * project @@ -26,14 +26,14 @@ final class CurlHttpClient implements HttpClient { /** - * Additionnal cURL options + * Additionnal cURL options. * * @var array */ private $options; /** - * new instance + * new instance. * * @param array $options additional cURL options */ diff --git a/src/Domain.php b/src/Domain.php index 3a4485d2..a8d8ec4f 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -14,7 +14,7 @@ use JsonSerializable; /** - * Domain Value Object + * Domain Value Object. * * WARNING: "Some people use the PSL to determine what is a valid domain name * and what isn't. This is dangerous, particularly in these days where new @@ -351,22 +351,31 @@ public function toUnicode() } /** - * Returns a new domain name with a different public suffix. + * Returns a Domain object with a new resolve public suffix. * * The Public Suffix must be valid for the given domain name. * ex: if the domain name is www.ulb.ac.be the only valid public suffixes * are: be, ac.be, ulb.ac.be, or the null public suffix. Any other public * suffix will throw an Exception. * - * This method does not change the domain name value it only updates/changes/removes - * a valid public suffix for the given domain name. + * This method does not change the domain conent it only updates/changes/removes + * its public suffix information. * - * @param PublicSuffix $publicSuffix + * @param mixed $publicSuffix * * @return self */ - public function withPublicSuffix(PublicSuffix $publicSuffix): self + public function resolve($publicSuffix): self { + if (!$publicSuffix instanceof PublicSuffix) { + $publicSuffix = new PublicSuffix($publicSuffix); + } + + static $pattern = '/[^\x20-\x7f]/'; + if (null !== $this->domain && preg_match($pattern, $this->domain)) { + $publicSuffix = $publicSuffix->toUnicode(); + } + if ($this->publicSuffix == $publicSuffix) { return $this; } @@ -378,4 +387,176 @@ public function withPublicSuffix(PublicSuffix $publicSuffix): self return $clone; } + + /** + * Returns an instance with the specified sub domain added. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the modified domain with the new sub domain + * + * @param mixed $subDomain the subdomain to add + * + * @throws Exception If the Sub domain is invalid or can not be added to the current Domain + * + * @return self + */ + public function withSubDomain($subDomain): self + { + if (!$subDomain instanceof PublicSuffix) { + $subDomain = new PublicSuffix($subDomain); + } + + if (null === $this->publicSuffix->getContent()) { + throw new Exception('A subdomain can not be added to domain without a public suffix.'); + } + + static $pattern = '/[^\x20-\x7f]/'; + $subDomain = $subDomain->toAscii(); + if (null !== $this->domain && preg_match($pattern, $this->domain)) { + $subDomain = $subDomain->toUnicode(); + } + + $subDomain = $subDomain->getContent(); + if ($subDomain === $this->subDomain) { + return $this; + } + + $newDomain = $this->registrableDomain; + if (null !== $subDomain) { + $newDomain = $subDomain.'.'.$newDomain; + } + + return new Domain($newDomain, $this->publicSuffix); + } + + /** + * Returns an instance with the specified public suffix added. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the modified component with the new public suffix + * + * @param mixed $publicSuffix + * + * @throws Exception If the public suffix is invalid or can not be added to the current Domain + * + * @return self + */ + public function withPublicSuffix($publicSuffix): self + { + if (!$publicSuffix instanceof PublicSuffix) { + $publicSuffix = new PublicSuffix($publicSuffix); + } + + if (null === $this->publicSuffix->getContent()) { + throw new Exception('A public suffix can not be added to domain without a public suffix.'); + } + + static $pattern = '/[^\x20-\x7f]/'; + $publicSuffix = $publicSuffix->toAscii(); + if (null !== $this->domain && preg_match($pattern, $this->domain)) { + $publicSuffix = $publicSuffix->toUnicode(); + } + + if ($this->publicSuffix == $publicSuffix) { + return $this; + } + + $newDomain = $this->labels[count($this->publicSuffix)]; + if (null !== $this->subDomain) { + $newDomain = $this->subDomain.'.'.$newDomain; + } + + if (null !== $publicSuffix->getContent()) { + $newDomain .= '.'.$publicSuffix->getContent(); + } + + return new Domain($newDomain, $publicSuffix); + } + + /** + * Returns an instance with the specified label added at the specified key. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the modified domain with the new label + * + * @param int $key + * @param mixed $label + * + * @throws Exception If the key is out of bounds + * @throws Exception If the label is invalid + * + * @return self + */ + public function withLabel(int $key, $label): self + { + if (!$label instanceof PublicSuffix) { + $label = new PublicSuffix($label); + } + + if (null === $label->getContent() || 1 !== count($label)) { + throw new Exception(sprintf('The label `%s` is invalid', $label->getContent())); + } + + static $pattern = '/[^\x20-\x7f]/'; + $label = $label->toAscii(); + if (null !== $this->domain && preg_match($pattern, $this->domain)) { + $label = $label->toUnicode(); + } + + $label = $label->getContent(); + $nb_labels = count($this->labels); + $offset = filter_var($key, FILTER_VALIDATE_INT, ['options' => ['min_range' => - $nb_labels - 1, 'max_range' => $nb_labels]]); + if (false === $offset) { + throw new Exception(sprintf('the given key `%s` is invalid', $key)); + } + + if ($offset < 0) { + $offset = $nb_labels + $offset; + } + + if ($label === ($this->labels[$offset] ?? null)) { + return $this; + } + + $labels = $this->labels; + $labels[$offset] = $label; + + return new Domain( + implode('.', array_reverse($labels)), + $offset < 0 || null === $this->publicSuffix->getLabel($offset) ? $this->publicSuffix : null + ); + } + + /** + * Returns an instance with the label at the specified key removed. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the modified domain with the label removed + * + * @param int $key + * + * @throws Exception If the key is out of bounds + * + * @return self + */ + public function withoutLabel(int $key): self + { + $nb_labels = count($this->labels); + $offset = filter_var($key, FILTER_VALIDATE_INT, ['options' => ['min_range' => - $nb_labels, 'max_range' => $nb_labels - 1]]); + if (false === $offset) { + throw new Exception(sprintf('the given key `%s` is invalid', $key)); + } + + if ($offset < 0) { + $offset = $nb_labels + $offset; + } + + $labels = $this->labels; + unset($labels[$offset]); + + return new Domain( + implode('.', array_reverse($labels)), + $offset < 0 || null == $this->publicSuffix->getLabel($offset) ? $this->publicSuffix : null + ); + } } diff --git a/src/DomainInterface.php b/src/DomainInterface.php index f22dd5ba..8d79d121 100644 --- a/src/DomainInterface.php +++ b/src/DomainInterface.php @@ -15,7 +15,7 @@ use IteratorAggregate; /** - * Domain Interface + * Domain Interface. * * @see https://tools.ietf.org/html/rfc1034#section-3.5 * @see https://tools.ietf.org/html/rfc1123#section-2.1 diff --git a/src/HttpClient.php b/src/HttpClient.php index ea6501e1..e78eb33a 100644 --- a/src/HttpClient.php +++ b/src/HttpClient.php @@ -1,6 +1,6 @@ */ final class Installer { /** - * Script to update the local cache using composer hook + * Script to update the local cache using composer hook. * * @param Event $event */ @@ -75,7 +75,7 @@ public static function updateLocalCache(Event $event = null) } /** - * Detect the vendor path + * Detect the vendor path. * * @param Event $event * @@ -99,7 +99,7 @@ private static function getVendorPath(Event $event = null) } /** - * Detect the I/O interface to use + * Detect the I/O interface to use. * * @param Event|null $event * diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 766bd72f..586b8a18 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -14,7 +14,7 @@ use JsonSerializable; /** - * Public Suffix Value Object + * Public Suffix Value Object. * * WARNING: "Some people use the PSL to determine what is a valid domain name * and what isn't. This is dangerous, particularly in these days where new @@ -26,7 +26,7 @@ * * @author Ignace Nyamagana Butera */ -final class PublicSuffix implements DomainInterface, JsonSerializable +final class PublicSuffix implements DomainInterface, JsonSerializable, SectionInterface { use IDNAConverterTrait; @@ -54,7 +54,7 @@ public static function __set_state(array $properties): self } /** - * Create an new instance from a Domain object + * Create an new instance from a Domain object. * * @param Domain $domain * @@ -67,10 +67,10 @@ public static function createFromDomain(Domain $domain): self } if ($domain->isICANN()) { - return new self($domain->getPublicSuffix(), Rules::ICANN_DOMAINS); + return new self($domain->getPublicSuffix(), self::ICANN_DOMAINS); } - return new self($domain->getPublicSuffix(), Rules::PRIVATE_DOMAINS); + return new self($domain->getPublicSuffix(), self::PRIVATE_DOMAINS); } /** @@ -86,7 +86,7 @@ public function __construct($publicSuffix = null, string $section = '') } /** - * Set the public suffix section + * Set the public suffix section. * * @param string $section * @@ -185,7 +185,7 @@ public function isKnown(): bool */ public function isICANN(): bool { - return Rules::ICANN_DOMAINS === $this->section; + return self::ICANN_DOMAINS === $this->section; } /** @@ -195,7 +195,7 @@ public function isICANN(): bool */ public function isPrivate(): bool { - return Rules::PRIVATE_DOMAINS === $this->section; + return self::PRIVATE_DOMAINS === $this->section; } /** diff --git a/src/Rules.php b/src/Rules.php index d34f73da..5b866ed7 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -12,19 +12,15 @@ namespace Pdp; /** - * A class to resolve domain name against the Public Suffix list + * A class to resolve domain name against the Public Suffix list. * * @author Jeremy Kendall * @author Ignace Nyamagana Butera */ -final class Rules +final class Rules implements SectionInterface { - const ALL_DOMAINS = 'ALL_DOMAINS'; - const ICANN_DOMAINS = 'ICANN_DOMAINS'; - const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; - /** - * PSL rules as a multidimentional associative array + * PSL rules as a multidimentional associative array. * * @var array */ @@ -145,7 +141,7 @@ public function resolve($domain = null, string $section = self::ALL_DOMAINS): Do $publicSuffix = new PublicSuffix($domain->getLabel(0)); } - return $domain->withPublicSuffix($publicSuffix); + return $domain->resolve($publicSuffix); } catch (Exception $e) { return new Domain(); } diff --git a/src/SectionInterface.php b/src/SectionInterface.php new file mode 100644 index 00000000..abe03d81 --- /dev/null +++ b/src/SectionInterface.php @@ -0,0 +1,24 @@ + + */ +interface SectionInterface +{ + const ALL_DOMAINS = 'ALL_DOMAINS'; + const ICANN_DOMAINS = 'ICANN_DOMAINS'; + const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; +} diff --git a/src/functions.php b/src/functions.php deleted file mode 100644 index 1b7be7cd..00000000 --- a/src/functions.php +++ /dev/null @@ -1,191 +0,0 @@ -getContent()) { - return $subject; - } - - $dContent = $subject->getContent(); - if (null === $dContent) { - return $host instanceof DomainInterface ? new Domain($host) : $host; - } - - static $pattern = '/[^\x20-\x7f]/'; - $host = preg_match($pattern, $dContent) ? $host->toUnicode() : $host->toAscii(); - $domain = new Domain($dContent.'.'.$host->getContent()); - - if ($host instanceof PublicSuffix) { - return $domain->withPublicSuffix($host); - } - - if ($host instanceof Domain) { - return $domain->withPublicSuffix(PublicSuffix::createFromDomain($host)); - } - - return $domain; -} - -/** - * Prepend a domain name to another domain name. - * - * @param mixed $host - * @param mixed $subject - * - * @return Domain - */ -function prepend($host, $subject): Domain -{ - if (!$subject instanceof Domain) { - $subject = new Domain($subject); - } - - if (!$host instanceof DomainInterface) { - $host = new Domain($host); - } - - if (null === $host->getContent()) { - return $subject; - } - - $dContent = $subject->getContent(); - if (null === $dContent) { - return $host instanceof DomainInterface ? new Domain($host) : $host; - } - - static $pattern = '/[^\x20-\x7f]/'; - $host = preg_match($pattern, $dContent) ? $host->toUnicode() : $host->toAscii(); - - return new Domain($host->getContent().'.'.$dContent, PublicSuffix::createFromDomain($subject)); -} - -/** - * Replace a label from the domain with a domain name - * - * @param int $key - * @param mixed $label - * @param mixed $subject - * - * @return Domain - */ -function replace(int $key, $label, $subject): Domain -{ - if (!$subject instanceof Domain) { - $subject = new Domain($subject); - } - - if (!$label instanceof DomainInterface) { - $label = new Domain($label); - } - - if (null === $label->getContent()) { - return $subject; - } - - $nb_labels = count($subject); - $offset = filter_var($key, FILTER_VALIDATE_INT, ['options' => ['min_range' => - $nb_labels, 'max_range' => $nb_labels - 1]]); - if (false === $offset) { - throw new Exception(sprintf('no label was found for the given key `%s`', $key)); - } - - if ($offset < 0) { - $offset = $nb_labels + $offset; - } - - static $pattern = '/[^\x20-\x7f]/'; - $label = preg_match($pattern, $subject->getContent()) ? $label->toUnicode() : $label->toAscii(); - if ($label->getContent() === $subject->getLabel($offset)) { - return $subject; - } - - $labels = iterator_to_array($subject, false); - $labels[$offset] = $label->getContent(); - $domain = new Domain(implode('.', array_reverse($labels))); - - $subjectPS = PublicSuffix::createFromDomain($subject); - if ($key >= count($subjectPS)) { - return $domain->withPublicSuffix($subjectPS); - } - - if ($key !== 0) { - return $domain; - } - - if ($label instanceof PublicSuffix) { - return $domain->withPublicSuffix($label); - } - - if ($label instanceof Domain) { - return $domain->withPublicSuffix(PublicSuffix::createFromDomain($label)); - } - - return $domain->withPublicSuffix(new PublicSuffix($label->getContent())); -} - -/** - * Replace the public suffix for a given Domain name. - * - * If the domain has no information regarding its public suffix - * its last label will be considered as its public suffix label and will - * be replaced. - * - * @param mixed $publicSuffix - * @param mixed $subject - * - * @return Domain - */ -function public_suffix_replace($publicSuffix, $subject): Domain -{ - if (!$subject instanceof Domain) { - $subject = new Domain($subject); - $subject = $subject->withPublicSuffix(new PublicSuffix($subject->getLabel(0))); - } - - if (!$publicSuffix instanceof PublicSuffix) { - $publicSuffix = new PublicSuffix($publicSuffix); - } - - if (null === $publicSuffix->getContent()) { - return $subject->withPublicSuffix($publicSuffix); - } - - $dContent = $subject->getContent(); - $dPublicSuffix = $subject->getPublicSuffix(); - - static $pattern = '/[^\x20-\x7f]/'; - $publicSuffix = preg_match($pattern, $dContent) ? $publicSuffix->toUnicode() : $publicSuffix->toAscii(); - - $psContent = $publicSuffix->getContent(); - if ($dPublicSuffix === $psContent) { - return $subject; - } - - return new Domain(substr($dContent, 0, - strlen($dPublicSuffix)).$psContent, $publicSuffix); -} diff --git a/src/functions_include.php b/src/functions_include.php deleted file mode 100644 index 1b604cb3..00000000 --- a/src/functions_include.php +++ /dev/null @@ -1,6 +0,0 @@ -assertSame($expected, $domain->withPublicSuffix($publicSuffix)->getPublicSuffix()); + $this->assertSame($expected, $domain->resolve($publicSuffix)->getPublicSuffix()); } - public function withPublicSuffixWorksProvider() + public function resolvePassProvider() { $publicSuffix = new PublicSuffix('ac.be', Rules::ICANN_DOMAINS); $domain = new Domain('ulb.ac.be', $publicSuffix); @@ -364,11 +364,21 @@ public function withPublicSuffixWorksProvider() 'public suffix' => new PublicSuffix(), 'expected' => null, ], + 'null public suffix (with null value)' => [ + 'domain' => $domain, + 'public suffix' => null, + 'expected' => null, + ], 'same public suffix' => [ 'domain' => $domain, 'public suffix' => $publicSuffix, 'expected' => 'ac.be', ], + 'same public suffix (with string value)' => [ + 'domain' => $domain, + 'public suffix' => 'ac.be', + 'expected' => 'ac.be', + ], 'update public suffix' => [ 'domain' => $domain, 'public suffix' => new PublicSuffix('be', Rules::ICANN_DOMAINS), @@ -391,16 +401,16 @@ public function withPublicSuffixWorksProvider() * @param Domain $domain * @param PublicSuffix $publicSuffix * - * @covers ::withPublicSuffix - * @dataProvider withPublicSuffixFailsProvider + * @covers ::resolve + * @dataProvider resolveFailsProvider */ - public function testWithPublicSuffixFails(Domain $domain, PublicSuffix $publicSuffix) + public function testResolveFails(Domain $domain, PublicSuffix $publicSuffix) { $this->expectException(Exception::class); - $domain->withPublicSuffix($publicSuffix); + $domain->resolve($publicSuffix); } - public function withPublicSuffixFailsProvider() + public function resolveFailsProvider() { $publicSuffix = new PublicSuffix('ac.be', Rules::ICANN_DOMAINS); $domain = new Domain('ulb.ac.be', $publicSuffix); @@ -430,13 +440,400 @@ public function withPublicSuffixFailsProvider() } /** - * @covers ::withPublicSuffix + * @covers ::resolve */ - public function testWithPublicSuffixReturnsInstance() + public function testResolveReturnsInstance() { $publicSuffix = new PublicSuffix('ac.be', Rules::ICANN_DOMAINS); $domain = new Domain('ulb.ac.be', $publicSuffix); - $this->assertSame($domain, $domain->withPublicSuffix($publicSuffix)); - $this->assertNotSame($domain, $domain->withPublicSuffix(new PublicSuffix('ac.be', Rules::PRIVATE_DOMAINS))); + $this->assertSame($domain, $domain->resolve($publicSuffix)); + $this->assertNotSame($domain, $domain->resolve(new PublicSuffix('ac.be', Rules::PRIVATE_DOMAINS))); + } + + /** + * @covers ::withSubDomain + * @dataProvider withSubDomainWorksProvider + * + * @param Domain $domain + * @param mixed $subdomain + * @param null|string $expected + */ + public function testWithSubDomainWorks(Domain $domain, $subdomain, $expected) + { + $result = $domain->withSubDomain($subdomain); + $this->assertSame($expected, $result->getSubDomain()); + $this->assertSame($domain->getPublicSuffix(), $result->getPublicSuffix()); + $this->assertSame($domain->getRegistrableDomain(), $result->getRegistrableDomain()); + $this->assertSame($domain->isKnown(), $result->isKnown()); + $this->assertSame($domain->isICANN(), $result->isICANN()); + $this->assertSame($domain->isPrivate(), $result->isPrivate()); + } + + public function withSubDomainWorksProvider() + { + return [ + 'simple addition' => [ + 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), + 'subdomain' => 'www', + 'expected' => 'www', + ], + 'simple addition IDN (1)' => [ + 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), + 'subdomain' => 'bébé', + 'expected' => 'xn--bb-bjab', + ], + 'simple addition IDN (2)' => [ + 'domain' => new Domain('Яндекс.РФ', new PublicSuffix('рф', Rules::ICANN_DOMAINS)), + 'subdomain' => 'bébé', + 'expected' => 'bébé', + ], + 'simple removal' => [ + 'domain' => new Domain('www.example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), + 'subdomain' => null, + 'expected' => null, + ], + 'simple removal IDN' => [ + 'domain' => new Domain('bébé.Яндекс.РФ', new PublicSuffix('рф', Rules::ICANN_DOMAINS)), + 'subdomain' => 'xn--bb-bjab', + 'expected' => 'bébé', + ], + ]; + } + + /** + * @covers ::withSubDomain + */ + public function testWithSubDomainFailsWithNullDomain() + { + $this->expectException(Exception::class); + (new Domain())->withSubDomain('www'); + } + + /** + * @covers ::withSubDomain + */ + public function testWithSubDomainFailsWithOneLabelDomain() + { + $this->expectException(Exception::class); + (new Domain('localhost'))->withSubDomain('www'); + } + + /** + * @covers ::withSubDomain + */ + public function testWithSubDomainWithoutPublicSuffixInfo() + { + $this->expectException(Exception::class); + (new Domain('www.example.com'))->withSubDomain('www'); + } + + /** + * @covers ::withPublicSuffix + * @dataProvider withPublicSuffixWorksProvider + * + * @param Domain $domain + * @param mixed $publicSuffix + * @param null|string $expected + * @param bool $isKnown + * @param bool $isICANN + * @param bool $isPrivate + */ + public function testWithPublicSuffixWorks( + Domain $domain, + $publicSuffix, + $expected, + bool $isKnown, + bool $isICANN, + bool $isPrivate + ) { + $result = $domain->withPublicSuffix($publicSuffix); + $this->assertSame($expected, $result->getPublicSuffix()); + $this->assertSame($isKnown, $result->isKnown()); + $this->assertSame($isICANN, $result->isICANN()); + $this->assertSame($isPrivate, $result->isPrivate()); + } + + public function withPublicSuffixWorksProvider() + { + $base_domain = new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)); + + return [ + 'simple update (1)' => [ + 'domain' => $base_domain, + 'publicSuffix' => 'be', + 'expected' => 'be', + 'isKnown' => false, + 'isICANN' => false, + 'isPrivate' => false, + ], + 'simple update (2)' => [ + 'domain' => $base_domain, + 'publicSuffix' => new PublicSuffix('github.io', Rules::PRIVATE_DOMAINS), + 'expected' => 'github.io', + 'isKnown' => true, + 'isICANN' => false, + 'isPrivate' => true, + ], + 'same public suffix but PSL info is changed' => [ + 'domain' => $base_domain, + 'publicSuffix' => new PublicSuffix('com', Rules::PRIVATE_DOMAINS), + 'expected' => 'com', + 'isKnown' => true, + 'isICANN' => false, + 'isPrivate' => true, + ], + 'same public suffix but PSL info does not changed' => [ + 'domain' => $base_domain, + 'publicSuffix' => new PublicSuffix('com', Rules::ICANN_DOMAINS), + 'expected' => 'com', + 'isKnown' => true, + 'isICANN' => true, + 'isPrivate' => false, + ], + 'simple update IDN (1)' => [ + 'domain' => $base_domain, + 'publicSuffix' => new PublicSuffix('рф', Rules::ICANN_DOMAINS), + 'expected' => 'xn--p1ai', + 'isKnown' => true, + 'isICANN' => true, + 'isPrivate' => false, + ], + 'simple update IDN (2)' => [ + 'domain' => new Domain('www.bébé.be', new PublicSuffix('be', Rules::ICANN_DOMAINS)), + 'publicSuffix' => new PublicSuffix('xn--p1ai', Rules::ICANN_DOMAINS), + 'expected' => 'рф', + 'isKnown' => true, + 'isICANN' => true, + 'isPrivate' => false, + ], + ]; + } + + /** + * @covers ::withPublicSuffix + */ + public function testWithPublicSuffixFailsWithNullDomain() + { + $this->expectException(Exception::class); + (new Domain())->withPublicSuffix('www'); + } + + /** + * @covers ::withPublicSuffix + */ + public function testWithPublicSuffixFailsWithOneLabelDomain() + { + $this->expectException(Exception::class); + (new Domain('localhost'))->withPublicSuffix('www'); + } + + /** + * @covers ::withPublicSuffix + */ + public function testWithPublicSuffixWithoutPublicSuffixInfo() + { + $this->expectException(Exception::class); + (new Domain('www.example.com'))->withPublicSuffix('www'); + } + + /** + * @covers ::withLabel + * @dataProvider withLabelWorksProvider + * + * @param Domain $domain + * @param int $key + * @param mixed $label + * @param null|string $expected + * @param bool $isKnown + * @param bool $isICANN + * @param bool $isPrivate + */ + public function testWithLabelWorks( + Domain $domain, + int $key, + $label, + $expected, + bool $isKnown, + bool $isICANN, + bool $isPrivate + ) { + $result = $domain->withLabel($key, $label); + $this->assertSame($expected, $result->getContent()); + $this->assertSame($isKnown, $result->isKnown()); + $this->assertSame($isICANN, $result->isICANN()); + $this->assertSame($isPrivate, $result->isPrivate()); + } + + public function withLabelWorksProvider() + { + $base_domain = new Domain('www.example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)); + + return [ + 'simple replace positive offset' => [ + 'domain' => $base_domain, + 'key' => 2, + 'label' => 'shop', + 'expected' => 'shop.example.com', + 'isKnown' => true, + 'isICANN' => true, + 'isPrivate' => false, + ], + 'simple replace negative offset' => [ + 'domain' => $base_domain, + 'key' => -1, + 'label' => 'shop', + 'expected' => 'shop.example.com', + 'isKnown' => true, + 'isICANN' => true, + 'isPrivate' => false, + ], + 'simple addition positive offset' => [ + 'domain' => $base_domain, + 'key' => 3, + 'label' => 'shop', + 'expected' => 'shop.www.example.com', + 'isKnown' => true, + 'isICANN' => true, + 'isPrivate' => false, + ], + 'simple addition negative offset' => [ + 'domain' => $base_domain, + 'key' => -4, + 'label' => 'shop', + 'expected' => 'shop.www.example.com', + 'isKnown' => true, + 'isICANN' => true, + 'isPrivate' => false, + ], + 'simple replace remove PSL info' => [ + 'domain' => $base_domain, + 'key' => 0, + 'label' => 'fr', + 'expected' => 'www.example.fr', + 'isKnown' => false, + 'isICANN' => false, + 'isPrivate' => false, + ], + 'replace without any change' => [ + 'domain' => $base_domain, + 'key' => 2, + 'label' => 'www', + 'expected' => 'www.example.com', + 'isKnown' => true, + 'isICANN' => true, + 'isPrivate' => false, + ], + 'simple update IDN (1)' => [ + 'domain' => $base_domain, + 'key' => 2, + 'label' => 'рф', + 'expected' => 'xn--p1ai.example.com', + 'isKnown' => true, + 'isICANN' => true, + 'isPrivate' => false, + ], + 'simple update IDN (2)' => [ + 'domain' => new Domain('www.bébé.be', new PublicSuffix('be', Rules::ICANN_DOMAINS)), + 'key' => 2, + 'label' => 'xn--p1ai', + 'expected' => 'рф.bébé.be', + 'isKnown' => true, + 'isICANN' => true, + 'isPrivate' => false, + ], + ]; + } + + /** + * @covers ::withLabel + */ + public function testWithLabelFailsWithInvalidKey() + { + $this->expectException(Exception::class); + (new Domain('example.com'))->withLabel(-4, 'www'); + } + + /** + * @covers ::withLabel + */ + public function testWithLabelFailsWithInvalidLabel() + { + $this->expectException(Exception::class); + (new Domain('example.com'))->withLabel(-1, 'www.shop'); + } + + /** + * @covers ::withoutLabel + * @dataProvider withoutLabelWorksProvider + * + * @param Domain $domain + * @param int $key + * @param null|string $expected + * @param bool $isKnown + * @param bool $isICANN + * @param bool $isPrivate + */ + public function testWithoutLabelWorks( + Domain $domain, + int $key, + $expected, + bool $isKnown, + bool $isICANN, + bool $isPrivate + ) { + $result = $domain->withoutLabel($key); + $this->assertSame($expected, $result->getContent()); + $this->assertSame($isKnown, $result->isKnown()); + $this->assertSame($isICANN, $result->isICANN()); + $this->assertSame($isPrivate, $result->isPrivate()); + } + + public function withoutLabelWorksProvider() + { + $base_domain = new Domain('www.example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)); + + return [ + 'simple removal positive offset' => [ + 'domain' => $base_domain, + 'key' => 2, + 'expected' => 'example.com', + 'isKnown' => true, + 'isICANN' => true, + 'isPrivate' => false, + ], + 'simple removal negative offset' => [ + 'domain' => $base_domain, + 'key' => -1, + 'expected' => 'example.com', + 'isKnown' => true, + 'isICANN' => true, + 'isPrivate' => false, + ], + 'simple removal strip PSL info positive offset' => [ + 'domain' => $base_domain, + 'key' => 0, + 'expected' => 'www.example', + 'isKnown' => false, + 'isICANN' => false, + 'isPrivate' => false, + ], + 'simple removal strip PSL info negative offset' => [ + 'domain' => $base_domain, + 'key' => -3, + 'expected' => 'www.example', + 'isKnown' => false, + 'isICANN' => false, + 'isPrivate' => false, + ], + ]; + } + + /** + * @covers ::withoutLabel + */ + public function testWithoutLabelFailsWithInvalidKey() + { + $this->expectException(Exception::class); + (new Domain('example.com'))->withoutLabel(-3); } } diff --git a/tests/FunctionsTest.php b/tests/FunctionsTest.php deleted file mode 100644 index b2cc8167..00000000 --- a/tests/FunctionsTest.php +++ /dev/null @@ -1,526 +0,0 @@ -assertSame($expected, $result->getContent()); - $this->assertSame($isKnown, $result->isKnown()); - $this->assertSame($isIcann, $result->isICANN()); - $this->assertSame($isPrivate, $result->isPrivate()); - } - - public function prependProvider() - { - return [ - 'simple prepend' => [ - 'domain' => 'example.com', - 'host' => 'www', - 'expected' => 'www.example.com', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - 'prepend with a null domain' => [ - 'domain' => 'example.com', - 'host' => null, - 'expected' => 'example.com', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - 'prepend a null domain' => [ - 'domain' => null, - 'host' => 'example.com', - 'expected' => 'example.com', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - 'prepend does not change PSL info (1)' => [ - 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), - 'host' => new Domain(), - 'expected' => 'example.com', - 'isKnown' => true, - 'isIcann' => true, - 'isPrivate' => false, - ], - 'prepend does not change PSL info (2)' => [ - 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), - 'host' => new PublicSuffix('bar', Rules::PRIVATE_DOMAINS), - 'expected' => 'bar.example.com', - 'isKnown' => true, - 'isIcann' => true, - 'isPrivate' => false, - ], - 'prepend convert host format: IDN to ASCII process' => [ - 'domain' => 'example.com', - 'host' => '中国', - 'expected' => 'xn--fiqs8s.example.com', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - 'prepend convert host format: ASCII to IDN process' => [ - 'domain' => '食狮.中国', - 'host' => 'xn--fiqs8s', - 'expected' => '中国.食狮.中国', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - 'test general DomainInterface object' => [ - 'domain' => 'example.com', - 'host' => new class() implements DomainInterface { - public function getContent() - { - return 'be'; - } - - public function count() - { - return 1; - } - - public function getIterator() - { - foreach (['be'] as $label) { - yield $label; - } - } - - public function toUnicode() - { - return clone $this; - } - - public function toAscii() - { - return clone $this; - } - - public function keys(string $label): array - { - return []; - } - - public function getLabel(int $key) - { - return null; - } - }, - 'expected' => 'be.example.com', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - ]; - } - - /** - * @dataProvider appendProvider - * @covers \Pdp\append - * @covers \Pdp\PublicSuffix::createFromDomain - * - * @param mixed $domain - * @param mixed $host - * @param null|string $expected - * @param bool $isKnown - * @param bool $isIcann - * @param bool $isPrivate - */ - public function testAppend( - $domain, - $host, - $expected, - bool $isKnown, - bool $isIcann, - bool $isPrivate - ) { - $result = Pdp\append($host, $domain); - $this->assertSame($expected, $result->getContent()); - $this->assertSame($isKnown, $result->isKnown()); - $this->assertSame($isPrivate, $result->isPrivate()); - $this->assertSame($isIcann, $result->isICANN()); - } - - public function appendProvider() - { - return [ - 'simple append' => [ - 'domain' => 'example.com', - 'host' => 'be', - 'expected' => 'example.com.be', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - 'append a null domain' => [ - 'domain' => null, - 'host' => 'example.com', - 'expected' => 'example.com', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - 'append with a null domain' => [ - 'domain' => 'example.com', - 'host' => null, - 'expected' => 'example.com', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - 'adding a null public suffix returns the domain without PSL info changed' => [ - 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), - 'host' => new PublicSuffix(), - 'expected' => 'example.com', - 'isKnown' => true, - 'isIcann' => true, - 'isPrivate' => false, - ], - 'new domain inherit the new PublicSuffix PSL info' => [ - 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), - 'host' => new PublicSuffix('bar', Rules::PRIVATE_DOMAINS), - 'expected' => 'example.com.bar', - 'isKnown' => true, - 'isIcann' => false, - 'isPrivate' => true, - ], - 'Publix suffix is converted to the domain format: IDN to ASCII process' => [ - 'domain' => 'example.com', - 'host' => '中国', - 'expected' => 'example.com.xn--fiqs8s', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - 'Publix suffix is converted to the domain format: ASCII to IDN process' => [ - 'domain' => '食狮.中国', - 'host' => 'xn--fiqs8s', - 'expected' => '食狮.中国.中国', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - 'test general DomainInterface object' => [ - 'domain' => 'example.com', - 'host' => new class() implements DomainInterface { - public function getContent() - { - return 'be'; - } - - public function count() - { - return 1; - } - - public function getIterator() - { - foreach (['be'] as $label) { - yield $label; - } - } - - public function toUnicode() - { - return clone $this; - } - - public function toAscii() - { - return clone $this; - } - - public function keys(string $label): array - { - return []; - } - - public function getLabel(int $key) - { - return null; - } - }, - 'expected' => 'example.com.be', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - ]; - } - - /** - * @dataProvider publicSuffixReplaceProvider - * @covers \Pdp\public_suffix_replace - * - * @param mixed $domain - * @param mixed $publicSuffix - * @param null|string $expected - * @param bool $isKnown - * @param bool $isIcann - * @param bool $isPrivate - */ - public function testPublicSuffixReplace( - $domain, - $publicSuffix, - $expected, - bool $isKnown, - bool $isIcann, - bool $isPrivate - ) { - $result = Pdp\public_suffix_replace($publicSuffix, $domain); - $this->assertSame($expected, $result->getContent()); - $this->assertSame($isKnown, $result->isKnown()); - $this->assertSame($isPrivate, $result->isPrivate()); - $this->assertSame($isIcann, $result->isICANN()); - } - - public function publicSuffixReplaceProvider() - { - return [ - 'simple replace' => [ - 'domain' => 'example.com', - 'host' => 'be', - 'expected' => 'example.be', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - 'replace with null public suffix returns the domain only' => [ - 'domain' => 'example.com', - 'host' => null, - 'expected' => 'example.com', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - 'Publix suffix is converted to the domain format: IDN to ASCII process' => [ - 'domain' => 'example.com', - 'host' => '中国', - 'expected' => 'example.xn--fiqs8s', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - 'Publix suffix is converted to the domain format: ASCII to IDN process' => [ - 'domain' => '食狮.中国', - 'host' => 'xn--fiqs8s', - 'expected' => '食狮.中国', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - 'new domain inherit the new PublicSuffix PSL info' => [ - 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), - 'host' => new PublicSuffix('bar', Rules::PRIVATE_DOMAINS), - 'expected' => 'example.bar', - 'isKnown' => true, - 'isIcann' => false, - 'isPrivate' => true, - ], - 'replacing with a null public suffix returns the domain without PSL info' => [ - 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), - 'host' => new PublicSuffix(), - 'expected' => 'example.com', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - ]; - } - - /** - * @covers \Pdp\public_suffix_replace - */ - public function testPublicSuffixReplaceThrowsException() - { - $this->expectException(Exception::class); - Pdp\public_suffix_replace('com', 'localhost'); - } - - /** - * @dataProvider replaceProvider - * @covers \Pdp\replace - * @covers \Pdp\PublicSuffix::createFromDomain - * - * @param mixed $domain - * @param mixed $host - * @param int $key - * @param null|string $expected - * @param bool $isKnown - * @param bool $isIcann - * @param bool $isPrivate - */ - public function testReplace( - $domain, - $host, - $key, - $expected, - bool $isKnown, - bool $isIcann, - bool $isPrivate - ) { - $result = Pdp\replace($key, $host, $domain); - $this->assertSame($expected, $result->getContent()); - $this->assertSame($isKnown, $result->isKnown()); - $this->assertSame($isIcann, $result->isICANN()); - $this->assertSame($isPrivate, $result->isPrivate()); - } - - public function replaceProvider() - { - return [ - 'simple replace' => [ - 'domain' => 'example.com', - 'host' => 'be', - 'key' => 0, - 'expected' => 'example.be', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - 'replace with null public suffix (1)' => [ - 'domain' => 'example.com', - 'host' => null, - 'key' => 1, - 'expected' => 'example.com', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - 'replace with null public suffix (2)' => [ - 'domain' => new Domain('www.ulb.ac.be', new PublicSuffix('ac.be', Rules::ICANN_DOMAINS)), - 'host' => new Domain('Foo'), - 'key' => -3, - 'expected' => 'www.ulb.foo.be', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - 'Publix suffix conversion: IDN to ASCII process' => [ - 'domain' => 'example.com', - 'host' => '中国', - 'key' => 0, - 'expected' => 'example.xn--fiqs8s', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - 'Publix suffix conversion: ASCII to IDN process' => [ - 'domain' => '食狮.中国', - 'host' => 'xn--fiqs8s', - 'key' => 0, - 'expected' => '食狮.中国', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - 'Domain inherits PublicSuffix PSL info' => [ - 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), - 'host' => new PublicSuffix('bar', Rules::PRIVATE_DOMAINS), - 'key' => 0, - 'expected' => 'example.bar', - 'isKnown' => true, - 'isIcann' => false, - 'isPrivate' => true, - ], - 'test Domain object' => [ - 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), - 'host' => new Domain('ulb.ac.be', new PublicSuffix('ac.be', Rules::PRIVATE_DOMAINS)), - 'key' => 0, - 'expected' => 'example.ulb.ac.be', - 'isKnown' => true, - 'isIcann' => false, - 'isPrivate' => true, - ], - 'test general DomainInterface object' => [ - 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), - 'host' => new class() implements DomainInterface { - public function getContent() - { - return 'be'; - } - - public function count() - { - return 1; - } - - public function getIterator() - { - foreach (['be'] as $label) { - yield $label; - } - } - - public function toUnicode() - { - return clone $this; - } - - public function toAscii() - { - return clone $this; - } - - public function keys(string $label): array - { - return []; - } - - public function getLabel(int $key) - { - return null; - } - }, - 'key' => 0, - 'expected' => 'example.be', - 'isKnown' => false, - 'isIcann' => false, - 'isPrivate' => false, - ], - ]; - } - - /** - * @covers \Pdp\replace - */ - public function testReplaceThrowsException() - { - $this->expectException(Exception::class); - Pdp\replace(-23, 'com', 'localhost'); - } -} diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 19eb5742..e56df59d 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -4,8 +4,10 @@ namespace Pdp\Tests; +use Pdp\Domain; use Pdp\Exception; use Pdp\PublicSuffix; +use Pdp\Rules; use PHPUnit\Framework\TestCase; /** @@ -133,4 +135,38 @@ public function testOffsets() $domain = new PublicSuffix('master.example.com'); $this->assertSame([2], $domain->keys('master')); } + + /** + * @covers ::createFromDomain + * @dataProvider createFromDomainProvider + * + * @param Domain $domain + * @param null|string $expected + */ + public function testCreateFromDomainWorks(Domain $domain, $expected) + { + $result = PublicSuffix::createFromDomain($domain); + $this->assertSame($expected, $result->getContent()); + $this->assertSame($result->isKnown(), $domain->isKnown()); + $this->assertSame($result->isICANN(), $domain->isICANN()); + $this->assertSame($result->isPrivate(), $domain->isPrivate()); + } + + public function createFromDomainProvider() + { + return [ + [ + 'domain' => new Domain('www.bébé.be', new PublicSuffix('be', Rules::ICANN_DOMAINS)), + 'expected' => 'be', + ], + [ + 'domain' => new Domain('www.bébé.be', new PublicSuffix('bébé.be', Rules::PRIVATE_DOMAINS)), + 'expected' => 'bébé.be', + ], + [ + 'domain' => new Domain('www.bébé.be'), + 'expected' => null, + ], + ]; + } } From 18496eed1e2db8eef6263850dd61917691526010 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 3 Apr 2018 15:03:14 +0200 Subject: [PATCH 103/461] improve Domain modifier methods --- CHANGELOG.md | 2 +- src/Converter.php | 2 +- src/Domain.php | 153 ++++++++++-------- src/DomainInterface.php | 10 +- src/PublicSuffix.php | 2 +- ...erface.php => PublicSuffixListSection.php} | 2 +- src/Rules.php | 2 +- tests/CacheTest.php | 3 - tests/DomainTest.php | 61 +++---- tests/PublicSuffixTest.php | 3 +- tests/RulesTest.php | 33 ++-- 11 files changed, 149 insertions(+), 124 deletions(-) rename src/{SectionInterface.php => PublicSuffixListSection.php} (94%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41a4502f..2c949094 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in ### Added -- `Pdp\SectionInterface` interface implemented by `Pdp\Rules` and `Pdp\PublicSuffix` +- `Pdp\PublicSuffixListSection` interface implemented by `Pdp\Rules` and `Pdp\PublicSuffix` - `Pdp\DomainInterface` interface implemented by `Pdp\Domain` and `Pdp\PublicSuffix` - `Pdp\Domain` implements the `Countable` interface. - `Pdp\Domain::getContent` returns the Domain name value replaces `Pdp\Domain::getDomain` diff --git a/src/Converter.php b/src/Converter.php index b32844a1..a5e21f16 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -21,7 +21,7 @@ * @author Jeremy Kendall * @author Ignace Nyamagana Butera */ -final class Converter implements SectionInterface +final class Converter implements PublicSuffixListSection { use IDNAConverterTrait; diff --git a/src/Domain.php b/src/Domain.php index a8d8ec4f..56aa57ac 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -99,11 +99,7 @@ private function setPublicSuffix(PublicSuffix $publicSuffix): PublicSuffix throw new Exception(sprintf('The domain `%s` can not contain a public suffix', $this->domain)); } - static $pattern = '/[^\x20-\x7f]/'; - if (preg_match($pattern, $this->domain)) { - $publicSuffix = $publicSuffix->toUnicode(); - } - + $publicSuffix = $this->normalize($publicSuffix); $publicSuffixContent = $publicSuffix->getContent(); if ($this->domain === $publicSuffixContent) { throw new Exception(sprintf('The public suffix `%s` can not be equal to the domain name `%s`', $publicSuffixContent, $this->domain)); @@ -116,6 +112,23 @@ private function setPublicSuffix(PublicSuffix $publicSuffix): PublicSuffix return $publicSuffix; } + /** + * Normalize the domain name encoding content. + * + * @param mixed $domain + * + * @return mixed + */ + private function normalize($domain) + { + static $pattern = '/[^\x20-\x7f]/'; + if (null !== $this->domain && preg_match($pattern, $this->domain)) { + return $domain->toUnicode(); + } + + return $domain->toAscii(); + } + /** * Computes the registrable domain part. */ @@ -358,8 +371,8 @@ public function toUnicode() * are: be, ac.be, ulb.ac.be, or the null public suffix. Any other public * suffix will throw an Exception. * - * This method does not change the domain conent it only updates/changes/removes - * its public suffix information. + * This method MUST retain the state of the current instance, and return + * an instance that contains the modified Public Suffix Information. * * @param mixed $publicSuffix * @@ -371,11 +384,7 @@ public function resolve($publicSuffix): self $publicSuffix = new PublicSuffix($publicSuffix); } - static $pattern = '/[^\x20-\x7f]/'; - if (null !== $this->domain && preg_match($pattern, $this->domain)) { - $publicSuffix = $publicSuffix->toUnicode(); - } - + $publicSuffix = $this->normalize($publicSuffix); if ($this->publicSuffix == $publicSuffix) { return $this; } @@ -392,7 +401,7 @@ public function resolve($publicSuffix): self * Returns an instance with the specified sub domain added. * * This method MUST retain the state of the current instance, and return - * an instance that contains the modified domain with the new sub domain + * an instance that contains the new sub domain * * @param mixed $subDomain the subdomain to add * @@ -407,33 +416,30 @@ public function withSubDomain($subDomain): self } if (null === $this->publicSuffix->getContent()) { - throw new Exception('A subdomain can not be added to domain without a public suffix.'); - } - - static $pattern = '/[^\x20-\x7f]/'; - $subDomain = $subDomain->toAscii(); - if (null !== $this->domain && preg_match($pattern, $this->domain)) { - $subDomain = $subDomain->toUnicode(); + throw new Exception('A subdomain can not be added to a domain without a public suffix part.'); } - $subDomain = $subDomain->getContent(); - if ($subDomain === $this->subDomain) { + $subDomain = $this->normalize($subDomain); + if ($this->subDomain === $subDomain->getContent()) { return $this; } - $newDomain = $this->registrableDomain; - if (null !== $subDomain) { - $newDomain = $subDomain.'.'.$newDomain; - } + $clone = clone $this; + $clone->labels = array_merge( + array_slice($this->labels, 0, count($this->publicSuffix) + 1), + iterator_to_array($subDomain) + ); + $clone->domain = implode('.', array_reverse($clone->labels)); + $clone->subDomain = $subDomain->getContent(); - return new Domain($newDomain, $this->publicSuffix); + return $clone; } /** * Returns an instance with the specified public suffix added. * * This method MUST retain the state of the current instance, and return - * an instance that contains the modified component with the new public suffix + * an instance that contains the new public suffix * * @param mixed $publicSuffix * @@ -451,33 +457,31 @@ public function withPublicSuffix($publicSuffix): self throw new Exception('A public suffix can not be added to domain without a public suffix.'); } - static $pattern = '/[^\x20-\x7f]/'; - $publicSuffix = $publicSuffix->toAscii(); - if (null !== $this->domain && preg_match($pattern, $this->domain)) { - $publicSuffix = $publicSuffix->toUnicode(); - } - + $publicSuffix = $this->normalize($publicSuffix); if ($this->publicSuffix == $publicSuffix) { return $this; } - $newDomain = $this->labels[count($this->publicSuffix)]; - if (null !== $this->subDomain) { - $newDomain = $this->subDomain.'.'.$newDomain; - } - - if (null !== $publicSuffix->getContent()) { - $newDomain .= '.'.$publicSuffix->getContent(); - } + $clone = clone $this; + $clone->labels = array_merge( + iterator_to_array($publicSuffix), + array_slice($this->labels, count($this->publicSuffix)) + ); + $clone->domain = implode('.', array_reverse($clone->labels)); + $clone->publicSuffix = $publicSuffix; + $clone->registrableDomain = $this->labels[count($this->publicSuffix)].'.'.$publicSuffix->getContent(); - return new Domain($newDomain, $publicSuffix); + return $clone; } /** * Returns an instance with the specified label added at the specified key. * * This method MUST retain the state of the current instance, and return - * an instance that contains the modified domain with the new label + * an instance that contains the new label + * + * If $key is non-negative, the added label will be the label at $key position from the start. + * If $key is negative, the added label will be the label at $key position from the end. * * @param int $key * @param mixed $label @@ -493,45 +497,52 @@ public function withLabel(int $key, $label): self $label = new PublicSuffix($label); } - if (null === $label->getContent() || 1 !== count($label)) { + if (1 !== count($label)) { throw new Exception(sprintf('The label `%s` is invalid', $label->getContent())); } - static $pattern = '/[^\x20-\x7f]/'; - $label = $label->toAscii(); - if (null !== $this->domain && preg_match($pattern, $this->domain)) { - $label = $label->toUnicode(); - } - - $label = $label->getContent(); $nb_labels = count($this->labels); $offset = filter_var($key, FILTER_VALIDATE_INT, ['options' => ['min_range' => - $nb_labels - 1, 'max_range' => $nb_labels]]); if (false === $offset) { throw new Exception(sprintf('the given key `%s` is invalid', $key)); } - if ($offset < 0) { + if (0 > $offset) { $offset = $nb_labels + $offset; } + $label = $this->normalize($label)->getContent(); if ($label === ($this->labels[$offset] ?? null)) { return $this; } - $labels = $this->labels; - $labels[$offset] = $label; + $clone = clone $this; + $clone->labels[$offset] = $label; + ksort($clone->labels); + $clone->labels = array_values($clone->labels); + $clone->domain = implode('.', array_reverse($clone->labels)); + if (null !== $this->publicSuffix->getLabel($offset)) { + $clone->publicSuffix = new PublicSuffix(); + $clone->registrableDomain = null; + $clone->subDomain = null; - return new Domain( - implode('.', array_reverse($labels)), - $offset < 0 || null === $this->publicSuffix->getLabel($offset) ? $this->publicSuffix : null - ); + return $clone; + } + + $clone->registrableDomain = $clone->setRegistrableDomain(); + $clone->subDomain = $clone->setSubDomain(); + + return $clone; } /** * Returns an instance with the label at the specified key removed. * * This method MUST retain the state of the current instance, and return - * an instance that contains the modified domain with the label removed + * an instance without the specified label + * + * If $key is non-negative, the removed label will be the label at $key position from the start. + * If $key is negative, the removed label will be the label at $key position from the end. * * @param int $key * @@ -547,16 +558,24 @@ public function withoutLabel(int $key): self throw new Exception(sprintf('the given key `%s` is invalid', $key)); } - if ($offset < 0) { + if (0 > $offset) { $offset = $nb_labels + $offset; } - $labels = $this->labels; - unset($labels[$offset]); + $clone = clone $this; + unset($clone->labels[$offset]); + $clone->domain = implode('.', array_reverse($clone->labels)); + if (null !== $this->publicSuffix->getLabel($offset)) { + $clone->publicSuffix = new PublicSuffix(); + $clone->registrableDomain = null; + $clone->subDomain = null; + + return $clone; + } + + $clone->registrableDomain = $clone->setRegistrableDomain(); + $clone->subDomain = $clone->setSubDomain(); - return new Domain( - implode('.', array_reverse($labels)), - $offset < 0 || null == $this->publicSuffix->getLabel($offset) ? $this->publicSuffix : null - ); + return $clone; } } diff --git a/src/DomainInterface.php b/src/DomainInterface.php index 8d79d121..38c8872c 100644 --- a/src/DomainInterface.php +++ b/src/DomainInterface.php @@ -35,16 +35,16 @@ public function getContent(); /** * Retrieves a single domain label. * - * If $offset is non-negative, the returned value will be the label at $offset position. - * If $offset is negative, the returned value will be the label at $offset position from the end. + * If $key is non-negative, the returned value will be the label at $key position from the start. + * If $key is negative, the returned value will be the label at $key position from the end. * - * If no label is found the submitted $offset the returned value will be null. + * If no label is found the submitted $key the returned value will be null. * - * @param int $offset the label offset + * @param int $key the label offset * * @return string|null */ - public function getLabel(int $offset); + public function getLabel(int $key); /** * Returns the associated key for each label. diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 586b8a18..dfec47c1 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -26,7 +26,7 @@ * * @author Ignace Nyamagana Butera */ -final class PublicSuffix implements DomainInterface, JsonSerializable, SectionInterface +final class PublicSuffix implements DomainInterface, JsonSerializable, PublicSuffixListSection { use IDNAConverterTrait; diff --git a/src/SectionInterface.php b/src/PublicSuffixListSection.php similarity index 94% rename from src/SectionInterface.php rename to src/PublicSuffixListSection.php index abe03d81..df1c8535 100644 --- a/src/SectionInterface.php +++ b/src/PublicSuffixListSection.php @@ -16,7 +16,7 @@ * * @author Ignace Nyamagana Butera */ -interface SectionInterface +interface PublicSuffixListSection { const ALL_DOMAINS = 'ALL_DOMAINS'; const ICANN_DOMAINS = 'ICANN_DOMAINS'; diff --git a/src/Rules.php b/src/Rules.php index 5b866ed7..18cdde57 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -17,7 +17,7 @@ * @author Jeremy Kendall * @author Ignace Nyamagana Butera */ -final class Rules implements SectionInterface +final class Rules implements PublicSuffixListSection { /** * PSL rules as a multidimentional associative array. diff --git a/tests/CacheTest.php b/tests/CacheTest.php index 0e86f538..fdcaf28d 100644 --- a/tests/CacheTest.php +++ b/tests/CacheTest.php @@ -480,9 +480,6 @@ public function testDeleteMultipleGenerator() $this->assertEquals([], $expected); } - /** - * @expectException \Psr\SimpleCache\InvalidArgumentException - */ public function testDeleteMultipleInvalidArg() { $this->expectException(InvalidArgumentException::class); diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 19b0d178..b77a8fd3 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -35,8 +35,9 @@ public function testRegistrableDomainIsNullWithFoundDomain() /** * @covers ::__construct * @covers ::setPublicSuffix - * + * @covers ::normalize * @dataProvider provideWrongConstructor + * * @param mixed $domain * @param mixed $publicSuffix */ @@ -111,12 +112,14 @@ public function testDomainInternalPhpMethod() } /** + * @covers ::normalize + * @covers ::getIterator + * @covers ::count * @dataProvider countableProvider + * * @param string|null $domain * @param int $nbLabels * @param string[] $labels - * @covers ::getIterator - * @covers ::count */ public function testCountable($domain, $nbLabels, $labels) { @@ -159,16 +162,9 @@ public function testOffsets() } /** - * @dataProvider toUnicodeProvider - * @param null|string $domain - * @param null|string $publicSuffix - * @param null|string $expectedDomain - * @param null|string $expectedSuffix - * @param null|string $expectedIDNDomain - * @param null|string $expectedIDNSuffix - * * @covers ::setDomain * @covers ::setPublicSuffix + * @covers ::normalize * @covers ::setRegistrableDomain * @covers ::setSubDomain * @covers ::getDomain @@ -177,6 +173,14 @@ public function testOffsets() * @covers ::idnToUnicode * @covers ::toUnicode * @covers \Pdp\PublicSuffix::toUnicode + * @dataProvider toUnicodeProvider + * + * @param null|string $domain + * @param null|string $publicSuffix + * @param null|string $expectedDomain + * @param null|string $expectedSuffix + * @param null|string $expectedIDNDomain + * @param null|string $expectedIDNSuffix */ public function testToIDN( $domain, @@ -258,16 +262,9 @@ public function toUnicodeProvider() } /** - * @dataProvider toAsciiProvider - * @param null|string $domain - * @param null|string $publicSuffix - * @param null|string $expectedDomain - * @param null|string $expectedSuffix - * @param null|string $expectedAsciiDomain - * @param null|string $expectedAsciiSuffix - * * @covers ::setDomain * @covers ::setPublicSuffix + * @covers ::normalize * @covers ::setRegistrableDomain * @covers ::setSubDomain * @covers ::getDomain @@ -276,6 +273,14 @@ public function toUnicodeProvider() * @covers ::idnToAscii * @covers ::toAscii * @covers \Pdp\PublicSuffix::toAscii + * + * @dataProvider toAsciiProvider + * @param null|string $domain + * @param null|string $publicSuffix + * @param null|string $expectedDomain + * @param null|string $expectedSuffix + * @param null|string $expectedAsciiDomain + * @param null|string $expectedAsciiSuffix */ public function testToAscii( $domain, @@ -341,12 +346,12 @@ public function toAsciiProvider() } /** + * @covers ::resolve + * @dataProvider resolvePassProvider + * * @param Domain $domain * @param mixed $publicSuffix * @param string|null $expected - * - * @covers ::resolve - * @dataProvider resolvePassProvider */ public function testResolveWorks(Domain $domain, $publicSuffix, $expected) { @@ -398,11 +403,11 @@ public function resolvePassProvider() } /** - * @param Domain $domain - * @param PublicSuffix $publicSuffix - * * @covers ::resolve * @dataProvider resolveFailsProvider + * + * @param Domain $domain + * @param PublicSuffix $publicSuffix */ public function testResolveFails(Domain $domain, PublicSuffix $publicSuffix) { @@ -700,9 +705,9 @@ public function withLabelWorksProvider() 'domain' => $base_domain, 'key' => -4, 'label' => 'shop', - 'expected' => 'shop.www.example.com', - 'isKnown' => true, - 'isICANN' => true, + 'expected' => 'www.example.com.shop', + 'isKnown' => false, + 'isICANN' => false, 'isPrivate' => false, ], 'simple replace remove PSL info' => [ diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index e56df59d..6df935ca 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -91,11 +91,12 @@ public function testToUnicodeReturnsSameInstance() } /** + * @covers ::count * @dataProvider countableProvider + * * @param string|null $domain * @param int $nbLabels * @param string[] $labels - * @covers ::count */ public function testCountable($domain, $nbLabels, $labels) { diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 1598c599..4cbc1e6c 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -306,14 +306,15 @@ public function testWithDomainInterfaceObject() } /** + * @covers ::resolve + * @covers \Pdp\Domain::setRegistrableDomain + * @covers \Pdp\Domain::getRegistrableDomain * @dataProvider parseDataProvider + * * @param mixed $publicSuffix * @param mixed $registrableDomain * @param mixed $domain * @param mixed $expectedDomain - * @covers ::resolve - * @covers \Pdp\Domain::setRegistrableDomain - * @covers \Pdp\Domain::getRegistrableDomain */ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) { @@ -321,15 +322,16 @@ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $dom } /** + * @covers ::resolve + * @covers \Pdp\IDNAConverterTrait::setDomain + * @covers \Pdp\Domain::setPublicSuffix + * @covers \Pdp\Domain::getPublicSuffix * @dataProvider parseDataProvider + * * @param mixed $publicSuffix * @param mixed $registrableDomain * @param mixed $domain * @param mixed $expectedDomain - * @covers ::resolve - * @covers \Pdp\IDNAConverterTrait::setDomain - * @covers \Pdp\Domain::setPublicSuffix - * @covers \Pdp\Domain::getPublicSuffix */ public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, $expectedDomain) { @@ -337,15 +339,16 @@ public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, } /** + * @covers ::resolve + * @covers \Pdp\IDNAConverterTrait::setDomain + * @covers \Pdp\Domain::withPublicSuffix + * @covers \Pdp\Domain::getContent * @dataProvider parseDataProvider + * * @param mixed $publicSuffix * @param mixed $registrableDomain * @param mixed $domain * @param mixed $expectedDomain - * @covers ::resolve - * @covers \Pdp\IDNAConverterTrait::setDomain - * @covers \Pdp\Domain::withPublicSuffix - * @covers \Pdp\Domain::getContent */ public function testGetDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) { @@ -379,14 +382,14 @@ public function parseDataProvider() } /** - * @dataProvider invalidParseProvider - * @param mixed $domain - * @param mixed $section - * * @covers ::getPublicSuffix * @covers ::validateSection * @covers ::isMatchable * @covers \Pdp\IDNAConverterTrait::setDomain + * @dataProvider invalidParseProvider + * + * @param mixed $domain + * @param mixed $section */ public function testGetPublicSuffixThrowsException($domain, $section) { From ec0fd205d8fd4e0355c6492b1acbdf997fae44ec Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 3 Apr 2018 16:29:46 +0200 Subject: [PATCH 104/461] improve code --- src/Domain.php | 24 ++++++++++++++++-------- src/PublicSuffix.php | 8 ++++++-- src/Rules.php | 7 +------ tests/DomainTest.php | 1 + tests/RulesTest.php | 7 ++++--- 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 56aa57ac..aceb1e61 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -115,18 +115,22 @@ private function setPublicSuffix(PublicSuffix $publicSuffix): PublicSuffix /** * Normalize the domain name encoding content. * - * @param mixed $domain + * @param mixed $subject * * @return mixed */ - private function normalize($domain) + private function normalize($subject) { + if (null === $this->domain || null === $subject->getContent()) { + return $subject; + } + static $pattern = '/[^\x20-\x7f]/'; - if (null !== $this->domain && preg_match($pattern, $this->domain)) { - return $domain->toUnicode(); + if (!preg_match($pattern, $this->domain)) { + return $subject->toAscii(); } - return $domain->toAscii(); + return $subject->toUnicode(); } /** @@ -329,13 +333,17 @@ public function isPrivate(): bool */ public function toAscii() { - static $pattern = '/[^\x20-\x7f]/'; - if (null === $this->domain || !preg_match($pattern, $this->domain)) { + if (null === $this->domain) { + return $this; + } + + $domain = $this->idnToAscii($this->domain); + if ($domain === $this->domain) { return $this; } $clone = clone $this; - $clone->domain = $this->idnToAscii($this->domain); + $clone->domain = $domain; $clone->labels = array_reverse(explode('.', $clone->domain)); $clone->publicSuffix = $this->publicSuffix->toAscii(); $clone->registrableDomain = $clone->setRegistrableDomain(); diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index dfec47c1..85a747f5 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -203,8 +203,12 @@ public function isPrivate(): bool */ public function toAscii() { - static $pattern = '/[^\x20-\x7f]/'; - if (null === $this->publicSuffix || !preg_match($pattern, $this->publicSuffix)) { + if (null === $this->publicSuffix) { + return $this; + } + + $publicSuffix = $this->idnToAscii($this->publicSuffix); + if ($publicSuffix === $this->publicSuffix) { return $this; } diff --git a/src/Rules.php b/src/Rules.php index 18cdde57..89e15d5b 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -111,12 +111,7 @@ public function getPublicSuffix($domain = null, string $section = self::ALL_DOMA $publicSuffix = new PublicSuffix($domain->getLabel(0)); } - static $pattern = '/[^\x20-\x7f]/'; - if (preg_match($pattern, $domain->getContent())) { - return $publicSuffix->toUnicode(); - } - - return $publicSuffix; + return PublicSuffix::createFromDomain($domain->resolve($publicSuffix)); } /** diff --git a/tests/DomainTest.php b/tests/DomainTest.php index b77a8fd3..38e85a5e 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -347,6 +347,7 @@ public function toAsciiProvider() /** * @covers ::resolve + * @covers ::normalize * @dataProvider resolvePassProvider * * @param Domain $domain diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 4cbc1e6c..56fd69a2 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -300,9 +300,10 @@ public function testWithDomainObject() */ public function testWithDomainInterfaceObject() { - $publicSuffix = new PublicSuffix('ac.be', Rules::ICANN_DOMAINS); - $psl = $this->rules->getPublicSuffix($publicSuffix); - $this->assertEquals($publicSuffix, $psl); + $this->assertSame( + 'ac.be', + $this->rules->getPublicSuffix(new PublicSuffix('ul.ac.be', Rules::ICANN_DOMAINS))->getContent() + ); } /** From 5790a8099def0768d2791568ddfd3197b0a7d78b Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 3 Apr 2018 17:57:27 +0200 Subject: [PATCH 105/461] Improve Rules code --- CHANGELOG.md | 2 ++ src/Converter.php | 2 +- src/Domain.php | 30 +++++++++++++++++------------- src/Rules.php | 39 ++++++++------------------------------- tests/RulesTest.php | 14 +++++++------- 5 files changed, 35 insertions(+), 52 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c949094..13ff4ba0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\Domain::withSubDomain` updates the `Pdp\Domain` sub domain part. - `Pdp\Domain::withLabel` adds a new label to the `Pdp\Domain`. - `Pdp\Domain::withoutLabel` removes a label from the `Pdp\Domain`. +- `Pdp\Domain::resolve` attach a public suffix to the `Pdp\Domain`. +- `Pdp\Domain::isResolvable` tell whether the current `Pdp\Domain` can have a public suffix attached to it or not. - `Pdp\PublicSuffix::createFromDomain` returns a new `Pdp\PublicSuffix` object from a `Pdp\Domain`object ### Fixed diff --git a/src/Converter.php b/src/Converter.php index a5e21f16..9853b94d 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -82,7 +82,7 @@ private function getSection(string $section, string $line): string * distribution * * @param array $list Initially an empty array, this eventually - * becomes the array representation of the Public Suffix List + * becomes the array representation of a Public Suffix List section * @param array $rule_parts One line (rule) from the Public Suffix List * exploded on '.', or the remaining portion of that array during recursion * diff --git a/src/Domain.php b/src/Domain.php index aceb1e61..b0d73be2 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -95,7 +95,7 @@ private function setPublicSuffix(PublicSuffix $publicSuffix): PublicSuffix return new PublicSuffix(); } - if (null === $this->domain || false === strpos($this->domain, '.')) { + if (!$this->isResolvable()) { throw new Exception(sprintf('The domain `%s` can not contain a public suffix', $this->domain)); } @@ -264,7 +264,7 @@ public function keys(string $label): array * * The registered or registrable domain is the public suffix plus one additional label. * - * This method should return null if the registrable domain is the same as the public suffix. + * This method returns null if the registrable domain is equal to the public suffix. * * @return string|null registrable domain */ @@ -278,8 +278,8 @@ public function getRegistrableDomain() * * The sub domain represents the remaining labels without the registrable domain. * - * This method should return null if the registrable domain is null - * This method should return null if the registrable domain is the same as the public suffix + * This method returns null if the registrable domain is null + * This method returns null if the registrable domain is equal to the public suffix * * @return string|null registrable domain */ @@ -298,6 +298,16 @@ public function getPublicSuffix() return $this->publicSuffix->getContent(); } + /** + * Tells whether the given domain can be resolved. + * + * @return bool + */ + public function isResolvable(): bool + { + return 2 <= count($this->labels); + } + /** * Tells whether the public suffix has a matching rule in a Public Suffix List. * @@ -433,10 +443,7 @@ public function withSubDomain($subDomain): self } $clone = clone $this; - $clone->labels = array_merge( - array_slice($this->labels, 0, count($this->publicSuffix) + 1), - iterator_to_array($subDomain) - ); + $clone->labels = array_merge(array_slice($this->labels, 0, count($this->publicSuffix) + 1), iterator_to_array($subDomain)); $clone->domain = implode('.', array_reverse($clone->labels)); $clone->subDomain = $subDomain->getContent(); @@ -462,7 +469,7 @@ public function withPublicSuffix($publicSuffix): self } if (null === $this->publicSuffix->getContent()) { - throw new Exception('A public suffix can not be added to domain without a public suffix.'); + throw new Exception('A public suffix can not be added to a domain without a public suffix part.'); } $publicSuffix = $this->normalize($publicSuffix); @@ -471,10 +478,7 @@ public function withPublicSuffix($publicSuffix): self } $clone = clone $this; - $clone->labels = array_merge( - iterator_to_array($publicSuffix), - array_slice($this->labels, count($this->publicSuffix)) - ); + $clone->labels = array_merge(iterator_to_array($publicSuffix), array_slice($this->labels, count($this->publicSuffix))); $clone->domain = implode('.', array_reverse($clone->labels)); $clone->publicSuffix = $publicSuffix; $clone->registrableDomain = $this->labels[count($this->publicSuffix)].'.'.$publicSuffix->getContent(); diff --git a/src/Rules.php b/src/Rules.php index 89e15d5b..91b07fec 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -102,16 +102,11 @@ public function getPublicSuffix($domain = null, string $section = self::ALL_DOMA { $this->validateSection($section); $domain = $domain instanceof Domain ? $domain : new Domain($domain); - if (!$this->isMatchable($domain)) { + if (!$domain->isResolvable()) { throw new Exception(sprintf('The domain `%s` can not contain a public suffix', $domain->getContent())); } - $publicSuffix = $this->findPublicSuffix($domain, $section); - if (null === $publicSuffix->getContent()) { - $publicSuffix = new PublicSuffix($domain->getLabel(0)); - } - - return PublicSuffix::createFromDomain($domain->resolve($publicSuffix)); + return PublicSuffix::createFromDomain($domain->resolve($this->findPublicSuffix($domain, $section))); } /** @@ -127,16 +122,11 @@ public function resolve($domain = null, string $section = self::ALL_DOMAINS): Do $this->validateSection($section); try { $domain = $domain instanceof Domain ? $domain : new Domain($domain); - if (!$this->isMatchable($domain)) { + if (!$domain->isResolvable()) { return $domain; } - $publicSuffix = $this->findPublicSuffix($domain, $section); - if (null === $publicSuffix->getContent()) { - $publicSuffix = new PublicSuffix($domain->getLabel(0)); - } - - return $domain->resolve($publicSuffix); + return $domain->resolve($this->findPublicSuffix($domain, $section)); } catch (Exception $e) { return new Domain(); } @@ -156,26 +146,13 @@ private function validateSection(string $section) } $rules = $this->rules[$section] ?? null; - if (null !== $rules && is_array($rules)) { + if (is_array($rules)) { return; } throw new Exception(sprintf('%s is an unknown Public Suffix List section', $section)); } - /** - * Tells whether the given domain can be resolved. - * - * @param DomainInterface $domain - * - * @return bool - */ - private function isMatchable(DomainInterface $domain): bool - { - return 1 < count($domain) - && 0 < strpos($domain->getContent(), '.'); - } - /** * Returns the matched public suffix. * @@ -201,7 +178,7 @@ private function findPublicSuffix(DomainInterface $domain, string $section): Pub return $icann; } - return new PublicSuffix(); + return new PublicSuffix($domain->getLabel(0)); } /** @@ -214,7 +191,7 @@ private function findPublicSuffix(DomainInterface $domain, string $section): Pub */ private function findPublicSuffixFromSection(DomainInterface $domain, string $section): PublicSuffix { - $rules = $this->rules[$section] ?? []; + $rules = $this->rules[$section]; $matches = []; foreach ($domain as $label) { //match exception rule @@ -238,7 +215,7 @@ private function findPublicSuffixFromSection(DomainInterface $domain, string $se } if (empty($matches)) { - return new PublicSuffix(); + return new PublicSuffix($domain->getLabel(0)); } return new PublicSuffix(implode('.', array_reverse($matches)), $section); diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 56fd69a2..3c7ac785 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -70,7 +70,7 @@ public function testDomainInternalPhpMethod() /** * @covers ::resolve * @covers ::validateSection - * @covers ::isMatchable + * @covers \Pdp\Domain::isResolvable * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\Domain::isKnown @@ -106,7 +106,7 @@ public function testResolveThrowsExceptionOnWrongDomainType() /** * @covers ::resolve * @covers ::validateSection - * @covers ::isMatchable + * @covers \Pdp\Domain::isResolvable * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection @@ -123,7 +123,7 @@ public function testIsSuffixValidFalse() /** * @covers ::resolve * @covers ::validateSection - * @covers ::isMatchable + * @covers \Pdp\Domain::isResolvable * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection @@ -147,7 +147,7 @@ public function testIsSuffixValidTrue() /** * @covers ::resolve * @covers ::validateSection - * @covers ::isMatchable + * @covers \Pdp\Domain::isResolvable * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection @@ -171,7 +171,7 @@ public function testIsSuffixValidFalseWithPunycoded() /** * @covers ::resolve * @covers ::validateSection - * @covers ::isMatchable + * @covers \Pdp\Domain::isResolvable * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection @@ -385,7 +385,7 @@ public function parseDataProvider() /** * @covers ::getPublicSuffix * @covers ::validateSection - * @covers ::isMatchable + * @covers \Pdp\Domain::isResolvable * @covers \Pdp\IDNAConverterTrait::setDomain * @dataProvider invalidParseProvider * @@ -417,7 +417,7 @@ public function invalidParseProvider() /** * @covers ::getPublicSuffix * @covers ::validateSection - * @covers ::isMatchable + * @covers \Pdp\Domain::isResolvable * @covers \Pdp\IDNAConverterTrait::setDomain * @dataProvider validPublicSectionProvider * From cd738cab3e250f1520a0ff7830e69b26c3e6c569 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 4 Apr 2018 08:56:49 +0200 Subject: [PATCH 106/461] deprecate the PublicSuffixListSection::ALL_DOMAINS constant --- CHANGELOG.md | 1 + README.md | 7 ++++--- src/PublicSuffix.php | 11 +++++++++-- src/PublicSuffixListSection.php | 5 +++++ src/Rules.php | 20 +++++++++++--------- tests/PublicSuffixTest.php | 10 ++++++++++ 6 files changed, 40 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13ff4ba0..93d5ffe2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in ### Deprecated - `Pdp\Domain::getDomain` use instead `Pdp\Domain::getContent` +- `Pdp\PublicSuffixListSection::ALL_DOMAINS` use the empty string instead ### Removed diff --git a/README.md b/README.md index 6a1e6ec0..9f67d75e 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,7 @@ public function Domain::getContent(): ?string public function Domain::getPublicSuffix(): ?string public function Domain::getRegistrableDomain(): ?string public function Domain::getSubDomain(); ?string +public function Domain::isResolvable(): bool; public function Domain::isKnown(): bool; public function Domain::isICANN(): bool; public function Domain::isPrivate(): bool; @@ -157,11 +158,11 @@ The `Pdp\Rules` object is responsible for public suffix resolution for a given d - `$domain` a domain name as a string - `$section` a string which specifies which section of the PSL you want to validate the given domain against. The possible values are: - - `Rules::ALL_DOMAINS`, to validate against the full PSL. - `Rules::ICANN_DOMAINS`, to validate against the PSL ICANN DOMAINS section only. - `Rules::PRIVATE_DOMAINS`, to validate against the PSL PRIVATE DOMAINS section only. + - the empty string to validate against all the PSL sections. -By default, the `$section` argument is equal to `Rules::ALL_DOMAINS`. If an unsupported section is submitted a `Pdp\Exception` exception will be thrown. +By default, the `$section` argument is equal to the empty string. If an unsupported section is submitted a `Pdp\Exception` exception will be thrown. While the `Pdp\Rules::resolve` returns a `Pdp\Domain` object, the `Pdp\Rules::getPublicSuffix` returns a `Pdp\PublicSuffix` object. @@ -176,7 +177,7 @@ use Pdp\Converter; $pdp_url = 'https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat'; $rules = Rules::createFromPath($pdp_url); -$domain = $rules->resolve('www.Ulb.AC.be'); //using Rules::ALL_DOMAINS +$domain = $rules->resolve('www.Ulb.AC.be'); // resolution is done against all the sections available echo json_encode($domain, JSON_PRETTY_PRINT); // returns // { diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 85a747f5..52dbf9b4 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -90,15 +90,22 @@ public function __construct($publicSuffix = null, string $section = '') * * @param string $section * + * @throws Exception if the submitted section is not supported + * * @return string */ private function setSection(string $section): string { - if ('' === $this->publicSuffix || null === $this->publicSuffix) { + if (in_array($this->publicSuffix, ['', null], true) || self::ALL_DOMAINS === $section) { return ''; } - return $section; + static $section_list = [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, '']; + if (in_array($section, $section_list, true)) { + return $section; + } + + throw new Exception(sprintf('`%s` is an unknown Public Suffix List section', $section)); } /** diff --git a/src/PublicSuffixListSection.php b/src/PublicSuffixListSection.php index df1c8535..3d8249c7 100644 --- a/src/PublicSuffixListSection.php +++ b/src/PublicSuffixListSection.php @@ -18,7 +18,12 @@ */ interface PublicSuffixListSection { + /** + * @deprecated 5.3 + */ const ALL_DOMAINS = 'ALL_DOMAINS'; + const ICANN_DOMAINS = 'ICANN_DOMAINS'; + const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; } diff --git a/src/Rules.php b/src/Rules.php index 91b07fec..d4e74148 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -100,7 +100,7 @@ public function __construct(array $rules) */ public function getPublicSuffix($domain = null, string $section = self::ALL_DOMAINS): PublicSuffix { - $this->validateSection($section); + $section = $this->validateSection($section); $domain = $domain instanceof Domain ? $domain : new Domain($domain); if (!$domain->isResolvable()) { throw new Exception(sprintf('The domain `%s` can not contain a public suffix', $domain->getContent())); @@ -119,7 +119,7 @@ public function getPublicSuffix($domain = null, string $section = self::ALL_DOMA */ public function resolve($domain = null, string $section = self::ALL_DOMAINS): Domain { - $this->validateSection($section); + $section = $this->validateSection($section); try { $domain = $domain instanceof Domain ? $domain : new Domain($domain); if (!$domain->isResolvable()) { @@ -138,16 +138,18 @@ public function resolve($domain = null, string $section = self::ALL_DOMAINS): Do * @param string $section * * @throws Exception if the submitted section is not supported + * + * @return string */ - private function validateSection(string $section) + private function validateSection(string $section): string { - if (self::ALL_DOMAINS === $section) { - return; + if (self::ALL_DOMAINS === $section || '' === $section) { + return ''; } $rules = $this->rules[$section] ?? null; if (is_array($rules)) { - return; + return $section; } throw new Exception(sprintf('%s is an unknown Public Suffix List section', $section)); @@ -174,11 +176,11 @@ private function findPublicSuffix(DomainInterface $domain, string $section): Pub return $private; } - if (self::ALL_DOMAINS === $section) { - return $icann; + if (self::PRIVATE_DOMAINS === $section) { + return new PublicSuffix($domain->getLabel(0)); } - return new PublicSuffix($domain->getLabel(0)); + return $icann; } /** diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 6df935ca..dd871f53 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -57,6 +57,16 @@ public function testPSToAsciiThrowsException() new PublicSuffix('a⒈com'); } + /** + * @covers ::__construct + * @covers ::setSection + */ + public function testSetSectionThrowsException() + { + $this->expectException(Exception::class); + new PublicSuffix('ac.be', 'foobar'); + } + /** * @covers ::toUnicode * @covers ::idnToUnicode From 6b084b2de8f4dd0b8342492b6fce3fba8306396f Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 5 Apr 2018 12:40:27 +0200 Subject: [PATCH 107/461] ALL_DOMAINS constant is deprecated on the Rules class --- src/PublicSuffix.php | 2 +- src/PublicSuffixListSection.php | 5 ----- src/Rules.php | 5 +++++ 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 52dbf9b4..b0c9feb2 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -96,7 +96,7 @@ public function __construct($publicSuffix = null, string $section = '') */ private function setSection(string $section): string { - if (in_array($this->publicSuffix, ['', null], true) || self::ALL_DOMAINS === $section) { + if (in_array($this->publicSuffix, ['', null], true)) { return ''; } diff --git a/src/PublicSuffixListSection.php b/src/PublicSuffixListSection.php index 3d8249c7..2541864d 100644 --- a/src/PublicSuffixListSection.php +++ b/src/PublicSuffixListSection.php @@ -18,11 +18,6 @@ */ interface PublicSuffixListSection { - /** - * @deprecated 5.3 - */ - const ALL_DOMAINS = 'ALL_DOMAINS'; - const ICANN_DOMAINS = 'ICANN_DOMAINS'; const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; diff --git a/src/Rules.php b/src/Rules.php index d4e74148..acb8a0d7 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -19,6 +19,11 @@ */ final class Rules implements PublicSuffixListSection { + /** + * @deprecated 5.3 + */ + const ALL_DOMAINS = 'ALL_DOMAINS'; + /** * PSL rules as a multidimentional associative array. * From 61b3c5cedca51e19bc11a0c152384aafe29922bb Mon Sep 17 00:00:00 2001 From: Alan Reed Date: Tue, 24 Apr 2018 14:39:58 -0400 Subject: [PATCH 108/461] Improve ability to find vendor directory This now works on Laravel 5.6 --- src/Installer.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Installer.php b/src/Installer.php index 5d68ce76..4d02a917 100644 --- a/src/Installer.php +++ b/src/Installer.php @@ -87,12 +87,10 @@ private static function getVendorPath(Event $event = null) return $event->getComposer()->getConfig()->get('vendor-dir'); } - if (is_dir($vendor = dirname(__DIR__, 2).'/vendor')) { - return $vendor; - } - - if (is_dir($vendor = dirname(__DIR__, 5).'/vendor')) { - return $vendor; + for ($i = 2; $i <= 5; $i++) { + if (is_dir($vendor = dirname(__DIR__, $i).'/vendor')) { + return $vendor; + } } return null; From b8cb78e92abaa92981526c6373cd1121e38f84c7 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 25 Apr 2018 12:22:58 +0200 Subject: [PATCH 109/461] Improve package after review - simplify domain validation - improve Rules::resolve and Rules::getPublicSuffix argument signature - added DomainInterface::__toString method - Documentation updated --- CHANGELOG.md | 10 ++-- README.md | 36 +++++++++--- ...ULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- src/Domain.php | 46 ++++++++++----- src/DomainInterface.php | 16 +++++ src/IDNAConverterTrait.php | 20 +++---- src/Installer.php | 6 +- src/PublicSuffix.php | 14 ++++- src/Rules.php | 4 +- tests/DomainTest.php | 8 ++- tests/PublicSuffixTest.php | 6 +- tests/RulesTest.php | 58 ++++++++++++------- 12 files changed, 153 insertions(+), 73 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93d5ffe2..a2bcf921 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,26 +8,26 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\PublicSuffixListSection` interface implemented by `Pdp\Rules` and `Pdp\PublicSuffix` - `Pdp\DomainInterface` interface implemented by `Pdp\Domain` and `Pdp\PublicSuffix` -- `Pdp\Domain` implements the `Countable` interface. -- `Pdp\Domain::getContent` returns the Domain name value replaces `Pdp\Domain::getDomain` +- `Pdp\Domain::getContent` replaces `Pdp\Domain::getDomain` - `Pdp\Domain::withPublicSuffix` updates the `Pdp\Domain` public suffix part. - `Pdp\Domain::withSubDomain` updates the `Pdp\Domain` sub domain part. - `Pdp\Domain::withLabel` adds a new label to the `Pdp\Domain`. - `Pdp\Domain::withoutLabel` removes a label from the `Pdp\Domain`. - `Pdp\Domain::resolve` attach a public suffix to the `Pdp\Domain`. -- `Pdp\Domain::isResolvable` tell whether the current `Pdp\Domain` can have a public suffix attached to it or not. +- `Pdp\Domain::isResolvable` tells whether the current `Pdp\Domain` can have a public suffix attached to it or not. - `Pdp\PublicSuffix::createFromDomain` returns a new `Pdp\PublicSuffix` object from a `Pdp\Domain`object ### Fixed - `Pdp\Domain` domain part computation (public suffix, registrable domain and sub domain) - `Pdp\Domain` and `Pdp\PublicSuffix` host validation compliance to RFC improved -- Improved `Pdp\Converter` and `Pdp\Manager` class to better report error on IDN conversion. +- Improve `Pdp\Converter` and `Pdp\Manager` class to better report error on IDN conversion. +- Improve `Pdp\Installer` vendor directory resolution see [PR #222](https://github.com/jeremykendall/php-domain-parser/pull/222) ### Deprecated - `Pdp\Domain::getDomain` use instead `Pdp\Domain::getContent` -- `Pdp\PublicSuffixListSection::ALL_DOMAINS` use the empty string instead +- `Pdp\Rules::ALL_DOMAINS` use the empty string instead ### Removed diff --git a/README.md b/README.md index 9f67d75e..fb6dac7d 100644 --- a/README.md +++ b/README.md @@ -88,12 +88,13 @@ Using the above code you can parse and get public suffix informations about any The `Pdp\Domain` returned by the `Pdp\Rules::resolve` method is an immutable value object representing a valid domain name. This object let's you access all the domain name properties as well as the public suffix informations attached to it using the following methods. ~~~php -public function Domain::getLabel(int $key): ?string -public function Domain::keys(?string $label): int[] +public function Domain::__toString(): string public function Domain::getContent(): ?string public function Domain::getPublicSuffix(): ?string public function Domain::getRegistrableDomain(): ?string public function Domain::getSubDomain(); ?string +public function Domain::getLabel(int $key): ?string +public function Domain::keys(?string $label): int[] public function Domain::isResolvable(): bool; public function Domain::isKnown(): bool; public function Domain::isICANN(): bool; @@ -154,9 +155,29 @@ $newDomain->isKnown(); //return true; ### Getting the domain public suffix information. -The `Pdp\Rules` object is responsible for public suffix resolution for a given domain. Public suffix resolution is done using the `Pdp\Rules::resolve` or `Pdp\Rules::getPublicSuffix` methods which expects at most two parameters: +~~~php +resolve('www.Ulb.AC.be'); // resolution is done against all the sections available +echo $domain; // returns www.ulb.ac.be echo json_encode($domain, JSON_PRETTY_PRINT); // returns // { @@ -190,9 +212,9 @@ echo json_encode($domain, JSON_PRETTY_PRINT); // "isPrivate": false // } -//The same domain will yield a different result using the PSL PRIVATE DOMAIN SECTION only +//The same domain will yield a different result using the PSL ICANN DOMAIN SECTION only -$domain = $rules->resolve('www.Ulb.AC.be', Rules::PRIVATE_DOMAINS); +$domain = $rules->resolve('www.Ulb.AC.be', Rules::ICANN_DOMAINS); echo json_encode($domain, JSON_PRETTY_PRINT); // returns // { diff --git a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache index e299cfb3..d5ea5100 100644 --- a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache +++ b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache @@ -1 +1 @@ -s:105455:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"boots":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtpc":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"ca":{"1password":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"com":{"1password":[],"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"barsyonline":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"yolasite":[]},"eu":{"1password":[],"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"hepforge":[],"js":[],"mozilla-iot":[],"bmoattachments":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[]},"host":{"cloudaccess":[],"freesite":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[]},"pw":{"cloudns":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[]},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]}},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"co":{"com":{"blogspot":[]},"nodum":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[]},"it":{"blogspot":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"bs":{"we":[]},"online":{"barsy":[]},"support":{"barsy":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[]},"ai":{"nom":[]},"gd":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"hn":{"nom":[]},"kz":{"nym":[]},"sx":{"nym":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"lc":{"oy":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"space":{"stackspace":[],"uber":[],"xs4all":[]},"farm":{"storj":[]},"mobi":{"dscloud":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file +s:105800:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"barsyonline":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"hepforge":[],"js":[],"uklugs":[],"mozilla-iot":[],"bmoattachments":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ca":{"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"ravendb":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[]},"pw":{"cloudns":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[]},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"org":{"glug":[],"lug":[],"lugs":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]}},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"co":{"com":{"blogspot":[]},"nodum":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[]},"it":{"blogspot":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"community":{"ravendb":[]},"run":{"development":[],"ravendb":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"bs":{"we":[]},"online":{"barsy":[]},"support":{"barsy":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[]},"ai":{"nom":[]},"gd":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"hn":{"nom":[]},"kz":{"nym":[]},"sx":{"nym":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"lc":{"oy":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"space":{"stackspace":[],"uber":[],"xs4all":[]},"farm":{"storj":[]},"mobi":{"dscloud":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]},"st":{"noho":[]}}}"; \ No newline at end of file diff --git a/src/Domain.php b/src/Domain.php index b0d73be2..6a302763 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -72,7 +72,10 @@ public static function __set_state(array $properties): self */ public function __construct($domain = null, PublicSuffix $publicSuffix = null) { - list($this->domain, $this->labels) = $this->setDomain($domain); + $this->labels = $this->setLabels($domain); + if (!empty($this->labels)) { + $this->domain = implode('.', array_reverse($this->labels)); + } $this->publicSuffix = $this->setPublicSuffix($publicSuffix ?? new PublicSuffix()); $this->registrableDomain = $this->setRegistrableDomain(); $this->subDomain = $this->setSubDomain(); @@ -92,7 +95,7 @@ public function __construct($domain = null, PublicSuffix $publicSuffix = null) private function setPublicSuffix(PublicSuffix $publicSuffix): PublicSuffix { if (null === $publicSuffix->getContent()) { - return new PublicSuffix(); + return $publicSuffix; } if (!$this->isResolvable()) { @@ -115,11 +118,11 @@ private function setPublicSuffix(PublicSuffix $publicSuffix): PublicSuffix /** * Normalize the domain name encoding content. * - * @param mixed $subject + * @param PublicSuffix $subject * - * @return mixed + * @return PublicSuffix */ - private function normalize($subject) + private function normalize(PublicSuffix $subject): PublicSuffix { if (null === $this->domain || null === $subject->getContent()) { return $subject; @@ -135,6 +138,8 @@ private function normalize($subject) /** * Computes the registrable domain part. + * + * @return string|null */ private function setRegistrableDomain() { @@ -222,6 +227,14 @@ public function getContent() return $this->domain; } + /** + * {@inheritdoc} + */ + public function __toString() + { + return (string) $this->domain; + } + /** * Returns the full domain name. * @@ -301,11 +314,16 @@ public function getPublicSuffix() /** * Tells whether the given domain can be resolved. * + * A domain is resolvable if: + * - it contains at least 2 labels + * - it is not a absolute domain (end with a '.' character) + * * @return bool */ public function isResolvable(): bool { - return 2 <= count($this->labels); + return 2 <= count($this->labels) + && '.' !== substr($this->domain, -1, 1); } /** @@ -506,13 +524,14 @@ public function withPublicSuffix($publicSuffix): self public function withLabel(int $key, $label): self { if (!$label instanceof PublicSuffix) { - $label = new PublicSuffix($label); + $label = $this->normalize(new PublicSuffix($label)); } - if (1 !== count($label)) { - throw new Exception(sprintf('The label `%s` is invalid', $label->getContent())); + if (1 != count($label)) { + throw new Exception(sprintf('The label `%s` is invalid', (string) $label)); } + $label = (string) $label; $nb_labels = count($this->labels); $offset = filter_var($key, FILTER_VALIDATE_INT, ['options' => ['min_range' => - $nb_labels - 1, 'max_range' => $nb_labels]]); if (false === $offset) { @@ -523,15 +542,16 @@ public function withLabel(int $key, $label): self $offset = $nb_labels + $offset; } - $label = $this->normalize($label)->getContent(); if ($label === ($this->labels[$offset] ?? null)) { return $this; } + $labels = $this->labels; + $labels[$offset] = $label; + ksort($labels); + $clone = clone $this; - $clone->labels[$offset] = $label; - ksort($clone->labels); - $clone->labels = array_values($clone->labels); + $clone->labels = array_values($labels); $clone->domain = implode('.', array_reverse($clone->labels)); if (null !== $this->publicSuffix->getLabel($offset)) { $clone->publicSuffix = new PublicSuffix(); diff --git a/src/DomainInterface.php b/src/DomainInterface.php index 38c8872c..a2df1687 100644 --- a/src/DomainInterface.php +++ b/src/DomainInterface.php @@ -32,6 +32,13 @@ interface DomainInterface extends Countable, IteratorAggregate */ public function getContent(); + /** + * Returns the domain content as a string. + * + * @return string + */ + public function __toString(); + /** * Retrieves a single domain label. * @@ -81,4 +88,13 @@ public function toAscii(); * @return static */ public function toUnicode(); + + + /** + * {@inheritdoc} + * + * The external iterator iterates over the DomainInterface labels + * from the right-most label to the left-most label. + */ + public function getIterator(); } diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index a31599ac..0ae85a24 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -113,26 +113,26 @@ private function idnToUnicode(string $domain): string * Returns an array containing the formatted domain name in lowercase * with its associated labels in reverse order * - * For example: setDomain('wWw.uLb.Ac.be') should return ['www.ulb.ac.be', ['be', 'ac', 'ulb', 'www']]; + * For example: setLabels('wWw.uLb.Ac.be') should return ['www.ulb.ac.be', ['be', 'ac', 'ulb', 'www']]; * * @param mixed $domain * * @throws Exception If the domain is invalid * - * @return array + * @return string[] */ - private function setDomain($domain = null): array + private function setLabels($domain = null): array { if ($domain instanceof DomainInterface) { - return [$domain->getContent(), iterator_to_array($domain, false)]; + return iterator_to_array($domain, false); } if (null === $domain) { - return [$domain, []]; + return []; } if ('' === $domain) { - return [$domain, ['']]; + return ['']; } if (!is_scalar($domain) && !method_exists($domain, '__toString')) { @@ -155,9 +155,7 @@ private function setDomain($domain = null): array ) ^(?:(?®_name)\.){0,126}(?®_name)\.?$/ix'; if (preg_match($domain_name, $formatted_domain)) { - $domain = strtolower($formatted_domain); - - return [$domain, array_reverse(explode('.', $domain))]; + return array_reverse(explode('.', strtolower($formatted_domain))); } // a domain name can not contains URI delimiters or space @@ -175,9 +173,7 @@ private function setDomain($domain = null): array //if a domain name contains UTF-8 chars it must be convertible using IDNA UTS46 $ascii_domain = idn_to_ascii($formatted_domain, 0, INTL_IDNA_VARIANT_UTS46, $arr); if (0 === $arr['errors']) { - $idn_domain = $this->idnToUnicode($ascii_domain); - - return [$idn_domain, array_reverse(explode('.', $idn_domain))]; + return array_reverse(explode('.', $this->idnToUnicode($ascii_domain))); } throw new Exception(sprintf('The domain `%s` is invalid : %s', $domain, self::getIdnErrors($arr['errors']))); diff --git a/src/Installer.php b/src/Installer.php index 4d02a917..32af56d5 100644 --- a/src/Installer.php +++ b/src/Installer.php @@ -105,11 +105,7 @@ private static function getVendorPath(Event $event = null) */ private static function getIO(Event $event = null) { - if (null !== $event) { - return $event->getIO(); - } - - return new class() { + return null !== $event ? $event->getIO() : new class() { public function write($messages, bool $newline = true, int $verbosity = 2) { $this->doWrite($messages, $newline, false, $verbosity); diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index b0c9feb2..706bf3a2 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -81,7 +81,11 @@ public static function createFromDomain(Domain $domain): self */ public function __construct($publicSuffix = null, string $section = '') { - list($this->publicSuffix, $this->labels) = $this->setDomain($publicSuffix); + $this->labels = $this->setLabels($publicSuffix); + if (!empty($this->labels)) { + $this->publicSuffix = implode('.', array_reverse($this->labels)); + } + $this->section = $this->setSection($section); } @@ -155,6 +159,14 @@ public function getContent() return $this->publicSuffix; } + /** + * {@inheritdoc} + */ + public function __toString() + { + return (string) $this->publicSuffix; + } + /** * {@inheritdoc} */ diff --git a/src/Rules.php b/src/Rules.php index acb8a0d7..ba15c83b 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -103,7 +103,7 @@ public function __construct(array $rules) * * @return PublicSuffix */ - public function getPublicSuffix($domain = null, string $section = self::ALL_DOMAINS): PublicSuffix + public function getPublicSuffix($domain, string $section = self::ALL_DOMAINS): PublicSuffix { $section = $this->validateSection($section); $domain = $domain instanceof Domain ? $domain : new Domain($domain); @@ -122,7 +122,7 @@ public function getPublicSuffix($domain = null, string $section = self::ALL_DOMA * * @return Domain */ - public function resolve($domain = null, string $section = self::ALL_DOMAINS): Domain + public function resolve($domain, string $section = self::ALL_DOMAINS): Domain { $section = $this->validateSection($section); try { diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 38e85a5e..e3ed5fbb 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -71,7 +71,7 @@ public function provideWrongConstructor() /** * @covers ::__construct - * @covers ::setDomain + * @covers ::setLabels * @covers ::getIdnErrors */ public function testToAsciiThrowsException() @@ -95,6 +95,7 @@ public function testToUnicodeThrowsException() * @covers ::__construct * @covers ::__set_state * @covers ::__debugInfo + * @covers ::__toString * @covers ::jsonSerialize * @covers ::getIterator */ @@ -109,6 +110,7 @@ public function testDomainInternalPhpMethod() json_encode($domain->__debugInfo()), json_encode($domain) ); + $this->assertSame('www.ulb.ac.be', (string) $domain); } /** @@ -162,7 +164,7 @@ public function testOffsets() } /** - * @covers ::setDomain + * @covers ::setLabels * @covers ::setPublicSuffix * @covers ::normalize * @covers ::setRegistrableDomain @@ -262,7 +264,7 @@ public function toUnicodeProvider() } /** - * @covers ::setDomain + * @covers ::setLabels * @covers ::setPublicSuffix * @covers ::normalize * @covers ::setRegistrableDomain diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index dd871f53..334d7b18 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -19,6 +19,7 @@ class PublicSuffixTest extends TestCase * @covers ::__construct * @covers ::__set_state * @covers ::__debugInfo + * @covers ::__toString * @covers ::jsonSerialize * @covers ::getIterator */ @@ -32,11 +33,12 @@ public function testInternalPhpMethod() json_encode($publicSuffix->__debugInfo()), json_encode($publicSuffix) ); + $this->assertSame('ac.be', (string) $publicSuffix); } /** * @covers ::__construct - * @covers ::setDomain + * @covers ::setLabels * @covers ::setSection * @covers ::getContent * @covers ::toUnicode @@ -48,7 +50,7 @@ public function testPSToUnicodeWithUrlEncode() /** * @covers ::__construct - * @covers ::setDomain + * @covers ::setLabels * @covers ::idnToAscii */ public function testPSToAsciiThrowsException() diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 3c7ac785..d2a7d718 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -74,7 +74,7 @@ public function testDomainInternalPhpMethod() * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\Domain::isKnown - * @covers \Pdp\IDNAConverterTrait::setDomain + * @covers \Pdp\IDNAConverterTrait::setLabels */ public function testNullWillReturnNullDomain() { @@ -85,7 +85,7 @@ public function testNullWillReturnNullDomain() /** * @covers ::resolve - * @covers \Pdp\IDNAConverterTrait::setDomain + * @covers \Pdp\IDNAConverterTrait::setLabels */ public function testThrowsTypeErrorOnWrongInput() { @@ -112,7 +112,7 @@ public function testResolveThrowsExceptionOnWrongDomainType() * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\Domain::isKnown - * @covers \Pdp\IDNAConverterTrait::setDomain + * @covers \Pdp\IDNAConverterTrait::setLabels */ public function testIsSuffixValidFalse() { @@ -134,7 +134,7 @@ public function testIsSuffixValidFalse() * @covers \Pdp\Domain::isKnown * @covers \Pdp\Domain::isICANN * @covers \Pdp\Domain::isPrivate - * @covers \Pdp\IDNAConverterTrait::setDomain + * @covers \Pdp\IDNAConverterTrait::setLabels */ public function testIsSuffixValidTrue() { @@ -158,7 +158,7 @@ public function testIsSuffixValidTrue() * @covers \Pdp\Domain::isKnown * @covers \Pdp\Domain::isICANN * @covers \Pdp\Domain::isPrivate - * @covers \Pdp\IDNAConverterTrait::setDomain + * @covers \Pdp\IDNAConverterTrait::setLabels */ public function testIsSuffixValidFalseWithPunycoded() { @@ -182,7 +182,7 @@ public function testIsSuffixValidFalseWithPunycoded() * @covers \Pdp\Domain::isKnown * @covers \Pdp\Domain::isICANN * @covers \Pdp\Domain::isPrivate - * @covers \Pdp\IDNAConverterTrait::setDomain + * @covers \Pdp\IDNAConverterTrait::setLabels */ public function testSubDomainIsNull() { @@ -195,7 +195,7 @@ public function testSubDomainIsNull() /** * @covers ::resolve * @covers ::validateSection - * @covers \Pdp\IDNAConverterTrait::setDomain + * @covers \Pdp\IDNAConverterTrait::setLabels */ public function testWithInvalidDomainName() { @@ -209,7 +209,7 @@ public function testWithInvalidDomainName() * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\IDNAConverterTrait::setDomain + * @covers \Pdp\IDNAConverterTrait::setLabels */ public function testWithPrivateDomain() { @@ -220,18 +220,32 @@ public function testWithPrivateDomain() $this->assertSame('github.io', $domain->getPublicSuffix()); } + /** + * @covers ::resolve + * @covers \Pdp\Domain::isResolvable + */ + public function testWithAbsoluteHostInvalid() + { + $domain = $this->rules->resolve('private.ulb.ac.be.'); + $this->assertSame('private.ulb.ac.be.', $domain->getContent()); + $this->assertFalse($domain->isKnown()); + $this->assertFalse($domain->isICANN()); + $this->assertFalse($domain->isPrivate()); + $this->assertNull($domain->getPublicSuffix()); + } + /** * @covers ::resolve * @covers ::validateSection * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\IDNAConverterTrait::setDomain + * @covers \Pdp\IDNAConverterTrait::setLabels */ public function testWithPrivateDomainInvalid() { $domain = $this->rules->resolve('private.ulb.ac.be', Rules::PRIVATE_DOMAINS); - $this->assertSame('private.ulb.ac.be', $domain->getDomain()); + $this->assertSame('private.ulb.ac.be', $domain->getContent()); $this->assertFalse($domain->isKnown()); $this->assertFalse($domain->isICANN()); $this->assertFalse($domain->isPrivate()); @@ -244,12 +258,12 @@ public function testWithPrivateDomainInvalid() * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\IDNAConverterTrait::setDomain + * @covers \Pdp\IDNAConverterTrait::setLabels */ public function testWithPrivateDomainValid() { $domain = $this->rules->resolve('thephpleague.github.io', Rules::PRIVATE_DOMAINS); - $this->assertSame('thephpleague.github.io', $domain->getDomain()); + $this->assertSame('thephpleague.github.io', $domain->getContent()); $this->assertTrue($domain->isKnown()); $this->assertFalse($domain->isICANN()); $this->assertTrue($domain->isPrivate()); @@ -262,12 +276,12 @@ public function testWithPrivateDomainValid() * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\IDNAConverterTrait::setDomain + * @covers \Pdp\IDNAConverterTrait::setLabels */ public function testWithICANNDomainInvalid() { $domain = $this->rules->resolve('private.ulb.ac.be'); - $this->assertSame('private.ulb.ac.be', $domain->getDomain()); + $this->assertSame('private.ulb.ac.be', $domain->getContent()); $this->assertTrue($domain->isKnown()); $this->assertTrue($domain->isICANN()); $this->assertFalse($domain->isPrivate()); @@ -280,13 +294,13 @@ public function testWithICANNDomainInvalid() * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\IDNAConverterTrait::setDomain + * @covers \Pdp\IDNAConverterTrait::setLabels */ public function testWithDomainObject() { $domain = new Domain('private.ulb.ac.be', new PublicSuffix('ac.be', Rules::ICANN_DOMAINS)); $newDomain = $this->rules->resolve($domain); - $this->assertSame('private.ulb.ac.be', $domain->getDomain()); + $this->assertSame('private.ulb.ac.be', $domain->getContent()); $this->assertTrue($domain->isKnown()); $this->assertTrue($domain->isICANN()); $this->assertFalse($domain->isPrivate()); @@ -296,7 +310,7 @@ public function testWithDomainObject() /** * @covers ::getPublicSuffix - * @covers \Pdp\IDNAConverterTrait::setDomain + * @covers \Pdp\IDNAConverterTrait::setLabels */ public function testWithDomainInterfaceObject() { @@ -324,7 +338,7 @@ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $dom /** * @covers ::resolve - * @covers \Pdp\IDNAConverterTrait::setDomain + * @covers \Pdp\IDNAConverterTrait::setLabels * @covers \Pdp\Domain::setPublicSuffix * @covers \Pdp\Domain::getPublicSuffix * @dataProvider parseDataProvider @@ -341,7 +355,7 @@ public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, /** * @covers ::resolve - * @covers \Pdp\IDNAConverterTrait::setDomain + * @covers \Pdp\IDNAConverterTrait::setLabels * @covers \Pdp\Domain::withPublicSuffix * @covers \Pdp\Domain::getContent * @dataProvider parseDataProvider @@ -386,7 +400,7 @@ public function parseDataProvider() * @covers ::getPublicSuffix * @covers ::validateSection * @covers \Pdp\Domain::isResolvable - * @covers \Pdp\IDNAConverterTrait::setDomain + * @covers \Pdp\IDNAConverterTrait::setLabels * @dataProvider invalidParseProvider * * @param mixed $domain @@ -418,7 +432,7 @@ public function invalidParseProvider() * @covers ::getPublicSuffix * @covers ::validateSection * @covers \Pdp\Domain::isResolvable - * @covers \Pdp\IDNAConverterTrait::setDomain + * @covers \Pdp\IDNAConverterTrait::setLabels * @dataProvider validPublicSectionProvider * * @param string|null $domain @@ -477,7 +491,7 @@ public function checkPublicSuffix($input, $expected) * @covers ::findPublicSuffixFromSection * @covers \Pdp\Domain::withPublicSuffix * @covers \Pdp\Domain::getRegistrableDomain - * @covers \Pdp\IDNAConverterTrait::setDomain + * @covers \Pdp\IDNAConverterTrait::setLabels */ public function testPublicSuffixSpec() { From 192f7934c3c0da08c5a36c23ed29534e830ba7cd Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 1 May 2018 21:18:12 +0200 Subject: [PATCH 110/461] improve PublicSuffix validation --- src/PublicSuffix.php | 2 +- tests/PublicSuffixTest.php | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 706bf3a2..dea7959b 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -100,7 +100,7 @@ public function __construct($publicSuffix = null, string $section = '') */ private function setSection(string $section): string { - if (in_array($this->publicSuffix, ['', null], true)) { + if (in_array($this->publicSuffix, ['', null], true) || '.' === substr($this->publicSuffix, -1, 1)) { return ''; } diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 334d7b18..90d0b270 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -48,6 +48,41 @@ public function testPSToUnicodeWithUrlEncode() $this->assertSame('bébe', (new PublicSuffix('b%C3%A9be'))->toUnicode()->getContent()); } + /** + * @covers ::__construct + * @covers ::setLabels + * @covers ::setSection + * @covers ::isKnown + * @covers ::isICANN + * @covers ::isPrivate + * @dataProvider PSProvider + * + * @param string|null $publicSuffix + * @param string $section + * @param bool $isKnown + * @param bool $isIcann + * @param bool $isPrivate + */ + public function testSetSection($publicSuffix, string $section, bool $isKnown, bool $isIcann, bool $isPrivate) + { + $ps = new PublicSuffix($publicSuffix, $section); + + $this->assertSame($isKnown, $ps->isKnown()); + $this->assertSame($isIcann, $ps->isICANN()); + $this->assertSame($isPrivate, $ps->isPrivate()); + } + + public function PSProvider() + { + return [ + [null, PublicSuffix::ICANN_DOMAINS, false, false, false], + ['', PublicSuffix::ICANN_DOMAINS, false, false, false], + ['foo', PublicSuffix::ICANN_DOMAINS, true, true, false], + ['foo', PublicSuffix::PRIVATE_DOMAINS, true, false, true], + ['foo.', PublicSuffix::PRIVATE_DOMAINS, false, false, false], + ]; + } + /** * @covers ::__construct * @covers ::setLabels From 99d71f7370f18fd8280e447b950bb9cf9481cfc3 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 7 May 2018 10:41:36 +0200 Subject: [PATCH 111/461] Improve package - Improve PublicSuffix validation - Improve Domain modification methods validation --- .php_cs | 17 ++++++ src/Cache.php | 6 +- src/CacheException.php | 6 +- src/Converter.php | 6 +- src/CurlHttpClient.php | 20 ++---- src/Domain.php | 104 ++++++++++---------------------- src/DomainInterface.php | 8 ++- src/Exception.php | 6 +- src/HttpClient.php | 12 ++-- src/HttpClientException.php | 6 +- src/IDNAConverterTrait.php | 6 +- src/Installer.php | 6 +- src/Manager.php | 6 +- src/PublicSuffix.php | 46 ++++++++++---- src/PublicSuffixListSection.php | 6 +- src/Rules.php | 6 +- tests/CacheTest.php | 11 ++++ tests/CurlHttpClientTest.php | 11 ++++ tests/DomainTest.php | 22 ++++++- tests/ManagerTest.php | 11 ++++ tests/PublicSuffixTest.php | 54 +++++++++++++++-- tests/RulesTest.php | 11 ++++ 22 files changed, 261 insertions(+), 126 deletions(-) diff --git a/.php_cs b/.php_cs index 66b9fedd..bed8ccb7 100644 --- a/.php_cs +++ b/.php_cs @@ -1,5 +1,16 @@ in(__DIR__.'/src') ->in(__DIR__.'/tests') @@ -10,6 +21,12 @@ return PhpCsFixer\Config::create() '@PSR2' => true, 'array_syntax' => ['syntax' => 'short'], 'concat_space' => ['spacing' => 'none'], + 'header_comment' => [ + 'commentType' => 'PHPDoc', + 'header' => $header, + 'location' => 'after_open', + 'separate' => 'both', + ], 'new_with_braces' => true, 'no_blank_lines_after_phpdoc' => true, 'no_empty_phpdoc' => true, diff --git a/src/Cache.php b/src/Cache.php index 44c28ee7..21ea7e85 100644 --- a/src/Cache.php +++ b/src/Cache.php @@ -1,12 +1,16 @@ - * @author Jeremy Kendall - * @author Ignace Nyamagana Butera - */ final class CurlHttpClient implements HttpClient { /** - * Additionnal cURL options. - * * @var array */ private $options; diff --git a/src/Domain.php b/src/Domain.php index 6a302763..da825a04 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -1,12 +1,16 @@ - * @author Ignace Nyamagana Butera */ final class Domain implements DomainInterface, JsonSerializable { @@ -122,7 +123,7 @@ private function setPublicSuffix(PublicSuffix $publicSuffix): PublicSuffix * * @return PublicSuffix */ - private function normalize(PublicSuffix $subject): PublicSuffix + private function normalize($subject) { if (null === $this->domain || null === $subject->getContent()) { return $subject; @@ -370,14 +371,7 @@ public function toAscii() return $this; } - $clone = clone $this; - $clone->domain = $domain; - $clone->labels = array_reverse(explode('.', $clone->domain)); - $clone->publicSuffix = $this->publicSuffix->toAscii(); - $clone->registrableDomain = $clone->setRegistrableDomain(); - $clone->subDomain = $clone->setSubDomain(); - - return $clone; + return new self($domain, $this->publicSuffix); } /** @@ -389,14 +383,7 @@ public function toUnicode() return $this; } - $clone = clone $this; - $clone->domain = $this->idnToUnicode($this->domain); - $clone->labels = array_reverse(explode('.', $clone->domain)); - $clone->publicSuffix = $this->publicSuffix->toUnicode(); - $clone->registrableDomain = $clone->setRegistrableDomain(); - $clone->subDomain = $clone->setSubDomain(); - - return $clone; + return new self($this->idnToUnicode($this->domain), $this->publicSuffix); } /** @@ -425,12 +412,7 @@ public function resolve($publicSuffix): self return $this; } - $clone = clone $this; - $clone->publicSuffix = $clone->setPublicSuffix($publicSuffix); - $clone->registrableDomain = $clone->setRegistrableDomain(); - $clone->subDomain = $clone->setSubDomain(); - - return $clone; + return new self($this->domain, $publicSuffix); } /** @@ -460,12 +442,9 @@ public function withSubDomain($subDomain): self return $this; } - $clone = clone $this; - $clone->labels = array_merge(array_slice($this->labels, 0, count($this->publicSuffix) + 1), iterator_to_array($subDomain)); - $clone->domain = implode('.', array_reverse($clone->labels)); - $clone->subDomain = $subDomain->getContent(); + $labels = array_merge(array_slice($this->labels, 0, count($this->publicSuffix) + 1), iterator_to_array($subDomain)); - return $clone; + return new self(implode('.', array_reverse(array_values($labels))), $this->publicSuffix); } /** @@ -495,13 +474,9 @@ public function withPublicSuffix($publicSuffix): self return $this; } - $clone = clone $this; - $clone->labels = array_merge(iterator_to_array($publicSuffix), array_slice($this->labels, count($this->publicSuffix))); - $clone->domain = implode('.', array_reverse($clone->labels)); - $clone->publicSuffix = $publicSuffix; - $clone->registrableDomain = $this->labels[count($this->publicSuffix)].'.'.$publicSuffix->getContent(); + $labels = array_merge(iterator_to_array($publicSuffix), array_slice($this->labels, count($this->publicSuffix))); - return $clone; + return new self(implode('.', array_reverse(array_values($labels))), $publicSuffix); } /** @@ -523,15 +498,14 @@ public function withPublicSuffix($publicSuffix): self */ public function withLabel(int $key, $label): self { - if (!$label instanceof PublicSuffix) { - $label = $this->normalize(new PublicSuffix($label)); + if (!$label instanceof Domain) { + $label = new Domain($label); } if (1 != count($label)) { throw new Exception(sprintf('The label `%s` is invalid', (string) $label)); } - $label = (string) $label; $nb_labels = count($this->labels); $offset = filter_var($key, FILTER_VALIDATE_INT, ['options' => ['min_range' => - $nb_labels - 1, 'max_range' => $nb_labels]]); if (false === $offset) { @@ -542,29 +516,23 @@ public function withLabel(int $key, $label): self $offset = $nb_labels + $offset; } - if ($label === ($this->labels[$offset] ?? null)) { + if (($this->labels[$offset] ?? null) === (string) $label) { return $this; } - $labels = $this->labels; - $labels[$offset] = $label; - ksort($labels); - - $clone = clone $this; - $clone->labels = array_values($labels); - $clone->domain = implode('.', array_reverse($clone->labels)); - if (null !== $this->publicSuffix->getLabel($offset)) { - $clone->publicSuffix = new PublicSuffix(); - $clone->registrableDomain = null; - $clone->subDomain = null; - - return $clone; + if (null !== $this->domain) { + static $pattern = '/[^\x20-\x7f]/'; + $label = !preg_match($pattern, $this->domain) ? $label->toAscii() : $label->toUnicode(); } - $clone->registrableDomain = $clone->setRegistrableDomain(); - $clone->subDomain = $clone->setSubDomain(); + $labels = $this->labels; + $labels[$offset] = (string) $label; + ksort($labels); - return $clone; + return new self( + implode('.', array_reverse(array_values($labels))), + null === $this->publicSuffix->getLabel($offset) ? $this->publicSuffix : null + ); } /** @@ -594,20 +562,12 @@ public function withoutLabel(int $key): self $offset = $nb_labels + $offset; } - $clone = clone $this; - unset($clone->labels[$offset]); - $clone->domain = implode('.', array_reverse($clone->labels)); - if (null !== $this->publicSuffix->getLabel($offset)) { - $clone->publicSuffix = new PublicSuffix(); - $clone->registrableDomain = null; - $clone->subDomain = null; - - return $clone; - } - - $clone->registrableDomain = $clone->setRegistrableDomain(); - $clone->subDomain = $clone->setSubDomain(); + $labels = $this->labels; + unset($labels[$offset]); - return $clone; + return new self( + implode('.', array_reverse(array_values($labels))), + null === $this->publicSuffix->getLabel($offset) ? $this->publicSuffix : null + ); } } diff --git a/src/DomainInterface.php b/src/DomainInterface.php index a2df1687..0954d2d1 100644 --- a/src/DomainInterface.php +++ b/src/DomainInterface.php @@ -1,12 +1,16 @@ */ interface DomainInterface extends Countable, IteratorAggregate { diff --git a/src/Exception.php b/src/Exception.php index 56dd5246..f3ed917a 100644 --- a/src/Exception.php +++ b/src/Exception.php @@ -1,12 +1,16 @@ - * @license https://github.com/thephpleague/uri-hostname-parser/blob/master/LICENSE (MIT License) - * @version 1.0.4 - * @link https://github.com/thephpleague/uri-hostname-parser + * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. diff --git a/src/HttpClientException.php b/src/HttpClientException.php index 829611d7..cb7bd37d 100644 --- a/src/HttpClientException.php +++ b/src/HttpClientException.php @@ -1,12 +1,16 @@ labels = $this->setLabels($publicSuffix); - if (!empty($this->labels)) { - $this->publicSuffix = implode('.', array_reverse($this->labels)); + $this->publicSuffix = $this->setPublicSuffix(); + $this->section = $this->setSection($section); + } + + /** + * Set the public suffix content. + * + * @throws Exception if the public suffix labels are invalid + * + * @return string|null + */ + private function setPublicSuffix() + { + if (empty($this->labels)) { + return null; } - $this->section = $this->setSection($section); + $publicSuffix = implode('.', array_reverse($this->labels)); + if ('' !== reset($this->labels)) { + return $publicSuffix; + } + + throw new Exception(sprintf('The public suffix `%s` is invalid', $publicSuffix)); } /** @@ -100,16 +122,16 @@ public function __construct($publicSuffix = null, string $section = '') */ private function setSection(string $section): string { - if (in_array($this->publicSuffix, ['', null], true) || '.' === substr($this->publicSuffix, -1, 1)) { - return ''; + static $section_list = [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, '']; + if (!in_array($section, $section_list, true)) { + throw new Exception(sprintf('`%s` is an unknown Public Suffix List section', $section)); } - static $section_list = [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, '']; - if (in_array($section, $section_list, true)) { - return $section; + if (null === $this->publicSuffix) { + return ''; } - throw new Exception(sprintf('`%s` is an unknown Public Suffix List section', $section)); + return $section; } /** @@ -232,8 +254,8 @@ public function toAscii() } $clone = clone $this; - $clone->publicSuffix = $this->idnToAscii($this->publicSuffix); - $clone->labels = array_reverse(explode('.', $clone->publicSuffix)); + $clone->publicSuffix = $publicSuffix; + $clone->labels = array_reverse(explode('.', $publicSuffix)); return $clone; } diff --git a/src/PublicSuffixListSection.php b/src/PublicSuffixListSection.php index 2541864d..97317761 100644 --- a/src/PublicSuffixListSection.php +++ b/src/PublicSuffixListSection.php @@ -1,12 +1,16 @@ expectException(Exception::class); (new Domain('example.com'))->withLabel(-1, 'www.shop'); } + /** + * @covers ::withLabel + */ + public function testWithLabelFailsWithInvalidLabel2() + { + $this->expectException(Exception::class); + (new Domain('example.com'))->withLabel(-1, ''); + } + /** * @covers ::withoutLabel * @dataProvider withoutLabelWorksProvider diff --git a/tests/ManagerTest.php b/tests/ManagerTest.php index c55324ae..c1c3fb89 100644 --- a/tests/ManagerTest.php +++ b/tests/ManagerTest.php @@ -1,5 +1,16 @@ assertSame($isKnown, $ps->isKnown()); $this->assertSame($isIcann, $ps->isICANN()); $this->assertSame($isPrivate, $ps->isPrivate()); @@ -76,10 +87,30 @@ public function PSProvider() { return [ [null, PublicSuffix::ICANN_DOMAINS, false, false, false], - ['', PublicSuffix::ICANN_DOMAINS, false, false, false], ['foo', PublicSuffix::ICANN_DOMAINS, true, true, false], ['foo', PublicSuffix::PRIVATE_DOMAINS, true, false, true], - ['foo.', PublicSuffix::PRIVATE_DOMAINS, false, false, false], + ]; + } + + /** + * @covers ::__construct + * @covers ::setLabels + * @covers ::setPublicSuffix + * @dataProvider invalidPublicSuffixProvider + * + * @param mixed $publicSuffix + */ + public function testConstructorThrowsException($publicSuffix) + { + $this->expectException(Exception::class); + new PublicSuffix($publicSuffix); + } + + public function invalidPublicSuffixProvider() + { + return [ + 'empty string' => [''], + 'absolute host' => ['foo.'], ]; } @@ -119,14 +150,26 @@ public function testToUnicodeThrowsException() * @covers ::toUnicode * @covers ::idnToAscii * @covers ::idnToUnicode + * + * @dataProvider testConversionReturnsTheSameInstanceProvider + * + * @param string|null $publicSuffix */ - public function testConversionReturnsTheSameInstance() + public function testConversionReturnsTheSameInstance($publicSuffix) { - $instance = new PublicSuffix('ac.be'); + $instance = new PublicSuffix($publicSuffix); $this->assertSame($instance->toUnicode(), $instance); $this->assertSame($instance->toAscii(), $instance); } + public function testConversionReturnsTheSameInstanceProvider() + { + return [ + 'ascii only domain' => ['ac.be'], + 'null domain' => [null], + ]; + } + /** * @covers ::toUnicode * @covers ::idnToUnicode @@ -156,7 +199,6 @@ public function countableProvider() { return [ 'null' => [null, 0, []], - 'empty string' => ['', 1, ['']], 'simple' => ['foo.bar.baz', 3, ['baz', 'bar', 'foo']], 'unicode' => ['www.食狮.公司.cn', 4, ['cn', '公司', '食狮', 'www']], ]; diff --git a/tests/RulesTest.php b/tests/RulesTest.php index d2a7d718..c964441d 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -1,5 +1,16 @@ Date: Tue, 8 May 2018 18:33:11 +0200 Subject: [PATCH 112/461] Improve package - Simplify PublicSuffix section validation - Simplify Rules section validation - Improve Domain internal code --- src/Domain.php | 5 ++--- src/PublicSuffix.php | 11 +++++------ src/Rules.php | 10 +++++----- tests/PublicSuffixTest.php | 4 ++-- 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index da825a04..6701fbe4 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -123,7 +123,7 @@ private function setPublicSuffix(PublicSuffix $publicSuffix): PublicSuffix * * @return PublicSuffix */ - private function normalize($subject) + private function normalize(PublicSuffix $subject): PublicSuffix { if (null === $this->domain || null === $subject->getContent()) { return $subject; @@ -323,8 +323,7 @@ public function getPublicSuffix() */ public function isResolvable(): bool { - return 2 <= count($this->labels) - && '.' !== substr($this->domain, -1, 1); + return 1 < count($this->labels) && '.' !== substr($this->domain, -1, 1); } /** diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 018c4c2f..f782c6c9 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -66,15 +66,14 @@ public static function __set_state(array $properties): self */ public static function createFromDomain(Domain $domain): self { - if (!$domain->isKnown()) { - return new self($domain->getPublicSuffix()); - } - + $section = ''; if ($domain->isICANN()) { - return new self($domain->getPublicSuffix(), self::ICANN_DOMAINS); + $section = self::ICANN_DOMAINS; + } elseif ($domain->isPrivate()) { + $section = self::PRIVATE_DOMAINS; } - return new self($domain->getPublicSuffix(), self::PRIVATE_DOMAINS); + return new self($domain->getPublicSuffix(), $section); } /** diff --git a/src/Rules.php b/src/Rules.php index 3b34c39f..b37c0bb4 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -152,12 +152,12 @@ public function resolve($domain, string $section = self::ALL_DOMAINS): Domain */ private function validateSection(string $section): string { - if (self::ALL_DOMAINS === $section || '' === $section) { - return ''; + if (self::ALL_DOMAINS === $section) { + $section = ''; } - $rules = $this->rules[$section] ?? null; - if (is_array($rules)) { + static $section_list = [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, '']; + if (in_array($section, $section_list, true)) { return $section; } @@ -202,7 +202,7 @@ private function findPublicSuffix(DomainInterface $domain, string $section): Pub */ private function findPublicSuffixFromSection(DomainInterface $domain, string $section): PublicSuffix { - $rules = $this->rules[$section]; + $rules = $this->rules[$section] ?? []; $matches = []; foreach ($domain as $label) { //match exception rule diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 97caeec6..17d469ae 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -151,7 +151,7 @@ public function testToUnicodeThrowsException() * @covers ::idnToAscii * @covers ::idnToUnicode * - * @dataProvider testConversionReturnsTheSameInstanceProvider + * @dataProvider conversionReturnsTheSameInstanceProvider * * @param string|null $publicSuffix */ @@ -162,7 +162,7 @@ public function testConversionReturnsTheSameInstance($publicSuffix) $this->assertSame($instance->toAscii(), $instance); } - public function testConversionReturnsTheSameInstanceProvider() + public function conversionReturnsTheSameInstanceProvider() { return [ 'ascii only domain' => ['ac.be'], From 219b3791da458156fc4259ca69c2ab6efc902825 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 9 May 2018 10:29:43 +0200 Subject: [PATCH 113/461] Improve Domain modification methods Domain::withLabel now accepts a domain Domain::withoutLabels now accept an optional variadic argument to ease usage --- CHANGELOG.md | 2 +- README.md | 2 +- src/Domain.php | 63 +++++++++++++++++++++++++++++--------------- tests/DomainTest.php | 44 ++++++++++++++++++++++--------- 4 files changed, 75 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2bcf921..0c92f1d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\Domain::withPublicSuffix` updates the `Pdp\Domain` public suffix part. - `Pdp\Domain::withSubDomain` updates the `Pdp\Domain` sub domain part. - `Pdp\Domain::withLabel` adds a new label to the `Pdp\Domain`. -- `Pdp\Domain::withoutLabel` removes a label from the `Pdp\Domain`. +- `Pdp\Domain::withoutLabels` removes labels from the `Pdp\Domain`. - `Pdp\Domain::resolve` attach a public suffix to the `Pdp\Domain`. - `Pdp\Domain::isResolvable` tells whether the current `Pdp\Domain` can have a public suffix attached to it or not. - `Pdp\PublicSuffix::createFromDomain` returns a new `Pdp\PublicSuffix` object from a `Pdp\Domain`object diff --git a/README.md b/README.md index fb6dac7d..63fa52ef 100644 --- a/README.md +++ b/README.md @@ -113,7 +113,7 @@ public function Domain::toUnicode(): self public function Domain::withPublicSuffix($publicSuffix): self public function Domain::withSubDomain($subDomain): self public function Domain::withLabel(int $key, $label): self -public function Domain::withoutLabel(int $key): self +public function Domain::withoutLabels(int $key, int ...$keys): self public function Domain::resolve($publicSuffix): self ~~~ diff --git a/src/Domain.php b/src/Domain.php index 6701fbe4..628fe70b 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -16,6 +16,7 @@ namespace Pdp; use JsonSerializable; +use TypeError; /** * Domain Value Object. @@ -428,14 +429,14 @@ public function resolve($publicSuffix): self */ public function withSubDomain($subDomain): self { - if (!$subDomain instanceof PublicSuffix) { - $subDomain = new PublicSuffix($subDomain); - } - if (null === $this->publicSuffix->getContent()) { throw new Exception('A subdomain can not be added to a domain without a public suffix part.'); } + if (!$subDomain instanceof PublicSuffix) { + $subDomain = new PublicSuffix($subDomain); + } + $subDomain = $this->normalize($subDomain); if ($this->subDomain === $subDomain->getContent()) { return $this; @@ -497,12 +498,12 @@ public function withPublicSuffix($publicSuffix): self */ public function withLabel(int $key, $label): self { - if (!$label instanceof Domain) { - $label = new Domain($label); + if (null === $label) { + throw new TypeError('The label must be a scalar or a stringable object `NULL` given'); } - if (1 != count($label)) { - throw new Exception(sprintf('The label `%s` is invalid', (string) $label)); + if (!$label instanceof Domain) { + $label = new Domain($label); } $nb_labels = count($this->labels); @@ -544,29 +545,49 @@ public function withLabel(int $key, $label): self * If $key is negative, the removed label will be the label at $key position from the end. * * @param int $key + * @param int ...$keys remaining keys to remove * * @throws Exception If the key is out of bounds * * @return self */ - public function withoutLabel(int $key): self + public function withoutLabels(int $key, int ...$keys): self { + array_unshift($keys, $key); $nb_labels = count($this->labels); - $offset = filter_var($key, FILTER_VALIDATE_INT, ['options' => ['min_range' => - $nb_labels, 'max_range' => $nb_labels - 1]]); - if (false === $offset) { - throw new Exception(sprintf('the given key `%s` is invalid', $key)); - } + $options = ['options' => ['min_range' => - $nb_labels, 'max_range' => $nb_labels - 1]]; + $mapper = function (int $key) use ($options, $nb_labels): int { + if (false === ($offset = filter_var($key, FILTER_VALIDATE_INT, $options))) { + throw new Exception(sprintf('the key `%s` is invalid', $key)); + } - if (0 > $offset) { - $offset = $nb_labels + $offset; + if (0 > $offset) { + return $nb_labels + $offset; + } + + return $offset; + }; + + $deleted_keys = array_keys(array_count_values(array_map($mapper, $keys))); + + $filter = function ($key) use ($deleted_keys): bool { + return !in_array($key, $deleted_keys, true); + }; + + $labels = array_filter($this->labels, $filter, ARRAY_FILTER_USE_KEY); + if (empty($labels)) { + return new self(); } - $labels = $this->labels; - unset($labels[$offset]); + $domain = implode('.', array_reverse(array_values($labels))); + $publicSuffixContent = $this->publicSuffix->getContent(); - return new self( - implode('.', array_reverse(array_values($labels))), - null === $this->publicSuffix->getLabel($offset) ? $this->publicSuffix : null - ); + if (null === $publicSuffixContent || + '.'.$publicSuffixContent !== substr($domain, - strlen($publicSuffixContent) - 1) + ) { + return new self($domain); + } + + return new self($domain, $this->publicSuffix); } } diff --git a/tests/DomainTest.php b/tests/DomainTest.php index d7741953..9f898a3a 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -20,6 +20,7 @@ use Pdp\PublicSuffix; use Pdp\Rules; use PHPUnit\Framework\TestCase; +use TypeError; /** * @coversDefaultClass Pdp\Domain @@ -760,25 +761,34 @@ public function withLabelWorksProvider() 'isICANN' => true, 'isPrivate' => false, ], + 'replace a domain with multiple label' => [ + 'domain' => $base_domain, + 'key' => -1, + 'label' => 'www.shop', + 'expected' => 'www.shop.example.com', + 'isKnown' => true, + 'isICANN' => true, + 'isPrivate' => false, + ], ]; } /** * @covers ::withLabel */ - public function testWithLabelFailsWithInvalidKey() + public function testWithLabelFailsWithTypeError() { - $this->expectException(Exception::class); - (new Domain('example.com'))->withLabel(-4, 'www'); + $this->expectException(TypeError::class); + (new Domain('example.com'))->withLabel(-4, null); } /** * @covers ::withLabel */ - public function testWithLabelFailsWithInvalidLabel1() + public function testWithLabelFailsWithInvalidKey() { $this->expectException(Exception::class); - (new Domain('example.com'))->withLabel(-1, 'www.shop'); + (new Domain('example.com'))->withLabel(-4, 'www'); } /** @@ -791,8 +801,8 @@ public function testWithLabelFailsWithInvalidLabel2() } /** - * @covers ::withoutLabel - * @dataProvider withoutLabelWorksProvider + * @covers ::withoutLabels + * @dataProvider withoutLabelsWorksProvider * * @param Domain $domain * @param int $key @@ -801,7 +811,7 @@ public function testWithLabelFailsWithInvalidLabel2() * @param bool $isICANN * @param bool $isPrivate */ - public function testWithoutLabelWorks( + public function testWithoutLabelsWorks( Domain $domain, int $key, $expected, @@ -809,14 +819,14 @@ public function testWithoutLabelWorks( bool $isICANN, bool $isPrivate ) { - $result = $domain->withoutLabel($key); + $result = $domain->withoutLabels($key); $this->assertSame($expected, $result->getContent()); $this->assertSame($isKnown, $result->isKnown()); $this->assertSame($isICANN, $result->isICANN()); $this->assertSame($isPrivate, $result->isPrivate()); } - public function withoutLabelWorksProvider() + public function withoutLabelsWorksProvider() { $base_domain = new Domain('www.example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)); @@ -857,11 +867,19 @@ public function withoutLabelWorksProvider() } /** - * @covers ::withoutLabel + * @covers ::withoutLabels */ - public function testWithoutLabelFailsWithInvalidKey() + public function testWithoutLabelsFailsWithInvalidKey() { $this->expectException(Exception::class); - (new Domain('example.com'))->withoutLabel(-3); + (new Domain('example.com'))->withoutLabels(-3); + } + + /** + * @covers ::withoutLabels + */ + public function testWithoutLabelsWorksWithMultipleKeys() + { + $this->assertNull((new Domain('www.example.com'))->withoutLabels(0, 1, 2)->getContent()); } } From f977096cd80f9622ffb58eed36845ceaa67ca074 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 14 May 2018 13:10:56 +0200 Subject: [PATCH 114/461] Improve Package - add Pdp\Domain::append - add Pdp\Domain::prepend Improve Domain and PublicSuffix validation methods --- CHANGELOG.md | 6 +- README.md | 2 +- ...ULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- src/Domain.php | 169 ++++++++++++------ src/PublicSuffix.php | 14 +- tests/DomainTest.php | 94 ++++++++-- tests/RulesTest.php | 2 +- 7 files changed, 206 insertions(+), 83 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c92f1d9..d264ec5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,10 +9,12 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\PublicSuffixListSection` interface implemented by `Pdp\Rules` and `Pdp\PublicSuffix` - `Pdp\DomainInterface` interface implemented by `Pdp\Domain` and `Pdp\PublicSuffix` - `Pdp\Domain::getContent` replaces `Pdp\Domain::getDomain` +- `Pdp\Domain::withLabel` adds a new label to the `Pdp\Domain`. +- `Pdp\Domain::withoutLabel` removes labels from the `Pdp\Domain`. - `Pdp\Domain::withPublicSuffix` updates the `Pdp\Domain` public suffix part. - `Pdp\Domain::withSubDomain` updates the `Pdp\Domain` sub domain part. -- `Pdp\Domain::withLabel` adds a new label to the `Pdp\Domain`. -- `Pdp\Domain::withoutLabels` removes labels from the `Pdp\Domain`. +- `Pdp\Domain::append` appends a label to `Pdp\Domain`. +- `Pdp\Domain::prepend` prepends a label to `Pdp\Domain`. - `Pdp\Domain::resolve` attach a public suffix to the `Pdp\Domain`. - `Pdp\Domain::isResolvable` tells whether the current `Pdp\Domain` can have a public suffix attached to it or not. - `Pdp\PublicSuffix::createFromDomain` returns a new `Pdp\PublicSuffix` object from a `Pdp\Domain`object diff --git a/README.md b/README.md index 63fa52ef..9925a231 100644 --- a/README.md +++ b/README.md @@ -113,7 +113,7 @@ public function Domain::toUnicode(): self public function Domain::withPublicSuffix($publicSuffix): self public function Domain::withSubDomain($subDomain): self public function Domain::withLabel(int $key, $label): self -public function Domain::withoutLabels(int $key, int ...$keys): self +public function Domain::withoutLabel(int $key, int ...$keys): self public function Domain::resolve($publicSuffix): self ~~~ diff --git a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache index d5ea5100..1a5652d8 100644 --- a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache +++ b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache @@ -1 +1 @@ -s:105800:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"trentino-sudtirol":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"trentinosudtirol":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"valleeaoste":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"cesenaforli":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"forlicesena":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trentino":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"travel":[],"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":[],"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"barsyonline":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"hepforge":[],"js":[],"uklugs":[],"mozilla-iot":[],"bmoattachments":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ca":{"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"ravendb":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[]},"pw":{"cloudns":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[]},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"org":{"glug":[],"lug":[],"lugs":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]}},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"co":{"com":{"blogspot":[]},"nodum":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[]},"it":{"blogspot":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"community":{"ravendb":[]},"run":{"development":[],"ravendb":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"bs":{"we":[]},"online":{"barsy":[]},"support":{"barsy":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[]},"ai":{"nom":[]},"gd":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"hn":{"nom":[]},"kz":{"nym":[]},"sx":{"nym":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"lc":{"oy":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"space":{"stackspace":[],"uber":[],"xs4all":[]},"farm":{"storj":[]},"mobi":{"dscloud":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]},"st":{"noho":[]}}}"; \ No newline at end of file +s:107904:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastvps-server":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lmpm":{"app":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ca":{"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"ravendb":[],"barsy":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"co":{"otap":{"*":[]},"com":{"blogspot":[]},"mypi":[],"n4t":[],"nodum":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]},"zone":[]},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"community":{"ravendb":[]},"run":{"development":[],"ravendb":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"space":{"linkitools":[],"stackspace":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ai":{"nom":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file diff --git a/src/Domain.php b/src/Domain.php index 628fe70b..8e8d3da8 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -105,13 +105,13 @@ private function setPublicSuffix(PublicSuffix $publicSuffix): PublicSuffix } $publicSuffix = $this->normalize($publicSuffix); - $publicSuffixContent = $publicSuffix->getContent(); - if ($this->domain === $publicSuffixContent) { - throw new Exception(sprintf('The public suffix `%s` can not be equal to the domain name `%s`', $publicSuffixContent, $this->domain)); + $psContent = $publicSuffix->getContent(); + if ($this->domain === $psContent) { + throw new Exception(sprintf('The public suffix `%s` can not be equal to the domain name `%s`', $psContent, $this->domain)); } - if ('.'.$publicSuffixContent !== substr($this->domain, - strlen($publicSuffixContent) - 1)) { - throw new Exception(sprintf('The public suffix `%s` can not be assign to the domain name `%s`', $publicSuffixContent, $this->domain)); + if ('.'.$psContent !== substr($this->domain, - strlen($psContent) - 1)) { + throw new Exception(sprintf('The public suffix `%s` can not be assign to the domain name `%s`', $psContent, $this->domain)); } return $publicSuffix; @@ -193,6 +193,14 @@ public function getIterator() * {@inheritdoc} */ public function jsonSerialize() + { + return $this->__debugInfo(); + } + + /** + * {@inheritdoc} + */ + public function __debugInfo() { return [ 'domain' => $this->domain, @@ -205,14 +213,6 @@ public function jsonSerialize() ]; } - /** - * {@inheritdoc} - */ - public function __debugInfo() - { - return $this->jsonSerialize(); - } - /** * {@inheritdoc} */ @@ -433,18 +433,52 @@ public function withSubDomain($subDomain): self throw new Exception('A subdomain can not be added to a domain without a public suffix part.'); } - if (!$subDomain instanceof PublicSuffix) { - $subDomain = new PublicSuffix($subDomain); + $subDomain = $this->filterSubDomain($subDomain); + $subLabels = []; + if (null !== $subDomain) { + static $pattern = '/[^\x20-\x7f]/'; + $method = !preg_match($pattern, $this->domain) ? 'idnToAscii' : 'idnToUnicode'; + + $subDomain = $this->$method($subDomain); + $subLabels = array_reverse(explode('.', $subDomain)); } - $subDomain = $this->normalize($subDomain); - if ($this->subDomain === $subDomain->getContent()) { + if ($this->subDomain === $subDomain) { return $this; } - $labels = array_merge(array_slice($this->labels, 0, count($this->publicSuffix) + 1), iterator_to_array($subDomain)); + $labels = array_merge( + array_slice($this->labels, 0, count($this->publicSuffix) + 1), + $subLabels + ); + + return new self(implode('.', array_reverse($labels)), $this->publicSuffix); + } + + /** + * Filter a subdomain to update the domain part. + * + * @param mixed $subDomain + * + * @throws TypeError if the sub domain can not be converted + * + * @return string|null + */ + private function filterSubDomain($subDomain) + { + if ($subDomain instanceof DomainInterface) { + return $subDomain->getContent(); + } + + if (null === $subDomain) { + return $subDomain; + } + + if (is_scalar($subDomain) || method_exists($subDomain, '__toString')) { + return (string) $subDomain; + } - return new self(implode('.', array_reverse(array_values($labels))), $this->publicSuffix); + throw new TypeError(sprintf('The label must be a scalar, a stringable object or NULL, `%s` given', gettype($subDomain))); } /** @@ -461,22 +495,53 @@ public function withSubDomain($subDomain): self */ public function withPublicSuffix($publicSuffix): self { - if (!$publicSuffix instanceof PublicSuffix) { - $publicSuffix = new PublicSuffix($publicSuffix); - } - if (null === $this->publicSuffix->getContent()) { throw new Exception('A public suffix can not be added to a domain without a public suffix part.'); } + if (!$publicSuffix instanceof PublicSuffix) { + $publicSuffix = new PublicSuffix($publicSuffix); + } + $publicSuffix = $this->normalize($publicSuffix); if ($this->publicSuffix == $publicSuffix) { return $this; } - $labels = array_merge(iterator_to_array($publicSuffix), array_slice($this->labels, count($this->publicSuffix))); + $labels = array_merge( + iterator_to_array($publicSuffix), + array_slice($this->labels, count($this->publicSuffix)) + ); - return new self(implode('.', array_reverse(array_values($labels))), $publicSuffix); + return new self(implode('.', array_reverse($labels)), $publicSuffix); + } + + /** + * Appends a label to the domain. + * + * @see ::withLabel + * + * @param mixed $label + * + * @return self + */ + public function prepend($label): self + { + return $this->withLabel(count($this->labels), $label); + } + + /** + * Prepends a label to the domain. + * + * @see ::withLabel + * + * @param mixed $label + * + * @return self + */ + public function append($label): self + { + return $this->withLabel(- count($this->labels) - 1, $label); } /** @@ -498,40 +563,33 @@ public function withPublicSuffix($publicSuffix): self */ public function withLabel(int $key, $label): self { - if (null === $label) { - throw new TypeError('The label must be a scalar or a stringable object `NULL` given'); - } - - if (!$label instanceof Domain) { - $label = new Domain($label); - } - $nb_labels = count($this->labels); - $offset = filter_var($key, FILTER_VALIDATE_INT, ['options' => ['min_range' => - $nb_labels - 1, 'max_range' => $nb_labels]]); - if (false === $offset) { + if ($key < - $nb_labels - 1 || $key > $nb_labels) { throw new Exception(sprintf('the given key `%s` is invalid', $key)); } - if (0 > $offset) { - $offset = $nb_labels + $offset; + if (0 > $key) { + $key = $nb_labels + $key; } - if (($this->labels[$offset] ?? null) === (string) $label) { - return $this; + if (!is_scalar($label) && !method_exists($label, '__toString')) { + throw new TypeError(sprintf('The label must be a scalar or a stringable object `%s` given', gettype($label))); } - if (null !== $this->domain) { - static $pattern = '/[^\x20-\x7f]/'; - $label = !preg_match($pattern, $this->domain) ? $label->toAscii() : $label->toUnicode(); + static $pattern = '/[^\x20-\x7f]/'; + $method = !preg_match($pattern, $this->domain) ? 'idnToAscii' : 'idnToUnicode'; + $label = $this->$method((string) $label); + if (($this->labels[$key] ?? null) === $label) { + return $this; } $labels = $this->labels; - $labels[$offset] = (string) $label; + $labels[$key] = $label; ksort($labels); return new self( - implode('.', array_reverse(array_values($labels))), - null === $this->publicSuffix->getLabel($offset) ? $this->publicSuffix : null + implode('.', array_reverse($labels)), + null === $this->publicSuffix->getLabel($key) ? $this->publicSuffix : null ); } @@ -551,25 +609,23 @@ public function withLabel(int $key, $label): self * * @return self */ - public function withoutLabels(int $key, int ...$keys): self + public function withoutLabel(int $key, int ...$keys): self { array_unshift($keys, $key); $nb_labels = count($this->labels); - $options = ['options' => ['min_range' => - $nb_labels, 'max_range' => $nb_labels - 1]]; - $mapper = function (int $key) use ($options, $nb_labels): int { - if (false === ($offset = filter_var($key, FILTER_VALIDATE_INT, $options))) { + $mapper = function (int $key) use ($nb_labels): int { + if (- $nb_labels > $key || $nb_labels - 1 < $key) { throw new Exception(sprintf('the key `%s` is invalid', $key)); } - if (0 > $offset) { - return $nb_labels + $offset; + if (0 > $key) { + return $nb_labels + $key; } - return $offset; + return $key; }; $deleted_keys = array_keys(array_count_values(array_map($mapper, $keys))); - $filter = function ($key) use ($deleted_keys): bool { return !in_array($key, $deleted_keys, true); }; @@ -580,11 +636,8 @@ public function withoutLabels(int $key, int ...$keys): self } $domain = implode('.', array_reverse(array_values($labels))); - $publicSuffixContent = $this->publicSuffix->getContent(); - - if (null === $publicSuffixContent || - '.'.$publicSuffixContent !== substr($domain, - strlen($publicSuffixContent) - 1) - ) { + $psContent = $this->publicSuffix->getContent(); + if (null === $psContent || '.'.$psContent !== substr($domain, - strlen($psContent) - 1)) { return new self($domain); } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index f782c6c9..15085a97 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -148,12 +148,7 @@ public function getIterator() */ public function jsonSerialize() { - return [ - 'publicSuffix' => $this->publicSuffix, - 'isKnown' => $this->isKnown(), - 'isICANN' => $this->isICANN(), - 'isPrivate' => $this->isPrivate(), - ]; + return $this->__debugInfo(); } /** @@ -161,7 +156,12 @@ public function jsonSerialize() */ public function __debugInfo() { - return $this->jsonSerialize(); + return [ + 'publicSuffix' => $this->publicSuffix, + 'isKnown' => $this->isKnown(), + 'isICANN' => $this->isICANN(), + 'isPrivate' => $this->isPrivate(), + ]; } /** diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 9f898a3a..d26c181e 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -472,6 +472,7 @@ public function testResolveReturnsInstance() /** * @covers ::withSubDomain + * @covers ::filterSubDomain * @dataProvider withSubDomainWorksProvider * * @param Domain $domain @@ -499,7 +500,7 @@ public function withSubDomainWorksProvider() ], 'simple addition IDN (1)' => [ 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), - 'subdomain' => 'bébé', + 'subdomain' => new Domain('bébé'), 'expected' => 'xn--bb-bjab', ], 'simple addition IDN (2)' => [ @@ -522,6 +523,7 @@ public function withSubDomainWorksProvider() /** * @covers ::withSubDomain + * @covers ::filterSubDomain */ public function testWithSubDomainFailsWithNullDomain() { @@ -531,6 +533,7 @@ public function testWithSubDomainFailsWithNullDomain() /** * @covers ::withSubDomain + * @covers ::filterSubDomain */ public function testWithSubDomainFailsWithOneLabelDomain() { @@ -538,8 +541,24 @@ public function testWithSubDomainFailsWithOneLabelDomain() (new Domain('localhost'))->withSubDomain('www'); } + + /** + * @covers ::withSubDomain + * @covers ::filterSubDomain + */ + public function testWithSubDomainFailsWithNonStringableObject() + { + $this->expectException(TypeError::class); + (new Domain( + 'example.com', + new PublicSuffix('com', PublicSuffix::ICANN_DOMAINS) + ))->withSubDomain(date_create()); + } + + /** * @covers ::withSubDomain + * @covers ::filterSubDomain */ public function testWithSubDomainWithoutPublicSuffixInfo() { @@ -779,7 +798,7 @@ public function withLabelWorksProvider() public function testWithLabelFailsWithTypeError() { $this->expectException(TypeError::class); - (new Domain('example.com'))->withLabel(-4, null); + (new Domain('example.com'))->withLabel(1, null); } /** @@ -801,8 +820,57 @@ public function testWithLabelFailsWithInvalidLabel2() } /** - * @covers ::withoutLabels - * @dataProvider withoutLabelsWorksProvider + * @covers ::append + * @covers ::withLabel + * + * @param string $raw + * @param string $append + * @param string $expected + * + * @dataProvider validAppend + */ + public function testAppend($raw, $append, $expected) + { + $this->assertSame($expected, (string) (new Domain($raw))->append($append)); + } + + public function validAppend() + { + return [ + ['secure.example.com', '8.8.8.8', 'secure.example.com.8.8.8.8'], + ['secure.example.com', 'master', 'secure.example.com.master'], + ['secure.example.com', 'master.', 'secure.example.com.master.'], + ['example.com', '', 'example.com.'], + ]; + } + + /** + * @covers ::prepend + * @covers ::withLabel + * + * @param string $raw + * @param string $prepend + * @param string $expected + * + * @dataProvider validPrepend + */ + public function testPrepend($raw, $prepend, $expected) + { + $this->assertSame($expected, (string) (new Domain($raw))->prepend($prepend)); + } + + public function validPrepend() + { + return [ + ['secure.example.com', 'master', 'master.secure.example.com'], + ['secure.example.com', '127.0.0.1', '127.0.0.1.secure.example.com'], + ['secure.example.com.', 'master', 'master.secure.example.com.'], + ]; + } + + /** + * @covers ::withoutLabel + * @dataProvider withoutLabelWorksProvider * * @param Domain $domain * @param int $key @@ -811,7 +879,7 @@ public function testWithLabelFailsWithInvalidLabel2() * @param bool $isICANN * @param bool $isPrivate */ - public function testWithoutLabelsWorks( + public function testwithoutLabelWorks( Domain $domain, int $key, $expected, @@ -819,14 +887,14 @@ public function testWithoutLabelsWorks( bool $isICANN, bool $isPrivate ) { - $result = $domain->withoutLabels($key); + $result = $domain->withoutLabel($key); $this->assertSame($expected, $result->getContent()); $this->assertSame($isKnown, $result->isKnown()); $this->assertSame($isICANN, $result->isICANN()); $this->assertSame($isPrivate, $result->isPrivate()); } - public function withoutLabelsWorksProvider() + public function withoutLabelWorksProvider() { $base_domain = new Domain('www.example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)); @@ -867,19 +935,19 @@ public function withoutLabelsWorksProvider() } /** - * @covers ::withoutLabels + * @covers ::withoutLabel */ - public function testWithoutLabelsFailsWithInvalidKey() + public function testwithoutLabelFailsWithInvalidKey() { $this->expectException(Exception::class); - (new Domain('example.com'))->withoutLabels(-3); + (new Domain('example.com'))->withoutLabel(-3); } /** - * @covers ::withoutLabels + * @covers ::withoutLabel */ - public function testWithoutLabelsWorksWithMultipleKeys() + public function testwithoutLabelWorksWithMultipleKeys() { - $this->assertNull((new Domain('www.example.com'))->withoutLabels(0, 1, 2)->getContent()); + $this->assertNull((new Domain('www.example.com'))->withoutLabel(0, 1, 2)->getContent()); } } diff --git a/tests/RulesTest.php b/tests/RulesTest.php index c964441d..f68c6717 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -208,7 +208,7 @@ public function testSubDomainIsNull() * @covers ::validateSection * @covers \Pdp\IDNAConverterTrait::setLabels */ - public function testWithInvalidDomainName() + public function testWithExceptionName() { $domain = $this->rules->resolve('_b%C3%A9bé.be-'); $this->assertNull($domain->getContent()); From 139f0d05753d65f60aced335c32e58fead84f45f Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 16 May 2018 14:35:57 +0200 Subject: [PATCH 115/461] Improve Exception Handling Added more exceptions to better handle exceptions in the package. To avoid BC Break all new Exception extends the Pdp\Exception which becomes the marker/base exception for the package. --- CHANGELOG.md | 1 + src/Domain.php | 52 +++++++++---------- src/Exception/CouldNotLoadRules.php | 22 ++++++++ src/Exception/CouldNotProcessDomain.php | 22 ++++++++ src/Exception/CouldNotResolvePublicSuffix.php | 22 ++++++++ src/Exception/InvalidDomain.php | 22 ++++++++ src/IDNAConverterTrait.php | 19 +++---- src/Manager.php | 8 +-- src/PublicSuffix.php | 9 ++-- src/Rules.php | 16 +++--- tests/CacheTest.php | 8 +-- 11 files changed, 147 insertions(+), 54 deletions(-) create mode 100644 src/Exception/CouldNotLoadRules.php create mode 100644 src/Exception/CouldNotProcessDomain.php create mode 100644 src/Exception/CouldNotResolvePublicSuffix.php create mode 100644 src/Exception/InvalidDomain.php diff --git a/CHANGELOG.md b/CHANGELOG.md index d264ec5b..d7a7dbed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\Domain::resolve` attach a public suffix to the `Pdp\Domain`. - `Pdp\Domain::isResolvable` tells whether the current `Pdp\Domain` can have a public suffix attached to it or not. - `Pdp\PublicSuffix::createFromDomain` returns a new `Pdp\PublicSuffix` object from a `Pdp\Domain`object +- `Pdp\Exception` sub namespace to organize exception. All exception extends the `Pdp\Exception` class to prevent BC break. ### Fixed diff --git a/src/Domain.php b/src/Domain.php index 8e8d3da8..345c1db2 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -16,6 +16,8 @@ namespace Pdp; use JsonSerializable; +use Pdp\Exception\CouldNotProcessDomain; +use Pdp\Exception\InvalidDomain; use TypeError; /** @@ -88,9 +90,7 @@ public function __construct($domain = null, PublicSuffix $publicSuffix = null) * * @param PublicSuffix $publicSuffix * - * @throws Exception If the domain can not contain a public suffix - * @throws Exception If the domain value is the same as the public suffix value - * @throws Exception If the domain can not be match with the public suffix + * @throws InvalidDomain If the public suffic can not be attached to the domain * * @return PublicSuffix */ @@ -101,17 +101,17 @@ private function setPublicSuffix(PublicSuffix $publicSuffix): PublicSuffix } if (!$this->isResolvable()) { - throw new Exception(sprintf('The domain `%s` can not contain a public suffix', $this->domain)); + throw new InvalidDomain(sprintf('The domain `%s` can not contain a public suffix', $this->domain)); } $publicSuffix = $this->normalize($publicSuffix); $psContent = $publicSuffix->getContent(); if ($this->domain === $psContent) { - throw new Exception(sprintf('The public suffix `%s` can not be equal to the domain name `%s`', $psContent, $this->domain)); + throw new InvalidDomain(sprintf('The public suffix `%s` can not be equal to the domain name `%s`', $psContent, $this->domain)); } if ('.'.$psContent !== substr($this->domain, - strlen($psContent) - 1)) { - throw new Exception(sprintf('The public suffix `%s` can not be assign to the domain name `%s`', $psContent, $this->domain)); + throw new InvalidDomain(sprintf('The public suffix `%s` can not be assign to the domain name `%s`', $psContent, $this->domain)); } return $publicSuffix; @@ -423,14 +423,14 @@ public function resolve($publicSuffix): self * * @param mixed $subDomain the subdomain to add * - * @throws Exception If the Sub domain is invalid or can not be added to the current Domain + * @throws CouldNotProcessDomain If the Sub domain can not be added to the current Domain * * @return self */ public function withSubDomain($subDomain): self { if (null === $this->publicSuffix->getContent()) { - throw new Exception('A subdomain can not be added to a domain without a public suffix part.'); + throw new CouldNotProcessDomain('A subdomain can not be added to a domain without a public suffix part.'); } $subDomain = $this->filterSubDomain($subDomain); @@ -489,14 +489,14 @@ private function filterSubDomain($subDomain) * * @param mixed $publicSuffix * - * @throws Exception If the public suffix is invalid or can not be added to the current Domain + * @throws CouldNotProcessDomain If the public suffix can not be added to the current Domain * * @return self */ public function withPublicSuffix($publicSuffix): self { if (null === $this->publicSuffix->getContent()) { - throw new Exception('A public suffix can not be added to a domain without a public suffix part.'); + throw new CouldNotProcessDomain('A public suffix can not be added to a domain without a public suffix part.'); } if (!$publicSuffix instanceof PublicSuffix) { @@ -556,8 +556,7 @@ public function append($label): self * @param int $key * @param mixed $label * - * @throws Exception If the key is out of bounds - * @throws Exception If the label is invalid + * @throws CouldNotProcessDomain If the key is out of bounds * * @return self */ @@ -565,7 +564,7 @@ public function withLabel(int $key, $label): self { $nb_labels = count($this->labels); if ($key < - $nb_labels - 1 || $key > $nb_labels) { - throw new Exception(sprintf('the given key `%s` is invalid', $key)); + throw new CouldNotProcessDomain(sprintf('the given key `%s` is invalid', $key)); } if (0 > $key) { @@ -605,7 +604,7 @@ public function withLabel(int $key, $label): self * @param int $key * @param int ...$keys remaining keys to remove * - * @throws Exception If the key is out of bounds + * @throws CouldNotProcessDomain If the key is out of bounds * * @return self */ @@ -613,29 +612,30 @@ public function withoutLabel(int $key, int ...$keys): self { array_unshift($keys, $key); $nb_labels = count($this->labels); - $mapper = function (int $key) use ($nb_labels): int { + foreach ($keys as &$key) { if (- $nb_labels > $key || $nb_labels - 1 < $key) { - throw new Exception(sprintf('the key `%s` is invalid', $key)); + throw new CouldNotProcessDomain(sprintf('the key `%s` is invalid', $key)); } if (0 > $key) { - return $nb_labels + $key; + $key += $nb_labels; } + } + unset($key); - return $key; - }; - - $deleted_keys = array_keys(array_count_values(array_map($mapper, $keys))); - $filter = function ($key) use ($deleted_keys): bool { - return !in_array($key, $deleted_keys, true); - }; + $deleted_keys = array_keys(array_count_values($keys)); + $labels = []; + foreach ($this->labels as $key => $label) { + if (!in_array($key, $deleted_keys, true)) { + $labels[] = $label; + } + } - $labels = array_filter($this->labels, $filter, ARRAY_FILTER_USE_KEY); if (empty($labels)) { return new self(); } - $domain = implode('.', array_reverse(array_values($labels))); + $domain = implode('.', array_reverse($labels)); $psContent = $this->publicSuffix->getContent(); if (null === $psContent || '.'.$psContent !== substr($domain, - strlen($psContent) - 1)) { return new self($domain); diff --git a/src/Exception/CouldNotLoadRules.php b/src/Exception/CouldNotLoadRules.php new file mode 100644 index 00000000..9cbb5a7a --- /dev/null +++ b/src/Exception/CouldNotLoadRules.php @@ -0,0 +1,22 @@ +idnToUnicode($ascii_domain))); } - throw new Exception(sprintf('The domain `%s` is invalid : %s', $domain, self::getIdnErrors($arr['errors']))); + throw new InvalidDomain(sprintf('The domain `%s` is invalid : %s', $domain, self::getIdnErrors($arr['errors']))); } } diff --git a/src/Manager.php b/src/Manager.php index c1260ed9..14494d82 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -15,6 +15,7 @@ namespace Pdp; +use Pdp\Exception\CouldNotLoadRules; use Psr\SimpleCache\CacheInterface; /** @@ -57,8 +58,7 @@ public function __construct(CacheInterface $cache, HttpClient $http) * * @param string $source_url the Public Suffix List URL * - * @throws Exception If the PSL can not be fetch from the source URL and its cache backend - * @throws Exception If the PSL cache copy is corrupted + * @throws CouldNotLoadRules If the PSL rules can not be loaded * * @return Rules */ @@ -68,7 +68,7 @@ public function getRules(string $source_url = self::PSL_URL): Rules $cacheRules = $this->cache->get($cacheKey); if (null === $cacheRules && !$this->refreshRules($source_url)) { - throw new Exception(sprintf('Unable to load the public suffix list rules for %s', $source_url)); + throw new CouldNotLoadRules(sprintf('Unable to load the public suffix list rules for %s', $source_url)); } $rules = json_decode($cacheRules ?? $this->cache->get($cacheKey), true); @@ -76,7 +76,7 @@ public function getRules(string $source_url = self::PSL_URL): Rules return new Rules($rules); } - throw new Exception('The public suffix list cache is corrupted: '.json_last_error_msg(), json_last_error()); + throw new CouldNotLoadRules('The public suffix list cache is corrupted: '.json_last_error_msg(), json_last_error()); } /** diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 15085a97..aac3fab1 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -16,6 +16,7 @@ namespace Pdp; use JsonSerializable; +use Pdp\Exception\InvalidDomain; /** * Public Suffix Value Object. @@ -92,7 +93,7 @@ public function __construct($publicSuffix = null, string $section = '') /** * Set the public suffix content. * - * @throws Exception if the public suffix labels are invalid + * @throws InvalidDomain if the public suffix is invalid * * @return string|null */ @@ -107,7 +108,7 @@ private function setPublicSuffix() return $publicSuffix; } - throw new Exception(sprintf('The public suffix `%s` is invalid', $publicSuffix)); + throw new InvalidDomain(sprintf('The public suffix `%s` is invalid', $publicSuffix)); } /** @@ -115,7 +116,7 @@ private function setPublicSuffix() * * @param string $section * - * @throws Exception if the submitted section is not supported + * @throws InvalidDomain if the submitted section is not supported * * @return string */ @@ -123,7 +124,7 @@ private function setSection(string $section): string { static $section_list = [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, '']; if (!in_array($section, $section_list, true)) { - throw new Exception(sprintf('`%s` is an unknown Public Suffix List section', $section)); + throw new InvalidDomain(sprintf('`%s` is an unknown Public Suffix List section', $section)); } if (null === $this->publicSuffix) { diff --git a/src/Rules.php b/src/Rules.php index b37c0bb4..310af6d0 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -15,6 +15,9 @@ namespace Pdp; +use Pdp\Exception\CouldNotLoadRules; +use Pdp\Exception\CouldNotResolvePublicSuffix; + /** * A class to resolve domain name against the Public Suffix list. * @@ -41,6 +44,8 @@ final class Rules implements PublicSuffixListSection * @param string $path * @param null|resource $context * + * @throws CouldNotLoadRules If the rules can not be loaded from the path + * * @return self */ public static function createFromPath(string $path, $context = null): self @@ -51,7 +56,7 @@ public static function createFromPath(string $path, $context = null): self } if (!($resource = @fopen(...$args))) { - throw new Exception(sprintf('`%s`: failed to open stream: No such file or directory', $path)); + throw new CouldNotLoadRules(sprintf('`%s`: failed to open stream: No such file or directory', $path)); } $content = stream_get_contents($resource); @@ -100,10 +105,7 @@ public function __construct(array $rules) * @param mixed $domain * @param string $section * - * @throws Exception - * If the Domain is invalid or malformed - * If the section is invalid or not supported - * If the PublicSuffix can not be converted using against the domain encoding. + * @throws CouldNotResolvePublicSuffix If the PublicSuffix can not be resolve. * * @return PublicSuffix */ @@ -112,7 +114,7 @@ public function getPublicSuffix($domain, string $section = self::ALL_DOMAINS): P $section = $this->validateSection($section); $domain = $domain instanceof Domain ? $domain : new Domain($domain); if (!$domain->isResolvable()) { - throw new Exception(sprintf('The domain `%s` can not contain a public suffix', $domain->getContent())); + throw new CouldNotResolvePublicSuffix(sprintf('The domain `%s` can not contain a public suffix', $domain->getContent())); } return PublicSuffix::createFromDomain($domain->resolve($this->findPublicSuffix($domain, $section))); @@ -161,7 +163,7 @@ private function validateSection(string $section): string return $section; } - throw new Exception(sprintf('%s is an unknown Public Suffix List section', $section)); + throw new CouldNotResolvePublicSuffix(sprintf('%s is an unknown Public Suffix List section', $section)); } /** diff --git a/tests/CacheTest.php b/tests/CacheTest.php index 19c8f1b8..3530788b 100644 --- a/tests/CacheTest.php +++ b/tests/CacheTest.php @@ -154,8 +154,8 @@ public function testSetExpire() $this->cache->set('foo', 'bar', 1); $this->assertEquals('bar', $this->cache->get('foo')); - // Wait 2 seconds so the cache expires - usleep(2000000); + // Wait 3 seconds so the cache expires + sleep(3); $this->assertNull($this->cache->get('foo')); } @@ -168,8 +168,8 @@ public function testSetExpireDateInterval() $this->cache->set('foo', 'bar', new DateInterval('PT1S')); $this->assertEquals('bar', $this->cache->get('foo')); - // Wait 2 seconds so the cache expires - usleep(2000000); + // Wait 3 seconds so the cache expires + sleep(3); $this->assertNull($this->cache->get('foo')); } From 7e2855d138c6b5524528eba4b78c81bfeb0bf8c0 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 17 May 2018 12:10:41 +0200 Subject: [PATCH 116/461] Improve Library Exceptions --- README.md | 96 +++++------ src/Converter.php | 28 +++- src/Domain.php | 154 +++++++++--------- src/Exception/CouldNotResolveSubDomain.php | 22 +++ ...dNotProcessDomain.php => InvalidLabel.php} | 2 +- src/Exception/InvalidLabelKey.php | 22 +++ src/Manager.php | 4 +- src/PublicSuffix.php | 13 +- src/Rules.php | 8 +- tests/DomainTest.php | 74 +++++---- tests/ManagerTest.php | 9 +- tests/PublicSuffixTest.php | 11 +- tests/RulesTest.php | 39 ++++- 13 files changed, 280 insertions(+), 202 deletions(-) create mode 100644 src/Exception/CouldNotResolveSubDomain.php rename src/Exception/{CouldNotProcessDomain.php => InvalidLabel.php} (90%) create mode 100644 src/Exception/InvalidLabelKey.php diff --git a/README.md b/README.md index 9925a231..3278ac13 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ $ composer require jeremykendall/php-domain-parser Usage -------- -### Parsing a domain name. +### Domain name parsing. ~~~php getRules(); //$rules is a Pdp\Rules object -$domain = $rules->resolve('www.ulb.ac.be'); +$domain = $rules->resolve('www.ulb.ac.be'); //$domain is a Pdp\Domain object echo json_encode($domain, JSON_PRETTY_PRINT); // returns // { @@ -69,52 +69,45 @@ echo json_encode($domain, JSON_PRETTY_PRINT); // "isICANN": true, // "isPrivate": false // } - -$publicSuffix = $rules->getPublicSuffix('www.ulb.ac.be'); -echo json_encode($publicSuffix, JSON_PRETTY_PRINT); -// returns -// { -// "publicSuffix": "ac.be", -// "isKnown": true, -// "isICANN": true, -// "isPrivate": false -// } ~~~ -Using the above code you can parse and get public suffix informations about any valid domain name. +Using the above code you can parse any valid domain name. -### Manipulating the domain name - -The `Pdp\Domain` returned by the `Pdp\Rules::resolve` method is an immutable value object representing a valid domain name. This object let's you access all the domain name properties as well as the public suffix informations attached to it using the following methods. +The returned `Pdp\Domain` object is an immutable value object representing a valid domain name. This object let's you access the domain properties. ~~~php public function Domain::__toString(): string public function Domain::getContent(): ?string -public function Domain::getPublicSuffix(): ?string -public function Domain::getRegistrableDomain(): ?string -public function Domain::getSubDomain(); ?string public function Domain::getLabel(int $key): ?string public function Domain::keys(?string $label): int[] +public function Domain::toAscii(): self +public function Domain::toUnicode(): self public function Domain::isResolvable(): bool; +~~~ + +as well as its public suffix informations attached to it by the `Pdp\Rules::resolve` method. + +~~~php +public function Domain::getPublicSuffix(): ?string +public function Domain::getRegistrableDomain(): ?string +public function Domain::getSubDomain(); ?string public function Domain::isKnown(): bool; public function Domain::isICANN(): bool; public function Domain::isPrivate(): bool; ~~~ -*The getter methods returns normalized and lowercased domain labels or `null` if no value was found for a particular domain part.* +*The getter methods return normalized and lowercased domain labels or `null` if no value was found for a particular domain part.* -The `Pdp\Domain` object also implements PHP's `Countable` and `IteratorAggregate` interfaces to ease counting and iterating over the domain labels as well as PHP's `JsonSerializable` interfaces to output a JSON array with all the useful informations regarding the domain name. +The `Pdp\Domain` object also implements PHP's `Countable`, `IteratorAggregate` and `JsonSerializable` interfaces to ease retrieving the object properties. -Once you have a `Pdp\Domain` object can also modify its content using the following methods: +Once you have a `Pdp\Domain` object you can also modify its content using the following methods: ~~~php -public function Domain::toAscii(): self -public function Domain::toUnicode(): self -public function Domain::withPublicSuffix($publicSuffix): self -public function Domain::withSubDomain($subDomain): self public function Domain::withLabel(int $key, $label): self public function Domain::withoutLabel(int $key, int ...$keys): self public function Domain::resolve($publicSuffix): self +public function Domain::withPublicSuffix($publicSuffix): self +public function Domain::withSubDomain($subDomain): self ~~~ Because the `Pdp\Domain` object is immutable: @@ -123,37 +116,40 @@ Because the `Pdp\Domain` object is immutable: - If a modification is not possible a `Pdp\Exception` exception is thrown. ~~~php -$manager = new Manager(new Cache(), new CurlHttpClient()); -$rules = $manager->getRules(); $domain = $rules->resolve('www.bbc.co.uk'); $newDomain = $domain ->withPublicSuffix('com') ->withSubDomain('shop') ->withLabel(-2, 'example') ; -$newDomain->getContent(); //returns shop.example.com; -$newDomain->isKnown(); //return false; +$newDomain->getContent(); //returns 'shop.example.com'; +$newDomain->getPublicSuffix(); //returns 'com'; +$newDomain->isKnown(); //return false; ~~~ -**WARNING: in the example above the PSL info are lost because the newly attached public suffix had none.** +**WARNING: in the example above the public suffix informations are lost because the newly attached public suffix had none.** To avoid this data loss you should use an already resolved public suffix. ~~~php -$manager = new Manager(new Cache(), new CurlHttpClient()); -$rules = $manager->getRules(); $domain = $rules->resolve('www.bbc.co.uk'); -$newPublicSuffix = $rules->getPublicSuffix('example.com'); +$newPublicSuffix = $rules->getPublicSuffix('example.com'); //$newPublicSuffix is a Pdp\PublicSuffix object $newDomain = $domain ->withPublicSuffix($newPublicSuffix) ->withSubDomain('shop') ->withLabel(-2, 'example') ; -$newDomain->getContent(); //returns shop.example.com; -$newDomain->isKnown(); //return true; +$newDomain->getContent(); //returns 'shop.example.com'; +$newDomain->getPublicSuffix(); //returns 'com'; +$newDomain->isKnown(); //return true; ~~~ -### Getting the domain public suffix information. +The `Pdp\PublicSuffix` is an immutable value object which exposes the same methods as the `Pdp\Domain` object minus + +- all the modifying methods, **`toAscii` and `toUnicode` excluded**. +- `getPublicSuffix`, `getRegistrableDomain`, `getSubDomain`, `isResolvable` + +### Public suffix information resolution. ~~~php resolve('www.Ulb.AC.be', Rules::ICANN_DOMAINS); +$domain = $rules->resolve('www.Ulb.AC.be', Rules::PRIVATE_DOMAINS); echo json_encode($domain, JSON_PRETTY_PRINT); // returns // { @@ -352,17 +345,7 @@ use Pdp\Manager; $manager = new Manager(new Cache(), new CurlHttpClient()); $rules = $manager->getRules('https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat'); $domain = $rules->resolve('www.ulb.ac.be'); -echo json_encode($domain, JSON_PRETTY_PRINT); -// returns -// { -// "domain": "www.ulb.ac.be", -// "registrableDomain": "ulb.ac.be", -// "subDomain": "www", -// "publicSuffix": "ac.be", -// "isKnown": true, -// "isICANN": true, -// "isPrivate": false -// } +echo $domain->getPublicSuffix(); // print 'ac.be' ~~~ ### Automatic Updates @@ -435,9 +418,10 @@ final class GuzzleHttpClientAdapter implements HttpClient } $dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbuser', 'dbpass'); -$symfonyCache = new PDOCache($dbh, 'psl', 86400); -$guzzleAdapter = new GuzzleHttpClientAdapter(new GuzzleClient()); -$manager = new Manager($symfonyCache, $guzzleAdapter); +$manager = new Manager( + new PDOCache($dbh, 'psl', 86400), + new GuzzleHttpClientAdapter(new GuzzleClient()) +); $manager->refreshRules(); //the rules are saved to the database for 1 day //the rules are fetched using GuzzlClient diff --git a/src/Converter.php b/src/Converter.php index 3bcb9659..974acafd 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -29,6 +29,25 @@ final class Converter implements PublicSuffixListSection { use IDNAConverterTrait; + /** + * @internal + */ + const PSL_SECTION = [ + 'ICANN' => [ + 'BEGIN' => self::ICANN_DOMAINS, + 'END' => '', + ], + 'PRIVATE' => [ + 'BEGIN' => self::PRIVATE_DOMAINS, + 'END' => '', + ], + ]; + + /** + * @internal + */ + const REGEX_PSL_SECTION = ',^// ===(?BEGIN|END) (?ICANN|PRIVATE) DOMAINS===,'; + /** * Convert the Public Suffix List into * an associative, multidimensional array. @@ -64,13 +83,8 @@ public function convert(string $content): array */ private function getSection(string $section, string $line): string { - static $section_list = [ - 'ICANN' => ['BEGIN' => self::ICANN_DOMAINS, 'END' => ''], - 'PRIVATE' => ['BEGIN' => self::PRIVATE_DOMAINS, 'END' => ''], - ]; - static $pattern = ',^// ===(?BEGIN|END) (?ICANN|PRIVATE) DOMAINS===,'; - if (preg_match($pattern, $line, $matches)) { - return $section_list[$matches['type']][$matches['point']]; + if (preg_match(self::REGEX_PSL_SECTION, $line, $matches)) { + return self::PSL_SECTION[$matches['type']][$matches['point']]; } return $section; diff --git a/src/Domain.php b/src/Domain.php index 345c1db2..7a1f8f93 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -16,8 +16,10 @@ namespace Pdp; use JsonSerializable; -use Pdp\Exception\CouldNotProcessDomain; -use Pdp\Exception\InvalidDomain; +use Pdp\Exception\CouldNotResolvePublicSuffix; +use Pdp\Exception\CouldNotResolveSubDomain; +use Pdp\Exception\InvalidLabel; +use Pdp\Exception\InvalidLabelKey; use TypeError; /** @@ -35,6 +37,11 @@ final class Domain implements DomainInterface, JsonSerializable { use IDNAConverterTrait; + /** + * @internal + */ + const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/'; + /** * @var string|null */ @@ -90,7 +97,7 @@ public function __construct($domain = null, PublicSuffix $publicSuffix = null) * * @param PublicSuffix $publicSuffix * - * @throws InvalidDomain If the public suffic can not be attached to the domain + * @throws CouldNotResolvePublicSuffix If the public suffic can not be attached to the domain * * @return PublicSuffix */ @@ -101,17 +108,17 @@ private function setPublicSuffix(PublicSuffix $publicSuffix): PublicSuffix } if (!$this->isResolvable()) { - throw new InvalidDomain(sprintf('The domain `%s` can not contain a public suffix', $this->domain)); + throw new CouldNotResolvePublicSuffix(sprintf('The domain `%s` can not contain a public suffix', $this->domain)); } $publicSuffix = $this->normalize($publicSuffix); $psContent = $publicSuffix->getContent(); if ($this->domain === $psContent) { - throw new InvalidDomain(sprintf('The public suffix `%s` can not be equal to the domain name `%s`', $psContent, $this->domain)); + throw new CouldNotResolvePublicSuffix(sprintf('The public suffix `%s` can not be equal to the domain name `%s`', $psContent, $this->domain)); } if ('.'.$psContent !== substr($this->domain, - strlen($psContent) - 1)) { - throw new InvalidDomain(sprintf('The public suffix `%s` can not be assign to the domain name `%s`', $psContent, $this->domain)); + throw new CouldNotResolvePublicSuffix(sprintf('The public suffix `%s` can not be assign to the domain name `%s`', $psContent, $this->domain)); } return $publicSuffix; @@ -130,8 +137,7 @@ private function normalize(PublicSuffix $subject): PublicSuffix return $subject; } - static $pattern = '/[^\x20-\x7f]/'; - if (!preg_match($pattern, $this->domain)) { + if (!preg_match(self::REGEXP_IDN_PATTERN, $this->domain)) { return $subject->toAscii(); } @@ -416,108 +422,100 @@ public function resolve($publicSuffix): self } /** - * Returns an instance with the specified sub domain added. + * Returns an instance with the specified public suffix added. * * This method MUST retain the state of the current instance, and return - * an instance that contains the new sub domain + * an instance that contains the new public suffix * - * @param mixed $subDomain the subdomain to add + * If the domain already has a public suffix it will be replaced by the new value + * otherwise the public suffix content is added to or remove from the current domain. * - * @throws CouldNotProcessDomain If the Sub domain can not be added to the current Domain + * @param mixed $publicSuffix * * @return self */ - public function withSubDomain($subDomain): self + public function withPublicSuffix($publicSuffix): self { - if (null === $this->publicSuffix->getContent()) { - throw new CouldNotProcessDomain('A subdomain can not be added to a domain without a public suffix part.'); - } - - $subDomain = $this->filterSubDomain($subDomain); - $subLabels = []; - if (null !== $subDomain) { - static $pattern = '/[^\x20-\x7f]/'; - $method = !preg_match($pattern, $this->domain) ? 'idnToAscii' : 'idnToUnicode'; - - $subDomain = $this->$method($subDomain); - $subLabels = array_reverse(explode('.', $subDomain)); + if (!$publicSuffix instanceof PublicSuffix) { + $publicSuffix = new PublicSuffix($publicSuffix); } - if ($this->subDomain === $subDomain) { + $publicSuffix = $this->normalize($publicSuffix); + if ($this->publicSuffix == $publicSuffix) { return $this; } - $labels = array_merge( - array_slice($this->labels, 0, count($this->publicSuffix) + 1), - $subLabels - ); + $domain = implode('.', array_reverse(array_slice($this->labels, count($this->publicSuffix)))); + if (null === $publicSuffix->getContent()) { + return new self($domain); + } - return new self(implode('.', array_reverse($labels)), $this->publicSuffix); + return new self($domain.'.'.$publicSuffix->getContent(), $publicSuffix); } /** - * Filter a subdomain to update the domain part. + * Returns an instance with the specified sub domain added. * - * @param mixed $subDomain + * This method MUST retain the state of the current instance, and return + * an instance that contains the new sub domain * - * @throws TypeError if the sub domain can not be converted + * @param mixed $subDomain the subdomain to add * - * @return string|null + * @throws CouldNotResolveSubDomain If the Sub domain can not be added to the current Domain + * + * @return self */ - private function filterSubDomain($subDomain) + public function withSubDomain($subDomain): self { - if ($subDomain instanceof DomainInterface) { - return $subDomain->getContent(); + if (null === $this->registrableDomain) { + throw new CouldNotResolveSubDomain('A subdomain can not be added to a domain without a registrable domain part.'); } - if (null === $subDomain) { - return $subDomain; + $subDomain = $this->normalizeContent($subDomain); + if ($this->subDomain === $subDomain) { + return $this; } - if (is_scalar($subDomain) || method_exists($subDomain, '__toString')) { - return (string) $subDomain; + if (null === $subDomain) { + return new self($this->registrableDomain, $this->publicSuffix); } - throw new TypeError(sprintf('The label must be a scalar, a stringable object or NULL, `%s` given', gettype($subDomain))); + return new self($subDomain.'.'.$this->registrableDomain, $this->publicSuffix); } /** - * Returns an instance with the specified public suffix added. + * Filter a subdomain to update the domain part. * - * This method MUST retain the state of the current instance, and return - * an instance that contains the new public suffix + * @param mixed $domain * - * @param mixed $publicSuffix + * @throws TypeError if the domain can not be converted * - * @throws CouldNotProcessDomain If the public suffix can not be added to the current Domain - * - * @return self + * @return string|null */ - public function withPublicSuffix($publicSuffix): self + private function normalizeContent($domain) { - if (null === $this->publicSuffix->getContent()) { - throw new CouldNotProcessDomain('A public suffix can not be added to a domain without a public suffix part.'); + if ($domain instanceof DomainInterface) { + $domain = $domain->getContent(); } - if (!$publicSuffix instanceof PublicSuffix) { - $publicSuffix = new PublicSuffix($publicSuffix); + if (null === $domain) { + return $domain; } - $publicSuffix = $this->normalize($publicSuffix); - if ($this->publicSuffix == $publicSuffix) { - return $this; + if (!is_scalar($domain) && !method_exists($domain, '__toString')) { + throw new TypeError(sprintf('The domain or label must be a scalar, a stringable object or NULL, `%s` given', gettype($domain))); } - $labels = array_merge( - iterator_to_array($publicSuffix), - array_slice($this->labels, count($this->publicSuffix)) - ); + $domain = (string) $domain; + if (preg_match(self::REGEXP_IDN_PATTERN, $this->domain)) { + return $this->idnToUnicode($domain); + } - return new self(implode('.', array_reverse($labels)), $publicSuffix); + return $this->idnToAscii($domain); } /** - * Appends a label to the domain. + * Prepends a label to the domain. * * @see ::withLabel * @@ -531,7 +529,7 @@ public function prepend($label): self } /** - * Prepends a label to the domain. + * Appends a label to the domain. * * @see ::withLabel * @@ -556,7 +554,8 @@ public function append($label): self * @param int $key * @param mixed $label * - * @throws CouldNotProcessDomain If the key is out of bounds + * @throws InvalidLabelKey If the key is out of bounds + * @throws InvalidLabel If the label is converted to the NULL value * * @return self */ @@ -564,20 +563,18 @@ public function withLabel(int $key, $label): self { $nb_labels = count($this->labels); if ($key < - $nb_labels - 1 || $key > $nb_labels) { - throw new CouldNotProcessDomain(sprintf('the given key `%s` is invalid', $key)); + throw new InvalidLabelKey(sprintf('the given key `%s` is invalid', $key)); } if (0 > $key) { $key = $nb_labels + $key; } - if (!is_scalar($label) && !method_exists($label, '__toString')) { - throw new TypeError(sprintf('The label must be a scalar or a stringable object `%s` given', gettype($label))); + $label = $this->normalizeContent($label); + if (null === $label) { + throw new InvalidLabel(sprintf('The label can not be NULL')); } - static $pattern = '/[^\x20-\x7f]/'; - $method = !preg_match($pattern, $this->domain) ? 'idnToAscii' : 'idnToUnicode'; - $label = $this->$method((string) $label); if (($this->labels[$key] ?? null) === $label) { return $this; } @@ -586,10 +583,11 @@ public function withLabel(int $key, $label): self $labels[$key] = $label; ksort($labels); - return new self( - implode('.', array_reverse($labels)), - null === $this->publicSuffix->getLabel($key) ? $this->publicSuffix : null - ); + if (null !== $this->publicSuffix->getLabel($key)) { + return new self(implode('.', array_reverse($labels))); + } + + return new self(implode('.', array_reverse($labels)), $this->publicSuffix); } /** @@ -604,7 +602,7 @@ public function withLabel(int $key, $label): self * @param int $key * @param int ...$keys remaining keys to remove * - * @throws CouldNotProcessDomain If the key is out of bounds + * @throws InvalidLabelKey If the key is out of bounds * * @return self */ @@ -614,7 +612,7 @@ public function withoutLabel(int $key, int ...$keys): self $nb_labels = count($this->labels); foreach ($keys as &$key) { if (- $nb_labels > $key || $nb_labels - 1 < $key) { - throw new CouldNotProcessDomain(sprintf('the key `%s` is invalid', $key)); + throw new InvalidLabelKey(sprintf('the key `%s` is invalid', $key)); } if (0 > $key) { diff --git a/src/Exception/CouldNotResolveSubDomain.php b/src/Exception/CouldNotResolveSubDomain.php new file mode 100644 index 00000000..0ced9ace --- /dev/null +++ b/src/Exception/CouldNotResolveSubDomain.php @@ -0,0 +1,22 @@ +publicSuffix) { diff --git a/src/Rules.php b/src/Rules.php index 310af6d0..21568646 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -31,6 +31,11 @@ final class Rules implements PublicSuffixListSection */ const ALL_DOMAINS = 'ALL_DOMAINS'; + /** + * @internal + */ + const PSL_SECTION = [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, '']; + /** * PSL rules as a multidimentional associative array. * @@ -158,8 +163,7 @@ private function validateSection(string $section): string $section = ''; } - static $section_list = [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, '']; - if (in_array($section, $section_list, true)) { + if (in_array($section, self::PSL_SECTION, true)) { return $section; } diff --git a/tests/DomainTest.php b/tests/DomainTest.php index d26c181e..cfd3d704 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -16,7 +16,11 @@ namespace Pdp\Tests; use Pdp\Domain; -use Pdp\Exception; +use Pdp\Exception\CouldNotResolvePublicSuffix; +use Pdp\Exception\CouldNotResolveSubDomain; +use Pdp\Exception\InvalidDomain; +use Pdp\Exception\InvalidLabel; +use Pdp\Exception\InvalidLabelKey; use Pdp\PublicSuffix; use Pdp\Rules; use PHPUnit\Framework\TestCase; @@ -55,7 +59,7 @@ public function testRegistrableDomainIsNullWithFoundDomain() */ public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain($domain, $publicSuffix) { - $this->expectException(Exception::class); + $this->expectException(CouldNotResolvePublicSuffix::class); new Domain($domain, new PublicSuffix($publicSuffix)); } @@ -88,7 +92,7 @@ public function provideWrongConstructor() */ public function testToAsciiThrowsException() { - $this->expectException(Exception::class); + $this->expectException(InvalidDomain::class); new Domain('a⒈com'); } @@ -99,7 +103,7 @@ public function testToAsciiThrowsException() */ public function testToUnicodeThrowsException() { - $this->expectException(Exception::class); + $this->expectException(InvalidDomain::class); (new Domain('xn--a-ecp.ru'))->toUnicode(); } @@ -426,7 +430,7 @@ public function resolvePassProvider() */ public function testResolveFails(Domain $domain, PublicSuffix $publicSuffix) { - $this->expectException(Exception::class); + $this->expectException(CouldNotResolvePublicSuffix::class); $domain->resolve($publicSuffix); } @@ -472,7 +476,7 @@ public function testResolveReturnsInstance() /** * @covers ::withSubDomain - * @covers ::filterSubDomain + * @covers ::normalizeContent * @dataProvider withSubDomainWorksProvider * * @param Domain $domain @@ -523,28 +527,28 @@ public function withSubDomainWorksProvider() /** * @covers ::withSubDomain - * @covers ::filterSubDomain + * @covers ::normalizeContent */ public function testWithSubDomainFailsWithNullDomain() { - $this->expectException(Exception::class); + $this->expectException(CouldNotResolveSubDomain::class); (new Domain())->withSubDomain('www'); } /** * @covers ::withSubDomain - * @covers ::filterSubDomain + * @covers ::normalizeContent */ public function testWithSubDomainFailsWithOneLabelDomain() { - $this->expectException(Exception::class); + $this->expectException(CouldNotResolveSubDomain::class); (new Domain('localhost'))->withSubDomain('www'); } /** * @covers ::withSubDomain - * @covers ::filterSubDomain + * @covers ::normalizeContent */ public function testWithSubDomainFailsWithNonStringableObject() { @@ -558,11 +562,11 @@ public function testWithSubDomainFailsWithNonStringableObject() /** * @covers ::withSubDomain - * @covers ::filterSubDomain + * @covers ::normalizeContent */ public function testWithSubDomainWithoutPublicSuffixInfo() { - $this->expectException(Exception::class); + $this->expectException(CouldNotResolveSubDomain::class); (new Domain('www.example.com'))->withSubDomain('www'); } @@ -645,6 +649,22 @@ public function withPublicSuffixWorksProvider() 'isICANN' => true, 'isPrivate' => false, ], + 'adding the public suffix to a single label domain' => [ + 'domain' => new Domain('localhost'), + 'publicSuffix' => 'www', + 'expected' => 'www', + 'isKnown' => false, + 'isICANN' => false, + 'isPrivate' => false, + ], + 'removing the public suffix list' => [ + 'domain' => new Domain('www.bébé.be', new PublicSuffix('be', Rules::ICANN_DOMAINS)), + 'publicSuffix' => null, + 'expected' => null, + 'isKnown' => false, + 'isICANN' => false, + 'isPrivate' => false, + ], ]; } @@ -653,28 +673,10 @@ public function withPublicSuffixWorksProvider() */ public function testWithPublicSuffixFailsWithNullDomain() { - $this->expectException(Exception::class); + $this->expectException(InvalidDomain::class); (new Domain())->withPublicSuffix('www'); } - /** - * @covers ::withPublicSuffix - */ - public function testWithPublicSuffixFailsWithOneLabelDomain() - { - $this->expectException(Exception::class); - (new Domain('localhost'))->withPublicSuffix('www'); - } - - /** - * @covers ::withPublicSuffix - */ - public function testWithPublicSuffixWithoutPublicSuffixInfo() - { - $this->expectException(Exception::class); - (new Domain('www.example.com'))->withPublicSuffix('www'); - } - /** * @covers ::withLabel * @dataProvider withLabelWorksProvider @@ -797,7 +799,7 @@ public function withLabelWorksProvider() */ public function testWithLabelFailsWithTypeError() { - $this->expectException(TypeError::class); + $this->expectException(InvalidLabel::class); (new Domain('example.com'))->withLabel(1, null); } @@ -806,7 +808,7 @@ public function testWithLabelFailsWithTypeError() */ public function testWithLabelFailsWithInvalidKey() { - $this->expectException(Exception::class); + $this->expectException(InvalidLabelKey::class); (new Domain('example.com'))->withLabel(-4, 'www'); } @@ -815,7 +817,7 @@ public function testWithLabelFailsWithInvalidKey() */ public function testWithLabelFailsWithInvalidLabel2() { - $this->expectException(Exception::class); + $this->expectException(InvalidDomain::class); (new Domain('example.com'))->withLabel(-1, ''); } @@ -939,7 +941,7 @@ public function withoutLabelWorksProvider() */ public function testwithoutLabelFailsWithInvalidKey() { - $this->expectException(Exception::class); + $this->expectException(InvalidLabelKey::class); (new Domain('example.com'))->withoutLabel(-3); } diff --git a/tests/ManagerTest.php b/tests/ManagerTest.php index c1c3fb89..6355192b 100644 --- a/tests/ManagerTest.php +++ b/tests/ManagerTest.php @@ -19,7 +19,8 @@ use Pdp\Cache; use Pdp\Converter; use Pdp\CurlHttpClient; -use Pdp\Exception; +use Pdp\Exception\CouldNotLoadRules; +use Pdp\Exception\InvalidDomain; use Pdp\Manager; use PHPUnit\Framework\TestCase; use Psr\SimpleCache\CacheInterface; @@ -130,7 +131,7 @@ public function has($key) } }; - $this->expectException(Exception::class); + $this->expectException(CouldNotLoadRules::class); $manager = new Manager($cachePool, new CurlHttpClient()); $manager->getRules('https://google.com'); } @@ -183,7 +184,7 @@ public function has($key) } }; - $this->expectException(Exception::class); + $this->expectException(CouldNotLoadRules::class); $manager = new Manager($cachePool, new CurlHttpClient()); $manager->getRules(); } @@ -196,7 +197,7 @@ public function has($key) */ public function testConvertThrowsExceptionWithInvalidContent() { - $this->expectException(Exception::class); + $this->expectException(InvalidDomain::class); $content = file_get_contents(__DIR__.'/data/invalid_suffix_list_content.dat'); (new Converter())->convert($content); } diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 17d469ae..d870a4a7 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -16,7 +16,8 @@ namespace Pdp\Tests; use Pdp\Domain; -use Pdp\Exception; +use Pdp\Exception\CouldNotResolvePublicSuffix; +use Pdp\Exception\InvalidDomain; use Pdp\PublicSuffix; use Pdp\Rules; use PHPUnit\Framework\TestCase; @@ -102,7 +103,7 @@ public function PSProvider() */ public function testConstructorThrowsException($publicSuffix) { - $this->expectException(Exception::class); + $this->expectException(InvalidDomain::class); new PublicSuffix($publicSuffix); } @@ -121,7 +122,7 @@ public function invalidPublicSuffixProvider() */ public function testPSToAsciiThrowsException() { - $this->expectException(Exception::class); + $this->expectException(InvalidDomain::class); new PublicSuffix('a⒈com'); } @@ -131,7 +132,7 @@ public function testPSToAsciiThrowsException() */ public function testSetSectionThrowsException() { - $this->expectException(Exception::class); + $this->expectException(CouldNotResolvePublicSuffix::class); new PublicSuffix('ac.be', 'foobar'); } @@ -141,7 +142,7 @@ public function testSetSectionThrowsException() */ public function testToUnicodeThrowsException() { - $this->expectException(Exception::class); + $this->expectException(InvalidDomain::class); (new PublicSuffix('xn--a-ecp.ru'))->toUnicode(); } diff --git a/tests/RulesTest.php b/tests/RulesTest.php index f68c6717..426c70f7 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -18,7 +18,9 @@ use Pdp\Cache; use Pdp\CurlHttpClient; use Pdp\Domain; -use Pdp\Exception; +use Pdp\Exception\CouldNotLoadRules; +use Pdp\Exception\CouldNotResolvePublicSuffix; +use Pdp\Exception\InvalidDomain; use Pdp\Manager; use Pdp\PublicSuffix; use Pdp\Rules; @@ -64,7 +66,7 @@ public function testCreateFromPath() */ public function testCreateFromPathThrowsException() { - $this->expectException(Exception::class); + $this->expectException(CouldNotLoadRules::class); Rules::createFromPath('/foo/bar.dat'); } @@ -110,7 +112,7 @@ public function testThrowsTypeErrorOnWrongInput() */ public function testResolveThrowsExceptionOnWrongDomainType() { - $this->expectException(Exception::class); + $this->expectException(CouldNotResolvePublicSuffix::class); $this->rules->resolve('www.example.com', 'foobar'); } @@ -417,9 +419,9 @@ public function parseDataProvider() * @param mixed $domain * @param mixed $section */ - public function testGetPublicSuffixThrowsException($domain, $section) + public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix($domain, $section) { - $this->expectException(Exception::class); + $this->expectException(CouldNotResolvePublicSuffix::class); $this->rules->getPublicSuffix($domain, $section); } @@ -427,10 +429,34 @@ public function invalidParseProvider() { $long_label = implode('.', array_fill(0, 62, 'a')); + return [ + 'single label host' => ['localhost', Rules::ICANN_DOMAINS], + ]; + } + + /** + * @covers ::getPublicSuffix + * @covers ::validateSection + * @covers \Pdp\Domain::isResolvable + * @covers \Pdp\IDNAConverterTrait::setLabels + * @dataProvider invalidDomainParseProvider + * + * @param mixed $domain + * @param mixed $section + */ + public function testGetPublicSuffixThrowsInvalidDomainException($domain, $section) + { + $this->expectException(InvalidDomain::class); + $this->rules->getPublicSuffix($domain, $section); + } + + public function invalidDomainParseProvider() + { + $long_label = implode('.', array_fill(0, 62, 'a')); + return [ 'IPv6' => ['[::1]', Rules::ICANN_DOMAINS], 'IPv4' => ['192.168.1.2', Rules::ICANN_DOMAINS], - 'single label host' => ['localhost', Rules::ICANN_DOMAINS], 'multiple label with URI delimiter' => ['local.ho/st', Rules::ICANN_DOMAINS], 'invalid host: label too long' => [implode('', array_fill(0, 64, 'a')).'.com', Rules::ICANN_DOMAINS], 'invalid host: host too long' => ["$long_label.$long_label.$long_label. $long_label.$long_label", Rules::ICANN_DOMAINS], @@ -439,6 +465,7 @@ public function invalidParseProvider() ]; } + /** * @covers ::getPublicSuffix * @covers ::validateSection From 79b05005e6f5f06c6c9e8b3037b9d1d69e77bfe7 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 17 May 2018 13:23:40 +0200 Subject: [PATCH 117/461] Improve documentation --- README.md | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 3278ac13..9d049545 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ public function Domain::isPrivate(): bool; *The getter methods return normalized and lowercased domain labels or `null` if no value was found for a particular domain part.* -The `Pdp\Domain` object also implements PHP's `Countable`, `IteratorAggregate` and `JsonSerializable` interfaces to ease retrieving the object properties. +The `Pdp\Domain` object also implements PHP's `Countable`, `IteratorAggregate` and `JsonSerializable` interfaces to ease retrieving the domain labels and properties. Once you have a `Pdp\Domain` object you can also modify its content using the following methods: @@ -129,7 +129,7 @@ $newDomain->isKnown(); //return false; **WARNING: in the example above the public suffix informations are lost because the newly attached public suffix had none.** -To avoid this data loss you should use an already resolved public suffix. +To avoid this data loss you should use a `Pdp\PublicSuffix` object instead. ~~~php $domain = $rules->resolve('www.bbc.co.uk'); @@ -149,7 +149,7 @@ The `Pdp\PublicSuffix` is an immutable value object which exposes the same metho - all the modifying methods, **`toAscii` and `toUnicode` excluded**. - `getPublicSuffix`, `getRegistrableDomain`, `getSubDomain`, `isResolvable` -### Public suffix information resolution. +### Public suffix resolution. ~~~php resolve('www.Ulb.AC.be'); // resolution is done against all the sections available echo $domain; // returns www.ulb.ac.be @@ -301,13 +297,7 @@ The `Pdp\Manager::refreshRules` method enables refreshing your local copy of the The method returns a boolean value which is `true` on success. ~~~php -refreshRules('https://publicsuffix.org/list/public_suffix_list.dat'); if ($retval) { //the local cache has been updated @@ -338,11 +328,7 @@ On error, the method throws an `Pdp\Exception`. ~~~php getRules('https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat'); $domain = $rules->resolve('www.ulb.ac.be'); echo $domain->getPublicSuffix(); // print 'ac.be' From fac367f77d5b194d1ea48ddc188bd412cb789fdf Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 19 May 2018 22:51:17 +0200 Subject: [PATCH 118/461] Improve Domain::withLabel method --- README.md | 111 +++++++++++++----- ...ULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- src/Domain.php | 4 + tests/DomainTest.php | 10 ++ 4 files changed, 99 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 9d049545..b84e651e 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,71 @@ $ composer require jeremykendall/php-domain-parser Usage -------- -### Domain name parsing. +### Domain + +~~~php +getContent(); // www.example.com +echo $domain; // www.example.com +echo $domain->getLabel(0); // 'com' +echo $domain->getLabel(-1); // 'www' +$domain->keys('example'); // array(1) +count($domain); //returns 3 +~~~ + +The `Pdp\Domain` object is an immutable value object representing a valid domain name. This object let's you access the domain properties. + +~~~php +public function Domain::__toString(): string +public function Domain::getContent(): ?string +public function Domain::getLabel(int $key): ?string +public function Domain::keys(?string $label): int[] +~~~ + +*The getter methods return normalized and lowercased domain labels or `null` if no value was found for a particular domain part.* + +The `Pdp\Domain` object also implements PHP's `Countable`, `IteratorAggregate` and `JsonSerializable` interfaces to ease retrieving the domain labels and properties. + +Once you have a `Pdp\Domain` object you can also modify its content using the following methods: + +~~~php +public function Domain::toAscii(): Domain +public function Domain::toUnicode(): Domain +public function Domain::withLabel(int $key, $label): Domain +public function Domain::withoutLabel(int $key, int ...$keys): Domain +~~~ + +~~~php +getContent(); // 'www.bébé.be' +echo $domain->toAscii(); // 'www.xn--bb-bjab.be' +echo $domain->toUnicode(); // 'www.bébé.be' +$newDomain = $domain + ->withLabel(-1, 'shop') + ->withLabel(0, 'com') + ->withoutLabel(1) +; +echo $domain; // 'www.bébé.be' +echo $newDomain // 'shop.com' +~~~ + +Because the `Pdp\Domain` object is immutable: + +- If the method change any of the current object property, a new object is returned. +- If a modification is not possible a `Pdp\Exception` exception is thrown. + +**WARNING: URI and URL accept registered name which encompass domain name. Therefore, some URI host are invalid domain name and will trigger an exception if you try to instantiate a `Pdp\Domain` with them.** + + +### Public suffix resolution. ~~~php isResolvable(); //returns true; + +$altDomain = new Domain('localhost'); +$altDomain->isResolvable(); //returns false; ~~~ -as well as its public suffix informations attached to it by the `Pdp\Rules::resolve` method. +Furthermore, the `Pdp\Domain` object let's you access and modify its related public suffix properties using the following methods: ~~~php public function Domain::getPublicSuffix(): ?string @@ -94,29 +160,20 @@ public function Domain::getSubDomain(); ?string public function Domain::isKnown(): bool; public function Domain::isICANN(): bool; public function Domain::isPrivate(): bool; -~~~ - -*The getter methods return normalized and lowercased domain labels or `null` if no value was found for a particular domain part.* - -The `Pdp\Domain` object also implements PHP's `Countable`, `IteratorAggregate` and `JsonSerializable` interfaces to ease retrieving the domain labels and properties. - -Once you have a `Pdp\Domain` object you can also modify its content using the following methods: - -~~~php -public function Domain::withLabel(int $key, $label): self -public function Domain::withoutLabel(int $key, int ...$keys): self public function Domain::resolve($publicSuffix): self public function Domain::withPublicSuffix($publicSuffix): self public function Domain::withSubDomain($subDomain): self ~~~ -Because the `Pdp\Domain` object is immutable: - -- If the method change any of the current object property, a new object is returned. -- If a modification is not possible a `Pdp\Exception` exception is thrown. +Here's a more complex example: ~~~php $domain = $rules->resolve('www.bbc.co.uk'); +$domain->getContent(); //returns 'www.bbc.co.uk'; +$domain->getPublicSuffix(); //returns 'co.uk'; +$domain->isKnown(); //return true; +$domain->isICANN(); //return true; + $newDomain = $domain ->withPublicSuffix('com') ->withSubDomain('shop') @@ -149,7 +206,7 @@ The `Pdp\PublicSuffix` is an immutable value object which exposes the same metho - all the modifying methods, **`toAscii` and `toUnicode` excluded**. - `getPublicSuffix`, `getRegistrableDomain`, `getSubDomain`, `isResolvable` -### Public suffix resolution. +### Public suffix resolution rules. ~~~php domain) { + return $domain; + } + if (preg_match(self::REGEXP_IDN_PATTERN, $this->domain)) { return $this->idnToUnicode($domain); } diff --git a/tests/DomainTest.php b/tests/DomainTest.php index cfd3d704..b58648f6 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -679,6 +679,7 @@ public function testWithPublicSuffixFailsWithNullDomain() /** * @covers ::withLabel + * @covers ::normalizeContent * @dataProvider withLabelWorksProvider * * @param Domain $domain @@ -710,6 +711,15 @@ public function withLabelWorksProvider() $base_domain = new Domain('www.example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)); return [ + 'null domain' => [ + 'domain' => new Domain(), + 'key' => 0, + 'label' => 'localhost', + 'expected' => 'localhost', + 'isKnown' => false, + 'isICANN' => false, + 'isPrivate' => false, + ], 'simple replace positive offset' => [ 'domain' => $base_domain, 'key' => 2, From 67f49def1d40341dc07625f015f48ee1eff73600 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 19 May 2018 22:54:59 +0200 Subject: [PATCH 119/461] improve documentation --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b84e651e..02f9ae78 100644 --- a/README.md +++ b/README.md @@ -160,9 +160,9 @@ public function Domain::getSubDomain(); ?string public function Domain::isKnown(): bool; public function Domain::isICANN(): bool; public function Domain::isPrivate(): bool; -public function Domain::resolve($publicSuffix): self -public function Domain::withPublicSuffix($publicSuffix): self -public function Domain::withSubDomain($subDomain): self +public function Domain::resolve($publicSuffix): Domain +public function Domain::withPublicSuffix($publicSuffix): Domain +public function Domain::withSubDomain($subDomain): Domain ~~~ Here's a more complex example: @@ -218,8 +218,8 @@ final class Rules public static function createFromPath(string $path, $context = null): Rules public static function createFromString(string $content): Rules public function __construct(array $rules) - public function resolve($domain, $section = ''): Domain - public function getPublicSuffix($domain, $section = ''): PublicSuffix + public function resolve($domain, string $section = ''): Domain + public function getPublicSuffix($domain, string $section = ''): PublicSuffix } ~~~ From a98441f134240fdbca6d394e31dc8dd68c1ae493 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 20 May 2018 21:45:50 +0200 Subject: [PATCH 120/461] Improve documentation --- README.md | 129 ++++++++++++++++++++++++++---------------------------- 1 file changed, 62 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index 02f9ae78..7a46bb61 100644 --- a/README.md +++ b/README.md @@ -45,42 +45,84 @@ $ composer require jeremykendall/php-domain-parser Usage -------- -### Domain +### Public suffix resolution. ~~~php getContent(); // www.example.com -echo $domain; // www.example.com -echo $domain->getLabel(0); // 'com' -echo $domain->getLabel(-1); // 'www' -$domain->keys('example'); // array(1) -count($domain); //returns 3 +$manager = new Manager(new Cache(), new CurlHttpClient()); +$rules = $manager->getRules(); //$rules is a Pdp\Rules object + +$domain = $rules->resolve('www.ulb.ac.be'); //$domain is a Pdp\Domain object +echo $domain->getContent(); // 'www.ulb.ac.be' +echo $domain->getPublicSuffix(); // 'ac.be' +echo $domain->getRegistrableDomain(); // 'ulb.ac.be' +echo $domain->getSubDomain(); // 'www' +$domain->isResolvable(); // returns true +$domain->isKnown(); // returns true +$domain->isICANN(); // returns true +$domain->isPrivate(); // returns false + + +$altDomain = $rules->getPublicSuffix('thephpleague.github.io'); //$altDomain is a Pdp\PublicSuffix object +echo $altDomain->getContent(); // 'github.io' +$altDomain->isKnown(); // returns true +$altDomain->isICANN(); // returns false +$altDomain->isPrivate(); // returns true ~~~ -The `Pdp\Domain` object is an immutable value object representing a valid domain name. This object let's you access the domain properties. +Using the above code you have parse, validate and resolve a domain name and its public suffix status against the Public Suffix list. + +Documentation +-------- + +### Domain objects ~~~php -public function Domain::__toString(): string -public function Domain::getContent(): ?string -public function Domain::getLabel(int $key): ?string -public function Domain::keys(?string $label): int[] +getContent(); // www.bébé.example.com +echo $domain; // www.bébé.example.com +echo $domain->getLabel(0); // 'com' +echo $domain->getLabel(-1); // 'www' +$domain->keys('example'); // array(1) +count($domain); //returns 4 +$domain->getPublicSuffix(); // 'com' +$domain->getRegistrableDomain(); // 'example.com' +$domain->getSubDomain(); // 'www.bébé' +$domain->isKnown(); // returns false +$domain->isICANN(); // returns false +$domain->isPrivate(); // returns false +iterator_to_array($domain, false); // ['com', 'example', 'bébé', 'www'] +$domain->toAscii()->getContent(); // www.xn--bb-bjab.example.com +echo (new Domain('www.xn--bb-bjab.example.com'))->toAscii() // www.bébé.example.com ~~~ +The `Pdp\Domain` and `Pdp\PublicSuffix` objects are an immutable value object representing a valid domain name. These objects let's you access the domain properties. + *The getter methods return normalized and lowercased domain labels or `null` if no value was found for a particular domain part.* -The `Pdp\Domain` object also implements PHP's `Countable`, `IteratorAggregate` and `JsonSerializable` interfaces to ease retrieving the domain labels and properties. +Theses objects also implements PHP's `Countable`, `IteratorAggregate` and `JsonSerializable` interfaces to ease retrieving the domain labels and properties. -Once you have a `Pdp\Domain` object you can also modify its content using the following methods: +Modify the domain content is only possible for the `Pdp\Domain` object using the following methods: ~~~php -public function Domain::toAscii(): Domain -public function Domain::toUnicode(): Domain +public function Domain::isResolvable(); public function Domain::withLabel(int $key, $label): Domain public function Domain::withoutLabel(int $key, int ...$keys): Domain +public function Domain::append($label): Domain +public function Domain::prepend($label): Domain +public function Domain::withPublicSuffix($publicSuffix): Domain +public function Domain::withSubDomain($subDomain): Domain ~~~ ~~~php @@ -109,34 +151,6 @@ Because the `Pdp\Domain` object is immutable: **WARNING: URI and URL accept registered name which encompass domain name. Therefore, some URI host are invalid domain name and will trigger an exception if you try to instantiate a `Pdp\Domain` with them.** -### Public suffix resolution. - -~~~php -getRules(); //$rules is a Pdp\Rules object - -$domain = $rules->resolve('www.ulb.ac.be'); //$domain is a Pdp\Domain object -echo json_encode($domain, JSON_PRETTY_PRINT); -// returns -// { -// "domain": "www.ulb.ac.be", -// "registrableDomain": "ulb.ac.be", -// "subDomain": "www", -// "publicSuffix": "ac.be", -// "isKnown": true, -// "isICANN": true, -// "isPrivate": false -// } -~~~ - -Using the above code you can parse, validate and resolve a domain name and its public suffix status against a Public suffix list. - The `Pdp\Domain` object can tell whether a public suffix can be attached to it using the `Pdp\Domain::isResolvable` method. ~~~php @@ -151,20 +165,6 @@ $altDomain = new Domain('localhost'); $altDomain->isResolvable(); //returns false; ~~~ -Furthermore, the `Pdp\Domain` object let's you access and modify its related public suffix properties using the following methods: - -~~~php -public function Domain::getPublicSuffix(): ?string -public function Domain::getRegistrableDomain(): ?string -public function Domain::getSubDomain(); ?string -public function Domain::isKnown(): bool; -public function Domain::isICANN(): bool; -public function Domain::isPrivate(): bool; -public function Domain::resolve($publicSuffix): Domain -public function Domain::withPublicSuffix($publicSuffix): Domain -public function Domain::withSubDomain($subDomain): Domain -~~~ - Here's a more complex example: ~~~php @@ -201,12 +201,7 @@ $newDomain->getPublicSuffix(); //returns 'com'; $newDomain->isKnown(); //return true; ~~~ -The `Pdp\PublicSuffix` is an immutable value object which exposes the same methods as the `Pdp\Domain` object minus - -- all the modifying methods, **`toAscii` and `toUnicode` excluded**. -- `getPublicSuffix`, `getRegistrableDomain`, `getSubDomain`, `isResolvable` - -### Public suffix resolution rules. +### Pdp\Rules object. ~~~php Date: Mon, 21 May 2018 13:09:38 +0200 Subject: [PATCH 121/461] Improve documentation --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 7a46bb61..7bdf44ab 100644 --- a/README.md +++ b/README.md @@ -45,8 +45,6 @@ $ composer require jeremykendall/php-domain-parser Usage -------- -### Public suffix resolution. - ~~~php getPublicSuffix(); //returns 'com'; $newDomain->isKnown(); //return true; ~~~ -### Pdp\Rules object. +### Public suffix resolution. ~~~php Date: Tue, 22 May 2018 08:28:55 +0200 Subject: [PATCH 122/461] bug fix Pdp\Exception inheritance --- CHANGELOG.md | 3 ++- README.md | 17 ++++++++++++----- src/Exception.php | 4 ++-- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7a7dbed..64dc5bd0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in this file -## Next - TBD +## 5.3.0 - 2018-05-22 ### Added @@ -26,6 +26,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\Domain` and `Pdp\PublicSuffix` host validation compliance to RFC improved - Improve `Pdp\Converter` and `Pdp\Manager` class to better report error on IDN conversion. - Improve `Pdp\Installer` vendor directory resolution see [PR #222](https://github.com/jeremykendall/php-domain-parser/pull/222) +- `Pdp\Exception` nows extends `InvalidArgumentException` instead of `RuntimeException` ### Deprecated diff --git a/README.md b/README.md index 7bdf44ab..1462d037 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,7 @@ Usage use Pdp\Cache; use Pdp\CurlHttpClient; use Pdp\Manager; +use Pdp\Rules; $manager = new Manager(new Cache(), new CurlHttpClient()); $rules = $manager->getRules(); //$rules is a Pdp\Rules object @@ -66,11 +67,17 @@ $domain->isICANN(); // returns true $domain->isPrivate(); // returns false -$altDomain = $rules->getPublicSuffix('thephpleague.github.io'); //$altDomain is a Pdp\PublicSuffix object -echo $altDomain->getContent(); // 'github.io' -$altDomain->isKnown(); // returns true -$altDomain->isICANN(); // returns false -$altDomain->isPrivate(); // returns true +$publicSuffix = $rules->getPublicSuffix('mydomain.github.io', Rules::PRIVATE_DOMAINS); //$publicSuffix is a Pdp\PublicSuffix object +echo $publicSuffix->getContent(); // 'github.io' +$publicSuffix->isKnown(); // returns true +$publicSuffix->isICANN(); // returns false +$publicSuffix->isPrivate(); // returns true + +$altSuffix = $rules->getPublicSuffix('mydomain.github.io', Rules::ICANN_DOMAINS); +echo $altSuffix->getContent(); // 'io' +$altSuffix->isKnown(); // returns true +$altSuffix->isICANN(); // returns true +$altSuffix->isPrivate(); // returns false ~~~ Using the above code you have parse, validate and resolve a domain name and its public suffix status against the Public Suffix list. diff --git a/src/Exception.php b/src/Exception.php index f3ed917a..592a247d 100644 --- a/src/Exception.php +++ b/src/Exception.php @@ -15,8 +15,8 @@ namespace Pdp; -use RuntimeException; +use InvalidArgumentException; -class Exception extends RuntimeException +class Exception extends InvalidArgumentException { } From 10567b5fcca91c28f3e839ab23c13c7133bd8779 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 23 Aug 2018 15:44:51 +0200 Subject: [PATCH 123/461] adding TopLevelDomain collection --- .php_cs | 3 +- CHANGELOG.md | 23 + ...ULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- ...ULL_f18a70477d29d525b9220612e2115345.cache | 1 + src/Cache.php | 29 +- src/Converter.php | 71 +- src/CurlHttpClient.php | 14 + src/Domain.php | 73 +- src/Exception/CouldNotLoadTLDs.php | 22 + src/HttpClient.php | 1 - src/IDNAConverterTrait.php | 52 +- src/Installer.php | 14 +- src/Manager.php | 136 +- src/PublicSuffix.php | 27 +- src/Rules.php | 28 +- src/TopLevelDomains.php | 218 +++ tests/CacheTest.php | 103 +- tests/CurlHttpClientTest.php | 8 +- tests/DomainTest.php | 162 +- tests/ManagerTest.php | 220 ++- tests/PublicSuffixTest.php | 60 +- tests/RulesTest.php | 126 +- tests/TopLevelDomainsTest.php | 260 +++ tests/data/root_zones.dat | 16 + tests/data/tlds-alpha-by-domain.txt | 1541 +++++++++++++++++ 25 files changed, 2804 insertions(+), 406 deletions(-) create mode 100644 data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache create mode 100644 src/Exception/CouldNotLoadTLDs.php create mode 100644 src/TopLevelDomains.php create mode 100644 tests/TopLevelDomainsTest.php create mode 100644 tests/data/root_zones.dat create mode 100644 tests/data/tlds-alpha-by-domain.txt diff --git a/.php_cs b/.php_cs index bed8ccb7..b85f917e 100644 --- a/.php_cs +++ b/.php_cs @@ -32,9 +32,10 @@ return PhpCsFixer\Config::create() 'no_empty_phpdoc' => true, 'no_empty_comment' => true, 'no_leading_import_slash' => true, + 'no_superfluous_phpdoc_tags' => true, 'no_trailing_comma_in_singleline_array' => true, 'no_unused_imports' => true, - 'ordered_imports' => ['importsOrder' => null, 'sortAlgorithm' => 'alpha'], + 'ordered_imports' => ['imports_order' => null, 'sort_algorithm' => 'alpha'], 'phpdoc_add_missing_param_annotation' => ['only_untyped' => false], 'phpdoc_align' => true, 'phpdoc_no_empty_return' => true, diff --git a/CHANGELOG.md b/CHANGELOG.md index 64dc5bd0..3b5221f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,29 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in this file +# Next - TBD + +### Added + +- `Pdp\TopLevelDomains` to allow resolving domain againts IANA Root zone database +- `Pdp\Manager::getTLDs` a service to return a cache version of the IANA Root zone database +- `Pdp\Manager::refreshTLDs` a service to refresh the cache version of the IANA Root zone database +- `Pdp\Converter::convertRootZoneDatabase` converts the IANA Root zone database into an associative array +- `Pdp\Manager::__construct` added a new `$ttl` parameter to improve PSR-16 supports +- `Pdp\Exception\CouldNotLoadTLDs` exception + +### Fixed + +- `Pdp\IDNAConverterTrait::setLabels` improve IDN domain handling + +### Deprecated + +- None + +### Removed + +- None + ## 5.3.0 - 2018-05-22 ### Added diff --git a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache index 29550225..10753efe 100644 --- a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache +++ b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache @@ -1 +1 @@ -s:107923:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"*":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"*":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"iwc":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"meo":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sapo":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xperia":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastvps-server":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lmpm":{"app":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ca":{"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"ravendb":[],"barsy":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"co":{"otap":{"*":[]},"com":{"blogspot":[]},"mypi":[],"n4t":[],"nodum":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]},"zone":[]},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"community":{"ravendb":[]},"run":{"development":[],"ravendb":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"space":{"linkitools":[],"stackspace":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ai":{"nom":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file +s:108010:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastvps-server":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lmpm":{"app":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ca":{"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"ravendb":[],"barsy":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"co":{"otap":{"*":[]},"com":{"blogspot":[]},"mypi":[],"n4t":[],"nodum":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]},"zone":[]},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"app":{"hasura":[]},"community":{"ravendb":[]},"run":{"development":[],"ravendb":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"space":{"linkitools":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ai":{"nom":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file diff --git a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache new file mode 100644 index 00000000..9b1aac11 --- /dev/null +++ b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache @@ -0,0 +1 @@ +s:13474:"{"version":"2018082300","update":"2018-08-23T07:07:01+00:00","records":["AAA","AARP","ABARTH","ABB","ABBOTT","ABBVIE","ABC","ABLE","ABOGADO","ABUDHABI","AC","ACADEMY","ACCENTURE","ACCOUNTANT","ACCOUNTANTS","ACO","ACTIVE","ACTOR","AD","ADAC","ADS","ADULT","AE","AEG","AERO","AETNA","AF","AFAMILYCOMPANY","AFL","AFRICA","AG","AGAKHAN","AGENCY","AI","AIG","AIGO","AIRBUS","AIRFORCE","AIRTEL","AKDN","AL","ALFAROMEO","ALIBABA","ALIPAY","ALLFINANZ","ALLSTATE","ALLY","ALSACE","ALSTOM","AM","AMERICANEXPRESS","AMERICANFAMILY","AMEX","AMFAM","AMICA","AMSTERDAM","ANALYTICS","ANDROID","ANQUAN","ANZ","AO","AOL","APARTMENTS","APP","APPLE","AQ","AQUARELLE","AR","ARAB","ARAMCO","ARCHI","ARMY","ARPA","ART","ARTE","AS","ASDA","ASIA","ASSOCIATES","AT","ATHLETA","ATTORNEY","AU","AUCTION","AUDI","AUDIBLE","AUDIO","AUSPOST","AUTHOR","AUTO","AUTOS","AVIANCA","AW","AWS","AX","AXA","AZ","AZURE","BA","BABY","BAIDU","BANAMEX","BANANAREPUBLIC","BAND","BANK","BAR","BARCELONA","BARCLAYCARD","BARCLAYS","BAREFOOT","BARGAINS","BASEBALL","BASKETBALL","BAUHAUS","BAYERN","BB","BBC","BBT","BBVA","BCG","BCN","BD","BE","BEATS","BEAUTY","BEER","BENTLEY","BERLIN","BEST","BESTBUY","BET","BF","BG","BH","BHARTI","BI","BIBLE","BID","BIKE","BING","BINGO","BIO","BIZ","BJ","BLACK","BLACKFRIDAY","BLANCO","BLOCKBUSTER","BLOG","BLOOMBERG","BLUE","BM","BMS","BMW","BN","BNL","BNPPARIBAS","BO","BOATS","BOEHRINGER","BOFA","BOM","BOND","BOO","BOOK","BOOKING","BOSCH","BOSTIK","BOSTON","BOT","BOUTIQUE","BOX","BR","BRADESCO","BRIDGESTONE","BROADWAY","BROKER","BROTHER","BRUSSELS","BS","BT","BUDAPEST","BUGATTI","BUILD","BUILDERS","BUSINESS","BUY","BUZZ","BV","BW","BY","BZ","BZH","CA","CAB","CAFE","CAL","CALL","CALVINKLEIN","CAM","CAMERA","CAMP","CANCERRESEARCH","CANON","CAPETOWN","CAPITAL","CAPITALONE","CAR","CARAVAN","CARDS","CARE","CAREER","CAREERS","CARS","CARTIER","CASA","CASE","CASEIH","CASH","CASINO","CAT","CATERING","CATHOLIC","CBA","CBN","CBRE","CBS","CC","CD","CEB","CENTER","CEO","CERN","CF","CFA","CFD","CG","CH","CHANEL","CHANNEL","CHARITY","CHASE","CHAT","CHEAP","CHINTAI","CHRISTMAS","CHROME","CHRYSLER","CHURCH","CI","CIPRIANI","CIRCLE","CISCO","CITADEL","CITI","CITIC","CITY","CITYEATS","CK","CL","CLAIMS","CLEANING","CLICK","CLINIC","CLINIQUE","CLOTHING","CLOUD","CLUB","CLUBMED","CM","CN","CO","COACH","CODES","COFFEE","COLLEGE","COLOGNE","COM","COMCAST","COMMBANK","COMMUNITY","COMPANY","COMPARE","COMPUTER","COMSEC","CONDOS","CONSTRUCTION","CONSULTING","CONTACT","CONTRACTORS","COOKING","COOKINGCHANNEL","COOL","COOP","CORSICA","COUNTRY","COUPON","COUPONS","COURSES","CR","CREDIT","CREDITCARD","CREDITUNION","CRICKET","CROWN","CRS","CRUISE","CRUISES","CSC","CU","CUISINELLA","CV","CW","CX","CY","CYMRU","CYOU","CZ","DABUR","DAD","DANCE","DATA","DATE","DATING","DATSUN","DAY","DCLK","DDS","DE","DEAL","DEALER","DEALS","DEGREE","DELIVERY","DELL","DELOITTE","DELTA","DEMOCRAT","DENTAL","DENTIST","DESI","DESIGN","DEV","DHL","DIAMONDS","DIET","DIGITAL","DIRECT","DIRECTORY","DISCOUNT","DISCOVER","DISH","DIY","DJ","DK","DM","DNP","DO","DOCS","DOCTOR","DODGE","DOG","DOHA","DOMAINS","DOT","DOWNLOAD","DRIVE","DTV","DUBAI","DUCK","DUNLOP","DUNS","DUPONT","DURBAN","DVAG","DVR","DZ","EARTH","EAT","EC","ECO","EDEKA","EDU","EDUCATION","EE","EG","EMAIL","EMERCK","ENERGY","ENGINEER","ENGINEERING","ENTERPRISES","EPOST","EPSON","EQUIPMENT","ER","ERICSSON","ERNI","ES","ESQ","ESTATE","ESURANCE","ET","ETISALAT","EU","EUROVISION","EUS","EVENTS","EVERBANK","EXCHANGE","EXPERT","EXPOSED","EXPRESS","EXTRASPACE","FAGE","FAIL","FAIRWINDS","FAITH","FAMILY","FAN","FANS","FARM","FARMERS","FASHION","FAST","FEDEX","FEEDBACK","FERRARI","FERRERO","FI","FIAT","FIDELITY","FIDO","FILM","FINAL","FINANCE","FINANCIAL","FIRE","FIRESTONE","FIRMDALE","FISH","FISHING","FIT","FITNESS","FJ","FK","FLICKR","FLIGHTS","FLIR","FLORIST","FLOWERS","FLY","FM","FO","FOO","FOOD","FOODNETWORK","FOOTBALL","FORD","FOREX","FORSALE","FORUM","FOUNDATION","FOX","FR","FREE","FRESENIUS","FRL","FROGANS","FRONTDOOR","FRONTIER","FTR","FUJITSU","FUJIXEROX","FUN","FUND","FURNITURE","FUTBOL","FYI","GA","GAL","GALLERY","GALLO","GALLUP","GAME","GAMES","GAP","GARDEN","GB","GBIZ","GD","GDN","GE","GEA","GENT","GENTING","GEORGE","GF","GG","GGEE","GH","GI","GIFT","GIFTS","GIVES","GIVING","GL","GLADE","GLASS","GLE","GLOBAL","GLOBO","GM","GMAIL","GMBH","GMO","GMX","GN","GODADDY","GOLD","GOLDPOINT","GOLF","GOO","GOODHANDS","GOODYEAR","GOOG","GOOGLE","GOP","GOT","GOV","GP","GQ","GR","GRAINGER","GRAPHICS","GRATIS","GREEN","GRIPE","GROCERY","GROUP","GS","GT","GU","GUARDIAN","GUCCI","GUGE","GUIDE","GUITARS","GURU","GW","GY","HAIR","HAMBURG","HANGOUT","HAUS","HBO","HDFC","HDFCBANK","HEALTH","HEALTHCARE","HELP","HELSINKI","HERE","HERMES","HGTV","HIPHOP","HISAMITSU","HITACHI","HIV","HK","HKT","HM","HN","HOCKEY","HOLDINGS","HOLIDAY","HOMEDEPOT","HOMEGOODS","HOMES","HOMESENSE","HONDA","HONEYWELL","HORSE","HOSPITAL","HOST","HOSTING","HOT","HOTELES","HOTELS","HOTMAIL","HOUSE","HOW","HR","HSBC","HT","HU","HUGHES","HYATT","HYUNDAI","IBM","ICBC","ICE","ICU","ID","IE","IEEE","IFM","IKANO","IL","IM","IMAMAT","IMDB","IMMO","IMMOBILIEN","IN","INC","INDUSTRIES","INFINITI","INFO","ING","INK","INSTITUTE","INSURANCE","INSURE","INT","INTEL","INTERNATIONAL","INTUIT","INVESTMENTS","IO","IPIRANGA","IQ","IR","IRISH","IS","ISELECT","ISMAILI","IST","ISTANBUL","IT","ITAU","ITV","IVECO","JAGUAR","JAVA","JCB","JCP","JE","JEEP","JETZT","JEWELRY","JIO","JLC","JLL","JM","JMP","JNJ","JO","JOBS","JOBURG","JOT","JOY","JP","JPMORGAN","JPRS","JUEGOS","JUNIPER","KAUFEN","KDDI","KE","KERRYHOTELS","KERRYLOGISTICS","KERRYPROPERTIES","KFH","KG","KH","KI","KIA","KIM","KINDER","KINDLE","KITCHEN","KIWI","KM","KN","KOELN","KOMATSU","KOSHER","KP","KPMG","KPN","KR","KRD","KRED","KUOKGROUP","KW","KY","KYOTO","KZ","LA","LACAIXA","LADBROKES","LAMBORGHINI","LAMER","LANCASTER","LANCIA","LANCOME","LAND","LANDROVER","LANXESS","LASALLE","LAT","LATINO","LATROBE","LAW","LAWYER","LB","LC","LDS","LEASE","LECLERC","LEFRAK","LEGAL","LEGO","LEXUS","LGBT","LI","LIAISON","LIDL","LIFE","LIFEINSURANCE","LIFESTYLE","LIGHTING","LIKE","LILLY","LIMITED","LIMO","LINCOLN","LINDE","LINK","LIPSY","LIVE","LIVING","LIXIL","LK","LLC","LOAN","LOANS","LOCKER","LOCUS","LOFT","LOL","LONDON","LOTTE","LOTTO","LOVE","LPL","LPLFINANCIAL","LR","LS","LT","LTD","LTDA","LU","LUNDBECK","LUPIN","LUXE","LUXURY","LV","LY","MA","MACYS","MADRID","MAIF","MAISON","MAKEUP","MAN","MANAGEMENT","MANGO","MAP","MARKET","MARKETING","MARKETS","MARRIOTT","MARSHALLS","MASERATI","MATTEL","MBA","MC","MCKINSEY","MD","ME","MED","MEDIA","MEET","MELBOURNE","MEME","MEMORIAL","MEN","MENU","MERCKMSD","METLIFE","MG","MH","MIAMI","MICROSOFT","MIL","MINI","MINT","MIT","MITSUBISHI","MK","ML","MLB","MLS","MM","MMA","MN","MO","MOBI","MOBILE","MOBILY","MODA","MOE","MOI","MOM","MONASH","MONEY","MONSTER","MOPAR","MORMON","MORTGAGE","MOSCOW","MOTO","MOTORCYCLES","MOV","MOVIE","MOVISTAR","MP","MQ","MR","MS","MSD","MT","MTN","MTR","MU","MUSEUM","MUTUAL","MV","MW","MX","MY","MZ","NA","NAB","NADEX","NAGOYA","NAME","NATIONWIDE","NATURA","NAVY","NBA","NC","NE","NEC","NET","NETBANK","NETFLIX","NETWORK","NEUSTAR","NEW","NEWHOLLAND","NEWS","NEXT","NEXTDIRECT","NEXUS","NF","NFL","NG","NGO","NHK","NI","NICO","NIKE","NIKON","NINJA","NISSAN","NISSAY","NL","NO","NOKIA","NORTHWESTERNMUTUAL","NORTON","NOW","NOWRUZ","NOWTV","NP","NR","NRA","NRW","NTT","NU","NYC","NZ","OBI","OBSERVER","OFF","OFFICE","OKINAWA","OLAYAN","OLAYANGROUP","OLDNAVY","OLLO","OM","OMEGA","ONE","ONG","ONL","ONLINE","ONYOURSIDE","OOO","OPEN","ORACLE","ORANGE","ORG","ORGANIC","ORIGINS","OSAKA","OTSUKA","OTT","OVH","PA","PAGE","PANASONIC","PANERAI","PARIS","PARS","PARTNERS","PARTS","PARTY","PASSAGENS","PAY","PCCW","PE","PET","PF","PFIZER","PG","PH","PHARMACY","PHD","PHILIPS","PHONE","PHOTO","PHOTOGRAPHY","PHOTOS","PHYSIO","PIAGET","PICS","PICTET","PICTURES","PID","PIN","PING","PINK","PIONEER","PIZZA","PK","PL","PLACE","PLAY","PLAYSTATION","PLUMBING","PLUS","PM","PN","PNC","POHL","POKER","POLITIE","PORN","POST","PR","PRAMERICA","PRAXI","PRESS","PRIME","PRO","PROD","PRODUCTIONS","PROF","PROGRESSIVE","PROMO","PROPERTIES","PROPERTY","PROTECTION","PRU","PRUDENTIAL","PS","PT","PUB","PW","PWC","PY","QA","QPON","QUEBEC","QUEST","QVC","RACING","RADIO","RAID","RE","READ","REALESTATE","REALTOR","REALTY","RECIPES","RED","REDSTONE","REDUMBRELLA","REHAB","REISE","REISEN","REIT","RELIANCE","REN","RENT","RENTALS","REPAIR","REPORT","REPUBLICAN","REST","RESTAURANT","REVIEW","REVIEWS","REXROTH","RICH","RICHARDLI","RICOH","RIGHTATHOME","RIL","RIO","RIP","RMIT","RO","ROCHER","ROCKS","RODEO","ROGERS","ROOM","RS","RSVP","RU","RUGBY","RUHR","RUN","RW","RWE","RYUKYU","SA","SAARLAND","SAFE","SAFETY","SAKURA","SALE","SALON","SAMSCLUB","SAMSUNG","SANDVIK","SANDVIKCOROMANT","SANOFI","SAP","SARL","SAS","SAVE","SAXO","SB","SBI","SBS","SC","SCA","SCB","SCHAEFFLER","SCHMIDT","SCHOLARSHIPS","SCHOOL","SCHULE","SCHWARZ","SCIENCE","SCJOHNSON","SCOR","SCOT","SD","SE","SEARCH","SEAT","SECURE","SECURITY","SEEK","SELECT","SENER","SERVICES","SES","SEVEN","SEW","SEX","SEXY","SFR","SG","SH","SHANGRILA","SHARP","SHAW","SHELL","SHIA","SHIKSHA","SHOES","SHOP","SHOPPING","SHOUJI","SHOW","SHOWTIME","SHRIRAM","SI","SILK","SINA","SINGLES","SITE","SJ","SK","SKI","SKIN","SKY","SKYPE","SL","SLING","SM","SMART","SMILE","SN","SNCF","SO","SOCCER","SOCIAL","SOFTBANK","SOFTWARE","SOHU","SOLAR","SOLUTIONS","SONG","SONY","SOY","SPACE","SPIEGEL","SPORT","SPOT","SPREADBETTING","SR","SRL","SRT","ST","STADA","STAPLES","STAR","STARHUB","STATEBANK","STATEFARM","STATOIL","STC","STCGROUP","STOCKHOLM","STORAGE","STORE","STREAM","STUDIO","STUDY","STYLE","SU","SUCKS","SUPPLIES","SUPPLY","SUPPORT","SURF","SURGERY","SUZUKI","SV","SWATCH","SWIFTCOVER","SWISS","SX","SY","SYDNEY","SYMANTEC","SYSTEMS","SZ","TAB","TAIPEI","TALK","TAOBAO","TARGET","TATAMOTORS","TATAR","TATTOO","TAX","TAXI","TC","TCI","TD","TDK","TEAM","TECH","TECHNOLOGY","TEL","TELEFONICA","TEMASEK","TENNIS","TEVA","TF","TG","TH","THD","THEATER","THEATRE","TIAA","TICKETS","TIENDA","TIFFANY","TIPS","TIRES","TIROL","TJ","TJMAXX","TJX","TK","TKMAXX","TL","TM","TMALL","TN","TO","TODAY","TOKYO","TOOLS","TOP","TORAY","TOSHIBA","TOTAL","TOURS","TOWN","TOYOTA","TOYS","TR","TRADE","TRADING","TRAINING","TRAVEL","TRAVELCHANNEL","TRAVELERS","TRAVELERSINSURANCE","TRUST","TRV","TT","TUBE","TUI","TUNES","TUSHU","TV","TVS","TW","TZ","UA","UBANK","UBS","UCONNECT","UG","UK","UNICOM","UNIVERSITY","UNO","UOL","UPS","US","UY","UZ","VA","VACATIONS","VANA","VANGUARD","VC","VE","VEGAS","VENTURES","VERISIGN","VERSICHERUNG","VET","VG","VI","VIAJES","VIDEO","VIG","VIKING","VILLAS","VIN","VIP","VIRGIN","VISA","VISION","VISTA","VISTAPRINT","VIVA","VIVO","VLAANDEREN","VN","VODKA","VOLKSWAGEN","VOLVO","VOTE","VOTING","VOTO","VOYAGE","VU","VUELOS","WALES","WALMART","WALTER","WANG","WANGGOU","WARMAN","WATCH","WATCHES","WEATHER","WEATHERCHANNEL","WEBCAM","WEBER","WEBSITE","WED","WEDDING","WEIBO","WEIR","WF","WHOSWHO","WIEN","WIKI","WILLIAMHILL","WIN","WINDOWS","WINE","WINNERS","WME","WOLTERSKLUWER","WOODSIDE","WORK","WORKS","WORLD","WOW","WS","WTC","WTF","XBOX","XEROX","XFINITY","XIHUAN","XIN","XN--11B4C3D","XN--1CK2E1B","XN--1QQW23A","XN--2SCRJ9C","XN--30RR7Y","XN--3BST00M","XN--3DS443G","XN--3E0B707E","XN--3HCRJ9C","XN--3OQ18VL8PN36A","XN--3PXU8K","XN--42C2D9A","XN--45BR5CYL","XN--45BRJ9C","XN--45Q11C","XN--4GBRIM","XN--54B7FTA0CC","XN--55QW42G","XN--55QX5D","XN--5SU34J936BGSG","XN--5TZM5G","XN--6FRZ82G","XN--6QQ986B3XL","XN--80ADXHKS","XN--80AO21A","XN--80AQECDR1A","XN--80ASEHDB","XN--80ASWG","XN--8Y0A063A","XN--90A3AC","XN--90AE","XN--90AIS","XN--9DBQ2A","XN--9ET52U","XN--9KRT00A","XN--B4W605FERD","XN--BCK1B9A5DRE4C","XN--C1AVG","XN--C2BR7G","XN--CCK2B3B","XN--CG4BKI","XN--CLCHC0EA0B2G2A9GCD","XN--CZR694B","XN--CZRS0T","XN--CZRU2D","XN--D1ACJ3B","XN--D1ALF","XN--E1A4C","XN--ECKVDTC9D","XN--EFVY88H","XN--ESTV75G","XN--FCT429K","XN--FHBEI","XN--FIQ228C5HS","XN--FIQ64B","XN--FIQS8S","XN--FIQZ9S","XN--FJQ720A","XN--FLW351E","XN--FPCRJ9C3D","XN--FZC2C9E2C","XN--FZYS8D69UVGM","XN--G2XX48C","XN--GCKR3F0F","XN--GECRJ9C","XN--GK3AT1E","XN--H2BREG3EVE","XN--H2BRJ9C","XN--H2BRJ9C8C","XN--HXT814E","XN--I1B6B1A6A2E","XN--IMR513N","XN--IO0A7I","XN--J1AEF","XN--J1AMH","XN--J6W193G","XN--JLQ61U9W7B","XN--JVR189M","XN--KCRX77D1X4A","XN--KPRW13D","XN--KPRY57D","XN--KPU716F","XN--KPUT3I","XN--L1ACC","XN--LGBBAT1AD8J","XN--MGB9AWBF","XN--MGBA3A3EJT","XN--MGBA3A4F16A","XN--MGBA7C0BBN0A","XN--MGBAAKC7DVF","XN--MGBAAM7A8H","XN--MGBAB2BD","XN--MGBAI9AZGQP6J","XN--MGBAYH7GPA","XN--MGBB9FBPOB","XN--MGBBH1A","XN--MGBBH1A71E","XN--MGBC0A9AZCG","XN--MGBCA7DZDO","XN--MGBERP4A5D4AR","XN--MGBGU82A","XN--MGBI4ECEXP","XN--MGBPL2FH","XN--MGBT3DHD","XN--MGBTX2B","XN--MGBX4CD0AB","XN--MIX891F","XN--MK1BU44C","XN--MXTQ1M","XN--NGBC5AZD","XN--NGBE9E0A","XN--NGBRX","XN--NODE","XN--NQV7F","XN--NQV7FS00EMA","XN--NYQY26A","XN--O3CW4H","XN--OGBPF8FL","XN--OTU796D","XN--P1ACF","XN--P1AI","XN--PBT977C","XN--PGBS0DH","XN--PSSY2U","XN--Q9JYB4C","XN--QCKA1PMC","XN--QXAM","XN--RHQV96G","XN--ROVU88B","XN--RVC1E0AM3E","XN--S9BRJ9C","XN--SES554G","XN--T60B56A","XN--TCKWE","XN--TIQ49XQYJ","XN--UNUP4Y","XN--VERMGENSBERATER-CTB","XN--VERMGENSBERATUNG-PWB","XN--VHQUV","XN--VUQ861B","XN--W4R85EL8FHU5DNRA","XN--W4RS40L","XN--WGBH1C","XN--WGBL6A","XN--XHQ521B","XN--XKC2AL3HYE2A","XN--XKC2DL3A5EE0H","XN--Y9A3AQ","XN--YFRO4I67O","XN--YGBI2AMMX","XN--ZFR164B","XXX","XYZ","YACHTS","YAHOO","YAMAXUN","YANDEX","YE","YODOBASHI","YOGA","YOKOHAMA","YOU","YOUTUBE","YT","YUN","ZA","ZAPPOS","ZARA","ZERO","ZIP","ZIPPO","ZM","ZONE","ZUERICH","ZW"]}"; \ No newline at end of file diff --git a/src/Cache.php b/src/Cache.php index 21ea7e85..d6a22adf 100644 --- a/src/Cache.php +++ b/src/Cache.php @@ -20,6 +20,31 @@ use Generator; use Psr\SimpleCache\CacheInterface; use Traversable; +use const DIRECTORY_SEPARATOR; +use function chmod; +use function dirname; +use function file_exists; +use function file_get_contents; +use function filemtime; +use function get_class; +use function gettype; +use function is_array; +use function is_dir; +use function is_int; +use function is_object; +use function is_string; +use function is_writable; +use function mkdir; +use function preg_match; +use function realpath; +use function rename; +use function serialize; +use function sprintf; +use function time; +use function touch; +use function uniqid; +use function unlink; +use function unserialize; /** * A simple file-based PSR-16 cache implementation. @@ -141,10 +166,6 @@ public function set($key, $value, $ttl = null) /** * Returns the expiration time expressed in the number of seconds since the Unix Epoch. - * - * @param mixed $ttl - * - * @return int */ private function getExpireAt($ttl): int { diff --git a/src/Converter.php b/src/Converter.php index 974acafd..40840329 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -15,7 +15,16 @@ namespace Pdp; +use DateTimeImmutable; use SplTempFileObject; +use const DATE_ATOM; +use function array_pop; +use function explode; +use function preg_match; +use function sprintf; +use function strpos; +use function substr; +use function trim; /** * Public Suffix List Parser. @@ -51,10 +60,6 @@ final class Converter implements PublicSuffixListSection /** * Convert the Public Suffix List into * an associative, multidimensional array. - * - * @param string $content - * - * @return array */ public function convert(string $content): array { @@ -78,8 +83,6 @@ public function convert(string $content): array * * @param string $section the current status * @param string $line the current file line - * - * @return string */ private function getSection(string $section, string $line): string { @@ -103,8 +106,6 @@ private function getSection(string $section, string $line): string * becomes the array representation of a Public Suffix List section * @param array $rule_parts One line (rule) from the Public Suffix List * exploded on '.', or the remaining portion of that array during recursion - * - * @return array */ private function addRule(array $list, array $rule_parts): array { @@ -121,10 +122,62 @@ private function addRule(array $list, array $rule_parts): array } $list[$rule] = $list[$rule] ?? ($isDomain ? [] : ['!' => '']); - if ($isDomain && !empty($rule_parts)) { + if ($isDomain && [] !== $rule_parts) { $list[$rule] = $this->addRule($list[$rule], $rule_parts); } return $list; } + /** + * Converts the IANA Root Zone Database into a TopLevelDomains collection object. + */ + public function convertRootZoneDatabase(string $content): array + { + $header = []; + $records = []; + + $file = new SplTempFileObject(); + $file->fwrite($content); + $file->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); + foreach ($file as $line) { + $line_content = trim($line); + if (false === strpos($line_content, '#')) { + $records[] = $line_content; + continue; + } + + if ([] === $header) { + $header = $this->getHeaderInfo($line_content); + continue; + } + + throw new Exception(sprintf('Invalid Version line: %s', $line_content)); + } + + if ([] === $records || [] === $header) { + throw new Exception(sprintf('No TLD or Version header found')); + } + + $header['records'] = $records; + + return $header; + } + + /** + * Extract IANA Root Zone Database header info. + */ + private function getHeaderInfo(string $content): array + { + if (preg_match('/^\# Version (?\d+), Last Updated (?.*?)$/', $content, $matches)) { + $date = DateTimeImmutable::createFromFormat('D M d H:i:s Y e', $matches['update']); + $matches['update'] = $date->format(DATE_ATOM); + + return [ + 'version' => $matches['version'], + 'update' => $matches['update'], + ]; + } + + throw new Exception(sprintf('Invalid Version line: %s', $content)); + } } diff --git a/src/CurlHttpClient.php b/src/CurlHttpClient.php index d428c015..9d997499 100644 --- a/src/CurlHttpClient.php +++ b/src/CurlHttpClient.php @@ -15,6 +15,20 @@ namespace Pdp; +use const CURLE_OK; +use const CURLOPT_FAILONERROR; +use const CURLOPT_FOLLOWLOCATION; +use const CURLOPT_HTTPGET; +use const CURLOPT_RETURNTRANSFER; +use const CURLOPT_SSL_VERIFYHOST; +use const CURLOPT_SSL_VERIFYPEER; +use function curl_close; +use function curl_errno; +use function curl_error; +use function curl_exec; +use function curl_init; +use function curl_setopt_array; + final class CurlHttpClient implements HttpClient { /** diff --git a/src/Domain.php b/src/Domain.php index c18ad8f0..ae6ec60a 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -21,6 +21,24 @@ use Pdp\Exception\InvalidLabel; use Pdp\Exception\InvalidLabelKey; use TypeError; +use function array_count_values; +use function array_keys; +use function array_reverse; +use function array_slice; +use function array_unshift; +use function count; +use function explode; +use function gettype; +use function implode; +use function in_array; +use function is_scalar; +use function ksort; +use function method_exists; +use function preg_match; +use function sprintf; +use function strlen; +use function strpos; +use function substr; /** * Domain Value Object. @@ -78,13 +96,13 @@ public static function __set_state(array $properties): self /** * New instance. * - * @param mixed $domain * @param PublicSuffix $publicSuffix + * @param null|mixed $domain */ public function __construct($domain = null, PublicSuffix $publicSuffix = null) { $this->labels = $this->setLabels($domain); - if (!empty($this->labels)) { + if ([] !== $this->labels) { $this->domain = implode('.', array_reverse($this->labels)); } $this->publicSuffix = $this->setPublicSuffix($publicSuffix ?? new PublicSuffix()); @@ -95,11 +113,7 @@ public function __construct($domain = null, PublicSuffix $publicSuffix = null) /** * Sets the public suffix domain part. * - * @param PublicSuffix $publicSuffix - * * @throws CouldNotResolvePublicSuffix If the public suffic can not be attached to the domain - * - * @return PublicSuffix */ private function setPublicSuffix(PublicSuffix $publicSuffix): PublicSuffix { @@ -126,10 +140,6 @@ private function setPublicSuffix(PublicSuffix $publicSuffix): PublicSuffix /** * Normalize the domain name encoding content. - * - * @param PublicSuffix $subject - * - * @return PublicSuffix */ private function normalize(PublicSuffix $subject): PublicSuffix { @@ -287,7 +297,7 @@ public function keys(string $label): array * * This method returns null if the registrable domain is equal to the public suffix. * - * @return string|null registrable domain + * @return string|null */ public function getRegistrableDomain() { @@ -302,7 +312,7 @@ public function getRegistrableDomain() * This method returns null if the registrable domain is null * This method returns null if the registrable domain is equal to the public suffix * - * @return string|null registrable domain + * @return string|null */ public function getSubDomain() { @@ -325,8 +335,6 @@ public function getPublicSuffix() * A domain is resolvable if: * - it contains at least 2 labels * - it is not a absolute domain (end with a '.' character) - * - * @return bool */ public function isResolvable(): bool { @@ -335,8 +343,6 @@ public function isResolvable(): bool /** * Tells whether the public suffix has a matching rule in a Public Suffix List. - * - * @return bool */ public function isKnown(): bool { @@ -345,8 +351,6 @@ public function isKnown(): bool /** * Tells whether the public suffix has a matching rule in a Public Suffix List ICANN Section. - * - * @return bool */ public function isICANN(): bool { @@ -355,8 +359,6 @@ public function isICANN(): bool /** * Tells whether the public suffix has a matching rule in a Public Suffix List Private Section. - * - * @return bool */ public function isPrivate(): bool { @@ -402,10 +404,6 @@ public function toUnicode() * * This method MUST retain the state of the current instance, and return * an instance that contains the modified Public Suffix Information. - * - * @param mixed $publicSuffix - * - * @return self */ public function resolve($publicSuffix): self { @@ -429,10 +427,6 @@ public function resolve($publicSuffix): self * * If the domain already has a public suffix it will be replaced by the new value * otherwise the public suffix content is added to or remove from the current domain. - * - * @param mixed $publicSuffix - * - * @return self */ public function withPublicSuffix($publicSuffix): self { @@ -459,11 +453,8 @@ public function withPublicSuffix($publicSuffix): self * This method MUST retain the state of the current instance, and return * an instance that contains the new sub domain * - * @param mixed $subDomain the subdomain to add * * @throws CouldNotResolveSubDomain If the Sub domain can not be added to the current Domain - * - * @return self */ public function withSubDomain($subDomain): self { @@ -486,8 +477,6 @@ public function withSubDomain($subDomain): self /** * Filter a subdomain to update the domain part. * - * @param mixed $domain - * * @throws TypeError if the domain can not be converted * * @return string|null @@ -522,10 +511,6 @@ private function normalizeContent($domain) * Prepends a label to the domain. * * @see ::withLabel - * - * @param mixed $label - * - * @return self */ public function prepend($label): self { @@ -536,10 +521,6 @@ public function prepend($label): self * Appends a label to the domain. * * @see ::withLabel - * - * @param mixed $label - * - * @return self */ public function append($label): self { @@ -555,13 +536,8 @@ public function append($label): self * If $key is non-negative, the added label will be the label at $key position from the start. * If $key is negative, the added label will be the label at $key position from the end. * - * @param int $key - * @param mixed $label - * * @throws InvalidLabelKey If the key is out of bounds * @throws InvalidLabel If the label is converted to the NULL value - * - * @return self */ public function withLabel(int $key, $label): self { @@ -603,12 +579,9 @@ public function withLabel(int $key, $label): self * If $key is non-negative, the removed label will be the label at $key position from the start. * If $key is negative, the removed label will be the label at $key position from the end. * - * @param int $key * @param int ...$keys remaining keys to remove * * @throws InvalidLabelKey If the key is out of bounds - * - * @return self */ public function withoutLabel(int $key, int ...$keys): self { @@ -633,7 +606,7 @@ public function withoutLabel(int $key, int ...$keys): self } } - if (empty($labels)) { + if ([] === $labels) { return new self(); } diff --git a/src/Exception/CouldNotLoadTLDs.php b/src/Exception/CouldNotLoadTLDs.php new file mode 100644 index 00000000..e69adf7a --- /dev/null +++ b/src/Exception/CouldNotLoadTLDs.php @@ -0,0 +1,22 @@ +idnToUnicode($ascii_domain))); } - throw new InvalidDomain(sprintf('The domain `%s` is invalid : %s', $domain, self::getIdnErrors($arr['errors']))); + throw new InvalidDomain(sprintf('The domain `%s` is invalid: it contains invalid characters', $domain)); } } diff --git a/src/Installer.php b/src/Installer.php index 1c87a7fe..5a2b95da 100644 --- a/src/Installer.php +++ b/src/Installer.php @@ -17,6 +17,14 @@ use Composer\Script\Event; use Throwable; +use const PHP_EOL; +use const STDERR; +use const STDOUT; +use function dirname; +use function extension_loaded; +use function fwrite; +use function implode; +use function is_dir; /** * A class to manage PSL ICANN Section rules updates. @@ -55,7 +63,7 @@ public static function updateLocalCache(Event $event = null) try { $manager = new Manager(new Cache(), new CurlHttpClient()); - if ($manager->refreshRules()) { + if ($manager->refreshRules() && $manager->refreshTLDs()) { $io->write([ '💪 💪 💪 Your local cache has been successfully updated. 💪 💪 💪', 'Have a nice day!', @@ -102,10 +110,6 @@ private static function getVendorPath(Event $event = null) /** * Detect the I/O interface to use. - * - * @param Event|null $event - * - * @return mixed */ private static function getIO(Event $event = null) { diff --git a/src/Manager.php b/src/Manager.php index 025117aa..7ffb1dc4 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -15,8 +15,24 @@ namespace Pdp; +use DateInterval; +use DateTimeImmutable; +use DateTimeInterface; use Pdp\Exception\CouldNotLoadRules; +use Pdp\Exception\CouldNotLoadTLDs; use Psr\SimpleCache\CacheInterface; +use TypeError; +use const FILTER_VALIDATE_INT; +use const JSON_ERROR_NONE; +use function filter_var; +use function is_string; +use function json_decode; +use function json_encode; +use function json_last_error; +use function json_last_error_msg; +use function md5; +use function sprintf; +use function strtolower; /** * Public Suffix List Manager. @@ -30,6 +46,7 @@ final class Manager { const PSL_URL = 'https://publicsuffix.org/list/public_suffix_list.dat'; + const RZD_URL = 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt'; /** * @var CacheInterface @@ -41,34 +58,70 @@ final class Manager */ private $http; + /** + * @var DateInterval|null + */ + private $ttl; + + /** + * @var Converter; + */ + private $converter; + /** * new instance. * - * @param CacheInterface $cache - * @param HttpClient $http + * @param null|mixed $ttl */ - public function __construct(CacheInterface $cache, HttpClient $http) + public function __construct(CacheInterface $cache, HttpClient $http, $ttl = null) { $this->cache = $cache; $this->http = $http; + $this->ttl = $this->setTtl($ttl); + $this->converter = new Converter(); } /** - * Gets the Public Suffix List Rules. + * set the cache TTL. * - * @param string $source_url the Public Suffix List URL + * @return DateInterval|null + */ + private function setTtl($ttl) + { + if ($ttl instanceof DateInterval || null === $ttl) { + return $ttl; + } + + if ($ttl instanceof DateTimeInterface) { + return (new DateTimeImmutable('now', $ttl->getTimezone()))->diff($ttl); + } + + if (false !== ($res = filter_var($ttl, FILTER_VALIDATE_INT))) { + return new DateInterval('PT'.$res.'S'); + } + + if (is_string($ttl)) { + return DateInterval::createFromDateString($ttl); + } + + throw new TypeError(sprintf( + 'The ttl must an integer, a string or a DateInterval object %s given', + is_object($ttl) ? get_class($ttl) : gettype($ttl) + )); + } + + /** + * Gets the Public Suffix List Rules. * * @throws CouldNotLoadRules If the PSL rules can not be loaded - * - * @return Rules */ - public function getRules(string $source_url = self::PSL_URL): Rules + public function getRules(string $url = self::PSL_URL): Rules { - $cacheKey = $this->getCacheKey($source_url); + $cacheKey = $this->getCacheKey('PSL', $url); $cacheRules = $this->cache->get($cacheKey); - if (null === $cacheRules && !$this->refreshRules($source_url)) { - throw new CouldNotLoadRules(sprintf('Unable to load the public suffix list rules for %s', $source_url)); + if (null === $cacheRules && !$this->refreshRules($url)) { + throw new CouldNotLoadRules(sprintf('Unable to load the public suffix list rules for %s', $url)); } $rules = json_decode($cacheRules ?? $this->cache->get($cacheKey), true); @@ -81,14 +134,10 @@ public function getRules(string $source_url = self::PSL_URL): Rules /** * Returns the cache key according to the source URL. - * - * @param string $str - * - * @return string */ - private function getCacheKey(string $str): string + private function getCacheKey(string $prefix, string $str): string { - return 'PSL_FULL_'.md5(strtolower($str)); + return $prefix.'_FULL_'.md5(strtolower($str)); } /** @@ -97,20 +146,53 @@ private function getCacheKey(string $str): string * If a local cache already exists, it will be overwritten. * * Returns true if the refresh was successful + */ + public function refreshRules(string $url = self::PSL_URL): bool + { + $body = $this->http->getContent($url); + $cacheData = $this->converter->convert($body); + $cacheKey = $this->getCacheKey('PSL', $url); + + return $this->cache->set($cacheKey, json_encode($cacheData), $this->ttl); + } + + /** + * Gets the Public Suffix List Rules. * - * @param string $source_url the Public Suffix List URL - * - * @return bool + * @throws Exception If the Top Level Domains can not be returned */ - public function refreshRules(string $source_url = self::PSL_URL): bool + public function getTLDs(string $url = self::RZD_URL): TopLevelDomains { - static $converter; + $cacheKey = $this->getCacheKey('RZD', $url); + $cacheList = $this->cache->get($cacheKey); + + if (null === $cacheList && !$this->refreshTLDs($url)) { + throw new CouldNotLoadTLDs(sprintf('Unable to load the root zone database from %s', $url)); + } - $converter = $converter ?? new Converter(); + $data = json_decode($cacheList ?? $this->cache->get($cacheKey), true); + if (JSON_ERROR_NONE === json_last_error()) { + return TopLevelDomains::createFromArray($data); + } + + throw new CouldNotLoadTLDs('The root zone database cache is corrupted: '.json_last_error_msg(), json_last_error()); + } + + /** + * Downloads, converts and cache the IANA Root Zone TLD. + * + * If a local cache already exists, it will be overwritten. + * + * Returns true if the refresh was successful + * + * @throws Exception if the source is not validated + */ + public function refreshTLDs(string $url = self::RZD_URL): bool + { + $body = $this->http->getContent($url); + $cacheData = $this->converter->convertRootZoneDatabase($body); + $cacheKey = $this->getCacheKey('RZD', $url); - return $this->cache->set( - $this->getCacheKey($source_url), - json_encode($converter->convert($this->http->getContent($source_url))) - ); + return $this->cache->set($cacheKey, json_encode($cacheData), $this->ttl); } } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 7736824c..31acf78f 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -18,6 +18,14 @@ use JsonSerializable; use Pdp\Exception\CouldNotResolvePublicSuffix; use Pdp\Exception\InvalidDomain; +use function array_keys; +use function array_reverse; +use function count; +use function implode; +use function in_array; +use function reset; +use function sprintf; +use function strpos; /** * Public Suffix Value Object. @@ -66,10 +74,6 @@ public static function __set_state(array $properties): self /** * Create an new instance from a Domain object. - * - * @param Domain $domain - * - * @return self */ public static function createFromDomain(Domain $domain): self { @@ -86,8 +90,7 @@ public static function createFromDomain(Domain $domain): self /** * New instance. * - * @param mixed $publicSuffix - * @param string $section + * @param null|mixed $publicSuffix */ public function __construct($publicSuffix = null, string $section = '') { @@ -105,7 +108,7 @@ public function __construct($publicSuffix = null, string $section = '') */ private function setPublicSuffix() { - if (empty($this->labels)) { + if ([] === $this->labels) { return null; } @@ -120,11 +123,7 @@ private function setPublicSuffix() /** * Set the public suffix section. * - * @param string $section - * * @throws CouldNotResolvePublicSuffix if the submitted section is not supported - * - * @return string */ private function setSection(string $section): string { @@ -216,8 +215,6 @@ public function keys(string $label): array /** * Tells whether the public suffix has a matching rule in a Public Suffix List. - * - * @return bool */ public function isKnown(): bool { @@ -226,8 +223,6 @@ public function isKnown(): bool /** * Tells whether the public suffix has a matching rule in a Public Suffix List ICANN Section. - * - * @return bool */ public function isICANN(): bool { @@ -236,8 +231,6 @@ public function isICANN(): bool /** * Tells whether the public suffix has a matching rule in a Public Suffix List Private Section. - * - * @return bool */ public function isPrivate(): bool { diff --git a/src/Rules.php b/src/Rules.php index 21568646..adbe3942 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -17,6 +17,13 @@ use Pdp\Exception\CouldNotLoadRules; use Pdp\Exception\CouldNotResolvePublicSuffix; +use function array_reverse; +use function count; +use function fclose; +use function fopen; +use function in_array; +use function sprintf; +use function stream_get_contents; /** * A class to resolve domain name against the Public Suffix list. @@ -46,12 +53,10 @@ final class Rules implements PublicSuffixListSection /** * Returns a new instance from a file path. * - * @param string $path * @param null|resource $context * * @throws CouldNotLoadRules If the rules can not be loaded from the path * - * @return self */ public static function createFromPath(string $path, $context = null): self { @@ -73,9 +78,7 @@ public static function createFromPath(string $path, $context = null): self /** * Returns a new instance from a string. * - * @param string $content * - * @return self */ public static function createFromString(string $content): self { @@ -97,7 +100,6 @@ public static function __set_state(array $properties): self /** * New instance. * - * @param array $rules */ public function __construct(array $rules) { @@ -107,12 +109,9 @@ public function __construct(array $rules) /** * Determines the public suffix for a given domain. * - * @param mixed $domain - * @param string $section * * @throws CouldNotResolvePublicSuffix If the PublicSuffix can not be resolve. * - * @return PublicSuffix */ public function getPublicSuffix($domain, string $section = self::ALL_DOMAINS): PublicSuffix { @@ -128,10 +127,7 @@ public function getPublicSuffix($domain, string $section = self::ALL_DOMAINS): P /** * Returns PSL info for a given domain. * - * @param mixed $domain - * @param string $section * - * @return Domain */ public function resolve($domain, string $section = self::ALL_DOMAINS): Domain { @@ -151,11 +147,9 @@ public function resolve($domain, string $section = self::ALL_DOMAINS): Domain /** * Assert the section status. * - * @param string $section * * @throws Exception if the submitted section is not supported * - * @return string */ private function validateSection(string $section): string { @@ -173,10 +167,7 @@ private function validateSection(string $section): string /** * Returns the matched public suffix. * - * @param DomainInterface $domain - * @param string $section * - * @return PublicSuffix */ private function findPublicSuffix(DomainInterface $domain, string $section): PublicSuffix { @@ -201,10 +192,7 @@ private function findPublicSuffix(DomainInterface $domain, string $section): Pub /** * Returns the public suffix matched against a given PSL section. * - * @param DomainInterface $domain - * @param string $section * - * @return PublicSuffix */ private function findPublicSuffixFromSection(DomainInterface $domain, string $section): PublicSuffix { @@ -231,7 +219,7 @@ private function findPublicSuffixFromSection(DomainInterface $domain, string $se $rules = $rules[$label]; } - if (empty($matches)) { + if ([] === $matches) { return new PublicSuffix($domain->getLabel(0)); } diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php new file mode 100644 index 00000000..c581ba08 --- /dev/null +++ b/src/TopLevelDomains.php @@ -0,0 +1,218 @@ +convertRootZoneDatabase($content)); + } + + /** + * Returns a new instance from a array. + */ + public static function createFromArray(array $data): self + { + if (!isset($data['records'], $data['version'], $data['update'])) { + throw new Exception(sprintf('The provided array must share the same structure returned by %s::toArray method', TopLevelDomains::class)); + } + + return new self( + $data['records'], + $data['version'], + DateTimeImmutable::createFromFormat(DATE_ATOM, $data['update']) + ); + } + + /** + * {@inheritdoc} + */ + public static function __set_state(array $properties): self + { + return new self($properties['records'], $properties['version'], $properties['update']); + } + + /** + * New instance. + */ + public function __construct(array $records, string $version, DateTimeInterface $update) + { + $this->records = $records; + $this->version = $version; + $this->update = $update instanceof DateTime ? DateTimeImmutable::createFromMutable($update) : $update; + } + + /** + * Returns the Version ID. + */ + public function getVersion(): string + { + return $this->version; + } + + /** + * Returns the List Last Update Info. + */ + public function getLastUpdate(): DateTimeImmutable + { + return $this->update; + } + + /** + * {@inheritdoc} + */ + public function count() + { + return count($this->records); + } + + /** + * Tells whether the list is empty. + */ + public function isEmpty(): bool + { + return [] === $this->records; + } + + /** + * {@inheritdoc} + */ + public function getIterator() + { + foreach ($this->records as $tld) { + yield (new PublicSuffix($tld, PublicSuffix::ICANN_DOMAINS))->toAscii(); + } + } + + /** + * Returns an array representation of the list. + */ + public function toArray(): array + { + return [ + 'version' => $this->version, + 'records' => $this->records, + 'update' => $this->update->format(DATE_ATOM), + ]; + } + + /** + * Tells whether the submitted TLD is a valid Top Level Domain. + */ + public function contains($tld): bool + { + try { + $tld = $tld instanceof Domain ? $tld : new Domain($tld); + if (1 !== count($tld)) { + return false; + } + $label = $tld->toAscii()->getLabel(0); + foreach ($this as $tld) { + if ($tld->getContent() === $label) { + return true; + } + } + + return false; + } catch (Exception $e) { + return false; + } + } + + /** + * Returns a domain where its public suffix is the found TLD. + */ + public function resolve($domain): Domain + { + try { + $domain = $domain instanceof Domain ? $domain : new Domain($domain); + if (!$domain->isResolvable()) { + return $domain; + } + + $label = $domain->toAscii()->getLabel(0); + foreach ($this as $tld) { + if ($tld->getContent() === $label) { + return $domain->resolve($tld); + } + } + + return $domain->withPublicSuffix(new PublicSuffix()); + } catch (Exception $e) { + return new Domain(); + } + } +} diff --git a/tests/CacheTest.php b/tests/CacheTest.php index 3530788b..acbd88c5 100644 --- a/tests/CacheTest.php +++ b/tests/CacheTest.php @@ -58,30 +58,29 @@ public function tearDown() public function testConstructorOnEmptyCachePath() { $cache = new Cache(''); - $this->assertNull($cache->get('invalid_key')); + self::assertNull($cache->get('invalid_key')); } public function testConstructorOnParentCachePathIsNotExisted() { $cache = new Cache(vfsStream::url('pdp/cache_not_exist')); - $this->assertNull($cache->get('invalid_key')); + self::assertNull($cache->get('invalid_key')); } public function testSetOnNotWritableCachePath() { $cache = new Cache('/bin'); - $this->assertFalse($cache->set('key', 'value')); + self::assertFalse($cache->set('key', 'value')); } /** * @dataProvider storableValuesProvider * - * @param mixed $expected */ public function testSetGet($expected) { $this->cache->set('foo', $expected); - $this->assertEquals($expected, $this->cache->get('foo')); + self::assertEquals($expected, $this->cache->get('foo')); } public function storableValuesProvider() @@ -102,26 +101,26 @@ public function storableValuesProvider() public function testDelete() { $this->cache->set('foo', 'bar'); - $this->assertEquals('bar', $this->cache->get('foo')); + self::assertEquals('bar', $this->cache->get('foo')); $this->cache->delete('foo'); - $this->assertNull($this->cache->get('foo')); + self::assertNull($this->cache->get('foo')); } public function testGetInvalidArg() { - $this->expectException(InvalidArgumentException::class); + self::expectException(InvalidArgumentException::class); $this->cache->get(null); } public function testInvalidKey() { - $this->expectException(InvalidArgumentException::class); + self::expectException(InvalidArgumentException::class); $this->cache->get('foo:bar', 'bar'); } public function testSetInvalidTTL() { - $this->expectException(InvalidArgumentException::class); + self::expectException(InvalidArgumentException::class); $this->cache->set('foo', 'bar', date_create()); } @@ -130,7 +129,7 @@ public function testSetInvalidTTL() */ public function testGetNotFound() { - $this->assertNull($this->cache->get('notfound')); + self::assertNull($this->cache->get('notfound')); } /** @@ -139,7 +138,7 @@ public function testGetNotFound() public function testGetNotFoundDefault() { $default = 'chickpeas'; - $this->assertEquals( + self::assertEquals( $default, $this->cache->get('notfound', $default) ); @@ -152,11 +151,11 @@ public function testGetNotFoundDefault() public function testSetExpire() { $this->cache->set('foo', 'bar', 1); - $this->assertEquals('bar', $this->cache->get('foo')); + self::assertEquals('bar', $this->cache->get('foo')); // Wait 3 seconds so the cache expires sleep(3); - $this->assertNull($this->cache->get('foo')); + self::assertNull($this->cache->get('foo')); } /** @@ -166,22 +165,22 @@ public function testSetExpire() public function testSetExpireDateInterval() { $this->cache->set('foo', 'bar', new DateInterval('PT1S')); - $this->assertEquals('bar', $this->cache->get('foo')); + self::assertEquals('bar', $this->cache->get('foo')); // Wait 3 seconds so the cache expires sleep(3); - $this->assertNull($this->cache->get('foo')); + self::assertNull($this->cache->get('foo')); } public function testSetInvalidArg() { - $this->expectException(InvalidArgumentException::class); + self::expectException(InvalidArgumentException::class); $this->cache->set(null, 'bar'); } public function testDeleteInvalidArg() { - $this->expectException(InvalidArgumentException::class); + self::expectException(InvalidArgumentException::class); $this->cache->delete(null); } @@ -192,7 +191,7 @@ public function testClearCache() { $this->cache->set('foo', 'bar'); $this->cache->clear(); - $this->assertNull($this->cache->get('foo')); + self::assertNull($this->cache->get('foo')); } /** @@ -201,7 +200,7 @@ public function testClearCache() public function testHas() { $this->cache->set('foo', 'bar'); - $this->assertTrue($this->cache->has('foo')); + self::assertTrue($this->cache->has('foo')); } /** @@ -209,12 +208,12 @@ public function testHas() */ public function testHasNot() { - $this->assertFalse($this->cache->has('not-found')); + self::assertFalse($this->cache->has('not-found')); } public function testHasInvalidArg() { - $this->expectException(InvalidArgumentException::class); + self::expectException(InvalidArgumentException::class); $this->cache->has(null); } @@ -232,13 +231,13 @@ public function testSetGetMultiple() $this->cache->setMultiple($values); $result = $this->cache->getMultiple(array_keys($values)); foreach ($result as $key => $value) { - $this->assertTrue(isset($values[$key])); - $this->assertEquals($values[$key], $value); + self::assertTrue(isset($values[$key])); + self::assertEquals($values[$key], $value); unset($values[$key]); } // The list of values should now be empty - $this->assertEquals([], $values); + self::assertEquals([], $values); } /** @@ -262,13 +261,13 @@ public function testSetGetMultipleGenerator() $result = $this->cache->getMultiple(array_keys($values)); foreach ($result as $key => $value) { - $this->assertTrue(isset($values[$key])); - $this->assertEquals($values[$key], $value); + self::assertTrue(isset($values[$key])); + self::assertEquals($values[$key], $value); unset($values[$key]); } // The list of values should now be empty - $this->assertEquals([], $values); + self::assertEquals([], $values); } /** @@ -291,13 +290,13 @@ public function testSetGetMultipleGenerator2() $this->cache->setMultiple($values); $result = $this->cache->getMultiple($gen()); foreach ($result as $key => $value) { - $this->assertTrue(isset($values[$key])); - $this->assertEquals($values[$key], $value); + self::assertTrue(isset($values[$key])); + self::assertEquals($values[$key], $value); unset($values[$key]); } // The list of values should now be empty - $this->assertEquals([], $values); + self::assertEquals([], $values); } /** @@ -318,13 +317,13 @@ public function testSetMultipleExpireDateIntervalNotExpired() $count = 0; foreach ($result as $key => $value) { ++$count; - $this->assertTrue(isset($values[$key])); - $this->assertEquals($values[$key], $value); + self::assertTrue(isset($values[$key])); + self::assertEquals($values[$key], $value); unset($values[$key]); } - $this->assertEquals(3, $count); + self::assertEquals(3, $count); // The list of values should now be empty - $this->assertEquals([], $values); + self::assertEquals([], $values); } /** @@ -354,14 +353,14 @@ public function testSetMultipleExpireDateIntervalExpired() foreach ($result as $key => $value) { ++$count; - $this->assertTrue(isset($expected[$key])); - $this->assertEquals($expected[$key], $value); + self::assertTrue(isset($expected[$key])); + self::assertEquals($expected[$key], $value); unset($expected[$key]); } - $this->assertEquals(3, $count); + self::assertEquals(3, $count); // The list of values should now be empty - $this->assertEquals([], $expected); + self::assertEquals([], $expected); } /** @@ -391,25 +390,25 @@ public function testSetMultipleExpireDateIntervalInt() foreach ($result as $key => $value) { ++$count; - $this->assertTrue(isset($expected[$key])); - $this->assertEquals($expected[$key], $value); + self::assertTrue(isset($expected[$key])); + self::assertEquals($expected[$key], $value); unset($expected[$key]); } - $this->assertEquals(3, $count); + self::assertEquals(3, $count); // The list of values should now be empty - $this->assertEquals([], $expected); + self::assertEquals([], $expected); } public function testSetMultipleInvalidArg() { - $this->expectException(InvalidArgumentException::class); + self::expectException(InvalidArgumentException::class); $this->cache->setMultiple(null); } public function testGetMultipleInvalidArg() { - $this->expectException(InvalidArgumentException::class); + self::expectException(InvalidArgumentException::class); $result = $this->cache->getMultiple(null); // If $result was a generator, the generator will only error once the // first value is requested. @@ -444,13 +443,13 @@ public function testDeleteMultipleDefaultGet() ]; foreach ($result as $key => $value) { - $this->assertTrue(isset($expected[$key])); - $this->assertEquals($expected[$key], $value); + self::assertTrue(isset($expected[$key])); + self::assertEquals($expected[$key], $value); unset($expected[$key]); } // The list of values should now be empty - $this->assertEquals([], $expected); + self::assertEquals([], $expected); } /** @@ -482,18 +481,18 @@ public function testDeleteMultipleGenerator() ]; foreach ($result as $key => $value) { - $this->assertTrue(isset($expected[$key])); - $this->assertEquals($expected[$key], $value); + self::assertTrue(isset($expected[$key])); + self::assertEquals($expected[$key], $value); unset($expected[$key]); } // The list of values should now be empty - $this->assertEquals([], $expected); + self::assertEquals([], $expected); } public function testDeleteMultipleInvalidArg() { - $this->expectException(InvalidArgumentException::class); + self::expectException(InvalidArgumentException::class); $this->cache->deleteMultiple(null); } } diff --git a/tests/CurlHttpClientTest.php b/tests/CurlHttpClientTest.php index 77227451..7c977bf0 100644 --- a/tests/CurlHttpClientTest.php +++ b/tests/CurlHttpClientTest.php @@ -32,8 +32,8 @@ class CurlHttpClientTest extends TestCase public function testGetContent() { $content = (new CurlHttpClient())->getContent('https://www.google.com'); - $this->assertNotNull($content); - $this->assertContains('google', $content); + self::assertNotNull($content); + self::assertContains('google', $content); } /** @@ -42,7 +42,7 @@ public function testGetContent() */ public function testThrowsException() { - $this->expectException(HttpClientException::class); + self::expectException(HttpClientException::class); (new CurlHttpClient())->getContent('https://qsfsdfqdf.dfsf'); } @@ -51,7 +51,7 @@ public function testThrowsException() */ public function testConstructorThrowsException() { - $this->expectException(Exception::class); + self::expectException(Exception::class); new CurlHttpClient(['foo' => 'bar']); } } diff --git a/tests/DomainTest.php b/tests/DomainTest.php index b58648f6..25ddda5a 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -43,9 +43,9 @@ class DomainTest extends TestCase public function testRegistrableDomainIsNullWithFoundDomain() { $domain = new Domain('faketld', null); - $this->assertNull($domain->getPublicSuffix()); - $this->assertNull($domain->getRegistrableDomain()); - $this->assertNull($domain->getSubDomain()); + self::assertNull($domain->getPublicSuffix()); + self::assertNull($domain->getRegistrableDomain()); + self::assertNull($domain->getSubDomain()); } /** @@ -54,12 +54,10 @@ public function testRegistrableDomainIsNullWithFoundDomain() * @covers ::normalize * @dataProvider provideWrongConstructor * - * @param mixed $domain - * @param mixed $publicSuffix */ public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain($domain, $publicSuffix) { - $this->expectException(CouldNotResolvePublicSuffix::class); + self::expectException(CouldNotResolvePublicSuffix::class); new Domain($domain, new PublicSuffix($publicSuffix)); } @@ -86,14 +84,24 @@ public function provideWrongConstructor() } /** + * @dataProvider invalidDomainProvider * @covers ::__construct * @covers ::setLabels * @covers ::getIdnErrors */ - public function testToAsciiThrowsException() + public function testToAsciiThrowsException(string $domain) { - $this->expectException(InvalidDomain::class); - new Domain('a⒈com'); + self::expectException(InvalidDomain::class); + new Domain($domain); + } + + public function invalidDomainProvider() + { + return [ + 'invalid IDN domain' => ['a⒈com'], + 'invalid IDN domain full size' => ['%00.com'], + 'invalid IDN domain full size rawurlencode ' => ['%ef%bc%85%ef%bc%94%ef%bc%91.com'], + ]; } /** @@ -103,7 +111,7 @@ public function testToAsciiThrowsException() */ public function testToUnicodeThrowsException() { - $this->expectException(InvalidDomain::class); + self::expectException(InvalidDomain::class); (new Domain('xn--a-ecp.ru'))->toUnicode(); } @@ -119,14 +127,14 @@ public function testDomainInternalPhpMethod() { $domain = new Domain('www.ulb.ac.be', new PublicSuffix('ac.be')); $generateDomain = eval('return '.var_export($domain, true).';'); - $this->assertInternalType('array', $domain->__debugInfo()); - $this->assertEquals($domain, $generateDomain); - $this->assertSame(['be', 'ac', 'ulb', 'www'], iterator_to_array($domain)); - $this->assertJsonStringEqualsJsonString( + self::assertInternalType('array', $domain->__debugInfo()); + self::assertEquals($domain, $generateDomain); + self::assertSame(['be', 'ac', 'ulb', 'www'], iterator_to_array($domain)); + self::assertJsonStringEqualsJsonString( json_encode($domain->__debugInfo()), json_encode($domain) ); - $this->assertSame('www.ulb.ac.be', (string) $domain); + self::assertSame('www.ulb.ac.be', (string) $domain); } /** @@ -142,8 +150,8 @@ public function testDomainInternalPhpMethod() public function testCountable($domain, $nbLabels, $labels) { $domain = new Domain($domain); - $this->assertCount($nbLabels, $domain); - $this->assertSame($labels, iterator_to_array($domain)); + self::assertCount($nbLabels, $domain); + self::assertSame($labels, iterator_to_array($domain)); } public function countableProvider() @@ -162,11 +170,11 @@ public function countableProvider() public function testGetLabel() { $domain = new Domain('master.example.com'); - $this->assertSame('com', $domain->getLabel(0)); - $this->assertSame('example', $domain->getLabel(1)); - $this->assertSame('master', $domain->getLabel(-1)); - $this->assertNull($domain->getLabel(23)); - $this->assertNull($domain->getLabel(-23)); + self::assertSame('com', $domain->getLabel(0)); + self::assertSame('example', $domain->getLabel(1)); + self::assertSame('master', $domain->getLabel(-1)); + self::assertNull($domain->getLabel(23)); + self::assertNull($domain->getLabel(-23)); } /** @@ -175,8 +183,8 @@ public function testGetLabel() public function testOffsets() { $domain = new Domain('master.com.example.com'); - $this->assertSame([0, 2], $domain->keys('com')); - $this->assertSame([], $domain->keys('toto')); + self::assertSame([0, 2], $domain->keys('com')); + self::assertSame([], $domain->keys('toto')); } /** @@ -209,12 +217,12 @@ public function testToIDN( $expectedIDNSuffix ) { $domain = new Domain($domain, new PublicSuffix($publicSuffix)); - $this->assertSame($expectedDomain, $domain->getDomain()); - $this->assertSame($expectedSuffix, $domain->getPublicSuffix()); + self::assertSame($expectedDomain, $domain->getDomain()); + self::assertSame($expectedSuffix, $domain->getPublicSuffix()); $domainIDN = $domain->toUnicode(); - $this->assertSame($expectedIDNDomain, $domainIDN->getDomain()); - $this->assertSame($expectedIDNSuffix, $domainIDN->getPublicSuffix()); + self::assertSame($expectedIDNDomain, $domainIDN->getDomain()); + self::assertSame($expectedIDNSuffix, $domainIDN->getPublicSuffix()); } public function toUnicodeProvider() @@ -309,12 +317,12 @@ public function testToAscii( $expectedAsciiSuffix ) { $domain = new Domain($domain, new PublicSuffix($publicSuffix)); - $this->assertSame($expectedDomain, $domain->getDomain()); - $this->assertSame($expectedSuffix, $domain->getPublicSuffix()); + self::assertSame($expectedDomain, $domain->getDomain()); + self::assertSame($expectedSuffix, $domain->getPublicSuffix()); $domainIDN = $domain->toAscii(); - $this->assertSame($expectedAsciiDomain, $domainIDN->getDomain()); - $this->assertSame($expectedAsciiSuffix, $domainIDN->getPublicSuffix()); + self::assertSame($expectedAsciiDomain, $domainIDN->getDomain()); + self::assertSame($expectedAsciiSuffix, $domainIDN->getPublicSuffix()); } public function toAsciiProvider() @@ -368,13 +376,11 @@ public function toAsciiProvider() * @covers ::normalize * @dataProvider resolvePassProvider * - * @param Domain $domain - * @param mixed $publicSuffix * @param string|null $expected */ public function testResolveWorks(Domain $domain, $publicSuffix, $expected) { - $this->assertSame($expected, $domain->resolve($publicSuffix)->getPublicSuffix()); + self::assertSame($expected, $domain->resolve($publicSuffix)->getPublicSuffix()); } public function resolvePassProvider() @@ -425,12 +431,10 @@ public function resolvePassProvider() * @covers ::resolve * @dataProvider resolveFailsProvider * - * @param Domain $domain - * @param PublicSuffix $publicSuffix */ public function testResolveFails(Domain $domain, PublicSuffix $publicSuffix) { - $this->expectException(CouldNotResolvePublicSuffix::class); + self::expectException(CouldNotResolvePublicSuffix::class); $domain->resolve($publicSuffix); } @@ -470,8 +474,8 @@ public function testResolveReturnsInstance() { $publicSuffix = new PublicSuffix('ac.be', Rules::ICANN_DOMAINS); $domain = new Domain('ulb.ac.be', $publicSuffix); - $this->assertSame($domain, $domain->resolve($publicSuffix)); - $this->assertNotSame($domain, $domain->resolve(new PublicSuffix('ac.be', Rules::PRIVATE_DOMAINS))); + self::assertSame($domain, $domain->resolve($publicSuffix)); + self::assertNotSame($domain, $domain->resolve(new PublicSuffix('ac.be', Rules::PRIVATE_DOMAINS))); } /** @@ -479,19 +483,17 @@ public function testResolveReturnsInstance() * @covers ::normalizeContent * @dataProvider withSubDomainWorksProvider * - * @param Domain $domain - * @param mixed $subdomain * @param null|string $expected */ public function testWithSubDomainWorks(Domain $domain, $subdomain, $expected) { $result = $domain->withSubDomain($subdomain); - $this->assertSame($expected, $result->getSubDomain()); - $this->assertSame($domain->getPublicSuffix(), $result->getPublicSuffix()); - $this->assertSame($domain->getRegistrableDomain(), $result->getRegistrableDomain()); - $this->assertSame($domain->isKnown(), $result->isKnown()); - $this->assertSame($domain->isICANN(), $result->isICANN()); - $this->assertSame($domain->isPrivate(), $result->isPrivate()); + self::assertSame($expected, $result->getSubDomain()); + self::assertSame($domain->getPublicSuffix(), $result->getPublicSuffix()); + self::assertSame($domain->getRegistrableDomain(), $result->getRegistrableDomain()); + self::assertSame($domain->isKnown(), $result->isKnown()); + self::assertSame($domain->isICANN(), $result->isICANN()); + self::assertSame($domain->isPrivate(), $result->isPrivate()); } public function withSubDomainWorksProvider() @@ -531,7 +533,7 @@ public function withSubDomainWorksProvider() */ public function testWithSubDomainFailsWithNullDomain() { - $this->expectException(CouldNotResolveSubDomain::class); + self::expectException(CouldNotResolveSubDomain::class); (new Domain())->withSubDomain('www'); } @@ -541,7 +543,7 @@ public function testWithSubDomainFailsWithNullDomain() */ public function testWithSubDomainFailsWithOneLabelDomain() { - $this->expectException(CouldNotResolveSubDomain::class); + self::expectException(CouldNotResolveSubDomain::class); (new Domain('localhost'))->withSubDomain('www'); } @@ -552,7 +554,7 @@ public function testWithSubDomainFailsWithOneLabelDomain() */ public function testWithSubDomainFailsWithNonStringableObject() { - $this->expectException(TypeError::class); + self::expectException(TypeError::class); (new Domain( 'example.com', new PublicSuffix('com', PublicSuffix::ICANN_DOMAINS) @@ -566,7 +568,7 @@ public function testWithSubDomainFailsWithNonStringableObject() */ public function testWithSubDomainWithoutPublicSuffixInfo() { - $this->expectException(CouldNotResolveSubDomain::class); + self::expectException(CouldNotResolveSubDomain::class); (new Domain('www.example.com'))->withSubDomain('www'); } @@ -574,12 +576,7 @@ public function testWithSubDomainWithoutPublicSuffixInfo() * @covers ::withPublicSuffix * @dataProvider withPublicSuffixWorksProvider * - * @param Domain $domain - * @param mixed $publicSuffix * @param null|string $expected - * @param bool $isKnown - * @param bool $isICANN - * @param bool $isPrivate */ public function testWithPublicSuffixWorks( Domain $domain, @@ -590,10 +587,10 @@ public function testWithPublicSuffixWorks( bool $isPrivate ) { $result = $domain->withPublicSuffix($publicSuffix); - $this->assertSame($expected, $result->getPublicSuffix()); - $this->assertSame($isKnown, $result->isKnown()); - $this->assertSame($isICANN, $result->isICANN()); - $this->assertSame($isPrivate, $result->isPrivate()); + self::assertSame($expected, $result->getPublicSuffix()); + self::assertSame($isKnown, $result->isKnown()); + self::assertSame($isICANN, $result->isICANN()); + self::assertSame($isPrivate, $result->isPrivate()); } public function withPublicSuffixWorksProvider() @@ -673,7 +670,7 @@ public function withPublicSuffixWorksProvider() */ public function testWithPublicSuffixFailsWithNullDomain() { - $this->expectException(InvalidDomain::class); + self::expectException(InvalidDomain::class); (new Domain())->withPublicSuffix('www'); } @@ -682,13 +679,7 @@ public function testWithPublicSuffixFailsWithNullDomain() * @covers ::normalizeContent * @dataProvider withLabelWorksProvider * - * @param Domain $domain - * @param int $key - * @param mixed $label * @param null|string $expected - * @param bool $isKnown - * @param bool $isICANN - * @param bool $isPrivate */ public function testWithLabelWorks( Domain $domain, @@ -700,10 +691,10 @@ public function testWithLabelWorks( bool $isPrivate ) { $result = $domain->withLabel($key, $label); - $this->assertSame($expected, $result->getContent()); - $this->assertSame($isKnown, $result->isKnown()); - $this->assertSame($isICANN, $result->isICANN()); - $this->assertSame($isPrivate, $result->isPrivate()); + self::assertSame($expected, $result->getContent()); + self::assertSame($isKnown, $result->isKnown()); + self::assertSame($isICANN, $result->isICANN()); + self::assertSame($isPrivate, $result->isPrivate()); } public function withLabelWorksProvider() @@ -809,7 +800,7 @@ public function withLabelWorksProvider() */ public function testWithLabelFailsWithTypeError() { - $this->expectException(InvalidLabel::class); + self::expectException(InvalidLabel::class); (new Domain('example.com'))->withLabel(1, null); } @@ -818,7 +809,7 @@ public function testWithLabelFailsWithTypeError() */ public function testWithLabelFailsWithInvalidKey() { - $this->expectException(InvalidLabelKey::class); + self::expectException(InvalidLabelKey::class); (new Domain('example.com'))->withLabel(-4, 'www'); } @@ -827,7 +818,7 @@ public function testWithLabelFailsWithInvalidKey() */ public function testWithLabelFailsWithInvalidLabel2() { - $this->expectException(InvalidDomain::class); + self::expectException(InvalidDomain::class); (new Domain('example.com'))->withLabel(-1, ''); } @@ -843,7 +834,7 @@ public function testWithLabelFailsWithInvalidLabel2() */ public function testAppend($raw, $append, $expected) { - $this->assertSame($expected, (string) (new Domain($raw))->append($append)); + self::assertSame($expected, (string) (new Domain($raw))->append($append)); } public function validAppend() @@ -868,7 +859,7 @@ public function validAppend() */ public function testPrepend($raw, $prepend, $expected) { - $this->assertSame($expected, (string) (new Domain($raw))->prepend($prepend)); + self::assertSame($expected, (string) (new Domain($raw))->prepend($prepend)); } public function validPrepend() @@ -884,12 +875,7 @@ public function validPrepend() * @covers ::withoutLabel * @dataProvider withoutLabelWorksProvider * - * @param Domain $domain - * @param int $key * @param null|string $expected - * @param bool $isKnown - * @param bool $isICANN - * @param bool $isPrivate */ public function testwithoutLabelWorks( Domain $domain, @@ -900,10 +886,10 @@ public function testwithoutLabelWorks( bool $isPrivate ) { $result = $domain->withoutLabel($key); - $this->assertSame($expected, $result->getContent()); - $this->assertSame($isKnown, $result->isKnown()); - $this->assertSame($isICANN, $result->isICANN()); - $this->assertSame($isPrivate, $result->isPrivate()); + self::assertSame($expected, $result->getContent()); + self::assertSame($isKnown, $result->isKnown()); + self::assertSame($isICANN, $result->isICANN()); + self::assertSame($isPrivate, $result->isPrivate()); } public function withoutLabelWorksProvider() @@ -951,7 +937,7 @@ public function withoutLabelWorksProvider() */ public function testwithoutLabelFailsWithInvalidKey() { - $this->expectException(InvalidLabelKey::class); + self::expectException(InvalidLabelKey::class); (new Domain('example.com'))->withoutLabel(-3); } @@ -960,6 +946,6 @@ public function testwithoutLabelFailsWithInvalidKey() */ public function testwithoutLabelWorksWithMultipleKeys() { - $this->assertNull((new Domain('www.example.com'))->withoutLabel(0, 1, 2)->getContent()); + self::assertNull((new Domain('www.example.com'))->withoutLabel(0, 1, 2)->getContent()); } } diff --git a/tests/ManagerTest.php b/tests/ManagerTest.php index 6355192b..59798bf3 100644 --- a/tests/ManagerTest.php +++ b/tests/ManagerTest.php @@ -15,15 +15,21 @@ namespace Pdp\Tests; +use DateInterval; +use DateTime; use org\bovigo\vfs\vfsStream; use Pdp\Cache; use Pdp\Converter; use Pdp\CurlHttpClient; +use Pdp\Exception; use Pdp\Exception\CouldNotLoadRules; +use Pdp\Exception\CouldNotLoadTLDs; use Pdp\Exception\InvalidDomain; +use Pdp\HttpClient; use Pdp\Manager; use PHPUnit\Framework\TestCase; use Psr\SimpleCache\CacheInterface; +use TypeError; /** * @coversDefaultClass Pdp\Manager @@ -61,8 +67,8 @@ public function testRefreshRules() { $manager = new Manager($this->cachePool, new CurlHttpClient()); $previous = $manager->getRules(); - $this->assertTrue($manager->refreshRules($this->sourceUrl)); - $this->assertEquals($previous, $manager->getRules()); + self::assertTrue($manager->refreshRules($this->sourceUrl)); + self::assertEquals($previous, $manager->getRules()); } /** @@ -78,7 +84,67 @@ public function testRebuildRulesFromRemoveSource() $previous = $manager->getRules($this->sourceUrl); $this->cachePool->clear(); //delete all local cache $list = $manager->getRules($this->sourceUrl); - $this->assertEquals($previous, $manager->getRules($this->sourceUrl)); + self::assertEquals($previous, $manager->getRules($this->sourceUrl)); + } + + /** + * @covers ::__construct + * @covers ::getTLDs + * @covers ::getCacheKey + * @covers ::refreshTLDs + * @covers \Pdp\Converter + */ + public function testRefreshTLDs() + { + $client = new class() implements HttpClient { + public function getContent(string $url): string + { + if ($url === Manager::PSL_URL) { + return file_get_contents(__DIR__.'/data/public_suffix_list.dat'); + } + + if ($url === Manager::RZD_URL) { + return file_get_contents(__DIR__.'/data/tlds-alpha-by-domain.txt'); + } + + return ''; + } + }; + + $manager = new Manager($this->cachePool, $client); + $previous = $manager->getTLDs(); + self::assertTrue($manager->refreshTLDs()); + self::assertEquals($previous, $manager->getTLDs()); + } + + /** + * @covers ::__construct + * @covers ::getTLDs + * @covers ::getCacheKey + * @covers ::refreshTLDs + * @covers \Pdp\Converter + */ + public function testRebuildTLDsFromRemoveSource() + { + $client = new class() implements HttpClient { + public function getContent(string $url): string + { + if ($url === Manager::PSL_URL) { + return file_get_contents(__DIR__.'/data/public_suffix_list.dat'); + } + + if ($url === Manager::RZD_URL) { + return file_get_contents(__DIR__.'/data/tlds-alpha-by-domain.txt'); + } + + return ''; + } + }; + + $manager = new Manager($this->cachePool, $client); + $previous = $manager->getTLDs(); + $this->cachePool->clear(); //delete all local cache + self::assertEquals($previous, $manager->getTLDs()); } /** @@ -131,11 +197,65 @@ public function has($key) } }; - $this->expectException(CouldNotLoadRules::class); + self::expectException(CouldNotLoadRules::class); $manager = new Manager($cachePool, new CurlHttpClient()); $manager->getRules('https://google.com'); } + /** + * @covers ::__construct + * @covers ::getTLDs + * @covers ::getCacheKey + * @covers ::refreshTLDs + * @covers \Pdp\Converter + */ + public function testGetTLDsThrowsExceptionIfNotCacheCanBeRetrieveOrRefresh() + { + $cachePool = new class() implements CacheInterface { + public function get($key, $default = null) + { + return null; + } + + public function set($key, $value, $ttl = null) + { + return false; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + self::expectException(CouldNotLoadTLDs::class); + $manager = new Manager($cachePool, new CurlHttpClient()); + $manager->getTLDs(); + } /** * @covers ::__construct @@ -184,11 +304,63 @@ public function has($key) } }; - $this->expectException(CouldNotLoadRules::class); + self::expectException(CouldNotLoadRules::class); $manager = new Manager($cachePool, new CurlHttpClient()); $manager->getRules(); } + /** + * @covers ::__construct + * @covers ::getTLDs + */ + public function testGetTLDsThrowsExceptionIfTheCacheIsCorrupted() + { + $cachePool = new class() implements CacheInterface { + public function get($key, $default = null) + { + return '{"foo":"bar",}'; //malformed json + } + + public function set($key, $value, $ttl = null) + { + return false; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + self::expectException(CouldNotLoadTLDs::class); + $manager = new Manager($cachePool, new CurlHttpClient()); + $manager->getTLDs(); + } + /** * @covers \Pdp\Converter::convert * @covers \Pdp\Converter::getSection @@ -197,8 +369,44 @@ public function has($key) */ public function testConvertThrowsExceptionWithInvalidContent() { - $this->expectException(InvalidDomain::class); + self::expectException(InvalidDomain::class); $content = file_get_contents(__DIR__.'/data/invalid_suffix_list_content.dat'); (new Converter())->convert($content); } + + /** + * @covers \Pdp\Converter::convertRootZoneDatabase + * @covers \Pdp\Converter::getHeaderInfo + */ + public function testConvertRootZoneDatabaseThrowsExceptionWithInvalidContent() + { + self::expectException(Exception::class); + $content = file_get_contents(__DIR__.'/data/invalid_suffix_list_content.dat'); + (new Converter())->convertRootZoneDatabase($content); + } + + /** + * @dataProvider validTtlProvider + */ + public function testSettingTtl($ttl) + { + self::assertInstanceOf(Manager::class, new Manager(new Cache(), new CurlHttpClient(), $ttl)); + } + + public function validTtlProvider() + { + return [ + 'DateInterval' => [new DateInterval('PT1H')], + 'null' => [null], + 'DateTimeInterface' => [new DateTime('+1 DAY')], + 'string' => ['7 DAYS'], + 'int' => [86000], + ]; + } + + public function testSettingTtlTrowsException() + { + self::expectException(TypeError::class); + new Manager(new Cache(), new CurlHttpClient(), tmpfile()); + } } diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index d870a4a7..7cafdfd7 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -39,13 +39,13 @@ public function testInternalPhpMethod() { $publicSuffix = new PublicSuffix('ac.be'); $generatePublicSuffix = eval('return '.var_export($publicSuffix, true).';'); - $this->assertEquals($publicSuffix, $generatePublicSuffix); - $this->assertSame(['be', 'ac'], iterator_to_array($publicSuffix)); - $this->assertJsonStringEqualsJsonString( + self::assertEquals($publicSuffix, $generatePublicSuffix); + self::assertSame(['be', 'ac'], iterator_to_array($publicSuffix)); + self::assertJsonStringEqualsJsonString( json_encode($publicSuffix->__debugInfo()), json_encode($publicSuffix) ); - $this->assertSame('ac.be', (string) $publicSuffix); + self::assertSame('ac.be', (string) $publicSuffix); } /** @@ -57,7 +57,7 @@ public function testInternalPhpMethod() */ public function testPSToUnicodeWithUrlEncode() { - $this->assertSame('bébe', (new PublicSuffix('b%C3%A9be'))->toUnicode()->getContent()); + self::assertSame('bébe', (new PublicSuffix('b%C3%A9be'))->toUnicode()->getContent()); } /** @@ -71,17 +71,13 @@ public function testPSToUnicodeWithUrlEncode() * @dataProvider PSProvider * * @param string|null $publicSuffix - * @param string $section - * @param bool $isKnown - * @param bool $isIcann - * @param bool $isPrivate */ public function testSetSection($publicSuffix, string $section, bool $isKnown, bool $isIcann, bool $isPrivate) { $ps = new PublicSuffix($publicSuffix, $section); - $this->assertSame($isKnown, $ps->isKnown()); - $this->assertSame($isIcann, $ps->isICANN()); - $this->assertSame($isPrivate, $ps->isPrivate()); + self::assertSame($isKnown, $ps->isKnown()); + self::assertSame($isIcann, $ps->isICANN()); + self::assertSame($isPrivate, $ps->isPrivate()); } public function PSProvider() @@ -99,11 +95,10 @@ public function PSProvider() * @covers ::setPublicSuffix * @dataProvider invalidPublicSuffixProvider * - * @param mixed $publicSuffix */ public function testConstructorThrowsException($publicSuffix) { - $this->expectException(InvalidDomain::class); + self::expectException(InvalidDomain::class); new PublicSuffix($publicSuffix); } @@ -122,7 +117,7 @@ public function invalidPublicSuffixProvider() */ public function testPSToAsciiThrowsException() { - $this->expectException(InvalidDomain::class); + self::expectException(InvalidDomain::class); new PublicSuffix('a⒈com'); } @@ -132,7 +127,7 @@ public function testPSToAsciiThrowsException() */ public function testSetSectionThrowsException() { - $this->expectException(CouldNotResolvePublicSuffix::class); + self::expectException(CouldNotResolvePublicSuffix::class); new PublicSuffix('ac.be', 'foobar'); } @@ -142,7 +137,7 @@ public function testSetSectionThrowsException() */ public function testToUnicodeThrowsException() { - $this->expectException(InvalidDomain::class); + self::expectException(InvalidDomain::class); (new PublicSuffix('xn--a-ecp.ru'))->toUnicode(); } @@ -159,8 +154,8 @@ public function testToUnicodeThrowsException() public function testConversionReturnsTheSameInstance($publicSuffix) { $instance = new PublicSuffix($publicSuffix); - $this->assertSame($instance->toUnicode(), $instance); - $this->assertSame($instance->toAscii(), $instance); + self::assertSame($instance->toUnicode(), $instance); + self::assertSame($instance->toAscii(), $instance); } public function conversionReturnsTheSameInstanceProvider() @@ -178,7 +173,7 @@ public function conversionReturnsTheSameInstanceProvider() public function testToUnicodeReturnsSameInstance() { $instance = new PublicSuffix('食狮.公司.cn'); - $this->assertSame($instance->toUnicode(), $instance); + self::assertSame($instance->toUnicode(), $instance); } /** @@ -192,8 +187,8 @@ public function testToUnicodeReturnsSameInstance() public function testCountable($domain, $nbLabels, $labels) { $domain = new PublicSuffix($domain); - $this->assertCount($nbLabels, $domain); - $this->assertSame($labels, iterator_to_array($domain)); + self::assertCount($nbLabels, $domain); + self::assertSame($labels, iterator_to_array($domain)); } public function countableProvider() @@ -211,11 +206,11 @@ public function countableProvider() public function testGetLabel() { $domain = new PublicSuffix('master.example.com'); - $this->assertSame('com', $domain->getLabel(0)); - $this->assertSame('example', $domain->getLabel(1)); - $this->assertSame('master', $domain->getLabel(-1)); - $this->assertNull($domain->getLabel(23)); - $this->assertNull($domain->getLabel(-23)); + self::assertSame('com', $domain->getLabel(0)); + self::assertSame('example', $domain->getLabel(1)); + self::assertSame('master', $domain->getLabel(-1)); + self::assertNull($domain->getLabel(23)); + self::assertNull($domain->getLabel(-23)); } /** @@ -224,23 +219,22 @@ public function testGetLabel() public function testOffsets() { $domain = new PublicSuffix('master.example.com'); - $this->assertSame([2], $domain->keys('master')); + self::assertSame([2], $domain->keys('master')); } /** * @covers ::createFromDomain * @dataProvider createFromDomainProvider * - * @param Domain $domain * @param null|string $expected */ public function testCreateFromDomainWorks(Domain $domain, $expected) { $result = PublicSuffix::createFromDomain($domain); - $this->assertSame($expected, $result->getContent()); - $this->assertSame($result->isKnown(), $domain->isKnown()); - $this->assertSame($result->isICANN(), $domain->isICANN()); - $this->assertSame($result->isPrivate(), $domain->isPrivate()); + self::assertSame($expected, $result->getContent()); + self::assertSame($result->isKnown(), $domain->isKnown()); + self::assertSame($result->isICANN(), $domain->isICANN()); + self::assertSame($result->isPrivate(), $domain->isPrivate()); } public function createFromDomainProvider() diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 426c70f7..55798938 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -58,7 +58,7 @@ public function testCreateFromPath() ]); $rules = Rules::createFromPath(__DIR__.'/data/public_suffix_list.dat', $context); - $this->assertInstanceOf(Rules::class, $rules); + self::assertInstanceOf(Rules::class, $rules); } /** @@ -66,7 +66,7 @@ public function testCreateFromPath() */ public function testCreateFromPathThrowsException() { - $this->expectException(CouldNotLoadRules::class); + self::expectException(CouldNotLoadRules::class); Rules::createFromPath('/foo/bar.dat'); } @@ -77,7 +77,7 @@ public function testCreateFromPathThrowsException() public function testDomainInternalPhpMethod() { $generateRules = eval('return '.var_export($this->rules, true).';'); - $this->assertEquals($this->rules, $generateRules); + self::assertEquals($this->rules, $generateRules); } /** @@ -92,7 +92,7 @@ public function testDomainInternalPhpMethod() public function testNullWillReturnNullDomain() { $domain = $this->rules->resolve('COM'); - $this->assertFalse($domain->isKnown()); + self::assertFalse($domain->isKnown()); } @@ -102,7 +102,7 @@ public function testNullWillReturnNullDomain() */ public function testThrowsTypeErrorOnWrongInput() { - $this->expectException(TypeError::class); + self::expectException(TypeError::class); $this->rules->resolve(date_create()); } @@ -112,7 +112,7 @@ public function testThrowsTypeErrorOnWrongInput() */ public function testResolveThrowsExceptionOnWrongDomainType() { - $this->expectException(CouldNotResolvePublicSuffix::class); + self::expectException(CouldNotResolvePublicSuffix::class); $this->rules->resolve('www.example.com', 'foobar'); } @@ -130,7 +130,7 @@ public function testResolveThrowsExceptionOnWrongDomainType() public function testIsSuffixValidFalse() { $domain = $this->rules->resolve('www.example.faketld'); - $this->assertFalse($domain->isKnown()); + self::assertFalse($domain->isKnown()); } /** @@ -152,9 +152,9 @@ public function testIsSuffixValidFalse() public function testIsSuffixValidTrue() { $domain = $this->rules->resolve('www.example.com', Rules::ICANN_DOMAINS); - $this->assertTrue($domain->isKnown()); - $this->assertTrue($domain->isICANN()); - $this->assertFalse($domain->isPrivate()); + self::assertTrue($domain->isKnown()); + self::assertTrue($domain->isICANN()); + self::assertFalse($domain->isPrivate()); } /** @@ -176,9 +176,9 @@ public function testIsSuffixValidTrue() public function testIsSuffixValidFalseWithPunycoded() { $domain = $this->rules->resolve('www.example.xn--85x722f'); - $this->assertFalse($domain->isKnown()); - $this->assertFalse($domain->isICANN()); - $this->assertFalse($domain->isPrivate()); + self::assertFalse($domain->isKnown()); + self::assertFalse($domain->isICANN()); + self::assertFalse($domain->isPrivate()); } /** @@ -200,9 +200,9 @@ public function testIsSuffixValidFalseWithPunycoded() public function testSubDomainIsNull() { $domain = $this->rules->resolve('ulb.ac.be', Rules::ICANN_DOMAINS); - $this->assertTrue($domain->isKnown()); - $this->assertTrue($domain->isICANN()); - $this->assertFalse($domain->isPrivate()); + self::assertTrue($domain->isKnown()); + self::assertTrue($domain->isICANN()); + self::assertFalse($domain->isPrivate()); } /** @@ -213,7 +213,7 @@ public function testSubDomainIsNull() public function testWithExceptionName() { $domain = $this->rules->resolve('_b%C3%A9bé.be-'); - $this->assertNull($domain->getContent()); + self::assertNull($domain->getContent()); } /** @@ -227,10 +227,10 @@ public function testWithExceptionName() public function testWithPrivateDomain() { $domain = $this->rules->resolve('thephpleague.github.io'); - $this->assertTrue($domain->isKnown()); - $this->assertFalse($domain->isICANN()); - $this->assertTrue($domain->isPrivate()); - $this->assertSame('github.io', $domain->getPublicSuffix()); + self::assertTrue($domain->isKnown()); + self::assertFalse($domain->isICANN()); + self::assertTrue($domain->isPrivate()); + self::assertSame('github.io', $domain->getPublicSuffix()); } /** @@ -240,11 +240,11 @@ public function testWithPrivateDomain() public function testWithAbsoluteHostInvalid() { $domain = $this->rules->resolve('private.ulb.ac.be.'); - $this->assertSame('private.ulb.ac.be.', $domain->getContent()); - $this->assertFalse($domain->isKnown()); - $this->assertFalse($domain->isICANN()); - $this->assertFalse($domain->isPrivate()); - $this->assertNull($domain->getPublicSuffix()); + self::assertSame('private.ulb.ac.be.', $domain->getContent()); + self::assertFalse($domain->isKnown()); + self::assertFalse($domain->isICANN()); + self::assertFalse($domain->isPrivate()); + self::assertNull($domain->getPublicSuffix()); } /** @@ -258,11 +258,11 @@ public function testWithAbsoluteHostInvalid() public function testWithPrivateDomainInvalid() { $domain = $this->rules->resolve('private.ulb.ac.be', Rules::PRIVATE_DOMAINS); - $this->assertSame('private.ulb.ac.be', $domain->getContent()); - $this->assertFalse($domain->isKnown()); - $this->assertFalse($domain->isICANN()); - $this->assertFalse($domain->isPrivate()); - $this->assertSame('be', $domain->getPublicSuffix()); + self::assertSame('private.ulb.ac.be', $domain->getContent()); + self::assertFalse($domain->isKnown()); + self::assertFalse($domain->isICANN()); + self::assertFalse($domain->isPrivate()); + self::assertSame('be', $domain->getPublicSuffix()); } /** @@ -276,11 +276,11 @@ public function testWithPrivateDomainInvalid() public function testWithPrivateDomainValid() { $domain = $this->rules->resolve('thephpleague.github.io', Rules::PRIVATE_DOMAINS); - $this->assertSame('thephpleague.github.io', $domain->getContent()); - $this->assertTrue($domain->isKnown()); - $this->assertFalse($domain->isICANN()); - $this->assertTrue($domain->isPrivate()); - $this->assertSame('github.io', $domain->getPublicSuffix()); + self::assertSame('thephpleague.github.io', $domain->getContent()); + self::assertTrue($domain->isKnown()); + self::assertFalse($domain->isICANN()); + self::assertTrue($domain->isPrivate()); + self::assertSame('github.io', $domain->getPublicSuffix()); } /** @@ -294,11 +294,11 @@ public function testWithPrivateDomainValid() public function testWithICANNDomainInvalid() { $domain = $this->rules->resolve('private.ulb.ac.be'); - $this->assertSame('private.ulb.ac.be', $domain->getContent()); - $this->assertTrue($domain->isKnown()); - $this->assertTrue($domain->isICANN()); - $this->assertFalse($domain->isPrivate()); - $this->assertSame('ac.be', $domain->getPublicSuffix()); + self::assertSame('private.ulb.ac.be', $domain->getContent()); + self::assertTrue($domain->isKnown()); + self::assertTrue($domain->isICANN()); + self::assertFalse($domain->isPrivate()); + self::assertSame('ac.be', $domain->getPublicSuffix()); } /** @@ -313,12 +313,12 @@ public function testWithDomainObject() { $domain = new Domain('private.ulb.ac.be', new PublicSuffix('ac.be', Rules::ICANN_DOMAINS)); $newDomain = $this->rules->resolve($domain); - $this->assertSame('private.ulb.ac.be', $domain->getContent()); - $this->assertTrue($domain->isKnown()); - $this->assertTrue($domain->isICANN()); - $this->assertFalse($domain->isPrivate()); - $this->assertSame('ac.be', $domain->getPublicSuffix()); - $this->assertSame($domain, $newDomain); + self::assertSame('private.ulb.ac.be', $domain->getContent()); + self::assertTrue($domain->isKnown()); + self::assertTrue($domain->isICANN()); + self::assertFalse($domain->isPrivate()); + self::assertSame('ac.be', $domain->getPublicSuffix()); + self::assertSame($domain, $newDomain); } /** @@ -327,7 +327,7 @@ public function testWithDomainObject() */ public function testWithDomainInterfaceObject() { - $this->assertSame( + self::assertSame( 'ac.be', $this->rules->getPublicSuffix(new PublicSuffix('ul.ac.be', Rules::ICANN_DOMAINS))->getContent() ); @@ -339,14 +339,10 @@ public function testWithDomainInterfaceObject() * @covers \Pdp\Domain::getRegistrableDomain * @dataProvider parseDataProvider * - * @param mixed $publicSuffix - * @param mixed $registrableDomain - * @param mixed $domain - * @param mixed $expectedDomain */ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) { - $this->assertSame($registrableDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getRegistrableDomain()); + self::assertSame($registrableDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getRegistrableDomain()); } /** @@ -356,14 +352,10 @@ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $dom * @covers \Pdp\Domain::getPublicSuffix * @dataProvider parseDataProvider * - * @param mixed $publicSuffix - * @param mixed $registrableDomain - * @param mixed $domain - * @param mixed $expectedDomain */ public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, $expectedDomain) { - $this->assertSame($publicSuffix, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getPublicSuffix()); + self::assertSame($publicSuffix, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getPublicSuffix()); } /** @@ -373,14 +365,10 @@ public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, * @covers \Pdp\Domain::getContent * @dataProvider parseDataProvider * - * @param mixed $publicSuffix - * @param mixed $registrableDomain - * @param mixed $domain - * @param mixed $expectedDomain */ public function testGetDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) { - $this->assertSame($expectedDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getContent()); + self::assertSame($expectedDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getContent()); } public function parseDataProvider() @@ -416,12 +404,10 @@ public function parseDataProvider() * @covers \Pdp\IDNAConverterTrait::setLabels * @dataProvider invalidParseProvider * - * @param mixed $domain - * @param mixed $section */ public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix($domain, $section) { - $this->expectException(CouldNotResolvePublicSuffix::class); + self::expectException(CouldNotResolvePublicSuffix::class); $this->rules->getPublicSuffix($domain, $section); } @@ -441,12 +427,10 @@ public function invalidParseProvider() * @covers \Pdp\IDNAConverterTrait::setLabels * @dataProvider invalidDomainParseProvider * - * @param mixed $domain - * @param mixed $section */ public function testGetPublicSuffixThrowsInvalidDomainException($domain, $section) { - $this->expectException(InvalidDomain::class); + self::expectException(InvalidDomain::class); $this->rules->getPublicSuffix($domain, $section); } @@ -479,7 +463,7 @@ public function invalidDomainParseProvider() public function testPublicSuffixSection($domain, $expected) { $publicSuffix = $this->rules->getPublicSuffix($domain); - $this->assertSame($expected, $publicSuffix->getContent()); + self::assertSame($expected, $publicSuffix->getContent()); } public function validPublicSectionProvider() @@ -515,7 +499,7 @@ public function validPublicSectionProvider() */ public function checkPublicSuffix($input, $expected) { - $this->assertSame($expected, $this->rules->resolve($input)->getRegistrableDomain()); + self::assertSame($expected, $this->rules->resolve($input)->getRegistrableDomain()); } /** diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php new file mode 100644 index 00000000..8d24fca2 --- /dev/null +++ b/tests/TopLevelDomainsTest.php @@ -0,0 +1,260 @@ +collection = $manager->getTLDs(); + } + + /** + * @covers ::createFromPath + * @covers ::createFromString + * @covers ::__construct + */ + public function testCreateFromPath() + { + $context = stream_context_create([ + 'http'=> [ + 'method' => 'GET', + 'header' => "Accept-language: en\r\nCookie: foo=bar\r\n", + ], + ]); + + $collection = TopLevelDomains::createFromPath(__DIR__.'/data/root_zones.dat', $context); + self::assertInstanceOf(TopLevelDomains::class, $collection); + } + + /** + * @covers ::createFromPath + */ + public function testCreateFromPathThrowsException() + { + self::expectException(Exception::class); + TopLevelDomains::createFromPath('/foo/bar.dat'); + } + + /** + * @covers ::createFromArray + */ + public function testCreateFromArrayThrowsException() + { + self::expectException(Exception::class); + TopLevelDomains::createFromArray(['/foo/bar.dat']); + } + + /** + * @covers ::__set_state + * @covers ::__construct + */ + public function testSetState() + { + $collection = eval('return '.var_export($this->collection, true).';'); + self::assertEquals($this->collection, $collection); + } + + public function testGetterProperties() + { + $collection = TopLevelDomains::createFromPath(__DIR__.'/data/root_zones.dat'); + self::assertCount(15, $collection); + self::assertSame('2018082200', $collection->getVersion()); + self::assertEquals( + new DateTimeImmutable('2018-08-22 07:07:01', new DateTimeZone('UTC')), + $collection->getLastUpdate() + ); + self::assertFalse($collection->isEmpty()); + + $converter = new Converter(); + $data = $converter->convertRootZoneDatabase(file_get_contents(__DIR__.'/data/root_zones.dat')); + self::assertEquals($data, $collection->toArray()); + + foreach ($collection as $tld) { + self::assertInstanceOf(PublicSuffix::class, $tld); + } + } + + /** + * @dataProvider validDomainProvider + */ + public function testResolve($tld) + { + self::assertSame( + (new Domain($tld))->getLabel(0), + $this->collection->resolve($tld)->getPublicSuffix() + ); + } + + public function validDomainProvider() + { + return [ + 'simple domain' => ['GOOGLE.COM'], + 'case insensitive domain (1)' => ['GooGlE.com'], + 'case insensitive domain (2)' => ['gooGle.coM'], + 'case insensitive domain (3)' => ['GooGLE.CoM'], + 'IDN to ASCII domain' => ['GOOGLE.XN--VERMGENSBERATUNG-PWB'], + 'Unicode domain (1)' => ['الاعلى-للاتصالات.قطر'], + 'Unicode domain (2)' => ['кто.рф'], + 'Unicode domain (3)' => ['Deutsche.Vermögensberatung.vermögensberater'], + 'object with __toString method' => [new class() { + public function __toString() + { + return 'www.இந.இந்தியா'; + } + }], + ]; + } + + public function testResolveThrowsTypeError() + { + self::expectException(TypeError::class); + $this->collection->resolve(new DateTimeImmutable()); + } + + public function testResolveWithInvalidDomain() + { + self::assertEquals(new Domain(), $this->collection->resolve('###')); + } + + public function testResolveWithUnResolvableDomain() + { + $domain = 'localhost'; + self::assertEquals(new Domain($domain), $this->collection->resolve($domain)); + } + + public function testResolveWithUnregisteredTLD() + { + $collection = TopLevelDomains::createFromPath(__DIR__.'/data/root_zones.dat'); + self::assertNull($collection->resolve('localhost.locale')->getPublicSuffix()); + } + + /** + * @dataProvider validTldProvider + */ + public function testContainsReturnsTrue($tld) + { + self::assertTrue($this->collection->contains($tld)); + } + + public function validTldProvider() + { + return [ + 'simple TLD' => ['COM'], + 'case insenstive detection (1)' => ['cOm'], + 'case insenstive detection (2)' => ['CoM'], + 'case insenstive detection (3)' => ['com'], + 'IDN to ASCI TLD' => ['XN--CLCHC0EA0B2G2A9GCD'], + 'Unicode TLD (1)' => ['المغرب'], + 'Unicode TLD (2)' => ['مليسيا'], + 'Unicode TLD (3)' => ['рф'], + 'Unicode TLD (4)' => ['இந்தியா'], + 'Unicode TLD (5)' => ['vermögensberater'], + 'object with __toString method' => [new class() { + public function __toString() + { + return 'COM'; + } + }], + ]; + } + + /** + * @dataProvider invalidTldProvider + */ + public function testContainsReturnsFalse($tld) + { + self::assertFalse($this->collection->contains($tld)); + } + + public function invalidTldProvider() + { + return [ + 'invalid TLD (1)' => ['COMM'], + 'invalid TLD with leading dot' => ['.CCOM'], + 'invalid TLD case insensitive' => ['cCoM'], + 'invalid TLD case insensitive with leading dot' => ['.cCoM'], + 'invalid TLD (2)' => ['BLABLA'], + 'invalid TLD (3)' => ['CO M'], + 'invalid TLD (4)' => ['D.E'], + 'invalid Unicode TLD' => ['CÖM'], + 'invalid IDN to ASCII' => ['XN--TTT'], + 'invalid IDN to ASCII with leading dot' => ['.XN--TTT'], + 'null' => [null], + 'float' => [1.1], + 'object with __toString method' => [new class() { + public function __toString() + { + return 'COMMM'; + } + }], + ]; + } + + /** + * @covers \Pdp\Converter::convertRootZoneDatabase + * @covers \Pdp\Converter::getHeaderInfo + */ + public function testInvalidFormatToConvertWithMultipleHeader() + { + $string = << Date: Fri, 24 Aug 2018 09:43:22 +0200 Subject: [PATCH 124/461] Improve IANA Root Zone parsing and caching --- CHANGELOG.md | 5 +- ...ULL_f18a70477d29d525b9220612e2115345.cache | 2 +- src/Converter.php | 2 +- src/IDNAConverterTrait.php | 23 ++- src/Installer.php | 2 +- src/Manager.php | 141 ++++++++++-------- src/TopLevelDomains.php | 12 +- tests/DomainTest.php | 1 + tests/ManagerTest.php | 52 +++++++ tests/TopLevelDomainsTest.php | 20 +-- 10 files changed, 161 insertions(+), 99 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b5221f6..49ca29de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,10 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\Manager::getTLDs` a service to return a cache version of the IANA Root zone database - `Pdp\Manager::refreshTLDs` a service to refresh the cache version of the IANA Root zone database - `Pdp\Converter::convertRootZoneDatabase` converts the IANA Root zone database into an associative array -- `Pdp\Manager::__construct` added a new `$ttl` parameter to improve PSR-16 supports +- added a new `$ttl` parameter to improve PSR-16 supports to + - `Pdp\Manager::__construct` + - `Pdp\Manager::getRules` + - `Pdp\Manager::refreshRules` - `Pdp\Exception\CouldNotLoadTLDs` exception ### Fixed diff --git a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache index 9b1aac11..399a8aa7 100644 --- a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache +++ b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache @@ -1 +1 @@ -s:13474:"{"version":"2018082300","update":"2018-08-23T07:07:01+00:00","records":["AAA","AARP","ABARTH","ABB","ABBOTT","ABBVIE","ABC","ABLE","ABOGADO","ABUDHABI","AC","ACADEMY","ACCENTURE","ACCOUNTANT","ACCOUNTANTS","ACO","ACTIVE","ACTOR","AD","ADAC","ADS","ADULT","AE","AEG","AERO","AETNA","AF","AFAMILYCOMPANY","AFL","AFRICA","AG","AGAKHAN","AGENCY","AI","AIG","AIGO","AIRBUS","AIRFORCE","AIRTEL","AKDN","AL","ALFAROMEO","ALIBABA","ALIPAY","ALLFINANZ","ALLSTATE","ALLY","ALSACE","ALSTOM","AM","AMERICANEXPRESS","AMERICANFAMILY","AMEX","AMFAM","AMICA","AMSTERDAM","ANALYTICS","ANDROID","ANQUAN","ANZ","AO","AOL","APARTMENTS","APP","APPLE","AQ","AQUARELLE","AR","ARAB","ARAMCO","ARCHI","ARMY","ARPA","ART","ARTE","AS","ASDA","ASIA","ASSOCIATES","AT","ATHLETA","ATTORNEY","AU","AUCTION","AUDI","AUDIBLE","AUDIO","AUSPOST","AUTHOR","AUTO","AUTOS","AVIANCA","AW","AWS","AX","AXA","AZ","AZURE","BA","BABY","BAIDU","BANAMEX","BANANAREPUBLIC","BAND","BANK","BAR","BARCELONA","BARCLAYCARD","BARCLAYS","BAREFOOT","BARGAINS","BASEBALL","BASKETBALL","BAUHAUS","BAYERN","BB","BBC","BBT","BBVA","BCG","BCN","BD","BE","BEATS","BEAUTY","BEER","BENTLEY","BERLIN","BEST","BESTBUY","BET","BF","BG","BH","BHARTI","BI","BIBLE","BID","BIKE","BING","BINGO","BIO","BIZ","BJ","BLACK","BLACKFRIDAY","BLANCO","BLOCKBUSTER","BLOG","BLOOMBERG","BLUE","BM","BMS","BMW","BN","BNL","BNPPARIBAS","BO","BOATS","BOEHRINGER","BOFA","BOM","BOND","BOO","BOOK","BOOKING","BOSCH","BOSTIK","BOSTON","BOT","BOUTIQUE","BOX","BR","BRADESCO","BRIDGESTONE","BROADWAY","BROKER","BROTHER","BRUSSELS","BS","BT","BUDAPEST","BUGATTI","BUILD","BUILDERS","BUSINESS","BUY","BUZZ","BV","BW","BY","BZ","BZH","CA","CAB","CAFE","CAL","CALL","CALVINKLEIN","CAM","CAMERA","CAMP","CANCERRESEARCH","CANON","CAPETOWN","CAPITAL","CAPITALONE","CAR","CARAVAN","CARDS","CARE","CAREER","CAREERS","CARS","CARTIER","CASA","CASE","CASEIH","CASH","CASINO","CAT","CATERING","CATHOLIC","CBA","CBN","CBRE","CBS","CC","CD","CEB","CENTER","CEO","CERN","CF","CFA","CFD","CG","CH","CHANEL","CHANNEL","CHARITY","CHASE","CHAT","CHEAP","CHINTAI","CHRISTMAS","CHROME","CHRYSLER","CHURCH","CI","CIPRIANI","CIRCLE","CISCO","CITADEL","CITI","CITIC","CITY","CITYEATS","CK","CL","CLAIMS","CLEANING","CLICK","CLINIC","CLINIQUE","CLOTHING","CLOUD","CLUB","CLUBMED","CM","CN","CO","COACH","CODES","COFFEE","COLLEGE","COLOGNE","COM","COMCAST","COMMBANK","COMMUNITY","COMPANY","COMPARE","COMPUTER","COMSEC","CONDOS","CONSTRUCTION","CONSULTING","CONTACT","CONTRACTORS","COOKING","COOKINGCHANNEL","COOL","COOP","CORSICA","COUNTRY","COUPON","COUPONS","COURSES","CR","CREDIT","CREDITCARD","CREDITUNION","CRICKET","CROWN","CRS","CRUISE","CRUISES","CSC","CU","CUISINELLA","CV","CW","CX","CY","CYMRU","CYOU","CZ","DABUR","DAD","DANCE","DATA","DATE","DATING","DATSUN","DAY","DCLK","DDS","DE","DEAL","DEALER","DEALS","DEGREE","DELIVERY","DELL","DELOITTE","DELTA","DEMOCRAT","DENTAL","DENTIST","DESI","DESIGN","DEV","DHL","DIAMONDS","DIET","DIGITAL","DIRECT","DIRECTORY","DISCOUNT","DISCOVER","DISH","DIY","DJ","DK","DM","DNP","DO","DOCS","DOCTOR","DODGE","DOG","DOHA","DOMAINS","DOT","DOWNLOAD","DRIVE","DTV","DUBAI","DUCK","DUNLOP","DUNS","DUPONT","DURBAN","DVAG","DVR","DZ","EARTH","EAT","EC","ECO","EDEKA","EDU","EDUCATION","EE","EG","EMAIL","EMERCK","ENERGY","ENGINEER","ENGINEERING","ENTERPRISES","EPOST","EPSON","EQUIPMENT","ER","ERICSSON","ERNI","ES","ESQ","ESTATE","ESURANCE","ET","ETISALAT","EU","EUROVISION","EUS","EVENTS","EVERBANK","EXCHANGE","EXPERT","EXPOSED","EXPRESS","EXTRASPACE","FAGE","FAIL","FAIRWINDS","FAITH","FAMILY","FAN","FANS","FARM","FARMERS","FASHION","FAST","FEDEX","FEEDBACK","FERRARI","FERRERO","FI","FIAT","FIDELITY","FIDO","FILM","FINAL","FINANCE","FINANCIAL","FIRE","FIRESTONE","FIRMDALE","FISH","FISHING","FIT","FITNESS","FJ","FK","FLICKR","FLIGHTS","FLIR","FLORIST","FLOWERS","FLY","FM","FO","FOO","FOOD","FOODNETWORK","FOOTBALL","FORD","FOREX","FORSALE","FORUM","FOUNDATION","FOX","FR","FREE","FRESENIUS","FRL","FROGANS","FRONTDOOR","FRONTIER","FTR","FUJITSU","FUJIXEROX","FUN","FUND","FURNITURE","FUTBOL","FYI","GA","GAL","GALLERY","GALLO","GALLUP","GAME","GAMES","GAP","GARDEN","GB","GBIZ","GD","GDN","GE","GEA","GENT","GENTING","GEORGE","GF","GG","GGEE","GH","GI","GIFT","GIFTS","GIVES","GIVING","GL","GLADE","GLASS","GLE","GLOBAL","GLOBO","GM","GMAIL","GMBH","GMO","GMX","GN","GODADDY","GOLD","GOLDPOINT","GOLF","GOO","GOODHANDS","GOODYEAR","GOOG","GOOGLE","GOP","GOT","GOV","GP","GQ","GR","GRAINGER","GRAPHICS","GRATIS","GREEN","GRIPE","GROCERY","GROUP","GS","GT","GU","GUARDIAN","GUCCI","GUGE","GUIDE","GUITARS","GURU","GW","GY","HAIR","HAMBURG","HANGOUT","HAUS","HBO","HDFC","HDFCBANK","HEALTH","HEALTHCARE","HELP","HELSINKI","HERE","HERMES","HGTV","HIPHOP","HISAMITSU","HITACHI","HIV","HK","HKT","HM","HN","HOCKEY","HOLDINGS","HOLIDAY","HOMEDEPOT","HOMEGOODS","HOMES","HOMESENSE","HONDA","HONEYWELL","HORSE","HOSPITAL","HOST","HOSTING","HOT","HOTELES","HOTELS","HOTMAIL","HOUSE","HOW","HR","HSBC","HT","HU","HUGHES","HYATT","HYUNDAI","IBM","ICBC","ICE","ICU","ID","IE","IEEE","IFM","IKANO","IL","IM","IMAMAT","IMDB","IMMO","IMMOBILIEN","IN","INC","INDUSTRIES","INFINITI","INFO","ING","INK","INSTITUTE","INSURANCE","INSURE","INT","INTEL","INTERNATIONAL","INTUIT","INVESTMENTS","IO","IPIRANGA","IQ","IR","IRISH","IS","ISELECT","ISMAILI","IST","ISTANBUL","IT","ITAU","ITV","IVECO","JAGUAR","JAVA","JCB","JCP","JE","JEEP","JETZT","JEWELRY","JIO","JLC","JLL","JM","JMP","JNJ","JO","JOBS","JOBURG","JOT","JOY","JP","JPMORGAN","JPRS","JUEGOS","JUNIPER","KAUFEN","KDDI","KE","KERRYHOTELS","KERRYLOGISTICS","KERRYPROPERTIES","KFH","KG","KH","KI","KIA","KIM","KINDER","KINDLE","KITCHEN","KIWI","KM","KN","KOELN","KOMATSU","KOSHER","KP","KPMG","KPN","KR","KRD","KRED","KUOKGROUP","KW","KY","KYOTO","KZ","LA","LACAIXA","LADBROKES","LAMBORGHINI","LAMER","LANCASTER","LANCIA","LANCOME","LAND","LANDROVER","LANXESS","LASALLE","LAT","LATINO","LATROBE","LAW","LAWYER","LB","LC","LDS","LEASE","LECLERC","LEFRAK","LEGAL","LEGO","LEXUS","LGBT","LI","LIAISON","LIDL","LIFE","LIFEINSURANCE","LIFESTYLE","LIGHTING","LIKE","LILLY","LIMITED","LIMO","LINCOLN","LINDE","LINK","LIPSY","LIVE","LIVING","LIXIL","LK","LLC","LOAN","LOANS","LOCKER","LOCUS","LOFT","LOL","LONDON","LOTTE","LOTTO","LOVE","LPL","LPLFINANCIAL","LR","LS","LT","LTD","LTDA","LU","LUNDBECK","LUPIN","LUXE","LUXURY","LV","LY","MA","MACYS","MADRID","MAIF","MAISON","MAKEUP","MAN","MANAGEMENT","MANGO","MAP","MARKET","MARKETING","MARKETS","MARRIOTT","MARSHALLS","MASERATI","MATTEL","MBA","MC","MCKINSEY","MD","ME","MED","MEDIA","MEET","MELBOURNE","MEME","MEMORIAL","MEN","MENU","MERCKMSD","METLIFE","MG","MH","MIAMI","MICROSOFT","MIL","MINI","MINT","MIT","MITSUBISHI","MK","ML","MLB","MLS","MM","MMA","MN","MO","MOBI","MOBILE","MOBILY","MODA","MOE","MOI","MOM","MONASH","MONEY","MONSTER","MOPAR","MORMON","MORTGAGE","MOSCOW","MOTO","MOTORCYCLES","MOV","MOVIE","MOVISTAR","MP","MQ","MR","MS","MSD","MT","MTN","MTR","MU","MUSEUM","MUTUAL","MV","MW","MX","MY","MZ","NA","NAB","NADEX","NAGOYA","NAME","NATIONWIDE","NATURA","NAVY","NBA","NC","NE","NEC","NET","NETBANK","NETFLIX","NETWORK","NEUSTAR","NEW","NEWHOLLAND","NEWS","NEXT","NEXTDIRECT","NEXUS","NF","NFL","NG","NGO","NHK","NI","NICO","NIKE","NIKON","NINJA","NISSAN","NISSAY","NL","NO","NOKIA","NORTHWESTERNMUTUAL","NORTON","NOW","NOWRUZ","NOWTV","NP","NR","NRA","NRW","NTT","NU","NYC","NZ","OBI","OBSERVER","OFF","OFFICE","OKINAWA","OLAYAN","OLAYANGROUP","OLDNAVY","OLLO","OM","OMEGA","ONE","ONG","ONL","ONLINE","ONYOURSIDE","OOO","OPEN","ORACLE","ORANGE","ORG","ORGANIC","ORIGINS","OSAKA","OTSUKA","OTT","OVH","PA","PAGE","PANASONIC","PANERAI","PARIS","PARS","PARTNERS","PARTS","PARTY","PASSAGENS","PAY","PCCW","PE","PET","PF","PFIZER","PG","PH","PHARMACY","PHD","PHILIPS","PHONE","PHOTO","PHOTOGRAPHY","PHOTOS","PHYSIO","PIAGET","PICS","PICTET","PICTURES","PID","PIN","PING","PINK","PIONEER","PIZZA","PK","PL","PLACE","PLAY","PLAYSTATION","PLUMBING","PLUS","PM","PN","PNC","POHL","POKER","POLITIE","PORN","POST","PR","PRAMERICA","PRAXI","PRESS","PRIME","PRO","PROD","PRODUCTIONS","PROF","PROGRESSIVE","PROMO","PROPERTIES","PROPERTY","PROTECTION","PRU","PRUDENTIAL","PS","PT","PUB","PW","PWC","PY","QA","QPON","QUEBEC","QUEST","QVC","RACING","RADIO","RAID","RE","READ","REALESTATE","REALTOR","REALTY","RECIPES","RED","REDSTONE","REDUMBRELLA","REHAB","REISE","REISEN","REIT","RELIANCE","REN","RENT","RENTALS","REPAIR","REPORT","REPUBLICAN","REST","RESTAURANT","REVIEW","REVIEWS","REXROTH","RICH","RICHARDLI","RICOH","RIGHTATHOME","RIL","RIO","RIP","RMIT","RO","ROCHER","ROCKS","RODEO","ROGERS","ROOM","RS","RSVP","RU","RUGBY","RUHR","RUN","RW","RWE","RYUKYU","SA","SAARLAND","SAFE","SAFETY","SAKURA","SALE","SALON","SAMSCLUB","SAMSUNG","SANDVIK","SANDVIKCOROMANT","SANOFI","SAP","SARL","SAS","SAVE","SAXO","SB","SBI","SBS","SC","SCA","SCB","SCHAEFFLER","SCHMIDT","SCHOLARSHIPS","SCHOOL","SCHULE","SCHWARZ","SCIENCE","SCJOHNSON","SCOR","SCOT","SD","SE","SEARCH","SEAT","SECURE","SECURITY","SEEK","SELECT","SENER","SERVICES","SES","SEVEN","SEW","SEX","SEXY","SFR","SG","SH","SHANGRILA","SHARP","SHAW","SHELL","SHIA","SHIKSHA","SHOES","SHOP","SHOPPING","SHOUJI","SHOW","SHOWTIME","SHRIRAM","SI","SILK","SINA","SINGLES","SITE","SJ","SK","SKI","SKIN","SKY","SKYPE","SL","SLING","SM","SMART","SMILE","SN","SNCF","SO","SOCCER","SOCIAL","SOFTBANK","SOFTWARE","SOHU","SOLAR","SOLUTIONS","SONG","SONY","SOY","SPACE","SPIEGEL","SPORT","SPOT","SPREADBETTING","SR","SRL","SRT","ST","STADA","STAPLES","STAR","STARHUB","STATEBANK","STATEFARM","STATOIL","STC","STCGROUP","STOCKHOLM","STORAGE","STORE","STREAM","STUDIO","STUDY","STYLE","SU","SUCKS","SUPPLIES","SUPPLY","SUPPORT","SURF","SURGERY","SUZUKI","SV","SWATCH","SWIFTCOVER","SWISS","SX","SY","SYDNEY","SYMANTEC","SYSTEMS","SZ","TAB","TAIPEI","TALK","TAOBAO","TARGET","TATAMOTORS","TATAR","TATTOO","TAX","TAXI","TC","TCI","TD","TDK","TEAM","TECH","TECHNOLOGY","TEL","TELEFONICA","TEMASEK","TENNIS","TEVA","TF","TG","TH","THD","THEATER","THEATRE","TIAA","TICKETS","TIENDA","TIFFANY","TIPS","TIRES","TIROL","TJ","TJMAXX","TJX","TK","TKMAXX","TL","TM","TMALL","TN","TO","TODAY","TOKYO","TOOLS","TOP","TORAY","TOSHIBA","TOTAL","TOURS","TOWN","TOYOTA","TOYS","TR","TRADE","TRADING","TRAINING","TRAVEL","TRAVELCHANNEL","TRAVELERS","TRAVELERSINSURANCE","TRUST","TRV","TT","TUBE","TUI","TUNES","TUSHU","TV","TVS","TW","TZ","UA","UBANK","UBS","UCONNECT","UG","UK","UNICOM","UNIVERSITY","UNO","UOL","UPS","US","UY","UZ","VA","VACATIONS","VANA","VANGUARD","VC","VE","VEGAS","VENTURES","VERISIGN","VERSICHERUNG","VET","VG","VI","VIAJES","VIDEO","VIG","VIKING","VILLAS","VIN","VIP","VIRGIN","VISA","VISION","VISTA","VISTAPRINT","VIVA","VIVO","VLAANDEREN","VN","VODKA","VOLKSWAGEN","VOLVO","VOTE","VOTING","VOTO","VOYAGE","VU","VUELOS","WALES","WALMART","WALTER","WANG","WANGGOU","WARMAN","WATCH","WATCHES","WEATHER","WEATHERCHANNEL","WEBCAM","WEBER","WEBSITE","WED","WEDDING","WEIBO","WEIR","WF","WHOSWHO","WIEN","WIKI","WILLIAMHILL","WIN","WINDOWS","WINE","WINNERS","WME","WOLTERSKLUWER","WOODSIDE","WORK","WORKS","WORLD","WOW","WS","WTC","WTF","XBOX","XEROX","XFINITY","XIHUAN","XIN","XN--11B4C3D","XN--1CK2E1B","XN--1QQW23A","XN--2SCRJ9C","XN--30RR7Y","XN--3BST00M","XN--3DS443G","XN--3E0B707E","XN--3HCRJ9C","XN--3OQ18VL8PN36A","XN--3PXU8K","XN--42C2D9A","XN--45BR5CYL","XN--45BRJ9C","XN--45Q11C","XN--4GBRIM","XN--54B7FTA0CC","XN--55QW42G","XN--55QX5D","XN--5SU34J936BGSG","XN--5TZM5G","XN--6FRZ82G","XN--6QQ986B3XL","XN--80ADXHKS","XN--80AO21A","XN--80AQECDR1A","XN--80ASEHDB","XN--80ASWG","XN--8Y0A063A","XN--90A3AC","XN--90AE","XN--90AIS","XN--9DBQ2A","XN--9ET52U","XN--9KRT00A","XN--B4W605FERD","XN--BCK1B9A5DRE4C","XN--C1AVG","XN--C2BR7G","XN--CCK2B3B","XN--CG4BKI","XN--CLCHC0EA0B2G2A9GCD","XN--CZR694B","XN--CZRS0T","XN--CZRU2D","XN--D1ACJ3B","XN--D1ALF","XN--E1A4C","XN--ECKVDTC9D","XN--EFVY88H","XN--ESTV75G","XN--FCT429K","XN--FHBEI","XN--FIQ228C5HS","XN--FIQ64B","XN--FIQS8S","XN--FIQZ9S","XN--FJQ720A","XN--FLW351E","XN--FPCRJ9C3D","XN--FZC2C9E2C","XN--FZYS8D69UVGM","XN--G2XX48C","XN--GCKR3F0F","XN--GECRJ9C","XN--GK3AT1E","XN--H2BREG3EVE","XN--H2BRJ9C","XN--H2BRJ9C8C","XN--HXT814E","XN--I1B6B1A6A2E","XN--IMR513N","XN--IO0A7I","XN--J1AEF","XN--J1AMH","XN--J6W193G","XN--JLQ61U9W7B","XN--JVR189M","XN--KCRX77D1X4A","XN--KPRW13D","XN--KPRY57D","XN--KPU716F","XN--KPUT3I","XN--L1ACC","XN--LGBBAT1AD8J","XN--MGB9AWBF","XN--MGBA3A3EJT","XN--MGBA3A4F16A","XN--MGBA7C0BBN0A","XN--MGBAAKC7DVF","XN--MGBAAM7A8H","XN--MGBAB2BD","XN--MGBAI9AZGQP6J","XN--MGBAYH7GPA","XN--MGBB9FBPOB","XN--MGBBH1A","XN--MGBBH1A71E","XN--MGBC0A9AZCG","XN--MGBCA7DZDO","XN--MGBERP4A5D4AR","XN--MGBGU82A","XN--MGBI4ECEXP","XN--MGBPL2FH","XN--MGBT3DHD","XN--MGBTX2B","XN--MGBX4CD0AB","XN--MIX891F","XN--MK1BU44C","XN--MXTQ1M","XN--NGBC5AZD","XN--NGBE9E0A","XN--NGBRX","XN--NODE","XN--NQV7F","XN--NQV7FS00EMA","XN--NYQY26A","XN--O3CW4H","XN--OGBPF8FL","XN--OTU796D","XN--P1ACF","XN--P1AI","XN--PBT977C","XN--PGBS0DH","XN--PSSY2U","XN--Q9JYB4C","XN--QCKA1PMC","XN--QXAM","XN--RHQV96G","XN--ROVU88B","XN--RVC1E0AM3E","XN--S9BRJ9C","XN--SES554G","XN--T60B56A","XN--TCKWE","XN--TIQ49XQYJ","XN--UNUP4Y","XN--VERMGENSBERATER-CTB","XN--VERMGENSBERATUNG-PWB","XN--VHQUV","XN--VUQ861B","XN--W4R85EL8FHU5DNRA","XN--W4RS40L","XN--WGBH1C","XN--WGBL6A","XN--XHQ521B","XN--XKC2AL3HYE2A","XN--XKC2DL3A5EE0H","XN--Y9A3AQ","XN--YFRO4I67O","XN--YGBI2AMMX","XN--ZFR164B","XXX","XYZ","YACHTS","YAHOO","YAMAXUN","YANDEX","YE","YODOBASHI","YOGA","YOKOHAMA","YOU","YOUTUBE","YT","YUN","ZA","ZAPPOS","ZARA","ZERO","ZIP","ZIPPO","ZM","ZONE","ZUERICH","ZW"]}"; \ No newline at end of file +s:13474:"{"version":"2018082300","update":"2018-08-23T07:07:01+00:00","records":["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac","academy","accenture","accountant","accountants","aco","active","actor","ad","adac","ads","adult","ae","aeg","aero","aetna","af","afamilycompany","afl","africa","ag","agakhan","agency","ai","aig","aigo","airbus","airforce","airtel","akdn","al","alfaromeo","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","am","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","ao","aol","apartments","app","apple","aq","aquarelle","ar","arab","aramco","archi","army","arpa","art","arte","as","asda","asia","associates","at","athleta","attorney","au","auction","audi","audible","audio","auspost","author","auto","autos","avianca","aw","aws","ax","axa","az","azure","ba","baby","baidu","banamex","bananarepublic","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bb","bbc","bbt","bbva","bcg","bcn","bd","be","beats","beauty","beer","bentley","berlin","best","bestbuy","bet","bf","bg","bh","bharti","bi","bible","bid","bike","bing","bingo","bio","biz","bj","black","blackfriday","blanco","blockbuster","blog","bloomberg","blue","bm","bms","bmw","bn","bnl","bnpparibas","bo","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","br","bradesco","bridgestone","broadway","broker","brother","brussels","bs","bt","budapest","bugatti","build","builders","business","buy","buzz","bv","bw","by","bz","bzh","ca","cab","cafe","cal","call","calvinklein","cam","camera","camp","cancerresearch","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","cartier","casa","case","caseih","cash","casino","cat","catering","catholic","cba","cbn","cbre","cbs","cc","cd","ceb","center","ceo","cern","cf","cfa","cfd","cg","ch","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","chrysler","church","ci","cipriani","circle","cisco","citadel","citi","citic","city","cityeats","ck","cl","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","cm","cn","co","coach","codes","coffee","college","cologne","com","comcast","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cookingchannel","cool","coop","corsica","country","coupon","coupons","courses","cr","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","csc","cu","cuisinella","cv","cw","cx","cy","cymru","cyou","cz","dabur","dad","dance","data","date","dating","datsun","day","dclk","dds","de","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dj","dk","dm","dnp","do","docs","doctor","dodge","dog","doha","domains","dot","download","drive","dtv","dubai","duck","dunlop","duns","dupont","durban","dvag","dvr","dz","earth","eat","ec","eco","edeka","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","epost","epson","equipment","er","ericsson","erni","es","esq","estate","esurance","et","etisalat","eu","eurovision","eus","events","everbank","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fi","fiat","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","fj","fk","flickr","flights","flir","florist","flowers","fly","fm","fo","foo","food","foodnetwork","football","ford","forex","forsale","forum","foundation","fox","fr","free","fresenius","frl","frogans","frontdoor","frontier","ftr","fujitsu","fujixerox","fun","fund","furniture","futbol","fyi","ga","gal","gallery","gallo","gallup","game","games","gap","garden","gb","gbiz","gd","gdn","ge","gea","gent","genting","george","gf","gg","ggee","gh","gi","gift","gifts","gives","giving","gl","glade","glass","gle","global","globo","gm","gmail","gmbh","gmo","gmx","gn","godaddy","gold","goldpoint","golf","goo","goodhands","goodyear","goog","google","gop","got","gov","gp","gq","gr","grainger","graphics","gratis","green","gripe","grocery","group","gs","gt","gu","guardian","gucci","guge","guide","guitars","guru","gw","gy","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hgtv","hiphop","hisamitsu","hitachi","hiv","hk","hkt","hm","hn","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","honeywell","horse","hospital","host","hosting","hot","hoteles","hotels","hotmail","house","how","hr","hsbc","ht","hu","hughes","hyatt","hyundai","ibm","icbc","ice","icu","id","ie","ieee","ifm","ikano","il","im","imamat","imdb","immo","immobilien","in","inc","industries","infiniti","info","ing","ink","institute","insurance","insure","int","intel","international","intuit","investments","io","ipiranga","iq","ir","irish","is","iselect","ismaili","ist","istanbul","it","itau","itv","iveco","jaguar","java","jcb","jcp","je","jeep","jetzt","jewelry","jio","jlc","jll","jm","jmp","jnj","jo","jobs","joburg","jot","joy","jp","jpmorgan","jprs","juegos","juniper","kaufen","kddi","ke","kerryhotels","kerrylogistics","kerryproperties","kfh","kg","kh","ki","kia","kim","kinder","kindle","kitchen","kiwi","km","kn","koeln","komatsu","kosher","kp","kpmg","kpn","kr","krd","kred","kuokgroup","kw","ky","kyoto","kz","la","lacaixa","ladbrokes","lamborghini","lamer","lancaster","lancia","lancome","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lb","lc","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","li","liaison","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","linde","link","lipsy","live","living","lixil","lk","llc","loan","loans","locker","locus","loft","lol","london","lotte","lotto","love","lpl","lplfinancial","lr","ls","lt","ltd","ltda","lu","lundbeck","lupin","luxe","luxury","lv","ly","ma","macys","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","maserati","mattel","mba","mc","mckinsey","md","me","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","metlife","mg","mh","miami","microsoft","mil","mini","mint","mit","mitsubishi","mk","ml","mlb","mls","mm","mma","mn","mo","mobi","mobile","mobily","moda","moe","moi","mom","monash","money","monster","mopar","mormon","mortgage","moscow","moto","motorcycles","mov","movie","movistar","mp","mq","mr","ms","msd","mt","mtn","mtr","mu","museum","mutual","mv","mw","mx","my","mz","na","nab","nadex","nagoya","name","nationwide","natura","navy","nba","nc","ne","nec","net","netbank","netflix","network","neustar","new","newholland","news","next","nextdirect","nexus","nf","nfl","ng","ngo","nhk","ni","nico","nike","nikon","ninja","nissan","nissay","nl","no","nokia","northwesternmutual","norton","now","nowruz","nowtv","np","nr","nra","nrw","ntt","nu","nyc","nz","obi","observer","off","office","okinawa","olayan","olayangroup","oldnavy","ollo","om","omega","one","ong","onl","online","onyourside","ooo","open","oracle","orange","org","organic","origins","osaka","otsuka","ott","ovh","pa","page","panasonic","panerai","paris","pars","partners","parts","party","passagens","pay","pccw","pe","pet","pf","pfizer","pg","ph","pharmacy","phd","philips","phone","photo","photography","photos","physio","piaget","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","pk","pl","place","play","playstation","plumbing","plus","pm","pn","pnc","pohl","poker","politie","porn","post","pr","pramerica","praxi","press","prime","pro","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","ps","pt","pub","pw","pwc","py","qa","qpon","quebec","quest","qvc","racing","radio","raid","re","read","realestate","realtor","realty","recipes","red","redstone","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","rightathome","ril","rio","rip","rmit","ro","rocher","rocks","rodeo","rogers","room","rs","rsvp","ru","rugby","ruhr","run","rw","rwe","ryukyu","sa","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sb","sbi","sbs","sc","sca","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scjohnson","scor","scot","sd","se","search","seat","secure","security","seek","select","sener","services","ses","seven","sew","sex","sexy","sfr","sg","sh","shangrila","sharp","shaw","shell","shia","shiksha","shoes","shop","shopping","shouji","show","showtime","shriram","si","silk","sina","singles","site","sj","sk","ski","skin","sky","skype","sl","sling","sm","smart","smile","sn","sncf","so","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","space","spiegel","sport","spot","spreadbetting","sr","srl","srt","st","stada","staples","star","starhub","statebank","statefarm","statoil","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","su","sucks","supplies","supply","support","surf","surgery","suzuki","sv","swatch","swiftcover","swiss","sx","sy","sydney","symantec","systems","sz","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tc","tci","td","tdk","team","tech","technology","tel","telefonica","temasek","tennis","teva","tf","tg","th","thd","theater","theatre","tiaa","tickets","tienda","tiffany","tips","tires","tirol","tj","tjmaxx","tjx","tk","tkmaxx","tl","tm","tmall","tn","to","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","tr","trade","trading","training","travel","travelchannel","travelers","travelersinsurance","trust","trv","tt","tube","tui","tunes","tushu","tv","tvs","tw","tz","ua","ubank","ubs","uconnect","ug","uk","unicom","university","uno","uol","ups","us","uy","uz","va","vacations","vana","vanguard","vc","ve","vegas","ventures","verisign","versicherung","vet","vg","vi","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","vista","vistaprint","viva","vivo","vlaanderen","vn","vodka","volkswagen","volvo","vote","voting","voto","voyage","vu","vuelos","wales","walmart","walter","wang","wanggou","warman","watch","watches","weather","weatherchannel","webcam","weber","website","wed","wedding","weibo","weir","wf","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","ws","wtc","wtf","xbox","xerox","xfinity","xihuan","xin","xn--11b4c3d","xn--1ck2e1b","xn--1qqw23a","xn--2scrj9c","xn--30rr7y","xn--3bst00m","xn--3ds443g","xn--3e0b707e","xn--3hcrj9c","xn--3oq18vl8pn36a","xn--3pxu8k","xn--42c2d9a","xn--45br5cyl","xn--45brj9c","xn--45q11c","xn--4gbrim","xn--54b7fta0cc","xn--55qw42g","xn--55qx5d","xn--5su34j936bgsg","xn--5tzm5g","xn--6frz82g","xn--6qq986b3xl","xn--80adxhks","xn--80ao21a","xn--80aqecdr1a","xn--80asehdb","xn--80aswg","xn--8y0a063a","xn--90a3ac","xn--90ae","xn--90ais","xn--9dbq2a","xn--9et52u","xn--9krt00a","xn--b4w605ferd","xn--bck1b9a5dre4c","xn--c1avg","xn--c2br7g","xn--cck2b3b","xn--cg4bki","xn--clchc0ea0b2g2a9gcd","xn--czr694b","xn--czrs0t","xn--czru2d","xn--d1acj3b","xn--d1alf","xn--e1a4c","xn--eckvdtc9d","xn--efvy88h","xn--estv75g","xn--fct429k","xn--fhbei","xn--fiq228c5hs","xn--fiq64b","xn--fiqs8s","xn--fiqz9s","xn--fjq720a","xn--flw351e","xn--fpcrj9c3d","xn--fzc2c9e2c","xn--fzys8d69uvgm","xn--g2xx48c","xn--gckr3f0f","xn--gecrj9c","xn--gk3at1e","xn--h2breg3eve","xn--h2brj9c","xn--h2brj9c8c","xn--hxt814e","xn--i1b6b1a6a2e","xn--imr513n","xn--io0a7i","xn--j1aef","xn--j1amh","xn--j6w193g","xn--jlq61u9w7b","xn--jvr189m","xn--kcrx77d1x4a","xn--kprw13d","xn--kpry57d","xn--kpu716f","xn--kput3i","xn--l1acc","xn--lgbbat1ad8j","xn--mgb9awbf","xn--mgba3a3ejt","xn--mgba3a4f16a","xn--mgba7c0bbn0a","xn--mgbaakc7dvf","xn--mgbaam7a8h","xn--mgbab2bd","xn--mgbai9azgqp6j","xn--mgbayh7gpa","xn--mgbb9fbpob","xn--mgbbh1a","xn--mgbbh1a71e","xn--mgbc0a9azcg","xn--mgbca7dzdo","xn--mgberp4a5d4ar","xn--mgbgu82a","xn--mgbi4ecexp","xn--mgbpl2fh","xn--mgbt3dhd","xn--mgbtx2b","xn--mgbx4cd0ab","xn--mix891f","xn--mk1bu44c","xn--mxtq1m","xn--ngbc5azd","xn--ngbe9e0a","xn--ngbrx","xn--node","xn--nqv7f","xn--nqv7fs00ema","xn--nyqy26a","xn--o3cw4h","xn--ogbpf8fl","xn--otu796d","xn--p1acf","xn--p1ai","xn--pbt977c","xn--pgbs0dh","xn--pssy2u","xn--q9jyb4c","xn--qcka1pmc","xn--qxam","xn--rhqv96g","xn--rovu88b","xn--rvc1e0am3e","xn--s9brj9c","xn--ses554g","xn--t60b56a","xn--tckwe","xn--tiq49xqyj","xn--unup4y","xn--vermgensberater-ctb","xn--vermgensberatung-pwb","xn--vhquv","xn--vuq861b","xn--w4r85el8fhu5dnra","xn--w4rs40l","xn--wgbh1c","xn--wgbl6a","xn--xhq521b","xn--xkc2al3hye2a","xn--xkc2dl3a5ee0h","xn--y9a3aq","xn--yfro4i67o","xn--ygbi2ammx","xn--zfr164b","xxx","xyz","yachts","yahoo","yamaxun","yandex","ye","yodobashi","yoga","yokohama","you","youtube","yt","yun","za","zappos","zara","zero","zip","zippo","zm","zone","zuerich","zw"]}"; \ No newline at end of file diff --git a/src/Converter.php b/src/Converter.php index 40840329..e2615408 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -142,7 +142,7 @@ public function convertRootZoneDatabase(string $content): array foreach ($file as $line) { $line_content = trim($line); if (false === strpos($line_content, '#')) { - $records[] = $line_content; + $records[] = $this->idnToAscii($line_content); continue; } diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index 3c1673fd..62f3a95f 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -97,17 +97,22 @@ private static function getIdnErrors(int $error_bit): string */ private function idnToAscii(string $domain): string { + $domain = rawurldecode($domain); static $pattern = '/[^\x20-\x7f]/'; if (!preg_match($pattern, $domain)) { return strtolower($domain); } $output = idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46, $arr); - if (!$arr['errors']) { + if (0 !== $arr['errors']) { + throw new InvalidDomain(sprintf('The host `%s` is invalid : %s', $domain, self::getIdnErrors($arr['errors']))); + } + + if (false === strpos($output, '%')) { return $output; } - throw new InvalidDomain(sprintf('The host `%s` is invalid : %s', $domain, self::getIdnErrors($arr['errors']))); + throw new InvalidDomain(sprintf('The host `%s` is invalid: it contains invalid characters', $domain)); } /** @@ -120,7 +125,7 @@ private function idnToAscii(string $domain): string private function idnToUnicode(string $domain): string { $output = idn_to_utf8($domain, 0, INTL_IDNA_VARIANT_UTS46, $arr); - if (!$arr['errors']) { + if (0 === $arr['errors']) { return $output; } @@ -189,16 +194,8 @@ private function setLabels($domain = null): array throw new InvalidDomain(sprintf('The domain `%s` is invalid: the labels are malformed', $domain)); } - //if a domain name contains UTF-8 chars it must be convertible using IDNA UTS46 - $ascii_domain = idn_to_ascii($formatted_domain, 0, INTL_IDNA_VARIANT_UTS46, $arr); - if (0 !== $arr['errors']) { - throw new InvalidDomain(sprintf('The domain `%s` is invalid : %s', $domain, self::getIdnErrors($arr['errors']))); - } - - if (false === strpos($ascii_domain, '%')) { - return array_reverse(explode('.', $this->idnToUnicode($ascii_domain))); - } + $ascii_domain = $this->idnToAscii($domain); - throw new InvalidDomain(sprintf('The domain `%s` is invalid: it contains invalid characters', $domain)); + return array_reverse(explode('.', $this->idnToUnicode($ascii_domain))); } } diff --git a/src/Installer.php b/src/Installer.php index 5a2b95da..5bd3c6d8 100644 --- a/src/Installer.php +++ b/src/Installer.php @@ -99,7 +99,7 @@ private static function getVendorPath(Event $event = null) return $event->getComposer()->getConfig()->get('vendor-dir'); } - for ($i = 2; $i <= 5; $i++) { + for ($i = 1; $i <= 5; $i++) { if (is_dir($vendor = dirname(__DIR__, $i).'/vendor')) { return $vendor; } diff --git a/src/Manager.php b/src/Manager.php index 7ffb1dc4..bd68537c 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -22,6 +22,7 @@ use Pdp\Exception\CouldNotLoadTLDs; use Psr\SimpleCache\CacheInterface; use TypeError; +use const DATE_ATOM; use const FILTER_VALIDATE_INT; use const JSON_ERROR_NONE; use function filter_var; @@ -77,105 +78,82 @@ public function __construct(CacheInterface $cache, HttpClient $http, $ttl = null { $this->cache = $cache; $this->http = $http; - $this->ttl = $this->setTtl($ttl); + $this->ttl = $this->filterTtl($ttl); $this->converter = new Converter(); } - /** - * set the cache TTL. - * - * @return DateInterval|null - */ - private function setTtl($ttl) - { - if ($ttl instanceof DateInterval || null === $ttl) { - return $ttl; - } - - if ($ttl instanceof DateTimeInterface) { - return (new DateTimeImmutable('now', $ttl->getTimezone()))->diff($ttl); - } - - if (false !== ($res = filter_var($ttl, FILTER_VALIDATE_INT))) { - return new DateInterval('PT'.$res.'S'); - } - - if (is_string($ttl)) { - return DateInterval::createFromDateString($ttl); - } - - throw new TypeError(sprintf( - 'The ttl must an integer, a string or a DateInterval object %s given', - is_object($ttl) ? get_class($ttl) : gettype($ttl) - )); - } - /** * Gets the Public Suffix List Rules. * + * @param null|mixed $ttl + * * @throws CouldNotLoadRules If the PSL rules can not be loaded */ - public function getRules(string $url = self::PSL_URL): Rules + public function getRules(string $url = self::PSL_URL, $ttl = null): Rules { - $cacheKey = $this->getCacheKey('PSL', $url); - $cacheRules = $this->cache->get($cacheKey); + $key = $this->getCacheKey('PSL', $url); + $data = $this->cache->get($key); - if (null === $cacheRules && !$this->refreshRules($url)) { + if (null === $data && !$this->refreshRules($url, $ttl)) { throw new CouldNotLoadRules(sprintf('Unable to load the public suffix list rules for %s', $url)); } - $rules = json_decode($cacheRules ?? $this->cache->get($cacheKey), true); + $data = json_decode($data ?? $this->cache->get($key), true); if (JSON_ERROR_NONE === json_last_error()) { - return new Rules($rules); + return new Rules($data); } throw new CouldNotLoadRules('The public suffix list cache is corrupted: '.json_last_error_msg(), json_last_error()); } - /** - * Returns the cache key according to the source URL. - */ - private function getCacheKey(string $prefix, string $str): string - { - return $prefix.'_FULL_'.md5(strtolower($str)); - } - /** * Downloads, converts and cache the Public Suffix. * * If a local cache already exists, it will be overwritten. * * Returns true if the refresh was successful + * + * @param null|mixed $ttl */ - public function refreshRules(string $url = self::PSL_URL): bool + public function refreshRules(string $url = self::PSL_URL, $ttl = null): bool { - $body = $this->http->getContent($url); - $cacheData = $this->converter->convert($body); - $cacheKey = $this->getCacheKey('PSL', $url); + $data = $this->converter->convert($this->http->getContent($url)); + $key = $this->getCacheKey('PSL', $url); + $ttl = $this->filterTtl($ttl) ?? $this->ttl; - return $this->cache->set($cacheKey, json_encode($cacheData), $this->ttl); + return $this->cache->set($key, json_encode($data), $ttl); } /** * Gets the Public Suffix List Rules. * + * @param null|mixed $ttl + * * @throws Exception If the Top Level Domains can not be returned */ - public function getTLDs(string $url = self::RZD_URL): TopLevelDomains + public function getTLDs(string $url = self::RZD_URL, $ttl = null): TopLevelDomains { - $cacheKey = $this->getCacheKey('RZD', $url); - $cacheList = $this->cache->get($cacheKey); + $key = $this->getCacheKey('RZD', $url); + $data = $this->cache->get($key); - if (null === $cacheList && !$this->refreshTLDs($url)) { + if (null === $data && !$this->refreshTLDs($url, $ttl)) { throw new CouldNotLoadTLDs(sprintf('Unable to load the root zone database from %s', $url)); } - $data = json_decode($cacheList ?? $this->cache->get($cacheKey), true); - if (JSON_ERROR_NONE === json_last_error()) { - return TopLevelDomains::createFromArray($data); + $data = json_decode($data ?? $this->cache->get($key), true); + if (JSON_ERROR_NONE !== json_last_error()) { + throw new CouldNotLoadTLDs('The root zone database cache is corrupted: '.json_last_error_msg(), json_last_error()); + } + + if (!isset($data['records'], $data['version'], $data['update'])) { + throw new CouldNotLoadTLDs(sprintf('The root zone database cache content is corrupted')); } - throw new CouldNotLoadTLDs('The root zone database cache is corrupted: '.json_last_error_msg(), json_last_error()); + return new TopLevelDomains( + $data['records'], + $data['version'], + DateTimeImmutable::createFromFormat(DATE_ATOM, $data['update']) + ); } /** @@ -185,14 +163,53 @@ public function getTLDs(string $url = self::RZD_URL): TopLevelDomains * * Returns true if the refresh was successful * + * @param null|mixed $ttl + * * @throws Exception if the source is not validated */ - public function refreshTLDs(string $url = self::RZD_URL): bool + public function refreshTLDs(string $url = self::RZD_URL, $ttl = null): bool + { + $data = $this->converter->convertRootZoneDatabase($this->http->getContent($url)); + $key = $this->getCacheKey('RZD', $url); + $ttl = $this->filterTtl($ttl) ?? $this->ttl; + + return $this->cache->set($key, json_encode($data), $ttl); + } + + /** + * set the cache TTL. + * + * @return DateInterval|null + */ + private function filterTtl($ttl) { - $body = $this->http->getContent($url); - $cacheData = $this->converter->convertRootZoneDatabase($body); - $cacheKey = $this->getCacheKey('RZD', $url); + if ($ttl instanceof DateInterval || null === $ttl) { + return $ttl; + } + + if ($ttl instanceof DateTimeInterface) { + return (new DateTimeImmutable('now', $ttl->getTimezone()))->diff($ttl); + } + + if (false !== ($res = filter_var($ttl, FILTER_VALIDATE_INT))) { + return new DateInterval('PT'.$res.'S'); + } + + if (is_string($ttl)) { + return DateInterval::createFromDateString($ttl); + } + + throw new TypeError(sprintf( + 'The ttl must an integer, a string or a DateInterval object %s given', + is_object($ttl) ? get_class($ttl) : gettype($ttl) + )); + } - return $this->cache->set($cacheKey, json_encode($cacheData), $this->ttl); + /** + * Returns the cache key according to the source URL. + */ + private function getCacheKey(string $prefix, string $str): string + { + return sprintf('%s_FULL_%s', $prefix, md5(strtolower($str))); } } diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index c581ba08..0e5746f9 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -78,17 +78,7 @@ public static function createFromString(string $content): self $converter = $converter ?? new Converter(); - return self::createFromArray($converter->convertRootZoneDatabase($content)); - } - - /** - * Returns a new instance from a array. - */ - public static function createFromArray(array $data): self - { - if (!isset($data['records'], $data['version'], $data['update'])) { - throw new Exception(sprintf('The provided array must share the same structure returned by %s::toArray method', TopLevelDomains::class)); - } + $data = $converter->convertRootZoneDatabase($content); return new self( $data['records'], diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 25ddda5a..c881470c 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -87,6 +87,7 @@ public function provideWrongConstructor() * @dataProvider invalidDomainProvider * @covers ::__construct * @covers ::setLabels + * @covers ::idnToAscii * @covers ::getIdnErrors */ public function testToAsciiThrowsException(string $domain) diff --git a/tests/ManagerTest.php b/tests/ManagerTest.php index 59798bf3..6cc2dfc2 100644 --- a/tests/ManagerTest.php +++ b/tests/ManagerTest.php @@ -361,6 +361,58 @@ public function has($key) $manager->getTLDs(); } + /** + * @covers ::getTLDs + */ + public function testGetTLDsThrowsExceptionIfTheCacheContentIsCorrupted() + { + $cachePool = new class() implements CacheInterface { + public function get($key, $default = null) + { + return '{"foo":"bar"}'; //malformed json + } + + public function set($key, $value, $ttl = null) + { + return false; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + self::expectException(CouldNotLoadTLDs::class); + $manager = new Manager($cachePool, new CurlHttpClient()); + $manager->getTLDs(); + } + + /** * @covers \Pdp\Converter::convert * @covers \Pdp\Converter::getSection diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index 8d24fca2..f499bb0a 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -68,15 +68,6 @@ public function testCreateFromPathThrowsException() TopLevelDomains::createFromPath('/foo/bar.dat'); } - /** - * @covers ::createFromArray - */ - public function testCreateFromArrayThrowsException() - { - self::expectException(Exception::class); - TopLevelDomains::createFromArray(['/foo/bar.dat']); - } - /** * @covers ::__set_state * @covers ::__construct @@ -257,4 +248,15 @@ public function testInvalidFormatToConvertWithInvalidHeader() self::expectException(Exception::class); TopLevelDomains::createFromString($string); } + + + /** + * @covers \Pdp\Converter::convertRootZoneDatabase + * @covers \Pdp\Converter::getHeaderInfo + */ + public function testInvalidFormatToConvertWithEmptyContent() + { + self::expectException(Exception::class); + TopLevelDomains::createFromString(''); + } } From 6a857874090dd3e92e5548082cb06ba5b0050a52 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 26 Aug 2018 08:22:04 +0200 Subject: [PATCH 125/461] Decouple TLD conversion from PSL conversion --- .php_cs | 1 - CHANGELOG.md | 2 +- ...ULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- ...ULL_f18a70477d29d525b9220612e2115345.cache | 2 +- src/Converter.php | 56 ------------ src/Manager.php | 30 ++++--- src/TLDConverter.php | 88 +++++++++++++++++++ src/TopLevelDomains.php | 4 +- tests/ManagerTest.php | 13 --- tests/TLDConverterTest.php | 87 ++++++++++++++++++ tests/TopLevelDomainsTest.php | 52 +---------- 11 files changed, 199 insertions(+), 138 deletions(-) create mode 100644 src/TLDConverter.php create mode 100644 tests/TLDConverterTest.php diff --git a/.php_cs b/.php_cs index b85f917e..4bd916d2 100644 --- a/.php_cs +++ b/.php_cs @@ -43,7 +43,6 @@ return PhpCsFixer\Config::create() 'phpdoc_scalar' => true, 'phpdoc_to_comment' => true, 'phpdoc_summary' => true, - 'psr0' => true, 'psr4' => true, 'return_type_declaration' => ['space_before' => 'none'], 'single_blank_line_before_namespace' => true, diff --git a/CHANGELOG.md b/CHANGELOG.md index 49ca29de..13745005 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,9 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in ### Added - `Pdp\TopLevelDomains` to allow resolving domain againts IANA Root zone database +- `Pdp\TLDConverter` converts the IANA Root Zones database into an associative array - `Pdp\Manager::getTLDs` a service to return a cache version of the IANA Root zone database - `Pdp\Manager::refreshTLDs` a service to refresh the cache version of the IANA Root zone database -- `Pdp\Converter::convertRootZoneDatabase` converts the IANA Root zone database into an associative array - added a new `$ttl` parameter to improve PSR-16 supports to - `Pdp\Manager::__construct` - `Pdp\Manager::getRules` diff --git a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache index 10753efe..bcd50954 100644 --- a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache +++ b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache @@ -1 +1 @@ -s:108010:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"*":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastvps-server":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lmpm":{"app":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ca":{"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"ravendb":[],"barsy":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"co":{"otap":{"*":[]},"com":{"blogspot":[]},"mypi":[],"n4t":[],"nodum":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]},"zone":[]},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"app":{"hasura":[]},"community":{"ravendb":[]},"run":{"development":[],"ravendb":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"space":{"linkitools":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ai":{"nom":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file +s:108089:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"ong":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"ponpes":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastvps-server":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lmpm":{"app":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[],"cn-northwest-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ca":{"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"ravendb":[],"barsy":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"co":{"otap":{"*":[]},"com":{"blogspot":[]},"mypi":[],"n4t":[],"nodum":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]},"zone":[]},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"app":{"hasura":[]},"community":{"ravendb":[]},"run":{"development":[],"ravendb":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"space":{"linkitools":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ai":{"nom":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file diff --git a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache index 399a8aa7..504892ab 100644 --- a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache +++ b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache @@ -1 +1 @@ -s:13474:"{"version":"2018082300","update":"2018-08-23T07:07:01+00:00","records":["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac","academy","accenture","accountant","accountants","aco","active","actor","ad","adac","ads","adult","ae","aeg","aero","aetna","af","afamilycompany","afl","africa","ag","agakhan","agency","ai","aig","aigo","airbus","airforce","airtel","akdn","al","alfaromeo","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","am","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","ao","aol","apartments","app","apple","aq","aquarelle","ar","arab","aramco","archi","army","arpa","art","arte","as","asda","asia","associates","at","athleta","attorney","au","auction","audi","audible","audio","auspost","author","auto","autos","avianca","aw","aws","ax","axa","az","azure","ba","baby","baidu","banamex","bananarepublic","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bb","bbc","bbt","bbva","bcg","bcn","bd","be","beats","beauty","beer","bentley","berlin","best","bestbuy","bet","bf","bg","bh","bharti","bi","bible","bid","bike","bing","bingo","bio","biz","bj","black","blackfriday","blanco","blockbuster","blog","bloomberg","blue","bm","bms","bmw","bn","bnl","bnpparibas","bo","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","br","bradesco","bridgestone","broadway","broker","brother","brussels","bs","bt","budapest","bugatti","build","builders","business","buy","buzz","bv","bw","by","bz","bzh","ca","cab","cafe","cal","call","calvinklein","cam","camera","camp","cancerresearch","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","cartier","casa","case","caseih","cash","casino","cat","catering","catholic","cba","cbn","cbre","cbs","cc","cd","ceb","center","ceo","cern","cf","cfa","cfd","cg","ch","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","chrysler","church","ci","cipriani","circle","cisco","citadel","citi","citic","city","cityeats","ck","cl","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","cm","cn","co","coach","codes","coffee","college","cologne","com","comcast","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cookingchannel","cool","coop","corsica","country","coupon","coupons","courses","cr","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","csc","cu","cuisinella","cv","cw","cx","cy","cymru","cyou","cz","dabur","dad","dance","data","date","dating","datsun","day","dclk","dds","de","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dj","dk","dm","dnp","do","docs","doctor","dodge","dog","doha","domains","dot","download","drive","dtv","dubai","duck","dunlop","duns","dupont","durban","dvag","dvr","dz","earth","eat","ec","eco","edeka","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","epost","epson","equipment","er","ericsson","erni","es","esq","estate","esurance","et","etisalat","eu","eurovision","eus","events","everbank","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fi","fiat","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","fj","fk","flickr","flights","flir","florist","flowers","fly","fm","fo","foo","food","foodnetwork","football","ford","forex","forsale","forum","foundation","fox","fr","free","fresenius","frl","frogans","frontdoor","frontier","ftr","fujitsu","fujixerox","fun","fund","furniture","futbol","fyi","ga","gal","gallery","gallo","gallup","game","games","gap","garden","gb","gbiz","gd","gdn","ge","gea","gent","genting","george","gf","gg","ggee","gh","gi","gift","gifts","gives","giving","gl","glade","glass","gle","global","globo","gm","gmail","gmbh","gmo","gmx","gn","godaddy","gold","goldpoint","golf","goo","goodhands","goodyear","goog","google","gop","got","gov","gp","gq","gr","grainger","graphics","gratis","green","gripe","grocery","group","gs","gt","gu","guardian","gucci","guge","guide","guitars","guru","gw","gy","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hgtv","hiphop","hisamitsu","hitachi","hiv","hk","hkt","hm","hn","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","honeywell","horse","hospital","host","hosting","hot","hoteles","hotels","hotmail","house","how","hr","hsbc","ht","hu","hughes","hyatt","hyundai","ibm","icbc","ice","icu","id","ie","ieee","ifm","ikano","il","im","imamat","imdb","immo","immobilien","in","inc","industries","infiniti","info","ing","ink","institute","insurance","insure","int","intel","international","intuit","investments","io","ipiranga","iq","ir","irish","is","iselect","ismaili","ist","istanbul","it","itau","itv","iveco","jaguar","java","jcb","jcp","je","jeep","jetzt","jewelry","jio","jlc","jll","jm","jmp","jnj","jo","jobs","joburg","jot","joy","jp","jpmorgan","jprs","juegos","juniper","kaufen","kddi","ke","kerryhotels","kerrylogistics","kerryproperties","kfh","kg","kh","ki","kia","kim","kinder","kindle","kitchen","kiwi","km","kn","koeln","komatsu","kosher","kp","kpmg","kpn","kr","krd","kred","kuokgroup","kw","ky","kyoto","kz","la","lacaixa","ladbrokes","lamborghini","lamer","lancaster","lancia","lancome","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lb","lc","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","li","liaison","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","linde","link","lipsy","live","living","lixil","lk","llc","loan","loans","locker","locus","loft","lol","london","lotte","lotto","love","lpl","lplfinancial","lr","ls","lt","ltd","ltda","lu","lundbeck","lupin","luxe","luxury","lv","ly","ma","macys","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","maserati","mattel","mba","mc","mckinsey","md","me","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","metlife","mg","mh","miami","microsoft","mil","mini","mint","mit","mitsubishi","mk","ml","mlb","mls","mm","mma","mn","mo","mobi","mobile","mobily","moda","moe","moi","mom","monash","money","monster","mopar","mormon","mortgage","moscow","moto","motorcycles","mov","movie","movistar","mp","mq","mr","ms","msd","mt","mtn","mtr","mu","museum","mutual","mv","mw","mx","my","mz","na","nab","nadex","nagoya","name","nationwide","natura","navy","nba","nc","ne","nec","net","netbank","netflix","network","neustar","new","newholland","news","next","nextdirect","nexus","nf","nfl","ng","ngo","nhk","ni","nico","nike","nikon","ninja","nissan","nissay","nl","no","nokia","northwesternmutual","norton","now","nowruz","nowtv","np","nr","nra","nrw","ntt","nu","nyc","nz","obi","observer","off","office","okinawa","olayan","olayangroup","oldnavy","ollo","om","omega","one","ong","onl","online","onyourside","ooo","open","oracle","orange","org","organic","origins","osaka","otsuka","ott","ovh","pa","page","panasonic","panerai","paris","pars","partners","parts","party","passagens","pay","pccw","pe","pet","pf","pfizer","pg","ph","pharmacy","phd","philips","phone","photo","photography","photos","physio","piaget","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","pk","pl","place","play","playstation","plumbing","plus","pm","pn","pnc","pohl","poker","politie","porn","post","pr","pramerica","praxi","press","prime","pro","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","ps","pt","pub","pw","pwc","py","qa","qpon","quebec","quest","qvc","racing","radio","raid","re","read","realestate","realtor","realty","recipes","red","redstone","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","rightathome","ril","rio","rip","rmit","ro","rocher","rocks","rodeo","rogers","room","rs","rsvp","ru","rugby","ruhr","run","rw","rwe","ryukyu","sa","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sb","sbi","sbs","sc","sca","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scjohnson","scor","scot","sd","se","search","seat","secure","security","seek","select","sener","services","ses","seven","sew","sex","sexy","sfr","sg","sh","shangrila","sharp","shaw","shell","shia","shiksha","shoes","shop","shopping","shouji","show","showtime","shriram","si","silk","sina","singles","site","sj","sk","ski","skin","sky","skype","sl","sling","sm","smart","smile","sn","sncf","so","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","space","spiegel","sport","spot","spreadbetting","sr","srl","srt","st","stada","staples","star","starhub","statebank","statefarm","statoil","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","su","sucks","supplies","supply","support","surf","surgery","suzuki","sv","swatch","swiftcover","swiss","sx","sy","sydney","symantec","systems","sz","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tc","tci","td","tdk","team","tech","technology","tel","telefonica","temasek","tennis","teva","tf","tg","th","thd","theater","theatre","tiaa","tickets","tienda","tiffany","tips","tires","tirol","tj","tjmaxx","tjx","tk","tkmaxx","tl","tm","tmall","tn","to","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","tr","trade","trading","training","travel","travelchannel","travelers","travelersinsurance","trust","trv","tt","tube","tui","tunes","tushu","tv","tvs","tw","tz","ua","ubank","ubs","uconnect","ug","uk","unicom","university","uno","uol","ups","us","uy","uz","va","vacations","vana","vanguard","vc","ve","vegas","ventures","verisign","versicherung","vet","vg","vi","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","vista","vistaprint","viva","vivo","vlaanderen","vn","vodka","volkswagen","volvo","vote","voting","voto","voyage","vu","vuelos","wales","walmart","walter","wang","wanggou","warman","watch","watches","weather","weatherchannel","webcam","weber","website","wed","wedding","weibo","weir","wf","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","ws","wtc","wtf","xbox","xerox","xfinity","xihuan","xin","xn--11b4c3d","xn--1ck2e1b","xn--1qqw23a","xn--2scrj9c","xn--30rr7y","xn--3bst00m","xn--3ds443g","xn--3e0b707e","xn--3hcrj9c","xn--3oq18vl8pn36a","xn--3pxu8k","xn--42c2d9a","xn--45br5cyl","xn--45brj9c","xn--45q11c","xn--4gbrim","xn--54b7fta0cc","xn--55qw42g","xn--55qx5d","xn--5su34j936bgsg","xn--5tzm5g","xn--6frz82g","xn--6qq986b3xl","xn--80adxhks","xn--80ao21a","xn--80aqecdr1a","xn--80asehdb","xn--80aswg","xn--8y0a063a","xn--90a3ac","xn--90ae","xn--90ais","xn--9dbq2a","xn--9et52u","xn--9krt00a","xn--b4w605ferd","xn--bck1b9a5dre4c","xn--c1avg","xn--c2br7g","xn--cck2b3b","xn--cg4bki","xn--clchc0ea0b2g2a9gcd","xn--czr694b","xn--czrs0t","xn--czru2d","xn--d1acj3b","xn--d1alf","xn--e1a4c","xn--eckvdtc9d","xn--efvy88h","xn--estv75g","xn--fct429k","xn--fhbei","xn--fiq228c5hs","xn--fiq64b","xn--fiqs8s","xn--fiqz9s","xn--fjq720a","xn--flw351e","xn--fpcrj9c3d","xn--fzc2c9e2c","xn--fzys8d69uvgm","xn--g2xx48c","xn--gckr3f0f","xn--gecrj9c","xn--gk3at1e","xn--h2breg3eve","xn--h2brj9c","xn--h2brj9c8c","xn--hxt814e","xn--i1b6b1a6a2e","xn--imr513n","xn--io0a7i","xn--j1aef","xn--j1amh","xn--j6w193g","xn--jlq61u9w7b","xn--jvr189m","xn--kcrx77d1x4a","xn--kprw13d","xn--kpry57d","xn--kpu716f","xn--kput3i","xn--l1acc","xn--lgbbat1ad8j","xn--mgb9awbf","xn--mgba3a3ejt","xn--mgba3a4f16a","xn--mgba7c0bbn0a","xn--mgbaakc7dvf","xn--mgbaam7a8h","xn--mgbab2bd","xn--mgbai9azgqp6j","xn--mgbayh7gpa","xn--mgbb9fbpob","xn--mgbbh1a","xn--mgbbh1a71e","xn--mgbc0a9azcg","xn--mgbca7dzdo","xn--mgberp4a5d4ar","xn--mgbgu82a","xn--mgbi4ecexp","xn--mgbpl2fh","xn--mgbt3dhd","xn--mgbtx2b","xn--mgbx4cd0ab","xn--mix891f","xn--mk1bu44c","xn--mxtq1m","xn--ngbc5azd","xn--ngbe9e0a","xn--ngbrx","xn--node","xn--nqv7f","xn--nqv7fs00ema","xn--nyqy26a","xn--o3cw4h","xn--ogbpf8fl","xn--otu796d","xn--p1acf","xn--p1ai","xn--pbt977c","xn--pgbs0dh","xn--pssy2u","xn--q9jyb4c","xn--qcka1pmc","xn--qxam","xn--rhqv96g","xn--rovu88b","xn--rvc1e0am3e","xn--s9brj9c","xn--ses554g","xn--t60b56a","xn--tckwe","xn--tiq49xqyj","xn--unup4y","xn--vermgensberater-ctb","xn--vermgensberatung-pwb","xn--vhquv","xn--vuq861b","xn--w4r85el8fhu5dnra","xn--w4rs40l","xn--wgbh1c","xn--wgbl6a","xn--xhq521b","xn--xkc2al3hye2a","xn--xkc2dl3a5ee0h","xn--y9a3aq","xn--yfro4i67o","xn--ygbi2ammx","xn--zfr164b","xxx","xyz","yachts","yahoo","yamaxun","yandex","ye","yodobashi","yoga","yokohama","you","youtube","yt","yun","za","zappos","zara","zero","zip","zippo","zm","zone","zuerich","zw"]}"; \ No newline at end of file +s:13474:"{"version":"2018082400","update":"2018-08-24T07:07:01+00:00","records":["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac","academy","accenture","accountant","accountants","aco","active","actor","ad","adac","ads","adult","ae","aeg","aero","aetna","af","afamilycompany","afl","africa","ag","agakhan","agency","ai","aig","aigo","airbus","airforce","airtel","akdn","al","alfaromeo","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","am","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","ao","aol","apartments","app","apple","aq","aquarelle","ar","arab","aramco","archi","army","arpa","art","arte","as","asda","asia","associates","at","athleta","attorney","au","auction","audi","audible","audio","auspost","author","auto","autos","avianca","aw","aws","ax","axa","az","azure","ba","baby","baidu","banamex","bananarepublic","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bb","bbc","bbt","bbva","bcg","bcn","bd","be","beats","beauty","beer","bentley","berlin","best","bestbuy","bet","bf","bg","bh","bharti","bi","bible","bid","bike","bing","bingo","bio","biz","bj","black","blackfriday","blanco","blockbuster","blog","bloomberg","blue","bm","bms","bmw","bn","bnl","bnpparibas","bo","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","br","bradesco","bridgestone","broadway","broker","brother","brussels","bs","bt","budapest","bugatti","build","builders","business","buy","buzz","bv","bw","by","bz","bzh","ca","cab","cafe","cal","call","calvinklein","cam","camera","camp","cancerresearch","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","cartier","casa","case","caseih","cash","casino","cat","catering","catholic","cba","cbn","cbre","cbs","cc","cd","ceb","center","ceo","cern","cf","cfa","cfd","cg","ch","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","chrysler","church","ci","cipriani","circle","cisco","citadel","citi","citic","city","cityeats","ck","cl","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","cm","cn","co","coach","codes","coffee","college","cologne","com","comcast","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cookingchannel","cool","coop","corsica","country","coupon","coupons","courses","cr","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","csc","cu","cuisinella","cv","cw","cx","cy","cymru","cyou","cz","dabur","dad","dance","data","date","dating","datsun","day","dclk","dds","de","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dj","dk","dm","dnp","do","docs","doctor","dodge","dog","doha","domains","dot","download","drive","dtv","dubai","duck","dunlop","duns","dupont","durban","dvag","dvr","dz","earth","eat","ec","eco","edeka","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","epost","epson","equipment","er","ericsson","erni","es","esq","estate","esurance","et","etisalat","eu","eurovision","eus","events","everbank","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fi","fiat","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","fj","fk","flickr","flights","flir","florist","flowers","fly","fm","fo","foo","food","foodnetwork","football","ford","forex","forsale","forum","foundation","fox","fr","free","fresenius","frl","frogans","frontdoor","frontier","ftr","fujitsu","fujixerox","fun","fund","furniture","futbol","fyi","ga","gal","gallery","gallo","gallup","game","games","gap","garden","gb","gbiz","gd","gdn","ge","gea","gent","genting","george","gf","gg","ggee","gh","gi","gift","gifts","gives","giving","gl","glade","glass","gle","global","globo","gm","gmail","gmbh","gmo","gmx","gn","godaddy","gold","goldpoint","golf","goo","goodhands","goodyear","goog","google","gop","got","gov","gp","gq","gr","grainger","graphics","gratis","green","gripe","grocery","group","gs","gt","gu","guardian","gucci","guge","guide","guitars","guru","gw","gy","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hgtv","hiphop","hisamitsu","hitachi","hiv","hk","hkt","hm","hn","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","honeywell","horse","hospital","host","hosting","hot","hoteles","hotels","hotmail","house","how","hr","hsbc","ht","hu","hughes","hyatt","hyundai","ibm","icbc","ice","icu","id","ie","ieee","ifm","ikano","il","im","imamat","imdb","immo","immobilien","in","inc","industries","infiniti","info","ing","ink","institute","insurance","insure","int","intel","international","intuit","investments","io","ipiranga","iq","ir","irish","is","iselect","ismaili","ist","istanbul","it","itau","itv","iveco","jaguar","java","jcb","jcp","je","jeep","jetzt","jewelry","jio","jlc","jll","jm","jmp","jnj","jo","jobs","joburg","jot","joy","jp","jpmorgan","jprs","juegos","juniper","kaufen","kddi","ke","kerryhotels","kerrylogistics","kerryproperties","kfh","kg","kh","ki","kia","kim","kinder","kindle","kitchen","kiwi","km","kn","koeln","komatsu","kosher","kp","kpmg","kpn","kr","krd","kred","kuokgroup","kw","ky","kyoto","kz","la","lacaixa","ladbrokes","lamborghini","lamer","lancaster","lancia","lancome","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lb","lc","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","li","liaison","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","linde","link","lipsy","live","living","lixil","lk","llc","loan","loans","locker","locus","loft","lol","london","lotte","lotto","love","lpl","lplfinancial","lr","ls","lt","ltd","ltda","lu","lundbeck","lupin","luxe","luxury","lv","ly","ma","macys","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","maserati","mattel","mba","mc","mckinsey","md","me","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","metlife","mg","mh","miami","microsoft","mil","mini","mint","mit","mitsubishi","mk","ml","mlb","mls","mm","mma","mn","mo","mobi","mobile","mobily","moda","moe","moi","mom","monash","money","monster","mopar","mormon","mortgage","moscow","moto","motorcycles","mov","movie","movistar","mp","mq","mr","ms","msd","mt","mtn","mtr","mu","museum","mutual","mv","mw","mx","my","mz","na","nab","nadex","nagoya","name","nationwide","natura","navy","nba","nc","ne","nec","net","netbank","netflix","network","neustar","new","newholland","news","next","nextdirect","nexus","nf","nfl","ng","ngo","nhk","ni","nico","nike","nikon","ninja","nissan","nissay","nl","no","nokia","northwesternmutual","norton","now","nowruz","nowtv","np","nr","nra","nrw","ntt","nu","nyc","nz","obi","observer","off","office","okinawa","olayan","olayangroup","oldnavy","ollo","om","omega","one","ong","onl","online","onyourside","ooo","open","oracle","orange","org","organic","origins","osaka","otsuka","ott","ovh","pa","page","panasonic","panerai","paris","pars","partners","parts","party","passagens","pay","pccw","pe","pet","pf","pfizer","pg","ph","pharmacy","phd","philips","phone","photo","photography","photos","physio","piaget","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","pk","pl","place","play","playstation","plumbing","plus","pm","pn","pnc","pohl","poker","politie","porn","post","pr","pramerica","praxi","press","prime","pro","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","ps","pt","pub","pw","pwc","py","qa","qpon","quebec","quest","qvc","racing","radio","raid","re","read","realestate","realtor","realty","recipes","red","redstone","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","rightathome","ril","rio","rip","rmit","ro","rocher","rocks","rodeo","rogers","room","rs","rsvp","ru","rugby","ruhr","run","rw","rwe","ryukyu","sa","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sb","sbi","sbs","sc","sca","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scjohnson","scor","scot","sd","se","search","seat","secure","security","seek","select","sener","services","ses","seven","sew","sex","sexy","sfr","sg","sh","shangrila","sharp","shaw","shell","shia","shiksha","shoes","shop","shopping","shouji","show","showtime","shriram","si","silk","sina","singles","site","sj","sk","ski","skin","sky","skype","sl","sling","sm","smart","smile","sn","sncf","so","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","space","spiegel","sport","spot","spreadbetting","sr","srl","srt","st","stada","staples","star","starhub","statebank","statefarm","statoil","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","su","sucks","supplies","supply","support","surf","surgery","suzuki","sv","swatch","swiftcover","swiss","sx","sy","sydney","symantec","systems","sz","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tc","tci","td","tdk","team","tech","technology","tel","telefonica","temasek","tennis","teva","tf","tg","th","thd","theater","theatre","tiaa","tickets","tienda","tiffany","tips","tires","tirol","tj","tjmaxx","tjx","tk","tkmaxx","tl","tm","tmall","tn","to","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","tr","trade","trading","training","travel","travelchannel","travelers","travelersinsurance","trust","trv","tt","tube","tui","tunes","tushu","tv","tvs","tw","tz","ua","ubank","ubs","uconnect","ug","uk","unicom","university","uno","uol","ups","us","uy","uz","va","vacations","vana","vanguard","vc","ve","vegas","ventures","verisign","versicherung","vet","vg","vi","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","vista","vistaprint","viva","vivo","vlaanderen","vn","vodka","volkswagen","volvo","vote","voting","voto","voyage","vu","vuelos","wales","walmart","walter","wang","wanggou","warman","watch","watches","weather","weatherchannel","webcam","weber","website","wed","wedding","weibo","weir","wf","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","ws","wtc","wtf","xbox","xerox","xfinity","xihuan","xin","xn--11b4c3d","xn--1ck2e1b","xn--1qqw23a","xn--2scrj9c","xn--30rr7y","xn--3bst00m","xn--3ds443g","xn--3e0b707e","xn--3hcrj9c","xn--3oq18vl8pn36a","xn--3pxu8k","xn--42c2d9a","xn--45br5cyl","xn--45brj9c","xn--45q11c","xn--4gbrim","xn--54b7fta0cc","xn--55qw42g","xn--55qx5d","xn--5su34j936bgsg","xn--5tzm5g","xn--6frz82g","xn--6qq986b3xl","xn--80adxhks","xn--80ao21a","xn--80aqecdr1a","xn--80asehdb","xn--80aswg","xn--8y0a063a","xn--90a3ac","xn--90ae","xn--90ais","xn--9dbq2a","xn--9et52u","xn--9krt00a","xn--b4w605ferd","xn--bck1b9a5dre4c","xn--c1avg","xn--c2br7g","xn--cck2b3b","xn--cg4bki","xn--clchc0ea0b2g2a9gcd","xn--czr694b","xn--czrs0t","xn--czru2d","xn--d1acj3b","xn--d1alf","xn--e1a4c","xn--eckvdtc9d","xn--efvy88h","xn--estv75g","xn--fct429k","xn--fhbei","xn--fiq228c5hs","xn--fiq64b","xn--fiqs8s","xn--fiqz9s","xn--fjq720a","xn--flw351e","xn--fpcrj9c3d","xn--fzc2c9e2c","xn--fzys8d69uvgm","xn--g2xx48c","xn--gckr3f0f","xn--gecrj9c","xn--gk3at1e","xn--h2breg3eve","xn--h2brj9c","xn--h2brj9c8c","xn--hxt814e","xn--i1b6b1a6a2e","xn--imr513n","xn--io0a7i","xn--j1aef","xn--j1amh","xn--j6w193g","xn--jlq61u9w7b","xn--jvr189m","xn--kcrx77d1x4a","xn--kprw13d","xn--kpry57d","xn--kpu716f","xn--kput3i","xn--l1acc","xn--lgbbat1ad8j","xn--mgb9awbf","xn--mgba3a3ejt","xn--mgba3a4f16a","xn--mgba7c0bbn0a","xn--mgbaakc7dvf","xn--mgbaam7a8h","xn--mgbab2bd","xn--mgbai9azgqp6j","xn--mgbayh7gpa","xn--mgbb9fbpob","xn--mgbbh1a","xn--mgbbh1a71e","xn--mgbc0a9azcg","xn--mgbca7dzdo","xn--mgberp4a5d4ar","xn--mgbgu82a","xn--mgbi4ecexp","xn--mgbpl2fh","xn--mgbt3dhd","xn--mgbtx2b","xn--mgbx4cd0ab","xn--mix891f","xn--mk1bu44c","xn--mxtq1m","xn--ngbc5azd","xn--ngbe9e0a","xn--ngbrx","xn--node","xn--nqv7f","xn--nqv7fs00ema","xn--nyqy26a","xn--o3cw4h","xn--ogbpf8fl","xn--otu796d","xn--p1acf","xn--p1ai","xn--pbt977c","xn--pgbs0dh","xn--pssy2u","xn--q9jyb4c","xn--qcka1pmc","xn--qxam","xn--rhqv96g","xn--rovu88b","xn--rvc1e0am3e","xn--s9brj9c","xn--ses554g","xn--t60b56a","xn--tckwe","xn--tiq49xqyj","xn--unup4y","xn--vermgensberater-ctb","xn--vermgensberatung-pwb","xn--vhquv","xn--vuq861b","xn--w4r85el8fhu5dnra","xn--w4rs40l","xn--wgbh1c","xn--wgbl6a","xn--xhq521b","xn--xkc2al3hye2a","xn--xkc2dl3a5ee0h","xn--y9a3aq","xn--yfro4i67o","xn--ygbi2ammx","xn--zfr164b","xxx","xyz","yachts","yahoo","yamaxun","yandex","ye","yodobashi","yoga","yokohama","you","youtube","yt","yun","za","zappos","zara","zero","zip","zippo","zm","zone","zuerich","zw"]}"; \ No newline at end of file diff --git a/src/Converter.php b/src/Converter.php index e2615408..8dded99d 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -15,16 +15,12 @@ namespace Pdp; -use DateTimeImmutable; use SplTempFileObject; -use const DATE_ATOM; use function array_pop; use function explode; use function preg_match; -use function sprintf; use function strpos; use function substr; -use function trim; /** * Public Suffix List Parser. @@ -128,56 +124,4 @@ private function addRule(array $list, array $rule_parts): array return $list; } - /** - * Converts the IANA Root Zone Database into a TopLevelDomains collection object. - */ - public function convertRootZoneDatabase(string $content): array - { - $header = []; - $records = []; - - $file = new SplTempFileObject(); - $file->fwrite($content); - $file->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); - foreach ($file as $line) { - $line_content = trim($line); - if (false === strpos($line_content, '#')) { - $records[] = $this->idnToAscii($line_content); - continue; - } - - if ([] === $header) { - $header = $this->getHeaderInfo($line_content); - continue; - } - - throw new Exception(sprintf('Invalid Version line: %s', $line_content)); - } - - if ([] === $records || [] === $header) { - throw new Exception(sprintf('No TLD or Version header found')); - } - - $header['records'] = $records; - - return $header; - } - - /** - * Extract IANA Root Zone Database header info. - */ - private function getHeaderInfo(string $content): array - { - if (preg_match('/^\# Version (?\d+), Last Updated (?.*?)$/', $content, $matches)) { - $date = DateTimeImmutable::createFromFormat('D M d H:i:s Y e', $matches['update']); - $matches['update'] = $date->format(DATE_ATOM); - - return [ - 'version' => $matches['version'], - 'update' => $matches['update'], - ]; - } - - throw new Exception(sprintf('Invalid Version line: %s', $content)); - } } diff --git a/src/Manager.php b/src/Manager.php index bd68537c..36edfd42 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -64,11 +64,6 @@ final class Manager */ private $ttl; - /** - * @var Converter; - */ - private $converter; - /** * new instance. * @@ -79,7 +74,6 @@ public function __construct(CacheInterface $cache, HttpClient $http, $ttl = null $this->cache = $cache; $this->http = $http; $this->ttl = $this->filterTtl($ttl); - $this->converter = new Converter(); } /** @@ -117,11 +111,15 @@ public function getRules(string $url = self::PSL_URL, $ttl = null): Rules */ public function refreshRules(string $url = self::PSL_URL, $ttl = null): bool { - $data = $this->converter->convert($this->http->getContent($url)); - $key = $this->getCacheKey('PSL', $url); - $ttl = $this->filterTtl($ttl) ?? $this->ttl; + static $converter; + + $converter = $converter ?? new Converter(); - return $this->cache->set($key, json_encode($data), $ttl); + return $this->cache->set( + $this->getCacheKey('PSL', $url), + json_encode($converter->convert($this->http->getContent($url))), + $this->filterTtl($ttl) ?? $this->ttl + ); } /** @@ -169,11 +167,15 @@ public function getTLDs(string $url = self::RZD_URL, $ttl = null): TopLevelDomai */ public function refreshTLDs(string $url = self::RZD_URL, $ttl = null): bool { - $data = $this->converter->convertRootZoneDatabase($this->http->getContent($url)); - $key = $this->getCacheKey('RZD', $url); - $ttl = $this->filterTtl($ttl) ?? $this->ttl; + static $converter; - return $this->cache->set($key, json_encode($data), $ttl); + $converter = $converter ?? new TLDConverter(); + + return $this->cache->set( + $this->getCacheKey('RZD', $url), + json_encode($converter->convert($this->http->getContent($url))), + $this->filterTtl($ttl) ?? $this->ttl + ); } /** diff --git a/src/TLDConverter.php b/src/TLDConverter.php new file mode 100644 index 00000000..b85cd85a --- /dev/null +++ b/src/TLDConverter.php @@ -0,0 +1,88 @@ + + */ +final class TLDConverter implements PublicSuffixListSection +{ + use IDNAConverterTrait; + + /** + * @internal + */ + const IANA_DATE_FORMAT = 'D M d H:i:s Y e'; + + /** + * Converts the IANA Root Zone Database into a TopLevelDomains associative array. + */ + public function convert(string $content): array + { + $data = []; + $file = new SplTempFileObject(); + $file->fwrite($content); + $file->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); + foreach ($file as $line) { + $line = trim($line); + if ([] === $data) { + $data = $this->getHeaderInfo($line); + continue; + } + + if (false === strpos($line, '#')) { + $data['records'][] = $this->idnToAscii($line); + continue; + } + + throw new Exception(sprintf('Invalid line content: %s', $line)); + } + + if (isset($data['version'], $data['update'], $data['records'])) { + return $data; + } + + throw new Exception(sprintf('Invalid content: TLD conversion failed')); + } + + /** + * Extract IANA Root Zone Database header info. + */ + private function getHeaderInfo(string $content): array + { + if (!preg_match('/^\# Version (?\d+), Last Updated (?.*?)$/', $content, $matches)) { + throw new Exception(sprintf('Invalid Version line: %s', $content)); + } + + return [ + 'version' => $matches['version'], + 'update' => DateTimeImmutable::createFromFormat(self::IANA_DATE_FORMAT, $matches['update']) + ->format(DATE_ATOM), + ]; + } +} diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 0e5746f9..dd413b7b 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -76,9 +76,9 @@ public static function createFromString(string $content): self { static $converter; - $converter = $converter ?? new Converter(); + $converter = $converter ?? new TLDConverter(); - $data = $converter->convertRootZoneDatabase($content); + $data = $converter->convert($content); return new self( $data['records'], diff --git a/tests/ManagerTest.php b/tests/ManagerTest.php index 6cc2dfc2..1e2d4a6e 100644 --- a/tests/ManagerTest.php +++ b/tests/ManagerTest.php @@ -21,7 +21,6 @@ use Pdp\Cache; use Pdp\Converter; use Pdp\CurlHttpClient; -use Pdp\Exception; use Pdp\Exception\CouldNotLoadRules; use Pdp\Exception\CouldNotLoadTLDs; use Pdp\Exception\InvalidDomain; @@ -412,7 +411,6 @@ public function has($key) $manager->getTLDs(); } - /** * @covers \Pdp\Converter::convert * @covers \Pdp\Converter::getSection @@ -426,17 +424,6 @@ public function testConvertThrowsExceptionWithInvalidContent() (new Converter())->convert($content); } - /** - * @covers \Pdp\Converter::convertRootZoneDatabase - * @covers \Pdp\Converter::getHeaderInfo - */ - public function testConvertRootZoneDatabaseThrowsExceptionWithInvalidContent() - { - self::expectException(Exception::class); - $content = file_get_contents(__DIR__.'/data/invalid_suffix_list_content.dat'); - (new Converter())->convertRootZoneDatabase($content); - } - /** * @dataProvider validTtlProvider */ diff --git a/tests/TLDConverterTest.php b/tests/TLDConverterTest.php new file mode 100644 index 00000000..4182a6f3 --- /dev/null +++ b/tests/TLDConverterTest.php @@ -0,0 +1,87 @@ +convert($string); + self::assertInternalType('array', $res); + self::assertArrayHasKey('version', $res); + self::assertArrayHasKey('update', $res); + self::assertArrayHasKey('records', $res); + } + + /** + * @dataProvider invalidContentProvider + * + */ + public function testConverterThrowsException(string $content) + { + self::expectException(Exception::class); + (new TLDConverter())->convert($content); + } + + /** + * @covers ::convert + * @covers ::getHeaderInfo + */ + public function invalidContentProvider() + { + $double_header = << [$double_header], + 'invalid header' => [$invalid_header], + 'empty content' => [''], + 'header not on the first line' => [$header_no_first_line], + ]; + } +} diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index f499bb0a..fc182559 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -18,12 +18,12 @@ use DateTimeImmutable; use DateTimeZone; use Pdp\Cache; -use Pdp\Converter; use Pdp\CurlHttpClient; use Pdp\Domain; use Pdp\Exception; use Pdp\Manager; use Pdp\PublicSuffix; +use Pdp\TLDConverter; use Pdp\TopLevelDomains; use PHPUnit\Framework\TestCase; use TypeError; @@ -89,8 +89,8 @@ public function testGetterProperties() ); self::assertFalse($collection->isEmpty()); - $converter = new Converter(); - $data = $converter->convertRootZoneDatabase(file_get_contents(__DIR__.'/data/root_zones.dat')); + $converter = new TLDConverter(); + $data = $converter->convert(file_get_contents(__DIR__.'/data/root_zones.dat')); self::assertEquals($data, $collection->toArray()); foreach ($collection as $tld) { @@ -213,50 +213,4 @@ public function __toString() }], ]; } - - /** - * @covers \Pdp\Converter::convertRootZoneDatabase - * @covers \Pdp\Converter::getHeaderInfo - */ - public function testInvalidFormatToConvertWithMultipleHeader() - { - $string = << Date: Sun, 26 Aug 2018 09:12:42 +0200 Subject: [PATCH 126/461] Improve Root Zone Parsing validation --- src/TLDConverter.php | 30 ++++++++++++++++++++++++------ tests/TLDConverterTest.php | 31 +++++++++++++++++++++++++------ 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/TLDConverter.php b/src/TLDConverter.php index b85cd85a..2db4aad3 100644 --- a/src/TLDConverter.php +++ b/src/TLDConverter.php @@ -30,10 +30,8 @@ * * @author Ignace Nyamagana Butera */ -final class TLDConverter implements PublicSuffixListSection +final class TLDConverter { - use IDNAConverterTrait; - /** * @internal */ @@ -41,6 +39,8 @@ final class TLDConverter implements PublicSuffixListSection /** * Converts the IANA Root Zone Database into a TopLevelDomains associative array. + * + * @throws Exception if the content is invalid or can not be correctly parsed and converted */ public function convert(string $content): array { @@ -51,12 +51,13 @@ public function convert(string $content): array foreach ($file as $line) { $line = trim($line); if ([] === $data) { - $data = $this->getHeaderInfo($line); + $data = $this->extractHeader($line); continue; } if (false === strpos($line, '#')) { - $data['records'][] = $this->idnToAscii($line); + $data['records'] = $data['records'] ?? []; + $data['records'][] = $this->extractRootZone($line); continue; } @@ -72,8 +73,10 @@ public function convert(string $content): array /** * Extract IANA Root Zone Database header info. + * + * @throws Exception if the Header line is invalid */ - private function getHeaderInfo(string $content): array + private function extractHeader(string $content): array { if (!preg_match('/^\# Version (?\d+), Last Updated (?.*?)$/', $content, $matches)) { throw new Exception(sprintf('Invalid Version line: %s', $content)); @@ -85,4 +88,19 @@ private function getHeaderInfo(string $content): array ->format(DATE_ATOM), ]; } + + /** + * Extract IANA Root Zone. + * + * @throws Exception If the Root Zone is invalid + */ + private function extractRootZone(string $content): string + { + $tld = (new PublicSuffix($content))->toAscii(); + if (1 !== $tld->count() || '' === $tld->getContent()) { + throw new Exception(sprintf('Invalid Root zone: %s', $content)); + } + + return (string) $tld; + } } diff --git a/tests/TLDConverterTest.php b/tests/TLDConverterTest.php index 4182a6f3..92b3da8d 100644 --- a/tests/TLDConverterTest.php +++ b/tests/TLDConverterTest.php @@ -20,7 +20,7 @@ use PHPUnit\Framework\TestCase; /** - * @coversDefaultClass Pdp\TopLevelDomains + * @coversDefaultClass Pdp\TLDConverter */ class TLDConverterTest extends TestCase { @@ -36,7 +36,6 @@ public function testConverter() /** * @dataProvider invalidContentProvider - * */ public function testConverterThrowsException(string $content) { @@ -44,10 +43,6 @@ public function testConverterThrowsException(string $content) (new TLDConverter())->convert($content); } - /** - * @covers ::convert - * @covers ::getHeaderInfo - */ public function invalidContentProvider() { $double_header = << [$invalid_header], 'empty content' => [''], 'header not on the first line' => [$header_no_first_line], + 'invalid tld content' => [$invalid_tld_content], + 'invalid root zone' => [$invalid_tld_content_not_root_zone], + 'empty tld' => [$invalid_tld_content_empty_tld], ]; } } From fb2f224ad4d807a497d10157ec8cd62a79993ae1 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 27 Aug 2018 08:56:06 +0200 Subject: [PATCH 127/461] change TopLevelDomains::lastUpdate to TopLevelDomains::getModifiedDate --- ...ULL_f18a70477d29d525b9220612e2115345.cache | 2 +- src/Converter.php | 10 +- src/CurlHttpClient.php | 2 +- src/Manager.php | 4 +- src/TLDConverter.php | 28 ++- src/TopLevelDomains.php | 67 ++--- tests/ConverterTest.php | 53 ++++ tests/ManagerTest.php | 229 ++++++++---------- tests/RulesTest.php | 6 +- tests/TLDConverterTest.php | 7 +- tests/TopLevelDomainsTest.php | 12 +- 11 files changed, 225 insertions(+), 195 deletions(-) create mode 100644 tests/ConverterTest.php diff --git a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache index 504892ab..f27c5df9 100644 --- a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache +++ b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache @@ -1 +1 @@ -s:13474:"{"version":"2018082400","update":"2018-08-24T07:07:01+00:00","records":["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac","academy","accenture","accountant","accountants","aco","active","actor","ad","adac","ads","adult","ae","aeg","aero","aetna","af","afamilycompany","afl","africa","ag","agakhan","agency","ai","aig","aigo","airbus","airforce","airtel","akdn","al","alfaromeo","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","am","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","ao","aol","apartments","app","apple","aq","aquarelle","ar","arab","aramco","archi","army","arpa","art","arte","as","asda","asia","associates","at","athleta","attorney","au","auction","audi","audible","audio","auspost","author","auto","autos","avianca","aw","aws","ax","axa","az","azure","ba","baby","baidu","banamex","bananarepublic","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bb","bbc","bbt","bbva","bcg","bcn","bd","be","beats","beauty","beer","bentley","berlin","best","bestbuy","bet","bf","bg","bh","bharti","bi","bible","bid","bike","bing","bingo","bio","biz","bj","black","blackfriday","blanco","blockbuster","blog","bloomberg","blue","bm","bms","bmw","bn","bnl","bnpparibas","bo","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","br","bradesco","bridgestone","broadway","broker","brother","brussels","bs","bt","budapest","bugatti","build","builders","business","buy","buzz","bv","bw","by","bz","bzh","ca","cab","cafe","cal","call","calvinklein","cam","camera","camp","cancerresearch","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","cartier","casa","case","caseih","cash","casino","cat","catering","catholic","cba","cbn","cbre","cbs","cc","cd","ceb","center","ceo","cern","cf","cfa","cfd","cg","ch","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","chrysler","church","ci","cipriani","circle","cisco","citadel","citi","citic","city","cityeats","ck","cl","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","cm","cn","co","coach","codes","coffee","college","cologne","com","comcast","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cookingchannel","cool","coop","corsica","country","coupon","coupons","courses","cr","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","csc","cu","cuisinella","cv","cw","cx","cy","cymru","cyou","cz","dabur","dad","dance","data","date","dating","datsun","day","dclk","dds","de","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dj","dk","dm","dnp","do","docs","doctor","dodge","dog","doha","domains","dot","download","drive","dtv","dubai","duck","dunlop","duns","dupont","durban","dvag","dvr","dz","earth","eat","ec","eco","edeka","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","epost","epson","equipment","er","ericsson","erni","es","esq","estate","esurance","et","etisalat","eu","eurovision","eus","events","everbank","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fi","fiat","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","fj","fk","flickr","flights","flir","florist","flowers","fly","fm","fo","foo","food","foodnetwork","football","ford","forex","forsale","forum","foundation","fox","fr","free","fresenius","frl","frogans","frontdoor","frontier","ftr","fujitsu","fujixerox","fun","fund","furniture","futbol","fyi","ga","gal","gallery","gallo","gallup","game","games","gap","garden","gb","gbiz","gd","gdn","ge","gea","gent","genting","george","gf","gg","ggee","gh","gi","gift","gifts","gives","giving","gl","glade","glass","gle","global","globo","gm","gmail","gmbh","gmo","gmx","gn","godaddy","gold","goldpoint","golf","goo","goodhands","goodyear","goog","google","gop","got","gov","gp","gq","gr","grainger","graphics","gratis","green","gripe","grocery","group","gs","gt","gu","guardian","gucci","guge","guide","guitars","guru","gw","gy","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hgtv","hiphop","hisamitsu","hitachi","hiv","hk","hkt","hm","hn","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","honeywell","horse","hospital","host","hosting","hot","hoteles","hotels","hotmail","house","how","hr","hsbc","ht","hu","hughes","hyatt","hyundai","ibm","icbc","ice","icu","id","ie","ieee","ifm","ikano","il","im","imamat","imdb","immo","immobilien","in","inc","industries","infiniti","info","ing","ink","institute","insurance","insure","int","intel","international","intuit","investments","io","ipiranga","iq","ir","irish","is","iselect","ismaili","ist","istanbul","it","itau","itv","iveco","jaguar","java","jcb","jcp","je","jeep","jetzt","jewelry","jio","jlc","jll","jm","jmp","jnj","jo","jobs","joburg","jot","joy","jp","jpmorgan","jprs","juegos","juniper","kaufen","kddi","ke","kerryhotels","kerrylogistics","kerryproperties","kfh","kg","kh","ki","kia","kim","kinder","kindle","kitchen","kiwi","km","kn","koeln","komatsu","kosher","kp","kpmg","kpn","kr","krd","kred","kuokgroup","kw","ky","kyoto","kz","la","lacaixa","ladbrokes","lamborghini","lamer","lancaster","lancia","lancome","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lb","lc","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","li","liaison","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","linde","link","lipsy","live","living","lixil","lk","llc","loan","loans","locker","locus","loft","lol","london","lotte","lotto","love","lpl","lplfinancial","lr","ls","lt","ltd","ltda","lu","lundbeck","lupin","luxe","luxury","lv","ly","ma","macys","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","maserati","mattel","mba","mc","mckinsey","md","me","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","metlife","mg","mh","miami","microsoft","mil","mini","mint","mit","mitsubishi","mk","ml","mlb","mls","mm","mma","mn","mo","mobi","mobile","mobily","moda","moe","moi","mom","monash","money","monster","mopar","mormon","mortgage","moscow","moto","motorcycles","mov","movie","movistar","mp","mq","mr","ms","msd","mt","mtn","mtr","mu","museum","mutual","mv","mw","mx","my","mz","na","nab","nadex","nagoya","name","nationwide","natura","navy","nba","nc","ne","nec","net","netbank","netflix","network","neustar","new","newholland","news","next","nextdirect","nexus","nf","nfl","ng","ngo","nhk","ni","nico","nike","nikon","ninja","nissan","nissay","nl","no","nokia","northwesternmutual","norton","now","nowruz","nowtv","np","nr","nra","nrw","ntt","nu","nyc","nz","obi","observer","off","office","okinawa","olayan","olayangroup","oldnavy","ollo","om","omega","one","ong","onl","online","onyourside","ooo","open","oracle","orange","org","organic","origins","osaka","otsuka","ott","ovh","pa","page","panasonic","panerai","paris","pars","partners","parts","party","passagens","pay","pccw","pe","pet","pf","pfizer","pg","ph","pharmacy","phd","philips","phone","photo","photography","photos","physio","piaget","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","pk","pl","place","play","playstation","plumbing","plus","pm","pn","pnc","pohl","poker","politie","porn","post","pr","pramerica","praxi","press","prime","pro","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","ps","pt","pub","pw","pwc","py","qa","qpon","quebec","quest","qvc","racing","radio","raid","re","read","realestate","realtor","realty","recipes","red","redstone","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","rightathome","ril","rio","rip","rmit","ro","rocher","rocks","rodeo","rogers","room","rs","rsvp","ru","rugby","ruhr","run","rw","rwe","ryukyu","sa","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sb","sbi","sbs","sc","sca","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scjohnson","scor","scot","sd","se","search","seat","secure","security","seek","select","sener","services","ses","seven","sew","sex","sexy","sfr","sg","sh","shangrila","sharp","shaw","shell","shia","shiksha","shoes","shop","shopping","shouji","show","showtime","shriram","si","silk","sina","singles","site","sj","sk","ski","skin","sky","skype","sl","sling","sm","smart","smile","sn","sncf","so","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","space","spiegel","sport","spot","spreadbetting","sr","srl","srt","st","stada","staples","star","starhub","statebank","statefarm","statoil","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","su","sucks","supplies","supply","support","surf","surgery","suzuki","sv","swatch","swiftcover","swiss","sx","sy","sydney","symantec","systems","sz","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tc","tci","td","tdk","team","tech","technology","tel","telefonica","temasek","tennis","teva","tf","tg","th","thd","theater","theatre","tiaa","tickets","tienda","tiffany","tips","tires","tirol","tj","tjmaxx","tjx","tk","tkmaxx","tl","tm","tmall","tn","to","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","tr","trade","trading","training","travel","travelchannel","travelers","travelersinsurance","trust","trv","tt","tube","tui","tunes","tushu","tv","tvs","tw","tz","ua","ubank","ubs","uconnect","ug","uk","unicom","university","uno","uol","ups","us","uy","uz","va","vacations","vana","vanguard","vc","ve","vegas","ventures","verisign","versicherung","vet","vg","vi","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","vista","vistaprint","viva","vivo","vlaanderen","vn","vodka","volkswagen","volvo","vote","voting","voto","voyage","vu","vuelos","wales","walmart","walter","wang","wanggou","warman","watch","watches","weather","weatherchannel","webcam","weber","website","wed","wedding","weibo","weir","wf","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","ws","wtc","wtf","xbox","xerox","xfinity","xihuan","xin","xn--11b4c3d","xn--1ck2e1b","xn--1qqw23a","xn--2scrj9c","xn--30rr7y","xn--3bst00m","xn--3ds443g","xn--3e0b707e","xn--3hcrj9c","xn--3oq18vl8pn36a","xn--3pxu8k","xn--42c2d9a","xn--45br5cyl","xn--45brj9c","xn--45q11c","xn--4gbrim","xn--54b7fta0cc","xn--55qw42g","xn--55qx5d","xn--5su34j936bgsg","xn--5tzm5g","xn--6frz82g","xn--6qq986b3xl","xn--80adxhks","xn--80ao21a","xn--80aqecdr1a","xn--80asehdb","xn--80aswg","xn--8y0a063a","xn--90a3ac","xn--90ae","xn--90ais","xn--9dbq2a","xn--9et52u","xn--9krt00a","xn--b4w605ferd","xn--bck1b9a5dre4c","xn--c1avg","xn--c2br7g","xn--cck2b3b","xn--cg4bki","xn--clchc0ea0b2g2a9gcd","xn--czr694b","xn--czrs0t","xn--czru2d","xn--d1acj3b","xn--d1alf","xn--e1a4c","xn--eckvdtc9d","xn--efvy88h","xn--estv75g","xn--fct429k","xn--fhbei","xn--fiq228c5hs","xn--fiq64b","xn--fiqs8s","xn--fiqz9s","xn--fjq720a","xn--flw351e","xn--fpcrj9c3d","xn--fzc2c9e2c","xn--fzys8d69uvgm","xn--g2xx48c","xn--gckr3f0f","xn--gecrj9c","xn--gk3at1e","xn--h2breg3eve","xn--h2brj9c","xn--h2brj9c8c","xn--hxt814e","xn--i1b6b1a6a2e","xn--imr513n","xn--io0a7i","xn--j1aef","xn--j1amh","xn--j6w193g","xn--jlq61u9w7b","xn--jvr189m","xn--kcrx77d1x4a","xn--kprw13d","xn--kpry57d","xn--kpu716f","xn--kput3i","xn--l1acc","xn--lgbbat1ad8j","xn--mgb9awbf","xn--mgba3a3ejt","xn--mgba3a4f16a","xn--mgba7c0bbn0a","xn--mgbaakc7dvf","xn--mgbaam7a8h","xn--mgbab2bd","xn--mgbai9azgqp6j","xn--mgbayh7gpa","xn--mgbb9fbpob","xn--mgbbh1a","xn--mgbbh1a71e","xn--mgbc0a9azcg","xn--mgbca7dzdo","xn--mgberp4a5d4ar","xn--mgbgu82a","xn--mgbi4ecexp","xn--mgbpl2fh","xn--mgbt3dhd","xn--mgbtx2b","xn--mgbx4cd0ab","xn--mix891f","xn--mk1bu44c","xn--mxtq1m","xn--ngbc5azd","xn--ngbe9e0a","xn--ngbrx","xn--node","xn--nqv7f","xn--nqv7fs00ema","xn--nyqy26a","xn--o3cw4h","xn--ogbpf8fl","xn--otu796d","xn--p1acf","xn--p1ai","xn--pbt977c","xn--pgbs0dh","xn--pssy2u","xn--q9jyb4c","xn--qcka1pmc","xn--qxam","xn--rhqv96g","xn--rovu88b","xn--rvc1e0am3e","xn--s9brj9c","xn--ses554g","xn--t60b56a","xn--tckwe","xn--tiq49xqyj","xn--unup4y","xn--vermgensberater-ctb","xn--vermgensberatung-pwb","xn--vhquv","xn--vuq861b","xn--w4r85el8fhu5dnra","xn--w4rs40l","xn--wgbh1c","xn--wgbl6a","xn--xhq521b","xn--xkc2al3hye2a","xn--xkc2dl3a5ee0h","xn--y9a3aq","xn--yfro4i67o","xn--ygbi2ammx","xn--zfr164b","xxx","xyz","yachts","yahoo","yamaxun","yandex","ye","yodobashi","yoga","yokohama","you","youtube","yt","yun","za","zappos","zara","zero","zip","zippo","zm","zone","zuerich","zw"]}"; \ No newline at end of file +s:13480:"{"version":"2018082501","modifiedDate":"2018-08-26T07:07:02+00:00","records":["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac","academy","accenture","accountant","accountants","aco","active","actor","ad","adac","ads","adult","ae","aeg","aero","aetna","af","afamilycompany","afl","africa","ag","agakhan","agency","ai","aig","aigo","airbus","airforce","airtel","akdn","al","alfaromeo","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","am","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","ao","aol","apartments","app","apple","aq","aquarelle","ar","arab","aramco","archi","army","arpa","art","arte","as","asda","asia","associates","at","athleta","attorney","au","auction","audi","audible","audio","auspost","author","auto","autos","avianca","aw","aws","ax","axa","az","azure","ba","baby","baidu","banamex","bananarepublic","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bb","bbc","bbt","bbva","bcg","bcn","bd","be","beats","beauty","beer","bentley","berlin","best","bestbuy","bet","bf","bg","bh","bharti","bi","bible","bid","bike","bing","bingo","bio","biz","bj","black","blackfriday","blanco","blockbuster","blog","bloomberg","blue","bm","bms","bmw","bn","bnl","bnpparibas","bo","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","br","bradesco","bridgestone","broadway","broker","brother","brussels","bs","bt","budapest","bugatti","build","builders","business","buy","buzz","bv","bw","by","bz","bzh","ca","cab","cafe","cal","call","calvinklein","cam","camera","camp","cancerresearch","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","cartier","casa","case","caseih","cash","casino","cat","catering","catholic","cba","cbn","cbre","cbs","cc","cd","ceb","center","ceo","cern","cf","cfa","cfd","cg","ch","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","chrysler","church","ci","cipriani","circle","cisco","citadel","citi","citic","city","cityeats","ck","cl","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","cm","cn","co","coach","codes","coffee","college","cologne","com","comcast","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cookingchannel","cool","coop","corsica","country","coupon","coupons","courses","cr","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","csc","cu","cuisinella","cv","cw","cx","cy","cymru","cyou","cz","dabur","dad","dance","data","date","dating","datsun","day","dclk","dds","de","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dj","dk","dm","dnp","do","docs","doctor","dodge","dog","doha","domains","dot","download","drive","dtv","dubai","duck","dunlop","duns","dupont","durban","dvag","dvr","dz","earth","eat","ec","eco","edeka","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","epost","epson","equipment","er","ericsson","erni","es","esq","estate","esurance","et","etisalat","eu","eurovision","eus","events","everbank","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fi","fiat","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","fj","fk","flickr","flights","flir","florist","flowers","fly","fm","fo","foo","food","foodnetwork","football","ford","forex","forsale","forum","foundation","fox","fr","free","fresenius","frl","frogans","frontdoor","frontier","ftr","fujitsu","fujixerox","fun","fund","furniture","futbol","fyi","ga","gal","gallery","gallo","gallup","game","games","gap","garden","gb","gbiz","gd","gdn","ge","gea","gent","genting","george","gf","gg","ggee","gh","gi","gift","gifts","gives","giving","gl","glade","glass","gle","global","globo","gm","gmail","gmbh","gmo","gmx","gn","godaddy","gold","goldpoint","golf","goo","goodhands","goodyear","goog","google","gop","got","gov","gp","gq","gr","grainger","graphics","gratis","green","gripe","grocery","group","gs","gt","gu","guardian","gucci","guge","guide","guitars","guru","gw","gy","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hgtv","hiphop","hisamitsu","hitachi","hiv","hk","hkt","hm","hn","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","honeywell","horse","hospital","host","hosting","hot","hoteles","hotels","hotmail","house","how","hr","hsbc","ht","hu","hughes","hyatt","hyundai","ibm","icbc","ice","icu","id","ie","ieee","ifm","ikano","il","im","imamat","imdb","immo","immobilien","in","inc","industries","infiniti","info","ing","ink","institute","insurance","insure","int","intel","international","intuit","investments","io","ipiranga","iq","ir","irish","is","iselect","ismaili","ist","istanbul","it","itau","itv","iveco","jaguar","java","jcb","jcp","je","jeep","jetzt","jewelry","jio","jlc","jll","jm","jmp","jnj","jo","jobs","joburg","jot","joy","jp","jpmorgan","jprs","juegos","juniper","kaufen","kddi","ke","kerryhotels","kerrylogistics","kerryproperties","kfh","kg","kh","ki","kia","kim","kinder","kindle","kitchen","kiwi","km","kn","koeln","komatsu","kosher","kp","kpmg","kpn","kr","krd","kred","kuokgroup","kw","ky","kyoto","kz","la","lacaixa","ladbrokes","lamborghini","lamer","lancaster","lancia","lancome","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lb","lc","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","li","liaison","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","linde","link","lipsy","live","living","lixil","lk","llc","loan","loans","locker","locus","loft","lol","london","lotte","lotto","love","lpl","lplfinancial","lr","ls","lt","ltd","ltda","lu","lundbeck","lupin","luxe","luxury","lv","ly","ma","macys","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","maserati","mattel","mba","mc","mckinsey","md","me","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","metlife","mg","mh","miami","microsoft","mil","mini","mint","mit","mitsubishi","mk","ml","mlb","mls","mm","mma","mn","mo","mobi","mobile","mobily","moda","moe","moi","mom","monash","money","monster","mopar","mormon","mortgage","moscow","moto","motorcycles","mov","movie","movistar","mp","mq","mr","ms","msd","mt","mtn","mtr","mu","museum","mutual","mv","mw","mx","my","mz","na","nab","nadex","nagoya","name","nationwide","natura","navy","nba","nc","ne","nec","net","netbank","netflix","network","neustar","new","newholland","news","next","nextdirect","nexus","nf","nfl","ng","ngo","nhk","ni","nico","nike","nikon","ninja","nissan","nissay","nl","no","nokia","northwesternmutual","norton","now","nowruz","nowtv","np","nr","nra","nrw","ntt","nu","nyc","nz","obi","observer","off","office","okinawa","olayan","olayangroup","oldnavy","ollo","om","omega","one","ong","onl","online","onyourside","ooo","open","oracle","orange","org","organic","origins","osaka","otsuka","ott","ovh","pa","page","panasonic","panerai","paris","pars","partners","parts","party","passagens","pay","pccw","pe","pet","pf","pfizer","pg","ph","pharmacy","phd","philips","phone","photo","photography","photos","physio","piaget","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","pk","pl","place","play","playstation","plumbing","plus","pm","pn","pnc","pohl","poker","politie","porn","post","pr","pramerica","praxi","press","prime","pro","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","ps","pt","pub","pw","pwc","py","qa","qpon","quebec","quest","qvc","racing","radio","raid","re","read","realestate","realtor","realty","recipes","red","redstone","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","rightathome","ril","rio","rip","rmit","ro","rocher","rocks","rodeo","rogers","room","rs","rsvp","ru","rugby","ruhr","run","rw","rwe","ryukyu","sa","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sb","sbi","sbs","sc","sca","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scjohnson","scor","scot","sd","se","search","seat","secure","security","seek","select","sener","services","ses","seven","sew","sex","sexy","sfr","sg","sh","shangrila","sharp","shaw","shell","shia","shiksha","shoes","shop","shopping","shouji","show","showtime","shriram","si","silk","sina","singles","site","sj","sk","ski","skin","sky","skype","sl","sling","sm","smart","smile","sn","sncf","so","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","space","spiegel","sport","spot","spreadbetting","sr","srl","srt","st","stada","staples","star","starhub","statebank","statefarm","statoil","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","su","sucks","supplies","supply","support","surf","surgery","suzuki","sv","swatch","swiftcover","swiss","sx","sy","sydney","symantec","systems","sz","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tc","tci","td","tdk","team","tech","technology","tel","telefonica","temasek","tennis","teva","tf","tg","th","thd","theater","theatre","tiaa","tickets","tienda","tiffany","tips","tires","tirol","tj","tjmaxx","tjx","tk","tkmaxx","tl","tm","tmall","tn","to","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","tr","trade","trading","training","travel","travelchannel","travelers","travelersinsurance","trust","trv","tt","tube","tui","tunes","tushu","tv","tvs","tw","tz","ua","ubank","ubs","uconnect","ug","uk","unicom","university","uno","uol","ups","us","uy","uz","va","vacations","vana","vanguard","vc","ve","vegas","ventures","verisign","versicherung","vet","vg","vi","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","vista","vistaprint","viva","vivo","vlaanderen","vn","vodka","volkswagen","volvo","vote","voting","voto","voyage","vu","vuelos","wales","walmart","walter","wang","wanggou","warman","watch","watches","weather","weatherchannel","webcam","weber","website","wed","wedding","weibo","weir","wf","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","ws","wtc","wtf","xbox","xerox","xfinity","xihuan","xin","xn--11b4c3d","xn--1ck2e1b","xn--1qqw23a","xn--2scrj9c","xn--30rr7y","xn--3bst00m","xn--3ds443g","xn--3e0b707e","xn--3hcrj9c","xn--3oq18vl8pn36a","xn--3pxu8k","xn--42c2d9a","xn--45br5cyl","xn--45brj9c","xn--45q11c","xn--4gbrim","xn--54b7fta0cc","xn--55qw42g","xn--55qx5d","xn--5su34j936bgsg","xn--5tzm5g","xn--6frz82g","xn--6qq986b3xl","xn--80adxhks","xn--80ao21a","xn--80aqecdr1a","xn--80asehdb","xn--80aswg","xn--8y0a063a","xn--90a3ac","xn--90ae","xn--90ais","xn--9dbq2a","xn--9et52u","xn--9krt00a","xn--b4w605ferd","xn--bck1b9a5dre4c","xn--c1avg","xn--c2br7g","xn--cck2b3b","xn--cg4bki","xn--clchc0ea0b2g2a9gcd","xn--czr694b","xn--czrs0t","xn--czru2d","xn--d1acj3b","xn--d1alf","xn--e1a4c","xn--eckvdtc9d","xn--efvy88h","xn--estv75g","xn--fct429k","xn--fhbei","xn--fiq228c5hs","xn--fiq64b","xn--fiqs8s","xn--fiqz9s","xn--fjq720a","xn--flw351e","xn--fpcrj9c3d","xn--fzc2c9e2c","xn--fzys8d69uvgm","xn--g2xx48c","xn--gckr3f0f","xn--gecrj9c","xn--gk3at1e","xn--h2breg3eve","xn--h2brj9c","xn--h2brj9c8c","xn--hxt814e","xn--i1b6b1a6a2e","xn--imr513n","xn--io0a7i","xn--j1aef","xn--j1amh","xn--j6w193g","xn--jlq61u9w7b","xn--jvr189m","xn--kcrx77d1x4a","xn--kprw13d","xn--kpry57d","xn--kpu716f","xn--kput3i","xn--l1acc","xn--lgbbat1ad8j","xn--mgb9awbf","xn--mgba3a3ejt","xn--mgba3a4f16a","xn--mgba7c0bbn0a","xn--mgbaakc7dvf","xn--mgbaam7a8h","xn--mgbab2bd","xn--mgbai9azgqp6j","xn--mgbayh7gpa","xn--mgbb9fbpob","xn--mgbbh1a","xn--mgbbh1a71e","xn--mgbc0a9azcg","xn--mgbca7dzdo","xn--mgberp4a5d4ar","xn--mgbgu82a","xn--mgbi4ecexp","xn--mgbpl2fh","xn--mgbt3dhd","xn--mgbtx2b","xn--mgbx4cd0ab","xn--mix891f","xn--mk1bu44c","xn--mxtq1m","xn--ngbc5azd","xn--ngbe9e0a","xn--ngbrx","xn--node","xn--nqv7f","xn--nqv7fs00ema","xn--nyqy26a","xn--o3cw4h","xn--ogbpf8fl","xn--otu796d","xn--p1acf","xn--p1ai","xn--pbt977c","xn--pgbs0dh","xn--pssy2u","xn--q9jyb4c","xn--qcka1pmc","xn--qxam","xn--rhqv96g","xn--rovu88b","xn--rvc1e0am3e","xn--s9brj9c","xn--ses554g","xn--t60b56a","xn--tckwe","xn--tiq49xqyj","xn--unup4y","xn--vermgensberater-ctb","xn--vermgensberatung-pwb","xn--vhquv","xn--vuq861b","xn--w4r85el8fhu5dnra","xn--w4rs40l","xn--wgbh1c","xn--wgbl6a","xn--xhq521b","xn--xkc2al3hye2a","xn--xkc2dl3a5ee0h","xn--y9a3aq","xn--yfro4i67o","xn--ygbi2ammx","xn--zfr164b","xxx","xyz","yachts","yahoo","yamaxun","yandex","ye","yodobashi","yoga","yokohama","you","youtube","yt","yun","za","zappos","zara","zero","zip","zippo","zm","zone","zuerich","zw"]}"; \ No newline at end of file diff --git a/src/Converter.php b/src/Converter.php index 8dded99d..2826c1e6 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -15,6 +15,7 @@ namespace Pdp; +use Pdp\Exception\CouldNotLoadRules; use SplTempFileObject; use function array_pop; use function explode; @@ -102,6 +103,8 @@ private function getSection(string $section, string $line): string * becomes the array representation of a Public Suffix List section * @param array $rule_parts One line (rule) from the Public Suffix List * exploded on '.', or the remaining portion of that array during recursion + * + * @throws Exception if The domain name is invalid */ private function addRule(array $list, array $rule_parts): array { @@ -109,8 +112,13 @@ private function addRule(array $list, array $rule_parts): array // of https://publicsuffix.org/list/ // "The domain and all rules must be canonicalized in the normal way // for hostnames - lower-case, Punycode (RFC 3492)." + try { + $tld = array_pop($rule_parts); + $rule = $this->idnToAscii($tld); + } catch (Exception $e) { + throw new CouldNotLoadRules($e->getMessage(), $e->getCode(), $e); + } - $rule = $this->idnToAscii(array_pop($rule_parts)); $isDomain = true; if (0 === strpos($rule, '!')) { $rule = substr($rule, 1); diff --git a/src/CurlHttpClient.php b/src/CurlHttpClient.php index 9d997499..6b4df0c9 100644 --- a/src/CurlHttpClient.php +++ b/src/CurlHttpClient.php @@ -47,8 +47,8 @@ public function __construct(array $options = []) CURLOPT_FAILONERROR => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_RETURNTRANSFER => true, + CURLOPT_SSL_VERIFYHOST => 0, CURLOPT_SSL_VERIFYPEER => false, - CURLOPT_SSL_VERIFYHOST => false, CURLOPT_HTTPGET => true, ]; diff --git a/src/Manager.php b/src/Manager.php index 36edfd42..cfb2fbb4 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -143,14 +143,14 @@ public function getTLDs(string $url = self::RZD_URL, $ttl = null): TopLevelDomai throw new CouldNotLoadTLDs('The root zone database cache is corrupted: '.json_last_error_msg(), json_last_error()); } - if (!isset($data['records'], $data['version'], $data['update'])) { + if (!isset($data['records'], $data['version'], $data['modifiedDate'])) { throw new CouldNotLoadTLDs(sprintf('The root zone database cache content is corrupted')); } return new TopLevelDomains( $data['records'], $data['version'], - DateTimeImmutable::createFromFormat(DATE_ATOM, $data['update']) + DateTimeImmutable::createFromFormat(DATE_ATOM, $data['modifiedDate']) ); } diff --git a/src/TLDConverter.php b/src/TLDConverter.php index 2db4aad3..987a9a2a 100644 --- a/src/TLDConverter.php +++ b/src/TLDConverter.php @@ -16,6 +16,7 @@ namespace Pdp; use DateTimeImmutable; +use Pdp\Exception\CouldNotLoadTLDs; use SplTempFileObject; use const DATE_ATOM; use function preg_match; @@ -40,7 +41,7 @@ final class TLDConverter /** * Converts the IANA Root Zone Database into a TopLevelDomains associative array. * - * @throws Exception if the content is invalid or can not be correctly parsed and converted + * @throws CouldNotLoadTLDs if the content is invalid or can not be correctly parsed and converted */ public function convert(string $content): array { @@ -61,30 +62,30 @@ public function convert(string $content): array continue; } - throw new Exception(sprintf('Invalid line content: %s', $line)); + throw new CouldNotLoadTLDs(sprintf('Invalid line content: %s', $line)); } - if (isset($data['version'], $data['update'], $data['records'])) { + if (isset($data['version'], $data['modifiedDate'], $data['records'])) { return $data; } - throw new Exception(sprintf('Invalid content: TLD conversion failed')); + throw new CouldNotLoadTLDs(sprintf('Invalid content: TLD conversion failed')); } /** * Extract IANA Root Zone Database header info. * - * @throws Exception if the Header line is invalid + * @throws CouldNotLoadTLDs if the Header line is invalid */ private function extractHeader(string $content): array { - if (!preg_match('/^\# Version (?\d+), Last Updated (?.*?)$/', $content, $matches)) { - throw new Exception(sprintf('Invalid Version line: %s', $content)); + if (!preg_match('/^\# Version (?\d+), Last Updated (?.*?)$/', $content, $matches)) { + throw new CouldNotLoadTLDs(sprintf('Invalid Version line: %s', $content)); } return [ 'version' => $matches['version'], - 'update' => DateTimeImmutable::createFromFormat(self::IANA_DATE_FORMAT, $matches['update']) + 'modifiedDate' => DateTimeImmutable::createFromFormat(self::IANA_DATE_FORMAT, $matches['date']) ->format(DATE_ATOM), ]; } @@ -92,13 +93,18 @@ private function extractHeader(string $content): array /** * Extract IANA Root Zone. * - * @throws Exception If the Root Zone is invalid + * @throws CouldNotLoadTLDs If the Root Zone is invalid */ private function extractRootZone(string $content): string { - $tld = (new PublicSuffix($content))->toAscii(); + try { + $tld = (new PublicSuffix($content))->toAscii(); + } catch (Exception $e) { + throw new CouldNotLoadTLDs(sprintf('Invalid Root zone: %s', $content), 0, $e); + } + if (1 !== $tld->count() || '' === $tld->getContent()) { - throw new Exception(sprintf('Invalid Root zone: %s', $content)); + throw new CouldNotLoadTLDs(sprintf('Invalid Root zone: %s', $content)); } return (string) $tld; diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index dd413b7b..2a88d291 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -33,7 +33,7 @@ final class TopLevelDomains implements Countable, IteratorAggregate /** * @var DateTimeImmutable */ - private $update; + private $modifiedDate; /** * @var string @@ -83,7 +83,7 @@ public static function createFromString(string $content): self return new self( $data['records'], $data['version'], - DateTimeImmutable::createFromFormat(DATE_ATOM, $data['update']) + DateTimeImmutable::createFromFormat(DATE_ATOM, $data['modifiedDate']) ); } @@ -92,17 +92,17 @@ public static function createFromString(string $content): self */ public static function __set_state(array $properties): self { - return new self($properties['records'], $properties['version'], $properties['update']); + return new self($properties['records'], $properties['version'], $properties['modifiedDate']); } /** * New instance. */ - public function __construct(array $records, string $version, DateTimeInterface $update) + public function __construct(array $records, string $version, DateTimeInterface $modifiedDate) { $this->records = $records; $this->version = $version; - $this->update = $update instanceof DateTime ? DateTimeImmutable::createFromMutable($update) : $update; + $this->modifiedDate = $modifiedDate instanceof DateTime ? DateTimeImmutable::createFromMutable($modifiedDate) : $modifiedDate; } /** @@ -114,11 +114,11 @@ public function getVersion(): string } /** - * Returns the List Last Update Info. + * Returns the List Last Modified Date. */ - public function getLastUpdate(): DateTimeImmutable + public function getModifiedDate(): DateTimeImmutable { - return $this->update; + return $this->modifiedDate; } /** @@ -155,7 +155,7 @@ public function toArray(): array return [ 'version' => $this->version, 'records' => $this->records, - 'update' => $this->update->format(DATE_ATOM), + 'modifiedDate' => $this->modifiedDate->format(DATE_ATOM), ]; } @@ -166,20 +166,22 @@ public function contains($tld): bool { try { $tld = $tld instanceof Domain ? $tld : new Domain($tld); - if (1 !== count($tld)) { - return false; - } - $label = $tld->toAscii()->getLabel(0); - foreach ($this as $tld) { - if ($tld->getContent() === $label) { - return true; - } - } - - return false; } catch (Exception $e) { return false; } + + if (1 !== count($tld)) { + return false; + } + + $label = $tld->toAscii()->getLabel(0); + foreach ($this as $tld) { + if ($tld->getContent() === $label) { + return true; + } + } + + return false; } /** @@ -189,20 +191,21 @@ public function resolve($domain): Domain { try { $domain = $domain instanceof Domain ? $domain : new Domain($domain); - if (!$domain->isResolvable()) { - return $domain; - } - - $label = $domain->toAscii()->getLabel(0); - foreach ($this as $tld) { - if ($tld->getContent() === $label) { - return $domain->resolve($tld); - } - } - - return $domain->withPublicSuffix(new PublicSuffix()); } catch (Exception $e) { return new Domain(); } + + if (!$domain->isResolvable()) { + return $domain; + } + + $label = $domain->toAscii()->getLabel(0); + foreach ($this as $tld) { + if ($tld->getContent() === $label) { + return $domain->resolve($tld); + } + } + + return $domain->resolve(null); } } diff --git a/tests/ConverterTest.php b/tests/ConverterTest.php new file mode 100644 index 00000000..d8c6cdb5 --- /dev/null +++ b/tests/ConverterTest.php @@ -0,0 +1,53 @@ +convert($string); + self::assertNotEmpty($retval[Converter::ICANN_DOMAINS]); + self::assertNotEmpty($retval[Converter::PRIVATE_DOMAINS]); + } + + public function testConvertThrowsExceptionWithInvalidContent() + { + self::expectException(CouldNotLoadRules::class); + $content = file_get_contents(__DIR__.'/data/invalid_suffix_list_content.dat'); + (new Converter())->convert($content); + } + + public function testConvertWithEmptyString() + { + $retval = (new Converter())->convert(''); + self::assertEquals([Converter::ICANN_DOMAINS => [], Converter::PRIVATE_DOMAINS => []], $retval); + } + + public function testConvertWithInvalidString() + { + $retval = (new Converter())->convert('foobar'); + self::assertEquals([Converter::ICANN_DOMAINS => [], Converter::PRIVATE_DOMAINS => []], $retval); + } +} diff --git a/tests/ManagerTest.php b/tests/ManagerTest.php index 1e2d4a6e..bffce672 100644 --- a/tests/ManagerTest.php +++ b/tests/ManagerTest.php @@ -19,11 +19,8 @@ use DateTime; use org\bovigo\vfs\vfsStream; use Pdp\Cache; -use Pdp\Converter; -use Pdp\CurlHttpClient; use Pdp\Exception\CouldNotLoadRules; use Pdp\Exception\CouldNotLoadTLDs; -use Pdp\Exception\InvalidDomain; use Pdp\HttpClient; use Pdp\Manager; use PHPUnit\Framework\TestCase; @@ -38,7 +35,7 @@ class ManagerTest extends TestCase protected $cachePool; protected $cacheDir; protected $root; - protected $sourceUrl = 'https://publicsuffix.org/list/public_suffix_list.dat'; + protected $client; public function setUp() { @@ -46,6 +43,20 @@ public function setUp() vfsStream::create(['cache' => []], $this->root); $this->cacheDir = vfsStream::url('pdp/cache'); $this->cachePool = new Cache($this->cacheDir); + $this->client = new class() implements HttpClient { + public function getContent(string $url): string + { + if ($url === Manager::PSL_URL) { + return file_get_contents(__DIR__.'/data/public_suffix_list.dat'); + } + + if ($url === Manager::RZD_URL) { + return file_get_contents(__DIR__.'/data/tlds-alpha-by-domain.txt'); + } + + return ''; + } + }; } public function tearDown() @@ -53,105 +64,71 @@ public function tearDown() $this->cachePool = null; $this->cacheDir = null; $this->root = null; + $this->client = null; } /** + * @dataProvider validTtlProvider * @covers ::__construct - * @covers ::getRules - * @covers ::getCacheKey - * @covers ::refreshRules - * @covers \Pdp\Converter + * @covers ::filterTtl */ - public function testRefreshRules() + public function testConstructor($ttl) { - $manager = new Manager($this->cachePool, new CurlHttpClient()); - $previous = $manager->getRules(); - self::assertTrue($manager->refreshRules($this->sourceUrl)); - self::assertEquals($previous, $manager->getRules()); + self::assertInstanceOf(Manager::class, new Manager($this->cachePool, $this->client, $ttl)); + } + + public function validTtlProvider() + { + return [ + 'DateInterval' => [new DateInterval('PT1H')], + 'null' => [null], + 'DateTimeInterface' => [new DateTime('+1 DAY')], + 'string' => ['7 DAYS'], + 'int' => [86000], + ]; } /** * @covers ::__construct - * @covers ::getRules - * @covers ::getCacheKey - * @covers ::refreshRules - * @covers \Pdp\Converter + * @covers ::filterTtl */ - public function testRebuildRulesFromRemoveSource() + public function testConstructorTrowsException() { - $manager = new Manager($this->cachePool, new CurlHttpClient()); - $previous = $manager->getRules($this->sourceUrl); - $this->cachePool->clear(); //delete all local cache - $list = $manager->getRules($this->sourceUrl); - self::assertEquals($previous, $manager->getRules($this->sourceUrl)); + self::expectException(TypeError::class); + new Manager($this->cachePool, $this->client, tmpfile()); } /** - * @covers ::__construct - * @covers ::getTLDs + * @covers ::getRules * @covers ::getCacheKey - * @covers ::refreshTLDs - * @covers \Pdp\Converter + * @covers ::refreshRules */ - public function testRefreshTLDs() + public function testRefreshRules() { - $client = new class() implements HttpClient { - public function getContent(string $url): string - { - if ($url === Manager::PSL_URL) { - return file_get_contents(__DIR__.'/data/public_suffix_list.dat'); - } - - if ($url === Manager::RZD_URL) { - return file_get_contents(__DIR__.'/data/tlds-alpha-by-domain.txt'); - } - - return ''; - } - }; - - $manager = new Manager($this->cachePool, $client); - $previous = $manager->getTLDs(); - self::assertTrue($manager->refreshTLDs()); - self::assertEquals($previous, $manager->getTLDs()); + $manager = new Manager($this->cachePool, $this->client); + $previous = $manager->getRules(); + self::assertTrue($manager->refreshRules()); + self::assertEquals($previous, $manager->getRules()); } /** - * @covers ::__construct - * @covers ::getTLDs + * @covers ::getRules * @covers ::getCacheKey - * @covers ::refreshTLDs - * @covers \Pdp\Converter + * @covers ::refreshRules */ - public function testRebuildTLDsFromRemoveSource() + public function testRebuildRulesFromRemoveSource() { - $client = new class() implements HttpClient { - public function getContent(string $url): string - { - if ($url === Manager::PSL_URL) { - return file_get_contents(__DIR__.'/data/public_suffix_list.dat'); - } - - if ($url === Manager::RZD_URL) { - return file_get_contents(__DIR__.'/data/tlds-alpha-by-domain.txt'); - } - - return ''; - } - }; - - $manager = new Manager($this->cachePool, $client); - $previous = $manager->getTLDs(); + $manager = new Manager($this->cachePool, $this->client); + $previous = $manager->getRules(Manager::PSL_URL); $this->cachePool->clear(); //delete all local cache - self::assertEquals($previous, $manager->getTLDs()); + $list = $manager->getRules(Manager::PSL_URL); + self::assertEquals($previous, $manager->getRules(Manager::PSL_URL)); } /** - * @covers ::__construct * @covers ::getRules * @covers ::getCacheKey * @covers ::refreshRules - * @covers \Pdp\Converter */ public function testGetRulesThrowsExceptionIfNotCacheCanBeRetrieveOrRefresh() { @@ -197,23 +174,21 @@ public function has($key) }; self::expectException(CouldNotLoadRules::class); - $manager = new Manager($cachePool, new CurlHttpClient()); + $manager = new Manager($cachePool, $this->client); $manager->getRules('https://google.com'); } /** - * @covers ::__construct - * @covers ::getTLDs + * @covers ::getRules * @covers ::getCacheKey - * @covers ::refreshTLDs - * @covers \Pdp\Converter + * @covers ::refreshRules */ - public function testGetTLDsThrowsExceptionIfNotCacheCanBeRetrieveOrRefresh() + public function testGetRulesThrowsExceptionIfTheCacheIsCorrupted() { $cachePool = new class() implements CacheInterface { public function get($key, $default = null) { - return null; + return '{"foo":"bar",}'; //malformed json } public function set($key, $value, $ttl = null) @@ -251,21 +226,48 @@ public function has($key) } }; - self::expectException(CouldNotLoadTLDs::class); - $manager = new Manager($cachePool, new CurlHttpClient()); - $manager->getTLDs(); + self::expectException(CouldNotLoadRules::class); + $manager = new Manager($cachePool, $this->client); + $manager->getRules(); } /** - * @covers ::__construct - * @covers ::getRules + * @covers ::getTLDs + * @covers ::getCacheKey + * @covers ::refreshTLDs */ - public function testGetRulesThrowsExceptionIfTheCacheIsCorrupted() + public function testRefreshTLDs() + { + $manager = new Manager($this->cachePool, $this->client); + $previous = $manager->getTLDs(); + self::assertTrue($manager->refreshTLDs()); + self::assertEquals($previous, $manager->getTLDs()); + } + + /** + * @covers ::getTLDs + * @covers ::getCacheKey + * @covers ::refreshTLDs + */ + public function testRebuildTLDsFromRemoveSource() + { + $manager = new Manager($this->cachePool, $this->client); + $previous = $manager->getTLDs(); + $this->cachePool->clear(); //delete all local cache + self::assertEquals($previous, $manager->getTLDs()); + } + + /** + * @covers ::getTLDs + * @covers ::getCacheKey + * @covers ::refreshTLDs + */ + public function testGetTLDsThrowsExceptionIfNotCacheCanBeRetrieveOrRefresh() { $cachePool = new class() implements CacheInterface { public function get($key, $default = null) { - return '{"foo":"bar",}'; //malformed json + return null; } public function set($key, $value, $ttl = null) @@ -303,14 +305,15 @@ public function has($key) } }; - self::expectException(CouldNotLoadRules::class); - $manager = new Manager($cachePool, new CurlHttpClient()); - $manager->getRules(); + self::expectException(CouldNotLoadTLDs::class); + $manager = new Manager($cachePool, $this->client); + $manager->getTLDs(); } /** - * @covers ::__construct * @covers ::getTLDs + * @covers ::getCacheKey + * @covers ::refreshTLDs */ public function testGetTLDsThrowsExceptionIfTheCacheIsCorrupted() { @@ -356,19 +359,21 @@ public function has($key) }; self::expectException(CouldNotLoadTLDs::class); - $manager = new Manager($cachePool, new CurlHttpClient()); + $manager = new Manager($cachePool, $this->client); $manager->getTLDs(); } /** * @covers ::getTLDs + * @covers ::getCacheKey + * @covers ::refreshTLDs */ public function testGetTLDsThrowsExceptionIfTheCacheContentIsCorrupted() { $cachePool = new class() implements CacheInterface { public function get($key, $default = null) { - return '{"foo":"bar"}'; //malformed json + return '{"foo":"bar"}'; //invalid Json } public function set($key, $value, $ttl = null) @@ -407,45 +412,7 @@ public function has($key) }; self::expectException(CouldNotLoadTLDs::class); - $manager = new Manager($cachePool, new CurlHttpClient()); + $manager = new Manager($cachePool, $this->client); $manager->getTLDs(); } - - /** - * @covers \Pdp\Converter::convert - * @covers \Pdp\Converter::getSection - * @covers \Pdp\Converter::addRule - * @covers \Pdp\Converter::idnToAscii - */ - public function testConvertThrowsExceptionWithInvalidContent() - { - self::expectException(InvalidDomain::class); - $content = file_get_contents(__DIR__.'/data/invalid_suffix_list_content.dat'); - (new Converter())->convert($content); - } - - /** - * @dataProvider validTtlProvider - */ - public function testSettingTtl($ttl) - { - self::assertInstanceOf(Manager::class, new Manager(new Cache(), new CurlHttpClient(), $ttl)); - } - - public function validTtlProvider() - { - return [ - 'DateInterval' => [new DateInterval('PT1H')], - 'null' => [null], - 'DateTimeInterface' => [new DateTime('+1 DAY')], - 'string' => ['7 DAYS'], - 'int' => [86000], - ]; - } - - public function testSettingTtlTrowsException() - { - self::expectException(TypeError::class); - new Manager(new Cache(), new CurlHttpClient(), tmpfile()); - } } diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 55798938..89063a45 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -15,13 +15,10 @@ namespace Pdp\Tests; -use Pdp\Cache; -use Pdp\CurlHttpClient; use Pdp\Domain; use Pdp\Exception\CouldNotLoadRules; use Pdp\Exception\CouldNotResolvePublicSuffix; use Pdp\Exception\InvalidDomain; -use Pdp\Manager; use Pdp\PublicSuffix; use Pdp\Rules; use PHPUnit\Framework\TestCase; @@ -39,8 +36,7 @@ class RulesTest extends TestCase public function setUp() { - $manager = new Manager(new Cache(), new CurlHttpClient()); - $this->rules = $manager->getRules(); + $this->rules = Rules::createFromPath(__DIR__.'/data/public_suffix_list.dat'); } /** diff --git a/tests/TLDConverterTest.php b/tests/TLDConverterTest.php index 92b3da8d..601d7491 100644 --- a/tests/TLDConverterTest.php +++ b/tests/TLDConverterTest.php @@ -15,7 +15,7 @@ namespace Pdp\Tests; -use Pdp\Exception; +use Pdp\Exception\CouldNotLoadTLDs; use Pdp\TLDConverter; use PHPUnit\Framework\TestCase; @@ -30,8 +30,9 @@ public function testConverter() $res = (new TLDConverter())->convert($string); self::assertInternalType('array', $res); self::assertArrayHasKey('version', $res); - self::assertArrayHasKey('update', $res); + self::assertArrayHasKey('modifiedDate', $res); self::assertArrayHasKey('records', $res); + self::assertInternalType('array', $res['records']); } /** @@ -39,7 +40,7 @@ public function testConverter() */ public function testConverterThrowsException(string $content) { - self::expectException(Exception::class); + self::expectException(CouldNotLoadTLDs::class); (new TLDConverter())->convert($content); } diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index fc182559..041aed8e 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -17,11 +17,8 @@ use DateTimeImmutable; use DateTimeZone; -use Pdp\Cache; -use Pdp\CurlHttpClient; use Pdp\Domain; -use Pdp\Exception; -use Pdp\Manager; +use Pdp\Exception\CouldNotLoadTLDs; use Pdp\PublicSuffix; use Pdp\TLDConverter; use Pdp\TopLevelDomains; @@ -37,8 +34,7 @@ class TopLevelDomainsTest extends TestCase public function setUp() { - $manager = new Manager(new Cache(), new CurlHttpClient()); - $this->collection = $manager->getTLDs(); + $this->collection = TopLevelDomains::createFromPath(__DIR__.'/data/tlds-alpha-by-domain.txt'); } /** @@ -64,7 +60,7 @@ public function testCreateFromPath() */ public function testCreateFromPathThrowsException() { - self::expectException(Exception::class); + self::expectException(CouldNotLoadTLDs::class); TopLevelDomains::createFromPath('/foo/bar.dat'); } @@ -85,7 +81,7 @@ public function testGetterProperties() self::assertSame('2018082200', $collection->getVersion()); self::assertEquals( new DateTimeImmutable('2018-08-22 07:07:01', new DateTimeZone('UTC')), - $collection->getLastUpdate() + $collection->getModifiedDate() ); self::assertFalse($collection->isEmpty()); From fe91a0e96f21bbd497a79c9a2c5a613b4a79b2ad Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 5 Sep 2018 21:51:23 +0200 Subject: [PATCH 128/461] Revert changes - remove functions/constant imports - remove self:: in tests - remove php-cs-fixer rules that removes redundant PHPDoc comments --- .php_cs | 1 - src/Cache.php | 29 +------ src/Converter.php | 15 ++-- src/CurlHttpClient.php | 18 +--- src/Domain.php | 72 +++++++++++----- src/HttpClient.php | 1 + src/IDNAConverterTrait.php | 42 ++++------ src/Installer.php | 12 +-- src/Manager.php | 45 ++++++---- src/PublicSuffix.php | 27 +++--- src/Rules.php | 28 +++++-- src/TLDConverter.php | 19 +++-- src/TopLevelDomains.php | 38 +++++++-- tests/CacheTest.php | 103 +++++++++++------------ tests/ConverterTest.php | 10 +-- tests/CurlHttpClientTest.php | 8 +- tests/DomainTest.php | 149 ++++++++++++++++++++-------------- tests/ManagerTest.php | 29 +++---- tests/PublicSuffixTest.php | 60 ++++++++------ tests/RulesTest.php | 131 +++++++++++++++++------------- tests/TLDConverterTest.php | 13 +-- tests/TopLevelDomainsTest.php | 35 ++++---- 22 files changed, 490 insertions(+), 395 deletions(-) diff --git a/.php_cs b/.php_cs index 4bd916d2..8158b400 100644 --- a/.php_cs +++ b/.php_cs @@ -32,7 +32,6 @@ return PhpCsFixer\Config::create() 'no_empty_phpdoc' => true, 'no_empty_comment' => true, 'no_leading_import_slash' => true, - 'no_superfluous_phpdoc_tags' => true, 'no_trailing_comma_in_singleline_array' => true, 'no_unused_imports' => true, 'ordered_imports' => ['imports_order' => null, 'sort_algorithm' => 'alpha'], diff --git a/src/Cache.php b/src/Cache.php index d6a22adf..21ea7e85 100644 --- a/src/Cache.php +++ b/src/Cache.php @@ -20,31 +20,6 @@ use Generator; use Psr\SimpleCache\CacheInterface; use Traversable; -use const DIRECTORY_SEPARATOR; -use function chmod; -use function dirname; -use function file_exists; -use function file_get_contents; -use function filemtime; -use function get_class; -use function gettype; -use function is_array; -use function is_dir; -use function is_int; -use function is_object; -use function is_string; -use function is_writable; -use function mkdir; -use function preg_match; -use function realpath; -use function rename; -use function serialize; -use function sprintf; -use function time; -use function touch; -use function uniqid; -use function unlink; -use function unserialize; /** * A simple file-based PSR-16 cache implementation. @@ -166,6 +141,10 @@ public function set($key, $value, $ttl = null) /** * Returns the expiration time expressed in the number of seconds since the Unix Epoch. + * + * @param mixed $ttl + * + * @return int */ private function getExpireAt($ttl): int { diff --git a/src/Converter.php b/src/Converter.php index 2826c1e6..21637c15 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -17,11 +17,6 @@ use Pdp\Exception\CouldNotLoadRules; use SplTempFileObject; -use function array_pop; -use function explode; -use function preg_match; -use function strpos; -use function substr; /** * Public Suffix List Parser. @@ -57,6 +52,10 @@ final class Converter implements PublicSuffixListSection /** * Convert the Public Suffix List into * an associative, multidimensional array. + * + * @param string $content + * + * @return array */ public function convert(string $content): array { @@ -80,6 +79,8 @@ public function convert(string $content): array * * @param string $section the current status * @param string $line the current file line + * + * @return string */ private function getSection(string $section, string $line): string { @@ -104,7 +105,9 @@ private function getSection(string $section, string $line): string * @param array $rule_parts One line (rule) from the Public Suffix List * exploded on '.', or the remaining portion of that array during recursion * - * @throws Exception if The domain name is invalid + * @throws CouldNotLoadRules if the domain name can not be converted using IDN to ASCII algorithm + * + * @return array */ private function addRule(array $list, array $rule_parts): array { diff --git a/src/CurlHttpClient.php b/src/CurlHttpClient.php index 6b4df0c9..4a52a005 100644 --- a/src/CurlHttpClient.php +++ b/src/CurlHttpClient.php @@ -15,20 +15,6 @@ namespace Pdp; -use const CURLE_OK; -use const CURLOPT_FAILONERROR; -use const CURLOPT_FOLLOWLOCATION; -use const CURLOPT_HTTPGET; -use const CURLOPT_RETURNTRANSFER; -use const CURLOPT_SSL_VERIFYHOST; -use const CURLOPT_SSL_VERIFYPEER; -use function curl_close; -use function curl_errno; -use function curl_error; -use function curl_exec; -use function curl_init; -use function curl_setopt_array; - final class CurlHttpClient implements HttpClient { /** @@ -47,8 +33,8 @@ public function __construct(array $options = []) CURLOPT_FAILONERROR => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_RETURNTRANSFER => true, - CURLOPT_SSL_VERIFYHOST => 0, - CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_SSL_VERIFYPEER => true, + CURLOPT_SSL_VERIFYHOST => 2, CURLOPT_HTTPGET => true, ]; diff --git a/src/Domain.php b/src/Domain.php index ae6ec60a..3d94e7c3 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -21,24 +21,6 @@ use Pdp\Exception\InvalidLabel; use Pdp\Exception\InvalidLabelKey; use TypeError; -use function array_count_values; -use function array_keys; -use function array_reverse; -use function array_slice; -use function array_unshift; -use function count; -use function explode; -use function gettype; -use function implode; -use function in_array; -use function is_scalar; -use function ksort; -use function method_exists; -use function preg_match; -use function sprintf; -use function strlen; -use function strpos; -use function substr; /** * Domain Value Object. @@ -96,8 +78,8 @@ public static function __set_state(array $properties): self /** * New instance. * - * @param PublicSuffix $publicSuffix - * @param null|mixed $domain + * @param null|mixed $domain + * @param null|PublicSuffix $publicSuffix */ public function __construct($domain = null, PublicSuffix $publicSuffix = null) { @@ -113,7 +95,11 @@ public function __construct($domain = null, PublicSuffix $publicSuffix = null) /** * Sets the public suffix domain part. * + * @param PublicSuffix $publicSuffix + * * @throws CouldNotResolvePublicSuffix If the public suffic can not be attached to the domain + * + * @return PublicSuffix */ private function setPublicSuffix(PublicSuffix $publicSuffix): PublicSuffix { @@ -140,6 +126,10 @@ private function setPublicSuffix(PublicSuffix $publicSuffix): PublicSuffix /** * Normalize the domain name encoding content. + * + * @param PublicSuffix $subject + * + * @return PublicSuffix */ private function normalize(PublicSuffix $subject): PublicSuffix { @@ -297,7 +287,7 @@ public function keys(string $label): array * * This method returns null if the registrable domain is equal to the public suffix. * - * @return string|null + * @return string|null registrable domain */ public function getRegistrableDomain() { @@ -312,7 +302,7 @@ public function getRegistrableDomain() * This method returns null if the registrable domain is null * This method returns null if the registrable domain is equal to the public suffix * - * @return string|null + * @return string|null registrable domain */ public function getSubDomain() { @@ -335,6 +325,8 @@ public function getPublicSuffix() * A domain is resolvable if: * - it contains at least 2 labels * - it is not a absolute domain (end with a '.' character) + * + * @return bool */ public function isResolvable(): bool { @@ -343,6 +335,8 @@ public function isResolvable(): bool /** * Tells whether the public suffix has a matching rule in a Public Suffix List. + * + * @return bool */ public function isKnown(): bool { @@ -351,6 +345,8 @@ public function isKnown(): bool /** * Tells whether the public suffix has a matching rule in a Public Suffix List ICANN Section. + * + * @return bool */ public function isICANN(): bool { @@ -359,6 +355,8 @@ public function isICANN(): bool /** * Tells whether the public suffix has a matching rule in a Public Suffix List Private Section. + * + * @return bool */ public function isPrivate(): bool { @@ -404,6 +402,10 @@ public function toUnicode() * * This method MUST retain the state of the current instance, and return * an instance that contains the modified Public Suffix Information. + * + * @param mixed $publicSuffix + * + * @return self */ public function resolve($publicSuffix): self { @@ -427,6 +429,10 @@ public function resolve($publicSuffix): self * * If the domain already has a public suffix it will be replaced by the new value * otherwise the public suffix content is added to or remove from the current domain. + * + * @param mixed $publicSuffix + * + * @return self */ public function withPublicSuffix($publicSuffix): self { @@ -447,14 +453,18 @@ public function withPublicSuffix($publicSuffix): self return new self($domain.'.'.$publicSuffix->getContent(), $publicSuffix); } + /** * Returns an instance with the specified sub domain added. * * This method MUST retain the state of the current instance, and return * an instance that contains the new sub domain * + * @param mixed $subDomain the subdomain to add * * @throws CouldNotResolveSubDomain If the Sub domain can not be added to the current Domain + * + * @return self */ public function withSubDomain($subDomain): self { @@ -477,6 +487,8 @@ public function withSubDomain($subDomain): self /** * Filter a subdomain to update the domain part. * + * @param mixed $domain + * * @throws TypeError if the domain can not be converted * * @return string|null @@ -511,6 +523,10 @@ private function normalizeContent($domain) * Prepends a label to the domain. * * @see ::withLabel + * + * @param mixed $label + * + * @return self */ public function prepend($label): self { @@ -521,6 +537,10 @@ public function prepend($label): self * Appends a label to the domain. * * @see ::withLabel + * + * @param mixed $label + * + * @return self */ public function append($label): self { @@ -536,8 +556,13 @@ public function append($label): self * If $key is non-negative, the added label will be the label at $key position from the start. * If $key is negative, the added label will be the label at $key position from the end. * + * @param int $key + * @param mixed $label + * * @throws InvalidLabelKey If the key is out of bounds * @throws InvalidLabel If the label is converted to the NULL value + * + * @return self */ public function withLabel(int $key, $label): self { @@ -579,9 +604,12 @@ public function withLabel(int $key, $label): self * If $key is non-negative, the removed label will be the label at $key position from the start. * If $key is negative, the removed label will be the label at $key position from the end. * + * @param int $key * @param int ...$keys remaining keys to remove * * @throws InvalidLabelKey If the key is out of bounds + * + * @return self */ public function withoutLabel(int $key, int ...$keys): self { diff --git a/src/HttpClient.php b/src/HttpClient.php index 0eaadead..aebe0e31 100644 --- a/src/HttpClient.php +++ b/src/HttpClient.php @@ -29,6 +29,7 @@ interface HttpClient /** * Returns the content fetched from a given URL. * + * @param string $url * * @throws HttpClientException If an errors occurs while fetching the content from a given URL * diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index 62f3a95f..a92db89c 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -17,33 +17,6 @@ use Pdp\Exception\InvalidDomain; use TypeError; -use const FILTER_FLAG_IPV4; -use const FILTER_VALIDATE_IP; -use const IDNA_ERROR_BIDI; -use const IDNA_ERROR_CONTEXTJ; -use const IDNA_ERROR_DISALLOWED; -use const IDNA_ERROR_DOMAIN_NAME_TOO_LONG; -use const IDNA_ERROR_EMPTY_LABEL; -use const IDNA_ERROR_HYPHEN_3_4; -use const IDNA_ERROR_INVALID_ACE_LABEL; -use const IDNA_ERROR_LABEL_TOO_LONG; -use const IDNA_ERROR_LEADING_COMBINING_MARK; -use const IDNA_ERROR_LEADING_HYPHEN; -use const IDNA_ERROR_PUNYCODE; -use const IDNA_ERROR_TRAILING_HYPHEN; -use function array_reverse; -use function explode; -use function gettype; -use function idn_to_ascii; -use function idn_to_utf8; -use function implode; -use function is_scalar; -use function iterator_to_array; -use function method_exists; -use function preg_match; -use function rawurldecode; -use function sprintf; -use function strtolower; /** * @internal Domain name validator @@ -54,6 +27,10 @@ trait IDNAConverterTrait { /** * Get and format IDN conversion error message. + * + * @param int $error_bit + * + * @return string */ private static function getIdnErrors(int $error_bit): string { @@ -93,7 +70,11 @@ private static function getIdnErrors(int $error_bit): string * * This method returns the string converted to IDN ASCII form * + * @param string $domain + * * @throws InvalidDomain if the string can not be converted to ASCII using IDN UTS46 algorithm + * + * @return string */ private function idnToAscii(string $domain): string { @@ -120,7 +101,11 @@ private function idnToAscii(string $domain): string * * This method returns the string converted to IDN UNICODE form * + * @param string $domain + * * @throws InvalidDomain if the string can not be converted to UNICODE using IDN UTS46 algorithm + * + * @return string */ private function idnToUnicode(string $domain): string { @@ -140,9 +125,10 @@ private function idnToUnicode(string $domain): string * * For example: setLabels('wWw.uLb.Ac.be') should return ['www.ulb.ac.be', ['be', 'ac', 'ulb', 'www']]; * + * @param mixed $domain * - * @param null|mixed $domain * @throws InvalidDomain If the domain is invalid + * * @return string[] */ private function setLabels($domain = null): array diff --git a/src/Installer.php b/src/Installer.php index 5bd3c6d8..498adbb4 100644 --- a/src/Installer.php +++ b/src/Installer.php @@ -17,14 +17,6 @@ use Composer\Script\Event; use Throwable; -use const PHP_EOL; -use const STDERR; -use const STDOUT; -use function dirname; -use function extension_loaded; -use function fwrite; -use function implode; -use function is_dir; /** * A class to manage PSL ICANN Section rules updates. @@ -110,6 +102,10 @@ private static function getVendorPath(Event $event = null) /** * Detect the I/O interface to use. + * + * @param Event|null $event + * + * @return mixed */ private static function getIO(Event $event = null) { diff --git a/src/Manager.php b/src/Manager.php index cfb2fbb4..8488c890 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -22,18 +22,6 @@ use Pdp\Exception\CouldNotLoadTLDs; use Psr\SimpleCache\CacheInterface; use TypeError; -use const DATE_ATOM; -use const FILTER_VALIDATE_INT; -use const JSON_ERROR_NONE; -use function filter_var; -use function is_string; -use function json_decode; -use function json_encode; -use function json_last_error; -use function json_last_error_msg; -use function md5; -use function sprintf; -use function strtolower; /** * Public Suffix List Manager. @@ -67,7 +55,9 @@ final class Manager /** * new instance. * - * @param null|mixed $ttl + * @param CacheInterface $cache + * @param HttpClient $http + * @param null|mixed $ttl */ public function __construct(CacheInterface $cache, HttpClient $http, $ttl = null) { @@ -79,9 +69,12 @@ public function __construct(CacheInterface $cache, HttpClient $http, $ttl = null /** * Gets the Public Suffix List Rules. * - * @param null|mixed $ttl + * @param string $url the Public Suffix List URL + * @param null|mixed $ttl the cache TTL * * @throws CouldNotLoadRules If the PSL rules can not be loaded + * + * @return Rules */ public function getRules(string $url = self::PSL_URL, $ttl = null): Rules { @@ -107,7 +100,10 @@ public function getRules(string $url = self::PSL_URL, $ttl = null): Rules * * Returns true if the refresh was successful * - * @param null|mixed $ttl + * @param string $url the Public Suffix List URL + * @param null|mixed $ttl the cache TTL + * + * @return bool */ public function refreshRules(string $url = self::PSL_URL, $ttl = null): bool { @@ -125,9 +121,12 @@ public function refreshRules(string $url = self::PSL_URL, $ttl = null): bool /** * Gets the Public Suffix List Rules. * - * @param null|mixed $ttl + * @param string $url the IANA Root Zone Database URL + * @param null|mixed $ttl the cache TTL * * @throws Exception If the Top Level Domains can not be returned + * + * @return TopLevelDomains */ public function getTLDs(string $url = self::RZD_URL, $ttl = null): TopLevelDomains { @@ -161,9 +160,10 @@ public function getTLDs(string $url = self::RZD_URL, $ttl = null): TopLevelDomai * * Returns true if the refresh was successful * - * @param null|mixed $ttl + * @param string $url the IANA Root Zone Database URL + * @param null|mixed $ttl the cache TTL * - * @throws Exception if the source is not validated + * @return bool */ public function refreshTLDs(string $url = self::RZD_URL, $ttl = null): bool { @@ -181,6 +181,10 @@ public function refreshTLDs(string $url = self::RZD_URL, $ttl = null): bool /** * set the cache TTL. * + * @param null|mixed $ttl the cache TTL + * + * @throws TypeError if the value type is not recognized + * * @return DateInterval|null */ private function filterTtl($ttl) @@ -209,6 +213,11 @@ private function filterTtl($ttl) /** * Returns the cache key according to the source URL. + * + * @param string $prefix + * @param string $str + * + * @return string */ private function getCacheKey(string $prefix, string $str): string { diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 31acf78f..7736824c 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -18,14 +18,6 @@ use JsonSerializable; use Pdp\Exception\CouldNotResolvePublicSuffix; use Pdp\Exception\InvalidDomain; -use function array_keys; -use function array_reverse; -use function count; -use function implode; -use function in_array; -use function reset; -use function sprintf; -use function strpos; /** * Public Suffix Value Object. @@ -74,6 +66,10 @@ public static function __set_state(array $properties): self /** * Create an new instance from a Domain object. + * + * @param Domain $domain + * + * @return self */ public static function createFromDomain(Domain $domain): self { @@ -90,7 +86,8 @@ public static function createFromDomain(Domain $domain): self /** * New instance. * - * @param null|mixed $publicSuffix + * @param mixed $publicSuffix + * @param string $section */ public function __construct($publicSuffix = null, string $section = '') { @@ -108,7 +105,7 @@ public function __construct($publicSuffix = null, string $section = '') */ private function setPublicSuffix() { - if ([] === $this->labels) { + if (empty($this->labels)) { return null; } @@ -123,7 +120,11 @@ private function setPublicSuffix() /** * Set the public suffix section. * + * @param string $section + * * @throws CouldNotResolvePublicSuffix if the submitted section is not supported + * + * @return string */ private function setSection(string $section): string { @@ -215,6 +216,8 @@ public function keys(string $label): array /** * Tells whether the public suffix has a matching rule in a Public Suffix List. + * + * @return bool */ public function isKnown(): bool { @@ -223,6 +226,8 @@ public function isKnown(): bool /** * Tells whether the public suffix has a matching rule in a Public Suffix List ICANN Section. + * + * @return bool */ public function isICANN(): bool { @@ -231,6 +236,8 @@ public function isICANN(): bool /** * Tells whether the public suffix has a matching rule in a Public Suffix List Private Section. + * + * @return bool */ public function isPrivate(): bool { diff --git a/src/Rules.php b/src/Rules.php index adbe3942..21568646 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -17,13 +17,6 @@ use Pdp\Exception\CouldNotLoadRules; use Pdp\Exception\CouldNotResolvePublicSuffix; -use function array_reverse; -use function count; -use function fclose; -use function fopen; -use function in_array; -use function sprintf; -use function stream_get_contents; /** * A class to resolve domain name against the Public Suffix list. @@ -53,10 +46,12 @@ final class Rules implements PublicSuffixListSection /** * Returns a new instance from a file path. * + * @param string $path * @param null|resource $context * * @throws CouldNotLoadRules If the rules can not be loaded from the path * + * @return self */ public static function createFromPath(string $path, $context = null): self { @@ -78,7 +73,9 @@ public static function createFromPath(string $path, $context = null): self /** * Returns a new instance from a string. * + * @param string $content * + * @return self */ public static function createFromString(string $content): self { @@ -100,6 +97,7 @@ public static function __set_state(array $properties): self /** * New instance. * + * @param array $rules */ public function __construct(array $rules) { @@ -109,9 +107,12 @@ public function __construct(array $rules) /** * Determines the public suffix for a given domain. * + * @param mixed $domain + * @param string $section * * @throws CouldNotResolvePublicSuffix If the PublicSuffix can not be resolve. * + * @return PublicSuffix */ public function getPublicSuffix($domain, string $section = self::ALL_DOMAINS): PublicSuffix { @@ -127,7 +128,10 @@ public function getPublicSuffix($domain, string $section = self::ALL_DOMAINS): P /** * Returns PSL info for a given domain. * + * @param mixed $domain + * @param string $section * + * @return Domain */ public function resolve($domain, string $section = self::ALL_DOMAINS): Domain { @@ -147,9 +151,11 @@ public function resolve($domain, string $section = self::ALL_DOMAINS): Domain /** * Assert the section status. * + * @param string $section * * @throws Exception if the submitted section is not supported * + * @return string */ private function validateSection(string $section): string { @@ -167,7 +173,10 @@ private function validateSection(string $section): string /** * Returns the matched public suffix. * + * @param DomainInterface $domain + * @param string $section * + * @return PublicSuffix */ private function findPublicSuffix(DomainInterface $domain, string $section): PublicSuffix { @@ -192,7 +201,10 @@ private function findPublicSuffix(DomainInterface $domain, string $section): Pub /** * Returns the public suffix matched against a given PSL section. * + * @param DomainInterface $domain + * @param string $section * + * @return PublicSuffix */ private function findPublicSuffixFromSection(DomainInterface $domain, string $section): PublicSuffix { @@ -219,7 +231,7 @@ private function findPublicSuffixFromSection(DomainInterface $domain, string $se $rules = $rules[$label]; } - if ([] === $matches) { + if (empty($matches)) { return new PublicSuffix($domain->getLabel(0)); } diff --git a/src/TLDConverter.php b/src/TLDConverter.php index 987a9a2a..1be46def 100644 --- a/src/TLDConverter.php +++ b/src/TLDConverter.php @@ -18,16 +18,11 @@ use DateTimeImmutable; use Pdp\Exception\CouldNotLoadTLDs; use SplTempFileObject; -use const DATE_ATOM; -use function preg_match; -use function sprintf; -use function strpos; -use function trim; /** * IANA Root Zone Database Parser. * - * This class convert the IANA Root Zone Databas into an associative, multidimensional array + * This class convert the IANA Root Zone Database into an associative, multidimensional array * * @author Ignace Nyamagana Butera */ @@ -41,7 +36,11 @@ final class TLDConverter /** * Converts the IANA Root Zone Database into a TopLevelDomains associative array. * + * @param string $content + * * @throws CouldNotLoadTLDs if the content is invalid or can not be correctly parsed and converted + * + * @return array */ public function convert(string $content): array { @@ -75,7 +74,11 @@ public function convert(string $content): array /** * Extract IANA Root Zone Database header info. * + * @param string $content + * * @throws CouldNotLoadTLDs if the Header line is invalid + * + * @return array */ private function extractHeader(string $content): array { @@ -93,7 +96,11 @@ private function extractHeader(string $content): array /** * Extract IANA Root Zone. * + * @param string $content + * * @throws CouldNotLoadTLDs If the Root Zone is invalid + * + * @return string */ private function extractRootZone(string $content): string { diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 2a88d291..380ed65a 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -21,13 +21,12 @@ use DateTimeInterface; use IteratorAggregate; use Pdp\Exception\CouldNotLoadTLDs; -use const DATE_ATOM; -use function count; -use function fclose; -use function fopen; -use function sprintf; -use function stream_get_contents; +/** + * A class to resolve domain name against the IANA Root Database. + * + * @author Ignace Nyamagana Butera + */ final class TopLevelDomains implements Countable, IteratorAggregate { /** @@ -48,9 +47,12 @@ final class TopLevelDomains implements Countable, IteratorAggregate /** * Returns a new instance from a file path. * + * @param string $path * @param null|resource $context * * @throws Exception If the list can not be loaded from the path + * + * @return self */ public static function createFromPath(string $path, $context = null): self { @@ -71,6 +73,10 @@ public static function createFromPath(string $path, $context = null): self /** * Returns a new instance from a string. + * + * @param string $content + * + * @return self */ public static function createFromString(string $content): self { @@ -97,6 +103,10 @@ public static function __set_state(array $properties): self /** * New instance. + * + * @param array $records + * @param string $version + * @param DateTimeInterface $modifiedDate */ public function __construct(array $records, string $version, DateTimeInterface $modifiedDate) { @@ -107,6 +117,8 @@ public function __construct(array $records, string $version, DateTimeInterface $ /** * Returns the Version ID. + * + * @return string */ public function getVersion(): string { @@ -115,6 +127,8 @@ public function getVersion(): string /** * Returns the List Last Modified Date. + * + * @return DateTimeImmutable */ public function getModifiedDate(): DateTimeImmutable { @@ -131,6 +145,8 @@ public function count() /** * Tells whether the list is empty. + * + * @return bool */ public function isEmpty(): bool { @@ -149,6 +165,8 @@ public function getIterator() /** * Returns an array representation of the list. + * + * @return array */ public function toArray(): array { @@ -161,6 +179,10 @@ public function toArray(): array /** * Tells whether the submitted TLD is a valid Top Level Domain. + * + * @param mixed $tld + * + * @return bool */ public function contains($tld): bool { @@ -186,6 +208,10 @@ public function contains($tld): bool /** * Returns a domain where its public suffix is the found TLD. + * + * @param mixed $domain + * + * @return Domain */ public function resolve($domain): Domain { diff --git a/tests/CacheTest.php b/tests/CacheTest.php index acbd88c5..3530788b 100644 --- a/tests/CacheTest.php +++ b/tests/CacheTest.php @@ -58,29 +58,30 @@ public function tearDown() public function testConstructorOnEmptyCachePath() { $cache = new Cache(''); - self::assertNull($cache->get('invalid_key')); + $this->assertNull($cache->get('invalid_key')); } public function testConstructorOnParentCachePathIsNotExisted() { $cache = new Cache(vfsStream::url('pdp/cache_not_exist')); - self::assertNull($cache->get('invalid_key')); + $this->assertNull($cache->get('invalid_key')); } public function testSetOnNotWritableCachePath() { $cache = new Cache('/bin'); - self::assertFalse($cache->set('key', 'value')); + $this->assertFalse($cache->set('key', 'value')); } /** * @dataProvider storableValuesProvider * + * @param mixed $expected */ public function testSetGet($expected) { $this->cache->set('foo', $expected); - self::assertEquals($expected, $this->cache->get('foo')); + $this->assertEquals($expected, $this->cache->get('foo')); } public function storableValuesProvider() @@ -101,26 +102,26 @@ public function storableValuesProvider() public function testDelete() { $this->cache->set('foo', 'bar'); - self::assertEquals('bar', $this->cache->get('foo')); + $this->assertEquals('bar', $this->cache->get('foo')); $this->cache->delete('foo'); - self::assertNull($this->cache->get('foo')); + $this->assertNull($this->cache->get('foo')); } public function testGetInvalidArg() { - self::expectException(InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); $this->cache->get(null); } public function testInvalidKey() { - self::expectException(InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); $this->cache->get('foo:bar', 'bar'); } public function testSetInvalidTTL() { - self::expectException(InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); $this->cache->set('foo', 'bar', date_create()); } @@ -129,7 +130,7 @@ public function testSetInvalidTTL() */ public function testGetNotFound() { - self::assertNull($this->cache->get('notfound')); + $this->assertNull($this->cache->get('notfound')); } /** @@ -138,7 +139,7 @@ public function testGetNotFound() public function testGetNotFoundDefault() { $default = 'chickpeas'; - self::assertEquals( + $this->assertEquals( $default, $this->cache->get('notfound', $default) ); @@ -151,11 +152,11 @@ public function testGetNotFoundDefault() public function testSetExpire() { $this->cache->set('foo', 'bar', 1); - self::assertEquals('bar', $this->cache->get('foo')); + $this->assertEquals('bar', $this->cache->get('foo')); // Wait 3 seconds so the cache expires sleep(3); - self::assertNull($this->cache->get('foo')); + $this->assertNull($this->cache->get('foo')); } /** @@ -165,22 +166,22 @@ public function testSetExpire() public function testSetExpireDateInterval() { $this->cache->set('foo', 'bar', new DateInterval('PT1S')); - self::assertEquals('bar', $this->cache->get('foo')); + $this->assertEquals('bar', $this->cache->get('foo')); // Wait 3 seconds so the cache expires sleep(3); - self::assertNull($this->cache->get('foo')); + $this->assertNull($this->cache->get('foo')); } public function testSetInvalidArg() { - self::expectException(InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); $this->cache->set(null, 'bar'); } public function testDeleteInvalidArg() { - self::expectException(InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); $this->cache->delete(null); } @@ -191,7 +192,7 @@ public function testClearCache() { $this->cache->set('foo', 'bar'); $this->cache->clear(); - self::assertNull($this->cache->get('foo')); + $this->assertNull($this->cache->get('foo')); } /** @@ -200,7 +201,7 @@ public function testClearCache() public function testHas() { $this->cache->set('foo', 'bar'); - self::assertTrue($this->cache->has('foo')); + $this->assertTrue($this->cache->has('foo')); } /** @@ -208,12 +209,12 @@ public function testHas() */ public function testHasNot() { - self::assertFalse($this->cache->has('not-found')); + $this->assertFalse($this->cache->has('not-found')); } public function testHasInvalidArg() { - self::expectException(InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); $this->cache->has(null); } @@ -231,13 +232,13 @@ public function testSetGetMultiple() $this->cache->setMultiple($values); $result = $this->cache->getMultiple(array_keys($values)); foreach ($result as $key => $value) { - self::assertTrue(isset($values[$key])); - self::assertEquals($values[$key], $value); + $this->assertTrue(isset($values[$key])); + $this->assertEquals($values[$key], $value); unset($values[$key]); } // The list of values should now be empty - self::assertEquals([], $values); + $this->assertEquals([], $values); } /** @@ -261,13 +262,13 @@ public function testSetGetMultipleGenerator() $result = $this->cache->getMultiple(array_keys($values)); foreach ($result as $key => $value) { - self::assertTrue(isset($values[$key])); - self::assertEquals($values[$key], $value); + $this->assertTrue(isset($values[$key])); + $this->assertEquals($values[$key], $value); unset($values[$key]); } // The list of values should now be empty - self::assertEquals([], $values); + $this->assertEquals([], $values); } /** @@ -290,13 +291,13 @@ public function testSetGetMultipleGenerator2() $this->cache->setMultiple($values); $result = $this->cache->getMultiple($gen()); foreach ($result as $key => $value) { - self::assertTrue(isset($values[$key])); - self::assertEquals($values[$key], $value); + $this->assertTrue(isset($values[$key])); + $this->assertEquals($values[$key], $value); unset($values[$key]); } // The list of values should now be empty - self::assertEquals([], $values); + $this->assertEquals([], $values); } /** @@ -317,13 +318,13 @@ public function testSetMultipleExpireDateIntervalNotExpired() $count = 0; foreach ($result as $key => $value) { ++$count; - self::assertTrue(isset($values[$key])); - self::assertEquals($values[$key], $value); + $this->assertTrue(isset($values[$key])); + $this->assertEquals($values[$key], $value); unset($values[$key]); } - self::assertEquals(3, $count); + $this->assertEquals(3, $count); // The list of values should now be empty - self::assertEquals([], $values); + $this->assertEquals([], $values); } /** @@ -353,14 +354,14 @@ public function testSetMultipleExpireDateIntervalExpired() foreach ($result as $key => $value) { ++$count; - self::assertTrue(isset($expected[$key])); - self::assertEquals($expected[$key], $value); + $this->assertTrue(isset($expected[$key])); + $this->assertEquals($expected[$key], $value); unset($expected[$key]); } - self::assertEquals(3, $count); + $this->assertEquals(3, $count); // The list of values should now be empty - self::assertEquals([], $expected); + $this->assertEquals([], $expected); } /** @@ -390,25 +391,25 @@ public function testSetMultipleExpireDateIntervalInt() foreach ($result as $key => $value) { ++$count; - self::assertTrue(isset($expected[$key])); - self::assertEquals($expected[$key], $value); + $this->assertTrue(isset($expected[$key])); + $this->assertEquals($expected[$key], $value); unset($expected[$key]); } - self::assertEquals(3, $count); + $this->assertEquals(3, $count); // The list of values should now be empty - self::assertEquals([], $expected); + $this->assertEquals([], $expected); } public function testSetMultipleInvalidArg() { - self::expectException(InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); $this->cache->setMultiple(null); } public function testGetMultipleInvalidArg() { - self::expectException(InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); $result = $this->cache->getMultiple(null); // If $result was a generator, the generator will only error once the // first value is requested. @@ -443,13 +444,13 @@ public function testDeleteMultipleDefaultGet() ]; foreach ($result as $key => $value) { - self::assertTrue(isset($expected[$key])); - self::assertEquals($expected[$key], $value); + $this->assertTrue(isset($expected[$key])); + $this->assertEquals($expected[$key], $value); unset($expected[$key]); } // The list of values should now be empty - self::assertEquals([], $expected); + $this->assertEquals([], $expected); } /** @@ -481,18 +482,18 @@ public function testDeleteMultipleGenerator() ]; foreach ($result as $key => $value) { - self::assertTrue(isset($expected[$key])); - self::assertEquals($expected[$key], $value); + $this->assertTrue(isset($expected[$key])); + $this->assertEquals($expected[$key], $value); unset($expected[$key]); } // The list of values should now be empty - self::assertEquals([], $expected); + $this->assertEquals([], $expected); } public function testDeleteMultipleInvalidArg() { - self::expectException(InvalidArgumentException::class); + $this->expectException(InvalidArgumentException::class); $this->cache->deleteMultiple(null); } } diff --git a/tests/ConverterTest.php b/tests/ConverterTest.php index d8c6cdb5..a837e216 100644 --- a/tests/ConverterTest.php +++ b/tests/ConverterTest.php @@ -28,13 +28,13 @@ public function testConverter() { $string = file_get_contents(__DIR__.'/data/public_suffix_list.dat'); $retval = (new Converter())->convert($string); - self::assertNotEmpty($retval[Converter::ICANN_DOMAINS]); - self::assertNotEmpty($retval[Converter::PRIVATE_DOMAINS]); + $this->assertNotEmpty($retval[Converter::ICANN_DOMAINS]); + $this->assertNotEmpty($retval[Converter::PRIVATE_DOMAINS]); } public function testConvertThrowsExceptionWithInvalidContent() { - self::expectException(CouldNotLoadRules::class); + $this->expectException(CouldNotLoadRules::class); $content = file_get_contents(__DIR__.'/data/invalid_suffix_list_content.dat'); (new Converter())->convert($content); } @@ -42,12 +42,12 @@ public function testConvertThrowsExceptionWithInvalidContent() public function testConvertWithEmptyString() { $retval = (new Converter())->convert(''); - self::assertEquals([Converter::ICANN_DOMAINS => [], Converter::PRIVATE_DOMAINS => []], $retval); + $this->assertEquals([Converter::ICANN_DOMAINS => [], Converter::PRIVATE_DOMAINS => []], $retval); } public function testConvertWithInvalidString() { $retval = (new Converter())->convert('foobar'); - self::assertEquals([Converter::ICANN_DOMAINS => [], Converter::PRIVATE_DOMAINS => []], $retval); + $this->assertEquals([Converter::ICANN_DOMAINS => [], Converter::PRIVATE_DOMAINS => []], $retval); } } diff --git a/tests/CurlHttpClientTest.php b/tests/CurlHttpClientTest.php index 7c977bf0..77227451 100644 --- a/tests/CurlHttpClientTest.php +++ b/tests/CurlHttpClientTest.php @@ -32,8 +32,8 @@ class CurlHttpClientTest extends TestCase public function testGetContent() { $content = (new CurlHttpClient())->getContent('https://www.google.com'); - self::assertNotNull($content); - self::assertContains('google', $content); + $this->assertNotNull($content); + $this->assertContains('google', $content); } /** @@ -42,7 +42,7 @@ public function testGetContent() */ public function testThrowsException() { - self::expectException(HttpClientException::class); + $this->expectException(HttpClientException::class); (new CurlHttpClient())->getContent('https://qsfsdfqdf.dfsf'); } @@ -51,7 +51,7 @@ public function testThrowsException() */ public function testConstructorThrowsException() { - self::expectException(Exception::class); + $this->expectException(Exception::class); new CurlHttpClient(['foo' => 'bar']); } } diff --git a/tests/DomainTest.php b/tests/DomainTest.php index c881470c..8a1a4e34 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -43,9 +43,9 @@ class DomainTest extends TestCase public function testRegistrableDomainIsNullWithFoundDomain() { $domain = new Domain('faketld', null); - self::assertNull($domain->getPublicSuffix()); - self::assertNull($domain->getRegistrableDomain()); - self::assertNull($domain->getSubDomain()); + $this->assertNull($domain->getPublicSuffix()); + $this->assertNull($domain->getRegistrableDomain()); + $this->assertNull($domain->getSubDomain()); } /** @@ -54,10 +54,12 @@ public function testRegistrableDomainIsNullWithFoundDomain() * @covers ::normalize * @dataProvider provideWrongConstructor * + * @param mixed $domain + * @param mixed $publicSuffix */ public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain($domain, $publicSuffix) { - self::expectException(CouldNotResolvePublicSuffix::class); + $this->expectException(CouldNotResolvePublicSuffix::class); new Domain($domain, new PublicSuffix($publicSuffix)); } @@ -89,10 +91,11 @@ public function provideWrongConstructor() * @covers ::setLabels * @covers ::idnToAscii * @covers ::getIdnErrors + * @param string $domain */ public function testToAsciiThrowsException(string $domain) { - self::expectException(InvalidDomain::class); + $this->expectException(InvalidDomain::class); new Domain($domain); } @@ -112,7 +115,7 @@ public function invalidDomainProvider() */ public function testToUnicodeThrowsException() { - self::expectException(InvalidDomain::class); + $this->expectException(InvalidDomain::class); (new Domain('xn--a-ecp.ru'))->toUnicode(); } @@ -128,14 +131,14 @@ public function testDomainInternalPhpMethod() { $domain = new Domain('www.ulb.ac.be', new PublicSuffix('ac.be')); $generateDomain = eval('return '.var_export($domain, true).';'); - self::assertInternalType('array', $domain->__debugInfo()); - self::assertEquals($domain, $generateDomain); - self::assertSame(['be', 'ac', 'ulb', 'www'], iterator_to_array($domain)); - self::assertJsonStringEqualsJsonString( + $this->assertInternalType('array', $domain->__debugInfo()); + $this->assertEquals($domain, $generateDomain); + $this->assertSame(['be', 'ac', 'ulb', 'www'], iterator_to_array($domain)); + $this->assertJsonStringEqualsJsonString( json_encode($domain->__debugInfo()), json_encode($domain) ); - self::assertSame('www.ulb.ac.be', (string) $domain); + $this->assertSame('www.ulb.ac.be', (string) $domain); } /** @@ -151,8 +154,8 @@ public function testDomainInternalPhpMethod() public function testCountable($domain, $nbLabels, $labels) { $domain = new Domain($domain); - self::assertCount($nbLabels, $domain); - self::assertSame($labels, iterator_to_array($domain)); + $this->assertCount($nbLabels, $domain); + $this->assertSame($labels, iterator_to_array($domain)); } public function countableProvider() @@ -171,11 +174,11 @@ public function countableProvider() public function testGetLabel() { $domain = new Domain('master.example.com'); - self::assertSame('com', $domain->getLabel(0)); - self::assertSame('example', $domain->getLabel(1)); - self::assertSame('master', $domain->getLabel(-1)); - self::assertNull($domain->getLabel(23)); - self::assertNull($domain->getLabel(-23)); + $this->assertSame('com', $domain->getLabel(0)); + $this->assertSame('example', $domain->getLabel(1)); + $this->assertSame('master', $domain->getLabel(-1)); + $this->assertNull($domain->getLabel(23)); + $this->assertNull($domain->getLabel(-23)); } /** @@ -184,8 +187,8 @@ public function testGetLabel() public function testOffsets() { $domain = new Domain('master.com.example.com'); - self::assertSame([0, 2], $domain->keys('com')); - self::assertSame([], $domain->keys('toto')); + $this->assertSame([0, 2], $domain->keys('com')); + $this->assertSame([], $domain->keys('toto')); } /** @@ -218,12 +221,12 @@ public function testToIDN( $expectedIDNSuffix ) { $domain = new Domain($domain, new PublicSuffix($publicSuffix)); - self::assertSame($expectedDomain, $domain->getDomain()); - self::assertSame($expectedSuffix, $domain->getPublicSuffix()); + $this->assertSame($expectedDomain, $domain->getDomain()); + $this->assertSame($expectedSuffix, $domain->getPublicSuffix()); $domainIDN = $domain->toUnicode(); - self::assertSame($expectedIDNDomain, $domainIDN->getDomain()); - self::assertSame($expectedIDNSuffix, $domainIDN->getPublicSuffix()); + $this->assertSame($expectedIDNDomain, $domainIDN->getDomain()); + $this->assertSame($expectedIDNSuffix, $domainIDN->getPublicSuffix()); } public function toUnicodeProvider() @@ -318,12 +321,12 @@ public function testToAscii( $expectedAsciiSuffix ) { $domain = new Domain($domain, new PublicSuffix($publicSuffix)); - self::assertSame($expectedDomain, $domain->getDomain()); - self::assertSame($expectedSuffix, $domain->getPublicSuffix()); + $this->assertSame($expectedDomain, $domain->getDomain()); + $this->assertSame($expectedSuffix, $domain->getPublicSuffix()); $domainIDN = $domain->toAscii(); - self::assertSame($expectedAsciiDomain, $domainIDN->getDomain()); - self::assertSame($expectedAsciiSuffix, $domainIDN->getPublicSuffix()); + $this->assertSame($expectedAsciiDomain, $domainIDN->getDomain()); + $this->assertSame($expectedAsciiSuffix, $domainIDN->getPublicSuffix()); } public function toAsciiProvider() @@ -378,10 +381,12 @@ public function toAsciiProvider() * @dataProvider resolvePassProvider * * @param string|null $expected + * @param Domain $domain + * @param mixed $publicSuffix */ public function testResolveWorks(Domain $domain, $publicSuffix, $expected) { - self::assertSame($expected, $domain->resolve($publicSuffix)->getPublicSuffix()); + $this->assertSame($expected, $domain->resolve($publicSuffix)->getPublicSuffix()); } public function resolvePassProvider() @@ -432,10 +437,12 @@ public function resolvePassProvider() * @covers ::resolve * @dataProvider resolveFailsProvider * + * @param Domain $domain + * @param PublicSuffix $publicSuffix */ public function testResolveFails(Domain $domain, PublicSuffix $publicSuffix) { - self::expectException(CouldNotResolvePublicSuffix::class); + $this->expectException(CouldNotResolvePublicSuffix::class); $domain->resolve($publicSuffix); } @@ -475,8 +482,8 @@ public function testResolveReturnsInstance() { $publicSuffix = new PublicSuffix('ac.be', Rules::ICANN_DOMAINS); $domain = new Domain('ulb.ac.be', $publicSuffix); - self::assertSame($domain, $domain->resolve($publicSuffix)); - self::assertNotSame($domain, $domain->resolve(new PublicSuffix('ac.be', Rules::PRIVATE_DOMAINS))); + $this->assertSame($domain, $domain->resolve($publicSuffix)); + $this->assertNotSame($domain, $domain->resolve(new PublicSuffix('ac.be', Rules::PRIVATE_DOMAINS))); } /** @@ -485,16 +492,18 @@ public function testResolveReturnsInstance() * @dataProvider withSubDomainWorksProvider * * @param null|string $expected + * @param Domain $domain + * @param mixed $subdomain */ public function testWithSubDomainWorks(Domain $domain, $subdomain, $expected) { $result = $domain->withSubDomain($subdomain); - self::assertSame($expected, $result->getSubDomain()); - self::assertSame($domain->getPublicSuffix(), $result->getPublicSuffix()); - self::assertSame($domain->getRegistrableDomain(), $result->getRegistrableDomain()); - self::assertSame($domain->isKnown(), $result->isKnown()); - self::assertSame($domain->isICANN(), $result->isICANN()); - self::assertSame($domain->isPrivate(), $result->isPrivate()); + $this->assertSame($expected, $result->getSubDomain()); + $this->assertSame($domain->getPublicSuffix(), $result->getPublicSuffix()); + $this->assertSame($domain->getRegistrableDomain(), $result->getRegistrableDomain()); + $this->assertSame($domain->isKnown(), $result->isKnown()); + $this->assertSame($domain->isICANN(), $result->isICANN()); + $this->assertSame($domain->isPrivate(), $result->isPrivate()); } public function withSubDomainWorksProvider() @@ -534,7 +543,7 @@ public function withSubDomainWorksProvider() */ public function testWithSubDomainFailsWithNullDomain() { - self::expectException(CouldNotResolveSubDomain::class); + $this->expectException(CouldNotResolveSubDomain::class); (new Domain())->withSubDomain('www'); } @@ -544,7 +553,7 @@ public function testWithSubDomainFailsWithNullDomain() */ public function testWithSubDomainFailsWithOneLabelDomain() { - self::expectException(CouldNotResolveSubDomain::class); + $this->expectException(CouldNotResolveSubDomain::class); (new Domain('localhost'))->withSubDomain('www'); } @@ -555,7 +564,7 @@ public function testWithSubDomainFailsWithOneLabelDomain() */ public function testWithSubDomainFailsWithNonStringableObject() { - self::expectException(TypeError::class); + $this->expectException(TypeError::class); (new Domain( 'example.com', new PublicSuffix('com', PublicSuffix::ICANN_DOMAINS) @@ -569,7 +578,7 @@ public function testWithSubDomainFailsWithNonStringableObject() */ public function testWithSubDomainWithoutPublicSuffixInfo() { - self::expectException(CouldNotResolveSubDomain::class); + $this->expectException(CouldNotResolveSubDomain::class); (new Domain('www.example.com'))->withSubDomain('www'); } @@ -578,6 +587,11 @@ public function testWithSubDomainWithoutPublicSuffixInfo() * @dataProvider withPublicSuffixWorksProvider * * @param null|string $expected + * @param Domain $domain + * @param mixed $publicSuffix + * @param bool $isKnown + * @param bool $isICANN + * @param bool $isPrivate */ public function testWithPublicSuffixWorks( Domain $domain, @@ -588,10 +602,10 @@ public function testWithPublicSuffixWorks( bool $isPrivate ) { $result = $domain->withPublicSuffix($publicSuffix); - self::assertSame($expected, $result->getPublicSuffix()); - self::assertSame($isKnown, $result->isKnown()); - self::assertSame($isICANN, $result->isICANN()); - self::assertSame($isPrivate, $result->isPrivate()); + $this->assertSame($expected, $result->getPublicSuffix()); + $this->assertSame($isKnown, $result->isKnown()); + $this->assertSame($isICANN, $result->isICANN()); + $this->assertSame($isPrivate, $result->isPrivate()); } public function withPublicSuffixWorksProvider() @@ -671,7 +685,7 @@ public function withPublicSuffixWorksProvider() */ public function testWithPublicSuffixFailsWithNullDomain() { - self::expectException(InvalidDomain::class); + $this->expectException(InvalidDomain::class); (new Domain())->withPublicSuffix('www'); } @@ -681,6 +695,12 @@ public function testWithPublicSuffixFailsWithNullDomain() * @dataProvider withLabelWorksProvider * * @param null|string $expected + * @param Domain $domain + * @param int $key + * @param mixed $label + * @param bool $isKnown + * @param bool $isICANN + * @param bool $isPrivate */ public function testWithLabelWorks( Domain $domain, @@ -692,10 +712,10 @@ public function testWithLabelWorks( bool $isPrivate ) { $result = $domain->withLabel($key, $label); - self::assertSame($expected, $result->getContent()); - self::assertSame($isKnown, $result->isKnown()); - self::assertSame($isICANN, $result->isICANN()); - self::assertSame($isPrivate, $result->isPrivate()); + $this->assertSame($expected, $result->getContent()); + $this->assertSame($isKnown, $result->isKnown()); + $this->assertSame($isICANN, $result->isICANN()); + $this->assertSame($isPrivate, $result->isPrivate()); } public function withLabelWorksProvider() @@ -801,7 +821,7 @@ public function withLabelWorksProvider() */ public function testWithLabelFailsWithTypeError() { - self::expectException(InvalidLabel::class); + $this->expectException(InvalidLabel::class); (new Domain('example.com'))->withLabel(1, null); } @@ -810,7 +830,7 @@ public function testWithLabelFailsWithTypeError() */ public function testWithLabelFailsWithInvalidKey() { - self::expectException(InvalidLabelKey::class); + $this->expectException(InvalidLabelKey::class); (new Domain('example.com'))->withLabel(-4, 'www'); } @@ -819,7 +839,7 @@ public function testWithLabelFailsWithInvalidKey() */ public function testWithLabelFailsWithInvalidLabel2() { - self::expectException(InvalidDomain::class); + $this->expectException(InvalidDomain::class); (new Domain('example.com'))->withLabel(-1, ''); } @@ -835,7 +855,7 @@ public function testWithLabelFailsWithInvalidLabel2() */ public function testAppend($raw, $append, $expected) { - self::assertSame($expected, (string) (new Domain($raw))->append($append)); + $this->assertSame($expected, (string) (new Domain($raw))->append($append)); } public function validAppend() @@ -860,7 +880,7 @@ public function validAppend() */ public function testPrepend($raw, $prepend, $expected) { - self::assertSame($expected, (string) (new Domain($raw))->prepend($prepend)); + $this->assertSame($expected, (string) (new Domain($raw))->prepend($prepend)); } public function validPrepend() @@ -877,6 +897,11 @@ public function validPrepend() * @dataProvider withoutLabelWorksProvider * * @param null|string $expected + * @param Domain $domain + * @param int $key + * @param bool $isKnown + * @param bool $isICANN + * @param bool $isPrivate */ public function testwithoutLabelWorks( Domain $domain, @@ -887,10 +912,10 @@ public function testwithoutLabelWorks( bool $isPrivate ) { $result = $domain->withoutLabel($key); - self::assertSame($expected, $result->getContent()); - self::assertSame($isKnown, $result->isKnown()); - self::assertSame($isICANN, $result->isICANN()); - self::assertSame($isPrivate, $result->isPrivate()); + $this->assertSame($expected, $result->getContent()); + $this->assertSame($isKnown, $result->isKnown()); + $this->assertSame($isICANN, $result->isICANN()); + $this->assertSame($isPrivate, $result->isPrivate()); } public function withoutLabelWorksProvider() @@ -938,7 +963,7 @@ public function withoutLabelWorksProvider() */ public function testwithoutLabelFailsWithInvalidKey() { - self::expectException(InvalidLabelKey::class); + $this->expectException(InvalidLabelKey::class); (new Domain('example.com'))->withoutLabel(-3); } @@ -947,6 +972,6 @@ public function testwithoutLabelFailsWithInvalidKey() */ public function testwithoutLabelWorksWithMultipleKeys() { - self::assertNull((new Domain('www.example.com'))->withoutLabel(0, 1, 2)->getContent()); + $this->assertNull((new Domain('www.example.com'))->withoutLabel(0, 1, 2)->getContent()); } } diff --git a/tests/ManagerTest.php b/tests/ManagerTest.php index bffce672..914f69ea 100644 --- a/tests/ManagerTest.php +++ b/tests/ManagerTest.php @@ -71,10 +71,11 @@ public function tearDown() * @dataProvider validTtlProvider * @covers ::__construct * @covers ::filterTtl + * @param mixed $ttl */ public function testConstructor($ttl) { - self::assertInstanceOf(Manager::class, new Manager($this->cachePool, $this->client, $ttl)); + $this->assertInstanceOf(Manager::class, new Manager($this->cachePool, $this->client, $ttl)); } public function validTtlProvider() @@ -92,9 +93,9 @@ public function validTtlProvider() * @covers ::__construct * @covers ::filterTtl */ - public function testConstructorTrowsException() + public function testConstructorThrowsException() { - self::expectException(TypeError::class); + $this->expectException(TypeError::class); new Manager($this->cachePool, $this->client, tmpfile()); } @@ -107,8 +108,8 @@ public function testRefreshRules() { $manager = new Manager($this->cachePool, $this->client); $previous = $manager->getRules(); - self::assertTrue($manager->refreshRules()); - self::assertEquals($previous, $manager->getRules()); + $this->assertTrue($manager->refreshRules()); + $this->assertEquals($previous, $manager->getRules()); } /** @@ -122,7 +123,7 @@ public function testRebuildRulesFromRemoveSource() $previous = $manager->getRules(Manager::PSL_URL); $this->cachePool->clear(); //delete all local cache $list = $manager->getRules(Manager::PSL_URL); - self::assertEquals($previous, $manager->getRules(Manager::PSL_URL)); + $this->assertEquals($previous, $manager->getRules(Manager::PSL_URL)); } /** @@ -173,7 +174,7 @@ public function has($key) } }; - self::expectException(CouldNotLoadRules::class); + $this->expectException(CouldNotLoadRules::class); $manager = new Manager($cachePool, $this->client); $manager->getRules('https://google.com'); } @@ -226,7 +227,7 @@ public function has($key) } }; - self::expectException(CouldNotLoadRules::class); + $this->expectException(CouldNotLoadRules::class); $manager = new Manager($cachePool, $this->client); $manager->getRules(); } @@ -240,8 +241,8 @@ public function testRefreshTLDs() { $manager = new Manager($this->cachePool, $this->client); $previous = $manager->getTLDs(); - self::assertTrue($manager->refreshTLDs()); - self::assertEquals($previous, $manager->getTLDs()); + $this->assertTrue($manager->refreshTLDs()); + $this->assertEquals($previous, $manager->getTLDs()); } /** @@ -254,7 +255,7 @@ public function testRebuildTLDsFromRemoveSource() $manager = new Manager($this->cachePool, $this->client); $previous = $manager->getTLDs(); $this->cachePool->clear(); //delete all local cache - self::assertEquals($previous, $manager->getTLDs()); + $this->assertEquals($previous, $manager->getTLDs()); } /** @@ -305,7 +306,7 @@ public function has($key) } }; - self::expectException(CouldNotLoadTLDs::class); + $this->expectException(CouldNotLoadTLDs::class); $manager = new Manager($cachePool, $this->client); $manager->getTLDs(); } @@ -358,7 +359,7 @@ public function has($key) } }; - self::expectException(CouldNotLoadTLDs::class); + $this->expectException(CouldNotLoadTLDs::class); $manager = new Manager($cachePool, $this->client); $manager->getTLDs(); } @@ -411,7 +412,7 @@ public function has($key) } }; - self::expectException(CouldNotLoadTLDs::class); + $this->expectException(CouldNotLoadTLDs::class); $manager = new Manager($cachePool, $this->client); $manager->getTLDs(); } diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 7cafdfd7..d870a4a7 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -39,13 +39,13 @@ public function testInternalPhpMethod() { $publicSuffix = new PublicSuffix('ac.be'); $generatePublicSuffix = eval('return '.var_export($publicSuffix, true).';'); - self::assertEquals($publicSuffix, $generatePublicSuffix); - self::assertSame(['be', 'ac'], iterator_to_array($publicSuffix)); - self::assertJsonStringEqualsJsonString( + $this->assertEquals($publicSuffix, $generatePublicSuffix); + $this->assertSame(['be', 'ac'], iterator_to_array($publicSuffix)); + $this->assertJsonStringEqualsJsonString( json_encode($publicSuffix->__debugInfo()), json_encode($publicSuffix) ); - self::assertSame('ac.be', (string) $publicSuffix); + $this->assertSame('ac.be', (string) $publicSuffix); } /** @@ -57,7 +57,7 @@ public function testInternalPhpMethod() */ public function testPSToUnicodeWithUrlEncode() { - self::assertSame('bébe', (new PublicSuffix('b%C3%A9be'))->toUnicode()->getContent()); + $this->assertSame('bébe', (new PublicSuffix('b%C3%A9be'))->toUnicode()->getContent()); } /** @@ -71,13 +71,17 @@ public function testPSToUnicodeWithUrlEncode() * @dataProvider PSProvider * * @param string|null $publicSuffix + * @param string $section + * @param bool $isKnown + * @param bool $isIcann + * @param bool $isPrivate */ public function testSetSection($publicSuffix, string $section, bool $isKnown, bool $isIcann, bool $isPrivate) { $ps = new PublicSuffix($publicSuffix, $section); - self::assertSame($isKnown, $ps->isKnown()); - self::assertSame($isIcann, $ps->isICANN()); - self::assertSame($isPrivate, $ps->isPrivate()); + $this->assertSame($isKnown, $ps->isKnown()); + $this->assertSame($isIcann, $ps->isICANN()); + $this->assertSame($isPrivate, $ps->isPrivate()); } public function PSProvider() @@ -95,10 +99,11 @@ public function PSProvider() * @covers ::setPublicSuffix * @dataProvider invalidPublicSuffixProvider * + * @param mixed $publicSuffix */ public function testConstructorThrowsException($publicSuffix) { - self::expectException(InvalidDomain::class); + $this->expectException(InvalidDomain::class); new PublicSuffix($publicSuffix); } @@ -117,7 +122,7 @@ public function invalidPublicSuffixProvider() */ public function testPSToAsciiThrowsException() { - self::expectException(InvalidDomain::class); + $this->expectException(InvalidDomain::class); new PublicSuffix('a⒈com'); } @@ -127,7 +132,7 @@ public function testPSToAsciiThrowsException() */ public function testSetSectionThrowsException() { - self::expectException(CouldNotResolvePublicSuffix::class); + $this->expectException(CouldNotResolvePublicSuffix::class); new PublicSuffix('ac.be', 'foobar'); } @@ -137,7 +142,7 @@ public function testSetSectionThrowsException() */ public function testToUnicodeThrowsException() { - self::expectException(InvalidDomain::class); + $this->expectException(InvalidDomain::class); (new PublicSuffix('xn--a-ecp.ru'))->toUnicode(); } @@ -154,8 +159,8 @@ public function testToUnicodeThrowsException() public function testConversionReturnsTheSameInstance($publicSuffix) { $instance = new PublicSuffix($publicSuffix); - self::assertSame($instance->toUnicode(), $instance); - self::assertSame($instance->toAscii(), $instance); + $this->assertSame($instance->toUnicode(), $instance); + $this->assertSame($instance->toAscii(), $instance); } public function conversionReturnsTheSameInstanceProvider() @@ -173,7 +178,7 @@ public function conversionReturnsTheSameInstanceProvider() public function testToUnicodeReturnsSameInstance() { $instance = new PublicSuffix('食狮.公司.cn'); - self::assertSame($instance->toUnicode(), $instance); + $this->assertSame($instance->toUnicode(), $instance); } /** @@ -187,8 +192,8 @@ public function testToUnicodeReturnsSameInstance() public function testCountable($domain, $nbLabels, $labels) { $domain = new PublicSuffix($domain); - self::assertCount($nbLabels, $domain); - self::assertSame($labels, iterator_to_array($domain)); + $this->assertCount($nbLabels, $domain); + $this->assertSame($labels, iterator_to_array($domain)); } public function countableProvider() @@ -206,11 +211,11 @@ public function countableProvider() public function testGetLabel() { $domain = new PublicSuffix('master.example.com'); - self::assertSame('com', $domain->getLabel(0)); - self::assertSame('example', $domain->getLabel(1)); - self::assertSame('master', $domain->getLabel(-1)); - self::assertNull($domain->getLabel(23)); - self::assertNull($domain->getLabel(-23)); + $this->assertSame('com', $domain->getLabel(0)); + $this->assertSame('example', $domain->getLabel(1)); + $this->assertSame('master', $domain->getLabel(-1)); + $this->assertNull($domain->getLabel(23)); + $this->assertNull($domain->getLabel(-23)); } /** @@ -219,22 +224,23 @@ public function testGetLabel() public function testOffsets() { $domain = new PublicSuffix('master.example.com'); - self::assertSame([2], $domain->keys('master')); + $this->assertSame([2], $domain->keys('master')); } /** * @covers ::createFromDomain * @dataProvider createFromDomainProvider * + * @param Domain $domain * @param null|string $expected */ public function testCreateFromDomainWorks(Domain $domain, $expected) { $result = PublicSuffix::createFromDomain($domain); - self::assertSame($expected, $result->getContent()); - self::assertSame($result->isKnown(), $domain->isKnown()); - self::assertSame($result->isICANN(), $domain->isICANN()); - self::assertSame($result->isPrivate(), $domain->isPrivate()); + $this->assertSame($expected, $result->getContent()); + $this->assertSame($result->isKnown(), $domain->isKnown()); + $this->assertSame($result->isICANN(), $domain->isICANN()); + $this->assertSame($result->isPrivate(), $domain->isPrivate()); } public function createFromDomainProvider() diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 89063a45..7f1a52b5 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -15,10 +15,13 @@ namespace Pdp\Tests; +use Pdp\Cache; +use Pdp\CurlHttpClient; use Pdp\Domain; use Pdp\Exception\CouldNotLoadRules; use Pdp\Exception\CouldNotResolvePublicSuffix; use Pdp\Exception\InvalidDomain; +use Pdp\Manager; use Pdp\PublicSuffix; use Pdp\Rules; use PHPUnit\Framework\TestCase; @@ -36,7 +39,7 @@ class RulesTest extends TestCase public function setUp() { - $this->rules = Rules::createFromPath(__DIR__.'/data/public_suffix_list.dat'); + $this->rules = (new Manager(new Cache(), new CurlHttpClient()))->getRules(); } /** @@ -54,7 +57,7 @@ public function testCreateFromPath() ]); $rules = Rules::createFromPath(__DIR__.'/data/public_suffix_list.dat', $context); - self::assertInstanceOf(Rules::class, $rules); + $this->assertInstanceOf(Rules::class, $rules); } /** @@ -62,7 +65,7 @@ public function testCreateFromPath() */ public function testCreateFromPathThrowsException() { - self::expectException(CouldNotLoadRules::class); + $this->expectException(CouldNotLoadRules::class); Rules::createFromPath('/foo/bar.dat'); } @@ -73,7 +76,7 @@ public function testCreateFromPathThrowsException() public function testDomainInternalPhpMethod() { $generateRules = eval('return '.var_export($this->rules, true).';'); - self::assertEquals($this->rules, $generateRules); + $this->assertEquals($this->rules, $generateRules); } /** @@ -88,7 +91,7 @@ public function testDomainInternalPhpMethod() public function testNullWillReturnNullDomain() { $domain = $this->rules->resolve('COM'); - self::assertFalse($domain->isKnown()); + $this->assertFalse($domain->isKnown()); } @@ -98,7 +101,7 @@ public function testNullWillReturnNullDomain() */ public function testThrowsTypeErrorOnWrongInput() { - self::expectException(TypeError::class); + $this->expectException(TypeError::class); $this->rules->resolve(date_create()); } @@ -108,7 +111,7 @@ public function testThrowsTypeErrorOnWrongInput() */ public function testResolveThrowsExceptionOnWrongDomainType() { - self::expectException(CouldNotResolvePublicSuffix::class); + $this->expectException(CouldNotResolvePublicSuffix::class); $this->rules->resolve('www.example.com', 'foobar'); } @@ -126,7 +129,7 @@ public function testResolveThrowsExceptionOnWrongDomainType() public function testIsSuffixValidFalse() { $domain = $this->rules->resolve('www.example.faketld'); - self::assertFalse($domain->isKnown()); + $this->assertFalse($domain->isKnown()); } /** @@ -148,9 +151,9 @@ public function testIsSuffixValidFalse() public function testIsSuffixValidTrue() { $domain = $this->rules->resolve('www.example.com', Rules::ICANN_DOMAINS); - self::assertTrue($domain->isKnown()); - self::assertTrue($domain->isICANN()); - self::assertFalse($domain->isPrivate()); + $this->assertTrue($domain->isKnown()); + $this->assertTrue($domain->isICANN()); + $this->assertFalse($domain->isPrivate()); } /** @@ -172,9 +175,9 @@ public function testIsSuffixValidTrue() public function testIsSuffixValidFalseWithPunycoded() { $domain = $this->rules->resolve('www.example.xn--85x722f'); - self::assertFalse($domain->isKnown()); - self::assertFalse($domain->isICANN()); - self::assertFalse($domain->isPrivate()); + $this->assertFalse($domain->isKnown()); + $this->assertFalse($domain->isICANN()); + $this->assertFalse($domain->isPrivate()); } /** @@ -196,9 +199,9 @@ public function testIsSuffixValidFalseWithPunycoded() public function testSubDomainIsNull() { $domain = $this->rules->resolve('ulb.ac.be', Rules::ICANN_DOMAINS); - self::assertTrue($domain->isKnown()); - self::assertTrue($domain->isICANN()); - self::assertFalse($domain->isPrivate()); + $this->assertTrue($domain->isKnown()); + $this->assertTrue($domain->isICANN()); + $this->assertFalse($domain->isPrivate()); } /** @@ -209,7 +212,7 @@ public function testSubDomainIsNull() public function testWithExceptionName() { $domain = $this->rules->resolve('_b%C3%A9bé.be-'); - self::assertNull($domain->getContent()); + $this->assertNull($domain->getContent()); } /** @@ -223,10 +226,10 @@ public function testWithExceptionName() public function testWithPrivateDomain() { $domain = $this->rules->resolve('thephpleague.github.io'); - self::assertTrue($domain->isKnown()); - self::assertFalse($domain->isICANN()); - self::assertTrue($domain->isPrivate()); - self::assertSame('github.io', $domain->getPublicSuffix()); + $this->assertTrue($domain->isKnown()); + $this->assertFalse($domain->isICANN()); + $this->assertTrue($domain->isPrivate()); + $this->assertSame('github.io', $domain->getPublicSuffix()); } /** @@ -236,11 +239,11 @@ public function testWithPrivateDomain() public function testWithAbsoluteHostInvalid() { $domain = $this->rules->resolve('private.ulb.ac.be.'); - self::assertSame('private.ulb.ac.be.', $domain->getContent()); - self::assertFalse($domain->isKnown()); - self::assertFalse($domain->isICANN()); - self::assertFalse($domain->isPrivate()); - self::assertNull($domain->getPublicSuffix()); + $this->assertSame('private.ulb.ac.be.', $domain->getContent()); + $this->assertFalse($domain->isKnown()); + $this->assertFalse($domain->isICANN()); + $this->assertFalse($domain->isPrivate()); + $this->assertNull($domain->getPublicSuffix()); } /** @@ -254,11 +257,11 @@ public function testWithAbsoluteHostInvalid() public function testWithPrivateDomainInvalid() { $domain = $this->rules->resolve('private.ulb.ac.be', Rules::PRIVATE_DOMAINS); - self::assertSame('private.ulb.ac.be', $domain->getContent()); - self::assertFalse($domain->isKnown()); - self::assertFalse($domain->isICANN()); - self::assertFalse($domain->isPrivate()); - self::assertSame('be', $domain->getPublicSuffix()); + $this->assertSame('private.ulb.ac.be', $domain->getContent()); + $this->assertFalse($domain->isKnown()); + $this->assertFalse($domain->isICANN()); + $this->assertFalse($domain->isPrivate()); + $this->assertSame('be', $domain->getPublicSuffix()); } /** @@ -272,11 +275,11 @@ public function testWithPrivateDomainInvalid() public function testWithPrivateDomainValid() { $domain = $this->rules->resolve('thephpleague.github.io', Rules::PRIVATE_DOMAINS); - self::assertSame('thephpleague.github.io', $domain->getContent()); - self::assertTrue($domain->isKnown()); - self::assertFalse($domain->isICANN()); - self::assertTrue($domain->isPrivate()); - self::assertSame('github.io', $domain->getPublicSuffix()); + $this->assertSame('thephpleague.github.io', $domain->getContent()); + $this->assertTrue($domain->isKnown()); + $this->assertFalse($domain->isICANN()); + $this->assertTrue($domain->isPrivate()); + $this->assertSame('github.io', $domain->getPublicSuffix()); } /** @@ -290,11 +293,11 @@ public function testWithPrivateDomainValid() public function testWithICANNDomainInvalid() { $domain = $this->rules->resolve('private.ulb.ac.be'); - self::assertSame('private.ulb.ac.be', $domain->getContent()); - self::assertTrue($domain->isKnown()); - self::assertTrue($domain->isICANN()); - self::assertFalse($domain->isPrivate()); - self::assertSame('ac.be', $domain->getPublicSuffix()); + $this->assertSame('private.ulb.ac.be', $domain->getContent()); + $this->assertTrue($domain->isKnown()); + $this->assertTrue($domain->isICANN()); + $this->assertFalse($domain->isPrivate()); + $this->assertSame('ac.be', $domain->getPublicSuffix()); } /** @@ -309,12 +312,12 @@ public function testWithDomainObject() { $domain = new Domain('private.ulb.ac.be', new PublicSuffix('ac.be', Rules::ICANN_DOMAINS)); $newDomain = $this->rules->resolve($domain); - self::assertSame('private.ulb.ac.be', $domain->getContent()); - self::assertTrue($domain->isKnown()); - self::assertTrue($domain->isICANN()); - self::assertFalse($domain->isPrivate()); - self::assertSame('ac.be', $domain->getPublicSuffix()); - self::assertSame($domain, $newDomain); + $this->assertSame('private.ulb.ac.be', $domain->getContent()); + $this->assertTrue($domain->isKnown()); + $this->assertTrue($domain->isICANN()); + $this->assertFalse($domain->isPrivate()); + $this->assertSame('ac.be', $domain->getPublicSuffix()); + $this->assertSame($domain, $newDomain); } /** @@ -323,7 +326,7 @@ public function testWithDomainObject() */ public function testWithDomainInterfaceObject() { - self::assertSame( + $this->assertSame( 'ac.be', $this->rules->getPublicSuffix(new PublicSuffix('ul.ac.be', Rules::ICANN_DOMAINS))->getContent() ); @@ -335,10 +338,14 @@ public function testWithDomainInterfaceObject() * @covers \Pdp\Domain::getRegistrableDomain * @dataProvider parseDataProvider * + * @param mixed $publicSuffix + * @param mixed $registrableDomain + * @param mixed $domain + * @param mixed $expectedDomain */ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) { - self::assertSame($registrableDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getRegistrableDomain()); + $this->assertSame($registrableDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getRegistrableDomain()); } /** @@ -348,10 +355,14 @@ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $dom * @covers \Pdp\Domain::getPublicSuffix * @dataProvider parseDataProvider * + * @param mixed $publicSuffix + * @param mixed $registrableDomain + * @param mixed $domain + * @param mixed $expectedDomain */ public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, $expectedDomain) { - self::assertSame($publicSuffix, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getPublicSuffix()); + $this->assertSame($publicSuffix, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getPublicSuffix()); } /** @@ -361,10 +372,14 @@ public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, * @covers \Pdp\Domain::getContent * @dataProvider parseDataProvider * + * @param mixed $publicSuffix + * @param mixed $registrableDomain + * @param mixed $domain + * @param mixed $expectedDomain */ public function testGetDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) { - self::assertSame($expectedDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getContent()); + $this->assertSame($expectedDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getContent()); } public function parseDataProvider() @@ -400,10 +415,12 @@ public function parseDataProvider() * @covers \Pdp\IDNAConverterTrait::setLabels * @dataProvider invalidParseProvider * + * @param mixed $domain + * @param mixed $section */ public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix($domain, $section) { - self::expectException(CouldNotResolvePublicSuffix::class); + $this->expectException(CouldNotResolvePublicSuffix::class); $this->rules->getPublicSuffix($domain, $section); } @@ -423,10 +440,12 @@ public function invalidParseProvider() * @covers \Pdp\IDNAConverterTrait::setLabels * @dataProvider invalidDomainParseProvider * + * @param mixed $domain + * @param mixed $section */ public function testGetPublicSuffixThrowsInvalidDomainException($domain, $section) { - self::expectException(InvalidDomain::class); + $this->expectException(InvalidDomain::class); $this->rules->getPublicSuffix($domain, $section); } @@ -459,7 +478,7 @@ public function invalidDomainParseProvider() public function testPublicSuffixSection($domain, $expected) { $publicSuffix = $this->rules->getPublicSuffix($domain); - self::assertSame($expected, $publicSuffix->getContent()); + $this->assertSame($expected, $publicSuffix->getContent()); } public function validPublicSectionProvider() @@ -495,7 +514,7 @@ public function validPublicSectionProvider() */ public function checkPublicSuffix($input, $expected) { - self::assertSame($expected, $this->rules->resolve($input)->getRegistrableDomain()); + $this->assertSame($expected, $this->rules->resolve($input)->getRegistrableDomain()); } /** diff --git a/tests/TLDConverterTest.php b/tests/TLDConverterTest.php index 601d7491..62ee8689 100644 --- a/tests/TLDConverterTest.php +++ b/tests/TLDConverterTest.php @@ -28,19 +28,20 @@ public function testConverter() { $string = file_get_contents(__DIR__.'/data/root_zones.dat'); $res = (new TLDConverter())->convert($string); - self::assertInternalType('array', $res); - self::assertArrayHasKey('version', $res); - self::assertArrayHasKey('modifiedDate', $res); - self::assertArrayHasKey('records', $res); - self::assertInternalType('array', $res['records']); + $this->assertInternalType('array', $res); + $this->assertArrayHasKey('version', $res); + $this->assertArrayHasKey('modifiedDate', $res); + $this->assertArrayHasKey('records', $res); + $this->assertInternalType('array', $res['records']); } /** * @dataProvider invalidContentProvider + * @param string $content */ public function testConverterThrowsException(string $content) { - self::expectException(CouldNotLoadTLDs::class); + $this->expectException(CouldNotLoadTLDs::class); (new TLDConverter())->convert($content); } diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index 041aed8e..af698e07 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -52,7 +52,7 @@ public function testCreateFromPath() ]); $collection = TopLevelDomains::createFromPath(__DIR__.'/data/root_zones.dat', $context); - self::assertInstanceOf(TopLevelDomains::class, $collection); + $this->assertInstanceOf(TopLevelDomains::class, $collection); } /** @@ -60,7 +60,7 @@ public function testCreateFromPath() */ public function testCreateFromPathThrowsException() { - self::expectException(CouldNotLoadTLDs::class); + $this->expectException(CouldNotLoadTLDs::class); TopLevelDomains::createFromPath('/foo/bar.dat'); } @@ -71,35 +71,36 @@ public function testCreateFromPathThrowsException() public function testSetState() { $collection = eval('return '.var_export($this->collection, true).';'); - self::assertEquals($this->collection, $collection); + $this->assertEquals($this->collection, $collection); } public function testGetterProperties() { $collection = TopLevelDomains::createFromPath(__DIR__.'/data/root_zones.dat'); - self::assertCount(15, $collection); - self::assertSame('2018082200', $collection->getVersion()); - self::assertEquals( + $this->assertCount(15, $collection); + $this->assertSame('2018082200', $collection->getVersion()); + $this->assertEquals( new DateTimeImmutable('2018-08-22 07:07:01', new DateTimeZone('UTC')), $collection->getModifiedDate() ); - self::assertFalse($collection->isEmpty()); + $this->assertFalse($collection->isEmpty()); $converter = new TLDConverter(); $data = $converter->convert(file_get_contents(__DIR__.'/data/root_zones.dat')); - self::assertEquals($data, $collection->toArray()); + $this->assertEquals($data, $collection->toArray()); foreach ($collection as $tld) { - self::assertInstanceOf(PublicSuffix::class, $tld); + $this->assertInstanceOf(PublicSuffix::class, $tld); } } /** * @dataProvider validDomainProvider + * @param mixed $tld */ public function testResolve($tld) { - self::assertSame( + $this->assertSame( (new Domain($tld))->getLabel(0), $this->collection->resolve($tld)->getPublicSuffix() ); @@ -127,33 +128,34 @@ public function __toString() public function testResolveThrowsTypeError() { - self::expectException(TypeError::class); + $this->expectException(TypeError::class); $this->collection->resolve(new DateTimeImmutable()); } public function testResolveWithInvalidDomain() { - self::assertEquals(new Domain(), $this->collection->resolve('###')); + $this->assertEquals(new Domain(), $this->collection->resolve('###')); } public function testResolveWithUnResolvableDomain() { $domain = 'localhost'; - self::assertEquals(new Domain($domain), $this->collection->resolve($domain)); + $this->assertEquals(new Domain($domain), $this->collection->resolve($domain)); } public function testResolveWithUnregisteredTLD() { $collection = TopLevelDomains::createFromPath(__DIR__.'/data/root_zones.dat'); - self::assertNull($collection->resolve('localhost.locale')->getPublicSuffix()); + $this->assertNull($collection->resolve('localhost.locale')->getPublicSuffix()); } /** * @dataProvider validTldProvider + * @param mixed $tld */ public function testContainsReturnsTrue($tld) { - self::assertTrue($this->collection->contains($tld)); + $this->assertTrue($this->collection->contains($tld)); } public function validTldProvider() @@ -180,10 +182,11 @@ public function __toString() /** * @dataProvider invalidTldProvider + * @param mixed $tld */ public function testContainsReturnsFalse($tld) { - self::assertFalse($this->collection->contains($tld)); + $this->assertFalse($this->collection->contains($tld)); } public function invalidTldProvider() From 18c8201db13a4965872ac2de532c027b63200d74 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 26 Oct 2018 11:53:30 +0200 Subject: [PATCH 129/461] Improve code readability --- ...ULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- ...ULL_f18a70477d29d525b9220612e2115345.cache | 2 +- src/Converter.php | 3 +-- src/Manager.php | 20 +++++++------------ src/TopLevelDomains.php | 6 ++++-- 5 files changed, 14 insertions(+), 19 deletions(-) diff --git a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache index bcd50954..bac1502b 100644 --- a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache +++ b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache @@ -1 +1 @@ -s:108089:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"ong":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"ponpes":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodhands":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jlc":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"panerai":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telecity":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vista":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastvps-server":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lmpm":{"app":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[],"cn-northwest-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"eus":{"party":{"user":[]}},"ca":{"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"io":{"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"ravendb":[],"barsy":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"co":{"otap":{"*":[]},"com":{"blogspot":[]},"mypi":[],"n4t":[],"nodum":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]},"zone":[]},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"app":{"hasura":[]},"community":{"ravendb":[]},"run":{"development":[],"ravendb":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"space":{"linkitools":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ai":{"nom":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file +s:108039:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"ong":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"ponpes":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastvps-server":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lmpm":{"app":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[],"cn-northwest-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"io":{"apigee":[],"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"eus":{"party":{"user":[]}},"ca":{"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"ravendb":[],"barsy":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"co":{"otap":{"*":[]},"com":{"blogspot":[]},"mypi":[],"n4t":[],"nodum":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]},"zone":[]},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"app":{"hasura":[]},"community":{"ravendb":[]},"run":{"development":[],"ravendb":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"space":{"linkitools":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ai":{"nom":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file diff --git a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache index f27c5df9..f866dcb4 100644 --- a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache +++ b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache @@ -1 +1 @@ -s:13480:"{"version":"2018082501","modifiedDate":"2018-08-26T07:07:02+00:00","records":["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac","academy","accenture","accountant","accountants","aco","active","actor","ad","adac","ads","adult","ae","aeg","aero","aetna","af","afamilycompany","afl","africa","ag","agakhan","agency","ai","aig","aigo","airbus","airforce","airtel","akdn","al","alfaromeo","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","am","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","ao","aol","apartments","app","apple","aq","aquarelle","ar","arab","aramco","archi","army","arpa","art","arte","as","asda","asia","associates","at","athleta","attorney","au","auction","audi","audible","audio","auspost","author","auto","autos","avianca","aw","aws","ax","axa","az","azure","ba","baby","baidu","banamex","bananarepublic","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bb","bbc","bbt","bbva","bcg","bcn","bd","be","beats","beauty","beer","bentley","berlin","best","bestbuy","bet","bf","bg","bh","bharti","bi","bible","bid","bike","bing","bingo","bio","biz","bj","black","blackfriday","blanco","blockbuster","blog","bloomberg","blue","bm","bms","bmw","bn","bnl","bnpparibas","bo","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","br","bradesco","bridgestone","broadway","broker","brother","brussels","bs","bt","budapest","bugatti","build","builders","business","buy","buzz","bv","bw","by","bz","bzh","ca","cab","cafe","cal","call","calvinklein","cam","camera","camp","cancerresearch","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","cartier","casa","case","caseih","cash","casino","cat","catering","catholic","cba","cbn","cbre","cbs","cc","cd","ceb","center","ceo","cern","cf","cfa","cfd","cg","ch","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","chrysler","church","ci","cipriani","circle","cisco","citadel","citi","citic","city","cityeats","ck","cl","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","cm","cn","co","coach","codes","coffee","college","cologne","com","comcast","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cookingchannel","cool","coop","corsica","country","coupon","coupons","courses","cr","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","csc","cu","cuisinella","cv","cw","cx","cy","cymru","cyou","cz","dabur","dad","dance","data","date","dating","datsun","day","dclk","dds","de","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dj","dk","dm","dnp","do","docs","doctor","dodge","dog","doha","domains","dot","download","drive","dtv","dubai","duck","dunlop","duns","dupont","durban","dvag","dvr","dz","earth","eat","ec","eco","edeka","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","epost","epson","equipment","er","ericsson","erni","es","esq","estate","esurance","et","etisalat","eu","eurovision","eus","events","everbank","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fi","fiat","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","fj","fk","flickr","flights","flir","florist","flowers","fly","fm","fo","foo","food","foodnetwork","football","ford","forex","forsale","forum","foundation","fox","fr","free","fresenius","frl","frogans","frontdoor","frontier","ftr","fujitsu","fujixerox","fun","fund","furniture","futbol","fyi","ga","gal","gallery","gallo","gallup","game","games","gap","garden","gb","gbiz","gd","gdn","ge","gea","gent","genting","george","gf","gg","ggee","gh","gi","gift","gifts","gives","giving","gl","glade","glass","gle","global","globo","gm","gmail","gmbh","gmo","gmx","gn","godaddy","gold","goldpoint","golf","goo","goodhands","goodyear","goog","google","gop","got","gov","gp","gq","gr","grainger","graphics","gratis","green","gripe","grocery","group","gs","gt","gu","guardian","gucci","guge","guide","guitars","guru","gw","gy","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hgtv","hiphop","hisamitsu","hitachi","hiv","hk","hkt","hm","hn","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","honeywell","horse","hospital","host","hosting","hot","hoteles","hotels","hotmail","house","how","hr","hsbc","ht","hu","hughes","hyatt","hyundai","ibm","icbc","ice","icu","id","ie","ieee","ifm","ikano","il","im","imamat","imdb","immo","immobilien","in","inc","industries","infiniti","info","ing","ink","institute","insurance","insure","int","intel","international","intuit","investments","io","ipiranga","iq","ir","irish","is","iselect","ismaili","ist","istanbul","it","itau","itv","iveco","jaguar","java","jcb","jcp","je","jeep","jetzt","jewelry","jio","jlc","jll","jm","jmp","jnj","jo","jobs","joburg","jot","joy","jp","jpmorgan","jprs","juegos","juniper","kaufen","kddi","ke","kerryhotels","kerrylogistics","kerryproperties","kfh","kg","kh","ki","kia","kim","kinder","kindle","kitchen","kiwi","km","kn","koeln","komatsu","kosher","kp","kpmg","kpn","kr","krd","kred","kuokgroup","kw","ky","kyoto","kz","la","lacaixa","ladbrokes","lamborghini","lamer","lancaster","lancia","lancome","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lb","lc","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","li","liaison","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","linde","link","lipsy","live","living","lixil","lk","llc","loan","loans","locker","locus","loft","lol","london","lotte","lotto","love","lpl","lplfinancial","lr","ls","lt","ltd","ltda","lu","lundbeck","lupin","luxe","luxury","lv","ly","ma","macys","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","maserati","mattel","mba","mc","mckinsey","md","me","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","metlife","mg","mh","miami","microsoft","mil","mini","mint","mit","mitsubishi","mk","ml","mlb","mls","mm","mma","mn","mo","mobi","mobile","mobily","moda","moe","moi","mom","monash","money","monster","mopar","mormon","mortgage","moscow","moto","motorcycles","mov","movie","movistar","mp","mq","mr","ms","msd","mt","mtn","mtr","mu","museum","mutual","mv","mw","mx","my","mz","na","nab","nadex","nagoya","name","nationwide","natura","navy","nba","nc","ne","nec","net","netbank","netflix","network","neustar","new","newholland","news","next","nextdirect","nexus","nf","nfl","ng","ngo","nhk","ni","nico","nike","nikon","ninja","nissan","nissay","nl","no","nokia","northwesternmutual","norton","now","nowruz","nowtv","np","nr","nra","nrw","ntt","nu","nyc","nz","obi","observer","off","office","okinawa","olayan","olayangroup","oldnavy","ollo","om","omega","one","ong","onl","online","onyourside","ooo","open","oracle","orange","org","organic","origins","osaka","otsuka","ott","ovh","pa","page","panasonic","panerai","paris","pars","partners","parts","party","passagens","pay","pccw","pe","pet","pf","pfizer","pg","ph","pharmacy","phd","philips","phone","photo","photography","photos","physio","piaget","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","pk","pl","place","play","playstation","plumbing","plus","pm","pn","pnc","pohl","poker","politie","porn","post","pr","pramerica","praxi","press","prime","pro","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","ps","pt","pub","pw","pwc","py","qa","qpon","quebec","quest","qvc","racing","radio","raid","re","read","realestate","realtor","realty","recipes","red","redstone","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","rightathome","ril","rio","rip","rmit","ro","rocher","rocks","rodeo","rogers","room","rs","rsvp","ru","rugby","ruhr","run","rw","rwe","ryukyu","sa","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sb","sbi","sbs","sc","sca","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scjohnson","scor","scot","sd","se","search","seat","secure","security","seek","select","sener","services","ses","seven","sew","sex","sexy","sfr","sg","sh","shangrila","sharp","shaw","shell","shia","shiksha","shoes","shop","shopping","shouji","show","showtime","shriram","si","silk","sina","singles","site","sj","sk","ski","skin","sky","skype","sl","sling","sm","smart","smile","sn","sncf","so","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","space","spiegel","sport","spot","spreadbetting","sr","srl","srt","st","stada","staples","star","starhub","statebank","statefarm","statoil","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","su","sucks","supplies","supply","support","surf","surgery","suzuki","sv","swatch","swiftcover","swiss","sx","sy","sydney","symantec","systems","sz","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tc","tci","td","tdk","team","tech","technology","tel","telefonica","temasek","tennis","teva","tf","tg","th","thd","theater","theatre","tiaa","tickets","tienda","tiffany","tips","tires","tirol","tj","tjmaxx","tjx","tk","tkmaxx","tl","tm","tmall","tn","to","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","tr","trade","trading","training","travel","travelchannel","travelers","travelersinsurance","trust","trv","tt","tube","tui","tunes","tushu","tv","tvs","tw","tz","ua","ubank","ubs","uconnect","ug","uk","unicom","university","uno","uol","ups","us","uy","uz","va","vacations","vana","vanguard","vc","ve","vegas","ventures","verisign","versicherung","vet","vg","vi","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","vista","vistaprint","viva","vivo","vlaanderen","vn","vodka","volkswagen","volvo","vote","voting","voto","voyage","vu","vuelos","wales","walmart","walter","wang","wanggou","warman","watch","watches","weather","weatherchannel","webcam","weber","website","wed","wedding","weibo","weir","wf","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","ws","wtc","wtf","xbox","xerox","xfinity","xihuan","xin","xn--11b4c3d","xn--1ck2e1b","xn--1qqw23a","xn--2scrj9c","xn--30rr7y","xn--3bst00m","xn--3ds443g","xn--3e0b707e","xn--3hcrj9c","xn--3oq18vl8pn36a","xn--3pxu8k","xn--42c2d9a","xn--45br5cyl","xn--45brj9c","xn--45q11c","xn--4gbrim","xn--54b7fta0cc","xn--55qw42g","xn--55qx5d","xn--5su34j936bgsg","xn--5tzm5g","xn--6frz82g","xn--6qq986b3xl","xn--80adxhks","xn--80ao21a","xn--80aqecdr1a","xn--80asehdb","xn--80aswg","xn--8y0a063a","xn--90a3ac","xn--90ae","xn--90ais","xn--9dbq2a","xn--9et52u","xn--9krt00a","xn--b4w605ferd","xn--bck1b9a5dre4c","xn--c1avg","xn--c2br7g","xn--cck2b3b","xn--cg4bki","xn--clchc0ea0b2g2a9gcd","xn--czr694b","xn--czrs0t","xn--czru2d","xn--d1acj3b","xn--d1alf","xn--e1a4c","xn--eckvdtc9d","xn--efvy88h","xn--estv75g","xn--fct429k","xn--fhbei","xn--fiq228c5hs","xn--fiq64b","xn--fiqs8s","xn--fiqz9s","xn--fjq720a","xn--flw351e","xn--fpcrj9c3d","xn--fzc2c9e2c","xn--fzys8d69uvgm","xn--g2xx48c","xn--gckr3f0f","xn--gecrj9c","xn--gk3at1e","xn--h2breg3eve","xn--h2brj9c","xn--h2brj9c8c","xn--hxt814e","xn--i1b6b1a6a2e","xn--imr513n","xn--io0a7i","xn--j1aef","xn--j1amh","xn--j6w193g","xn--jlq61u9w7b","xn--jvr189m","xn--kcrx77d1x4a","xn--kprw13d","xn--kpry57d","xn--kpu716f","xn--kput3i","xn--l1acc","xn--lgbbat1ad8j","xn--mgb9awbf","xn--mgba3a3ejt","xn--mgba3a4f16a","xn--mgba7c0bbn0a","xn--mgbaakc7dvf","xn--mgbaam7a8h","xn--mgbab2bd","xn--mgbai9azgqp6j","xn--mgbayh7gpa","xn--mgbb9fbpob","xn--mgbbh1a","xn--mgbbh1a71e","xn--mgbc0a9azcg","xn--mgbca7dzdo","xn--mgberp4a5d4ar","xn--mgbgu82a","xn--mgbi4ecexp","xn--mgbpl2fh","xn--mgbt3dhd","xn--mgbtx2b","xn--mgbx4cd0ab","xn--mix891f","xn--mk1bu44c","xn--mxtq1m","xn--ngbc5azd","xn--ngbe9e0a","xn--ngbrx","xn--node","xn--nqv7f","xn--nqv7fs00ema","xn--nyqy26a","xn--o3cw4h","xn--ogbpf8fl","xn--otu796d","xn--p1acf","xn--p1ai","xn--pbt977c","xn--pgbs0dh","xn--pssy2u","xn--q9jyb4c","xn--qcka1pmc","xn--qxam","xn--rhqv96g","xn--rovu88b","xn--rvc1e0am3e","xn--s9brj9c","xn--ses554g","xn--t60b56a","xn--tckwe","xn--tiq49xqyj","xn--unup4y","xn--vermgensberater-ctb","xn--vermgensberatung-pwb","xn--vhquv","xn--vuq861b","xn--w4r85el8fhu5dnra","xn--w4rs40l","xn--wgbh1c","xn--wgbl6a","xn--xhq521b","xn--xkc2al3hye2a","xn--xkc2dl3a5ee0h","xn--y9a3aq","xn--yfro4i67o","xn--ygbi2ammx","xn--zfr164b","xxx","xyz","yachts","yahoo","yamaxun","yandex","ye","yodobashi","yoga","yokohama","you","youtube","yt","yun","za","zappos","zara","zero","zip","zippo","zm","zone","zuerich","zw"]}"; \ No newline at end of file +s:13434:"{"version":"2018102500","modifiedDate":"2018-10-25T07:07:02+00:00","records":["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac","academy","accenture","accountant","accountants","aco","active","actor","ad","adac","ads","adult","ae","aeg","aero","aetna","af","afamilycompany","afl","africa","ag","agakhan","agency","ai","aig","aigo","airbus","airforce","airtel","akdn","al","alfaromeo","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","am","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","ao","aol","apartments","app","apple","aq","aquarelle","ar","arab","aramco","archi","army","arpa","art","arte","as","asda","asia","associates","at","athleta","attorney","au","auction","audi","audible","audio","auspost","author","auto","autos","avianca","aw","aws","ax","axa","az","azure","ba","baby","baidu","banamex","bananarepublic","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bb","bbc","bbt","bbva","bcg","bcn","bd","be","beats","beauty","beer","bentley","berlin","best","bestbuy","bet","bf","bg","bh","bharti","bi","bible","bid","bike","bing","bingo","bio","biz","bj","black","blackfriday","blanco","blockbuster","blog","bloomberg","blue","bm","bms","bmw","bn","bnl","bnpparibas","bo","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","br","bradesco","bridgestone","broadway","broker","brother","brussels","bs","bt","budapest","bugatti","build","builders","business","buy","buzz","bv","bw","by","bz","bzh","ca","cab","cafe","cal","call","calvinklein","cam","camera","camp","cancerresearch","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","cartier","casa","case","caseih","cash","casino","cat","catering","catholic","cba","cbn","cbre","cbs","cc","cd","ceb","center","ceo","cern","cf","cfa","cfd","cg","ch","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","chrysler","church","ci","cipriani","circle","cisco","citadel","citi","citic","city","cityeats","ck","cl","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","cm","cn","co","coach","codes","coffee","college","cologne","com","comcast","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cookingchannel","cool","coop","corsica","country","coupon","coupons","courses","cr","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","csc","cu","cuisinella","cv","cw","cx","cy","cymru","cyou","cz","dabur","dad","dance","data","date","dating","datsun","day","dclk","dds","de","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dj","dk","dm","dnp","do","docs","doctor","dodge","dog","doha","domains","dot","download","drive","dtv","dubai","duck","dunlop","duns","dupont","durban","dvag","dvr","dz","earth","eat","ec","eco","edeka","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","epost","epson","equipment","er","ericsson","erni","es","esq","estate","esurance","et","etisalat","eu","eurovision","eus","events","everbank","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fi","fiat","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","fj","fk","flickr","flights","flir","florist","flowers","fly","fm","fo","foo","food","foodnetwork","football","ford","forex","forsale","forum","foundation","fox","fr","free","fresenius","frl","frogans","frontdoor","frontier","ftr","fujitsu","fujixerox","fun","fund","furniture","futbol","fyi","ga","gal","gallery","gallo","gallup","game","games","gap","garden","gb","gbiz","gd","gdn","ge","gea","gent","genting","george","gf","gg","ggee","gh","gi","gift","gifts","gives","giving","gl","glade","glass","gle","global","globo","gm","gmail","gmbh","gmo","gmx","gn","godaddy","gold","goldpoint","golf","goo","goodyear","goog","google","gop","got","gov","gp","gq","gr","grainger","graphics","gratis","green","gripe","grocery","group","gs","gt","gu","guardian","gucci","guge","guide","guitars","guru","gw","gy","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hgtv","hiphop","hisamitsu","hitachi","hiv","hk","hkt","hm","hn","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","honeywell","horse","hospital","host","hosting","hot","hoteles","hotels","hotmail","house","how","hr","hsbc","ht","hu","hughes","hyatt","hyundai","ibm","icbc","ice","icu","id","ie","ieee","ifm","ikano","il","im","imamat","imdb","immo","immobilien","in","inc","industries","infiniti","info","ing","ink","institute","insurance","insure","int","intel","international","intuit","investments","io","ipiranga","iq","ir","irish","is","iselect","ismaili","ist","istanbul","it","itau","itv","iveco","jaguar","java","jcb","jcp","je","jeep","jetzt","jewelry","jio","jll","jm","jmp","jnj","jo","jobs","joburg","jot","joy","jp","jpmorgan","jprs","juegos","juniper","kaufen","kddi","ke","kerryhotels","kerrylogistics","kerryproperties","kfh","kg","kh","ki","kia","kim","kinder","kindle","kitchen","kiwi","km","kn","koeln","komatsu","kosher","kp","kpmg","kpn","kr","krd","kred","kuokgroup","kw","ky","kyoto","kz","la","lacaixa","ladbrokes","lamborghini","lamer","lancaster","lancia","lancome","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lb","lc","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","li","liaison","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","linde","link","lipsy","live","living","lixil","lk","llc","loan","loans","locker","locus","loft","lol","london","lotte","lotto","love","lpl","lplfinancial","lr","ls","lt","ltd","ltda","lu","lundbeck","lupin","luxe","luxury","lv","ly","ma","macys","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","maserati","mattel","mba","mc","mckinsey","md","me","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","metlife","mg","mh","miami","microsoft","mil","mini","mint","mit","mitsubishi","mk","ml","mlb","mls","mm","mma","mn","mo","mobi","mobile","mobily","moda","moe","moi","mom","monash","money","monster","mopar","mormon","mortgage","moscow","moto","motorcycles","mov","movie","movistar","mp","mq","mr","ms","msd","mt","mtn","mtr","mu","museum","mutual","mv","mw","mx","my","mz","na","nab","nadex","nagoya","name","nationwide","natura","navy","nba","nc","ne","nec","net","netbank","netflix","network","neustar","new","newholland","news","next","nextdirect","nexus","nf","nfl","ng","ngo","nhk","ni","nico","nike","nikon","ninja","nissan","nissay","nl","no","nokia","northwesternmutual","norton","now","nowruz","nowtv","np","nr","nra","nrw","ntt","nu","nyc","nz","obi","observer","off","office","okinawa","olayan","olayangroup","oldnavy","ollo","om","omega","one","ong","onl","online","onyourside","ooo","open","oracle","orange","org","organic","origins","osaka","otsuka","ott","ovh","pa","page","panasonic","paris","pars","partners","parts","party","passagens","pay","pccw","pe","pet","pf","pfizer","pg","ph","pharmacy","phd","philips","phone","photo","photography","photos","physio","piaget","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","pk","pl","place","play","playstation","plumbing","plus","pm","pn","pnc","pohl","poker","politie","porn","post","pr","pramerica","praxi","press","prime","pro","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","ps","pt","pub","pw","pwc","py","qa","qpon","quebec","quest","qvc","racing","radio","raid","re","read","realestate","realtor","realty","recipes","red","redstone","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","rightathome","ril","rio","rip","rmit","ro","rocher","rocks","rodeo","rogers","room","rs","rsvp","ru","rugby","ruhr","run","rw","rwe","ryukyu","sa","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sb","sbi","sbs","sc","sca","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scjohnson","scor","scot","sd","se","search","seat","secure","security","seek","select","sener","services","ses","seven","sew","sex","sexy","sfr","sg","sh","shangrila","sharp","shaw","shell","shia","shiksha","shoes","shop","shopping","shouji","show","showtime","shriram","si","silk","sina","singles","site","sj","sk","ski","skin","sky","skype","sl","sling","sm","smart","smile","sn","sncf","so","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","space","spiegel","sport","spot","spreadbetting","sr","srl","srt","st","stada","staples","star","starhub","statebank","statefarm","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","su","sucks","supplies","supply","support","surf","surgery","suzuki","sv","swatch","swiftcover","swiss","sx","sy","sydney","symantec","systems","sz","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tc","tci","td","tdk","team","tech","technology","tel","telefonica","temasek","tennis","teva","tf","tg","th","thd","theater","theatre","tiaa","tickets","tienda","tiffany","tips","tires","tirol","tj","tjmaxx","tjx","tk","tkmaxx","tl","tm","tmall","tn","to","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","tr","trade","trading","training","travel","travelchannel","travelers","travelersinsurance","trust","trv","tt","tube","tui","tunes","tushu","tv","tvs","tw","tz","ua","ubank","ubs","uconnect","ug","uk","unicom","university","uno","uol","ups","us","uy","uz","va","vacations","vana","vanguard","vc","ve","vegas","ventures","verisign","versicherung","vet","vg","vi","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","vistaprint","viva","vivo","vlaanderen","vn","vodka","volkswagen","volvo","vote","voting","voto","voyage","vu","vuelos","wales","walmart","walter","wang","wanggou","warman","watch","watches","weather","weatherchannel","webcam","weber","website","wed","wedding","weibo","weir","wf","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","ws","wtc","wtf","xbox","xerox","xfinity","xihuan","xin","xn--11b4c3d","xn--1ck2e1b","xn--1qqw23a","xn--2scrj9c","xn--30rr7y","xn--3bst00m","xn--3ds443g","xn--3e0b707e","xn--3hcrj9c","xn--3oq18vl8pn36a","xn--3pxu8k","xn--42c2d9a","xn--45br5cyl","xn--45brj9c","xn--45q11c","xn--4gbrim","xn--54b7fta0cc","xn--55qw42g","xn--55qx5d","xn--5su34j936bgsg","xn--5tzm5g","xn--6frz82g","xn--6qq986b3xl","xn--80adxhks","xn--80ao21a","xn--80aqecdr1a","xn--80asehdb","xn--80aswg","xn--8y0a063a","xn--90a3ac","xn--90ae","xn--90ais","xn--9dbq2a","xn--9et52u","xn--9krt00a","xn--b4w605ferd","xn--bck1b9a5dre4c","xn--c1avg","xn--c2br7g","xn--cck2b3b","xn--cg4bki","xn--clchc0ea0b2g2a9gcd","xn--czr694b","xn--czrs0t","xn--czru2d","xn--d1acj3b","xn--d1alf","xn--e1a4c","xn--eckvdtc9d","xn--efvy88h","xn--estv75g","xn--fct429k","xn--fhbei","xn--fiq228c5hs","xn--fiq64b","xn--fiqs8s","xn--fiqz9s","xn--fjq720a","xn--flw351e","xn--fpcrj9c3d","xn--fzc2c9e2c","xn--fzys8d69uvgm","xn--g2xx48c","xn--gckr3f0f","xn--gecrj9c","xn--gk3at1e","xn--h2breg3eve","xn--h2brj9c","xn--h2brj9c8c","xn--hxt814e","xn--i1b6b1a6a2e","xn--imr513n","xn--io0a7i","xn--j1aef","xn--j1amh","xn--j6w193g","xn--jlq61u9w7b","xn--jvr189m","xn--kcrx77d1x4a","xn--kprw13d","xn--kpry57d","xn--kpu716f","xn--kput3i","xn--l1acc","xn--lgbbat1ad8j","xn--mgb9awbf","xn--mgba3a3ejt","xn--mgba3a4f16a","xn--mgba7c0bbn0a","xn--mgbaakc7dvf","xn--mgbaam7a8h","xn--mgbab2bd","xn--mgbai9azgqp6j","xn--mgbayh7gpa","xn--mgbb9fbpob","xn--mgbbh1a","xn--mgbbh1a71e","xn--mgbc0a9azcg","xn--mgbca7dzdo","xn--mgberp4a5d4ar","xn--mgbgu82a","xn--mgbi4ecexp","xn--mgbpl2fh","xn--mgbt3dhd","xn--mgbtx2b","xn--mgbx4cd0ab","xn--mix891f","xn--mk1bu44c","xn--mxtq1m","xn--ngbc5azd","xn--ngbe9e0a","xn--ngbrx","xn--node","xn--nqv7f","xn--nqv7fs00ema","xn--nyqy26a","xn--o3cw4h","xn--ogbpf8fl","xn--otu796d","xn--p1acf","xn--p1ai","xn--pbt977c","xn--pgbs0dh","xn--pssy2u","xn--q9jyb4c","xn--qcka1pmc","xn--qxam","xn--rhqv96g","xn--rovu88b","xn--rvc1e0am3e","xn--s9brj9c","xn--ses554g","xn--t60b56a","xn--tckwe","xn--tiq49xqyj","xn--unup4y","xn--vermgensberater-ctb","xn--vermgensberatung-pwb","xn--vhquv","xn--vuq861b","xn--w4r85el8fhu5dnra","xn--w4rs40l","xn--wgbh1c","xn--wgbl6a","xn--xhq521b","xn--xkc2al3hye2a","xn--xkc2dl3a5ee0h","xn--y9a3aq","xn--yfro4i67o","xn--ygbi2ammx","xn--zfr164b","xxx","xyz","yachts","yahoo","yamaxun","yandex","ye","yodobashi","yoga","yokohama","you","youtube","yt","yun","za","zappos","zara","zero","zip","zippo","zm","zone","zuerich","zw"]}"; \ No newline at end of file diff --git a/src/Converter.php b/src/Converter.php index 21637c15..128780ac 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -116,8 +116,7 @@ private function addRule(array $list, array $rule_parts): array // "The domain and all rules must be canonicalized in the normal way // for hostnames - lower-case, Punycode (RFC 3492)." try { - $tld = array_pop($rule_parts); - $rule = $this->idnToAscii($tld); + $rule = $this->idnToAscii(array_pop($rule_parts)); } catch (Exception $e) { throw new CouldNotLoadRules($e->getMessage(), $e->getCode(), $e); } diff --git a/src/Manager.php b/src/Manager.php index 8488c890..de350c44 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -90,7 +90,7 @@ public function getRules(string $url = self::PSL_URL, $ttl = null): Rules return new Rules($data); } - throw new CouldNotLoadRules('The public suffix list cache is corrupted: '.json_last_error_msg(), json_last_error()); + throw new CouldNotLoadRules(sprintf('The public suffix list cache is corrupted: %s', json_last_error_msg()), json_last_error()); } /** @@ -110,12 +110,9 @@ public function refreshRules(string $url = self::PSL_URL, $ttl = null): bool static $converter; $converter = $converter ?? new Converter(); + $data = json_encode($converter->convert($this->http->getContent($url))); - return $this->cache->set( - $this->getCacheKey('PSL', $url), - json_encode($converter->convert($this->http->getContent($url))), - $this->filterTtl($ttl) ?? $this->ttl - ); + return $this->cache->set($this->getCacheKey('PSL', $url), $data, $this->filterTtl($ttl) ?? $this->ttl); } /** @@ -139,11 +136,11 @@ public function getTLDs(string $url = self::RZD_URL, $ttl = null): TopLevelDomai $data = json_decode($data ?? $this->cache->get($key), true); if (JSON_ERROR_NONE !== json_last_error()) { - throw new CouldNotLoadTLDs('The root zone database cache is corrupted: '.json_last_error_msg(), json_last_error()); + throw new CouldNotLoadTLDs(sprintf('The root zone database cache is corrupted: %s', json_last_error_msg()), json_last_error()); } if (!isset($data['records'], $data['version'], $data['modifiedDate'])) { - throw new CouldNotLoadTLDs(sprintf('The root zone database cache content is corrupted')); + throw new CouldNotLoadTLDs('The root zone database cache content is corrupted'); } return new TopLevelDomains( @@ -170,12 +167,9 @@ public function refreshTLDs(string $url = self::RZD_URL, $ttl = null): bool static $converter; $converter = $converter ?? new TLDConverter(); + $data = json_encode($converter->convert($this->http->getContent($url))); - return $this->cache->set( - $this->getCacheKey('RZD', $url), - json_encode($converter->convert($this->http->getContent($url))), - $this->filterTtl($ttl) ?? $this->ttl - ); + return $this->cache->set($this->getCacheKey('RZD', $url), $data, $this->filterTtl($ttl) ?? $this->ttl); } /** diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 380ed65a..7c4c2dff 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -225,13 +225,15 @@ public function resolve($domain): Domain return $domain; } + $publicSuffix = null; $label = $domain->toAscii()->getLabel(0); foreach ($this as $tld) { if ($tld->getContent() === $label) { - return $domain->resolve($tld); + $publicSuffix = $tld; + break; } } - return $domain->resolve(null); + return $domain->resolve($publicSuffix); } } From 3cac399771e9a549c39e96761015251a4b7fa025 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 26 Oct 2018 13:14:53 +0200 Subject: [PATCH 130/461] Update package configuration - explicit import of functions and constants - update Unit test to use self:: instead of $this - add PHP7.3 tests in travis configuration - update PHP Code Fixer settings to be more inline with PSR-12 --- .php_cs | 2 +- .travis.yml | 2 + src/Cache.php | 21 ++++++ src/Converter.php | 5 ++ src/CurlHttpClient.php | 14 ++++ src/Domain.php | 16 +++++ src/IDNAConverterTrait.php | 30 ++++++++ src/Installer.php | 8 +++ src/Manager.php | 14 ++++ src/PublicSuffix.php | 10 ++- src/Rules.php | 10 ++- src/TLDConverter.php | 5 ++ src/TopLevelDomains.php | 5 ++ tests/CacheTest.php | 107 ++++++++++++++--------------- tests/ConverterTest.php | 10 +-- tests/CurlHttpClientTest.php | 8 +-- tests/DomainTest.php | 124 +++++++++++++++++----------------- tests/ManagerTest.php | 26 +++---- tests/PublicSuffixTest.php | 54 +++++++-------- tests/RulesTest.php | 110 +++++++++++++++--------------- tests/TLDConverterTest.php | 12 ++-- tests/TopLevelDomainsTest.php | 32 ++++----- 22 files changed, 379 insertions(+), 246 deletions(-) diff --git a/.php_cs b/.php_cs index 8158b400..8b31e582 100644 --- a/.php_cs +++ b/.php_cs @@ -34,7 +34,7 @@ return PhpCsFixer\Config::create() 'no_leading_import_slash' => true, 'no_trailing_comma_in_singleline_array' => true, 'no_unused_imports' => true, - 'ordered_imports' => ['imports_order' => null, 'sort_algorithm' => 'alpha'], + 'ordered_imports' => ['imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha'], 'phpdoc_add_missing_param_annotation' => ['only_untyped' => false], 'phpdoc_align' => true, 'phpdoc_no_empty_return' => true, diff --git a/.travis.yml b/.travis.yml index 04c351dc..24c3553a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,6 +10,8 @@ matrix: env: VALIDATE_CODING_STYLE=false RUN_PHPSTAN=false IGNORE_PLATFORMS=false - php: 7.2 env: VALIDATE_CODING_STYLE=true RUN_PHPSTAN=true IGNORE_PLATFORMS=false + - php: 7.3 + env: VALIDATE_CODING_STYLE=false RUN_PHPSTAN=false IGNORE_PLATFORMS=true - php: nightly env: VALIDATE_CODING_STYLE=false RUN_PHPSTAN=false IGNORE_PLATFORMS=true allow_failures: diff --git a/src/Cache.php b/src/Cache.php index 21ea7e85..77257985 100644 --- a/src/Cache.php +++ b/src/Cache.php @@ -20,6 +20,27 @@ use Generator; use Psr\SimpleCache\CacheInterface; use Traversable; +use function chmod; +use function dirname; +use function file_exists; +use function file_get_contents; +use function filemtime; +use function get_class; +use function gettype; +use function is_array; +use function is_int; +use function is_object; +use function is_writable; +use function mkdir; +use function realpath; +use function rename; +use function sprintf; +use function time; +use function touch; +use function uniqid; +use function unlink; +use function unserialize; +use const DIRECTORY_SEPARATOR; /** * A simple file-based PSR-16 cache implementation. diff --git a/src/Converter.php b/src/Converter.php index 128780ac..c4c0223e 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -17,6 +17,11 @@ use Pdp\Exception\CouldNotLoadRules; use SplTempFileObject; +use function array_pop; +use function explode; +use function preg_match; +use function strpos; +use function substr; /** * Public Suffix List Parser. diff --git a/src/CurlHttpClient.php b/src/CurlHttpClient.php index 4a52a005..55079e91 100644 --- a/src/CurlHttpClient.php +++ b/src/CurlHttpClient.php @@ -15,6 +15,20 @@ namespace Pdp; +use function curl_close; +use function curl_errno; +use function curl_error; +use function curl_exec; +use function curl_init; +use function curl_setopt_array; +use const CURLE_OK; +use const CURLOPT_FAILONERROR; +use const CURLOPT_FOLLOWLOCATION; +use const CURLOPT_HTTPGET; +use const CURLOPT_RETURNTRANSFER; +use const CURLOPT_SSL_VERIFYHOST; +use const CURLOPT_SSL_VERIFYPEER; + final class CurlHttpClient implements HttpClient { /** diff --git a/src/Domain.php b/src/Domain.php index 3d94e7c3..545cd566 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -21,6 +21,22 @@ use Pdp\Exception\InvalidLabel; use Pdp\Exception\InvalidLabelKey; use TypeError; +use function array_count_values; +use function array_keys; +use function array_reverse; +use function array_slice; +use function array_unshift; +use function count; +use function explode; +use function gettype; +use function implode; +use function in_array; +use function ksort; +use function preg_match; +use function sprintf; +use function strlen; +use function strpos; +use function substr; /** * Domain Value Object. diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index a92db89c..dbd5498d 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -17,6 +17,36 @@ use Pdp\Exception\InvalidDomain; use TypeError; +use function array_reverse; +use function explode; +use function gettype; +use function idn_to_ascii; +use function idn_to_utf8; +use function implode; +use function is_scalar; +use function iterator_to_array; +use function method_exists; +use function preg_match; +use function rawurldecode; +use function sprintf; +use function strpos; +use function strtolower; +use const FILTER_FLAG_IPV4; +use const FILTER_VALIDATE_IP; +use const IDNA_ERROR_BIDI; +use const IDNA_ERROR_CONTEXTJ; +use const IDNA_ERROR_DISALLOWED; +use const IDNA_ERROR_DOMAIN_NAME_TOO_LONG; +use const IDNA_ERROR_EMPTY_LABEL; +use const IDNA_ERROR_HYPHEN_3_4; +use const IDNA_ERROR_INVALID_ACE_LABEL; +use const IDNA_ERROR_LABEL_HAS_DOT; +use const IDNA_ERROR_LABEL_TOO_LONG; +use const IDNA_ERROR_LEADING_COMBINING_MARK; +use const IDNA_ERROR_LEADING_HYPHEN; +use const IDNA_ERROR_PUNYCODE; +use const IDNA_ERROR_TRAILING_HYPHEN; +use const INTL_IDNA_VARIANT_UTS46; /** * @internal Domain name validator diff --git a/src/Installer.php b/src/Installer.php index 498adbb4..fa716295 100644 --- a/src/Installer.php +++ b/src/Installer.php @@ -17,6 +17,14 @@ use Composer\Script\Event; use Throwable; +use function dirname; +use function extension_loaded; +use function fwrite; +use function implode; +use function is_dir; +use const PHP_EOL; +use const STDERR; +use const STDOUT; /** * A class to manage PSL ICANN Section rules updates. diff --git a/src/Manager.php b/src/Manager.php index de350c44..a560c97b 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -22,6 +22,20 @@ use Pdp\Exception\CouldNotLoadTLDs; use Psr\SimpleCache\CacheInterface; use TypeError; +use function filter_var; +use function gettype; +use function is_object; +use function is_string; +use function json_decode; +use function json_encode; +use function json_last_error; +use function json_last_error_msg; +use function md5; +use function sprintf; +use function strtolower; +use const DATE_ATOM; +use const FILTER_VALIDATE_INT; +use const JSON_ERROR_NONE; /** * Public Suffix List Manager. diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 7736824c..f50bb342 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -18,6 +18,14 @@ use JsonSerializable; use Pdp\Exception\CouldNotResolvePublicSuffix; use Pdp\Exception\InvalidDomain; +use function array_keys; +use function array_reverse; +use function count; +use function explode; +use function implode; +use function in_array; +use function reset; +use function sprintf; /** * Public Suffix Value Object. @@ -105,7 +113,7 @@ public function __construct($publicSuffix = null, string $section = '') */ private function setPublicSuffix() { - if (empty($this->labels)) { + if ([] === $this->labels) { return null; } diff --git a/src/Rules.php b/src/Rules.php index 21568646..524ab272 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -17,6 +17,14 @@ use Pdp\Exception\CouldNotLoadRules; use Pdp\Exception\CouldNotResolvePublicSuffix; +use function array_reverse; +use function count; +use function fclose; +use function fopen; +use function implode; +use function in_array; +use function sprintf; +use function stream_get_contents; /** * A class to resolve domain name against the Public Suffix list. @@ -231,7 +239,7 @@ private function findPublicSuffixFromSection(DomainInterface $domain, string $se $rules = $rules[$label]; } - if (empty($matches)) { + if ([] === $matches) { return new PublicSuffix($domain->getLabel(0)); } diff --git a/src/TLDConverter.php b/src/TLDConverter.php index 1be46def..d8e57219 100644 --- a/src/TLDConverter.php +++ b/src/TLDConverter.php @@ -18,6 +18,11 @@ use DateTimeImmutable; use Pdp\Exception\CouldNotLoadTLDs; use SplTempFileObject; +use function preg_match; +use function sprintf; +use function strpos; +use function trim; +use const DATE_ATOM; /** * IANA Root Zone Database Parser. diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 7c4c2dff..19acabfa 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -21,6 +21,11 @@ use DateTimeInterface; use IteratorAggregate; use Pdp\Exception\CouldNotLoadTLDs; +use function count; +use function fclose; +use function fopen; +use function stream_get_contents; +use const DATE_ATOM; /** * A class to resolve domain name against the IANA Root Database. diff --git a/tests/CacheTest.php b/tests/CacheTest.php index 3530788b..92439858 100644 --- a/tests/CacheTest.php +++ b/tests/CacheTest.php @@ -58,19 +58,19 @@ public function tearDown() public function testConstructorOnEmptyCachePath() { $cache = new Cache(''); - $this->assertNull($cache->get('invalid_key')); + self::assertNull($cache->get('invalid_key')); } public function testConstructorOnParentCachePathIsNotExisted() { $cache = new Cache(vfsStream::url('pdp/cache_not_exist')); - $this->assertNull($cache->get('invalid_key')); + self::assertNull($cache->get('invalid_key')); } public function testSetOnNotWritableCachePath() { $cache = new Cache('/bin'); - $this->assertFalse($cache->set('key', 'value')); + self::assertFalse($cache->set('key', 'value')); } /** @@ -81,7 +81,7 @@ public function testSetOnNotWritableCachePath() public function testSetGet($expected) { $this->cache->set('foo', $expected); - $this->assertEquals($expected, $this->cache->get('foo')); + self::assertEquals($expected, $this->cache->get('foo')); } public function storableValuesProvider() @@ -102,26 +102,26 @@ public function storableValuesProvider() public function testDelete() { $this->cache->set('foo', 'bar'); - $this->assertEquals('bar', $this->cache->get('foo')); + self::assertEquals('bar', $this->cache->get('foo')); $this->cache->delete('foo'); - $this->assertNull($this->cache->get('foo')); + self::assertNull($this->cache->get('foo')); } public function testGetInvalidArg() { - $this->expectException(InvalidArgumentException::class); + self::expectException(InvalidArgumentException::class); $this->cache->get(null); } public function testInvalidKey() { - $this->expectException(InvalidArgumentException::class); + self::expectException(InvalidArgumentException::class); $this->cache->get('foo:bar', 'bar'); } public function testSetInvalidTTL() { - $this->expectException(InvalidArgumentException::class); + self::expectException(InvalidArgumentException::class); $this->cache->set('foo', 'bar', date_create()); } @@ -130,7 +130,7 @@ public function testSetInvalidTTL() */ public function testGetNotFound() { - $this->assertNull($this->cache->get('notfound')); + self::assertNull($this->cache->get('notfound')); } /** @@ -138,11 +138,8 @@ public function testGetNotFound() */ public function testGetNotFoundDefault() { - $default = 'chickpeas'; - $this->assertEquals( - $default, - $this->cache->get('notfound', $default) - ); + $expected = 'chickpeas'; + self::assertEquals($expected, $this->cache->get('notfound', $expected)); } /** @@ -152,11 +149,11 @@ public function testGetNotFoundDefault() public function testSetExpire() { $this->cache->set('foo', 'bar', 1); - $this->assertEquals('bar', $this->cache->get('foo')); + self::assertEquals('bar', $this->cache->get('foo')); // Wait 3 seconds so the cache expires sleep(3); - $this->assertNull($this->cache->get('foo')); + self::assertNull($this->cache->get('foo')); } /** @@ -166,22 +163,22 @@ public function testSetExpire() public function testSetExpireDateInterval() { $this->cache->set('foo', 'bar', new DateInterval('PT1S')); - $this->assertEquals('bar', $this->cache->get('foo')); + self::assertEquals('bar', $this->cache->get('foo')); // Wait 3 seconds so the cache expires sleep(3); - $this->assertNull($this->cache->get('foo')); + self::assertNull($this->cache->get('foo')); } public function testSetInvalidArg() { - $this->expectException(InvalidArgumentException::class); + self::expectException(InvalidArgumentException::class); $this->cache->set(null, 'bar'); } public function testDeleteInvalidArg() { - $this->expectException(InvalidArgumentException::class); + self::expectException(InvalidArgumentException::class); $this->cache->delete(null); } @@ -192,7 +189,7 @@ public function testClearCache() { $this->cache->set('foo', 'bar'); $this->cache->clear(); - $this->assertNull($this->cache->get('foo')); + self::assertNull($this->cache->get('foo')); } /** @@ -201,7 +198,7 @@ public function testClearCache() public function testHas() { $this->cache->set('foo', 'bar'); - $this->assertTrue($this->cache->has('foo')); + self::assertTrue($this->cache->has('foo')); } /** @@ -209,12 +206,12 @@ public function testHas() */ public function testHasNot() { - $this->assertFalse($this->cache->has('not-found')); + self::assertFalse($this->cache->has('not-found')); } public function testHasInvalidArg() { - $this->expectException(InvalidArgumentException::class); + self::expectException(InvalidArgumentException::class); $this->cache->has(null); } @@ -232,13 +229,13 @@ public function testSetGetMultiple() $this->cache->setMultiple($values); $result = $this->cache->getMultiple(array_keys($values)); foreach ($result as $key => $value) { - $this->assertTrue(isset($values[$key])); - $this->assertEquals($values[$key], $value); + self::assertTrue(isset($values[$key])); + self::assertEquals($values[$key], $value); unset($values[$key]); } // The list of values should now be empty - $this->assertEquals([], $values); + self::assertEquals([], $values); } /** @@ -262,13 +259,13 @@ public function testSetGetMultipleGenerator() $result = $this->cache->getMultiple(array_keys($values)); foreach ($result as $key => $value) { - $this->assertTrue(isset($values[$key])); - $this->assertEquals($values[$key], $value); + self::assertTrue(isset($values[$key])); + self::assertEquals($values[$key], $value); unset($values[$key]); } // The list of values should now be empty - $this->assertEquals([], $values); + self::assertEquals([], $values); } /** @@ -291,13 +288,13 @@ public function testSetGetMultipleGenerator2() $this->cache->setMultiple($values); $result = $this->cache->getMultiple($gen()); foreach ($result as $key => $value) { - $this->assertTrue(isset($values[$key])); - $this->assertEquals($values[$key], $value); + self::assertTrue(isset($values[$key])); + self::assertEquals($values[$key], $value); unset($values[$key]); } // The list of values should now be empty - $this->assertEquals([], $values); + self::assertEquals([], $values); } /** @@ -318,13 +315,13 @@ public function testSetMultipleExpireDateIntervalNotExpired() $count = 0; foreach ($result as $key => $value) { ++$count; - $this->assertTrue(isset($values[$key])); - $this->assertEquals($values[$key], $value); + self::assertTrue(isset($values[$key])); + self::assertEquals($values[$key], $value); unset($values[$key]); } - $this->assertEquals(3, $count); + self::assertEquals(3, $count); // The list of values should now be empty - $this->assertEquals([], $values); + self::assertEquals([], $values); } /** @@ -354,14 +351,14 @@ public function testSetMultipleExpireDateIntervalExpired() foreach ($result as $key => $value) { ++$count; - $this->assertTrue(isset($expected[$key])); - $this->assertEquals($expected[$key], $value); + self::assertTrue(isset($expected[$key])); + self::assertEquals($expected[$key], $value); unset($expected[$key]); } - $this->assertEquals(3, $count); + self::assertEquals(3, $count); // The list of values should now be empty - $this->assertEquals([], $expected); + self::assertEquals([], $expected); } /** @@ -391,25 +388,25 @@ public function testSetMultipleExpireDateIntervalInt() foreach ($result as $key => $value) { ++$count; - $this->assertTrue(isset($expected[$key])); - $this->assertEquals($expected[$key], $value); + self::assertTrue(isset($expected[$key])); + self::assertEquals($expected[$key], $value); unset($expected[$key]); } - $this->assertEquals(3, $count); + self::assertEquals(3, $count); // The list of values should now be empty - $this->assertEquals([], $expected); + self::assertEquals([], $expected); } public function testSetMultipleInvalidArg() { - $this->expectException(InvalidArgumentException::class); + self::expectException(InvalidArgumentException::class); $this->cache->setMultiple(null); } public function testGetMultipleInvalidArg() { - $this->expectException(InvalidArgumentException::class); + self::expectException(InvalidArgumentException::class); $result = $this->cache->getMultiple(null); // If $result was a generator, the generator will only error once the // first value is requested. @@ -444,13 +441,13 @@ public function testDeleteMultipleDefaultGet() ]; foreach ($result as $key => $value) { - $this->assertTrue(isset($expected[$key])); - $this->assertEquals($expected[$key], $value); + self::assertTrue(isset($expected[$key])); + self::assertEquals($expected[$key], $value); unset($expected[$key]); } // The list of values should now be empty - $this->assertEquals([], $expected); + self::assertEquals([], $expected); } /** @@ -482,18 +479,18 @@ public function testDeleteMultipleGenerator() ]; foreach ($result as $key => $value) { - $this->assertTrue(isset($expected[$key])); - $this->assertEquals($expected[$key], $value); + self::assertTrue(isset($expected[$key])); + self::assertEquals($expected[$key], $value); unset($expected[$key]); } // The list of values should now be empty - $this->assertEquals([], $expected); + self::assertEquals([], $expected); } public function testDeleteMultipleInvalidArg() { - $this->expectException(InvalidArgumentException::class); + self::expectException(InvalidArgumentException::class); $this->cache->deleteMultiple(null); } } diff --git a/tests/ConverterTest.php b/tests/ConverterTest.php index a837e216..d8c6cdb5 100644 --- a/tests/ConverterTest.php +++ b/tests/ConverterTest.php @@ -28,13 +28,13 @@ public function testConverter() { $string = file_get_contents(__DIR__.'/data/public_suffix_list.dat'); $retval = (new Converter())->convert($string); - $this->assertNotEmpty($retval[Converter::ICANN_DOMAINS]); - $this->assertNotEmpty($retval[Converter::PRIVATE_DOMAINS]); + self::assertNotEmpty($retval[Converter::ICANN_DOMAINS]); + self::assertNotEmpty($retval[Converter::PRIVATE_DOMAINS]); } public function testConvertThrowsExceptionWithInvalidContent() { - $this->expectException(CouldNotLoadRules::class); + self::expectException(CouldNotLoadRules::class); $content = file_get_contents(__DIR__.'/data/invalid_suffix_list_content.dat'); (new Converter())->convert($content); } @@ -42,12 +42,12 @@ public function testConvertThrowsExceptionWithInvalidContent() public function testConvertWithEmptyString() { $retval = (new Converter())->convert(''); - $this->assertEquals([Converter::ICANN_DOMAINS => [], Converter::PRIVATE_DOMAINS => []], $retval); + self::assertEquals([Converter::ICANN_DOMAINS => [], Converter::PRIVATE_DOMAINS => []], $retval); } public function testConvertWithInvalidString() { $retval = (new Converter())->convert('foobar'); - $this->assertEquals([Converter::ICANN_DOMAINS => [], Converter::PRIVATE_DOMAINS => []], $retval); + self::assertEquals([Converter::ICANN_DOMAINS => [], Converter::PRIVATE_DOMAINS => []], $retval); } } diff --git a/tests/CurlHttpClientTest.php b/tests/CurlHttpClientTest.php index 77227451..7c977bf0 100644 --- a/tests/CurlHttpClientTest.php +++ b/tests/CurlHttpClientTest.php @@ -32,8 +32,8 @@ class CurlHttpClientTest extends TestCase public function testGetContent() { $content = (new CurlHttpClient())->getContent('https://www.google.com'); - $this->assertNotNull($content); - $this->assertContains('google', $content); + self::assertNotNull($content); + self::assertContains('google', $content); } /** @@ -42,7 +42,7 @@ public function testGetContent() */ public function testThrowsException() { - $this->expectException(HttpClientException::class); + self::expectException(HttpClientException::class); (new CurlHttpClient())->getContent('https://qsfsdfqdf.dfsf'); } @@ -51,7 +51,7 @@ public function testThrowsException() */ public function testConstructorThrowsException() { - $this->expectException(Exception::class); + self::expectException(Exception::class); new CurlHttpClient(['foo' => 'bar']); } } diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 8a1a4e34..26360f0d 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -43,9 +43,9 @@ class DomainTest extends TestCase public function testRegistrableDomainIsNullWithFoundDomain() { $domain = new Domain('faketld', null); - $this->assertNull($domain->getPublicSuffix()); - $this->assertNull($domain->getRegistrableDomain()); - $this->assertNull($domain->getSubDomain()); + self::assertNull($domain->getPublicSuffix()); + self::assertNull($domain->getRegistrableDomain()); + self::assertNull($domain->getSubDomain()); } /** @@ -59,7 +59,7 @@ public function testRegistrableDomainIsNullWithFoundDomain() */ public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain($domain, $publicSuffix) { - $this->expectException(CouldNotResolvePublicSuffix::class); + self::expectException(CouldNotResolvePublicSuffix::class); new Domain($domain, new PublicSuffix($publicSuffix)); } @@ -95,7 +95,7 @@ public function provideWrongConstructor() */ public function testToAsciiThrowsException(string $domain) { - $this->expectException(InvalidDomain::class); + self::expectException(InvalidDomain::class); new Domain($domain); } @@ -115,7 +115,7 @@ public function invalidDomainProvider() */ public function testToUnicodeThrowsException() { - $this->expectException(InvalidDomain::class); + self::expectException(InvalidDomain::class); (new Domain('xn--a-ecp.ru'))->toUnicode(); } @@ -131,14 +131,14 @@ public function testDomainInternalPhpMethod() { $domain = new Domain('www.ulb.ac.be', new PublicSuffix('ac.be')); $generateDomain = eval('return '.var_export($domain, true).';'); - $this->assertInternalType('array', $domain->__debugInfo()); - $this->assertEquals($domain, $generateDomain); - $this->assertSame(['be', 'ac', 'ulb', 'www'], iterator_to_array($domain)); - $this->assertJsonStringEqualsJsonString( + self::assertInternalType('array', $domain->__debugInfo()); + self::assertEquals($domain, $generateDomain); + self::assertSame(['be', 'ac', 'ulb', 'www'], iterator_to_array($domain)); + self::assertJsonStringEqualsJsonString( json_encode($domain->__debugInfo()), json_encode($domain) ); - $this->assertSame('www.ulb.ac.be', (string) $domain); + self::assertSame('www.ulb.ac.be', (string) $domain); } /** @@ -154,8 +154,8 @@ public function testDomainInternalPhpMethod() public function testCountable($domain, $nbLabels, $labels) { $domain = new Domain($domain); - $this->assertCount($nbLabels, $domain); - $this->assertSame($labels, iterator_to_array($domain)); + self::assertCount($nbLabels, $domain); + self::assertSame($labels, iterator_to_array($domain)); } public function countableProvider() @@ -174,11 +174,11 @@ public function countableProvider() public function testGetLabel() { $domain = new Domain('master.example.com'); - $this->assertSame('com', $domain->getLabel(0)); - $this->assertSame('example', $domain->getLabel(1)); - $this->assertSame('master', $domain->getLabel(-1)); - $this->assertNull($domain->getLabel(23)); - $this->assertNull($domain->getLabel(-23)); + self::assertSame('com', $domain->getLabel(0)); + self::assertSame('example', $domain->getLabel(1)); + self::assertSame('master', $domain->getLabel(-1)); + self::assertNull($domain->getLabel(23)); + self::assertNull($domain->getLabel(-23)); } /** @@ -187,8 +187,8 @@ public function testGetLabel() public function testOffsets() { $domain = new Domain('master.com.example.com'); - $this->assertSame([0, 2], $domain->keys('com')); - $this->assertSame([], $domain->keys('toto')); + self::assertSame([0, 2], $domain->keys('com')); + self::assertSame([], $domain->keys('toto')); } /** @@ -221,12 +221,12 @@ public function testToIDN( $expectedIDNSuffix ) { $domain = new Domain($domain, new PublicSuffix($publicSuffix)); - $this->assertSame($expectedDomain, $domain->getDomain()); - $this->assertSame($expectedSuffix, $domain->getPublicSuffix()); + self::assertSame($expectedDomain, $domain->getDomain()); + self::assertSame($expectedSuffix, $domain->getPublicSuffix()); $domainIDN = $domain->toUnicode(); - $this->assertSame($expectedIDNDomain, $domainIDN->getDomain()); - $this->assertSame($expectedIDNSuffix, $domainIDN->getPublicSuffix()); + self::assertSame($expectedIDNDomain, $domainIDN->getDomain()); + self::assertSame($expectedIDNSuffix, $domainIDN->getPublicSuffix()); } public function toUnicodeProvider() @@ -321,12 +321,12 @@ public function testToAscii( $expectedAsciiSuffix ) { $domain = new Domain($domain, new PublicSuffix($publicSuffix)); - $this->assertSame($expectedDomain, $domain->getDomain()); - $this->assertSame($expectedSuffix, $domain->getPublicSuffix()); + self::assertSame($expectedDomain, $domain->getDomain()); + self::assertSame($expectedSuffix, $domain->getPublicSuffix()); $domainIDN = $domain->toAscii(); - $this->assertSame($expectedAsciiDomain, $domainIDN->getDomain()); - $this->assertSame($expectedAsciiSuffix, $domainIDN->getPublicSuffix()); + self::assertSame($expectedAsciiDomain, $domainIDN->getDomain()); + self::assertSame($expectedAsciiSuffix, $domainIDN->getPublicSuffix()); } public function toAsciiProvider() @@ -386,7 +386,7 @@ public function toAsciiProvider() */ public function testResolveWorks(Domain $domain, $publicSuffix, $expected) { - $this->assertSame($expected, $domain->resolve($publicSuffix)->getPublicSuffix()); + self::assertSame($expected, $domain->resolve($publicSuffix)->getPublicSuffix()); } public function resolvePassProvider() @@ -442,7 +442,7 @@ public function resolvePassProvider() */ public function testResolveFails(Domain $domain, PublicSuffix $publicSuffix) { - $this->expectException(CouldNotResolvePublicSuffix::class); + self::expectException(CouldNotResolvePublicSuffix::class); $domain->resolve($publicSuffix); } @@ -482,8 +482,8 @@ public function testResolveReturnsInstance() { $publicSuffix = new PublicSuffix('ac.be', Rules::ICANN_DOMAINS); $domain = new Domain('ulb.ac.be', $publicSuffix); - $this->assertSame($domain, $domain->resolve($publicSuffix)); - $this->assertNotSame($domain, $domain->resolve(new PublicSuffix('ac.be', Rules::PRIVATE_DOMAINS))); + self::assertSame($domain, $domain->resolve($publicSuffix)); + self::assertNotSame($domain, $domain->resolve(new PublicSuffix('ac.be', Rules::PRIVATE_DOMAINS))); } /** @@ -498,12 +498,12 @@ public function testResolveReturnsInstance() public function testWithSubDomainWorks(Domain $domain, $subdomain, $expected) { $result = $domain->withSubDomain($subdomain); - $this->assertSame($expected, $result->getSubDomain()); - $this->assertSame($domain->getPublicSuffix(), $result->getPublicSuffix()); - $this->assertSame($domain->getRegistrableDomain(), $result->getRegistrableDomain()); - $this->assertSame($domain->isKnown(), $result->isKnown()); - $this->assertSame($domain->isICANN(), $result->isICANN()); - $this->assertSame($domain->isPrivate(), $result->isPrivate()); + self::assertSame($expected, $result->getSubDomain()); + self::assertSame($domain->getPublicSuffix(), $result->getPublicSuffix()); + self::assertSame($domain->getRegistrableDomain(), $result->getRegistrableDomain()); + self::assertSame($domain->isKnown(), $result->isKnown()); + self::assertSame($domain->isICANN(), $result->isICANN()); + self::assertSame($domain->isPrivate(), $result->isPrivate()); } public function withSubDomainWorksProvider() @@ -543,7 +543,7 @@ public function withSubDomainWorksProvider() */ public function testWithSubDomainFailsWithNullDomain() { - $this->expectException(CouldNotResolveSubDomain::class); + self::expectException(CouldNotResolveSubDomain::class); (new Domain())->withSubDomain('www'); } @@ -553,7 +553,7 @@ public function testWithSubDomainFailsWithNullDomain() */ public function testWithSubDomainFailsWithOneLabelDomain() { - $this->expectException(CouldNotResolveSubDomain::class); + self::expectException(CouldNotResolveSubDomain::class); (new Domain('localhost'))->withSubDomain('www'); } @@ -564,7 +564,7 @@ public function testWithSubDomainFailsWithOneLabelDomain() */ public function testWithSubDomainFailsWithNonStringableObject() { - $this->expectException(TypeError::class); + self::expectException(TypeError::class); (new Domain( 'example.com', new PublicSuffix('com', PublicSuffix::ICANN_DOMAINS) @@ -578,7 +578,7 @@ public function testWithSubDomainFailsWithNonStringableObject() */ public function testWithSubDomainWithoutPublicSuffixInfo() { - $this->expectException(CouldNotResolveSubDomain::class); + self::expectException(CouldNotResolveSubDomain::class); (new Domain('www.example.com'))->withSubDomain('www'); } @@ -602,10 +602,10 @@ public function testWithPublicSuffixWorks( bool $isPrivate ) { $result = $domain->withPublicSuffix($publicSuffix); - $this->assertSame($expected, $result->getPublicSuffix()); - $this->assertSame($isKnown, $result->isKnown()); - $this->assertSame($isICANN, $result->isICANN()); - $this->assertSame($isPrivate, $result->isPrivate()); + self::assertSame($expected, $result->getPublicSuffix()); + self::assertSame($isKnown, $result->isKnown()); + self::assertSame($isICANN, $result->isICANN()); + self::assertSame($isPrivate, $result->isPrivate()); } public function withPublicSuffixWorksProvider() @@ -685,7 +685,7 @@ public function withPublicSuffixWorksProvider() */ public function testWithPublicSuffixFailsWithNullDomain() { - $this->expectException(InvalidDomain::class); + self::expectException(InvalidDomain::class); (new Domain())->withPublicSuffix('www'); } @@ -712,10 +712,10 @@ public function testWithLabelWorks( bool $isPrivate ) { $result = $domain->withLabel($key, $label); - $this->assertSame($expected, $result->getContent()); - $this->assertSame($isKnown, $result->isKnown()); - $this->assertSame($isICANN, $result->isICANN()); - $this->assertSame($isPrivate, $result->isPrivate()); + self::assertSame($expected, $result->getContent()); + self::assertSame($isKnown, $result->isKnown()); + self::assertSame($isICANN, $result->isICANN()); + self::assertSame($isPrivate, $result->isPrivate()); } public function withLabelWorksProvider() @@ -821,7 +821,7 @@ public function withLabelWorksProvider() */ public function testWithLabelFailsWithTypeError() { - $this->expectException(InvalidLabel::class); + self::expectException(InvalidLabel::class); (new Domain('example.com'))->withLabel(1, null); } @@ -830,7 +830,7 @@ public function testWithLabelFailsWithTypeError() */ public function testWithLabelFailsWithInvalidKey() { - $this->expectException(InvalidLabelKey::class); + self::expectException(InvalidLabelKey::class); (new Domain('example.com'))->withLabel(-4, 'www'); } @@ -839,7 +839,7 @@ public function testWithLabelFailsWithInvalidKey() */ public function testWithLabelFailsWithInvalidLabel2() { - $this->expectException(InvalidDomain::class); + self::expectException(InvalidDomain::class); (new Domain('example.com'))->withLabel(-1, ''); } @@ -855,7 +855,7 @@ public function testWithLabelFailsWithInvalidLabel2() */ public function testAppend($raw, $append, $expected) { - $this->assertSame($expected, (string) (new Domain($raw))->append($append)); + self::assertSame($expected, (string) (new Domain($raw))->append($append)); } public function validAppend() @@ -880,7 +880,7 @@ public function validAppend() */ public function testPrepend($raw, $prepend, $expected) { - $this->assertSame($expected, (string) (new Domain($raw))->prepend($prepend)); + self::assertSame($expected, (string) (new Domain($raw))->prepend($prepend)); } public function validPrepend() @@ -912,10 +912,10 @@ public function testwithoutLabelWorks( bool $isPrivate ) { $result = $domain->withoutLabel($key); - $this->assertSame($expected, $result->getContent()); - $this->assertSame($isKnown, $result->isKnown()); - $this->assertSame($isICANN, $result->isICANN()); - $this->assertSame($isPrivate, $result->isPrivate()); + self::assertSame($expected, $result->getContent()); + self::assertSame($isKnown, $result->isKnown()); + self::assertSame($isICANN, $result->isICANN()); + self::assertSame($isPrivate, $result->isPrivate()); } public function withoutLabelWorksProvider() @@ -963,7 +963,7 @@ public function withoutLabelWorksProvider() */ public function testwithoutLabelFailsWithInvalidKey() { - $this->expectException(InvalidLabelKey::class); + self::expectException(InvalidLabelKey::class); (new Domain('example.com'))->withoutLabel(-3); } @@ -972,6 +972,6 @@ public function testwithoutLabelFailsWithInvalidKey() */ public function testwithoutLabelWorksWithMultipleKeys() { - $this->assertNull((new Domain('www.example.com'))->withoutLabel(0, 1, 2)->getContent()); + self::assertNull((new Domain('www.example.com'))->withoutLabel(0, 1, 2)->getContent()); } } diff --git a/tests/ManagerTest.php b/tests/ManagerTest.php index 914f69ea..00e2cfce 100644 --- a/tests/ManagerTest.php +++ b/tests/ManagerTest.php @@ -75,7 +75,7 @@ public function tearDown() */ public function testConstructor($ttl) { - $this->assertInstanceOf(Manager::class, new Manager($this->cachePool, $this->client, $ttl)); + self::assertInstanceOf(Manager::class, new Manager($this->cachePool, $this->client, $ttl)); } public function validTtlProvider() @@ -95,7 +95,7 @@ public function validTtlProvider() */ public function testConstructorThrowsException() { - $this->expectException(TypeError::class); + self::expectException(TypeError::class); new Manager($this->cachePool, $this->client, tmpfile()); } @@ -108,8 +108,8 @@ public function testRefreshRules() { $manager = new Manager($this->cachePool, $this->client); $previous = $manager->getRules(); - $this->assertTrue($manager->refreshRules()); - $this->assertEquals($previous, $manager->getRules()); + self::assertTrue($manager->refreshRules()); + self::assertEquals($previous, $manager->getRules()); } /** @@ -123,7 +123,7 @@ public function testRebuildRulesFromRemoveSource() $previous = $manager->getRules(Manager::PSL_URL); $this->cachePool->clear(); //delete all local cache $list = $manager->getRules(Manager::PSL_URL); - $this->assertEquals($previous, $manager->getRules(Manager::PSL_URL)); + self::assertEquals($previous, $manager->getRules(Manager::PSL_URL)); } /** @@ -174,7 +174,7 @@ public function has($key) } }; - $this->expectException(CouldNotLoadRules::class); + self::expectException(CouldNotLoadRules::class); $manager = new Manager($cachePool, $this->client); $manager->getRules('https://google.com'); } @@ -227,7 +227,7 @@ public function has($key) } }; - $this->expectException(CouldNotLoadRules::class); + self::expectException(CouldNotLoadRules::class); $manager = new Manager($cachePool, $this->client); $manager->getRules(); } @@ -241,8 +241,8 @@ public function testRefreshTLDs() { $manager = new Manager($this->cachePool, $this->client); $previous = $manager->getTLDs(); - $this->assertTrue($manager->refreshTLDs()); - $this->assertEquals($previous, $manager->getTLDs()); + self::assertTrue($manager->refreshTLDs()); + self::assertEquals($previous, $manager->getTLDs()); } /** @@ -255,7 +255,7 @@ public function testRebuildTLDsFromRemoveSource() $manager = new Manager($this->cachePool, $this->client); $previous = $manager->getTLDs(); $this->cachePool->clear(); //delete all local cache - $this->assertEquals($previous, $manager->getTLDs()); + self::assertEquals($previous, $manager->getTLDs()); } /** @@ -306,7 +306,7 @@ public function has($key) } }; - $this->expectException(CouldNotLoadTLDs::class); + self::expectException(CouldNotLoadTLDs::class); $manager = new Manager($cachePool, $this->client); $manager->getTLDs(); } @@ -359,7 +359,7 @@ public function has($key) } }; - $this->expectException(CouldNotLoadTLDs::class); + self::expectException(CouldNotLoadTLDs::class); $manager = new Manager($cachePool, $this->client); $manager->getTLDs(); } @@ -412,7 +412,7 @@ public function has($key) } }; - $this->expectException(CouldNotLoadTLDs::class); + self::expectException(CouldNotLoadTLDs::class); $manager = new Manager($cachePool, $this->client); $manager->getTLDs(); } diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index d870a4a7..6ddde314 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -39,13 +39,13 @@ public function testInternalPhpMethod() { $publicSuffix = new PublicSuffix('ac.be'); $generatePublicSuffix = eval('return '.var_export($publicSuffix, true).';'); - $this->assertEquals($publicSuffix, $generatePublicSuffix); - $this->assertSame(['be', 'ac'], iterator_to_array($publicSuffix)); - $this->assertJsonStringEqualsJsonString( + self::assertEquals($publicSuffix, $generatePublicSuffix); + self::assertSame(['be', 'ac'], iterator_to_array($publicSuffix)); + self::assertJsonStringEqualsJsonString( json_encode($publicSuffix->__debugInfo()), json_encode($publicSuffix) ); - $this->assertSame('ac.be', (string) $publicSuffix); + self::assertSame('ac.be', (string) $publicSuffix); } /** @@ -57,7 +57,7 @@ public function testInternalPhpMethod() */ public function testPSToUnicodeWithUrlEncode() { - $this->assertSame('bébe', (new PublicSuffix('b%C3%A9be'))->toUnicode()->getContent()); + self::assertSame('bébe', (new PublicSuffix('b%C3%A9be'))->toUnicode()->getContent()); } /** @@ -79,9 +79,9 @@ public function testPSToUnicodeWithUrlEncode() public function testSetSection($publicSuffix, string $section, bool $isKnown, bool $isIcann, bool $isPrivate) { $ps = new PublicSuffix($publicSuffix, $section); - $this->assertSame($isKnown, $ps->isKnown()); - $this->assertSame($isIcann, $ps->isICANN()); - $this->assertSame($isPrivate, $ps->isPrivate()); + self::assertSame($isKnown, $ps->isKnown()); + self::assertSame($isIcann, $ps->isICANN()); + self::assertSame($isPrivate, $ps->isPrivate()); } public function PSProvider() @@ -103,7 +103,7 @@ public function PSProvider() */ public function testConstructorThrowsException($publicSuffix) { - $this->expectException(InvalidDomain::class); + self::expectException(InvalidDomain::class); new PublicSuffix($publicSuffix); } @@ -122,7 +122,7 @@ public function invalidPublicSuffixProvider() */ public function testPSToAsciiThrowsException() { - $this->expectException(InvalidDomain::class); + self::expectException(InvalidDomain::class); new PublicSuffix('a⒈com'); } @@ -132,7 +132,7 @@ public function testPSToAsciiThrowsException() */ public function testSetSectionThrowsException() { - $this->expectException(CouldNotResolvePublicSuffix::class); + self::expectException(CouldNotResolvePublicSuffix::class); new PublicSuffix('ac.be', 'foobar'); } @@ -142,7 +142,7 @@ public function testSetSectionThrowsException() */ public function testToUnicodeThrowsException() { - $this->expectException(InvalidDomain::class); + self::expectException(InvalidDomain::class); (new PublicSuffix('xn--a-ecp.ru'))->toUnicode(); } @@ -159,8 +159,8 @@ public function testToUnicodeThrowsException() public function testConversionReturnsTheSameInstance($publicSuffix) { $instance = new PublicSuffix($publicSuffix); - $this->assertSame($instance->toUnicode(), $instance); - $this->assertSame($instance->toAscii(), $instance); + self::assertSame($instance->toUnicode(), $instance); + self::assertSame($instance->toAscii(), $instance); } public function conversionReturnsTheSameInstanceProvider() @@ -178,7 +178,7 @@ public function conversionReturnsTheSameInstanceProvider() public function testToUnicodeReturnsSameInstance() { $instance = new PublicSuffix('食狮.公司.cn'); - $this->assertSame($instance->toUnicode(), $instance); + self::assertSame($instance->toUnicode(), $instance); } /** @@ -192,8 +192,8 @@ public function testToUnicodeReturnsSameInstance() public function testCountable($domain, $nbLabels, $labels) { $domain = new PublicSuffix($domain); - $this->assertCount($nbLabels, $domain); - $this->assertSame($labels, iterator_to_array($domain)); + self::assertCount($nbLabels, $domain); + self::assertSame($labels, iterator_to_array($domain)); } public function countableProvider() @@ -211,11 +211,11 @@ public function countableProvider() public function testGetLabel() { $domain = new PublicSuffix('master.example.com'); - $this->assertSame('com', $domain->getLabel(0)); - $this->assertSame('example', $domain->getLabel(1)); - $this->assertSame('master', $domain->getLabel(-1)); - $this->assertNull($domain->getLabel(23)); - $this->assertNull($domain->getLabel(-23)); + self::assertSame('com', $domain->getLabel(0)); + self::assertSame('example', $domain->getLabel(1)); + self::assertSame('master', $domain->getLabel(-1)); + self::assertNull($domain->getLabel(23)); + self::assertNull($domain->getLabel(-23)); } /** @@ -224,7 +224,7 @@ public function testGetLabel() public function testOffsets() { $domain = new PublicSuffix('master.example.com'); - $this->assertSame([2], $domain->keys('master')); + self::assertSame([2], $domain->keys('master')); } /** @@ -237,10 +237,10 @@ public function testOffsets() public function testCreateFromDomainWorks(Domain $domain, $expected) { $result = PublicSuffix::createFromDomain($domain); - $this->assertSame($expected, $result->getContent()); - $this->assertSame($result->isKnown(), $domain->isKnown()); - $this->assertSame($result->isICANN(), $domain->isICANN()); - $this->assertSame($result->isPrivate(), $domain->isPrivate()); + self::assertSame($expected, $result->getContent()); + self::assertSame($result->isKnown(), $domain->isKnown()); + self::assertSame($result->isICANN(), $domain->isICANN()); + self::assertSame($result->isPrivate(), $domain->isPrivate()); } public function createFromDomainProvider() diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 7f1a52b5..d1637d84 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -57,7 +57,7 @@ public function testCreateFromPath() ]); $rules = Rules::createFromPath(__DIR__.'/data/public_suffix_list.dat', $context); - $this->assertInstanceOf(Rules::class, $rules); + self::assertInstanceOf(Rules::class, $rules); } /** @@ -65,7 +65,7 @@ public function testCreateFromPath() */ public function testCreateFromPathThrowsException() { - $this->expectException(CouldNotLoadRules::class); + self::expectException(CouldNotLoadRules::class); Rules::createFromPath('/foo/bar.dat'); } @@ -76,7 +76,7 @@ public function testCreateFromPathThrowsException() public function testDomainInternalPhpMethod() { $generateRules = eval('return '.var_export($this->rules, true).';'); - $this->assertEquals($this->rules, $generateRules); + self::assertEquals($this->rules, $generateRules); } /** @@ -91,7 +91,7 @@ public function testDomainInternalPhpMethod() public function testNullWillReturnNullDomain() { $domain = $this->rules->resolve('COM'); - $this->assertFalse($domain->isKnown()); + self::assertFalse($domain->isKnown()); } @@ -101,7 +101,7 @@ public function testNullWillReturnNullDomain() */ public function testThrowsTypeErrorOnWrongInput() { - $this->expectException(TypeError::class); + self::expectException(TypeError::class); $this->rules->resolve(date_create()); } @@ -111,7 +111,7 @@ public function testThrowsTypeErrorOnWrongInput() */ public function testResolveThrowsExceptionOnWrongDomainType() { - $this->expectException(CouldNotResolvePublicSuffix::class); + self::expectException(CouldNotResolvePublicSuffix::class); $this->rules->resolve('www.example.com', 'foobar'); } @@ -129,7 +129,7 @@ public function testResolveThrowsExceptionOnWrongDomainType() public function testIsSuffixValidFalse() { $domain = $this->rules->resolve('www.example.faketld'); - $this->assertFalse($domain->isKnown()); + self::assertFalse($domain->isKnown()); } /** @@ -151,9 +151,9 @@ public function testIsSuffixValidFalse() public function testIsSuffixValidTrue() { $domain = $this->rules->resolve('www.example.com', Rules::ICANN_DOMAINS); - $this->assertTrue($domain->isKnown()); - $this->assertTrue($domain->isICANN()); - $this->assertFalse($domain->isPrivate()); + self::assertTrue($domain->isKnown()); + self::assertTrue($domain->isICANN()); + self::assertFalse($domain->isPrivate()); } /** @@ -175,9 +175,9 @@ public function testIsSuffixValidTrue() public function testIsSuffixValidFalseWithPunycoded() { $domain = $this->rules->resolve('www.example.xn--85x722f'); - $this->assertFalse($domain->isKnown()); - $this->assertFalse($domain->isICANN()); - $this->assertFalse($domain->isPrivate()); + self::assertFalse($domain->isKnown()); + self::assertFalse($domain->isICANN()); + self::assertFalse($domain->isPrivate()); } /** @@ -199,9 +199,9 @@ public function testIsSuffixValidFalseWithPunycoded() public function testSubDomainIsNull() { $domain = $this->rules->resolve('ulb.ac.be', Rules::ICANN_DOMAINS); - $this->assertTrue($domain->isKnown()); - $this->assertTrue($domain->isICANN()); - $this->assertFalse($domain->isPrivate()); + self::assertTrue($domain->isKnown()); + self::assertTrue($domain->isICANN()); + self::assertFalse($domain->isPrivate()); } /** @@ -212,7 +212,7 @@ public function testSubDomainIsNull() public function testWithExceptionName() { $domain = $this->rules->resolve('_b%C3%A9bé.be-'); - $this->assertNull($domain->getContent()); + self::assertNull($domain->getContent()); } /** @@ -226,10 +226,10 @@ public function testWithExceptionName() public function testWithPrivateDomain() { $domain = $this->rules->resolve('thephpleague.github.io'); - $this->assertTrue($domain->isKnown()); - $this->assertFalse($domain->isICANN()); - $this->assertTrue($domain->isPrivate()); - $this->assertSame('github.io', $domain->getPublicSuffix()); + self::assertTrue($domain->isKnown()); + self::assertFalse($domain->isICANN()); + self::assertTrue($domain->isPrivate()); + self::assertSame('github.io', $domain->getPublicSuffix()); } /** @@ -239,11 +239,11 @@ public function testWithPrivateDomain() public function testWithAbsoluteHostInvalid() { $domain = $this->rules->resolve('private.ulb.ac.be.'); - $this->assertSame('private.ulb.ac.be.', $domain->getContent()); - $this->assertFalse($domain->isKnown()); - $this->assertFalse($domain->isICANN()); - $this->assertFalse($domain->isPrivate()); - $this->assertNull($domain->getPublicSuffix()); + self::assertSame('private.ulb.ac.be.', $domain->getContent()); + self::assertFalse($domain->isKnown()); + self::assertFalse($domain->isICANN()); + self::assertFalse($domain->isPrivate()); + self::assertNull($domain->getPublicSuffix()); } /** @@ -257,11 +257,11 @@ public function testWithAbsoluteHostInvalid() public function testWithPrivateDomainInvalid() { $domain = $this->rules->resolve('private.ulb.ac.be', Rules::PRIVATE_DOMAINS); - $this->assertSame('private.ulb.ac.be', $domain->getContent()); - $this->assertFalse($domain->isKnown()); - $this->assertFalse($domain->isICANN()); - $this->assertFalse($domain->isPrivate()); - $this->assertSame('be', $domain->getPublicSuffix()); + self::assertSame('private.ulb.ac.be', $domain->getContent()); + self::assertFalse($domain->isKnown()); + self::assertFalse($domain->isICANN()); + self::assertFalse($domain->isPrivate()); + self::assertSame('be', $domain->getPublicSuffix()); } /** @@ -275,11 +275,11 @@ public function testWithPrivateDomainInvalid() public function testWithPrivateDomainValid() { $domain = $this->rules->resolve('thephpleague.github.io', Rules::PRIVATE_DOMAINS); - $this->assertSame('thephpleague.github.io', $domain->getContent()); - $this->assertTrue($domain->isKnown()); - $this->assertFalse($domain->isICANN()); - $this->assertTrue($domain->isPrivate()); - $this->assertSame('github.io', $domain->getPublicSuffix()); + self::assertSame('thephpleague.github.io', $domain->getContent()); + self::assertTrue($domain->isKnown()); + self::assertFalse($domain->isICANN()); + self::assertTrue($domain->isPrivate()); + self::assertSame('github.io', $domain->getPublicSuffix()); } /** @@ -293,11 +293,11 @@ public function testWithPrivateDomainValid() public function testWithICANNDomainInvalid() { $domain = $this->rules->resolve('private.ulb.ac.be'); - $this->assertSame('private.ulb.ac.be', $domain->getContent()); - $this->assertTrue($domain->isKnown()); - $this->assertTrue($domain->isICANN()); - $this->assertFalse($domain->isPrivate()); - $this->assertSame('ac.be', $domain->getPublicSuffix()); + self::assertSame('private.ulb.ac.be', $domain->getContent()); + self::assertTrue($domain->isKnown()); + self::assertTrue($domain->isICANN()); + self::assertFalse($domain->isPrivate()); + self::assertSame('ac.be', $domain->getPublicSuffix()); } /** @@ -312,12 +312,12 @@ public function testWithDomainObject() { $domain = new Domain('private.ulb.ac.be', new PublicSuffix('ac.be', Rules::ICANN_DOMAINS)); $newDomain = $this->rules->resolve($domain); - $this->assertSame('private.ulb.ac.be', $domain->getContent()); - $this->assertTrue($domain->isKnown()); - $this->assertTrue($domain->isICANN()); - $this->assertFalse($domain->isPrivate()); - $this->assertSame('ac.be', $domain->getPublicSuffix()); - $this->assertSame($domain, $newDomain); + self::assertSame('private.ulb.ac.be', $domain->getContent()); + self::assertTrue($domain->isKnown()); + self::assertTrue($domain->isICANN()); + self::assertFalse($domain->isPrivate()); + self::assertSame('ac.be', $domain->getPublicSuffix()); + self::assertSame($domain, $newDomain); } /** @@ -326,7 +326,7 @@ public function testWithDomainObject() */ public function testWithDomainInterfaceObject() { - $this->assertSame( + self::assertSame( 'ac.be', $this->rules->getPublicSuffix(new PublicSuffix('ul.ac.be', Rules::ICANN_DOMAINS))->getContent() ); @@ -345,7 +345,7 @@ public function testWithDomainInterfaceObject() */ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) { - $this->assertSame($registrableDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getRegistrableDomain()); + self::assertSame($registrableDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getRegistrableDomain()); } /** @@ -362,7 +362,7 @@ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $dom */ public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, $expectedDomain) { - $this->assertSame($publicSuffix, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getPublicSuffix()); + self::assertSame($publicSuffix, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getPublicSuffix()); } /** @@ -379,7 +379,7 @@ public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, */ public function testGetDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) { - $this->assertSame($expectedDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getContent()); + self::assertSame($expectedDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getContent()); } public function parseDataProvider() @@ -420,7 +420,7 @@ public function parseDataProvider() */ public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix($domain, $section) { - $this->expectException(CouldNotResolvePublicSuffix::class); + self::expectException(CouldNotResolvePublicSuffix::class); $this->rules->getPublicSuffix($domain, $section); } @@ -445,7 +445,7 @@ public function invalidParseProvider() */ public function testGetPublicSuffixThrowsInvalidDomainException($domain, $section) { - $this->expectException(InvalidDomain::class); + self::expectException(InvalidDomain::class); $this->rules->getPublicSuffix($domain, $section); } @@ -478,7 +478,7 @@ public function invalidDomainParseProvider() public function testPublicSuffixSection($domain, $expected) { $publicSuffix = $this->rules->getPublicSuffix($domain); - $this->assertSame($expected, $publicSuffix->getContent()); + self::assertSame($expected, $publicSuffix->getContent()); } public function validPublicSectionProvider() @@ -514,7 +514,7 @@ public function validPublicSectionProvider() */ public function checkPublicSuffix($input, $expected) { - $this->assertSame($expected, $this->rules->resolve($input)->getRegistrableDomain()); + self::assertSame($expected, $this->rules->resolve($input)->getRegistrableDomain()); } /** diff --git a/tests/TLDConverterTest.php b/tests/TLDConverterTest.php index 62ee8689..9d60cb09 100644 --- a/tests/TLDConverterTest.php +++ b/tests/TLDConverterTest.php @@ -28,11 +28,11 @@ public function testConverter() { $string = file_get_contents(__DIR__.'/data/root_zones.dat'); $res = (new TLDConverter())->convert($string); - $this->assertInternalType('array', $res); - $this->assertArrayHasKey('version', $res); - $this->assertArrayHasKey('modifiedDate', $res); - $this->assertArrayHasKey('records', $res); - $this->assertInternalType('array', $res['records']); + self::assertInternalType('array', $res); + self::assertArrayHasKey('version', $res); + self::assertArrayHasKey('modifiedDate', $res); + self::assertArrayHasKey('records', $res); + self::assertInternalType('array', $res['records']); } /** @@ -41,7 +41,7 @@ public function testConverter() */ public function testConverterThrowsException(string $content) { - $this->expectException(CouldNotLoadTLDs::class); + self::expectException(CouldNotLoadTLDs::class); (new TLDConverter())->convert($content); } diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index af698e07..9455cd5c 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -52,7 +52,7 @@ public function testCreateFromPath() ]); $collection = TopLevelDomains::createFromPath(__DIR__.'/data/root_zones.dat', $context); - $this->assertInstanceOf(TopLevelDomains::class, $collection); + self::assertInstanceOf(TopLevelDomains::class, $collection); } /** @@ -60,7 +60,7 @@ public function testCreateFromPath() */ public function testCreateFromPathThrowsException() { - $this->expectException(CouldNotLoadTLDs::class); + self::expectException(CouldNotLoadTLDs::class); TopLevelDomains::createFromPath('/foo/bar.dat'); } @@ -71,26 +71,26 @@ public function testCreateFromPathThrowsException() public function testSetState() { $collection = eval('return '.var_export($this->collection, true).';'); - $this->assertEquals($this->collection, $collection); + self::assertEquals($this->collection, $collection); } public function testGetterProperties() { $collection = TopLevelDomains::createFromPath(__DIR__.'/data/root_zones.dat'); - $this->assertCount(15, $collection); - $this->assertSame('2018082200', $collection->getVersion()); - $this->assertEquals( + self::assertCount(15, $collection); + self::assertSame('2018082200', $collection->getVersion()); + self::assertEquals( new DateTimeImmutable('2018-08-22 07:07:01', new DateTimeZone('UTC')), $collection->getModifiedDate() ); - $this->assertFalse($collection->isEmpty()); + self::assertFalse($collection->isEmpty()); $converter = new TLDConverter(); $data = $converter->convert(file_get_contents(__DIR__.'/data/root_zones.dat')); - $this->assertEquals($data, $collection->toArray()); + self::assertEquals($data, $collection->toArray()); foreach ($collection as $tld) { - $this->assertInstanceOf(PublicSuffix::class, $tld); + self::assertInstanceOf(PublicSuffix::class, $tld); } } @@ -100,7 +100,7 @@ public function testGetterProperties() */ public function testResolve($tld) { - $this->assertSame( + self::assertSame( (new Domain($tld))->getLabel(0), $this->collection->resolve($tld)->getPublicSuffix() ); @@ -128,25 +128,25 @@ public function __toString() public function testResolveThrowsTypeError() { - $this->expectException(TypeError::class); + self::expectException(TypeError::class); $this->collection->resolve(new DateTimeImmutable()); } public function testResolveWithInvalidDomain() { - $this->assertEquals(new Domain(), $this->collection->resolve('###')); + self::assertEquals(new Domain(), $this->collection->resolve('###')); } public function testResolveWithUnResolvableDomain() { $domain = 'localhost'; - $this->assertEquals(new Domain($domain), $this->collection->resolve($domain)); + self::assertEquals(new Domain($domain), $this->collection->resolve($domain)); } public function testResolveWithUnregisteredTLD() { $collection = TopLevelDomains::createFromPath(__DIR__.'/data/root_zones.dat'); - $this->assertNull($collection->resolve('localhost.locale')->getPublicSuffix()); + self::assertNull($collection->resolve('localhost.locale')->getPublicSuffix()); } /** @@ -155,7 +155,7 @@ public function testResolveWithUnregisteredTLD() */ public function testContainsReturnsTrue($tld) { - $this->assertTrue($this->collection->contains($tld)); + self::assertTrue($this->collection->contains($tld)); } public function validTldProvider() @@ -186,7 +186,7 @@ public function __toString() */ public function testContainsReturnsFalse($tld) { - $this->assertFalse($this->collection->contains($tld)); + self::assertFalse($this->collection->contains($tld)); } public function invalidTldProvider() From fd51778d68d825a823aafb2cd2e85a97c9af198c Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 16 Nov 2018 10:26:01 +0100 Subject: [PATCH 131/461] bugfix issue #230 --- CHANGELOG.md | 1 + src/IDNAConverterTrait.php | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13745005..bda00c65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in ### Fixed - `Pdp\IDNAConverterTrait::setLabels` improve IDN domain handling +- `Pdp\IDNAConverterTrait` throws a `UnexpectedValueException` if the Intl extension is misconfigured see [#230](https://github.com/jeremykendall/php-domain-parser/issues/230) ### Deprecated diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index dbd5498d..78b87a7b 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -17,6 +17,7 @@ use Pdp\Exception\InvalidDomain; use TypeError; +use UnexpectedValueException; use function array_reverse; use function explode; use function gettype; @@ -119,6 +120,12 @@ private function idnToAscii(string $domain): string throw new InvalidDomain(sprintf('The host `%s` is invalid : %s', $domain, self::getIdnErrors($arr['errors']))); } + // @codeCoverageIgnoreStart + if (false === $output) { + throw new UnexpectedValueException(sprintf('The Intl extension is misconfigured for %s, please correct this issue before proceeding.', PHP_OS)); + } + // @codeCoverageIgnoreEnd + if (false === strpos($output, '%')) { return $output; } @@ -140,11 +147,17 @@ private function idnToAscii(string $domain): string private function idnToUnicode(string $domain): string { $output = idn_to_utf8($domain, 0, INTL_IDNA_VARIANT_UTS46, $arr); - if (0 === $arr['errors']) { - return $output; + if (0 !== $arr['errors']) { + throw new InvalidDomain(sprintf('The host `%s` is invalid : %s', $domain, self::getIdnErrors($arr['errors']))); + } + + // @codeCoverageIgnoreStart + if (false === $output) { + throw new UnexpectedValueException(sprintf('The Intl extension is misconfigured for %s, please correct this issue before proceeding.', PHP_OS)); } + // @codeCoverageIgnoreEnd - throw new InvalidDomain(sprintf('The host `%s` is invalid : %s', $domain, self::getIdnErrors($arr['errors']))); + return $output; } /** From 162b4e8ce874ea6a46ebc2d2251c5b8be30280fd Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 21 Nov 2018 12:39:52 +0100 Subject: [PATCH 132/461] improve cache --- .gitignore | 1 + src/Cache.php | 5 +---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 1ab82556..4558fe56 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ docs *~ build .idea +.php_cs.cache diff --git a/src/Cache.php b/src/Cache.php index 77257985..f5dcc619 100644 --- a/src/Cache.php +++ b/src/Cache.php @@ -169,6 +169,7 @@ public function set($key, $value, $ttl = null) */ private function getExpireAt($ttl): int { + $ttl = $ttl ?? self::CACHE_TTL; if (is_int($ttl)) { return time() + $ttl; } @@ -177,10 +178,6 @@ private function getExpireAt($ttl): int return date_create_immutable('@'.time())->add($ttl)->getTimestamp(); } - if (null === $ttl) { - return time() + self::CACHE_TTL; - } - throw new CacheException(sprintf('Expected TTL to be an int, a DateInterval or null; received "%s"', is_object($ttl) ? get_class($ttl) : gettype($ttl))); } From d15b24c1832e55a033e24be47b9652a3f200b1bd Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 22 Nov 2018 15:49:20 +0100 Subject: [PATCH 133/461] Update readme with the 5.4 added features --- README.md | 125 +++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 101 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 1462d037..1d73cae9 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,10 @@ **PHP Domain Parser** is a [Public Suffix List](http://publicsuffix.org/) based domain parser implemented in PHP. -[![Build Status](https://img.shields.io/travis/jeremykendall/php-domain-parser/master.svg?style=flat-square)](https://travis-ci.org/jeremykendall/php-domain-parser) -[![Total Downloads](https://img.shields.io/packagist/dt/jeremykendall/php-domain-parser.svg?style=flat-square)](https://packagist.org/packages/jeremykendall/php-domain-parser) -[![Latest Stable Version](https://img.shields.io/github/release/jeremykendall/php-domain-parser.svg?style=flat-square)](https://github.com/jeremykendall/php-domain-parser/releases) -[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](https://github.com/jeremykendall/php-domain-parser/blob/master/LICENSE) +[![Build Status][ico-travis]][link-travis] +[![Total Downloads][ico-packagist]][link-packagist] +[![Latest Stable Version][ico-release]][link-release] +[![Software License][ico-license]][link-license] Motivation @@ -20,7 +20,7 @@ Consider the domain www.pref.okinawa.jp. In this domain, the *public suffix* portion is **okinawa.jp**, the *registrable domain* is **pref.okinawa.jp**, and the *subdomain* is **www**. You can't regex that. -PHP Domain Parser is built around accurate Public Suffix List based parsing. For URL parsing, building or manipulation please refer to [libraries](https://packagist.org/packages/sabre/uri?q=uri%20rfc3986&p=0) focused on those area of development. +PHP Domain Parser is built around accurate Public Suffix List based parsing. For URL parsing, building or manipulation please refer to [libraries][link-parse-library] focused on those area of development. System Requirements ------- @@ -66,7 +66,6 @@ $domain->isKnown(); // returns true $domain->isICANN(); // returns true $domain->isPrivate(); // returns false - $publicSuffix = $rules->getPublicSuffix('mydomain.github.io', Rules::PRIVATE_DOMAINS); //$publicSuffix is a Pdp\PublicSuffix object echo $publicSuffix->getContent(); // 'github.io' $publicSuffix->isKnown(); // returns true @@ -78,6 +77,14 @@ echo $altSuffix->getContent(); // 'io' $altSuffix->isKnown(); // returns true $altSuffix->isICANN(); // returns true $altSuffix->isPrivate(); // returns false + +$tldList = $manager->getTLDs(); //$tldList is a Pdp\TopLevelDomains object +$domain = $tldList->resolve('www.ulb.ac.be'); //$domain is a Pdp\Domain object +$tldList->contains('be'); //returns true +$tldList->contains('localhost'); //return false +foreach($tldList as $tld) { + //$tld is a Pdp\PublisSuffix object +} ~~~ Using the above code you have parse, validate and resolve a domain name and its public suffix status against the Public Suffix list. @@ -286,7 +293,50 @@ echo json_encode($domain, JSON_PRETTY_PRINT); **Using the PSL to determine what is a valid domain name and what isn't is dangerous, particularly in these days where new gTLDs are arriving at a rapid pace. The DNS is the proper source for this information. If you must use this library for this purpose, please consider integrating a PSL update mechanism into your software.** -### Managing the Public Suffix List +### Top Level Domains resolutions + +**since version 5.4** + +~~~php +contains('be'); // resolution is done against the retrieves list + +$domain = $tldCollection->resolve('www.Ulb.Ac.BE'); +// returns +// { +// "domain": "www.ulb.ac.be", +// "registrableDomain": "ac.be", +// "subDomain": "www.ulb", +// "publicSuffix": "be", +// "isKnown": true, +// "isICANN": true, +// "isPrivate": false +// } +~~~ + +### Managing the package lists The library comes bundle with a service which enables resolving domain name without the constant network overhead of continously downloading the PSL. The `Pdp\Manager` class retrieves, converts and caches the PSL as well as creates the corresponding `Pdp\Rules` object on demand. It internally uses a `Pdp\Converter` object to convert the fetched PSL into its `array` representation when required. @@ -300,9 +350,13 @@ use Psr\SimpleCache\CacheInterface; final class Manager { const PSL_URL = 'https://publicsuffix.org/list/public_suffix_list.dat'; - public function __construct(CacheInterface $cache, HttpClient $http) - public function getRules(string $source_url = self::PSL_URL): Rules - public function refreshRules(string $source_url = self::PSL_URL): bool + const RZD_URL = 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt'; + + public function __construct(CacheInterface $cache, HttpClient $http, $ttl = null) + public function getRules(string $source_url = self::PSL_URL, $ttl = null): Rules + public function refreshRules(string $source_url = self::PSL_URL, $ttl = null): bool + public function getTLDs(string $source_url = self::RZD_URL, $ttl = null): Rules + public function refreshTLDs(string $source_url = self::RZD_URL, $ttl = null): bool } ~~~ @@ -311,8 +365,17 @@ final class Manager To work as intended, the `Pdp\Manager` constructor requires: - a [PSR-16](http://www.php-fig.org/psr/psr-16/) Cache object to store the rules locally. - - a `Pdp\HttpClient` object to retrieve the PSL. +- a `$ttl` argument if you need to set the default $ttl; **since 5.4** + +The `$ttl` argument can be: + +- an `int` representing time in second (see PSR-16); +- a `DateInterval` object (see PSR-16); +- a `DateTimeInterface` object representing the date and time when the item should expire; + +**the `$ttl` argument is added to improve PSR-16 interoperability** + The `Pdp\HttpClient` is a simple interface which exposes the `HttpClient::getContent` method. This method expects a string URL representation has its sole argument and returns the body from the given URL resource as a string. If an error occurs while retrieving such body a `HttpClientException` exception is thrown. @@ -342,15 +405,16 @@ The package comes bundle with: - a file cache PSR-16 implementation based on the excellent [FileCache](https://github.com/kodus/file-cache) which **caches the local copy for a maximum of 7 days**. - a HTTP client based on the cURL extension. -#### Refreshing the cached PSL +#### Refreshing the cached PSL and TLD data ~~~php getRules('https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat'); -$domain = $rules->resolve('www.ulb.ac.be'); -echo $domain->getPublicSuffix(); // print 'ac.be' +$tldCollection = $manager->getTLDs(self::RZD_URL); +$domain = $tldCollection->resolve('www.ulb.ac.be'); +echo $domain->getPublicSuffix(); // print 'be' ~~~ ### Automatic Updates @@ -555,3 +620,15 @@ Portions of the `Pdp\Converter` and `Pdp\Rules` are derivative works of the PHP [registered-domain-libs](https://github.com/usrflo/registered-domain-libs). Those parts of this codebase are heavily commented, and I've included a copy of the Apache Software Foundation License 2.0 in this project. + +[ico-travis]: https://img.shields.io/travis/jeremykendall/php-domain-parser/master.svg?style=flat-square +[ico-packagist]: https://img.shields.io/packagist/dt/jeremykendall/php-domain-parser.svg?style=flat-square +[ico-release]: https://img.shields.io/github/release/jeremykendall/php-domain-parser.svg?style=flat-square +[ico-license]: https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square + +[link-travis]: https://travis-ci.org/jeremykendall/php-domain-parser +[link-packagist]: https://packagist.org/packages/jeremykendall/php-domain-parser +[link-release]: https://github.com/jeremykendall/php-domain-parser/releases +[link-license]: https://github.com/jeremykendall/php-domain-parser/blob/master/LICENSE + +[link-parse-library]: https://packagist.org/explore/?query=rfc3986 \ No newline at end of file From e3bafec51e8cae4c55fb1791e9e98e712541d16d Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 22 Nov 2018 15:54:36 +0100 Subject: [PATCH 134/461] prepare 5.4.0 release --- CHANGELOG.md | 2 +- src/Cache.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bda00c65..eb4f6a74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in this file -# Next - TBD +# 5.4.0 - 2018-11-22 ### Added diff --git a/src/Cache.php b/src/Cache.php index f5dcc619..207e3be7 100644 --- a/src/Cache.php +++ b/src/Cache.php @@ -21,6 +21,7 @@ use Psr\SimpleCache\CacheInterface; use Traversable; use function chmod; +use function date_create_immutable; use function dirname; use function file_exists; use function file_get_contents; From 271a3ed1b31dff5c10a583bee9cac8bd68cb2fe5 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 2 Feb 2019 08:09:51 +0100 Subject: [PATCH 135/461] bug fix for issue #232 --- src/Cache.php | 5 +++++ tests/CacheTest.php | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Cache.php b/src/Cache.php index 207e3be7..6583d89c 100644 --- a/src/Cache.php +++ b/src/Cache.php @@ -18,6 +18,7 @@ use DateInterval; use FilesystemIterator; use Generator; +use InvalidArgumentException; use Psr\SimpleCache\CacheInterface; use Traversable; use function chmod; @@ -88,6 +89,10 @@ public function __construct(string $cache_path = '') $this->mkdir($cache_path); // ensure that the parent path exists } + if (! is_writable($cache_path.DIRECTORY_SEPARATOR)) { + throw new InvalidArgumentException(sprintf('cache path does not exist or is not writable: %s', $cache_path)); + } + $this->cache_path = $cache_path; } diff --git a/tests/CacheTest.php b/tests/CacheTest.php index 92439858..00d23113 100644 --- a/tests/CacheTest.php +++ b/tests/CacheTest.php @@ -69,8 +69,14 @@ public function testConstructorOnParentCachePathIsNotExisted() public function testSetOnNotWritableCachePath() { + self::expectException(\InvalidArgumentException::class); $cache = new Cache('/bin'); - self::assertFalse($cache->set('key', 'value')); + } + + public function testSetOnNotExistingCachePath() + { + self::expectException(\InvalidArgumentException::class); + $cache = new Cache('/foo/bar'); } /** From 7ed74a322235041c714dc959d56338c5aaae9f64 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 16 Feb 2019 13:44:06 +0100 Subject: [PATCH 136/461] update CHANGELOG --- CHANGELOG.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb4f6a74..23703164 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,24 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in this file +# Next -TBD + +### Added + +- None + +### Fixed + +- Don't swallow cache errors [#232](https://github.com/jeremykendall/php-domain-parser/issues/232) + +### Deprecated + +- None + +### Removed + +- None + # 5.4.0 - 2018-11-22 ### Added From eaf601759bd54ce7f7659bcc15122179bb4fca37 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 16 Feb 2019 13:44:19 +0100 Subject: [PATCH 137/461] update composer.json --- composer.json | 8 ++++---- data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.json b/composer.json index 6e87c122..09119b66 100644 --- a/composer.json +++ b/composer.json @@ -64,8 +64,8 @@ }, "scripts": { "phpcs": "php-cs-fixer fix -vv --diff --dry-run --allow-risky=yes", - "phpstan-src": "phpstan analyse -l 7 -c phpstan.src.neon src", - "phpstan-tests": "phpstan analyse -l 7 -c phpstan.tests.neon tests", + "phpstan-src": "phpstan analyse -l max -c phpstan.src.neon src", + "phpstan-tests": "phpstan analyse -l max -c phpstan.tests.neon tests", "phpstan": [ "@phpstan-src", "@phpstan-tests" @@ -74,9 +74,9 @@ "post-install-cmd": "\\Pdp\\Installer::updateLocalCache", "post-update-cmd": "\\Pdp\\Installer::updateLocalCache", "test": [ - "@phpunit", "@phpcs", - "@phpstan" + "@phpstan", + "@phpunit" ] }, "extra": { diff --git a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache index bac1502b..2b34c17f 100644 --- a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache +++ b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache @@ -1 +1 @@ -s:108039:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"ong":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"ponpes":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"co":[],"org":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":{"bv":[]},"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"statoil":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]}},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"dsmynas":[],"familyds":[],"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastvps-server":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lmpm":{"app":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[],"cn-northwest-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}}},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"io":{"apigee":[],"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"eus":{"party":{"user":[]}},"ca":{"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"ravendb":[],"barsy":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"co":{"otap":{"*":[]},"com":{"blogspot":[]},"mypi":[],"n4t":[],"nodum":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"uk":{"gov":{"service":[],"homeoffice":[]},"co":{"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]},"zone":[]},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"app":{"hasura":[]},"community":{"ravendb":[]},"run":{"development":[],"ravendb":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"space":{"linkitools":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ai":{"nom":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]}}}"; \ No newline at end of file +s:108789:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"ong":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"ponpes":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"ac":[],"biz":[],"co":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"sc":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":[],"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"krasnik":[],"leczna":[],"lubartow":[],"lublin":[],"poniatowa":[],"swidnik":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]},"co":[]},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"siteleaf":[],"dsmynas":[],"familyds":[],"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"wpcomstaging":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastly-terrarium":[],"fastvps-server":[],"mydobiss":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lpusercontent":[],"lmpm":{"app":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"stdlib":{"api":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[],"cn-northwest-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}},"instantcloud":[]},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"io":{"apigee":[],"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"readthedocs":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"applicationcloud":[],"scapp":[],"telebit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"eus":{"party":{"user":[]}},"co":{"go-vip":[],"otap":{"*":[]},"com":{"blogspot":[]},"leadpages":[],"lpages":[],"mypi":[],"n4t":[],"nodum":[]},"ca":{"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[]},"uk":{"co":{"bytemark":{"dh":[],"vm":[]},"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"gov":{"service":[],"homeoffice":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"filegear-au":[],"filegear-de":[],"filegear-gb":[],"filegear-ie":[],"filegear-jp":[],"filegear-sg":[],"ravendb":[],"barsy":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"earth":{"dapps":{"*":[],"bzz":{"*":[]}}},"th":{"online":[],"shop":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[],"telebit":{"*":[]}},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"app":{"run":{"a":[]},"hasura":[],"telebit":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]},"zone":[]},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"community":{"ravendb":[]},"run":{"development":[],"ravendb":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"business":{"co":[]},"education":{"co":[]},"events":{"co":[]},"financial":{"co":[]},"place":{"co":[]},"technology":{"co":[]},"space":{"linkitools":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ai":{"nom":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]},"design":{"bss":[]}}}"; \ No newline at end of file diff --git a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache index f866dcb4..c3d3ac79 100644 --- a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache +++ b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache @@ -1 +1 @@ -s:13434:"{"version":"2018102500","modifiedDate":"2018-10-25T07:07:02+00:00","records":["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac","academy","accenture","accountant","accountants","aco","active","actor","ad","adac","ads","adult","ae","aeg","aero","aetna","af","afamilycompany","afl","africa","ag","agakhan","agency","ai","aig","aigo","airbus","airforce","airtel","akdn","al","alfaromeo","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","am","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","ao","aol","apartments","app","apple","aq","aquarelle","ar","arab","aramco","archi","army","arpa","art","arte","as","asda","asia","associates","at","athleta","attorney","au","auction","audi","audible","audio","auspost","author","auto","autos","avianca","aw","aws","ax","axa","az","azure","ba","baby","baidu","banamex","bananarepublic","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bb","bbc","bbt","bbva","bcg","bcn","bd","be","beats","beauty","beer","bentley","berlin","best","bestbuy","bet","bf","bg","bh","bharti","bi","bible","bid","bike","bing","bingo","bio","biz","bj","black","blackfriday","blanco","blockbuster","blog","bloomberg","blue","bm","bms","bmw","bn","bnl","bnpparibas","bo","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","br","bradesco","bridgestone","broadway","broker","brother","brussels","bs","bt","budapest","bugatti","build","builders","business","buy","buzz","bv","bw","by","bz","bzh","ca","cab","cafe","cal","call","calvinklein","cam","camera","camp","cancerresearch","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","cartier","casa","case","caseih","cash","casino","cat","catering","catholic","cba","cbn","cbre","cbs","cc","cd","ceb","center","ceo","cern","cf","cfa","cfd","cg","ch","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","chrysler","church","ci","cipriani","circle","cisco","citadel","citi","citic","city","cityeats","ck","cl","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","cm","cn","co","coach","codes","coffee","college","cologne","com","comcast","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cookingchannel","cool","coop","corsica","country","coupon","coupons","courses","cr","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","csc","cu","cuisinella","cv","cw","cx","cy","cymru","cyou","cz","dabur","dad","dance","data","date","dating","datsun","day","dclk","dds","de","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dj","dk","dm","dnp","do","docs","doctor","dodge","dog","doha","domains","dot","download","drive","dtv","dubai","duck","dunlop","duns","dupont","durban","dvag","dvr","dz","earth","eat","ec","eco","edeka","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","epost","epson","equipment","er","ericsson","erni","es","esq","estate","esurance","et","etisalat","eu","eurovision","eus","events","everbank","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fi","fiat","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","fj","fk","flickr","flights","flir","florist","flowers","fly","fm","fo","foo","food","foodnetwork","football","ford","forex","forsale","forum","foundation","fox","fr","free","fresenius","frl","frogans","frontdoor","frontier","ftr","fujitsu","fujixerox","fun","fund","furniture","futbol","fyi","ga","gal","gallery","gallo","gallup","game","games","gap","garden","gb","gbiz","gd","gdn","ge","gea","gent","genting","george","gf","gg","ggee","gh","gi","gift","gifts","gives","giving","gl","glade","glass","gle","global","globo","gm","gmail","gmbh","gmo","gmx","gn","godaddy","gold","goldpoint","golf","goo","goodyear","goog","google","gop","got","gov","gp","gq","gr","grainger","graphics","gratis","green","gripe","grocery","group","gs","gt","gu","guardian","gucci","guge","guide","guitars","guru","gw","gy","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hgtv","hiphop","hisamitsu","hitachi","hiv","hk","hkt","hm","hn","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","honeywell","horse","hospital","host","hosting","hot","hoteles","hotels","hotmail","house","how","hr","hsbc","ht","hu","hughes","hyatt","hyundai","ibm","icbc","ice","icu","id","ie","ieee","ifm","ikano","il","im","imamat","imdb","immo","immobilien","in","inc","industries","infiniti","info","ing","ink","institute","insurance","insure","int","intel","international","intuit","investments","io","ipiranga","iq","ir","irish","is","iselect","ismaili","ist","istanbul","it","itau","itv","iveco","jaguar","java","jcb","jcp","je","jeep","jetzt","jewelry","jio","jll","jm","jmp","jnj","jo","jobs","joburg","jot","joy","jp","jpmorgan","jprs","juegos","juniper","kaufen","kddi","ke","kerryhotels","kerrylogistics","kerryproperties","kfh","kg","kh","ki","kia","kim","kinder","kindle","kitchen","kiwi","km","kn","koeln","komatsu","kosher","kp","kpmg","kpn","kr","krd","kred","kuokgroup","kw","ky","kyoto","kz","la","lacaixa","ladbrokes","lamborghini","lamer","lancaster","lancia","lancome","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lb","lc","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","li","liaison","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","linde","link","lipsy","live","living","lixil","lk","llc","loan","loans","locker","locus","loft","lol","london","lotte","lotto","love","lpl","lplfinancial","lr","ls","lt","ltd","ltda","lu","lundbeck","lupin","luxe","luxury","lv","ly","ma","macys","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","maserati","mattel","mba","mc","mckinsey","md","me","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","metlife","mg","mh","miami","microsoft","mil","mini","mint","mit","mitsubishi","mk","ml","mlb","mls","mm","mma","mn","mo","mobi","mobile","mobily","moda","moe","moi","mom","monash","money","monster","mopar","mormon","mortgage","moscow","moto","motorcycles","mov","movie","movistar","mp","mq","mr","ms","msd","mt","mtn","mtr","mu","museum","mutual","mv","mw","mx","my","mz","na","nab","nadex","nagoya","name","nationwide","natura","navy","nba","nc","ne","nec","net","netbank","netflix","network","neustar","new","newholland","news","next","nextdirect","nexus","nf","nfl","ng","ngo","nhk","ni","nico","nike","nikon","ninja","nissan","nissay","nl","no","nokia","northwesternmutual","norton","now","nowruz","nowtv","np","nr","nra","nrw","ntt","nu","nyc","nz","obi","observer","off","office","okinawa","olayan","olayangroup","oldnavy","ollo","om","omega","one","ong","onl","online","onyourside","ooo","open","oracle","orange","org","organic","origins","osaka","otsuka","ott","ovh","pa","page","panasonic","paris","pars","partners","parts","party","passagens","pay","pccw","pe","pet","pf","pfizer","pg","ph","pharmacy","phd","philips","phone","photo","photography","photos","physio","piaget","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","pk","pl","place","play","playstation","plumbing","plus","pm","pn","pnc","pohl","poker","politie","porn","post","pr","pramerica","praxi","press","prime","pro","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","ps","pt","pub","pw","pwc","py","qa","qpon","quebec","quest","qvc","racing","radio","raid","re","read","realestate","realtor","realty","recipes","red","redstone","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","rightathome","ril","rio","rip","rmit","ro","rocher","rocks","rodeo","rogers","room","rs","rsvp","ru","rugby","ruhr","run","rw","rwe","ryukyu","sa","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sb","sbi","sbs","sc","sca","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scjohnson","scor","scot","sd","se","search","seat","secure","security","seek","select","sener","services","ses","seven","sew","sex","sexy","sfr","sg","sh","shangrila","sharp","shaw","shell","shia","shiksha","shoes","shop","shopping","shouji","show","showtime","shriram","si","silk","sina","singles","site","sj","sk","ski","skin","sky","skype","sl","sling","sm","smart","smile","sn","sncf","so","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","space","spiegel","sport","spot","spreadbetting","sr","srl","srt","st","stada","staples","star","starhub","statebank","statefarm","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","su","sucks","supplies","supply","support","surf","surgery","suzuki","sv","swatch","swiftcover","swiss","sx","sy","sydney","symantec","systems","sz","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tc","tci","td","tdk","team","tech","technology","tel","telefonica","temasek","tennis","teva","tf","tg","th","thd","theater","theatre","tiaa","tickets","tienda","tiffany","tips","tires","tirol","tj","tjmaxx","tjx","tk","tkmaxx","tl","tm","tmall","tn","to","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","tr","trade","trading","training","travel","travelchannel","travelers","travelersinsurance","trust","trv","tt","tube","tui","tunes","tushu","tv","tvs","tw","tz","ua","ubank","ubs","uconnect","ug","uk","unicom","university","uno","uol","ups","us","uy","uz","va","vacations","vana","vanguard","vc","ve","vegas","ventures","verisign","versicherung","vet","vg","vi","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","vistaprint","viva","vivo","vlaanderen","vn","vodka","volkswagen","volvo","vote","voting","voto","voyage","vu","vuelos","wales","walmart","walter","wang","wanggou","warman","watch","watches","weather","weatherchannel","webcam","weber","website","wed","wedding","weibo","weir","wf","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","ws","wtc","wtf","xbox","xerox","xfinity","xihuan","xin","xn--11b4c3d","xn--1ck2e1b","xn--1qqw23a","xn--2scrj9c","xn--30rr7y","xn--3bst00m","xn--3ds443g","xn--3e0b707e","xn--3hcrj9c","xn--3oq18vl8pn36a","xn--3pxu8k","xn--42c2d9a","xn--45br5cyl","xn--45brj9c","xn--45q11c","xn--4gbrim","xn--54b7fta0cc","xn--55qw42g","xn--55qx5d","xn--5su34j936bgsg","xn--5tzm5g","xn--6frz82g","xn--6qq986b3xl","xn--80adxhks","xn--80ao21a","xn--80aqecdr1a","xn--80asehdb","xn--80aswg","xn--8y0a063a","xn--90a3ac","xn--90ae","xn--90ais","xn--9dbq2a","xn--9et52u","xn--9krt00a","xn--b4w605ferd","xn--bck1b9a5dre4c","xn--c1avg","xn--c2br7g","xn--cck2b3b","xn--cg4bki","xn--clchc0ea0b2g2a9gcd","xn--czr694b","xn--czrs0t","xn--czru2d","xn--d1acj3b","xn--d1alf","xn--e1a4c","xn--eckvdtc9d","xn--efvy88h","xn--estv75g","xn--fct429k","xn--fhbei","xn--fiq228c5hs","xn--fiq64b","xn--fiqs8s","xn--fiqz9s","xn--fjq720a","xn--flw351e","xn--fpcrj9c3d","xn--fzc2c9e2c","xn--fzys8d69uvgm","xn--g2xx48c","xn--gckr3f0f","xn--gecrj9c","xn--gk3at1e","xn--h2breg3eve","xn--h2brj9c","xn--h2brj9c8c","xn--hxt814e","xn--i1b6b1a6a2e","xn--imr513n","xn--io0a7i","xn--j1aef","xn--j1amh","xn--j6w193g","xn--jlq61u9w7b","xn--jvr189m","xn--kcrx77d1x4a","xn--kprw13d","xn--kpry57d","xn--kpu716f","xn--kput3i","xn--l1acc","xn--lgbbat1ad8j","xn--mgb9awbf","xn--mgba3a3ejt","xn--mgba3a4f16a","xn--mgba7c0bbn0a","xn--mgbaakc7dvf","xn--mgbaam7a8h","xn--mgbab2bd","xn--mgbai9azgqp6j","xn--mgbayh7gpa","xn--mgbb9fbpob","xn--mgbbh1a","xn--mgbbh1a71e","xn--mgbc0a9azcg","xn--mgbca7dzdo","xn--mgberp4a5d4ar","xn--mgbgu82a","xn--mgbi4ecexp","xn--mgbpl2fh","xn--mgbt3dhd","xn--mgbtx2b","xn--mgbx4cd0ab","xn--mix891f","xn--mk1bu44c","xn--mxtq1m","xn--ngbc5azd","xn--ngbe9e0a","xn--ngbrx","xn--node","xn--nqv7f","xn--nqv7fs00ema","xn--nyqy26a","xn--o3cw4h","xn--ogbpf8fl","xn--otu796d","xn--p1acf","xn--p1ai","xn--pbt977c","xn--pgbs0dh","xn--pssy2u","xn--q9jyb4c","xn--qcka1pmc","xn--qxam","xn--rhqv96g","xn--rovu88b","xn--rvc1e0am3e","xn--s9brj9c","xn--ses554g","xn--t60b56a","xn--tckwe","xn--tiq49xqyj","xn--unup4y","xn--vermgensberater-ctb","xn--vermgensberatung-pwb","xn--vhquv","xn--vuq861b","xn--w4r85el8fhu5dnra","xn--w4rs40l","xn--wgbh1c","xn--wgbl6a","xn--xhq521b","xn--xkc2al3hye2a","xn--xkc2dl3a5ee0h","xn--y9a3aq","xn--yfro4i67o","xn--ygbi2ammx","xn--zfr164b","xxx","xyz","yachts","yahoo","yamaxun","yandex","ye","yodobashi","yoga","yokohama","you","youtube","yt","yun","za","zappos","zara","zero","zip","zippo","zm","zone","zuerich","zw"]}"; \ No newline at end of file +s:13424:"{"version":"2019021600","modifiedDate":"2019-02-16T07:07:01+00:00","records":["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac","academy","accenture","accountant","accountants","aco","active","actor","ad","adac","ads","adult","ae","aeg","aero","aetna","af","afamilycompany","afl","africa","ag","agakhan","agency","ai","aig","aigo","airbus","airforce","airtel","akdn","al","alfaromeo","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","am","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","ao","aol","apartments","app","apple","aq","aquarelle","ar","arab","aramco","archi","army","arpa","art","arte","as","asda","asia","associates","at","athleta","attorney","au","auction","audi","audible","audio","auspost","author","auto","autos","avianca","aw","aws","ax","axa","az","azure","ba","baby","baidu","banamex","bananarepublic","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bb","bbc","bbt","bbva","bcg","bcn","bd","be","beats","beauty","beer","bentley","berlin","best","bestbuy","bet","bf","bg","bh","bharti","bi","bible","bid","bike","bing","bingo","bio","biz","bj","black","blackfriday","blockbuster","blog","bloomberg","blue","bm","bms","bmw","bn","bnl","bnpparibas","bo","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","br","bradesco","bridgestone","broadway","broker","brother","brussels","bs","bt","budapest","bugatti","build","builders","business","buy","buzz","bv","bw","by","bz","bzh","ca","cab","cafe","cal","call","calvinklein","cam","camera","camp","cancerresearch","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","cartier","casa","case","caseih","cash","casino","cat","catering","catholic","cba","cbn","cbre","cbs","cc","cd","ceb","center","ceo","cern","cf","cfa","cfd","cg","ch","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","chrysler","church","ci","cipriani","circle","cisco","citadel","citi","citic","city","cityeats","ck","cl","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","cm","cn","co","coach","codes","coffee","college","cologne","com","comcast","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cookingchannel","cool","coop","corsica","country","coupon","coupons","courses","cr","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","csc","cu","cuisinella","cv","cw","cx","cy","cymru","cyou","cz","dabur","dad","dance","data","date","dating","datsun","day","dclk","dds","de","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dj","dk","dm","dnp","do","docs","doctor","dodge","dog","doha","domains","dot","download","drive","dtv","dubai","duck","dunlop","duns","dupont","durban","dvag","dvr","dz","earth","eat","ec","eco","edeka","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","epson","equipment","er","ericsson","erni","es","esq","estate","esurance","et","etisalat","eu","eurovision","eus","events","everbank","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fi","fiat","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","fj","fk","flickr","flights","flir","florist","flowers","fly","fm","fo","foo","food","foodnetwork","football","ford","forex","forsale","forum","foundation","fox","fr","free","fresenius","frl","frogans","frontdoor","frontier","ftr","fujitsu","fujixerox","fun","fund","furniture","futbol","fyi","ga","gal","gallery","gallo","gallup","game","games","gap","garden","gb","gbiz","gd","gdn","ge","gea","gent","genting","george","gf","gg","ggee","gh","gi","gift","gifts","gives","giving","gl","glade","glass","gle","global","globo","gm","gmail","gmbh","gmo","gmx","gn","godaddy","gold","goldpoint","golf","goo","goodyear","goog","google","gop","got","gov","gp","gq","gr","grainger","graphics","gratis","green","gripe","grocery","group","gs","gt","gu","guardian","gucci","guge","guide","guitars","guru","gw","gy","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hgtv","hiphop","hisamitsu","hitachi","hiv","hk","hkt","hm","hn","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","honeywell","horse","hospital","host","hosting","hot","hoteles","hotels","hotmail","house","how","hr","hsbc","ht","hu","hughes","hyatt","hyundai","ibm","icbc","ice","icu","id","ie","ieee","ifm","ikano","il","im","imamat","imdb","immo","immobilien","in","inc","industries","infiniti","info","ing","ink","institute","insurance","insure","int","intel","international","intuit","investments","io","ipiranga","iq","ir","irish","is","iselect","ismaili","ist","istanbul","it","itau","itv","iveco","jaguar","java","jcb","jcp","je","jeep","jetzt","jewelry","jio","jll","jm","jmp","jnj","jo","jobs","joburg","jot","joy","jp","jpmorgan","jprs","juegos","juniper","kaufen","kddi","ke","kerryhotels","kerrylogistics","kerryproperties","kfh","kg","kh","ki","kia","kim","kinder","kindle","kitchen","kiwi","km","kn","koeln","komatsu","kosher","kp","kpmg","kpn","kr","krd","kred","kuokgroup","kw","ky","kyoto","kz","la","lacaixa","ladbrokes","lamborghini","lamer","lancaster","lancia","lancome","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lb","lc","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","li","liaison","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","linde","link","lipsy","live","living","lixil","lk","llc","loan","loans","locker","locus","loft","lol","london","lotte","lotto","love","lpl","lplfinancial","lr","ls","lt","ltd","ltda","lu","lundbeck","lupin","luxe","luxury","lv","ly","ma","macys","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","maserati","mattel","mba","mc","mckinsey","md","me","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","metlife","mg","mh","miami","microsoft","mil","mini","mint","mit","mitsubishi","mk","ml","mlb","mls","mm","mma","mn","mo","mobi","mobile","mobily","moda","moe","moi","mom","monash","money","monster","mopar","mormon","mortgage","moscow","moto","motorcycles","mov","movie","movistar","mp","mq","mr","ms","msd","mt","mtn","mtr","mu","museum","mutual","mv","mw","mx","my","mz","na","nab","nadex","nagoya","name","nationwide","natura","navy","nba","nc","ne","nec","net","netbank","netflix","network","neustar","new","newholland","news","next","nextdirect","nexus","nf","nfl","ng","ngo","nhk","ni","nico","nike","nikon","ninja","nissan","nissay","nl","no","nokia","northwesternmutual","norton","now","nowruz","nowtv","np","nr","nra","nrw","ntt","nu","nyc","nz","obi","observer","off","office","okinawa","olayan","olayangroup","oldnavy","ollo","om","omega","one","ong","onl","online","onyourside","ooo","open","oracle","orange","org","organic","origins","osaka","otsuka","ott","ovh","pa","page","panasonic","paris","pars","partners","parts","party","passagens","pay","pccw","pe","pet","pf","pfizer","pg","ph","pharmacy","phd","philips","phone","photo","photography","photos","physio","piaget","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","pk","pl","place","play","playstation","plumbing","plus","pm","pn","pnc","pohl","poker","politie","porn","post","pr","pramerica","praxi","press","prime","pro","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","ps","pt","pub","pw","pwc","py","qa","qpon","quebec","quest","qvc","racing","radio","raid","re","read","realestate","realtor","realty","recipes","red","redstone","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","rightathome","ril","rio","rip","rmit","ro","rocher","rocks","rodeo","rogers","room","rs","rsvp","ru","rugby","ruhr","run","rw","rwe","ryukyu","sa","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sb","sbi","sbs","sc","sca","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scjohnson","scor","scot","sd","se","search","seat","secure","security","seek","select","sener","services","ses","seven","sew","sex","sexy","sfr","sg","sh","shangrila","sharp","shaw","shell","shia","shiksha","shoes","shop","shopping","shouji","show","showtime","shriram","si","silk","sina","singles","site","sj","sk","ski","skin","sky","skype","sl","sling","sm","smart","smile","sn","sncf","so","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","space","sport","spot","spreadbetting","sr","srl","srt","ss","st","stada","staples","star","starhub","statebank","statefarm","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","su","sucks","supplies","supply","support","surf","surgery","suzuki","sv","swatch","swiftcover","swiss","sx","sy","sydney","symantec","systems","sz","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tc","tci","td","tdk","team","tech","technology","tel","telefonica","temasek","tennis","teva","tf","tg","th","thd","theater","theatre","tiaa","tickets","tienda","tiffany","tips","tires","tirol","tj","tjmaxx","tjx","tk","tkmaxx","tl","tm","tmall","tn","to","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","tr","trade","trading","training","travel","travelchannel","travelers","travelersinsurance","trust","trv","tt","tube","tui","tunes","tushu","tv","tvs","tw","tz","ua","ubank","ubs","uconnect","ug","uk","unicom","university","uno","uol","ups","us","uy","uz","va","vacations","vana","vanguard","vc","ve","vegas","ventures","verisign","versicherung","vet","vg","vi","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","vistaprint","viva","vivo","vlaanderen","vn","vodka","volkswagen","volvo","vote","voting","voto","voyage","vu","vuelos","wales","walmart","walter","wang","wanggou","warman","watch","watches","weather","weatherchannel","webcam","weber","website","wed","wedding","weibo","weir","wf","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","ws","wtc","wtf","xbox","xerox","xfinity","xihuan","xin","xn--11b4c3d","xn--1ck2e1b","xn--1qqw23a","xn--2scrj9c","xn--30rr7y","xn--3bst00m","xn--3ds443g","xn--3e0b707e","xn--3hcrj9c","xn--3oq18vl8pn36a","xn--3pxu8k","xn--42c2d9a","xn--45br5cyl","xn--45brj9c","xn--45q11c","xn--4gbrim","xn--54b7fta0cc","xn--55qw42g","xn--55qx5d","xn--5su34j936bgsg","xn--5tzm5g","xn--6frz82g","xn--6qq986b3xl","xn--80adxhks","xn--80ao21a","xn--80aqecdr1a","xn--80asehdb","xn--80aswg","xn--8y0a063a","xn--90a3ac","xn--90ae","xn--90ais","xn--9dbq2a","xn--9et52u","xn--9krt00a","xn--b4w605ferd","xn--bck1b9a5dre4c","xn--c1avg","xn--c2br7g","xn--cck2b3b","xn--cg4bki","xn--clchc0ea0b2g2a9gcd","xn--czr694b","xn--czrs0t","xn--czru2d","xn--d1acj3b","xn--d1alf","xn--e1a4c","xn--eckvdtc9d","xn--efvy88h","xn--estv75g","xn--fct429k","xn--fhbei","xn--fiq228c5hs","xn--fiq64b","xn--fiqs8s","xn--fiqz9s","xn--fjq720a","xn--flw351e","xn--fpcrj9c3d","xn--fzc2c9e2c","xn--fzys8d69uvgm","xn--g2xx48c","xn--gckr3f0f","xn--gecrj9c","xn--gk3at1e","xn--h2breg3eve","xn--h2brj9c","xn--h2brj9c8c","xn--hxt814e","xn--i1b6b1a6a2e","xn--imr513n","xn--io0a7i","xn--j1aef","xn--j1amh","xn--j6w193g","xn--jlq61u9w7b","xn--jvr189m","xn--kcrx77d1x4a","xn--kprw13d","xn--kpry57d","xn--kpu716f","xn--kput3i","xn--l1acc","xn--lgbbat1ad8j","xn--mgb9awbf","xn--mgba3a3ejt","xn--mgba3a4f16a","xn--mgba7c0bbn0a","xn--mgbaakc7dvf","xn--mgbaam7a8h","xn--mgbab2bd","xn--mgbah1a3hjkrd","xn--mgbai9azgqp6j","xn--mgbayh7gpa","xn--mgbb9fbpob","xn--mgbbh1a","xn--mgbbh1a71e","xn--mgbc0a9azcg","xn--mgbca7dzdo","xn--mgberp4a5d4ar","xn--mgbgu82a","xn--mgbi4ecexp","xn--mgbpl2fh","xn--mgbt3dhd","xn--mgbtx2b","xn--mgbx4cd0ab","xn--mix891f","xn--mk1bu44c","xn--mxtq1m","xn--ngbc5azd","xn--ngbe9e0a","xn--ngbrx","xn--node","xn--nqv7f","xn--nqv7fs00ema","xn--nyqy26a","xn--o3cw4h","xn--ogbpf8fl","xn--otu796d","xn--p1acf","xn--p1ai","xn--pbt977c","xn--pgbs0dh","xn--pssy2u","xn--q9jyb4c","xn--qcka1pmc","xn--qxam","xn--rhqv96g","xn--rovu88b","xn--rvc1e0am3e","xn--s9brj9c","xn--ses554g","xn--t60b56a","xn--tckwe","xn--tiq49xqyj","xn--unup4y","xn--vermgensberater-ctb","xn--vermgensberatung-pwb","xn--vhquv","xn--vuq861b","xn--w4r85el8fhu5dnra","xn--w4rs40l","xn--wgbh1c","xn--wgbl6a","xn--xhq521b","xn--xkc2al3hye2a","xn--xkc2dl3a5ee0h","xn--y9a3aq","xn--yfro4i67o","xn--ygbi2ammx","xn--zfr164b","xxx","xyz","yachts","yahoo","yamaxun","yandex","ye","yodobashi","yoga","yokohama","you","youtube","yt","yun","za","zappos","zara","zero","zip","zm","zone","zuerich","zw"]}"; \ No newline at end of file From 23052bcbcf1746d57006e4b353e0e898fb9bc7ba Mon Sep 17 00:00:00 2001 From: insolita Date: Sat, 30 Mar 2019 16:34:02 +0800 Subject: [PATCH 138/461] fix #234 --- src/Domain.php | 146 +++++++++++++++++++++++++------- src/DomainInterface.php | 7 ++ src/IDNAConverterTrait.php | 39 +++++---- src/PublicSuffix.php | 72 +++++++++++++--- src/Rules.php | 22 +++-- src/TopLevelDomains.php | 12 +-- tests/DomainTest.php | 154 ++++++++++++++++++++++++++++++++++ tests/PublicSuffixTest.php | 85 +++++++++++++++++++ tests/RulesTest.php | 9 ++ tests/TopLevelDomainsTest.php | 4 + 10 files changed, 482 insertions(+), 68 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 545cd566..1d0c95bb 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -20,6 +20,7 @@ use Pdp\Exception\CouldNotResolveSubDomain; use Pdp\Exception\InvalidLabel; use Pdp\Exception\InvalidLabelKey; +use Throwable; use TypeError; use function array_count_values; use function array_keys; @@ -82,32 +83,59 @@ final class Domain implements DomainInterface, JsonSerializable * @var string|null */ private $subDomain; - + + /** + * @var int + */ + private $asciiIDNAOption = IDNA_DEFAULT; + + /** + * @var int + */ + private $unicodeIDNAOption = IDNA_DEFAULT; + + /** + * @var bool + */ + private $isTransitionalDifferent; /** * {@inheritdoc} */ public static function __set_state(array $properties): self { - return new self($properties['domain'], $properties['publicSuffix']); + return new self( + $properties['domain'], + $properties['publicSuffix'], + $properties['asciiIDNAOption'], + $properties['unicodeIDNAOption'] + ); } - + /** * New instance. - * * @param null|mixed $domain * @param null|PublicSuffix $publicSuffix - */ - public function __construct($domain = null, PublicSuffix $publicSuffix = null) - { - $this->labels = $this->setLabels($domain); + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption + */ + public function __construct( + $domain = null, + PublicSuffix $publicSuffix = null, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ) { + $this->setIDNAOptions($asciiIDNAOption, $unicodeIDNAOption); + $this->labels = $this->setLabels($domain, $asciiIDNAOption, $unicodeIDNAOption); if ([] !== $this->labels) { $this->domain = implode('.', array_reverse($this->labels)); } - $this->publicSuffix = $this->setPublicSuffix($publicSuffix ?? new PublicSuffix()); + $this->publicSuffix = $this->setPublicSuffix( + $publicSuffix ?? new PublicSuffix(null, '', $asciiIDNAOption, $unicodeIDNAOption) + ); $this->registrableDomain = $this->setRegistrableDomain(); $this->subDomain = $this->setSubDomain(); } - + /** * Sets the public suffix domain part. * @@ -224,7 +252,7 @@ public function jsonSerialize() */ public function __debugInfo() { - return [ + return [ 'domain' => $this->domain, 'registrableDomain' => $this->registrableDomain, 'subDomain' => $this->subDomain, @@ -346,7 +374,7 @@ public function getPublicSuffix() */ public function isResolvable(): bool { - return 1 < count($this->labels) && '.' !== substr($this->domain, -1, 1); + return 1 < count($this->labels ?? []) && '.' !== substr($this->domain, -1, 1); } /** @@ -388,12 +416,12 @@ public function toAscii() return $this; } - $domain = $this->idnToAscii($this->domain); + $domain = $this->idnToAscii($this->domain, $this->asciiIDNAOption); if ($domain === $this->domain) { return $this; } - return new self($domain, $this->publicSuffix); + return new self($domain, $this->publicSuffix, ...$this->getIDNAOptions()); } /** @@ -405,7 +433,11 @@ public function toUnicode() return $this; } - return new self($this->idnToUnicode($this->domain), $this->publicSuffix); + return new self( + $this->idnToUnicode($this->domain, $this->unicodeIDNAOption), + $this->publicSuffix, + ...$this->getIDNAOptions() + ); } /** @@ -426,7 +458,7 @@ public function toUnicode() public function resolve($publicSuffix): self { if (!$publicSuffix instanceof PublicSuffix) { - $publicSuffix = new PublicSuffix($publicSuffix); + $publicSuffix = new PublicSuffix($publicSuffix, '', ...$this->getIDNAOptions()); } $publicSuffix = $this->normalize($publicSuffix); @@ -434,7 +466,7 @@ public function resolve($publicSuffix): self return $this; } - return new self($this->domain, $publicSuffix); + return new self($this->domain, $publicSuffix, ...$this->getIDNAOptions()); } /** @@ -453,7 +485,7 @@ public function resolve($publicSuffix): self public function withPublicSuffix($publicSuffix): self { if (!$publicSuffix instanceof PublicSuffix) { - $publicSuffix = new PublicSuffix($publicSuffix); + $publicSuffix = new PublicSuffix($publicSuffix, '', ...$this->getIDNAOptions()); } $publicSuffix = $this->normalize($publicSuffix); @@ -463,10 +495,10 @@ public function withPublicSuffix($publicSuffix): self $domain = implode('.', array_reverse(array_slice($this->labels, count($this->publicSuffix)))); if (null === $publicSuffix->getContent()) { - return new self($domain); + return new self($domain, null, ...$this->getIDNAOptions()); } - return new self($domain.'.'.$publicSuffix->getContent(), $publicSuffix); + return new self($domain.'.'.$publicSuffix->getContent(), $publicSuffix, ...$this->getIDNAOptions()); } @@ -494,10 +526,14 @@ public function withSubDomain($subDomain): self } if (null === $subDomain) { - return new self($this->registrableDomain, $this->publicSuffix); + return new self($this->registrableDomain, $this->publicSuffix, ...$this->getIDNAOptions()); } - return new self($subDomain.'.'.$this->registrableDomain, $this->publicSuffix); + return new self( + $subDomain.'.'.$this->registrableDomain, + $this->publicSuffix, + ...$this->getIDNAOptions() + ); } /** @@ -529,10 +565,10 @@ private function normalizeContent($domain) } if (preg_match(self::REGEXP_IDN_PATTERN, $this->domain)) { - return $this->idnToUnicode($domain); + return $this->idnToUnicode($domain, $this->unicodeIDNAOption); } - return $this->idnToAscii($domain); + return $this->idnToAscii($domain, $this->asciiIDNAOption); } /** @@ -605,10 +641,14 @@ public function withLabel(int $key, $label): self ksort($labels); if (null !== $this->publicSuffix->getLabel($key)) { - return new self(implode('.', array_reverse($labels))); + return new self(implode('.', array_reverse($labels)), null, ...$this->getIDNAOptions()); } - return new self(implode('.', array_reverse($labels)), $this->publicSuffix); + return new self( + implode('.', array_reverse($labels)), + $this->publicSuffix, + ...$this->getIDNAOptions() + ); } /** @@ -651,15 +691,63 @@ public function withoutLabel(int $key, int ...$keys): self } if ([] === $labels) { - return new self(); + return new self(null, null, ...$this->getIDNAOptions()); } $domain = implode('.', array_reverse($labels)); $psContent = $this->publicSuffix->getContent(); if (null === $psContent || '.'.$psContent !== substr($domain, - strlen($psContent) - 1)) { - return new self($domain); + return new self($domain, null, ...$this->getIDNAOptions()); } - return new self($domain, $this->publicSuffix); + return new self($domain, $this->publicSuffix, ...$this->getIDNAOptions()); + } + + /** + * @return array + */ + public function getIDNAOptions(): array + { + return [$this->asciiIDNAOption, $this->unicodeIDNAOption]; + } + + public function getAsciiIDNAOption(): int + { + return $this->asciiIDNAOption; + } + + public function getUnicodeIDNAOption(): int + { + return $this->unicodeIDNAOption; + } + /** + * Set IDNA_* options for functions idn_to_ascii, idn_to_utf. + * @see https://www.php.net/manual/en/intl.constants.php + * @param int $forAscii + * @param int $forUnicode + * @return $this + */ + public function setIDNAOptions(int $forAscii, int $forUnicode) + { + $this->asciiIDNAOption = $forAscii; + $this->unicodeIDNAOption = $forUnicode; + return $this; + } + + /** + * return true if domain contains deviation characters. + * @see http://unicode.org/reports/tr46/#Transition_Considerations + * @return bool + **/ + public function isTransitionalDifferent(): bool + { + if ($this->isTransitionalDifferent === null) { + try { + $this->idnToAscii($this->getContent(), $this->asciiIDNAOption); + } catch (Throwable $e) { + $this->isTransitionalDifferent = false; + } + } + return $this->isTransitionalDifferent; } } diff --git a/src/DomainInterface.php b/src/DomainInterface.php index 0954d2d1..a53f0453 100644 --- a/src/DomainInterface.php +++ b/src/DomainInterface.php @@ -99,4 +99,11 @@ public function toUnicode(); * from the right-most label to the left-most label. */ public function getIterator(); + + /** + * return true if domain contains deviation characters. + * @see http://unicode.org/reports/tr46/#Transition_Considerations + * @return bool + **/ + public function isTransitionalDifferent(): bool; } diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index 78b87a7b..c30c2385 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -28,6 +28,7 @@ use function iterator_to_array; use function method_exists; use function preg_match; +use function property_exists; use function rawurldecode; use function sprintf; use function strpos; @@ -103,19 +104,22 @@ private static function getIdnErrors(int $error_bit): string * * @param string $domain * + * @param int $IDNAOption + * * @throws InvalidDomain if the string can not be converted to ASCII using IDN UTS46 algorithm * * @return string */ - private function idnToAscii(string $domain): string + private function idnToAscii(string $domain, int $IDNAOption = IDNA_DEFAULT): string { $domain = rawurldecode($domain); static $pattern = '/[^\x20-\x7f]/'; if (!preg_match($pattern, $domain)) { + $this->isTransitionalDifferent = false; return strtolower($domain); } - $output = idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46, $arr); + $output = idn_to_ascii($domain, $IDNAOption, INTL_IDNA_VARIANT_UTS46, $arr); if (0 !== $arr['errors']) { throw new InvalidDomain(sprintf('The host `%s` is invalid : %s', $domain, self::getIdnErrors($arr['errors']))); } @@ -125,7 +129,11 @@ private function idnToAscii(string $domain): string throw new UnexpectedValueException(sprintf('The Intl extension is misconfigured for %s, please correct this issue before proceeding.', PHP_OS)); } // @codeCoverageIgnoreEnd - + + if (property_exists($this, 'isTransitionalDifferent')) { + $this->isTransitionalDifferent = isset($arr['isTransitionalDifferent']) + && (bool)$arr['isTransitionalDifferent'] === true; + } if (false === strpos($output, '%')) { return $output; } @@ -140,13 +148,15 @@ private function idnToAscii(string $domain): string * * @param string $domain * + * @param int $IDNAOption + * * @throws InvalidDomain if the string can not be converted to UNICODE using IDN UTS46 algorithm * * @return string */ - private function idnToUnicode(string $domain): string + private function idnToUnicode(string $domain, int $IDNAOption = IDNA_DEFAULT): string { - $output = idn_to_utf8($domain, 0, INTL_IDNA_VARIANT_UTS46, $arr); + $output = idn_to_utf8($domain, $IDNAOption, INTL_IDNA_VARIANT_UTS46, $arr); if (0 !== $arr['errors']) { throw new InvalidDomain(sprintf('The host `%s` is invalid : %s', $domain, self::getIdnErrors($arr['errors']))); } @@ -162,19 +172,16 @@ private function idnToUnicode(string $domain): string /** * Filter and format the domain to ensure it is valid. - * * Returns an array containing the formatted domain name in lowercase * with its associated labels in reverse order - * - * For example: setLabels('wWw.uLb.Ac.be') should return ['www.ulb.ac.be', ['be', 'ac', 'ulb', 'www']]; - * - * @param mixed $domain - * + * For example: setLabels('wWw.uLb.Ac.be') should return ['www.ulb.ac.be', ['be', 'ac', 'ulb', 'www']];. + * @param mixed $domain + * @param int $asciiOption + * @param int $unicodeOption * @throws InvalidDomain If the domain is invalid - * * @return string[] */ - private function setLabels($domain = null): array + private function setLabels($domain = null, int $asciiOption = 0, int $unicodeOption = 0): array { if ($domain instanceof DomainInterface) { return iterator_to_array($domain, false); @@ -222,9 +229,9 @@ private function setLabels($domain = null): array if (!preg_match($pattern, $formatted_domain)) { throw new InvalidDomain(sprintf('The domain `%s` is invalid: the labels are malformed', $domain)); } + + $ascii_domain = $this->idnToAscii($domain, $asciiOption); - $ascii_domain = $this->idnToAscii($domain); - - return array_reverse(explode('.', $this->idnToUnicode($ascii_domain))); + return array_reverse(explode('.', $this->idnToUnicode($ascii_domain, $unicodeOption))); } } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index f50bb342..75ca860d 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -18,6 +18,7 @@ use JsonSerializable; use Pdp\Exception\CouldNotResolvePublicSuffix; use Pdp\Exception\InvalidDomain; +use Throwable; use function array_keys; use function array_reverse; use function count; @@ -63,13 +64,32 @@ final class PublicSuffix implements DomainInterface, JsonSerializable, PublicSuf * @var string[] */ private $labels; - + + /** + * @var int + */ + private $asciiIDNAOption = IDNA_DEFAULT; + + /** + * @var int + */ + private $unicodeIDNAOption = IDNA_DEFAULT; + + /** + * @var bool + */ + private $isTransitionalDifferent; /** * {@inheritdoc} */ public static function __set_state(array $properties): self { - return new self($properties['publicSuffix'], $properties['section']); + return new self( + $properties['publicSuffix'], + $properties['section'], + $properties['asciiIDNAOption'], + $properties['unicodeIDNAOption'] + ); } /** @@ -87,21 +107,28 @@ public static function createFromDomain(Domain $domain): self } elseif ($domain->isPrivate()) { $section = self::PRIVATE_DOMAINS; } - - return new self($domain->getPublicSuffix(), $section); + + return new self($domain->getPublicSuffix(), $section, ...$domain->getIDNAOptions()); } /** * New instance. - * * @param mixed $publicSuffix * @param string $section + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption */ - public function __construct($publicSuffix = null, string $section = '') - { - $this->labels = $this->setLabels($publicSuffix); + public function __construct( + $publicSuffix = null, + string $section = '', + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ) { + $this->labels = $this->setLabels($publicSuffix, $asciiIDNAOption, $unicodeIDNAOption); $this->publicSuffix = $this->setPublicSuffix(); $this->section = $this->setSection($section); + $this->asciiIDNAOption = $asciiIDNAOption; + $this->unicodeIDNAOption = $unicodeIDNAOption; } /** @@ -261,7 +288,7 @@ public function toAscii() return $this; } - $publicSuffix = $this->idnToAscii($this->publicSuffix); + $publicSuffix = $this->idnToAscii($this->publicSuffix, $this->asciiIDNAOption); if ($publicSuffix === $this->publicSuffix) { return $this; } @@ -283,9 +310,34 @@ public function toUnicode() } $clone = clone $this; - $clone->publicSuffix = $this->idnToUnicode($this->publicSuffix); + $clone->publicSuffix = $this->idnToUnicode($this->publicSuffix, $this->unicodeIDNAOption); $clone->labels = array_reverse(explode('.', $clone->publicSuffix)); return $clone; } + + /** + * @return array + */ + public function getIDNAOptions(): array + { + return [$this->asciiIDNAOption, $this->unicodeIDNAOption]; + } + + /** + * return true if domain contains deviation characters. + * @see http://unicode.org/reports/tr46/#Transition_Considerations + * @return bool + **/ + public function isTransitionalDifferent(): bool + { + if ($this->isTransitionalDifferent === null) { + try { + $this->idnToAscii($this->getContent()); + } catch (Throwable $e) { + $this->isTransitionalDifferent = false; + } + } + return $this->isTransitionalDifferent; + } } diff --git a/src/Rules.php b/src/Rules.php index 524ab272..36a95eb3 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -135,21 +135,27 @@ public function getPublicSuffix($domain, string $section = self::ALL_DOMAINS): P /** * Returns PSL info for a given domain. - * - * @param mixed $domain - * @param string $section - * + * @param mixed $domain + * @param string $section + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption * @return Domain */ - public function resolve($domain, string $section = self::ALL_DOMAINS): Domain - { + public function resolve( + $domain, + string $section = self::ALL_DOMAINS, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ): Domain { $section = $this->validateSection($section); try { - $domain = $domain instanceof Domain ? $domain : new Domain($domain); + $domain = $domain instanceof Domain + ? $domain + : new Domain($domain, null, $asciiIDNAOption, $unicodeIDNAOption); if (!$domain->isResolvable()) { return $domain; } - + return $domain->resolve($this->findPublicSuffix($domain, $section)); } catch (Exception $e) { return new Domain(); diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 19acabfa..1837f4c7 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -213,15 +213,17 @@ public function contains($tld): bool /** * Returns a domain where its public suffix is the found TLD. - * - * @param mixed $domain - * + * @param mixed $domain + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption * @return Domain */ - public function resolve($domain): Domain + public function resolve($domain, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): Domain { try { - $domain = $domain instanceof Domain ? $domain : new Domain($domain); + $domain = $domain instanceof Domain + ? $domain + : new Domain($domain, null, $asciiIDNAOption, $unicodeIDNAOption); } catch (Exception $e) { return new Domain(); } diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 26360f0d..ab602423 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -677,6 +677,14 @@ public function withPublicSuffixWorksProvider() 'isICANN' => false, 'isPrivate' => false, ], + 'with custom IDNA domain options' =>[ + 'domain' => new Domain('www.bébé.be', new PublicSuffix('be', Rules::ICANN_DOMAINS), 16, 32), + 'publicSuffix' => null, + 'expected' => null, + 'isKnown' => false, + 'isICANN' => false, + 'isPrivate' => false, + ], ]; } @@ -974,4 +982,150 @@ public function testwithoutLabelWorksWithMultipleKeys() { self::assertNull((new Domain('www.example.com'))->withoutLabel(0, 1, 2)->getContent()); } + + /** + * @covers ::__construct + * @covers ::setIDNAOptions + * @covers ::getIDNAOptions + */ + public function testConstructWithCustomIDNAOptions() + { + $domain = new Domain('example.com', null, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); + self::assertSame([16, 32], $domain->getIDNAOptions()); + } + + /** + * @dataProvider resolveCustomIDNAOptionsProvider + * @param string $domainName + * @param string $publicSuffix + * @param string $withLabel + * @param null|string $expectedContent + * @param null|string $expectedAscii + * @param null|string $expectedUnicode + * @param null|string $expectedRegistrable + * @param null|string $expectedSubDomain + * @param null|string $expectedWithLabel + */ + public function testResolveWorksWithCustomIDNAOptions( + string $domainName, + string $publicSuffix, + string $withLabel, + $expectedContent, + $expectedAscii, + $expectedUnicode, + $expectedRegistrable, + $expectedSubDomain, + $expectedWithLabel + ) { + $domain = new Domain( + $domainName, + new PublicSuffix($publicSuffix), + IDNA_NONTRANSITIONAL_TO_ASCII, + IDNA_NONTRANSITIONAL_TO_UNICODE + ); + self::assertSame($expectedContent, $domain->getContent()); + self::assertSame($expectedAscii, $domain->toAscii()->getContent()); + self::assertSame($expectedUnicode, $domain->toUnicode()->getContent()); + self::assertSame($expectedRegistrable, $domain->getRegistrableDomain()); + self::assertSame($expectedSubDomain, $domain->getSubDomain()); + self::assertSame($expectedWithLabel, $domain->withLabel(-1, $withLabel)->getContent()); + } + + public function resolveCustomIDNAOptionsProvider() + { + return [ + 'without deviation characters'=>[ + 'example.com', + 'com', + 'größe', + 'example.com', + 'example.com', + 'example.com', + 'example.com', + null, + 'xn--gre-6ka8i.com', + ], + 'without deviation characters with label'=>[ + 'www.example.com', + 'com', + 'größe', + 'www.example.com', + 'www.example.com', + 'www.example.com', + 'example.com', + 'www', + 'xn--gre-6ka8i.example.com', + ], + 'with deviation in domain'=>[ + 'www.faß.de', + 'de', + 'größe', + 'www.faß.de', + 'www.xn--fa-hia.de', + 'www.faß.de', + 'faß.de', + 'www', + 'größe.faß.de', + ], + 'with deviation in label'=>[ + 'faß.test.de', + 'de', + 'größe', + 'faß.test.de', + 'xn--fa-hia.test.de', + 'faß.test.de', + 'test.de', + 'faß', + 'größe.test.de', + ], + ]; + } + + + public function testInstanceCreationWithCustomIDNAOptions() + { + $domain = new Domain('example.com', new PublicSuffix('com'), 16, 32); + $instance = $domain->toAscii(); + self::assertSame($domain->getIDNAOptions(), $instance->getIDNAOptions()); + $instance = $domain->toUnicode(); + self::assertSame($domain->getIDNAOptions(), $instance->getIDNAOptions()); + $instance = $domain->withLabel(0, 'foo'); + self::assertSame($domain->getIDNAOptions(), $instance->getIDNAOptions()); + $instance = $domain->withoutLabel(0); + self::assertSame($domain->getIDNAOptions(), $instance->getIDNAOptions()); + $instance = $domain->withPublicSuffix(new PublicSuffix('us')); + self::assertSame($domain->getIDNAOptions(), $instance->getIDNAOptions()); + $instance = $domain->withSubDomain('foo'); + self::assertSame($domain->getIDNAOptions(), $instance->getIDNAOptions()); + $instance = $domain->append('bar'); + self::assertSame($domain->getIDNAOptions(), $instance->getIDNAOptions()); + $instance = $domain->prepend('bar'); + self::assertSame($domain->getIDNAOptions(), $instance->getIDNAOptions()); + $instance = $domain->resolve('com'); + self::assertSame($domain->getIDNAOptions(), $instance->getIDNAOptions()); + } + + /** + * @covers ::isTransitionalDifferent + * @dataProvider transitionalProvider + * @param \Pdp\Domain $domain + * @param bool $expected + */ + public function testIsTransitionalDifference(Domain $domain, bool $expected) + { + self::assertSame($expected, $domain->isTransitionalDifferent()); + } + + public function transitionalProvider() + { + return [ + 'simple' => [new Domain('example.com', new PublicSuffix('com')), false], + 'idna' => [new Domain('français.fr', new PublicSuffix('fr')), false], + 'in domain' => [new Domain('faß.de', new PublicSuffix('de')), true], + 'in domain 2' => [new Domain('βόλος.com', new PublicSuffix('com')), true], + 'in domain 3' => [new Domain('ශ්‍රී.com', new PublicSuffix('com')), true], + 'in domain 4' => [new Domain('نامه‌ای.com', new PublicSuffix('com')), true], + 'in label' => [new Domain('faß.test.de', new PublicSuffix('de')), true], + ]; + } } diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 6ddde314..c72416f7 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -241,6 +241,7 @@ public function testCreateFromDomainWorks(Domain $domain, $expected) self::assertSame($result->isKnown(), $domain->isKnown()); self::assertSame($result->isICANN(), $domain->isICANN()); self::assertSame($result->isPrivate(), $domain->isPrivate()); + self::assertSame($result->getIDNAOptions(), $domain->getIDNAOptions()); } public function createFromDomainProvider() @@ -258,6 +259,90 @@ public function createFromDomainProvider() 'domain' => new Domain('www.bébé.be'), 'expected' => null, ], + [ + 'domain' => new Domain('www.bébé.be', new PublicSuffix('be', Rules::ICANN_DOMAINS), 16, 32), + 'expected' => 'be', + ], + ]; + } + + /** + * @covers ::getIDNAOptions + * @covers ::isTransitionalDifferent + * + * @dataProvider customIDNAProvider + * + * @param string $name + * @param string $expectedContent + * @param string $expectedAscii + * @param string $expectedUnicode + */ + public function testResolveWithCustomIDNAOptions( + string $name, + string $expectedContent, + string $expectedAscii, + string $expectedUnicode + ) { + $publicSuffix = new PublicSuffix($name, '', 16, 32); + self::assertSame($expectedContent, $publicSuffix->getContent()); + self::assertSame($expectedAscii, $publicSuffix->toAscii()->getContent()); + self::assertSame($expectedUnicode, $publicSuffix->toUnicode()->getContent()); + self::assertSame($publicSuffix->getIDNAOptions(), $publicSuffix->toUnicode()->getIDNAOptions()); + self::assertSame($publicSuffix->isTransitionalDifferent(), $publicSuffix->toAscii()->isTransitionalDifferent()); + } + + public function customIDNAProvider() + { + return [ + 'without deviation characters'=>[ + 'example.com', + 'example.com', + 'example.com', + 'example.com', + ], + 'without deviation characters with label'=>[ + 'www.example.com', + 'www.example.com', + 'www.example.com', + 'www.example.com', + ], + 'with deviation in domain'=>[ + 'www.faß.de', + 'www.faß.de', + 'www.xn--fa-hia.de', + 'www.faß.de', + ], + 'with deviation in label'=>[ + 'faß.test.de', + 'faß.test.de', + 'xn--fa-hia.test.de', + 'faß.test.de', + ], + ]; + } + + /** + * @covers ::isTransitionalDifferent + * + * @dataProvider transitionalProvider + * @param \Pdp\PublicSuffix $publicSuffix + * @param bool $expected + */ + public function testIsTransitionalDifference(PublicSuffix $publicSuffix, bool $expected) + { + self::assertSame($expected, $publicSuffix->isTransitionalDifferent()); + } + + public function transitionalProvider() + { + return [ + 'simple' => [new PublicSuffix('example.com'), false], + 'idna' => [new PublicSuffix('français.fr'), false], + 'in domain' => [new PublicSuffix('faß.de'), true], + 'in domain 2' => [new PublicSuffix('βόλος.com'), true], + 'in domain 3' => [new PublicSuffix('ශ්‍රී.com'), true], + 'in domain 4' => [new PublicSuffix('نامه‌ای.com'), true], + 'in label' => [new PublicSuffix('faß.test.de'), true], ]; } } diff --git a/tests/RulesTest.php b/tests/RulesTest.php index d1637d84..4688e684 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -621,6 +621,7 @@ public function testPublicSuffixSpec() $this->checkPublicSuffix('www.食狮.中国', '食狮.中国'); $this->checkPublicSuffix('shishi.中国', 'shishi.中国'); $this->checkPublicSuffix('中国', null); + $this->checkPublicSuffix('www.faß.de', 'fass.de'); // Same as above, but punycoded. $this->checkPublicSuffix('xn--85x722f.com.cn', 'xn--85x722f.com.cn'); $this->checkPublicSuffix('xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn'); @@ -632,4 +633,12 @@ public function testPublicSuffixSpec() $this->checkPublicSuffix('shishi.xn--fiqs8s', 'shishi.xn--fiqs8s'); $this->checkPublicSuffix('xn--fiqs8s', null); } + + public function testResolveWithIDNAOptions() + { + self::assertSame( + [16, 32], + $this->rules->resolve('foo.de', Rules::ICANN_DOMAINS, 16, 32)->getIDNAOptions() + ); + } } diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index 9455cd5c..c4413189 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -149,6 +149,10 @@ public function testResolveWithUnregisteredTLD() self::assertNull($collection->resolve('localhost.locale')->getPublicSuffix()); } + public function testResolveWithIDNAOptions() + { + self::assertSame([16, 32], $this->collection->resolve('foo.de', 16, 32)->getIDNAOptions()); + } /** * @dataProvider validTldProvider * @param mixed $tld From d13344ccb6b9d83398b29ba1627ea552a6b33afb Mon Sep 17 00:00:00 2001 From: insolita Date: Wed, 10 Apr 2019 04:37:52 +0800 Subject: [PATCH 139/461] fix #234 remove getter for both options at once --- src/Domain.php | 63 +++++++++++++++++++++++------------ src/PublicSuffix.php | 18 ++++++---- tests/DomainTest.php | 47 ++++++++++++++++++++------ tests/PublicSuffixTest.php | 11 ++++-- tests/RulesTest.php | 3 +- tests/TopLevelDomainsTest.php | 3 +- 6 files changed, 104 insertions(+), 41 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 1d0c95bb..8c5f5e11 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -421,7 +421,7 @@ public function toAscii() return $this; } - return new self($domain, $this->publicSuffix, ...$this->getIDNAOptions()); + return new self($domain, $this->publicSuffix, $this->getAsciiIDNAOption(), $this->getUnicodeIDNAOption()); } /** @@ -436,7 +436,8 @@ public function toUnicode() return new self( $this->idnToUnicode($this->domain, $this->unicodeIDNAOption), $this->publicSuffix, - ...$this->getIDNAOptions() + $this->getAsciiIDNAOption(), + $this->getUnicodeIDNAOption() ); } @@ -458,7 +459,12 @@ public function toUnicode() public function resolve($publicSuffix): self { if (!$publicSuffix instanceof PublicSuffix) { - $publicSuffix = new PublicSuffix($publicSuffix, '', ...$this->getIDNAOptions()); + $publicSuffix = new PublicSuffix( + $publicSuffix, + '', + $this->getAsciiIDNAOption(), + $this->getUnicodeIDNAOption() + ); } $publicSuffix = $this->normalize($publicSuffix); @@ -466,7 +472,7 @@ public function resolve($publicSuffix): self return $this; } - return new self($this->domain, $publicSuffix, ...$this->getIDNAOptions()); + return new self($this->domain, $publicSuffix, $this->getAsciiIDNAOption(), $this->getUnicodeIDNAOption()); } /** @@ -485,7 +491,12 @@ public function resolve($publicSuffix): self public function withPublicSuffix($publicSuffix): self { if (!$publicSuffix instanceof PublicSuffix) { - $publicSuffix = new PublicSuffix($publicSuffix, '', ...$this->getIDNAOptions()); + $publicSuffix = new PublicSuffix( + $publicSuffix, + '', + $this->getAsciiIDNAOption(), + $this->getUnicodeIDNAOption() + ); } $publicSuffix = $this->normalize($publicSuffix); @@ -495,10 +506,15 @@ public function withPublicSuffix($publicSuffix): self $domain = implode('.', array_reverse(array_slice($this->labels, count($this->publicSuffix)))); if (null === $publicSuffix->getContent()) { - return new self($domain, null, ...$this->getIDNAOptions()); + return new self($domain, null, $this->getAsciiIDNAOption(), $this->getUnicodeIDNAOption()); } - return new self($domain.'.'.$publicSuffix->getContent(), $publicSuffix, ...$this->getIDNAOptions()); + return new self( + $domain.'.'.$publicSuffix->getContent(), + $publicSuffix, + $this->getAsciiIDNAOption(), + $this->getUnicodeIDNAOption() + ); } @@ -526,13 +542,19 @@ public function withSubDomain($subDomain): self } if (null === $subDomain) { - return new self($this->registrableDomain, $this->publicSuffix, ...$this->getIDNAOptions()); + return new self( + $this->registrableDomain, + $this->publicSuffix, + $this->getAsciiIDNAOption(), + $this->getUnicodeIDNAOption() + ); } return new self( $subDomain.'.'.$this->registrableDomain, $this->publicSuffix, - ...$this->getIDNAOptions() + $this->getAsciiIDNAOption(), + $this->getUnicodeIDNAOption() ); } @@ -641,13 +663,19 @@ public function withLabel(int $key, $label): self ksort($labels); if (null !== $this->publicSuffix->getLabel($key)) { - return new self(implode('.', array_reverse($labels)), null, ...$this->getIDNAOptions()); + return new self( + implode('.', array_reverse($labels)), + null, + $this->getAsciiIDNAOption(), + $this->getUnicodeIDNAOption() + ); } return new self( implode('.', array_reverse($labels)), $this->publicSuffix, - ...$this->getIDNAOptions() + $this->getAsciiIDNAOption(), + $this->getUnicodeIDNAOption() ); } @@ -691,25 +719,18 @@ public function withoutLabel(int $key, int ...$keys): self } if ([] === $labels) { - return new self(null, null, ...$this->getIDNAOptions()); + return new self(null, null, $this->getAsciiIDNAOption(), $this->getUnicodeIDNAOption()); } $domain = implode('.', array_reverse($labels)); $psContent = $this->publicSuffix->getContent(); if (null === $psContent || '.'.$psContent !== substr($domain, - strlen($psContent) - 1)) { - return new self($domain, null, ...$this->getIDNAOptions()); + return new self($domain, null, $this->getAsciiIDNAOption(), $this->getUnicodeIDNAOption()); } - return new self($domain, $this->publicSuffix, ...$this->getIDNAOptions()); + return new self($domain, $this->publicSuffix, $this->getAsciiIDNAOption(), $this->getUnicodeIDNAOption()); } - /** - * @return array - */ - public function getIDNAOptions(): array - { - return [$this->asciiIDNAOption, $this->unicodeIDNAOption]; - } public function getAsciiIDNAOption(): int { diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 75ca860d..7b36de3b 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -108,7 +108,12 @@ public static function createFromDomain(Domain $domain): self $section = self::PRIVATE_DOMAINS; } - return new self($domain->getPublicSuffix(), $section, ...$domain->getIDNAOptions()); + return new self( + $domain->getPublicSuffix(), + $section, + $domain->getAsciiIDNAOption(), + $domain->getUnicodeIDNAOption() + ); } /** @@ -316,14 +321,15 @@ public function toUnicode() return $clone; } - /** - * @return array - */ - public function getIDNAOptions(): array + public function getAsciiIDNAOption(): int { - return [$this->asciiIDNAOption, $this->unicodeIDNAOption]; + return $this->asciiIDNAOption; } + public function getUnicodeIDNAOption(): int + { + return $this->unicodeIDNAOption; + } /** * return true if domain contains deviation characters. * @see http://unicode.org/reports/tr46/#Transition_Considerations diff --git a/tests/DomainTest.php b/tests/DomainTest.php index ab602423..cf76d8eb 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -991,7 +991,7 @@ public function testwithoutLabelWorksWithMultipleKeys() public function testConstructWithCustomIDNAOptions() { $domain = new Domain('example.com', null, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); - self::assertSame([16, 32], $domain->getIDNAOptions()); + self::assertSame([16, 32], [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()]); } /** @@ -1086,23 +1086,50 @@ public function testInstanceCreationWithCustomIDNAOptions() { $domain = new Domain('example.com', new PublicSuffix('com'), 16, 32); $instance = $domain->toAscii(); - self::assertSame($domain->getIDNAOptions(), $instance->getIDNAOptions()); + self::assertSame( + [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], + [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] + ); $instance = $domain->toUnicode(); - self::assertSame($domain->getIDNAOptions(), $instance->getIDNAOptions()); + self::assertSame( + [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], + [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] + ); $instance = $domain->withLabel(0, 'foo'); - self::assertSame($domain->getIDNAOptions(), $instance->getIDNAOptions()); + self::assertSame( + [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], + [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] + ); $instance = $domain->withoutLabel(0); - self::assertSame($domain->getIDNAOptions(), $instance->getIDNAOptions()); + self::assertSame( + [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], + [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] + ); $instance = $domain->withPublicSuffix(new PublicSuffix('us')); - self::assertSame($domain->getIDNAOptions(), $instance->getIDNAOptions()); + self::assertSame( + [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], + [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] + ); $instance = $domain->withSubDomain('foo'); - self::assertSame($domain->getIDNAOptions(), $instance->getIDNAOptions()); + self::assertSame( + [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], + [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] + ); $instance = $domain->append('bar'); - self::assertSame($domain->getIDNAOptions(), $instance->getIDNAOptions()); + self::assertSame( + [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], + [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] + ); $instance = $domain->prepend('bar'); - self::assertSame($domain->getIDNAOptions(), $instance->getIDNAOptions()); + self::assertSame( + [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], + [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] + ); $instance = $domain->resolve('com'); - self::assertSame($domain->getIDNAOptions(), $instance->getIDNAOptions()); + self::assertSame( + [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], + [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] + ); } /** diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index c72416f7..616dc5ca 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -241,7 +241,10 @@ public function testCreateFromDomainWorks(Domain $domain, $expected) self::assertSame($result->isKnown(), $domain->isKnown()); self::assertSame($result->isICANN(), $domain->isICANN()); self::assertSame($result->isPrivate(), $domain->isPrivate()); - self::assertSame($result->getIDNAOptions(), $domain->getIDNAOptions()); + self::assertSame( + [$result->getAsciiIDNAOption(), $result->getUnicodeIDNAOption()], + [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()] + ); } public function createFromDomainProvider() @@ -287,7 +290,11 @@ public function testResolveWithCustomIDNAOptions( self::assertSame($expectedContent, $publicSuffix->getContent()); self::assertSame($expectedAscii, $publicSuffix->toAscii()->getContent()); self::assertSame($expectedUnicode, $publicSuffix->toUnicode()->getContent()); - self::assertSame($publicSuffix->getIDNAOptions(), $publicSuffix->toUnicode()->getIDNAOptions()); + $instance = $publicSuffix->toUnicode(); + self::assertSame( + [$publicSuffix->getAsciiIDNAOption(), $publicSuffix->getUnicodeIDNAOption()], + [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] + ); self::assertSame($publicSuffix->isTransitionalDifferent(), $publicSuffix->toAscii()->isTransitionalDifferent()); } diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 4688e684..f8d9d007 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -636,9 +636,10 @@ public function testPublicSuffixSpec() public function testResolveWithIDNAOptions() { + $resolved = $this->rules->resolve('foo.de', Rules::ICANN_DOMAINS, 16, 32); self::assertSame( [16, 32], - $this->rules->resolve('foo.de', Rules::ICANN_DOMAINS, 16, 32)->getIDNAOptions() + [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption()] ); } } diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index c4413189..b6737e25 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -151,7 +151,8 @@ public function testResolveWithUnregisteredTLD() public function testResolveWithIDNAOptions() { - self::assertSame([16, 32], $this->collection->resolve('foo.de', 16, 32)->getIDNAOptions()); + $resolved = $this->collection->resolve('foo.de', 16, 32); + self::assertSame([16, 32], [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption()]); } /** * @dataProvider validTldProvider From f0f9be92c622ca5e4e55b3dfcf367c7dc1f2a673 Mon Sep 17 00:00:00 2001 From: insolita Date: Wed, 10 Apr 2019 04:44:12 +0800 Subject: [PATCH 140/461] fix #234 add default values, avoid BC --- src/Domain.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 8c5f5e11..3274bddf 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -106,8 +106,8 @@ public static function __set_state(array $properties): self return new self( $properties['domain'], $properties['publicSuffix'], - $properties['asciiIDNAOption'], - $properties['unicodeIDNAOption'] + $properties['asciiIDNAOption'] ?? IDNA_DEFAULT, + $properties['unicodeIDNAOption'] ?? IDNA_DEFAULT ); } From 17cc8b1ecc43ca5c917942809c906ba05db6621a Mon Sep 17 00:00:00 2001 From: insolita Date: Wed, 10 Apr 2019 04:47:54 +0800 Subject: [PATCH 141/461] fix #234 replace mutable setter with method that return new instance --- src/Domain.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 3274bddf..43a6130f 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -124,7 +124,8 @@ public function __construct( int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT ) { - $this->setIDNAOptions($asciiIDNAOption, $unicodeIDNAOption); + $this->asciiIDNAOption = $asciiIDNAOption; + $this->unicodeIDNAOption = $unicodeIDNAOption; $this->labels = $this->setLabels($domain, $asciiIDNAOption, $unicodeIDNAOption); if ([] !== $this->labels) { $this->domain = implode('.', array_reverse($this->labels)); @@ -748,11 +749,9 @@ public function getUnicodeIDNAOption(): int * @param int $forUnicode * @return $this */ - public function setIDNAOptions(int $forAscii, int $forUnicode) + public function withIDNAOptions(int $forAscii, int $forUnicode) { - $this->asciiIDNAOption = $forAscii; - $this->unicodeIDNAOption = $forUnicode; - return $this; + return new self($this->domain, $this->publicSuffix, $forAscii, $forUnicode); } /** From 374390e7efa4c977585db41cfc75ea3318392a2b Mon Sep 17 00:00:00 2001 From: insolita Date: Wed, 10 Apr 2019 05:10:25 +0800 Subject: [PATCH 142/461] fix #234 fix test comments --- tests/DomainTest.php | 2 -- tests/PublicSuffixTest.php | 1 - 2 files changed, 3 deletions(-) diff --git a/tests/DomainTest.php b/tests/DomainTest.php index cf76d8eb..7532c816 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -985,8 +985,6 @@ public function testwithoutLabelWorksWithMultipleKeys() /** * @covers ::__construct - * @covers ::setIDNAOptions - * @covers ::getIDNAOptions */ public function testConstructWithCustomIDNAOptions() { diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 616dc5ca..99c8c6a7 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -270,7 +270,6 @@ public function createFromDomainProvider() } /** - * @covers ::getIDNAOptions * @covers ::isTransitionalDifferent * * @dataProvider customIDNAProvider From 5dd957f934e8108134e7f223344894a4e8d3a78d Mon Sep 17 00:00:00 2001 From: insolita Date: Wed, 10 Apr 2019 06:55:57 +0800 Subject: [PATCH 143/461] fix #234 resolve isTransitionalDifferent method --- src/Domain.php | 11 +++-------- src/IDNAConverterTrait.php | 18 ++++++++++++------ src/PublicSuffix.php | 9 ++------- tests/DomainTest.php | 5 +++++ 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 43a6130f..92720c9a 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -98,6 +98,7 @@ final class Domain implements DomainInterface, JsonSerializable * @var bool */ private $isTransitionalDifferent; + /** * {@inheritdoc} */ @@ -127,6 +128,7 @@ public function __construct( $this->asciiIDNAOption = $asciiIDNAOption; $this->unicodeIDNAOption = $unicodeIDNAOption; $this->labels = $this->setLabels($domain, $asciiIDNAOption, $unicodeIDNAOption); + $this->isTransitionalDifferent = $this->hasTransitionalDifference($domain); if ([] !== $this->labels) { $this->domain = implode('.', array_reverse($this->labels)); } @@ -375,7 +377,7 @@ public function getPublicSuffix() */ public function isResolvable(): bool { - return 1 < count($this->labels ?? []) && '.' !== substr($this->domain, -1, 1); + return 1 < count($this->labels) && '.' !== substr($this->domain, -1, 1); } /** @@ -761,13 +763,6 @@ public function withIDNAOptions(int $forAscii, int $forUnicode) **/ public function isTransitionalDifferent(): bool { - if ($this->isTransitionalDifferent === null) { - try { - $this->idnToAscii($this->getContent(), $this->asciiIDNAOption); - } catch (Throwable $e) { - $this->isTransitionalDifferent = false; - } - } return $this->isTransitionalDifferent; } } diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index c30c2385..7b522df9 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -15,6 +15,7 @@ namespace Pdp; +use function is_string; use Pdp\Exception\InvalidDomain; use TypeError; use UnexpectedValueException; @@ -115,7 +116,6 @@ private function idnToAscii(string $domain, int $IDNAOption = IDNA_DEFAULT): str $domain = rawurldecode($domain); static $pattern = '/[^\x20-\x7f]/'; if (!preg_match($pattern, $domain)) { - $this->isTransitionalDifferent = false; return strtolower($domain); } @@ -129,11 +129,7 @@ private function idnToAscii(string $domain, int $IDNAOption = IDNA_DEFAULT): str throw new UnexpectedValueException(sprintf('The Intl extension is misconfigured for %s, please correct this issue before proceeding.', PHP_OS)); } // @codeCoverageIgnoreEnd - - if (property_exists($this, 'isTransitionalDifferent')) { - $this->isTransitionalDifferent = isset($arr['isTransitionalDifferent']) - && (bool)$arr['isTransitionalDifferent'] === true; - } + if (false === strpos($output, '%')) { return $output; } @@ -234,4 +230,14 @@ private function setLabels($domain = null, int $asciiOption = 0, int $unicodeOpt return array_reverse(explode('.', $this->idnToUnicode($ascii_domain, $unicodeOption))); } + + private function hasTransitionalDifference($domain):bool + { + if(!is_string($domain) || empty($domain)){ + return false; + } + $info = []; + idn_to_ascii($domain, IDNA_NONTRANSITIONAL_TO_ASCII, INTL_IDNA_VARIANT_UTS46, $info); + return (bool)$info['isTransitionalDifferent'] === true; + } } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 7b36de3b..d3a0633c 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -130,6 +130,7 @@ public function __construct( int $unicodeIDNAOption = IDNA_DEFAULT ) { $this->labels = $this->setLabels($publicSuffix, $asciiIDNAOption, $unicodeIDNAOption); + $this->isTransitionalDifferent = $this->hasTransitionalDifference($publicSuffix); $this->publicSuffix = $this->setPublicSuffix(); $this->section = $this->setSection($section); $this->asciiIDNAOption = $asciiIDNAOption; @@ -330,6 +331,7 @@ public function getUnicodeIDNAOption(): int { return $this->unicodeIDNAOption; } + /** * return true if domain contains deviation characters. * @see http://unicode.org/reports/tr46/#Transition_Considerations @@ -337,13 +339,6 @@ public function getUnicodeIDNAOption(): int **/ public function isTransitionalDifferent(): bool { - if ($this->isTransitionalDifferent === null) { - try { - $this->idnToAscii($this->getContent()); - } catch (Throwable $e) { - $this->isTransitionalDifferent = false; - } - } return $this->isTransitionalDifferent; } } diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 7532c816..3ef00610 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -15,6 +15,9 @@ namespace Pdp\Tests; +use function array_map; +use function array_reduce; +use function ord; use Pdp\Domain; use Pdp\Exception\CouldNotResolvePublicSuffix; use Pdp\Exception\CouldNotResolveSubDomain; @@ -24,6 +27,8 @@ use Pdp\PublicSuffix; use Pdp\Rules; use PHPUnit\Framework\TestCase; +use function print_r; +use function str_split; use TypeError; /** From bab1a995d74c9ecd6363cf4c5d3c1222af913100 Mon Sep 17 00:00:00 2001 From: insolita Date: Wed, 10 Apr 2019 13:24:58 +0800 Subject: [PATCH 144/461] cs-fix --- src/Domain.php | 1 - src/DomainInterface.php | 7 ------- src/IDNAConverterTrait.php | 1 - 3 files changed, 9 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 92720c9a..5a6b7c32 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -20,7 +20,6 @@ use Pdp\Exception\CouldNotResolveSubDomain; use Pdp\Exception\InvalidLabel; use Pdp\Exception\InvalidLabelKey; -use Throwable; use TypeError; use function array_count_values; use function array_keys; diff --git a/src/DomainInterface.php b/src/DomainInterface.php index a53f0453..0954d2d1 100644 --- a/src/DomainInterface.php +++ b/src/DomainInterface.php @@ -99,11 +99,4 @@ public function toUnicode(); * from the right-most label to the left-most label. */ public function getIterator(); - - /** - * return true if domain contains deviation characters. - * @see http://unicode.org/reports/tr46/#Transition_Considerations - * @return bool - **/ - public function isTransitionalDifferent(): bool; } diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index 7b522df9..2ce9c260 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -29,7 +29,6 @@ use function iterator_to_array; use function method_exists; use function preg_match; -use function property_exists; use function rawurldecode; use function sprintf; use function strpos; From 5fd22b2465f231030fa5ef6ccd8b3dd8eac7b677 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 10 Apr 2019 08:39:42 +0200 Subject: [PATCH 145/461] Update CONTRIBUTING.md Clarify and improve how and where to submit Pull Requests --- .github/CONTRIBUTING.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index fb6de647..30f3572d 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -10,7 +10,7 @@ We accept bug reports via issues created on [Github](https://github.com/jeremyke - **Always search the issue or pull request list first** - The odds are good that if you've found a problem, someone else has found it, too. -- **Always try the [master branch](https://github.com/jeremykendall/php-domain-parser)** - to see if the reported bug has not already been fixed. +- **Always try the [developer branch](https://github.com/jeremykendall/php-domain-parser/tree/develop)** - to see if the reported bug has not already been fixed. ### When submitting your report @@ -24,8 +24,18 @@ We accept bug reports via issues created on [Github](https://github.com/jeremyke We accept contributions via Pull Requests on [Github](https://github.com/jeremykendall/php-domain-parser/pull). +- **Always make your Pull Request against the [developer branch](https://github.com/jeremykendall/php-domain-parser/tree/develop)** + - **[PSR-2 Coding Standard](http://www.php-fig.org/psr/psr-2/)** - Your patch won't be accepted if it doesn't pass the package coding style test suite. +You can resolve most of the styling code issues using the following command line: + +```bash +$ ./vendor/bin/php-cs-fixer fix -vvv --allow-risky=yes +``` + +You should run this command **prior** to committing your code. + - **Add tests!** - Your patch won't be accepted if it doesn't have tests. - **Document any change in behaviour** - Make sure the README and any other relevant documentation are kept up-to-date. From 1fa861e39db5bdfd3ccb069331a886dbb1f1b371 Mon Sep 17 00:00:00 2001 From: insolita Date: Wed, 10 Apr 2019 15:37:53 +0800 Subject: [PATCH 146/461] add idna-options --- src/Manager.php | 60 +++++++++++++--------- src/PublicSuffix.php | 5 +- src/Rules.php | 87 ++++++++++++++++++++------------ src/TLDConverter.php | 20 ++++---- src/TopLevelDomains.php | 93 ++++++++++++++++++++++++----------- tests/DomainTest.php | 19 ++++--- tests/RulesTest.php | 9 +++- tests/TopLevelDomainsTest.php | 5 +- 8 files changed, 194 insertions(+), 104 deletions(-) diff --git a/src/Manager.php b/src/Manager.php index a560c97b..84958f63 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -82,16 +82,19 @@ public function __construct(CacheInterface $cache, HttpClient $http, $ttl = null /** * Gets the Public Suffix List Rules. - * * @param string $url the Public Suffix List URL * @param null|mixed $ttl the cache TTL - * - * @throws CouldNotLoadRules If the PSL rules can not be loaded - * + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption * @return Rules + * @throws \Psr\SimpleCache\InvalidArgumentException */ - public function getRules(string $url = self::PSL_URL, $ttl = null): Rules - { + public function getRules( + string $url = self::PSL_URL, + $ttl = null, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ):Rules { $key = $this->getCacheKey('PSL', $url); $data = $this->cache->get($key); @@ -101,7 +104,7 @@ public function getRules(string $url = self::PSL_URL, $ttl = null): Rules $data = json_decode($data ?? $this->cache->get($key), true); if (JSON_ERROR_NONE === json_last_error()) { - return new Rules($data); + return new Rules($data, $asciiIDNAOption, $unicodeIDNAOption); } throw new CouldNotLoadRules(sprintf('The public suffix list cache is corrupted: %s', json_last_error_msg()), json_last_error()); @@ -131,28 +134,32 @@ public function refreshRules(string $url = self::PSL_URL, $ttl = null): bool /** * Gets the Public Suffix List Rules. - * * @param string $url the IANA Root Zone Database URL * @param null|mixed $ttl the cache TTL - * - * @throws Exception If the Top Level Domains can not be returned - * + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption * @return TopLevelDomains + * @throws \Psr\SimpleCache\InvalidArgumentException */ - public function getTLDs(string $url = self::RZD_URL, $ttl = null): TopLevelDomains - { + public function getTLDs( + string $url = self::RZD_URL, + $ttl = null, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ):TopLevelDomains { $key = $this->getCacheKey('RZD', $url); $data = $this->cache->get($key); if (null === $data && !$this->refreshTLDs($url, $ttl)) { throw new CouldNotLoadTLDs(sprintf('Unable to load the root zone database from %s', $url)); } - + $data = json_decode($data ?? $this->cache->get($key), true); if (JSON_ERROR_NONE !== json_last_error()) { - throw new CouldNotLoadTLDs(sprintf('The root zone database cache is corrupted: %s', json_last_error_msg()), json_last_error()); + throw new CouldNotLoadTLDs(sprintf('The root zone database cache is corrupted: %s', json_last_error_msg()), + json_last_error()); } - + if (!isset($data['records'], $data['version'], $data['modifiedDate'])) { throw new CouldNotLoadTLDs('The root zone database cache content is corrupted'); } @@ -160,28 +167,33 @@ public function getTLDs(string $url = self::RZD_URL, $ttl = null): TopLevelDomai return new TopLevelDomains( $data['records'], $data['version'], - DateTimeImmutable::createFromFormat(DATE_ATOM, $data['modifiedDate']) + DateTimeImmutable::createFromFormat(DATE_ATOM, $data['modifiedDate']), + $asciiIDNAOption, + $unicodeIDNAOption ); } /** * Downloads, converts and cache the IANA Root Zone TLD. - * * If a local cache already exists, it will be overwritten. - * * Returns true if the refresh was successful - * * @param string $url the IANA Root Zone Database URL * @param null|mixed $ttl the cache TTL - * + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption * @return bool + * @throws \Psr\SimpleCache\InvalidArgumentException */ - public function refreshTLDs(string $url = self::RZD_URL, $ttl = null): bool - { + public function refreshTLDs( + string $url = self::RZD_URL, + $ttl = null, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ): bool { static $converter; $converter = $converter ?? new TLDConverter(); - $data = json_encode($converter->convert($this->http->getContent($url))); + $data = json_encode($converter->convert($this->http->getContent($url), $asciiIDNAOption, $unicodeIDNAOption)); return $this->cache->set($this->getCacheKey('RZD', $url), $data, $this->filterTtl($ttl) ?? $this->ttl); } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index d3a0633c..7d38b4c1 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -18,7 +18,6 @@ use JsonSerializable; use Pdp\Exception\CouldNotResolvePublicSuffix; use Pdp\Exception\InvalidDomain; -use Throwable; use function array_keys; use function array_reverse; use function count; @@ -87,8 +86,8 @@ public static function __set_state(array $properties): self return new self( $properties['publicSuffix'], $properties['section'], - $properties['asciiIDNAOption'], - $properties['unicodeIDNAOption'] + $properties['asciiIDNAOption'] ?? IDNA_DEFAULT, + $properties['unicodeIDNAOption'] ?? IDNA_DEFAULT ); } diff --git a/src/Rules.php b/src/Rules.php index 36a95eb3..4e297085 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -50,19 +50,31 @@ final class Rules implements PublicSuffixListSection * @var array */ private $rules; - + + /** + * @var int + */ + private $asciiIDNAOption; + + /** + * @var int + */ + private $unicodeIDNAOption; + /** * Returns a new instance from a file path. - * * @param string $path * @param null|resource $context - * - * @throws CouldNotLoadRules If the rules can not be loaded from the path - * + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption * @return self */ - public static function createFromPath(string $path, $context = null): self - { + public static function createFromPath( + string $path, + $context = null, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ): self { $args = [$path, 'r', false]; if (null !== $context) { $args[] = $context; @@ -75,23 +87,26 @@ public static function createFromPath(string $path, $context = null): self $content = stream_get_contents($resource); fclose($resource); - return self::createFromString($content); + return self::createFromString($content, $asciiIDNAOption, $unicodeIDNAOption); } /** * Returns a new instance from a string. - * * @param string $content - * + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption * @return self */ - public static function createFromString(string $content): self - { + public static function createFromString( + string $content, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ): self { static $converter; $converter = $converter ?? new Converter(); - return new self($converter->convert($content)); + return new self($converter->convert($content), $asciiIDNAOption, $unicodeIDNAOption); } /** @@ -99,17 +114,27 @@ public static function createFromString(string $content): self */ public static function __set_state(array $properties): self { - return new self($properties['rules']); + return new self( + $properties['rules'], + $properties['asciiIDNAOption'] ?? IDNA_DEFAULT, + $properties['unicodeIDNAOption'] ?? IDNA_DEFAULT + ); } /** * New instance. - * * @param array $rules + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption */ - public function __construct(array $rules) - { + public function __construct( + array $rules, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ){ $this->rules = $rules; + $this->asciiIDNAOption = $asciiIDNAOption; + $this->unicodeIDNAOption = $unicodeIDNAOption; } /** @@ -125,7 +150,9 @@ public function __construct(array $rules) public function getPublicSuffix($domain, string $section = self::ALL_DOMAINS): PublicSuffix { $section = $this->validateSection($section); - $domain = $domain instanceof Domain ? $domain : new Domain($domain); + $domain = $domain instanceof Domain + ? $domain + : new Domain($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); if (!$domain->isResolvable()) { throw new CouldNotResolvePublicSuffix(sprintf('The domain `%s` can not contain a public suffix', $domain->getContent())); } @@ -137,28 +164,21 @@ public function getPublicSuffix($domain, string $section = self::ALL_DOMAINS): P * Returns PSL info for a given domain. * @param mixed $domain * @param string $section - * @param int $asciiIDNAOption - * @param int $unicodeIDNAOption * @return Domain */ - public function resolve( - $domain, - string $section = self::ALL_DOMAINS, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT - ): Domain { + public function resolve($domain, string $section = self::ALL_DOMAINS): Domain { $section = $this->validateSection($section); try { $domain = $domain instanceof Domain ? $domain - : new Domain($domain, null, $asciiIDNAOption, $unicodeIDNAOption); + : new Domain($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); if (!$domain->isResolvable()) { return $domain; } return $domain->resolve($this->findPublicSuffix($domain, $section)); } catch (Exception $e) { - return new Domain(); + return new Domain(null, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); } } @@ -206,7 +226,7 @@ private function findPublicSuffix(DomainInterface $domain, string $section): Pub } if (self::PRIVATE_DOMAINS === $section) { - return new PublicSuffix($domain->getLabel(0)); + return new PublicSuffix($domain->getLabel(0), '', $this->asciiIDNAOption, $this->unicodeIDNAOption); } return $icann; @@ -246,9 +266,14 @@ private function findPublicSuffixFromSection(DomainInterface $domain, string $se } if ([] === $matches) { - return new PublicSuffix($domain->getLabel(0)); + return new PublicSuffix($domain->getLabel(0), '', $this->asciiIDNAOption, $this->unicodeIDNAOption); } - return new PublicSuffix(implode('.', array_reverse($matches)), $section); + return new PublicSuffix( + implode('.', array_reverse($matches)), + $section, + $this->asciiIDNAOption, + $this->unicodeIDNAOption + ); } } diff --git a/src/TLDConverter.php b/src/TLDConverter.php index d8e57219..c06b08fc 100644 --- a/src/TLDConverter.php +++ b/src/TLDConverter.php @@ -18,6 +18,7 @@ use DateTimeImmutable; use Pdp\Exception\CouldNotLoadTLDs; use SplTempFileObject; +use function compact; use function preg_match; use function sprintf; use function strpos; @@ -37,18 +38,19 @@ final class TLDConverter * @internal */ const IANA_DATE_FORMAT = 'D M d H:i:s Y e'; - + /** * Converts the IANA Root Zone Database into a TopLevelDomains associative array. - * * @param string $content - * - * @throws CouldNotLoadTLDs if the content is invalid or can not be correctly parsed and converted - * + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption * @return array */ - public function convert(string $content): array - { + public function convert( + string $content, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ): array { $data = []; $file = new SplTempFileObject(); $file->fwrite($content); @@ -56,7 +58,7 @@ public function convert(string $content): array foreach ($file as $line) { $line = trim($line); if ([] === $data) { - $data = $this->extractHeader($line); + $data = array_merge($this->extractHeader($line), compact('asciiIDNAOption', 'unicodeIDNAOption')); continue; } @@ -70,7 +72,7 @@ public function convert(string $content): array } if (isset($data['version'], $data['modifiedDate'], $data['records'])) { - return $data; + return array_merge($data, compact('asciiIDNAOption', 'unicodeIDNAOption')); } throw new CouldNotLoadTLDs(sprintf('Invalid content: TLD conversion failed')); diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 1837f4c7..96ff849a 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -48,53 +48,70 @@ final class TopLevelDomains implements Countable, IteratorAggregate * @var array */ private $records; - + + /** + * @var int + */ + private $asciiIDNAOption; + + /** + * @var int + */ + private $unicodeIDNAOption; + /** * Returns a new instance from a file path. - * * @param string $path * @param null|resource $context - * - * @throws Exception If the list can not be loaded from the path - * + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption * @return self */ - public static function createFromPath(string $path, $context = null): self - { + public static function createFromPath( + string $path, + $context = null, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ):self { $args = [$path, 'r', false]; if (null !== $context) { $args[] = $context; } - + if (!($resource = @fopen(...$args))) { throw new CouldNotLoadTLDs(sprintf('`%s`: failed to open stream: No such file or directory', $path)); } - + $content = stream_get_contents($resource); fclose($resource); - - return self::createFromString($content); + + return self::createFromString($content, $asciiIDNAOption, $unicodeIDNAOption); } - + /** * Returns a new instance from a string. - * * @param string $content - * + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption * @return self */ - public static function createFromString(string $content): self - { + public static function createFromString( + string $content, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ): self { static $converter; $converter = $converter ?? new TLDConverter(); - $data = $converter->convert($content); + $data = $converter->convert($content, $asciiIDNAOption, $unicodeIDNAOption); return new self( $data['records'], $data['version'], - DateTimeImmutable::createFromFormat(DATE_ATOM, $data['modifiedDate']) + DateTimeImmutable::createFromFormat(DATE_ATOM, $data['modifiedDate']), + $data['asciiIDNAOption'], + $data['unicodeIDNAOption'] ); } @@ -103,21 +120,35 @@ public static function createFromString(string $content): self */ public static function __set_state(array $properties): self { - return new self($properties['records'], $properties['version'], $properties['modifiedDate']); + return new self( + $properties['records'], + $properties['version'], + $properties['modifiedDate'], + $properties['asciiIDNAOption'] ?? IDNA_DEFAULT, + $properties['unicodeIDNAOption'] ?? IDNA_DEFAULT + ); } /** * New instance. - * * @param array $records * @param string $version * @param DateTimeInterface $modifiedDate + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption */ - public function __construct(array $records, string $version, DateTimeInterface $modifiedDate) - { + public function __construct( + array $records, + string $version, + DateTimeInterface $modifiedDate, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ){ $this->records = $records; $this->version = $version; $this->modifiedDate = $modifiedDate instanceof DateTime ? DateTimeImmutable::createFromMutable($modifiedDate) : $modifiedDate; + $this->asciiIDNAOption = $asciiIDNAOption; + $this->unicodeIDNAOption = $unicodeIDNAOption; } /** @@ -164,7 +195,9 @@ public function isEmpty(): bool public function getIterator() { foreach ($this->records as $tld) { - yield (new PublicSuffix($tld, PublicSuffix::ICANN_DOMAINS))->toAscii(); + yield ( + new PublicSuffix($tld, PublicSuffix::ICANN_DOMAINS, $this->asciiIDNAOption, $this->unicodeIDNAOption) + )->toAscii(); } } @@ -179,6 +212,8 @@ public function toArray(): array 'version' => $this->version, 'records' => $this->records, 'modifiedDate' => $this->modifiedDate->format(DATE_ATOM), + 'asciiIDNAOption'=>$this->asciiIDNAOption, + 'unicodeIDNAOption'=>$this->unicodeIDNAOption ]; } @@ -192,7 +227,9 @@ public function toArray(): array public function contains($tld): bool { try { - $tld = $tld instanceof Domain ? $tld : new Domain($tld); + $tld = $tld instanceof Domain + ? $tld + : new Domain($tld, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); } catch (Exception $e) { return false; } @@ -214,18 +251,16 @@ public function contains($tld): bool /** * Returns a domain where its public suffix is the found TLD. * @param mixed $domain - * @param int $asciiIDNAOption - * @param int $unicodeIDNAOption * @return Domain */ - public function resolve($domain, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): Domain + public function resolve($domain): Domain { try { $domain = $domain instanceof Domain ? $domain - : new Domain($domain, null, $asciiIDNAOption, $unicodeIDNAOption); + : new Domain($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); } catch (Exception $e) { - return new Domain(); + return new Domain(null, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); } if (!$domain->isResolvable()) { diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 3ef00610..780158bb 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -15,9 +15,6 @@ namespace Pdp\Tests; -use function array_map; -use function array_reduce; -use function ord; use Pdp\Domain; use Pdp\Exception\CouldNotResolvePublicSuffix; use Pdp\Exception\CouldNotResolveSubDomain; @@ -27,9 +24,8 @@ use Pdp\PublicSuffix; use Pdp\Rules; use PHPUnit\Framework\TestCase; -use function print_r; -use function str_split; use TypeError; +use function date_create; /** * @coversDefaultClass Pdp\Domain @@ -561,7 +557,18 @@ public function testWithSubDomainFailsWithOneLabelDomain() self::expectException(CouldNotResolveSubDomain::class); (new Domain('localhost'))->withSubDomain('www'); } - + + /** + * @covers ::withSubDomain + * @covers ::normalizeContent + */ + public function testWithEmptySubdomain() + { + self::expectException(InvalidDomain::class); + (new Domain('www.example.com', + new PublicSuffix('com', PublicSuffix::ICANN_DOMAINS) + ))->withSubDomain(''); + } /** * @covers ::withSubDomain diff --git a/tests/RulesTest.php b/tests/RulesTest.php index f8d9d007..6ffb4398 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -636,7 +636,14 @@ public function testPublicSuffixSpec() public function testResolveWithIDNAOptions() { - $resolved = $this->rules->resolve('foo.de', Rules::ICANN_DOMAINS, 16, 32); + $resolvedByDefault = $this->rules->resolve('foo.de', Rules::ICANN_DOMAINS); + self::assertSame( + [0, 0], + [$resolvedByDefault->getAsciiIDNAOption(), $resolvedByDefault->getUnicodeIDNAOption()] + ); + $manager = new Manager(new Cache(), new CurlHttpClient()); + $rules = $manager->getRules(Manager::PSL_URL, null, 16, 32); + $resolved = $rules->resolve('foo.de', Rules::ICANN_DOMAINS); self::assertSame( [16, 32], [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption()] diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index b6737e25..8f46e230 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -151,7 +151,10 @@ public function testResolveWithUnregisteredTLD() public function testResolveWithIDNAOptions() { - $resolved = $this->collection->resolve('foo.de', 16, 32); + $resolved = $this->collection->resolve('foo.de'); + self::assertSame([0, 0], [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption()]); + $collection = TopLevelDomains::createFromPath(__DIR__.'/data/root_zones.dat', null, 16, 32); + $resolved = $collection->resolve('foo.de'); self::assertSame([16, 32], [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption()]); } /** From e99bc5ec1da0d62f812bf03a3444155ac8c86c28 Mon Sep 17 00:00:00 2001 From: insolita Date: Wed, 10 Apr 2019 19:33:42 +0800 Subject: [PATCH 147/461] fix hasTransitionalDifference --- src/IDNAConverterTrait.php | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index 2ce9c260..b31995f0 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -15,7 +15,6 @@ namespace Pdp; -use function is_string; use Pdp\Exception\InvalidDomain; use TypeError; use UnexpectedValueException; @@ -26,6 +25,7 @@ use function idn_to_utf8; use function implode; use function is_scalar; +use function is_string; use function iterator_to_array; use function method_exists; use function preg_match; @@ -111,31 +111,36 @@ private static function getIdnErrors(int $error_bit): string * @return string */ private function idnToAscii(string $domain, int $IDNAOption = IDNA_DEFAULT): string + { + list($domain,) = $this->transformToAscii($domain, $IDNAOption); + return $domain; + } + + private function transformToAscii(string $domain, int $option):array { $domain = rawurldecode($domain); static $pattern = '/[^\x20-\x7f]/'; if (!preg_match($pattern, $domain)) { - return strtolower($domain); + return [strtolower($domain), false]; } - - $output = idn_to_ascii($domain, $IDNAOption, INTL_IDNA_VARIANT_UTS46, $arr); - if (0 !== $arr['errors']) { - throw new InvalidDomain(sprintf('The host `%s` is invalid : %s', $domain, self::getIdnErrors($arr['errors']))); + + $output = idn_to_ascii($domain, $option, INTL_IDNA_VARIANT_UTS46, $info); + if (0 !== $info['errors']) { + throw new InvalidDomain(sprintf('The host `%s` is invalid : %s', $domain, self::getIdnErrors($info['errors']))); } - + // @codeCoverageIgnoreStart if (false === $output) { throw new UnexpectedValueException(sprintf('The Intl extension is misconfigured for %s, please correct this issue before proceeding.', PHP_OS)); } // @codeCoverageIgnoreEnd - + if (false === strpos($output, '%')) { - return $output; + return [$output, $info['isTransitionalDifferent']]; } - + throw new InvalidDomain(sprintf('The host `%s` is invalid: it contains invalid characters', $domain)); } - /** * Converts the input to its IDNA UNICODE form. * @@ -232,11 +237,10 @@ private function setLabels($domain = null, int $asciiOption = 0, int $unicodeOpt private function hasTransitionalDifference($domain):bool { - if(!is_string($domain) || empty($domain)){ + if(!is_string($domain) || '' === $domain){ return false; } - $info = []; - idn_to_ascii($domain, IDNA_NONTRANSITIONAL_TO_ASCII, INTL_IDNA_VARIANT_UTS46, $info); - return (bool)$info['isTransitionalDifferent'] === true; + list(, $isTransitionalDifferent) = $this->transformToAscii($domain, IDNA_DEFAULT); + return $isTransitionalDifferent; } } From a7562fd4193a53b489e7566b6d6b5e50d2be0f51 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 10 Apr 2019 20:53:46 +0200 Subject: [PATCH 148/461] Improve IDNA options support --- CHANGELOG.md | 2 +- ...ULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- ...ULL_f18a70477d29d525b9220612e2115345.cache | 2 +- src/Domain.php | 121 +++++++++++------- src/IDNAConverterTrait.php | 36 ++++-- src/Manager.php | 41 ++++-- src/PublicSuffix.php | 69 +++++++--- src/Rules.php | 70 +++++++--- src/TLDConverter.php | 2 + src/TopLevelDomains.php | 99 +++++++++----- tests/DomainTest.php | 27 +++- tests/PublicSuffixTest.php | 13 ++ tests/RulesTest.php | 12 +- tests/TopLevelDomainsTest.php | 9 ++ 14 files changed, 351 insertions(+), 154 deletions(-) mode change 100644 => 100755 data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache mode change 100644 => 100755 data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache diff --git a/CHANGELOG.md b/CHANGELOG.md index 23703164..f861ea26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in ### Added -- None +- Support for IDNA_OPTIONS settings in all the classes see [#236](https://github.com/jeremykendall/php-domain-parser/pull/236) thanks to [Insolita](https://github.com/Insolita) ### Fixed diff --git a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache old mode 100644 new mode 100755 index 2b34c17f..9713d6c3 --- a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache +++ b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache @@ -1 +1 @@ -s:108789:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":[],"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"ong":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"com":[],"asso":[],"nom":[],"prd":[],"presse":[],"tm":[],"aeroport":[],"assedic":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"gouv":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"ponpes":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"ac":[],"biz":[],"co":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"sc":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":[],"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"active":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blanco":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epost":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"spiegel":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zippo":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"krasnik":[],"leczna":[],"lubartow":[],"lublin":[],"poniatowa":[],"swidnik":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]},"co":[]},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"ipifony":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"siteleaf":[],"dsmynas":[],"familyds":[],"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"wpcomstaging":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastly-terrarium":[],"fastvps-server":[],"mydobiss":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lpusercontent":[],"lmpm":{"app":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"stdlib":{"api":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[],"cn-northwest-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}},"instantcloud":[]},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"io":{"apigee":[],"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"readthedocs":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"applicationcloud":[],"scapp":[],"telebit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"eus":{"party":{"user":[]}},"co":{"go-vip":[],"otap":{"*":[]},"com":{"blogspot":[]},"leadpages":[],"lpages":[],"mypi":[],"n4t":[],"nodum":[]},"ca":{"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[]},"uk":{"co":{"bytemark":{"dh":[],"vm":[]},"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"gov":{"service":[],"homeoffice":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"filegear-au":[],"filegear-de":[],"filegear-gb":[],"filegear-ie":[],"filegear-jp":[],"filegear-sg":[],"ravendb":[],"barsy":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"earth":{"dapps":{"*":[],"bzz":{"*":[]}}},"th":{"online":[],"shop":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[],"telebit":{"*":[]}},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"sensiosite":{"*":[]},"trafficplex":[]},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"app":{"run":{"a":[]},"hasura":[],"telebit":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]},"zone":[]},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"community":{"ravendb":[]},"run":{"development":[],"ravendb":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"business":{"co":[]},"education":{"co":[]},"events":{"co":[]},"financial":{"co":[]},"place":{"co":[]},"technology":{"co":[]},"space":{"linkitools":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ai":{"nom":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"fit":{"ptplus":[]},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]},"design":{"bss":[]}}}"; \ No newline at end of file +s:109022:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":{"co":[],"com":[],"commune":[],"net":[],"org":[]},"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"ong":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"asso":[],"com":[],"gouv":[],"nom":[],"prd":[],"tm":[],"aeroport":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"ponpes":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"ac":[],"biz":[],"co":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"sc":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":[],"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"krasnik":[],"leczna":[],"lubartow":[],"lublin":[],"poniatowa":[],"swidnik":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]},"co":[]},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"go-vip":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"in-dsl":[],"in-vpn":[],"ipifony":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"siteleaf":[],"dsmynas":[],"familyds":[],"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"wpcomstaging":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastly-terrarium":[],"fastvps-server":[],"mydobiss":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lpusercontent":[],"lmpm":{"app":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"stdlib":{"api":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[],"cn-northwest-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}},"instantcloud":[]},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"in-dsl":[],"in-vpn":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"io":{"apigee":[],"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"on-rio":{"*":[]},"readthedocs":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"applicationcloud":[],"scapp":[],"telebit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"eus":{"party":{"user":[]}},"co":{"go-vip":[],"otap":{"*":[]},"com":{"blogspot":[]},"leadpages":[],"lpages":[],"mypi":[],"n4t":[],"nodum":[]},"ca":{"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"dyn-berlin":[],"in-berlin":[],"in-brb":[],"in-butter":[],"in-dsl":[],"in-vpn":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[]},"uk":{"co":{"bytemark":{"dh":[],"vm":[]},"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"gov":{"service":[],"homeoffice":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"filegear-au":[],"filegear-de":[],"filegear-gb":[],"filegear-ie":[],"filegear-jp":[],"filegear-sg":[],"ravendb":[],"barsy":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"dev":{"workers":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"earth":{"dapps":{"*":[],"bzz":{"*":[]}}},"th":{"online":[],"shop":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[],"builder":{"site":[]}},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[],"telebit":{"*":[]}},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"on-rancher":{"*":[]},"sensiosite":{"*":[]},"trafficplex":[]},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"app":{"run":{"a":[]},"hasura":[],"telebit":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]},"zone":[]},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[],"syncloud":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"community":{"ravendb":[]},"run":{"development":[],"ravendb":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"business":{"co":[]},"education":{"co":[]},"events":{"co":[]},"financial":{"co":[]},"place":{"co":[]},"technology":{"co":[]},"space":{"linkitools":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ai":{"nom":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"fit":{"ptplus":[]},"edu":{"rit":{"git-pages":[]}},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]},"design":{"bss":[]}}}"; \ No newline at end of file diff --git a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache old mode 100644 new mode 100755 index c3d3ac79..9b12c844 --- a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache +++ b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache @@ -1 +1 @@ -s:13424:"{"version":"2019021600","modifiedDate":"2019-02-16T07:07:01+00:00","records":["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac","academy","accenture","accountant","accountants","aco","active","actor","ad","adac","ads","adult","ae","aeg","aero","aetna","af","afamilycompany","afl","africa","ag","agakhan","agency","ai","aig","aigo","airbus","airforce","airtel","akdn","al","alfaromeo","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","am","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","ao","aol","apartments","app","apple","aq","aquarelle","ar","arab","aramco","archi","army","arpa","art","arte","as","asda","asia","associates","at","athleta","attorney","au","auction","audi","audible","audio","auspost","author","auto","autos","avianca","aw","aws","ax","axa","az","azure","ba","baby","baidu","banamex","bananarepublic","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bb","bbc","bbt","bbva","bcg","bcn","bd","be","beats","beauty","beer","bentley","berlin","best","bestbuy","bet","bf","bg","bh","bharti","bi","bible","bid","bike","bing","bingo","bio","biz","bj","black","blackfriday","blockbuster","blog","bloomberg","blue","bm","bms","bmw","bn","bnl","bnpparibas","bo","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","br","bradesco","bridgestone","broadway","broker","brother","brussels","bs","bt","budapest","bugatti","build","builders","business","buy","buzz","bv","bw","by","bz","bzh","ca","cab","cafe","cal","call","calvinklein","cam","camera","camp","cancerresearch","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","cartier","casa","case","caseih","cash","casino","cat","catering","catholic","cba","cbn","cbre","cbs","cc","cd","ceb","center","ceo","cern","cf","cfa","cfd","cg","ch","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","chrysler","church","ci","cipriani","circle","cisco","citadel","citi","citic","city","cityeats","ck","cl","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","cm","cn","co","coach","codes","coffee","college","cologne","com","comcast","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cookingchannel","cool","coop","corsica","country","coupon","coupons","courses","cr","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","csc","cu","cuisinella","cv","cw","cx","cy","cymru","cyou","cz","dabur","dad","dance","data","date","dating","datsun","day","dclk","dds","de","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dj","dk","dm","dnp","do","docs","doctor","dodge","dog","doha","domains","dot","download","drive","dtv","dubai","duck","dunlop","duns","dupont","durban","dvag","dvr","dz","earth","eat","ec","eco","edeka","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","epson","equipment","er","ericsson","erni","es","esq","estate","esurance","et","etisalat","eu","eurovision","eus","events","everbank","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fi","fiat","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","fj","fk","flickr","flights","flir","florist","flowers","fly","fm","fo","foo","food","foodnetwork","football","ford","forex","forsale","forum","foundation","fox","fr","free","fresenius","frl","frogans","frontdoor","frontier","ftr","fujitsu","fujixerox","fun","fund","furniture","futbol","fyi","ga","gal","gallery","gallo","gallup","game","games","gap","garden","gb","gbiz","gd","gdn","ge","gea","gent","genting","george","gf","gg","ggee","gh","gi","gift","gifts","gives","giving","gl","glade","glass","gle","global","globo","gm","gmail","gmbh","gmo","gmx","gn","godaddy","gold","goldpoint","golf","goo","goodyear","goog","google","gop","got","gov","gp","gq","gr","grainger","graphics","gratis","green","gripe","grocery","group","gs","gt","gu","guardian","gucci","guge","guide","guitars","guru","gw","gy","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hgtv","hiphop","hisamitsu","hitachi","hiv","hk","hkt","hm","hn","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","honeywell","horse","hospital","host","hosting","hot","hoteles","hotels","hotmail","house","how","hr","hsbc","ht","hu","hughes","hyatt","hyundai","ibm","icbc","ice","icu","id","ie","ieee","ifm","ikano","il","im","imamat","imdb","immo","immobilien","in","inc","industries","infiniti","info","ing","ink","institute","insurance","insure","int","intel","international","intuit","investments","io","ipiranga","iq","ir","irish","is","iselect","ismaili","ist","istanbul","it","itau","itv","iveco","jaguar","java","jcb","jcp","je","jeep","jetzt","jewelry","jio","jll","jm","jmp","jnj","jo","jobs","joburg","jot","joy","jp","jpmorgan","jprs","juegos","juniper","kaufen","kddi","ke","kerryhotels","kerrylogistics","kerryproperties","kfh","kg","kh","ki","kia","kim","kinder","kindle","kitchen","kiwi","km","kn","koeln","komatsu","kosher","kp","kpmg","kpn","kr","krd","kred","kuokgroup","kw","ky","kyoto","kz","la","lacaixa","ladbrokes","lamborghini","lamer","lancaster","lancia","lancome","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lb","lc","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","li","liaison","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","linde","link","lipsy","live","living","lixil","lk","llc","loan","loans","locker","locus","loft","lol","london","lotte","lotto","love","lpl","lplfinancial","lr","ls","lt","ltd","ltda","lu","lundbeck","lupin","luxe","luxury","lv","ly","ma","macys","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","maserati","mattel","mba","mc","mckinsey","md","me","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","metlife","mg","mh","miami","microsoft","mil","mini","mint","mit","mitsubishi","mk","ml","mlb","mls","mm","mma","mn","mo","mobi","mobile","mobily","moda","moe","moi","mom","monash","money","monster","mopar","mormon","mortgage","moscow","moto","motorcycles","mov","movie","movistar","mp","mq","mr","ms","msd","mt","mtn","mtr","mu","museum","mutual","mv","mw","mx","my","mz","na","nab","nadex","nagoya","name","nationwide","natura","navy","nba","nc","ne","nec","net","netbank","netflix","network","neustar","new","newholland","news","next","nextdirect","nexus","nf","nfl","ng","ngo","nhk","ni","nico","nike","nikon","ninja","nissan","nissay","nl","no","nokia","northwesternmutual","norton","now","nowruz","nowtv","np","nr","nra","nrw","ntt","nu","nyc","nz","obi","observer","off","office","okinawa","olayan","olayangroup","oldnavy","ollo","om","omega","one","ong","onl","online","onyourside","ooo","open","oracle","orange","org","organic","origins","osaka","otsuka","ott","ovh","pa","page","panasonic","paris","pars","partners","parts","party","passagens","pay","pccw","pe","pet","pf","pfizer","pg","ph","pharmacy","phd","philips","phone","photo","photography","photos","physio","piaget","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","pk","pl","place","play","playstation","plumbing","plus","pm","pn","pnc","pohl","poker","politie","porn","post","pr","pramerica","praxi","press","prime","pro","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","ps","pt","pub","pw","pwc","py","qa","qpon","quebec","quest","qvc","racing","radio","raid","re","read","realestate","realtor","realty","recipes","red","redstone","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","rightathome","ril","rio","rip","rmit","ro","rocher","rocks","rodeo","rogers","room","rs","rsvp","ru","rugby","ruhr","run","rw","rwe","ryukyu","sa","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sb","sbi","sbs","sc","sca","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scjohnson","scor","scot","sd","se","search","seat","secure","security","seek","select","sener","services","ses","seven","sew","sex","sexy","sfr","sg","sh","shangrila","sharp","shaw","shell","shia","shiksha","shoes","shop","shopping","shouji","show","showtime","shriram","si","silk","sina","singles","site","sj","sk","ski","skin","sky","skype","sl","sling","sm","smart","smile","sn","sncf","so","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","space","sport","spot","spreadbetting","sr","srl","srt","ss","st","stada","staples","star","starhub","statebank","statefarm","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","su","sucks","supplies","supply","support","surf","surgery","suzuki","sv","swatch","swiftcover","swiss","sx","sy","sydney","symantec","systems","sz","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tc","tci","td","tdk","team","tech","technology","tel","telefonica","temasek","tennis","teva","tf","tg","th","thd","theater","theatre","tiaa","tickets","tienda","tiffany","tips","tires","tirol","tj","tjmaxx","tjx","tk","tkmaxx","tl","tm","tmall","tn","to","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","tr","trade","trading","training","travel","travelchannel","travelers","travelersinsurance","trust","trv","tt","tube","tui","tunes","tushu","tv","tvs","tw","tz","ua","ubank","ubs","uconnect","ug","uk","unicom","university","uno","uol","ups","us","uy","uz","va","vacations","vana","vanguard","vc","ve","vegas","ventures","verisign","versicherung","vet","vg","vi","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","vistaprint","viva","vivo","vlaanderen","vn","vodka","volkswagen","volvo","vote","voting","voto","voyage","vu","vuelos","wales","walmart","walter","wang","wanggou","warman","watch","watches","weather","weatherchannel","webcam","weber","website","wed","wedding","weibo","weir","wf","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","ws","wtc","wtf","xbox","xerox","xfinity","xihuan","xin","xn--11b4c3d","xn--1ck2e1b","xn--1qqw23a","xn--2scrj9c","xn--30rr7y","xn--3bst00m","xn--3ds443g","xn--3e0b707e","xn--3hcrj9c","xn--3oq18vl8pn36a","xn--3pxu8k","xn--42c2d9a","xn--45br5cyl","xn--45brj9c","xn--45q11c","xn--4gbrim","xn--54b7fta0cc","xn--55qw42g","xn--55qx5d","xn--5su34j936bgsg","xn--5tzm5g","xn--6frz82g","xn--6qq986b3xl","xn--80adxhks","xn--80ao21a","xn--80aqecdr1a","xn--80asehdb","xn--80aswg","xn--8y0a063a","xn--90a3ac","xn--90ae","xn--90ais","xn--9dbq2a","xn--9et52u","xn--9krt00a","xn--b4w605ferd","xn--bck1b9a5dre4c","xn--c1avg","xn--c2br7g","xn--cck2b3b","xn--cg4bki","xn--clchc0ea0b2g2a9gcd","xn--czr694b","xn--czrs0t","xn--czru2d","xn--d1acj3b","xn--d1alf","xn--e1a4c","xn--eckvdtc9d","xn--efvy88h","xn--estv75g","xn--fct429k","xn--fhbei","xn--fiq228c5hs","xn--fiq64b","xn--fiqs8s","xn--fiqz9s","xn--fjq720a","xn--flw351e","xn--fpcrj9c3d","xn--fzc2c9e2c","xn--fzys8d69uvgm","xn--g2xx48c","xn--gckr3f0f","xn--gecrj9c","xn--gk3at1e","xn--h2breg3eve","xn--h2brj9c","xn--h2brj9c8c","xn--hxt814e","xn--i1b6b1a6a2e","xn--imr513n","xn--io0a7i","xn--j1aef","xn--j1amh","xn--j6w193g","xn--jlq61u9w7b","xn--jvr189m","xn--kcrx77d1x4a","xn--kprw13d","xn--kpry57d","xn--kpu716f","xn--kput3i","xn--l1acc","xn--lgbbat1ad8j","xn--mgb9awbf","xn--mgba3a3ejt","xn--mgba3a4f16a","xn--mgba7c0bbn0a","xn--mgbaakc7dvf","xn--mgbaam7a8h","xn--mgbab2bd","xn--mgbah1a3hjkrd","xn--mgbai9azgqp6j","xn--mgbayh7gpa","xn--mgbb9fbpob","xn--mgbbh1a","xn--mgbbh1a71e","xn--mgbc0a9azcg","xn--mgbca7dzdo","xn--mgberp4a5d4ar","xn--mgbgu82a","xn--mgbi4ecexp","xn--mgbpl2fh","xn--mgbt3dhd","xn--mgbtx2b","xn--mgbx4cd0ab","xn--mix891f","xn--mk1bu44c","xn--mxtq1m","xn--ngbc5azd","xn--ngbe9e0a","xn--ngbrx","xn--node","xn--nqv7f","xn--nqv7fs00ema","xn--nyqy26a","xn--o3cw4h","xn--ogbpf8fl","xn--otu796d","xn--p1acf","xn--p1ai","xn--pbt977c","xn--pgbs0dh","xn--pssy2u","xn--q9jyb4c","xn--qcka1pmc","xn--qxam","xn--rhqv96g","xn--rovu88b","xn--rvc1e0am3e","xn--s9brj9c","xn--ses554g","xn--t60b56a","xn--tckwe","xn--tiq49xqyj","xn--unup4y","xn--vermgensberater-ctb","xn--vermgensberatung-pwb","xn--vhquv","xn--vuq861b","xn--w4r85el8fhu5dnra","xn--w4rs40l","xn--wgbh1c","xn--wgbl6a","xn--xhq521b","xn--xkc2al3hye2a","xn--xkc2dl3a5ee0h","xn--y9a3aq","xn--yfro4i67o","xn--ygbi2ammx","xn--zfr164b","xxx","xyz","yachts","yahoo","yamaxun","yandex","ye","yodobashi","yoga","yokohama","you","youtube","yt","yun","za","zappos","zara","zero","zip","zm","zone","zuerich","zw"]}"; \ No newline at end of file +s:13408:"{"version":"2019041000","modifiedDate":"2019-04-10T07:07:02+00:00","records":["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac","academy","accenture","accountant","accountants","aco","actor","ad","adac","ads","adult","ae","aeg","aero","aetna","af","afamilycompany","afl","africa","ag","agakhan","agency","ai","aig","aigo","airbus","airforce","airtel","akdn","al","alfaromeo","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","am","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","ao","aol","apartments","app","apple","aq","aquarelle","ar","arab","aramco","archi","army","arpa","art","arte","as","asda","asia","associates","at","athleta","attorney","au","auction","audi","audible","audio","auspost","author","auto","autos","avianca","aw","aws","ax","axa","az","azure","ba","baby","baidu","banamex","bananarepublic","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bb","bbc","bbt","bbva","bcg","bcn","bd","be","beats","beauty","beer","bentley","berlin","best","bestbuy","bet","bf","bg","bh","bharti","bi","bible","bid","bike","bing","bingo","bio","biz","bj","black","blackfriday","blockbuster","blog","bloomberg","blue","bm","bms","bmw","bn","bnl","bnpparibas","bo","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","br","bradesco","bridgestone","broadway","broker","brother","brussels","bs","bt","budapest","bugatti","build","builders","business","buy","buzz","bv","bw","by","bz","bzh","ca","cab","cafe","cal","call","calvinklein","cam","camera","camp","cancerresearch","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","cartier","casa","case","caseih","cash","casino","cat","catering","catholic","cba","cbn","cbre","cbs","cc","cd","ceb","center","ceo","cern","cf","cfa","cfd","cg","ch","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","chrysler","church","ci","cipriani","circle","cisco","citadel","citi","citic","city","cityeats","ck","cl","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","cm","cn","co","coach","codes","coffee","college","cologne","com","comcast","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cookingchannel","cool","coop","corsica","country","coupon","coupons","courses","cr","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","csc","cu","cuisinella","cv","cw","cx","cy","cymru","cyou","cz","dabur","dad","dance","data","date","dating","datsun","day","dclk","dds","de","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dj","dk","dm","dnp","do","docs","doctor","dodge","dog","domains","dot","download","drive","dtv","dubai","duck","dunlop","duns","dupont","durban","dvag","dvr","dz","earth","eat","ec","eco","edeka","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","epson","equipment","er","ericsson","erni","es","esq","estate","esurance","et","etisalat","eu","eurovision","eus","events","everbank","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fi","fiat","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","fj","fk","flickr","flights","flir","florist","flowers","fly","fm","fo","foo","food","foodnetwork","football","ford","forex","forsale","forum","foundation","fox","fr","free","fresenius","frl","frogans","frontdoor","frontier","ftr","fujitsu","fujixerox","fun","fund","furniture","futbol","fyi","ga","gal","gallery","gallo","gallup","game","games","gap","garden","gb","gbiz","gd","gdn","ge","gea","gent","genting","george","gf","gg","ggee","gh","gi","gift","gifts","gives","giving","gl","glade","glass","gle","global","globo","gm","gmail","gmbh","gmo","gmx","gn","godaddy","gold","goldpoint","golf","goo","goodyear","goog","google","gop","got","gov","gp","gq","gr","grainger","graphics","gratis","green","gripe","grocery","group","gs","gt","gu","guardian","gucci","guge","guide","guitars","guru","gw","gy","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hgtv","hiphop","hisamitsu","hitachi","hiv","hk","hkt","hm","hn","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","honeywell","horse","hospital","host","hosting","hot","hoteles","hotels","hotmail","house","how","hr","hsbc","ht","hu","hughes","hyatt","hyundai","ibm","icbc","ice","icu","id","ie","ieee","ifm","ikano","il","im","imamat","imdb","immo","immobilien","in","inc","industries","infiniti","info","ing","ink","institute","insurance","insure","int","intel","international","intuit","investments","io","ipiranga","iq","ir","irish","is","iselect","ismaili","ist","istanbul","it","itau","itv","iveco","jaguar","java","jcb","jcp","je","jeep","jetzt","jewelry","jio","jll","jm","jmp","jnj","jo","jobs","joburg","jot","joy","jp","jpmorgan","jprs","juegos","juniper","kaufen","kddi","ke","kerryhotels","kerrylogistics","kerryproperties","kfh","kg","kh","ki","kia","kim","kinder","kindle","kitchen","kiwi","km","kn","koeln","komatsu","kosher","kp","kpmg","kpn","kr","krd","kred","kuokgroup","kw","ky","kyoto","kz","la","lacaixa","ladbrokes","lamborghini","lamer","lancaster","lancia","lancome","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lb","lc","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","li","liaison","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","linde","link","lipsy","live","living","lixil","lk","llc","loan","loans","locker","locus","loft","lol","london","lotte","lotto","love","lpl","lplfinancial","lr","ls","lt","ltd","ltda","lu","lundbeck","lupin","luxe","luxury","lv","ly","ma","macys","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","maserati","mattel","mba","mc","mckinsey","md","me","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","metlife","mg","mh","miami","microsoft","mil","mini","mint","mit","mitsubishi","mk","ml","mlb","mls","mm","mma","mn","mo","mobi","mobile","mobily","moda","moe","moi","mom","monash","money","monster","mopar","mormon","mortgage","moscow","moto","motorcycles","mov","movie","movistar","mp","mq","mr","ms","msd","mt","mtn","mtr","mu","museum","mutual","mv","mw","mx","my","mz","na","nab","nadex","nagoya","name","nationwide","natura","navy","nba","nc","ne","nec","net","netbank","netflix","network","neustar","new","newholland","news","next","nextdirect","nexus","nf","nfl","ng","ngo","nhk","ni","nico","nike","nikon","ninja","nissan","nissay","nl","no","nokia","northwesternmutual","norton","now","nowruz","nowtv","np","nr","nra","nrw","ntt","nu","nyc","nz","obi","observer","off","office","okinawa","olayan","olayangroup","oldnavy","ollo","om","omega","one","ong","onl","online","onyourside","ooo","open","oracle","orange","org","organic","origins","osaka","otsuka","ott","ovh","pa","page","panasonic","paris","pars","partners","parts","party","passagens","pay","pccw","pe","pet","pf","pfizer","pg","ph","pharmacy","phd","philips","phone","photo","photography","photos","physio","piaget","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","pk","pl","place","play","playstation","plumbing","plus","pm","pn","pnc","pohl","poker","politie","porn","post","pr","pramerica","praxi","press","prime","pro","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","ps","pt","pub","pw","pwc","py","qa","qpon","quebec","quest","qvc","racing","radio","raid","re","read","realestate","realtor","realty","recipes","red","redstone","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","rightathome","ril","rio","rip","rmit","ro","rocher","rocks","rodeo","rogers","room","rs","rsvp","ru","rugby","ruhr","run","rw","rwe","ryukyu","sa","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sb","sbi","sbs","sc","sca","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scjohnson","scor","scot","sd","se","search","seat","secure","security","seek","select","sener","services","ses","seven","sew","sex","sexy","sfr","sg","sh","shangrila","sharp","shaw","shell","shia","shiksha","shoes","shop","shopping","shouji","show","showtime","shriram","si","silk","sina","singles","site","sj","sk","ski","skin","sky","skype","sl","sling","sm","smart","smile","sn","sncf","so","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","space","sport","spot","spreadbetting","sr","srl","srt","ss","st","stada","staples","star","starhub","statebank","statefarm","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","su","sucks","supplies","supply","support","surf","surgery","suzuki","sv","swatch","swiftcover","swiss","sx","sy","sydney","symantec","systems","sz","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tc","tci","td","tdk","team","tech","technology","tel","telefonica","temasek","tennis","teva","tf","tg","th","thd","theater","theatre","tiaa","tickets","tienda","tiffany","tips","tires","tirol","tj","tjmaxx","tjx","tk","tkmaxx","tl","tm","tmall","tn","to","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","tr","trade","trading","training","travel","travelchannel","travelers","travelersinsurance","trust","trv","tt","tube","tui","tunes","tushu","tv","tvs","tw","tz","ua","ubank","ubs","uconnect","ug","uk","unicom","university","uno","uol","ups","us","uy","uz","va","vacations","vana","vanguard","vc","ve","vegas","ventures","verisign","versicherung","vet","vg","vi","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","vistaprint","viva","vivo","vlaanderen","vn","vodka","volkswagen","volvo","vote","voting","voto","voyage","vu","vuelos","wales","walmart","walter","wang","wanggou","warman","watch","watches","weather","weatherchannel","webcam","weber","website","wed","wedding","weibo","weir","wf","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","ws","wtc","wtf","xbox","xerox","xfinity","xihuan","xin","xn--11b4c3d","xn--1ck2e1b","xn--1qqw23a","xn--2scrj9c","xn--30rr7y","xn--3bst00m","xn--3ds443g","xn--3e0b707e","xn--3hcrj9c","xn--3oq18vl8pn36a","xn--3pxu8k","xn--42c2d9a","xn--45br5cyl","xn--45brj9c","xn--45q11c","xn--4gbrim","xn--54b7fta0cc","xn--55qw42g","xn--55qx5d","xn--5su34j936bgsg","xn--5tzm5g","xn--6frz82g","xn--6qq986b3xl","xn--80adxhks","xn--80ao21a","xn--80aqecdr1a","xn--80asehdb","xn--80aswg","xn--8y0a063a","xn--90a3ac","xn--90ae","xn--90ais","xn--9dbq2a","xn--9et52u","xn--9krt00a","xn--b4w605ferd","xn--bck1b9a5dre4c","xn--c1avg","xn--c2br7g","xn--cck2b3b","xn--cg4bki","xn--clchc0ea0b2g2a9gcd","xn--czr694b","xn--czrs0t","xn--czru2d","xn--d1acj3b","xn--d1alf","xn--e1a4c","xn--eckvdtc9d","xn--efvy88h","xn--estv75g","xn--fct429k","xn--fhbei","xn--fiq228c5hs","xn--fiq64b","xn--fiqs8s","xn--fiqz9s","xn--fjq720a","xn--flw351e","xn--fpcrj9c3d","xn--fzc2c9e2c","xn--fzys8d69uvgm","xn--g2xx48c","xn--gckr3f0f","xn--gecrj9c","xn--gk3at1e","xn--h2breg3eve","xn--h2brj9c","xn--h2brj9c8c","xn--hxt814e","xn--i1b6b1a6a2e","xn--imr513n","xn--io0a7i","xn--j1aef","xn--j1amh","xn--j6w193g","xn--jlq61u9w7b","xn--jvr189m","xn--kcrx77d1x4a","xn--kprw13d","xn--kpry57d","xn--kpu716f","xn--kput3i","xn--l1acc","xn--lgbbat1ad8j","xn--mgb9awbf","xn--mgba3a3ejt","xn--mgba3a4f16a","xn--mgba7c0bbn0a","xn--mgbaakc7dvf","xn--mgbaam7a8h","xn--mgbab2bd","xn--mgbah1a3hjkrd","xn--mgbai9azgqp6j","xn--mgbayh7gpa","xn--mgbb9fbpob","xn--mgbbh1a","xn--mgbbh1a71e","xn--mgbc0a9azcg","xn--mgbca7dzdo","xn--mgberp4a5d4ar","xn--mgbgu82a","xn--mgbi4ecexp","xn--mgbpl2fh","xn--mgbt3dhd","xn--mgbtx2b","xn--mgbx4cd0ab","xn--mix891f","xn--mk1bu44c","xn--mxtq1m","xn--ngbc5azd","xn--ngbe9e0a","xn--ngbrx","xn--node","xn--nqv7f","xn--nqv7fs00ema","xn--nyqy26a","xn--o3cw4h","xn--ogbpf8fl","xn--otu796d","xn--p1acf","xn--p1ai","xn--pbt977c","xn--pgbs0dh","xn--pssy2u","xn--q9jyb4c","xn--qcka1pmc","xn--qxam","xn--rhqv96g","xn--rovu88b","xn--rvc1e0am3e","xn--s9brj9c","xn--ses554g","xn--t60b56a","xn--tckwe","xn--tiq49xqyj","xn--unup4y","xn--vermgensberater-ctb","xn--vermgensberatung-pwb","xn--vhquv","xn--vuq861b","xn--w4r85el8fhu5dnra","xn--w4rs40l","xn--wgbh1c","xn--wgbl6a","xn--xhq521b","xn--xkc2al3hye2a","xn--xkc2dl3a5ee0h","xn--y9a3aq","xn--yfro4i67o","xn--ygbi2ammx","xn--zfr164b","xxx","xyz","yachts","yahoo","yamaxun","yandex","ye","yodobashi","yoga","yokohama","you","youtube","yt","yun","za","zappos","zara","zero","zip","zm","zone","zuerich","zw"]}"; \ No newline at end of file diff --git a/src/Domain.php b/src/Domain.php index 5a6b7c32..051dffee 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -37,6 +37,7 @@ use function strlen; use function strpos; use function substr; +use const IDNA_DEFAULT; /** * Domain Value Object. @@ -326,6 +327,42 @@ public function keys(string $label): array return array_keys($this->labels, $label, true); } + /** + * Set IDNA_* options for functions idn_to_ascii. + * + * @see https://www.php.net/manual/en/intl.constants.php + * + * @return int + */ + public function getAsciiIDNAOption(): int + { + return $this->asciiIDNAOption; + } + + /** + * Set IDNA_* options for functions idn_to_utf8. + * + * @see https://www.php.net/manual/en/intl.constants.php + * + * @return int + */ + public function getUnicodeIDNAOption(): int + { + return $this->unicodeIDNAOption; + } + + /** + * return true if domain contains deviation characters. + * + * @see http://unicode.org/reports/tr46/#Transition_Considerations + * + * @return bool + */ + public function isTransitionalDifferent(): bool + { + return $this->isTransitionalDifferent; + } + /** * Returns the registrable domain. * @@ -423,7 +460,7 @@ public function toAscii() return $this; } - return new self($domain, $this->publicSuffix, $this->getAsciiIDNAOption(), $this->getUnicodeIDNAOption()); + return new self($domain, $this->publicSuffix, $this->asciiIDNAOption, $this->unicodeIDNAOption); } /** @@ -438,8 +475,8 @@ public function toUnicode() return new self( $this->idnToUnicode($this->domain, $this->unicodeIDNAOption), $this->publicSuffix, - $this->getAsciiIDNAOption(), - $this->getUnicodeIDNAOption() + $this->asciiIDNAOption, + $this->unicodeIDNAOption ); } @@ -464,8 +501,8 @@ public function resolve($publicSuffix): self $publicSuffix = new PublicSuffix( $publicSuffix, '', - $this->getAsciiIDNAOption(), - $this->getUnicodeIDNAOption() + $this->asciiIDNAOption, + $this->unicodeIDNAOption ); } @@ -474,7 +511,7 @@ public function resolve($publicSuffix): self return $this; } - return new self($this->domain, $publicSuffix, $this->getAsciiIDNAOption(), $this->getUnicodeIDNAOption()); + return new self($this->domain, $publicSuffix, $this->asciiIDNAOption, $this->unicodeIDNAOption); } /** @@ -496,8 +533,8 @@ public function withPublicSuffix($publicSuffix): self $publicSuffix = new PublicSuffix( $publicSuffix, '', - $this->getAsciiIDNAOption(), - $this->getUnicodeIDNAOption() + $this->asciiIDNAOption, + $this->unicodeIDNAOption ); } @@ -508,14 +545,14 @@ public function withPublicSuffix($publicSuffix): self $domain = implode('.', array_reverse(array_slice($this->labels, count($this->publicSuffix)))); if (null === $publicSuffix->getContent()) { - return new self($domain, null, $this->getAsciiIDNAOption(), $this->getUnicodeIDNAOption()); + return new self($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); } return new self( $domain.'.'.$publicSuffix->getContent(), $publicSuffix, - $this->getAsciiIDNAOption(), - $this->getUnicodeIDNAOption() + $this->asciiIDNAOption, + $this->unicodeIDNAOption ); } @@ -547,16 +584,16 @@ public function withSubDomain($subDomain): self return new self( $this->registrableDomain, $this->publicSuffix, - $this->getAsciiIDNAOption(), - $this->getUnicodeIDNAOption() + $this->asciiIDNAOption, + $this->unicodeIDNAOption ); } return new self( $subDomain.'.'.$this->registrableDomain, $this->publicSuffix, - $this->getAsciiIDNAOption(), - $this->getUnicodeIDNAOption() + $this->asciiIDNAOption, + $this->unicodeIDNAOption ); } @@ -668,16 +705,16 @@ public function withLabel(int $key, $label): self return new self( implode('.', array_reverse($labels)), null, - $this->getAsciiIDNAOption(), - $this->getUnicodeIDNAOption() + $this->asciiIDNAOption, + $this->unicodeIDNAOption ); } return new self( implode('.', array_reverse($labels)), $this->publicSuffix, - $this->getAsciiIDNAOption(), - $this->getUnicodeIDNAOption() + $this->asciiIDNAOption, + $this->unicodeIDNAOption ); } @@ -721,47 +758,35 @@ public function withoutLabel(int $key, int ...$keys): self } if ([] === $labels) { - return new self(null, null, $this->getAsciiIDNAOption(), $this->getUnicodeIDNAOption()); + return new self(null, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); } $domain = implode('.', array_reverse($labels)); $psContent = $this->publicSuffix->getContent(); if (null === $psContent || '.'.$psContent !== substr($domain, - strlen($psContent) - 1)) { - return new self($domain, null, $this->getAsciiIDNAOption(), $this->getUnicodeIDNAOption()); + return new self($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); } - return new self($domain, $this->publicSuffix, $this->getAsciiIDNAOption(), $this->getUnicodeIDNAOption()); - } - - - public function getAsciiIDNAOption(): int - { - return $this->asciiIDNAOption; + return new self($domain, $this->publicSuffix, $this->asciiIDNAOption, $this->unicodeIDNAOption); } - public function getUnicodeIDNAOption(): int - { - return $this->unicodeIDNAOption; - } /** - * Set IDNA_* options for functions idn_to_ascii, idn_to_utf. + * Set IDNA_* options for functions idn_to_ascii, idn_to_utf8. * @see https://www.php.net/manual/en/intl.constants.php - * @param int $forAscii - * @param int $forUnicode - * @return $this + * + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption + * + * @return self */ - public function withIDNAOptions(int $forAscii, int $forUnicode) - { - return new self($this->domain, $this->publicSuffix, $forAscii, $forUnicode); - } - - /** - * return true if domain contains deviation characters. - * @see http://unicode.org/reports/tr46/#Transition_Considerations - * @return bool - **/ - public function isTransitionalDifferent(): bool + public function withIDNAOptions(int $asciiIDNAOption, int $unicodeIDNAOption): self { - return $this->isTransitionalDifferent; + if ($asciiIDNAOption === $this->asciiIDNAOption + && $unicodeIDNAOption === $this->unicodeIDNAOption + ) { + return $this; + } + + return new self($this->domain, $this->publicSuffix, $asciiIDNAOption, $unicodeIDNAOption); } } diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index b31995f0..a666cee6 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -26,7 +26,6 @@ use function implode; use function is_scalar; use function is_string; -use function iterator_to_array; use function method_exists; use function preg_match; use function rawurldecode; @@ -35,6 +34,7 @@ use function strtolower; use const FILTER_FLAG_IPV4; use const FILTER_VALIDATE_IP; +use const IDNA_DEFAULT; use const IDNA_ERROR_BIDI; use const IDNA_ERROR_CONTEXTJ; use const IDNA_ERROR_DISALLOWED; @@ -112,15 +112,30 @@ private static function getIdnErrors(int $error_bit): string */ private function idnToAscii(string $domain, int $IDNAOption = IDNA_DEFAULT): string { - list($domain,) = $this->transformToAscii($domain, $IDNAOption); + list($domain, ) = $this->transformToAscii($domain, $IDNAOption); + return $domain; } - private function transformToAscii(string $domain, int $option):array + /** + * Returns the IDNA ASCII form and its isTransitionalDifferent state. + * + * @param string $domain + * + * @param int $IDNAOption + * @param int $option + * + * @throws InvalidDomain if the string can not be converted to ASCII using IDN UTS46 algorithm + * + * @return array + */ + private function transformToAscii(string $domain, int $option): array { $domain = rawurldecode($domain); + static $pattern = '/[^\x20-\x7f]/'; - if (!preg_match($pattern, $domain)) { + + if (1 !== preg_match($pattern, $domain)) { return [strtolower($domain), false]; } @@ -184,7 +199,7 @@ private function idnToUnicode(string $domain, int $IDNAOption = IDNA_DEFAULT): s private function setLabels($domain = null, int $asciiOption = 0, int $unicodeOption = 0): array { if ($domain instanceof DomainInterface) { - return iterator_to_array($domain, false); + $domain = $domain->getContent(); } if (null === $domain) { @@ -214,19 +229,19 @@ private function setLabels($domain = null, int $asciiOption = 0, int $unicodeOpt (?(?:(?&unreserved)|(?&sub_delims)|(?&encoded)){1,63}) ) ^(?:(?®_name)\.){0,126}(?®_name)\.?$/ix'; - if (preg_match($domain_name, $formatted_domain)) { + if (1 === preg_match($domain_name, $formatted_domain)) { return array_reverse(explode('.', strtolower($formatted_domain))); } // a domain name can not contains URI delimiters or space static $gen_delims = '/[:\/?#\[\]@ ]/'; - if (preg_match($gen_delims, $formatted_domain)) { + if (1 === preg_match($gen_delims, $formatted_domain)) { throw new InvalidDomain(sprintf('The domain `%s` is invalid: it contains invalid characters', $domain)); } // if the domain name does not contains UTF-8 chars then it is malformed static $pattern = '/[^\x20-\x7f]/'; - if (!preg_match($pattern, $formatted_domain)) { + if (1 !== preg_match($pattern, $formatted_domain)) { throw new InvalidDomain(sprintf('The domain `%s` is invalid: the labels are malformed', $domain)); } @@ -235,12 +250,13 @@ private function setLabels($domain = null, int $asciiOption = 0, int $unicodeOpt return array_reverse(explode('.', $this->idnToUnicode($ascii_domain, $unicodeOption))); } - private function hasTransitionalDifference($domain):bool + private function hasTransitionalDifference($domain): bool { - if(!is_string($domain) || '' === $domain){ + if (!is_string($domain) || '' === $domain) { return false; } list(, $isTransitionalDifferent) = $this->transformToAscii($domain, IDNA_DEFAULT); + return $isTransitionalDifferent; } } diff --git a/src/Manager.php b/src/Manager.php index 84958f63..972a7699 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -21,6 +21,7 @@ use Pdp\Exception\CouldNotLoadRules; use Pdp\Exception\CouldNotLoadTLDs; use Psr\SimpleCache\CacheInterface; +use Psr\SimpleCache\InvalidArgumentException as SimpleCacheException; use TypeError; use function filter_var; use function gettype; @@ -35,6 +36,7 @@ use function strtolower; use const DATE_ATOM; use const FILTER_VALIDATE_INT; +use const IDNA_DEFAULT; use const JSON_ERROR_NONE; /** @@ -82,19 +84,22 @@ public function __construct(CacheInterface $cache, HttpClient $http, $ttl = null /** * Gets the Public Suffix List Rules. - * @param string $url the Public Suffix List URL - * @param null|mixed $ttl the cache TTL + * + * @param string $url the Public Suffix List URL + * @param null|mixed $ttl the cache TTL * @param int $asciiIDNAOption * @param int $unicodeIDNAOption + * + * @throws SimpleCacheException + * * @return Rules - * @throws \Psr\SimpleCache\InvalidArgumentException */ public function getRules( string $url = self::PSL_URL, $ttl = null, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT - ):Rules { + ): Rules { $key = $this->getCacheKey('PSL', $url); $data = $this->cache->get($key); @@ -134,19 +139,22 @@ public function refreshRules(string $url = self::PSL_URL, $ttl = null): bool /** * Gets the Public Suffix List Rules. - * @param string $url the IANA Root Zone Database URL - * @param null|mixed $ttl the cache TTL + * + * @param string $url the IANA Root Zone Database URL + * @param null|mixed $ttl the cache TTL * @param int $asciiIDNAOption * @param int $unicodeIDNAOption + * + * @throws SimpleCacheException + * * @return TopLevelDomains - * @throws \Psr\SimpleCache\InvalidArgumentException */ public function getTLDs( string $url = self::RZD_URL, $ttl = null, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT - ):TopLevelDomains { + ): TopLevelDomains { $key = $this->getCacheKey('RZD', $url); $data = $this->cache->get($key); @@ -156,8 +164,10 @@ public function getTLDs( $data = json_decode($data ?? $this->cache->get($key), true); if (JSON_ERROR_NONE !== json_last_error()) { - throw new CouldNotLoadTLDs(sprintf('The root zone database cache is corrupted: %s', json_last_error_msg()), - json_last_error()); + throw new CouldNotLoadTLDs( + sprintf('The root zone database cache is corrupted: %s', json_last_error_msg()), + json_last_error() + ); } if (!isset($data['records'], $data['version'], $data['modifiedDate'])) { @@ -176,13 +186,16 @@ public function getTLDs( /** * Downloads, converts and cache the IANA Root Zone TLD. * If a local cache already exists, it will be overwritten. - * Returns true if the refresh was successful - * @param string $url the IANA Root Zone Database URL - * @param null|mixed $ttl the cache TTL + * Returns true if the refresh was successful. + * + * @param string $url the IANA Root Zone Database URL + * @param null|mixed $ttl the cache TTL * @param int $asciiIDNAOption * @param int $unicodeIDNAOption + * + * @throws SimpleCacheException + * * @return bool - * @throws \Psr\SimpleCache\InvalidArgumentException */ public function refreshTLDs( string $url = self::RZD_URL, diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 7d38b4c1..fc350ebb 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -26,6 +26,7 @@ use function in_array; use function reset; use function sprintf; +use const IDNA_DEFAULT; /** * Public Suffix Value Object. @@ -254,6 +255,42 @@ public function keys(string $label): array return array_keys($this->labels, $label, true); } + /** + * Set IDNA_* options for functions idn_to_ascii. + * + * @see https://www.php.net/manual/en/intl.constants.php + * + * @return int + */ + public function getAsciiIDNAOption(): int + { + return $this->asciiIDNAOption; + } + + /** + * Set IDNA_* options for functions idn_to_utf8. + * + * @see https://www.php.net/manual/en/intl.constants.php + * + * @return int + */ + public function getUnicodeIDNAOption(): int + { + return $this->unicodeIDNAOption; + } + + /** + * return true if domain contains deviation characters. + * + * @see http://unicode.org/reports/tr46/#Transition_Considerations + * + * @return bool + */ + public function isTransitionalDifferent(): bool + { + return $this->isTransitionalDifferent; + } + /** * Tells whether the public suffix has a matching rule in a Public Suffix List. * @@ -320,24 +357,22 @@ public function toUnicode() return $clone; } - - public function getAsciiIDNAOption(): int - { - return $this->asciiIDNAOption; - } - - public function getUnicodeIDNAOption(): int - { - return $this->unicodeIDNAOption; - } - + /** - * return true if domain contains deviation characters. - * @see http://unicode.org/reports/tr46/#Transition_Considerations - * @return bool - **/ - public function isTransitionalDifferent(): bool + * Set IDNA_* options for functions idn_to_ascii, idn_to_utf8. + * @see https://www.php.net/manual/en/intl.constants.php + * + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption + * + * @return self + */ + public function withIDNAOptions(int $asciiIDNAOption, int $unicodeIDNAOption): self { - return $this->isTransitionalDifferent; + if ($asciiIDNAOption === $this->asciiIDNAOption && $unicodeIDNAOption === $this->unicodeIDNAOption) { + return $this; + } + + return new self($this->publicSuffix, $this->section, $asciiIDNAOption, $unicodeIDNAOption); } } diff --git a/src/Rules.php b/src/Rules.php index 4e297085..621e5445 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -25,6 +25,7 @@ use function in_array; use function sprintf; use function stream_get_contents; +use const IDNA_DEFAULT; /** * A class to resolve domain name against the Public Suffix list. @@ -60,13 +61,32 @@ final class Rules implements PublicSuffixListSection * @var int */ private $unicodeIDNAOption; + + /** + * New instance. + * + * @param array $rules + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption + */ + public function __construct( + array $rules, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ) { + $this->rules = $rules; + $this->asciiIDNAOption = $asciiIDNAOption; + $this->unicodeIDNAOption = $unicodeIDNAOption; + } /** * Returns a new instance from a file path. + * * @param string $path * @param null|resource $context * @param int $asciiIDNAOption * @param int $unicodeIDNAOption + * * @return self */ public static function createFromPath( @@ -92,9 +112,11 @@ public static function createFromPath( /** * Returns a new instance from a string. + * * @param string $content * @param int $asciiIDNAOption * @param int $unicodeIDNAOption + * * @return self */ public static function createFromString( @@ -121,22 +143,6 @@ public static function __set_state(array $properties): self ); } - /** - * New instance. - * @param array $rules - * @param int $asciiIDNAOption - * @param int $unicodeIDNAOption - */ - public function __construct( - array $rules, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT - ){ - $this->rules = $rules; - $this->asciiIDNAOption = $asciiIDNAOption; - $this->unicodeIDNAOption = $unicodeIDNAOption; - } - /** * Determines the public suffix for a given domain. * @@ -150,9 +156,10 @@ public function __construct( public function getPublicSuffix($domain, string $section = self::ALL_DOMAINS): PublicSuffix { $section = $this->validateSection($section); - $domain = $domain instanceof Domain - ? $domain - : new Domain($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); + if (!$domain instanceof Domain) { + $domain = new Domain($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); + } + if (!$domain->isResolvable()) { throw new CouldNotResolvePublicSuffix(sprintf('The domain `%s` can not contain a public suffix', $domain->getContent())); } @@ -166,7 +173,8 @@ public function getPublicSuffix($domain, string $section = self::ALL_DOMAINS): P * @param string $section * @return Domain */ - public function resolve($domain, string $section = self::ALL_DOMAINS): Domain { + public function resolve($domain, string $section = self::ALL_DOMAINS): Domain + { $section = $this->validateSection($section); try { $domain = $domain instanceof Domain @@ -276,4 +284,26 @@ private function findPublicSuffixFromSection(DomainInterface $domain, string $se $this->unicodeIDNAOption ); } + + /** + * Set IDNA_* options for functions idn_to_ascii, idn_to_utf8. + * @see https://www.php.net/manual/en/intl.constants.php + * + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption + */ + public function withIDNAOptions(int $asciiIDNAOption, int $unicodeIDNAOption): self + { + if ($asciiIDNAOption === $this->asciiIDNAOption + && $unicodeIDNAOption === $this->unicodeIDNAOption + ) { + return $this; + } + + $clone = clone $this; + $clone->asciiIDNAOption = $asciiIDNAOption; + $clone->unicodeIDNAOption = $unicodeIDNAOption; + + return $clone; + } } diff --git a/src/TLDConverter.php b/src/TLDConverter.php index c06b08fc..99d4b14c 100644 --- a/src/TLDConverter.php +++ b/src/TLDConverter.php @@ -41,9 +41,11 @@ final class TLDConverter /** * Converts the IANA Root Zone Database into a TopLevelDomains associative array. + * * @param string $content * @param int $asciiIDNAOption * @param int $unicodeIDNAOption + * * @return array */ public function convert( diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 96ff849a..65772fda 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -26,6 +26,7 @@ use function fopen; use function stream_get_contents; use const DATE_ATOM; +use const IDNA_DEFAULT; /** * A class to resolve domain name against the IANA Root Database. @@ -59,12 +60,36 @@ final class TopLevelDomains implements Countable, IteratorAggregate */ private $unicodeIDNAOption; + /** + * New instance. + * @param array $records + * @param string $version + * @param DateTimeInterface $modifiedDate + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption + */ + public function __construct( + array $records, + string $version, + DateTimeInterface $modifiedDate, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ) { + $this->records = $records; + $this->version = $version; + $this->modifiedDate = $modifiedDate instanceof DateTime ? DateTimeImmutable::createFromMutable($modifiedDate) : $modifiedDate; + $this->asciiIDNAOption = $asciiIDNAOption; + $this->unicodeIDNAOption = $unicodeIDNAOption; + } + /** * Returns a new instance from a file path. + * * @param string $path * @param null|resource $context * @param int $asciiIDNAOption * @param int $unicodeIDNAOption + * * @return self */ public static function createFromPath( @@ -72,7 +97,7 @@ public static function createFromPath( $context = null, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT - ):self { + ): self { $args = [$path, 'r', false]; if (null !== $context) { $args[] = $context; @@ -90,9 +115,11 @@ public static function createFromPath( /** * Returns a new instance from a string. + * * @param string $content * @param int $asciiIDNAOption * @param int $unicodeIDNAOption + * * @return self */ public static function createFromString( @@ -129,28 +156,6 @@ public static function __set_state(array $properties): self ); } - /** - * New instance. - * @param array $records - * @param string $version - * @param DateTimeInterface $modifiedDate - * @param int $asciiIDNAOption - * @param int $unicodeIDNAOption - */ - public function __construct( - array $records, - string $version, - DateTimeInterface $modifiedDate, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT - ){ - $this->records = $records; - $this->version = $version; - $this->modifiedDate = $modifiedDate instanceof DateTime ? DateTimeImmutable::createFromMutable($modifiedDate) : $modifiedDate; - $this->asciiIDNAOption = $asciiIDNAOption; - $this->unicodeIDNAOption = $unicodeIDNAOption; - } - /** * Returns the Version ID. * @@ -195,9 +200,9 @@ public function isEmpty(): bool public function getIterator() { foreach ($this->records as $tld) { - yield ( - new PublicSuffix($tld, PublicSuffix::ICANN_DOMAINS, $this->asciiIDNAOption, $this->unicodeIDNAOption) - )->toAscii(); + $publicSuffix = new PublicSuffix($tld, PublicSuffix::ICANN_DOMAINS, $this->asciiIDNAOption, $this->unicodeIDNAOption); + + yield $publicSuffix->toAscii(); } } @@ -213,7 +218,7 @@ public function toArray(): array 'records' => $this->records, 'modifiedDate' => $this->modifiedDate->format(DATE_ATOM), 'asciiIDNAOption'=>$this->asciiIDNAOption, - 'unicodeIDNAOption'=>$this->unicodeIDNAOption + 'unicodeIDNAOption'=>$this->unicodeIDNAOption, ]; } @@ -227,9 +232,9 @@ public function toArray(): array public function contains($tld): bool { try { - $tld = $tld instanceof Domain - ? $tld - : new Domain($tld, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); + if (!$tld instanceof Domain) { + $tld = new Domain($tld, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); + } } catch (Exception $e) { return false; } @@ -250,15 +255,17 @@ public function contains($tld): bool /** * Returns a domain where its public suffix is the found TLD. - * @param mixed $domain + * + * @param mixed $domain + * * @return Domain */ public function resolve($domain): Domain { try { - $domain = $domain instanceof Domain - ? $domain - : new Domain($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); + if (!$domain instanceof Domain) { + $domain = new Domain($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); + } } catch (Exception $e) { return new Domain(null, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); } @@ -278,4 +285,28 @@ public function resolve($domain): Domain return $domain->resolve($publicSuffix); } + + /** + * Set IDNA_* options for functions idn_to_ascii, idn_to_utf8. + * @see https://www.php.net/manual/en/intl.constants.php + * + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption + * + * @return self + */ + public function withIDNAOptions(int $asciiIDNAOption, int $unicodeIDNAOption): self + { + if ($asciiIDNAOption === $this->asciiIDNAOption + && $unicodeIDNAOption === $this->unicodeIDNAOption + ) { + return $this; + } + + $clone = clone $this; + $clone->asciiIDNAOption = $asciiIDNAOption; + $clone->unicodeIDNAOption = $unicodeIDNAOption; + + return $clone; + } } diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 780158bb..9291eead 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -565,7 +565,8 @@ public function testWithSubDomainFailsWithOneLabelDomain() public function testWithEmptySubdomain() { self::expectException(InvalidDomain::class); - (new Domain('www.example.com', + (new Domain( + 'www.example.com', new PublicSuffix('com', PublicSuffix::ICANN_DOMAINS) ))->withSubDomain(''); } @@ -1044,7 +1045,7 @@ public function testResolveWorksWithCustomIDNAOptions( public function resolveCustomIDNAOptionsProvider() { return [ - 'without deviation characters'=>[ + 'without deviation characters' => [ 'example.com', 'com', 'größe', @@ -1055,7 +1056,7 @@ public function resolveCustomIDNAOptionsProvider() null, 'xn--gre-6ka8i.com', ], - 'without deviation characters with label'=>[ + 'without deviation characters with label' => [ 'www.example.com', 'com', 'größe', @@ -1066,7 +1067,7 @@ public function resolveCustomIDNAOptionsProvider() 'www', 'xn--gre-6ka8i.example.com', ], - 'with deviation in domain'=>[ + 'with deviation in domain' => [ 'www.faß.de', 'de', 'größe', @@ -1077,7 +1078,7 @@ public function resolveCustomIDNAOptionsProvider() 'www', 'größe.faß.de', ], - 'with deviation in label'=>[ + 'with deviation in label' => [ 'faß.test.de', 'de', 'größe', @@ -1090,8 +1091,7 @@ public function resolveCustomIDNAOptionsProvider() ], ]; } - - + public function testInstanceCreationWithCustomIDNAOptions() { $domain = new Domain('example.com', new PublicSuffix('com'), 16, 32); @@ -1165,4 +1165,17 @@ public function transitionalProvider() 'in label' => [new Domain('faß.test.de', new PublicSuffix('de')), true], ]; } + + /** + * @covers ::withIDNAOptions + * @covers ::getAsciiIDNAOption + * @covers ::getUnicodeIDNAOption + */ + public function testwithIDNAOptions() + { + $domain = new Domain('example.com', new PublicSuffix('com')); + self::assertSame($domain, $domain->withIDNAOptions($domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption())); + + self::assertNotEquals($domain, $domain->withIDNAOptions($domain->getAsciiIDNAOption(), 128)); + } } diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 99c8c6a7..32519b6f 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -351,4 +351,17 @@ public function transitionalProvider() 'in label' => [new PublicSuffix('faß.test.de'), true], ]; } + + /** + * @covers ::withIDNAOptions + * @covers ::getAsciiIDNAOption + * @covers ::getUnicodeIDNAOption + */ + public function testwithIDNAOptions() + { + $publicSuffix = new PublicSuffix('com'); + self::assertSame($publicSuffix, $publicSuffix->withIDNAOptions($publicSuffix->getAsciiIDNAOption(), $publicSuffix->getUnicodeIDNAOption())); + + self::assertNotEquals($publicSuffix, $publicSuffix->withIDNAOptions($publicSuffix->getAsciiIDNAOption(), 128)); + } } diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 6ffb4398..4bb4ed0a 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -26,6 +26,7 @@ use Pdp\Rules; use PHPUnit\Framework\TestCase; use TypeError; +use const IDNA_DEFAULT; /** * @coversDefaultClass Pdp\Rules @@ -79,6 +80,15 @@ public function testDomainInternalPhpMethod() self::assertEquals($this->rules, $generateRules); } + /** + * @covers ::withIDNAOptions + */ + public function testwithIDNAOptions() + { + self::assertSame($this->rules, $this->rules->withIDNAOptions(IDNA_DEFAULT, IDNA_DEFAULT)); + self::assertNotEquals($this->rules, $this->rules->withIDNAOptions(IDNA_DEFAULT, 128)); + } + /** * @covers ::resolve * @covers ::validateSection @@ -642,7 +652,7 @@ public function testResolveWithIDNAOptions() [$resolvedByDefault->getAsciiIDNAOption(), $resolvedByDefault->getUnicodeIDNAOption()] ); $manager = new Manager(new Cache(), new CurlHttpClient()); - $rules = $manager->getRules(Manager::PSL_URL, null, 16, 32); + $rules = $manager->getRules(Manager::PSL_URL, null, 16, 32); $resolved = $rules->resolve('foo.de', Rules::ICANN_DOMAINS); self::assertSame( [16, 32], diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index 8f46e230..30926b0b 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -94,6 +94,15 @@ public function testGetterProperties() } } + /** + * @covers ::withIDNAOptions + */ + public function testwithIDNAOptions() + { + self::assertSame($this->collection, $this->collection->withIDNAOptions(IDNA_DEFAULT, IDNA_DEFAULT)); + self::assertNotEquals($this->collection, $this->collection->withIDNAOptions(IDNA_DEFAULT, 128)); + } + /** * @dataProvider validDomainProvider * @param mixed $tld From a3509674123c22f9ba544d967c444872fc8b8c4c Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 10 Apr 2019 21:33:54 +0200 Subject: [PATCH 149/461] adding ::labels method see #238 --- src/Domain.php | 8 ++++++++ src/PublicSuffix.php | 8 ++++++++ tests/DomainTest.php | 17 +++++++++++++++++ tests/PublicSuffixTest.php | 16 ++++++++++++++++ 4 files changed, 49 insertions(+) diff --git a/src/Domain.php b/src/Domain.php index 051dffee..16b43e2c 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -327,6 +327,14 @@ public function keys(string $label): array return array_keys($this->labels, $label, true); } + /** + * Returns the object labels. + */ + public function labels(): array + { + return $this->labels; + } + /** * Set IDNA_* options for functions idn_to_ascii. * diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index fc350ebb..98b5c075 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -255,6 +255,14 @@ public function keys(string $label): array return array_keys($this->labels, $label, true); } + /** + * Returns the object labels. + */ + public function labels(): array + { + return $this->labels; + } + /** * Set IDNA_* options for functions idn_to_ascii. * diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 9291eead..fc844ddb 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -192,6 +192,23 @@ public function testOffsets() self::assertSame([], $domain->keys('toto')); } + /** + * @covers ::labels + */ + public function testLabels() + { + $domain = new Domain('master.com.example.com'); + self::assertSame([ + 'com', + 'example', + 'com', + 'master', + ], $domain->labels()); + + $domain = new Domain(); + self::assertSame([], $domain->labels()); + } + /** * @covers ::setLabels * @covers ::setPublicSuffix diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 32519b6f..6677b3fe 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -227,6 +227,22 @@ public function testOffsets() self::assertSame([2], $domain->keys('master')); } + /** + * @covers ::labels + */ + public function testLabels() + { + $publicSuffix = new PublicSuffix('master.example.com'); + self::assertSame([ + 'com', + 'example', + 'master', + ], $publicSuffix->labels()); + + $publicSuffix = new PublicSuffix(); + self::assertSame([], $publicSuffix->labels()); + } + /** * @covers ::createFromDomain * @dataProvider createFromDomainProvider From 2e68002691f36695aa6b598f65e8ccab1af7b90d Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 10 Apr 2019 22:01:03 +0200 Subject: [PATCH 150/461] Add more control over IDNA options --- src/Rules.php | 24 ++++++++++++++++++++++++ src/TopLevelDomains.php | 24 ++++++++++++++++++++++++ tests/RulesTest.php | 6 +++++- tests/TopLevelDomainsTest.php | 13 +++++++++++-- 4 files changed, 64 insertions(+), 3 deletions(-) diff --git a/src/Rules.php b/src/Rules.php index 621e5445..2a41873f 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -143,6 +143,30 @@ public static function __set_state(array $properties): self ); } + /** + * Set IDNA_* options for functions idn_to_ascii. + * + * @see https://www.php.net/manual/en/intl.constants.php + * + * @return int + */ + public function getAsciiIDNAOption(): int + { + return $this->asciiIDNAOption; + } + + /** + * Set IDNA_* options for functions idn_to_utf8. + * + * @see https://www.php.net/manual/en/intl.constants.php + * + * @return int + */ + public function getUnicodeIDNAOption(): int + { + return $this->unicodeIDNAOption; + } + /** * Determines the public suffix for a given domain. * diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 65772fda..3444715d 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -176,6 +176,30 @@ public function getModifiedDate(): DateTimeImmutable return $this->modifiedDate; } + /** + * Set IDNA_* options for functions idn_to_ascii. + * + * @see https://www.php.net/manual/en/intl.constants.php + * + * @return int + */ + public function getAsciiIDNAOption(): int + { + return $this->asciiIDNAOption; + } + + /** + * Set IDNA_* options for functions idn_to_utf8. + * + * @see https://www.php.net/manual/en/intl.constants.php + * + * @return int + */ + public function getUnicodeIDNAOption(): int + { + return $this->unicodeIDNAOption; + } + /** * {@inheritdoc} */ diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 4bb4ed0a..b59c92ff 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -644,6 +644,10 @@ public function testPublicSuffixSpec() $this->checkPublicSuffix('xn--fiqs8s', null); } + /** + * @covers ::getAsciiIDNAOption + * @covers ::getUnicodeIDNAOption + */ public function testResolveWithIDNAOptions() { $resolvedByDefault = $this->rules->resolve('foo.de', Rules::ICANN_DOMAINS); @@ -655,7 +659,7 @@ public function testResolveWithIDNAOptions() $rules = $manager->getRules(Manager::PSL_URL, null, 16, 32); $resolved = $rules->resolve('foo.de', Rules::ICANN_DOMAINS); self::assertSame( - [16, 32], + [$rules->getAsciiIDNAOption(), $rules->getUnicodeIDNAOption()], [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption()] ); } diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index 30926b0b..23ceb12c 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -95,12 +95,21 @@ public function testGetterProperties() } /** + * @covers ::getAsciiIDNAOption + * @covers ::getUnicodeIDNAOption * @covers ::withIDNAOptions */ public function testwithIDNAOptions() { - self::assertSame($this->collection, $this->collection->withIDNAOptions(IDNA_DEFAULT, IDNA_DEFAULT)); - self::assertNotEquals($this->collection, $this->collection->withIDNAOptions(IDNA_DEFAULT, 128)); + self::assertSame($this->collection, $this->collection->withIDNAOptions( + $this->collection->getAsciiIDNAOption(), + $this->collection->getUnicodeIDNAOption() + )); + + self::assertNotEquals($this->collection, $this->collection->withIDNAOptions( + $this->collection->getAsciiIDNAOption(), + 128 + )); } /** From ff2bf3673e243b734f16788928ff22d1355b1063 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 11 Apr 2019 07:17:51 +0200 Subject: [PATCH 151/461] IDNA options alternate setters --- src/Domain.php | 28 ++++++++++++++++++++++------ src/PublicSuffix.php | 26 ++++++++++++++++++++++---- src/Rules.php | 32 ++++++++++++++++++++++++++------ src/TopLevelDomains.php | 30 ++++++++++++++++++++++++------ tests/DomainTest.php | 20 +++++++++++++++++--- tests/PublicSuffixTest.php | 20 +++++++++++++++++--- tests/RulesTest.php | 23 +++++++++++++++++++---- tests/TopLevelDomainsTest.php | 17 ++++++++++++----- 8 files changed, 159 insertions(+), 37 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 051dffee..1fec328e 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -771,22 +771,38 @@ public function withoutLabel(int $key, int ...$keys): self } /** - * Set IDNA_* options for functions idn_to_ascii, idn_to_utf8. + * Set IDNA_* options for idn_to_ascii. + * * @see https://www.php.net/manual/en/intl.constants.php * * @param int $asciiIDNAOption + * + * @return self + */ + public function withAsciiIDNAOption(int $asciiIDNAOption): self + { + if ($asciiIDNAOption === $this->asciiIDNAOption) { + return $this; + } + + return new self($this->domain, $this->publicSuffix, $asciiIDNAOption, $this->unicodeIDNAOption); + } + + /** + * Set IDNA_* options for idn_to_utf8. + * + * @see https://www.php.net/manual/en/intl.constants.php + * * @param int $unicodeIDNAOption * * @return self */ - public function withIDNAOptions(int $asciiIDNAOption, int $unicodeIDNAOption): self + public function withUnicodeIDNAOption(int $unicodeIDNAOption): self { - if ($asciiIDNAOption === $this->asciiIDNAOption - && $unicodeIDNAOption === $this->unicodeIDNAOption - ) { + if ($unicodeIDNAOption === $this->unicodeIDNAOption) { return $this; } - return new self($this->domain, $this->publicSuffix, $asciiIDNAOption, $unicodeIDNAOption); + return new self($this->domain, $this->publicSuffix, $this->asciiIDNAOption, $unicodeIDNAOption); } } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index fc350ebb..c4567313 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -359,20 +359,38 @@ public function toUnicode() } /** - * Set IDNA_* options for functions idn_to_ascii, idn_to_utf8. + * Set IDNA_* options for idn_to_ascii. + * * @see https://www.php.net/manual/en/intl.constants.php * * @param int $asciiIDNAOption + * + * @return self + */ + public function withAsciiIDNAOption(int $asciiIDNAOption): self + { + if ($asciiIDNAOption === $this->asciiIDNAOption) { + return $this; + } + + return new self($this->publicSuffix, $this->section, $asciiIDNAOption, $this->unicodeIDNAOption); + } + + /** + * Set IDNA_* options for idn_to_utf8. + * + * @see https://www.php.net/manual/en/intl.constants.php + * * @param int $unicodeIDNAOption * * @return self */ - public function withIDNAOptions(int $asciiIDNAOption, int $unicodeIDNAOption): self + public function withUnicodeIDNAOption(int $unicodeIDNAOption): self { - if ($asciiIDNAOption === $this->asciiIDNAOption && $unicodeIDNAOption === $this->unicodeIDNAOption) { + if ($unicodeIDNAOption === $this->unicodeIDNAOption) { return $this; } - return new self($this->publicSuffix, $this->section, $asciiIDNAOption, $unicodeIDNAOption); + return new self($this->publicSuffix, $this->section, $this->asciiIDNAOption, $unicodeIDNAOption); } } diff --git a/src/Rules.php b/src/Rules.php index 2a41873f..8443ac2d 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -310,22 +310,42 @@ private function findPublicSuffixFromSection(DomainInterface $domain, string $se } /** - * Set IDNA_* options for functions idn_to_ascii, idn_to_utf8. + * Set IDNA_* options for idn_to_ascii. + * * @see https://www.php.net/manual/en/intl.constants.php * * @param int $asciiIDNAOption - * @param int $unicodeIDNAOption + * + * @return self */ - public function withIDNAOptions(int $asciiIDNAOption, int $unicodeIDNAOption): self + public function withAsciiIDNAOption(int $asciiIDNAOption): self { - if ($asciiIDNAOption === $this->asciiIDNAOption - && $unicodeIDNAOption === $this->unicodeIDNAOption - ) { + if ($asciiIDNAOption === $this->asciiIDNAOption) { return $this; } $clone = clone $this; $clone->asciiIDNAOption = $asciiIDNAOption; + + return $clone; + } + + /** + * Set IDNA_* options for idn_to_utf8. + * + * @see https://www.php.net/manual/en/intl.constants.php + * + * @param int $unicodeIDNAOption + * + * @return self + */ + public function withUnicodeIDNAOption(int $unicodeIDNAOption): self + { + if ($unicodeIDNAOption === $this->unicodeIDNAOption) { + return $this; + } + + $clone = clone $this; $clone->unicodeIDNAOption = $unicodeIDNAOption; return $clone; diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 3444715d..22adc343 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -311,24 +311,42 @@ public function resolve($domain): Domain } /** - * Set IDNA_* options for functions idn_to_ascii, idn_to_utf8. + * Set IDNA_* options for idn_to_ascii. + * * @see https://www.php.net/manual/en/intl.constants.php * * @param int $asciiIDNAOption - * @param int $unicodeIDNAOption * * @return self */ - public function withIDNAOptions(int $asciiIDNAOption, int $unicodeIDNAOption): self + public function withAsciiIDNAOption(int $asciiIDNAOption): self { - if ($asciiIDNAOption === $this->asciiIDNAOption - && $unicodeIDNAOption === $this->unicodeIDNAOption - ) { + if ($asciiIDNAOption === $this->asciiIDNAOption) { return $this; } $clone = clone $this; $clone->asciiIDNAOption = $asciiIDNAOption; + + return $clone; + } + + /** + * Set IDNA_* options for idn_to_utf8. + * + * @see https://www.php.net/manual/en/intl.constants.php + * + * @param int $unicodeIDNAOption + * + * @return self + */ + public function withUnicodeIDNAOption(int $unicodeIDNAOption): self + { + if ($unicodeIDNAOption === $this->unicodeIDNAOption) { + return $this; + } + + $clone = clone $this; $clone->unicodeIDNAOption = $unicodeIDNAOption; return $clone; diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 9291eead..e805dc55 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -1167,15 +1167,29 @@ public function transitionalProvider() } /** - * @covers ::withIDNAOptions * @covers ::getAsciiIDNAOption * @covers ::getUnicodeIDNAOption + * @covers ::withAsciiIDNAOption + * @covers ::withUnicodeIDNAOption */ public function testwithIDNAOptions() { $domain = new Domain('example.com', new PublicSuffix('com')); - self::assertSame($domain, $domain->withIDNAOptions($domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption())); - self::assertNotEquals($domain, $domain->withIDNAOptions($domain->getAsciiIDNAOption(), 128)); + self::assertSame($domain, $domain->withAsciiIDNAOption( + $domain->getAsciiIDNAOption() + )); + + self::assertNotEquals($domain, $domain->withAsciiIDNAOption( + 128 + )); + + self::assertSame($domain, $domain->withUnicodeIDNAOption( + $domain->getUnicodeIDNAOption() + )); + + self::assertNotEquals($domain, $domain->withUnicodeIDNAOption( + 128 + )); } } diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 32519b6f..ac81b983 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -353,15 +353,29 @@ public function transitionalProvider() } /** - * @covers ::withIDNAOptions * @covers ::getAsciiIDNAOption * @covers ::getUnicodeIDNAOption + * @covers ::withAsciiIDNAOption + * @covers ::withUnicodeIDNAOption */ public function testwithIDNAOptions() { $publicSuffix = new PublicSuffix('com'); - self::assertSame($publicSuffix, $publicSuffix->withIDNAOptions($publicSuffix->getAsciiIDNAOption(), $publicSuffix->getUnicodeIDNAOption())); - self::assertNotEquals($publicSuffix, $publicSuffix->withIDNAOptions($publicSuffix->getAsciiIDNAOption(), 128)); + self::assertSame($publicSuffix, $publicSuffix->withAsciiIDNAOption( + $publicSuffix->getAsciiIDNAOption() + )); + + self::assertNotEquals($publicSuffix, $publicSuffix->withAsciiIDNAOption( + 128 + )); + + self::assertSame($publicSuffix, $publicSuffix->withUnicodeIDNAOption( + $publicSuffix->getUnicodeIDNAOption() + )); + + self::assertNotEquals($publicSuffix, $publicSuffix->withUnicodeIDNAOption( + 128 + )); } } diff --git a/tests/RulesTest.php b/tests/RulesTest.php index b59c92ff..cd699026 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -26,7 +26,6 @@ use Pdp\Rules; use PHPUnit\Framework\TestCase; use TypeError; -use const IDNA_DEFAULT; /** * @coversDefaultClass Pdp\Rules @@ -81,12 +80,28 @@ public function testDomainInternalPhpMethod() } /** - * @covers ::withIDNAOptions + * @covers ::getAsciiIDNAOption + * @covers ::getUnicodeIDNAOption + * @covers ::withAsciiIDNAOption + * @covers ::withUnicodeIDNAOption */ public function testwithIDNAOptions() { - self::assertSame($this->rules, $this->rules->withIDNAOptions(IDNA_DEFAULT, IDNA_DEFAULT)); - self::assertNotEquals($this->rules, $this->rules->withIDNAOptions(IDNA_DEFAULT, 128)); + self::assertSame($this->rules, $this->rules->withAsciiIDNAOption( + $this->rules->getAsciiIDNAOption() + )); + + self::assertNotEquals($this->rules, $this->rules->withAsciiIDNAOption( + 128 + )); + + self::assertSame($this->rules, $this->rules->withUnicodeIDNAOption( + $this->rules->getUnicodeIDNAOption() + )); + + self::assertNotEquals($this->rules, $this->rules->withUnicodeIDNAOption( + 128 + )); } /** diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index 23ceb12c..57ab00d5 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -97,17 +97,24 @@ public function testGetterProperties() /** * @covers ::getAsciiIDNAOption * @covers ::getUnicodeIDNAOption - * @covers ::withIDNAOptions + * @covers ::withAsciiIDNAOption + * @covers ::withUnicodeIDNAOption */ public function testwithIDNAOptions() { - self::assertSame($this->collection, $this->collection->withIDNAOptions( - $this->collection->getAsciiIDNAOption(), + self::assertSame($this->collection, $this->collection->withAsciiIDNAOption( + $this->collection->getAsciiIDNAOption() + )); + + self::assertNotEquals($this->collection, $this->collection->withAsciiIDNAOption( + 128 + )); + + self::assertSame($this->collection, $this->collection->withUnicodeIDNAOption( $this->collection->getUnicodeIDNAOption() )); - self::assertNotEquals($this->collection, $this->collection->withIDNAOptions( - $this->collection->getAsciiIDNAOption(), + self::assertNotEquals($this->collection, $this->collection->withUnicodeIDNAOption( 128 )); } From d2e0d8851fc7d74b1ac3594abba825107caa2a18 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 11 Apr 2019 17:49:38 +0200 Subject: [PATCH 152/461] Improve IDNAOptions test suite --- src/TLDConverter.php | 1 + tests/DomainTest.php | 21 ++++++++++++++++----- tests/PublicSuffixTest.php | 10 ++++++---- tests/RulesTest.php | 16 ++++++++++++---- tests/TopLevelDomainsTest.php | 22 +++++++++++++++++++--- 5 files changed, 54 insertions(+), 16 deletions(-) diff --git a/src/TLDConverter.php b/src/TLDConverter.php index 99d4b14c..2bd2660f 100644 --- a/src/TLDConverter.php +++ b/src/TLDConverter.php @@ -24,6 +24,7 @@ use function strpos; use function trim; use const DATE_ATOM; +use const IDNA_DEFAULT; /** * IANA Root Zone Database Parser. diff --git a/tests/DomainTest.php b/tests/DomainTest.php index e805dc55..f760d805 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -26,6 +26,8 @@ use PHPUnit\Framework\TestCase; use TypeError; use function date_create; +use const IDNA_NONTRANSITIONAL_TO_ASCII; +use const IDNA_NONTRANSITIONAL_TO_UNICODE; /** * @coversDefaultClass Pdp\Domain @@ -691,7 +693,7 @@ public function withPublicSuffixWorksProvider() 'isPrivate' => false, ], 'with custom IDNA domain options' =>[ - 'domain' => new Domain('www.bébé.be', new PublicSuffix('be', Rules::ICANN_DOMAINS), 16, 32), + 'domain' => new Domain('www.bébé.be', new PublicSuffix('be', Rules::ICANN_DOMAINS), IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE), 'publicSuffix' => null, 'expected' => null, 'isKnown' => false, @@ -1002,7 +1004,10 @@ public function testwithoutLabelWorksWithMultipleKeys() public function testConstructWithCustomIDNAOptions() { $domain = new Domain('example.com', null, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); - self::assertSame([16, 32], [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()]); + self::assertSame( + [IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE], + [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()] + ); } /** @@ -1094,7 +1099,13 @@ public function resolveCustomIDNAOptionsProvider() public function testInstanceCreationWithCustomIDNAOptions() { - $domain = new Domain('example.com', new PublicSuffix('com'), 16, 32); + $domain = new Domain( + 'example.com', + new PublicSuffix('com'), + IDNA_NONTRANSITIONAL_TO_ASCII, + IDNA_NONTRANSITIONAL_TO_UNICODE + ); + $instance = $domain->toAscii(); self::assertSame( [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], @@ -1181,7 +1192,7 @@ public function testwithIDNAOptions() )); self::assertNotEquals($domain, $domain->withAsciiIDNAOption( - 128 + IDNA_NONTRANSITIONAL_TO_ASCII )); self::assertSame($domain, $domain->withUnicodeIDNAOption( @@ -1189,7 +1200,7 @@ public function testwithIDNAOptions() )); self::assertNotEquals($domain, $domain->withUnicodeIDNAOption( - 128 + IDNA_NONTRANSITIONAL_TO_UNICODE )); } } diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index ac81b983..851a6dad 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -21,6 +21,8 @@ use Pdp\PublicSuffix; use Pdp\Rules; use PHPUnit\Framework\TestCase; +use const IDNA_NONTRANSITIONAL_TO_ASCII; +use const IDNA_NONTRANSITIONAL_TO_UNICODE; /** * @coversDefaultClass Pdp\PublicSuffix @@ -263,7 +265,7 @@ public function createFromDomainProvider() 'expected' => null, ], [ - 'domain' => new Domain('www.bébé.be', new PublicSuffix('be', Rules::ICANN_DOMAINS), 16, 32), + 'domain' => new Domain('www.bébé.be', new PublicSuffix('be', Rules::ICANN_DOMAINS), IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE), 'expected' => 'be', ], ]; @@ -285,7 +287,7 @@ public function testResolveWithCustomIDNAOptions( string $expectedAscii, string $expectedUnicode ) { - $publicSuffix = new PublicSuffix($name, '', 16, 32); + $publicSuffix = new PublicSuffix($name, '', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); self::assertSame($expectedContent, $publicSuffix->getContent()); self::assertSame($expectedAscii, $publicSuffix->toAscii()->getContent()); self::assertSame($expectedUnicode, $publicSuffix->toUnicode()->getContent()); @@ -367,7 +369,7 @@ public function testwithIDNAOptions() )); self::assertNotEquals($publicSuffix, $publicSuffix->withAsciiIDNAOption( - 128 + IDNA_NONTRANSITIONAL_TO_ASCII )); self::assertSame($publicSuffix, $publicSuffix->withUnicodeIDNAOption( @@ -375,7 +377,7 @@ public function testwithIDNAOptions() )); self::assertNotEquals($publicSuffix, $publicSuffix->withUnicodeIDNAOption( - 128 + IDNA_NONTRANSITIONAL_TO_UNICODE )); } } diff --git a/tests/RulesTest.php b/tests/RulesTest.php index cd699026..4b288b27 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -26,6 +26,9 @@ use Pdp\Rules; use PHPUnit\Framework\TestCase; use TypeError; +use const IDNA_DEFAULT; +use const IDNA_NONTRANSITIONAL_TO_ASCII; +use const IDNA_NONTRANSITIONAL_TO_UNICODE; /** * @coversDefaultClass Pdp\Rules @@ -92,7 +95,7 @@ public function testwithIDNAOptions() )); self::assertNotEquals($this->rules, $this->rules->withAsciiIDNAOption( - 128 + IDNA_NONTRANSITIONAL_TO_ASCII )); self::assertSame($this->rules, $this->rules->withUnicodeIDNAOption( @@ -100,7 +103,7 @@ public function testwithIDNAOptions() )); self::assertNotEquals($this->rules, $this->rules->withUnicodeIDNAOption( - 128 + IDNA_NONTRANSITIONAL_TO_UNICODE )); } @@ -667,11 +670,16 @@ public function testResolveWithIDNAOptions() { $resolvedByDefault = $this->rules->resolve('foo.de', Rules::ICANN_DOMAINS); self::assertSame( - [0, 0], + [IDNA_DEFAULT, IDNA_DEFAULT], [$resolvedByDefault->getAsciiIDNAOption(), $resolvedByDefault->getUnicodeIDNAOption()] ); $manager = new Manager(new Cache(), new CurlHttpClient()); - $rules = $manager->getRules(Manager::PSL_URL, null, 16, 32); + $rules = $manager->getRules( + Manager::PSL_URL, + null, + IDNA_NONTRANSITIONAL_TO_ASCII, + IDNA_NONTRANSITIONAL_TO_UNICODE + ); $resolved = $rules->resolve('foo.de', Rules::ICANN_DOMAINS); self::assertSame( [$rules->getAsciiIDNAOption(), $rules->getUnicodeIDNAOption()], diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index 57ab00d5..ad2c9a2c 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -24,6 +24,9 @@ use Pdp\TopLevelDomains; use PHPUnit\Framework\TestCase; use TypeError; +use const IDNA_DEFAULT; +use const IDNA_NONTRANSITIONAL_TO_ASCII; +use const IDNA_NONTRANSITIONAL_TO_UNICODE; /** * @coversDefaultClass Pdp\TopLevelDomains @@ -177,10 +180,23 @@ public function testResolveWithUnregisteredTLD() public function testResolveWithIDNAOptions() { $resolved = $this->collection->resolve('foo.de'); - self::assertSame([0, 0], [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption()]); - $collection = TopLevelDomains::createFromPath(__DIR__.'/data/root_zones.dat', null, 16, 32); + self::assertSame( + [IDNA_DEFAULT, IDNA_DEFAULT], + [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption(), + ] + ); + + $collection = TopLevelDomains::createFromPath( + __DIR__.'/data/root_zones.dat', + null, + IDNA_NONTRANSITIONAL_TO_ASCII, + IDNA_NONTRANSITIONAL_TO_UNICODE + ); $resolved = $collection->resolve('foo.de'); - self::assertSame([16, 32], [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption()]); + self::assertSame( + [IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE], + [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption()] + ); } /** * @dataProvider validTldProvider From 4358200c335445b3735a8a48674f45c05f334e69 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 11 Apr 2019 18:10:17 +0200 Subject: [PATCH 153/461] Improve docblock --- src/Domain.php | 36 ++++++++++++++++++++++-------------- src/PublicSuffix.php | 34 +++++++++++++++++++++------------- src/Rules.php | 22 ++++++++++++++++------ src/TopLevelDomains.php | 32 ++++++++++++++++++++------------ 4 files changed, 79 insertions(+), 45 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 1fec328e..e8b4135a 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -328,7 +328,9 @@ public function keys(string $label): array } /** - * Set IDNA_* options for functions idn_to_ascii. + * Gets conversion options for idn_to_ascii. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php * @@ -340,7 +342,9 @@ public function getAsciiIDNAOption(): int } /** - * Set IDNA_* options for functions idn_to_utf8. + * Gets conversion options for idn_to_utf8. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php * @@ -352,7 +356,7 @@ public function getUnicodeIDNAOption(): int } /** - * return true if domain contains deviation characters. + * Returns true if domain contains deviation characters. * * @see http://unicode.org/reports/tr46/#Transition_Considerations * @@ -769,40 +773,44 @@ public function withoutLabel(int $key, int ...$keys): self return new self($domain, $this->publicSuffix, $this->asciiIDNAOption, $this->unicodeIDNAOption); } - + /** - * Set IDNA_* options for idn_to_ascii. + * Sets conversion options for idn_to_ascii. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php * - * @param int $asciiIDNAOption + * @param int $option * * @return self */ - public function withAsciiIDNAOption(int $asciiIDNAOption): self + public function withAsciiIDNAOption(int $option): self { - if ($asciiIDNAOption === $this->asciiIDNAOption) { + if ($option === $this->asciiIDNAOption) { return $this; } - return new self($this->domain, $this->publicSuffix, $asciiIDNAOption, $this->unicodeIDNAOption); + return new self($this->domain, $this->publicSuffix, $option, $this->unicodeIDNAOption); } /** - * Set IDNA_* options for idn_to_utf8. + * Sets conversion options for idn_to_utf8. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php * - * @param int $unicodeIDNAOption + * @param int $option * * @return self */ - public function withUnicodeIDNAOption(int $unicodeIDNAOption): self + public function withUnicodeIDNAOption(int $option): self { - if ($unicodeIDNAOption === $this->unicodeIDNAOption) { + if ($option === $this->unicodeIDNAOption) { return $this; } - return new self($this->domain, $this->publicSuffix, $this->asciiIDNAOption, $unicodeIDNAOption); + return new self($this->domain, $this->publicSuffix, $this->asciiIDNAOption, $option); } } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index c4567313..af433ea3 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -256,7 +256,9 @@ public function keys(string $label): array } /** - * Set IDNA_* options for functions idn_to_ascii. + * Gets conversion options for idn_to_ascii. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php * @@ -268,7 +270,9 @@ public function getAsciiIDNAOption(): int } /** - * Set IDNA_* options for functions idn_to_utf8. + * Gets conversion options for idn_to_utf8. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php * @@ -280,7 +284,7 @@ public function getUnicodeIDNAOption(): int } /** - * return true if domain contains deviation characters. + * Returns true if domain contains deviation characters. * * @see http://unicode.org/reports/tr46/#Transition_Considerations * @@ -359,38 +363,42 @@ public function toUnicode() } /** - * Set IDNA_* options for idn_to_ascii. + * Sets conversion options for idn_to_ascii. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php * - * @param int $asciiIDNAOption + * @param int $option * * @return self */ - public function withAsciiIDNAOption(int $asciiIDNAOption): self + public function withAsciiIDNAOption(int $option): self { - if ($asciiIDNAOption === $this->asciiIDNAOption) { + if ($option === $this->asciiIDNAOption) { return $this; } - return new self($this->publicSuffix, $this->section, $asciiIDNAOption, $this->unicodeIDNAOption); + return new self($this->publicSuffix, $this->section, $option, $this->unicodeIDNAOption); } /** - * Set IDNA_* options for idn_to_utf8. + * Sets conversion options for idn_to_utf8. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php * - * @param int $unicodeIDNAOption + * @param int $option * * @return self */ - public function withUnicodeIDNAOption(int $unicodeIDNAOption): self + public function withUnicodeIDNAOption(int $option): self { - if ($unicodeIDNAOption === $this->unicodeIDNAOption) { + if ($option === $this->unicodeIDNAOption) { return $this; } - return new self($this->publicSuffix, $this->section, $this->asciiIDNAOption, $unicodeIDNAOption); + return new self($this->publicSuffix, $this->section, $this->asciiIDNAOption, $option); } } diff --git a/src/Rules.php b/src/Rules.php index 8443ac2d..50a2aa23 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -144,7 +144,9 @@ public static function __set_state(array $properties): self } /** - * Set IDNA_* options for functions idn_to_ascii. + * Gets conversion options for idn_to_ascii. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php * @@ -156,7 +158,9 @@ public function getAsciiIDNAOption(): int } /** - * Set IDNA_* options for functions idn_to_utf8. + * Gets conversion options for idn_to_utf8. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php * @@ -193,8 +197,10 @@ public function getPublicSuffix($domain, string $section = self::ALL_DOMAINS): P /** * Returns PSL info for a given domain. - * @param mixed $domain - * @param string $section + * + * @param mixed $domain + * @param string $section + * * @return Domain */ public function resolve($domain, string $section = self::ALL_DOMAINS): Domain @@ -310,7 +316,9 @@ private function findPublicSuffixFromSection(DomainInterface $domain, string $se } /** - * Set IDNA_* options for idn_to_ascii. + * Sets conversion options for idn_to_ascii. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php * @@ -331,7 +339,9 @@ public function withAsciiIDNAOption(int $asciiIDNAOption): self } /** - * Set IDNA_* options for idn_to_utf8. + * Sets conversion options for idn_to_utf8. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php * diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 22adc343..121d93b3 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -177,7 +177,9 @@ public function getModifiedDate(): DateTimeImmutable } /** - * Set IDNA_* options for functions idn_to_ascii. + * Gets conversion options for idn_to_ascii. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php * @@ -189,7 +191,9 @@ public function getAsciiIDNAOption(): int } /** - * Set IDNA_* options for functions idn_to_utf8. + * Gets conversion options for idn_to_utf8. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php * @@ -311,43 +315,47 @@ public function resolve($domain): Domain } /** - * Set IDNA_* options for idn_to_ascii. + * Sets conversion options for idn_to_ascii. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php * - * @param int $asciiIDNAOption + * @param int $option * * @return self */ - public function withAsciiIDNAOption(int $asciiIDNAOption): self + public function withAsciiIDNAOption(int $option): self { - if ($asciiIDNAOption === $this->asciiIDNAOption) { + if ($option === $this->asciiIDNAOption) { return $this; } $clone = clone $this; - $clone->asciiIDNAOption = $asciiIDNAOption; + $clone->asciiIDNAOption = $option; return $clone; } /** - * Set IDNA_* options for idn_to_utf8. + * Sets conversion options for idn_to_utf8. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php * - * @param int $unicodeIDNAOption + * @param int $option * * @return self */ - public function withUnicodeIDNAOption(int $unicodeIDNAOption): self + public function withUnicodeIDNAOption(int $option): self { - if ($unicodeIDNAOption === $this->unicodeIDNAOption) { + if ($option === $this->unicodeIDNAOption) { return $this; } $clone = clone $this; - $clone->unicodeIDNAOption = $unicodeIDNAOption; + $clone->unicodeIDNAOption = $option; return $clone; } From 969bfe38067f106b2b8e8ca76394f766d7cb8b7d Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 11 Apr 2019 18:51:45 +0200 Subject: [PATCH 154/461] Update travis settings --- .travis.yml | 50 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 24c3553a..902cd0d6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,19 +2,50 @@ language: php sudo: false +cache: + directories: + - $HOME/.composer/cache + +env: + global: + - COMPOSER_ARGS="--no-interaction --prefer-source --no-suggest" + matrix: include: - php: 7.0 - env: VALIDATE_CODING_STYLE=false RUN_PHPSTAN=false IGNORE_PLATFORMS=false + env: + - VALIDATE_CODING_STYLE=false + - RUN_PHPSTAN=false + - IGNORE_PLATFORMS=false - php: 7.1 - env: VALIDATE_CODING_STYLE=false RUN_PHPSTAN=false IGNORE_PLATFORMS=false + env: + - VALIDATE_CODING_STYLE=false + - RUN_PHPSTAN=false + - IGNORE_PLATFORMS=false - php: 7.2 - env: VALIDATE_CODING_STYLE=true RUN_PHPSTAN=true IGNORE_PLATFORMS=false + env: + - VALIDATE_CODING_STYLE=true + - RUN_PHPSTAN=true + - IGNORE_PLATFORMS=false - php: 7.3 - env: VALIDATE_CODING_STYLE=false RUN_PHPSTAN=false IGNORE_PLATFORMS=true + env: + - VALIDATE_CODING_STYLE=false + - RUN_PHPSTAN=false + - IGNORE_PLATFORMS=true + - php: 7.4snapshot + env: + - COLLECT_COVERAGE=false + - VALIDATE_CODING_STYLE=false + - RUN_PHPSTAN=false + - IGNORE_PLATFORMS=true - php: nightly - env: VALIDATE_CODING_STYLE=false RUN_PHPSTAN=false IGNORE_PLATFORMS=true + env: + - COLLECT_COVERAGE=false + - IGNORE_PLATFORMS=true + - RUN_PHPSTAN=true + - VALIDATE_CODING_STYLE=false allow_failures: + - php: 7.4snapshot - php: nightly fast_finish: true @@ -26,12 +57,13 @@ before_install: - travis_retry composer self-update install: - - if [ "$IGNORE_PLATFORMS" == "true" ]; then travis_retry composer update --no-interaction --prefer-source --ignore-platform-reqs; fi - - if [ "$IGNORE_PLATFORMS" == "false" ]; then travis_retry composer update --no-interaction --prefer-source; fi + - if [ "$IGNORE_PLATFORMS" == "true" ]; then travis_retry composer update $COMPOSER_ARGS --ignore-platform-reqs; fi + - if [ "$IGNORE_PLATFORMS" == "false" ]; then travis_retry composer update $COMPOSER_ARGS; fi script: + - if [ "$RUN_PHPSTAN" == "true" ]; then composer phpstan; fi + - if [ "$VALIDATE_CODING_STYLE" == "true" ]; then composer phpcs; fi - composer phpunit after_script: - - if [ "$VALIDATE_CODING_STYLE" == "true" ]; then composer phpcs; fi - - if [ "$RUN_PHPSTAN" == "true" ]; then composer phpstan; fi \ No newline at end of file + - if [ "$COLLECT_COVERAGE" == "true" ]; then wget https://scrutinizer-ci.com/ocular.phar && php ocular.phar code-coverage:upload --format=php-clover build/clover.xml; fi \ No newline at end of file From f81bfe906c3330e0ab959d2dc1b2aad193414f19 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 12 Apr 2019 07:14:36 +0200 Subject: [PATCH 155/461] update CHANGELOG --- CHANGELOG.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f861ea26..39f3c9f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,11 +6,13 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in ### Added -- Support for IDNA_OPTIONS settings in all the classes see [#236](https://github.com/jeremykendall/php-domain-parser/pull/236) thanks to [Insolita](https://github.com/Insolita) +- Support for `IDNA_OPTIONS` settings in all the classes see [#236](https://github.com/jeremykendall/php-domain-parser/pull/236) thanks to [Insolita](https://github.com/Insolita) +- `PublicSuffix::labels` and `Domain::labels` to return the VO labels see [#241](https://github.com/jeremykendall/php-domain-parser/pull/241) ### Fixed -- Don't swallow cache errors [#232](https://github.com/jeremykendall/php-domain-parser/issues/232) +- Don't swallow cache errors [#232](https://github.com/jeremykendall/php-domain-parser/issues/232) +- Update travis settings to allow testing against future version of PHP. ### Deprecated From 74b92932608ef65250b6231ce96fd335ca5b1041 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 12 Apr 2019 07:56:24 +0200 Subject: [PATCH 156/461] Update documentation for 5.5 release --- CHANGELOG.md | 3 +- README.md | 96 ++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 83 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 39f3c9f4..527eb406 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,8 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in ### Added -- Support for `IDNA_OPTIONS` settings in all the classes see [#236](https://github.com/jeremykendall/php-domain-parser/pull/236) thanks to [Insolita](https://github.com/Insolita) +- Support for IDNA options see [#236](https://github.com/jeremykendall/php-domain-parser/pull/236) thanks to [Insolita](https://github.com/Insolita). + - `PublicSuffix::labels` and `Domain::labels` to return the VO labels see [#241](https://github.com/jeremykendall/php-domain-parser/pull/241) ### Fixed diff --git a/README.md b/README.md index 1d73cae9..a27587f4 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,33 @@ foreach($tldList as $tld) { Using the above code you have parse, validate and resolve a domain name and its public suffix status against the Public Suffix list. +**Starting with vesion 5.5 support for IDNA options is added to the package** + +**Before** + +~~~php +$manager = new Manager(new Cache(), new CurlHttpClient()); +$rules = $manager->getRules(); + +$domain = $rules->resolve('faß.test.de'); +echo $domain->toAscii()->getContent(); // 'fass.test.de' +~~~ + +**After** + +~~~php +$manager = new Manager(new Cache(), new CurlHttpClient()); +$rules = $manager->getRules(Manager::PSL_URL, null, IDNA_NONTRANSITIONAL_TO_ASCII, + IDNA_NONTRANSITIONAL_TO_UNICODE); +// or +// $rules = $rules +// ->withAsciiIDNAOption(IDNA_NONTRANSITIONAL_TO_ASCII) +// ->withUnicodeIDNAOption(IDNA_NONTRANSITIONAL_TO_UNICODE); + +$domain = $rules->resolve('faß.test.de'); +echo $domain->toAscii()->getContent(); // 'xn--fa-hia.test.de' +~~~ + Documentation -------- @@ -135,6 +162,8 @@ public function Domain::append($label): Domain public function Domain::prepend($label): Domain public function Domain::withPublicSuffix($publicSuffix): Domain public function Domain::withSubDomain($subDomain): Domain +public function Domain::withAsciiIDNAOption(int $option): Domain +public function Domain::withUnicodeIDNAOption(int $option): Domain ~~~ ~~~php @@ -162,7 +191,6 @@ Because the `Pdp\Domain` object is immutable: **WARNING: URI and URL accept registered name which encompass domain name. Therefore, some URI host are invalid domain name and will trigger an exception if you try to instantiate a `Pdp\Domain` with them.** - The `Pdp\Domain` object can tell whether a public suffix can be attached to it using the `Pdp\Domain::isResolvable` method. ~~~php @@ -222,11 +250,27 @@ namespace Pdp; final class Rules { - public static function createFromPath(string $path, $context = null): Rules - public static function createFromString(string $content): Rules - public function __construct(array $rules) + public static function createFromPath( + string $path, $context = null, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ): Rules + public static function createFromString( + string $content, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ): Rules + public function __construct( + array $rules, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ): void public function resolve($domain, string $section = ''): Domain public function getPublicSuffix($domain, string $section = ''): PublicSuffix + public function getAsciiIDNAOption(): int + public function getUnicodeIDNAOption(): int + public function withAsciiIDNAOption(int $asciiIDNAOption): Rules + public function withUnicodeIDNAOption(int $unicodeIDNAOption): Rules } ~~~ @@ -304,12 +348,16 @@ namespace Pdp; final class TopLevelDomains implements Countable, IteratorAggregate { - public static function createFromPath(string $path, $context = null): Rules - public static function createFromString(string $content): Rules - public function __construct(array $records, string $version, DateTimeInterface $modifiedDate) + public static function createFromPath(string $path, $context = null, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): Rules + public static function createFromString(string $content, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): Rules + public function __construct(array $records, string $version, DateTimeInterface $modifiedDate, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT) public function resolve($domain): Domain public function contains($domain): bool public function isEmpty(): bool + public function getAsciiIDNAOption(): int + public function getUnicodeIDNAOption(): int + public function withAsciiIDNAOption(int $option): TopLevelDomains + public function withUnicodeIDNAOption(int $option): TopLevelDomains } ~~~ @@ -353,10 +401,6 @@ final class Manager const RZD_URL = 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt'; public function __construct(CacheInterface $cache, HttpClient $http, $ttl = null) - public function getRules(string $source_url = self::PSL_URL, $ttl = null): Rules - public function refreshRules(string $source_url = self::PSL_URL, $ttl = null): bool - public function getTLDs(string $source_url = self::RZD_URL, $ttl = null): Rules - public function refreshTLDs(string $source_url = self::RZD_URL, $ttl = null): bool } ~~~ @@ -376,7 +420,6 @@ The `$ttl` argument can be: **the `$ttl` argument is added to improve PSR-16 interoperability** - The `Pdp\HttpClient` is a simple interface which exposes the `HttpClient::getContent` method. This method expects a string URL representation has its sole argument and returns the body from the given URL resource as a string. If an error occurs while retrieving such body a `HttpClientException` exception is thrown. @@ -414,7 +457,8 @@ public Manager::refreshRules(string $source_url = self::PSL_URL, $ttl = null): b public Manager::refreshTLD(string $source_url = self::RZD_URL, $ttl = null): bool ~~~ -The both methods method enables refreshing your local copy of the stored resources with your [PSR-16](http://www.php-fig.org/psr/psr-16/) Cache and retrieved using the Http Client. By default the method will use the resource default source URL but you are free to substitute this URL with your own. +The both methods method enables refreshing your local copy of the stored resources with your [PSR-16](http://www.php-fig.org/psr/psr-16/) Cache and retrieved using the Http Client. By default the method will use the resource default source URL but you are free to substitute this URL with your own. + The method returns a boolean value which is `true` on success. ~~~php @@ -432,8 +476,19 @@ if ($retval) { ~~~php Date: Fri, 12 Apr 2019 07:58:47 +0200 Subject: [PATCH 157/461] add ::labels documentation --- README.md | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a27587f4..4774076d 100644 --- a/README.md +++ b/README.md @@ -65,12 +65,13 @@ $domain->isResolvable(); // returns true $domain->isKnown(); // returns true $domain->isICANN(); // returns true $domain->isPrivate(); // returns false - +$domain->labels(); // returns ['be', 'ac', 'ulb', 'www'] $publicSuffix = $rules->getPublicSuffix('mydomain.github.io', Rules::PRIVATE_DOMAINS); //$publicSuffix is a Pdp\PublicSuffix object echo $publicSuffix->getContent(); // 'github.io' $publicSuffix->isKnown(); // returns true $publicSuffix->isICANN(); // returns false $publicSuffix->isPrivate(); // returns true +$publicSuffix->labels(); // returns ['io', 'github'] $altSuffix = $rules->getPublicSuffix('mydomain.github.io', Rules::ICANN_DOMAINS); echo $altSuffix->getContent(); // 'io' @@ -142,6 +143,7 @@ $domain->isKnown(); // returns false $domain->isICANN(); // returns false $domain->isPrivate(); // returns false iterator_to_array($domain, false); // ['com', 'example', 'bébé', 'www'] +$domain->labels(); // ['com', 'example', 'bébé', 'www'] since v5.5 $domain->toAscii()->getContent(); // www.xn--bb-bjab.example.com echo (new Domain('www.xn--bb-bjab.example.com'))->toAscii() // www.bébé.example.com ~~~ @@ -348,9 +350,27 @@ namespace Pdp; final class TopLevelDomains implements Countable, IteratorAggregate { - public static function createFromPath(string $path, $context = null, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): Rules - public static function createFromString(string $content, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): Rules - public function __construct(array $records, string $version, DateTimeInterface $modifiedDate, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT) + public static function createFromPath( + string $path, + $context = null, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ): TopLevelDomains + + public static function createFromString( + string $content, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ): TopLevelDomains + + public function __construct( + array $records, + string $version, + DateTimeInterface $modifiedDate, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ) + public function resolve($domain): Domain public function contains($domain): bool public function isEmpty(): bool From 8f8ff928c57bb8b687ef14dcbc1da980c7ef7dbf Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 12 Apr 2019 08:01:39 +0200 Subject: [PATCH 158/461] improve documentation --- README.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 4774076d..7535f5c2 100644 --- a/README.md +++ b/README.md @@ -106,12 +106,18 @@ echo $domain->toAscii()->getContent(); // 'fass.test.de' ~~~php $manager = new Manager(new Cache(), new CurlHttpClient()); -$rules = $manager->getRules(Manager::PSL_URL, null, IDNA_NONTRANSITIONAL_TO_ASCII, - IDNA_NONTRANSITIONAL_TO_UNICODE); +$rules = $manager->getRules() + ->withAsciiIDNAOption(IDNA_NONTRANSITIONAL_TO_ASCII) + ->withUnicodeIDNAOption(IDNA_NONTRANSITIONAL_TO_UNICODE); + // or -// $rules = $rules -// ->withAsciiIDNAOption(IDNA_NONTRANSITIONAL_TO_ASCII) -// ->withUnicodeIDNAOption(IDNA_NONTRANSITIONAL_TO_UNICODE); +// +// $rules = $manager->getRules( +// Manager::PSL_URL, +// null, +// IDNA_NONTRANSITIONAL_TO_ASCII, +// IDNA_NONTRANSITIONAL_TO_UNICODE +// ); $domain = $rules->resolve('faß.test.de'); echo $domain->toAscii()->getContent(); // 'xn--fa-hia.test.de' From 4006e8583d23be8aae54d21da4a6cf3d3c4b8e09 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 12 Apr 2019 23:21:31 +0200 Subject: [PATCH 159/461] correct preg_match usage --- README.md | 66 ++++++++++++++++++++------------------------ src/Cache.php | 3 +- src/Converter.php | 2 +- src/Domain.php | 4 +-- src/TLDConverter.php | 2 +- 5 files changed, 36 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 7535f5c2..6ed4cfc9 100644 --- a/README.md +++ b/README.md @@ -129,8 +129,6 @@ Documentation ### Domain objects ~~~php -labels(); // ['com', 'example', 'bébé', 'www'] since v5.5 $domain->toAscii()->getContent(); // www.xn--bb-bjab.example.com echo (new Domain('www.xn--bb-bjab.example.com'))->toAscii() // www.bébé.example.com +$domain->getAsciiIDNAOption(); // IDNA_DEFAULT +$domain->getUnicodeIDNAOption(); // IDNA_DEFAULT ~~~ The `Pdp\Domain` and `Pdp\PublicSuffix` objects are an immutable value object representing a valid domain name. These objects let's you access the domain properties. @@ -175,8 +175,6 @@ public function Domain::withUnicodeIDNAOption(int $option): Domain ~~~ ~~~php -contains('be'); // resolution is done against the retrieves list - -$domain = $tldCollection->resolve('www.Ulb.Ac.BE'); +$pdp_url = 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt'; +$tlds = TopLevelDomains::createFromPath($pdp_url); +$result = $tlds->contains('be'); // resolution is done against the retrieves list +$domain = json_encode($tlds->resolve('www.Ulb.Ac.BE'), JSON_PRETTY_PRINT); // returns // { // "domain": "www.ulb.ac.be", @@ -477,8 +477,6 @@ The package comes bundle with: #### Refreshing the cached PSL and TLD data ~~~php -getTLDs(self::RZD_URL); $domain = $tldCollection->resolve('www.ulb.ac.be'); diff --git a/src/Cache.php b/src/Cache.php index 6583d89c..2e1593f6 100644 --- a/src/Cache.php +++ b/src/Cache.php @@ -34,6 +34,7 @@ use function is_object; use function is_writable; use function mkdir; +use function preg_match; use function realpath; use function rename; use function sprintf; @@ -315,7 +316,7 @@ private function validateKey($key) throw new CacheException(sprintf('Expected key to be a string; received "%s"', is_object($key) ? get_class($key) : gettype($key))); } - if (preg_match(self::PSR16_RESERVED, $key, $match) === 1) { + if (1 === preg_match(self::PSR16_RESERVED, $key, $match)) { throw new CacheException(sprintf('invalid character in key: %s', $match[0])); } } diff --git a/src/Converter.php b/src/Converter.php index c4c0223e..1e6f4516 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -89,7 +89,7 @@ public function convert(string $content): array */ private function getSection(string $section, string $line): string { - if (preg_match(self::REGEX_PSL_SECTION, $line, $matches)) { + if (1 === preg_match(self::REGEX_PSL_SECTION, $line, $matches)) { return self::PSL_SECTION[$matches['type']][$matches['point']]; } diff --git a/src/Domain.php b/src/Domain.php index d20c86cd..85817854 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -184,7 +184,7 @@ private function normalize(PublicSuffix $subject): PublicSuffix return $subject; } - if (!preg_match(self::REGEXP_IDN_PATTERN, $this->domain)) { + if (1 !== preg_match(self::REGEXP_IDN_PATTERN, $this->domain)) { return $subject->toAscii(); } @@ -637,7 +637,7 @@ private function normalizeContent($domain) return $domain; } - if (preg_match(self::REGEXP_IDN_PATTERN, $this->domain)) { + if (1 === preg_match(self::REGEXP_IDN_PATTERN, $this->domain)) { return $this->idnToUnicode($domain, $this->unicodeIDNAOption); } diff --git a/src/TLDConverter.php b/src/TLDConverter.php index 2bd2660f..5b47dd1c 100644 --- a/src/TLDConverter.php +++ b/src/TLDConverter.php @@ -92,7 +92,7 @@ public function convert( */ private function extractHeader(string $content): array { - if (!preg_match('/^\# Version (?\d+), Last Updated (?.*?)$/', $content, $matches)) { + if (1 !== preg_match('/^\# Version (?\d+), Last Updated (?.*?)$/', $content, $matches)) { throw new CouldNotLoadTLDs(sprintf('Invalid Version line: %s', $content)); } From c537ffe84f2bb90f992c3537bf6bc0984056f92e Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 13 Apr 2019 11:19:06 +0200 Subject: [PATCH 160/461] prepare 5.5.0 release --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 527eb406..4a5d8591 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in this file -# Next -TBD +# 5.5.0 - 2019-04-13 ### Added From 67d676c3bef4f4d705e97a1ad697b93c6f082c62 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 13 Apr 2019 12:03:37 +0200 Subject: [PATCH 161/461] remove IDNA usage in TLD resolution --- src/IDNAConverterTrait.php | 16 ++++++++-------- src/Manager.php | 2 +- src/Rules.php | 2 ++ src/TLDConverter.php | 21 ++++++++------------- src/TopLevelDomains.php | 19 +++++++++++-------- 5 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index a666cee6..5c63ed0e 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -104,15 +104,15 @@ private static function getIdnErrors(int $error_bit): string * * @param string $domain * - * @param int $IDNAOption + * @param int $option * * @throws InvalidDomain if the string can not be converted to ASCII using IDN UTS46 algorithm * * @return string */ - private function idnToAscii(string $domain, int $IDNAOption = IDNA_DEFAULT): string + private function idnToAscii(string $domain, int $option = IDNA_DEFAULT): string { - list($domain, ) = $this->transformToAscii($domain, $IDNAOption); + list($domain, ) = $this->transformToAscii($domain, $option); return $domain; } @@ -122,7 +122,6 @@ private function idnToAscii(string $domain, int $IDNAOption = IDNA_DEFAULT): str * * @param string $domain * - * @param int $IDNAOption * @param int $option * * @throws InvalidDomain if the string can not be converted to ASCII using IDN UTS46 algorithm @@ -163,15 +162,16 @@ private function transformToAscii(string $domain, int $option): array * * @param string $domain * - * @param int $IDNAOption + * @param int $option * - * @throws InvalidDomain if the string can not be converted to UNICODE using IDN UTS46 algorithm + * @throws InvalidDomain if the string can not be converted to UNICODE using IDN UTS46 algorithm + * @throws UnexpectedValueException if the intl extension is misconfigured * * @return string */ - private function idnToUnicode(string $domain, int $IDNAOption = IDNA_DEFAULT): string + private function idnToUnicode(string $domain, int $option = IDNA_DEFAULT): string { - $output = idn_to_utf8($domain, $IDNAOption, INTL_IDNA_VARIANT_UTS46, $arr); + $output = idn_to_utf8($domain, $option, INTL_IDNA_VARIANT_UTS46, $arr); if (0 !== $arr['errors']) { throw new InvalidDomain(sprintf('The host `%s` is invalid : %s', $domain, self::getIdnErrors($arr['errors']))); } diff --git a/src/Manager.php b/src/Manager.php index 972a7699..5cc47e21 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -206,7 +206,7 @@ public function refreshTLDs( static $converter; $converter = $converter ?? new TLDConverter(); - $data = json_encode($converter->convert($this->http->getContent($url), $asciiIDNAOption, $unicodeIDNAOption)); + $data = json_encode($converter->convert($this->http->getContent($url))); return $this->cache->set($this->getCacheKey('RZD', $url), $data, $this->filterTtl($ttl) ?? $this->ttl); } diff --git a/src/Rules.php b/src/Rules.php index 50a2aa23..8c45e6e7 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -87,6 +87,8 @@ public function __construct( * @param int $asciiIDNAOption * @param int $unicodeIDNAOption * + * @throws CouldNotLoadRules If the rules can not be loaded from the path + * * @return self */ public static function createFromPath( diff --git a/src/TLDConverter.php b/src/TLDConverter.php index 5b47dd1c..afdc702d 100644 --- a/src/TLDConverter.php +++ b/src/TLDConverter.php @@ -18,13 +18,11 @@ use DateTimeImmutable; use Pdp\Exception\CouldNotLoadTLDs; use SplTempFileObject; -use function compact; use function preg_match; use function sprintf; use function strpos; use function trim; use const DATE_ATOM; -use const IDNA_DEFAULT; /** * IANA Root Zone Database Parser. @@ -44,16 +42,13 @@ final class TLDConverter * Converts the IANA Root Zone Database into a TopLevelDomains associative array. * * @param string $content - * @param int $asciiIDNAOption - * @param int $unicodeIDNAOption + * + * @throws CouldNotLoadTLDs if the content is invalid or can not be correctly parsed and converted * * @return array */ - public function convert( - string $content, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT - ): array { + public function convert(string $content): array + { $data = []; $file = new SplTempFileObject(); $file->fwrite($content); @@ -61,7 +56,7 @@ public function convert( foreach ($file as $line) { $line = trim($line); if ([] === $data) { - $data = array_merge($this->extractHeader($line), compact('asciiIDNAOption', 'unicodeIDNAOption')); + $data = $this->extractHeader($line); continue; } @@ -75,7 +70,7 @@ public function convert( } if (isset($data['version'], $data['modifiedDate'], $data['records'])) { - return array_merge($data, compact('asciiIDNAOption', 'unicodeIDNAOption')); + return $data; } throw new CouldNotLoadTLDs(sprintf('Invalid content: TLD conversion failed')); @@ -116,8 +111,8 @@ private function extractRootZone(string $content): string { try { $tld = (new PublicSuffix($content))->toAscii(); - } catch (Exception $e) { - throw new CouldNotLoadTLDs(sprintf('Invalid Root zone: %s', $content), 0, $e); + } catch (Exception $exception) { + throw new CouldNotLoadTLDs(sprintf('Invalid Root zone: %s', $content), 0, $exception); } if (1 !== $tld->count() || '' === $tld->getContent()) { diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 121d93b3..29f4925f 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -90,6 +90,8 @@ public function __construct( * @param int $asciiIDNAOption * @param int $unicodeIDNAOption * + * @throws CouldNotLoadTLDs If the rules can not be loaded from the path + * * @return self */ public static function createFromPath( @@ -131,14 +133,14 @@ public static function createFromString( $converter = $converter ?? new TLDConverter(); - $data = $converter->convert($content, $asciiIDNAOption, $unicodeIDNAOption); + $data = $converter->convert($content); return new self( $data['records'], $data['version'], DateTimeImmutable::createFromFormat(DATE_ATOM, $data['modifiedDate']), - $data['asciiIDNAOption'], - $data['unicodeIDNAOption'] + $asciiIDNAOption, + $unicodeIDNAOption ); } @@ -228,9 +230,12 @@ public function isEmpty(): bool public function getIterator() { foreach ($this->records as $tld) { - $publicSuffix = new PublicSuffix($tld, PublicSuffix::ICANN_DOMAINS, $this->asciiIDNAOption, $this->unicodeIDNAOption); - - yield $publicSuffix->toAscii(); + yield (new PublicSuffix( + $tld, + PublicSuffix::ICANN_DOMAINS, + $this->asciiIDNAOption, + $this->unicodeIDNAOption + ))->toAscii(); } } @@ -245,8 +250,6 @@ public function toArray(): array 'version' => $this->version, 'records' => $this->records, 'modifiedDate' => $this->modifiedDate->format(DATE_ATOM), - 'asciiIDNAOption'=>$this->asciiIDNAOption, - 'unicodeIDNAOption'=>$this->unicodeIDNAOption, ]; } From 85d948c84f682fe39e7fa75a0d89d726ec611bd5 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 13 Apr 2019 13:19:36 +0200 Subject: [PATCH 162/461] Reduce call to intl extension --- src/Domain.php | 30 +++++++++++++------------- src/IDNAConverterTrait.php | 42 ++++++++++++++++++------------------- src/PublicSuffix.php | 43 +++++++++++++++++++------------------- tests/DomainTest.php | 14 ++++++------- 4 files changed, 64 insertions(+), 65 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 85817854..2852337a 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -99,19 +99,6 @@ final class Domain implements DomainInterface, JsonSerializable */ private $isTransitionalDifferent; - /** - * {@inheritdoc} - */ - public static function __set_state(array $properties): self - { - return new self( - $properties['domain'], - $properties['publicSuffix'], - $properties['asciiIDNAOption'] ?? IDNA_DEFAULT, - $properties['unicodeIDNAOption'] ?? IDNA_DEFAULT - ); - } - /** * New instance. * @param null|mixed $domain @@ -127,8 +114,7 @@ public function __construct( ) { $this->asciiIDNAOption = $asciiIDNAOption; $this->unicodeIDNAOption = $unicodeIDNAOption; - $this->labels = $this->setLabels($domain, $asciiIDNAOption, $unicodeIDNAOption); - $this->isTransitionalDifferent = $this->hasTransitionalDifference($domain); + [$this->labels, $infos] = $this->setLabels($domain, $asciiIDNAOption, $unicodeIDNAOption); if ([] !== $this->labels) { $this->domain = implode('.', array_reverse($this->labels)); } @@ -137,6 +123,20 @@ public function __construct( ); $this->registrableDomain = $this->setRegistrableDomain(); $this->subDomain = $this->setSubDomain(); + $this->isTransitionalDifferent = $infos['isTransitionalDifferent']; + } + + /** + * {@inheritdoc} + */ + public static function __set_state(array $properties): self + { + return new self( + $properties['domain'], + $properties['publicSuffix'], + $properties['asciiIDNAOption'] ?? IDNA_DEFAULT, + $properties['unicodeIDNAOption'] ?? IDNA_DEFAULT + ); } /** diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index 5c63ed0e..0ce8cf7f 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -25,7 +25,6 @@ use function idn_to_utf8; use function implode; use function is_scalar; -use function is_string; use function method_exists; use function preg_match; use function rawurldecode; @@ -135,7 +134,7 @@ private function transformToAscii(string $domain, int $option): array static $pattern = '/[^\x20-\x7f]/'; if (1 !== preg_match($pattern, $domain)) { - return [strtolower($domain), false]; + return [strtolower($domain), ['isTransitionalDifferent' => false]]; } $output = idn_to_ascii($domain, $option, INTL_IDNA_VARIANT_UTS46, $info); @@ -150,7 +149,7 @@ private function transformToAscii(string $domain, int $option): array // @codeCoverageIgnoreEnd if (false === strpos($output, '%')) { - return [$output, $info['isTransitionalDifferent']]; + return [$output, $info]; } throw new InvalidDomain(sprintf('The host `%s` is invalid: it contains invalid characters', $domain)); @@ -190,11 +189,14 @@ private function idnToUnicode(string $domain, int $option = IDNA_DEFAULT): strin * Returns an array containing the formatted domain name in lowercase * with its associated labels in reverse order * For example: setLabels('wWw.uLb.Ac.be') should return ['www.ulb.ac.be', ['be', 'ac', 'ulb', 'www']];. - * @param mixed $domain - * @param int $asciiOption - * @param int $unicodeOption + * + * @param mixed $domain + * @param int $asciiOption + * @param int $unicodeOption + * * @throws InvalidDomain If the domain is invalid - * @return string[] + * + * @return array */ private function setLabels($domain = null, int $asciiOption = 0, int $unicodeOption = 0): array { @@ -203,11 +205,11 @@ private function setLabels($domain = null, int $asciiOption = 0, int $unicodeOpt } if (null === $domain) { - return []; + return [[], ['isTransitionalDifferent' => false]]; } if ('' === $domain) { - return ['']; + return [[''], ['isTransitionalDifferent' => false]]; } if (!is_scalar($domain) && !method_exists($domain, '__toString')) { @@ -230,7 +232,10 @@ private function setLabels($domain = null, int $asciiOption = 0, int $unicodeOpt ) ^(?:(?®_name)\.){0,126}(?®_name)\.?$/ix'; if (1 === preg_match($domain_name, $formatted_domain)) { - return array_reverse(explode('.', strtolower($formatted_domain))); + return [ + array_reverse(explode('.', strtolower($formatted_domain))), + ['isTransitionalDifferent' => false], + ]; } // a domain name can not contains URI delimiters or space @@ -245,18 +250,11 @@ private function setLabels($domain = null, int $asciiOption = 0, int $unicodeOpt throw new InvalidDomain(sprintf('The domain `%s` is invalid: the labels are malformed', $domain)); } - $ascii_domain = $this->idnToAscii($domain, $asciiOption); - - return array_reverse(explode('.', $this->idnToUnicode($ascii_domain, $unicodeOption))); - } - - private function hasTransitionalDifference($domain): bool - { - if (!is_string($domain) || '' === $domain) { - return false; - } - list(, $isTransitionalDifferent) = $this->transformToAscii($domain, IDNA_DEFAULT); + list($ascii_domain, $infos) = $this->transformToAscii($domain, $asciiOption); - return $isTransitionalDifferent; + return [ + array_reverse(explode('.', $this->idnToUnicode($ascii_domain, $unicodeOption))), + $infos, + ]; } } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 64ba51b4..2e610ca8 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -79,6 +79,28 @@ final class PublicSuffix implements DomainInterface, JsonSerializable, PublicSuf * @var bool */ private $isTransitionalDifferent; + + /** + * New instance. + * @param mixed $publicSuffix + * @param string $section + * @param int $asciiIDNAOption + * @param int $unicodeIDNAOption + */ + public function __construct( + $publicSuffix = null, + string $section = '', + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ) { + [$this->labels, $infos] = $this->setLabels($publicSuffix, $asciiIDNAOption, $unicodeIDNAOption); + $this->publicSuffix = $this->setPublicSuffix(); + $this->section = $this->setSection($section); + $this->asciiIDNAOption = $asciiIDNAOption; + $this->unicodeIDNAOption = $unicodeIDNAOption; + $this->isTransitionalDifferent = $infos['isTransitionalDifferent']; + } + /** * {@inheritdoc} */ @@ -116,27 +138,6 @@ public static function createFromDomain(Domain $domain): self ); } - /** - * New instance. - * @param mixed $publicSuffix - * @param string $section - * @param int $asciiIDNAOption - * @param int $unicodeIDNAOption - */ - public function __construct( - $publicSuffix = null, - string $section = '', - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT - ) { - $this->labels = $this->setLabels($publicSuffix, $asciiIDNAOption, $unicodeIDNAOption); - $this->isTransitionalDifferent = $this->hasTransitionalDifference($publicSuffix); - $this->publicSuffix = $this->setPublicSuffix(); - $this->section = $this->setSection($section); - $this->asciiIDNAOption = $asciiIDNAOption; - $this->unicodeIDNAOption = $unicodeIDNAOption; - } - /** * Set the public suffix content. * diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 65042cc0..8a0216cc 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -1184,13 +1184,13 @@ public function testIsTransitionalDifference(Domain $domain, bool $expected) public function transitionalProvider() { return [ - 'simple' => [new Domain('example.com', new PublicSuffix('com')), false], - 'idna' => [new Domain('français.fr', new PublicSuffix('fr')), false], - 'in domain' => [new Domain('faß.de', new PublicSuffix('de')), true], - 'in domain 2' => [new Domain('βόλος.com', new PublicSuffix('com')), true], - 'in domain 3' => [new Domain('ශ්‍රී.com', new PublicSuffix('com')), true], - 'in domain 4' => [new Domain('نامه‌ای.com', new PublicSuffix('com')), true], - 'in label' => [new Domain('faß.test.de', new PublicSuffix('de')), true], + 'simple' => [new Domain('example.com'), false], + 'idna' => [new Domain('français.fr'), false], + 'in domain 1' => [new Domain('faß.de'), true], + 'in domain 2' => [new Domain('βόλος.com'), true], + 'in domain 3' => [new Domain('ශ්‍රී.com'), true], + 'in domain 4' => [new Domain('نامه‌ای.com'), true], + 'in domain 5' => [new Domain('faß.test.de'), true], ]; } From c0d563c4ea94ba30187a23c0d77679e55984bb2b Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 13 Apr 2019 19:11:18 +0200 Subject: [PATCH 163/461] Improve IDNAConverterTrait --- CHANGELOG.md | 4 +++- src/Domain.php | 5 +++-- src/IDNAConverterTrait.php | 26 ++++++++++++-------------- src/PublicSuffix.php | 23 ++++++++++------------- tests/DomainTest.php | 6 +++--- tests/PublicSuffixTest.php | 17 ++++++++--------- tests/RulesTest.php | 38 +++++++++++++++++++------------------- 7 files changed, 58 insertions(+), 61 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a5d8591..d140f0b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `PublicSuffix::labels` and `Domain::labels` to return the VO labels see [#241](https://github.com/jeremykendall/php-domain-parser/pull/241) +- `IDNAConverterTrait::parse` (internal) + ### Fixed - Don't swallow cache errors [#232](https://github.com/jeremykendall/php-domain-parser/issues/232) @@ -21,7 +23,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in ### Removed -- None +- IDNAConverterTrait::setLabels (internal) # 5.4.0 - 2018-11-22 diff --git a/src/Domain.php b/src/Domain.php index 2852337a..c167737c 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -114,7 +114,9 @@ public function __construct( ) { $this->asciiIDNAOption = $asciiIDNAOption; $this->unicodeIDNAOption = $unicodeIDNAOption; - [$this->labels, $infos] = $this->setLabels($domain, $asciiIDNAOption, $unicodeIDNAOption); + $infos = $this->parse($domain, $asciiIDNAOption, $unicodeIDNAOption); + $this->labels = $infos['labels']; + $this->isTransitionalDifferent = $infos['isTransitionalDifferent']; if ([] !== $this->labels) { $this->domain = implode('.', array_reverse($this->labels)); } @@ -123,7 +125,6 @@ public function __construct( ); $this->registrableDomain = $this->setRegistrableDomain(); $this->subDomain = $this->setSubDomain(); - $this->isTransitionalDifferent = $infos['isTransitionalDifferent']; } /** diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index 0ce8cf7f..10d16581 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -137,9 +137,9 @@ private function transformToAscii(string $domain, int $option): array return [strtolower($domain), ['isTransitionalDifferent' => false]]; } - $output = idn_to_ascii($domain, $option, INTL_IDNA_VARIANT_UTS46, $info); - if (0 !== $info['errors']) { - throw new InvalidDomain(sprintf('The host `%s` is invalid : %s', $domain, self::getIdnErrors($info['errors']))); + $output = idn_to_ascii($domain, $option, INTL_IDNA_VARIANT_UTS46, $infos); + if (0 !== $infos['errors']) { + throw new InvalidDomain(sprintf('The host `%s` is invalid : %s', $domain, self::getIdnErrors($infos['errors']))); } // @codeCoverageIgnoreStart @@ -149,7 +149,7 @@ private function transformToAscii(string $domain, int $option): array // @codeCoverageIgnoreEnd if (false === strpos($output, '%')) { - return [$output, $info]; + return [$output, $infos]; } throw new InvalidDomain(sprintf('The host `%s` is invalid: it contains invalid characters', $domain)); @@ -188,7 +188,7 @@ private function idnToUnicode(string $domain, int $option = IDNA_DEFAULT): strin * Filter and format the domain to ensure it is valid. * Returns an array containing the formatted domain name in lowercase * with its associated labels in reverse order - * For example: setLabels('wWw.uLb.Ac.be') should return ['www.ulb.ac.be', ['be', 'ac', 'ulb', 'www']];. + * For example: parse('wWw.uLb.Ac.be') should return ['www.ulb.ac.be', ['be', 'ac', 'ulb', 'www']];. * * @param mixed $domain * @param int $asciiOption @@ -198,18 +198,18 @@ private function idnToUnicode(string $domain, int $option = IDNA_DEFAULT): strin * * @return array */ - private function setLabels($domain = null, int $asciiOption = 0, int $unicodeOption = 0): array + private function parse($domain = null, int $asciiOption = 0, int $unicodeOption = 0): array { if ($domain instanceof DomainInterface) { $domain = $domain->getContent(); } if (null === $domain) { - return [[], ['isTransitionalDifferent' => false]]; + return ['labels' => [], 'isTransitionalDifferent' => false]; } if ('' === $domain) { - return [[''], ['isTransitionalDifferent' => false]]; + return ['labels' => [''], 'isTransitionalDifferent' => false]; } if (!is_scalar($domain) && !method_exists($domain, '__toString')) { @@ -233,8 +233,8 @@ private function setLabels($domain = null, int $asciiOption = 0, int $unicodeOpt ^(?:(?®_name)\.){0,126}(?®_name)\.?$/ix'; if (1 === preg_match($domain_name, $formatted_domain)) { return [ - array_reverse(explode('.', strtolower($formatted_domain))), - ['isTransitionalDifferent' => false], + 'labels' => array_reverse(explode('.', strtolower($formatted_domain))), + 'isTransitionalDifferent' => false, ]; } @@ -251,10 +251,8 @@ private function setLabels($domain = null, int $asciiOption = 0, int $unicodeOpt } list($ascii_domain, $infos) = $this->transformToAscii($domain, $asciiOption); + $infos['labels'] = array_reverse(explode('.', $this->idnToUnicode($ascii_domain, $unicodeOption))); - return [ - array_reverse(explode('.', $this->idnToUnicode($ascii_domain, $unicodeOption))), - $infos, - ]; + return $infos; } } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 2e610ca8..26f8d16c 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -21,7 +21,6 @@ use function array_keys; use function array_reverse; use function count; -use function explode; use function implode; use function in_array; use function reset; @@ -93,12 +92,13 @@ public function __construct( int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT ) { - [$this->labels, $infos] = $this->setLabels($publicSuffix, $asciiIDNAOption, $unicodeIDNAOption); + $infos = $this->parse($publicSuffix, $asciiIDNAOption, $unicodeIDNAOption); + $this->labels = $infos['labels']; + $this->isTransitionalDifferent = $infos['isTransitionalDifferent']; $this->publicSuffix = $this->setPublicSuffix(); $this->section = $this->setSection($section); $this->asciiIDNAOption = $asciiIDNAOption; $this->unicodeIDNAOption = $unicodeIDNAOption; - $this->isTransitionalDifferent = $infos['isTransitionalDifferent']; } /** @@ -348,11 +348,7 @@ public function toAscii() return $this; } - $clone = clone $this; - $clone->publicSuffix = $publicSuffix; - $clone->labels = array_reverse(explode('.', $publicSuffix)); - - return $clone; + return new self($publicSuffix, $this->section, $this->asciiIDNAOption, $this->unicodeIDNAOption); } /** @@ -364,11 +360,12 @@ public function toUnicode() return $this; } - $clone = clone $this; - $clone->publicSuffix = $this->idnToUnicode($this->publicSuffix, $this->unicodeIDNAOption); - $clone->labels = array_reverse(explode('.', $clone->publicSuffix)); - - return $clone; + return new self( + $this->idnToUnicode($this->publicSuffix, $this->unicodeIDNAOption), + $this->section, + $this->asciiIDNAOption, + $this->unicodeIDNAOption + ); } /** diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 8a0216cc..014b9a40 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -91,7 +91,7 @@ public function provideWrongConstructor() /** * @dataProvider invalidDomainProvider * @covers ::__construct - * @covers ::setLabels + * @covers ::parse * @covers ::idnToAscii * @covers ::getIdnErrors * @param string $domain @@ -212,7 +212,7 @@ public function testLabels() } /** - * @covers ::setLabels + * @covers ::parse * @covers ::setPublicSuffix * @covers ::normalize * @covers ::setRegistrableDomain @@ -312,7 +312,7 @@ public function toUnicodeProvider() } /** - * @covers ::setLabels + * @covers ::parse * @covers ::setPublicSuffix * @covers ::normalize * @covers ::setRegistrableDomain diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 9630df4b..998252a8 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -52,7 +52,7 @@ public function testInternalPhpMethod() /** * @covers ::__construct - * @covers ::setLabels + * @covers ::parse * @covers ::setSection * @covers ::getContent * @covers ::toUnicode @@ -64,7 +64,7 @@ public function testPSToUnicodeWithUrlEncode() /** * @covers ::__construct - * @covers ::setLabels + * @covers ::parse * @covers ::setPublicSuffix * @covers ::setSection * @covers ::isKnown @@ -97,7 +97,7 @@ public function PSProvider() /** * @covers ::__construct - * @covers ::setLabels + * @covers ::parse * @covers ::setPublicSuffix * @dataProvider invalidPublicSuffixProvider * @@ -119,7 +119,7 @@ public function invalidPublicSuffixProvider() /** * @covers ::__construct - * @covers ::setLabels + * @covers ::parse * @covers ::idnToAscii */ public function testPSToAsciiThrowsException() @@ -312,31 +312,30 @@ public function testResolveWithCustomIDNAOptions( [$publicSuffix->getAsciiIDNAOption(), $publicSuffix->getUnicodeIDNAOption()], [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] ); - self::assertSame($publicSuffix->isTransitionalDifferent(), $publicSuffix->toAscii()->isTransitionalDifferent()); } public function customIDNAProvider() { return [ - 'without deviation characters'=>[ + 'without deviation characters' => [ 'example.com', 'example.com', 'example.com', 'example.com', ], - 'without deviation characters with label'=>[ + 'without deviation characters with label' => [ 'www.example.com', 'www.example.com', 'www.example.com', 'www.example.com', ], - 'with deviation in domain'=>[ + 'with deviation in domain' => [ 'www.faß.de', 'www.faß.de', 'www.xn--fa-hia.de', 'www.faß.de', ], - 'with deviation in label'=>[ + 'with deviation in label' => [ 'faß.test.de', 'faß.test.de', 'xn--fa-hia.test.de', diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 4b288b27..b5653ddf 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -114,7 +114,7 @@ public function testwithIDNAOptions() * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\Domain::isKnown - * @covers \Pdp\IDNAConverterTrait::setLabels + * @covers \Pdp\IDNAConverterTrait::parse */ public function testNullWillReturnNullDomain() { @@ -125,7 +125,7 @@ public function testNullWillReturnNullDomain() /** * @covers ::resolve - * @covers \Pdp\IDNAConverterTrait::setLabels + * @covers \Pdp\IDNAConverterTrait::parse */ public function testThrowsTypeErrorOnWrongInput() { @@ -152,7 +152,7 @@ public function testResolveThrowsExceptionOnWrongDomainType() * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\Domain::isKnown - * @covers \Pdp\IDNAConverterTrait::setLabels + * @covers \Pdp\IDNAConverterTrait::parse */ public function testIsSuffixValidFalse() { @@ -174,7 +174,7 @@ public function testIsSuffixValidFalse() * @covers \Pdp\Domain::isKnown * @covers \Pdp\Domain::isICANN * @covers \Pdp\Domain::isPrivate - * @covers \Pdp\IDNAConverterTrait::setLabels + * @covers \Pdp\IDNAConverterTrait::parse */ public function testIsSuffixValidTrue() { @@ -198,7 +198,7 @@ public function testIsSuffixValidTrue() * @covers \Pdp\Domain::isKnown * @covers \Pdp\Domain::isICANN * @covers \Pdp\Domain::isPrivate - * @covers \Pdp\IDNAConverterTrait::setLabels + * @covers \Pdp\IDNAConverterTrait::parse */ public function testIsSuffixValidFalseWithPunycoded() { @@ -222,7 +222,7 @@ public function testIsSuffixValidFalseWithPunycoded() * @covers \Pdp\Domain::isKnown * @covers \Pdp\Domain::isICANN * @covers \Pdp\Domain::isPrivate - * @covers \Pdp\IDNAConverterTrait::setLabels + * @covers \Pdp\IDNAConverterTrait::parse */ public function testSubDomainIsNull() { @@ -235,7 +235,7 @@ public function testSubDomainIsNull() /** * @covers ::resolve * @covers ::validateSection - * @covers \Pdp\IDNAConverterTrait::setLabels + * @covers \Pdp\IDNAConverterTrait::parse */ public function testWithExceptionName() { @@ -249,7 +249,7 @@ public function testWithExceptionName() * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\IDNAConverterTrait::setLabels + * @covers \Pdp\IDNAConverterTrait::parse */ public function testWithPrivateDomain() { @@ -280,7 +280,7 @@ public function testWithAbsoluteHostInvalid() * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\IDNAConverterTrait::setLabels + * @covers \Pdp\IDNAConverterTrait::parse */ public function testWithPrivateDomainInvalid() { @@ -298,7 +298,7 @@ public function testWithPrivateDomainInvalid() * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\IDNAConverterTrait::setLabels + * @covers \Pdp\IDNAConverterTrait::parse */ public function testWithPrivateDomainValid() { @@ -316,7 +316,7 @@ public function testWithPrivateDomainValid() * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\IDNAConverterTrait::setLabels + * @covers \Pdp\IDNAConverterTrait::parse */ public function testWithICANNDomainInvalid() { @@ -334,7 +334,7 @@ public function testWithICANNDomainInvalid() * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\IDNAConverterTrait::setLabels + * @covers \Pdp\IDNAConverterTrait::parse */ public function testWithDomainObject() { @@ -350,7 +350,7 @@ public function testWithDomainObject() /** * @covers ::getPublicSuffix - * @covers \Pdp\IDNAConverterTrait::setLabels + * @covers \Pdp\IDNAConverterTrait::parse */ public function testWithDomainInterfaceObject() { @@ -378,7 +378,7 @@ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $dom /** * @covers ::resolve - * @covers \Pdp\IDNAConverterTrait::setLabels + * @covers \Pdp\IDNAConverterTrait::parse * @covers \Pdp\Domain::setPublicSuffix * @covers \Pdp\Domain::getPublicSuffix * @dataProvider parseDataProvider @@ -395,7 +395,7 @@ public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, /** * @covers ::resolve - * @covers \Pdp\IDNAConverterTrait::setLabels + * @covers \Pdp\IDNAConverterTrait::parse * @covers \Pdp\Domain::withPublicSuffix * @covers \Pdp\Domain::getContent * @dataProvider parseDataProvider @@ -440,7 +440,7 @@ public function parseDataProvider() * @covers ::getPublicSuffix * @covers ::validateSection * @covers \Pdp\Domain::isResolvable - * @covers \Pdp\IDNAConverterTrait::setLabels + * @covers \Pdp\IDNAConverterTrait::parse * @dataProvider invalidParseProvider * * @param mixed $domain @@ -465,7 +465,7 @@ public function invalidParseProvider() * @covers ::getPublicSuffix * @covers ::validateSection * @covers \Pdp\Domain::isResolvable - * @covers \Pdp\IDNAConverterTrait::setLabels + * @covers \Pdp\IDNAConverterTrait::parse * @dataProvider invalidDomainParseProvider * * @param mixed $domain @@ -497,7 +497,7 @@ public function invalidDomainParseProvider() * @covers ::getPublicSuffix * @covers ::validateSection * @covers \Pdp\Domain::isResolvable - * @covers \Pdp\IDNAConverterTrait::setLabels + * @covers \Pdp\IDNAConverterTrait::parse * @dataProvider validPublicSectionProvider * * @param string|null $domain @@ -556,7 +556,7 @@ public function checkPublicSuffix($input, $expected) * @covers ::findPublicSuffixFromSection * @covers \Pdp\Domain::withPublicSuffix * @covers \Pdp\Domain::getRegistrableDomain - * @covers \Pdp\IDNAConverterTrait::setLabels + * @covers \Pdp\IDNAConverterTrait::parse */ public function testPublicSuffixSpec() { From f67a6858c36f62e5c445c45168970936d5f755ec Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 14 Apr 2019 08:42:13 +0200 Subject: [PATCH 164/461] deprecate IDNAConverterTrait::setLabels --- CHANGELOG.md | 6 +++--- src/IDNAConverterTrait.php | 25 ++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d140f0b4..f933868f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in this file -# 5.5.0 - 2019-04-13 +# 5.5.0 - 2019-04-14 ### Added @@ -19,11 +19,11 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in ### Deprecated -- None +- `IDNAConverterTrait::setLabels` replaced by `IDNAConverterTrait::parse` (internal) ### Removed -- IDNAConverterTrait::setLabels (internal) +- None # 5.4.0 - 2018-11-22 diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index 10d16581..b825d2ca 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -188,7 +188,30 @@ private function idnToUnicode(string $domain, int $option = IDNA_DEFAULT): strin * Filter and format the domain to ensure it is valid. * Returns an array containing the formatted domain name in lowercase * with its associated labels in reverse order - * For example: parse('wWw.uLb.Ac.be') should return ['www.ulb.ac.be', ['be', 'ac', 'ulb', 'www']];. + * For example: parse('wWw.uLb.Ac.be') should return ['be', 'ac', 'ulb', 'www'];. + * + * @deprecated + * + * @codeCoverageIgnore + * + * @param mixed $domain + * + * @throws InvalidDomain If the domain is invalid + * + * @return string[] + */ + private function setLabels($domain = null): array + { + return $this->parse($domain, IDNA_DEFAULT, IDNA_DEFAULT)['labels']; + } + + /** + * Parse and format the domain to ensure it is valid. + * Returns an array containing the formatted domain name labels + * and the domain transitional information. + * + * For example: parse('wWw.uLb.Ac.be') should return + * ['labels' => ['be', 'ac', 'ulb', 'www'], 'isTransitionalDifferant' => false];. * * @param mixed $domain * @param int $asciiOption From 410b21874c2fa20514d3ba15ebaa319a72bbb675 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 14 Apr 2019 08:42:45 +0200 Subject: [PATCH 165/461] Remove IDNA options usage on TLD conversion --- src/Manager.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Manager.php b/src/Manager.php index 5cc47e21..12967896 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -91,6 +91,7 @@ public function __construct(CacheInterface $cache, HttpClient $http, $ttl = null * @param int $unicodeIDNAOption * * @throws SimpleCacheException + * @throws CouldNotLoadRules * * @return Rules */ @@ -125,6 +126,9 @@ public function getRules( * @param string $url the Public Suffix List URL * @param null|mixed $ttl the cache TTL * + * @throws SimpleCacheException + * @throws HttpClientException + * * @return bool */ public function refreshRules(string $url = self::PSL_URL, $ttl = null): bool @@ -146,6 +150,7 @@ public function refreshRules(string $url = self::PSL_URL, $ttl = null): bool * @param int $unicodeIDNAOption * * @throws SimpleCacheException + * @throws CouldNotLoadTLDs * * @return TopLevelDomains */ @@ -188,21 +193,16 @@ public function getTLDs( * If a local cache already exists, it will be overwritten. * Returns true if the refresh was successful. * - * @param string $url the IANA Root Zone Database URL - * @param null|mixed $ttl the cache TTL - * @param int $asciiIDNAOption - * @param int $unicodeIDNAOption + * @param string $url the IANA Root Zone Database URL + * @param null|mixed $ttl the cache TTL * * @throws SimpleCacheException + * @throws HttpClientException * * @return bool */ - public function refreshTLDs( - string $url = self::RZD_URL, - $ttl = null, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT - ): bool { + public function refreshTLDs(string $url = self::RZD_URL, $ttl = null): bool + { static $converter; $converter = $converter ?? new TLDConverter(); From 20f9f4aaa7bd86e4ce1d4ad35c72ffe29158a5e8 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 14 Apr 2019 09:05:02 +0200 Subject: [PATCH 166/461] Update PHP CS Fixer settings --- .php_cs | 2 ++ src/Domain.php | 16 ++++++++-------- src/IDNAConverterTrait.php | 10 +++++----- src/Manager.php | 4 ++-- src/PublicSuffix.php | 12 ++++++------ src/Rules.php | 14 +++++++------- src/TLDConverter.php | 2 +- src/TopLevelDomains.php | 18 +++++++++--------- tests/DomainTest.php | 16 ++++++++-------- tests/PublicSuffixTest.php | 8 ++++---- tests/RulesTest.php | 2 +- tests/TopLevelDomainsTest.php | 2 +- 12 files changed, 54 insertions(+), 52 deletions(-) diff --git a/.php_cs b/.php_cs index 8b31e582..c307b0de 100644 --- a/.php_cs +++ b/.php_cs @@ -33,6 +33,8 @@ return PhpCsFixer\Config::create() 'no_empty_comment' => true, 'no_leading_import_slash' => true, 'no_trailing_comma_in_singleline_array' => true, + 'no_trailing_whitespace' => true, + 'no_whitespace_in_blank_line' => true, 'no_unused_imports' => true, 'ordered_imports' => ['imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha'], 'phpdoc_add_missing_param_annotation' => ['only_untyped' => false], diff --git a/src/Domain.php b/src/Domain.php index c167737c..5d151144 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -83,22 +83,22 @@ final class Domain implements DomainInterface, JsonSerializable * @var string|null */ private $subDomain; - + /** * @var int */ private $asciiIDNAOption = IDNA_DEFAULT; - + /** * @var int */ private $unicodeIDNAOption = IDNA_DEFAULT; - + /** * @var bool */ private $isTransitionalDifferent; - + /** * New instance. * @param null|mixed $domain @@ -126,7 +126,7 @@ public function __construct( $this->registrableDomain = $this->setRegistrableDomain(); $this->subDomain = $this->setSubDomain(); } - + /** * {@inheritdoc} */ @@ -139,7 +139,7 @@ public static function __set_state(array $properties): self $properties['unicodeIDNAOption'] ?? IDNA_DEFAULT ); } - + /** * Sets the public suffix domain part. * @@ -349,7 +349,7 @@ public function getAsciiIDNAOption(): int { return $this->asciiIDNAOption; } - + /** * Gets conversion options for idn_to_utf8. * @@ -363,7 +363,7 @@ public function getUnicodeIDNAOption(): int { return $this->unicodeIDNAOption; } - + /** * Returns true if domain contains deviation characters. * diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index b825d2ca..65531591 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -136,22 +136,22 @@ private function transformToAscii(string $domain, int $option): array if (1 !== preg_match($pattern, $domain)) { return [strtolower($domain), ['isTransitionalDifferent' => false]]; } - + $output = idn_to_ascii($domain, $option, INTL_IDNA_VARIANT_UTS46, $infos); if (0 !== $infos['errors']) { throw new InvalidDomain(sprintf('The host `%s` is invalid : %s', $domain, self::getIdnErrors($infos['errors']))); } - + // @codeCoverageIgnoreStart if (false === $output) { throw new UnexpectedValueException(sprintf('The Intl extension is misconfigured for %s, please correct this issue before proceeding.', PHP_OS)); } // @codeCoverageIgnoreEnd - + if (false === strpos($output, '%')) { return [$output, $infos]; } - + throw new InvalidDomain(sprintf('The host `%s` is invalid: it contains invalid characters', $domain)); } /** @@ -272,7 +272,7 @@ private function parse($domain = null, int $asciiOption = 0, int $unicodeOption if (1 !== preg_match($pattern, $formatted_domain)) { throw new InvalidDomain(sprintf('The domain `%s` is invalid: the labels are malformed', $domain)); } - + list($ascii_domain, $infos) = $this->transformToAscii($domain, $asciiOption); $infos['labels'] = array_reverse(explode('.', $this->idnToUnicode($ascii_domain, $unicodeOption))); diff --git a/src/Manager.php b/src/Manager.php index 12967896..1bf424f1 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -166,7 +166,7 @@ public function getTLDs( if (null === $data && !$this->refreshTLDs($url, $ttl)) { throw new CouldNotLoadTLDs(sprintf('Unable to load the root zone database from %s', $url)); } - + $data = json_decode($data ?? $this->cache->get($key), true); if (JSON_ERROR_NONE !== json_last_error()) { throw new CouldNotLoadTLDs( @@ -174,7 +174,7 @@ public function getTLDs( json_last_error() ); } - + if (!isset($data['records'], $data['version'], $data['modifiedDate'])) { throw new CouldNotLoadTLDs('The root zone database cache content is corrupted'); } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 26f8d16c..7112135b 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -63,17 +63,17 @@ final class PublicSuffix implements DomainInterface, JsonSerializable, PublicSuf * @var string[] */ private $labels; - + /** * @var int */ private $asciiIDNAOption = IDNA_DEFAULT; - + /** * @var int */ private $unicodeIDNAOption = IDNA_DEFAULT; - + /** * @var bool */ @@ -129,7 +129,7 @@ public static function createFromDomain(Domain $domain): self } elseif ($domain->isPrivate()) { $section = self::PRIVATE_DOMAINS; } - + return new self( $domain->getPublicSuffix(), $section, @@ -277,7 +277,7 @@ public function getAsciiIDNAOption(): int { return $this->asciiIDNAOption; } - + /** * Gets conversion options for idn_to_utf8. * @@ -291,7 +291,7 @@ public function getUnicodeIDNAOption(): int { return $this->unicodeIDNAOption; } - + /** * Returns true if domain contains deviation characters. * diff --git a/src/Rules.php b/src/Rules.php index 8c45e6e7..df7b9629 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -51,12 +51,12 @@ final class Rules implements PublicSuffixListSection * @var array */ private $rules; - + /** * @var int */ private $asciiIDNAOption; - + /** * @var int */ @@ -78,7 +78,7 @@ public function __construct( $this->asciiIDNAOption = $asciiIDNAOption; $this->unicodeIDNAOption = $unicodeIDNAOption; } - + /** * Returns a new instance from a file path. * @@ -158,7 +158,7 @@ public function getAsciiIDNAOption(): int { return $this->asciiIDNAOption; } - + /** * Gets conversion options for idn_to_utf8. * @@ -172,7 +172,7 @@ public function getUnicodeIDNAOption(): int { return $this->unicodeIDNAOption; } - + /** * Determines the public suffix for a given domain. * @@ -189,7 +189,7 @@ public function getPublicSuffix($domain, string $section = self::ALL_DOMAINS): P if (!$domain instanceof Domain) { $domain = new Domain($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); } - + if (!$domain->isResolvable()) { throw new CouldNotResolvePublicSuffix(sprintf('The domain `%s` can not contain a public suffix', $domain->getContent())); } @@ -215,7 +215,7 @@ public function resolve($domain, string $section = self::ALL_DOMAINS): Domain if (!$domain->isResolvable()) { return $domain; } - + return $domain->resolve($this->findPublicSuffix($domain, $section)); } catch (Exception $e) { return new Domain(null, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); diff --git a/src/TLDConverter.php b/src/TLDConverter.php index afdc702d..1bf7a766 100644 --- a/src/TLDConverter.php +++ b/src/TLDConverter.php @@ -37,7 +37,7 @@ final class TLDConverter * @internal */ const IANA_DATE_FORMAT = 'D M d H:i:s Y e'; - + /** * Converts the IANA Root Zone Database into a TopLevelDomains associative array. * diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 29f4925f..906d5249 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -49,17 +49,17 @@ final class TopLevelDomains implements Countable, IteratorAggregate * @var array */ private $records; - + /** * @var int */ private $asciiIDNAOption; - + /** * @var int */ private $unicodeIDNAOption; - + /** * New instance. * @param array $records @@ -104,17 +104,17 @@ public static function createFromPath( if (null !== $context) { $args[] = $context; } - + if (!($resource = @fopen(...$args))) { throw new CouldNotLoadTLDs(sprintf('`%s`: failed to open stream: No such file or directory', $path)); } - + $content = stream_get_contents($resource); fclose($resource); - + return self::createFromString($content, $asciiIDNAOption, $unicodeIDNAOption); } - + /** * Returns a new instance from a string. * @@ -191,7 +191,7 @@ public function getAsciiIDNAOption(): int { return $this->asciiIDNAOption; } - + /** * Gets conversion options for idn_to_utf8. * @@ -205,7 +205,7 @@ public function getUnicodeIDNAOption(): int { return $this->unicodeIDNAOption; } - + /** * {@inheritdoc} */ diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 014b9a40..61617736 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -576,7 +576,7 @@ public function testWithSubDomainFailsWithOneLabelDomain() self::expectException(CouldNotResolveSubDomain::class); (new Domain('localhost'))->withSubDomain('www'); } - + /** * @covers ::withSubDomain * @covers ::normalizeContent @@ -1014,7 +1014,7 @@ public function testwithoutLabelWorksWithMultipleKeys() { self::assertNull((new Domain('www.example.com'))->withoutLabel(0, 1, 2)->getContent()); } - + /** * @covers ::__construct */ @@ -1026,7 +1026,7 @@ public function testConstructWithCustomIDNAOptions() [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()] ); } - + /** * @dataProvider resolveCustomIDNAOptionsProvider * @param string $domainName @@ -1063,7 +1063,7 @@ public function testResolveWorksWithCustomIDNAOptions( self::assertSame($expectedSubDomain, $domain->getSubDomain()); self::assertSame($expectedWithLabel, $domain->withLabel(-1, $withLabel)->getContent()); } - + public function resolveCustomIDNAOptionsProvider() { return [ @@ -1113,7 +1113,7 @@ public function resolveCustomIDNAOptionsProvider() ], ]; } - + public function testInstanceCreationWithCustomIDNAOptions() { $domain = new Domain( @@ -1122,7 +1122,7 @@ public function testInstanceCreationWithCustomIDNAOptions() IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE ); - + $instance = $domain->toAscii(); self::assertSame( [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], @@ -1169,7 +1169,7 @@ public function testInstanceCreationWithCustomIDNAOptions() [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] ); } - + /** * @covers ::isTransitionalDifferent * @dataProvider transitionalProvider @@ -1180,7 +1180,7 @@ public function testIsTransitionalDifference(Domain $domain, bool $expected) { self::assertSame($expected, $domain->isTransitionalDifferent()); } - + public function transitionalProvider() { return [ diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 998252a8..8e4be26a 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -286,7 +286,7 @@ public function createFromDomainProvider() ], ]; } - + /** * @covers ::isTransitionalDifferent * @@ -313,7 +313,7 @@ public function testResolveWithCustomIDNAOptions( [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] ); } - + public function customIDNAProvider() { return [ @@ -343,7 +343,7 @@ public function customIDNAProvider() ], ]; } - + /** * @covers ::isTransitionalDifferent * @@ -355,7 +355,7 @@ public function testIsTransitionalDifference(PublicSuffix $publicSuffix, bool $e { self::assertSame($expected, $publicSuffix->isTransitionalDifferent()); } - + public function transitionalProvider() { return [ diff --git a/tests/RulesTest.php b/tests/RulesTest.php index b5653ddf..1697f60d 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -661,7 +661,7 @@ public function testPublicSuffixSpec() $this->checkPublicSuffix('shishi.xn--fiqs8s', 'shishi.xn--fiqs8s'); $this->checkPublicSuffix('xn--fiqs8s', null); } - + /** * @covers ::getAsciiIDNAOption * @covers ::getUnicodeIDNAOption diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index ad2c9a2c..f85963e4 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -185,7 +185,7 @@ public function testResolveWithIDNAOptions() [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption(), ] ); - + $collection = TopLevelDomains::createFromPath( __DIR__.'/data/root_zones.dat', null, From 6ee23b3206a8afd587ab3a9219726b802c15cc69 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 14 Apr 2019 09:39:26 +0200 Subject: [PATCH 167/461] Update license copyright year --- LICENSE | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 1a0cad7a..8ba95d80 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,6 @@ -Copyright (C) 2013-2014 Jeremy Kendall, http://about.me/jeremykendall +The MIT License (MIT) + +Copyright (C) 2013-2019 Jeremy Kendall, http://about.me/jeremykendall Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in From 6315245ae95ff649afb34b59698f606a4b9a52dc Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 4 Sep 2019 16:38:44 +0200 Subject: [PATCH 168/461] #249 improving the update-psl script --- .php_cs | 3 +- bin/update-psl | 123 +++++++++- composer.json | 17 +- ...ULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- ...ULL_f18a70477d29d525b9220612e2115345.cache | 2 +- phpunit.xml.dist | 1 - src/Installer.php | 221 ++++++++++++------ src/Logger.php | 64 +++++ tests/InstallerTest.php | 143 ++++++++++++ 9 files changed, 494 insertions(+), 82 deletions(-) mode change 100755 => 100644 data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache mode change 100755 => 100644 data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache create mode 100644 src/Logger.php create mode 100644 tests/InstallerTest.php diff --git a/.php_cs b/.php_cs index c307b0de..d389dc37 100644 --- a/.php_cs +++ b/.php_cs @@ -12,6 +12,7 @@ file that was distributed with this source code. EOF; $finder = PhpCsFixer\Finder::create() + ->in(__DIR__.'/bin') ->in(__DIR__.'/src') ->in(__DIR__.'/tests') ; @@ -55,4 +56,4 @@ return PhpCsFixer\Config::create() 'whitespace_after_comma_in_array' => true, ]) ->setFinder($finder) -; \ No newline at end of file +; diff --git a/bin/update-psl b/bin/update-psl index 284b1abe..5a35ea13 100755 --- a/bin/update-psl +++ b/bin/update-psl @@ -1,6 +1,125 @@ #!/usr/bin/env php '', + Installer::REFRESH_PSL_KEY => false, + Installer::REFRESH_RZD_KEY => false, + Installer::TTL_KEY => '1 DAY', +], getopt('h::', [ + 'h', + 'help', + Installer::CACHE_DIR_KEY.':', + Installer::REFRESH_PSL_KEY, + Installer::REFRESH_PSL_URL_KEY.':', + Installer::REFRESH_RZD_KEY, + Installer::REFRESH_RZD_URL_KEY.':', + Installer::TTL_KEY.':', +])); + +if (isset($arguments['help']) || isset($arguments['h'])) { + success($helpText); + + die(0); +} + +if (!extension_loaded('curl')) { + fail("$redbg The PHP cURL extension is missing. $reset"); + + die(1); +} + +$installer = Installer::createFromCacheDir(new Logger( STDOUT, STDERR), $arguments[Installer::CACHE_DIR_KEY]); +$retVal = $installer->refresh($arguments); + +die($retVal); diff --git a/composer.json b/composer.json index 09119b66..cec75989 100644 --- a/composer.json +++ b/composer.json @@ -36,12 +36,13 @@ "require": { "php": ">=7.0", "ext-intl": "*", + "psr/log": "^1.1", "psr/simple-cache": "^1.0.1" }, "require-dev": { "composer/composer": "^1.6", "friendsofphp/php-cs-fixer": "^2.7", - "mikey179/vfsStream": "^1.6", + "mikey179/vfsstream": "^1.6", "phpstan/phpstan": "^0.9.2", "phpstan/phpstan-phpunit": "^0.9.4", "phpstan/phpstan-strict-rules": "^0.9.0", @@ -63,9 +64,9 @@ } }, "scripts": { - "phpcs": "php-cs-fixer fix -vv --diff --dry-run --allow-risky=yes", - "phpstan-src": "phpstan analyse -l max -c phpstan.src.neon src", - "phpstan-tests": "phpstan analyse -l max -c phpstan.tests.neon tests", + "phpcs": "php-cs-fixer fix -v --diff --dry-run --allow-risky=yes --ansi", + "phpstan-src": "phpstan analyse -l max -c phpstan.src.neon src --ansi", + "phpstan-tests": "phpstan analyse -l max -c phpstan.tests.neon tests --ansi", "phpstan": [ "@phpstan-src", "@phpstan-tests" @@ -79,6 +80,14 @@ "@phpunit" ] }, + "scripts-descriptions": { + "phpcs": "Runs coding style test suite", + "phpstan": "Runs complete codebase static analysis", + "phpstan-src": "Runs source code static analysis", + "phpstan-test": "Runs test suite static analysis", + "phpunit": "Runs unit and functional testing", + "test": "Runs full test suite" + }, "extra": { "branch-alias": { "dev-master": "5.x-dev" diff --git a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache old mode 100755 new mode 100644 index 9713d6c3..319c40ef --- a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache +++ b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache @@ -1 +1 @@ -s:109022:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":{"co":[],"com":[],"commune":[],"net":[],"org":[]},"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"ong":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"asso":[],"com":[],"gouv":[],"nom":[],"prd":[],"tm":[],"aeroport":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"ponpes":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"ac":[],"biz":[],"co":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"sc":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nuernberg":[],"nuremberg":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":[],"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"gov":[],"net":[],"edu":[],"ac":[],"com":[],"co":[],"int":[],"mil":[],"gouv":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"com":[],"info":[],"biz":[],"net":[],"org":[],"web":[],"gen":[],"tv":[],"av":[],"dr":[],"bbs":[],"name":[],"tel":[],"gov":[],"bel":[],"pol":[],"mil":[],"k12":[],"edu":[],"kep":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnl":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"doha":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"honeywell":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"iselect":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"starhub":[],"statebank":[],"statefarm":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"krasnik":[],"leczna":[],"lubartow":[],"lublin":[],"poniatowa":[],"swidnik":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]},"co":[]},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"go-vip":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"in-dsl":[],"in-vpn":[],"ipifony":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"siteleaf":[],"dsmynas":[],"familyds":[],"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"wpcomstaging":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastly-terrarium":[],"fastvps-server":[],"mydobiss":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lpusercontent":[],"lmpm":{"app":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"stdlib":{"api":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"bloxcms":[],"townnews-staging":[],"hk":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[],"cn-northwest-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}},"instantcloud":[]},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"in-dsl":[],"in-vpn":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"io":{"apigee":[],"backplaneapp":[],"boxfuse":[],"browsersafetymark":[],"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"protonet":[],"vaporcloud":[],"on-rio":{"*":[]},"readthedocs":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"s5y":{"*":[]},"shiftedit":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"applicationcloud":[],"scapp":[],"telebit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[]},"eus":{"party":{"user":[]}},"co":{"go-vip":[],"otap":{"*":[]},"com":{"blogspot":[]},"leadpages":[],"lpages":[],"mypi":[],"n4t":[],"nodum":[]},"ca":{"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"dyn-berlin":[],"in-berlin":[],"in-brb":[],"in-butter":[],"in-dsl":[],"in-vpn":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[]},"uk":{"co":{"bytemark":{"dh":[],"vm":[]},"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"gov":{"service":[],"homeoffice":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"se":{"com":[],"blogspot":[]},"bz":{"za":[],"nym":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"filegear-au":[],"filegear-de":[],"filegear-gb":[],"filegear-ie":[],"filegear-jp":[],"filegear-sg":[],"ravendb":[],"barsy":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"dev":{"workers":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[]},"site":{"cyon":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"earth":{"dapps":{"*":[],"bzz":{"*":[]}}},"th":{"online":[],"shop":[]},"fi":{"dy":[],"blogspot":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[],"builder":{"site":[]}},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[],"telebit":{"*":[]}},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"on-rancher":{"*":[]},"sensiosite":{"*":[]},"trafficplex":[]},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"app":{"run":{"a":[]},"hasura":[],"telebit":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]},"zone":[]},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]}},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"ltd":[],"inc":[]},"hr":{"blogspot":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[],"syncloud":[]},"jp":{"blogspot":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"community":{"ravendb":[]},"run":{"development":[],"ravendb":[]},"zone":{"triton":{"*":[]},"lima":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"business":{"co":[]},"education":{"co":[]},"events":{"co":[]},"financial":{"co":[]},"place":{"co":[]},"technology":{"co":[]},"space":{"linkitools":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ai":{"nom":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gl":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vc":{"nom":[]},"vg":{"nom":[]},"gg":{"cya":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"fit":{"ptplus":[]},"edu":{"rit":{"git-pages":[]}},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"one":{"homelink":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]},"design":{"bss":[]}}}"; \ No newline at end of file +s:110536:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":{"co":[],"com":[],"commune":[],"net":[],"org":[]},"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"catholic":[],"eq":[],"nsw":{"schools":[]},"nt":[],"qld":[],"sa":[],"tas":{"education":[]},"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"ong":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"tc":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"asso":[],"com":[],"gouv":[],"nom":[],"prd":[],"tm":[],"aeroport":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"ponpes":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"ac":[],"biz":[],"co":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"sc":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":[],"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"ac":[],"co":[],"coop":[],"gov":[],"mil":[],"net":[],"org":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"av":[],"bbs":[],"bel":[],"biz":[],"com":[],"dr":[],"edu":[],"gen":[],"gov":[],"info":[],"mil":[],"k12":[],"kep":[],"name":[],"net":[],"org":[],"pol":[],"tel":[],"tsk":[],"tv":[],"web":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nic":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"cpa":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gay":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"llp":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"statebank":[],"statefarm":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"krasnik":[],"leczna":[],"lubartow":[],"lublin":[],"poniatowa":[],"swidnik":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"ca":{"barsy":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]},"co":[],"arvo":[],"azimuth":[]},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"go-vip":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"in-dsl":[],"in-vpn":[],"ipifony":[],"iobb":[],"kinghost":[],"uni5":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"siteleaf":[],"srcf":{"soc":[],"user":[]},"dsmynas":[],"familyds":[],"yandexcloud":{"storage":[],"website":[]},"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"wpcomstaging":[],"balena-devices":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"trycloudflare":[],"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastly-terrarium":[],"fastvps-server":[],"mydobiss":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lpusercontent":[],"lmpm":{"app":[]},"linode":{"members":[],"nodebalancer":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qualifioapp":[],"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"render":{"app":[]},"onrender":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"shopitsite":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"stackhero-network":[],"stdlib":{"api":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"thingdustdata":[],"bloxcms":[],"townnews-staging":[],"hk":[],"wafflecell":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[],"cn-northwest-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}},"instantcloud":[]},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"in-dsl":[],"in-vpn":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"pubtls":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"edugit":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"io":{"apigee":[],"b-data":[],"backplaneapp":[],"banzaicloud":{"app":[]},"boxfuse":[],"browsersafetymark":[],"bigv":{"uk0":[]},"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"moonscale":{"*":[]},"loginline":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"dyn53":[],"protonet":[],"vaporcloud":[],"on-rio":{"*":[]},"readthedocs":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"shiftedit":[],"mo-siemens":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"applicationcloud":[],"scapp":[],"s5y":{"*":[]},"telebit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[],"basicserver":[],"virtualserver":[]},"jp":{"ne":{"aseinet":{"user":[]},"gehirn":[]},"usercontent":[],"blogspot":[]},"vc":{"gv":{"d":[]},"nom":[]},"eus":{"party":{"user":[]}},"co":{"go-vip":[],"carrd":[],"crd":[],"otap":{"*":[]},"com":{"blogspot":[]},"leadpages":[],"lpages":[],"mypi":[],"n4t":[],"nodum":[],"repl":[]},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"dyn-berlin":[],"in-berlin":[],"in-brb":[],"in-butter":[],"in-dsl":[],"in-vpn":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[]},"uk":{"co":{"bytemark":{"dh":[],"vm":[]},"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"gov":{"service":[],"homeoffice":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"ai":{"uwu":[],"nom":[]},"se":{"com":[],"blogspot":[],"conf":[]},"bz":{"za":[],"nym":[]},"group":{"discourse":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"khplay":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"dev":{"lcl":{"*":[]},"stg":{"*":[]},"workers":[],"iserv":[],"loginline":[],"webhare":{"*":[]}},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"filegear-au":[],"filegear-de":[],"filegear-gb":[],"filegear-ie":[],"filegear-jp":[],"filegear-sg":[],"glitch":[],"ravendb":[],"barsy":[],"nctu":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"zone":{"cloud66":[],"hs":[],"triton":{"*":[]},"lima":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"site":{"cloudera":[],"cyon":[],"lelux":[],"loginline":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"app":{"wnext":[],"run":{"a":[]},"web":[],"hasura":[],"loginline":[],"telebit":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"bpl":[],"orx":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[],"pony":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[],"dweb":{"*":[]}},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"earth":{"dapps":{"*":[],"bzz":{"*":[]}}},"th":{"online":[],"shop":[]},"fi":{"dy":[],"blogspot":[],"xn--hkkinen-5wa":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[],"builder":{"site":[]},"enterprisecloud":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[],"telebit":{"*":[]}},"one":{"onred":{"staging":[]},"for":[],"homelink":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"on-rancher":{"*":[]},"sensiosite":{"*":[]},"trafficplex":[],"voorloper":[]},"ms":{"lab":[]},"digital":{"cloudapps":{"london":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]},"zone":[]},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]},"col":[],"firm":[],"gen":[],"ltd":[]},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"nym":[],"ltd":[],"inc":[]},"hr":{"blogspot":[],"free":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[],"syncloud":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"caa":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"ua":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"ci":{"fin":[]},"run":{"hs":[],"development":[],"ravendb":[],"repl":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"community":{"ravendb":[]},"city":{"ng":[]},"gl":{"biz":[],"nom":[]},"ink":{"ng":[]},"school":{"ng":[]},"so":{"sch":[]},"gg":{"kaas":[],"cya":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"business":{"co":[]},"education":{"co":[]},"events":{"co":[]},"financial":{"co":[]},"place":{"co":[]},"technology":{"co":[]},"space":{"linkitools":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"services":{"loginline":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"casa":{"nabu":{"ui":[]}},"fashion":{"of":[],"on":[]},"football":{"of":[]},"london":{"in":[],"of":[]},"men":{"for":[]},"mom":{"and":[],"for":[]},"sale":{"for":[]},"work":{"of":[],"to":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ec":{"nym":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vg":{"nom":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"bn":{"co":[]},"page":{"prvcy":[]},"fit":{"ptplus":[]},"edu":{"rit":{"git-pages":[]}},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]},"design":{"bss":[]}}}"; \ No newline at end of file diff --git a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache old mode 100755 new mode 100644 index 9b12c844..eca8fa8d --- a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache +++ b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache @@ -1 +1 @@ -s:13408:"{"version":"2019041000","modifiedDate":"2019-04-10T07:07:02+00:00","records":["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac","academy","accenture","accountant","accountants","aco","actor","ad","adac","ads","adult","ae","aeg","aero","aetna","af","afamilycompany","afl","africa","ag","agakhan","agency","ai","aig","aigo","airbus","airforce","airtel","akdn","al","alfaromeo","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","am","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","ao","aol","apartments","app","apple","aq","aquarelle","ar","arab","aramco","archi","army","arpa","art","arte","as","asda","asia","associates","at","athleta","attorney","au","auction","audi","audible","audio","auspost","author","auto","autos","avianca","aw","aws","ax","axa","az","azure","ba","baby","baidu","banamex","bananarepublic","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bb","bbc","bbt","bbva","bcg","bcn","bd","be","beats","beauty","beer","bentley","berlin","best","bestbuy","bet","bf","bg","bh","bharti","bi","bible","bid","bike","bing","bingo","bio","biz","bj","black","blackfriday","blockbuster","blog","bloomberg","blue","bm","bms","bmw","bn","bnl","bnpparibas","bo","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","br","bradesco","bridgestone","broadway","broker","brother","brussels","bs","bt","budapest","bugatti","build","builders","business","buy","buzz","bv","bw","by","bz","bzh","ca","cab","cafe","cal","call","calvinklein","cam","camera","camp","cancerresearch","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","cartier","casa","case","caseih","cash","casino","cat","catering","catholic","cba","cbn","cbre","cbs","cc","cd","ceb","center","ceo","cern","cf","cfa","cfd","cg","ch","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","chrysler","church","ci","cipriani","circle","cisco","citadel","citi","citic","city","cityeats","ck","cl","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","cm","cn","co","coach","codes","coffee","college","cologne","com","comcast","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cookingchannel","cool","coop","corsica","country","coupon","coupons","courses","cr","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","csc","cu","cuisinella","cv","cw","cx","cy","cymru","cyou","cz","dabur","dad","dance","data","date","dating","datsun","day","dclk","dds","de","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dj","dk","dm","dnp","do","docs","doctor","dodge","dog","domains","dot","download","drive","dtv","dubai","duck","dunlop","duns","dupont","durban","dvag","dvr","dz","earth","eat","ec","eco","edeka","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","epson","equipment","er","ericsson","erni","es","esq","estate","esurance","et","etisalat","eu","eurovision","eus","events","everbank","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fi","fiat","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","fj","fk","flickr","flights","flir","florist","flowers","fly","fm","fo","foo","food","foodnetwork","football","ford","forex","forsale","forum","foundation","fox","fr","free","fresenius","frl","frogans","frontdoor","frontier","ftr","fujitsu","fujixerox","fun","fund","furniture","futbol","fyi","ga","gal","gallery","gallo","gallup","game","games","gap","garden","gb","gbiz","gd","gdn","ge","gea","gent","genting","george","gf","gg","ggee","gh","gi","gift","gifts","gives","giving","gl","glade","glass","gle","global","globo","gm","gmail","gmbh","gmo","gmx","gn","godaddy","gold","goldpoint","golf","goo","goodyear","goog","google","gop","got","gov","gp","gq","gr","grainger","graphics","gratis","green","gripe","grocery","group","gs","gt","gu","guardian","gucci","guge","guide","guitars","guru","gw","gy","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hgtv","hiphop","hisamitsu","hitachi","hiv","hk","hkt","hm","hn","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","honeywell","horse","hospital","host","hosting","hot","hoteles","hotels","hotmail","house","how","hr","hsbc","ht","hu","hughes","hyatt","hyundai","ibm","icbc","ice","icu","id","ie","ieee","ifm","ikano","il","im","imamat","imdb","immo","immobilien","in","inc","industries","infiniti","info","ing","ink","institute","insurance","insure","int","intel","international","intuit","investments","io","ipiranga","iq","ir","irish","is","iselect","ismaili","ist","istanbul","it","itau","itv","iveco","jaguar","java","jcb","jcp","je","jeep","jetzt","jewelry","jio","jll","jm","jmp","jnj","jo","jobs","joburg","jot","joy","jp","jpmorgan","jprs","juegos","juniper","kaufen","kddi","ke","kerryhotels","kerrylogistics","kerryproperties","kfh","kg","kh","ki","kia","kim","kinder","kindle","kitchen","kiwi","km","kn","koeln","komatsu","kosher","kp","kpmg","kpn","kr","krd","kred","kuokgroup","kw","ky","kyoto","kz","la","lacaixa","ladbrokes","lamborghini","lamer","lancaster","lancia","lancome","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lb","lc","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","li","liaison","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","linde","link","lipsy","live","living","lixil","lk","llc","loan","loans","locker","locus","loft","lol","london","lotte","lotto","love","lpl","lplfinancial","lr","ls","lt","ltd","ltda","lu","lundbeck","lupin","luxe","luxury","lv","ly","ma","macys","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","maserati","mattel","mba","mc","mckinsey","md","me","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","metlife","mg","mh","miami","microsoft","mil","mini","mint","mit","mitsubishi","mk","ml","mlb","mls","mm","mma","mn","mo","mobi","mobile","mobily","moda","moe","moi","mom","monash","money","monster","mopar","mormon","mortgage","moscow","moto","motorcycles","mov","movie","movistar","mp","mq","mr","ms","msd","mt","mtn","mtr","mu","museum","mutual","mv","mw","mx","my","mz","na","nab","nadex","nagoya","name","nationwide","natura","navy","nba","nc","ne","nec","net","netbank","netflix","network","neustar","new","newholland","news","next","nextdirect","nexus","nf","nfl","ng","ngo","nhk","ni","nico","nike","nikon","ninja","nissan","nissay","nl","no","nokia","northwesternmutual","norton","now","nowruz","nowtv","np","nr","nra","nrw","ntt","nu","nyc","nz","obi","observer","off","office","okinawa","olayan","olayangroup","oldnavy","ollo","om","omega","one","ong","onl","online","onyourside","ooo","open","oracle","orange","org","organic","origins","osaka","otsuka","ott","ovh","pa","page","panasonic","paris","pars","partners","parts","party","passagens","pay","pccw","pe","pet","pf","pfizer","pg","ph","pharmacy","phd","philips","phone","photo","photography","photos","physio","piaget","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","pk","pl","place","play","playstation","plumbing","plus","pm","pn","pnc","pohl","poker","politie","porn","post","pr","pramerica","praxi","press","prime","pro","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","ps","pt","pub","pw","pwc","py","qa","qpon","quebec","quest","qvc","racing","radio","raid","re","read","realestate","realtor","realty","recipes","red","redstone","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","rightathome","ril","rio","rip","rmit","ro","rocher","rocks","rodeo","rogers","room","rs","rsvp","ru","rugby","ruhr","run","rw","rwe","ryukyu","sa","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sb","sbi","sbs","sc","sca","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scjohnson","scor","scot","sd","se","search","seat","secure","security","seek","select","sener","services","ses","seven","sew","sex","sexy","sfr","sg","sh","shangrila","sharp","shaw","shell","shia","shiksha","shoes","shop","shopping","shouji","show","showtime","shriram","si","silk","sina","singles","site","sj","sk","ski","skin","sky","skype","sl","sling","sm","smart","smile","sn","sncf","so","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","space","sport","spot","spreadbetting","sr","srl","srt","ss","st","stada","staples","star","starhub","statebank","statefarm","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","su","sucks","supplies","supply","support","surf","surgery","suzuki","sv","swatch","swiftcover","swiss","sx","sy","sydney","symantec","systems","sz","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tc","tci","td","tdk","team","tech","technology","tel","telefonica","temasek","tennis","teva","tf","tg","th","thd","theater","theatre","tiaa","tickets","tienda","tiffany","tips","tires","tirol","tj","tjmaxx","tjx","tk","tkmaxx","tl","tm","tmall","tn","to","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","tr","trade","trading","training","travel","travelchannel","travelers","travelersinsurance","trust","trv","tt","tube","tui","tunes","tushu","tv","tvs","tw","tz","ua","ubank","ubs","uconnect","ug","uk","unicom","university","uno","uol","ups","us","uy","uz","va","vacations","vana","vanguard","vc","ve","vegas","ventures","verisign","versicherung","vet","vg","vi","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","vistaprint","viva","vivo","vlaanderen","vn","vodka","volkswagen","volvo","vote","voting","voto","voyage","vu","vuelos","wales","walmart","walter","wang","wanggou","warman","watch","watches","weather","weatherchannel","webcam","weber","website","wed","wedding","weibo","weir","wf","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","ws","wtc","wtf","xbox","xerox","xfinity","xihuan","xin","xn--11b4c3d","xn--1ck2e1b","xn--1qqw23a","xn--2scrj9c","xn--30rr7y","xn--3bst00m","xn--3ds443g","xn--3e0b707e","xn--3hcrj9c","xn--3oq18vl8pn36a","xn--3pxu8k","xn--42c2d9a","xn--45br5cyl","xn--45brj9c","xn--45q11c","xn--4gbrim","xn--54b7fta0cc","xn--55qw42g","xn--55qx5d","xn--5su34j936bgsg","xn--5tzm5g","xn--6frz82g","xn--6qq986b3xl","xn--80adxhks","xn--80ao21a","xn--80aqecdr1a","xn--80asehdb","xn--80aswg","xn--8y0a063a","xn--90a3ac","xn--90ae","xn--90ais","xn--9dbq2a","xn--9et52u","xn--9krt00a","xn--b4w605ferd","xn--bck1b9a5dre4c","xn--c1avg","xn--c2br7g","xn--cck2b3b","xn--cg4bki","xn--clchc0ea0b2g2a9gcd","xn--czr694b","xn--czrs0t","xn--czru2d","xn--d1acj3b","xn--d1alf","xn--e1a4c","xn--eckvdtc9d","xn--efvy88h","xn--estv75g","xn--fct429k","xn--fhbei","xn--fiq228c5hs","xn--fiq64b","xn--fiqs8s","xn--fiqz9s","xn--fjq720a","xn--flw351e","xn--fpcrj9c3d","xn--fzc2c9e2c","xn--fzys8d69uvgm","xn--g2xx48c","xn--gckr3f0f","xn--gecrj9c","xn--gk3at1e","xn--h2breg3eve","xn--h2brj9c","xn--h2brj9c8c","xn--hxt814e","xn--i1b6b1a6a2e","xn--imr513n","xn--io0a7i","xn--j1aef","xn--j1amh","xn--j6w193g","xn--jlq61u9w7b","xn--jvr189m","xn--kcrx77d1x4a","xn--kprw13d","xn--kpry57d","xn--kpu716f","xn--kput3i","xn--l1acc","xn--lgbbat1ad8j","xn--mgb9awbf","xn--mgba3a3ejt","xn--mgba3a4f16a","xn--mgba7c0bbn0a","xn--mgbaakc7dvf","xn--mgbaam7a8h","xn--mgbab2bd","xn--mgbah1a3hjkrd","xn--mgbai9azgqp6j","xn--mgbayh7gpa","xn--mgbb9fbpob","xn--mgbbh1a","xn--mgbbh1a71e","xn--mgbc0a9azcg","xn--mgbca7dzdo","xn--mgberp4a5d4ar","xn--mgbgu82a","xn--mgbi4ecexp","xn--mgbpl2fh","xn--mgbt3dhd","xn--mgbtx2b","xn--mgbx4cd0ab","xn--mix891f","xn--mk1bu44c","xn--mxtq1m","xn--ngbc5azd","xn--ngbe9e0a","xn--ngbrx","xn--node","xn--nqv7f","xn--nqv7fs00ema","xn--nyqy26a","xn--o3cw4h","xn--ogbpf8fl","xn--otu796d","xn--p1acf","xn--p1ai","xn--pbt977c","xn--pgbs0dh","xn--pssy2u","xn--q9jyb4c","xn--qcka1pmc","xn--qxam","xn--rhqv96g","xn--rovu88b","xn--rvc1e0am3e","xn--s9brj9c","xn--ses554g","xn--t60b56a","xn--tckwe","xn--tiq49xqyj","xn--unup4y","xn--vermgensberater-ctb","xn--vermgensberatung-pwb","xn--vhquv","xn--vuq861b","xn--w4r85el8fhu5dnra","xn--w4rs40l","xn--wgbh1c","xn--wgbl6a","xn--xhq521b","xn--xkc2al3hye2a","xn--xkc2dl3a5ee0h","xn--y9a3aq","xn--yfro4i67o","xn--ygbi2ammx","xn--zfr164b","xxx","xyz","yachts","yahoo","yamaxun","yandex","ye","yodobashi","yoga","yokohama","you","youtube","yt","yun","za","zappos","zara","zero","zip","zm","zone","zuerich","zw"]}"; \ No newline at end of file +s:13369:"{"version":"2019090300","modifiedDate":"2019-09-03T07:07:01+00:00","records":["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac","academy","accenture","accountant","accountants","aco","actor","ad","adac","ads","adult","ae","aeg","aero","aetna","af","afamilycompany","afl","africa","ag","agakhan","agency","ai","aig","aigo","airbus","airforce","airtel","akdn","al","alfaromeo","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","am","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","ao","aol","apartments","app","apple","aq","aquarelle","ar","arab","aramco","archi","army","arpa","art","arte","as","asda","asia","associates","at","athleta","attorney","au","auction","audi","audible","audio","auspost","author","auto","autos","avianca","aw","aws","ax","axa","az","azure","ba","baby","baidu","banamex","bananarepublic","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bb","bbc","bbt","bbva","bcg","bcn","bd","be","beats","beauty","beer","bentley","berlin","best","bestbuy","bet","bf","bg","bh","bharti","bi","bible","bid","bike","bing","bingo","bio","biz","bj","black","blackfriday","blockbuster","blog","bloomberg","blue","bm","bms","bmw","bn","bnpparibas","bo","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","br","bradesco","bridgestone","broadway","broker","brother","brussels","bs","bt","budapest","bugatti","build","builders","business","buy","buzz","bv","bw","by","bz","bzh","ca","cab","cafe","cal","call","calvinklein","cam","camera","camp","cancerresearch","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","cartier","casa","case","caseih","cash","casino","cat","catering","catholic","cba","cbn","cbre","cbs","cc","cd","ceb","center","ceo","cern","cf","cfa","cfd","cg","ch","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","chrysler","church","ci","cipriani","circle","cisco","citadel","citi","citic","city","cityeats","ck","cl","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","cm","cn","co","coach","codes","coffee","college","cologne","com","comcast","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cookingchannel","cool","coop","corsica","country","coupon","coupons","courses","cr","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","csc","cu","cuisinella","cv","cw","cx","cy","cymru","cyou","cz","dabur","dad","dance","data","date","dating","datsun","day","dclk","dds","de","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dj","dk","dm","dnp","do","docs","doctor","dodge","dog","domains","dot","download","drive","dtv","dubai","duck","dunlop","dupont","durban","dvag","dvr","dz","earth","eat","ec","eco","edeka","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","epson","equipment","er","ericsson","erni","es","esq","estate","esurance","et","etisalat","eu","eurovision","eus","events","everbank","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fi","fiat","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","fj","fk","flickr","flights","flir","florist","flowers","fly","fm","fo","foo","food","foodnetwork","football","ford","forex","forsale","forum","foundation","fox","fr","free","fresenius","frl","frogans","frontdoor","frontier","ftr","fujitsu","fujixerox","fun","fund","furniture","futbol","fyi","ga","gal","gallery","gallo","gallup","game","games","gap","garden","gay","gb","gbiz","gd","gdn","ge","gea","gent","genting","george","gf","gg","ggee","gh","gi","gift","gifts","gives","giving","gl","glade","glass","gle","global","globo","gm","gmail","gmbh","gmo","gmx","gn","godaddy","gold","goldpoint","golf","goo","goodyear","goog","google","gop","got","gov","gp","gq","gr","grainger","graphics","gratis","green","gripe","grocery","group","gs","gt","gu","guardian","gucci","guge","guide","guitars","guru","gw","gy","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hgtv","hiphop","hisamitsu","hitachi","hiv","hk","hkt","hm","hn","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","horse","hospital","host","hosting","hot","hoteles","hotels","hotmail","house","how","hr","hsbc","ht","hu","hughes","hyatt","hyundai","ibm","icbc","ice","icu","id","ie","ieee","ifm","ikano","il","im","imamat","imdb","immo","immobilien","in","inc","industries","infiniti","info","ing","ink","institute","insurance","insure","int","intel","international","intuit","investments","io","ipiranga","iq","ir","irish","is","ismaili","ist","istanbul","it","itau","itv","iveco","jaguar","java","jcb","jcp","je","jeep","jetzt","jewelry","jio","jll","jm","jmp","jnj","jo","jobs","joburg","jot","joy","jp","jpmorgan","jprs","juegos","juniper","kaufen","kddi","ke","kerryhotels","kerrylogistics","kerryproperties","kfh","kg","kh","ki","kia","kim","kinder","kindle","kitchen","kiwi","km","kn","koeln","komatsu","kosher","kp","kpmg","kpn","kr","krd","kred","kuokgroup","kw","ky","kyoto","kz","la","lacaixa","ladbrokes","lamborghini","lamer","lancaster","lancia","lancome","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lb","lc","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","li","liaison","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","linde","link","lipsy","live","living","lixil","lk","llc","loan","loans","locker","locus","loft","lol","london","lotte","lotto","love","lpl","lplfinancial","lr","ls","lt","ltd","ltda","lu","lundbeck","lupin","luxe","luxury","lv","ly","ma","macys","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","maserati","mattel","mba","mc","mckinsey","md","me","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","metlife","mg","mh","miami","microsoft","mil","mini","mint","mit","mitsubishi","mk","ml","mlb","mls","mm","mma","mn","mo","mobi","mobile","mobily","moda","moe","moi","mom","monash","money","monster","mopar","mormon","mortgage","moscow","moto","motorcycles","mov","movie","movistar","mp","mq","mr","ms","msd","mt","mtn","mtr","mu","museum","mutual","mv","mw","mx","my","mz","na","nab","nadex","nagoya","name","nationwide","natura","navy","nba","nc","ne","nec","net","netbank","netflix","network","neustar","new","newholland","news","next","nextdirect","nexus","nf","nfl","ng","ngo","nhk","ni","nico","nike","nikon","ninja","nissan","nissay","nl","no","nokia","northwesternmutual","norton","now","nowruz","nowtv","np","nr","nra","nrw","ntt","nu","nyc","nz","obi","observer","off","office","okinawa","olayan","olayangroup","oldnavy","ollo","om","omega","one","ong","onl","online","onyourside","ooo","open","oracle","orange","org","organic","origins","osaka","otsuka","ott","ovh","pa","page","panasonic","paris","pars","partners","parts","party","passagens","pay","pccw","pe","pet","pf","pfizer","pg","ph","pharmacy","phd","philips","phone","photo","photography","photos","physio","piaget","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","pk","pl","place","play","playstation","plumbing","plus","pm","pn","pnc","pohl","poker","politie","porn","post","pr","pramerica","praxi","press","prime","pro","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","ps","pt","pub","pw","pwc","py","qa","qpon","quebec","quest","qvc","racing","radio","raid","re","read","realestate","realtor","realty","recipes","red","redstone","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","rightathome","ril","rio","rip","rmit","ro","rocher","rocks","rodeo","rogers","room","rs","rsvp","ru","rugby","ruhr","run","rw","rwe","ryukyu","sa","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sb","sbi","sbs","sc","sca","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scjohnson","scor","scot","sd","se","search","seat","secure","security","seek","select","sener","services","ses","seven","sew","sex","sexy","sfr","sg","sh","shangrila","sharp","shaw","shell","shia","shiksha","shoes","shop","shopping","shouji","show","showtime","shriram","si","silk","sina","singles","site","sj","sk","ski","skin","sky","skype","sl","sling","sm","smart","smile","sn","sncf","so","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","space","sport","spot","spreadbetting","sr","srl","srt","ss","st","stada","staples","star","statebank","statefarm","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","su","sucks","supplies","supply","support","surf","surgery","suzuki","sv","swatch","swiftcover","swiss","sx","sy","sydney","symantec","systems","sz","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tc","tci","td","tdk","team","tech","technology","tel","telefonica","temasek","tennis","teva","tf","tg","th","thd","theater","theatre","tiaa","tickets","tienda","tiffany","tips","tires","tirol","tj","tjmaxx","tjx","tk","tkmaxx","tl","tm","tmall","tn","to","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","tr","trade","trading","training","travel","travelchannel","travelers","travelersinsurance","trust","trv","tt","tube","tui","tunes","tushu","tv","tvs","tw","tz","ua","ubank","ubs","uconnect","ug","uk","unicom","university","uno","uol","ups","us","uy","uz","va","vacations","vana","vanguard","vc","ve","vegas","ventures","verisign","versicherung","vet","vg","vi","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","vistaprint","viva","vivo","vlaanderen","vn","vodka","volkswagen","volvo","vote","voting","voto","voyage","vu","vuelos","wales","walmart","walter","wang","wanggou","warman","watch","watches","weather","weatherchannel","webcam","weber","website","wed","wedding","weibo","weir","wf","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","ws","wtc","wtf","xbox","xerox","xfinity","xihuan","xin","xn--11b4c3d","xn--1ck2e1b","xn--1qqw23a","xn--2scrj9c","xn--30rr7y","xn--3bst00m","xn--3ds443g","xn--3e0b707e","xn--3hcrj9c","xn--3oq18vl8pn36a","xn--3pxu8k","xn--42c2d9a","xn--45br5cyl","xn--45brj9c","xn--45q11c","xn--4gbrim","xn--54b7fta0cc","xn--55qw42g","xn--55qx5d","xn--5su34j936bgsg","xn--5tzm5g","xn--6frz82g","xn--6qq986b3xl","xn--80adxhks","xn--80ao21a","xn--80aqecdr1a","xn--80asehdb","xn--80aswg","xn--8y0a063a","xn--90a3ac","xn--90ae","xn--90ais","xn--9dbq2a","xn--9et52u","xn--9krt00a","xn--b4w605ferd","xn--bck1b9a5dre4c","xn--c1avg","xn--c2br7g","xn--cck2b3b","xn--cg4bki","xn--clchc0ea0b2g2a9gcd","xn--czr694b","xn--czrs0t","xn--czru2d","xn--d1acj3b","xn--d1alf","xn--e1a4c","xn--eckvdtc9d","xn--efvy88h","xn--estv75g","xn--fct429k","xn--fhbei","xn--fiq228c5hs","xn--fiq64b","xn--fiqs8s","xn--fiqz9s","xn--fjq720a","xn--flw351e","xn--fpcrj9c3d","xn--fzc2c9e2c","xn--fzys8d69uvgm","xn--g2xx48c","xn--gckr3f0f","xn--gecrj9c","xn--gk3at1e","xn--h2breg3eve","xn--h2brj9c","xn--h2brj9c8c","xn--hxt814e","xn--i1b6b1a6a2e","xn--imr513n","xn--io0a7i","xn--j1aef","xn--j1amh","xn--j6w193g","xn--jlq61u9w7b","xn--jvr189m","xn--kcrx77d1x4a","xn--kprw13d","xn--kpry57d","xn--kpu716f","xn--kput3i","xn--l1acc","xn--lgbbat1ad8j","xn--mgb9awbf","xn--mgba3a3ejt","xn--mgba3a4f16a","xn--mgba7c0bbn0a","xn--mgbaakc7dvf","xn--mgbaam7a8h","xn--mgbab2bd","xn--mgbah1a3hjkrd","xn--mgbai9azgqp6j","xn--mgbayh7gpa","xn--mgbb9fbpob","xn--mgbbh1a","xn--mgbbh1a71e","xn--mgbc0a9azcg","xn--mgbca7dzdo","xn--mgberp4a5d4ar","xn--mgbgu82a","xn--mgbi4ecexp","xn--mgbpl2fh","xn--mgbt3dhd","xn--mgbtx2b","xn--mgbx4cd0ab","xn--mix891f","xn--mk1bu44c","xn--mxtq1m","xn--ngbc5azd","xn--ngbe9e0a","xn--ngbrx","xn--node","xn--nqv7f","xn--nqv7fs00ema","xn--nyqy26a","xn--o3cw4h","xn--ogbpf8fl","xn--otu796d","xn--p1acf","xn--p1ai","xn--pbt977c","xn--pgbs0dh","xn--pssy2u","xn--q9jyb4c","xn--qcka1pmc","xn--qxam","xn--rhqv96g","xn--rovu88b","xn--rvc1e0am3e","xn--s9brj9c","xn--ses554g","xn--t60b56a","xn--tckwe","xn--tiq49xqyj","xn--unup4y","xn--vermgensberater-ctb","xn--vermgensberatung-pwb","xn--vhquv","xn--vuq861b","xn--w4r85el8fhu5dnra","xn--w4rs40l","xn--wgbh1c","xn--wgbl6a","xn--xhq521b","xn--xkc2al3hye2a","xn--xkc2dl3a5ee0h","xn--y9a3aq","xn--yfro4i67o","xn--ygbi2ammx","xn--zfr164b","xxx","xyz","yachts","yahoo","yamaxun","yandex","ye","yodobashi","yoga","yokohama","you","youtube","yt","yun","za","zappos","zara","zero","zip","zm","zone","zuerich","zw"]}"; \ No newline at end of file diff --git a/phpunit.xml.dist b/phpunit.xml.dist index f1e2c5fc..f6cdf9ac 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -21,7 +21,6 @@ src - src src src/Installer diff --git a/src/Installer.php b/src/Installer.php index fa716295..ec954f89 100644 --- a/src/Installer.php +++ b/src/Installer.php @@ -16,23 +16,142 @@ namespace Pdp; use Composer\Script\Event; +use Psr\Log\LoggerInterface; +use Psr\SimpleCache\CacheException as PsrCacheException; use Throwable; -use function dirname; +use function array_merge; use function extension_loaded; +use function file_exists; +use function filter_var_array; use function fwrite; -use function implode; -use function is_dir; -use const PHP_EOL; +use const FILTER_FLAG_STRIP_LOW; +use const FILTER_SANITIZE_STRING; +use const FILTER_VALIDATE_BOOLEAN; use const STDERR; -use const STDOUT; /** - * A class to manage PSL ICANN Section rules updates. + * A class to install and update local cache. * * @author Ignace Nyamagana Butera */ final class Installer { + const CACHE_DIR_KEY = 'cache-dir'; + const REFRESH_PSL_KEY = 'psl'; + const REFRESH_PSL_URL_KEY = 'psl-url'; + const REFRESH_RZD_KEY = 'rzd'; + const REFRESH_RZD_URL_KEY = 'rzd-url'; + const TTL_KEY = 'ttl'; + + const DEFAULT_CONTEXT = [ + self::CACHE_DIR_KEY => '', + self::REFRESH_PSL_KEY => false, + self::REFRESH_PSL_URL_KEY => Manager::PSL_URL, + self::REFRESH_RZD_KEY => false, + self::REFRESH_RZD_URL_KEY => Manager::RZD_URL, + self::TTL_KEY => '1 DAY', + ]; + + /** + * @var Manager + */ + private $manager; + + /** + * @var LoggerInterface + */ + private $logger; + + public function __construct(Manager $manager, LoggerInterface $logger) + { + $this->manager = $manager; + $this->logger = $logger; + } + + /** + * Creates a new installer instance with a Pdp\Cache. + * @param LoggerInterface $logger + * @param string $cacheDir + */ + public static function createFromCacheDir(LoggerInterface $logger, string $cacheDir = ''): self + { + return new self(new Manager(new Cache($cacheDir), new CurlHttpClient()), $logger); + } + + public function refresh(array $context = []): int + { + $context = filter_var_array(array_merge(self::DEFAULT_CONTEXT, $context), [ + self::REFRESH_PSL_KEY => FILTER_VALIDATE_BOOLEAN, + self::REFRESH_PSL_URL_KEY => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW, 'default' => Manager::PSL_URL], + self::REFRESH_RZD_KEY => FILTER_VALIDATE_BOOLEAN, + self::REFRESH_RZD_URL_KEY => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW, 'default' => Manager::RZD_URL], + self::TTL_KEY => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW, 'default' => '1 DAY'], + ]); + + if (false === $context[self::REFRESH_RZD_KEY] && false === $context[self::REFRESH_PSL_KEY]) { + $context[self::REFRESH_PSL_KEY] = true; + $context[self::REFRESH_RZD_KEY] = true; + } + + try { + $retVal = $this->execute($context); + } catch (PsrCacheException $exception) { + $this->logger->error('😓 😓 😓 Your local cache could not be updated. 😓 😓 😓'); + $this->logger->error('An error occurred during cache regeneration.'); + $this->logger->error('----- Error Message ----'); + $this->logger->error($exception->getMessage()); + $retVal = 1; + } catch (Throwable $exception) { + $this->logger->error('😓 😓 😓 Your local cache could not be updated. 😓 😓 😓'); + $this->logger->error('An error occurred during the update.'); + $this->logger->error('----- Error Message ----'); + $this->logger->error($exception->getMessage()); + $retVal = 1; + } + + return $retVal; + } + + /** + * Refreshes the cache. + * + * @param array $arguments + * + * @throws PsrCacheException + */ + private function execute(array $arguments = []): int + { + $this->logger->info('Updating your Pdp local cache.'); + + if ($arguments[self::REFRESH_PSL_KEY]) { + $this->logger->info('Updating your Public Suffix List copy.'); + if (!$this->manager->refreshRules($arguments[self::REFRESH_PSL_URL_KEY], $arguments[self::TTL_KEY])) { + $this->logger->error('😓 😓 😓 Your Public Suffix List copy could not be updated. 😓 😓 😓'); + $this->logger->error('Please review your settings.'); + + return 1; + } + + $this->logger->info('💪 💪 💪 Your Public Suffix List copy is updated. 💪 💪 💪'); + } + + if (!$arguments[self::REFRESH_RZD_KEY]) { + return 0; + } + + $this->logger->info('Updating your IANA Root Zone Database copy.'); + if ($this->manager->refreshTLDs($arguments[self::REFRESH_RZD_URL_KEY], $arguments[self::TTL_KEY])) { + $this->logger->info('💪 💪 💪 Your IANA Root Zone Database copy is updated. 💪 💪 💪'); + + return 0; + } + + $this->logger->error('😓 😓 😓 Your IANA Root Zone Database copy could not be updated. 😓 😓 😓'); + $this->logger->error('Please review your settings.'); + + return 1; + } + /** * Script to update the local cache using composer hook. * @@ -40,56 +159,44 @@ final class Installer */ public static function updateLocalCache(Event $event = null) { - $io = static::getIO($event); - $vendor = static::getVendorPath($event); + if (!extension_loaded('curl')) { + fwrite(STDERR, 'The PHP cURL extension is missing.'); + + die(1); + } + + $vendor = self::getVendorPath($event); if (null === $vendor) { - $io->writeError([ + fwrite(STDERR, implode(PHP_EOL, [ 'You must set up the project dependencies using composer', 'see https://getcomposer.org', - ]); + ]).PHP_EOL); die(1); } require $vendor.'/autoload.php'; - $io->write('Updating your Public Suffix List local cache.'); - if (!extension_loaded('curl')) { - $io->writeError([ - '😓 😓 😓 Your local cache could not be updated. 😓 😓 😓', - 'The PHP cURL extension is missing.', - ]); - die(1); - } + $arguments = [ + self::CACHE_DIR_KEY => '', + self::REFRESH_PSL_KEY => false, + self::REFRESH_RZD_KEY => false, + self::TTL_KEY => '1 DAY', + ]; - try { - $manager = new Manager(new Cache(), new CurlHttpClient()); - if ($manager->refreshRules() && $manager->refreshTLDs()) { - $io->write([ - '💪 💪 💪 Your local cache has been successfully updated. 💪 💪 💪', - 'Have a nice day!', - ]); - die(0); - } - $io->writeError([ - '😓 😓 😓 Your local cache could not be updated. 😓 😓 😓', - 'Please verify you can write in your local cache directory.', - ]); - die(1); - } catch (Throwable $e) { - $io->writeError([ - '😓 😓 😓 Your local cache could not be updated. 😓 😓 😓', - 'An error occurred during the update.', - '----- Error Message ----', - ]); - $io->writeError($e->getMessage()); - die(1); + if (null !== $event) { + $arguments = array_replace($arguments, $event->getArguments()); } + + $installer = self::createFromCacheDir(new Logger(), $arguments[Installer::CACHE_DIR_KEY]); + $retVal = $installer->refresh($arguments); + + die($retVal); } /** * Detect the vendor path. * - * @param Event $event + * @param Event|null $event * * @return string|null */ @@ -100,41 +207,11 @@ private static function getVendorPath(Event $event = null) } for ($i = 1; $i <= 5; $i++) { - if (is_dir($vendor = dirname(__DIR__, $i).'/vendor')) { + if (is_dir($vendor = dirname(__DIR__, $i).'/vendor') && file_exists($vendor.'/autoload.php')) { return $vendor; } } return null; } - - /** - * Detect the I/O interface to use. - * - * @param Event|null $event - * - * @return mixed - */ - private static function getIO(Event $event = null) - { - return null !== $event ? $event->getIO() : new class() { - public function write($messages, bool $newline = true, int $verbosity = 2) - { - $this->doWrite($messages, $newline, false, $verbosity); - } - - public function writeError($messages, bool $newline = true, int $verbosity = 2) - { - $this->doWrite($messages, $newline, true, $verbosity); - } - - private function doWrite($messages, bool $newline, bool $stderr, int $verbosity) - { - fwrite( - $stderr ? STDERR : STDOUT, - implode($newline ? PHP_EOL : '', (array) $messages).PHP_EOL - ); - } - }; - } } diff --git a/src/Logger.php b/src/Logger.php new file mode 100644 index 00000000..7005ba87 --- /dev/null +++ b/src/Logger.php @@ -0,0 +1,64 @@ + 1, + LogLevel::ALERT => 1, + LogLevel::CRITICAL => 1, + LogLevel::ERROR => 1, + LogLevel::WARNING => 1, + LogLevel::NOTICE => 1, + ]; + + /** + * @var resource + */ + private $out; + + /** + * @var resource + */ + private $error; + + public function __construct($out = STDOUT, $error = STDERR) + { + $this->out = $out; + $this->error = $error; + } + + /** + * @inheritDoc + */ + public function log($level, $message, array $context = []) + { + $replace = []; + foreach ($context as $key => $val) { + $replace['{'.$key.'}'] = $val; + } + + fwrite(isset(self::ERRORS_LEVELS[$level]) ? $this->error : $this->out, $message.PHP_EOL); + } +} diff --git a/tests/InstallerTest.php b/tests/InstallerTest.php new file mode 100644 index 00000000..b8745617 --- /dev/null +++ b/tests/InstallerTest.php @@ -0,0 +1,143 @@ +root = vfsStream::setup('pdp'); + vfsStream::create(['cache' => []], $this->root); + $this->cacheDir = vfsStream::url('pdp/cache'); + $this->cachePool = new Cache($this->cacheDir); + $this->client = new class() implements HttpClient { + public function getContent(string $url): string + { + if ($url === Manager::PSL_URL) { + return file_get_contents(__DIR__.'/data/public_suffix_list.dat'); + } + + if ($url === Manager::RZD_URL) { + return file_get_contents(__DIR__.'/data/tlds-alpha-by-domain.txt'); + } + + throw new HttpClientException(sprintf('invalid url: %s', $url)); + } + }; + + $this->logger = new class() extends AbstractLogger { + private $data = []; + + public function log($level, $message, array $context = []) + { + $this->data[] = $message; + } + + public function getLogs(string $level = null): array + { + return $this->data; + } + }; + } + + public function tearDown() + { + $this->cachePool = null; + $this->cacheDir = null; + $this->root = null; + $this->client = null; + $this->logger = null; + } + + /** + * @dataProvider contextDataProvider + * @param array $context + * @param int $retval + * @param array $logs + */ + public function testRefreshDefault(array $context, int $retval, array $logs) + { + $manager = new Manager($this->cachePool, $this->client); + $installer = new Installer($manager, $this->logger); + + self::assertSame($retval, $installer->refresh($context)); + foreach ($logs as $log) { + self::assertContains($log, $this->logger->getLogs()); + } + } + + public function contextDataProvider(): array + { + return [ + 'default' => [ + 'context' =>[], + 'retval' => 0, + 'log' => [ + '💪 💪 💪 Your Public Suffix List copy is updated. 💪 💪 💪', + '💪 💪 💪 Your IANA Root Zone Database copy is updated. 💪 💪 💪', + ], + ], + 'refresh psl only' => [ + 'context' => [ + Installer::REFRESH_PSL_KEY => true, + ], + 'retval' => 0, + 'log' => [ + '💪 💪 💪 Your Public Suffix List copy is updated. 💪 💪 💪', + ], + ], + 'refresh tld only' => [ + 'context' => [ + Installer::REFRESH_RZD_KEY => true, + ], + 'retval' => 0, + 'log' => [ + '💪 💪 💪 Your IANA Root Zone Database copy is updated. 💪 💪 💪', + ], + ], + 'refresh psl fails' => [ + 'context' => [ + Installer::REFRESH_PSL_KEY => true, + Installer::REFRESH_PSL_URL_KEY => 'http://localhost/', + ], + 'retval' => 1, + 'log' => [ + 'invalid url: http://localhost/', + ], + ], + ]; + } +} From 9ed6045778b09b6791b2b1ec947990362a438622 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 5 Sep 2019 08:38:43 +0200 Subject: [PATCH 169/461] Update command line output content --- bin/update-psl | 92 +++++++++++++++++++++++++---------------------- composer.json | 7 ++-- src/Installer.php | 49 ++++++++++++++----------- 3 files changed, 83 insertions(+), 65 deletions(-) diff --git a/bin/update-psl b/bin/update-psl index 5a35ea13..9848ac68 100755 --- a/bin/update-psl +++ b/bin/update-psl @@ -50,47 +50,6 @@ $reset = chr(27)."[0m"; $redbg = chr(27)."[41m"; $yellow = chr(27)."[33m"; -$script = basename(__FILE__); -$helpText = << '', Installer::REFRESH_PSL_KEY => false, @@ -108,6 +67,50 @@ $arguments = array_replace([ ])); if (isset($arguments['help']) || isset($arguments['h'])) { + $default_cache_dir = dirname(__DIR__).'/data'; + $script = basename(__FILE__); + $helpText = <<refresh($arguments); - +if (0 === $retVal) { + success("$green Pdp local cache successfully updated. $reset"); +} else { + fail("$redbg The command failed to update Pdp local cache successfully. $reset"); +} die($retVal); diff --git a/composer.json b/composer.json index cec75989..130552b1 100644 --- a/composer.json +++ b/composer.json @@ -67,8 +67,10 @@ "phpcs": "php-cs-fixer fix -v --diff --dry-run --allow-risky=yes --ansi", "phpstan-src": "phpstan analyse -l max -c phpstan.src.neon src --ansi", "phpstan-tests": "phpstan analyse -l max -c phpstan.tests.neon tests --ansi", + "phpstan-bin": "phpstan analyse -l max -c phpstan.src.neon bin --ansi", "phpstan": [ "@phpstan-src", + "@phpstan-bin", "@phpstan-tests" ], "phpunit": "phpunit --coverage-text", @@ -83,8 +85,9 @@ "scripts-descriptions": { "phpcs": "Runs coding style test suite", "phpstan": "Runs complete codebase static analysis", - "phpstan-src": "Runs source code static analysis", - "phpstan-test": "Runs test suite static analysis", + "phpstan-src": "Runs PHP stan on the source code", + "phpstan-test": "Runs PHP stan on the test suite", + "phpstan-bin": "Runs PHP stan on the command", "phpunit": "Runs unit and functional testing", "test": "Runs full test suite" }, diff --git a/src/Installer.php b/src/Installer.php index ec954f89..7c77c84f 100644 --- a/src/Installer.php +++ b/src/Installer.php @@ -19,7 +19,7 @@ use Psr\Log\LoggerInterface; use Psr\SimpleCache\CacheException as PsrCacheException; use Throwable; -use function array_merge; +use function array_replace; use function extension_loaded; use function file_exists; use function filter_var_array; @@ -80,7 +80,7 @@ public static function createFromCacheDir(LoggerInterface $logger, string $cache public function refresh(array $context = []): int { - $context = filter_var_array(array_merge(self::DEFAULT_CONTEXT, $context), [ + $context = filter_var_array(array_replace(self::DEFAULT_CONTEXT, $context), [ self::REFRESH_PSL_KEY => FILTER_VALIDATE_BOOLEAN, self::REFRESH_PSL_URL_KEY => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW, 'default' => Manager::PSL_URL], self::REFRESH_RZD_KEY => FILTER_VALIDATE_BOOLEAN, @@ -96,16 +96,10 @@ public function refresh(array $context = []): int try { $retVal = $this->execute($context); } catch (PsrCacheException $exception) { - $this->logger->error('😓 😓 😓 Your local cache could not be updated. 😓 😓 😓'); - $this->logger->error('An error occurred during cache regeneration.'); - $this->logger->error('----- Error Message ----'); - $this->logger->error($exception->getMessage()); + $this->logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); $retVal = 1; } catch (Throwable $exception) { - $this->logger->error('😓 😓 😓 Your local cache could not be updated. 😓 😓 😓'); - $this->logger->error('An error occurred during the update.'); - $this->logger->error('----- Error Message ----'); - $this->logger->error($exception->getMessage()); + $this->logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); $retVal = 1; } @@ -121,18 +115,20 @@ public function refresh(array $context = []): int */ private function execute(array $arguments = []): int { - $this->logger->info('Updating your Pdp local cache.'); - if ($arguments[self::REFRESH_PSL_KEY]) { - $this->logger->info('Updating your Public Suffix List copy.'); if (!$this->manager->refreshRules($arguments[self::REFRESH_PSL_URL_KEY], $arguments[self::TTL_KEY])) { - $this->logger->error('😓 😓 😓 Your Public Suffix List copy could not be updated. 😓 😓 😓'); - $this->logger->error('Please review your settings.'); + $this->logger->error('Unable to update the Public Suffix List Cache using {psl_url} with a TTL of {ttl}', [ + 'psl_url' => $arguments[self::REFRESH_PSL_URL_KEY], + 'ttl' => $arguments[self::TTL_KEY], + ]); return 1; } - $this->logger->info('💪 💪 💪 Your Public Suffix List copy is updated. 💪 💪 💪'); + $this->logger->info('Public Suffix List Cache updated for {ttl} using {psl_url}', [ + 'psl_url' => $arguments[self::REFRESH_PSL_URL_KEY], + 'ttl' => $arguments[self::TTL_KEY], + ]); } if (!$arguments[self::REFRESH_RZD_KEY]) { @@ -141,13 +137,18 @@ private function execute(array $arguments = []): int $this->logger->info('Updating your IANA Root Zone Database copy.'); if ($this->manager->refreshTLDs($arguments[self::REFRESH_RZD_URL_KEY], $arguments[self::TTL_KEY])) { - $this->logger->info('💪 💪 💪 Your IANA Root Zone Database copy is updated. 💪 💪 💪'); + $this->logger->info('IANA Root Zone Database Cache updated for {ttl} using {rzd_url}', [ + 'rzd_url' => $arguments[self::REFRESH_RZD_URL_KEY], + 'ttl' => $arguments[self::TTL_KEY], + ]); return 0; } - $this->logger->error('😓 😓 😓 Your IANA Root Zone Database copy could not be updated. 😓 😓 😓'); - $this->logger->error('Please review your settings.'); + $this->logger->error('Unable to update the IANA Root Zone Database Cache using {rzd_url} with a TTL of {ttl}', [ + 'rzd_url' => $arguments[self::REFRESH_RZD_URL_KEY], + 'ttl' => $arguments[self::TTL_KEY], + ]); return 1; } @@ -187,9 +188,15 @@ public static function updateLocalCache(Event $event = null) $arguments = array_replace($arguments, $event->getArguments()); } - $installer = self::createFromCacheDir(new Logger(), $arguments[Installer::CACHE_DIR_KEY]); + $logger = new Logger(); + $installer = self::createFromCacheDir($logger, $arguments[Installer::CACHE_DIR_KEY]); + $logger->info('Updating your Pdp local cache.'); $retVal = $installer->refresh($arguments); - + if (0 === $retVal) { + $logger->info('Pdp local cache successfully updated.'); + } else { + $logger->error("The command failed to update Pdp local cache successfully."); + } die($retVal); } From 44c021ad4194d526c8bf91f4976d98b1810e3b8b Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 5 Sep 2019 09:51:58 +0200 Subject: [PATCH 170/461] bug fix Logger implementation and Installer tests --- src/Installer.php | 2 +- src/Logger.php | 5 ++++- tests/InstallerTest.php | 17 +++++++++++------ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/Installer.php b/src/Installer.php index 7c77c84f..d861099f 100644 --- a/src/Installer.php +++ b/src/Installer.php @@ -195,7 +195,7 @@ public static function updateLocalCache(Event $event = null) if (0 === $retVal) { $logger->info('Pdp local cache successfully updated.'); } else { - $logger->error("The command failed to update Pdp local cache successfully."); + $logger->error('The command failed to update Pdp local cache successfully.'); } die($retVal); } diff --git a/src/Logger.php b/src/Logger.php index 7005ba87..fdff16e8 100644 --- a/src/Logger.php +++ b/src/Logger.php @@ -59,6 +59,9 @@ public function log($level, $message, array $context = []) $replace['{'.$key.'}'] = $val; } - fwrite(isset(self::ERRORS_LEVELS[$level]) ? $this->error : $this->out, $message.PHP_EOL); + fwrite( + isset(self::ERRORS_LEVELS[$level]) ? $this->error : $this->out, + strtr($message, $replace).PHP_EOL + ); } } diff --git a/tests/InstallerTest.php b/tests/InstallerTest.php index b8745617..ab0d1d3e 100644 --- a/tests/InstallerTest.php +++ b/tests/InstallerTest.php @@ -63,7 +63,12 @@ public function getContent(string $url): string public function log($level, $message, array $context = []) { - $this->data[] = $message; + $replace = []; + foreach ($context as $key => $val) { + $replace['{'.$key.'}'] = $val; + } + + $this->data[] = strtr($message, $replace); } public function getLogs(string $level = null): array @@ -106,8 +111,8 @@ public function contextDataProvider(): array 'context' =>[], 'retval' => 0, 'log' => [ - '💪 💪 💪 Your Public Suffix List copy is updated. 💪 💪 💪', - '💪 💪 💪 Your IANA Root Zone Database copy is updated. 💪 💪 💪', + 'Public Suffix List Cache updated for 1 DAY using '.Manager::PSL_URL, + 'IANA Root Zone Database Cache updated for 1 DAY using '.Manager::RZD_URL, ], ], 'refresh psl only' => [ @@ -116,7 +121,7 @@ public function contextDataProvider(): array ], 'retval' => 0, 'log' => [ - '💪 💪 💪 Your Public Suffix List copy is updated. 💪 💪 💪', + 'Public Suffix List Cache updated for 1 DAY using '.Manager::PSL_URL, ], ], 'refresh tld only' => [ @@ -125,7 +130,7 @@ public function contextDataProvider(): array ], 'retval' => 0, 'log' => [ - '💪 💪 💪 Your IANA Root Zone Database copy is updated. 💪 💪 💪', + 'IANA Root Zone Database Cache updated for 1 DAY using '.Manager::RZD_URL, ], ], 'refresh psl fails' => [ @@ -135,7 +140,7 @@ public function contextDataProvider(): array ], 'retval' => 1, 'log' => [ - 'invalid url: http://localhost/', + 'Local cache update failed with invalid url: http://localhost/', ], ], ]; From f2a62122b9167897952bb3b5a0453a8bface5685 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 5 Sep 2019 14:18:37 +0200 Subject: [PATCH 171/461] change methods return type --- ...ULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- src/Installer.php | 69 +++++++++++++------ tests/InstallerTest.php | 12 ++-- 3 files changed, 56 insertions(+), 27 deletions(-) diff --git a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache index 319c40ef..ee4b545a 100644 --- a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache +++ b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache @@ -1 +1 @@ -s:110536:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":{"co":[],"com":[],"commune":[],"net":[],"org":[]},"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"catholic":[],"eq":[],"nsw":{"schools":[]},"nt":[],"qld":[],"sa":[],"tas":{"education":[]},"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"ong":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"tc":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"asso":[],"com":[],"gouv":[],"nom":[],"prd":[],"tm":[],"aeroport":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"ponpes":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"ac":[],"biz":[],"co":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"sc":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":[],"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"ac":[],"co":[],"coop":[],"gov":[],"mil":[],"net":[],"org":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"av":[],"bbs":[],"bel":[],"biz":[],"com":[],"dr":[],"edu":[],"gen":[],"gov":[],"info":[],"mil":[],"k12":[],"kep":[],"name":[],"net":[],"org":[],"pol":[],"tel":[],"tsk":[],"tv":[],"web":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nic":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"cpa":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"duns":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gay":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"llp":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"statebank":[],"statefarm":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"krasnik":[],"leczna":[],"lubartow":[],"lublin":[],"poniatowa":[],"swidnik":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"ca":{"barsy":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]},"co":[],"arvo":[],"azimuth":[]},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"go-vip":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"in-dsl":[],"in-vpn":[],"ipifony":[],"iobb":[],"kinghost":[],"uni5":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"siteleaf":[],"srcf":{"soc":[],"user":[]},"dsmynas":[],"familyds":[],"yandexcloud":{"storage":[],"website":[]},"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"wpcomstaging":[],"balena-devices":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"trycloudflare":[],"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastly-terrarium":[],"fastvps-server":[],"mydobiss":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lpusercontent":[],"lmpm":{"app":[]},"linode":{"members":[],"nodebalancer":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qualifioapp":[],"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"render":{"app":[]},"onrender":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"shopitsite":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"stackhero-network":[],"stdlib":{"api":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"thingdustdata":[],"bloxcms":[],"townnews-staging":[],"hk":[],"wafflecell":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[],"cn-northwest-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}},"instantcloud":[]},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"in-dsl":[],"in-vpn":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"pubtls":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"edugit":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"io":{"apigee":[],"b-data":[],"backplaneapp":[],"banzaicloud":{"app":[]},"boxfuse":[],"browsersafetymark":[],"bigv":{"uk0":[]},"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"moonscale":{"*":[]},"loginline":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"dyn53":[],"protonet":[],"vaporcloud":[],"on-rio":{"*":[]},"readthedocs":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"shiftedit":[],"mo-siemens":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"applicationcloud":[],"scapp":[],"s5y":{"*":[]},"telebit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[],"basicserver":[],"virtualserver":[]},"jp":{"ne":{"aseinet":{"user":[]},"gehirn":[]},"usercontent":[],"blogspot":[]},"vc":{"gv":{"d":[]},"nom":[]},"eus":{"party":{"user":[]}},"co":{"go-vip":[],"carrd":[],"crd":[],"otap":{"*":[]},"com":{"blogspot":[]},"leadpages":[],"lpages":[],"mypi":[],"n4t":[],"nodum":[],"repl":[]},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"dyn-berlin":[],"in-berlin":[],"in-brb":[],"in-butter":[],"in-dsl":[],"in-vpn":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[]},"uk":{"co":{"bytemark":{"dh":[],"vm":[]},"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"gov":{"service":[],"homeoffice":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"ai":{"uwu":[],"nom":[]},"se":{"com":[],"blogspot":[],"conf":[]},"bz":{"za":[],"nym":[]},"group":{"discourse":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"khplay":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"dev":{"lcl":{"*":[]},"stg":{"*":[]},"workers":[],"iserv":[],"loginline":[],"webhare":{"*":[]}},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"filegear-au":[],"filegear-de":[],"filegear-gb":[],"filegear-ie":[],"filegear-jp":[],"filegear-sg":[],"glitch":[],"ravendb":[],"barsy":[],"nctu":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"zone":{"cloud66":[],"hs":[],"triton":{"*":[]},"lima":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"site":{"cloudera":[],"cyon":[],"lelux":[],"loginline":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"app":{"wnext":[],"run":{"a":[]},"web":[],"hasura":[],"loginline":[],"telebit":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"bpl":[],"orx":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[],"pony":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[],"dweb":{"*":[]}},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"earth":{"dapps":{"*":[],"bzz":{"*":[]}}},"th":{"online":[],"shop":[]},"fi":{"dy":[],"blogspot":[],"xn--hkkinen-5wa":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[],"builder":{"site":[]},"enterprisecloud":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[],"telebit":{"*":[]}},"one":{"onred":{"staging":[]},"for":[],"homelink":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"on-rancher":{"*":[]},"sensiosite":{"*":[]},"trafficplex":[],"voorloper":[]},"ms":{"lab":[]},"digital":{"cloudapps":{"london":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]},"zone":[]},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]},"col":[],"firm":[],"gen":[],"ltd":[]},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"nym":[],"ltd":[],"inc":[]},"hr":{"blogspot":[],"free":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[],"syncloud":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"caa":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"ua":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"ci":{"fin":[]},"run":{"hs":[],"development":[],"ravendb":[],"repl":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"community":{"ravendb":[]},"city":{"ng":[]},"gl":{"biz":[],"nom":[]},"ink":{"ng":[]},"school":{"ng":[]},"so":{"sch":[]},"gg":{"kaas":[],"cya":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"business":{"co":[]},"education":{"co":[]},"events":{"co":[]},"financial":{"co":[]},"place":{"co":[]},"technology":{"co":[]},"space":{"linkitools":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"services":{"loginline":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"casa":{"nabu":{"ui":[]}},"fashion":{"of":[],"on":[]},"football":{"of":[]},"london":{"in":[],"of":[]},"men":{"for":[]},"mom":{"and":[],"for":[]},"sale":{"for":[]},"work":{"of":[],"to":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ec":{"nym":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vg":{"nom":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"bn":{"co":[]},"page":{"prvcy":[]},"fit":{"ptplus":[]},"edu":{"rit":{"git-pages":[]}},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"to":{"vpnplus":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]},"design":{"bss":[]}}}"; \ No newline at end of file +s:110555:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":{"co":[],"com":[],"commune":[],"net":[],"org":[]},"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"catholic":[],"eq":[],"nsw":{"schools":[]},"nt":[],"qld":[],"sa":[],"tas":{"education":[]},"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"ong":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"tc":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"asso":[],"com":[],"gouv":[],"nom":[],"prd":[],"tm":[],"aeroport":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"ponpes":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"ac":[],"biz":[],"co":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"sc":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":[],"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"ac":[],"co":[],"coop":[],"gov":[],"mil":[],"net":[],"org":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"av":[],"bbs":[],"bel":[],"biz":[],"com":[],"dr":[],"edu":[],"gen":[],"gov":[],"info":[],"mil":[],"k12":[],"kep":[],"name":[],"net":[],"org":[],"pol":[],"tel":[],"tsk":[],"tv":[],"web":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nic":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"cpa":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gay":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"llp":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"statebank":[],"statefarm":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"krasnik":[],"leczna":[],"lubartow":[],"lublin":[],"poniatowa":[],"swidnik":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"ca":{"barsy":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]},"co":[],"arvo":[],"azimuth":[]},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"go-vip":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"in-dsl":[],"in-vpn":[],"ipifony":[],"iobb":[],"kinghost":[],"uni5":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"siteleaf":[],"srcf":{"soc":[],"user":[]},"dsmynas":[],"familyds":[],"yandexcloud":{"storage":[],"website":[]},"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"wpcomstaging":[],"balena-devices":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"trycloudflare":[],"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastly-terrarium":[],"fastvps-server":[],"mydobiss":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lpusercontent":[],"lmpm":{"app":[]},"linode":{"members":[],"nodebalancer":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qualifioapp":[],"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"render":{"app":[]},"onrender":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"shopitsite":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"stackhero-network":[],"stdlib":{"api":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"thingdustdata":[],"bloxcms":[],"townnews-staging":[],"hk":[],"wafflecell":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[],"cn-northwest-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}},"instantcloud":[]},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"in-dsl":[],"in-vpn":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"pubtls":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"edugit":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"io":{"apigee":[],"b-data":[],"backplaneapp":[],"banzaicloud":{"app":[]},"boxfuse":[],"browsersafetymark":[],"bigv":{"uk0":[]},"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"moonscale":{"*":[]},"loginline":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"dyn53":[],"protonet":[],"vaporcloud":[],"on-rio":{"*":[]},"readthedocs":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"shiftedit":[],"mo-siemens":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"applicationcloud":[],"scapp":[],"s5y":{"*":[]},"telebit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[],"basicserver":[],"virtualserver":[]},"jp":{"ne":{"aseinet":{"user":[]},"gehirn":[]},"usercontent":[],"blogspot":[]},"vc":{"gv":{"d":[]},"nom":[]},"eus":{"party":{"user":[]}},"co":{"go-vip":[],"carrd":[],"crd":[],"otap":{"*":[]},"com":{"blogspot":[]},"leadpages":[],"lpages":[],"mypi":[],"n4t":[],"nodum":[],"repl":[]},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"dyn-berlin":[],"in-berlin":[],"in-brb":[],"in-butter":[],"in-dsl":[],"in-vpn":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[]},"uk":{"co":{"bytemark":{"dh":[],"vm":[]},"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"gov":{"service":[],"homeoffice":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"ai":{"uwu":[],"nom":[]},"se":{"com":[],"blogspot":[],"conf":[]},"bz":{"za":[],"nym":[]},"group":{"discourse":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"khplay":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"dev":{"lcl":{"*":[]},"stg":{"*":[]},"workers":[],"iserv":[],"loginline":[],"webhare":{"*":[]}},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"filegear-au":[],"filegear-de":[],"filegear-gb":[],"filegear-ie":[],"filegear-jp":[],"filegear-sg":[],"glitch":[],"ravendb":[],"barsy":[],"nctu":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"zone":{"cloud66":[],"hs":[],"triton":{"*":[]},"lima":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"site":{"cloudera":[],"cyon":[],"lelux":[],"loginline":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"app":{"wnext":[],"run":{"a":[]},"web":[],"hasura":[],"loginline":[],"telebit":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"bpl":[],"orx":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[],"pony":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[],"dweb":{"*":[]}},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"earth":{"dapps":{"*":[],"bzz":{"*":[]}}},"th":{"online":[],"shop":[]},"fi":{"dy":[],"blogspot":[],"xn--hkkinen-5wa":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[],"builder":{"site":[]},"enterprisecloud":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[],"telebit":{"*":[]}},"one":{"onred":{"staging":[]},"for":[],"homelink":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"on-rancher":{"*":[]},"sensiosite":{"*":[]},"trafficplex":[],"voorloper":[]},"ms":{"lab":[]},"digital":{"cloudapps":{"london":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]},"zone":[]},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]},"col":[],"firm":[],"gen":[],"ltd":[]},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"nym":[],"ltd":[],"inc":[]},"hr":{"blogspot":[],"free":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[],"syncloud":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"caa":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"ua":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"ci":{"fin":[]},"run":{"hs":[],"development":[],"ravendb":[],"repl":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"community":{"ravendb":[]},"city":{"ng":[]},"gl":{"biz":[],"nom":[]},"ink":{"ng":[]},"school":{"ng":[]},"so":{"sch":[]},"gg":{"kaas":[],"cya":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"business":{"co":[]},"education":{"co":[]},"events":{"co":[]},"financial":{"co":[]},"place":{"co":[]},"technology":{"co":[]},"space":{"linkitools":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"services":{"loginline":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"casa":{"nabu":{"ui":[]}},"fashion":{"of":[],"on":[]},"football":{"of":[]},"london":{"in":[],"of":[]},"men":{"for":[]},"mom":{"and":[],"for":[]},"sale":{"for":[]},"work":{"of":[],"to":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ec":{"nym":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vg":{"nom":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"bn":{"co":[]},"page":{"prvcy":[]},"fit":{"ptplus":[]},"edu":{"rit":{"git-pages":[]}},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"to":{"vpnplus":[],"quickconnect":{"direct":[]}},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]},"design":{"bss":[]}}}"; \ No newline at end of file diff --git a/src/Installer.php b/src/Installer.php index d861099f..0d379f2a 100644 --- a/src/Installer.php +++ b/src/Installer.php @@ -24,10 +24,13 @@ use function file_exists; use function filter_var_array; use function fwrite; +use function implode; use const FILTER_FLAG_STRIP_LOW; use const FILTER_SANITIZE_STRING; use const FILTER_VALIDATE_BOOLEAN; +use const PHP_EOL; use const STDERR; +use const STDOUT; /** * A class to install and update local cache. @@ -78,7 +81,7 @@ public static function createFromCacheDir(LoggerInterface $logger, string $cache return new self(new Manager(new Cache($cacheDir), new CurlHttpClient()), $logger); } - public function refresh(array $context = []): int + public function refresh(array $context = []): bool { $context = filter_var_array(array_replace(self::DEFAULT_CONTEXT, $context), [ self::REFRESH_PSL_KEY => FILTER_VALIDATE_BOOLEAN, @@ -94,16 +97,14 @@ public function refresh(array $context = []): int } try { - $retVal = $this->execute($context); + return $this->execute($context); } catch (PsrCacheException $exception) { $this->logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); - $retVal = 1; + return false; } catch (Throwable $exception) { $this->logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); - $retVal = 1; + return false; } - - return $retVal; } /** @@ -113,7 +114,7 @@ public function refresh(array $context = []): int * * @throws PsrCacheException */ - private function execute(array $arguments = []): int + private function execute(array $arguments = []): bool { if ($arguments[self::REFRESH_PSL_KEY]) { if (!$this->manager->refreshRules($arguments[self::REFRESH_PSL_URL_KEY], $arguments[self::TTL_KEY])) { @@ -122,7 +123,7 @@ private function execute(array $arguments = []): int 'ttl' => $arguments[self::TTL_KEY], ]); - return 1; + return false; } $this->logger->info('Public Suffix List Cache updated for {ttl} using {psl_url}', [ @@ -132,7 +133,7 @@ private function execute(array $arguments = []): int } if (!$arguments[self::REFRESH_RZD_KEY]) { - return 0; + return true; } $this->logger->info('Updating your IANA Root Zone Database copy.'); @@ -142,7 +143,7 @@ private function execute(array $arguments = []): int 'ttl' => $arguments[self::TTL_KEY], ]); - return 0; + return true; } $this->logger->error('Unable to update the IANA Root Zone Database Cache using {rzd_url} with a TTL of {ttl}', [ @@ -150,7 +151,7 @@ private function execute(array $arguments = []): int 'ttl' => $arguments[self::TTL_KEY], ]); - return 1; + return false; } /** @@ -160,18 +161,18 @@ private function execute(array $arguments = []): int */ public static function updateLocalCache(Event $event = null) { + $io = self::getIO($event); if (!extension_loaded('curl')) { - fwrite(STDERR, 'The PHP cURL extension is missing.'); - + $io->writeError('The PHP cURL extension is missing.'); die(1); } $vendor = self::getVendorPath($event); if (null === $vendor) { - fwrite(STDERR, implode(PHP_EOL, [ + $io->writeError([ 'You must set up the project dependencies using composer', 'see https://getcomposer.org', - ]).PHP_EOL); + ]); die(1); } @@ -191,13 +192,41 @@ public static function updateLocalCache(Event $event = null) $logger = new Logger(); $installer = self::createFromCacheDir($logger, $arguments[Installer::CACHE_DIR_KEY]); $logger->info('Updating your Pdp local cache.'); - $retVal = $installer->refresh($arguments); - if (0 === $retVal) { + if ($installer->refresh($arguments)) { $logger->info('Pdp local cache successfully updated.'); - } else { - $logger->error('The command failed to update Pdp local cache successfully.'); + die(0); } - die($retVal); + + $logger->error('The command failed to update Pdp local cache.'); + die(1); + } + + /** + * Detect the I/O interface to use. + * + * @param Event|null $event + * + * @return mixed + */ + private static function getIO(Event $event = null) + { + return null !== $event ? $event->getIO() : new class() { + public function write($messages, bool $newline = true, int $verbosity = 2) + { + $this->doWrite($messages, $newline, false, $verbosity); + } + public function writeError($messages, bool $newline = true, int $verbosity = 2) + { + $this->doWrite($messages, $newline, true, $verbosity); + } + private function doWrite($messages, bool $newline, bool $stderr, int $verbosity) + { + fwrite( + $stderr ? STDERR : STDOUT, + implode($newline ? PHP_EOL : '', (array) $messages).PHP_EOL + ); + } + }; } /** diff --git a/tests/InstallerTest.php b/tests/InstallerTest.php index ab0d1d3e..a1f47c16 100644 --- a/tests/InstallerTest.php +++ b/tests/InstallerTest.php @@ -90,10 +90,10 @@ public function tearDown() /** * @dataProvider contextDataProvider * @param array $context - * @param int $retval + * @param bool $retval * @param array $logs */ - public function testRefreshDefault(array $context, int $retval, array $logs) + public function testRefreshDefault(array $context, bool $retval, array $logs) { $manager = new Manager($this->cachePool, $this->client); $installer = new Installer($manager, $this->logger); @@ -109,7 +109,7 @@ public function contextDataProvider(): array return [ 'default' => [ 'context' =>[], - 'retval' => 0, + 'retval' => true, 'log' => [ 'Public Suffix List Cache updated for 1 DAY using '.Manager::PSL_URL, 'IANA Root Zone Database Cache updated for 1 DAY using '.Manager::RZD_URL, @@ -119,7 +119,7 @@ public function contextDataProvider(): array 'context' => [ Installer::REFRESH_PSL_KEY => true, ], - 'retval' => 0, + 'retval' => true, 'log' => [ 'Public Suffix List Cache updated for 1 DAY using '.Manager::PSL_URL, ], @@ -128,7 +128,7 @@ public function contextDataProvider(): array 'context' => [ Installer::REFRESH_RZD_KEY => true, ], - 'retval' => 0, + 'retval' => true, 'log' => [ 'IANA Root Zone Database Cache updated for 1 DAY using '.Manager::RZD_URL, ], @@ -138,7 +138,7 @@ public function contextDataProvider(): array Installer::REFRESH_PSL_KEY => true, Installer::REFRESH_PSL_URL_KEY => 'http://localhost/', ], - 'retval' => 1, + 'retval' => false, 'log' => [ 'Local cache update failed with invalid url: http://localhost/', ], From d42c874c7b1fa5e2bd82d49a8090b7f44fee01c7 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 6 Sep 2019 07:41:05 +0200 Subject: [PATCH 172/461] Switch to using composer own LoggerInterface for updateLocalCache --- bin/update-psl | 14 ++++++++------ composer.json | 7 ++----- src/Installer.php | 35 ++++++++++++++++++++++++++++------- 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/bin/update-psl b/bin/update-psl index 9848ac68..1ba06d85 100755 --- a/bin/update-psl +++ b/bin/update-psl @@ -117,17 +117,19 @@ HELP; } if (!extension_loaded('curl')) { - fail("$redbg The PHP cURL extension is missing. $reset"); + fail("$redbg The required PHP cURL extension is missing. $reset"); die(1); } $installer = Installer::createFromCacheDir(new Logger( STDOUT, STDERR), $arguments[Installer::CACHE_DIR_KEY]); success("$yellow Updating your Pdp local cache.$reset"); -$retVal = $installer->refresh($arguments); -if (0 === $retVal) { +if ($installer->refresh($arguments)) { success("$green Pdp local cache successfully updated. $reset"); -} else { - fail("$redbg The command failed to update Pdp local cache successfully. $reset"); + + die(0); } -die($retVal); + +fail("$redbg The command failed to update Pdp local cache successfully. $reset"); + +die(1); diff --git a/composer.json b/composer.json index 130552b1..a56b0bec 100644 --- a/composer.json +++ b/composer.json @@ -64,13 +64,11 @@ } }, "scripts": { - "phpcs": "php-cs-fixer fix -v --diff --dry-run --allow-risky=yes --ansi", + "phpcs": "php-cs-fixer fix -vvv --diff --dry-run --allow-risky=yes --ansi", "phpstan-src": "phpstan analyse -l max -c phpstan.src.neon src --ansi", "phpstan-tests": "phpstan analyse -l max -c phpstan.tests.neon tests --ansi", - "phpstan-bin": "phpstan analyse -l max -c phpstan.src.neon bin --ansi", "phpstan": [ "@phpstan-src", - "@phpstan-bin", "@phpstan-tests" ], "phpunit": "phpunit --coverage-text", @@ -87,9 +85,8 @@ "phpstan": "Runs complete codebase static analysis", "phpstan-src": "Runs PHP stan on the source code", "phpstan-test": "Runs PHP stan on the test suite", - "phpstan-bin": "Runs PHP stan on the command", "phpunit": "Runs unit and functional testing", - "test": "Runs full test suite" + "test": "Runs the complete test suite" }, "extra": { "branch-alias": { diff --git a/src/Installer.php b/src/Installer.php index 0d379f2a..85d3d80a 100644 --- a/src/Installer.php +++ b/src/Installer.php @@ -15,6 +15,7 @@ namespace Pdp; +use Composer\IO\BaseIO; use Composer\Script\Event; use Psr\Log\LoggerInterface; use Psr\SimpleCache\CacheException as PsrCacheException; @@ -163,7 +164,8 @@ public static function updateLocalCache(Event $event = null) { $io = self::getIO($event); if (!extension_loaded('curl')) { - $io->writeError('The PHP cURL extension is missing.'); + $io->writeError('The required PHP cURL extension is missing.'); + die(1); } @@ -173,6 +175,7 @@ public static function updateLocalCache(Event $event = null) 'You must set up the project dependencies using composer', 'see https://getcomposer.org', ]); + die(1); } @@ -189,20 +192,19 @@ public static function updateLocalCache(Event $event = null) $arguments = array_replace($arguments, $event->getArguments()); } - $logger = new Logger(); - $installer = self::createFromCacheDir($logger, $arguments[Installer::CACHE_DIR_KEY]); - $logger->info('Updating your Pdp local cache.'); + $installer = self::createFromCacheDir(self::getLogger($event), $arguments[Installer::CACHE_DIR_KEY]); + $io->info('Updating your Pdp local cache.'); if ($installer->refresh($arguments)) { - $logger->info('Pdp local cache successfully updated.'); + $io->info('Pdp local cache successfully updated.'); die(0); } - $logger->error('The command failed to update Pdp local cache.'); + $io->error('The command failed to update Pdp local cache.'); die(1); } /** - * Detect the I/O interface to use. + * Detect the I/O instance to use. * * @param Event|null $event * @@ -229,6 +231,25 @@ private function doWrite($messages, bool $newline, bool $stderr, int $verbosity) }; } + /** + * Detect the Logger instance to use. + * + * @param Event|null $event + * + * @return LoggerInterface + */ + private static function getLogger(Event $event = null): LoggerInterface + { + if (null !== $event) { + /** @var BaseIO $logger */ + $logger = $event->getIO(); + + return $logger; + } + + return new Logger(); + } + /** * Detect the vendor path. * From 4327ef33ee8a4f89e45f03e7792c219da00720d4 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 6 Sep 2019 07:49:23 +0200 Subject: [PATCH 173/461] deactivate PHPStan for nightly --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 902cd0d6..9ba5c7e9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,7 +42,7 @@ matrix: env: - COLLECT_COVERAGE=false - IGNORE_PLATFORMS=true - - RUN_PHPSTAN=true + - RUN_PHPSTAN=false - VALIDATE_CODING_STYLE=false allow_failures: - php: 7.4snapshot @@ -66,4 +66,4 @@ script: - composer phpunit after_script: - - if [ "$COLLECT_COVERAGE" == "true" ]; then wget https://scrutinizer-ci.com/ocular.phar && php ocular.phar code-coverage:upload --format=php-clover build/clover.xml; fi \ No newline at end of file + - if [ "$COLLECT_COVERAGE" == "true" ]; then wget https://scrutinizer-ci.com/ocular.phar && php ocular.phar code-coverage:upload --format=php-clover build/clover.xml; fi From c7704e6a1b4d82c9577c8bda6270773aab1f3e86 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 8 Sep 2019 00:32:08 +0200 Subject: [PATCH 174/461] Improve Installer code --- src/Installer.php | 42 +++++++++++++--------------------------- tests/InstallerTest.php | 43 +++++++++++++++++++---------------------- 2 files changed, 33 insertions(+), 52 deletions(-) diff --git a/src/Installer.php b/src/Installer.php index 85d3d80a..23413879 100644 --- a/src/Installer.php +++ b/src/Installer.php @@ -73,7 +73,7 @@ public function __construct(Manager $manager, LoggerInterface $logger) } /** - * Creates a new installer instance with a Pdp\Cache. + * Creates a new instance with a Pdp\Cache object and the cURL HTTP client. * @param LoggerInterface $logger * @param string $cacheDir */ @@ -82,6 +82,10 @@ public static function createFromCacheDir(LoggerInterface $logger, string $cache return new self(new Manager(new Cache($cacheDir), new CurlHttpClient()), $logger); } + /** + * Refresh the locale cache. + * @param array $context + */ public function refresh(array $context = []): bool { $context = filter_var_array(array_replace(self::DEFAULT_CONTEXT, $context), [ @@ -110,10 +114,7 @@ public function refresh(array $context = []): bool /** * Refreshes the cache. - * * @param array $arguments - * - * @throws PsrCacheException */ private function execute(array $arguments = []): bool { @@ -157,8 +158,7 @@ private function execute(array $arguments = []): bool /** * Script to update the local cache using composer hook. - * - * @param Event $event + * @param null|Event $event */ public static function updateLocalCache(Event $event = null) { @@ -181,6 +181,7 @@ public static function updateLocalCache(Event $event = null) require $vendor.'/autoload.php'; + $logger = new Logger(); $arguments = [ self::CACHE_DIR_KEY => '', self::REFRESH_PSL_KEY => false, @@ -189,17 +190,19 @@ public static function updateLocalCache(Event $event = null) ]; if (null !== $event) { + /** @var BaseIO $logger */ + $logger = $event->getIO(); $arguments = array_replace($arguments, $event->getArguments()); } - $installer = self::createFromCacheDir(self::getLogger($event), $arguments[Installer::CACHE_DIR_KEY]); - $io->info('Updating your Pdp local cache.'); + $installer = self::createFromCacheDir($logger, $arguments[Installer::CACHE_DIR_KEY]); + $io->write('Updating your Pdp local cache.'); if ($installer->refresh($arguments)) { - $io->info('Pdp local cache successfully updated.'); + $io->write('Pdp local cache successfully updated.'); die(0); } - $io->error('The command failed to update Pdp local cache.'); + $io->writeError('The command failed to update Pdp local cache.'); die(1); } @@ -231,25 +234,6 @@ private function doWrite($messages, bool $newline, bool $stderr, int $verbosity) }; } - /** - * Detect the Logger instance to use. - * - * @param Event|null $event - * - * @return LoggerInterface - */ - private static function getLogger(Event $event = null): LoggerInterface - { - if (null !== $event) { - /** @var BaseIO $logger */ - $logger = $event->getIO(); - - return $logger; - } - - return new Logger(); - } - /** * Detect the vendor path. * diff --git a/tests/InstallerTest.php b/tests/InstallerTest.php index a1f47c16..6b37d8af 100644 --- a/tests/InstallerTest.php +++ b/tests/InstallerTest.php @@ -20,11 +20,13 @@ use Pdp\HttpClient; use Pdp\HttpClientException; use Pdp\Installer; +use Pdp\Logger; use Pdp\Manager; use PHPUnit\Framework\TestCase; -use Psr\Log\AbstractLogger; use function file_get_contents; +use function rewind; use function sprintf; +use function stream_get_contents; /** * @coversDefaultClass \Pdp\Installer @@ -37,6 +39,16 @@ class InstallerTest extends TestCase protected $client; protected $logger; + /** + * @return resource + */ + private function setStream() + { + /** @var resource $stream */ + $stream = fopen('php://memory', 'r+'); + return $stream; + } + public function setUp() { $this->root = vfsStream::setup('pdp'); @@ -57,25 +69,6 @@ public function getContent(string $url): string throw new HttpClientException(sprintf('invalid url: %s', $url)); } }; - - $this->logger = new class() extends AbstractLogger { - private $data = []; - - public function log($level, $message, array $context = []) - { - $replace = []; - foreach ($context as $key => $val) { - $replace['{'.$key.'}'] = $val; - } - - $this->data[] = strtr($message, $replace); - } - - public function getLogs(string $level = null): array - { - return $this->data; - } - }; } public function tearDown() @@ -95,12 +88,16 @@ public function tearDown() */ public function testRefreshDefault(array $context, bool $retval, array $logs) { + $stream = $this->setStream(); + $logger = new Logger($stream, $stream); $manager = new Manager($this->cachePool, $this->client); - $installer = new Installer($manager, $this->logger); - + $installer = new Installer($manager, $logger); self::assertSame($retval, $installer->refresh($context)); + rewind($stream); + /** @var string $data */ + $data = stream_get_contents($stream); foreach ($logs as $log) { - self::assertContains($log, $this->logger->getLogs()); + self::assertContains($log, $data); } } From b9fafa40e2ecaeb1cb40cacc9012367bb52d9092 Mon Sep 17 00:00:00 2001 From: Dev_NIX Date: Mon, 11 Nov 2019 13:46:59 +0100 Subject: [PATCH 175/461] ext-curl should be required on composer.json --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index 09119b66..06582fef 100644 --- a/composer.json +++ b/composer.json @@ -36,6 +36,7 @@ "require": { "php": ">=7.0", "ext-intl": "*", + "ext-curl": "*", "psr/simple-cache": "^1.0.1" }, "require-dev": { From dbec26ea267b62b72528aaf719348112ba1dc556 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sat, 23 Nov 2019 10:53:37 +0100 Subject: [PATCH 176/461] Revert "ext-curl should be required on composer.json" --- composer.json | 1 - 1 file changed, 1 deletion(-) diff --git a/composer.json b/composer.json index 06582fef..09119b66 100644 --- a/composer.json +++ b/composer.json @@ -36,7 +36,6 @@ "require": { "php": ">=7.0", "ext-intl": "*", - "ext-curl": "*", "psr/simple-cache": "^1.0.1" }, "require-dev": { From b2347079c47818738ca78094d500fa5c93c861b0 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 29 Dec 2019 07:05:54 +0100 Subject: [PATCH 177/461] preapre 5.6.0 release --- .travis.yml | 7 +--- CHANGELOG.md | 25 ++++++++++-- README.md | 38 ++++++++++++++++--- ...ULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- ...ULL_f18a70477d29d525b9220612e2115345.cache | 2 +- 5 files changed, 57 insertions(+), 17 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9ba5c7e9..620cb1b9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,7 +32,7 @@ matrix: - VALIDATE_CODING_STYLE=false - RUN_PHPSTAN=false - IGNORE_PLATFORMS=true - - php: 7.4snapshot + - php: 7.4 env: - COLLECT_COVERAGE=false - VALIDATE_CODING_STYLE=false @@ -45,14 +45,9 @@ matrix: - RUN_PHPSTAN=false - VALIDATE_CODING_STYLE=false allow_failures: - - php: 7.4snapshot - php: nightly fast_finish: true -cache: - directories: - - $HOME/.composer/cache - before_install: - travis_retry composer self-update diff --git a/CHANGELOG.md b/CHANGELOG.md index f933868f..d78c53f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,26 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in this file -# 5.5.0 - 2019-04-14 +## 5.6.0 - 2019-12-29 + +### Added + +- A simple `Psr3` compatible logger class which output the logs to you cli console. + +### Fixed + +- `composer.json` updated to be composer 2.0 ready +- package bundle installer is rewritten to improve its usage see [#249](https://github.com/jeremykendall/php-domain-parser/issues/249) and [#250](https://github.com/jeremykendall/php-domain-parser/issues/250) + +### Deprecated + +- None + +### Removed + +- None + +## 5.5.0 - 2019-04-14 ### Added @@ -25,7 +44,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - None -# 5.4.0 - 2018-11-22 +## 5.4.0 - 2018-11-22 ### Added @@ -161,4 +180,4 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\PublicSuffixList` class replaced by the `Pdp\Rules` class - `Pdp\PublicSuffixManager` class replaced by the `Pdp\Manager` class - `Pdp\HttpAdapter\HttpAdapterInterface` interface replaced by the `Pdp\HttpClient` interface -- `Pdp\HttpAdapter\CurlHttpAdapter` class replaced by the `Pdp\CurlHttpClient` class \ No newline at end of file +- `Pdp\HttpAdapter\CurlHttpAdapter` class replaced by the `Pdp\CurlHttpClient` class diff --git a/README.md b/README.md index 6ed4cfc9..ab69797f 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ Dependencies ------- - [PSR-16](http://www.php-fig.org/psr/psr-16/) +- [PSR-3](http://www.php-fig.org/psr/psr-3/) *since version 5.6* Installation -------- @@ -555,8 +556,9 @@ This script requires: - The PHP `curl` extension - The `Pdp\Installer` class which organizes how to update the cache. - The `Pdp\Cache` and `Pdp\CurlHttpClient` classes to retrieve and cache the PSL +- A `Psr3` implementation. -You can also add a composer script in your `composer.json` file to update the PSL cache everytime after the `install` or the `update` command are executed. +You can add a composer script in your `composer.json` file to update the PSL cache every time after the `install` or the `update` command are executed. ~~~bash { @@ -567,12 +569,36 @@ You can also add a composer script in your `composer.json` file to update the PS } ~~~ -If you prefer using your own implementations you should: +#### Advanced usage of the update-psl script -1. Copy the `Pdp\Installer` class -2. Adapt its code to reflect your requirements. +**since version 5.6.0** -In any case, your are required to update regularly your PSL information with your chosen script to keep your data up to date. +The following command is accessible to the end user: + +```bash +$ php bin/update-psl --rzd --rzd-url=http://localhost/rzd-mirror/list.txt --ttl="8 HOURS" --cache-dir="/tmp" +```` + +This lines means: + +- the only cache that will be updated will be the one for the Root Zone Domains; +- it will be updated using the submitted URL; +- the data will be cached for 8 hours; +- the cache directory will be the `/tmp` directory.; + +##### Options and arguments + +- `--cache-dir` : specify the root directory used to save the cached data; +- `h`, `--h`, `--help` : display the helper message; +- `--psl`: specify that the PSL cache must be updated; +- `--psl-url`: specify that PSL source URL; +- `--rzd`: specify that the RZD cache must be updated; +- `--rzd-url`: specify that RZD source URL; +- `--ttl`: specify the cache TTL; + +#### Alternatives to the update-psl script + +**Using the `update-psl` script is not a requirement but your MUST update regularly your PSL information to keep your cache data up to date.** For example, below I'm using the `Manager` with @@ -717,4 +743,4 @@ the Apache Software Foundation License 2.0 in this project. [link-release]: https://github.com/jeremykendall/php-domain-parser/releases [link-license]: https://github.com/jeremykendall/php-domain-parser/blob/master/LICENSE -[link-parse-library]: https://packagist.org/explore/?query=rfc3986 \ No newline at end of file +[link-parse-library]: https://packagist.org/explore/?query=rfc3986 diff --git a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache index ee4b545a..29fe9f30 100644 --- a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache +++ b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache @@ -1 +1 @@ -s:110555:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":{"co":[],"com":[],"commune":[],"net":[],"org":[]},"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"catholic":[],"eq":[],"nsw":{"schools":[]},"nt":[],"qld":[],"sa":[],"tas":{"education":[]},"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"ong":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"tc":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"asso":[],"com":[],"gouv":[],"nom":[],"prd":[],"tm":[],"aeroport":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"ponpes":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"ac":[],"biz":[],"co":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"sc":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":[],"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[]},"rw":{"ac":[],"co":[],"coop":[],"gov":[],"mil":[],"net":[],"org":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"net":[],"org":[]},"sr":[],"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"av":[],"bbs":[],"bel":[],"biz":[],"com":[],"dr":[],"edu":[],"gen":[],"gov":[],"info":[],"mil":[],"k12":[],"kep":[],"name":[],"net":[],"org":[],"pol":[],"tel":[],"tsk":[],"tv":[],"web":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nic":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"cartier":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"chrysler":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"cpa":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dodge":[],"dog":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"everbank":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gay":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"ladbrokes":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"lancome":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"llp":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"mobily":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mopar":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"movistar":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"piaget":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"space":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"srt":[],"stada":[],"staples":[],"star":[],"statebank":[],"statefarm":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"telefonica":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"uconnect":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"warman":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbb9fbpob":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[]},"pl":{"beep":[],"krasnik":[],"leczna":[],"lubartow":[],"lublin":[],"poniatowa":[],"swidnik":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"ca":{"barsy":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]},"co":[],"arvo":[],"azimuth":[]},"net":{"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"go-vip":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"in-dsl":[],"in-vpn":[],"ipifony":[],"iobb":[],"kinghost":[],"uni5":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"siteleaf":[],"srcf":{"soc":[],"user":[]},"dsmynas":[],"familyds":[],"yandexcloud":{"storage":[],"website":[]},"za":[]},"com":{"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"wpcomstaging":[],"balena-devices":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"trycloudflare":[],"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastly-terrarium":[],"fastvps-server":[],"mydobiss":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":[],"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lpusercontent":[],"lmpm":{"app":[]},"linode":{"members":[],"nodebalancer":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"operaunite":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qualifioapp":[],"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"render":{"app":[]},"onrender":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"shopitsite":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"stackhero-network":[],"stdlib":{"api":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"thingdustdata":[],"bloxcms":[],"townnews-staging":[],"hk":[],"wafflecell":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[],"cn-northwest-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}},"instantcloud":[]},"org":{"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"in-dsl":[],"in-vpn":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"pubtls":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"edugit":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"io":{"apigee":[],"b-data":[],"backplaneapp":[],"banzaicloud":{"app":[]},"boxfuse":[],"browsersafetymark":[],"bigv":{"uk0":[]},"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"hasura-app":[],"moonscale":{"*":[]},"loginline":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"dyn53":[],"protonet":[],"vaporcloud":[],"on-rio":{"*":[]},"readthedocs":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"shiftedit":[],"mo-siemens":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"applicationcloud":[],"scapp":[],"s5y":{"*":[]},"telebit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[],"basicserver":[],"virtualserver":[]},"jp":{"ne":{"aseinet":{"user":[]},"gehirn":[]},"usercontent":[],"blogspot":[]},"vc":{"gv":{"d":[]},"nom":[]},"eus":{"party":{"user":[]}},"co":{"go-vip":[],"carrd":[],"crd":[],"otap":{"*":[]},"com":{"blogspot":[]},"leadpages":[],"lpages":[],"mypi":[],"n4t":[],"nodum":[],"repl":[]},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"dyn-berlin":[],"in-berlin":[],"in-brb":[],"in-butter":[],"in-dsl":[],"in-vpn":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[]},"uk":{"co":{"bytemark":{"dh":[],"vm":[]},"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"gov":{"service":[],"homeoffice":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"ai":{"uwu":[],"nom":[]},"se":{"com":[],"blogspot":[],"conf":[]},"bz":{"za":[],"nym":[]},"group":{"discourse":[]},"nl":{"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"khplay":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"dev":{"lcl":{"*":[]},"stg":{"*":[]},"workers":[],"iserv":[],"loginline":[],"webhare":{"*":[]}},"me":{"c66":[],"daplie":{"localhost":[]},"filegear":[],"filegear-au":[],"filegear-de":[],"filegear-gb":[],"filegear-ie":[],"filegear-jp":[],"filegear-sg":[],"glitch":[],"ravendb":[],"barsy":[],"nctu":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"zone":{"cloud66":[],"hs":[],"triton":{"*":[]},"lima":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"site":{"cloudera":[],"cyon":[],"lelux":[],"loginline":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"app":{"wnext":[],"run":{"a":[]},"web":[],"hasura":[],"loginline":[],"telebit":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"bpl":[],"orx":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[],"pony":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[],"dweb":{"*":[]}},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"earth":{"dapps":{"*":[],"bzz":{"*":[]}}},"th":{"online":[],"shop":[]},"fi":{"dy":[],"blogspot":[],"xn--hkkinen-5wa":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[],"builder":{"site":[]},"enterprisecloud":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[],"telebit":{"*":[]}},"one":{"onred":{"staging":[]},"for":[],"homelink":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"ru":{"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"fr":{"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"vapor":[],"on-rancher":{"*":[]},"sensiosite":{"*":[]},"trafficplex":[],"voorloper":[]},"ms":{"lab":[]},"digital":{"cloudapps":{"london":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]},"zone":[]},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]},"col":[],"firm":[],"gen":[],"ltd":[]},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"nym":[],"ltd":[],"inc":[]},"hr":{"blogspot":[],"free":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[],"syncloud":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"caa":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"ua":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"ci":{"fin":[]},"run":{"hs":[],"development":[],"ravendb":[],"repl":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"community":{"ravendb":[]},"city":{"ng":[]},"gl":{"biz":[],"nom":[]},"ink":{"ng":[]},"school":{"ng":[]},"so":{"sch":[]},"gg":{"kaas":[],"cya":[]},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"business":{"co":[]},"education":{"co":[]},"events":{"co":[]},"financial":{"co":[]},"place":{"co":[]},"technology":{"co":[]},"space":{"linkitools":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"services":{"loginline":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"casa":{"nabu":{"ui":[]}},"fashion":{"of":[],"on":[]},"football":{"of":[]},"london":{"in":[],"of":[]},"men":{"for":[]},"mom":{"and":[],"for":[]},"sale":{"for":[]},"work":{"of":[],"to":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ec":{"nym":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vg":{"nom":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"bn":{"co":[]},"page":{"prvcy":[]},"fit":{"ptplus":[]},"edu":{"rit":{"git-pages":[]}},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"to":{"vpnplus":[],"quickconnect":{"direct":[]}},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]},"design":{"bss":[]}}}"; \ No newline at end of file +s:110873:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":{"co":[],"com":[],"commune":[],"net":[],"org":[]},"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"catholic":[],"nsw":{"schools":[]},"nt":[],"qld":[],"sa":[],"tas":{"education":[]},"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"ong":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"tc":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"asso":[],"com":[],"gouv":[],"nom":[],"prd":[],"tm":[],"aeroport":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"ponpes":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"ac":[],"biz":[],"co":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"sc":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":[],"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":[],"rw":{"ac":[],"co":[],"coop":[],"gov":[],"mil":[],"net":[],"org":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"edu":[],"gov":[],"me":[],"net":[],"org":[]},"sr":[],"ss":{"biz":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"av":[],"bbs":[],"bel":[],"biz":[],"com":[],"dr":[],"edu":[],"gen":[],"gov":[],"info":[],"mil":[],"k12":[],"kep":[],"name":[],"net":[],"org":[],"pol":[],"tel":[],"tsk":[],"tv":[],"web":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--mgbah1a3hjkrd":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nic":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"amazon":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"cpa":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dog":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gay":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"llp":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"spa":[],"space":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"stada":[],"staples":[],"star":[],"statebank":[],"statefarm":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cckwcxetd":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq480n2rg":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[],"v":[]},"com":{"adobeaemcloud":{"dev":{"*":[]}},"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"balena-devices":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"trycloudflare":[],"customer-oci":{"*":[],"oci":{"*":[]},"ocp":{"*":[]},"ocs":{"*":[]}},"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"builtwithdark":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastly-terrarium":[],"fastvps-server":[],"mydobiss":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"gentapps":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":{"r":{"*":[]}},"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"awsmppl":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lpusercontent":[],"lmpm":{"app":[]},"linode":{"members":[],"nodebalancer":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"observableusercontent":{"static":[]},"operaunite":[],"skygearapp":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qualifioapp":[],"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"render":{"app":[]},"onrender":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"shopitsite":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"stackhero-network":[],"stdlib":{"api":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"thingdustdata":[],"bloxcms":[],"townnews-staging":[],"hk":[],"wafflecell":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"net":{"adobeaemcloud":[],"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"in-dsl":[],"in-vpn":[],"ipifony":[],"iobb":[],"kinghost":[],"uni5":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"siteleaf":[],"srcf":{"soc":[],"user":[]},"dsmynas":[],"familyds":[],"yandexcloud":{"storage":[],"website":[]},"za":[]},"pl":{"beep":[],"krasnik":[],"leczna":[],"lubartow":[],"lublin":[],"poniatowa":[],"swidnik":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"ca":{"barsy":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]},"co":[],"arvo":[],"azimuth":[]},"org":{"altervista":[],"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"in-dsl":[],"in-vpn":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"pubtls":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"edugit":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[],"cn-northwest-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}},"instantcloud":[]},"nl":{"amsw":[],"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"khplay":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"io":{"apigee":[],"b-data":[],"backplaneapp":[],"banzaicloud":{"app":[]},"boxfuse":[],"browsersafetymark":[],"bigv":{"uk0":[]},"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"lolipop":[],"hasura-app":[],"moonscale":{"*":[]},"loginline":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"dyn53":[],"protonet":[],"qcx":{"sys":{"*":[]}},"vaporcloud":[],"on-k3s":{"*":[]},"on-rio":{"*":[]},"readthedocs":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"shiftedit":[],"mo-siemens":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"applicationcloud":[],"scapp":[],"s5y":{"*":[]},"telebit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[],"basicserver":[],"virtualserver":[]},"jp":{"ne":{"aseinet":{"user":[]},"gehirn":[]},"usercontent":[],"blogspot":[]},"vc":{"gv":{"d":[]},"0e":[],"nom":[]},"eus":{"party":{"user":[]}},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"dyn-berlin":[],"in-berlin":[],"in-brb":[],"in-butter":[],"in-dsl":[],"in-vpn":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[]},"uk":{"co":{"bytemark":{"dh":[],"vm":[]},"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"gov":{"service":[],"homeoffice":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"co":{"carrd":[],"crd":[],"otap":{"*":[]},"com":{"blogspot":[]},"leadpages":[],"lpages":[],"mypi":[],"n4t":[],"nodum":[],"repl":[]},"ai":{"uwu":[],"nom":[]},"se":{"com":[],"blogspot":[],"conf":[]},"bz":{"za":[],"nym":[]},"group":{"discourse":[]},"dev":{"lcl":{"*":[]},"stg":{"*":[]},"workers":[],"iserv":[],"loginline":[],"webhare":{"*":[]}},"me":{"c66":[],"daplie":{"localhost":[]},"edgestack":[],"filegear":[],"filegear-au":[],"filegear-de":[],"filegear-gb":[],"filegear-ie":[],"filegear-jp":[],"filegear-sg":[],"glitch":[],"ravendb":[],"barsy":[],"nctu":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"zone":{"cloud66":[],"hs":[],"triton":{"*":[]},"lima":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"site":{"cloudera":[],"cyon":[],"lelux":[],"loginline":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"app":{"wnext":[],"run":{"a":[]},"web":[],"hasura":[],"loginline":[],"telebit":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"bpl":[],"orx":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[],"pony":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[],"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[],"dweb":{"*":[]}},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"earth":{"dapps":{"*":[],"bzz":{"*":[]}}},"th":{"online":[],"shop":[]},"fi":{"dy":[],"blogspot":[],"xn--hkkinen-5wa":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[],"builder":{"site":[]},"enterprisecloud":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[],"telebit":{"*":[]}},"fr":{"en-root":[],"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"one":{"onred":{"staging":[]},"for":[],"homelink":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"perspecta":[],"vapor":[],"on-rancher":{"*":[]},"sensiosite":{"*":[]},"trafficplex":[],"voorloper":[]},"ms":{"lab":[]},"digital":{"cloudapps":{"london":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]},"col":[],"firm":[],"gen":[],"ltd":[],"ngo":[]},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"nym":[],"ltd":[],"inc":[]},"hr":{"blogspot":[],"free":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[],"syncloud":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"caa":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"ua":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"ci":{"fin":[]},"run":{"hs":[],"development":[],"ravendb":[],"repl":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"community":{"ravendb":[]},"city":{"ng":[]},"gl":{"biz":[],"nom":[]},"ink":{"ng":[]},"school":{"ng":[]},"so":{"sch":[]},"gg":{"kaas":[],"cya":[]},"systems":{"knightpoint":[]},"to":{"oya":[],"vpnplus":[],"quickconnect":{"direct":[]}},"krd":{"co":[],"edu":[]},"business":{"co":[]},"education":{"co":[]},"events":{"co":[]},"financial":{"co":[]},"place":{"co":[]},"technology":{"co":[]},"space":{"linkitools":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"services":{"loginline":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"casa":{"nabu":{"ui":[]}},"fashion":{"of":[],"on":[]},"football":{"of":[]},"london":{"in":[],"of":[]},"men":{"for":[]},"mom":{"and":[],"for":[]},"sale":{"for":[]},"work":{"of":[],"to":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ec":{"nym":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vg":{"nom":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"bn":{"co":[]},"page":{"prvcy":[]},"fit":{"ptplus":[]},"edu":{"rit":{"git-pages":[]}},"scot":{"gov":[]},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]},"design":{"bss":[]}}}"; \ No newline at end of file diff --git a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache index eca8fa8d..6dfa0fda 100644 --- a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache +++ b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache @@ -1 +1 @@ -s:13369:"{"version":"2019090300","modifiedDate":"2019-09-03T07:07:01+00:00","records":["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac","academy","accenture","accountant","accountants","aco","actor","ad","adac","ads","adult","ae","aeg","aero","aetna","af","afamilycompany","afl","africa","ag","agakhan","agency","ai","aig","aigo","airbus","airforce","airtel","akdn","al","alfaromeo","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","am","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","ao","aol","apartments","app","apple","aq","aquarelle","ar","arab","aramco","archi","army","arpa","art","arte","as","asda","asia","associates","at","athleta","attorney","au","auction","audi","audible","audio","auspost","author","auto","autos","avianca","aw","aws","ax","axa","az","azure","ba","baby","baidu","banamex","bananarepublic","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bb","bbc","bbt","bbva","bcg","bcn","bd","be","beats","beauty","beer","bentley","berlin","best","bestbuy","bet","bf","bg","bh","bharti","bi","bible","bid","bike","bing","bingo","bio","biz","bj","black","blackfriday","blockbuster","blog","bloomberg","blue","bm","bms","bmw","bn","bnpparibas","bo","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","br","bradesco","bridgestone","broadway","broker","brother","brussels","bs","bt","budapest","bugatti","build","builders","business","buy","buzz","bv","bw","by","bz","bzh","ca","cab","cafe","cal","call","calvinklein","cam","camera","camp","cancerresearch","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","cartier","casa","case","caseih","cash","casino","cat","catering","catholic","cba","cbn","cbre","cbs","cc","cd","ceb","center","ceo","cern","cf","cfa","cfd","cg","ch","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","chrysler","church","ci","cipriani","circle","cisco","citadel","citi","citic","city","cityeats","ck","cl","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","cm","cn","co","coach","codes","coffee","college","cologne","com","comcast","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cookingchannel","cool","coop","corsica","country","coupon","coupons","courses","cr","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","csc","cu","cuisinella","cv","cw","cx","cy","cymru","cyou","cz","dabur","dad","dance","data","date","dating","datsun","day","dclk","dds","de","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dj","dk","dm","dnp","do","docs","doctor","dodge","dog","domains","dot","download","drive","dtv","dubai","duck","dunlop","dupont","durban","dvag","dvr","dz","earth","eat","ec","eco","edeka","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","epson","equipment","er","ericsson","erni","es","esq","estate","esurance","et","etisalat","eu","eurovision","eus","events","everbank","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fi","fiat","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","fj","fk","flickr","flights","flir","florist","flowers","fly","fm","fo","foo","food","foodnetwork","football","ford","forex","forsale","forum","foundation","fox","fr","free","fresenius","frl","frogans","frontdoor","frontier","ftr","fujitsu","fujixerox","fun","fund","furniture","futbol","fyi","ga","gal","gallery","gallo","gallup","game","games","gap","garden","gay","gb","gbiz","gd","gdn","ge","gea","gent","genting","george","gf","gg","ggee","gh","gi","gift","gifts","gives","giving","gl","glade","glass","gle","global","globo","gm","gmail","gmbh","gmo","gmx","gn","godaddy","gold","goldpoint","golf","goo","goodyear","goog","google","gop","got","gov","gp","gq","gr","grainger","graphics","gratis","green","gripe","grocery","group","gs","gt","gu","guardian","gucci","guge","guide","guitars","guru","gw","gy","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hgtv","hiphop","hisamitsu","hitachi","hiv","hk","hkt","hm","hn","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","horse","hospital","host","hosting","hot","hoteles","hotels","hotmail","house","how","hr","hsbc","ht","hu","hughes","hyatt","hyundai","ibm","icbc","ice","icu","id","ie","ieee","ifm","ikano","il","im","imamat","imdb","immo","immobilien","in","inc","industries","infiniti","info","ing","ink","institute","insurance","insure","int","intel","international","intuit","investments","io","ipiranga","iq","ir","irish","is","ismaili","ist","istanbul","it","itau","itv","iveco","jaguar","java","jcb","jcp","je","jeep","jetzt","jewelry","jio","jll","jm","jmp","jnj","jo","jobs","joburg","jot","joy","jp","jpmorgan","jprs","juegos","juniper","kaufen","kddi","ke","kerryhotels","kerrylogistics","kerryproperties","kfh","kg","kh","ki","kia","kim","kinder","kindle","kitchen","kiwi","km","kn","koeln","komatsu","kosher","kp","kpmg","kpn","kr","krd","kred","kuokgroup","kw","ky","kyoto","kz","la","lacaixa","ladbrokes","lamborghini","lamer","lancaster","lancia","lancome","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lb","lc","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","li","liaison","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","linde","link","lipsy","live","living","lixil","lk","llc","loan","loans","locker","locus","loft","lol","london","lotte","lotto","love","lpl","lplfinancial","lr","ls","lt","ltd","ltda","lu","lundbeck","lupin","luxe","luxury","lv","ly","ma","macys","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","maserati","mattel","mba","mc","mckinsey","md","me","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","metlife","mg","mh","miami","microsoft","mil","mini","mint","mit","mitsubishi","mk","ml","mlb","mls","mm","mma","mn","mo","mobi","mobile","mobily","moda","moe","moi","mom","monash","money","monster","mopar","mormon","mortgage","moscow","moto","motorcycles","mov","movie","movistar","mp","mq","mr","ms","msd","mt","mtn","mtr","mu","museum","mutual","mv","mw","mx","my","mz","na","nab","nadex","nagoya","name","nationwide","natura","navy","nba","nc","ne","nec","net","netbank","netflix","network","neustar","new","newholland","news","next","nextdirect","nexus","nf","nfl","ng","ngo","nhk","ni","nico","nike","nikon","ninja","nissan","nissay","nl","no","nokia","northwesternmutual","norton","now","nowruz","nowtv","np","nr","nra","nrw","ntt","nu","nyc","nz","obi","observer","off","office","okinawa","olayan","olayangroup","oldnavy","ollo","om","omega","one","ong","onl","online","onyourside","ooo","open","oracle","orange","org","organic","origins","osaka","otsuka","ott","ovh","pa","page","panasonic","paris","pars","partners","parts","party","passagens","pay","pccw","pe","pet","pf","pfizer","pg","ph","pharmacy","phd","philips","phone","photo","photography","photos","physio","piaget","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","pk","pl","place","play","playstation","plumbing","plus","pm","pn","pnc","pohl","poker","politie","porn","post","pr","pramerica","praxi","press","prime","pro","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","ps","pt","pub","pw","pwc","py","qa","qpon","quebec","quest","qvc","racing","radio","raid","re","read","realestate","realtor","realty","recipes","red","redstone","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","rightathome","ril","rio","rip","rmit","ro","rocher","rocks","rodeo","rogers","room","rs","rsvp","ru","rugby","ruhr","run","rw","rwe","ryukyu","sa","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sb","sbi","sbs","sc","sca","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scjohnson","scor","scot","sd","se","search","seat","secure","security","seek","select","sener","services","ses","seven","sew","sex","sexy","sfr","sg","sh","shangrila","sharp","shaw","shell","shia","shiksha","shoes","shop","shopping","shouji","show","showtime","shriram","si","silk","sina","singles","site","sj","sk","ski","skin","sky","skype","sl","sling","sm","smart","smile","sn","sncf","so","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","space","sport","spot","spreadbetting","sr","srl","srt","ss","st","stada","staples","star","statebank","statefarm","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","su","sucks","supplies","supply","support","surf","surgery","suzuki","sv","swatch","swiftcover","swiss","sx","sy","sydney","symantec","systems","sz","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tc","tci","td","tdk","team","tech","technology","tel","telefonica","temasek","tennis","teva","tf","tg","th","thd","theater","theatre","tiaa","tickets","tienda","tiffany","tips","tires","tirol","tj","tjmaxx","tjx","tk","tkmaxx","tl","tm","tmall","tn","to","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","tr","trade","trading","training","travel","travelchannel","travelers","travelersinsurance","trust","trv","tt","tube","tui","tunes","tushu","tv","tvs","tw","tz","ua","ubank","ubs","uconnect","ug","uk","unicom","university","uno","uol","ups","us","uy","uz","va","vacations","vana","vanguard","vc","ve","vegas","ventures","verisign","versicherung","vet","vg","vi","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","vistaprint","viva","vivo","vlaanderen","vn","vodka","volkswagen","volvo","vote","voting","voto","voyage","vu","vuelos","wales","walmart","walter","wang","wanggou","warman","watch","watches","weather","weatherchannel","webcam","weber","website","wed","wedding","weibo","weir","wf","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","ws","wtc","wtf","xbox","xerox","xfinity","xihuan","xin","xn--11b4c3d","xn--1ck2e1b","xn--1qqw23a","xn--2scrj9c","xn--30rr7y","xn--3bst00m","xn--3ds443g","xn--3e0b707e","xn--3hcrj9c","xn--3oq18vl8pn36a","xn--3pxu8k","xn--42c2d9a","xn--45br5cyl","xn--45brj9c","xn--45q11c","xn--4gbrim","xn--54b7fta0cc","xn--55qw42g","xn--55qx5d","xn--5su34j936bgsg","xn--5tzm5g","xn--6frz82g","xn--6qq986b3xl","xn--80adxhks","xn--80ao21a","xn--80aqecdr1a","xn--80asehdb","xn--80aswg","xn--8y0a063a","xn--90a3ac","xn--90ae","xn--90ais","xn--9dbq2a","xn--9et52u","xn--9krt00a","xn--b4w605ferd","xn--bck1b9a5dre4c","xn--c1avg","xn--c2br7g","xn--cck2b3b","xn--cg4bki","xn--clchc0ea0b2g2a9gcd","xn--czr694b","xn--czrs0t","xn--czru2d","xn--d1acj3b","xn--d1alf","xn--e1a4c","xn--eckvdtc9d","xn--efvy88h","xn--estv75g","xn--fct429k","xn--fhbei","xn--fiq228c5hs","xn--fiq64b","xn--fiqs8s","xn--fiqz9s","xn--fjq720a","xn--flw351e","xn--fpcrj9c3d","xn--fzc2c9e2c","xn--fzys8d69uvgm","xn--g2xx48c","xn--gckr3f0f","xn--gecrj9c","xn--gk3at1e","xn--h2breg3eve","xn--h2brj9c","xn--h2brj9c8c","xn--hxt814e","xn--i1b6b1a6a2e","xn--imr513n","xn--io0a7i","xn--j1aef","xn--j1amh","xn--j6w193g","xn--jlq61u9w7b","xn--jvr189m","xn--kcrx77d1x4a","xn--kprw13d","xn--kpry57d","xn--kpu716f","xn--kput3i","xn--l1acc","xn--lgbbat1ad8j","xn--mgb9awbf","xn--mgba3a3ejt","xn--mgba3a4f16a","xn--mgba7c0bbn0a","xn--mgbaakc7dvf","xn--mgbaam7a8h","xn--mgbab2bd","xn--mgbah1a3hjkrd","xn--mgbai9azgqp6j","xn--mgbayh7gpa","xn--mgbb9fbpob","xn--mgbbh1a","xn--mgbbh1a71e","xn--mgbc0a9azcg","xn--mgbca7dzdo","xn--mgberp4a5d4ar","xn--mgbgu82a","xn--mgbi4ecexp","xn--mgbpl2fh","xn--mgbt3dhd","xn--mgbtx2b","xn--mgbx4cd0ab","xn--mix891f","xn--mk1bu44c","xn--mxtq1m","xn--ngbc5azd","xn--ngbe9e0a","xn--ngbrx","xn--node","xn--nqv7f","xn--nqv7fs00ema","xn--nyqy26a","xn--o3cw4h","xn--ogbpf8fl","xn--otu796d","xn--p1acf","xn--p1ai","xn--pbt977c","xn--pgbs0dh","xn--pssy2u","xn--q9jyb4c","xn--qcka1pmc","xn--qxam","xn--rhqv96g","xn--rovu88b","xn--rvc1e0am3e","xn--s9brj9c","xn--ses554g","xn--t60b56a","xn--tckwe","xn--tiq49xqyj","xn--unup4y","xn--vermgensberater-ctb","xn--vermgensberatung-pwb","xn--vhquv","xn--vuq861b","xn--w4r85el8fhu5dnra","xn--w4rs40l","xn--wgbh1c","xn--wgbl6a","xn--xhq521b","xn--xkc2al3hye2a","xn--xkc2dl3a5ee0h","xn--y9a3aq","xn--yfro4i67o","xn--ygbi2ammx","xn--zfr164b","xxx","xyz","yachts","yahoo","yamaxun","yandex","ye","yodobashi","yoga","yokohama","you","youtube","yt","yun","za","zappos","zara","zero","zip","zm","zone","zuerich","zw"]}"; \ No newline at end of file +s:13238:"{"version":"2019122800","modifiedDate":"2019-12-28T07:07:01+00:00","records":["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac","academy","accenture","accountant","accountants","aco","actor","ad","adac","ads","adult","ae","aeg","aero","aetna","af","afamilycompany","afl","africa","ag","agakhan","agency","ai","aig","aigo","airbus","airforce","airtel","akdn","al","alfaromeo","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","am","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","ao","aol","apartments","app","apple","aq","aquarelle","ar","arab","aramco","archi","army","arpa","art","arte","as","asda","asia","associates","at","athleta","attorney","au","auction","audi","audible","audio","auspost","author","auto","autos","avianca","aw","aws","ax","axa","az","azure","ba","baby","baidu","banamex","bananarepublic","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bb","bbc","bbt","bbva","bcg","bcn","bd","be","beats","beauty","beer","bentley","berlin","best","bestbuy","bet","bf","bg","bh","bharti","bi","bible","bid","bike","bing","bingo","bio","biz","bj","black","blackfriday","blockbuster","blog","bloomberg","blue","bm","bms","bmw","bn","bnpparibas","bo","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","br","bradesco","bridgestone","broadway","broker","brother","brussels","bs","bt","budapest","bugatti","build","builders","business","buy","buzz","bv","bw","by","bz","bzh","ca","cab","cafe","cal","call","calvinklein","cam","camera","camp","cancerresearch","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","casa","case","caseih","cash","casino","cat","catering","catholic","cba","cbn","cbre","cbs","cc","cd","ceb","center","ceo","cern","cf","cfa","cfd","cg","ch","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","church","ci","cipriani","circle","cisco","citadel","citi","citic","city","cityeats","ck","cl","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","cm","cn","co","coach","codes","coffee","college","cologne","com","comcast","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cookingchannel","cool","coop","corsica","country","coupon","coupons","courses","cpa","cr","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","csc","cu","cuisinella","cv","cw","cx","cy","cymru","cyou","cz","dabur","dad","dance","data","date","dating","datsun","day","dclk","dds","de","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dj","dk","dm","dnp","do","docs","doctor","dog","domains","dot","download","drive","dtv","dubai","duck","dunlop","dupont","durban","dvag","dvr","dz","earth","eat","ec","eco","edeka","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","epson","equipment","er","ericsson","erni","es","esq","estate","esurance","et","etisalat","eu","eurovision","eus","events","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fi","fiat","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","fj","fk","flickr","flights","flir","florist","flowers","fly","fm","fo","foo","food","foodnetwork","football","ford","forex","forsale","forum","foundation","fox","fr","free","fresenius","frl","frogans","frontdoor","frontier","ftr","fujitsu","fujixerox","fun","fund","furniture","futbol","fyi","ga","gal","gallery","gallo","gallup","game","games","gap","garden","gay","gb","gbiz","gd","gdn","ge","gea","gent","genting","george","gf","gg","ggee","gh","gi","gift","gifts","gives","giving","gl","glade","glass","gle","global","globo","gm","gmail","gmbh","gmo","gmx","gn","godaddy","gold","goldpoint","golf","goo","goodyear","goog","google","gop","got","gov","gp","gq","gr","grainger","graphics","gratis","green","gripe","grocery","group","gs","gt","gu","guardian","gucci","guge","guide","guitars","guru","gw","gy","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hgtv","hiphop","hisamitsu","hitachi","hiv","hk","hkt","hm","hn","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","horse","hospital","host","hosting","hot","hoteles","hotels","hotmail","house","how","hr","hsbc","ht","hu","hughes","hyatt","hyundai","ibm","icbc","ice","icu","id","ie","ieee","ifm","ikano","il","im","imamat","imdb","immo","immobilien","in","inc","industries","infiniti","info","ing","ink","institute","insurance","insure","int","intel","international","intuit","investments","io","ipiranga","iq","ir","irish","is","ismaili","ist","istanbul","it","itau","itv","iveco","jaguar","java","jcb","jcp","je","jeep","jetzt","jewelry","jio","jll","jm","jmp","jnj","jo","jobs","joburg","jot","joy","jp","jpmorgan","jprs","juegos","juniper","kaufen","kddi","ke","kerryhotels","kerrylogistics","kerryproperties","kfh","kg","kh","ki","kia","kim","kinder","kindle","kitchen","kiwi","km","kn","koeln","komatsu","kosher","kp","kpmg","kpn","kr","krd","kred","kuokgroup","kw","ky","kyoto","kz","la","lacaixa","lamborghini","lamer","lancaster","lancia","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lb","lc","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","li","liaison","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","linde","link","lipsy","live","living","lixil","lk","llc","llp","loan","loans","locker","locus","loft","lol","london","lotte","lotto","love","lpl","lplfinancial","lr","ls","lt","ltd","ltda","lu","lundbeck","lupin","luxe","luxury","lv","ly","ma","macys","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","maserati","mattel","mba","mc","mckinsey","md","me","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","metlife","mg","mh","miami","microsoft","mil","mini","mint","mit","mitsubishi","mk","ml","mlb","mls","mm","mma","mn","mo","mobi","mobile","moda","moe","moi","mom","monash","money","monster","mormon","mortgage","moscow","moto","motorcycles","mov","movie","mp","mq","mr","ms","msd","mt","mtn","mtr","mu","museum","mutual","mv","mw","mx","my","mz","na","nab","nadex","nagoya","name","nationwide","natura","navy","nba","nc","ne","nec","net","netbank","netflix","network","neustar","new","newholland","news","next","nextdirect","nexus","nf","nfl","ng","ngo","nhk","ni","nico","nike","nikon","ninja","nissan","nissay","nl","no","nokia","northwesternmutual","norton","now","nowruz","nowtv","np","nr","nra","nrw","ntt","nu","nyc","nz","obi","observer","off","office","okinawa","olayan","olayangroup","oldnavy","ollo","om","omega","one","ong","onl","online","onyourside","ooo","open","oracle","orange","org","organic","origins","osaka","otsuka","ott","ovh","pa","page","panasonic","paris","pars","partners","parts","party","passagens","pay","pccw","pe","pet","pf","pfizer","pg","ph","pharmacy","phd","philips","phone","photo","photography","photos","physio","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","pk","pl","place","play","playstation","plumbing","plus","pm","pn","pnc","pohl","poker","politie","porn","post","pr","pramerica","praxi","press","prime","pro","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","ps","pt","pub","pw","pwc","py","qa","qpon","quebec","quest","qvc","racing","radio","raid","re","read","realestate","realtor","realty","recipes","red","redstone","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","rightathome","ril","rio","rip","rmit","ro","rocher","rocks","rodeo","rogers","room","rs","rsvp","ru","rugby","ruhr","run","rw","rwe","ryukyu","sa","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sb","sbi","sbs","sc","sca","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scjohnson","scor","scot","sd","se","search","seat","secure","security","seek","select","sener","services","ses","seven","sew","sex","sexy","sfr","sg","sh","shangrila","sharp","shaw","shell","shia","shiksha","shoes","shop","shopping","shouji","show","showtime","shriram","si","silk","sina","singles","site","sj","sk","ski","skin","sky","skype","sl","sling","sm","smart","smile","sn","sncf","so","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","space","sport","spot","spreadbetting","sr","srl","ss","st","stada","staples","star","statebank","statefarm","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","su","sucks","supplies","supply","support","surf","surgery","suzuki","sv","swatch","swiftcover","swiss","sx","sy","sydney","symantec","systems","sz","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tc","tci","td","tdk","team","tech","technology","tel","temasek","tennis","teva","tf","tg","th","thd","theater","theatre","tiaa","tickets","tienda","tiffany","tips","tires","tirol","tj","tjmaxx","tjx","tk","tkmaxx","tl","tm","tmall","tn","to","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","tr","trade","trading","training","travel","travelchannel","travelers","travelersinsurance","trust","trv","tt","tube","tui","tunes","tushu","tv","tvs","tw","tz","ua","ubank","ubs","ug","uk","unicom","university","uno","uol","ups","us","uy","uz","va","vacations","vana","vanguard","vc","ve","vegas","ventures","verisign","versicherung","vet","vg","vi","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","vistaprint","viva","vivo","vlaanderen","vn","vodka","volkswagen","volvo","vote","voting","voto","voyage","vu","vuelos","wales","walmart","walter","wang","wanggou","watch","watches","weather","weatherchannel","webcam","weber","website","wed","wedding","weibo","weir","wf","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","ws","wtc","wtf","xbox","xerox","xfinity","xihuan","xin","xn--11b4c3d","xn--1ck2e1b","xn--1qqw23a","xn--2scrj9c","xn--30rr7y","xn--3bst00m","xn--3ds443g","xn--3e0b707e","xn--3hcrj9c","xn--3oq18vl8pn36a","xn--3pxu8k","xn--42c2d9a","xn--45br5cyl","xn--45brj9c","xn--45q11c","xn--4gbrim","xn--54b7fta0cc","xn--55qw42g","xn--55qx5d","xn--5su34j936bgsg","xn--5tzm5g","xn--6frz82g","xn--6qq986b3xl","xn--80adxhks","xn--80ao21a","xn--80aqecdr1a","xn--80asehdb","xn--80aswg","xn--8y0a063a","xn--90a3ac","xn--90ae","xn--90ais","xn--9dbq2a","xn--9et52u","xn--9krt00a","xn--b4w605ferd","xn--bck1b9a5dre4c","xn--c1avg","xn--c2br7g","xn--cck2b3b","xn--cg4bki","xn--clchc0ea0b2g2a9gcd","xn--czr694b","xn--czrs0t","xn--czru2d","xn--d1acj3b","xn--d1alf","xn--e1a4c","xn--eckvdtc9d","xn--efvy88h","xn--estv75g","xn--fct429k","xn--fhbei","xn--fiq228c5hs","xn--fiq64b","xn--fiqs8s","xn--fiqz9s","xn--fjq720a","xn--flw351e","xn--fpcrj9c3d","xn--fzc2c9e2c","xn--fzys8d69uvgm","xn--g2xx48c","xn--gckr3f0f","xn--gecrj9c","xn--gk3at1e","xn--h2breg3eve","xn--h2brj9c","xn--h2brj9c8c","xn--hxt814e","xn--i1b6b1a6a2e","xn--imr513n","xn--io0a7i","xn--j1aef","xn--j1amh","xn--j6w193g","xn--jlq61u9w7b","xn--jvr189m","xn--kcrx77d1x4a","xn--kprw13d","xn--kpry57d","xn--kpu716f","xn--kput3i","xn--l1acc","xn--lgbbat1ad8j","xn--mgb9awbf","xn--mgba3a3ejt","xn--mgba3a4f16a","xn--mgba7c0bbn0a","xn--mgbaakc7dvf","xn--mgbaam7a8h","xn--mgbab2bd","xn--mgbah1a3hjkrd","xn--mgbai9azgqp6j","xn--mgbayh7gpa","xn--mgbbh1a","xn--mgbbh1a71e","xn--mgbc0a9azcg","xn--mgbca7dzdo","xn--mgberp4a5d4ar","xn--mgbgu82a","xn--mgbi4ecexp","xn--mgbpl2fh","xn--mgbt3dhd","xn--mgbtx2b","xn--mgbx4cd0ab","xn--mix891f","xn--mk1bu44c","xn--mxtq1m","xn--ngbc5azd","xn--ngbe9e0a","xn--ngbrx","xn--node","xn--nqv7f","xn--nqv7fs00ema","xn--nyqy26a","xn--o3cw4h","xn--ogbpf8fl","xn--otu796d","xn--p1acf","xn--p1ai","xn--pbt977c","xn--pgbs0dh","xn--pssy2u","xn--q9jyb4c","xn--qcka1pmc","xn--qxa6a","xn--qxam","xn--rhqv96g","xn--rovu88b","xn--rvc1e0am3e","xn--s9brj9c","xn--ses554g","xn--t60b56a","xn--tckwe","xn--tiq49xqyj","xn--unup4y","xn--vermgensberater-ctb","xn--vermgensberatung-pwb","xn--vhquv","xn--vuq861b","xn--w4r85el8fhu5dnra","xn--w4rs40l","xn--wgbh1c","xn--wgbl6a","xn--xhq521b","xn--xkc2al3hye2a","xn--xkc2dl3a5ee0h","xn--y9a3aq","xn--yfro4i67o","xn--ygbi2ammx","xn--zfr164b","xxx","xyz","yachts","yahoo","yamaxun","yandex","ye","yodobashi","yoga","yokohama","you","youtube","yt","yun","za","zappos","zara","zero","zip","zm","zone","zuerich","zw"]}"; \ No newline at end of file From a0919107ff9bf29539f2194777518f942bc87714 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 16 Jan 2020 22:23:23 +0100 Subject: [PATCH 178/461] bugfix idn functions usage --- ...PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- src/IDNAConverterTrait.php | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache index 29fe9f30..a7439a1d 100644 --- a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache +++ b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache @@ -1 +1 @@ -s:110873:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":{"co":[],"com":[],"commune":[],"net":[],"org":[]},"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"catholic":[],"nsw":{"schools":[]},"nt":[],"qld":[],"sa":[],"tas":{"education":[]},"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"ong":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"tc":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"asso":[],"com":[],"gouv":[],"nom":[],"prd":[],"tm":[],"aeroport":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"ponpes":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"ac":[],"biz":[],"co":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"sc":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":[],"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":[],"rw":{"ac":[],"co":[],"coop":[],"gov":[],"mil":[],"net":[],"org":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"edu":[],"gov":[],"me":[],"net":[],"org":[]},"sr":[],"ss":{"biz":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"av":[],"bbs":[],"bel":[],"biz":[],"com":[],"dr":[],"edu":[],"gen":[],"gov":[],"info":[],"mil":[],"k12":[],"kep":[],"name":[],"net":[],"org":[],"pol":[],"tel":[],"tsk":[],"tv":[],"web":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--mgbah1a3hjkrd":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nic":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"amazon":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"cpa":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dog":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gay":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"liaison":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"llp":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"spa":[],"space":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"stada":[],"staples":[],"star":[],"statebank":[],"statefarm":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cckwcxetd":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq480n2rg":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[],"v":[]},"com":{"adobeaemcloud":{"dev":{"*":[]}},"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"balena-devices":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"trycloudflare":[],"customer-oci":{"*":[],"oci":{"*":[]},"ocp":{"*":[]},"ocs":{"*":[]}},"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"builtwithdark":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastly-terrarium":[],"fastvps-server":[],"mydobiss":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"gentapps":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":{"r":{"*":[]}},"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"awsmppl":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lpusercontent":[],"lmpm":{"app":[]},"linode":{"members":[],"nodebalancer":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"observableusercontent":{"static":[]},"operaunite":[],"skygearapp":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qualifioapp":[],"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"render":{"app":[]},"onrender":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"shopitsite":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"stackhero-network":[],"stdlib":{"api":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"thingdustdata":[],"bloxcms":[],"townnews-staging":[],"hk":[],"wafflecell":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"net":{"adobeaemcloud":[],"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"in-dsl":[],"in-vpn":[],"ipifony":[],"iobb":[],"kinghost":[],"uni5":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"siteleaf":[],"srcf":{"soc":[],"user":[]},"dsmynas":[],"familyds":[],"yandexcloud":{"storage":[],"website":[]},"za":[]},"pl":{"beep":[],"krasnik":[],"leczna":[],"lubartow":[],"lublin":[],"poniatowa":[],"swidnik":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"ca":{"barsy":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]},"co":[],"arvo":[],"azimuth":[]},"org":{"altervista":[],"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"in-dsl":[],"in-vpn":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"pubtls":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"edugit":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[],"cn-northwest-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}},"instantcloud":[]},"nl":{"amsw":[],"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"khplay":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"io":{"apigee":[],"b-data":[],"backplaneapp":[],"banzaicloud":{"app":[]},"boxfuse":[],"browsersafetymark":[],"bigv":{"uk0":[]},"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"lolipop":[],"hasura-app":[],"moonscale":{"*":[]},"loginline":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"dyn53":[],"protonet":[],"qcx":{"sys":{"*":[]}},"vaporcloud":[],"on-k3s":{"*":[]},"on-rio":{"*":[]},"readthedocs":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"shiftedit":[],"mo-siemens":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"applicationcloud":[],"scapp":[],"s5y":{"*":[]},"telebit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[],"basicserver":[],"virtualserver":[]},"jp":{"ne":{"aseinet":{"user":[]},"gehirn":[]},"usercontent":[],"blogspot":[]},"vc":{"gv":{"d":[]},"0e":[],"nom":[]},"eus":{"party":{"user":[]}},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"dyn-berlin":[],"in-berlin":[],"in-brb":[],"in-butter":[],"in-dsl":[],"in-vpn":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[]},"uk":{"co":{"bytemark":{"dh":[],"vm":[]},"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"gov":{"service":[],"homeoffice":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"co":{"carrd":[],"crd":[],"otap":{"*":[]},"com":{"blogspot":[]},"leadpages":[],"lpages":[],"mypi":[],"n4t":[],"nodum":[],"repl":[]},"ai":{"uwu":[],"nom":[]},"se":{"com":[],"blogspot":[],"conf":[]},"bz":{"za":[],"nym":[]},"group":{"discourse":[]},"dev":{"lcl":{"*":[]},"stg":{"*":[]},"workers":[],"iserv":[],"loginline":[],"webhare":{"*":[]}},"me":{"c66":[],"daplie":{"localhost":[]},"edgestack":[],"filegear":[],"filegear-au":[],"filegear-de":[],"filegear-gb":[],"filegear-ie":[],"filegear-jp":[],"filegear-sg":[],"glitch":[],"ravendb":[],"barsy":[],"nctu":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"zone":{"cloud66":[],"hs":[],"triton":{"*":[]},"lima":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"site":{"cloudera":[],"cyon":[],"lelux":[],"loginline":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"app":{"wnext":[],"run":{"a":[]},"web":[],"hasura":[],"loginline":[],"telebit":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"bpl":[],"orx":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[],"pony":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[],"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[],"dweb":{"*":[]}},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"earth":{"dapps":{"*":[],"bzz":{"*":[]}}},"th":{"online":[],"shop":[]},"fi":{"dy":[],"blogspot":[],"xn--hkkinen-5wa":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[],"builder":{"site":[]},"enterprisecloud":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[],"telebit":{"*":[]}},"fr":{"en-root":[],"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"one":{"onred":{"staging":[]},"for":[],"homelink":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"perspecta":[],"vapor":[],"on-rancher":{"*":[]},"sensiosite":{"*":[]},"trafficplex":[],"voorloper":[]},"ms":{"lab":[]},"digital":{"cloudapps":{"london":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]},"col":[],"firm":[],"gen":[],"ltd":[],"ngo":[]},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"nym":[],"ltd":[],"inc":[]},"hr":{"blogspot":[],"free":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[],"syncloud":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"caa":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"ua":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"ci":{"fin":[]},"run":{"hs":[],"development":[],"ravendb":[],"repl":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"community":{"ravendb":[]},"city":{"ng":[]},"gl":{"biz":[],"nom":[]},"ink":{"ng":[]},"school":{"ng":[]},"so":{"sch":[]},"gg":{"kaas":[],"cya":[]},"systems":{"knightpoint":[]},"to":{"oya":[],"vpnplus":[],"quickconnect":{"direct":[]}},"krd":{"co":[],"edu":[]},"business":{"co":[]},"education":{"co":[]},"events":{"co":[]},"financial":{"co":[]},"place":{"co":[]},"technology":{"co":[]},"space":{"linkitools":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"services":{"loginline":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"casa":{"nabu":{"ui":[]}},"fashion":{"of":[],"on":[]},"football":{"of":[]},"london":{"in":[],"of":[]},"men":{"for":[]},"mom":{"and":[],"for":[]},"sale":{"for":[]},"work":{"of":[],"to":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ec":{"nym":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vg":{"nom":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"bn":{"co":[]},"page":{"prvcy":[]},"fit":{"ptplus":[]},"edu":{"rit":{"git-pages":[]}},"scot":{"gov":[]},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]},"design":{"bss":[]}}}"; \ No newline at end of file +s:110860:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":{"co":[],"com":[],"commune":[],"net":[],"org":[]},"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"catholic":[],"nsw":{"schools":[]},"nt":[],"qld":[],"sa":[],"tas":{"education":[]},"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"ong":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"tc":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"asso":[],"com":[],"gouv":[],"nom":[],"prd":[],"tm":[],"aeroport":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"ponpes":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"ac":[],"biz":[],"co":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"sc":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":[],"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":[],"rw":{"ac":[],"co":[],"coop":[],"gov":[],"mil":[],"net":[],"org":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"edu":[],"gov":[],"me":[],"net":[],"org":[]},"sr":[],"ss":{"biz":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"av":[],"bbs":[],"bel":[],"biz":[],"com":[],"dr":[],"edu":[],"gen":[],"gov":[],"info":[],"mil":[],"k12":[],"kep":[],"name":[],"net":[],"org":[],"pol":[],"tel":[],"tsk":[],"tv":[],"web":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--mgbah1a3hjkrd":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nic":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"amazon":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"cpa":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dog":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gay":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"llp":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"spa":[],"space":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"stada":[],"staples":[],"star":[],"statebank":[],"statefarm":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cckwcxetd":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq480n2rg":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[],"v":[]},"com":{"adobeaemcloud":{"dev":{"*":[]}},"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"balena-devices":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"trycloudflare":[],"customer-oci":{"*":[],"oci":{"*":[]},"ocp":{"*":[]},"ocs":{"*":[]}},"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"builtwithdark":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastly-terrarium":[],"fastvps-server":[],"mydobiss":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"gentapps":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":{"r":{"*":[]}},"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"awsmppl":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lpusercontent":[],"lmpm":{"app":[]},"linode":{"members":[],"nodebalancer":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"observableusercontent":{"static":[]},"operaunite":[],"skygearapp":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qualifioapp":[],"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"render":{"app":[]},"onrender":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"shopitsite":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"stackhero-network":[],"stdlib":{"api":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"thingdustdata":[],"bloxcms":[],"townnews-staging":[],"hk":[],"wafflecell":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"net":{"adobeaemcloud":[],"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"in-dsl":[],"in-vpn":[],"ipifony":[],"iobb":[],"kinghost":[],"uni5":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"siteleaf":[],"srcf":{"soc":[],"user":[]},"dsmynas":[],"familyds":[],"yandexcloud":{"storage":[],"website":[]},"za":[]},"pl":{"beep":[],"krasnik":[],"leczna":[],"lubartow":[],"lublin":[],"poniatowa":[],"swidnik":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"ca":{"barsy":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]},"co":[],"arvo":[],"azimuth":[]},"org":{"altervista":[],"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"in-dsl":[],"in-vpn":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"pubtls":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"edugit":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[],"cn-northwest-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}},"instantcloud":[]},"nl":{"amsw":[],"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"khplay":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"io":{"apigee":[],"b-data":[],"backplaneapp":[],"banzaicloud":{"app":[]},"boxfuse":[],"browsersafetymark":[],"bigv":{"uk0":[]},"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"lolipop":[],"hasura-app":[],"moonscale":{"*":[]},"loginline":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"dyn53":[],"protonet":[],"qcx":{"sys":{"*":[]}},"vaporcloud":[],"on-k3s":{"*":[]},"on-rio":{"*":[]},"readthedocs":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"shiftedit":[],"mo-siemens":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"applicationcloud":[],"scapp":[],"s5y":{"*":[]},"telebit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[],"basicserver":[],"virtualserver":[]},"jp":{"ne":{"aseinet":{"user":[]},"gehirn":[]},"usercontent":[],"blogspot":[]},"vc":{"gv":{"d":[]},"0e":[],"nom":[]},"eus":{"party":{"user":[]}},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"dyn-berlin":[],"in-berlin":[],"in-brb":[],"in-butter":[],"in-dsl":[],"in-vpn":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[]},"uk":{"co":{"bytemark":{"dh":[],"vm":[]},"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"gov":{"service":[],"homeoffice":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"co":{"carrd":[],"crd":[],"otap":{"*":[]},"com":{"blogspot":[]},"leadpages":[],"lpages":[],"mypi":[],"n4t":[],"nodum":[],"repl":[]},"ai":{"uwu":[],"nom":[]},"se":{"com":[],"blogspot":[],"conf":[]},"bz":{"za":[],"nym":[]},"group":{"discourse":[]},"dev":{"lcl":{"*":[]},"stg":{"*":[]},"workers":[],"iserv":[],"loginline":[],"webhare":{"*":[]}},"me":{"c66":[],"daplie":{"localhost":[]},"edgestack":[],"filegear":[],"filegear-au":[],"filegear-de":[],"filegear-gb":[],"filegear-ie":[],"filegear-jp":[],"filegear-sg":[],"glitch":[],"ravendb":[],"barsy":[],"nctu":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"zone":{"cloud66":[],"hs":[],"triton":{"*":[]},"lima":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"site":{"cloudera":[],"cyon":[],"lelux":[],"loginline":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"app":{"wnext":[],"run":{"a":[]},"web":[],"hasura":[],"loginline":[],"telebit":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"bpl":[],"orx":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[],"pony":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[],"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[],"dweb":{"*":[]}},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"earth":{"dapps":{"*":[],"bzz":{"*":[]}}},"th":{"online":[],"shop":[]},"fi":{"dy":[],"blogspot":[],"xn--hkkinen-5wa":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[],"builder":{"site":[]},"enterprisecloud":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[],"telebit":{"*":[]}},"fr":{"en-root":[],"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"one":{"onred":{"staging":[]},"for":[],"homelink":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"perspecta":[],"vapor":[],"on-rancher":{"*":[]},"sensiosite":{"*":[]},"trafficplex":[],"voorloper":[]},"ms":{"lab":[]},"digital":{"cloudapps":{"london":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]},"col":[],"firm":[],"gen":[],"ltd":[],"ngo":[]},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"nym":[],"ltd":[],"inc":[]},"hr":{"blogspot":[],"free":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[],"syncloud":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"caa":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"ua":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"ci":{"fin":[]},"run":{"hs":[],"development":[],"ravendb":[],"repl":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"community":{"ravendb":[]},"city":{"ng":[]},"gl":{"biz":[],"nom":[]},"ink":{"ng":[]},"school":{"ng":[]},"so":{"sch":[]},"gg":{"kaas":[],"cya":[]},"systems":{"knightpoint":[]},"to":{"oya":[],"vpnplus":[],"quickconnect":{"direct":[]}},"krd":{"co":[],"edu":[]},"business":{"co":[]},"education":{"co":[]},"events":{"co":[]},"financial":{"co":[]},"place":{"co":[]},"technology":{"co":[]},"space":{"linkitools":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"services":{"loginline":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"casa":{"nabu":{"ui":[]}},"fashion":{"of":[],"on":[]},"football":{"of":[]},"london":{"in":[],"of":[]},"men":{"for":[]},"mom":{"and":[],"for":[]},"sale":{"for":[]},"work":{"of":[],"to":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ec":{"nym":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vg":{"nom":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"bn":{"co":[]},"page":{"prvcy":[]},"fit":{"ptplus":[]},"edu":{"rit":{"git-pages":[]}},"scot":{"gov":[]},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]},"design":{"bss":[]}}}"; \ No newline at end of file diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index 65531591..24ae7411 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -138,6 +138,10 @@ private function transformToAscii(string $domain, int $option): array } $output = idn_to_ascii($domain, $option, INTL_IDNA_VARIANT_UTS46, $infos); + if ([] === $infos) { + throw new InvalidDomain(sprintf('The host `%s` is invalid', $domain)); + } + if (0 !== $infos['errors']) { throw new InvalidDomain(sprintf('The host `%s` is invalid : %s', $domain, self::getIdnErrors($infos['errors']))); } @@ -170,9 +174,13 @@ private function transformToAscii(string $domain, int $option): array */ private function idnToUnicode(string $domain, int $option = IDNA_DEFAULT): string { - $output = idn_to_utf8($domain, $option, INTL_IDNA_VARIANT_UTS46, $arr); - if (0 !== $arr['errors']) { - throw new InvalidDomain(sprintf('The host `%s` is invalid : %s', $domain, self::getIdnErrors($arr['errors']))); + $output = idn_to_utf8($domain, $option, INTL_IDNA_VARIANT_UTS46, $info); + if ([] === $info) { + throw new InvalidDomain(sprintf('The host `%s` is invalid', $domain)); + } + + if (0 !== $info['errors']) { + throw new InvalidDomain(sprintf('The host `%s` is invalid : %s', $domain, self::getIdnErrors($info['errors']))); } // @codeCoverageIgnoreStart From 2cbf3d456c91f4728d3120b4e436e3e8e01b58b4 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 3 Mar 2020 16:08:01 +0100 Subject: [PATCH 179/461] Update local cache file --- data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache index a7439a1d..f6bbe73e 100644 --- a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache +++ b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache @@ -1 +1 @@ -s:110860:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":{"co":[],"com":[],"commune":[],"net":[],"org":[]},"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"catholic":[],"nsw":{"schools":[]},"nt":[],"qld":[],"sa":[],"tas":{"education":[]},"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"ong":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"tc":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"*":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"asso":[],"com":[],"gouv":[],"nom":[],"prd":[],"tm":[],"aeroport":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"ponpes":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"ac":[],"biz":[],"co":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"sc":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":[],"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":[],"rw":{"ac":[],"co":[],"coop":[],"gov":[],"mil":[],"net":[],"org":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"edu":[],"gov":[],"me":[],"net":[],"org":[]},"sr":[],"ss":{"biz":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"av":[],"bbs":[],"bel":[],"biz":[],"com":[],"dr":[],"edu":[],"gen":[],"gov":[],"info":[],"mil":[],"k12":[],"kep":[],"name":[],"net":[],"org":[],"pol":[],"tel":[],"tsk":[],"tv":[],"web":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--mgbah1a3hjkrd":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nic":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"amazon":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"cpa":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dog":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gay":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"llp":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"spa":[],"space":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"stada":[],"staples":[],"star":[],"statebank":[],"statefarm":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cckwcxetd":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq480n2rg":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[],"v":[]},"com":{"adobeaemcloud":{"dev":{"*":[]}},"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"balena-devices":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"trycloudflare":[],"customer-oci":{"*":[],"oci":{"*":[]},"ocp":{"*":[]},"ocs":{"*":[]}},"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"builtwithdark":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastly-terrarium":[],"fastvps-server":[],"mydobiss":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"gentapps":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":{"r":{"*":[]}},"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"awsmppl":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lpusercontent":[],"lmpm":{"app":[]},"linode":{"members":[],"nodebalancer":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"observableusercontent":{"static":[]},"operaunite":[],"skygearapp":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qualifioapp":[],"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"render":{"app":[]},"onrender":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"shopitsite":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"stackhero-network":[],"stdlib":{"api":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"thingdustdata":[],"bloxcms":[],"townnews-staging":[],"hk":[],"wafflecell":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"net":{"adobeaemcloud":[],"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":[],"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"in-dsl":[],"in-vpn":[],"ipifony":[],"iobb":[],"kinghost":[],"uni5":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"siteleaf":[],"srcf":{"soc":[],"user":[]},"dsmynas":[],"familyds":[],"yandexcloud":{"storage":[],"website":[]},"za":[]},"pl":{"beep":[],"krasnik":[],"leczna":[],"lubartow":[],"lublin":[],"poniatowa":[],"swidnik":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"ca":{"barsy":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]},"co":[],"arvo":[],"azimuth":[]},"org":{"altervista":[],"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"in-dsl":[],"in-vpn":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"pubtls":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"edugit":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[],"cn-northwest-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}},"instantcloud":[]},"nl":{"amsw":[],"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"khplay":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"io":{"apigee":[],"b-data":[],"backplaneapp":[],"banzaicloud":{"app":[]},"boxfuse":[],"browsersafetymark":[],"bigv":{"uk0":[]},"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"lolipop":[],"hasura-app":[],"moonscale":{"*":[]},"loginline":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"dyn53":[],"protonet":[],"qcx":{"sys":{"*":[]}},"vaporcloud":[],"on-k3s":{"*":[]},"on-rio":{"*":[]},"readthedocs":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"shiftedit":[],"mo-siemens":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"applicationcloud":[],"scapp":[],"s5y":{"*":[]},"telebit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[],"basicserver":[],"virtualserver":[]},"jp":{"ne":{"aseinet":{"user":[]},"gehirn":[]},"usercontent":[],"blogspot":[]},"vc":{"gv":{"d":[]},"0e":[],"nom":[]},"eus":{"party":{"user":[]}},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"dyn-berlin":[],"in-berlin":[],"in-brb":[],"in-butter":[],"in-dsl":[],"in-vpn":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[]},"uk":{"co":{"bytemark":{"dh":[],"vm":[]},"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"gov":{"service":[],"homeoffice":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"co":{"carrd":[],"crd":[],"otap":{"*":[]},"com":{"blogspot":[]},"leadpages":[],"lpages":[],"mypi":[],"n4t":[],"nodum":[],"repl":[]},"ai":{"uwu":[],"nom":[]},"se":{"com":[],"blogspot":[],"conf":[]},"bz":{"za":[],"nym":[]},"group":{"discourse":[]},"dev":{"lcl":{"*":[]},"stg":{"*":[]},"workers":[],"iserv":[],"loginline":[],"webhare":{"*":[]}},"me":{"c66":[],"daplie":{"localhost":[]},"edgestack":[],"filegear":[],"filegear-au":[],"filegear-de":[],"filegear-gb":[],"filegear-ie":[],"filegear-jp":[],"filegear-sg":[],"glitch":[],"ravendb":[],"barsy":[],"nctu":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"zone":{"cloud66":[],"hs":[],"triton":{"*":[]},"lima":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"site":{"cloudera":[],"cyon":[],"lelux":[],"loginline":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"app":{"wnext":[],"run":{"a":[]},"web":[],"hasura":[],"loginline":[],"telebit":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"bpl":[],"orx":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[],"pony":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[],"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[],"dweb":{"*":[]}},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"earth":{"dapps":{"*":[],"bzz":{"*":[]}}},"th":{"online":[],"shop":[]},"fi":{"dy":[],"blogspot":[],"xn--hkkinen-5wa":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[],"builder":{"site":[]},"enterprisecloud":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[],"telebit":{"*":[]}},"fr":{"en-root":[],"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"one":{"onred":{"staging":[]},"for":[],"homelink":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"perspecta":[],"vapor":[],"on-rancher":{"*":[]},"sensiosite":{"*":[]},"trafficplex":[],"voorloper":[]},"ms":{"lab":[]},"digital":{"cloudapps":{"london":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]},"col":[],"firm":[],"gen":[],"ltd":[],"ngo":[]},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"nym":[],"ltd":[],"inc":[]},"hr":{"blogspot":[],"free":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[],"syncloud":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"caa":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"ua":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"ci":{"fin":[]},"run":{"hs":[],"development":[],"ravendb":[],"repl":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"community":{"ravendb":[]},"city":{"ng":[]},"gl":{"biz":[],"nom":[]},"ink":{"ng":[]},"school":{"ng":[]},"so":{"sch":[]},"gg":{"kaas":[],"cya":[]},"systems":{"knightpoint":[]},"to":{"oya":[],"vpnplus":[],"quickconnect":{"direct":[]}},"krd":{"co":[],"edu":[]},"business":{"co":[]},"education":{"co":[]},"events":{"co":[]},"financial":{"co":[]},"place":{"co":[]},"technology":{"co":[]},"space":{"linkitools":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"services":{"loginline":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"casa":{"nabu":{"ui":[]}},"fashion":{"of":[],"on":[]},"football":{"of":[]},"london":{"in":[],"of":[]},"men":{"for":[]},"mom":{"and":[],"for":[]},"sale":{"for":[]},"work":{"of":[],"to":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ec":{"nym":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vg":{"nom":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"bn":{"co":[]},"page":{"prvcy":[]},"fit":{"ptplus":[]},"edu":{"rit":{"git-pages":[]}},"scot":{"gov":[]},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]},"design":{"bss":[]}}}"; \ No newline at end of file +s:111111:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"freight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":{"co":[],"com":[],"commune":[],"net":[],"org":[]},"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"catholic":[],"nsw":{"schools":[]},"nt":[],"qld":[],"sa":[],"tas":{"education":[]},"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"ong":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"tc":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"gov":[],"gob":[],"co":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"ac":[],"biz":[],"com":[],"gov":[],"info":[],"mil":[],"name":[],"net":[],"org":[],"pro":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"asso":[],"com":[],"gouv":[],"nom":[],"prd":[],"tm":[],"aeroport":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"ponpes":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"ac":[],"biz":[],"co":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"sc":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":[],"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":[],"rw":{"ac":[],"co":[],"coop":[],"gov":[],"mil":[],"net":[],"org":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"edu":[],"gov":[],"me":[],"net":[],"org":[]},"sr":[],"ss":{"biz":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"av":[],"bbs":[],"bel":[],"biz":[],"com":[],"dr":[],"edu":[],"gen":[],"gov":[],"info":[],"mil":[],"k12":[],"kep":[],"name":[],"net":[],"org":[],"pol":[],"tel":[],"tsk":[],"tv":[],"web":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--qxa6a":[],"xn--mgbah1a3hjkrd":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nic":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"amazon":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"cpa":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dog":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gay":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"llp":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"spa":[],"space":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"stada":[],"staples":[],"star":[],"statebank":[],"statefarm":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"vistaprint":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cckwcxetd":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq480n2rg":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[],"v":[]},"com":{"adobeaemcloud":{"dev":{"*":[]}},"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"balena-devices":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"trycloudflare":[],"customer-oci":{"*":[],"oci":{"*":[]},"ocp":{"*":[]},"ocs":{"*":[]}},"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"builtwithdark":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastly-terrarium":[],"fastvps-server":[],"mydobiss":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"gentapps":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":{"r":{"*":[]}},"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"awsmppl":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lpusercontent":[],"lmpm":{"app":[]},"linode":{"members":[],"nodebalancer":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"observableusercontent":{"static":[]},"operaunite":[],"skygearapp":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qualifioapp":[],"qbuser":[],"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"render":{"app":[]},"onrender":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"shopitsite":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"stackhero-network":[],"stdlib":{"api":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"thingdustdata":[],"bloxcms":[],"townnews-staging":[],"hk":[],"wafflecell":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"net":{"adobeaemcloud":[],"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":{"u":[]},"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"in-dsl":[],"in-vpn":[],"ipifony":[],"iobb":[],"kinghost":[],"uni5":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"senseering":[],"siteleaf":[],"srcf":{"soc":[],"user":[]},"dsmynas":[],"familyds":[],"community-pro":[],"meinforum":[],"yandexcloud":{"storage":[],"website":[]},"za":[]},"pl":{"beep":[],"krasnik":[],"leczna":[],"lubartow":[],"lublin":[],"poniatowa":[],"swidnik":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"ca":{"barsy":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]},"co":[],"arvo":[],"azimuth":[]},"org":{"altervista":[],"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"in-dsl":[],"in-vpn":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"pubtls":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"edugit":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[],"cn-northwest-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}},"instantcloud":[]},"nl":{"amsw":[],"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"khplay":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"io":{"apigee":[],"b-data":[],"backplaneapp":[],"banzaicloud":{"app":[]},"boxfuse":[],"browsersafetymark":[],"bigv":{"uk0":[]},"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"lolipop":[],"hasura-app":[],"moonscale":{"*":[]},"loginline":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"dyn53":[],"protonet":[],"qcx":{"sys":{"*":[]}},"vaporcloud":[],"on-k3s":{"*":[]},"on-rio":{"*":[]},"readthedocs":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"shiftedit":[],"mo-siemens":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"applicationcloud":[],"scapp":[],"s5y":{"*":[]},"telebit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[],"basicserver":[],"virtualserver":[]},"jp":{"ne":{"aseinet":{"user":[]},"gehirn":[]},"usercontent":[],"blogspot":[]},"vc":{"gv":{"d":[]},"0e":[],"nom":[]},"eus":{"party":{"user":[]}},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"dyn-berlin":[],"in-berlin":[],"in-brb":[],"in-butter":[],"in-dsl":[],"in-vpn":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[],"community-pro":[],"diskussionsbereich":[]},"uk":{"co":{"bytemark":{"dh":[],"vm":[]},"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"gov":{"service":[],"homeoffice":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"co":{"carrd":[],"crd":[],"otap":{"*":[]},"com":{"blogspot":[]},"leadpages":[],"lpages":[],"mypi":[],"n4t":[],"nodum":[],"repl":[]},"ai":{"uwu":[],"nom":[]},"se":{"com":[],"blogspot":[],"conf":[]},"bz":{"za":[],"nym":[]},"group":{"discourse":[]},"team":{"discourse":[]},"dev":{"lcl":{"*":[]},"stg":{"*":[]},"workers":[],"iserv":[],"loginline":[],"webhare":{"*":[]}},"me":{"c66":[],"daplie":{"localhost":[]},"edgestack":[],"filegear":[],"filegear-au":[],"filegear-de":[],"filegear-gb":[],"filegear-ie":[],"filegear-jp":[],"filegear-sg":[],"glitch":[],"ravendb":[],"barsy":[],"nctu":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"zone":{"cloud66":[],"hs":[],"triton":{"*":[]},"lima":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"site":{"cloudera":[],"cyon":[],"lelux":[],"loginline":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"app":{"wnext":[],"run":{"a":[]},"web":[],"hasura":[],"loginline":[],"telebit":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"bpl":[],"orx":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[],"pony":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"dnsupdate":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[],"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[],"dweb":{"*":[]}},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"earth":{"dapps":{"*":[],"bzz":{"*":[]}}},"th":{"online":[],"shop":[]},"fi":{"dy":[],"blogspot":[],"xn--hkkinen-5wa":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[],"enterprisecloud":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[],"telebit":{"*":[]}},"fr":{"en-root":[],"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"one":{"onred":{"staging":[]},"for":[],"homelink":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"perspecta":[],"vapor":[],"on-rancher":{"*":[]},"sensiosite":{"*":[]},"trafficplex":[],"urown":[],"voorloper":[]},"ms":{"lab":[]},"digital":{"cloudapps":{"london":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]},"col":[],"firm":[],"gen":[],"ltd":[],"ngo":[]},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"nym":[],"ltd":[],"inc":[]},"hr":{"blogspot":[],"free":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[],"syncloud":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"caa":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"ua":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"ci":{"fin":[]},"run":{"hs":[],"development":[],"ravendb":[],"repl":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"community":{"ravendb":[],"myforum":[]},"city":{"ng":[]},"gl":{"biz":[],"nom":[]},"ink":{"ng":[]},"school":{"ng":[]},"so":{"sch":[]},"gg":{"kaas":[],"cya":[]},"systems":{"knightpoint":[]},"to":{"oya":[],"vpnplus":[],"quickconnect":{"direct":[]}},"krd":{"co":[],"edu":[]},"business":{"co":[]},"education":{"co":[]},"events":{"co":[]},"financial":{"co":[]},"place":{"co":[]},"technology":{"co":[]},"space":{"linkitools":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"services":{"loginline":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"casa":{"nabu":{"ui":[]}},"fashion":{"of":[],"on":[]},"football":{"of":[]},"london":{"in":[],"of":[]},"men":{"for":[]},"mom":{"and":[],"for":[]},"sale":{"for":[]},"work":{"of":[],"to":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ec":{"nym":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vg":{"nom":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"bn":{"co":[]},"page":{"prvcy":[]},"fit":{"ptplus":[]},"edu":{"rit":{"git-pages":[]}},"scot":{"gov":[]},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]},"design":{"bss":[]}}}"; \ No newline at end of file diff --git a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache index 6dfa0fda..823461b9 100644 --- a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache +++ b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache @@ -1 +1 @@ -s:13238:"{"version":"2019122800","modifiedDate":"2019-12-28T07:07:01+00:00","records":["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac","academy","accenture","accountant","accountants","aco","actor","ad","adac","ads","adult","ae","aeg","aero","aetna","af","afamilycompany","afl","africa","ag","agakhan","agency","ai","aig","aigo","airbus","airforce","airtel","akdn","al","alfaromeo","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","am","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","ao","aol","apartments","app","apple","aq","aquarelle","ar","arab","aramco","archi","army","arpa","art","arte","as","asda","asia","associates","at","athleta","attorney","au","auction","audi","audible","audio","auspost","author","auto","autos","avianca","aw","aws","ax","axa","az","azure","ba","baby","baidu","banamex","bananarepublic","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bb","bbc","bbt","bbva","bcg","bcn","bd","be","beats","beauty","beer","bentley","berlin","best","bestbuy","bet","bf","bg","bh","bharti","bi","bible","bid","bike","bing","bingo","bio","biz","bj","black","blackfriday","blockbuster","blog","bloomberg","blue","bm","bms","bmw","bn","bnpparibas","bo","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","br","bradesco","bridgestone","broadway","broker","brother","brussels","bs","bt","budapest","bugatti","build","builders","business","buy","buzz","bv","bw","by","bz","bzh","ca","cab","cafe","cal","call","calvinklein","cam","camera","camp","cancerresearch","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","casa","case","caseih","cash","casino","cat","catering","catholic","cba","cbn","cbre","cbs","cc","cd","ceb","center","ceo","cern","cf","cfa","cfd","cg","ch","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","church","ci","cipriani","circle","cisco","citadel","citi","citic","city","cityeats","ck","cl","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","cm","cn","co","coach","codes","coffee","college","cologne","com","comcast","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cookingchannel","cool","coop","corsica","country","coupon","coupons","courses","cpa","cr","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","csc","cu","cuisinella","cv","cw","cx","cy","cymru","cyou","cz","dabur","dad","dance","data","date","dating","datsun","day","dclk","dds","de","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dj","dk","dm","dnp","do","docs","doctor","dog","domains","dot","download","drive","dtv","dubai","duck","dunlop","dupont","durban","dvag","dvr","dz","earth","eat","ec","eco","edeka","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","epson","equipment","er","ericsson","erni","es","esq","estate","esurance","et","etisalat","eu","eurovision","eus","events","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fi","fiat","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","fj","fk","flickr","flights","flir","florist","flowers","fly","fm","fo","foo","food","foodnetwork","football","ford","forex","forsale","forum","foundation","fox","fr","free","fresenius","frl","frogans","frontdoor","frontier","ftr","fujitsu","fujixerox","fun","fund","furniture","futbol","fyi","ga","gal","gallery","gallo","gallup","game","games","gap","garden","gay","gb","gbiz","gd","gdn","ge","gea","gent","genting","george","gf","gg","ggee","gh","gi","gift","gifts","gives","giving","gl","glade","glass","gle","global","globo","gm","gmail","gmbh","gmo","gmx","gn","godaddy","gold","goldpoint","golf","goo","goodyear","goog","google","gop","got","gov","gp","gq","gr","grainger","graphics","gratis","green","gripe","grocery","group","gs","gt","gu","guardian","gucci","guge","guide","guitars","guru","gw","gy","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hgtv","hiphop","hisamitsu","hitachi","hiv","hk","hkt","hm","hn","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","horse","hospital","host","hosting","hot","hoteles","hotels","hotmail","house","how","hr","hsbc","ht","hu","hughes","hyatt","hyundai","ibm","icbc","ice","icu","id","ie","ieee","ifm","ikano","il","im","imamat","imdb","immo","immobilien","in","inc","industries","infiniti","info","ing","ink","institute","insurance","insure","int","intel","international","intuit","investments","io","ipiranga","iq","ir","irish","is","ismaili","ist","istanbul","it","itau","itv","iveco","jaguar","java","jcb","jcp","je","jeep","jetzt","jewelry","jio","jll","jm","jmp","jnj","jo","jobs","joburg","jot","joy","jp","jpmorgan","jprs","juegos","juniper","kaufen","kddi","ke","kerryhotels","kerrylogistics","kerryproperties","kfh","kg","kh","ki","kia","kim","kinder","kindle","kitchen","kiwi","km","kn","koeln","komatsu","kosher","kp","kpmg","kpn","kr","krd","kred","kuokgroup","kw","ky","kyoto","kz","la","lacaixa","lamborghini","lamer","lancaster","lancia","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lb","lc","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","li","liaison","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","linde","link","lipsy","live","living","lixil","lk","llc","llp","loan","loans","locker","locus","loft","lol","london","lotte","lotto","love","lpl","lplfinancial","lr","ls","lt","ltd","ltda","lu","lundbeck","lupin","luxe","luxury","lv","ly","ma","macys","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","maserati","mattel","mba","mc","mckinsey","md","me","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","metlife","mg","mh","miami","microsoft","mil","mini","mint","mit","mitsubishi","mk","ml","mlb","mls","mm","mma","mn","mo","mobi","mobile","moda","moe","moi","mom","monash","money","monster","mormon","mortgage","moscow","moto","motorcycles","mov","movie","mp","mq","mr","ms","msd","mt","mtn","mtr","mu","museum","mutual","mv","mw","mx","my","mz","na","nab","nadex","nagoya","name","nationwide","natura","navy","nba","nc","ne","nec","net","netbank","netflix","network","neustar","new","newholland","news","next","nextdirect","nexus","nf","nfl","ng","ngo","nhk","ni","nico","nike","nikon","ninja","nissan","nissay","nl","no","nokia","northwesternmutual","norton","now","nowruz","nowtv","np","nr","nra","nrw","ntt","nu","nyc","nz","obi","observer","off","office","okinawa","olayan","olayangroup","oldnavy","ollo","om","omega","one","ong","onl","online","onyourside","ooo","open","oracle","orange","org","organic","origins","osaka","otsuka","ott","ovh","pa","page","panasonic","paris","pars","partners","parts","party","passagens","pay","pccw","pe","pet","pf","pfizer","pg","ph","pharmacy","phd","philips","phone","photo","photography","photos","physio","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","pk","pl","place","play","playstation","plumbing","plus","pm","pn","pnc","pohl","poker","politie","porn","post","pr","pramerica","praxi","press","prime","pro","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","ps","pt","pub","pw","pwc","py","qa","qpon","quebec","quest","qvc","racing","radio","raid","re","read","realestate","realtor","realty","recipes","red","redstone","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","rightathome","ril","rio","rip","rmit","ro","rocher","rocks","rodeo","rogers","room","rs","rsvp","ru","rugby","ruhr","run","rw","rwe","ryukyu","sa","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sb","sbi","sbs","sc","sca","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scjohnson","scor","scot","sd","se","search","seat","secure","security","seek","select","sener","services","ses","seven","sew","sex","sexy","sfr","sg","sh","shangrila","sharp","shaw","shell","shia","shiksha","shoes","shop","shopping","shouji","show","showtime","shriram","si","silk","sina","singles","site","sj","sk","ski","skin","sky","skype","sl","sling","sm","smart","smile","sn","sncf","so","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","space","sport","spot","spreadbetting","sr","srl","ss","st","stada","staples","star","statebank","statefarm","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","su","sucks","supplies","supply","support","surf","surgery","suzuki","sv","swatch","swiftcover","swiss","sx","sy","sydney","symantec","systems","sz","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tc","tci","td","tdk","team","tech","technology","tel","temasek","tennis","teva","tf","tg","th","thd","theater","theatre","tiaa","tickets","tienda","tiffany","tips","tires","tirol","tj","tjmaxx","tjx","tk","tkmaxx","tl","tm","tmall","tn","to","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","tr","trade","trading","training","travel","travelchannel","travelers","travelersinsurance","trust","trv","tt","tube","tui","tunes","tushu","tv","tvs","tw","tz","ua","ubank","ubs","ug","uk","unicom","university","uno","uol","ups","us","uy","uz","va","vacations","vana","vanguard","vc","ve","vegas","ventures","verisign","versicherung","vet","vg","vi","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","vistaprint","viva","vivo","vlaanderen","vn","vodka","volkswagen","volvo","vote","voting","voto","voyage","vu","vuelos","wales","walmart","walter","wang","wanggou","watch","watches","weather","weatherchannel","webcam","weber","website","wed","wedding","weibo","weir","wf","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","ws","wtc","wtf","xbox","xerox","xfinity","xihuan","xin","xn--11b4c3d","xn--1ck2e1b","xn--1qqw23a","xn--2scrj9c","xn--30rr7y","xn--3bst00m","xn--3ds443g","xn--3e0b707e","xn--3hcrj9c","xn--3oq18vl8pn36a","xn--3pxu8k","xn--42c2d9a","xn--45br5cyl","xn--45brj9c","xn--45q11c","xn--4gbrim","xn--54b7fta0cc","xn--55qw42g","xn--55qx5d","xn--5su34j936bgsg","xn--5tzm5g","xn--6frz82g","xn--6qq986b3xl","xn--80adxhks","xn--80ao21a","xn--80aqecdr1a","xn--80asehdb","xn--80aswg","xn--8y0a063a","xn--90a3ac","xn--90ae","xn--90ais","xn--9dbq2a","xn--9et52u","xn--9krt00a","xn--b4w605ferd","xn--bck1b9a5dre4c","xn--c1avg","xn--c2br7g","xn--cck2b3b","xn--cg4bki","xn--clchc0ea0b2g2a9gcd","xn--czr694b","xn--czrs0t","xn--czru2d","xn--d1acj3b","xn--d1alf","xn--e1a4c","xn--eckvdtc9d","xn--efvy88h","xn--estv75g","xn--fct429k","xn--fhbei","xn--fiq228c5hs","xn--fiq64b","xn--fiqs8s","xn--fiqz9s","xn--fjq720a","xn--flw351e","xn--fpcrj9c3d","xn--fzc2c9e2c","xn--fzys8d69uvgm","xn--g2xx48c","xn--gckr3f0f","xn--gecrj9c","xn--gk3at1e","xn--h2breg3eve","xn--h2brj9c","xn--h2brj9c8c","xn--hxt814e","xn--i1b6b1a6a2e","xn--imr513n","xn--io0a7i","xn--j1aef","xn--j1amh","xn--j6w193g","xn--jlq61u9w7b","xn--jvr189m","xn--kcrx77d1x4a","xn--kprw13d","xn--kpry57d","xn--kpu716f","xn--kput3i","xn--l1acc","xn--lgbbat1ad8j","xn--mgb9awbf","xn--mgba3a3ejt","xn--mgba3a4f16a","xn--mgba7c0bbn0a","xn--mgbaakc7dvf","xn--mgbaam7a8h","xn--mgbab2bd","xn--mgbah1a3hjkrd","xn--mgbai9azgqp6j","xn--mgbayh7gpa","xn--mgbbh1a","xn--mgbbh1a71e","xn--mgbc0a9azcg","xn--mgbca7dzdo","xn--mgberp4a5d4ar","xn--mgbgu82a","xn--mgbi4ecexp","xn--mgbpl2fh","xn--mgbt3dhd","xn--mgbtx2b","xn--mgbx4cd0ab","xn--mix891f","xn--mk1bu44c","xn--mxtq1m","xn--ngbc5azd","xn--ngbe9e0a","xn--ngbrx","xn--node","xn--nqv7f","xn--nqv7fs00ema","xn--nyqy26a","xn--o3cw4h","xn--ogbpf8fl","xn--otu796d","xn--p1acf","xn--p1ai","xn--pbt977c","xn--pgbs0dh","xn--pssy2u","xn--q9jyb4c","xn--qcka1pmc","xn--qxa6a","xn--qxam","xn--rhqv96g","xn--rovu88b","xn--rvc1e0am3e","xn--s9brj9c","xn--ses554g","xn--t60b56a","xn--tckwe","xn--tiq49xqyj","xn--unup4y","xn--vermgensberater-ctb","xn--vermgensberatung-pwb","xn--vhquv","xn--vuq861b","xn--w4r85el8fhu5dnra","xn--w4rs40l","xn--wgbh1c","xn--wgbl6a","xn--xhq521b","xn--xkc2al3hye2a","xn--xkc2dl3a5ee0h","xn--y9a3aq","xn--yfro4i67o","xn--ygbi2ammx","xn--zfr164b","xxx","xyz","yachts","yahoo","yamaxun","yandex","ye","yodobashi","yoga","yokohama","you","youtube","yt","yun","za","zappos","zara","zero","zip","zm","zone","zuerich","zw"]}"; \ No newline at end of file +s:13260:"{"version":"2020030200","modifiedDate":"2020-03-02T07:07:01+00:00","records":["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac","academy","accenture","accountant","accountants","aco","actor","ad","adac","ads","adult","ae","aeg","aero","aetna","af","afamilycompany","afl","africa","ag","agakhan","agency","ai","aig","aigo","airbus","airforce","airtel","akdn","al","alfaromeo","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","am","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","ao","aol","apartments","app","apple","aq","aquarelle","ar","arab","aramco","archi","army","arpa","art","arte","as","asda","asia","associates","at","athleta","attorney","au","auction","audi","audible","audio","auspost","author","auto","autos","avianca","aw","aws","ax","axa","az","azure","ba","baby","baidu","banamex","bananarepublic","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bb","bbc","bbt","bbva","bcg","bcn","bd","be","beats","beauty","beer","bentley","berlin","best","bestbuy","bet","bf","bg","bh","bharti","bi","bible","bid","bike","bing","bingo","bio","biz","bj","black","blackfriday","blockbuster","blog","bloomberg","blue","bm","bms","bmw","bn","bnpparibas","bo","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","br","bradesco","bridgestone","broadway","broker","brother","brussels","bs","bt","budapest","bugatti","build","builders","business","buy","buzz","bv","bw","by","bz","bzh","ca","cab","cafe","cal","call","calvinklein","cam","camera","camp","cancerresearch","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","casa","case","caseih","cash","casino","cat","catering","catholic","cba","cbn","cbre","cbs","cc","cd","ceb","center","ceo","cern","cf","cfa","cfd","cg","ch","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","church","ci","cipriani","circle","cisco","citadel","citi","citic","city","cityeats","ck","cl","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","cm","cn","co","coach","codes","coffee","college","cologne","com","comcast","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cookingchannel","cool","coop","corsica","country","coupon","coupons","courses","cpa","cr","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","csc","cu","cuisinella","cv","cw","cx","cy","cymru","cyou","cz","dabur","dad","dance","data","date","dating","datsun","day","dclk","dds","de","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dj","dk","dm","dnp","do","docs","doctor","dog","domains","dot","download","drive","dtv","dubai","duck","dunlop","dupont","durban","dvag","dvr","dz","earth","eat","ec","eco","edeka","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","epson","equipment","er","ericsson","erni","es","esq","estate","esurance","et","etisalat","eu","eurovision","eus","events","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fi","fiat","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","fj","fk","flickr","flights","flir","florist","flowers","fly","fm","fo","foo","food","foodnetwork","football","ford","forex","forsale","forum","foundation","fox","fr","free","fresenius","frl","frogans","frontdoor","frontier","ftr","fujitsu","fujixerox","fun","fund","furniture","futbol","fyi","ga","gal","gallery","gallo","gallup","game","games","gap","garden","gay","gb","gbiz","gd","gdn","ge","gea","gent","genting","george","gf","gg","ggee","gh","gi","gift","gifts","gives","giving","gl","glade","glass","gle","global","globo","gm","gmail","gmbh","gmo","gmx","gn","godaddy","gold","goldpoint","golf","goo","goodyear","goog","google","gop","got","gov","gp","gq","gr","grainger","graphics","gratis","green","gripe","grocery","group","gs","gt","gu","guardian","gucci","guge","guide","guitars","guru","gw","gy","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hgtv","hiphop","hisamitsu","hitachi","hiv","hk","hkt","hm","hn","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","horse","hospital","host","hosting","hot","hoteles","hotels","hotmail","house","how","hr","hsbc","ht","hu","hughes","hyatt","hyundai","ibm","icbc","ice","icu","id","ie","ieee","ifm","ikano","il","im","imamat","imdb","immo","immobilien","in","inc","industries","infiniti","info","ing","ink","institute","insurance","insure","int","intel","international","intuit","investments","io","ipiranga","iq","ir","irish","is","ismaili","ist","istanbul","it","itau","itv","iveco","jaguar","java","jcb","jcp","je","jeep","jetzt","jewelry","jio","jll","jm","jmp","jnj","jo","jobs","joburg","jot","joy","jp","jpmorgan","jprs","juegos","juniper","kaufen","kddi","ke","kerryhotels","kerrylogistics","kerryproperties","kfh","kg","kh","ki","kia","kim","kinder","kindle","kitchen","kiwi","km","kn","koeln","komatsu","kosher","kp","kpmg","kpn","kr","krd","kred","kuokgroup","kw","ky","kyoto","kz","la","lacaixa","lamborghini","lamer","lancaster","lancia","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lb","lc","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","li","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","linde","link","lipsy","live","living","lixil","lk","llc","llp","loan","loans","locker","locus","loft","lol","london","lotte","lotto","love","lpl","lplfinancial","lr","ls","lt","ltd","ltda","lu","lundbeck","lupin","luxe","luxury","lv","ly","ma","macys","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","maserati","mattel","mba","mc","mckinsey","md","me","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","metlife","mg","mh","miami","microsoft","mil","mini","mint","mit","mitsubishi","mk","ml","mlb","mls","mm","mma","mn","mo","mobi","mobile","moda","moe","moi","mom","monash","money","monster","mormon","mortgage","moscow","moto","motorcycles","mov","movie","mp","mq","mr","ms","msd","mt","mtn","mtr","mu","museum","mutual","mv","mw","mx","my","mz","na","nab","nadex","nagoya","name","nationwide","natura","navy","nba","nc","ne","nec","net","netbank","netflix","network","neustar","new","newholland","news","next","nextdirect","nexus","nf","nfl","ng","ngo","nhk","ni","nico","nike","nikon","ninja","nissan","nissay","nl","no","nokia","northwesternmutual","norton","now","nowruz","nowtv","np","nr","nra","nrw","ntt","nu","nyc","nz","obi","observer","off","office","okinawa","olayan","olayangroup","oldnavy","ollo","om","omega","one","ong","onl","online","onyourside","ooo","open","oracle","orange","org","organic","origins","osaka","otsuka","ott","ovh","pa","page","panasonic","paris","pars","partners","parts","party","passagens","pay","pccw","pe","pet","pf","pfizer","pg","ph","pharmacy","phd","philips","phone","photo","photography","photos","physio","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","pk","pl","place","play","playstation","plumbing","plus","pm","pn","pnc","pohl","poker","politie","porn","post","pr","pramerica","praxi","press","prime","pro","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","ps","pt","pub","pw","pwc","py","qa","qpon","quebec","quest","qvc","racing","radio","raid","re","read","realestate","realtor","realty","recipes","red","redstone","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","rightathome","ril","rio","rip","rmit","ro","rocher","rocks","rodeo","rogers","room","rs","rsvp","ru","rugby","ruhr","run","rw","rwe","ryukyu","sa","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sb","sbi","sbs","sc","sca","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scjohnson","scor","scot","sd","se","search","seat","secure","security","seek","select","sener","services","ses","seven","sew","sex","sexy","sfr","sg","sh","shangrila","sharp","shaw","shell","shia","shiksha","shoes","shop","shopping","shouji","show","showtime","shriram","si","silk","sina","singles","site","sj","sk","ski","skin","sky","skype","sl","sling","sm","smart","smile","sn","sncf","so","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","space","sport","spot","spreadbetting","sr","srl","ss","st","stada","staples","star","statebank","statefarm","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","su","sucks","supplies","supply","support","surf","surgery","suzuki","sv","swatch","swiftcover","swiss","sx","sy","sydney","symantec","systems","sz","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tc","tci","td","tdk","team","tech","technology","tel","temasek","tennis","teva","tf","tg","th","thd","theater","theatre","tiaa","tickets","tienda","tiffany","tips","tires","tirol","tj","tjmaxx","tjx","tk","tkmaxx","tl","tm","tmall","tn","to","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","tr","trade","trading","training","travel","travelchannel","travelers","travelersinsurance","trust","trv","tt","tube","tui","tunes","tushu","tv","tvs","tw","tz","ua","ubank","ubs","ug","uk","unicom","university","uno","uol","ups","us","uy","uz","va","vacations","vana","vanguard","vc","ve","vegas","ventures","verisign","versicherung","vet","vg","vi","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","vistaprint","viva","vivo","vlaanderen","vn","vodka","volkswagen","volvo","vote","voting","voto","voyage","vu","vuelos","wales","walmart","walter","wang","wanggou","watch","watches","weather","weatherchannel","webcam","weber","website","wed","wedding","weibo","weir","wf","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","ws","wtc","wtf","xbox","xerox","xfinity","xihuan","xin","xn--11b4c3d","xn--1ck2e1b","xn--1qqw23a","xn--2scrj9c","xn--30rr7y","xn--3bst00m","xn--3ds443g","xn--3e0b707e","xn--3hcrj9c","xn--3oq18vl8pn36a","xn--3pxu8k","xn--42c2d9a","xn--45br5cyl","xn--45brj9c","xn--45q11c","xn--4gbrim","xn--54b7fta0cc","xn--55qw42g","xn--55qx5d","xn--5su34j936bgsg","xn--5tzm5g","xn--6frz82g","xn--6qq986b3xl","xn--80adxhks","xn--80ao21a","xn--80aqecdr1a","xn--80asehdb","xn--80aswg","xn--8y0a063a","xn--90a3ac","xn--90ae","xn--90ais","xn--9dbq2a","xn--9et52u","xn--9krt00a","xn--b4w605ferd","xn--bck1b9a5dre4c","xn--c1avg","xn--c2br7g","xn--cck2b3b","xn--cg4bki","xn--clchc0ea0b2g2a9gcd","xn--czr694b","xn--czrs0t","xn--czru2d","xn--d1acj3b","xn--d1alf","xn--e1a4c","xn--eckvdtc9d","xn--efvy88h","xn--estv75g","xn--fct429k","xn--fhbei","xn--fiq228c5hs","xn--fiq64b","xn--fiqs8s","xn--fiqz9s","xn--fjq720a","xn--flw351e","xn--fpcrj9c3d","xn--fzc2c9e2c","xn--fzys8d69uvgm","xn--g2xx48c","xn--gckr3f0f","xn--gecrj9c","xn--gk3at1e","xn--h2breg3eve","xn--h2brj9c","xn--h2brj9c8c","xn--hxt814e","xn--i1b6b1a6a2e","xn--imr513n","xn--io0a7i","xn--j1aef","xn--j1amh","xn--j6w193g","xn--jlq61u9w7b","xn--jvr189m","xn--kcrx77d1x4a","xn--kprw13d","xn--kpry57d","xn--kpu716f","xn--kput3i","xn--l1acc","xn--lgbbat1ad8j","xn--mgb9awbf","xn--mgba3a3ejt","xn--mgba3a4f16a","xn--mgba7c0bbn0a","xn--mgbaakc7dvf","xn--mgbaam7a8h","xn--mgbab2bd","xn--mgbah1a3hjkrd","xn--mgbai9azgqp6j","xn--mgbayh7gpa","xn--mgbbh1a","xn--mgbbh1a71e","xn--mgbc0a9azcg","xn--mgbca7dzdo","xn--mgbcpq6gpa1a","xn--mgberp4a5d4ar","xn--mgbgu82a","xn--mgbi4ecexp","xn--mgbpl2fh","xn--mgbt3dhd","xn--mgbtx2b","xn--mgbx4cd0ab","xn--mix891f","xn--mk1bu44c","xn--mxtq1m","xn--ngbc5azd","xn--ngbe9e0a","xn--ngbrx","xn--node","xn--nqv7f","xn--nqv7fs00ema","xn--nyqy26a","xn--o3cw4h","xn--ogbpf8fl","xn--otu796d","xn--p1acf","xn--p1ai","xn--pbt977c","xn--pgbs0dh","xn--pssy2u","xn--q7ce6a","xn--q9jyb4c","xn--qcka1pmc","xn--qxa6a","xn--qxam","xn--rhqv96g","xn--rovu88b","xn--rvc1e0am3e","xn--s9brj9c","xn--ses554g","xn--t60b56a","xn--tckwe","xn--tiq49xqyj","xn--unup4y","xn--vermgensberater-ctb","xn--vermgensberatung-pwb","xn--vhquv","xn--vuq861b","xn--w4r85el8fhu5dnra","xn--w4rs40l","xn--wgbh1c","xn--wgbl6a","xn--xhq521b","xn--xkc2al3hye2a","xn--xkc2dl3a5ee0h","xn--y9a3aq","xn--yfro4i67o","xn--ygbi2ammx","xn--zfr164b","xxx","xyz","yachts","yahoo","yamaxun","yandex","ye","yodobashi","yoga","yokohama","you","youtube","yt","yun","za","zappos","zara","zero","zip","zm","zone","zuerich","zw"]}"; \ No newline at end of file From fb8ac560ba582c11fb108ee78ff0a6a5be80799b Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 3 Mar 2020 16:09:57 +0100 Subject: [PATCH 180/461] drop PHP7.0 and PHP7.1 from package --- .gitignore | 1 + composer.json | 12 ++++++------ phpstan.src.neon | 11 ++++++++++- phpstan.tests.neon | 22 +++++++++++++++++++++- phpunit.xml.dist | 8 ++------ 5 files changed, 40 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index 4558fe56..7fc5e378 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ docs build .idea .php_cs.cache +.phpunit.result.cache diff --git a/composer.json b/composer.json index a56b0bec..8a7ea962 100644 --- a/composer.json +++ b/composer.json @@ -34,19 +34,19 @@ "psl" ], "require": { - "php": ">=7.0", + "php": "^7.2", "ext-intl": "*", "psr/log": "^1.1", "psr/simple-cache": "^1.0.1" }, "require-dev": { "composer/composer": "^1.6", - "friendsofphp/php-cs-fixer": "^2.7", + "friendsofphp/php-cs-fixer": "^2.16", "mikey179/vfsstream": "^1.6", - "phpstan/phpstan": "^0.9.2", - "phpstan/phpstan-phpunit": "^0.9.4", - "phpstan/phpstan-strict-rules": "^0.9.0", - "phpunit/phpunit": "^6.3" + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^8.5" }, "suggest": { "psr/simple-cache-implementation": "To enable using other cache providers", diff --git a/phpstan.src.neon b/phpstan.src.neon index ee6abb0e..00a3244b 100644 --- a/phpstan.src.neon +++ b/phpstan.src.neon @@ -1,2 +1,11 @@ includes: -- vendor/phpstan/phpstan-strict-rules/rules.neon \ No newline at end of file +- vendor/phpstan/phpstan-strict-rules/rules.neon +parameters: + checkMissingIterableValueType: false + checkGenericClassInNonGenericObjectType: false + ignoreErrors: + - message: '#Call to function is_iterable\(\) with iterable will always evaluate to true.#' + path: src/Cache.php + - message: '#Property Pdp\\TopLevelDomains::\$modifiedDate \(DateTimeImmutable\) does not accept DateTimeInterface.#' + path: src/TopLevelDomains.php + reportUnmatchedIgnoredErrors: true diff --git a/phpstan.tests.neon b/phpstan.tests.neon index 9687471f..569e6434 100644 --- a/phpstan.tests.neon +++ b/phpstan.tests.neon @@ -2,4 +2,24 @@ includes: - vendor/phpstan/phpstan-strict-rules/rules.neon - vendor/phpstan/phpstan-phpunit/extension.neon - vendor/phpstan/phpstan-phpunit/rules.neon - - vendor/phpstan/phpstan-phpunit/strictRules.neon \ No newline at end of file +parameters: + checkMissingIterableValueType: false + ignoreErrors: + - message: '#Parameter \#1 \$exception of method PHPUnit\\Framework\\TestCase::expectException\(\) expects class-string, string given\.#' + path: tests/CacheTest.php + - message: '#Parameter \#1 \$key of method Pdp\\Cache::get\(\) expects string, null given\.#' + path: tests/CacheTest.php + - message: '#Parameter \#3 \$ttl of method Pdp\\Cache::set\(\) expects DateInterval\|int\|null, DateTime\|false given\.#' + path: tests/CacheTest.php + - message: '#Parameter \#1 \$key of method Pdp\\Cache::set\(\) expects string, null given\.#' + path: tests/CacheTest.php + - message: '#Parameter \#1 \$key of method Pdp\\Cache::delete\(\) expects string, null given\.#' + path: tests/CacheTest.php + - message: '#Parameter \#1 \$key of method Pdp\\Cache::has\(\) expects string, null given\.#' + path: tests/CacheTest.php + - message: '#Parameter \#1 \$values of method Pdp\\Cache::setMultiple\(\) expects iterable, null given\.#' + path: tests/CacheTest.php + - message: '#Parameter \#1 \$keys of method Pdp\\Cache::getMultiple\(\) expects iterable, null given\.#' + path: tests/CacheTest.php + - message: '#Parameter \#1 \$keys of method Pdp\\Cache::deleteMultiple\(\) expects iterable, null given\.#' + path: tests/CacheTest.php diff --git a/phpunit.xml.dist b/phpunit.xml.dist index f6cdf9ac..61f72782 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -12,7 +12,7 @@ stopOnFailure="false"> - + tests @@ -20,16 +20,12 @@ src - - src - - src/Installer - + From edf65fd6bc9c1235a32f9bcefa38df9098c85e2b Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 3 Mar 2020 16:10:15 +0100 Subject: [PATCH 181/461] Update test suite --- tests/CacheTest.php | 86 ++++++------ tests/ConverterTest.php | 10 +- tests/CurlHttpClientTest.php | 10 +- tests/DomainTest.php | 243 ++++++++++++++++------------------ tests/InstallerTest.php | 44 ++++-- tests/ManagerTest.php | 57 +++++--- tests/PublicSuffixTest.php | 84 ++++++------ tests/RulesTest.php | 80 +++++------ tests/TLDConverterTest.php | 12 +- tests/TopLevelDomainsTest.php | 46 ++++--- 10 files changed, 357 insertions(+), 315 deletions(-) diff --git a/tests/CacheTest.php b/tests/CacheTest.php index 00d23113..a406ac15 100644 --- a/tests/CacheTest.php +++ b/tests/CacheTest.php @@ -16,6 +16,7 @@ namespace Pdp\Tests; use DateInterval; +use Generator; use Iterator; use org\bovigo\vfs\vfsStream; use Pdp\Cache; @@ -34,13 +35,22 @@ */ class CacheTest extends TestCase { + /** + * @var Cache + */ protected $cache; + /** + * @var \org\bovigo\vfs\vfsStreamDirectory + */ protected $root; + /** + * @var string + */ protected $cacheDir; - public function setUp() + public function setUp(): void { $this->root = vfsStream::setup('pdp'); vfsStream::create(['cache' => []], $this->root); @@ -48,32 +58,30 @@ public function setUp() $this->cache = new Cache($this->cacheDir); } - public function tearDown() + public function tearDown(): void { - $this->cache = null; - $this->cacheDir = null; - $this->root = null; + unset($this->cache, $this->cacheDir, $this->root); } - public function testConstructorOnEmptyCachePath() + public function testConstructorOnEmptyCachePath(): void { $cache = new Cache(''); self::assertNull($cache->get('invalid_key')); } - public function testConstructorOnParentCachePathIsNotExisted() + public function testConstructorOnParentCachePathIsNotExisted(): void { $cache = new Cache(vfsStream::url('pdp/cache_not_exist')); self::assertNull($cache->get('invalid_key')); } - public function testSetOnNotWritableCachePath() + public function testSetOnNotWritableCachePath(): void { self::expectException(\InvalidArgumentException::class); $cache = new Cache('/bin'); } - public function testSetOnNotExistingCachePath() + public function testSetOnNotExistingCachePath(): void { self::expectException(\InvalidArgumentException::class); $cache = new Cache('/foo/bar'); @@ -84,13 +92,13 @@ public function testSetOnNotExistingCachePath() * * @param mixed $expected */ - public function testSetGet($expected) + public function testSetGet($expected): void { $this->cache->set('foo', $expected); self::assertEquals($expected, $this->cache->get('foo')); } - public function storableValuesProvider() + public function storableValuesProvider(): iterable { return [ 'string' => ['bar'], @@ -105,7 +113,7 @@ public function storableValuesProvider() /** * @depends testSetGet */ - public function testDelete() + public function testDelete(): void { $this->cache->set('foo', 'bar'); self::assertEquals('bar', $this->cache->get('foo')); @@ -113,19 +121,19 @@ public function testDelete() self::assertNull($this->cache->get('foo')); } - public function testGetInvalidArg() + public function testGetInvalidArg(): void { self::expectException(InvalidArgumentException::class); $this->cache->get(null); } - public function testInvalidKey() + public function testInvalidKey(): void { self::expectException(InvalidArgumentException::class); $this->cache->get('foo:bar', 'bar'); } - public function testSetInvalidTTL() + public function testSetInvalidTTL(): void { self::expectException(InvalidArgumentException::class); $this->cache->set('foo', 'bar', date_create()); @@ -134,7 +142,7 @@ public function testSetInvalidTTL() /** * @depends testDelete */ - public function testGetNotFound() + public function testGetNotFound(): void { self::assertNull($this->cache->get('notfound')); } @@ -142,7 +150,7 @@ public function testGetNotFound() /** * @depends testDelete */ - public function testGetNotFoundDefault() + public function testGetNotFoundDefault(): void { $expected = 'chickpeas'; self::assertEquals($expected, $this->cache->get('notfound', $expected)); @@ -152,7 +160,7 @@ public function testGetNotFoundDefault() * @depends testSetGet * @slow */ - public function testSetExpire() + public function testSetExpire(): void { $this->cache->set('foo', 'bar', 1); self::assertEquals('bar', $this->cache->get('foo')); @@ -166,7 +174,7 @@ public function testSetExpire() * @depends testSetGet * @slow */ - public function testSetExpireDateInterval() + public function testSetExpireDateInterval(): void { $this->cache->set('foo', 'bar', new DateInterval('PT1S')); self::assertEquals('bar', $this->cache->get('foo')); @@ -176,13 +184,13 @@ public function testSetExpireDateInterval() self::assertNull($this->cache->get('foo')); } - public function testSetInvalidArg() + public function testSetInvalidArg(): void { self::expectException(InvalidArgumentException::class); $this->cache->set(null, 'bar'); } - public function testDeleteInvalidArg() + public function testDeleteInvalidArg(): void { self::expectException(InvalidArgumentException::class); $this->cache->delete(null); @@ -191,7 +199,7 @@ public function testDeleteInvalidArg() /** * @depends testSetGet */ - public function testClearCache() + public function testClearCache(): void { $this->cache->set('foo', 'bar'); $this->cache->clear(); @@ -201,7 +209,7 @@ public function testClearCache() /** * @depends testSetGet */ - public function testHas() + public function testHas(): void { $this->cache->set('foo', 'bar'); self::assertTrue($this->cache->has('foo')); @@ -210,12 +218,12 @@ public function testHas() /** * @depends testHas */ - public function testHasNot() + public function testHasNot(): void { self::assertFalse($this->cache->has('not-found')); } - public function testHasInvalidArg() + public function testHasInvalidArg(): void { self::expectException(InvalidArgumentException::class); $this->cache->has(null); @@ -224,7 +232,7 @@ public function testHasInvalidArg() /** * @depends testSetGet */ - public function testSetGetMultiple() + public function testSetGetMultiple(): void { $values = [ 'key1' => 'value1', @@ -247,7 +255,7 @@ public function testSetGetMultiple() /** * @depends testSetGet */ - public function testSetGetMultipleGenerator() + public function testSetGetMultipleGenerator(): void { $values = [ 'key1' => 'value1', @@ -255,7 +263,7 @@ public function testSetGetMultipleGenerator() 'key3' => 'value3', ]; - $gen = function () use ($values) { + $gen = function () use ($values): Generator { foreach ($values as $key => $value) { yield $key => $value; } @@ -277,7 +285,7 @@ public function testSetGetMultipleGenerator() /** * @depends testSetGet */ - public function testSetGetMultipleGenerator2() + public function testSetGetMultipleGenerator2(): void { $values = [ 'key1' => 'value1', @@ -285,7 +293,7 @@ public function testSetGetMultipleGenerator2() 'key3' => 'value3', ]; - $gen = function () use ($values) { + $gen = function () use ($values): Generator { foreach ($values as $key => $value) { yield $key; } @@ -308,7 +316,7 @@ public function testSetGetMultipleGenerator2() * @depends testSetExpire * @slow */ - public function testSetMultipleExpireDateIntervalNotExpired() + public function testSetMultipleExpireDateIntervalNotExpired(): void { $values = [ 'key1' => 'value1', @@ -333,7 +341,7 @@ public function testSetMultipleExpireDateIntervalNotExpired() /** * @slow */ - public function testSetMultipleExpireDateIntervalExpired() + public function testSetMultipleExpireDateIntervalExpired(): void { $values = [ 'key1' => 'value1', @@ -370,7 +378,7 @@ public function testSetMultipleExpireDateIntervalExpired() /** * @slow */ - public function testSetMultipleExpireDateIntervalInt() + public function testSetMultipleExpireDateIntervalInt(): void { $values = [ 'key1' => 'value1', @@ -404,13 +412,13 @@ public function testSetMultipleExpireDateIntervalInt() self::assertEquals([], $expected); } - public function testSetMultipleInvalidArg() + public function testSetMultipleInvalidArg(): void { self::expectException(InvalidArgumentException::class); $this->cache->setMultiple(null); } - public function testGetMultipleInvalidArg() + public function testGetMultipleInvalidArg(): void { self::expectException(InvalidArgumentException::class); $result = $this->cache->getMultiple(null); @@ -426,7 +434,7 @@ public function testGetMultipleInvalidArg() /** * @depends testSetGetMultiple */ - public function testDeleteMultipleDefaultGet() + public function testDeleteMultipleDefaultGet(): void { $values = [ 'key1' => 'value1', @@ -459,7 +467,7 @@ public function testDeleteMultipleDefaultGet() /** * @depends testSetGetMultiple */ - public function testDeleteMultipleGenerator() + public function testDeleteMultipleGenerator(): void { $values = [ 'key1' => 'value1', @@ -469,7 +477,7 @@ public function testDeleteMultipleGenerator() $this->cache->setMultiple($values); - $gen = function () { + $gen = function (): Generator { yield 'key1'; yield 'key3'; }; @@ -494,7 +502,7 @@ public function testDeleteMultipleGenerator() self::assertEquals([], $expected); } - public function testDeleteMultipleInvalidArg() + public function testDeleteMultipleInvalidArg(): void { self::expectException(InvalidArgumentException::class); $this->cache->deleteMultiple(null); diff --git a/tests/ConverterTest.php b/tests/ConverterTest.php index d8c6cdb5..2e4e225b 100644 --- a/tests/ConverterTest.php +++ b/tests/ConverterTest.php @@ -24,28 +24,30 @@ */ class ConverterTest extends TestCase { - public function testConverter() + public function testConverter(): void { + /** @var string $string */ $string = file_get_contents(__DIR__.'/data/public_suffix_list.dat'); $retval = (new Converter())->convert($string); self::assertNotEmpty($retval[Converter::ICANN_DOMAINS]); self::assertNotEmpty($retval[Converter::PRIVATE_DOMAINS]); } - public function testConvertThrowsExceptionWithInvalidContent() + public function testConvertThrowsExceptionWithInvalidContent(): void { self::expectException(CouldNotLoadRules::class); + /** @var string $content */ $content = file_get_contents(__DIR__.'/data/invalid_suffix_list_content.dat'); (new Converter())->convert($content); } - public function testConvertWithEmptyString() + public function testConvertWithEmptyString(): void { $retval = (new Converter())->convert(''); self::assertEquals([Converter::ICANN_DOMAINS => [], Converter::PRIVATE_DOMAINS => []], $retval); } - public function testConvertWithInvalidString() + public function testConvertWithInvalidString(): void { $retval = (new Converter())->convert('foobar'); self::assertEquals([Converter::ICANN_DOMAINS => [], Converter::PRIVATE_DOMAINS => []], $retval); diff --git a/tests/CurlHttpClientTest.php b/tests/CurlHttpClientTest.php index 7c977bf0..d53e3abf 100644 --- a/tests/CurlHttpClientTest.php +++ b/tests/CurlHttpClientTest.php @@ -29,18 +29,18 @@ class CurlHttpClientTest extends TestCase * @covers ::__construct * @covers ::getContent */ - public function testGetContent() + public function testGetContent(): void { $content = (new CurlHttpClient())->getContent('https://www.google.com'); - self::assertNotNull($content); - self::assertContains('google', $content); + + self::assertStringContainsString('google', $content); } /** * @covers ::__construct * @covers ::getContent */ - public function testThrowsException() + public function testThrowsException(): void { self::expectException(HttpClientException::class); (new CurlHttpClient())->getContent('https://qsfsdfqdf.dfsf'); @@ -49,7 +49,7 @@ public function testThrowsException() /** * @covers ::__construct */ - public function testConstructorThrowsException() + public function testConstructorThrowsException(): void { self::expectException(Exception::class); new CurlHttpClient(['foo' => 'bar']); diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 61617736..24eac38e 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -43,7 +43,7 @@ class DomainTest extends TestCase * @covers ::getRegistrableDomain * @covers ::getSubDomain */ - public function testRegistrableDomainIsNullWithFoundDomain() + public function testRegistrableDomainIsNullWithFoundDomain(): void { $domain = new Domain('faketld', null); self::assertNull($domain->getPublicSuffix()); @@ -60,13 +60,13 @@ public function testRegistrableDomainIsNullWithFoundDomain() * @param mixed $domain * @param mixed $publicSuffix */ - public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain($domain, $publicSuffix) + public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain($domain, $publicSuffix): void { self::expectException(CouldNotResolvePublicSuffix::class); new Domain($domain, new PublicSuffix($publicSuffix)); } - public function provideWrongConstructor() + public function provideWrongConstructor(): iterable { return [ 'public suffix mismatch' => [ @@ -96,13 +96,13 @@ public function provideWrongConstructor() * @covers ::getIdnErrors * @param string $domain */ - public function testToAsciiThrowsException(string $domain) + public function testToAsciiThrowsException(string $domain): void { self::expectException(InvalidDomain::class); new Domain($domain); } - public function invalidDomainProvider() + public function invalidDomainProvider(): iterable { return [ 'invalid IDN domain' => ['a⒈com'], @@ -116,7 +116,7 @@ public function invalidDomainProvider() * @covers ::idnToUnicode * @covers ::getIdnErrors */ - public function testToUnicodeThrowsException() + public function testToUnicodeThrowsException(): void { self::expectException(InvalidDomain::class); (new Domain('xn--a-ecp.ru'))->toUnicode(); @@ -130,17 +130,13 @@ public function testToUnicodeThrowsException() * @covers ::jsonSerialize * @covers ::getIterator */ - public function testDomainInternalPhpMethod() + public function testDomainInternalPhpMethod(): void { $domain = new Domain('www.ulb.ac.be', new PublicSuffix('ac.be')); $generateDomain = eval('return '.var_export($domain, true).';'); - self::assertInternalType('array', $domain->__debugInfo()); self::assertEquals($domain, $generateDomain); self::assertSame(['be', 'ac', 'ulb', 'www'], iterator_to_array($domain)); - self::assertJsonStringEqualsJsonString( - json_encode($domain->__debugInfo()), - json_encode($domain) - ); + self::assertEquals($domain->__debugInfo(), $domain->jsonSerialize()); self::assertSame('www.ulb.ac.be', (string) $domain); } @@ -150,18 +146,18 @@ public function testDomainInternalPhpMethod() * @covers ::count * @dataProvider countableProvider * - * @param string|null $domain - * @param int $nbLabels - * @param string[] $labels + * @param string[] $labels + * @param ?string $domain + * @param int $nbLabels */ - public function testCountable($domain, $nbLabels, $labels) + public function testCountable(?string $domain, int $nbLabels, array $labels): void { $domain = new Domain($domain); self::assertCount($nbLabels, $domain); self::assertSame($labels, iterator_to_array($domain)); } - public function countableProvider() + public function countableProvider(): iterable { return [ 'null' => [null, 0, []], @@ -174,7 +170,7 @@ public function countableProvider() /** * @covers ::getLabel */ - public function testGetLabel() + public function testGetLabel(): void { $domain = new Domain('master.example.com'); self::assertSame('com', $domain->getLabel(0)); @@ -187,7 +183,7 @@ public function testGetLabel() /** * @covers ::keys */ - public function testOffsets() + public function testOffsets(): void { $domain = new Domain('master.com.example.com'); self::assertSame([0, 2], $domain->keys('com')); @@ -197,7 +193,7 @@ public function testOffsets() /** * @covers ::labels */ - public function testLabels() + public function testLabels(): void { $domain = new Domain('master.com.example.com'); self::assertSame([ @@ -224,22 +220,21 @@ public function testLabels() * @covers ::toUnicode * @covers \Pdp\PublicSuffix::toUnicode * @dataProvider toUnicodeProvider - * - * @param null|string $domain - * @param null|string $publicSuffix - * @param null|string $expectedDomain - * @param null|string $expectedSuffix - * @param null|string $expectedIDNDomain - * @param null|string $expectedIDNSuffix + * @param ?string $domain + * @param ?string $publicSuffix + * @param ?string $expectedDomain + * @param ?string $expectedSuffix + * @param ?string $expectedIDNDomain + * @param ?string $expectedIDNSuffix */ public function testToIDN( - $domain, - $publicSuffix, - $expectedDomain, - $expectedSuffix, - $expectedIDNDomain, - $expectedIDNSuffix - ) { + ?string $domain, + ?string $publicSuffix, + ?string $expectedDomain, + ?string $expectedSuffix, + ?string $expectedIDNDomain, + ?string $expectedIDNSuffix + ): void { $domain = new Domain($domain, new PublicSuffix($publicSuffix)); self::assertSame($expectedDomain, $domain->getDomain()); self::assertSame($expectedSuffix, $domain->getPublicSuffix()); @@ -249,7 +244,7 @@ public function testToIDN( self::assertSame($expectedIDNSuffix, $domainIDN->getPublicSuffix()); } - public function toUnicodeProvider() + public function toUnicodeProvider(): iterable { return [ 'simple domain' => [ @@ -325,21 +320,21 @@ public function toUnicodeProvider() * @covers \Pdp\PublicSuffix::toAscii * * @dataProvider toAsciiProvider - * @param null|string $domain - * @param null|string $publicSuffix - * @param null|string $expectedDomain - * @param null|string $expectedSuffix - * @param null|string $expectedAsciiDomain - * @param null|string $expectedAsciiSuffix + * @param ?string $domain + * @param ?string $publicSuffix + * @param ?string $expectedDomain + * @param ?string $expectedSuffix + * @param ?string $expectedAsciiDomain + * @param ?string $expectedAsciiSuffix */ public function testToAscii( - $domain, - $publicSuffix, - $expectedDomain, - $expectedSuffix, - $expectedAsciiDomain, - $expectedAsciiSuffix - ) { + ?string $domain, + ?string $publicSuffix, + ?string $expectedDomain, + ?string $expectedSuffix, + ?string $expectedAsciiDomain, + ?string $expectedAsciiSuffix + ): void { $domain = new Domain($domain, new PublicSuffix($publicSuffix)); self::assertSame($expectedDomain, $domain->getDomain()); self::assertSame($expectedSuffix, $domain->getPublicSuffix()); @@ -349,7 +344,7 @@ public function testToAscii( self::assertSame($expectedAsciiSuffix, $domainIDN->getPublicSuffix()); } - public function toAsciiProvider() + public function toAsciiProvider(): iterable { return [ 'simple domain' => [ @@ -400,16 +395,16 @@ public function toAsciiProvider() * @covers ::normalize * @dataProvider resolvePassProvider * - * @param string|null $expected - * @param Domain $domain - * @param mixed $publicSuffix + * @param mixed $publicSuffix + * @param Domain $domain + * @param ?string $expected */ - public function testResolveWorks(Domain $domain, $publicSuffix, $expected) + public function testResolveWorks(Domain $domain, $publicSuffix, ?string $expected): void { self::assertSame($expected, $domain->resolve($publicSuffix)->getPublicSuffix()); } - public function resolvePassProvider() + public function resolvePassProvider(): iterable { $publicSuffix = new PublicSuffix('ac.be', Rules::ICANN_DOMAINS); $domain = new Domain('ulb.ac.be', $publicSuffix); @@ -456,17 +451,16 @@ public function resolvePassProvider() /** * @covers ::resolve * @dataProvider resolveFailsProvider - * * @param Domain $domain * @param PublicSuffix $publicSuffix */ - public function testResolveFails(Domain $domain, PublicSuffix $publicSuffix) + public function testResolveFails(Domain $domain, PublicSuffix $publicSuffix): void { self::expectException(CouldNotResolvePublicSuffix::class); $domain->resolve($publicSuffix); } - public function resolveFailsProvider() + public function resolveFailsProvider(): iterable { $publicSuffix = new PublicSuffix('ac.be', Rules::ICANN_DOMAINS); $domain = new Domain('ulb.ac.be', $publicSuffix); @@ -498,7 +492,7 @@ public function resolveFailsProvider() /** * @covers ::resolve */ - public function testResolveReturnsInstance() + public function testResolveReturnsInstance(): void { $publicSuffix = new PublicSuffix('ac.be', Rules::ICANN_DOMAINS); $domain = new Domain('ulb.ac.be', $publicSuffix); @@ -511,11 +505,11 @@ public function testResolveReturnsInstance() * @covers ::normalizeContent * @dataProvider withSubDomainWorksProvider * - * @param null|string $expected - * @param Domain $domain - * @param mixed $subdomain + * @param mixed $subdomain + * @param Domain $domain + * @param ?string $expected */ - public function testWithSubDomainWorks(Domain $domain, $subdomain, $expected) + public function testWithSubDomainWorks(Domain $domain, $subdomain, ?string $expected): void { $result = $domain->withSubDomain($subdomain); self::assertSame($expected, $result->getSubDomain()); @@ -526,7 +520,7 @@ public function testWithSubDomainWorks(Domain $domain, $subdomain, $expected) self::assertSame($domain->isPrivate(), $result->isPrivate()); } - public function withSubDomainWorksProvider() + public function withSubDomainWorksProvider(): iterable { return [ 'simple addition' => [ @@ -561,7 +555,7 @@ public function withSubDomainWorksProvider() * @covers ::withSubDomain * @covers ::normalizeContent */ - public function testWithSubDomainFailsWithNullDomain() + public function testWithSubDomainFailsWithNullDomain(): void { self::expectException(CouldNotResolveSubDomain::class); (new Domain())->withSubDomain('www'); @@ -571,7 +565,7 @@ public function testWithSubDomainFailsWithNullDomain() * @covers ::withSubDomain * @covers ::normalizeContent */ - public function testWithSubDomainFailsWithOneLabelDomain() + public function testWithSubDomainFailsWithOneLabelDomain(): void { self::expectException(CouldNotResolveSubDomain::class); (new Domain('localhost'))->withSubDomain('www'); @@ -581,7 +575,7 @@ public function testWithSubDomainFailsWithOneLabelDomain() * @covers ::withSubDomain * @covers ::normalizeContent */ - public function testWithEmptySubdomain() + public function testWithEmptySubdomain(): void { self::expectException(InvalidDomain::class); (new Domain( @@ -594,7 +588,7 @@ public function testWithEmptySubdomain() * @covers ::withSubDomain * @covers ::normalizeContent */ - public function testWithSubDomainFailsWithNonStringableObject() + public function testWithSubDomainFailsWithNonStringableObject(): void { self::expectException(TypeError::class); (new Domain( @@ -608,7 +602,7 @@ public function testWithSubDomainFailsWithNonStringableObject() * @covers ::withSubDomain * @covers ::normalizeContent */ - public function testWithSubDomainWithoutPublicSuffixInfo() + public function testWithSubDomainWithoutPublicSuffixInfo(): void { self::expectException(CouldNotResolveSubDomain::class); (new Domain('www.example.com'))->withSubDomain('www'); @@ -618,21 +612,21 @@ public function testWithSubDomainWithoutPublicSuffixInfo() * @covers ::withPublicSuffix * @dataProvider withPublicSuffixWorksProvider * - * @param null|string $expected - * @param Domain $domain - * @param mixed $publicSuffix - * @param bool $isKnown - * @param bool $isICANN - * @param bool $isPrivate + * @param mixed $publicSuffix + * @param Domain $domain + * @param ?string $expected + * @param bool $isKnown + * @param bool $isICANN + * @param bool $isPrivate */ public function testWithPublicSuffixWorks( Domain $domain, $publicSuffix, - $expected, + ?string $expected, bool $isKnown, bool $isICANN, bool $isPrivate - ) { + ): void { $result = $domain->withPublicSuffix($publicSuffix); self::assertSame($expected, $result->getPublicSuffix()); self::assertSame($isKnown, $result->isKnown()); @@ -640,7 +634,7 @@ public function testWithPublicSuffixWorks( self::assertSame($isPrivate, $result->isPrivate()); } - public function withPublicSuffixWorksProvider() + public function withPublicSuffixWorksProvider(): iterable { $base_domain = new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)); @@ -723,7 +717,7 @@ public function withPublicSuffixWorksProvider() /** * @covers ::withPublicSuffix */ - public function testWithPublicSuffixFailsWithNullDomain() + public function testWithPublicSuffixFailsWithNullDomain(): void { self::expectException(InvalidDomain::class); (new Domain())->withPublicSuffix('www'); @@ -734,23 +728,23 @@ public function testWithPublicSuffixFailsWithNullDomain() * @covers ::normalizeContent * @dataProvider withLabelWorksProvider * - * @param null|string $expected - * @param Domain $domain - * @param int $key - * @param mixed $label - * @param bool $isKnown - * @param bool $isICANN - * @param bool $isPrivate + * @param mixed $label + * @param Domain $domain + * @param int $key + * @param ?string $expected + * @param bool $isKnown + * @param bool $isICANN + * @param bool $isPrivate */ public function testWithLabelWorks( Domain $domain, int $key, $label, - $expected, + ?string $expected, bool $isKnown, bool $isICANN, bool $isPrivate - ) { + ): void { $result = $domain->withLabel($key, $label); self::assertSame($expected, $result->getContent()); self::assertSame($isKnown, $result->isKnown()); @@ -758,7 +752,7 @@ public function testWithLabelWorks( self::assertSame($isPrivate, $result->isPrivate()); } - public function withLabelWorksProvider() + public function withLabelWorksProvider(): iterable { $base_domain = new Domain('www.example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)); @@ -859,7 +853,7 @@ public function withLabelWorksProvider() /** * @covers ::withLabel */ - public function testWithLabelFailsWithTypeError() + public function testWithLabelFailsWithTypeError(): void { self::expectException(InvalidLabel::class); (new Domain('example.com'))->withLabel(1, null); @@ -868,7 +862,7 @@ public function testWithLabelFailsWithTypeError() /** * @covers ::withLabel */ - public function testWithLabelFailsWithInvalidKey() + public function testWithLabelFailsWithInvalidKey(): void { self::expectException(InvalidLabelKey::class); (new Domain('example.com'))->withLabel(-4, 'www'); @@ -877,7 +871,7 @@ public function testWithLabelFailsWithInvalidKey() /** * @covers ::withLabel */ - public function testWithLabelFailsWithInvalidLabel2() + public function testWithLabelFailsWithInvalidLabel2(): void { self::expectException(InvalidDomain::class); (new Domain('example.com'))->withLabel(-1, ''); @@ -887,18 +881,17 @@ public function testWithLabelFailsWithInvalidLabel2() * @covers ::append * @covers ::withLabel * + * @dataProvider validAppend * @param string $raw * @param string $append * @param string $expected - * - * @dataProvider validAppend */ - public function testAppend($raw, $append, $expected) + public function testAppend(string $raw, string $append, string $expected): void { self::assertSame($expected, (string) (new Domain($raw))->append($append)); } - public function validAppend() + public function validAppend(): iterable { return [ ['secure.example.com', '8.8.8.8', 'secure.example.com.8.8.8.8'], @@ -912,18 +905,17 @@ public function validAppend() * @covers ::prepend * @covers ::withLabel * + * @dataProvider validPrepend * @param string $raw * @param string $prepend * @param string $expected - * - * @dataProvider validPrepend */ - public function testPrepend($raw, $prepend, $expected) + public function testPrepend(string $raw, string $prepend, string $expected): void { self::assertSame($expected, (string) (new Domain($raw))->prepend($prepend)); } - public function validPrepend() + public function validPrepend(): iterable { return [ ['secure.example.com', 'master', 'master.secure.example.com'], @@ -935,22 +927,21 @@ public function validPrepend() /** * @covers ::withoutLabel * @dataProvider withoutLabelWorksProvider - * - * @param null|string $expected - * @param Domain $domain - * @param int $key - * @param bool $isKnown - * @param bool $isICANN - * @param bool $isPrivate + * @param Domain $domain + * @param int $key + * @param ?string $expected + * @param bool $isKnown + * @param bool $isICANN + * @param bool $isPrivate */ public function testwithoutLabelWorks( Domain $domain, int $key, - $expected, + ?string $expected, bool $isKnown, bool $isICANN, bool $isPrivate - ) { + ): void { $result = $domain->withoutLabel($key); self::assertSame($expected, $result->getContent()); self::assertSame($isKnown, $result->isKnown()); @@ -958,7 +949,7 @@ public function testwithoutLabelWorks( self::assertSame($isPrivate, $result->isPrivate()); } - public function withoutLabelWorksProvider() + public function withoutLabelWorksProvider(): iterable { $base_domain = new Domain('www.example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)); @@ -1001,7 +992,7 @@ public function withoutLabelWorksProvider() /** * @covers ::withoutLabel */ - public function testwithoutLabelFailsWithInvalidKey() + public function testwithoutLabelFailsWithInvalidKey(): void { self::expectException(InvalidLabelKey::class); (new Domain('example.com'))->withoutLabel(-3); @@ -1010,7 +1001,7 @@ public function testwithoutLabelFailsWithInvalidKey() /** * @covers ::withoutLabel */ - public function testwithoutLabelWorksWithMultipleKeys() + public function testwithoutLabelWorksWithMultipleKeys(): void { self::assertNull((new Domain('www.example.com'))->withoutLabel(0, 1, 2)->getContent()); } @@ -1018,7 +1009,7 @@ public function testwithoutLabelWorksWithMultipleKeys() /** * @covers ::__construct */ - public function testConstructWithCustomIDNAOptions() + public function testConstructWithCustomIDNAOptions(): void { $domain = new Domain('example.com', null, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); self::assertSame( @@ -1043,13 +1034,13 @@ public function testResolveWorksWithCustomIDNAOptions( string $domainName, string $publicSuffix, string $withLabel, - $expectedContent, - $expectedAscii, - $expectedUnicode, - $expectedRegistrable, - $expectedSubDomain, - $expectedWithLabel - ) { + ?string $expectedContent, + ?string $expectedAscii, + ?string $expectedUnicode, + ?string $expectedRegistrable, + ?string $expectedSubDomain, + ?string $expectedWithLabel + ): void { $domain = new Domain( $domainName, new PublicSuffix($publicSuffix), @@ -1064,7 +1055,7 @@ public function testResolveWorksWithCustomIDNAOptions( self::assertSame($expectedWithLabel, $domain->withLabel(-1, $withLabel)->getContent()); } - public function resolveCustomIDNAOptionsProvider() + public function resolveCustomIDNAOptionsProvider(): iterable { return [ 'without deviation characters' => [ @@ -1114,7 +1105,7 @@ public function resolveCustomIDNAOptionsProvider() ]; } - public function testInstanceCreationWithCustomIDNAOptions() + public function testInstanceCreationWithCustomIDNAOptions(): void { $domain = new Domain( 'example.com', @@ -1173,15 +1164,15 @@ public function testInstanceCreationWithCustomIDNAOptions() /** * @covers ::isTransitionalDifferent * @dataProvider transitionalProvider - * @param \Pdp\Domain $domain - * @param bool $expected + * @param Domain $domain + * @param bool $expected */ - public function testIsTransitionalDifference(Domain $domain, bool $expected) + public function testIsTransitionalDifference(Domain $domain, bool $expected): void { self::assertSame($expected, $domain->isTransitionalDifferent()); } - public function transitionalProvider() + public function transitionalProvider(): iterable { return [ 'simple' => [new Domain('example.com'), false], @@ -1200,7 +1191,7 @@ public function transitionalProvider() * @covers ::withAsciiIDNAOption * @covers ::withUnicodeIDNAOption */ - public function testwithIDNAOptions() + public function testwithIDNAOptions(): void { $domain = new Domain('example.com', new PublicSuffix('com')); diff --git a/tests/InstallerTest.php b/tests/InstallerTest.php index 6b37d8af..9279f3d5 100644 --- a/tests/InstallerTest.php +++ b/tests/InstallerTest.php @@ -23,6 +23,7 @@ use Pdp\Logger; use Pdp\Manager; use PHPUnit\Framework\TestCase; +use Psr\Log\LoggerInterface; use function file_get_contents; use function rewind; use function sprintf; @@ -33,10 +34,29 @@ */ class InstallerTest extends TestCase { + /** + * @var Cache + */ protected $cachePool; + + /** + * @var string + */ protected $cacheDir; + + /** + * @var \org\bovigo\vfs\vfsStreamDirectory + */ protected $root; + + /** + * @var HttpClient + */ protected $client; + + /** + * @var LoggerInterface + */ protected $logger; /** @@ -49,7 +69,7 @@ private function setStream() return $stream; } - public function setUp() + public function setUp(): void { $this->root = vfsStream::setup('pdp'); vfsStream::create(['cache' => []], $this->root); @@ -59,11 +79,17 @@ public function setUp() public function getContent(string $url): string { if ($url === Manager::PSL_URL) { - return file_get_contents(__DIR__.'/data/public_suffix_list.dat'); + /** @var string $res */ + $res = file_get_contents(__DIR__.'/data/public_suffix_list.dat'); + + return $res; } if ($url === Manager::RZD_URL) { - return file_get_contents(__DIR__.'/data/tlds-alpha-by-domain.txt'); + /** @var string $res */ + $res = file_get_contents(__DIR__.'/data/tlds-alpha-by-domain.txt'); + + return $res; } throw new HttpClientException(sprintf('invalid url: %s', $url)); @@ -71,13 +97,9 @@ public function getContent(string $url): string }; } - public function tearDown() + public function tearDown(): void { - $this->cachePool = null; - $this->cacheDir = null; - $this->root = null; - $this->client = null; - $this->logger = null; + unset($this->cachePool, $this->cacheDir, $this->root, $this->client, $this->logger); } /** @@ -86,7 +108,7 @@ public function tearDown() * @param bool $retval * @param array $logs */ - public function testRefreshDefault(array $context, bool $retval, array $logs) + public function testRefreshDefault(array $context, bool $retval, array $logs): void { $stream = $this->setStream(); $logger = new Logger($stream, $stream); @@ -97,7 +119,7 @@ public function testRefreshDefault(array $context, bool $retval, array $logs) /** @var string $data */ $data = stream_get_contents($stream); foreach ($logs as $log) { - self::assertContains($log, $data); + self::assertStringContainsString($log, $data); } } diff --git a/tests/ManagerTest.php b/tests/ManagerTest.php index 00e2cfce..c1ff40b2 100644 --- a/tests/ManagerTest.php +++ b/tests/ManagerTest.php @@ -32,12 +32,26 @@ */ class ManagerTest extends TestCase { + /** + * @var Cache + */ protected $cachePool; + + /** + * @var string + */ protected $cacheDir; + /** + * @var \org\bovigo\vfs\vfsStreamDirectory + */ protected $root; + + /** + * @var HttpClient + */ protected $client; - public function setUp() + public function setUp(): void { $this->root = vfsStream::setup('pdp'); vfsStream::create(['cache' => []], $this->root); @@ -47,11 +61,17 @@ public function setUp() public function getContent(string $url): string { if ($url === Manager::PSL_URL) { - return file_get_contents(__DIR__.'/data/public_suffix_list.dat'); + /** @var string $res */ + $res = file_get_contents(__DIR__.'/data/public_suffix_list.dat'); + + return $res; } if ($url === Manager::RZD_URL) { - return file_get_contents(__DIR__.'/data/tlds-alpha-by-domain.txt'); + /** @var string $res */ + $res = file_get_contents(__DIR__.'/data/tlds-alpha-by-domain.txt'); + + return $res; } return ''; @@ -59,12 +79,9 @@ public function getContent(string $url): string }; } - public function tearDown() + public function tearDown(): void { - $this->cachePool = null; - $this->cacheDir = null; - $this->root = null; - $this->client = null; + unset($this->cachePool, $this->cacheDir, $this->root, $this->client); } /** @@ -73,12 +90,12 @@ public function tearDown() * @covers ::filterTtl * @param mixed $ttl */ - public function testConstructor($ttl) + public function testConstructor($ttl): void { self::assertInstanceOf(Manager::class, new Manager($this->cachePool, $this->client, $ttl)); } - public function validTtlProvider() + public function validTtlProvider(): iterable { return [ 'DateInterval' => [new DateInterval('PT1H')], @@ -93,7 +110,7 @@ public function validTtlProvider() * @covers ::__construct * @covers ::filterTtl */ - public function testConstructorThrowsException() + public function testConstructorThrowsException(): void { self::expectException(TypeError::class); new Manager($this->cachePool, $this->client, tmpfile()); @@ -104,7 +121,7 @@ public function testConstructorThrowsException() * @covers ::getCacheKey * @covers ::refreshRules */ - public function testRefreshRules() + public function testRefreshRules(): void { $manager = new Manager($this->cachePool, $this->client); $previous = $manager->getRules(); @@ -117,7 +134,7 @@ public function testRefreshRules() * @covers ::getCacheKey * @covers ::refreshRules */ - public function testRebuildRulesFromRemoveSource() + public function testRebuildRulesFromRemoveSource(): void { $manager = new Manager($this->cachePool, $this->client); $previous = $manager->getRules(Manager::PSL_URL); @@ -131,7 +148,7 @@ public function testRebuildRulesFromRemoveSource() * @covers ::getCacheKey * @covers ::refreshRules */ - public function testGetRulesThrowsExceptionIfNotCacheCanBeRetrieveOrRefresh() + public function testGetRulesThrowsExceptionIfNotCacheCanBeRetrieveOrRefresh(): void { $cachePool = new class() implements CacheInterface { public function get($key, $default = null) @@ -184,7 +201,7 @@ public function has($key) * @covers ::getCacheKey * @covers ::refreshRules */ - public function testGetRulesThrowsExceptionIfTheCacheIsCorrupted() + public function testGetRulesThrowsExceptionIfTheCacheIsCorrupted(): void { $cachePool = new class() implements CacheInterface { public function get($key, $default = null) @@ -237,7 +254,7 @@ public function has($key) * @covers ::getCacheKey * @covers ::refreshTLDs */ - public function testRefreshTLDs() + public function testRefreshTLDs(): void { $manager = new Manager($this->cachePool, $this->client); $previous = $manager->getTLDs(); @@ -250,7 +267,7 @@ public function testRefreshTLDs() * @covers ::getCacheKey * @covers ::refreshTLDs */ - public function testRebuildTLDsFromRemoveSource() + public function testRebuildTLDsFromRemoveSource(): void { $manager = new Manager($this->cachePool, $this->client); $previous = $manager->getTLDs(); @@ -263,7 +280,7 @@ public function testRebuildTLDsFromRemoveSource() * @covers ::getCacheKey * @covers ::refreshTLDs */ - public function testGetTLDsThrowsExceptionIfNotCacheCanBeRetrieveOrRefresh() + public function testGetTLDsThrowsExceptionIfNotCacheCanBeRetrieveOrRefresh(): void { $cachePool = new class() implements CacheInterface { public function get($key, $default = null) @@ -316,7 +333,7 @@ public function has($key) * @covers ::getCacheKey * @covers ::refreshTLDs */ - public function testGetTLDsThrowsExceptionIfTheCacheIsCorrupted() + public function testGetTLDsThrowsExceptionIfTheCacheIsCorrupted(): void { $cachePool = new class() implements CacheInterface { public function get($key, $default = null) @@ -369,7 +386,7 @@ public function has($key) * @covers ::getCacheKey * @covers ::refreshTLDs */ - public function testGetTLDsThrowsExceptionIfTheCacheContentIsCorrupted() + public function testGetTLDsThrowsExceptionIfTheCacheContentIsCorrupted(): void { $cachePool = new class() implements CacheInterface { public function get($key, $default = null) diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 8e4be26a..4e84e173 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -37,16 +37,13 @@ class PublicSuffixTest extends TestCase * @covers ::jsonSerialize * @covers ::getIterator */ - public function testInternalPhpMethod() + public function testInternalPhpMethod(): void { $publicSuffix = new PublicSuffix('ac.be'); $generatePublicSuffix = eval('return '.var_export($publicSuffix, true).';'); self::assertEquals($publicSuffix, $generatePublicSuffix); self::assertSame(['be', 'ac'], iterator_to_array($publicSuffix)); - self::assertJsonStringEqualsJsonString( - json_encode($publicSuffix->__debugInfo()), - json_encode($publicSuffix) - ); + self::assertEquals($publicSuffix->__debugInfo(), $publicSuffix->jsonSerialize()); self::assertSame('ac.be', (string) $publicSuffix); } @@ -57,7 +54,7 @@ public function testInternalPhpMethod() * @covers ::getContent * @covers ::toUnicode */ - public function testPSToUnicodeWithUrlEncode() + public function testPSToUnicodeWithUrlEncode(): void { self::assertSame('bébe', (new PublicSuffix('b%C3%A9be'))->toUnicode()->getContent()); } @@ -71,14 +68,13 @@ public function testPSToUnicodeWithUrlEncode() * @covers ::isICANN * @covers ::isPrivate * @dataProvider PSProvider - * - * @param string|null $publicSuffix - * @param string $section - * @param bool $isKnown - * @param bool $isIcann - * @param bool $isPrivate + * @param ?string $publicSuffix + * @param string $section + * @param bool $isKnown + * @param bool $isIcann + * @param bool $isPrivate */ - public function testSetSection($publicSuffix, string $section, bool $isKnown, bool $isIcann, bool $isPrivate) + public function testSetSection(?string $publicSuffix, string $section, bool $isKnown, bool $isIcann, bool $isPrivate): void { $ps = new PublicSuffix($publicSuffix, $section); self::assertSame($isKnown, $ps->isKnown()); @@ -86,7 +82,7 @@ public function testSetSection($publicSuffix, string $section, bool $isKnown, bo self::assertSame($isPrivate, $ps->isPrivate()); } - public function PSProvider() + public function PSProvider(): iterable { return [ [null, PublicSuffix::ICANN_DOMAINS, false, false, false], @@ -103,13 +99,13 @@ public function PSProvider() * * @param mixed $publicSuffix */ - public function testConstructorThrowsException($publicSuffix) + public function testConstructorThrowsException($publicSuffix): void { self::expectException(InvalidDomain::class); new PublicSuffix($publicSuffix); } - public function invalidPublicSuffixProvider() + public function invalidPublicSuffixProvider(): iterable { return [ 'empty string' => [''], @@ -122,7 +118,7 @@ public function invalidPublicSuffixProvider() * @covers ::parse * @covers ::idnToAscii */ - public function testPSToAsciiThrowsException() + public function testPSToAsciiThrowsException(): void { self::expectException(InvalidDomain::class); new PublicSuffix('a⒈com'); @@ -132,7 +128,7 @@ public function testPSToAsciiThrowsException() * @covers ::__construct * @covers ::setSection */ - public function testSetSectionThrowsException() + public function testSetSectionThrowsException(): void { self::expectException(CouldNotResolvePublicSuffix::class); new PublicSuffix('ac.be', 'foobar'); @@ -142,7 +138,7 @@ public function testSetSectionThrowsException() * @covers ::toUnicode * @covers ::idnToUnicode */ - public function testToUnicodeThrowsException() + public function testToUnicodeThrowsException(): void { self::expectException(InvalidDomain::class); (new PublicSuffix('xn--a-ecp.ru'))->toUnicode(); @@ -155,17 +151,16 @@ public function testToUnicodeThrowsException() * @covers ::idnToUnicode * * @dataProvider conversionReturnsTheSameInstanceProvider - * - * @param string|null $publicSuffix + * @param ?string $publicSuffix */ - public function testConversionReturnsTheSameInstance($publicSuffix) + public function testConversionReturnsTheSameInstance(?string $publicSuffix): void { $instance = new PublicSuffix($publicSuffix); self::assertSame($instance->toUnicode(), $instance); self::assertSame($instance->toAscii(), $instance); } - public function conversionReturnsTheSameInstanceProvider() + public function conversionReturnsTheSameInstanceProvider(): iterable { return [ 'ascii only domain' => ['ac.be'], @@ -177,7 +172,7 @@ public function conversionReturnsTheSameInstanceProvider() * @covers ::toUnicode * @covers ::idnToUnicode */ - public function testToUnicodeReturnsSameInstance() + public function testToUnicodeReturnsSameInstance(): void { $instance = new PublicSuffix('食狮.公司.cn'); self::assertSame($instance->toUnicode(), $instance); @@ -186,19 +181,18 @@ public function testToUnicodeReturnsSameInstance() /** * @covers ::count * @dataProvider countableProvider - * - * @param string|null $domain - * @param int $nbLabels - * @param string[] $labels + * @param ?string $domain + * @param int $nbLabels + * @param array $labels */ - public function testCountable($domain, $nbLabels, $labels) + public function testCountable(?string $domain, int $nbLabels, array $labels): void { $domain = new PublicSuffix($domain); self::assertCount($nbLabels, $domain); self::assertSame($labels, iterator_to_array($domain)); } - public function countableProvider() + public function countableProvider(): iterable { return [ 'null' => [null, 0, []], @@ -210,7 +204,7 @@ public function countableProvider() /** * @covers ::getLabel */ - public function testGetLabel() + public function testGetLabel(): void { $domain = new PublicSuffix('master.example.com'); self::assertSame('com', $domain->getLabel(0)); @@ -223,7 +217,7 @@ public function testGetLabel() /** * @covers ::keys */ - public function testOffsets() + public function testOffsets(): void { $domain = new PublicSuffix('master.example.com'); self::assertSame([2], $domain->keys('master')); @@ -232,7 +226,7 @@ public function testOffsets() /** * @covers ::labels */ - public function testLabels() + public function testLabels(): void { $publicSuffix = new PublicSuffix('master.example.com'); self::assertSame([ @@ -248,11 +242,10 @@ public function testLabels() /** * @covers ::createFromDomain * @dataProvider createFromDomainProvider - * - * @param Domain $domain - * @param null|string $expected + * @param Domain $domain + * @param ?string $expected */ - public function testCreateFromDomainWorks(Domain $domain, $expected) + public function testCreateFromDomainWorks(Domain $domain, ?string $expected): void { $result = PublicSuffix::createFromDomain($domain); self::assertSame($expected, $result->getContent()); @@ -265,7 +258,7 @@ public function testCreateFromDomainWorks(Domain $domain, $expected) ); } - public function createFromDomainProvider() + public function createFromDomainProvider(): iterable { return [ [ @@ -291,7 +284,6 @@ public function createFromDomainProvider() * @covers ::isTransitionalDifferent * * @dataProvider customIDNAProvider - * * @param string $name * @param string $expectedContent * @param string $expectedAscii @@ -302,7 +294,7 @@ public function testResolveWithCustomIDNAOptions( string $expectedContent, string $expectedAscii, string $expectedUnicode - ) { + ): void { $publicSuffix = new PublicSuffix($name, '', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); self::assertSame($expectedContent, $publicSuffix->getContent()); self::assertSame($expectedAscii, $publicSuffix->toAscii()->getContent()); @@ -314,7 +306,7 @@ public function testResolveWithCustomIDNAOptions( ); } - public function customIDNAProvider() + public function customIDNAProvider(): iterable { return [ 'without deviation characters' => [ @@ -348,15 +340,15 @@ public function customIDNAProvider() * @covers ::isTransitionalDifferent * * @dataProvider transitionalProvider - * @param \Pdp\PublicSuffix $publicSuffix - * @param bool $expected + * @param PublicSuffix $publicSuffix + * @param bool $expected */ - public function testIsTransitionalDifference(PublicSuffix $publicSuffix, bool $expected) + public function testIsTransitionalDifference(PublicSuffix $publicSuffix, bool $expected): void { self::assertSame($expected, $publicSuffix->isTransitionalDifferent()); } - public function transitionalProvider() + public function transitionalProvider(): iterable { return [ 'simple' => [new PublicSuffix('example.com'), false], @@ -375,7 +367,7 @@ public function transitionalProvider() * @covers ::withAsciiIDNAOption * @covers ::withUnicodeIDNAOption */ - public function testwithIDNAOptions() + public function testwithIDNAOptions(): void { $publicSuffix = new PublicSuffix('com'); diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 1697f60d..741ef9af 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -26,6 +26,7 @@ use Pdp\Rules; use PHPUnit\Framework\TestCase; use TypeError; +use function file_get_contents; use const IDNA_DEFAULT; use const IDNA_NONTRANSITIONAL_TO_ASCII; use const IDNA_NONTRANSITIONAL_TO_UNICODE; @@ -40,7 +41,7 @@ class RulesTest extends TestCase */ private $rules; - public function setUp() + public function setUp(): void { $this->rules = (new Manager(new Cache(), new CurlHttpClient()))->getRules(); } @@ -50,23 +51,27 @@ public function setUp() * @covers ::createFromString * @covers ::__construct */ - public function testCreateFromPath() + public function testCreateFromPath(): void { + /** @var string $string */ + $string = file_get_contents(__DIR__.'/data/public_suffix_list.dat'); + $rulesFromString = Rules::createFromString($string); + $context = stream_context_create([ 'http'=> [ 'method' => 'GET', 'header' => "Accept-language: en\r\nCookie: foo=bar\r\n", ], ]); + $rulesFromPath = Rules::createFromPath(__DIR__.'/data/public_suffix_list.dat', $context); - $rules = Rules::createFromPath(__DIR__.'/data/public_suffix_list.dat', $context); - self::assertInstanceOf(Rules::class, $rules); + self::assertEquals($rulesFromString, $rulesFromPath); } /** * @covers ::createFromPath */ - public function testCreateFromPathThrowsException() + public function testCreateFromPathThrowsException(): void { self::expectException(CouldNotLoadRules::class); Rules::createFromPath('/foo/bar.dat'); @@ -76,7 +81,7 @@ public function testCreateFromPathThrowsException() * @covers ::__set_state * @covers ::__construct */ - public function testDomainInternalPhpMethod() + public function testDomainInternalPhpMethod(): void { $generateRules = eval('return '.var_export($this->rules, true).';'); self::assertEquals($this->rules, $generateRules); @@ -88,7 +93,7 @@ public function testDomainInternalPhpMethod() * @covers ::withAsciiIDNAOption * @covers ::withUnicodeIDNAOption */ - public function testwithIDNAOptions() + public function testwithIDNAOptions(): void { self::assertSame($this->rules, $this->rules->withAsciiIDNAOption( $this->rules->getAsciiIDNAOption() @@ -116,7 +121,7 @@ public function testwithIDNAOptions() * @covers \Pdp\Domain::isKnown * @covers \Pdp\IDNAConverterTrait::parse */ - public function testNullWillReturnNullDomain() + public function testNullWillReturnNullDomain(): void { $domain = $this->rules->resolve('COM'); self::assertFalse($domain->isKnown()); @@ -127,7 +132,7 @@ public function testNullWillReturnNullDomain() * @covers ::resolve * @covers \Pdp\IDNAConverterTrait::parse */ - public function testThrowsTypeErrorOnWrongInput() + public function testThrowsTypeErrorOnWrongInput(): void { self::expectException(TypeError::class); $this->rules->resolve(date_create()); @@ -137,7 +142,7 @@ public function testThrowsTypeErrorOnWrongInput() * @covers ::resolve * @covers ::validateSection */ - public function testResolveThrowsExceptionOnWrongDomainType() + public function testResolveThrowsExceptionOnWrongDomainType(): void { self::expectException(CouldNotResolvePublicSuffix::class); $this->rules->resolve('www.example.com', 'foobar'); @@ -154,7 +159,7 @@ public function testResolveThrowsExceptionOnWrongDomainType() * @covers \Pdp\Domain::isKnown * @covers \Pdp\IDNAConverterTrait::parse */ - public function testIsSuffixValidFalse() + public function testIsSuffixValidFalse(): void { $domain = $this->rules->resolve('www.example.faketld'); self::assertFalse($domain->isKnown()); @@ -176,7 +181,7 @@ public function testIsSuffixValidFalse() * @covers \Pdp\Domain::isPrivate * @covers \Pdp\IDNAConverterTrait::parse */ - public function testIsSuffixValidTrue() + public function testIsSuffixValidTrue(): void { $domain = $this->rules->resolve('www.example.com', Rules::ICANN_DOMAINS); self::assertTrue($domain->isKnown()); @@ -200,7 +205,7 @@ public function testIsSuffixValidTrue() * @covers \Pdp\Domain::isPrivate * @covers \Pdp\IDNAConverterTrait::parse */ - public function testIsSuffixValidFalseWithPunycoded() + public function testIsSuffixValidFalseWithPunycoded(): void { $domain = $this->rules->resolve('www.example.xn--85x722f'); self::assertFalse($domain->isKnown()); @@ -224,7 +229,7 @@ public function testIsSuffixValidFalseWithPunycoded() * @covers \Pdp\Domain::isPrivate * @covers \Pdp\IDNAConverterTrait::parse */ - public function testSubDomainIsNull() + public function testSubDomainIsNull(): void { $domain = $this->rules->resolve('ulb.ac.be', Rules::ICANN_DOMAINS); self::assertTrue($domain->isKnown()); @@ -237,7 +242,7 @@ public function testSubDomainIsNull() * @covers ::validateSection * @covers \Pdp\IDNAConverterTrait::parse */ - public function testWithExceptionName() + public function testWithExceptionName(): void { $domain = $this->rules->resolve('_b%C3%A9bé.be-'); self::assertNull($domain->getContent()); @@ -251,7 +256,7 @@ public function testWithExceptionName() * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\IDNAConverterTrait::parse */ - public function testWithPrivateDomain() + public function testWithPrivateDomain(): void { $domain = $this->rules->resolve('thephpleague.github.io'); self::assertTrue($domain->isKnown()); @@ -264,7 +269,7 @@ public function testWithPrivateDomain() * @covers ::resolve * @covers \Pdp\Domain::isResolvable */ - public function testWithAbsoluteHostInvalid() + public function testWithAbsoluteHostInvalid(): void { $domain = $this->rules->resolve('private.ulb.ac.be.'); self::assertSame('private.ulb.ac.be.', $domain->getContent()); @@ -282,7 +287,7 @@ public function testWithAbsoluteHostInvalid() * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\IDNAConverterTrait::parse */ - public function testWithPrivateDomainInvalid() + public function testWithPrivateDomainInvalid(): void { $domain = $this->rules->resolve('private.ulb.ac.be', Rules::PRIVATE_DOMAINS); self::assertSame('private.ulb.ac.be', $domain->getContent()); @@ -300,7 +305,7 @@ public function testWithPrivateDomainInvalid() * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\IDNAConverterTrait::parse */ - public function testWithPrivateDomainValid() + public function testWithPrivateDomainValid(): void { $domain = $this->rules->resolve('thephpleague.github.io', Rules::PRIVATE_DOMAINS); self::assertSame('thephpleague.github.io', $domain->getContent()); @@ -318,7 +323,7 @@ public function testWithPrivateDomainValid() * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\IDNAConverterTrait::parse */ - public function testWithICANNDomainInvalid() + public function testWithICANNDomainInvalid(): void { $domain = $this->rules->resolve('private.ulb.ac.be'); self::assertSame('private.ulb.ac.be', $domain->getContent()); @@ -336,7 +341,7 @@ public function testWithICANNDomainInvalid() * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\IDNAConverterTrait::parse */ - public function testWithDomainObject() + public function testWithDomainObject(): void { $domain = new Domain('private.ulb.ac.be', new PublicSuffix('ac.be', Rules::ICANN_DOMAINS)); $newDomain = $this->rules->resolve($domain); @@ -352,7 +357,7 @@ public function testWithDomainObject() * @covers ::getPublicSuffix * @covers \Pdp\IDNAConverterTrait::parse */ - public function testWithDomainInterfaceObject() + public function testWithDomainInterfaceObject(): void { self::assertSame( 'ac.be', @@ -371,7 +376,7 @@ public function testWithDomainInterfaceObject() * @param mixed $domain * @param mixed $expectedDomain */ - public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) + public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain): void { self::assertSame($registrableDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getRegistrableDomain()); } @@ -388,7 +393,7 @@ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $dom * @param mixed $domain * @param mixed $expectedDomain */ - public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, $expectedDomain) + public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, $expectedDomain): void { self::assertSame($publicSuffix, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getPublicSuffix()); } @@ -405,12 +410,12 @@ public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, * @param mixed $domain * @param mixed $expectedDomain */ - public function testGetDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain) + public function testGetDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain): void { self::assertSame($expectedDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getContent()); } - public function parseDataProvider() + public function parseDataProvider(): iterable { return [ // public suffix, registrable domain, domain @@ -446,13 +451,13 @@ public function parseDataProvider() * @param mixed $domain * @param mixed $section */ - public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix($domain, $section) + public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix($domain, $section): void { self::expectException(CouldNotResolvePublicSuffix::class); $this->rules->getPublicSuffix($domain, $section); } - public function invalidParseProvider() + public function invalidParseProvider(): iterable { $long_label = implode('.', array_fill(0, 62, 'a')); @@ -471,13 +476,13 @@ public function invalidParseProvider() * @param mixed $domain * @param mixed $section */ - public function testGetPublicSuffixThrowsInvalidDomainException($domain, $section) + public function testGetPublicSuffixThrowsInvalidDomainException($domain, $section): void { self::expectException(InvalidDomain::class); $this->rules->getPublicSuffix($domain, $section); } - public function invalidDomainParseProvider() + public function invalidDomainParseProvider(): iterable { $long_label = implode('.', array_fill(0, 62, 'a')); @@ -499,17 +504,16 @@ public function invalidDomainParseProvider() * @covers \Pdp\Domain::isResolvable * @covers \Pdp\IDNAConverterTrait::parse * @dataProvider validPublicSectionProvider - * - * @param string|null $domain - * @param string|null $expected + * @param ?string $domain + * @param ?string $expected */ - public function testPublicSuffixSection($domain, $expected) + public function testPublicSuffixSection(?string $domain, ?string $expected): void { $publicSuffix = $this->rules->getPublicSuffix($domain); self::assertSame($expected, $publicSuffix->getContent()); } - public function validPublicSectionProvider() + public function validPublicSectionProvider(): iterable { return [ 'idn domain' => [ @@ -540,7 +544,7 @@ public function validPublicSectionProvider() * @param string|null $input Domain and public suffix * @param string|null $expected Expected result */ - public function checkPublicSuffix($input, $expected) + public function checkPublicSuffix(?string $input, ?string $expected): void { self::assertSame($expected, $this->rules->resolve($input)->getRegistrableDomain()); } @@ -558,7 +562,7 @@ public function checkPublicSuffix($input, $expected) * @covers \Pdp\Domain::getRegistrableDomain * @covers \Pdp\IDNAConverterTrait::parse */ - public function testPublicSuffixSpec() + public function testPublicSuffixSpec(): void { // Test data from Rob Stradling at Comodo // http://mxr.mozilla.org/mozilla-central/source/netwerk/test/unit/data/test_psl.txt?raw=1 @@ -666,7 +670,7 @@ public function testPublicSuffixSpec() * @covers ::getAsciiIDNAOption * @covers ::getUnicodeIDNAOption */ - public function testResolveWithIDNAOptions() + public function testResolveWithIDNAOptions(): void { $resolvedByDefault = $this->rules->resolve('foo.de', Rules::ICANN_DOMAINS); self::assertSame( diff --git a/tests/TLDConverterTest.php b/tests/TLDConverterTest.php index 9d60cb09..07719fcf 100644 --- a/tests/TLDConverterTest.php +++ b/tests/TLDConverterTest.php @@ -24,28 +24,28 @@ */ class TLDConverterTest extends TestCase { - public function testConverter() + public function testConverter(): void { + /** @var string $string */ $string = file_get_contents(__DIR__.'/data/root_zones.dat'); $res = (new TLDConverter())->convert($string); - self::assertInternalType('array', $res); self::assertArrayHasKey('version', $res); self::assertArrayHasKey('modifiedDate', $res); self::assertArrayHasKey('records', $res); - self::assertInternalType('array', $res['records']); + self::assertIsArray($res['records']); } /** * @dataProvider invalidContentProvider * @param string $content */ - public function testConverterThrowsException(string $content) + public function testConverterThrowsException(string $content): void { self::expectException(CouldNotLoadTLDs::class); (new TLDConverter())->convert($content); } - public function invalidContentProvider() + public function invalidContentProvider(): iterable { $double_header = <<collection = TopLevelDomains::createFromPath(__DIR__.'/data/tlds-alpha-by-domain.txt'); } @@ -45,7 +49,7 @@ public function setUp() * @covers ::createFromString * @covers ::__construct */ - public function testCreateFromPath() + public function testCreateFromPath(): void { $context = stream_context_create([ 'http'=> [ @@ -54,14 +58,14 @@ public function testCreateFromPath() ], ]); - $collection = TopLevelDomains::createFromPath(__DIR__.'/data/root_zones.dat', $context); - self::assertInstanceOf(TopLevelDomains::class, $collection); + $collection = TopLevelDomains::createFromPath(__DIR__.'/data/tlds-alpha-by-domain.txt', $context); + self::assertEquals($this->collection, $collection); } /** * @covers ::createFromPath */ - public function testCreateFromPathThrowsException() + public function testCreateFromPathThrowsException(): void { self::expectException(CouldNotLoadTLDs::class); TopLevelDomains::createFromPath('/foo/bar.dat'); @@ -71,13 +75,13 @@ public function testCreateFromPathThrowsException() * @covers ::__set_state * @covers ::__construct */ - public function testSetState() + public function testSetState(): void { $collection = eval('return '.var_export($this->collection, true).';'); self::assertEquals($this->collection, $collection); } - public function testGetterProperties() + public function testGetterProperties(): void { $collection = TopLevelDomains::createFromPath(__DIR__.'/data/root_zones.dat'); self::assertCount(15, $collection); @@ -89,7 +93,9 @@ public function testGetterProperties() self::assertFalse($collection->isEmpty()); $converter = new TLDConverter(); - $data = $converter->convert(file_get_contents(__DIR__.'/data/root_zones.dat')); + /** @var string $content */ + $content = file_get_contents(__DIR__.'/data/root_zones.dat'); + $data = $converter->convert($content); self::assertEquals($data, $collection->toArray()); foreach ($collection as $tld) { @@ -103,7 +109,7 @@ public function testGetterProperties() * @covers ::withAsciiIDNAOption * @covers ::withUnicodeIDNAOption */ - public function testwithIDNAOptions() + public function testwithIDNAOptions(): void { self::assertSame($this->collection, $this->collection->withAsciiIDNAOption( $this->collection->getAsciiIDNAOption() @@ -126,7 +132,7 @@ public function testwithIDNAOptions() * @dataProvider validDomainProvider * @param mixed $tld */ - public function testResolve($tld) + public function testResolve($tld): void { self::assertSame( (new Domain($tld))->getLabel(0), @@ -134,7 +140,7 @@ public function testResolve($tld) ); } - public function validDomainProvider() + public function validDomainProvider(): iterable { return [ 'simple domain' => ['GOOGLE.COM'], @@ -154,30 +160,30 @@ public function __toString() ]; } - public function testResolveThrowsTypeError() + public function testResolveThrowsTypeError(): void { self::expectException(TypeError::class); $this->collection->resolve(new DateTimeImmutable()); } - public function testResolveWithInvalidDomain() + public function testResolveWithInvalidDomain(): void { self::assertEquals(new Domain(), $this->collection->resolve('###')); } - public function testResolveWithUnResolvableDomain() + public function testResolveWithUnResolvableDomain(): void { $domain = 'localhost'; self::assertEquals(new Domain($domain), $this->collection->resolve($domain)); } - public function testResolveWithUnregisteredTLD() + public function testResolveWithUnregisteredTLD(): void { $collection = TopLevelDomains::createFromPath(__DIR__.'/data/root_zones.dat'); self::assertNull($collection->resolve('localhost.locale')->getPublicSuffix()); } - public function testResolveWithIDNAOptions() + public function testResolveWithIDNAOptions(): void { $resolved = $this->collection->resolve('foo.de'); self::assertSame( @@ -202,12 +208,12 @@ public function testResolveWithIDNAOptions() * @dataProvider validTldProvider * @param mixed $tld */ - public function testContainsReturnsTrue($tld) + public function testContainsReturnsTrue($tld): void { self::assertTrue($this->collection->contains($tld)); } - public function validTldProvider() + public function validTldProvider(): iterable { return [ 'simple TLD' => ['COM'], @@ -233,12 +239,12 @@ public function __toString() * @dataProvider invalidTldProvider * @param mixed $tld */ - public function testContainsReturnsFalse($tld) + public function testContainsReturnsFalse($tld): void { self::assertFalse($this->collection->contains($tld)); } - public function invalidTldProvider() + public function invalidTldProvider(): iterable { return [ 'invalid TLD (1)' => ['COMM'], From 1865f64ad6fd6b4aa9873e765999574a57b2be76 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 3 Mar 2020 16:10:45 +0100 Subject: [PATCH 182/461] Update source code to the new development requirements --- src/Cache.php | 38 +++++++++++++++----------- src/Converter.php | 1 + src/CurlHttpClient.php | 2 ++ src/Domain.php | 56 ++++++++++++++++++++++---------------- src/DomainInterface.php | 20 ++++---------- src/IDNAConverterTrait.php | 10 ++++--- src/Installer.php | 26 +++++++++++++++--- src/Logger.php | 14 ++++++++++ src/Manager.php | 10 +++---- src/PublicSuffix.php | 47 +++++++------------------------- src/Rules.php | 4 ++- src/TLDConverter.php | 7 +++-- src/TopLevelDomains.php | 20 ++++++++++---- 13 files changed, 141 insertions(+), 114 deletions(-) diff --git a/src/Cache.php b/src/Cache.php index 2e1593f6..a2ca4ce7 100644 --- a/src/Cache.php +++ b/src/Cache.php @@ -16,21 +16,20 @@ namespace Pdp; use DateInterval; +use DateTimeImmutable; use FilesystemIterator; use Generator; use InvalidArgumentException; use Psr\SimpleCache\CacheInterface; -use Traversable; use function chmod; -use function date_create_immutable; use function dirname; use function file_exists; use function file_get_contents; use function filemtime; use function get_class; use function gettype; -use function is_array; use function is_int; +use function is_iterable; use function is_object; use function is_writable; use function mkdir; @@ -83,6 +82,7 @@ final class Cache implements CacheInterface public function __construct(string $cache_path = '') { if ('' === $cache_path) { + /** @var string $cache_path */ $cache_path = realpath(dirname(__DIR__).DIRECTORY_SEPARATOR.'data'); } @@ -182,7 +182,9 @@ private function getExpireAt($ttl): int } if ($ttl instanceof DateInterval) { - return date_create_immutable('@'.time())->add($ttl)->getTimestamp(); + $now = new DateTimeImmutable('@'.time()); + + return $now->add($ttl)->getTimestamp(); } throw new CacheException(sprintf('Expected TTL to be an int, a DateInterval or null; received "%s"', is_object($ttl) ? get_class($ttl) : gettype($ttl))); @@ -218,13 +220,13 @@ public function clear() */ public function getMultiple($keys, $default = null) { - if (!is_array($keys) && !$keys instanceof Traversable) { + if (!is_iterable($keys)) { throw new CacheException('keys must be either of type array or Traversable'); } $values = []; foreach ($keys as $key) { - $values[$key] = $this->get($key) ?: $default; + $values[$key] = $this->get($key) ?? $default; } return $values; @@ -235,7 +237,7 @@ public function getMultiple($keys, $default = null) */ public function setMultiple($values, $ttl = null) { - if (!is_array($values) && !$values instanceof Traversable) { + if (!is_iterable($values)) { throw new CacheException('keys must be either of type array or Traversable'); } @@ -252,22 +254,28 @@ public function setMultiple($values, $ttl = null) /** * {@inheritdoc} */ - public function deleteMultiple($keys) + public function deleteMultiple($keys): bool { - if (!is_array($keys) && !$keys instanceof Traversable) { + if (!is_iterable($keys)) { throw new CacheException('keys must be either of type array or Traversable'); } + $successful = false; foreach ($keys as $key) { $this->validateKey($key); - $this->delete($key); + $successful = $this->delete($key); + if (false === $successful) { + break; + } } + + return $successful; } /** * {@inheritdoc} */ - public function has($key) + public function has($key): bool { return $this->get($key, $this) !== $this; } @@ -288,9 +296,6 @@ private function getPath($key): string return $this->cache_path.DIRECTORY_SEPARATOR.self::FILE_PREFIX.$key.self::FILE_EXTENSION; } - /** - * @return Generator|string[] - */ private function listPaths(): Generator { $iterator = new FilesystemIterator( @@ -298,6 +303,7 @@ private function listPaths(): Generator FilesystemIterator::CURRENT_AS_PATHNAME | FilesystemIterator::SKIP_DOTS ); + /** @var string $path */ foreach ($iterator as $path) { if (!is_dir($path)) { yield $path; @@ -310,7 +316,7 @@ private function listPaths(): Generator * * @throws CacheException */ - private function validateKey($key) + private function validateKey($key): void { if (!is_string($key)) { throw new CacheException(sprintf('Expected key to be a string; received "%s"', is_object($key) ? get_class($key) : gettype($key))); @@ -326,7 +332,7 @@ private function validateKey($key) * * @param string $path absolute directory path */ - private function mkdir($path) + private function mkdir($path): void { $parent_path = dirname($path); diff --git a/src/Converter.php b/src/Converter.php index 1e6f4516..771f23d6 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -69,6 +69,7 @@ public function convert(string $content): array $file = new SplTempFileObject(); $file->fwrite($content); $file->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); + /** @var string $line */ foreach ($file as $line) { $section = $this->getSection($section, $line); if ('' !== $section && false === strpos($line, '//')) { diff --git a/src/CurlHttpClient.php b/src/CurlHttpClient.php index 55079e91..4de9b075 100644 --- a/src/CurlHttpClient.php +++ b/src/CurlHttpClient.php @@ -65,8 +65,10 @@ public function __construct(array $options = []) */ public function getContent(string $url): string { + /** @var resource $curl */ $curl = curl_init($url); curl_setopt_array($curl, $this->options); + /** @var string $content */ $content = curl_exec($curl); $error_code = curl_errno($curl); $error_message = curl_error($curl); diff --git a/src/Domain.php b/src/Domain.php index 5d151144..66254649 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -155,11 +155,12 @@ private function setPublicSuffix(PublicSuffix $publicSuffix): PublicSuffix return $publicSuffix; } - if (!$this->isResolvable()) { + if (null === $this->domain || !$this->isResolvable()) { throw new CouldNotResolvePublicSuffix(sprintf('The domain `%s` can not contain a public suffix', $this->domain)); } $publicSuffix = $this->normalize($publicSuffix); + /** @var string $psContent */ $psContent = $publicSuffix->getContent(); if ($this->domain === $psContent) { throw new CouldNotResolvePublicSuffix(sprintf('The public suffix `%s` can not be equal to the domain name `%s`', $psContent, $this->domain)); @@ -199,6 +200,10 @@ private function normalize(PublicSuffix $subject): PublicSuffix */ private function setRegistrableDomain() { + if (null === $this->domain) { + return null; + } + if (null === $this->publicSuffix->getContent()) { return null; } @@ -216,6 +221,10 @@ private function setRegistrableDomain() */ private function setSubDomain() { + if (null === $this->domain) { + return null; + } + if (null === $this->registrableDomain) { return null; } @@ -246,7 +255,7 @@ public function getIterator() /** * {@inheritdoc} */ - public function jsonSerialize() + public function jsonSerialize(): array { return $this->__debugInfo(); } @@ -254,7 +263,7 @@ public function jsonSerialize() /** * {@inheritdoc} */ - public function __debugInfo() + public function __debugInfo(): array { return [ 'domain' => $this->domain, @@ -270,7 +279,7 @@ public function __debugInfo() /** * {@inheritdoc} */ - public function count() + public function count(): int { return count($this->labels); } @@ -278,7 +287,7 @@ public function count() /** * {@inheritdoc} */ - public function getContent() + public function getContent(): ?string { return $this->domain; } @@ -286,7 +295,7 @@ public function getContent() /** * {@inheritdoc} */ - public function __toString() + public function __toString(): string { return (string) $this->domain; } @@ -311,7 +320,7 @@ public function getDomain() /** * {@inheritdoc} */ - public function getLabel(int $key) + public function getLabel(int $key): ?string { if ($key < 0) { $key += count($this->labels); @@ -385,7 +394,7 @@ public function isTransitionalDifferent(): bool * * @return string|null registrable domain */ - public function getRegistrableDomain() + public function getRegistrableDomain(): ?string { return $this->registrableDomain; } @@ -400,7 +409,7 @@ public function getRegistrableDomain() * * @return string|null registrable domain */ - public function getSubDomain() + public function getSubDomain(): ?string { return $this->subDomain; } @@ -410,7 +419,7 @@ public function getSubDomain() * * @return string|null */ - public function getPublicSuffix() + public function getPublicSuffix(): ?string { return $this->publicSuffix->getContent(); } @@ -426,7 +435,10 @@ public function getPublicSuffix() */ public function isResolvable(): bool { - return 1 < count($this->labels) && '.' !== substr($this->domain, -1, 1); + return null !== $this->domain + && '.' !== substr($this->domain, -1, 1) + && 1 < count($this->labels) + ; } /** @@ -462,7 +474,7 @@ public function isPrivate(): bool /** * {@inheritdoc} */ - public function toAscii() + public function toAscii(): self { if (null === $this->domain) { return $this; @@ -479,7 +491,7 @@ public function toAscii() /** * {@inheritdoc} */ - public function toUnicode() + public function toUnicode(): self { if (null === $this->domain || false === strpos($this->domain, 'xn--')) { return $this; @@ -537,8 +549,6 @@ public function resolve($publicSuffix): self * otherwise the public suffix content is added to or remove from the current domain. * * @param mixed $publicSuffix - * - * @return self */ public function withPublicSuffix($publicSuffix): self { @@ -751,21 +761,21 @@ public function withoutLabel(int $key, int ...$keys): self { array_unshift($keys, $key); $nb_labels = count($this->labels); - foreach ($keys as &$key) { - if (- $nb_labels > $key || $nb_labels - 1 < $key) { - throw new InvalidLabelKey(sprintf('the key `%s` is invalid', $key)); + foreach ($keys as &$offset) { + if (- $nb_labels > $offset || $nb_labels - 1 < $offset) { + throw new InvalidLabelKey(sprintf('the key `%s` is invalid', $offset)); } - if (0 > $key) { - $key += $nb_labels; + if (0 > $offset) { + $offset += $nb_labels; } } - unset($key); + unset($offset); $deleted_keys = array_keys(array_count_values($keys)); $labels = []; - foreach ($this->labels as $key => $label) { - if (!in_array($key, $deleted_keys, true)) { + foreach ($this->labels as $offset => $label) { + if (!in_array($offset, $deleted_keys, true)) { $labels[] = $label; } } diff --git a/src/DomainInterface.php b/src/DomainInterface.php index 0954d2d1..18a7ea8b 100644 --- a/src/DomainInterface.php +++ b/src/DomainInterface.php @@ -29,17 +29,13 @@ interface DomainInterface extends Countable, IteratorAggregate { /** * Returns the domain content. - * - * @return string|null */ - public function getContent(); + public function getContent(): ?string; /** * Returns the domain content as a string. - * - * @return string */ - public function __toString(); + public function __toString(): string; /** * Retrieves a single domain label. @@ -50,10 +46,8 @@ public function __toString(); * If no label is found the submitted $key the returned value will be null. * * @param int $key the label offset - * - * @return string|null */ - public function getLabel(int $key); + public function getLabel(int $key): ?string; /** * Returns the associated key for each label. @@ -74,10 +68,8 @@ public function keys(string $label): array; * an instance with its content converted to its IDNA ASCII form * * @throws Exception if the domain can not be converted to ASCII using IDN UTS46 algorithm - * - * @return static */ - public function toAscii(); + public function toAscii(): self; /** * Converts the domain to its IDNA UTF8 form. @@ -86,10 +78,8 @@ public function toAscii(); * an instance with its content converted to its IDNA UTF8 form * * @throws Exception if the domain can not be converted to Unicode using IDN UTS46 algorithm - * - * @return static */ - public function toUnicode(); + public function toUnicode(): self; /** diff --git a/src/IDNAConverterTrait.php b/src/IDNAConverterTrait.php index 24ae7411..08a9306c 100644 --- a/src/IDNAConverterTrait.php +++ b/src/IDNAConverterTrait.php @@ -20,6 +20,7 @@ use UnexpectedValueException; use function array_reverse; use function explode; +use function filter_var; use function gettype; use function idn_to_ascii; use function idn_to_utf8; @@ -59,11 +60,11 @@ trait IDNAConverterTrait /** * Get and format IDN conversion error message. * - * @param int $error_bit + * @param int $error_byte * * @return string */ - private static function getIdnErrors(int $error_bit): string + private static function getIdnErrors(int $error_byte): string { /** * IDNA errors. @@ -88,7 +89,7 @@ private static function getIdnErrors(int $error_bit): string $res = []; foreach ($idn_errors as $error => $reason) { - if ($error_bit & $error) { + if ($error === ($error_byte & $error)) { $res[] = $reason; } } @@ -248,7 +249,8 @@ private function parse($domain = null, int $asciiOption = 0, int $unicodeOption } $domain = (string) $domain; - if (filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { + $res = filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); + if (false !== $res) { throw new InvalidDomain(sprintf('The domain `%s` is invalid: this is an IPv4 host', $domain)); } diff --git a/src/Installer.php b/src/Installer.php index 23413879..7dbccbd9 100644 --- a/src/Installer.php +++ b/src/Installer.php @@ -160,7 +160,7 @@ private function execute(array $arguments = []): bool * Script to update the local cache using composer hook. * @param null|Event $event */ - public static function updateLocalCache(Event $event = null) + public static function updateLocalCache(Event $event = null): void { $io = self::getIO($event); if (!extension_loaded('curl')) { @@ -216,15 +216,33 @@ public static function updateLocalCache(Event $event = null) private static function getIO(Event $event = null) { return null !== $event ? $event->getIO() : new class() { - public function write($messages, bool $newline = true, int $verbosity = 2) + /** + * @param string|string[] $messages + * @param bool $newline + * @param int $verbosity + */ + public function write($messages, bool $newline = true, int $verbosity = 2): void { $this->doWrite($messages, $newline, false, $verbosity); } - public function writeError($messages, bool $newline = true, int $verbosity = 2) + + /** + * @param string|string[] $messages + * @param bool $newline + * @param int $verbosity + */ + public function writeError($messages, bool $newline = true, int $verbosity = 2): void { $this->doWrite($messages, $newline, true, $verbosity); } - private function doWrite($messages, bool $newline, bool $stderr, int $verbosity) + + /** + * @param string|string[] $messages + * @param bool $newline + * @param bool $stderr + * @param int $verbosity + */ + private function doWrite($messages, bool $newline, bool $stderr, int $verbosity): void { fwrite( $stderr ? STDERR : STDOUT, diff --git a/src/Logger.php b/src/Logger.php index fdff16e8..b3da233d 100644 --- a/src/Logger.php +++ b/src/Logger.php @@ -17,7 +17,9 @@ use Psr\Log\AbstractLogger; use Psr\Log\LogLevel; +use TypeError; use function fwrite; +use function is_resource; use const PHP_EOL; use const STDERR; use const STDOUT; @@ -43,8 +45,20 @@ final class Logger extends AbstractLogger */ private $error; + /** + * @param mixed $out a resource default to PHP STDOUT + * @param mixed $error a resource default to PHP STDERR + */ public function __construct($out = STDOUT, $error = STDERR) { + if (!is_resource($out)) { + throw new TypeError('The output logger should be a resource.'); + } + + if (!is_resource($error)) { + throw new TypeError('The error output logger channel should be a resource.'); + } + $this->out = $out; $this->error = $error; } diff --git a/src/Manager.php b/src/Manager.php index 1bf424f1..b4055763 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -21,7 +21,6 @@ use Pdp\Exception\CouldNotLoadRules; use Pdp\Exception\CouldNotLoadTLDs; use Psr\SimpleCache\CacheInterface; -use Psr\SimpleCache\InvalidArgumentException as SimpleCacheException; use TypeError; use function filter_var; use function gettype; @@ -90,7 +89,6 @@ public function __construct(CacheInterface $cache, HttpClient $http, $ttl = null * @param int $asciiIDNAOption * @param int $unicodeIDNAOption * - * @throws SimpleCacheException * @throws CouldNotLoadRules * * @return Rules @@ -126,7 +124,6 @@ public function getRules( * @param string $url the Public Suffix List URL * @param null|mixed $ttl the cache TTL * - * @throws SimpleCacheException * @throws HttpClientException * * @return bool @@ -149,7 +146,6 @@ public function refreshRules(string $url = self::PSL_URL, $ttl = null): bool * @param int $asciiIDNAOption * @param int $unicodeIDNAOption * - * @throws SimpleCacheException * @throws CouldNotLoadTLDs * * @return TopLevelDomains @@ -179,10 +175,13 @@ public function getTLDs( throw new CouldNotLoadTLDs('The root zone database cache content is corrupted'); } + /** @var DateTimeImmutable $modifiedDate */ + $modifiedDate = DateTimeImmutable::createFromFormat(DATE_ATOM, $data['modifiedDate']); + return new TopLevelDomains( $data['records'], $data['version'], - DateTimeImmutable::createFromFormat(DATE_ATOM, $data['modifiedDate']), + $modifiedDate, $asciiIDNAOption, $unicodeIDNAOption ); @@ -196,7 +195,6 @@ public function getTLDs( * @param string $url the IANA Root Zone Database URL * @param null|mixed $ttl the cache TTL * - * @throws SimpleCacheException * @throws HttpClientException * * @return bool diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 7112135b..d586d0ae 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -80,7 +80,6 @@ final class PublicSuffix implements DomainInterface, JsonSerializable, PublicSuf private $isTransitionalDifferent; /** - * New instance. * @param mixed $publicSuffix * @param string $section * @param int $asciiIDNAOption @@ -116,10 +115,7 @@ public static function __set_state(array $properties): self /** * Create an new instance from a Domain object. - * * @param Domain $domain - * - * @return self */ public static function createFromDomain(Domain $domain): self { @@ -142,10 +138,8 @@ public static function createFromDomain(Domain $domain): self * Set the public suffix content. * * @throws InvalidDomain if the public suffix is invalid - * - * @return string|null */ - private function setPublicSuffix() + private function setPublicSuffix(): ?string { if ([] === $this->labels) { return null; @@ -162,11 +156,8 @@ private function setPublicSuffix() /** * Set the public suffix section. * - * @param string $section - * + * @param string $section * @throws CouldNotResolvePublicSuffix if the submitted section is not supported - * - * @return string */ private function setSection(string $section): string { @@ -194,7 +185,7 @@ public function getIterator() /** * {@inheritdoc} */ - public function jsonSerialize() + public function jsonSerialize(): array { return $this->__debugInfo(); } @@ -202,7 +193,7 @@ public function jsonSerialize() /** * {@inheritdoc} */ - public function __debugInfo() + public function __debugInfo(): array { return [ 'publicSuffix' => $this->publicSuffix, @@ -215,7 +206,7 @@ public function __debugInfo() /** * {@inheritdoc} */ - public function count() + public function count(): int { return count($this->labels); } @@ -223,7 +214,7 @@ public function count() /** * {@inheritdoc} */ - public function getContent() + public function getContent(): ?string { return $this->publicSuffix; } @@ -231,7 +222,7 @@ public function getContent() /** * {@inheritdoc} */ - public function __toString() + public function __toString(): string { return (string) $this->publicSuffix; } @@ -239,7 +230,7 @@ public function __toString() /** * {@inheritdoc} */ - public function getLabel(int $key) + public function getLabel(int $key): ?string { if ($key < 0) { $key += count($this->labels); @@ -270,8 +261,6 @@ public function labels(): array * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php - * - * @return int */ public function getAsciiIDNAOption(): int { @@ -284,8 +273,6 @@ public function getAsciiIDNAOption(): int * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php - * - * @return int */ public function getUnicodeIDNAOption(): int { @@ -296,8 +283,6 @@ public function getUnicodeIDNAOption(): int * Returns true if domain contains deviation characters. * * @see http://unicode.org/reports/tr46/#Transition_Considerations - * - * @return bool */ public function isTransitionalDifferent(): bool { @@ -306,8 +291,6 @@ public function isTransitionalDifferent(): bool /** * Tells whether the public suffix has a matching rule in a Public Suffix List. - * - * @return bool */ public function isKnown(): bool { @@ -316,8 +299,6 @@ public function isKnown(): bool /** * Tells whether the public suffix has a matching rule in a Public Suffix List ICANN Section. - * - * @return bool */ public function isICANN(): bool { @@ -326,8 +307,6 @@ public function isICANN(): bool /** * Tells whether the public suffix has a matching rule in a Public Suffix List Private Section. - * - * @return bool */ public function isPrivate(): bool { @@ -337,7 +316,7 @@ public function isPrivate(): bool /** * {@inheritdoc} */ - public function toAscii() + public function toAscii(): self { if (null === $this->publicSuffix) { return $this; @@ -354,7 +333,7 @@ public function toAscii() /** * {@inheritdoc} */ - public function toUnicode() + public function toUnicode(): self { if (null === $this->publicSuffix || false === strpos($this->publicSuffix, 'xn--')) { return $this; @@ -374,10 +353,7 @@ public function toUnicode() * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php - * * @param int $option - * - * @return self */ public function withAsciiIDNAOption(int $option): self { @@ -394,10 +370,7 @@ public function withAsciiIDNAOption(int $option): self * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php - * * @param int $option - * - * @return self */ public function withUnicodeIDNAOption(int $option): self { diff --git a/src/Rules.php b/src/Rules.php index df7b9629..b54422fa 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -102,10 +102,12 @@ public static function createFromPath( $args[] = $context; } - if (!($resource = @fopen(...$args))) { + $resource = @fopen(...$args); + if (false === $resource) { throw new CouldNotLoadRules(sprintf('`%s`: failed to open stream: No such file or directory', $path)); } + /** @var string $content */ $content = stream_get_contents($resource); fclose($resource); diff --git a/src/TLDConverter.php b/src/TLDConverter.php index 1bf7a766..f8ace8f0 100644 --- a/src/TLDConverter.php +++ b/src/TLDConverter.php @@ -53,6 +53,7 @@ public function convert(string $content): array $file = new SplTempFileObject(); $file->fwrite($content); $file->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); + /** @var string $line */ foreach ($file as $line) { $line = trim($line); if ([] === $data) { @@ -91,10 +92,12 @@ private function extractHeader(string $content): array throw new CouldNotLoadTLDs(sprintf('Invalid Version line: %s', $content)); } + /** @var DateTimeImmutable $date */ + $date = DateTimeImmutable::createFromFormat(self::IANA_DATE_FORMAT, $matches['date']); + return [ 'version' => $matches['version'], - 'modifiedDate' => DateTimeImmutable::createFromFormat(self::IANA_DATE_FORMAT, $matches['date']) - ->format(DATE_ATOM), + 'modifiedDate' => $date->format(DATE_ATOM), ]; } diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 906d5249..315fa748 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -75,9 +75,13 @@ public function __construct( int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT ) { + if ($modifiedDate instanceof DateTime) { + $modifiedDate = DateTimeImmutable::createFromMutable($modifiedDate); + } + $this->records = $records; $this->version = $version; - $this->modifiedDate = $modifiedDate instanceof DateTime ? DateTimeImmutable::createFromMutable($modifiedDate) : $modifiedDate; + $this->modifiedDate = $modifiedDate; $this->asciiIDNAOption = $asciiIDNAOption; $this->unicodeIDNAOption = $unicodeIDNAOption; } @@ -105,10 +109,12 @@ public static function createFromPath( $args[] = $context; } - if (!($resource = @fopen(...$args))) { + $resource = @fopen(...$args); + if (false === $resource) { throw new CouldNotLoadTLDs(sprintf('`%s`: failed to open stream: No such file or directory', $path)); } + /** @var string $content */ $content = stream_get_contents($resource); fclose($resource); @@ -134,11 +140,13 @@ public static function createFromString( $converter = $converter ?? new TLDConverter(); $data = $converter->convert($content); + /** @var DateTimeImmutable $modifiedDate */ + $modifiedDate = DateTimeImmutable::createFromFormat(DATE_ATOM, $data['modifiedDate']); return new self( $data['records'], $data['version'], - DateTimeImmutable::createFromFormat(DATE_ATOM, $data['modifiedDate']), + $modifiedDate, $asciiIDNAOption, $unicodeIDNAOption ); @@ -209,7 +217,7 @@ public function getUnicodeIDNAOption(): int /** * {@inheritdoc} */ - public function count() + public function count(): int { return count($this->records); } @@ -275,8 +283,8 @@ public function contains($tld): bool } $label = $tld->toAscii()->getLabel(0); - foreach ($this as $tld) { - if ($tld->getContent() === $label) { + foreach ($this as $knownTld) { + if ($knownTld->getContent() === $label) { return true; } } From 083c9fc0d7b1c23657861b5d8845e0c25ea178e3 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 3 Mar 2020 16:13:29 +0100 Subject: [PATCH 183/461] Update travis settings --- .travis.yml | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/.travis.yml b/.travis.yml index 620cb1b9..4fff8e9d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,32 +12,24 @@ env: matrix: include: - - php: 7.0 - env: - - VALIDATE_CODING_STYLE=false - - RUN_PHPSTAN=false - - IGNORE_PLATFORMS=false - - php: 7.1 - env: - - VALIDATE_CODING_STYLE=false - - RUN_PHPSTAN=false - - IGNORE_PLATFORMS=false - php: 7.2 env: + - COLLECT_COVERAGE=true - VALIDATE_CODING_STYLE=true - RUN_PHPSTAN=true - IGNORE_PLATFORMS=false - php: 7.3 env: - - VALIDATE_CODING_STYLE=false - - RUN_PHPSTAN=false - - IGNORE_PLATFORMS=true + - COLLECT_COVERAGE=true + - VALIDATE_CODING_STYLE=true + - RUN_PHPSTAN=true + - IGNORE_PLATFORMS=false - php: 7.4 env: - - COLLECT_COVERAGE=false - - VALIDATE_CODING_STYLE=false - - RUN_PHPSTAN=false - - IGNORE_PLATFORMS=true + - COLLECT_COVERAGE=true + - VALIDATE_CODING_STYLE=true + - RUN_PHPSTAN=true + - IGNORE_PLATFORMS=false - php: nightly env: - COLLECT_COVERAGE=false From 4560167a96dd6ae6b7e74ed869ea5d4eaa5f254d Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 3 Mar 2020 18:24:03 +0100 Subject: [PATCH 184/461] Bugfix Interface return type --- src/Domain.php | 4 ++-- src/PublicSuffix.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 66254649..55c218dc 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -474,7 +474,7 @@ public function isPrivate(): bool /** * {@inheritdoc} */ - public function toAscii(): self + public function toAscii(): DomainInterface { if (null === $this->domain) { return $this; @@ -491,7 +491,7 @@ public function toAscii(): self /** * {@inheritdoc} */ - public function toUnicode(): self + public function toUnicode(): DomainInterface { if (null === $this->domain || false === strpos($this->domain, 'xn--')) { return $this; diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index d586d0ae..809cb70c 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -316,7 +316,7 @@ public function isPrivate(): bool /** * {@inheritdoc} */ - public function toAscii(): self + public function toAscii(): DomainInterface { if (null === $this->publicSuffix) { return $this; @@ -333,7 +333,7 @@ public function toAscii(): self /** * {@inheritdoc} */ - public function toUnicode(): self + public function toUnicode(): DomainInterface { if (null === $this->publicSuffix || false === strpos($this->publicSuffix, 'xn--')) { return $this; From 9319e5bdd86ceea18a83dc337934cad9c1eba2f1 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 3 Mar 2020 19:37:58 +0100 Subject: [PATCH 185/461] Improve codebase against PHPStan results --- phpstan.src.neon | 6 ++++++ src/Domain.php | 10 ++++++++-- tests/DomainTest.php | 6 +++++- tests/PublicSuffixTest.php | 1 + 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/phpstan.src.neon b/phpstan.src.neon index 00a3244b..c0694c59 100644 --- a/phpstan.src.neon +++ b/phpstan.src.neon @@ -6,6 +6,12 @@ parameters: ignoreErrors: - message: '#Call to function is_iterable\(\) with iterable will always evaluate to true.#' path: src/Cache.php + - message: '#Call to function is_string\(\) with string will always evaluate to true.#' + path: src/Cache.php + - message: '#Call to function is_object\(\) with \*NEVER\* will always evaluate to true.#' + path: src/Cache.php + - message: '#Else branch is unreachable because ternary operator condition is always true.#' + path: src/Cache.php - message: '#Property Pdp\\TopLevelDomains::\$modifiedDate \(DateTimeImmutable\) does not accept DateTimeInterface.#' path: src/TopLevelDomains.php reportUnmatchedIgnoredErrors: true diff --git a/src/Domain.php b/src/Domain.php index 55c218dc..2589c9f4 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -187,10 +187,16 @@ private function normalize(PublicSuffix $subject): PublicSuffix } if (1 !== preg_match(self::REGEXP_IDN_PATTERN, $this->domain)) { - return $subject->toAscii(); + /** @var PublicSuffix $result */ + $result = $subject->toAscii(); + + return $result; } - return $subject->toUnicode(); + /** @var PublicSuffix $result */ + $result = $subject->toUnicode(); + + return $result; } /** diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 24eac38e..8b8d5fa0 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -30,7 +30,7 @@ use const IDNA_NONTRANSITIONAL_TO_UNICODE; /** - * @coversDefaultClass Pdp\Domain + * @coversDefaultClass \Pdp\Domain */ class DomainTest extends TestCase { @@ -239,6 +239,7 @@ public function testToIDN( self::assertSame($expectedDomain, $domain->getDomain()); self::assertSame($expectedSuffix, $domain->getPublicSuffix()); + /** @var Domain $domainIDN */ $domainIDN = $domain->toUnicode(); self::assertSame($expectedIDNDomain, $domainIDN->getDomain()); self::assertSame($expectedIDNSuffix, $domainIDN->getPublicSuffix()); @@ -339,6 +340,7 @@ public function testToAscii( self::assertSame($expectedDomain, $domain->getDomain()); self::assertSame($expectedSuffix, $domain->getPublicSuffix()); + /** @var Domain $domainIDN */ $domainIDN = $domain->toAscii(); self::assertSame($expectedAsciiDomain, $domainIDN->getDomain()); self::assertSame($expectedAsciiSuffix, $domainIDN->getPublicSuffix()); @@ -1114,11 +1116,13 @@ public function testInstanceCreationWithCustomIDNAOptions(): void IDNA_NONTRANSITIONAL_TO_UNICODE ); + /** @var Domain $instance */ $instance = $domain->toAscii(); self::assertSame( [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] ); + /** @var Domain $instance */ $instance = $domain->toUnicode(); self::assertSame( [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 4e84e173..e61f6e61 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -299,6 +299,7 @@ public function testResolveWithCustomIDNAOptions( self::assertSame($expectedContent, $publicSuffix->getContent()); self::assertSame($expectedAscii, $publicSuffix->toAscii()->getContent()); self::assertSame($expectedUnicode, $publicSuffix->toUnicode()->getContent()); + /** @var PublicSuffix $instance */ $instance = $publicSuffix->toUnicode(); self::assertSame( [$publicSuffix->getAsciiIDNAOption(), $publicSuffix->getUnicodeIDNAOption()], From 8247f98f2bfa3922a0af71e018d5fb713dad316b Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 6 Mar 2020 05:31:01 +0100 Subject: [PATCH 186/461] Improve CI/CD travis settings --- .travis.yml | 103 +++++++++++++++++++++++++++----------------------- README.md | 2 +- composer.json | 11 ++++-- 3 files changed, 63 insertions(+), 53 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4fff8e9d..fbd4839b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,56 +1,63 @@ language: php - sudo: false - cache: - directories: - - $HOME/.composer/cache - -env: - global: - - COMPOSER_ARGS="--no-interaction --prefer-source --no-suggest" - + directories: + - "$HOME/.composer/cache" matrix: - include: - - php: 7.2 - env: - - COLLECT_COVERAGE=true - - VALIDATE_CODING_STYLE=true - - RUN_PHPSTAN=true - - IGNORE_PLATFORMS=false - - php: 7.3 - env: - - COLLECT_COVERAGE=true - - VALIDATE_CODING_STYLE=true - - RUN_PHPSTAN=true - - IGNORE_PLATFORMS=false - - php: 7.4 - env: - - COLLECT_COVERAGE=true - - VALIDATE_CODING_STYLE=true - - RUN_PHPSTAN=true - - IGNORE_PLATFORMS=false - - php: nightly - env: - - COLLECT_COVERAGE=false - - IGNORE_PLATFORMS=true - - RUN_PHPSTAN=false - - VALIDATE_CODING_STYLE=false - allow_failures: - - php: nightly - fast_finish: true - + include: + - php: 7.2 + env: + - COLLECT_COVERAGE=false + - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source --prefer-lowest --prefer-stable" + - RUN_PHPSTAN=false + - VALIDATE_CODING_STYLE=false + - php: 7.2 + env: + - COLLECT_COVERAGE=true + - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source" + - RUN_PHPSTAN=true + - VALIDATE_CODING_STYLE=true + - php: 7.3 + env: + - COLLECT_COVERAGE=false + - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source --prefer-lowest --prefer-stable" + - RUN_PHPSTAN=false + - VALIDATE_CODING_STYLE=false + - php: 7.3 + env: + - COLLECT_COVERAGE=true + - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source" + - RUN_PHPSTAN=true + - VALIDATE_CODING_STYLE=true + - php: 7.4 + env: + - COLLECT_COVERAGE=false + - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source --prefer-lowest --prefer-stable" + - RUN_PHPSTAN=false + - VALIDATE_CODING_STYLE=false + - php: 7.4 + env: + - COLLECT_COVERAGE=true + - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source" + - RUN_PHPSTAN=true + - VALIDATE_CODING_STYLE=true + - php: nightly + env: + - COLLECT_COVERAGE=false + - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source --ignore-platform-reqs" + - RUN_PHPSTAN=false + - VALIDATE_CODING_STYLE=false + allow_failures: + - php: nightly + fast_finish: true before_install: - - travis_retry composer self-update - + - travis_retry composer self-update install: - - if [ "$IGNORE_PLATFORMS" == "true" ]; then travis_retry composer update $COMPOSER_ARGS --ignore-platform-reqs; fi - - if [ "$IGNORE_PLATFORMS" == "false" ]; then travis_retry composer update $COMPOSER_ARGS; fi - + - travis_retry composer update $COMPOSER_ARGS script: - - if [ "$RUN_PHPSTAN" == "true" ]; then composer phpstan; fi - - if [ "$VALIDATE_CODING_STYLE" == "true" ]; then composer phpcs; fi - - composer phpunit - + - if [ "$VALIDATE_CODING_STYLE" == "true" ]; then composer phpcs; fi + - if [ "$RUN_PHPSTAN" == "true" ]; then composer phpstan; fi + - composer phpunit after_script: - - if [ "$COLLECT_COVERAGE" == "true" ]; then wget https://scrutinizer-ci.com/ocular.phar && php ocular.phar code-coverage:upload --format=php-clover build/clover.xml; fi + - if [ "$COLLECT_COVERAGE" == "true" ]; then wget https://scrutinizer-ci.com/ocular.phar + && php ocular.phar code-coverage:upload --format=php-clover build/clover.xml; fi diff --git a/README.md b/README.md index ab69797f..7461b4c4 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ System Requirements You need: -- **PHP >= 7.0** but the latest stable version of PHP is recommended +- **PHP >= 7.2.5** but the latest stable version of PHP is recommended - the `intl` extension Dependencies diff --git a/composer.json b/composer.json index 8a7ea962..efa1169e 100644 --- a/composer.json +++ b/composer.json @@ -28,13 +28,16 @@ ], "keywords": [ "Public Suffix List", + "Top Level Domains", "domain parsing", "icann", + "iana", "idn", + "tld", "psl" ], "require": { - "php": "^7.2", + "php": "^7.2.5", "ext-intl": "*", "psr/log": "^1.1", "psr/simple-cache": "^1.0.1" @@ -42,16 +45,16 @@ "require-dev": { "composer/composer": "^1.6", "friendsofphp/php-cs-fixer": "^2.16", - "mikey179/vfsstream": "^1.6", + "mikey179/vfsstream": "^1.6.7", "phpstan/phpstan": "^0.12", "phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^8.0" }, "suggest": { "psr/simple-cache-implementation": "To enable using other cache providers", "ext-curl": "To use the package http client", - "league/uri-parser": "To parse URL and validate host" + "league/uri": "To parse URL and validate host" }, "autoload": { "psr-4": { From b8dc76cd035d309152388f6f59a19f9284b9f18e Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 14 Mar 2020 19:35:35 +0100 Subject: [PATCH 187/461] Adding methods to improve Rules public API --- src/Rules.php | 69 ++++++++++++++++++++++++++++++++++++++++----- tests/RulesTest.php | 18 ++++++++++++ 2 files changed, 80 insertions(+), 7 deletions(-) diff --git a/src/Rules.php b/src/Rules.php index b54422fa..5a039233 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -211,19 +211,74 @@ public function resolve($domain, string $section = self::ALL_DOMAINS): Domain { $section = $this->validateSection($section); try { - $domain = $domain instanceof Domain - ? $domain - : new Domain($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); - if (!$domain->isResolvable()) { - return $domain; + if ('' === $section) { + return $this->cookieResolve($domain); + } elseif (self::ICANN_DOMAINS === $section) { + return $this->icannResolve($domain); } - return $domain->resolve($this->findPublicSuffix($domain, $section)); - } catch (Exception $e) { + return $this->privateResolve($domain); + } catch (CouldNotResolvePublicSuffix $exception) { + return new Domain($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); + } catch (Exception $exception) { return new Domain(null, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); } } + /** + * Returns PSL info for a given domain against the PSL rules for cookie domain detection. + * + * @param mixed $domain the domain value + */ + public function cookieResolve($domain): Domain + { + $domain = $this->validateDomain($domain); + + return $domain->resolve($this->findPublicSuffix($domain, '')); + } + + /** + * Returns PSL info for a given domain against the PSL rules for ICANN domain detection. + * + * @param mixed $domain + */ + public function icannResolve($domain): Domain + { + $domain = $this->validateDomain($domain); + + return $domain->resolve($this->findPublicSuffix($domain, self::ICANN_DOMAINS)); + } + + /** + * Returns PSL info for a given domain against the PSL rules for private domain detection. + * + * @param mixed $domain + */ + public function privateResolve($domain): Domain + { + $domain = $this->validateDomain($domain); + + return $domain->resolve($this->findPublicSuffix($domain, self::PRIVATE_DOMAINS)); + } + + /** + * Returns PSL info for a given domain. + * + * @param mixed $domain + */ + private function validateDomain($domain): Domain + { + if (!($domain instanceof Domain)) { + $domain = new Domain($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); + } + + if (!$domain->isResolvable()) { + throw new CouldNotResolvePublicSuffix(sprintf('The domain `%s` can not contain a public suffix', $domain->getContent())); + } + + return $domain; + } + /** * Assert the section status. * diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 741ef9af..8d6b136e 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -114,6 +114,10 @@ public function testwithIDNAOptions(): void /** * @covers ::resolve + * @covers ::cookieResolve + * @covers ::icannResolve + * @covers ::privateResolve + * @covers ::validateDomain * @covers ::validateSection * @covers \Pdp\Domain::isResolvable * @covers \Pdp\PublicSuffix::setSection @@ -191,6 +195,8 @@ public function testIsSuffixValidTrue(): void /** * @covers ::resolve + * @covers ::cookieResolve + * @covers ::validateDomain * @covers ::validateSection * @covers \Pdp\Domain::isResolvable * @covers ::findPublicSuffix @@ -215,6 +221,8 @@ public function testIsSuffixValidFalseWithPunycoded(): void /** * @covers ::resolve + * @covers ::icannResolve + * @covers ::validateDomain * @covers ::validateSection * @covers \Pdp\Domain::isResolvable * @covers ::findPublicSuffix @@ -239,6 +247,8 @@ public function testSubDomainIsNull(): void /** * @covers ::resolve + * @covers ::cookieResolve + * @covers ::validateDomain * @covers ::validateSection * @covers \Pdp\IDNAConverterTrait::parse */ @@ -281,6 +291,8 @@ public function testWithAbsoluteHostInvalid(): void /** * @covers ::resolve + * @covers ::privateResolve + * @covers ::validateDomain * @covers ::validateSection * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection @@ -299,6 +311,8 @@ public function testWithPrivateDomainInvalid(): void /** * @covers ::resolve + * @covers ::privateResolve + * @covers ::validateDomain * @covers ::validateSection * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection @@ -367,6 +381,8 @@ public function testWithDomainInterfaceObject(): void /** * @covers ::resolve + * @covers ::icannResolve + * @covers ::validateDomain * @covers \Pdp\Domain::setRegistrableDomain * @covers \Pdp\Domain::getRegistrableDomain * @dataProvider parseDataProvider @@ -383,6 +399,8 @@ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $dom /** * @covers ::resolve + * @covers ::icannResolve + * @covers ::validateDomain * @covers \Pdp\IDNAConverterTrait::parse * @covers \Pdp\Domain::setPublicSuffix * @covers \Pdp\Domain::getPublicSuffix From d033912e7f60014b781362f311bece60c46a2f2d Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 14 Mar 2020 19:43:26 +0100 Subject: [PATCH 188/461] #263 Improve Rules public API --- src/Rules.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Rules.php b/src/Rules.php index 5a039233..4ca2a52c 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -17,6 +17,7 @@ use Pdp\Exception\CouldNotLoadRules; use Pdp\Exception\CouldNotResolvePublicSuffix; +use Pdp\Exception\InvalidDomain; use function array_reverse; use function count; use function fclose; @@ -104,7 +105,7 @@ public static function createFromPath( $resource = @fopen(...$args); if (false === $resource) { - throw new CouldNotLoadRules(sprintf('`%s`: failed to open stream: No such file or directory', $path)); + throw new CouldNotLoadRules(sprintf('`%s`: failed to open stream: No such file or directory.', $path)); } /** @var string $content */ @@ -193,7 +194,7 @@ public function getPublicSuffix($domain, string $section = self::ALL_DOMAINS): P } if (!$domain->isResolvable()) { - throw new CouldNotResolvePublicSuffix(sprintf('The domain `%s` can not contain a public suffix', $domain->getContent())); + throw new CouldNotResolvePublicSuffix(sprintf('The domain `%s` can not contain a public suffix.', $domain->getContent())); } return PublicSuffix::createFromDomain($domain->resolve($this->findPublicSuffix($domain, $section))); @@ -262,9 +263,12 @@ public function privateResolve($domain): Domain } /** - * Returns PSL info for a given domain. + * Assert the domain is valid and is resolvable. * * @param mixed $domain + * + * @throws InvalidDomain if the domain is invalid + * @throws CouldNotResolvePublicSuffix if the domain is not resolvable */ private function validateDomain($domain): Domain { @@ -273,7 +277,7 @@ private function validateDomain($domain): Domain } if (!$domain->isResolvable()) { - throw new CouldNotResolvePublicSuffix(sprintf('The domain `%s` can not contain a public suffix', $domain->getContent())); + throw new CouldNotResolvePublicSuffix(sprintf('The domain `%s` can not contain a public suffix.', $domain->getContent())); } return $domain; @@ -298,7 +302,7 @@ private function validateSection(string $section): string return $section; } - throw new CouldNotResolvePublicSuffix(sprintf('%s is an unknown Public Suffix List section', $section)); + throw new CouldNotResolvePublicSuffix(sprintf('%s is an unknown Public Suffix List section.', $section)); } /** From 4199b3c5c2a8c0aacf76cbc2d6749495b4f3f730 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 14 Mar 2020 19:47:44 +0100 Subject: [PATCH 189/461] Update CHANGELOG --- CHANGELOG.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d78c53f1..aaa39342 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,28 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in this file +## Next - TBD + +### Added + +- `Rules::icannResolve` +- `Rules::cookieResolve` +- `Rules::privateResolve` + + +### Fixed + +- Improve type hinting and return type by dropping EOL PHP versions support. +- Improve development environment by dropping EOL PHP versions support. + +### Deprecated + +- None + +### Removed + +- Support for PHP7.0 and PHP7.1 + ## 5.6.0 - 2019-12-29 ### Added From 31463b42d470439625cc2f0d3c14b43873599698 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 17 Mar 2020 07:25:47 +0100 Subject: [PATCH 190/461] Rename alias method for better UX --- CHANGELOG.md | 8 ++--- src/Domain.php | 2 +- src/Exception/CouldNotResolvePublicSuffix.php | 29 +++++++++++++++++++ src/Rules.php | 21 +++++++++----- tests/RulesTest.php | 20 ++++++------- 5 files changed, 58 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aaa39342..bb9887cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,10 +6,10 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in ### Added -- `Rules::icannResolve` -- `Rules::cookieResolve` -- `Rules::privateResolve` - +- `Rules::resolveCookieDomain` +- `Rules::resolveICANNDomain` +- `Rules::resolvePrivateDomain` +- `CouldNotResolvePublicSuffix::dueToUnresolvableDomain` ### Fixed diff --git a/src/Domain.php b/src/Domain.php index 2589c9f4..e7b75c60 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -156,7 +156,7 @@ private function setPublicSuffix(PublicSuffix $publicSuffix): PublicSuffix } if (null === $this->domain || !$this->isResolvable()) { - throw new CouldNotResolvePublicSuffix(sprintf('The domain `%s` can not contain a public suffix', $this->domain)); + throw CouldNotResolvePublicSuffix::dueToUnresolvableDomain($this); } $publicSuffix = $this->normalize($publicSuffix); diff --git a/src/Exception/CouldNotResolvePublicSuffix.php b/src/Exception/CouldNotResolvePublicSuffix.php index f1d6dab7..b6b18d0e 100644 --- a/src/Exception/CouldNotResolvePublicSuffix.php +++ b/src/Exception/CouldNotResolvePublicSuffix.php @@ -15,8 +15,37 @@ namespace Pdp\Exception; +use Pdp\Domain; use Pdp\Exception as BaseException; +use function sprintf; class CouldNotResolvePublicSuffix extends BaseException { + /** + * @var Domain|null + */ + private $domain; + + public static function dueToUnresolvableDomain(?Domain $domain): self + { + $content = $domain; + if (null !== $domain) { + $content = $domain->getContent(); + } + + $exception = new self(sprintf('The domain `%s` can not contain a public suffix.', $content)); + $exception->domain = $domain; + + return $exception; + } + + public function hasDomain(): bool + { + return null !== $this->domain; + } + + public function getDomain(): ?Domain + { + return $this->domain; + } } diff --git a/src/Rules.php b/src/Rules.php index 4ca2a52c..bf5401e4 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -213,13 +213,20 @@ public function resolve($domain, string $section = self::ALL_DOMAINS): Domain $section = $this->validateSection($section); try { if ('' === $section) { - return $this->cookieResolve($domain); + return $this->resolveCookieDomain($domain); } elseif (self::ICANN_DOMAINS === $section) { - return $this->icannResolve($domain); + return $this->resolveICANNDomain($domain); } - return $this->privateResolve($domain); + return $this->resolvePrivateDomain($domain); } catch (CouldNotResolvePublicSuffix $exception) { + if ($exception->hasDomain()) { + /** @var Domain */ + $domain = $exception->getDomain(); + + return $domain; + } + return new Domain($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); } catch (Exception $exception) { return new Domain(null, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); @@ -231,7 +238,7 @@ public function resolve($domain, string $section = self::ALL_DOMAINS): Domain * * @param mixed $domain the domain value */ - public function cookieResolve($domain): Domain + public function resolveCookieDomain($domain): Domain { $domain = $this->validateDomain($domain); @@ -243,7 +250,7 @@ public function cookieResolve($domain): Domain * * @param mixed $domain */ - public function icannResolve($domain): Domain + public function resolveICANNDomain($domain): Domain { $domain = $this->validateDomain($domain); @@ -255,7 +262,7 @@ public function icannResolve($domain): Domain * * @param mixed $domain */ - public function privateResolve($domain): Domain + public function resolvePrivateDomain($domain): Domain { $domain = $this->validateDomain($domain); @@ -277,7 +284,7 @@ private function validateDomain($domain): Domain } if (!$domain->isResolvable()) { - throw new CouldNotResolvePublicSuffix(sprintf('The domain `%s` can not contain a public suffix.', $domain->getContent())); + throw CouldNotResolvePublicSuffix::dueToUnresolvableDomain($domain); } return $domain; diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 8d6b136e..27042633 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -114,9 +114,9 @@ public function testwithIDNAOptions(): void /** * @covers ::resolve - * @covers ::cookieResolve - * @covers ::icannResolve - * @covers ::privateResolve + * @covers ::resolveCookieDomain + * @covers ::resolveICANNDomain + * @covers ::resolvePrivateDomain * @covers ::validateDomain * @covers ::validateSection * @covers \Pdp\Domain::isResolvable @@ -195,7 +195,7 @@ public function testIsSuffixValidTrue(): void /** * @covers ::resolve - * @covers ::cookieResolve + * @covers ::resolveCookieDomain * @covers ::validateDomain * @covers ::validateSection * @covers \Pdp\Domain::isResolvable @@ -221,7 +221,7 @@ public function testIsSuffixValidFalseWithPunycoded(): void /** * @covers ::resolve - * @covers ::icannResolve + * @covers ::resolveICANNDomain * @covers ::validateDomain * @covers ::validateSection * @covers \Pdp\Domain::isResolvable @@ -247,7 +247,7 @@ public function testSubDomainIsNull(): void /** * @covers ::resolve - * @covers ::cookieResolve + * @covers ::resolveCookieDomain * @covers ::validateDomain * @covers ::validateSection * @covers \Pdp\IDNAConverterTrait::parse @@ -291,7 +291,7 @@ public function testWithAbsoluteHostInvalid(): void /** * @covers ::resolve - * @covers ::privateResolve + * @covers ::resolvePrivateDomain * @covers ::validateDomain * @covers ::validateSection * @covers ::findPublicSuffix @@ -311,7 +311,7 @@ public function testWithPrivateDomainInvalid(): void /** * @covers ::resolve - * @covers ::privateResolve + * @covers ::resolvePrivateDomain * @covers ::validateDomain * @covers ::validateSection * @covers ::findPublicSuffix @@ -381,7 +381,7 @@ public function testWithDomainInterfaceObject(): void /** * @covers ::resolve - * @covers ::icannResolve + * @covers ::resolveICANNDomain * @covers ::validateDomain * @covers \Pdp\Domain::setRegistrableDomain * @covers \Pdp\Domain::getRegistrableDomain @@ -399,7 +399,7 @@ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $dom /** * @covers ::resolve - * @covers ::icannResolve + * @covers ::resolveICANNDomain * @covers ::validateDomain * @covers \Pdp\IDNAConverterTrait::parse * @covers \Pdp\Domain::setPublicSuffix From c6d6624e60dd63c754b900ff6093a6e0d72d254c Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 17 Mar 2020 14:32:44 +0100 Subject: [PATCH 191/461] Improve CouldNotResolvePublicSuffix usage --- src/Exception/CouldNotResolvePublicSuffix.php | 5 +++++ src/Rules.php | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Exception/CouldNotResolvePublicSuffix.php b/src/Exception/CouldNotResolvePublicSuffix.php index b6b18d0e..a21b80ec 100644 --- a/src/Exception/CouldNotResolvePublicSuffix.php +++ b/src/Exception/CouldNotResolvePublicSuffix.php @@ -39,6 +39,11 @@ public static function dueToUnresolvableDomain(?Domain $domain): self return $exception; } + public static function dueToUnSupportedSection(string $section): self + { + return new self('`'.$section.'` is an unknown Public Suffix List section.'); + } + public function hasDomain(): bool { return null !== $this->domain; diff --git a/src/Rules.php b/src/Rules.php index bf5401e4..60428494 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -194,7 +194,7 @@ public function getPublicSuffix($domain, string $section = self::ALL_DOMAINS): P } if (!$domain->isResolvable()) { - throw new CouldNotResolvePublicSuffix(sprintf('The domain `%s` can not contain a public suffix.', $domain->getContent())); + throw CouldNotResolvePublicSuffix::dueToUnresolvableDomain($domain); } return PublicSuffix::createFromDomain($domain->resolve($this->findPublicSuffix($domain, $section))); @@ -309,7 +309,7 @@ private function validateSection(string $section): string return $section; } - throw new CouldNotResolvePublicSuffix(sprintf('%s is an unknown Public Suffix List section.', $section)); + throw CouldNotResolvePublicSuffix::dueToUnSupportedSection($section); } /** From aa72f8988d31d65b7e72594ef9128a1d6cd7612c Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 29 Mar 2020 14:59:06 +0200 Subject: [PATCH 192/461] BugFix composer loading for the update-psl script #265 --- bin/update-psl | 36 +++++++++++++++---- ...ULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 2 +- ...ULL_f18a70477d29d525b9220612e2115345.cache | 2 +- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/bin/update-psl b/bin/update-psl index 1ba06d85..46fe6ee8 100755 --- a/bin/update-psl +++ b/bin/update-psl @@ -18,7 +18,17 @@ use Pdp\Logger; use Pdp\Installer; use Pdp\Manager; -require dirname(__DIR__).'/vendor/autoload.php'; +function get_vendor_path(): ?string +{ + for ($i = 1; $i <= 5; $i++) { + $vendor = dirname(__DIR__, $i).'/vendor'; + if (is_dir($vendor) && file_exists($vendor.'/autoload.php')) { + return $vendor; + } + } + + return null; +} function writeln(array $messages, $output): int { @@ -41,6 +51,20 @@ function fail(string $message, $output = STDERR): int return writeln($messages, $output); } +$vendor = get_vendor_path(); +if (null === $vendor) { + $message = << Date: Mon, 30 Mar 2020 07:57:26 +0200 Subject: [PATCH 193/461] Add visibility to constants --- src/Converter.php | 10 ++-------- src/Domain.php | 5 +---- src/Logger.php | 2 +- src/Manager.php | 4 ++-- src/PublicSuffix.php | 5 +---- src/PublicSuffixListSection.php | 4 ++-- src/Rules.php | 7 ++----- src/TLDConverter.php | 5 +---- 8 files changed, 12 insertions(+), 30 deletions(-) diff --git a/src/Converter.php b/src/Converter.php index 771f23d6..e8b80c92 100644 --- a/src/Converter.php +++ b/src/Converter.php @@ -35,10 +35,7 @@ final class Converter implements PublicSuffixListSection { use IDNAConverterTrait; - /** - * @internal - */ - const PSL_SECTION = [ + private const PSL_SECTION = [ 'ICANN' => [ 'BEGIN' => self::ICANN_DOMAINS, 'END' => '', @@ -49,10 +46,7 @@ final class Converter implements PublicSuffixListSection ], ]; - /** - * @internal - */ - const REGEX_PSL_SECTION = ',^// ===(?BEGIN|END) (?ICANN|PRIVATE) DOMAINS===,'; + private const REGEX_PSL_SECTION = ',^// ===(?BEGIN|END) (?ICANN|PRIVATE) DOMAINS===,'; /** * Convert the Public Suffix List into diff --git a/src/Domain.php b/src/Domain.php index e7b75c60..d20086d5 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -54,10 +54,7 @@ final class Domain implements DomainInterface, JsonSerializable { use IDNAConverterTrait; - /** - * @internal - */ - const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/'; + private const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/'; /** * @var string|null diff --git a/src/Logger.php b/src/Logger.php index b3da233d..501f0088 100644 --- a/src/Logger.php +++ b/src/Logger.php @@ -26,7 +26,7 @@ final class Logger extends AbstractLogger { - const ERRORS_LEVELS = [ + private const ERRORS_LEVELS = [ LogLevel::EMERGENCY => 1, LogLevel::ALERT => 1, LogLevel::CRITICAL => 1, diff --git a/src/Manager.php b/src/Manager.php index b4055763..d0892704 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -49,8 +49,8 @@ */ final class Manager { - const PSL_URL = 'https://publicsuffix.org/list/public_suffix_list.dat'; - const RZD_URL = 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt'; + public const PSL_URL = 'https://publicsuffix.org/list/public_suffix_list.dat'; + public const RZD_URL = 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt'; /** * @var CacheInterface diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 809cb70c..878f20c8 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -44,10 +44,7 @@ final class PublicSuffix implements DomainInterface, JsonSerializable, PublicSuf { use IDNAConverterTrait; - /** - * @internal - */ - const PSL_SECTION = [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, '']; + private const PSL_SECTION = [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, '']; /** * @var string|null diff --git a/src/PublicSuffixListSection.php b/src/PublicSuffixListSection.php index 97317761..1c5ca85c 100644 --- a/src/PublicSuffixListSection.php +++ b/src/PublicSuffixListSection.php @@ -22,7 +22,7 @@ */ interface PublicSuffixListSection { - const ICANN_DOMAINS = 'ICANN_DOMAINS'; + public const ICANN_DOMAINS = 'ICANN_DOMAINS'; - const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; + public const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; } diff --git a/src/Rules.php b/src/Rules.php index 60428494..e5e3617d 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -39,12 +39,9 @@ final class Rules implements PublicSuffixListSection /** * @deprecated 5.3 */ - const ALL_DOMAINS = 'ALL_DOMAINS'; + public const ALL_DOMAINS = 'ALL_DOMAINS'; - /** - * @internal - */ - const PSL_SECTION = [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, '']; + private const PSL_SECTION = [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, '']; /** * PSL rules as a multidimentional associative array. diff --git a/src/TLDConverter.php b/src/TLDConverter.php index f8ace8f0..b7bec47e 100644 --- a/src/TLDConverter.php +++ b/src/TLDConverter.php @@ -33,10 +33,7 @@ */ final class TLDConverter { - /** - * @internal - */ - const IANA_DATE_FORMAT = 'D M d H:i:s Y e'; + private const IANA_DATE_FORMAT = 'D M d H:i:s Y e'; /** * Converts the IANA Root Zone Database into a TopLevelDomains associative array. From 824454887a8588a40647588961ff7d8c8cf2bd54 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 17 May 2020 22:57:14 +0200 Subject: [PATCH 194/461] remove cache and update json requirements --- composer.json | 1 + data/.gitignore | 0 data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 1 - data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache | 1 - 4 files changed, 1 insertion(+), 2 deletions(-) create mode 100644 data/.gitignore delete mode 100644 data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache delete mode 100644 data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache diff --git a/composer.json b/composer.json index efa1169e..783e8d34 100644 --- a/composer.json +++ b/composer.json @@ -39,6 +39,7 @@ "require": { "php": "^7.2.5", "ext-intl": "*", + "ext-json": "*", "psr/log": "^1.1", "psr/simple-cache": "^1.0.1" }, diff --git a/data/.gitignore b/data/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache b/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache deleted file mode 100644 index 5a84fcec..00000000 --- a/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache +++ /dev/null @@ -1 +0,0 @@ -s:111123:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":{"co":[],"com":[],"commune":[],"net":[],"org":[]},"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":[],"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"catholic":[],"nsw":{"schools":[]},"nt":[],"qld":[],"sa":[],"tas":{"education":[]},"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"ecn":[],"eco":[],"edu":[],"emp":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"ong":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"tc":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"aprendemas":[],"co":[],"gob":[],"gov":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"ac":[],"biz":[],"com":[],"gov":[],"info":[],"mil":[],"name":[],"net":[],"org":[],"pro":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"asso":[],"com":[],"gouv":[],"nom":[],"prd":[],"tm":[],"aeroport":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"ponpes":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"ac":[],"biz":[],"co":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"sc":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":[],"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":[],"rw":{"ac":[],"co":[],"coop":[],"gov":[],"mil":[],"net":[],"org":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"edu":[],"gov":[],"me":[],"net":[],"org":[]},"sr":[],"ss":{"biz":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"av":[],"bbs":[],"bel":[],"biz":[],"com":[],"dr":[],"edu":[],"gen":[],"gov":[],"info":[],"mil":[],"k12":[],"kep":[],"name":[],"net":[],"org":[],"pol":[],"tel":[],"tsk":[],"tv":[],"web":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"dominic":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"k12":[],"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--qxa6a":[],"xn--mgbah1a3hjkrd":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nic":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"aigo":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"amazon":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"cpa":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dog":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"esurance":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gay":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"llp":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nadex":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scor":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"spa":[],"space":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"stada":[],"staples":[],"star":[],"statebank":[],"statefarm":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"symantec":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cckwcxetd":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--estv75g":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq480n2rg":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kpu716f":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pbt977c":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[],"v":[]},"com":{"adobeaemcloud":{"dev":{"*":[]}},"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"balena-devices":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"trycloudflare":[],"customer-oci":{"*":[],"oci":{"*":[]},"ocp":{"*":[]},"ocs":{"*":[]}},"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"builtwithdark":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"fbsbx":{"apps":[]},"fastly-terrarium":[],"fastvps-server":[],"mydobiss":[],"firebaseapp":[],"flynnhub":[],"freebox-os":[],"freeboxos":[],"gentapps":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":{"r":{"*":[]}},"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"awsmppl":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"joyent":{"cns":{"*":[]}},"lpusercontent":[],"lmpm":{"app":[]},"linode":{"members":[],"nodebalancer":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"bitballoon":[],"netlify":[],"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"observableusercontent":{"static":[]},"operaunite":[],"skygearapp":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"gotpantheon":[],"prgmr":{"xen":[]},"qualifioapp":[],"qbuser":[],"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"render":{"app":[]},"onrender":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"shopitsite":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"stackhero-network":[],"stdlib":{"api":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"thingdustdata":[],"bloxcms":[],"townnews-staging":[],"hk":[],"wafflecell":[],"remotewd":[],"xnbay":{"u2":[],"u2-local":[]},"yolasite":[]},"net":{"adobeaemcloud":[],"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":{"u":[]},"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"in-dsl":[],"in-vpn":[],"ipifony":[],"iobb":[],"kinghost":[],"uni5":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"senseering":[],"siteleaf":[],"srcf":{"soc":[],"user":[]},"dsmynas":[],"familyds":[],"community-pro":[],"meinforum":[],"yandexcloud":{"storage":[],"website":[]},"za":[]},"pl":{"beep":[],"krasnik":[],"leczna":[],"lubartow":[],"lublin":[],"poniatowa":[],"swidnik":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"ca":{"barsy":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]},"co":[],"arvo":[],"azimuth":[]},"org":{"altervista":[],"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"in-dsl":[],"in-vpn":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"pubtls":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"edugit":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"za":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[],"cn-northwest-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}},"instantcloud":[]},"nl":{"amsw":[],"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"khplay":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"io":{"apigee":[],"b-data":[],"backplaneapp":[],"banzaicloud":{"app":[]},"boxfuse":[],"browsersafetymark":[],"bigv":{"uk0":[]},"cleverapps":[],"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"github":[],"gitlab":[],"lolipop":[],"hasura-app":[],"moonscale":{"*":[]},"loginline":[],"barsy":[],"azurecontainer":[],"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"dyn53":[],"protonet":[],"qcx":{"sys":{"*":[]}},"vaporcloud":[],"on-k3s":{"*":[]},"on-rio":{"*":[]},"readthedocs":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"shiftedit":[],"mo-siemens":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"applicationcloud":[],"scapp":[],"s5y":{"*":[]},"telebit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[],"basicserver":[],"virtualserver":[]},"jp":{"ne":{"aseinet":{"user":[]},"gehirn":[]},"usercontent":[],"blogspot":[]},"vc":{"gv":{"d":[]},"0e":[],"nom":[]},"eus":{"party":{"user":[]}},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"dyn-berlin":[],"in-berlin":[],"in-brb":[],"in-butter":[],"in-dsl":[],"in-vpn":[],"mein-iserv":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[],"community-pro":[],"diskussionsbereich":[]},"uk":{"co":{"bytemark":{"dh":[],"vm":[]},"blogspot":[],"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"gov":{"service":[],"homeoffice":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"co":{"carrd":[],"crd":[],"otap":{"*":[]},"com":{"blogspot":[]},"leadpages":[],"lpages":[],"mypi":[],"n4t":[],"nodum":[],"repl":[]},"ai":{"uwu":[],"nom":[]},"se":{"com":[],"blogspot":[],"conf":[]},"bz":{"za":[],"nom":[],"nym":[]},"group":{"discourse":[]},"team":{"discourse":[]},"dev":{"lcl":{"*":[]},"stg":{"*":[]},"workers":[],"iserv":[],"loginline":[],"webhare":{"*":[]}},"me":{"c66":[],"daplie":{"localhost":[]},"edgestack":[],"filegear":[],"filegear-au":[],"filegear-de":[],"filegear-gb":[],"filegear-ie":[],"filegear-jp":[],"filegear-sg":[],"glitch":[],"ravendb":[],"barsy":[],"nctu":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"zone":{"cloud66":[],"hs":[],"triton":{"*":[]},"lima":[]},"host":{"cloudaccess":[],"freesite":[],"pcloud":[],"half":[]},"site":{"cloudera":[],"cyon":[],"lelux":[],"loginline":[],"barsy":[],"platformsh":{"*":[]},"byen":[]},"app":{"wnext":[],"run":{"a":[]},"web":[],"hasura":[],"loginline":[],"telebit":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"bpl":[],"orx":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"barsy":[],"pony":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"dnsupdate":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[],"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[],"dweb":{"*":[]}},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"earth":{"dapps":{"*":[],"bzz":{"*":[]}}},"th":{"online":[],"shop":[]},"fi":{"dy":[],"blogspot":[],"xn--hkkinen-5wa":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[],"enterprisecloud":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[],"telebit":{"*":[]}},"fr":{"en-root":[],"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"one":{"onred":{"staging":[]},"for":[],"homelink":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"direct":{"fastpanel":[]},"at":{"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"cloud":{"statics":{"*":[]},"linkyard":[],"magentosite":{"*":[]},"perspecta":[],"vapor":[],"on-rancher":{"*":[]},"sensiosite":{"*":[]},"trafficplex":[],"urown":[],"voorloper":[]},"ms":{"lab":[]},"digital":{"cloudapps":{"london":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[]}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]},"col":[],"firm":[],"gen":[],"ltd":[],"ngo":[]},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"nym":[],"ltd":[],"inc":[]},"hr":{"blogspot":[],"free":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[],"syncloud":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"caa":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"ua":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"si":{"blogspot":[],"nom":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"ci":{"fin":[]},"run":{"hs":[],"development":[],"ravendb":[],"repl":[]},"sh":{"hashbang":[],"platform":{"*":[]},"wedeploy":[],"now":[]},"community":{"ravendb":[],"myforum":[]},"city":{"ng":[]},"gl":{"biz":[],"nom":[]},"ink":{"ng":[]},"school":{"ng":[]},"so":{"sch":[]},"gg":{"kaas":[],"cya":[]},"systems":{"knightpoint":[]},"to":{"oya":[],"vpnplus":[],"quickconnect":{"direct":[]}},"krd":{"co":[],"edu":[]},"business":{"co":[]},"education":{"co":[]},"events":{"co":[]},"financial":{"co":[]},"place":{"co":[]},"technology":{"co":[]},"space":{"linkitools":[],"uber":[],"xs4all":[]},"bs":{"we":[]},"services":{"loginline":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"casa":{"nabu":{"ui":[]}},"fashion":{"of":[],"on":[]},"football":{"of":[]},"london":{"in":[],"of":[]},"men":{"for":[]},"mom":{"and":[],"for":[]},"sale":{"for":[]},"work":{"of":[],"to":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ec":{"nym":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gt":{"nom":[]},"gy":{"nym":[]},"hn":{"nom":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"lv":{"nom":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vg":{"nom":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"bn":{"co":[]},"page":{"prvcy":[]},"fit":{"ptplus":[]},"edu":{"rit":{"git-pages":[]}},"scot":{"gov":[]},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"academy":{"official":[]},"faith":{"ybo":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]},"design":{"bss":[]}}}"; \ No newline at end of file diff --git a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache b/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache deleted file mode 100644 index ac79d3d7..00000000 --- a/data/pdp-RZD_FULL_f18a70477d29d525b9220612e2115345.cache +++ /dev/null @@ -1 +0,0 @@ -s:13239:"{"version":"2020032900","modifiedDate":"2020-03-29T07:07:01+00:00","records":["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac","academy","accenture","accountant","accountants","aco","actor","ad","adac","ads","adult","ae","aeg","aero","aetna","af","afamilycompany","afl","africa","ag","agakhan","agency","ai","aig","aigo","airbus","airforce","airtel","akdn","al","alfaromeo","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","am","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","ao","aol","apartments","app","apple","aq","aquarelle","ar","arab","aramco","archi","army","arpa","art","arte","as","asda","asia","associates","at","athleta","attorney","au","auction","audi","audible","audio","auspost","author","auto","autos","avianca","aw","aws","ax","axa","az","azure","ba","baby","baidu","banamex","bananarepublic","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bb","bbc","bbt","bbva","bcg","bcn","bd","be","beats","beauty","beer","bentley","berlin","best","bestbuy","bet","bf","bg","bh","bharti","bi","bible","bid","bike","bing","bingo","bio","biz","bj","black","blackfriday","blockbuster","blog","bloomberg","blue","bm","bms","bmw","bn","bnpparibas","bo","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","br","bradesco","bridgestone","broadway","broker","brother","brussels","bs","bt","budapest","bugatti","build","builders","business","buy","buzz","bv","bw","by","bz","bzh","ca","cab","cafe","cal","call","calvinklein","cam","camera","camp","cancerresearch","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","casa","case","caseih","cash","casino","cat","catering","catholic","cba","cbn","cbre","cbs","cc","cd","ceb","center","ceo","cern","cf","cfa","cfd","cg","ch","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","church","ci","cipriani","circle","cisco","citadel","citi","citic","city","cityeats","ck","cl","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","cm","cn","co","coach","codes","coffee","college","cologne","com","comcast","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cookingchannel","cool","coop","corsica","country","coupon","coupons","courses","cpa","cr","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","csc","cu","cuisinella","cv","cw","cx","cy","cymru","cyou","cz","dabur","dad","dance","data","date","dating","datsun","day","dclk","dds","de","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dj","dk","dm","dnp","do","docs","doctor","dog","domains","dot","download","drive","dtv","dubai","duck","dunlop","dupont","durban","dvag","dvr","dz","earth","eat","ec","eco","edeka","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","epson","equipment","er","ericsson","erni","es","esq","estate","esurance","et","etisalat","eu","eurovision","eus","events","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fi","fiat","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","fj","fk","flickr","flights","flir","florist","flowers","fly","fm","fo","foo","food","foodnetwork","football","ford","forex","forsale","forum","foundation","fox","fr","free","fresenius","frl","frogans","frontdoor","frontier","ftr","fujitsu","fujixerox","fun","fund","furniture","futbol","fyi","ga","gal","gallery","gallo","gallup","game","games","gap","garden","gay","gb","gbiz","gd","gdn","ge","gea","gent","genting","george","gf","gg","ggee","gh","gi","gift","gifts","gives","giving","gl","glade","glass","gle","global","globo","gm","gmail","gmbh","gmo","gmx","gn","godaddy","gold","goldpoint","golf","goo","goodyear","goog","google","gop","got","gov","gp","gq","gr","grainger","graphics","gratis","green","gripe","grocery","group","gs","gt","gu","guardian","gucci","guge","guide","guitars","guru","gw","gy","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hgtv","hiphop","hisamitsu","hitachi","hiv","hk","hkt","hm","hn","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","horse","hospital","host","hosting","hot","hoteles","hotels","hotmail","house","how","hr","hsbc","ht","hu","hughes","hyatt","hyundai","ibm","icbc","ice","icu","id","ie","ieee","ifm","ikano","il","im","imamat","imdb","immo","immobilien","in","inc","industries","infiniti","info","ing","ink","institute","insurance","insure","int","intel","international","intuit","investments","io","ipiranga","iq","ir","irish","is","ismaili","ist","istanbul","it","itau","itv","iveco","jaguar","java","jcb","jcp","je","jeep","jetzt","jewelry","jio","jll","jm","jmp","jnj","jo","jobs","joburg","jot","joy","jp","jpmorgan","jprs","juegos","juniper","kaufen","kddi","ke","kerryhotels","kerrylogistics","kerryproperties","kfh","kg","kh","ki","kia","kim","kinder","kindle","kitchen","kiwi","km","kn","koeln","komatsu","kosher","kp","kpmg","kpn","kr","krd","kred","kuokgroup","kw","ky","kyoto","kz","la","lacaixa","lamborghini","lamer","lancaster","lancia","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lb","lc","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","li","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","linde","link","lipsy","live","living","lixil","lk","llc","llp","loan","loans","locker","locus","loft","lol","london","lotte","lotto","love","lpl","lplfinancial","lr","ls","lt","ltd","ltda","lu","lundbeck","lupin","luxe","luxury","lv","ly","ma","macys","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","maserati","mattel","mba","mc","mckinsey","md","me","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","metlife","mg","mh","miami","microsoft","mil","mini","mint","mit","mitsubishi","mk","ml","mlb","mls","mm","mma","mn","mo","mobi","mobile","moda","moe","moi","mom","monash","money","monster","mormon","mortgage","moscow","moto","motorcycles","mov","movie","mp","mq","mr","ms","msd","mt","mtn","mtr","mu","museum","mutual","mv","mw","mx","my","mz","na","nab","nagoya","name","nationwide","natura","navy","nba","nc","ne","nec","net","netbank","netflix","network","neustar","new","newholland","news","next","nextdirect","nexus","nf","nfl","ng","ngo","nhk","ni","nico","nike","nikon","ninja","nissan","nissay","nl","no","nokia","northwesternmutual","norton","now","nowruz","nowtv","np","nr","nra","nrw","ntt","nu","nyc","nz","obi","observer","off","office","okinawa","olayan","olayangroup","oldnavy","ollo","om","omega","one","ong","onl","online","onyourside","ooo","open","oracle","orange","org","organic","origins","osaka","otsuka","ott","ovh","pa","page","panasonic","paris","pars","partners","parts","party","passagens","pay","pccw","pe","pet","pf","pfizer","pg","ph","pharmacy","phd","philips","phone","photo","photography","photos","physio","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","pk","pl","place","play","playstation","plumbing","plus","pm","pn","pnc","pohl","poker","politie","porn","post","pr","pramerica","praxi","press","prime","pro","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","ps","pt","pub","pw","pwc","py","qa","qpon","quebec","quest","qvc","racing","radio","raid","re","read","realestate","realtor","realty","recipes","red","redstone","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","rightathome","ril","rio","rip","rmit","ro","rocher","rocks","rodeo","rogers","room","rs","rsvp","ru","rugby","ruhr","run","rw","rwe","ryukyu","sa","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sb","sbi","sbs","sc","sca","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scjohnson","scor","scot","sd","se","search","seat","secure","security","seek","select","sener","services","ses","seven","sew","sex","sexy","sfr","sg","sh","shangrila","sharp","shaw","shell","shia","shiksha","shoes","shop","shopping","shouji","show","showtime","shriram","si","silk","sina","singles","site","sj","sk","ski","skin","sky","skype","sl","sling","sm","smart","smile","sn","sncf","so","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","space","sport","spot","spreadbetting","sr","srl","ss","st","stada","staples","star","statebank","statefarm","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","su","sucks","supplies","supply","support","surf","surgery","suzuki","sv","swatch","swiftcover","swiss","sx","sy","sydney","symantec","systems","sz","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tc","tci","td","tdk","team","tech","technology","tel","temasek","tennis","teva","tf","tg","th","thd","theater","theatre","tiaa","tickets","tienda","tiffany","tips","tires","tirol","tj","tjmaxx","tjx","tk","tkmaxx","tl","tm","tmall","tn","to","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","tr","trade","trading","training","travel","travelchannel","travelers","travelersinsurance","trust","trv","tt","tube","tui","tunes","tushu","tv","tvs","tw","tz","ua","ubank","ubs","ug","uk","unicom","university","uno","uol","ups","us","uy","uz","va","vacations","vana","vanguard","vc","ve","vegas","ventures","verisign","versicherung","vet","vg","vi","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","viva","vivo","vlaanderen","vn","vodka","volkswagen","volvo","vote","voting","voto","voyage","vu","vuelos","wales","walmart","walter","wang","wanggou","watch","watches","weather","weatherchannel","webcam","weber","website","wed","wedding","weibo","weir","wf","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","ws","wtc","wtf","xbox","xerox","xfinity","xihuan","xin","xn--11b4c3d","xn--1ck2e1b","xn--1qqw23a","xn--2scrj9c","xn--30rr7y","xn--3bst00m","xn--3ds443g","xn--3e0b707e","xn--3hcrj9c","xn--3oq18vl8pn36a","xn--3pxu8k","xn--42c2d9a","xn--45br5cyl","xn--45brj9c","xn--45q11c","xn--4gbrim","xn--54b7fta0cc","xn--55qw42g","xn--55qx5d","xn--5su34j936bgsg","xn--5tzm5g","xn--6frz82g","xn--6qq986b3xl","xn--80adxhks","xn--80ao21a","xn--80aqecdr1a","xn--80asehdb","xn--80aswg","xn--8y0a063a","xn--90a3ac","xn--90ae","xn--90ais","xn--9dbq2a","xn--9et52u","xn--9krt00a","xn--b4w605ferd","xn--bck1b9a5dre4c","xn--c1avg","xn--c2br7g","xn--cck2b3b","xn--cg4bki","xn--clchc0ea0b2g2a9gcd","xn--czr694b","xn--czrs0t","xn--czru2d","xn--d1acj3b","xn--d1alf","xn--e1a4c","xn--eckvdtc9d","xn--efvy88h","xn--estv75g","xn--fct429k","xn--fhbei","xn--fiq228c5hs","xn--fiq64b","xn--fiqs8s","xn--fiqz9s","xn--fjq720a","xn--flw351e","xn--fpcrj9c3d","xn--fzc2c9e2c","xn--fzys8d69uvgm","xn--g2xx48c","xn--gckr3f0f","xn--gecrj9c","xn--gk3at1e","xn--h2breg3eve","xn--h2brj9c","xn--h2brj9c8c","xn--hxt814e","xn--i1b6b1a6a2e","xn--imr513n","xn--io0a7i","xn--j1aef","xn--j1amh","xn--j6w193g","xn--jlq61u9w7b","xn--jvr189m","xn--kcrx77d1x4a","xn--kprw13d","xn--kpry57d","xn--kpu716f","xn--kput3i","xn--l1acc","xn--lgbbat1ad8j","xn--mgb9awbf","xn--mgba3a3ejt","xn--mgba3a4f16a","xn--mgba7c0bbn0a","xn--mgbaakc7dvf","xn--mgbaam7a8h","xn--mgbab2bd","xn--mgbah1a3hjkrd","xn--mgbai9azgqp6j","xn--mgbayh7gpa","xn--mgbbh1a","xn--mgbbh1a71e","xn--mgbc0a9azcg","xn--mgbca7dzdo","xn--mgbcpq6gpa1a","xn--mgberp4a5d4ar","xn--mgbgu82a","xn--mgbi4ecexp","xn--mgbpl2fh","xn--mgbt3dhd","xn--mgbtx2b","xn--mgbx4cd0ab","xn--mix891f","xn--mk1bu44c","xn--mxtq1m","xn--ngbc5azd","xn--ngbe9e0a","xn--ngbrx","xn--node","xn--nqv7f","xn--nqv7fs00ema","xn--nyqy26a","xn--o3cw4h","xn--ogbpf8fl","xn--otu796d","xn--p1acf","xn--p1ai","xn--pbt977c","xn--pgbs0dh","xn--pssy2u","xn--q7ce6a","xn--q9jyb4c","xn--qcka1pmc","xn--qxa6a","xn--qxam","xn--rhqv96g","xn--rovu88b","xn--rvc1e0am3e","xn--s9brj9c","xn--ses554g","xn--t60b56a","xn--tckwe","xn--tiq49xqyj","xn--unup4y","xn--vermgensberater-ctb","xn--vermgensberatung-pwb","xn--vhquv","xn--vuq861b","xn--w4r85el8fhu5dnra","xn--w4rs40l","xn--wgbh1c","xn--wgbl6a","xn--xhq521b","xn--xkc2al3hye2a","xn--xkc2dl3a5ee0h","xn--y9a3aq","xn--yfro4i67o","xn--ygbi2ammx","xn--zfr164b","xxx","xyz","yachts","yahoo","yamaxun","yandex","ye","yodobashi","yoga","yokohama","you","youtube","yt","yun","za","zappos","zara","zero","zip","zm","zone","zuerich","zw"]}"; \ No newline at end of file From 24263368821bc0a71df75eb24c7b64781e0e3625 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 12 Jul 2020 22:10:57 +0200 Subject: [PATCH 195/461] Improve Rules static code analysis --- src/Rules.php | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/src/Rules.php b/src/Rules.php index e5e3617d..47dec9bf 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -185,7 +185,6 @@ public function getUnicodeIDNAOption(): int */ public function getPublicSuffix($domain, string $section = self::ALL_DOMAINS): PublicSuffix { - $section = $this->validateSection($section); if (!$domain instanceof Domain) { $domain = new Domain($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); } @@ -194,7 +193,45 @@ public function getPublicSuffix($domain, string $section = self::ALL_DOMAINS): P throw CouldNotResolvePublicSuffix::dueToUnresolvableDomain($domain); } - return PublicSuffix::createFromDomain($domain->resolve($this->findPublicSuffix($domain, $section))); + $publicSuffix = $this->findPublicSuffix($domain, $this->validateSection($section)); + + return PublicSuffix::createFromDomain($domain->resolve($publicSuffix)); + } + + /** + * Determines the public suffix for a given domain against the PSL rules for cookie domain detection.. + * + * @param mixed $domain + * + * @throws CouldNotResolvePublicSuffix If the PublicSuffix can not be resolve. + */ + public function getCookieEffectiveTLD($domain): PublicSuffix + { + return $this->getPublicSuffix($domain, ''); + } + + /** + * Determines the public suffix for a given domain against the PSL rules for ICANN domain detection.. + * + * @param mixed $domain + * + * @throws CouldNotResolvePublicSuffix If the PublicSuffix can not be resolve. + */ + public function getICANNEffectiveTLD($domain): PublicSuffix + { + return $this->getPublicSuffix($domain, self::ICANN_DOMAINS); + } + + /** + * Determines the public suffix for a given domain against the PSL rules for private domain detection.. + * + * @param mixed $domain + * + * @throws CouldNotResolvePublicSuffix If the PublicSuffix can not be resolve. + */ + public function getPrivateEffectiveTLD($domain): PublicSuffix + { + return $this->getPublicSuffix($domain, self::PRIVATE_DOMAINS); } /** From 9e91376d962d39e3d8cca19815133a74b20c1ff8 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 12 Jul 2020 22:45:08 +0200 Subject: [PATCH 196/461] Adding Rules Effective TLD methods --- src/Rules.php | 2 ++ tests/RulesTest.php | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/Rules.php b/src/Rules.php index 47dec9bf..47862b0c 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -63,6 +63,8 @@ final class Rules implements PublicSuffixListSection /** * New instance. * + * @internal + * * @param array $rules * @param int $asciiIDNAOption * @param int $unicodeIDNAOption diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 27042633..ad05be9f 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -708,4 +708,41 @@ public function testResolveWithIDNAOptions(): void [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption()] ); } + + /** + * @covers ::getCookieEffectiveTLD + * @covers ::getICANNEffectiveTLD + * @covers ::getPrivateEffectiveTLD + * @dataProvider effectiveTLDProvider + */ + public function testEffectiveTLDResolution(string $host, string $cookieETLD, string $icannETLD, string $privateETLD): void + { + self::assertSame($cookieETLD, (string) $this->rules->getCookieEffectiveTLD($host)); + self::assertSame($icannETLD, (string) $this->rules->getICANNEffectiveTLD($host)); + self::assertSame($privateETLD, (string) $this->rules->getPrivateEffectiveTLD($host)); + } + + public function effectiveTLDProvider(): iterable + { + return [ + 'simple TLD' => [ + 'host' => 'www.example.com', + 'cookieETLD' => 'com', + 'icannETLD' => 'com', + 'privateETLD' => 'com', + ], + 'complex ICANN TLD' => [ + 'host' => 'www.ulb.ac.be', + 'cookieETLD' => 'ac.be', + 'icannETLD' => 'ac.be', + 'privateETLD' => 'be', + ], + 'private domain effective TLD' => [ + 'host' => 'myblog.blogspot.com', + 'cookieETLD' => 'blogspot.com', + 'icannETLD' => 'com', + 'privateETLD' => 'blogspot.com', + ], + ]; + } } From b8ce97a0aa83e664d10180df8fe0fbe8428243b5 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 12 Jul 2020 23:39:29 +0200 Subject: [PATCH 197/461] Improving the package documentation --- CHANGELOG.md | 4 ++ README.md | 117 +++++++++++++++++++++++++++++++--------- src/TopLevelDomains.php | 3 ++ tests/RulesTest.php | 4 ++ 4 files changed, 103 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb9887cf..d1d15e1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Rules::resolveCookieDomain` - `Rules::resolveICANNDomain` - `Rules::resolvePrivateDomain` +- `Rules::getCookieEffectiveTLD` +- `Rules::getICANNEffectiveTLD` +- `Rules::getPrivateeEffectiveTLD` - `CouldNotResolvePublicSuffix::dueToUnresolvableDomain` ### Fixed @@ -23,6 +26,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in ### Removed - Support for PHP7.0 and PHP7.1 +- The external data from IANA and mozilla is no longer part of the package and will be downloaded only on demand on composer update/install. ## 5.6.0 - 2019-12-29 diff --git a/README.md b/README.md index 7461b4c4..484984ce 100644 --- a/README.md +++ b/README.md @@ -46,18 +46,92 @@ $ composer require jeremykendall/php-domain-parser Usage -------- +### Public suffix resolution. + +The first objective of the library is using the [Public Suffix List](http://publicsuffix.org/) to easily return the ICANN, the Cookie or +the Private Effective TLD as a `Pdp\PublicSuffix` object using the following methods: + +~~~php +use Pdp\Rules; + +$rules = Rules::createFromPath('/path/to/mozilla/public-suffix.dat'); + +echo $rules->getICANNEffectiveTLD('www.ulb.ac.be'); //display 'ac.be'; +echo $rules->getCookieEffectiveTLD('www.ulb.ac.be'); //display 'ac.be'; +echo $rules->getPrivateEffectiveTLD('www.ulb.ac.be'); //display 'be'; +~~~ + +The methods are available since version `5.7.0` to ease the package usage. Prior to this version you could use the +`Rules::getPublicSuffix` method with an optional `$section` argument to get the same results: + +~~~php +use Pdp\Rules; + +$rules = Rules::createFromPath('/path/to/mozilla/public-suffix.dat'); + +echo $rules->getPublicSuffix('www.ulb.ac.be'); // get the cookie effective TLD, display 'ac.be'; +echo $rules->getPublicSuffix('www.ulb.ac.be', Rules::ICANN_DOMAINS); //get the ICANN effective TLD, display 'ac.be'; +echo $rules->getPublicSuffix('www.ulb.ac.be', Rules::PRIVATE_DOMAINS); //get the Private effective TLD, display 'be'; +~~~ + + +If the Public Suffix is not found or in case of error an exception which extends `Pdp\Exception` is thrown. + +### Domain resolution. + +Apart the Public Suffix the package can resolve domain and their information also using Mozilla's [Public Suffix List](http://publicsuffix.org/) + +~~~php +use Pdp\Rules; + +$rules = Rules::createFromPath('/path/to/mozilla/public-suffix.dat'); + +echo $rules->resolveCookieDomain('www.ulb.ac.be'); // returns a Pdp\Domain object whose Public Suffix is 'ac.be'; +echo $rules->resolveICANNDomain('www.ulb.ac.be'); // returns a Pdp\Domain object whose Public Suffix is 'ac.be'; +echo $rules->resolvePrivateDomain('www.ulb.ac.be'); // returns a Pdp\Domain object whose Public Suffix is 'be'; +~~~ + +The methods are available since version `5.7.0` to ease the package usage. Prior to this version you could use the +`Rules::resolve` method with an optional `$section` argument to get the same results: + +~~~php +use Pdp\Rules; + +$rules = Rules::createFromPath('/path/to/mozilla/public-suffix.dat'); + +echo $rules->resolve('www.ulb.ac.be'); // returns a Pdp\Domain object whose Public Suffix is 'ac.be'; +echo $rules->resolve('www.ulb.ac.be', Rules::ICANN_DOMAINS); // returns a Pdp\Domain object whose Public Suffix is 'ac.be'; +echo $rules->resolve('www.ulb.ac.be', Rules::PRIVATE_DOMAINS); // returns a Pdp\Domain object whose Public Suffix is 'be'; +~~~ + +If the Domain is not resolved or in case of error a null `Pdp\Domain` is returned. + +### Top Level Domains resolution + +While the [Public Suffix List](http://publicsuffix.org/) is a community based list. We can parse the Top Level domain +information given by the [IANA website](https://data.iana.org/TLD/tlds-alpha-by-domain.txt) to always resolve +top domain against the newly registered TLD. + +~~~php +use Pdp\TopLevelDomains; + +$rules = TopLevelDomains::createFromPath('/path/to/iana/tlds-alpha-by-domain.txt'); + +echo $rules->resolve('www.UlB.Ac.bE'); //display 'be'; +~~~ + +If the Domain is not resolved or in case of error a null `Pdp\Domain` is returned. + +### The Domain and Public Suffix objects. + ~~~php getRules(); //$rules is a Pdp\Rules object +$rules = Rules::createFromPath('/path/to/mozilla/public-suffix.dat'); //$rules is a Pdp\Rules object -$domain = $rules->resolve('www.ulb.ac.be'); //$domain is a Pdp\Domain object +$domain = $rules->resolveICANNDomain('www.ulb.ac.be'); //$domain is a Pdp\Domain object echo $domain->getContent(); // 'www.ulb.ac.be' echo $domain->getPublicSuffix(); // 'ac.be' echo $domain->getRegistrableDomain(); // 'ulb.ac.be' @@ -67,14 +141,15 @@ $domain->isKnown(); // returns true $domain->isICANN(); // returns true $domain->isPrivate(); // returns false $domain->labels(); // returns ['be', 'ac', 'ulb', 'www'] -$publicSuffix = $rules->getPublicSuffix('mydomain.github.io', Rules::PRIVATE_DOMAINS); //$publicSuffix is a Pdp\PublicSuffix object + +$publicSuffix = $rules->getPrivateEffectiveTLD('mydomain.github.io'); //$publicSuffix is a Pdp\PublicSuffix object echo $publicSuffix->getContent(); // 'github.io' $publicSuffix->isKnown(); // returns true $publicSuffix->isICANN(); // returns false $publicSuffix->isPrivate(); // returns true $publicSuffix->labels(); // returns ['io', 'github'] -$altSuffix = $rules->getPublicSuffix('mydomain.github.io', Rules::ICANN_DOMAINS); +$altSuffix = $rules->getICANNEffectiveTLD('mydomain.github.io'); echo $altSuffix->getContent(); // 'io' $altSuffix->isKnown(); // returns true $altSuffix->isICANN(); // returns true @@ -84,7 +159,7 @@ $tldList = $manager->getTLDs(); //$tldList is a Pdp\TopLevelDomains object $domain = $tldList->resolve('www.ulb.ac.be'); //$domain is a Pdp\Domain object $tldList->contains('be'); //returns true $tldList->contains('localhost'); //return false -foreach($tldList as $tld) { +foreach ($tldList as $tld) { //$tld is a Pdp\PublisSuffix object } ~~~ @@ -96,8 +171,7 @@ Using the above code you have parse, validate and resolve a domain name and its **Before** ~~~php -$manager = new Manager(new Cache(), new CurlHttpClient()); -$rules = $manager->getRules(); +$rules = Rules::createFromPath('/path/to/mozilla/public-suffix.dat'); //$rules is a Pdp\Rules object $domain = $rules->resolve('faß.test.de'); echo $domain->toAscii()->getContent(); // 'fass.test.de' @@ -106,19 +180,12 @@ echo $domain->toAscii()->getContent(); // 'fass.test.de' **After** ~~~php -$manager = new Manager(new Cache(), new CurlHttpClient()); -$rules = $manager->getRules() - ->withAsciiIDNAOption(IDNA_NONTRANSITIONAL_TO_ASCII) - ->withUnicodeIDNAOption(IDNA_NONTRANSITIONAL_TO_UNICODE); - -// or -// -// $rules = $manager->getRules( -// Manager::PSL_URL, -// null, -// IDNA_NONTRANSITIONAL_TO_ASCII, -// IDNA_NONTRANSITIONAL_TO_UNICODE -// ); +$rules = Rules::createFromPath( + '/path/to/mozilla/public-suffix.dat', + null, // PHP resource context (see fopen context argument) + IDNA_NONTRANSITIONAL_TO_ASCII, + IDNA_NONTRANSITIONAL_TO_UNICODE +); //$rules is a Pdp\Rules object $domain = $rules->resolve('faß.test.de'); echo $domain->toAscii()->getContent(); // 'xn--fa-hia.test.de' @@ -514,7 +581,7 @@ public Manager::getTLDs( ): TopLevelDomains ~~~ -These methods returns a `Pdp\Rules` or `Pdp\TopLevelDomains` objects seeded with their corresponding data fetch from the cache or from the external resources depending on the submitted `$ttl` argument. +These methods return a `Pdp\Rules` or `Pdp\TopLevelDomains` objects seeded with their corresponding data fetch from the cache or from the external resources depending on the submitted `$ttl` argument. These methods take an optional `$url` argument which specifies the PSL source URL. If no local cache exists for the submitted source URL, the method will: diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 315fa748..dd30218d 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -62,6 +62,9 @@ final class TopLevelDomains implements Countable, IteratorAggregate /** * New instance. + * + * @internal + * * @param array $records * @param string $version * @param DateTimeInterface $modifiedDate diff --git a/tests/RulesTest.php b/tests/RulesTest.php index ad05be9f..b05b3733 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -714,6 +714,10 @@ public function testResolveWithIDNAOptions(): void * @covers ::getICANNEffectiveTLD * @covers ::getPrivateEffectiveTLD * @dataProvider effectiveTLDProvider + * @param string $host + * @param string $cookieETLD + * @param string $icannETLD + * @param string $privateETLD */ public function testEffectiveTLDResolution(string $host, string $cookieETLD, string $icannETLD, string $privateETLD): void { From efb2f3f9547b449f6d902913b2f9ba8e4fbdb1ff Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 12 Jul 2020 23:52:22 +0200 Subject: [PATCH 198/461] typo fix in documentation --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 484984ce..5ddab3cc 100644 --- a/README.md +++ b/README.md @@ -117,7 +117,7 @@ use Pdp\TopLevelDomains; $rules = TopLevelDomains::createFromPath('/path/to/iana/tlds-alpha-by-domain.txt'); -echo $rules->resolve('www.UlB.Ac.bE'); //display 'be'; +echo $rules->resolve('www.UlB.Ac.bE')->getPublicSuffix(); //display 'be'; ~~~ If the Domain is not resolved or in case of error a null `Pdp\Domain` is returned. From 5e396cba901f267e036ed98e69db055a0783b1c6 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 28 Jul 2020 14:50:04 +0200 Subject: [PATCH 199/461] Update codebase first alpha for v6 --- .editorconfig | 3 + .php_cs | 7 +- .travis.yml | 24 - CHANGELOG.md | 38 +- README.md | 50 +- bin/update-pdp | 120 +++ bin/update-psl | 159 ---- composer.json | 17 +- data/.gitignore | 0 phpstan.src.neon | 32 +- phpstan.tests.neon | 46 +- src/Contract/DomainInterface.php | 125 +++ src/{ => Contract}/Exception.php | 6 +- .../HostInterface.php} | 61 +- src/Contract/PublicSuffixInterface.php | 34 + .../PublicSuffixListSection.php | 2 +- src/Contract/ResolvableHostInterface.php | 61 ++ src/Domain.php | 613 +-------------- src/Exception/CouldNotLoadRules.php | 22 - src/Exception/CouldNotResolvePublicSuffix.php | 56 -- src/Exception/CouldNotResolveSubDomain.php | 22 - src/Exception/InvalidDomain.php | 22 - src/Exception/InvalidLabel.php | 22 - src/Exception/InvalidLabelKey.php | 22 - ...{IDNAConverterTrait.php => HostParser.php} | 98 +-- src/Installer.php | 276 ------- src/InvalidDomain.php | 61 ++ src/Manager.php | 257 ------ src/PublicSuffix.php | 246 ++---- src/ResolvableDomain.php | 353 +++++++++ src/Rules.php | 238 +++--- src/{Converter.php => RulesConverter.php} | 50 +- src/{ => Storage/Cache}/Logger.php | 2 +- .../Cache/Psr16CacheException.php} | 4 +- .../Cache/Psr16FileCache.php} | 81 +- src/Storage/Cache/RulesCache.php | 44 ++ src/Storage/Cache/RulesCachePsr16Adapter.php | 154 ++++ src/Storage/Cache/TopLevelDomainsCache.php | 44 ++ .../TopLevelDomainsCachePsr16Adapter.php | 154 ++++ .../Http/Client.php} | 10 +- .../Http/ClientException.php} | 6 +- .../Http/CurlClient.php} | 21 +- .../Http/CurlClientException.php} | 6 +- src/Storage/Installer.php | 89 +++ src/Storage/Manager.php | 104 +++ src/Storage/Output.php | 41 + src/TopLevelDomains.php | 164 ++-- ...erter.php => TopLevelDomainsConverter.php} | 35 +- src/UnableToLoadRules.php | 38 + src/UnableToLoadTopLevelDomains.php | 58 ++ src/UnableToResolveDomain.php | 66 ++ tests/ConverterTest.php | 29 +- tests/DomainTest.php | 678 +--------------- tests/InstallerTest.php | 167 ---- tests/ManagerTest.php | 436 ---------- tests/PublicSuffixTest.php | 175 +---- tests/ResolvableDomainTest.php | 742 ++++++++++++++++++ tests/RulesTest.php | 245 +++--- .../Cache/Psr16FileCacheTest.php} | 42 +- .../Http/CurlClientTest.php} | 21 +- ...t.php => TopLevelDomainsConverterTest.php} | 15 +- tests/TopLevelDomainsTest.php | 40 +- ...ULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 1 + 63 files changed, 3064 insertions(+), 3791 deletions(-) create mode 100755 bin/update-pdp delete mode 100755 bin/update-psl mode change 100644 => 100755 data/.gitignore create mode 100644 src/Contract/DomainInterface.php rename src/{ => Contract}/Exception.php (81%) rename src/{DomainInterface.php => Contract/HostInterface.php} (57%) create mode 100644 src/Contract/PublicSuffixInterface.php rename src/{ => Contract}/PublicSuffixListSection.php (96%) create mode 100644 src/Contract/ResolvableHostInterface.php delete mode 100644 src/Exception/CouldNotLoadRules.php delete mode 100644 src/Exception/CouldNotResolvePublicSuffix.php delete mode 100644 src/Exception/CouldNotResolveSubDomain.php delete mode 100644 src/Exception/InvalidDomain.php delete mode 100644 src/Exception/InvalidLabel.php delete mode 100644 src/Exception/InvalidLabelKey.php rename src/{IDNAConverterTrait.php => HostParser.php} (72%) delete mode 100644 src/Installer.php create mode 100644 src/InvalidDomain.php delete mode 100644 src/Manager.php create mode 100644 src/ResolvableDomain.php rename src/{Converter.php => RulesConverter.php} (68%) rename src/{ => Storage/Cache}/Logger.php (98%) rename src/{CacheException.php => Storage/Cache/Psr16CacheException.php} (80%) rename src/{Cache.php => Storage/Cache/Psr16FileCache.php} (73%) create mode 100644 src/Storage/Cache/RulesCache.php create mode 100644 src/Storage/Cache/RulesCachePsr16Adapter.php create mode 100644 src/Storage/Cache/TopLevelDomainsCache.php create mode 100644 src/Storage/Cache/TopLevelDomainsCachePsr16Adapter.php rename src/{HttpClient.php => Storage/Http/Client.php} (79%) rename src/{HttpClientException.php => Storage/Http/ClientException.php} (82%) rename src/{CurlHttpClient.php => Storage/Http/CurlClient.php} (80%) rename src/{Exception/CouldNotLoadTLDs.php => Storage/Http/CurlClientException.php} (76%) create mode 100644 src/Storage/Installer.php create mode 100644 src/Storage/Manager.php create mode 100644 src/Storage/Output.php rename src/{TLDConverter.php => TopLevelDomainsConverter.php} (72%) create mode 100644 src/UnableToLoadRules.php create mode 100644 src/UnableToLoadTopLevelDomains.php create mode 100644 src/UnableToResolveDomain.php delete mode 100644 tests/InstallerTest.php delete mode 100644 tests/ManagerTest.php create mode 100644 tests/ResolvableDomainTest.php rename tests/{CacheTest.php => Storage/Cache/Psr16FileCacheTest.php} (93%) rename tests/{CurlHttpClientTest.php => Storage/Http/CurlClientTest.php} (64%) rename tests/{TLDConverterTest.php => TopLevelDomainsConverterTest.php} (86%) create mode 100644 tests/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache diff --git a/.editorconfig b/.editorconfig index 56f3b6bf..e6508c1c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,3 +10,6 @@ trim_trailing_whitespace = true [*.md] trim_trailing_whitespace = false + +[*.neon] +indent_size = 2 diff --git a/.php_cs b/.php_cs index d389dc37..b864d1c6 100644 --- a/.php_cs +++ b/.php_cs @@ -12,7 +12,6 @@ file that was distributed with this source code. EOF; $finder = PhpCsFixer\Finder::create() - ->in(__DIR__.'/bin') ->in(__DIR__.'/src') ->in(__DIR__.'/tests') ; @@ -33,9 +32,9 @@ return PhpCsFixer\Config::create() 'no_empty_phpdoc' => true, 'no_empty_comment' => true, 'no_leading_import_slash' => true, + 'no_superfluous_phpdoc_tags' => true, 'no_trailing_comma_in_singleline_array' => true, - 'no_trailing_whitespace' => true, - 'no_whitespace_in_blank_line' => true, + 'no_superfluous_phpdoc_tags' => true, 'no_unused_imports' => true, 'ordered_imports' => ['imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha'], 'phpdoc_add_missing_param_annotation' => ['only_untyped' => false], @@ -45,6 +44,7 @@ return PhpCsFixer\Config::create() 'phpdoc_scalar' => true, 'phpdoc_to_comment' => true, 'phpdoc_summary' => true, + 'psr0' => true, 'psr4' => true, 'return_type_declaration' => ['space_before' => 'none'], 'single_blank_line_before_namespace' => true, @@ -54,6 +54,7 @@ return PhpCsFixer\Config::create() 'trailing_comma_in_multiline_array' => true, 'trim_array_spaces' => true, 'whitespace_after_comma_in_array' => true, + 'yoda_style' => true, ]) ->setFinder($finder) ; diff --git a/.travis.yml b/.travis.yml index fbd4839b..0f54ef0a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,30 +5,6 @@ cache: - "$HOME/.composer/cache" matrix: include: - - php: 7.2 - env: - - COLLECT_COVERAGE=false - - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source --prefer-lowest --prefer-stable" - - RUN_PHPSTAN=false - - VALIDATE_CODING_STYLE=false - - php: 7.2 - env: - - COLLECT_COVERAGE=true - - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source" - - RUN_PHPSTAN=true - - VALIDATE_CODING_STYLE=true - - php: 7.3 - env: - - COLLECT_COVERAGE=false - - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source --prefer-lowest --prefer-stable" - - RUN_PHPSTAN=false - - VALIDATE_CODING_STYLE=false - - php: 7.3 - env: - - COLLECT_COVERAGE=true - - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source" - - RUN_PHPSTAN=true - - VALIDATE_CODING_STYLE=true - php: 7.4 env: - COLLECT_COVERAGE=false diff --git a/CHANGELOG.md b/CHANGELOG.md index d1d15e1d..7079b3ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -76,13 +76,13 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\TopLevelDomains` to allow resolving domain againts IANA Root zone database - `Pdp\TLDConverter` converts the IANA Root Zones database into an associative array -- `Pdp\Manager::getTLDs` a service to return a cache version of the IANA Root zone database -- `Pdp\Manager::refreshTLDs` a service to refresh the cache version of the IANA Root zone database +- `Pdp\Service\Manager::getTLDs` a service to return a cache version of the IANA Root zone database +- `Pdp\Service\Manager::refreshTLDs` a service to refresh the cache version of the IANA Root zone database - added a new `$ttl` parameter to improve PSR-16 supports to - - `Pdp\Manager::__construct` - - `Pdp\Manager::getRules` - - `Pdp\Manager::refreshRules` -- `Pdp\Exception\CouldNotLoadTLDs` exception + - `Pdp\Service\Manager::__construct` + - `Pdp\Service\Manager::getRules` + - `Pdp\Service\Manager::refreshRules` +- `Pdp\Contract\Exception\CouldNotLoadTLDs` exception ### Fixed @@ -101,8 +101,8 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in ### Added -- `Pdp\PublicSuffixListSection` interface implemented by `Pdp\Rules` and `Pdp\PublicSuffix` -- `Pdp\DomainInterface` interface implemented by `Pdp\Domain` and `Pdp\PublicSuffix` +- `Pdp\Contract\PublicSuffixListSection` interface implemented by `Pdp\Rules` and `Pdp\PublicSuffix` +- `Pdp\Contract\DomainInterface` interface implemented by `Pdp\Domain` and `Pdp\PublicSuffix` - `Pdp\Domain::getContent` replaces `Pdp\Domain::getDomain` - `Pdp\Domain::withLabel` adds a new label to the `Pdp\Domain`. - `Pdp\Domain::withoutLabel` removes labels from the `Pdp\Domain`. @@ -113,15 +113,15 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\Domain::resolve` attach a public suffix to the `Pdp\Domain`. - `Pdp\Domain::isResolvable` tells whether the current `Pdp\Domain` can have a public suffix attached to it or not. - `Pdp\PublicSuffix::createFromDomain` returns a new `Pdp\PublicSuffix` object from a `Pdp\Domain`object -- `Pdp\Exception` sub namespace to organize exception. All exception extends the `Pdp\Exception` class to prevent BC break. +- `Pdp\Contract\Exception` sub namespace to organize exception. All exception extends the `Pdp\Contract\Exception` class to prevent BC break. ### Fixed - `Pdp\Domain` domain part computation (public suffix, registrable domain and sub domain) - `Pdp\Domain` and `Pdp\PublicSuffix` host validation compliance to RFC improved -- Improve `Pdp\Converter` and `Pdp\Manager` class to better report error on IDN conversion. -- Improve `Pdp\Installer` vendor directory resolution see [PR #222](https://github.com/jeremykendall/php-domain-parser/pull/222) -- `Pdp\Exception` nows extends `InvalidArgumentException` instead of `RuntimeException` +- Improve `Pdp\Converter` and `Pdp\Service\Manager` class to better report error on IDN conversion. +- Improve `Pdp\Service\Installer` vendor directory resolution see [PR #222](https://github.com/jeremykendall/php-domain-parser/pull/222) +- `Pdp\Contract\Exception` nows extends `InvalidArgumentException` instead of `RuntimeException` ### Deprecated @@ -181,12 +181,12 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in ### Added -- `Pdp\Exception` a base exception for the library +- `Pdp\Contract\Exception` a base exception for the library - `Pdp\Rules` a class to resolve domain name against the public suffix list - `Pdp\Domain` an immutable value object to represents a parsed domain name -- `Pdp\Installer` a class to enable improve PSL maintenance -- `Pdp\Cache` a PSR-16 file cache implementation to cache a local copy of the PSL -- `Pdp\Manager` a class to enable managing PSL sources and `Rules` objects creation +- `Pdp\Service\Installer` a class to enable improve PSL maintenance +- `Pdp\Storage\Cache` a PSR-16 file cache implementation to cache a local copy of the PSL +- `Pdp\Service\Manager` a class to enable managing PSL sources and `Rules` objects creation - `Pdp\Converter` a class to convert the PSL into a PHP array ### Fixed @@ -204,6 +204,6 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - PHP5 support - URL Parsing capabilities and domain name validation - `Pdp\PublicSuffixList` class replaced by the `Pdp\Rules` class -- `Pdp\PublicSuffixManager` class replaced by the `Pdp\Manager` class -- `Pdp\HttpAdapter\HttpAdapterInterface` interface replaced by the `Pdp\HttpClient` interface -- `Pdp\HttpAdapter\CurlHttpAdapter` class replaced by the `Pdp\CurlHttpClient` class +- `Pdp\PublicSuffixManager` class replaced by the `Pdp\Service\Manager` class +- `Pdp\HttpAdapter\HttpAdapterInterface` interface replaced by the `Pdp\Client\HttpClient` interface +- `Pdp\HttpAdapter\CurlHttpAdapter` class replaced by the `Pdp\Client\CurlHttpClient` class diff --git a/README.md b/README.md index 5ddab3cc..9d14bfea 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ System Requirements You need: -- **PHP >= 7.2.5** but the latest stable version of PHP is recommended +- **PHP >= 7.4** but the latest stable version of PHP is recommended - the `intl` extension Dependencies @@ -75,7 +75,7 @@ echo $rules->getPublicSuffix('www.ulb.ac.be', Rules::PRIVATE_DOMAINS); //get the ~~~ -If the Public Suffix is not found or in case of error an exception which extends `Pdp\Exception` is thrown. +If the Public Suffix is not found or in case of error an exception which extends `Pdp\Contract\Exception` is thrown. ### Domain resolution. @@ -204,8 +204,8 @@ $publicSuffix = new PublicSuffix('com'); $domain = new Domain('www.bébé.ExAmple.com', $publicSuffix); $domain->getContent(); // www.bébé.example.com echo $domain; // www.bébé.example.com -echo $domain->getLabel(0); // 'com' -echo $domain->getLabel(-1); // 'www' +echo $domain->label(0); // 'com' +echo $domain->label(-1); // 'www' $domain->keys('example'); // array(1) count($domain); //returns 4 $domain->getPublicSuffix(); // 'com' @@ -261,7 +261,7 @@ echo $newDomain // 'shop.com' Because the `Pdp\Domain` object is immutable: - If the method change any of the current object property, a new object is returned. -- If a modification is not possible a `Pdp\Exception` exception is thrown. +- If a modification is not possible a `Pdp\Contract\Exception` exception is thrown. **WARNING: URI and URL accept registered name which encompass domain name. Therefore, some URI host are invalid domain name and will trigger an exception if you try to instantiate a `Pdp\Domain` with them.** @@ -363,7 +363,7 @@ Both methods expect the same arguments: - `Rules::PRIVATE_DOMAINS`, to validate against the PSL PRIVATE DOMAINS section only. - the empty string to validate against all the PSL sections. -By default, the `$section` argument is equal to the empty string. If an unsupported section is submitted a `Pdp\Exception` exception will be thrown. +By default, the `$section` argument is equal to the empty string. If an unsupported section is submitted a `Pdp\Contract\Exception` exception will be thrown. **THIS EXAMPLE ILLUSTRATES HOW THE OBJECT WORK BUT SHOULD BE AVOIDED IN PRODUCTON** @@ -480,30 +480,30 @@ $domain = json_encode($tlds->resolve('www.Ulb.Ac.BE'), JSON_PRETTY_PRINT); ### Managing the package lists -The library comes bundle with a service which enables resolving domain name without the constant network overhead of continously downloading the PSL. The `Pdp\Manager` class retrieves, converts and caches the PSL as well as creates the corresponding `Pdp\Rules` object on demand. It internally uses a `Pdp\Converter` object to convert the fetched PSL into its `array` representation when required. +The library comes bundle with a service which enables resolving domain name without the constant network overhead of continously downloading the PSL. The `Pdp\Service\Manager` class retrieves, converts and caches the PSL as well as creates the corresponding `Pdp\Rules` object on demand. It internally uses a `Pdp\Converter` object to convert the fetched PSL into its `array` representation when required. ~~~php refreshRules('https://publicsuffix.org/list/public_suffix_list.dat'); if ($retval) { //the local cache has been updated @@ -588,7 +588,7 @@ These methods take an optional `$url` argument which specifies the PSL source UR 1. call `Manager::refreshRules` with the given URL and `$ttl` argument to update its local cache 2. instantiate the `Rules` or the `TopLevelDomains` objects with the newly cached data. -On error, theses methods will throw an `Pdp\Exception`. +On error, theses methods will throw an `Pdp\Contract\Exception`. **since version 5.5** @@ -604,7 +604,7 @@ They are used when instantiated the returned object. **THIS IS THE RECOMMENDED WAY OF USING THE LIBRARY** ~~~php -$manager = new Pdp\Manager(new Pdp\Cache(), new Pdp\CurlHttpClient()); +$manager = new Pdp\Storage\Manager(new Pdp\Storage\Cache\Psr16FileCache(), new Pdp\Storage\Http\CurlClient()); $tldCollection = $manager->getTLDs(self::RZD_URL); $domain = $tldCollection->resolve('www.ulb.ac.be'); echo $domain->getPublicSuffix(); // print 'be' @@ -621,8 +621,8 @@ $ php ./bin/update-psl This script requires: - The PHP `curl` extension -- The `Pdp\Installer` class which organizes how to update the cache. -- The `Pdp\Cache` and `Pdp\CurlHttpClient` classes to retrieve and cache the PSL +- The `Pdp\Service\Installer` class which organizes how to update the cache. +- The `Pdp\Storage\Cache` and `Pdp\Client\CurlHttpClient` classes to retrieve and cache the PSL - A `Psr3` implementation. You can add a composer script in your `composer.json` file to update the PSL cache every time after the `install` or the `update` command are executed. @@ -630,8 +630,8 @@ You can add a composer script in your `composer.json` file to update the PSL cac ~~~bash { "scripts": { - "post-install-cmd": "\\Pdp\\Installer::updateLocalCache", - "post-update-cmd": "\\Pdp\\Installer::updateLocalCache" + "post-install-cmd": "\\Pdp\\Service\\Installer::updateLocalCache", + "post-update-cmd": "\\Pdp\\Service\\Installer::updateLocalCache" } } ~~~ @@ -680,12 +680,12 @@ Of course you can add more setups depending on your usage. get($url)->getBody()->getContents(); } catch (Throwable $e) { - throw new HttpClientException($e->getMessage(), $e->getCode(), $e); + throw new ClientException($e->getMessage(), $e->getCode(), $e); } } } diff --git a/bin/update-pdp b/bin/update-pdp new file mode 100755 index 00000000..34009e77 --- /dev/null +++ b/bin/update-pdp @@ -0,0 +1,120 @@ +#!/usr/bin/env php + $default_cache_dir, + Installer::TTL_KEY => '1 DAY', +]; + +if (isset($arguments['help']) || isset($arguments['h'])) { + $script = basename(__FILE__); + $helpText = <<success($helpText); + + die(0); +} + +if (!extension_loaded('curl')) { + $output->fail("$redbg The required PHP cURL extension is missing. $reset"); + + die(1); +} + +$installer = new Installer(new Logger( STDOUT, STDERR)); +$output->success("$yellow Updating your Pdp local cache.$reset"); +if ($installer->updateLocalCopies($arguments)) { + $output->success("$green Pdp local cache successfully updated. $reset"); + + die(0); +} + +$output->fail("$redbg The command failed to update Pdp local cache successfully. $reset"); + +die(1); diff --git a/bin/update-psl b/bin/update-psl deleted file mode 100755 index 46fe6ee8..00000000 --- a/bin/update-psl +++ /dev/null @@ -1,159 +0,0 @@ -#!/usr/bin/env php - '', - Installer::REFRESH_PSL_KEY => false, - Installer::REFRESH_RZD_KEY => false, - Installer::TTL_KEY => '1 DAY', -], getopt('h::', [ - 'h', - 'help', - Installer::CACHE_DIR_KEY.':', - Installer::REFRESH_PSL_KEY, - Installer::REFRESH_PSL_URL_KEY.':', - Installer::REFRESH_RZD_KEY, - Installer::REFRESH_RZD_URL_KEY.':', - Installer::TTL_KEY.':', -])); - -if (isset($arguments['help']) || isset($arguments['h'])) { - $default_cache_dir = dirname(__DIR__).'/data'; - $script = basename(__FILE__); - $helpText = <<refresh($arguments)) { - success("$green Pdp local cache successfully updated. $reset"); - - die(0); -} - -fail("$redbg The command failed to update Pdp local cache successfully. $reset"); - -die(1); diff --git a/composer.json b/composer.json index 783e8d34..bf212c6e 100644 --- a/composer.json +++ b/composer.json @@ -37,11 +37,9 @@ "psl" ], "require": { - "php": "^7.2.5", + "php": "^7.4", "ext-intl": "*", - "ext-json": "*", - "psr/log": "^1.1", - "psr/simple-cache": "^1.0.1" + "ext-json": "*" }, "require-dev": { "composer/composer": "^1.6", @@ -50,12 +48,17 @@ "phpstan/phpstan": "^0.12", "phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^8.0" + "phpunit/phpunit": "^9.0", + "psr/log": "^1.1", + "psr/simple-cache": "^1.0.1" }, "suggest": { "psr/simple-cache-implementation": "To enable using other cache providers", + "psr/log-implementation": "To enable using other logger providers", "ext-curl": "To use the package http client", - "league/uri": "To parse URL and validate host" + "league/uri": "To parse URL and validate host", + "psr/log": "^1.1", + "psr/simple-cache": "^1.0.1" }, "autoload": { "psr-4": { @@ -76,8 +79,6 @@ "@phpstan-tests" ], "phpunit": "phpunit --coverage-text", - "post-install-cmd": "\\Pdp\\Installer::updateLocalCache", - "post-update-cmd": "\\Pdp\\Installer::updateLocalCache", "test": [ "@phpcs", "@phpstan", diff --git a/data/.gitignore b/data/.gitignore old mode 100644 new mode 100755 diff --git a/phpstan.src.neon b/phpstan.src.neon index c0694c59..792f2d6b 100644 --- a/phpstan.src.neon +++ b/phpstan.src.neon @@ -1,17 +1,19 @@ includes: -- vendor/phpstan/phpstan-strict-rules/rules.neon + - vendor/phpstan/phpstan-strict-rules/rules.neon parameters: - checkMissingIterableValueType: false - checkGenericClassInNonGenericObjectType: false - ignoreErrors: - - message: '#Call to function is_iterable\(\) with iterable will always evaluate to true.#' - path: src/Cache.php - - message: '#Call to function is_string\(\) with string will always evaluate to true.#' - path: src/Cache.php - - message: '#Call to function is_object\(\) with \*NEVER\* will always evaluate to true.#' - path: src/Cache.php - - message: '#Else branch is unreachable because ternary operator condition is always true.#' - path: src/Cache.php - - message: '#Property Pdp\\TopLevelDomains::\$modifiedDate \(DateTimeImmutable\) does not accept DateTimeInterface.#' - path: src/TopLevelDomains.php - reportUnmatchedIgnoredErrors: true + checkMissingIterableValueType: false + checkGenericClassInNonGenericObjectType: false + treatPhpDocTypesAsCertain: false + ignoreErrors: + - '#should be covariant with return type#' + - message: '#Method Pdp\\PublicSuffix::toAscii\(\) should return static\(Pdp\\PublicSuffix\) but returns Pdp\\PublicSuffix.#' + path: src/PublicSuffix.php + - message: '#Method Pdp\\PublicSuffix::toUnicode\(\) should return static\(Pdp\\PublicSuffix\) but returns Pdp\\PublicSuffix.#' + path: src/PublicSuffix.php + - message: '#Property Pdp\\TopLevelDomains::\$modifiedDate \(DateTimeImmutable\) does not accept DateTimeInterface.#' + path: src/TopLevelDomains.php + - message: '#Method Pdp\\ResolvableDomain::resolve\(\) has parameter \$publicSuffix with no typehint specified.#' + path: src/ResolvableDomain.php + - message: '#Method Pdp\\ResolvableDomain::withSubDomain\(\) has parameter \$subDomain with no typehint specified.#' + path: src/ResolvableDomain.php + reportUnmatchedIgnoredErrors: true diff --git a/phpstan.tests.neon b/phpstan.tests.neon index 569e6434..08525d36 100644 --- a/phpstan.tests.neon +++ b/phpstan.tests.neon @@ -1,25 +1,25 @@ includes: - - vendor/phpstan/phpstan-strict-rules/rules.neon - - vendor/phpstan/phpstan-phpunit/extension.neon - - vendor/phpstan/phpstan-phpunit/rules.neon + - vendor/phpstan/phpstan-strict-rules/rules.neon + - vendor/phpstan/phpstan-phpunit/extension.neon + - vendor/phpstan/phpstan-phpunit/rules.neon parameters: - checkMissingIterableValueType: false - ignoreErrors: - - message: '#Parameter \#1 \$exception of method PHPUnit\\Framework\\TestCase::expectException\(\) expects class-string, string given\.#' - path: tests/CacheTest.php - - message: '#Parameter \#1 \$key of method Pdp\\Cache::get\(\) expects string, null given\.#' - path: tests/CacheTest.php - - message: '#Parameter \#3 \$ttl of method Pdp\\Cache::set\(\) expects DateInterval\|int\|null, DateTime\|false given\.#' - path: tests/CacheTest.php - - message: '#Parameter \#1 \$key of method Pdp\\Cache::set\(\) expects string, null given\.#' - path: tests/CacheTest.php - - message: '#Parameter \#1 \$key of method Pdp\\Cache::delete\(\) expects string, null given\.#' - path: tests/CacheTest.php - - message: '#Parameter \#1 \$key of method Pdp\\Cache::has\(\) expects string, null given\.#' - path: tests/CacheTest.php - - message: '#Parameter \#1 \$values of method Pdp\\Cache::setMultiple\(\) expects iterable, null given\.#' - path: tests/CacheTest.php - - message: '#Parameter \#1 \$keys of method Pdp\\Cache::getMultiple\(\) expects iterable, null given\.#' - path: tests/CacheTest.php - - message: '#Parameter \#1 \$keys of method Pdp\\Cache::deleteMultiple\(\) expects iterable, null given\.#' - path: tests/CacheTest.php + checkMissingIterableValueType: false + ignoreErrors: + - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Cache\\Psr16FileCache::set\(\) expects string, null given.#' + path: tests/Storage/Cache/Psr16FileCacheTest.php + - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Cache\\Psr16FileCache::delete\(\) expects string, null given.#' + path: tests/Storage/Cache/Psr16FileCacheTest.php + - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Cache\\Psr16FileCache::get\(\) expects string, null given.#' + path: tests/Storage/Cache/Psr16FileCacheTest.php + - message: '#Parameter \#3 \$ttl of method Pdp\\Storage\\Cache\\Psr16FileCache::set\(\) expects DateInterval\|int\|null, DateTime\|false given.#' + path: tests/Storage/Cache/Psr16FileCacheTest.php + - message: '#Parameter \#1 \$keys of method Pdp\\Storage\\Cache\\Psr16FileCache::deleteMultiple\(\) expects iterable, null given.#' + path: tests/Storage/Cache/Psr16FileCacheTest.php + - message: '#Parameter \#1 \$keys of method Pdp\\Storage\\Cache\\Psr16FileCache::getMultiple\(\) expects iterable, null given.#' + path: tests/Storage/Cache/Psr16FileCacheTest.php + - message: '#Parameter \#1 \$values of method Pdp\\Storage\\Cache\\Psr16FileCache::setMultiple\(\) expects iterable, null given.#' + path: tests/Storage/Cache/Psr16FileCacheTest.php + - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Cache\\Psr16FileCache::has\(\) expects string, null given.#' + path: tests/Storage/Cache/Psr16FileCacheTest.php + - message: '#Parameter \#1 \$exception of method PHPUnit\\Framework\\TestCase::expectException\(\) expects class-string\, string given.#' + path: tests/Storage/Cache/Psr16FileCacheTest.php diff --git a/src/Contract/DomainInterface.php b/src/Contract/DomainInterface.php new file mode 100644 index 00000000..ec2ecd8b --- /dev/null +++ b/src/Contract/DomainInterface.php @@ -0,0 +1,125 @@ + + */ + public function labels(): array; + + /** + * Returns the associated key for each label. + * + * If a value is specified only the keys associated with + * the given value will be returned + * + * @param string $label the total number of argument given to the method + * + * @return array + */ + public function keys(string $label): array; + + /** + * {@inheritdoc} + * + * The external iterator iterates over the DomainInterface labels + * from the right-most label to the left-most label. + */ + public function getIterator(); + + /** + * Tells whether the given domain can be resolved. + * + * A domain is resolvable if: + * - it contains at least 2 labels + * - it is not a absolute domain (end with a '.' character) + */ + public function isResolvable(): bool; + + /** + * Prepends a label to the domain. + * + * @see ::withLabel + * + * @param mixed $label a domain label + */ + public function prepend($label): self; + + /** + * Appends a label to the domain. + * + * @see ::withLabel + * + * @param mixed $label a domain label + */ + public function append($label): self; + + /** + * Returns an instance with the specified label added at the specified key. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the new label + * + * If $key is non-negative, the added label will be the label at $key position from the start. + * If $key is negative, the added label will be the label at $key position from the end. + * + * @param mixed $label a domain label + * + * @throws Exception If the key is out of bounds + * @throws Exception If the label is converted to the NULL value + */ + public function withLabel(int $key, $label): self; + + /** + * Returns an instance with the label at the specified key removed. + * + * This method MUST retain the state of the current instance, and return + * an instance without the specified label + * + * If $key is non-negative, the removed label will be the label at $key position from the start. + * If $key is negative, the removed label will be the label at $key position from the end. + * + * @param int ...$keys + * + * @throws Exception If the key is out of bounds + */ + public function withoutLabel(int $key, int ...$keys): self; +} diff --git a/src/Exception.php b/src/Contract/Exception.php similarity index 81% rename from src/Exception.php rename to src/Contract/Exception.php index 592a247d..b173cb87 100644 --- a/src/Exception.php +++ b/src/Contract/Exception.php @@ -13,10 +13,8 @@ declare(strict_types=1); -namespace Pdp; +namespace Pdp\Contract; -use InvalidArgumentException; - -class Exception extends InvalidArgumentException +interface Exception extends \Throwable { } diff --git a/src/DomainInterface.php b/src/Contract/HostInterface.php similarity index 57% rename from src/DomainInterface.php rename to src/Contract/HostInterface.php index 18a7ea8b..9553abd2 100644 --- a/src/DomainInterface.php +++ b/src/Contract/HostInterface.php @@ -13,10 +13,7 @@ declare(strict_types=1); -namespace Pdp; - -use Countable; -use IteratorAggregate; +namespace Pdp\Contract; /** * Domain Interface. @@ -25,41 +22,42 @@ * @see https://tools.ietf.org/html/rfc1123#section-2.1 * @see https://tools.ietf.org/html/rfc5890 */ -interface DomainInterface extends Countable, IteratorAggregate +interface HostInterface extends \Countable { /** * Returns the domain content. */ public function getContent(): ?string; + /** + * {@inheritdoc} + * + * Labels The total number. + */ + public function count(): int; + /** * Returns the domain content as a string. */ public function __toString(): string; /** - * Retrieves a single domain label. - * - * If $key is non-negative, the returned value will be the label at $key position from the start. - * If $key is negative, the returned value will be the label at $key position from the end. + * Gets conversion options for idn_to_ascii. * - * If no label is found the submitted $key the returned value will be null. + * combination of IDNA_* constants (except IDNA_ERROR_* constants). * - * @param int $key the label offset + * @see https://www.php.net/manual/en/intl.constants.php */ - public function getLabel(int $key): ?string; + public function getAsciiIDNAOption(): int; /** - * Returns the associated key for each label. + * Gets conversion options for idn_to_utf8. * - * If a value is specified only the keys associated with - * the given value will be returned + * combination of IDNA_* constants (except IDNA_ERROR_* constants). * - * @param string $label the total number of argument given to the method - * - * @return int[] + * @see https://www.php.net/manual/en/intl.constants.php */ - public function keys(string $label): array; + public function getUnicodeIDNAOption(): int; /** * Converts the domain to its IDNA ASCII form. @@ -68,6 +66,8 @@ public function keys(string $label): array; * an instance with its content converted to its IDNA ASCII form * * @throws Exception if the domain can not be converted to ASCII using IDN UTS46 algorithm + * + * @return static */ public function toAscii(): self; @@ -78,15 +78,30 @@ public function toAscii(): self; * an instance with its content converted to its IDNA UTF8 form * * @throws Exception if the domain can not be converted to Unicode using IDN UTS46 algorithm + * + * @return static */ public function toUnicode(): self; + /** + * Sets conversion options for idn_to_ascii. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). + * + * @see https://www.php.net/manual/en/intl.constants.php + * + * @return static + */ + public function withAsciiIDNAOption(int $option): self; /** - * {@inheritdoc} + * Sets conversion options for idn_to_utf8. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). + * + * @see https://www.php.net/manual/en/intl.constants.php * - * The external iterator iterates over the DomainInterface labels - * from the right-most label to the left-most label. + * @return static */ - public function getIterator(); + public function withUnicodeIDNAOption(int $option): self; } diff --git a/src/Contract/PublicSuffixInterface.php b/src/Contract/PublicSuffixInterface.php new file mode 100644 index 00000000..70f00bd1 --- /dev/null +++ b/src/Contract/PublicSuffixInterface.php @@ -0,0 +1,34 @@ + */ - private $asciiIDNAOption = IDNA_DEFAULT; + private array $labels; - /** - * @var int - */ - private $unicodeIDNAOption = IDNA_DEFAULT; + private int $asciiIDNAOption; - /** - * @var bool - */ - private $isTransitionalDifferent; + private int $unicodeIDNAOption; /** - * New instance. - * @param null|mixed $domain - * @param null|PublicSuffix $publicSuffix - * @param int $asciiIDNAOption - * @param int $unicodeIDNAOption + * @param null|mixed $domain */ public function __construct( $domain = null, - PublicSuffix $publicSuffix = null, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT ) { @@ -113,141 +61,26 @@ public function __construct( $this->unicodeIDNAOption = $unicodeIDNAOption; $infos = $this->parse($domain, $asciiIDNAOption, $unicodeIDNAOption); $this->labels = $infos['labels']; - $this->isTransitionalDifferent = $infos['isTransitionalDifferent']; - if ([] !== $this->labels) { - $this->domain = implode('.', array_reverse($this->labels)); + $this->domain = implode('.', array_reverse($this->labels)); + if ([] === $this->labels) { + $this->domain = null; } - $this->publicSuffix = $this->setPublicSuffix( - $publicSuffix ?? new PublicSuffix(null, '', $asciiIDNAOption, $unicodeIDNAOption) - ); - $this->registrableDomain = $this->setRegistrableDomain(); - $this->subDomain = $this->setSubDomain(); } - /** - * {@inheritdoc} - */ public static function __set_state(array $properties): self { return new self( $properties['domain'], - $properties['publicSuffix'], - $properties['asciiIDNAOption'] ?? IDNA_DEFAULT, - $properties['unicodeIDNAOption'] ?? IDNA_DEFAULT + $properties['asciiIDNAOption'], + $properties['unicodeIDNAOption'] ); } - /** - * Sets the public suffix domain part. - * - * @param PublicSuffix $publicSuffix - * - * @throws CouldNotResolvePublicSuffix If the public suffic can not be attached to the domain - * - * @return PublicSuffix - */ - private function setPublicSuffix(PublicSuffix $publicSuffix): PublicSuffix - { - if (null === $publicSuffix->getContent()) { - return $publicSuffix; - } - - if (null === $this->domain || !$this->isResolvable()) { - throw CouldNotResolvePublicSuffix::dueToUnresolvableDomain($this); - } - - $publicSuffix = $this->normalize($publicSuffix); - /** @var string $psContent */ - $psContent = $publicSuffix->getContent(); - if ($this->domain === $psContent) { - throw new CouldNotResolvePublicSuffix(sprintf('The public suffix `%s` can not be equal to the domain name `%s`', $psContent, $this->domain)); - } - - if ('.'.$psContent !== substr($this->domain, - strlen($psContent) - 1)) { - throw new CouldNotResolvePublicSuffix(sprintf('The public suffix `%s` can not be assign to the domain name `%s`', $psContent, $this->domain)); - } - - return $publicSuffix; - } - - /** - * Normalize the domain name encoding content. - * - * @param PublicSuffix $subject - * - * @return PublicSuffix - */ - private function normalize(PublicSuffix $subject): PublicSuffix - { - if (null === $this->domain || null === $subject->getContent()) { - return $subject; - } - - if (1 !== preg_match(self::REGEXP_IDN_PATTERN, $this->domain)) { - /** @var PublicSuffix $result */ - $result = $subject->toAscii(); - - return $result; - } - - /** @var PublicSuffix $result */ - $result = $subject->toUnicode(); - - return $result; - } - - /** - * Computes the registrable domain part. - * - * @return string|null - */ - private function setRegistrableDomain() + public static function fromNull(int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self { - if (null === $this->domain) { - return null; - } - - if (null === $this->publicSuffix->getContent()) { - return null; - } - - return implode('.', array_slice( - explode('.', $this->domain), - count($this->labels) - count($this->publicSuffix) - 1 - )); + return new self(null, $asciiIDNAOption, $unicodeIDNAOption); } - /** - * Computes the sub domain part. - * - * @return string|null - */ - private function setSubDomain() - { - if (null === $this->domain) { - return null; - } - - if (null === $this->registrableDomain) { - return null; - } - - $nbLabels = count($this->labels); - $nbRegistrableLabels = count($this->publicSuffix) + 1; - if ($nbLabels === $nbRegistrableLabels) { - return null; - } - - return implode('.', array_slice( - explode('.', $this->domain), - 0, - $nbLabels - $nbRegistrableLabels - )); - } - - /** - * {@inheritdoc} - */ public function getIterator() { foreach ($this->labels as $offset => $label) { @@ -255,75 +88,27 @@ public function getIterator() } } - /** - * {@inheritdoc} - */ - public function jsonSerialize(): array - { - return $this->__debugInfo(); - } - - /** - * {@inheritdoc} - */ - public function __debugInfo(): array + public function jsonSerialize(): ?string { - return [ - 'domain' => $this->domain, - 'registrableDomain' => $this->registrableDomain, - 'subDomain' => $this->subDomain, - 'publicSuffix' => $this->publicSuffix->getContent(), - 'isKnown' => $this->isKnown(), - 'isICANN' => $this->isICANN(), - 'isPrivate' => $this->isPrivate(), - ]; + return $this->getContent(); } - /** - * {@inheritdoc} - */ public function count(): int { return count($this->labels); } - /** - * {@inheritdoc} - */ public function getContent(): ?string { return $this->domain; } - /** - * {@inheritdoc} - */ public function __toString(): string { return (string) $this->domain; } - /** - * Returns the full domain name. - * - * DEPRECATION WARNING! This method will be removed in the next major point release - * - * @deprecated 5.3 deprecated - * @see Domain::getContent - * - * This method should return null on seriously malformed domain name - * - * @return string|null - */ - public function getDomain() - { - return $this->getContent(); - } - - /** - * {@inheritdoc} - */ - public function getLabel(int $key): ?string + public function label(int $key): ?string { if ($key < 0) { $key += count($this->labels); @@ -332,110 +117,26 @@ public function getLabel(int $key): ?string return $this->labels[$key] ?? null; } - /** - * {@inheritdoc} - */ public function keys(string $label): array { return array_keys($this->labels, $label, true); } - /** - * Returns the object labels. - */ public function labels(): array { return $this->labels; } - /** - * Gets conversion options for idn_to_ascii. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - * - * @return int - */ public function getAsciiIDNAOption(): int { return $this->asciiIDNAOption; } - /** - * Gets conversion options for idn_to_utf8. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - * - * @return int - */ public function getUnicodeIDNAOption(): int { return $this->unicodeIDNAOption; } - /** - * Returns true if domain contains deviation characters. - * - * @see http://unicode.org/reports/tr46/#Transition_Considerations - * - * @return bool - */ - public function isTransitionalDifferent(): bool - { - return $this->isTransitionalDifferent; - } - - /** - * Returns the registrable domain. - * - * The registered or registrable domain is the public suffix plus one additional label. - * - * This method returns null if the registrable domain is equal to the public suffix. - * - * @return string|null registrable domain - */ - public function getRegistrableDomain(): ?string - { - return $this->registrableDomain; - } - - /** - * Returns the sub domain. - * - * The sub domain represents the remaining labels without the registrable domain. - * - * This method returns null if the registrable domain is null - * This method returns null if the registrable domain is equal to the public suffix - * - * @return string|null registrable domain - */ - public function getSubDomain(): ?string - { - return $this->subDomain; - } - - /** - * Returns the public suffix. - * - * @return string|null - */ - public function getPublicSuffix(): ?string - { - return $this->publicSuffix->getContent(); - } - - /** - * Tells whether the given domain can be resolved. - * - * A domain is resolvable if: - * - it contains at least 2 labels - * - it is not a absolute domain (end with a '.' character) - * - * @return bool - */ public function isResolvable(): bool { return null !== $this->domain @@ -444,40 +145,7 @@ public function isResolvable(): bool ; } - /** - * Tells whether the public suffix has a matching rule in a Public Suffix List. - * - * @return bool - */ - public function isKnown(): bool - { - return $this->publicSuffix->isKnown(); - } - - /** - * Tells whether the public suffix has a matching rule in a Public Suffix List ICANN Section. - * - * @return bool - */ - public function isICANN(): bool - { - return $this->publicSuffix->isICANN(); - } - - /** - * Tells whether the public suffix has a matching rule in a Public Suffix List Private Section. - * - * @return bool - */ - public function isPrivate(): bool - { - return $this->publicSuffix->isPrivate(); - } - - /** - * {@inheritdoc} - */ - public function toAscii(): DomainInterface + public function toAscii(): self { if (null === $this->domain) { return $this; @@ -488,13 +156,10 @@ public function toAscii(): DomainInterface return $this; } - return new self($domain, $this->publicSuffix, $this->asciiIDNAOption, $this->unicodeIDNAOption); + return new self($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption); } - /** - * {@inheritdoc} - */ - public function toUnicode(): DomainInterface + public function toUnicode(): self { if (null === $this->domain || false === strpos($this->domain, 'xn--')) { return $this; @@ -502,122 +167,6 @@ public function toUnicode(): DomainInterface return new self( $this->idnToUnicode($this->domain, $this->unicodeIDNAOption), - $this->publicSuffix, - $this->asciiIDNAOption, - $this->unicodeIDNAOption - ); - } - - /** - * Returns a Domain object with a new resolve public suffix. - * - * The Public Suffix must be valid for the given domain name. - * ex: if the domain name is www.ulb.ac.be the only valid public suffixes - * are: be, ac.be, ulb.ac.be, or the null public suffix. Any other public - * suffix will throw an Exception. - * - * This method MUST retain the state of the current instance, and return - * an instance that contains the modified Public Suffix Information. - * - * @param mixed $publicSuffix - * - * @return self - */ - public function resolve($publicSuffix): self - { - if (!$publicSuffix instanceof PublicSuffix) { - $publicSuffix = new PublicSuffix( - $publicSuffix, - '', - $this->asciiIDNAOption, - $this->unicodeIDNAOption - ); - } - - $publicSuffix = $this->normalize($publicSuffix); - if ($this->publicSuffix == $publicSuffix) { - return $this; - } - - return new self($this->domain, $publicSuffix, $this->asciiIDNAOption, $this->unicodeIDNAOption); - } - - /** - * Returns an instance with the specified public suffix added. - * - * This method MUST retain the state of the current instance, and return - * an instance that contains the new public suffix - * - * If the domain already has a public suffix it will be replaced by the new value - * otherwise the public suffix content is added to or remove from the current domain. - * - * @param mixed $publicSuffix - */ - public function withPublicSuffix($publicSuffix): self - { - if (!$publicSuffix instanceof PublicSuffix) { - $publicSuffix = new PublicSuffix( - $publicSuffix, - '', - $this->asciiIDNAOption, - $this->unicodeIDNAOption - ); - } - - $publicSuffix = $this->normalize($publicSuffix); - if ($this->publicSuffix == $publicSuffix) { - return $this; - } - - $domain = implode('.', array_reverse(array_slice($this->labels, count($this->publicSuffix)))); - if (null === $publicSuffix->getContent()) { - return new self($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); - } - - return new self( - $domain.'.'.$publicSuffix->getContent(), - $publicSuffix, - $this->asciiIDNAOption, - $this->unicodeIDNAOption - ); - } - - - /** - * Returns an instance with the specified sub domain added. - * - * This method MUST retain the state of the current instance, and return - * an instance that contains the new sub domain - * - * @param mixed $subDomain the subdomain to add - * - * @throws CouldNotResolveSubDomain If the Sub domain can not be added to the current Domain - * - * @return self - */ - public function withSubDomain($subDomain): self - { - if (null === $this->registrableDomain) { - throw new CouldNotResolveSubDomain('A subdomain can not be added to a domain without a registrable domain part.'); - } - - $subDomain = $this->normalizeContent($subDomain); - if ($this->subDomain === $subDomain) { - return $this; - } - - if (null === $subDomain) { - return new self( - $this->registrableDomain, - $this->publicSuffix, - $this->asciiIDNAOption, - $this->unicodeIDNAOption - ); - } - - return new self( - $subDomain.'.'.$this->registrableDomain, - $this->publicSuffix, $this->asciiIDNAOption, $this->unicodeIDNAOption ); @@ -626,24 +175,18 @@ public function withSubDomain($subDomain): self /** * Filter a subdomain to update the domain part. * - * @param mixed $domain + * @param string|object $domain a domain * * @throws TypeError if the domain can not be converted - * - * @return string|null */ - private function normalizeContent($domain) + private function normalizeContent($domain): string { - if ($domain instanceof DomainInterface) { + if ($domain instanceof HostInterface) { $domain = $domain->getContent(); } - if (null === $domain) { - return $domain; - } - - if (!is_scalar($domain) && !method_exists($domain, '__toString')) { - throw new TypeError(sprintf('The domain or label must be a scalar, a stringable object or NULL, `%s` given', gettype($domain))); + if (null === $domain || (!is_string($domain) && !method_exists($domain, '__toString'))) { + throw new TypeError(sprintf('The label must be a '.HostInterface::class.', a stringable object or a string, `%s` given', gettype($domain))); } $domain = (string) $domain; @@ -658,56 +201,21 @@ private function normalizeContent($domain) return $this->idnToAscii($domain, $this->asciiIDNAOption); } - /** - * Prepends a label to the domain. - * - * @see ::withLabel - * - * @param mixed $label - * - * @return self - */ public function prepend($label): self { return $this->withLabel(count($this->labels), $label); } - /** - * Appends a label to the domain. - * - * @see ::withLabel - * - * @param mixed $label - * - * @return self - */ public function append($label): self { return $this->withLabel(- count($this->labels) - 1, $label); } - /** - * Returns an instance with the specified label added at the specified key. - * - * This method MUST retain the state of the current instance, and return - * an instance that contains the new label - * - * If $key is non-negative, the added label will be the label at $key position from the start. - * If $key is negative, the added label will be the label at $key position from the end. - * - * @param int $key - * @param mixed $label - * - * @throws InvalidLabelKey If the key is out of bounds - * @throws InvalidLabel If the label is converted to the NULL value - * - * @return self - */ public function withLabel(int $key, $label): self { $nb_labels = count($this->labels); if ($key < - $nb_labels - 1 || $key > $nb_labels) { - throw new InvalidLabelKey(sprintf('the given key `%s` is invalid', $key)); + throw InvalidDomain::dueToInvalidLabelKey($key); } if (0 > $key) { @@ -715,9 +223,6 @@ public function withLabel(int $key, $label): self } $label = $this->normalizeContent($label); - if (null === $label) { - throw new InvalidLabel(sprintf('The label can not be NULL')); - } if (($this->labels[$key] ?? null) === $label) { return $this; @@ -727,46 +232,20 @@ public function withLabel(int $key, $label): self $labels[$key] = $label; ksort($labels); - if (null !== $this->publicSuffix->getLabel($key)) { - return new self( - implode('.', array_reverse($labels)), - null, - $this->asciiIDNAOption, - $this->unicodeIDNAOption - ); - } - return new self( implode('.', array_reverse($labels)), - $this->publicSuffix, $this->asciiIDNAOption, $this->unicodeIDNAOption ); } - /** - * Returns an instance with the label at the specified key removed. - * - * This method MUST retain the state of the current instance, and return - * an instance without the specified label - * - * If $key is non-negative, the removed label will be the label at $key position from the start. - * If $key is negative, the removed label will be the label at $key position from the end. - * - * @param int $key - * @param int ...$keys remaining keys to remove - * - * @throws InvalidLabelKey If the key is out of bounds - * - * @return self - */ public function withoutLabel(int $key, int ...$keys): self { array_unshift($keys, $key); $nb_labels = count($this->labels); foreach ($keys as &$offset) { if (- $nb_labels > $offset || $nb_labels - 1 < $offset) { - throw new InvalidLabelKey(sprintf('the key `%s` is invalid', $offset)); + throw InvalidDomain::dueToInvalidLabelKey($key); } if (0 > $offset) { @@ -784,55 +263,29 @@ public function withoutLabel(int $key, int ...$keys): self } if ([] === $labels) { - return new self(null, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); + return new self(null, $this->asciiIDNAOption, $this->unicodeIDNAOption); } $domain = implode('.', array_reverse($labels)); - $psContent = $this->publicSuffix->getContent(); - if (null === $psContent || '.'.$psContent !== substr($domain, - strlen($psContent) - 1)) { - return new self($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); - } - return new self($domain, $this->publicSuffix, $this->asciiIDNAOption, $this->unicodeIDNAOption); + return new self($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption); } - /** - * Sets conversion options for idn_to_ascii. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - * - * @param int $option - * - * @return self - */ public function withAsciiIDNAOption(int $option): self { if ($option === $this->asciiIDNAOption) { return $this; } - return new self($this->domain, $this->publicSuffix, $option, $this->unicodeIDNAOption); + return new self($this->domain, $option, $this->unicodeIDNAOption); } - /** - * Sets conversion options for idn_to_utf8. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - * - * @param int $option - * - * @return self - */ public function withUnicodeIDNAOption(int $option): self { if ($option === $this->unicodeIDNAOption) { return $this; } - return new self($this->domain, $this->publicSuffix, $this->asciiIDNAOption, $option); + return new self($this->domain, $this->asciiIDNAOption, $option); } } diff --git a/src/Exception/CouldNotLoadRules.php b/src/Exception/CouldNotLoadRules.php deleted file mode 100644 index 9cbb5a7a..00000000 --- a/src/Exception/CouldNotLoadRules.php +++ /dev/null @@ -1,22 +0,0 @@ -getContent(); - } - - $exception = new self(sprintf('The domain `%s` can not contain a public suffix.', $content)); - $exception->domain = $domain; - - return $exception; - } - - public static function dueToUnSupportedSection(string $section): self - { - return new self('`'.$section.'` is an unknown Public Suffix List section.'); - } - - public function hasDomain(): bool - { - return null !== $this->domain; - } - - public function getDomain(): ?Domain - { - return $this->domain; - } -} diff --git a/src/Exception/CouldNotResolveSubDomain.php b/src/Exception/CouldNotResolveSubDomain.php deleted file mode 100644 index 0ced9ace..00000000 --- a/src/Exception/CouldNotResolveSubDomain.php +++ /dev/null @@ -1,22 +0,0 @@ - */ -trait IDNAConverterTrait +abstract class HostParser { /** * Get and format IDN conversion error message. - * - * @param int $error_byte - * - * @return string */ - private static function getIdnErrors(int $error_byte): string + private static function getIdnErrors(int $errorByte): string { /** * IDNA errors. * * @see http://icu-project.org/apiref/icu4j/com/ibm/icu/text/IDNA.Error.html */ - static $idn_errors = [ + static $idnErrors = [ IDNA_ERROR_EMPTY_LABEL => 'a non-final domain name label (or the whole domain name) is empty', IDNA_ERROR_LABEL_TOO_LONG => 'a domain name label is longer than 63 bytes', IDNA_ERROR_DOMAIN_NAME_TOO_LONG => 'a domain name is longer than 255 bytes in its storage form', @@ -88,8 +82,8 @@ private static function getIdnErrors(int $error_byte): string ]; $res = []; - foreach ($idn_errors as $error => $reason) { - if ($error === ($error_byte & $error)) { + foreach ($idnErrors as $error => $reason) { + if ($error === ($errorByte & $error)) { $res[] = $reason; } } @@ -102,17 +96,11 @@ private static function getIdnErrors(int $error_byte): string * * This method returns the string converted to IDN ASCII form * - * @param string $domain - * - * @param int $option - * * @throws InvalidDomain if the string can not be converted to ASCII using IDN UTS46 algorithm - * - * @return string */ - private function idnToAscii(string $domain, int $option = IDNA_DEFAULT): string + final protected function idnToAscii(string $domain, int $option = IDNA_DEFAULT): string { - list($domain, ) = $this->transformToAscii($domain, $option); + [$domain, ] = $this->transformToAscii($domain, $option); return $domain; } @@ -120,13 +108,7 @@ private function idnToAscii(string $domain, int $option = IDNA_DEFAULT): string /** * Returns the IDNA ASCII form and its isTransitionalDifferent state. * - * @param string $domain - * - * @param int $option - * * @throws InvalidDomain if the string can not be converted to ASCII using IDN UTS46 algorithm - * - * @return array */ private function transformToAscii(string $domain, int $option): array { @@ -140,11 +122,11 @@ private function transformToAscii(string $domain, int $option): array $output = idn_to_ascii($domain, $option, INTL_IDNA_VARIANT_UTS46, $infos); if ([] === $infos) { - throw new InvalidDomain(sprintf('The host `%s` is invalid', $domain)); + throw InvalidDomain::dueToIDNAError($domain); } if (0 !== $infos['errors']) { - throw new InvalidDomain(sprintf('The host `%s` is invalid : %s', $domain, self::getIdnErrors($infos['errors']))); + throw InvalidDomain::dueToIDNAError($domain, self::getIdnErrors($infos['errors'])); } // @codeCoverageIgnoreStart @@ -157,63 +139,37 @@ private function transformToAscii(string $domain, int $option): array return [$output, $infos]; } - throw new InvalidDomain(sprintf('The host `%s` is invalid: it contains invalid characters', $domain)); + throw InvalidDomain::dueToInvalidCharacters($domain); } + /** * Converts the input to its IDNA UNICODE form. * * This method returns the string converted to IDN UNICODE form * - * @param string $domain - * - * @param int $option - * * @throws InvalidDomain if the string can not be converted to UNICODE using IDN UTS46 algorithm * @throws UnexpectedValueException if the intl extension is misconfigured - * - * @return string */ - private function idnToUnicode(string $domain, int $option = IDNA_DEFAULT): string + final protected function idnToUnicode(string $domain, int $option = IDNA_DEFAULT): string { $output = idn_to_utf8($domain, $option, INTL_IDNA_VARIANT_UTS46, $info); if ([] === $info) { - throw new InvalidDomain(sprintf('The host `%s` is invalid', $domain)); + throw InvalidDomain::dueToIDNAError($domain); } if (0 !== $info['errors']) { - throw new InvalidDomain(sprintf('The host `%s` is invalid : %s', $domain, self::getIdnErrors($info['errors']))); + throw InvalidDomain::dueToIDNAError($domain, self::getIdnErrors($info['errors'])); } // @codeCoverageIgnoreStart if (false === $output) { - throw new UnexpectedValueException(sprintf('The Intl extension is misconfigured for %s, please correct this issue before proceeding.', PHP_OS)); + throw new UnexpectedValueException(sprintf('The Intl extension for %s is misconfigured. Please correct this issue before proceeding.', PHP_OS)); } // @codeCoverageIgnoreEnd return $output; } - /** - * Filter and format the domain to ensure it is valid. - * Returns an array containing the formatted domain name in lowercase - * with its associated labels in reverse order - * For example: parse('wWw.uLb.Ac.be') should return ['be', 'ac', 'ulb', 'www'];. - * - * @deprecated - * - * @codeCoverageIgnore - * - * @param mixed $domain - * - * @throws InvalidDomain If the domain is invalid - * - * @return string[] - */ - private function setLabels($domain = null): array - { - return $this->parse($domain, IDNA_DEFAULT, IDNA_DEFAULT)['labels']; - } - /** * Parse and format the domain to ensure it is valid. * Returns an array containing the formatted domain name labels @@ -222,17 +178,13 @@ private function setLabels($domain = null): array * For example: parse('wWw.uLb.Ac.be') should return * ['labels' => ['be', 'ac', 'ulb', 'www'], 'isTransitionalDifferant' => false];. * - * @param mixed $domain - * @param int $asciiOption - * @param int $unicodeOption + * @param mixed $domain a domain * * @throws InvalidDomain If the domain is invalid - * - * @return array */ - private function parse($domain = null, int $asciiOption = 0, int $unicodeOption = 0): array + final protected function parse($domain = null, int $asciiOption = 0, int $unicodeOption = 0): array { - if ($domain instanceof DomainInterface) { + if ($domain instanceof HostInterface) { $domain = $domain->getContent(); } @@ -244,14 +196,14 @@ private function parse($domain = null, int $asciiOption = 0, int $unicodeOption return ['labels' => [''], 'isTransitionalDifferent' => false]; } - if (!is_scalar($domain) && !method_exists($domain, '__toString')) { + if (!is_string($domain) && !method_exists($domain, '__toString')) { throw new TypeError(sprintf('The domain must be a scalar, a stringable object, a DomainInterface object or null; `%s` given', gettype($domain))); } $domain = (string) $domain; $res = filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); if (false !== $res) { - throw new InvalidDomain(sprintf('The domain `%s` is invalid: this is an IPv4 host', $domain)); + throw InvalidDomain::dueToUnsupportedType($domain); } $formatted_domain = rawurldecode($domain); @@ -274,16 +226,16 @@ private function parse($domain = null, int $asciiOption = 0, int $unicodeOption // a domain name can not contains URI delimiters or space static $gen_delims = '/[:\/?#\[\]@ ]/'; if (1 === preg_match($gen_delims, $formatted_domain)) { - throw new InvalidDomain(sprintf('The domain `%s` is invalid: it contains invalid characters', $domain)); + throw InvalidDomain::dueToInvalidCharacters($domain); } // if the domain name does not contains UTF-8 chars then it is malformed static $pattern = '/[^\x20-\x7f]/'; if (1 !== preg_match($pattern, $formatted_domain)) { - throw new InvalidDomain(sprintf('The domain `%s` is invalid: the labels are malformed', $domain)); + throw InvalidDomain::dueToMalformedLabels($domain); } - list($ascii_domain, $infos) = $this->transformToAscii($domain, $asciiOption); + [$ascii_domain, $infos] = $this->transformToAscii($domain, $asciiOption); $infos['labels'] = array_reverse(explode('.', $this->idnToUnicode($ascii_domain, $unicodeOption))); return $infos; diff --git a/src/Installer.php b/src/Installer.php deleted file mode 100644 index 7dbccbd9..00000000 --- a/src/Installer.php +++ /dev/null @@ -1,276 +0,0 @@ - - */ -final class Installer -{ - const CACHE_DIR_KEY = 'cache-dir'; - const REFRESH_PSL_KEY = 'psl'; - const REFRESH_PSL_URL_KEY = 'psl-url'; - const REFRESH_RZD_KEY = 'rzd'; - const REFRESH_RZD_URL_KEY = 'rzd-url'; - const TTL_KEY = 'ttl'; - - const DEFAULT_CONTEXT = [ - self::CACHE_DIR_KEY => '', - self::REFRESH_PSL_KEY => false, - self::REFRESH_PSL_URL_KEY => Manager::PSL_URL, - self::REFRESH_RZD_KEY => false, - self::REFRESH_RZD_URL_KEY => Manager::RZD_URL, - self::TTL_KEY => '1 DAY', - ]; - - /** - * @var Manager - */ - private $manager; - - /** - * @var LoggerInterface - */ - private $logger; - - public function __construct(Manager $manager, LoggerInterface $logger) - { - $this->manager = $manager; - $this->logger = $logger; - } - - /** - * Creates a new instance with a Pdp\Cache object and the cURL HTTP client. - * @param LoggerInterface $logger - * @param string $cacheDir - */ - public static function createFromCacheDir(LoggerInterface $logger, string $cacheDir = ''): self - { - return new self(new Manager(new Cache($cacheDir), new CurlHttpClient()), $logger); - } - - /** - * Refresh the locale cache. - * @param array $context - */ - public function refresh(array $context = []): bool - { - $context = filter_var_array(array_replace(self::DEFAULT_CONTEXT, $context), [ - self::REFRESH_PSL_KEY => FILTER_VALIDATE_BOOLEAN, - self::REFRESH_PSL_URL_KEY => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW, 'default' => Manager::PSL_URL], - self::REFRESH_RZD_KEY => FILTER_VALIDATE_BOOLEAN, - self::REFRESH_RZD_URL_KEY => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW, 'default' => Manager::RZD_URL], - self::TTL_KEY => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW, 'default' => '1 DAY'], - ]); - - if (false === $context[self::REFRESH_RZD_KEY] && false === $context[self::REFRESH_PSL_KEY]) { - $context[self::REFRESH_PSL_KEY] = true; - $context[self::REFRESH_RZD_KEY] = true; - } - - try { - return $this->execute($context); - } catch (PsrCacheException $exception) { - $this->logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); - return false; - } catch (Throwable $exception) { - $this->logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); - return false; - } - } - - /** - * Refreshes the cache. - * @param array $arguments - */ - private function execute(array $arguments = []): bool - { - if ($arguments[self::REFRESH_PSL_KEY]) { - if (!$this->manager->refreshRules($arguments[self::REFRESH_PSL_URL_KEY], $arguments[self::TTL_KEY])) { - $this->logger->error('Unable to update the Public Suffix List Cache using {psl_url} with a TTL of {ttl}', [ - 'psl_url' => $arguments[self::REFRESH_PSL_URL_KEY], - 'ttl' => $arguments[self::TTL_KEY], - ]); - - return false; - } - - $this->logger->info('Public Suffix List Cache updated for {ttl} using {psl_url}', [ - 'psl_url' => $arguments[self::REFRESH_PSL_URL_KEY], - 'ttl' => $arguments[self::TTL_KEY], - ]); - } - - if (!$arguments[self::REFRESH_RZD_KEY]) { - return true; - } - - $this->logger->info('Updating your IANA Root Zone Database copy.'); - if ($this->manager->refreshTLDs($arguments[self::REFRESH_RZD_URL_KEY], $arguments[self::TTL_KEY])) { - $this->logger->info('IANA Root Zone Database Cache updated for {ttl} using {rzd_url}', [ - 'rzd_url' => $arguments[self::REFRESH_RZD_URL_KEY], - 'ttl' => $arguments[self::TTL_KEY], - ]); - - return true; - } - - $this->logger->error('Unable to update the IANA Root Zone Database Cache using {rzd_url} with a TTL of {ttl}', [ - 'rzd_url' => $arguments[self::REFRESH_RZD_URL_KEY], - 'ttl' => $arguments[self::TTL_KEY], - ]); - - return false; - } - - /** - * Script to update the local cache using composer hook. - * @param null|Event $event - */ - public static function updateLocalCache(Event $event = null): void - { - $io = self::getIO($event); - if (!extension_loaded('curl')) { - $io->writeError('The required PHP cURL extension is missing.'); - - die(1); - } - - $vendor = self::getVendorPath($event); - if (null === $vendor) { - $io->writeError([ - 'You must set up the project dependencies using composer', - 'see https://getcomposer.org', - ]); - - die(1); - } - - require $vendor.'/autoload.php'; - - $logger = new Logger(); - $arguments = [ - self::CACHE_DIR_KEY => '', - self::REFRESH_PSL_KEY => false, - self::REFRESH_RZD_KEY => false, - self::TTL_KEY => '1 DAY', - ]; - - if (null !== $event) { - /** @var BaseIO $logger */ - $logger = $event->getIO(); - $arguments = array_replace($arguments, $event->getArguments()); - } - - $installer = self::createFromCacheDir($logger, $arguments[Installer::CACHE_DIR_KEY]); - $io->write('Updating your Pdp local cache.'); - if ($installer->refresh($arguments)) { - $io->write('Pdp local cache successfully updated.'); - die(0); - } - - $io->writeError('The command failed to update Pdp local cache.'); - die(1); - } - - /** - * Detect the I/O instance to use. - * - * @param Event|null $event - * - * @return mixed - */ - private static function getIO(Event $event = null) - { - return null !== $event ? $event->getIO() : new class() { - /** - * @param string|string[] $messages - * @param bool $newline - * @param int $verbosity - */ - public function write($messages, bool $newline = true, int $verbosity = 2): void - { - $this->doWrite($messages, $newline, false, $verbosity); - } - - /** - * @param string|string[] $messages - * @param bool $newline - * @param int $verbosity - */ - public function writeError($messages, bool $newline = true, int $verbosity = 2): void - { - $this->doWrite($messages, $newline, true, $verbosity); - } - - /** - * @param string|string[] $messages - * @param bool $newline - * @param bool $stderr - * @param int $verbosity - */ - private function doWrite($messages, bool $newline, bool $stderr, int $verbosity): void - { - fwrite( - $stderr ? STDERR : STDOUT, - implode($newline ? PHP_EOL : '', (array) $messages).PHP_EOL - ); - } - }; - } - - /** - * Detect the vendor path. - * - * @param Event|null $event - * - * @return string|null - */ - private static function getVendorPath(Event $event = null) - { - if (null !== $event) { - return $event->getComposer()->getConfig()->get('vendor-dir'); - } - - for ($i = 1; $i <= 5; $i++) { - if (is_dir($vendor = dirname(__DIR__, $i).'/vendor') && file_exists($vendor.'/autoload.php')) { - return $vendor; - } - } - - return null; - } -} diff --git a/src/InvalidDomain.php b/src/InvalidDomain.php new file mode 100644 index 00000000..918f8c1b --- /dev/null +++ b/src/InvalidDomain.php @@ -0,0 +1,61 @@ + - * @author Ignace Nyamagana Butera - */ -final class Manager -{ - public const PSL_URL = 'https://publicsuffix.org/list/public_suffix_list.dat'; - public const RZD_URL = 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt'; - - /** - * @var CacheInterface - */ - private $cache; - - /** - * @var HttpClient - */ - private $http; - - /** - * @var DateInterval|null - */ - private $ttl; - - /** - * new instance. - * - * @param CacheInterface $cache - * @param HttpClient $http - * @param null|mixed $ttl - */ - public function __construct(CacheInterface $cache, HttpClient $http, $ttl = null) - { - $this->cache = $cache; - $this->http = $http; - $this->ttl = $this->filterTtl($ttl); - } - - /** - * Gets the Public Suffix List Rules. - * - * @param string $url the Public Suffix List URL - * @param null|mixed $ttl the cache TTL - * @param int $asciiIDNAOption - * @param int $unicodeIDNAOption - * - * @throws CouldNotLoadRules - * - * @return Rules - */ - public function getRules( - string $url = self::PSL_URL, - $ttl = null, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT - ): Rules { - $key = $this->getCacheKey('PSL', $url); - $data = $this->cache->get($key); - - if (null === $data && !$this->refreshRules($url, $ttl)) { - throw new CouldNotLoadRules(sprintf('Unable to load the public suffix list rules for %s', $url)); - } - - $data = json_decode($data ?? $this->cache->get($key), true); - if (JSON_ERROR_NONE === json_last_error()) { - return new Rules($data, $asciiIDNAOption, $unicodeIDNAOption); - } - - throw new CouldNotLoadRules(sprintf('The public suffix list cache is corrupted: %s', json_last_error_msg()), json_last_error()); - } - - /** - * Downloads, converts and cache the Public Suffix. - * - * If a local cache already exists, it will be overwritten. - * - * Returns true if the refresh was successful - * - * @param string $url the Public Suffix List URL - * @param null|mixed $ttl the cache TTL - * - * @throws HttpClientException - * - * @return bool - */ - public function refreshRules(string $url = self::PSL_URL, $ttl = null): bool - { - static $converter; - - $converter = $converter ?? new Converter(); - $data = json_encode($converter->convert($this->http->getContent($url))); - - return $this->cache->set($this->getCacheKey('PSL', $url), $data, $this->filterTtl($ttl) ?? $this->ttl); - } - - /** - * Gets the Public Suffix List Rules. - * - * @param string $url the IANA Root Zone Database URL - * @param null|mixed $ttl the cache TTL - * @param int $asciiIDNAOption - * @param int $unicodeIDNAOption - * - * @throws CouldNotLoadTLDs - * - * @return TopLevelDomains - */ - public function getTLDs( - string $url = self::RZD_URL, - $ttl = null, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT - ): TopLevelDomains { - $key = $this->getCacheKey('RZD', $url); - $data = $this->cache->get($key); - - if (null === $data && !$this->refreshTLDs($url, $ttl)) { - throw new CouldNotLoadTLDs(sprintf('Unable to load the root zone database from %s', $url)); - } - - $data = json_decode($data ?? $this->cache->get($key), true); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new CouldNotLoadTLDs( - sprintf('The root zone database cache is corrupted: %s', json_last_error_msg()), - json_last_error() - ); - } - - if (!isset($data['records'], $data['version'], $data['modifiedDate'])) { - throw new CouldNotLoadTLDs('The root zone database cache content is corrupted'); - } - - /** @var DateTimeImmutable $modifiedDate */ - $modifiedDate = DateTimeImmutable::createFromFormat(DATE_ATOM, $data['modifiedDate']); - - return new TopLevelDomains( - $data['records'], - $data['version'], - $modifiedDate, - $asciiIDNAOption, - $unicodeIDNAOption - ); - } - - /** - * Downloads, converts and cache the IANA Root Zone TLD. - * If a local cache already exists, it will be overwritten. - * Returns true if the refresh was successful. - * - * @param string $url the IANA Root Zone Database URL - * @param null|mixed $ttl the cache TTL - * - * @throws HttpClientException - * - * @return bool - */ - public function refreshTLDs(string $url = self::RZD_URL, $ttl = null): bool - { - static $converter; - - $converter = $converter ?? new TLDConverter(); - $data = json_encode($converter->convert($this->http->getContent($url))); - - return $this->cache->set($this->getCacheKey('RZD', $url), $data, $this->filterTtl($ttl) ?? $this->ttl); - } - - /** - * set the cache TTL. - * - * @param null|mixed $ttl the cache TTL - * - * @throws TypeError if the value type is not recognized - * - * @return DateInterval|null - */ - private function filterTtl($ttl) - { - if ($ttl instanceof DateInterval || null === $ttl) { - return $ttl; - } - - if ($ttl instanceof DateTimeInterface) { - return (new DateTimeImmutable('now', $ttl->getTimezone()))->diff($ttl); - } - - if (false !== ($res = filter_var($ttl, FILTER_VALIDATE_INT))) { - return new DateInterval('PT'.$res.'S'); - } - - if (is_string($ttl)) { - return DateInterval::createFromDateString($ttl); - } - - throw new TypeError(sprintf( - 'The ttl must an integer, a string or a DateInterval object %s given', - is_object($ttl) ? get_class($ttl) : gettype($ttl) - )); - } - - /** - * Returns the cache key according to the source URL. - * - * @param string $prefix - * @param string $str - * - * @return string - */ - private function getCacheKey(string $prefix, string $str): string - { - return sprintf('%s_FULL_%s', $prefix, md5(strtolower($str))); - } -} diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 878f20c8..dc629a9b 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -16,73 +16,36 @@ namespace Pdp; use JsonSerializable; -use Pdp\Exception\CouldNotResolvePublicSuffix; -use Pdp\Exception\InvalidDomain; -use function array_keys; +use Pdp\Contract\HostInterface; +use Pdp\Contract\PublicSuffixInterface; use function array_reverse; use function count; use function implode; use function in_array; use function reset; -use function sprintf; +use function substr; use const IDNA_DEFAULT; -/** - * Public Suffix Value Object. - * - * WARNING: "Some people use the PSL to determine what is a valid domain name - * and what isn't. This is dangerous, particularly in these days where new - * gTLDs are arriving at a rapid pace, if your software does not regularly - * receive PSL updates, it will erroneously think new gTLDs are not - * valid. The DNS is the proper source for this innormalizeion. If you must use - * it for this purpose, please do not bake static copies of the PSL into your - * software with no update mechanism." - * - * @author Ignace Nyamagana Butera - */ -final class PublicSuffix implements DomainInterface, JsonSerializable, PublicSuffixListSection +final class PublicSuffix extends HostParser implements JsonSerializable, PublicSuffixInterface { - use IDNAConverterTrait; - private const PSL_SECTION = [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, '']; - /** - * @var string|null - */ - private $publicSuffix; + private ?string $publicSuffix; - /** - * @var string - */ - private $section; + private string $section; - /** - * @var string[] - */ - private $labels; + private array $labels; - /** - * @var int - */ - private $asciiIDNAOption = IDNA_DEFAULT; + private int $asciiIDNAOption; - /** - * @var int - */ - private $unicodeIDNAOption = IDNA_DEFAULT; + private int $unicodeIDNAOption; - /** - * @var bool - */ - private $isTransitionalDifferent; + private bool $isTransitionalDifferent; /** - * @param mixed $publicSuffix - * @param string $section - * @param int $asciiIDNAOption - * @param int $unicodeIDNAOption + * @param mixed|null $publicSuffix a public suffix in a type that is supported */ - public function __construct( + private function __construct( $publicSuffix = null, string $section = '', int $asciiIDNAOption = IDNA_DEFAULT, @@ -97,38 +60,48 @@ public function __construct( $this->unicodeIDNAOption = $unicodeIDNAOption; } - /** - * {@inheritdoc} - */ public static function __set_state(array $properties): self { return new self( $properties['publicSuffix'], $properties['section'], - $properties['asciiIDNAOption'] ?? IDNA_DEFAULT, - $properties['unicodeIDNAOption'] ?? IDNA_DEFAULT + $properties['asciiIDNAOption'], + $properties['unicodeIDNAOption'] ); } /** - * Create an new instance from a Domain object. - * @param Domain $domain + * @param mixed $publicSuffix a public suffix */ - public static function createFromDomain(Domain $domain): self + public static function fromICANNSection($publicSuffix = null, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self { - $section = ''; - if ($domain->isICANN()) { - $section = self::ICANN_DOMAINS; - } elseif ($domain->isPrivate()) { - $section = self::PRIVATE_DOMAINS; - } + return new self($publicSuffix, self::ICANN_DOMAINS, $asciiIDNAOption, $unicodeIDNAOption); + } - return new self( - $domain->getPublicSuffix(), - $section, - $domain->getAsciiIDNAOption(), - $domain->getUnicodeIDNAOption() - ); + /** + * @param mixed $publicSuffix a public suffix + */ + public static function fromPrivateSection($publicSuffix = null, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self + { + return new self($publicSuffix, self::PRIVATE_DOMAINS, $asciiIDNAOption, $unicodeIDNAOption); + } + + /** + * @param mixed $publicSuffix a public suffix + */ + public static function fromUnknownSection($publicSuffix = null, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self + { + return new self($publicSuffix, '', $asciiIDNAOption, $unicodeIDNAOption); + } + + public static function fromNull(int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self + { + return new self(null, '', $asciiIDNAOption, $unicodeIDNAOption); + } + + public function count(): int + { + return count($this->labels); } /** @@ -147,19 +120,18 @@ private function setPublicSuffix(): ?string return $publicSuffix; } - throw new InvalidDomain(sprintf('The public suffix `%s` is invalid', $publicSuffix)); + throw InvalidDomain::dueToInvalidPublicSuffix($publicSuffix); } /** * Set the public suffix section. * - * @param string $section - * @throws CouldNotResolvePublicSuffix if the submitted section is not supported + * @throws UnableToResolveDomain if the submitted section is not supported */ private function setSection(string $section): string { if (!in_array($section, self::PSL_SECTION, true)) { - throw new CouldNotResolvePublicSuffix(sprintf('`%s` is an unknown Public Suffix List section', $section)); + throw new UnableToResolveDomain('"'.$section.'" is an unknown Public Suffix List section'); } if (null === $this->publicSuffix) { @@ -169,151 +141,60 @@ private function setSection(string $section): string return $section; } - /** - * {@inheritdoc} - */ - public function getIterator() - { - foreach ($this->labels as $offset => $label) { - yield $label; - } - } - - /** - * {@inheritdoc} - */ - public function jsonSerialize(): array - { - return $this->__debugInfo(); - } - - /** - * {@inheritdoc} - */ - public function __debugInfo(): array - { - return [ - 'publicSuffix' => $this->publicSuffix, - 'isKnown' => $this->isKnown(), - 'isICANN' => $this->isICANN(), - 'isPrivate' => $this->isPrivate(), - ]; - } - - /** - * {@inheritdoc} - */ - public function count(): int + public function jsonSerialize(): ?string { - return count($this->labels); + return $this->getContent(); } - /** - * {@inheritdoc} - */ public function getContent(): ?string { return $this->publicSuffix; } - /** - * {@inheritdoc} - */ public function __toString(): string { return (string) $this->publicSuffix; } - /** - * {@inheritdoc} - */ - public function getLabel(int $key): ?string + public function isResolvable(): bool { - if ($key < 0) { - $key += count($this->labels); - } - - return $this->labels[$key] ?? null; + return null !== $this->publicSuffix + && '.' !== substr($this->publicSuffix, -1, 1) + && 1 < count($this->labels) + ; } - /** - * {@inheritdoc} - */ - public function keys(string $label): array - { - return array_keys($this->labels, $label, true); - } - - /** - * Returns the object labels. - */ - public function labels(): array - { - return $this->labels; - } - - /** - * Gets conversion options for idn_to_ascii. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - */ public function getAsciiIDNAOption(): int { return $this->asciiIDNAOption; } - /** - * Gets conversion options for idn_to_utf8. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - */ public function getUnicodeIDNAOption(): int { return $this->unicodeIDNAOption; } - /** - * Returns true if domain contains deviation characters. - * - * @see http://unicode.org/reports/tr46/#Transition_Considerations - */ public function isTransitionalDifferent(): bool { return $this->isTransitionalDifferent; } - /** - * Tells whether the public suffix has a matching rule in a Public Suffix List. - */ public function isKnown(): bool { return '' !== $this->section; } - /** - * Tells whether the public suffix has a matching rule in a Public Suffix List ICANN Section. - */ public function isICANN(): bool { return self::ICANN_DOMAINS === $this->section; } - /** - * Tells whether the public suffix has a matching rule in a Public Suffix List Private Section. - */ public function isPrivate(): bool { return self::PRIVATE_DOMAINS === $this->section; } - /** - * {@inheritdoc} - */ - public function toAscii(): DomainInterface + public function toAscii(): HostInterface { if (null === $this->publicSuffix) { return $this; @@ -327,10 +208,7 @@ public function toAscii(): DomainInterface return new self($publicSuffix, $this->section, $this->asciiIDNAOption, $this->unicodeIDNAOption); } - /** - * {@inheritdoc} - */ - public function toUnicode(): DomainInterface + public function toUnicode(): HostInterface { if (null === $this->publicSuffix || false === strpos($this->publicSuffix, 'xn--')) { return $this; @@ -344,14 +222,6 @@ public function toUnicode(): DomainInterface ); } - /** - * Sets conversion options for idn_to_ascii. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - * @param int $option - */ public function withAsciiIDNAOption(int $option): self { if ($option === $this->asciiIDNAOption) { @@ -361,14 +231,6 @@ public function withAsciiIDNAOption(int $option): self return new self($this->publicSuffix, $this->section, $option, $this->unicodeIDNAOption); } - /** - * Sets conversion options for idn_to_utf8. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - * @param int $option - */ public function withUnicodeIDNAOption(int $option): self { if ($option === $this->unicodeIDNAOption) { diff --git a/src/ResolvableDomain.php b/src/ResolvableDomain.php new file mode 100644 index 00000000..16b906b5 --- /dev/null +++ b/src/ResolvableDomain.php @@ -0,0 +1,353 @@ +domain = $this->setDomain($domain); + $this->publicSuffix = $this->setPublicSuffix($publicSuffix); + $this->registrableDomain = $this->setRegistrableDomain(); + $this->subDomain = $this->setSubDomain(); + } + + /** + * {@inheritdoc} + */ + public static function __set_state(array $properties): self + { + return new self($properties['domain'], $properties['publicSuffix']); + } + + /** + * Sets the domain. + */ + private function setDomain(HostInterface $domain): DomainInterface + { + if ($domain instanceof DomainInterface) { + return $domain; + } + + return new Domain($domain, $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()); + } + + /** + * Sets the public suffix domain part. + * + * @throws UnableToResolveDomain If the public suffic can not be attached to the domain + */ + private function setPublicSuffix(PublicSuffixInterface $publicSuffix = null): PublicSuffixInterface + { + $asciiIDNAOptions = $this->domain->getAsciiIDNAOption(); + $unicodeIDNAOptions = $this->domain->getUnicodeIDNAOption(); + + if (null === $publicSuffix) { + return PublicSuffix::fromNull($asciiIDNAOptions, $unicodeIDNAOptions); + } + + if (null === $publicSuffix->getContent()) { + return $publicSuffix + ->withAsciiIDNAOption($asciiIDNAOptions) + ->withUnicodeIDNAOption($unicodeIDNAOptions); + } + + if (!$this->domain->isResolvable()) { + throw UnableToResolveDomain::dueToUnresolvableDomain($this->domain); + } + + $publicSuffix = $this->normalize($publicSuffix); + /** @var string $psContent */ + $psContent = $publicSuffix->getContent(); + if ($this->domain->getContent() === $psContent) { + throw new UnableToResolveDomain(sprintf('The public suffix `%s` can not be equal to the domain name `%s`', $psContent, $this->domain)); + } + + /** @var string $domainName */ + $domainName = $this->domain->getContent(); + if ('.'.$psContent !== substr($domainName, - strlen($psContent) - 1)) { + throw new UnableToResolveDomain(sprintf('The public suffix `%s` can not be assign to the domain name `%s`', $psContent, $this->domain)); + } + + return $publicSuffix; + } + + /** + * Normalize the domain name encoding content. + */ + private function normalize(PublicSuffixInterface $subject): PublicSuffixInterface + { + if (1 !== preg_match(self::REGEXP_IDN_PATTERN, $this->domain->__toString())) { + return $subject->toAscii(); + } + + return $subject->toUnicode(); + } + + /** + * Computes the registrable domain part. + */ + private function setRegistrableDomain(): DomainInterface + { + if (null === $this->publicSuffix->getContent()) { + return Domain::fromNull($this->domain->getAsciiIDNAOption(), $this->domain->getUnicodeIDNAOption()); + } + + $domain = implode('.', array_slice( + explode('.', $this->domain->__toString()), + count($this->domain) - count($this->publicSuffix) - 1 + )); + + return new Domain($domain, $this->domain->getAsciiIDNAOption(), $this->domain->getUnicodeIDNAOption()); + } + + /** + * Computes the sub domain part. + */ + private function setSubDomain(): DomainInterface + { + $asciiIDNAOptions = $this->domain->getAsciiIDNAOption(); + $unicodeIDNAOptions = $this->domain->getUnicodeIDNAOption(); + + if (null === $this->registrableDomain->getContent()) { + return Domain::fromNull($asciiIDNAOptions, $unicodeIDNAOptions); + } + + $nbLabels = count($this->domain); + $nbRegistrableLabels = count($this->publicSuffix) + 1; + if ($nbLabels === $nbRegistrableLabels) { + return Domain::fromNull($asciiIDNAOptions, $unicodeIDNAOptions); + } + + $domain = implode('.', array_slice( + explode('.', $this->domain->__toString()), + 0, + $nbLabels - $nbRegistrableLabels + )); + + return new Domain($domain, $asciiIDNAOptions, $unicodeIDNAOptions); + } + + public function count(): int + { + return count($this->domain); + } + + public function getDomain(): DomainInterface + { + return $this->domain; + } + + public function jsonSerialize(): ?string + { + return $this->domain->getContent(); + } + + public function getContent(): ?string + { + return $this->domain->getContent(); + } + + public function __toString(): string + { + return $this->domain->__toString(); + } + + public function getAsciiIDNAOption(): int + { + return $this->domain->getAsciiIDNAOption(); + } + + public function getUnicodeIDNAOption(): int + { + return $this->domain->getUnicodeIDNAOption(); + } + + public function getRegistrableDomain(): DomainInterface + { + return $this->registrableDomain; + } + + public function getSubDomain(): DomainInterface + { + return $this->subDomain; + } + + public function getPublicSuffix(): PublicSuffixInterface + { + return $this->publicSuffix; + } + + public function isResolvable(): bool + { + return $this->domain->isResolvable(); + } + + public function toAscii(): self + { + return new self($this->domain->toAscii(), $this->publicSuffix->toAscii()); + } + + public function toUnicode(): self + { + return new self($this->domain->toUnicode(), $this->publicSuffix->toUnicode()); + } + + public function resolve($publicSuffix): self + { + if (!$publicSuffix instanceof PublicSuffixInterface) { + $publicSuffix = PublicSuffix::fromUnknownSection($publicSuffix); + } + + return new self($this->domain, $publicSuffix); + } + + /** + * @param mixed $publicSuffix a public suffix + */ + public function withPublicSuffix($publicSuffix): self + { + if (!$publicSuffix instanceof PublicSuffixInterface) { + $publicSuffix = PublicSuffix::fromUnknownSection($publicSuffix); + } + + $publicSuffix = $this->normalize($publicSuffix); + if ($this->publicSuffix == $publicSuffix) { + return $this; + } + + $domain = implode('.', array_reverse(array_slice($this->domain->labels(), count($this->publicSuffix)))); + if (null === $publicSuffix->getContent()) { + return new self( + new Domain($domain, $this->domain->getAsciiIDNAOption(), $this->domain->getUnicodeIDNAOption()), + null + ); + } + + /** @var DomainInterface $domain */ + $domain = new Domain( + $domain.'.'.$publicSuffix->getContent(), + $this->domain->getAsciiIDNAOption(), + $this->domain->getUnicodeIDNAOption() + ); + + /** @var PublicSuffixInterface $publicSuffix */ + $publicSuffix = $publicSuffix + ->withAsciiIDNAOption($this->domain->getAsciiIDNAOption()) + ->withUnicodeIDNAOption($this->domain->getUnicodeIDNAOption()); + + return new self($domain, $publicSuffix); + } + + /** + * {@inheritDoc} + */ + public function withSubDomain($subDomain): self + { + if (null === $this->registrableDomain->getContent()) { + throw UnableToResolveDomain::dueToMissingRegistrableDomain($this); + } + + if (null === $subDomain) { + $subDomain = Domain::fromNull($this->getAsciiIDNAOption(), $this->getUnicodeIDNAOption()); + } + + if (!$subDomain instanceof DomainInterface) { + $subDomain = new Domain($subDomain); + } + + $subDomain = $subDomain ?? Domain::fromNull($this->getAsciiIDNAOption(), $this->getUnicodeIDNAOption()); + if ($this->subDomain == $subDomain) { + return $this; + } + + /** @var DomainInterface $subDomain */ + $subDomain = $subDomain->toAscii(); + if (1 === preg_match(self::REGEXP_IDN_PATTERN, (string) $this->domain->getContent())) { + /** @var DomainInterface $subDomain */ + $subDomain = $subDomain->toUnicode(); + } + + $domain = new Domain( + $subDomain.'.'.$this->registrableDomain, + $this->getAsciiIDNAOption(), + $this->getUnicodeIDNAOption() + ); + + return new self($domain, $this->publicSuffix); + } + + /** + * {@inheritDoc} + */ + public function withAsciiIDNAOption(int $option): self + { + if ($option === $this->domain->getAsciiIDNAOption()) { + return $this; + } + + /** @var DomainInterface $asciiDomain */ + $asciiDomain = $this->domain->withAsciiIDNAOption($option); + + /** @var PublicSuffixInterface $asciiPublicSuffix */ + $asciiPublicSuffix = $this->publicSuffix->withAsciiIDNAOption($option); + + return new self($asciiDomain, $asciiPublicSuffix); + } + + /** + * {@inheritDoc} + */ + public function withUnicodeIDNAOption(int $option): self + { + if ($option === $this->domain->getUnicodeIDNAOption()) { + return $this; + } + + /** @var DomainInterface $unicodeDomain */ + $unicodeDomain = $this->domain->withUnicodeIDNAOption($option); + + /** @var PublicSuffixInterface $unicodePublicSuffix */ + $unicodePublicSuffix = $this->publicSuffix->withUnicodeIDNAOption($option); + + return new self($unicodeDomain, $unicodePublicSuffix); + } +} diff --git a/src/Rules.php b/src/Rules.php index 47862b0c..b35efe7b 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -15,18 +15,25 @@ namespace Pdp; -use Pdp\Exception\CouldNotLoadRules; -use Pdp\Exception\CouldNotResolvePublicSuffix; -use Pdp\Exception\InvalidDomain; +use JsonSerializable; +use Pdp\Contract\DomainInterface; +use Pdp\Contract\Exception; +use Pdp\Contract\HostInterface; +use Pdp\Contract\PublicSuffixInterface; +use Pdp\Contract\PublicSuffixListSection; +use Pdp\Contract\ResolvableHostInterface; use function array_reverse; use function count; use function fclose; use function fopen; use function implode; use function in_array; -use function sprintf; +use function json_decode; +use function json_last_error; +use function json_last_error_msg; use function stream_get_contents; use const IDNA_DEFAULT; +use const JSON_ERROR_NONE; /** * A class to resolve domain name against the Public Suffix list. @@ -34,42 +41,20 @@ * @author Jeremy Kendall * @author Ignace Nyamagana Butera */ -final class Rules implements PublicSuffixListSection +final class Rules implements PublicSuffixListSection, JsonSerializable { - /** - * @deprecated 5.3 - */ - public const ALL_DOMAINS = 'ALL_DOMAINS'; - private const PSL_SECTION = [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, '']; /** * PSL rules as a multidimentional associative array. - * - * @var array */ - private $rules; + private array $rules; - /** - * @var int - */ - private $asciiIDNAOption; + private int $asciiIDNAOption; - /** - * @var int - */ - private $unicodeIDNAOption; + private int $unicodeIDNAOption; - /** - * New instance. - * - * @internal - * - * @param array $rules - * @param int $asciiIDNAOption - * @param int $unicodeIDNAOption - */ - public function __construct( + private function __construct( array $rules, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT @@ -82,14 +67,9 @@ public function __construct( /** * Returns a new instance from a file path. * - * @param string $path * @param null|resource $context - * @param int $asciiIDNAOption - * @param int $unicodeIDNAOption * - * @throws CouldNotLoadRules If the rules can not be loaded from the path - * - * @return self + * @throws UnableToLoadRules If the rules can not be loaded from the path */ public static function createFromPath( string $path, @@ -104,7 +84,7 @@ public static function createFromPath( $resource = @fopen(...$args); if (false === $resource) { - throw new CouldNotLoadRules(sprintf('`%s`: failed to open stream: No such file or directory.', $path)); + throw UnableToLoadRules::dueToInvalidPath($path); } /** @var string $content */ @@ -116,12 +96,6 @@ public static function createFromPath( /** * Returns a new instance from a string. - * - * @param string $content - * @param int $asciiIDNAOption - * @param int $unicodeIDNAOption - * - * @return self */ public static function createFromString( string $content, @@ -130,11 +104,25 @@ public static function createFromString( ): self { static $converter; - $converter = $converter ?? new Converter(); + $converter = $converter ?? new RulesConverter(); return new self($converter->convert($content), $asciiIDNAOption, $unicodeIDNAOption); } + public static function createFromJsonString( + string $jsonString, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ): self { + $data = json_decode($jsonString, true); + $errorCode = json_last_error(); + if (JSON_ERROR_NONE !== $errorCode) { + throw UnableToLoadRules::dueToInvalidJson($errorCode, json_last_error_msg()); + } + + return new self($data, $asciiIDNAOption, $unicodeIDNAOption); + } + /** * {@inheritdoc} */ @@ -147,67 +135,51 @@ public static function __set_state(array $properties): self ); } - /** - * Gets conversion options for idn_to_ascii. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - * - * @return int - */ public function getAsciiIDNAOption(): int { return $this->asciiIDNAOption; } - /** - * Gets conversion options for idn_to_utf8. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - * - * @return int - */ public function getUnicodeIDNAOption(): int { return $this->unicodeIDNAOption; } + public function jsonSerialize(): array + { + return $this->rules; + } + /** * Determines the public suffix for a given domain. * - * @param mixed $domain - * @param string $section - * - * @throws CouldNotResolvePublicSuffix If the PublicSuffix can not be resolve. + * @param mixed $domain a type that supports instantiating a Domain from. * - * @return PublicSuffix + * @throws UnableToResolveDomain If the PublicSuffix can not be resolve. */ - public function getPublicSuffix($domain, string $section = self::ALL_DOMAINS): PublicSuffix + public function getPublicSuffix($domain, string $section = ''): PublicSuffixInterface { - if (!$domain instanceof Domain) { - $domain = new Domain($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); + if (!$domain instanceof ResolvableHostInterface) { + $domain = new ResolvableDomain(new Domain($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption)); } - if (!$domain->isResolvable()) { - throw CouldNotResolvePublicSuffix::dueToUnresolvableDomain($domain); + if (!$domain->getDomain()->isResolvable()) { + throw UnableToResolveDomain::dueToUnresolvableDomain($domain); } $publicSuffix = $this->findPublicSuffix($domain, $this->validateSection($section)); - return PublicSuffix::createFromDomain($domain->resolve($publicSuffix)); + return $domain->resolve($publicSuffix)->getPublicSuffix(); } /** * Determines the public suffix for a given domain against the PSL rules for cookie domain detection.. * - * @param mixed $domain + * @param mixed $domain a type that supports instantiating a Domain from. * - * @throws CouldNotResolvePublicSuffix If the PublicSuffix can not be resolve. + * @throws UnableToResolveDomain If the PublicSuffix can not be resolve. */ - public function getCookieEffectiveTLD($domain): PublicSuffix + public function getCookieEffectiveTLD($domain): PublicSuffixInterface { return $this->getPublicSuffix($domain, ''); } @@ -215,11 +187,11 @@ public function getCookieEffectiveTLD($domain): PublicSuffix /** * Determines the public suffix for a given domain against the PSL rules for ICANN domain detection.. * - * @param mixed $domain + * @param mixed $domain a type that supports instantiating a Domain from. * - * @throws CouldNotResolvePublicSuffix If the PublicSuffix can not be resolve. + * @throws UnableToResolveDomain If the PublicSuffix can not be resolve. */ - public function getICANNEffectiveTLD($domain): PublicSuffix + public function getICANNEffectiveTLD($domain): PublicSuffixInterface { return $this->getPublicSuffix($domain, self::ICANN_DOMAINS); } @@ -227,11 +199,11 @@ public function getICANNEffectiveTLD($domain): PublicSuffix /** * Determines the public suffix for a given domain against the PSL rules for private domain detection.. * - * @param mixed $domain + * @param mixed $domain a type that supports instantiating a Domain from. * - * @throws CouldNotResolvePublicSuffix If the PublicSuffix can not be resolve. + * @throws UnableToResolveDomain If the PublicSuffix can not be resolve. */ - public function getPrivateEffectiveTLD($domain): PublicSuffix + public function getPrivateEffectiveTLD($domain): PublicSuffixInterface { return $this->getPublicSuffix($domain, self::PRIVATE_DOMAINS); } @@ -239,33 +211,32 @@ public function getPrivateEffectiveTLD($domain): PublicSuffix /** * Returns PSL info for a given domain. * - * @param mixed $domain - * @param string $section - * - * @return Domain + * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolve($domain, string $section = self::ALL_DOMAINS): Domain + public function resolve($domain, string $section = ''): ResolvableHostInterface { $section = $this->validateSection($section); try { if ('' === $section) { return $this->resolveCookieDomain($domain); - } elseif (self::ICANN_DOMAINS === $section) { + } + + if (self::ICANN_DOMAINS === $section) { return $this->resolveICANNDomain($domain); } return $this->resolvePrivateDomain($domain); - } catch (CouldNotResolvePublicSuffix $exception) { + } catch (UnableToResolveDomain $exception) { if ($exception->hasDomain()) { - /** @var Domain */ + /** @var HostInterface */ $domain = $exception->getDomain(); - return $domain; + return new ResolvableDomain($domain); } - return new Domain($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); + return new ResolvableDomain(new Domain($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption)); } catch (Exception $exception) { - return new Domain(null, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); + return new ResolvableDomain(Domain::fromNull($this->asciiIDNAOption, $this->unicodeIDNAOption)); } } @@ -274,7 +245,7 @@ public function resolve($domain, string $section = self::ALL_DOMAINS): Domain * * @param mixed $domain the domain value */ - public function resolveCookieDomain($domain): Domain + public function resolveCookieDomain($domain): ResolvableHostInterface { $domain = $this->validateDomain($domain); @@ -284,9 +255,9 @@ public function resolveCookieDomain($domain): Domain /** * Returns PSL info for a given domain against the PSL rules for ICANN domain detection. * - * @param mixed $domain + * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolveICANNDomain($domain): Domain + public function resolveICANNDomain($domain): ResolvableHostInterface { $domain = $this->validateDomain($domain); @@ -296,9 +267,9 @@ public function resolveICANNDomain($domain): Domain /** * Returns PSL info for a given domain against the PSL rules for private domain detection. * - * @param mixed $domain + * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolvePrivateDomain($domain): Domain + public function resolvePrivateDomain($domain): ResolvableHostInterface { $domain = $this->validateDomain($domain); @@ -308,19 +279,19 @@ public function resolvePrivateDomain($domain): Domain /** * Assert the domain is valid and is resolvable. * - * @param mixed $domain + * @param mixed $domain a type that supports instantiating a Domain from. * - * @throws InvalidDomain if the domain is invalid - * @throws CouldNotResolvePublicSuffix if the domain is not resolvable + * @throws InvalidDomain if the domain is invalid + * @throws UnableToResolveDomain if the domain is not resolvable */ - private function validateDomain($domain): Domain + private function validateDomain($domain): ResolvableHostInterface { - if (!($domain instanceof Domain)) { - $domain = new Domain($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); + if (!($domain instanceof ResolvableHostInterface)) { + $domain = new ResolvableDomain(new Domain($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption), null); } - if (!$domain->isResolvable()) { - throw CouldNotResolvePublicSuffix::dueToUnresolvableDomain($domain); + if (!$domain->getDomain()->isResolvable()) { + throw UnableToResolveDomain::dueToUnresolvableDomain($domain); } return $domain; @@ -329,36 +300,25 @@ private function validateDomain($domain): Domain /** * Assert the section status. * - * @param string $section - * * @throws Exception if the submitted section is not supported - * - * @return string */ private function validateSection(string $section): string { - if (self::ALL_DOMAINS === $section) { - $section = ''; - } - if (in_array($section, self::PSL_SECTION, true)) { return $section; } - throw CouldNotResolvePublicSuffix::dueToUnSupportedSection($section); + throw UnableToResolveDomain::dueToUnSupportedSection($section); } /** * Returns the matched public suffix. - * - * @param DomainInterface $domain - * @param string $section - * - * @return PublicSuffix */ - private function findPublicSuffix(DomainInterface $domain, string $section): PublicSuffix + private function findPublicSuffix(ResolvableHostInterface $domain, string $section): PublicSuffixInterface { - $asciiDomain = $domain->toAscii(); + $asciiDomain = $domain->getDomain(); + /** @var DomainInterface $asciiDomain */ + $asciiDomain = $asciiDomain->toAscii(); $icann = $this->findPublicSuffixFromSection($asciiDomain, self::ICANN_DOMAINS); if (self::ICANN_DOMAINS === $section) { return $icann; @@ -370,7 +330,7 @@ private function findPublicSuffix(DomainInterface $domain, string $section): Pub } if (self::PRIVATE_DOMAINS === $section) { - return new PublicSuffix($domain->getLabel(0), '', $this->asciiIDNAOption, $this->unicodeIDNAOption); + return PublicSuffix::fromUnknownSection($asciiDomain->label(0), $this->asciiIDNAOption, $this->unicodeIDNAOption); } return $icann; @@ -378,13 +338,8 @@ private function findPublicSuffix(DomainInterface $domain, string $section): Pub /** * Returns the public suffix matched against a given PSL section. - * - * @param DomainInterface $domain - * @param string $section - * - * @return PublicSuffix */ - private function findPublicSuffixFromSection(DomainInterface $domain, string $section): PublicSuffix + private function findPublicSuffixFromSection(DomainInterface $domain, string $section): PublicSuffixInterface { $rules = $this->rules[$section] ?? []; $matches = []; @@ -410,15 +365,16 @@ private function findPublicSuffixFromSection(DomainInterface $domain, string $se } if ([] === $matches) { - return new PublicSuffix($domain->getLabel(0), '', $this->asciiIDNAOption, $this->unicodeIDNAOption); + return PublicSuffix::fromUnknownSection($domain->label(0), $this->asciiIDNAOption, $this->unicodeIDNAOption); } - return new PublicSuffix( - implode('.', array_reverse($matches)), - $section, - $this->asciiIDNAOption, - $this->unicodeIDNAOption - ); + $content = implode('.', array_reverse($matches)); + + if (self::PRIVATE_DOMAINS === $section) { + return PublicSuffix::fromPrivateSection($content, $this->asciiIDNAOption, $this->unicodeIDNAOption); + } + + return PublicSuffix::fromICANNSection($content, $this->asciiIDNAOption, $this->unicodeIDNAOption); } /** @@ -427,10 +383,6 @@ private function findPublicSuffixFromSection(DomainInterface $domain, string $se * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php - * - * @param int $asciiIDNAOption - * - * @return self */ public function withAsciiIDNAOption(int $asciiIDNAOption): self { @@ -450,10 +402,6 @@ public function withAsciiIDNAOption(int $asciiIDNAOption): self * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php - * - * @param int $unicodeIDNAOption - * - * @return self */ public function withUnicodeIDNAOption(int $unicodeIDNAOption): self { diff --git a/src/Converter.php b/src/RulesConverter.php similarity index 68% rename from src/Converter.php rename to src/RulesConverter.php index e8b80c92..b3dda5a5 100644 --- a/src/Converter.php +++ b/src/RulesConverter.php @@ -15,7 +15,7 @@ namespace Pdp; -use Pdp\Exception\CouldNotLoadRules; +use Pdp\Contract\Exception; use SplTempFileObject; use function array_pop; use function explode; @@ -31,17 +31,15 @@ * @author Jeremy Kendall * @author Ignace Nyamagana Butera */ -final class Converter implements PublicSuffixListSection +final class RulesConverter extends HostParser { - use IDNAConverterTrait; - private const PSL_SECTION = [ 'ICANN' => [ - 'BEGIN' => self::ICANN_DOMAINS, + 'BEGIN' => 'ICANN_DOMAINS', 'END' => '', ], 'PRIVATE' => [ - 'BEGIN' => self::PRIVATE_DOMAINS, + 'BEGIN' => 'PRIVATE_DOMAINS', 'END' => '', ], ]; @@ -49,16 +47,11 @@ final class Converter implements PublicSuffixListSection private const REGEX_PSL_SECTION = ',^// ===(?BEGIN|END) (?ICANN|PRIVATE) DOMAINS===,'; /** - * Convert the Public Suffix List into - * an associative, multidimensional array. - * - * @param string $content - * - * @return array + * Convert the Public Suffix List into an associative, multidimensional array. */ public function convert(string $content): array { - $rules = [self::ICANN_DOMAINS => [], self::PRIVATE_DOMAINS => []]; + $rules = ['ICANN_DOMAINS' => [], 'PRIVATE_DOMAINS' => []]; $section = ''; $file = new SplTempFileObject(); $file->fwrite($content); @@ -76,11 +69,6 @@ public function convert(string $content): array /** * Returns the section type for a given line. - * - * @param string $section the current status - * @param string $line the current file line - * - * @return string */ private function getSection(string $section, string $line): string { @@ -100,25 +88,25 @@ private function getSection(string $section, string $line): string * A copy of the Apache License, Version 2.0, is provided with this * distribution * - * @param array $list Initially an empty array, this eventually - * becomes the array representation of a Public Suffix List section - * @param array $rule_parts One line (rule) from the Public Suffix List - * exploded on '.', or the remaining portion of that array during recursion - * - * @throws CouldNotLoadRules if the domain name can not be converted using IDN to ASCII algorithm + * @param array $list Initially an empty array, this eventually + * becomes the array representation of a Public Suffix List section + * @param array $ruleParts One line (rule) from the Public Suffix List + * exploded on '.', or the remaining portion of that array during recursion * - * @return array + * @throws UnableToLoadRules if the domain name can not be converted using IDN to ASCII algorithm */ - private function addRule(array $list, array $rule_parts): array + private function addRule(array $list, array $ruleParts): array { // Adheres to canonicalization rule from the "Formal Algorithm" section // of https://publicsuffix.org/list/ // "The domain and all rules must be canonicalized in the normal way // for hostnames - lower-case, Punycode (RFC 3492)." try { - $rule = $this->idnToAscii(array_pop($rule_parts)); - } catch (Exception $e) { - throw new CouldNotLoadRules($e->getMessage(), $e->getCode(), $e); + /** @var string $line */ + $line = array_pop($ruleParts); + $rule = $this->idnToAscii($line); + } catch (Exception $exception) { + throw UnableToLoadRules::dueToInvalidRule($line ?? null, $exception); } $isDomain = true; @@ -128,8 +116,8 @@ private function addRule(array $list, array $rule_parts): array } $list[$rule] = $list[$rule] ?? ($isDomain ? [] : ['!' => '']); - if ($isDomain && [] !== $rule_parts) { - $list[$rule] = $this->addRule($list[$rule], $rule_parts); + if ($isDomain && [] !== $ruleParts) { + $list[$rule] = $this->addRule($list[$rule], $ruleParts); } return $list; diff --git a/src/Logger.php b/src/Storage/Cache/Logger.php similarity index 98% rename from src/Logger.php rename to src/Storage/Cache/Logger.php index 501f0088..f42b6d10 100644 --- a/src/Logger.php +++ b/src/Storage/Cache/Logger.php @@ -13,7 +13,7 @@ declare(strict_types=1); -namespace Pdp; +namespace Pdp\Storage\Cache; use Psr\Log\AbstractLogger; use Psr\Log\LogLevel; diff --git a/src/CacheException.php b/src/Storage/Cache/Psr16CacheException.php similarity index 80% rename from src/CacheException.php rename to src/Storage/Cache/Psr16CacheException.php index 092e4dfd..54c64eb2 100644 --- a/src/CacheException.php +++ b/src/Storage/Cache/Psr16CacheException.php @@ -13,10 +13,10 @@ declare(strict_types=1); -namespace Pdp; +namespace Pdp\Storage\Cache; use Psr\SimpleCache\InvalidArgumentException as PsrCacheException; -class CacheException extends \InvalidArgumentException implements PsrCacheException +class Psr16CacheException extends \InvalidArgumentException implements PsrCacheException { } diff --git a/src/Cache.php b/src/Storage/Cache/Psr16FileCache.php similarity index 73% rename from src/Cache.php rename to src/Storage/Cache/Psr16FileCache.php index a2ca4ce7..f8dc8d0d 100644 --- a/src/Cache.php +++ b/src/Storage/Cache/Psr16FileCache.php @@ -13,7 +13,7 @@ declare(strict_types=1); -namespace Pdp; +namespace Pdp\Storage\Cache; use DateInterval; use DateTimeImmutable; @@ -34,7 +34,6 @@ use function is_writable; use function mkdir; use function preg_match; -use function realpath; use function rename; use function sprintf; use function time; @@ -51,50 +50,36 @@ * * @see https://github.com/kodus/file-cache/blob/master/src/FileCache.php */ -final class Cache implements CacheInterface +final class Psr16FileCache implements CacheInterface { /** * @var string control characters for keys, reserved by PSR-16 */ - const PSR16_RESERVED = '/\{|\}|\(|\)|\/|\\\\|\@|\:/u'; - const FILE_PREFIX = 'pdp-'; - const FILE_EXTENSION = '.cache'; - const CACHE_TTL = 86400 * 7; + private const PSR16_RESERVED = '/\{|\}|\(|\)|\/|\\\\|\@|\:/u'; + private const FILE_PREFIX = 'pdp-'; + private const FILE_EXTENSION = '.cache'; + private const CACHE_TTL = 86400 * 7; - /** - * @var string - */ - private $cache_path; + private string $cachePath; - /** - * @var int - */ - private $dir_mode = 0775; + private int $dirMode = 0775; - /** - * @var int - */ - private $file_mode = 0664; + private int $fileMode = 0664; /** - * @param string $cache_path absolute root path of cache-file folder + * @param string $cachePath absolute root path of cache-file folder */ - public function __construct(string $cache_path = '') + public function __construct(string $cachePath) { - if ('' === $cache_path) { - /** @var string $cache_path */ - $cache_path = realpath(dirname(__DIR__).DIRECTORY_SEPARATOR.'data'); + if (!file_exists($cachePath) && file_exists(dirname($cachePath))) { + $this->mkdir($cachePath); // ensure that the parent path exists } - if (!file_exists($cache_path) && file_exists(dirname($cache_path))) { - $this->mkdir($cache_path); // ensure that the parent path exists + if (!is_writable($cachePath.DIRECTORY_SEPARATOR)) { + throw new InvalidArgumentException(sprintf('cache path does not exist or is not writable: %s', $cachePath)); } - if (! is_writable($cache_path.DIRECTORY_SEPARATOR)) { - throw new InvalidArgumentException(sprintf('cache path does not exist or is not writable: %s', $cache_path)); - } - - $this->cache_path = $cache_path; + $this->cachePath = $cachePath; } /** @@ -136,7 +121,7 @@ public function get($key, $default = null) */ public function set($key, $value, $ttl = null) { - if (!is_writable($this->cache_path.DIRECTORY_SEPARATOR)) { + if (!is_writable($this->cachePath.DIRECTORY_SEPARATOR)) { return false; } @@ -149,12 +134,12 @@ public function set($key, $value, $ttl = null) $this->mkdir($dir); } - $temp_path = $this->cache_path.DIRECTORY_SEPARATOR.uniqid('', true); + $temp_path = $this->cachePath.DIRECTORY_SEPARATOR.uniqid('', true); if (false === @file_put_contents($temp_path, serialize($value))) { return false; } - if (false === @chmod($temp_path, $this->file_mode)) { + if (false === @chmod($temp_path, $this->fileMode)) { return false; } @@ -170,9 +155,7 @@ public function set($key, $value, $ttl = null) /** * Returns the expiration time expressed in the number of seconds since the Unix Epoch. * - * @param mixed $ttl - * - * @return int + * @param mixed $ttl a valid time to live type */ private function getExpireAt($ttl): int { @@ -187,7 +170,7 @@ private function getExpireAt($ttl): int return $now->add($ttl)->getTimestamp(); } - throw new CacheException(sprintf('Expected TTL to be an int, a DateInterval or null; received "%s"', is_object($ttl) ? get_class($ttl) : gettype($ttl))); + throw new Psr16CacheException(sprintf('Expected TTL to be an int, a DateInterval or null; received "%s"', is_object($ttl) ? get_class($ttl) : gettype($ttl))); } /** @@ -221,7 +204,7 @@ public function clear() public function getMultiple($keys, $default = null) { if (!is_iterable($keys)) { - throw new CacheException('keys must be either of type array or Traversable'); + throw new Psr16CacheException('keys must be either of type array or Traversable'); } $values = []; @@ -238,7 +221,7 @@ public function getMultiple($keys, $default = null) public function setMultiple($values, $ttl = null) { if (!is_iterable($values)) { - throw new CacheException('keys must be either of type array or Traversable'); + throw new Psr16CacheException('keys must be either of type array or Traversable'); } $ok = true; @@ -257,7 +240,7 @@ public function setMultiple($values, $ttl = null) public function deleteMultiple($keys): bool { if (!is_iterable($keys)) { - throw new CacheException('keys must be either of type array or Traversable'); + throw new Psr16CacheException('keys must be either of type array or Traversable'); } $successful = false; @@ -285,21 +268,21 @@ public function has($key): bool * * @param string $key * - * @throws CacheException if the specified key contains a character reserved by PSR-16 - * + *@throws Psr16CacheException if the specified key contains a character reserved by PSR-16 * @return string absolute path to cache-file + * */ private function getPath($key): string { $this->validateKey($key); - return $this->cache_path.DIRECTORY_SEPARATOR.self::FILE_PREFIX.$key.self::FILE_EXTENSION; + return $this->cachePath.DIRECTORY_SEPARATOR.self::FILE_PREFIX.$key.self::FILE_EXTENSION; } private function listPaths(): Generator { $iterator = new FilesystemIterator( - $this->cache_path, + $this->cachePath, FilesystemIterator::CURRENT_AS_PATHNAME | FilesystemIterator::SKIP_DOTS ); @@ -314,16 +297,16 @@ private function listPaths(): Generator /** * @param string $key * - * @throws CacheException + * @throws Psr16CacheException */ private function validateKey($key): void { if (!is_string($key)) { - throw new CacheException(sprintf('Expected key to be a string; received "%s"', is_object($key) ? get_class($key) : gettype($key))); + throw new Psr16CacheException(sprintf('Expected key to be a string; received "%s"', is_object($key) ? get_class($key) : gettype($key))); } if (1 === preg_match(self::PSR16_RESERVED, $key, $match)) { - throw new CacheException(sprintf('invalid character in key: %s', $match[0])); + throw new Psr16CacheException(sprintf('invalid character in key: %s', $match[0])); } } @@ -341,6 +324,6 @@ private function mkdir($path): void } mkdir($path); - chmod($path, $this->dir_mode); + chmod($path, $this->dirMode); } } diff --git a/src/Storage/Cache/RulesCache.php b/src/Storage/Cache/RulesCache.php new file mode 100644 index 00000000..dcf4000c --- /dev/null +++ b/src/Storage/Cache/RulesCache.php @@ -0,0 +1,44 @@ + + * @author Ignace Nyamagana Butera + */ +interface RulesCache +{ + /** + * Gets the Public Suffix List Rules. + */ + public function fetchByUri(string $uri): ?Rules; + + /** + * Cache the Public Suffix List Rules. + * + * If a local cache already exists, it will be overwritten. + * + * Returns true if the refresh was successful, false otherwise + */ + public function storeByUri(string $uri, Rules $rules): bool; +} diff --git a/src/Storage/Cache/RulesCachePsr16Adapter.php b/src/Storage/Cache/RulesCachePsr16Adapter.php new file mode 100644 index 00000000..5f8d1b23 --- /dev/null +++ b/src/Storage/Cache/RulesCachePsr16Adapter.php @@ -0,0 +1,154 @@ + + * @author Ignace Nyamagana Butera + */ +final class RulesCachePsr16Adapter implements RulesCache +{ + private const CACHE_PREFIX = 'PSL_FULL_'; + + private CacheInterface $cache; + + private LoggerInterface $logger; + + private ?DateInterval $ttl; + + /** + * @param mixed|null $ttl the time to live for the given cache + */ + public function __construct(CacheInterface $cache, $ttl = null, LoggerInterface $logger = null) + { + $this->cache = $cache; + $this->logger = $logger ?? new NullLogger(); + $this->ttl = $this->setTtl($ttl); + } + + /** + * Set the cache TTL. + * + * @param mixed $ttl the cache TTL + * + * @throws TypeError if the value type is not recognized + */ + private function setTtl($ttl): ?DateInterval + { + if ($ttl instanceof DateInterval || null === $ttl) { + return $ttl; + } + + if ($ttl instanceof DateTimeInterface) { + return (new DateTimeImmutable('NOW', $ttl->getTimezone()))->diff($ttl); + } + + if (false !== ($res = filter_var($ttl, FILTER_VALIDATE_INT))) { + return new DateInterval('PT'.$res.'S'); + } + + if (!is_string($ttl)) { + throw new TypeError(sprintf( + 'The ttl must null, an integer, a string a DateTimeInterface or a DateInterval object %s given', + is_object($ttl) ? get_class($ttl) : gettype($ttl) + )); + } + + return DateInterval::createFromDateString($ttl); + } + + /** + * Gets the Public Suffix List Rules. + */ + public function fetchByUri(string $uri): ?Rules + { + $cacheKey = $this->getCacheKey($uri); + $cacheData = $this->cache->get($cacheKey); + if (null === $cacheData) { + return $cacheData; + } + + try { + $rules = Rules::createFromJsonString($cacheData); + } catch (Throwable $exception) { + $this->cache->delete($cacheKey); + $this->logger->warning($exception->getMessage()); + + return null; + } + + return $rules; + } + + /** + * Returns the cache key according to the source URL. + */ + private function getCacheKey(string $str): string + { + return self::CACHE_PREFIX.md5(strtolower($str)); + } + + /** + * Cache the Top Level Domain List. + */ + public function storeByUri(string $uri, Rules $rules): bool + { + try { + $result = $this->cache->set($this->getCacheKey($uri), json_encode($rules), $this->ttl); + } catch (Throwable $exception) { + $this->logger->info( + 'The Public Suffix List could not be saved with the following `'.$uri.'`:'.$exception->getMessage(), + ['exception' => $exception] + ); + + return false; + } + + $message = 'The Public Suffix List is stored for the following `'.$uri.'`'; + if (!$result) { + $message = 'The Public Suffix List could not be stored for the following '.$uri.'.'; + } + + $this->logger->info($message); + + return $result; + } +} diff --git a/src/Storage/Cache/TopLevelDomainsCache.php b/src/Storage/Cache/TopLevelDomainsCache.php new file mode 100644 index 00000000..e39be2eb --- /dev/null +++ b/src/Storage/Cache/TopLevelDomainsCache.php @@ -0,0 +1,44 @@ + + * @author Ignace Nyamagana Butera + */ +interface TopLevelDomainsCache +{ + /** + * Gets the Top Level Domains from the Cache. + */ + public function fetchByUri(string $uri): ?TopLevelDomains; + + /** + * Cache the Top Level Domains List. + * + * If a local cache already exists, it will be overwritten. + * + * Returns true if the refresh was successful, false otherwise + */ + public function storeByUri(string $uri, TopLevelDomains $topLevelDomains): bool; +} diff --git a/src/Storage/Cache/TopLevelDomainsCachePsr16Adapter.php b/src/Storage/Cache/TopLevelDomainsCachePsr16Adapter.php new file mode 100644 index 00000000..e830a0e5 --- /dev/null +++ b/src/Storage/Cache/TopLevelDomainsCachePsr16Adapter.php @@ -0,0 +1,154 @@ + + * @author Ignace Nyamagana Butera + */ +final class TopLevelDomainsCachePsr16Adapter implements TopLevelDomainsCache +{ + private const CACHE_PREFIX = 'RZD'; + + private CacheInterface $cache; + + private LoggerInterface $logger; + + private ?DateInterval $ttl; + + /** + * @param mixed|null $ttl the time to live for the given cache + */ + public function __construct(CacheInterface $cache, $ttl = null, LoggerInterface $logger = null) + { + $this->cache = $cache; + $this->logger = $logger ?? new NullLogger(); + $this->ttl = $this->setTtl($ttl); + } + + /** + * Set the cache TTL. + * + * @param mixed $ttl the cache TTL + * + * @throws TypeError if the value type is not recognized + */ + private function setTtl($ttl): ?DateInterval + { + if ($ttl instanceof DateInterval || null === $ttl) { + return $ttl; + } + + if ($ttl instanceof DateTimeInterface) { + return (new DateTimeImmutable('NOW', $ttl->getTimezone()))->diff($ttl); + } + + if (false !== ($res = filter_var($ttl, FILTER_VALIDATE_INT))) { + return new DateInterval('PT'.$res.'S'); + } + + if (!is_string($ttl)) { + throw new TypeError(sprintf( + 'The ttl must null, an integer, a string a DateTimeInterface or a DateInterval object %s given', + is_object($ttl) ? get_class($ttl) : gettype($ttl) + )); + } + + return DateInterval::createFromDateString($ttl); + } + + /** + * Gets the Public Suffix List Rules. + * + * @throws UnableToLoadTopLevelDomains + */ + public function fetchByUri(string $uri): ?TopLevelDomains + { + $cacheKey = $this->getCacheKey($uri); + $cacheData = $this->cache->get($cacheKey); + if (null === $cacheData) { + return null; + } + + try { + $topLevelDomains = TopLevelDomains::createFromJsonString($cacheData); + } catch (Throwable $exception) { + $this->cache->delete($cacheKey); + $this->logger->warning($exception->getMessage()); + + return null; + } + + return $topLevelDomains; + } + + /** + * Returns the cache key according to the source URL. + */ + private function getCacheKey(string $str): string + { + return sprintf('%s_FULL_%s', self::CACHE_PREFIX, md5(strtolower($str))); + } + + public function storeByUri(string $uri, TopLevelDomains $topLevelDomains): bool + { + try { + $result = $this->cache->set($this->getCacheKey($uri), json_encode($topLevelDomains), $this->ttl); + } catch (Throwable $exception) { + $this->logger->info( + 'The Top Level Domains could not be saved with the following `'.$uri.'`:'.$exception->getMessage(), + ['exception' => $exception] + ); + + return false; + } + + $message = 'The Root Zone Domains List is stored for the following `'.$uri.'`'; + if (!$result) { + $message = 'The Root Zone Domains List could not be stored for the following '.$uri.'.'; + } + + $this->logger->info($message); + + return $result; + } +} diff --git a/src/HttpClient.php b/src/Storage/Http/Client.php similarity index 79% rename from src/HttpClient.php rename to src/Storage/Http/Client.php index aebe0e31..7b9b8b5e 100644 --- a/src/HttpClient.php +++ b/src/Storage/Http/Client.php @@ -11,7 +11,7 @@ * file that was distributed with this source code. */ -namespace Pdp; +namespace Pdp\Storage\Http; /** * Interface for http adapters. @@ -24,16 +24,12 @@ * @author William Durand * @author Jeremy Kendall */ -interface HttpClient +interface Client { /** * Returns the content fetched from a given URL. * - * @param string $url - * - * @throws HttpClientException If an errors occurs while fetching the content from a given URL - * - * @return string Retrieved content + * @throws ClientException If an errors occurs while fetching the content from a given URL */ public function getContent(string $url): string; } diff --git a/src/HttpClientException.php b/src/Storage/Http/ClientException.php similarity index 82% rename from src/HttpClientException.php rename to src/Storage/Http/ClientException.php index cb7bd37d..32988d61 100644 --- a/src/HttpClientException.php +++ b/src/Storage/Http/ClientException.php @@ -13,10 +13,10 @@ declare(strict_types=1); -namespace Pdp; +namespace Pdp\Storage\Http; -use RuntimeException; +use Throwable; -class HttpClientException extends RuntimeException +interface ClientException extends Throwable { } diff --git a/src/CurlHttpClient.php b/src/Storage/Http/CurlClient.php similarity index 80% rename from src/CurlHttpClient.php rename to src/Storage/Http/CurlClient.php index 4de9b075..f3cbb9c1 100644 --- a/src/CurlHttpClient.php +++ b/src/Storage/Http/CurlClient.php @@ -13,7 +13,7 @@ declare(strict_types=1); -namespace Pdp; +namespace Pdp\Storage\Http; use function curl_close; use function curl_errno; @@ -29,12 +29,9 @@ use const CURLOPT_SSL_VERIFYHOST; use const CURLOPT_SSL_VERIFYPEER; -final class CurlHttpClient implements HttpClient +final class CurlClient implements Client { - /** - * @var array - */ - private $options; + private array $options; /** * new instance. @@ -56,7 +53,7 @@ public function __construct(array $options = []) $res = @curl_setopt_array($curl, $this->options); curl_close($curl); if (!$res) { - throw new Exception('Please verify your curl additionnal options'); + throw new CurlClientException('Please verify your curl additionnal options'); } } @@ -70,13 +67,13 @@ public function getContent(string $url): string curl_setopt_array($curl, $this->options); /** @var string $content */ $content = curl_exec($curl); - $error_code = curl_errno($curl); - $error_message = curl_error($curl); + $code = curl_errno($curl); + $message = curl_error($curl); curl_close($curl); - if (CURLE_OK === $error_code) { - return $content; + if (CURLE_OK !== $code) { + throw new CurlClientException($message, $code); } - throw new HttpClientException($error_message, $error_code); + return $content; } } diff --git a/src/Exception/CouldNotLoadTLDs.php b/src/Storage/Http/CurlClientException.php similarity index 76% rename from src/Exception/CouldNotLoadTLDs.php rename to src/Storage/Http/CurlClientException.php index e69adf7a..609807b1 100644 --- a/src/Exception/CouldNotLoadTLDs.php +++ b/src/Storage/Http/CurlClientException.php @@ -13,10 +13,10 @@ declare(strict_types=1); -namespace Pdp\Exception; +namespace Pdp\Storage\Http; -use Pdp\Exception as BaseException; +use RuntimeException; -class CouldNotLoadTLDs extends BaseException +class CurlClientException extends RuntimeException implements ClientException { } diff --git a/src/Storage/Installer.php b/src/Storage/Installer.php new file mode 100644 index 00000000..df083840 --- /dev/null +++ b/src/Storage/Installer.php @@ -0,0 +1,89 @@ + + */ +final class Installer +{ + public const CACHE_DIR_KEY = 'cache-dir'; + public const URI_KEY_PSL = 'psl'; + public const URI_KEY_RZD = 'rzd'; + public const TTL_KEY = 'ttl'; + public const DEFAULT_CONTEXT = [ + self::CACHE_DIR_KEY => '', + self::URI_KEY_PSL => null, + self::URI_KEY_RZD => null, + self::TTL_KEY => '1 DAY', + ]; + + public const DEFAULT_REMOTE_URI = [ + self::URI_KEY_PSL => 'https://publicsuffix.org/list/public_suffix_list.dat', + self::URI_KEY_RZD => 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt', + ]; + + private LoggerInterface $logger; + + public function __construct(LoggerInterface $logger = null) + { + $this->logger = $logger ?? new NullLogger(); + } + + /** + * Refresh the locale cache. + */ + public function updateLocalCopies(array $arguments = []): bool + { + $context = $arguments + self::DEFAULT_CONTEXT; + $context = filter_var_array($context, [ + self::URI_KEY_PSL => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW, 'default' => self::DEFAULT_REMOTE_URI[self::URI_KEY_PSL]], + self::URI_KEY_RZD => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW, 'default' => self::DEFAULT_REMOTE_URI[self::URI_KEY_RZD]], + self::TTL_KEY => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW, 'default' => '1 DAY'], + ]); + + try { + $psr16Cache = new Psr16FileCache($context[self::CACHE_DIR_KEY]); + $storage = new Manager( + new CurlClient(), + new RulesCachePsr16Adapter($psr16Cache, $context[self::TTL_KEY], $this->logger), + new TopLevelDomainsCachePsr16Adapter($psr16Cache, $context[self::TTL_KEY], $this->logger), + ); + + $storage->getRulesRemoteCopy($context[self::URI_KEY_PSL]); + $storage->getTopLevelDomainsRemoteCopy($context[self::URI_KEY_PSL]); + } catch (Throwable $exception) { + $this->logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); + + return false; + } + + return true; + } +} diff --git a/src/Storage/Manager.php b/src/Storage/Manager.php new file mode 100644 index 00000000..8e6e1d99 --- /dev/null +++ b/src/Storage/Manager.php @@ -0,0 +1,104 @@ + + * @author Ignace Nyamagana Butera + */ +final class Manager +{ + public const PSL_URL = 'https://publicsuffix.org/list/public_suffix_list.dat'; + private const RZD_URL = 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt'; + + private Client $http; + + private RulesCache $rulesCache; + + private TopLevelDomainsCache $topLevelDomainsCache; + + public function __construct(Client $http, RulesCache $rulesCache, TopLevelDomainsCache $topLevelDomainsCache) + { + $this->http = $http; + $this->rulesCache = $rulesCache; + $this->topLevelDomainsCache = $topLevelDomainsCache; + } + + /** + * Gets the Public Suffix List from the Local Storage or the Remote Storage. + * + * @throws UnableToLoadRules + */ + public function getRulesLocalCopy(string $url = self::PSL_URL): Rules + { + return $this->rulesCache->fetchByUri($url) ?? $this->getRulesRemoteCopy($url); + } + + /** + * Gets the Public Suffix List from an the Remote Storage. + * + * @throws UnableToLoadRules + */ + public function getRulesRemoteCopy(string $uri = null): Rules + { + $uri = $uri ?? self::PSL_URL; + $rules = Rules::createFromString($this->http->getContent($uri)); + + $this->rulesCache->storeByUri($uri, $rules); + + return $rules; + } + + /** + * Gets the Top Level Domains from the Local Storage or the Remote Storage. + * + * @throws UnableToLoadTopLevelDomains + */ + public function getTopLevelDomainsLocalCopy(string $uri = null): TopLevelDomains + { + $uri = $uri ?? self::RZD_URL; + + return $this->topLevelDomainsCache->fetchByUri($uri) ?? $this->getTopLevelDomainsRemoteCopy($uri); + } + + /** + * Gets the Top Level Domains from the Remote Storage. + * + * @throws UnableToLoadTopLevelDomains + */ + public function getTopLevelDomainsRemoteCopy(string $uri = null): TopLevelDomains + { + $uri = $uri ?? self::RZD_URL; + $topLevelDomains = TopLevelDomains::createFromString($this->http->getContent($uri)); + + $this->topLevelDomainsCache->storeByUri($uri, $topLevelDomains); + + return $topLevelDomains; + } +} diff --git a/src/Storage/Output.php b/src/Storage/Output.php new file mode 100644 index 00000000..6a2470ce --- /dev/null +++ b/src/Storage/Output.php @@ -0,0 +1,41 @@ + */ -final class TopLevelDomains implements Countable, IteratorAggregate +final class TopLevelDomains implements Countable, IteratorAggregate, JsonSerializable { - /** - * @var DateTimeImmutable - */ - private $modifiedDate; + private DateTimeImmutable $modifiedDate; - /** - * @var string - */ - private $version; + private string $version; - /** - * @var array - */ - private $records; + private array $records; - /** - * @var int - */ - private $asciiIDNAOption; + private int $asciiIDNAOption; - /** - * @var int - */ - private $unicodeIDNAOption; + private int $unicodeIDNAOption; - /** - * New instance. - * - * @internal - * - * @param array $records - * @param string $version - * @param DateTimeInterface $modifiedDate - * @param int $asciiIDNAOption - * @param int $unicodeIDNAOption - */ - public function __construct( + private function __construct( array $records, string $version, DateTimeInterface $modifiedDate, @@ -92,14 +73,9 @@ public function __construct( /** * Returns a new instance from a file path. * - * @param string $path * @param null|resource $context - * @param int $asciiIDNAOption - * @param int $unicodeIDNAOption - * - * @throws CouldNotLoadTLDs If the rules can not be loaded from the path * - * @return self + * @throws UnableToLoadTopLevelDomains If the rules can not be loaded from the path */ public static function createFromPath( string $path, @@ -114,7 +90,7 @@ public static function createFromPath( $resource = @fopen(...$args); if (false === $resource) { - throw new CouldNotLoadTLDs(sprintf('`%s`: failed to open stream: No such file or directory', $path)); + throw UnableToLoadTopLevelDomains::dueToInvalidPath($path); } /** @var string $content */ @@ -124,15 +100,6 @@ public static function createFromPath( return self::createFromString($content, $asciiIDNAOption, $unicodeIDNAOption); } - /** - * Returns a new instance from a string. - * - * @param string $content - * @param int $asciiIDNAOption - * @param int $unicodeIDNAOption - * - * @return self - */ public static function createFromString( string $content, int $asciiIDNAOption = IDNA_DEFAULT, @@ -140,7 +107,7 @@ public static function createFromString( ): self { static $converter; - $converter = $converter ?? new TLDConverter(); + $converter = $converter ?? new TopLevelDomainsConverter(); $data = $converter->convert($content); /** @var DateTimeImmutable $modifiedDate */ @@ -155,6 +122,27 @@ public static function createFromString( ); } + public static function createFromJsonString( + string $jsonString, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ): self { + $data = json_decode($jsonString, true); + $errorCode = json_last_error(); + if (JSON_ERROR_NONE !== $errorCode) { + throw UnableToLoadTopLevelDomains::dueToInvalidJson($errorCode, json_last_error_msg()); + } + + if (!isset($data['records'], $data['version'], $data['modifiedDate'])) { + throw UnableToLoadTopLevelDomains::dueToInvalidHashMap(); + } + + /** @var DateTimeImmutable $modifiedDate */ + $modifiedDate = DateTimeImmutable::createFromFormat(DATE_ATOM, $data['modifiedDate']); + + return new self($data['records'], $data['version'], $modifiedDate, $asciiIDNAOption, $unicodeIDNAOption); + } + /** * {@inheritdoc} */ @@ -171,8 +159,6 @@ public static function __set_state(array $properties): self /** * Returns the Version ID. - * - * @return string */ public function getVersion(): string { @@ -181,8 +167,6 @@ public function getVersion(): string /** * Returns the List Last Modified Date. - * - * @return DateTimeImmutable */ public function getModifiedDate(): DateTimeImmutable { @@ -195,8 +179,6 @@ public function getModifiedDate(): DateTimeImmutable * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php - * - * @return int */ public function getAsciiIDNAOption(): int { @@ -209,8 +191,6 @@ public function getAsciiIDNAOption(): int * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php - * - * @return int */ public function getUnicodeIDNAOption(): int { @@ -227,8 +207,6 @@ public function count(): int /** * Tells whether the list is empty. - * - * @return bool */ public function isEmpty(): bool { @@ -241,21 +219,14 @@ public function isEmpty(): bool public function getIterator() { foreach ($this->records as $tld) { - yield (new PublicSuffix( - $tld, - PublicSuffix::ICANN_DOMAINS, - $this->asciiIDNAOption, - $this->unicodeIDNAOption - ))->toAscii(); + yield PublicSuffix::fromICANNSection($tld, $this->asciiIDNAOption, $this->unicodeIDNAOption)->toAscii(); } } /** * Returns an array representation of the list. - * - * @return array */ - public function toArray(): array + public function jsonSerialize(): array { return [ 'version' => $this->version, @@ -267,17 +238,15 @@ public function toArray(): array /** * Tells whether the submitted TLD is a valid Top Level Domain. * - * @param mixed $tld - * - * @return bool + * @param mixed $tld a TLD in a type that can be converted into a DomainInterface instance */ public function contains($tld): bool { try { - if (!$tld instanceof Domain) { - $tld = new Domain($tld, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); + if (!$tld instanceof DomainInterface) { + $tld = new Domain($tld, $this->asciiIDNAOption, $this->unicodeIDNAOption); } - } catch (Exception $e) { + } catch (Exception $exception) { return false; } @@ -285,7 +254,9 @@ public function contains($tld): bool return false; } - $label = $tld->toAscii()->getLabel(0); + /** @var DomainInterface $asciiDomain */ + $asciiDomain = $tld->toAscii(); + $label = $asciiDomain->label(0); foreach ($this as $knownTld) { if ($knownTld->getContent() === $label) { return true; @@ -298,26 +269,29 @@ public function contains($tld): bool /** * Returns a domain where its public suffix is the found TLD. * - * @param mixed $domain - * - * @return Domain + * @param mixed $domain a domain in a type that can be converted into a DomainInterface instance */ - public function resolve($domain): Domain + public function resolve($domain): ResolvableHostInterface { - try { - if (!$domain instanceof Domain) { - $domain = new Domain($domain, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); - } - } catch (Exception $e) { - return new Domain(null, null, $this->asciiIDNAOption, $this->unicodeIDNAOption); + if ($domain instanceof ResolvableHostInterface) { + $domain = $domain->getDomain(); + $domain + ->withUnicodeIDNAOption($this->unicodeIDNAOption) + ->withAsciiIDNAOption($this->asciiIDNAOption); } - if (!$domain->isResolvable()) { - return $domain; + if (!$domain instanceof DomainInterface) { + $domain = new Domain($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption); + } + + /** @var DomainInterface $asciiDomain */ + $asciiDomain = $domain->toAscii(); + if (!$asciiDomain->isResolvable()) { + throw UnableToResolveDomain::dueToUnresolvableDomain($domain); } $publicSuffix = null; - $label = $domain->toAscii()->getLabel(0); + $label = $asciiDomain->label(0); foreach ($this as $tld) { if ($tld->getContent() === $label) { $publicSuffix = $tld; @@ -325,7 +299,7 @@ public function resolve($domain): Domain } } - return $domain->resolve($publicSuffix); + return new ResolvableDomain($domain, PublicSuffix::fromUnknownSection($publicSuffix)); } /** @@ -334,10 +308,6 @@ public function resolve($domain): Domain * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php - * - * @param int $option - * - * @return self */ public function withAsciiIDNAOption(int $option): self { @@ -357,10 +327,6 @@ public function withAsciiIDNAOption(int $option): self * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php - * - * @param int $option - * - * @return self */ public function withUnicodeIDNAOption(int $option): self { diff --git a/src/TLDConverter.php b/src/TopLevelDomainsConverter.php similarity index 72% rename from src/TLDConverter.php rename to src/TopLevelDomainsConverter.php index b7bec47e..e2efc75c 100644 --- a/src/TLDConverter.php +++ b/src/TopLevelDomainsConverter.php @@ -16,10 +16,9 @@ namespace Pdp; use DateTimeImmutable; -use Pdp\Exception\CouldNotLoadTLDs; +use Pdp\Contract\Exception; use SplTempFileObject; use function preg_match; -use function sprintf; use function strpos; use function trim; use const DATE_ATOM; @@ -31,18 +30,14 @@ * * @author Ignace Nyamagana Butera */ -final class TLDConverter +final class TopLevelDomainsConverter { private const IANA_DATE_FORMAT = 'D M d H:i:s Y e'; /** * Converts the IANA Root Zone Database into a TopLevelDomains associative array. * - * @param string $content - * - * @throws CouldNotLoadTLDs if the content is invalid or can not be correctly parsed and converted - * - * @return array + * @throws UnableToLoadTopLevelDomains if the content is invalid or can not be correctly parsed and converted */ public function convert(string $content): array { @@ -64,29 +59,25 @@ public function convert(string $content): array continue; } - throw new CouldNotLoadTLDs(sprintf('Invalid line content: %s', $line)); + throw UnableToLoadTopLevelDomains::dueToInvalidLine($line); } if (isset($data['version'], $data['modifiedDate'], $data['records'])) { return $data; } - throw new CouldNotLoadTLDs(sprintf('Invalid content: TLD conversion failed')); + throw UnableToLoadTopLevelDomains::dueToFailedConversion(); } /** * Extract IANA Root Zone Database header info. * - * @param string $content - * - * @throws CouldNotLoadTLDs if the Header line is invalid - * - * @return array + * @throws UnableToLoadTopLevelDomains if the Header line is invalid */ private function extractHeader(string $content): array { if (1 !== preg_match('/^\# Version (?\d+), Last Updated (?.*?)$/', $content, $matches)) { - throw new CouldNotLoadTLDs(sprintf('Invalid Version line: %s', $content)); + throw UnableToLoadTopLevelDomains::dueToInvalidVersionLine($content); } /** @var DateTimeImmutable $date */ @@ -101,22 +92,18 @@ private function extractHeader(string $content): array /** * Extract IANA Root Zone. * - * @param string $content - * - * @throws CouldNotLoadTLDs If the Root Zone is invalid - * - * @return string + * @throws UnableToLoadTopLevelDomains If the Root Zone is invalid */ private function extractRootZone(string $content): string { try { - $tld = (new PublicSuffix($content))->toAscii(); + $tld = PublicSuffix::fromUnknownSection($content)->toAscii(); } catch (Exception $exception) { - throw new CouldNotLoadTLDs(sprintf('Invalid Root zone: %s', $content), 0, $exception); + throw UnableToLoadTopLevelDomains::dueToInvalidRootZoneDomain($content, $exception); } if (1 !== $tld->count() || '' === $tld->getContent()) { - throw new CouldNotLoadTLDs(sprintf('Invalid Root zone: %s', $content)); + throw UnableToLoadTopLevelDomains::dueToInvalidRootZoneDomain($content); } return (string) $tld; diff --git a/src/UnableToLoadRules.php b/src/UnableToLoadRules.php new file mode 100644 index 00000000..9e9e30e0 --- /dev/null +++ b/src/UnableToLoadRules.php @@ -0,0 +1,38 @@ +getContent(); + } + + $exception = new self('The domain "'.$content.'" can not contain a public suffix.'); + $exception->domain = $domain; + + return $exception; + } + + public static function dueToMissingRegistrableDomain(HostInterface $domain = null): self + { + $content = $domain; + if (null !== $content) { + $content = $content->getContent(); + } + + $exception = new self('A subdomain can not be added to a domain "'.$content.'" without a registrable domain part.'); + $exception->domain = $domain; + + return $exception; + } + + public static function dueToUnSupportedSection(string $section): self + { + return new self('`'.$section.'` is an unknown Public Suffix List section.'); + } + + public function hasDomain(): bool + { + return null !== $this->domain; + } + + public function getDomain(): ?HostInterface + { + return $this->domain; + } +} diff --git a/tests/ConverterTest.php b/tests/ConverterTest.php index 2e4e225b..20da0e7e 100644 --- a/tests/ConverterTest.php +++ b/tests/ConverterTest.php @@ -15,12 +15,12 @@ namespace Pdp\Tests; -use Pdp\Converter; -use Pdp\Exception\CouldNotLoadRules; +use Pdp\RulesConverter; +use Pdp\UnableToLoadRules; use PHPUnit\Framework\TestCase; /** - * @coversDefaultClass Pdp\Converter + * @coversDefaultClass \Pdp\RulesConverter */ class ConverterTest extends TestCase { @@ -28,28 +28,33 @@ public function testConverter(): void { /** @var string $string */ $string = file_get_contents(__DIR__.'/data/public_suffix_list.dat'); - $retval = (new Converter())->convert($string); - self::assertNotEmpty($retval[Converter::ICANN_DOMAINS]); - self::assertNotEmpty($retval[Converter::PRIVATE_DOMAINS]); + $retval = (new RulesConverter())->convert($string); + + self::assertNotEmpty($retval['ICANN_DOMAINS']); + self::assertNotEmpty($retval['PRIVATE_DOMAINS']); } public function testConvertThrowsExceptionWithInvalidContent(): void { - self::expectException(CouldNotLoadRules::class); /** @var string $content */ $content = file_get_contents(__DIR__.'/data/invalid_suffix_list_content.dat'); - (new Converter())->convert($content); + + self::expectException(UnableToLoadRules::class); + + (new RulesConverter())->convert($content); } public function testConvertWithEmptyString(): void { - $retval = (new Converter())->convert(''); - self::assertEquals([Converter::ICANN_DOMAINS => [], Converter::PRIVATE_DOMAINS => []], $retval); + $retVal = (new RulesConverter())->convert(''); + + self::assertEquals(['ICANN_DOMAINS' => [], 'PRIVATE_DOMAINS' => []], $retVal); } public function testConvertWithInvalidString(): void { - $retval = (new Converter())->convert('foobar'); - self::assertEquals([Converter::ICANN_DOMAINS => [], Converter::PRIVATE_DOMAINS => []], $retval); + $retVal = (new RulesConverter())->convert('foobar'); + + self::assertEquals(['ICANN_DOMAINS' => [], 'PRIVATE_DOMAINS' => []], $retVal); } } diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 8b8d5fa0..01e5a37a 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -16,16 +16,10 @@ namespace Pdp\Tests; use Pdp\Domain; -use Pdp\Exception\CouldNotResolvePublicSuffix; -use Pdp\Exception\CouldNotResolveSubDomain; -use Pdp\Exception\InvalidDomain; -use Pdp\Exception\InvalidLabel; -use Pdp\Exception\InvalidLabelKey; -use Pdp\PublicSuffix; -use Pdp\Rules; +use Pdp\InvalidDomain; use PHPUnit\Framework\TestCase; use TypeError; -use function date_create; +use const IDNA_DEFAULT; use const IDNA_NONTRANSITIONAL_TO_ASCII; use const IDNA_NONTRANSITIONAL_TO_UNICODE; @@ -34,67 +28,11 @@ */ class DomainTest extends TestCase { - /** - * @covers ::__construct - * @covers ::setPublicSuffix - * @covers ::setRegistrableDomain - * @covers ::setSubDomain - * @covers ::getPublicSuffix - * @covers ::getRegistrableDomain - * @covers ::getSubDomain - */ - public function testRegistrableDomainIsNullWithFoundDomain(): void - { - $domain = new Domain('faketld', null); - self::assertNull($domain->getPublicSuffix()); - self::assertNull($domain->getRegistrableDomain()); - self::assertNull($domain->getSubDomain()); - } - - /** - * @covers ::__construct - * @covers ::setPublicSuffix - * @covers ::normalize - * @dataProvider provideWrongConstructor - * - * @param mixed $domain - * @param mixed $publicSuffix - */ - public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain($domain, $publicSuffix): void - { - self::expectException(CouldNotResolvePublicSuffix::class); - new Domain($domain, new PublicSuffix($publicSuffix)); - } - - public function provideWrongConstructor(): iterable - { - return [ - 'public suffix mismatch' => [ - 'domain' => 'www.ulb.ac.be', - 'publicSuffix' => 'com', - ], - 'domain and public suffix are the same' => [ - 'domain' => 'co.uk', - 'publicSuffix' => 'co.uk', - ], - 'domain has no labels' => [ - 'domain' => 'localhost', - 'publicSuffix' => 'localhost', - ], - 'domain is null' => [ - 'domain' => null, - 'publicSuffix' => 'com', - ], - ]; - } - /** * @dataProvider invalidDomainProvider * @covers ::__construct * @covers ::parse * @covers ::idnToAscii - * @covers ::getIdnErrors - * @param string $domain */ public function testToAsciiThrowsException(string $domain): void { @@ -114,7 +52,6 @@ public function invalidDomainProvider(): iterable /** * @covers ::toUnicode * @covers ::idnToUnicode - * @covers ::getIdnErrors */ public function testToUnicodeThrowsException(): void { @@ -125,30 +62,27 @@ public function testToUnicodeThrowsException(): void /** * @covers ::__construct * @covers ::__set_state - * @covers ::__debugInfo * @covers ::__toString * @covers ::jsonSerialize * @covers ::getIterator */ public function testDomainInternalPhpMethod(): void { - $domain = new Domain('www.ulb.ac.be', new PublicSuffix('ac.be')); + $domain = new Domain('www.ulb.ac.be'); $generateDomain = eval('return '.var_export($domain, true).';'); self::assertEquals($domain, $generateDomain); self::assertSame(['be', 'ac', 'ulb', 'www'], iterator_to_array($domain)); - self::assertEquals($domain->__debugInfo(), $domain->jsonSerialize()); + self::assertEquals('"www.ulb.ac.be"', json_encode($domain)); self::assertSame('www.ulb.ac.be', (string) $domain); } /** - * @covers ::normalize * @covers ::getIterator * @covers ::count * @dataProvider countableProvider * * @param string[] $labels * @param ?string $domain - * @param int $nbLabels */ public function testCountable(?string $domain, int $nbLabels, array $labels): void { @@ -168,16 +102,16 @@ public function countableProvider(): iterable } /** - * @covers ::getLabel + * @covers ::label */ public function testGetLabel(): void { $domain = new Domain('master.example.com'); - self::assertSame('com', $domain->getLabel(0)); - self::assertSame('example', $domain->getLabel(1)); - self::assertSame('master', $domain->getLabel(-1)); - self::assertNull($domain->getLabel(23)); - self::assertNull($domain->getLabel(-23)); + self::assertSame('com', $domain->label(0)); + self::assertSame('example', $domain->label(1)); + self::assertSame('master', $domain->label(-1)); + self::assertNull($domain->label(23)); + self::assertNull($domain->label(-23)); } /** @@ -209,40 +143,27 @@ public function testLabels(): void /** * @covers ::parse - * @covers ::setPublicSuffix - * @covers ::normalize - * @covers ::setRegistrableDomain - * @covers ::setSubDomain - * @covers ::getDomain * @covers ::getContent - * @covers ::getPublicSuffix * @covers ::idnToUnicode * @covers ::toUnicode * @covers \Pdp\PublicSuffix::toUnicode * @dataProvider toUnicodeProvider + * * @param ?string $domain - * @param ?string $publicSuffix * @param ?string $expectedDomain - * @param ?string $expectedSuffix * @param ?string $expectedIDNDomain - * @param ?string $expectedIDNSuffix */ public function testToIDN( ?string $domain, - ?string $publicSuffix, ?string $expectedDomain, - ?string $expectedSuffix, - ?string $expectedIDNDomain, - ?string $expectedIDNSuffix + ?string $expectedIDNDomain ): void { - $domain = new Domain($domain, new PublicSuffix($publicSuffix)); - self::assertSame($expectedDomain, $domain->getDomain()); - self::assertSame($expectedSuffix, $domain->getPublicSuffix()); + $domain = new Domain($domain); + self::assertSame($expectedDomain, $domain->getContent()); /** @var Domain $domainIDN */ $domainIDN = $domain->toUnicode(); - self::assertSame($expectedIDNDomain, $domainIDN->getDomain()); - self::assertSame($expectedIDNSuffix, $domainIDN->getPublicSuffix()); + self::assertSame($expectedIDNDomain, $domainIDN->getContent()); } public function toUnicodeProvider(): iterable @@ -250,100 +171,65 @@ public function toUnicodeProvider(): iterable return [ 'simple domain' => [ 'domain' => 'www.ulb.ac.be', - 'publicSuffix' => 'ac.be', 'expectedDomain' => 'www.ulb.ac.be', - 'expectedSuffix' => 'ac.be', 'expectedIDNDomain' => 'www.ulb.ac.be', - 'expectedIDNSuffix' => 'ac.be', ], 'ASCII to IDN domain' => [ 'domain' => 'www.xn--85x722f.xn--55qx5d.cn', - 'publicSuffix' => 'xn--85x722f.xn--55qx5d.cn', 'expectedDomain' => 'www.xn--85x722f.xn--55qx5d.cn', - 'expectedSuffix' => 'xn--85x722f.xn--55qx5d.cn', 'expectedIDNDomain' => 'www.食狮.公司.cn', - 'expectedIDNSuffix' => '食狮.公司.cn', ], 'IDN to IDN domain' => [ 'domain' => 'www.食狮.公司.cn', - 'publicSuffix' => '食狮.公司.cn', 'expectedDomain' => 'www.食狮.公司.cn', - 'expectedSuffix' => '食狮.公司.cn', 'expectedIDNDomain' => 'www.食狮.公司.cn', - 'expectedIDNSuffix' => '食狮.公司.cn', ], 'empty string domain and null suffix' => [ 'domain' => '', - 'publicSuffix' => null, 'expectedDomain' => '', - 'expectedSuffix' => null, 'expectedIDNDomain' => '', - 'expectedIDNSuffix' => null, ], 'null domain and suffix' => [ 'domain' => null, - 'publicSuffix' => null, 'expectedDomain' => null, - 'expectedSuffix' => null, 'expectedIDNDomain' => null, - 'expectedIDNSuffix' => null, ], 'domain with null suffix' => [ 'domain' => 'www.xn--85x722f.xn--55qx5d.cn', - 'publicSuffix' => null, 'expectedDomain' => 'www.xn--85x722f.xn--55qx5d.cn', - 'expectedSuffix' => null, 'expectedIDNDomain' => 'www.食狮.公司.cn', - 'expectedIDNSuffix' => null, ], 'domain with URLencoded data' => [ 'domain' => 'b%C3%A9b%C3%A9.be', - 'publicSuffix' => 'be', 'expectedDomain' => 'bébé.be', - 'expectedSuffix' => 'be', 'expectedIDNDomain' => 'bébé.be', - 'expectedIDNSuffix' => 'be', ], ]; } /** * @covers ::parse - * @covers ::setPublicSuffix - * @covers ::normalize - * @covers ::setRegistrableDomain - * @covers ::setSubDomain - * @covers ::getDomain * @covers ::getContent - * @covers ::getPublicSuffix * @covers ::idnToAscii * @covers ::toAscii * @covers \Pdp\PublicSuffix::toAscii * * @dataProvider toAsciiProvider * @param ?string $domain - * @param ?string $publicSuffix * @param ?string $expectedDomain - * @param ?string $expectedSuffix * @param ?string $expectedAsciiDomain - * @param ?string $expectedAsciiSuffix */ public function testToAscii( ?string $domain, - ?string $publicSuffix, ?string $expectedDomain, - ?string $expectedSuffix, - ?string $expectedAsciiDomain, - ?string $expectedAsciiSuffix + ?string $expectedAsciiDomain ): void { - $domain = new Domain($domain, new PublicSuffix($publicSuffix)); - self::assertSame($expectedDomain, $domain->getDomain()); - self::assertSame($expectedSuffix, $domain->getPublicSuffix()); + $domain = new Domain($domain); + self::assertSame($expectedDomain, $domain->getContent()); /** @var Domain $domainIDN */ $domainIDN = $domain->toAscii(); - self::assertSame($expectedAsciiDomain, $domainIDN->getDomain()); - self::assertSame($expectedAsciiSuffix, $domainIDN->getPublicSuffix()); + self::assertSame($expectedAsciiDomain, $domainIDN->getContent()); } public function toAsciiProvider(): iterable @@ -351,412 +237,48 @@ public function toAsciiProvider(): iterable return [ 'simple domain' => [ 'domain' => 'www.ulb.ac.be', - 'publicSuffix' => 'ac.be', 'expectedDomain' => 'www.ulb.ac.be', - 'expectedSuffix' => 'ac.be', 'expectedIDNDomain' => 'www.ulb.ac.be', - 'expectedIDNSuffix' => 'ac.be', ], 'ASCII to ASCII domain' => [ 'domain' => 'www.xn--85x722f.xn--55qx5d.cn', - 'publicSuffix' => 'xn--85x722f.xn--55qx5d.cn', 'expectedDomain' => 'www.xn--85x722f.xn--55qx5d.cn', - 'expectedSuffix' => 'xn--85x722f.xn--55qx5d.cn', 'expectedIDNDomain' => 'www.xn--85x722f.xn--55qx5d.cn', - 'expectedIDNSuffix' => 'xn--85x722f.xn--55qx5d.cn', ], 'ASCII to IDN domain' => [ 'domain' => 'www.食狮.公司.cn', - 'publicSuffix' => '食狮.公司.cn', 'expectedDomain' => 'www.食狮.公司.cn', - 'expectedSuffix' => '食狮.公司.cn', 'expectedIDNDomain' => 'www.xn--85x722f.xn--55qx5d.cn', - 'expectedIDNSuffix' => 'xn--85x722f.xn--55qx5d.cn', ], 'null domain and suffix' => [ 'domain' => null, - 'publicSuffix' => null, 'expectedDomain' => null, - 'expectedSuffix' => null, 'expectedIDNDomain' => null, - 'expectedIDNSuffix' => null, ], 'domain with null suffix' => [ 'domain' => 'www.食狮.公司.cn', - 'publicSuffix' => null, 'expectedDomain' => 'www.食狮.公司.cn', - 'expectedSuffix' => null, 'expectedIDNDomain' => 'www.xn--85x722f.xn--55qx5d.cn', - 'expectedIDNSuffix' => null, - ], - ]; - } - - /** - * @covers ::resolve - * @covers ::normalize - * @dataProvider resolvePassProvider - * - * @param mixed $publicSuffix - * @param Domain $domain - * @param ?string $expected - */ - public function testResolveWorks(Domain $domain, $publicSuffix, ?string $expected): void - { - self::assertSame($expected, $domain->resolve($publicSuffix)->getPublicSuffix()); - } - - public function resolvePassProvider(): iterable - { - $publicSuffix = new PublicSuffix('ac.be', Rules::ICANN_DOMAINS); - $domain = new Domain('ulb.ac.be', $publicSuffix); - - return [ - 'null public suffix' => [ - 'domain' => $domain, - 'public suffix' => new PublicSuffix(), - 'expected' => null, - ], - 'null public suffix (with null value)' => [ - 'domain' => $domain, - 'public suffix' => null, - 'expected' => null, - ], - 'same public suffix' => [ - 'domain' => $domain, - 'public suffix' => $publicSuffix, - 'expected' => 'ac.be', - ], - 'same public suffix (with string value)' => [ - 'domain' => $domain, - 'public suffix' => 'ac.be', - 'expected' => 'ac.be', - ], - 'update public suffix' => [ - 'domain' => $domain, - 'public suffix' => new PublicSuffix('be', Rules::ICANN_DOMAINS), - 'expected' => 'be', - ], - 'idn domain name' => [ - 'domain' => new Domain('Яндекс.РФ', new PublicSuffix('рф', Rules::ICANN_DOMAINS)), - 'public suffix' => new PublicSuffix('рф', Rules::ICANN_DOMAINS), - 'expected' => 'рф', - ], - 'idn domain name with ascii public suffix' => [ - 'domain' => new Domain('Яндекс.РФ', new PublicSuffix('рф', Rules::ICANN_DOMAINS)), - 'public suffix' => new PublicSuffix('xn--p1ai', Rules::ICANN_DOMAINS), - 'expected' => 'рф', - ], - ]; - } - - /** - * @covers ::resolve - * @dataProvider resolveFailsProvider - * @param Domain $domain - * @param PublicSuffix $publicSuffix - */ - public function testResolveFails(Domain $domain, PublicSuffix $publicSuffix): void - { - self::expectException(CouldNotResolvePublicSuffix::class); - $domain->resolve($publicSuffix); - } - - public function resolveFailsProvider(): iterable - { - $publicSuffix = new PublicSuffix('ac.be', Rules::ICANN_DOMAINS); - $domain = new Domain('ulb.ac.be', $publicSuffix); - - return [ - 'public suffix mismatch' => [ - 'domain' => $domain, - 'public suffix' => new PublicSuffix('ac.fr'), - ], - 'domain name can not contains public suffix' => [ - 'domain' => new Domain('localhost'), - 'public suffix' => $publicSuffix, - ], - 'domain name is equal to public suffix' => [ - 'domain' => new Domain('ac.be'), - 'public suffix' => $publicSuffix, - ], - 'partial public suffix' => [ - 'domain' => $domain, - 'public suffix' => new PublicSuffix('c.be'), - ], - 'mismatch idn public suffix' => [ - 'domain' => new Domain('www.食狮.公司.cn'), - 'public suffix' => new PublicSuffix('cn.公司'), - ], - ]; - } - - /** - * @covers ::resolve - */ - public function testResolveReturnsInstance(): void - { - $publicSuffix = new PublicSuffix('ac.be', Rules::ICANN_DOMAINS); - $domain = new Domain('ulb.ac.be', $publicSuffix); - self::assertSame($domain, $domain->resolve($publicSuffix)); - self::assertNotSame($domain, $domain->resolve(new PublicSuffix('ac.be', Rules::PRIVATE_DOMAINS))); - } - - /** - * @covers ::withSubDomain - * @covers ::normalizeContent - * @dataProvider withSubDomainWorksProvider - * - * @param mixed $subdomain - * @param Domain $domain - * @param ?string $expected - */ - public function testWithSubDomainWorks(Domain $domain, $subdomain, ?string $expected): void - { - $result = $domain->withSubDomain($subdomain); - self::assertSame($expected, $result->getSubDomain()); - self::assertSame($domain->getPublicSuffix(), $result->getPublicSuffix()); - self::assertSame($domain->getRegistrableDomain(), $result->getRegistrableDomain()); - self::assertSame($domain->isKnown(), $result->isKnown()); - self::assertSame($domain->isICANN(), $result->isICANN()); - self::assertSame($domain->isPrivate(), $result->isPrivate()); - } - - public function withSubDomainWorksProvider(): iterable - { - return [ - 'simple addition' => [ - 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), - 'subdomain' => 'www', - 'expected' => 'www', - ], - 'simple addition IDN (1)' => [ - 'domain' => new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), - 'subdomain' => new Domain('bébé'), - 'expected' => 'xn--bb-bjab', - ], - 'simple addition IDN (2)' => [ - 'domain' => new Domain('Яндекс.РФ', new PublicSuffix('рф', Rules::ICANN_DOMAINS)), - 'subdomain' => 'bébé', - 'expected' => 'bébé', - ], - 'simple removal' => [ - 'domain' => new Domain('www.example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)), - 'subdomain' => null, - 'expected' => null, - ], - 'simple removal IDN' => [ - 'domain' => new Domain('bébé.Яндекс.РФ', new PublicSuffix('рф', Rules::ICANN_DOMAINS)), - 'subdomain' => 'xn--bb-bjab', - 'expected' => 'bébé', ], ]; } - /** - * @covers ::withSubDomain - * @covers ::normalizeContent - */ - public function testWithSubDomainFailsWithNullDomain(): void - { - self::expectException(CouldNotResolveSubDomain::class); - (new Domain())->withSubDomain('www'); - } - - /** - * @covers ::withSubDomain - * @covers ::normalizeContent - */ - public function testWithSubDomainFailsWithOneLabelDomain(): void - { - self::expectException(CouldNotResolveSubDomain::class); - (new Domain('localhost'))->withSubDomain('www'); - } - - /** - * @covers ::withSubDomain - * @covers ::normalizeContent - */ - public function testWithEmptySubdomain(): void - { - self::expectException(InvalidDomain::class); - (new Domain( - 'www.example.com', - new PublicSuffix('com', PublicSuffix::ICANN_DOMAINS) - ))->withSubDomain(''); - } - - /** - * @covers ::withSubDomain - * @covers ::normalizeContent - */ - public function testWithSubDomainFailsWithNonStringableObject(): void - { - self::expectException(TypeError::class); - (new Domain( - 'example.com', - new PublicSuffix('com', PublicSuffix::ICANN_DOMAINS) - ))->withSubDomain(date_create()); - } - - - /** - * @covers ::withSubDomain - * @covers ::normalizeContent - */ - public function testWithSubDomainWithoutPublicSuffixInfo(): void - { - self::expectException(CouldNotResolveSubDomain::class); - (new Domain('www.example.com'))->withSubDomain('www'); - } - - /** - * @covers ::withPublicSuffix - * @dataProvider withPublicSuffixWorksProvider - * - * @param mixed $publicSuffix - * @param Domain $domain - * @param ?string $expected - * @param bool $isKnown - * @param bool $isICANN - * @param bool $isPrivate - */ - public function testWithPublicSuffixWorks( - Domain $domain, - $publicSuffix, - ?string $expected, - bool $isKnown, - bool $isICANN, - bool $isPrivate - ): void { - $result = $domain->withPublicSuffix($publicSuffix); - self::assertSame($expected, $result->getPublicSuffix()); - self::assertSame($isKnown, $result->isKnown()); - self::assertSame($isICANN, $result->isICANN()); - self::assertSame($isPrivate, $result->isPrivate()); - } - - public function withPublicSuffixWorksProvider(): iterable - { - $base_domain = new Domain('example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)); - - return [ - 'simple update (1)' => [ - 'domain' => $base_domain, - 'publicSuffix' => 'be', - 'expected' => 'be', - 'isKnown' => false, - 'isICANN' => false, - 'isPrivate' => false, - ], - 'simple update (2)' => [ - 'domain' => $base_domain, - 'publicSuffix' => new PublicSuffix('github.io', Rules::PRIVATE_DOMAINS), - 'expected' => 'github.io', - 'isKnown' => true, - 'isICANN' => false, - 'isPrivate' => true, - ], - 'same public suffix but PSL info is changed' => [ - 'domain' => $base_domain, - 'publicSuffix' => new PublicSuffix('com', Rules::PRIVATE_DOMAINS), - 'expected' => 'com', - 'isKnown' => true, - 'isICANN' => false, - 'isPrivate' => true, - ], - 'same public suffix but PSL info does not changed' => [ - 'domain' => $base_domain, - 'publicSuffix' => new PublicSuffix('com', Rules::ICANN_DOMAINS), - 'expected' => 'com', - 'isKnown' => true, - 'isICANN' => true, - 'isPrivate' => false, - ], - 'simple update IDN (1)' => [ - 'domain' => $base_domain, - 'publicSuffix' => new PublicSuffix('рф', Rules::ICANN_DOMAINS), - 'expected' => 'xn--p1ai', - 'isKnown' => true, - 'isICANN' => true, - 'isPrivate' => false, - ], - 'simple update IDN (2)' => [ - 'domain' => new Domain('www.bébé.be', new PublicSuffix('be', Rules::ICANN_DOMAINS)), - 'publicSuffix' => new PublicSuffix('xn--p1ai', Rules::ICANN_DOMAINS), - 'expected' => 'рф', - 'isKnown' => true, - 'isICANN' => true, - 'isPrivate' => false, - ], - 'adding the public suffix to a single label domain' => [ - 'domain' => new Domain('localhost'), - 'publicSuffix' => 'www', - 'expected' => 'www', - 'isKnown' => false, - 'isICANN' => false, - 'isPrivate' => false, - ], - 'removing the public suffix list' => [ - 'domain' => new Domain('www.bébé.be', new PublicSuffix('be', Rules::ICANN_DOMAINS)), - 'publicSuffix' => null, - 'expected' => null, - 'isKnown' => false, - 'isICANN' => false, - 'isPrivate' => false, - ], - 'with custom IDNA domain options' =>[ - 'domain' => new Domain('www.bébé.be', new PublicSuffix('be', Rules::ICANN_DOMAINS), IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE), - 'publicSuffix' => null, - 'expected' => null, - 'isKnown' => false, - 'isICANN' => false, - 'isPrivate' => false, - ], - ]; - } - - /** - * @covers ::withPublicSuffix - */ - public function testWithPublicSuffixFailsWithNullDomain(): void - { - self::expectException(InvalidDomain::class); - (new Domain())->withPublicSuffix('www'); - } - /** * @covers ::withLabel * @covers ::normalizeContent * @dataProvider withLabelWorksProvider * - * @param mixed $label - * @param Domain $domain - * @param int $key * @param ?string $expected - * @param bool $isKnown - * @param bool $isICANN - * @param bool $isPrivate */ - public function testWithLabelWorks( - Domain $domain, - int $key, - $label, - ?string $expected, - bool $isKnown, - bool $isICANN, - bool $isPrivate - ): void { + public function testWithLabelWorks(Domain $domain, int $key, string $label, ?string $expected): void + { $result = $domain->withLabel($key, $label); self::assertSame($expected, $result->getContent()); - self::assertSame($isKnown, $result->isKnown()); - self::assertSame($isICANN, $result->isICANN()); - self::assertSame($isPrivate, $result->isPrivate()); } public function withLabelWorksProvider(): iterable { - $base_domain = new Domain('www.example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)); + $base_domain = new Domain('www.example.com'); return [ 'null domain' => [ @@ -764,90 +286,60 @@ public function withLabelWorksProvider(): iterable 'key' => 0, 'label' => 'localhost', 'expected' => 'localhost', - 'isKnown' => false, - 'isICANN' => false, - 'isPrivate' => false, ], 'simple replace positive offset' => [ 'domain' => $base_domain, 'key' => 2, 'label' => 'shop', 'expected' => 'shop.example.com', - 'isKnown' => true, - 'isICANN' => true, - 'isPrivate' => false, ], 'simple replace negative offset' => [ 'domain' => $base_domain, 'key' => -1, 'label' => 'shop', 'expected' => 'shop.example.com', - 'isKnown' => true, - 'isICANN' => true, - 'isPrivate' => false, ], 'simple addition positive offset' => [ 'domain' => $base_domain, 'key' => 3, 'label' => 'shop', 'expected' => 'shop.www.example.com', - 'isKnown' => true, - 'isICANN' => true, - 'isPrivate' => false, ], 'simple addition negative offset' => [ 'domain' => $base_domain, 'key' => -4, 'label' => 'shop', 'expected' => 'www.example.com.shop', - 'isKnown' => false, - 'isICANN' => false, - 'isPrivate' => false, ], 'simple replace remove PSL info' => [ 'domain' => $base_domain, 'key' => 0, 'label' => 'fr', 'expected' => 'www.example.fr', - 'isKnown' => false, - 'isICANN' => false, - 'isPrivate' => false, ], 'replace without any change' => [ 'domain' => $base_domain, 'key' => 2, 'label' => 'www', 'expected' => 'www.example.com', - 'isKnown' => true, - 'isICANN' => true, - 'isPrivate' => false, ], 'simple update IDN (1)' => [ 'domain' => $base_domain, 'key' => 2, 'label' => 'рф', 'expected' => 'xn--p1ai.example.com', - 'isKnown' => true, - 'isICANN' => true, - 'isPrivate' => false, ], 'simple update IDN (2)' => [ - 'domain' => new Domain('www.bébé.be', new PublicSuffix('be', Rules::ICANN_DOMAINS)), + 'domain' => new Domain('www.bébé.be'), 'key' => 2, 'label' => 'xn--p1ai', 'expected' => 'рф.bébé.be', - 'isKnown' => true, - 'isICANN' => true, - 'isPrivate' => false, ], 'replace a domain with multiple label' => [ 'domain' => $base_domain, 'key' => -1, 'label' => 'www.shop', 'expected' => 'www.shop.example.com', - 'isKnown' => true, - 'isICANN' => true, - 'isPrivate' => false, ], ]; } @@ -857,7 +349,7 @@ public function withLabelWorksProvider(): iterable */ public function testWithLabelFailsWithTypeError(): void { - self::expectException(InvalidLabel::class); + self::expectException(TypeError::class); (new Domain('example.com'))->withLabel(1, null); } @@ -866,7 +358,7 @@ public function testWithLabelFailsWithTypeError(): void */ public function testWithLabelFailsWithInvalidKey(): void { - self::expectException(InvalidLabelKey::class); + self::expectException(InvalidDomain::class); (new Domain('example.com'))->withLabel(-4, 'www'); } @@ -884,9 +376,6 @@ public function testWithLabelFailsWithInvalidLabel2(): void * @covers ::withLabel * * @dataProvider validAppend - * @param string $raw - * @param string $append - * @param string $expected */ public function testAppend(string $raw, string $append, string $expected): void { @@ -908,9 +397,6 @@ public function validAppend(): iterable * @covers ::withLabel * * @dataProvider validPrepend - * @param string $raw - * @param string $prepend - * @param string $expected */ public function testPrepend(string $raw, string $prepend, string $expected): void { @@ -929,64 +415,38 @@ public function validPrepend(): iterable /** * @covers ::withoutLabel * @dataProvider withoutLabelWorksProvider - * @param Domain $domain - * @param int $key * @param ?string $expected - * @param bool $isKnown - * @param bool $isICANN - * @param bool $isPrivate */ - public function testwithoutLabelWorks( - Domain $domain, - int $key, - ?string $expected, - bool $isKnown, - bool $isICANN, - bool $isPrivate - ): void { + public function testwithoutLabelWorks(Domain $domain, int $key, ?string $expected): void + { $result = $domain->withoutLabel($key); self::assertSame($expected, $result->getContent()); - self::assertSame($isKnown, $result->isKnown()); - self::assertSame($isICANN, $result->isICANN()); - self::assertSame($isPrivate, $result->isPrivate()); } public function withoutLabelWorksProvider(): iterable { - $base_domain = new Domain('www.example.com', new PublicSuffix('com', Rules::ICANN_DOMAINS)); + $base_domain = new Domain('www.example.com'); return [ 'simple removal positive offset' => [ 'domain' => $base_domain, 'key' => 2, 'expected' => 'example.com', - 'isKnown' => true, - 'isICANN' => true, - 'isPrivate' => false, ], 'simple removal negative offset' => [ 'domain' => $base_domain, 'key' => -1, 'expected' => 'example.com', - 'isKnown' => true, - 'isICANN' => true, - 'isPrivate' => false, ], 'simple removal strip PSL info positive offset' => [ 'domain' => $base_domain, 'key' => 0, 'expected' => 'www.example', - 'isKnown' => false, - 'isICANN' => false, - 'isPrivate' => false, ], 'simple removal strip PSL info negative offset' => [ 'domain' => $base_domain, 'key' => -3, 'expected' => 'www.example', - 'isKnown' => false, - 'isICANN' => false, - 'isPrivate' => false, ], ]; } @@ -996,7 +456,7 @@ public function withoutLabelWorksProvider(): iterable */ public function testwithoutLabelFailsWithInvalidKey(): void { - self::expectException(InvalidLabelKey::class); + self::expectException(InvalidDomain::class); (new Domain('example.com'))->withoutLabel(-3); } @@ -1013,7 +473,7 @@ public function testwithoutLabelWorksWithMultipleKeys(): void */ public function testConstructWithCustomIDNAOptions(): void { - $domain = new Domain('example.com', null, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); + $domain = new Domain('example.com', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); self::assertSame( [IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE], [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()] @@ -1022,38 +482,27 @@ public function testConstructWithCustomIDNAOptions(): void /** * @dataProvider resolveCustomIDNAOptionsProvider - * @param string $domainName - * @param string $publicSuffix - * @param string $withLabel - * @param null|string $expectedContent - * @param null|string $expectedAscii - * @param null|string $expectedUnicode - * @param null|string $expectedRegistrable - * @param null|string $expectedSubDomain - * @param null|string $expectedWithLabel + * @param ?string $expectedContent + * @param ?string $expectedAscii + * @param ?string $expectedUnicode + * @param ?string $expectedWithLabel */ public function testResolveWorksWithCustomIDNAOptions( string $domainName, - string $publicSuffix, string $withLabel, ?string $expectedContent, ?string $expectedAscii, ?string $expectedUnicode, - ?string $expectedRegistrable, - ?string $expectedSubDomain, ?string $expectedWithLabel ): void { $domain = new Domain( $domainName, - new PublicSuffix($publicSuffix), IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE ); self::assertSame($expectedContent, $domain->getContent()); self::assertSame($expectedAscii, $domain->toAscii()->getContent()); self::assertSame($expectedUnicode, $domain->toUnicode()->getContent()); - self::assertSame($expectedRegistrable, $domain->getRegistrableDomain()); - self::assertSame($expectedSubDomain, $domain->getSubDomain()); self::assertSame($expectedWithLabel, $domain->withLabel(-1, $withLabel)->getContent()); } @@ -1062,46 +511,34 @@ public function resolveCustomIDNAOptionsProvider(): iterable return [ 'without deviation characters' => [ 'example.com', - 'com', 'größe', 'example.com', 'example.com', 'example.com', - 'example.com', - null, 'xn--gre-6ka8i.com', ], 'without deviation characters with label' => [ 'www.example.com', - 'com', 'größe', 'www.example.com', 'www.example.com', 'www.example.com', - 'example.com', - 'www', 'xn--gre-6ka8i.example.com', ], 'with deviation in domain' => [ 'www.faß.de', - 'de', 'größe', 'www.faß.de', 'www.xn--fa-hia.de', 'www.faß.de', - 'faß.de', - 'www', 'größe.faß.de', ], 'with deviation in label' => [ 'faß.test.de', - 'de', 'größe', 'faß.test.de', 'xn--fa-hia.test.de', 'faß.test.de', - 'test.de', - 'faß', 'größe.test.de', ], ]; @@ -1111,7 +548,6 @@ public function testInstanceCreationWithCustomIDNAOptions(): void { $domain = new Domain( 'example.com', - new PublicSuffix('com'), IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE ); @@ -1122,71 +558,37 @@ public function testInstanceCreationWithCustomIDNAOptions(): void [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] ); + /** @var Domain $instance */ $instance = $domain->toUnicode(); self::assertSame( [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] ); + $instance = $domain->withLabel(0, 'foo'); self::assertSame( [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] ); + $instance = $domain->withoutLabel(0); self::assertSame( [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] ); - $instance = $domain->withPublicSuffix(new PublicSuffix('us')); - self::assertSame( - [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], - [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] - ); - $instance = $domain->withSubDomain('foo'); - self::assertSame( - [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], - [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] - ); + $instance = $domain->append('bar'); self::assertSame( [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] ); + $instance = $domain->prepend('bar'); self::assertSame( [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] ); - $instance = $domain->resolve('com'); - self::assertSame( - [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], - [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] - ); - } - - /** - * @covers ::isTransitionalDifferent - * @dataProvider transitionalProvider - * @param Domain $domain - * @param bool $expected - */ - public function testIsTransitionalDifference(Domain $domain, bool $expected): void - { - self::assertSame($expected, $domain->isTransitionalDifferent()); - } - - public function transitionalProvider(): iterable - { - return [ - 'simple' => [new Domain('example.com'), false], - 'idna' => [new Domain('français.fr'), false], - 'in domain 1' => [new Domain('faß.de'), true], - 'in domain 2' => [new Domain('βόλος.com'), true], - 'in domain 3' => [new Domain('ශ්‍රී.com'), true], - 'in domain 4' => [new Domain('نامه‌ای.com'), true], - 'in domain 5' => [new Domain('faß.test.de'), true], - ]; } /** @@ -1197,7 +599,7 @@ public function transitionalProvider(): iterable */ public function testwithIDNAOptions(): void { - $domain = new Domain('example.com', new PublicSuffix('com')); + $domain = new Domain('example.com', IDNA_DEFAULT, IDNA_DEFAULT); self::assertSame($domain, $domain->withAsciiIDNAOption( $domain->getAsciiIDNAOption() diff --git a/tests/InstallerTest.php b/tests/InstallerTest.php deleted file mode 100644 index 9279f3d5..00000000 --- a/tests/InstallerTest.php +++ /dev/null @@ -1,167 +0,0 @@ -root = vfsStream::setup('pdp'); - vfsStream::create(['cache' => []], $this->root); - $this->cacheDir = vfsStream::url('pdp/cache'); - $this->cachePool = new Cache($this->cacheDir); - $this->client = new class() implements HttpClient { - public function getContent(string $url): string - { - if ($url === Manager::PSL_URL) { - /** @var string $res */ - $res = file_get_contents(__DIR__.'/data/public_suffix_list.dat'); - - return $res; - } - - if ($url === Manager::RZD_URL) { - /** @var string $res */ - $res = file_get_contents(__DIR__.'/data/tlds-alpha-by-domain.txt'); - - return $res; - } - - throw new HttpClientException(sprintf('invalid url: %s', $url)); - } - }; - } - - public function tearDown(): void - { - unset($this->cachePool, $this->cacheDir, $this->root, $this->client, $this->logger); - } - - /** - * @dataProvider contextDataProvider - * @param array $context - * @param bool $retval - * @param array $logs - */ - public function testRefreshDefault(array $context, bool $retval, array $logs): void - { - $stream = $this->setStream(); - $logger = new Logger($stream, $stream); - $manager = new Manager($this->cachePool, $this->client); - $installer = new Installer($manager, $logger); - self::assertSame($retval, $installer->refresh($context)); - rewind($stream); - /** @var string $data */ - $data = stream_get_contents($stream); - foreach ($logs as $log) { - self::assertStringContainsString($log, $data); - } - } - - public function contextDataProvider(): array - { - return [ - 'default' => [ - 'context' =>[], - 'retval' => true, - 'log' => [ - 'Public Suffix List Cache updated for 1 DAY using '.Manager::PSL_URL, - 'IANA Root Zone Database Cache updated for 1 DAY using '.Manager::RZD_URL, - ], - ], - 'refresh psl only' => [ - 'context' => [ - Installer::REFRESH_PSL_KEY => true, - ], - 'retval' => true, - 'log' => [ - 'Public Suffix List Cache updated for 1 DAY using '.Manager::PSL_URL, - ], - ], - 'refresh tld only' => [ - 'context' => [ - Installer::REFRESH_RZD_KEY => true, - ], - 'retval' => true, - 'log' => [ - 'IANA Root Zone Database Cache updated for 1 DAY using '.Manager::RZD_URL, - ], - ], - 'refresh psl fails' => [ - 'context' => [ - Installer::REFRESH_PSL_KEY => true, - Installer::REFRESH_PSL_URL_KEY => 'http://localhost/', - ], - 'retval' => false, - 'log' => [ - 'Local cache update failed with invalid url: http://localhost/', - ], - ], - ]; - } -} diff --git a/tests/ManagerTest.php b/tests/ManagerTest.php deleted file mode 100644 index c1ff40b2..00000000 --- a/tests/ManagerTest.php +++ /dev/null @@ -1,436 +0,0 @@ -root = vfsStream::setup('pdp'); - vfsStream::create(['cache' => []], $this->root); - $this->cacheDir = vfsStream::url('pdp/cache'); - $this->cachePool = new Cache($this->cacheDir); - $this->client = new class() implements HttpClient { - public function getContent(string $url): string - { - if ($url === Manager::PSL_URL) { - /** @var string $res */ - $res = file_get_contents(__DIR__.'/data/public_suffix_list.dat'); - - return $res; - } - - if ($url === Manager::RZD_URL) { - /** @var string $res */ - $res = file_get_contents(__DIR__.'/data/tlds-alpha-by-domain.txt'); - - return $res; - } - - return ''; - } - }; - } - - public function tearDown(): void - { - unset($this->cachePool, $this->cacheDir, $this->root, $this->client); - } - - /** - * @dataProvider validTtlProvider - * @covers ::__construct - * @covers ::filterTtl - * @param mixed $ttl - */ - public function testConstructor($ttl): void - { - self::assertInstanceOf(Manager::class, new Manager($this->cachePool, $this->client, $ttl)); - } - - public function validTtlProvider(): iterable - { - return [ - 'DateInterval' => [new DateInterval('PT1H')], - 'null' => [null], - 'DateTimeInterface' => [new DateTime('+1 DAY')], - 'string' => ['7 DAYS'], - 'int' => [86000], - ]; - } - - /** - * @covers ::__construct - * @covers ::filterTtl - */ - public function testConstructorThrowsException(): void - { - self::expectException(TypeError::class); - new Manager($this->cachePool, $this->client, tmpfile()); - } - - /** - * @covers ::getRules - * @covers ::getCacheKey - * @covers ::refreshRules - */ - public function testRefreshRules(): void - { - $manager = new Manager($this->cachePool, $this->client); - $previous = $manager->getRules(); - self::assertTrue($manager->refreshRules()); - self::assertEquals($previous, $manager->getRules()); - } - - /** - * @covers ::getRules - * @covers ::getCacheKey - * @covers ::refreshRules - */ - public function testRebuildRulesFromRemoveSource(): void - { - $manager = new Manager($this->cachePool, $this->client); - $previous = $manager->getRules(Manager::PSL_URL); - $this->cachePool->clear(); //delete all local cache - $list = $manager->getRules(Manager::PSL_URL); - self::assertEquals($previous, $manager->getRules(Manager::PSL_URL)); - } - - /** - * @covers ::getRules - * @covers ::getCacheKey - * @covers ::refreshRules - */ - public function testGetRulesThrowsExceptionIfNotCacheCanBeRetrieveOrRefresh(): void - { - $cachePool = new class() implements CacheInterface { - public function get($key, $default = null) - { - return null; - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; - - self::expectException(CouldNotLoadRules::class); - $manager = new Manager($cachePool, $this->client); - $manager->getRules('https://google.com'); - } - - /** - * @covers ::getRules - * @covers ::getCacheKey - * @covers ::refreshRules - */ - public function testGetRulesThrowsExceptionIfTheCacheIsCorrupted(): void - { - $cachePool = new class() implements CacheInterface { - public function get($key, $default = null) - { - return '{"foo":"bar",}'; //malformed json - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; - - self::expectException(CouldNotLoadRules::class); - $manager = new Manager($cachePool, $this->client); - $manager->getRules(); - } - - /** - * @covers ::getTLDs - * @covers ::getCacheKey - * @covers ::refreshTLDs - */ - public function testRefreshTLDs(): void - { - $manager = new Manager($this->cachePool, $this->client); - $previous = $manager->getTLDs(); - self::assertTrue($manager->refreshTLDs()); - self::assertEquals($previous, $manager->getTLDs()); - } - - /** - * @covers ::getTLDs - * @covers ::getCacheKey - * @covers ::refreshTLDs - */ - public function testRebuildTLDsFromRemoveSource(): void - { - $manager = new Manager($this->cachePool, $this->client); - $previous = $manager->getTLDs(); - $this->cachePool->clear(); //delete all local cache - self::assertEquals($previous, $manager->getTLDs()); - } - - /** - * @covers ::getTLDs - * @covers ::getCacheKey - * @covers ::refreshTLDs - */ - public function testGetTLDsThrowsExceptionIfNotCacheCanBeRetrieveOrRefresh(): void - { - $cachePool = new class() implements CacheInterface { - public function get($key, $default = null) - { - return null; - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; - - self::expectException(CouldNotLoadTLDs::class); - $manager = new Manager($cachePool, $this->client); - $manager->getTLDs(); - } - - /** - * @covers ::getTLDs - * @covers ::getCacheKey - * @covers ::refreshTLDs - */ - public function testGetTLDsThrowsExceptionIfTheCacheIsCorrupted(): void - { - $cachePool = new class() implements CacheInterface { - public function get($key, $default = null) - { - return '{"foo":"bar",}'; //malformed json - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; - - self::expectException(CouldNotLoadTLDs::class); - $manager = new Manager($cachePool, $this->client); - $manager->getTLDs(); - } - - /** - * @covers ::getTLDs - * @covers ::getCacheKey - * @covers ::refreshTLDs - */ - public function testGetTLDsThrowsExceptionIfTheCacheContentIsCorrupted(): void - { - $cachePool = new class() implements CacheInterface { - public function get($key, $default = null) - { - return '{"foo":"bar"}'; //invalid Json - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; - - self::expectException(CouldNotLoadTLDs::class); - $manager = new Manager($cachePool, $this->client); - $manager->getTLDs(); - } -} diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index e61f6e61..2ef31ba4 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -15,35 +15,31 @@ namespace Pdp\Tests; -use Pdp\Domain; -use Pdp\Exception\CouldNotResolvePublicSuffix; -use Pdp\Exception\InvalidDomain; +use InvalidArgumentException; +use Pdp\InvalidDomain; use Pdp\PublicSuffix; -use Pdp\Rules; use PHPUnit\Framework\TestCase; +use function json_encode; use const IDNA_NONTRANSITIONAL_TO_ASCII; use const IDNA_NONTRANSITIONAL_TO_UNICODE; /** - * @coversDefaultClass Pdp\PublicSuffix + * @coversDefaultClass \Pdp\PublicSuffix */ class PublicSuffixTest extends TestCase { /** * @covers ::__construct * @covers ::__set_state - * @covers ::__debugInfo * @covers ::__toString * @covers ::jsonSerialize - * @covers ::getIterator */ public function testInternalPhpMethod(): void { - $publicSuffix = new PublicSuffix('ac.be'); + $publicSuffix = PublicSuffix::fromICANNSection('ac.be'); $generatePublicSuffix = eval('return '.var_export($publicSuffix, true).';'); self::assertEquals($publicSuffix, $generatePublicSuffix); - self::assertSame(['be', 'ac'], iterator_to_array($publicSuffix)); - self::assertEquals($publicSuffix->__debugInfo(), $publicSuffix->jsonSerialize()); + self::assertEquals('"ac.be"', json_encode($publicSuffix)); self::assertSame('ac.be', (string) $publicSuffix); } @@ -56,7 +52,7 @@ public function testInternalPhpMethod(): void */ public function testPSToUnicodeWithUrlEncode(): void { - self::assertSame('bébe', (new PublicSuffix('b%C3%A9be'))->toUnicode()->getContent()); + self::assertSame('bébe', PublicSuffix::fromUnknownSection('b%C3%A9be')->toUnicode()->getContent()); } /** @@ -69,14 +65,21 @@ public function testPSToUnicodeWithUrlEncode(): void * @covers ::isPrivate * @dataProvider PSProvider * @param ?string $publicSuffix - * @param string $section - * @param bool $isKnown - * @param bool $isIcann - * @param bool $isPrivate */ public function testSetSection(?string $publicSuffix, string $section, bool $isKnown, bool $isIcann, bool $isPrivate): void { - $ps = new PublicSuffix($publicSuffix, $section); + if ('' === $section) { + $ps = PublicSuffix::fromUnknownSection($publicSuffix); + } elseif ('ICANN_DOMAINS' === $section) { + $ps = PublicSuffix::fromICANNSection($publicSuffix); + } elseif ('PRIVATE_DOMAINS' === $section) { + $ps = PublicSuffix::fromPrivateSection($publicSuffix); + } + + if (!isset($ps)) { + throw new InvalidArgumentException('Missing PublicSuffix instance.'); + } + self::assertSame($isKnown, $ps->isKnown()); self::assertSame($isIcann, $ps->isICANN()); self::assertSame($isPrivate, $ps->isPrivate()); @@ -85,9 +88,9 @@ public function testSetSection(?string $publicSuffix, string $section, bool $isK public function PSProvider(): iterable { return [ - [null, PublicSuffix::ICANN_DOMAINS, false, false, false], - ['foo', PublicSuffix::ICANN_DOMAINS, true, true, false], - ['foo', PublicSuffix::PRIVATE_DOMAINS, true, false, true], + [null, 'ICANN_DOMAINS', false, false, false], + ['foo', 'ICANN_DOMAINS', true, true, false], + ['foo', 'PRIVATE_DOMAINS', true, false, true], ]; } @@ -97,12 +100,12 @@ public function PSProvider(): iterable * @covers ::setPublicSuffix * @dataProvider invalidPublicSuffixProvider * - * @param mixed $publicSuffix */ - public function testConstructorThrowsException($publicSuffix): void + public function testConstructorThrowsException(string $publicSuffix): void { self::expectException(InvalidDomain::class); - new PublicSuffix($publicSuffix); + + PublicSuffix::fromUnknownSection($publicSuffix); } public function invalidPublicSuffixProvider(): iterable @@ -121,17 +124,8 @@ public function invalidPublicSuffixProvider(): iterable public function testPSToAsciiThrowsException(): void { self::expectException(InvalidDomain::class); - new PublicSuffix('a⒈com'); - } - /** - * @covers ::__construct - * @covers ::setSection - */ - public function testSetSectionThrowsException(): void - { - self::expectException(CouldNotResolvePublicSuffix::class); - new PublicSuffix('ac.be', 'foobar'); + PublicSuffix::fromUnknownSection('a⒈com'); } /** @@ -141,7 +135,8 @@ public function testSetSectionThrowsException(): void public function testToUnicodeThrowsException(): void { self::expectException(InvalidDomain::class); - (new PublicSuffix('xn--a-ecp.ru'))->toUnicode(); + + PublicSuffix::fromUnknownSection('xn--a-ecp.ru')->toUnicode(); } /** @@ -155,7 +150,7 @@ public function testToUnicodeThrowsException(): void */ public function testConversionReturnsTheSameInstance(?string $publicSuffix): void { - $instance = new PublicSuffix($publicSuffix); + $instance = PublicSuffix::fromUnknownSection($publicSuffix); self::assertSame($instance->toUnicode(), $instance); self::assertSame($instance->toAscii(), $instance); } @@ -174,7 +169,8 @@ public function conversionReturnsTheSameInstanceProvider(): iterable */ public function testToUnicodeReturnsSameInstance(): void { - $instance = new PublicSuffix('食狮.公司.cn'); + $instance = PublicSuffix::fromUnknownSection('食狮.公司.cn'); + self::assertSame($instance->toUnicode(), $instance); } @@ -182,14 +178,12 @@ public function testToUnicodeReturnsSameInstance(): void * @covers ::count * @dataProvider countableProvider * @param ?string $domain - * @param int $nbLabels - * @param array $labels */ public function testCountable(?string $domain, int $nbLabels, array $labels): void { - $domain = new PublicSuffix($domain); + $domain = PublicSuffix::fromUnknownSection($domain); + self::assertCount($nbLabels, $domain); - self::assertSame($labels, iterator_to_array($domain)); } public function countableProvider(): iterable @@ -201,93 +195,10 @@ public function countableProvider(): iterable ]; } - /** - * @covers ::getLabel - */ - public function testGetLabel(): void - { - $domain = new PublicSuffix('master.example.com'); - self::assertSame('com', $domain->getLabel(0)); - self::assertSame('example', $domain->getLabel(1)); - self::assertSame('master', $domain->getLabel(-1)); - self::assertNull($domain->getLabel(23)); - self::assertNull($domain->getLabel(-23)); - } - - /** - * @covers ::keys - */ - public function testOffsets(): void - { - $domain = new PublicSuffix('master.example.com'); - self::assertSame([2], $domain->keys('master')); - } - - /** - * @covers ::labels - */ - public function testLabels(): void - { - $publicSuffix = new PublicSuffix('master.example.com'); - self::assertSame([ - 'com', - 'example', - 'master', - ], $publicSuffix->labels()); - - $publicSuffix = new PublicSuffix(); - self::assertSame([], $publicSuffix->labels()); - } - - /** - * @covers ::createFromDomain - * @dataProvider createFromDomainProvider - * @param Domain $domain - * @param ?string $expected - */ - public function testCreateFromDomainWorks(Domain $domain, ?string $expected): void - { - $result = PublicSuffix::createFromDomain($domain); - self::assertSame($expected, $result->getContent()); - self::assertSame($result->isKnown(), $domain->isKnown()); - self::assertSame($result->isICANN(), $domain->isICANN()); - self::assertSame($result->isPrivate(), $domain->isPrivate()); - self::assertSame( - [$result->getAsciiIDNAOption(), $result->getUnicodeIDNAOption()], - [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()] - ); - } - - public function createFromDomainProvider(): iterable - { - return [ - [ - 'domain' => new Domain('www.bébé.be', new PublicSuffix('be', Rules::ICANN_DOMAINS)), - 'expected' => 'be', - ], - [ - 'domain' => new Domain('www.bébé.be', new PublicSuffix('bébé.be', Rules::PRIVATE_DOMAINS)), - 'expected' => 'bébé.be', - ], - [ - 'domain' => new Domain('www.bébé.be'), - 'expected' => null, - ], - [ - 'domain' => new Domain('www.bébé.be', new PublicSuffix('be', Rules::ICANN_DOMAINS), IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE), - 'expected' => 'be', - ], - ]; - } - /** * @covers ::isTransitionalDifferent * * @dataProvider customIDNAProvider - * @param string $name - * @param string $expectedContent - * @param string $expectedAscii - * @param string $expectedUnicode */ public function testResolveWithCustomIDNAOptions( string $name, @@ -295,7 +206,7 @@ public function testResolveWithCustomIDNAOptions( string $expectedAscii, string $expectedUnicode ): void { - $publicSuffix = new PublicSuffix($name, '', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); + $publicSuffix = PublicSuffix::fromUnknownSection($name, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); self::assertSame($expectedContent, $publicSuffix->getContent()); self::assertSame($expectedAscii, $publicSuffix->toAscii()->getContent()); self::assertSame($expectedUnicode, $publicSuffix->toUnicode()->getContent()); @@ -341,8 +252,6 @@ public function customIDNAProvider(): iterable * @covers ::isTransitionalDifferent * * @dataProvider transitionalProvider - * @param PublicSuffix $publicSuffix - * @param bool $expected */ public function testIsTransitionalDifference(PublicSuffix $publicSuffix, bool $expected): void { @@ -352,13 +261,13 @@ public function testIsTransitionalDifference(PublicSuffix $publicSuffix, bool $e public function transitionalProvider(): iterable { return [ - 'simple' => [new PublicSuffix('example.com'), false], - 'idna' => [new PublicSuffix('français.fr'), false], - 'in domain' => [new PublicSuffix('faß.de'), true], - 'in domain 2' => [new PublicSuffix('βόλος.com'), true], - 'in domain 3' => [new PublicSuffix('ශ්‍රී.com'), true], - 'in domain 4' => [new PublicSuffix('نامه‌ای.com'), true], - 'in label' => [new PublicSuffix('faß.test.de'), true], + 'simple' => [PublicSuffix::fromUnknownSection('example.com'), false], + 'idna' => [PublicSuffix::fromUnknownSection('français.fr'), false], + 'in domain' => [PublicSuffix::fromUnknownSection('faß.de'), true], + 'in domain 2' => [PublicSuffix::fromUnknownSection('βόλος.com'), true], + 'in domain 3' => [PublicSuffix::fromUnknownSection('ශ්‍රී.com'), true], + 'in domain 4' => [PublicSuffix::fromUnknownSection('نامه‌ای.com'), true], + 'in label' => [PublicSuffix::fromUnknownSection('faß.test.de'), true], ]; } @@ -370,7 +279,7 @@ public function transitionalProvider(): iterable */ public function testwithIDNAOptions(): void { - $publicSuffix = new PublicSuffix('com'); + $publicSuffix = PublicSuffix::fromUnknownSection('com'); self::assertSame($publicSuffix, $publicSuffix->withAsciiIDNAOption( $publicSuffix->getAsciiIDNAOption() diff --git a/tests/ResolvableDomainTest.php b/tests/ResolvableDomainTest.php new file mode 100644 index 00000000..5ce135f4 --- /dev/null +++ b/tests/ResolvableDomainTest.php @@ -0,0 +1,742 @@ +getPublicSuffix()->getContent()); + self::assertNull($domain->getRegistrableDomain()->getContent()); + self::assertNull($domain->getSubDomain()->getContent()); + } + + /** + * @covers ::__construct + * @covers ::setPublicSuffix + * @covers ::normalize + * @dataProvider provideWrongConstructor + * + * @param ?string $domain + */ + public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain(?string $domain, string $publicSuffix): void + { + self::expectException(UnableToResolveDomain::class); + + new ResolvableDomain(new Domain($domain), PublicSuffix::fromICANNSection($publicSuffix)); + } + + public function provideWrongConstructor(): iterable + { + return [ + 'public suffix mismatch' => [ + 'domain' => 'www.ulb.ac.be', + 'publicSuffix' => 'com', + ], + 'domain and public suffix are the same' => [ + 'domain' => 'co.uk', + 'publicSuffix' => 'co.uk', + ], + 'domain has no labels' => [ + 'domain' => 'localhost', + 'publicSuffix' => 'localhost', + ], + 'domain is null' => [ + 'domain' => null, + 'publicSuffix' => 'com', + ], + ]; + } + + /** + * @covers ::__construct + * @covers ::__set_state + * @covers ::__toString + * @covers ::jsonSerialize + */ + public function testDomainInternalPhpMethod(): void + { + $domain = new ResolvableDomain(new Domain('www.ulb.ac.be'), PublicSuffix::fromICANNSection('ac.be')); + $generateDomain = eval('return '.var_export($domain, true).';'); + self::assertEquals($domain, $generateDomain); + self::assertEquals('"www.ulb.ac.be"', json_encode($domain->jsonSerialize())); + self::assertSame('www.ulb.ac.be', (string) $domain); + } + + /** + * @covers ::normalize + * @covers ::count + * @dataProvider countableProvider + * @param ?string $domain + */ + public function testCountable(?string $domain, int $nbLabels): void + { + $domain = new Domain($domain); + self::assertCount($nbLabels, $domain); + } + + public function countableProvider(): iterable + { + return [ + 'null' => [null, 0], + 'empty string' => ['', 1], + 'simple' => ['foo.bar.baz', 3], + 'unicode' => ['www.食狮.公司.cn', 4], + ]; + } + + /** + * @covers ::setPublicSuffix + * @covers ::normalize + * @covers ::setRegistrableDomain + * @covers ::setSubDomain + * @covers ::getContent + * @covers ::getPublicSuffix + * @covers ::toUnicode + * @covers \Pdp\PublicSuffix::toUnicode + * @dataProvider toUnicodeProvider + * @param ?string $domain + * @param ?string $publicSuffix + * @param ?string $expectedDomain + * @param ?string $expectedSuffix + * @param ?string $expectedIDNDomain + * @param ?string $expectedIDNSuffix + */ + public function testToIDN( + ?string $domain, + ?string $publicSuffix, + ?string $expectedDomain, + ?string $expectedSuffix, + ?string $expectedIDNDomain, + ?string $expectedIDNSuffix + ): void { + $objPublicSuffix = (null === $publicSuffix) ? PublicSuffix::fromNull() : PublicSuffix::fromICANNSection($publicSuffix); + + $domain = new ResolvableDomain(new Domain($domain), $objPublicSuffix); + self::assertSame($expectedDomain, $domain->getContent()); + self::assertSame($expectedSuffix, $domain->getPublicSuffix()->getContent()); + + /** @var ResolvableDomain $domainIDN */ + $domainIDN = $domain->toUnicode(); + self::assertSame($expectedIDNDomain, $domainIDN->getContent()); + self::assertSame($expectedIDNSuffix, $domainIDN->getPublicSuffix()->getContent()); + } + + public function toUnicodeProvider(): iterable + { + return [ + 'simple domain' => [ + 'domain' => 'www.ulb.ac.be', + 'publicSuffix' => 'ac.be', + 'expectedDomain' => 'www.ulb.ac.be', + 'expectedSuffix' => 'ac.be', + 'expectedIDNDomain' => 'www.ulb.ac.be', + 'expectedIDNSuffix' => 'ac.be', + ], + 'ASCII to IDN domain' => [ + 'domain' => 'www.xn--85x722f.xn--55qx5d.cn', + 'publicSuffix' => 'xn--85x722f.xn--55qx5d.cn', + 'expectedDomain' => 'www.xn--85x722f.xn--55qx5d.cn', + 'expectedSuffix' => 'xn--85x722f.xn--55qx5d.cn', + 'expectedIDNDomain' => 'www.食狮.公司.cn', + 'expectedIDNSuffix' => '食狮.公司.cn', + ], + 'IDN to IDN domain' => [ + 'domain' => 'www.食狮.公司.cn', + 'publicSuffix' => '食狮.公司.cn', + 'expectedDomain' => 'www.食狮.公司.cn', + 'expectedSuffix' => '食狮.公司.cn', + 'expectedIDNDomain' => 'www.食狮.公司.cn', + 'expectedIDNSuffix' => '食狮.公司.cn', + ], + 'empty string domain and null suffix' => [ + 'domain' => '', + 'publicSuffix' => null, + 'expectedDomain' => '', + 'expectedSuffix' => null, + 'expectedIDNDomain' => '', + 'expectedIDNSuffix' => null, + ], + 'null domain and suffix' => [ + 'domain' => null, + 'publicSuffix' => null, + 'expectedDomain' => null, + 'expectedSuffix' => null, + 'expectedIDNDomain' => null, + 'expectedIDNSuffix' => null, + ], + 'domain with null suffix' => [ + 'domain' => 'www.xn--85x722f.xn--55qx5d.cn', + 'publicSuffix' => null, + 'expectedDomain' => 'www.xn--85x722f.xn--55qx5d.cn', + 'expectedSuffix' => null, + 'expectedIDNDomain' => 'www.食狮.公司.cn', + 'expectedIDNSuffix' => null, + ], + 'domain with URLencoded data' => [ + 'domain' => 'b%C3%A9b%C3%A9.be', + 'publicSuffix' => 'be', + 'expectedDomain' => 'bébé.be', + 'expectedSuffix' => 'be', + 'expectedIDNDomain' => 'bébé.be', + 'expectedIDNSuffix' => 'be', + ], + ]; + } + + /** + * @covers ::setPublicSuffix + * @covers ::normalize + * @covers ::setRegistrableDomain + * @covers ::setSubDomain + * @covers ::getContent + * @covers ::getPublicSuffix + * @covers ::toAscii + * @covers \Pdp\PublicSuffix::toAscii + * + * @dataProvider toAsciiProvider + * @param ?string $domain + * @param ?string $publicSuffix + * @param ?string $expectedDomain + * @param ?string $expectedSuffix + * @param ?string $expectedAsciiDomain + * @param ?string $expectedAsciiSuffix + */ + public function testToAscii( + ?string $domain, + ?string $publicSuffix, + ?string $expectedDomain, + ?string $expectedSuffix, + ?string $expectedAsciiDomain, + ?string $expectedAsciiSuffix + ): void { + $objPublicSuffix = (null === $publicSuffix) ? PublicSuffix::fromNull() : PublicSuffix::fromICANNSection($publicSuffix); + + $domain = new ResolvableDomain(new Domain($domain), $objPublicSuffix); + self::assertSame($expectedDomain, $domain->getContent()); + self::assertSame($expectedSuffix, $domain->getPublicSuffix()->getContent()); + + /** @var ResolvableDomain $domainIDN */ + $domainIDN = $domain->toAscii(); + self::assertSame($expectedAsciiDomain, $domainIDN->getContent()); + self::assertSame($expectedAsciiSuffix, $domainIDN->getPublicSuffix()->getContent()); + } + + public function toAsciiProvider(): iterable + { + return [ + 'simple domain' => [ + 'domain' => 'www.ulb.ac.be', + 'publicSuffix' => 'ac.be', + 'expectedDomain' => 'www.ulb.ac.be', + 'expectedSuffix' => 'ac.be', + 'expectedIDNDomain' => 'www.ulb.ac.be', + 'expectedIDNSuffix' => 'ac.be', + ], + 'ASCII to ASCII domain' => [ + 'domain' => 'www.xn--85x722f.xn--55qx5d.cn', + 'publicSuffix' => 'xn--85x722f.xn--55qx5d.cn', + 'expectedDomain' => 'www.xn--85x722f.xn--55qx5d.cn', + 'expectedSuffix' => 'xn--85x722f.xn--55qx5d.cn', + 'expectedIDNDomain' => 'www.xn--85x722f.xn--55qx5d.cn', + 'expectedIDNSuffix' => 'xn--85x722f.xn--55qx5d.cn', + ], + 'ASCII to IDN domain' => [ + 'domain' => 'www.食狮.公司.cn', + 'publicSuffix' => '食狮.公司.cn', + 'expectedDomain' => 'www.食狮.公司.cn', + 'expectedSuffix' => '食狮.公司.cn', + 'expectedIDNDomain' => 'www.xn--85x722f.xn--55qx5d.cn', + 'expectedIDNSuffix' => 'xn--85x722f.xn--55qx5d.cn', + ], + 'null domain and suffix' => [ + 'domain' => null, + 'publicSuffix' => null, + 'expectedDomain' => null, + 'expectedSuffix' => null, + 'expectedIDNDomain' => null, + 'expectedIDNSuffix' => null, + ], + 'domain with null suffix' => [ + 'domain' => 'www.食狮.公司.cn', + 'publicSuffix' => null, + 'expectedDomain' => 'www.食狮.公司.cn', + 'expectedSuffix' => null, + 'expectedIDNDomain' => 'www.xn--85x722f.xn--55qx5d.cn', + 'expectedIDNSuffix' => null, + ], + ]; + } + + /** + * @covers ::resolve + * @covers ::normalize + * @dataProvider resolvePassProvider + * + * @param mixed $publicSuffix the public suffix to resolve + * @param ?string $expected + */ + public function testResolveWorks(ResolvableDomain $domain, $publicSuffix, ?string $expected): void + { + self::assertSame($expected, $domain->resolve($publicSuffix)->getPublicSuffix()->getContent()); + } + + public function resolvePassProvider(): iterable + { + $publicSuffix = PublicSuffix::fromICANNSection('ac.be'); + $domain = new ResolvableDomain(new Domain('ulb.ac.be'), $publicSuffix); + + return [ + 'null public suffix' => [ + 'domain' => $domain, + 'public suffix' => PublicSuffix::fromNull(), + 'expected' => null, + ], + 'null public suffix (with null value)' => [ + 'domain' => $domain, + 'public suffix' => null, + 'expected' => null, + ], + 'same public suffix' => [ + 'domain' => $domain, + 'public suffix' => $publicSuffix, + 'expected' => 'ac.be', + ], + 'same public suffix (with string value)' => [ + 'domain' => $domain, + 'public suffix' => 'ac.be', + 'expected' => 'ac.be', + ], + 'update public suffix' => [ + 'domain' => $domain, + 'public suffix' => PublicSuffix::fromICANNSection('be'), + 'expected' => 'be', + ], + 'idn domain name' => [ + 'domain' => new ResolvableDomain(new Domain('Яндекс.РФ'), PublicSuffix::fromICANNSection('рф')), + 'public suffix' => PublicSuffix::fromICANNSection('рф'), + 'expected' => 'рф', + ], + 'idn domain name with ascii public suffix' => [ + 'domain' => new ResolvableDomain(new Domain('Яндекс.РФ'), PublicSuffix::fromICANNSection('рф')), + 'public suffix' => PublicSuffix::fromICANNSection('xn--p1ai'), + 'expected' => 'рф', + ], + ]; + } + + /** + * @covers ::resolve + * @dataProvider resolveFailsProvider + */ + public function testResolveFails(ResolvableDomain $domain, PublicSuffix $publicSuffix): void + { + self::expectException(UnableToResolveDomain::class); + $domain->resolve($publicSuffix); + } + + public function resolveFailsProvider(): iterable + { + $publicSuffix = PublicSuffix::fromICANNSection('ac.be'); + $domain = new ResolvableDomain(new Domain('ulb.ac.be'), $publicSuffix); + + return [ + 'public suffix mismatch' => [ + 'domain' => $domain, + 'public suffix' => PublicSuffix::fromICANNSection('ac.fr'), + ], + 'domain name can not contains public suffix' => [ + 'domain' => new ResolvableDomain(new Domain('localhost')), + 'public suffix' => $publicSuffix, + ], + 'domain name is equal to public suffix' => [ + 'domain' => new ResolvableDomain(new Domain('ac.be')), + 'public suffix' => $publicSuffix, + ], + 'partial public suffix' => [ + 'domain' => new ResolvableDomain($domain), + 'public suffix' => PublicSuffix::fromICANNSection('c.be'), + ], + 'mismatch idn public suffix' => [ + 'domain' => new ResolvableDomain(new Domain('www.食狮.公司.cn')), + 'public suffix' => PublicSuffix::fromICANNSection('cn.公司'), + ], + ]; + } + + /** + * @covers ::resolve + */ + public function testResolveReturnsInstance(): void + { + $publicSuffix = PublicSuffix::fromICANNSection('ac.be'); + $domain = new ResolvableDomain(new Domain('ulb.ac.be'), $publicSuffix); + self::assertEquals($domain, $domain->resolve($publicSuffix)); + self::assertNotSame($domain, $domain->resolve(PublicSuffix::fromPrivateSection('ac.be'))); + } + + /** + * @covers ::withSubDomain + * @dataProvider withSubDomainWorksProvider + * + * @param mixed $subdomain the subdomain to add + * @param ?string $expected + */ + public function testWithSubDomainWorks(ResolvableDomain $domain, $subdomain, ?string $expected): void + { + $result = $domain->withSubDomain($subdomain); + + self::assertSame($expected, $result->getSubDomain()->getContent()); + self::assertEquals($domain->getPublicSuffix(), $result->getPublicSuffix()); + self::assertEquals($domain->getRegistrableDomain(), $result->getRegistrableDomain()); + } + + public function withSubDomainWorksProvider(): iterable + { + return [ + 'simple addition' => [ + 'domain' => new ResolvableDomain(new Domain('example.com'), PublicSuffix::fromICANNSection('com')), + 'subdomain' => 'www', + 'expected' => 'www', + ], + 'simple addition IDN (1)' => [ + 'domain' => new ResolvableDomain(new Domain('example.com'), PublicSuffix::fromICANNSection('com')), + 'subdomain' => new Domain('bébé'), + 'expected' => 'xn--bb-bjab', + ], + 'simple addition IDN (2)' => [ + 'domain' => new ResolvableDomain(new Domain('Яндекс.РФ'), PublicSuffix::fromICANNSection('рф')), + 'subdomain' => 'bébé', + 'expected' => 'bébé', + ], + 'simple removal' => [ + 'domain' => new ResolvableDomain(new Domain('example.com'), PublicSuffix::fromICANNSection('com')), + 'subdomain' => null, + 'expected' => null, + ], + 'simple removal IDN' => [ + 'domain' => new ResolvableDomain(new Domain('bébé.Яндекс.РФ'), PublicSuffix::fromICANNSection('рф')), + 'subdomain' => 'xn--bb-bjab', + 'expected' => 'bébé', + ], + ]; + } + + /** + * @covers ::withSubDomain + */ + public function testWithSubDomainFailsWithNullDomain(): void + { + self::expectException(UnableToResolveDomain::class); + + (new ResolvableDomain(new Domain(null)))->withSubDomain('www'); + } + + /** + * @covers ::withSubDomain + */ + public function testWithSubDomainFailsWithOneLabelDomain(): void + { + self::expectException(UnableToResolveDomain::class); + + (new ResolvableDomain(new Domain('localhost')))->withSubDomain('www'); + } + + /** + * @covers ::withSubDomain + */ + public function testWithEmptySubdomain(): void + { + self::expectException(InvalidDomain::class); + + $domain = new ResolvableDomain(new Domain('www.example.com'), PublicSuffix::fromICANNSection('com')); + $domain->withSubDomain(''); + } + + /** + * @covers ::withSubDomain + */ + public function testWithSubDomainFailsWithNonStringableObject(): void + { + self::expectException(TypeError::class); + $domain = new ResolvableDomain(new Domain('www.example.com'), PublicSuffix::fromICANNSection('com')); + + $domain->withSubDomain(date_create()); + } + + /** + * @covers ::withSubDomain + */ + public function testWithSubDomainWithoutPublicSuffixInfo(): void + { + self::expectException(UnableToResolveDomain::class); + + (new ResolvableDomain(new Domain('www.example.com')))->withSubDomain('www'); + } + + /** + * @covers ::withPublicSuffix + * @dataProvider withPublicSuffixWorksProvider + * + * @param mixed $publicSuffix the public suffix + * @param ?string $expected + */ + public function testWithPublicSuffixWorks( + ResolvableDomain $domain, + $publicSuffix, + ?string $expected, + bool $isKnown, + bool $isICANN, + bool $isPrivate + ): void { + $result = $domain->withPublicSuffix($publicSuffix); + + self::assertSame($expected, $result->getPublicSuffix()->getContent()); + } + + public function withPublicSuffixWorksProvider(): iterable + { + $base_domain = new ResolvableDomain(new Domain('example.com'), PublicSuffix::fromICANNSection('com')); + + return [ + 'simple update (1)' => [ + 'domain' => $base_domain, + 'publicSuffix' => 'be', + 'expected' => 'be', + 'isKnown' => false, + 'isICANN' => false, + 'isPrivate' => false, + ], + 'simple update (2)' => [ + 'domain' => $base_domain, + 'publicSuffix' => PublicSuffix::fromPrivateSection('github.io'), + 'expected' => 'github.io', + 'isKnown' => true, + 'isICANN' => false, + 'isPrivate' => true, + ], + 'same public suffix but PSL info is changed' => [ + 'domain' => $base_domain, + 'publicSuffix' => PublicSuffix::fromPrivateSection('com'), + 'expected' => 'com', + 'isKnown' => true, + 'isICANN' => false, + 'isPrivate' => true, + ], + 'same public suffix but PSL info does not changed' => [ + 'domain' => $base_domain, + 'publicSuffix' => PublicSuffix::fromICANNSection('com'), + 'expected' => 'com', + 'isKnown' => true, + 'isICANN' => true, + 'isPrivate' => false, + ], + 'simple update IDN (1)' => [ + 'domain' => $base_domain, + 'publicSuffix' => PublicSuffix::fromICANNSection('рф'), + 'expected' => 'xn--p1ai', + 'isKnown' => true, + 'isICANN' => true, + 'isPrivate' => false, + ], + 'simple update IDN (2)' => [ + 'domain' => new ResolvableDomain(new Domain('www.bébé.be'), PublicSuffix::fromICANNSection('be')), + 'publicSuffix' => PublicSuffix::fromICANNSection('xn--p1ai'), + 'expected' => 'рф', + 'isKnown' => true, + 'isICANN' => true, + 'isPrivate' => false, + ], + 'adding the public suffix to a single label domain' => [ + 'domain' => new ResolvableDomain(new Domain('localhost')), + 'publicSuffix' => 'www', + 'expected' => 'www', + 'isKnown' => false, + 'isICANN' => false, + 'isPrivate' => false, + ], + 'removing the public suffix list' => [ + 'domain' => new ResolvableDomain(new Domain('www.bébé.be'), PublicSuffix::fromICANNSection('be')), + 'publicSuffix' => null, + 'expected' => null, + 'isKnown' => false, + 'isICANN' => false, + 'isPrivate' => false, + ], + 'with custom IDNA domain options' =>[ + 'domain' => new ResolvableDomain(new Domain('www.bébé.be', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE), PublicSuffix::fromICANNSection('be')), + 'publicSuffix' => null, + 'expected' => null, + 'isKnown' => false, + 'isICANN' => false, + 'isPrivate' => false, + ], + ]; + } + + /** + * @covers ::withPublicSuffix + */ + public function testWithPublicSuffixFailsWithNullDomain(): void + { + self::expectException(InvalidDomain::class); + + (new ResolvableDomain(new Domain()))->withPublicSuffix('www'); + } + + /** + * @dataProvider resolveCustomIDNAOptionsProvider + * @param ?string $expectedContent + * @param ?string $expectedAscii + * @param ?string $expectedUnicode + * @param ?string $expectedRegistrable + * @param ?string $expectedSubDomain + * @param ?string $expectedWithLabel + */ + public function testResolveWorksWithCustomIDNAOptions( + string $domainName, + string $publicSuffix, + string $withLabel, + ?string $expectedContent, + ?string $expectedAscii, + ?string $expectedUnicode, + ?string $expectedRegistrable, + ?string $expectedSubDomain, + ?string $expectedWithLabel + ): void { + $domainHost = new Domain($domainName, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); + $domain = new ResolvableDomain($domainHost, PublicSuffix::fromICANNSection($publicSuffix)); + + self::assertSame($expectedContent, $domain->getContent()); + self::assertSame($expectedAscii, $domain->toAscii()->getContent()); + self::assertSame($expectedUnicode, $domain->toUnicode()->getContent()); + self::assertSame($expectedRegistrable, $domain->getRegistrableDomain()->getContent()); + self::assertSame($expectedSubDomain, $domain->getSubDomain()->getContent()); + } + + public function resolveCustomIDNAOptionsProvider(): iterable + { + return [ + 'without deviation characters' => [ + 'example.com', + 'com', + 'größe', + 'example.com', + 'example.com', + 'example.com', + 'example.com', + null, + 'xn--gre-6ka8i.com', + ], + 'without deviation characters with label' => [ + 'www.example.com', + 'com', + 'größe', + 'www.example.com', + 'www.example.com', + 'www.example.com', + 'example.com', + 'www', + 'xn--gre-6ka8i.example.com', + ], + 'with deviation in domain' => [ + 'www.faß.de', + 'de', + 'größe', + 'www.faß.de', + 'www.xn--fa-hia.de', + 'www.faß.de', + 'faß.de', + 'www', + 'größe.faß.de', + ], + 'with deviation in label' => [ + 'faß.test.de', + 'de', + 'größe', + 'faß.test.de', + 'xn--fa-hia.test.de', + 'faß.test.de', + 'test.de', + 'faß', + 'größe.test.de', + ], + ]; + } + + public function testInstanceCreationWithCustomIDNAOptions(): void + { + $domain = new ResolvableDomain( + new Domain('example.com', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE), + PublicSuffix::fromICANNSection('com') + ); + + /** @var ResolvableDomain $instance */ + $instance = $domain->toAscii(); + self::assertSame( + [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], + [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] + ); + + /** @var ResolvableDomain $instance */ + $instance = $domain->toUnicode(); + self::assertSame( + [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], + [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] + ); + + $instance = $domain->withPublicSuffix(PublicSuffix::fromICANNSection('us')); + self::assertSame( + [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], + [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] + ); + $instance = $domain->withSubDomain(new Domain('foo')); + self::assertSame( + [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], + [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] + ); + + $instance = $domain->resolve(PublicSuffix::fromICANNSection('com')); + self::assertSame( + [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], + [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] + ); + } +} diff --git a/tests/RulesTest.php b/tests/RulesTest.php index b05b3733..6de127ca 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -15,15 +15,18 @@ namespace Pdp\Tests; -use Pdp\Cache; -use Pdp\CurlHttpClient; use Pdp\Domain; -use Pdp\Exception\CouldNotLoadRules; -use Pdp\Exception\CouldNotResolvePublicSuffix; -use Pdp\Exception\InvalidDomain; -use Pdp\Manager; +use Pdp\InvalidDomain; use Pdp\PublicSuffix; +use Pdp\ResolvableDomain; use Pdp\Rules; +use Pdp\Storage\Cache\Psr16FileCache; +use Pdp\Storage\Cache\RulesCachePsr16Adapter; +use Pdp\Storage\Cache\TopLevelDomainsCachePsr16Adapter; +use Pdp\Storage\Http\CurlClient; +use Pdp\Storage\Manager; +use Pdp\UnableToLoadRules; +use Pdp\UnableToResolveDomain; use PHPUnit\Framework\TestCase; use TypeError; use function file_get_contents; @@ -32,7 +35,7 @@ use const IDNA_NONTRANSITIONAL_TO_UNICODE; /** - * @coversDefaultClass Pdp\Rules + * @coversDefaultClass \Pdp\Rules */ class RulesTest extends TestCase { @@ -43,7 +46,14 @@ class RulesTest extends TestCase public function setUp(): void { - $this->rules = (new Manager(new Cache(), new CurlHttpClient()))->getRules(); + $psr16Cache = new Psr16FileCache(__DIR__.'/data'); + $manager = new Manager( + new CurlClient(), + new RulesCachePsr16Adapter($psr16Cache), + new TopLevelDomainsCachePsr16Adapter($psr16Cache) + ); + + $this->rules = $manager->getRulesLocalCopy(); } /** @@ -73,7 +83,7 @@ public function testCreateFromPath(): void */ public function testCreateFromPathThrowsException(): void { - self::expectException(CouldNotLoadRules::class); + self::expectException(UnableToLoadRules::class); Rules::createFromPath('/foo/bar.dat'); } @@ -121,20 +131,18 @@ public function testwithIDNAOptions(): void * @covers ::validateSection * @covers \Pdp\Domain::isResolvable * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\PublicSuffix::isKnown - * @covers \Pdp\Domain::isKnown - * @covers \Pdp\IDNAConverterTrait::parse + * @covers \Pdp\HostParser::parse */ public function testNullWillReturnNullDomain(): void { $domain = $this->rules->resolve('COM'); - self::assertFalse($domain->isKnown()); + self::assertFalse($domain->getPublicSuffix()->isKnown()); } /** * @covers ::resolve - * @covers \Pdp\IDNAConverterTrait::parse + * @covers \Pdp\HostParser::parse */ public function testThrowsTypeErrorOnWrongInput(): void { @@ -148,7 +156,7 @@ public function testThrowsTypeErrorOnWrongInput(): void */ public function testResolveThrowsExceptionOnWrongDomainType(): void { - self::expectException(CouldNotResolvePublicSuffix::class); + self::expectException(UnableToResolveDomain::class); $this->rules->resolve('www.example.com', 'foobar'); } @@ -160,13 +168,12 @@ public function testResolveThrowsExceptionOnWrongDomainType(): void * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown - * @covers \Pdp\Domain::isKnown - * @covers \Pdp\IDNAConverterTrait::parse + * @covers \Pdp\HostParser::parse */ public function testIsSuffixValidFalse(): void { $domain = $this->rules->resolve('www.example.faketld'); - self::assertFalse($domain->isKnown()); + self::assertFalse($domain->getPublicSuffix()->isKnown()); } /** @@ -179,18 +186,14 @@ public function testIsSuffixValidFalse(): void * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\PublicSuffix::isICANN * @covers \Pdp\PublicSuffix::isPrivate - * @covers \Pdp\Domain::withPublicSuffix - * @covers \Pdp\Domain::isKnown - * @covers \Pdp\Domain::isICANN - * @covers \Pdp\Domain::isPrivate - * @covers \Pdp\IDNAConverterTrait::parse + * @covers \Pdp\HostParser::parse */ public function testIsSuffixValidTrue(): void { $domain = $this->rules->resolve('www.example.com', Rules::ICANN_DOMAINS); - self::assertTrue($domain->isKnown()); - self::assertTrue($domain->isICANN()); - self::assertFalse($domain->isPrivate()); + self::assertTrue($domain->getPublicSuffix()->isKnown()); + self::assertTrue($domain->getPublicSuffix()->isICANN()); + self::assertFalse($domain->getPublicSuffix()->isPrivate()); } /** @@ -205,18 +208,14 @@ public function testIsSuffixValidTrue(): void * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\PublicSuffix::isICANN * @covers \Pdp\PublicSuffix::isPrivate - * @covers \Pdp\Domain::withPublicSuffix - * @covers \Pdp\Domain::isKnown - * @covers \Pdp\Domain::isICANN - * @covers \Pdp\Domain::isPrivate - * @covers \Pdp\IDNAConverterTrait::parse + * @covers \Pdp\HostParser::parse */ public function testIsSuffixValidFalseWithPunycoded(): void { $domain = $this->rules->resolve('www.example.xn--85x722f'); - self::assertFalse($domain->isKnown()); - self::assertFalse($domain->isICANN()); - self::assertFalse($domain->isPrivate()); + self::assertFalse($domain->getPublicSuffix()->isKnown()); + self::assertFalse($domain->getPublicSuffix()->isICANN()); + self::assertFalse($domain->getPublicSuffix()->isPrivate()); } /** @@ -231,18 +230,14 @@ public function testIsSuffixValidFalseWithPunycoded(): void * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\PublicSuffix::isICANN * @covers \Pdp\PublicSuffix::isPrivate - * @covers \Pdp\Domain::withPublicSuffix - * @covers \Pdp\Domain::isKnown - * @covers \Pdp\Domain::isICANN - * @covers \Pdp\Domain::isPrivate - * @covers \Pdp\IDNAConverterTrait::parse + * @covers \Pdp\HostParser::parse */ public function testSubDomainIsNull(): void { $domain = $this->rules->resolve('ulb.ac.be', Rules::ICANN_DOMAINS); - self::assertTrue($domain->isKnown()); - self::assertTrue($domain->isICANN()); - self::assertFalse($domain->isPrivate()); + self::assertTrue($domain->getPublicSuffix()->isKnown()); + self::assertTrue($domain->getPublicSuffix()->isICANN()); + self::assertFalse($domain->getPublicSuffix()->isPrivate()); } /** @@ -250,7 +245,7 @@ public function testSubDomainIsNull(): void * @covers ::resolveCookieDomain * @covers ::validateDomain * @covers ::validateSection - * @covers \Pdp\IDNAConverterTrait::parse + * @covers \Pdp\HostParser::parse */ public function testWithExceptionName(): void { @@ -264,15 +259,15 @@ public function testWithExceptionName(): void * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\IDNAConverterTrait::parse + * @covers \Pdp\HostParser::parse */ public function testWithPrivateDomain(): void { $domain = $this->rules->resolve('thephpleague.github.io'); - self::assertTrue($domain->isKnown()); - self::assertFalse($domain->isICANN()); - self::assertTrue($domain->isPrivate()); - self::assertSame('github.io', $domain->getPublicSuffix()); + self::assertTrue($domain->getPublicSuffix()->isKnown()); + self::assertFalse($domain->getPublicSuffix()->isICANN()); + self::assertTrue($domain->getPublicSuffix()->isPrivate()); + self::assertSame('github.io', $domain->getPublicSuffix()->getContent()); } /** @@ -283,10 +278,10 @@ public function testWithAbsoluteHostInvalid(): void { $domain = $this->rules->resolve('private.ulb.ac.be.'); self::assertSame('private.ulb.ac.be.', $domain->getContent()); - self::assertFalse($domain->isKnown()); - self::assertFalse($domain->isICANN()); - self::assertFalse($domain->isPrivate()); - self::assertNull($domain->getPublicSuffix()); + self::assertFalse($domain->getPublicSuffix()->isKnown()); + self::assertFalse($domain->getPublicSuffix()->isICANN()); + self::assertFalse($domain->getPublicSuffix()->isPrivate()); + self::assertNull($domain->getPublicSuffix()->getContent()); } /** @@ -297,16 +292,16 @@ public function testWithAbsoluteHostInvalid(): void * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\IDNAConverterTrait::parse + * @covers \Pdp\HostParser::parse */ public function testWithPrivateDomainInvalid(): void { $domain = $this->rules->resolve('private.ulb.ac.be', Rules::PRIVATE_DOMAINS); self::assertSame('private.ulb.ac.be', $domain->getContent()); - self::assertFalse($domain->isKnown()); - self::assertFalse($domain->isICANN()); - self::assertFalse($domain->isPrivate()); - self::assertSame('be', $domain->getPublicSuffix()); + self::assertFalse($domain->getPublicSuffix()->isKnown()); + self::assertFalse($domain->getPublicSuffix()->isICANN()); + self::assertFalse($domain->getPublicSuffix()->isPrivate()); + self::assertSame('be', $domain->getPublicSuffix()->getContent()); } /** @@ -317,16 +312,16 @@ public function testWithPrivateDomainInvalid(): void * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\IDNAConverterTrait::parse + * @covers \Pdp\HostParser::parse */ public function testWithPrivateDomainValid(): void { $domain = $this->rules->resolve('thephpleague.github.io', Rules::PRIVATE_DOMAINS); self::assertSame('thephpleague.github.io', $domain->getContent()); - self::assertTrue($domain->isKnown()); - self::assertFalse($domain->isICANN()); - self::assertTrue($domain->isPrivate()); - self::assertSame('github.io', $domain->getPublicSuffix()); + self::assertTrue($domain->getPublicSuffix()->isKnown()); + self::assertFalse($domain->getPublicSuffix()->isICANN()); + self::assertTrue($domain->getPublicSuffix()->isPrivate()); + self::assertSame('github.io', $domain->getPublicSuffix()->getContent()); } /** @@ -335,16 +330,16 @@ public function testWithPrivateDomainValid(): void * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\IDNAConverterTrait::parse + * @covers \Pdp\HostParser::parse */ public function testWithICANNDomainInvalid(): void { $domain = $this->rules->resolve('private.ulb.ac.be'); self::assertSame('private.ulb.ac.be', $domain->getContent()); - self::assertTrue($domain->isKnown()); - self::assertTrue($domain->isICANN()); - self::assertFalse($domain->isPrivate()); - self::assertSame('ac.be', $domain->getPublicSuffix()); + self::assertTrue($domain->getPublicSuffix()->isKnown()); + self::assertTrue($domain->getPublicSuffix()->isICANN()); + self::assertFalse($domain->getPublicSuffix()->isPrivate()); + self::assertSame('ac.be', $domain->getPublicSuffix()->getContent()); } /** @@ -353,29 +348,35 @@ public function testWithICANNDomainInvalid(): void * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\IDNAConverterTrait::parse + * @covers \Pdp\HostParser::parse */ public function testWithDomainObject(): void { - $domain = new Domain('private.ulb.ac.be', new PublicSuffix('ac.be', Rules::ICANN_DOMAINS)); + $domain = new ResolvableDomain( + new Domain('private.ulb.ac.be'), + PublicSuffix::fromICANNSection('ac.be') + ); + $newDomain = $this->rules->resolve($domain); self::assertSame('private.ulb.ac.be', $domain->getContent()); - self::assertTrue($domain->isKnown()); - self::assertTrue($domain->isICANN()); - self::assertFalse($domain->isPrivate()); - self::assertSame('ac.be', $domain->getPublicSuffix()); - self::assertSame($domain, $newDomain); + self::assertTrue($domain->getPublicSuffix()->isKnown()); + self::assertTrue($domain->getPublicSuffix()->isICANN()); + self::assertFalse($domain->getPublicSuffix()->isPrivate()); + self::assertSame('ac.be', $domain->getPublicSuffix()->getContent()); + self::assertEquals($domain, $newDomain); } /** * @covers ::getPublicSuffix - * @covers \Pdp\IDNAConverterTrait::parse + * @covers \Pdp\HostParser::parse */ public function testWithDomainInterfaceObject(): void { + $domain = PublicSuffix::fromICANNSection('ulb.ac.be'); + self::assertSame( 'ac.be', - $this->rules->getPublicSuffix(new PublicSuffix('ul.ac.be', Rules::ICANN_DOMAINS))->getContent() + $this->rules->getPublicSuffix($domain)->getContent() ); } @@ -383,52 +384,46 @@ public function testWithDomainInterfaceObject(): void * @covers ::resolve * @covers ::resolveICANNDomain * @covers ::validateDomain - * @covers \Pdp\Domain::setRegistrableDomain - * @covers \Pdp\Domain::getRegistrableDomain * @dataProvider parseDataProvider - * - * @param mixed $publicSuffix - * @param mixed $registrableDomain - * @param mixed $domain - * @param mixed $expectedDomain + * @param ?string $publicSuffix + * @param ?string $registrableDomain + * @param ?string $expectedDomain */ - public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain): void + public function testGetRegistrableDomain(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { - self::assertSame($registrableDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getRegistrableDomain()); + $foundRegistrableDomain = $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getRegistrableDomain(); + + self::assertSame($registrableDomain, $foundRegistrableDomain->getContent()); } /** * @covers ::resolve * @covers ::resolveICANNDomain * @covers ::validateDomain - * @covers \Pdp\IDNAConverterTrait::parse - * @covers \Pdp\Domain::setPublicSuffix - * @covers \Pdp\Domain::getPublicSuffix + * @covers \Pdp\HostParser::parse * @dataProvider parseDataProvider - * - * @param mixed $publicSuffix - * @param mixed $registrableDomain - * @param mixed $domain - * @param mixed $expectedDomain + * @param ?string $publicSuffix + * @param ?string $registrableDomain + * @param ?string $expectedDomain */ - public function testGetPublicSuffix($publicSuffix, $registrableDomain, $domain, $expectedDomain): void + public function testGetPublicSuffix(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { - self::assertSame($publicSuffix, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getPublicSuffix()); + $effectiveTLD = $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getPublicSuffix(); + + self::assertSame($publicSuffix, $effectiveTLD->getContent()); } /** * @covers ::resolve - * @covers \Pdp\IDNAConverterTrait::parse - * @covers \Pdp\Domain::withPublicSuffix + * @covers \Pdp\HostParser::parse * @covers \Pdp\Domain::getContent * @dataProvider parseDataProvider * - * @param mixed $publicSuffix - * @param mixed $registrableDomain - * @param mixed $domain - * @param mixed $expectedDomain + * @param ?string $publicSuffix + * @param ?string $registrableDomain + * @param ?string $expectedDomain */ - public function testGetDomain($publicSuffix, $registrableDomain, $domain, $expectedDomain): void + public function testGetDomain(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { self::assertSame($expectedDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getContent()); } @@ -463,22 +458,17 @@ public function parseDataProvider(): iterable * @covers ::getPublicSuffix * @covers ::validateSection * @covers \Pdp\Domain::isResolvable - * @covers \Pdp\IDNAConverterTrait::parse + * @covers \Pdp\HostParser::parse * @dataProvider invalidParseProvider - * - * @param mixed $domain - * @param mixed $section */ - public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix($domain, $section): void + public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix(string $domain, string $section): void { - self::expectException(CouldNotResolvePublicSuffix::class); + self::expectException(UnableToResolveDomain::class); $this->rules->getPublicSuffix($domain, $section); } public function invalidParseProvider(): iterable { - $long_label = implode('.', array_fill(0, 62, 'a')); - return [ 'single label host' => ['localhost', Rules::ICANN_DOMAINS], ]; @@ -488,13 +478,10 @@ public function invalidParseProvider(): iterable * @covers ::getPublicSuffix * @covers ::validateSection * @covers \Pdp\Domain::isResolvable - * @covers \Pdp\IDNAConverterTrait::parse + * @covers \Pdp\HostParser::parse * @dataProvider invalidDomainParseProvider - * - * @param mixed $domain - * @param mixed $section */ - public function testGetPublicSuffixThrowsInvalidDomainException($domain, $section): void + public function testGetPublicSuffixThrowsInvalidDomainException(string $domain, string $section): void { self::expectException(InvalidDomain::class); $this->rules->getPublicSuffix($domain, $section); @@ -520,7 +507,7 @@ public function invalidDomainParseProvider(): iterable * @covers ::getPublicSuffix * @covers ::validateSection * @covers \Pdp\Domain::isResolvable - * @covers \Pdp\IDNAConverterTrait::parse + * @covers \Pdp\HostParser::parse * @dataProvider validPublicSectionProvider * @param ?string $domain * @param ?string $expected @@ -564,7 +551,7 @@ public function validPublicSectionProvider(): iterable */ public function checkPublicSuffix(?string $input, ?string $expected): void { - self::assertSame($expected, $this->rules->resolve($input)->getRegistrableDomain()); + self::assertSame($expected, $this->rules->resolve($input)->getRegistrableDomain()->getContent()); } /** @@ -576,9 +563,7 @@ public function checkPublicSuffix(?string $input, ?string $expected): void * * @covers ::resolve * @covers ::findPublicSuffixFromSection - * @covers \Pdp\Domain::withPublicSuffix - * @covers \Pdp\Domain::getRegistrableDomain - * @covers \Pdp\IDNAConverterTrait::parse + * @covers \Pdp\HostParser::parse */ public function testPublicSuffixSpec(): void { @@ -695,13 +680,17 @@ public function testResolveWithIDNAOptions(): void [IDNA_DEFAULT, IDNA_DEFAULT], [$resolvedByDefault->getAsciiIDNAOption(), $resolvedByDefault->getUnicodeIDNAOption()] ); - $manager = new Manager(new Cache(), new CurlHttpClient()); - $rules = $manager->getRules( - Manager::PSL_URL, - null, - IDNA_NONTRANSITIONAL_TO_ASCII, - IDNA_NONTRANSITIONAL_TO_UNICODE + $psr16Cache = new Psr16FileCache(__DIR__.'/data'); + $manager = new Manager( + new CurlClient(), + new RulesCachePsr16Adapter($psr16Cache), + new TopLevelDomainsCachePsr16Adapter($psr16Cache) ); + + $rules = $manager->getRulesLocalCopy() + ->withAsciiIDNAOption(IDNA_NONTRANSITIONAL_TO_ASCII) + ->withUnicodeIDNAOption(IDNA_NONTRANSITIONAL_TO_UNICODE); + $resolved = $rules->resolve('foo.de', Rules::ICANN_DOMAINS); self::assertSame( [$rules->getAsciiIDNAOption(), $rules->getUnicodeIDNAOption()], @@ -714,10 +703,6 @@ public function testResolveWithIDNAOptions(): void * @covers ::getICANNEffectiveTLD * @covers ::getPrivateEffectiveTLD * @dataProvider effectiveTLDProvider - * @param string $host - * @param string $cookieETLD - * @param string $icannETLD - * @param string $privateETLD */ public function testEffectiveTLDResolution(string $host, string $cookieETLD, string $icannETLD, string $privateETLD): void { diff --git a/tests/CacheTest.php b/tests/Storage/Cache/Psr16FileCacheTest.php similarity index 93% rename from tests/CacheTest.php rename to tests/Storage/Cache/Psr16FileCacheTest.php index a406ac15..638d15c5 100644 --- a/tests/CacheTest.php +++ b/tests/Storage/Cache/Psr16FileCacheTest.php @@ -13,15 +13,17 @@ declare(strict_types=1); -namespace Pdp\Tests; +namespace Pdp\Tests\Storage\Cache; use DateInterval; use Generator; use Iterator; use org\bovigo\vfs\vfsStream; -use Pdp\Cache; +use Pdp\Storage\Cache\Psr16CacheException; +use Pdp\Storage\Cache\Psr16FileCache; use PHPUnit\Framework\TestCase; use Psr\SimpleCache\InvalidArgumentException; +use function dirname; /** * Abstract PSR-16 tester. @@ -33,10 +35,10 @@ * * @see https://github.com/fruux/sabre-cache/blob/master/tests/AbstractCacheTest.php */ -class CacheTest extends TestCase +final class Psr16FileCacheTest extends TestCase { /** - * @var Cache + * @var \Pdp\Storage\Cache\Psr16FileCache */ protected $cache; @@ -55,7 +57,7 @@ public function setUp(): void $this->root = vfsStream::setup('pdp'); vfsStream::create(['cache' => []], $this->root); $this->cacheDir = vfsStream::url('pdp/cache'); - $this->cache = new Cache($this->cacheDir); + $this->cache = new Psr16FileCache($this->cacheDir); } public function tearDown(): void @@ -65,36 +67,39 @@ public function tearDown(): void public function testConstructorOnEmptyCachePath(): void { - $cache = new Cache(''); + $cache = new Psr16FileCache(dirname(__DIR__).'/data'); self::assertNull($cache->get('invalid_key')); } public function testConstructorOnParentCachePathIsNotExisted(): void { - $cache = new Cache(vfsStream::url('pdp/cache_not_exist')); + $cache = new Psr16FileCache(vfsStream::url('pdp/cache_not_exist')); self::assertNull($cache->get('invalid_key')); } public function testSetOnNotWritableCachePath(): void { self::expectException(\InvalidArgumentException::class); - $cache = new Cache('/bin'); + + new Psr16FileCache('/bin'); } public function testSetOnNotExistingCachePath(): void { self::expectException(\InvalidArgumentException::class); - $cache = new Cache('/foo/bar'); + + new Psr16FileCache('/foo/bar'); } /** * @dataProvider storableValuesProvider * - * @param mixed $expected + * @param mixed $expected the value to cache */ public function testSetGet($expected): void { $this->cache->set('foo', $expected); + self::assertEquals($expected, $this->cache->get('foo')); } @@ -123,19 +128,21 @@ public function testDelete(): void public function testGetInvalidArg(): void { - self::expectException(InvalidArgumentException::class); + self::expectException(Psr16CacheException::class); + $this->cache->get(null); } public function testInvalidKey(): void { - self::expectException(InvalidArgumentException::class); + self::expectException(Psr16CacheException::class); + $this->cache->get('foo:bar', 'bar'); } public function testSetInvalidTTL(): void { - self::expectException(InvalidArgumentException::class); + self::expectException(Psr16CacheException::class); $this->cache->set('foo', 'bar', date_create()); } @@ -414,13 +421,15 @@ public function testSetMultipleExpireDateIntervalInt(): void public function testSetMultipleInvalidArg(): void { - self::expectException(InvalidArgumentException::class); + self::expectException(Psr16CacheException::class); + $this->cache->setMultiple(null); } public function testGetMultipleInvalidArg(): void { - self::expectException(InvalidArgumentException::class); + self::expectException(Psr16CacheException::class); + $result = $this->cache->getMultiple(null); // If $result was a generator, the generator will only error once the // first value is requested. @@ -504,7 +513,8 @@ public function testDeleteMultipleGenerator(): void public function testDeleteMultipleInvalidArg(): void { - self::expectException(InvalidArgumentException::class); + self::expectException(Psr16CacheException::class); + $this->cache->deleteMultiple(null); } } diff --git a/tests/CurlHttpClientTest.php b/tests/Storage/Http/CurlClientTest.php similarity index 64% rename from tests/CurlHttpClientTest.php rename to tests/Storage/Http/CurlClientTest.php index d53e3abf..92621852 100644 --- a/tests/CurlHttpClientTest.php +++ b/tests/Storage/Http/CurlClientTest.php @@ -13,17 +13,16 @@ declare(strict_types=1); -namespace Pdp\Tests; +namespace Pdp\Tests\Storage\Http; -use Pdp\CurlHttpClient; -use Pdp\Exception; -use Pdp\HttpClientException; +use Pdp\Storage\Http\CurlClient; +use Pdp\Storage\Http\CurlClientException; use PHPUnit\Framework\TestCase; /** - * @coversDefaultClass Pdp\CurlHttpClient + * @coversDefaultClass \Pdp\Storage\Http\CurlClient */ -class CurlHttpClientTest extends TestCase +class CurlClientTest extends TestCase { /** * @covers ::__construct @@ -31,7 +30,7 @@ class CurlHttpClientTest extends TestCase */ public function testGetContent(): void { - $content = (new CurlHttpClient())->getContent('https://www.google.com'); + $content = (new CurlClient())->getContent('https://www.google.com'); self::assertStringContainsString('google', $content); } @@ -42,8 +41,8 @@ public function testGetContent(): void */ public function testThrowsException(): void { - self::expectException(HttpClientException::class); - (new CurlHttpClient())->getContent('https://qsfsdfqdf.dfsf'); + self::expectException(CurlClientException::class); + (new CurlClient())->getContent('https://qsfsdfqdf.dfsf'); } /** @@ -51,7 +50,7 @@ public function testThrowsException(): void */ public function testConstructorThrowsException(): void { - self::expectException(Exception::class); - new CurlHttpClient(['foo' => 'bar']); + self::expectException(CurlClientException::class); + new CurlClient(['foo' => 'bar']); } } diff --git a/tests/TLDConverterTest.php b/tests/TopLevelDomainsConverterTest.php similarity index 86% rename from tests/TLDConverterTest.php rename to tests/TopLevelDomainsConverterTest.php index 07719fcf..a72cd1ef 100644 --- a/tests/TLDConverterTest.php +++ b/tests/TopLevelDomainsConverterTest.php @@ -15,20 +15,20 @@ namespace Pdp\Tests; -use Pdp\Exception\CouldNotLoadTLDs; -use Pdp\TLDConverter; +use Pdp\TopLevelDomainsConverter; +use Pdp\UnableToLoadTopLevelDomains; use PHPUnit\Framework\TestCase; /** - * @coversDefaultClass Pdp\TLDConverter + * @coversDefaultClass \Pdp\TopLevelDomainsConverter */ -class TLDConverterTest extends TestCase +class TopLevelDomainsConverterTest extends TestCase { public function testConverter(): void { /** @var string $string */ $string = file_get_contents(__DIR__.'/data/root_zones.dat'); - $res = (new TLDConverter())->convert($string); + $res = (new TopLevelDomainsConverter())->convert($string); self::assertArrayHasKey('version', $res); self::assertArrayHasKey('modifiedDate', $res); self::assertArrayHasKey('records', $res); @@ -37,12 +37,11 @@ public function testConverter(): void /** * @dataProvider invalidContentProvider - * @param string $content */ public function testConverterThrowsException(string $content): void { - self::expectException(CouldNotLoadTLDs::class); - (new TLDConverter())->convert($content); + self::expectException(UnableToLoadTopLevelDomains::class); + (new TopLevelDomainsConverter())->convert($content); } public function invalidContentProvider(): iterable diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index 9cffa057..086860be 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -18,10 +18,12 @@ use DateTimeImmutable; use DateTimeZone; use Pdp\Domain; -use Pdp\Exception\CouldNotLoadTLDs; +use Pdp\InvalidDomain; use Pdp\PublicSuffix; -use Pdp\TLDConverter; use Pdp\TopLevelDomains; +use Pdp\TopLevelDomainsConverter; +use Pdp\UnableToLoadTopLevelDomains; +use Pdp\UnableToResolveDomain; use PHPUnit\Framework\TestCase; use TypeError; use function file_get_contents; @@ -30,7 +32,7 @@ use const IDNA_NONTRANSITIONAL_TO_UNICODE; /** - * @coversDefaultClass Pdp\TopLevelDomains + * @coversDefaultClass \Pdp\TopLevelDomains */ class TopLevelDomainsTest extends TestCase { @@ -67,7 +69,7 @@ public function testCreateFromPath(): void */ public function testCreateFromPathThrowsException(): void { - self::expectException(CouldNotLoadTLDs::class); + self::expectException(UnableToLoadTopLevelDomains::class); TopLevelDomains::createFromPath('/foo/bar.dat'); } @@ -92,11 +94,11 @@ public function testGetterProperties(): void ); self::assertFalse($collection->isEmpty()); - $converter = new TLDConverter(); + $converter = new TopLevelDomainsConverter(); /** @var string $content */ $content = file_get_contents(__DIR__.'/data/root_zones.dat'); $data = $converter->convert($content); - self::assertEquals($data, $collection->toArray()); + self::assertEquals($data, $collection->jsonSerialize()); foreach ($collection as $tld) { self::assertInstanceOf(PublicSuffix::class, $tld); @@ -130,13 +132,14 @@ public function testwithIDNAOptions(): void /** * @dataProvider validDomainProvider - * @param mixed $tld + * + * @param mixed $tld the tld */ public function testResolve($tld): void { self::assertSame( - (new Domain($tld))->getLabel(0), - $this->collection->resolve($tld)->getPublicSuffix() + (new Domain($tld))->label(0), + $this->collection->resolve($tld)->getPublicSuffix()->getContent() ); } @@ -168,19 +171,22 @@ public function testResolveThrowsTypeError(): void public function testResolveWithInvalidDomain(): void { - self::assertEquals(new Domain(), $this->collection->resolve('###')); + self::expectException(InvalidDomain::class); + + $this->collection->resolve('###'); } public function testResolveWithUnResolvableDomain(): void { - $domain = 'localhost'; - self::assertEquals(new Domain($domain), $this->collection->resolve($domain)); + self::expectException(UnableToResolveDomain::class); + + $this->collection->resolve('localhost'); } public function testResolveWithUnregisteredTLD(): void { $collection = TopLevelDomains::createFromPath(__DIR__.'/data/root_zones.dat'); - self::assertNull($collection->resolve('localhost.locale')->getPublicSuffix()); + self::assertNull($collection->resolve('localhost.locale')->getPublicSuffix()->getContent()); } public function testResolveWithIDNAOptions(): void @@ -204,9 +210,11 @@ public function testResolveWithIDNAOptions(): void [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption()] ); } + /** * @dataProvider validTldProvider - * @param mixed $tld + * + * @param mixed $tld the tld */ public function testContainsReturnsTrue($tld): void { @@ -237,7 +245,8 @@ public function __toString() /** * @dataProvider invalidTldProvider - * @param mixed $tld + * + * @param mixed $tld the tld */ public function testContainsReturnsFalse($tld): void { @@ -258,7 +267,6 @@ public function invalidTldProvider(): iterable 'invalid IDN to ASCII' => ['XN--TTT'], 'invalid IDN to ASCII with leading dot' => ['.XN--TTT'], 'null' => [null], - 'float' => [1.1], 'object with __toString method' => [new class() { public function __toString() { diff --git a/tests/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache b/tests/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache new file mode 100644 index 00000000..440985f6 --- /dev/null +++ b/tests/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache @@ -0,0 +1 @@ +s:112551:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":{"co":[],"com":[],"commune":[],"net":[],"org":[]},"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":{"sth":[]},"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"catholic":[],"nsw":{"schools":[]},"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"app":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bib":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"coz":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"des":[],"det":[],"dev":[],"ecn":[],"eco":[],"edu":[],"emp":[],"enf":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"geo":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"log":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"ong":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"rep":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"seg":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"tc":[],"tec":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"aprendemas":[],"co":[],"gob":[],"gov":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"ac":[],"biz":[],"com":[],"gov":[],"info":[],"mil":[],"name":[],"net":[],"org":[],"pro":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"asso":[],"com":[],"gouv":[],"nom":[],"prd":[],"tm":[],"aeroport":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"ponpes":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"ac":[],"biz":[],"co":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"sc":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":[],"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":[],"rw":{"ac":[],"co":[],"coop":[],"gov":[],"mil":[],"net":[],"org":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"edu":[],"gov":[],"me":[],"net":[],"org":[]},"sr":[],"ss":{"biz":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"av":[],"bbs":[],"bel":[],"biz":[],"com":[],"dr":[],"edu":[],"gen":[],"gov":[],"info":[],"mil":[],"k12":[],"kep":[],"name":[],"net":[],"org":[],"pol":[],"tel":[],"tsk":[],"tv":[],"web":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--qxa6a":[],"xn--mgbah1a3hjkrd":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nic":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"amazon":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"cpa":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dog":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gay":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"llp":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"spa":[],"space":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"stada":[],"staples":[],"star":[],"statebank":[],"statefarm":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cckwcxetd":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq480n2rg":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[],"v":[]},"to":{"611":[],"oya":[],"vpnplus":[],"quickconnect":{"direct":[]},"nyan":[]},"com":{"adobeaemcloud":{"dev":{"*":[]}},"kasserver":[],"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"balena-devices":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"trycloudflare":[],"customer-oci":{"*":[],"oci":{"*":[]},"ocp":{"*":[]},"ocs":{"*":[]}},"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"builtwithdark":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"onfabrica":[],"fbsbx":{"apps":[]},"fastly-terrarium":[],"fastvps-server":[],"mydobiss":[],"firebaseapp":[],"freebox-os":[],"freeboxos":[],"gentapps":[],"gentlentapis":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":{"r":{"*":[]}},"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"awsmppl":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"dopaas":[],"hidora":[],"ik-server":{"jcloud":[]},"jelastic":{"demo":[]},"joyent":{"cns":{"*":[]}},"lpusercontent":[],"lmpm":{"app":[]},"linode":{"members":[],"nodebalancer":{"*":[]}},"linodeobjects":{"*":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"observableusercontent":{"static":[]},"operaunite":[],"skygearapp":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"pagexl":[],"gotpantheon":[],"platter-app":[],"pleskns":[],"prgmr":{"xen":[]},"qualifioapp":[],"qbuser":[],"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"render":{"app":[]},"onrender":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"shopitsite":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"stackhero-network":[],"playstation-cloud":[],"stdlib":{"api":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"thingdustdata":[],"bloxcms":[],"townnews-staging":[],"hk":[],"wafflecell":[],"remotewd":[],"wiardweb":{"pages":[]},"xnbay":{"u2":[],"u2-local":[]},"yolasite":[],"wpenginepowered":[],"impertrixcdn":[],"impertrix":[]},"net":{"adobeaemcloud":[],"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"clic2000":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"bitbridge":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":{"u":[]},"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"edgeapp":[],"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"in-dsl":[],"in-vpn":[],"ipifony":[],"iobb":[],"cloudjiffy":[],"elastx":{"jls-sto1":[]},"saveincloud":{"jelastic":[]},"kinghost":[],"uni5":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"seidat":[],"senseering":[],"siteleaf":[],"srcf":{"soc":[],"user":[]},"dsmynas":[],"familyds":[],"community-pro":[],"meinforum":[],"yandexcloud":{"storage":[],"website":[]},"za":[]},"pl":{"beep":[],"krasnik":[],"leczna":[],"lubartow":[],"lublin":[],"poniatowa":[],"swidnik":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"ca":{"barsy":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]},"co":[],"arvo":[],"azimuth":[]},"org":{"altervista":[],"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"in-dsl":[],"in-vpn":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"pubtls":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"edugit":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"toolforge":[],"wmcloud":[],"za":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[],"cn-northwest-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}},"instantcloud":[]},"nl":{"amsw":[],"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"khplay":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"io":{"apigee":[],"b-data":[],"backplaneapp":[],"banzaicloud":{"app":[],"backyards":{"*":[]}},"boxfuse":[],"browsersafetymark":[],"bigv":{"uk0":[]},"cleverapps":[],"dappnode":{"dyndns":[]},"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"shw":[],"github":[],"gitlab":[],"lolipop":[],"hasura-app":[],"hostyhosting":[],"moonscale":{"*":[]},"jele":[],"loginline":[],"barsy":[],"azurecontainer":{"*":[]},"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"dyn53":[],"protonet":[],"qcx":{"sys":{"*":[]}},"vaporcloud":[],"vbrplsbx":{"g":[]},"on-k3s":{"*":[]},"on-rio":{"*":[]},"readthedocs":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"shiftedit":[],"mo-siemens":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"applicationcloud":[],"scapp":[],"s5y":{"*":[]},"telebit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[],"basicserver":[],"virtualserver":[]},"jp":{"ne":{"aseinet":{"user":[]},"gehirn":[]},"usercontent":[],"blogspot":[]},"vc":{"gv":{"d":[]},"0e":[],"nom":[]},"eus":{"party":{"user":[]}},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"cloud":{"banzai":{"*":[]},"statics":{"*":[]},"jele":[],"linkyard":[],"magentosite":{"*":[]},"perspecta":[],"vapor":[],"on-rancher":{"*":[]},"sensiosite":{"*":[]},"trafficplex":[],"urown":[],"voorloper":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"dyn-berlin":[],"in-berlin":[],"in-brb":[],"in-butter":[],"in-dsl":[],"in-vpn":[],"mein-iserv":[],"schulserver":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[],"community-pro":[],"diskussionsbereich":[]},"uk":{"co":{"bytemark":{"dh":[],"vm":[]},"blogspot":[],"layershift":{"j":[]},"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"conn":[],"copro":[],"gov":{"service":[],"homeoffice":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"co":{"carrd":[],"crd":[],"otap":{"*":[]},"com":{"blogspot":[]},"leadpages":[],"lpages":[],"mypi":[],"n4t":[],"nodum":[],"repl":[]},"ai":{"uwu":[],"nom":[]},"se":{"com":[],"blogspot":[],"conf":[]},"bz":{"za":[],"nom":[],"nym":[]},"group":{"discourse":[]},"team":{"discourse":[],"jelastic":[]},"dev":{"lcl":{"*":[]},"stg":{"*":[]},"workers":[],"curv":[],"fly":[],"iserv":[],"loginline":[],"platter-app":[],"vercel":[],"webhare":{"*":[]}},"me":{"c66":[],"daplie":{"localhost":[]},"edgestack":[],"couk":[],"ukco":[],"filegear":[],"filegear-au":[],"filegear-de":[],"filegear-gb":[],"filegear-ie":[],"filegear-jp":[],"filegear-sg":[],"glitch":[],"ravendb":[],"barsy":[],"nctu":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"zone":{"cloud66":[],"hs":[],"triton":{"*":[]},"lima":[]},"host":{"cloudaccess":[],"freesite":[],"fastvps":[],"myfast":[],"jele":[],"mircloud":[],"pcloud":[],"half":[]},"site":{"cloudera":[],"cyon":[],"fastvps":[],"jele":[],"lelux":[],"loginline":[],"barsy":[],"opensocial":[],"platformsh":{"*":[]},"byen":[],"mintere":[]},"app":{"wnext":[],"run":{"a":[]},"web":[],"hasura":[],"loginline":[],"netlify":[],"telebit":[],"vercel":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"bpl":[],"orx":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"jele":[],"barsy":[],"pony":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"csx":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"dnsupdate":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"graphox":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"platterp":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[],"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"regruhosting":{"jelastic":[]},"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[],"dweb":{"*":[]}},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"earth":{"dapps":{"*":[],"bzz":{"*":[]}}},"th":{"online":[],"shop":[]},"fi":{"dy":[],"blogspot":[],"xn--hkkinen-5wa":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[],"uwu":[],"enterprisecloud":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[],"telebit":{"*":[]}},"fr":{"en-root":[],"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"one":{"onred":{"staging":[]},"for":[],"homelink":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"space":{"myfast":[],"linkitools":[],"uber":[],"xs4all":[]},"at":{"funkfeuer":{"wien":[]},"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"ms":{"lab":[]},"si":{"gitpage":[],"blogspot":[],"nom":[]},"digital":{"cloudapps":{"london":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[],"neko":[],"nyaa":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[],"scaleforce":{"j":[]}}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]},"col":[],"firm":[],"gen":[],"ltd":[],"ngo":[]},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"nym":[],"ltd":[],"inc":[]},"hr":{"blogspot":[],"free":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[],"syncloud":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"caa":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[],"at":[],"de":[],"jp":[],"to":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"ua":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"ci":{"fin":[],"nl":[]},"run":{"hs":[],"development":[],"ravendb":[],"repl":[]},"sh":{"hashbang":[],"platform":{"bc":[],"ent":[],"eu":[],"us":[]},"now":[],"vxl":[],"wedeploy":[]},"community":{"ravendb":[],"myforum":[]},"city":{"ng":[]},"gl":{"biz":[],"nom":[],"xx":[]},"ink":{"ng":[]},"school":{"ng":[]},"so":{"sch":[]},"gg":{"kaas":[],"cya":[],"panel":{"daemon":[]}},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"business":{"co":[]},"education":{"co":[]},"events":{"co":[]},"financial":{"co":[]},"place":{"co":[]},"technology":{"co":[]},"bs":{"we":[]},"services":{"loginline":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"casa":{"nabu":{"ui":[]}},"fashion":{"of":[],"on":[]},"football":{"of":[]},"london":{"in":[],"of":[]},"men":{"for":[]},"mom":{"and":[],"for":[]},"sale":{"for":[]},"work":{"of":[],"to":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ec":{"nym":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gt":{"nom":[],"blog":[],"de":[],"to":[]},"gy":{"nym":[],"be":[]},"hn":{"nom":[],"cc":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"lv":{"nom":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vg":{"nom":[],"at":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"codes":{"owo":{"*":[]}},"page":{"pdns":[],"plesk":[],"prvcy":[]},"bn":{"co":[]},"fit":{"ptplus":[]},"edu":{"rit":{"git-pages":[]}},"scot":{"gov":[]},"store":{"shopware":[]},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"ax":{"be":[],"cat":[],"es":[],"eu":[],"gg":[],"mc":[],"us":[],"xy":[]},"gp":{"app":[]},"kg":{"blog":[],"io":[],"jp":[],"tv":[],"uk":[],"us":[]},"ls":{"de":[]},"porn":{"indie":[]},"tc":{"ch":[],"me":[],"we":[]},"vu":{"blog":[],"dev":[],"me":[],"cn":[]},"academy":{"official":[]},"faith":{"ybo":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]},"design":{"bss":[]}}}"; \ No newline at end of file From 40caacc577a388d215e420faa460f5a72076b9f0 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 28 Jul 2020 21:56:24 +0200 Subject: [PATCH 200/461] Moving the interfaces into the main namespace --- CHANGELOG.md | 12 +- README.md | 50 ++++---- src/Contract/PublicSuffixListSection.php | 28 ----- src/Domain.php | 2 - src/{Contract => }/DomainInterface.php | 8 +- .../Exception.php => ExceptionInterface.php} | 6 +- src/{Contract => }/HostInterface.php | 14 ++- src/HostParser.php | 1 - src/InvalidDomain.php | 4 +- src/PublicSuffix.php | 12 +- src/{Contract => }/PublicSuffixInterface.php | 4 +- src/PublicSuffixListInterface.php | 104 +++++++++++++++++ src/ResolvableDomain.php | 4 - .../ResolvableHostInterface.php | 4 +- src/RootZoneDatabaseInterface.php | 109 ++++++++++++++++++ src/Rules.php | 13 +-- src/RulesConverter.php | 3 +- src/Storage/Cache/TopLevelDomainsCache.php | 6 +- .../TopLevelDomainsCachePsr16Adapter.php | 5 +- src/Storage/Manager.php | 5 +- src/TopLevelDomains.php | 22 ++-- src/TopLevelDomainsConverter.php | 3 +- src/UnableToLoadRules.php | 3 +- src/UnableToLoadTopLevelDomains.php | 3 +- src/UnableToResolveDomain.php | 4 +- tests/TopLevelDomainsTest.php | 3 +- 26 files changed, 298 insertions(+), 134 deletions(-) delete mode 100644 src/Contract/PublicSuffixListSection.php rename src/{Contract => }/DomainInterface.php (94%) rename src/{Contract/Exception.php => ExceptionInterface.php} (84%) rename src/{Contract => }/HostInterface.php (90%) rename src/{Contract => }/PublicSuffixInterface.php (89%) create mode 100644 src/PublicSuffixListInterface.php rename src/{Contract => }/ResolvableHostInterface.php (95%) create mode 100644 src/RootZoneDatabaseInterface.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 7079b3ef..61d266de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -82,7 +82,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\Service\Manager::__construct` - `Pdp\Service\Manager::getRules` - `Pdp\Service\Manager::refreshRules` -- `Pdp\Contract\Exception\CouldNotLoadTLDs` exception +- `Pdp\Exception\CouldNotLoadTLDs` exception ### Fixed @@ -101,8 +101,8 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in ### Added -- `Pdp\Contract\PublicSuffixListSection` interface implemented by `Pdp\Rules` and `Pdp\PublicSuffix` -- `Pdp\Contract\DomainInterface` interface implemented by `Pdp\Domain` and `Pdp\PublicSuffix` +- `Pdp\PublicSuffixListSection` interface implemented by `Pdp\Rules` and `Pdp\PublicSuffix` +- `Pdp\DomainInterface` interface implemented by `Pdp\Domain` and `Pdp\PublicSuffix` - `Pdp\Domain::getContent` replaces `Pdp\Domain::getDomain` - `Pdp\Domain::withLabel` adds a new label to the `Pdp\Domain`. - `Pdp\Domain::withoutLabel` removes labels from the `Pdp\Domain`. @@ -113,7 +113,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\Domain::resolve` attach a public suffix to the `Pdp\Domain`. - `Pdp\Domain::isResolvable` tells whether the current `Pdp\Domain` can have a public suffix attached to it or not. - `Pdp\PublicSuffix::createFromDomain` returns a new `Pdp\PublicSuffix` object from a `Pdp\Domain`object -- `Pdp\Contract\Exception` sub namespace to organize exception. All exception extends the `Pdp\Contract\Exception` class to prevent BC break. +- `Pdp\Exception` sub namespace to organize exception. All exception extends the `Pdp\Exception` class to prevent BC break. ### Fixed @@ -121,7 +121,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\Domain` and `Pdp\PublicSuffix` host validation compliance to RFC improved - Improve `Pdp\Converter` and `Pdp\Service\Manager` class to better report error on IDN conversion. - Improve `Pdp\Service\Installer` vendor directory resolution see [PR #222](https://github.com/jeremykendall/php-domain-parser/pull/222) -- `Pdp\Contract\Exception` nows extends `InvalidArgumentException` instead of `RuntimeException` +- `Pdp\Exception` nows extends `InvalidArgumentException` instead of `RuntimeException` ### Deprecated @@ -181,7 +181,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in ### Added -- `Pdp\Contract\Exception` a base exception for the library +- `Pdp\Exception` a base exception for the library - `Pdp\Rules` a class to resolve domain name against the public suffix list - `Pdp\Domain` an immutable value object to represents a parsed domain name - `Pdp\Service\Installer` a class to enable improve PSL maintenance diff --git a/README.md b/README.md index 9d14bfea..5ddab3cc 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ System Requirements You need: -- **PHP >= 7.4** but the latest stable version of PHP is recommended +- **PHP >= 7.2.5** but the latest stable version of PHP is recommended - the `intl` extension Dependencies @@ -75,7 +75,7 @@ echo $rules->getPublicSuffix('www.ulb.ac.be', Rules::PRIVATE_DOMAINS); //get the ~~~ -If the Public Suffix is not found or in case of error an exception which extends `Pdp\Contract\Exception` is thrown. +If the Public Suffix is not found or in case of error an exception which extends `Pdp\Exception` is thrown. ### Domain resolution. @@ -204,8 +204,8 @@ $publicSuffix = new PublicSuffix('com'); $domain = new Domain('www.bébé.ExAmple.com', $publicSuffix); $domain->getContent(); // www.bébé.example.com echo $domain; // www.bébé.example.com -echo $domain->label(0); // 'com' -echo $domain->label(-1); // 'www' +echo $domain->getLabel(0); // 'com' +echo $domain->getLabel(-1); // 'www' $domain->keys('example'); // array(1) count($domain); //returns 4 $domain->getPublicSuffix(); // 'com' @@ -261,7 +261,7 @@ echo $newDomain // 'shop.com' Because the `Pdp\Domain` object is immutable: - If the method change any of the current object property, a new object is returned. -- If a modification is not possible a `Pdp\Contract\Exception` exception is thrown. +- If a modification is not possible a `Pdp\Exception` exception is thrown. **WARNING: URI and URL accept registered name which encompass domain name. Therefore, some URI host are invalid domain name and will trigger an exception if you try to instantiate a `Pdp\Domain` with them.** @@ -363,7 +363,7 @@ Both methods expect the same arguments: - `Rules::PRIVATE_DOMAINS`, to validate against the PSL PRIVATE DOMAINS section only. - the empty string to validate against all the PSL sections. -By default, the `$section` argument is equal to the empty string. If an unsupported section is submitted a `Pdp\Contract\Exception` exception will be thrown. +By default, the `$section` argument is equal to the empty string. If an unsupported section is submitted a `Pdp\Exception` exception will be thrown. **THIS EXAMPLE ILLUSTRATES HOW THE OBJECT WORK BUT SHOULD BE AVOIDED IN PRODUCTON** @@ -480,30 +480,30 @@ $domain = json_encode($tlds->resolve('www.Ulb.Ac.BE'), JSON_PRETTY_PRINT); ### Managing the package lists -The library comes bundle with a service which enables resolving domain name without the constant network overhead of continously downloading the PSL. The `Pdp\Service\Manager` class retrieves, converts and caches the PSL as well as creates the corresponding `Pdp\Rules` object on demand. It internally uses a `Pdp\Converter` object to convert the fetched PSL into its `array` representation when required. +The library comes bundle with a service which enables resolving domain name without the constant network overhead of continously downloading the PSL. The `Pdp\Manager` class retrieves, converts and caches the PSL as well as creates the corresponding `Pdp\Rules` object on demand. It internally uses a `Pdp\Converter` object to convert the fetched PSL into its `array` representation when required. ~~~php refreshRules('https://publicsuffix.org/list/public_suffix_list.dat'); if ($retval) { //the local cache has been updated @@ -588,7 +588,7 @@ These methods take an optional `$url` argument which specifies the PSL source UR 1. call `Manager::refreshRules` with the given URL and `$ttl` argument to update its local cache 2. instantiate the `Rules` or the `TopLevelDomains` objects with the newly cached data. -On error, theses methods will throw an `Pdp\Contract\Exception`. +On error, theses methods will throw an `Pdp\Exception`. **since version 5.5** @@ -604,7 +604,7 @@ They are used when instantiated the returned object. **THIS IS THE RECOMMENDED WAY OF USING THE LIBRARY** ~~~php -$manager = new Pdp\Storage\Manager(new Pdp\Storage\Cache\Psr16FileCache(), new Pdp\Storage\Http\CurlClient()); +$manager = new Pdp\Manager(new Pdp\Cache(), new Pdp\CurlHttpClient()); $tldCollection = $manager->getTLDs(self::RZD_URL); $domain = $tldCollection->resolve('www.ulb.ac.be'); echo $domain->getPublicSuffix(); // print 'be' @@ -621,8 +621,8 @@ $ php ./bin/update-psl This script requires: - The PHP `curl` extension -- The `Pdp\Service\Installer` class which organizes how to update the cache. -- The `Pdp\Storage\Cache` and `Pdp\Client\CurlHttpClient` classes to retrieve and cache the PSL +- The `Pdp\Installer` class which organizes how to update the cache. +- The `Pdp\Cache` and `Pdp\CurlHttpClient` classes to retrieve and cache the PSL - A `Psr3` implementation. You can add a composer script in your `composer.json` file to update the PSL cache every time after the `install` or the `update` command are executed. @@ -630,8 +630,8 @@ You can add a composer script in your `composer.json` file to update the PSL cac ~~~bash { "scripts": { - "post-install-cmd": "\\Pdp\\Service\\Installer::updateLocalCache", - "post-update-cmd": "\\Pdp\\Service\\Installer::updateLocalCache" + "post-install-cmd": "\\Pdp\\Installer::updateLocalCache", + "post-update-cmd": "\\Pdp\\Installer::updateLocalCache" } } ~~~ @@ -680,12 +680,12 @@ Of course you can add more setups depending on your usage. get($url)->getBody()->getContents(); } catch (Throwable $e) { - throw new ClientException($e->getMessage(), $e->getCode(), $e); + throw new HttpClientException($e->getMessage(), $e->getCode(), $e); } } } diff --git a/src/Contract/PublicSuffixListSection.php b/src/Contract/PublicSuffixListSection.php deleted file mode 100644 index 22d2149c..00000000 --- a/src/Contract/PublicSuffixListSection.php +++ /dev/null @@ -1,28 +0,0 @@ - - */ -interface PublicSuffixListSection -{ - public const ICANN_DOMAINS = 'ICANN_DOMAINS'; - - public const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; -} diff --git a/src/Domain.php b/src/Domain.php index ea5c82e2..c4c8eb9d 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -16,8 +16,6 @@ namespace Pdp; use JsonSerializable; -use Pdp\Contract\DomainInterface; -use Pdp\Contract\HostInterface; use TypeError; use function array_count_values; use function array_keys; diff --git a/src/Contract/DomainInterface.php b/src/DomainInterface.php similarity index 94% rename from src/Contract/DomainInterface.php rename to src/DomainInterface.php index ec2ecd8b..4bdd3323 100644 --- a/src/Contract/DomainInterface.php +++ b/src/DomainInterface.php @@ -13,7 +13,7 @@ declare(strict_types=1); -namespace Pdp\Contract; +namespace Pdp; use IteratorAggregate; @@ -103,8 +103,8 @@ public function append($label): self; * * @param mixed $label a domain label * - * @throws Exception If the key is out of bounds - * @throws Exception If the label is converted to the NULL value + * @throws ExceptionInterface If the key is out of bounds + * @throws ExceptionInterface If the label is converted to the NULL value */ public function withLabel(int $key, $label): self; @@ -119,7 +119,7 @@ public function withLabel(int $key, $label): self; * * @param int ...$keys * - * @throws Exception If the key is out of bounds + * @throws ExceptionInterface If the key is out of bounds */ public function withoutLabel(int $key, int ...$keys): self; } diff --git a/src/Contract/Exception.php b/src/ExceptionInterface.php similarity index 84% rename from src/Contract/Exception.php rename to src/ExceptionInterface.php index b173cb87..c7cc27ad 100644 --- a/src/Contract/Exception.php +++ b/src/ExceptionInterface.php @@ -13,8 +13,10 @@ declare(strict_types=1); -namespace Pdp\Contract; +namespace Pdp; -interface Exception extends \Throwable +use Throwable; + +interface ExceptionInterface extends Throwable { } diff --git a/src/Contract/HostInterface.php b/src/HostInterface.php similarity index 90% rename from src/Contract/HostInterface.php rename to src/HostInterface.php index 9553abd2..7fc9c688 100644 --- a/src/Contract/HostInterface.php +++ b/src/HostInterface.php @@ -13,7 +13,9 @@ declare(strict_types=1); -namespace Pdp\Contract; +namespace Pdp; + +use Countable; /** * Domain Interface. @@ -22,7 +24,7 @@ * @see https://tools.ietf.org/html/rfc1123#section-2.1 * @see https://tools.ietf.org/html/rfc5890 */ -interface HostInterface extends \Countable +interface HostInterface extends Countable { /** * Returns the domain content. @@ -65,9 +67,9 @@ public function getUnicodeIDNAOption(): int; * This method MUST retain the state of the current instance, and return * an instance with its content converted to its IDNA ASCII form * - * @throws Exception if the domain can not be converted to ASCII using IDN UTS46 algorithm - * + * @throws ExceptionInterface if the domain can not be converted to ASCII using IDN UTS46 algorithm * @return static + * */ public function toAscii(): self; @@ -77,9 +79,9 @@ public function toAscii(): self; * This method MUST retain the state of the current instance, and return * an instance with its content converted to its IDNA UTF8 form * - * @throws Exception if the domain can not be converted to Unicode using IDN UTS46 algorithm - * + * @throws ExceptionInterface if the domain can not be converted to Unicode using IDN UTS46 algorithm * @return static + * */ public function toUnicode(): self; diff --git a/src/HostParser.php b/src/HostParser.php index 46c062fe..a0e3799e 100644 --- a/src/HostParser.php +++ b/src/HostParser.php @@ -15,7 +15,6 @@ namespace Pdp; -use Pdp\Contract\HostInterface; use TypeError; use UnexpectedValueException; use function array_reverse; diff --git a/src/InvalidDomain.php b/src/InvalidDomain.php index 918f8c1b..1cab67ea 100644 --- a/src/InvalidDomain.php +++ b/src/InvalidDomain.php @@ -15,10 +15,10 @@ namespace Pdp; -use Pdp\Contract\Exception; +use InvalidArgumentException; use function sprintf; -class InvalidDomain extends \InvalidArgumentException implements Exception +class InvalidDomain extends InvalidArgumentException implements ExceptionInterface { public static function dueToInvalidLabelKey(int $key): self { diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index dc629a9b..7cb764cd 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -16,8 +16,6 @@ namespace Pdp; use JsonSerializable; -use Pdp\Contract\HostInterface; -use Pdp\Contract\PublicSuffixInterface; use function array_reverse; use function count; use function implode; @@ -28,7 +26,7 @@ final class PublicSuffix extends HostParser implements JsonSerializable, PublicSuffixInterface { - private const PSL_SECTION = [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, '']; + private const PSL_SECTION = [PublicSuffixListInterface::PRIVATE_DOMAINS, PublicSuffixListInterface::ICANN_DOMAINS, '']; private ?string $publicSuffix; @@ -75,7 +73,7 @@ public static function __set_state(array $properties): self */ public static function fromICANNSection($publicSuffix = null, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self { - return new self($publicSuffix, self::ICANN_DOMAINS, $asciiIDNAOption, $unicodeIDNAOption); + return new self($publicSuffix, PublicSuffixListInterface::ICANN_DOMAINS, $asciiIDNAOption, $unicodeIDNAOption); } /** @@ -83,7 +81,7 @@ public static function fromICANNSection($publicSuffix = null, int $asciiIDNAOpti */ public static function fromPrivateSection($publicSuffix = null, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self { - return new self($publicSuffix, self::PRIVATE_DOMAINS, $asciiIDNAOption, $unicodeIDNAOption); + return new self($publicSuffix, PublicSuffixListInterface::PRIVATE_DOMAINS, $asciiIDNAOption, $unicodeIDNAOption); } /** @@ -186,12 +184,12 @@ public function isKnown(): bool public function isICANN(): bool { - return self::ICANN_DOMAINS === $this->section; + return PublicSuffixListInterface::ICANN_DOMAINS === $this->section; } public function isPrivate(): bool { - return self::PRIVATE_DOMAINS === $this->section; + return PublicSuffixListInterface::PRIVATE_DOMAINS === $this->section; } public function toAscii(): HostInterface diff --git a/src/Contract/PublicSuffixInterface.php b/src/PublicSuffixInterface.php similarity index 89% rename from src/Contract/PublicSuffixInterface.php rename to src/PublicSuffixInterface.php index 70f00bd1..590b6cd0 100644 --- a/src/Contract/PublicSuffixInterface.php +++ b/src/PublicSuffixInterface.php @@ -13,9 +13,9 @@ declare(strict_types=1); -namespace Pdp\Contract; +namespace Pdp; -interface PublicSuffixInterface extends HostInterface, PublicSuffixListSection +interface PublicSuffixInterface extends HostInterface { /** * Tells whether the effective TLD has a matching rule in a Public Suffix List. diff --git a/src/PublicSuffixListInterface.php b/src/PublicSuffixListInterface.php new file mode 100644 index 00000000..b7208668 --- /dev/null +++ b/src/PublicSuffixListInterface.php @@ -0,0 +1,104 @@ + + * @author Ignace Nyamagana Butera + */ +interface PublicSuffixListInterface extends JsonSerializable +{ + public const ICANN_DOMAINS = 'ICANN_DOMAINS'; + + public const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; + + public function getAsciiIDNAOption(): int; + + public function getUnicodeIDNAOption(): int; + + public function jsonSerialize(): array; + + /** + * Determines the public suffix for a given domain against the PSL rules for cookie domain detection.. + * + * @throws ExceptionInterface If the PublicSuffix can not be resolve. + */ + public function getCookieEffectiveTLD(ResolvableHostInterface $domain): PublicSuffixInterface; + + /** + * Determines the public suffix for a given domain against the PSL rules for ICANN domain detection.. + * + * @throws ExceptionInterface If the PublicSuffix can not be resolve. + */ + public function getICANNEffectiveTLD(ResolvableHostInterface $domain): PublicSuffixInterface; + + /** + * Determines the public suffix for a given domain against the PSL rules for private domain detection.. + * + * @throws ExceptionInterface If the PublicSuffix can not be resolve. + */ + public function getPrivateEffectiveTLD(ResolvableHostInterface $domain): PublicSuffixInterface; + + /** + * Returns PSL info for a given domain. + * + * @param mixed $domain a type that supports instantiating a Domain from. + */ + public function resolve($domain, string $section = ''): ResolvableHostInterface; + + /** + * Returns PSL info for a given domain against the PSL rules for cookie domain detection. + * + * @param mixed $domain the domain value + */ + public function resolveCookieDomain($domain): ResolvableHostInterface; + + /** + * Returns PSL info for a given domain against the PSL rules for ICANN domain detection. + * + * @param mixed $domain a type that supports instantiating a Domain from. + */ + public function resolveICANNDomain($domain): ResolvableHostInterface; + + /** + * Returns PSL info for a given domain against the PSL rules for private domain detection. + * + * @param mixed $domain a type that supports instantiating a Domain from. + */ + public function resolvePrivateDomain($domain): ResolvableHostInterface; + + /** + * Sets conversion options for idn_to_ascii. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). + * + * @see https://www.php.net/manual/en/intl.constants.php + */ + public function withAsciiIDNAOption(int $asciiIDNAOption): self; + + /** + * Sets conversion options for idn_to_utf8. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). + * + * @see https://www.php.net/manual/en/intl.constants.php + */ + public function withUnicodeIDNAOption(int $unicodeIDNAOption): self; +} diff --git a/src/ResolvableDomain.php b/src/ResolvableDomain.php index 16b906b5..ade6a780 100644 --- a/src/ResolvableDomain.php +++ b/src/ResolvableDomain.php @@ -16,10 +16,6 @@ namespace Pdp; use JsonSerializable; -use Pdp\Contract\DomainInterface; -use Pdp\Contract\HostInterface; -use Pdp\Contract\PublicSuffixInterface; -use Pdp\Contract\ResolvableHostInterface; use function array_reverse; use function array_slice; use function count; diff --git a/src/Contract/ResolvableHostInterface.php b/src/ResolvableHostInterface.php similarity index 95% rename from src/Contract/ResolvableHostInterface.php rename to src/ResolvableHostInterface.php index 0ce4b195..acddac72 100644 --- a/src/Contract/ResolvableHostInterface.php +++ b/src/ResolvableHostInterface.php @@ -13,7 +13,7 @@ declare(strict_types=1); -namespace Pdp\Contract; +namespace Pdp; interface ResolvableHostInterface extends HostInterface { @@ -31,7 +31,7 @@ public function getRegistrableDomain(): DomainInterface; * This method MUST retain the state of the current instance, and return * an instance that contains the new sub domain * - * @throws Exception If the Sub domain can not be added to the current Domain + * @throws ExceptionInterface If the Sub domain can not be added to the current Domain */ public function withSubDomain(HostInterface $subDomain): self; diff --git a/src/RootZoneDatabaseInterface.php b/src/RootZoneDatabaseInterface.php new file mode 100644 index 00000000..6e236b1e --- /dev/null +++ b/src/RootZoneDatabaseInterface.php @@ -0,0 +1,109 @@ + + */ +interface RootZoneDatabaseInterface extends Countable, IteratorAggregate, JsonSerializable +{ + /** + * Returns the Version ID. + */ + public function getVersion(): string; + + /** + * Returns the List Last Modified Date. + */ + public function getModifiedDate(): DateTimeImmutable; + + /** + * Gets conversion options for idn_to_ascii. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). + * + * @see https://www.php.net/manual/en/intl.constants.php + */ + public function getAsciiIDNAOption(): int; + + /** + * Gets conversion options for idn_to_utf8. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). + * + * @see https://www.php.net/manual/en/intl.constants.php + */ + public function getUnicodeIDNAOption(): int; + + /** + * {@inheritdoc} + */ + public function count(): int; + + /** + * Tells whether the list is empty. + */ + public function isEmpty(): bool; + + /** + * {@inheritdoc} + */ + public function getIterator(); + + /** + * Returns an array representation of the list. + */ + public function jsonSerialize(): array; + + /** + * Tells whether the submitted TLD is a valid Top Level Domain. + * + * @param mixed $tld a TLD in a type that can be converted into a DomainInterface instance + */ + public function contains($tld): bool; + + /** + * Returns a domain where its public suffix is the found TLD. + * + * @param mixed $domain a domain in a type that can be converted into a DomainInterface instance + */ + public function resolve($domain): ResolvableHostInterface; + + /** + * Sets conversion options for idn_to_ascii. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). + * + * @see https://www.php.net/manual/en/intl.constants.php + */ + public function withAsciiIDNAOption(int $option): RootZoneDatabaseInterface; + + /** + * Sets conversion options for idn_to_utf8. + * + * combination of IDNA_* constants (except IDNA_ERROR_* constants). + * + * @see https://www.php.net/manual/en/intl.constants.php + */ + public function withUnicodeIDNAOption(int $option): RootZoneDatabaseInterface; +} diff --git a/src/Rules.php b/src/Rules.php index b35efe7b..76e47fd6 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -15,13 +15,6 @@ namespace Pdp; -use JsonSerializable; -use Pdp\Contract\DomainInterface; -use Pdp\Contract\Exception; -use Pdp\Contract\HostInterface; -use Pdp\Contract\PublicSuffixInterface; -use Pdp\Contract\PublicSuffixListSection; -use Pdp\Contract\ResolvableHostInterface; use function array_reverse; use function count; use function fclose; @@ -41,7 +34,7 @@ * @author Jeremy Kendall * @author Ignace Nyamagana Butera */ -final class Rules implements PublicSuffixListSection, JsonSerializable +final class Rules implements PublicSuffixListInterface { private const PSL_SECTION = [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, '']; @@ -235,7 +228,7 @@ public function resolve($domain, string $section = ''): ResolvableHostInterface } return new ResolvableDomain(new Domain($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption)); - } catch (Exception $exception) { + } catch (ExceptionInterface $exception) { return new ResolvableDomain(Domain::fromNull($this->asciiIDNAOption, $this->unicodeIDNAOption)); } } @@ -300,7 +293,7 @@ private function validateDomain($domain): ResolvableHostInterface /** * Assert the section status. * - * @throws Exception if the submitted section is not supported + * @throws ExceptionInterface if the submitted section is not supported */ private function validateSection(string $section): string { diff --git a/src/RulesConverter.php b/src/RulesConverter.php index b3dda5a5..63ffbb30 100644 --- a/src/RulesConverter.php +++ b/src/RulesConverter.php @@ -15,7 +15,6 @@ namespace Pdp; -use Pdp\Contract\Exception; use SplTempFileObject; use function array_pop; use function explode; @@ -105,7 +104,7 @@ private function addRule(array $list, array $ruleParts): array /** @var string $line */ $line = array_pop($ruleParts); $rule = $this->idnToAscii($line); - } catch (Exception $exception) { + } catch (ExceptionInterface $exception) { throw UnableToLoadRules::dueToInvalidRule($line ?? null, $exception); } diff --git a/src/Storage/Cache/TopLevelDomainsCache.php b/src/Storage/Cache/TopLevelDomainsCache.php index e39be2eb..385acf9e 100644 --- a/src/Storage/Cache/TopLevelDomainsCache.php +++ b/src/Storage/Cache/TopLevelDomainsCache.php @@ -15,7 +15,7 @@ namespace Pdp\Storage\Cache; -use Pdp\TopLevelDomains; +use Pdp\RootZoneDatabaseInterface; /** * Top Level Domains Cache Provider. @@ -31,7 +31,7 @@ interface TopLevelDomainsCache /** * Gets the Top Level Domains from the Cache. */ - public function fetchByUri(string $uri): ?TopLevelDomains; + public function fetchByUri(string $uri): ?RootZoneDatabaseInterface; /** * Cache the Top Level Domains List. @@ -40,5 +40,5 @@ public function fetchByUri(string $uri): ?TopLevelDomains; * * Returns true if the refresh was successful, false otherwise */ - public function storeByUri(string $uri, TopLevelDomains $topLevelDomains): bool; + public function storeByUri(string $uri, RootZoneDatabaseInterface $topLevelDomains): bool; } diff --git a/src/Storage/Cache/TopLevelDomainsCachePsr16Adapter.php b/src/Storage/Cache/TopLevelDomainsCachePsr16Adapter.php index e830a0e5..9d2c0809 100644 --- a/src/Storage/Cache/TopLevelDomainsCachePsr16Adapter.php +++ b/src/Storage/Cache/TopLevelDomainsCachePsr16Adapter.php @@ -18,6 +18,7 @@ use DateInterval; use DateTimeImmutable; use DateTimeInterface; +use Pdp\RootZoneDatabaseInterface; use Pdp\TopLevelDomains; use Pdp\UnableToLoadTopLevelDomains; use Psr\Log\LoggerInterface; @@ -101,7 +102,7 @@ private function setTtl($ttl): ?DateInterval * * @throws UnableToLoadTopLevelDomains */ - public function fetchByUri(string $uri): ?TopLevelDomains + public function fetchByUri(string $uri): ?RootZoneDatabaseInterface { $cacheKey = $this->getCacheKey($uri); $cacheData = $this->cache->get($cacheKey); @@ -129,7 +130,7 @@ private function getCacheKey(string $str): string return sprintf('%s_FULL_%s', self::CACHE_PREFIX, md5(strtolower($str))); } - public function storeByUri(string $uri, TopLevelDomains $topLevelDomains): bool + public function storeByUri(string $uri, RootZoneDatabaseInterface $topLevelDomains): bool { try { $result = $this->cache->set($this->getCacheKey($uri), json_encode($topLevelDomains), $this->ttl); diff --git a/src/Storage/Manager.php b/src/Storage/Manager.php index 8e6e1d99..e7e846c8 100644 --- a/src/Storage/Manager.php +++ b/src/Storage/Manager.php @@ -15,6 +15,7 @@ namespace Pdp\Storage; +use Pdp\RootZoneDatabaseInterface; use Pdp\Rules; use Pdp\Storage\Cache\RulesCache; use Pdp\Storage\Cache\TopLevelDomainsCache; @@ -80,7 +81,7 @@ public function getRulesRemoteCopy(string $uri = null): Rules * * @throws UnableToLoadTopLevelDomains */ - public function getTopLevelDomainsLocalCopy(string $uri = null): TopLevelDomains + public function getTopLevelDomainsLocalCopy(string $uri = null): RootZoneDatabaseInterface { $uri = $uri ?? self::RZD_URL; @@ -92,7 +93,7 @@ public function getTopLevelDomainsLocalCopy(string $uri = null): TopLevelDomains * * @throws UnableToLoadTopLevelDomains */ - public function getTopLevelDomainsRemoteCopy(string $uri = null): TopLevelDomains + public function getTopLevelDomainsRemoteCopy(string $uri = null): RootZoneDatabaseInterface { $uri = $uri ?? self::RZD_URL; $topLevelDomains = TopLevelDomains::createFromString($this->http->getContent($uri)); diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 0266c7dd..3e96cc3a 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -15,15 +15,9 @@ namespace Pdp; -use Countable; use DateTime; use DateTimeImmutable; use DateTimeInterface; -use IteratorAggregate; -use JsonSerializable; -use Pdp\Contract\DomainInterface; -use Pdp\Contract\Exception; -use Pdp\Contract\ResolvableHostInterface; use function count; use function fclose; use function fopen; @@ -40,7 +34,7 @@ * * @author Ignace Nyamagana Butera */ -final class TopLevelDomains implements Countable, IteratorAggregate, JsonSerializable +final class TopLevelDomains implements RootZoneDatabaseInterface { private DateTimeImmutable $modifiedDate; @@ -82,7 +76,7 @@ public static function createFromPath( $context = null, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT - ): self { + ): RootZoneDatabaseInterface { $args = [$path, 'r', false]; if (null !== $context) { $args[] = $context; @@ -104,7 +98,7 @@ public static function createFromString( string $content, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT - ): self { + ): RootZoneDatabaseInterface { static $converter; $converter = $converter ?? new TopLevelDomainsConverter(); @@ -126,7 +120,7 @@ public static function createFromJsonString( string $jsonString, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT - ): self { + ): RootZoneDatabaseInterface { $data = json_decode($jsonString, true); $errorCode = json_last_error(); if (JSON_ERROR_NONE !== $errorCode) { @@ -146,7 +140,7 @@ public static function createFromJsonString( /** * {@inheritdoc} */ - public static function __set_state(array $properties): self + public static function __set_state(array $properties): RootZoneDatabaseInterface { return new self( $properties['records'], @@ -246,7 +240,7 @@ public function contains($tld): bool if (!$tld instanceof DomainInterface) { $tld = new Domain($tld, $this->asciiIDNAOption, $this->unicodeIDNAOption); } - } catch (Exception $exception) { + } catch (ExceptionInterface $exception) { return false; } @@ -309,7 +303,7 @@ public function resolve($domain): ResolvableHostInterface * * @see https://www.php.net/manual/en/intl.constants.php */ - public function withAsciiIDNAOption(int $option): self + public function withAsciiIDNAOption(int $option): RootZoneDatabaseInterface { if ($option === $this->asciiIDNAOption) { return $this; @@ -328,7 +322,7 @@ public function withAsciiIDNAOption(int $option): self * * @see https://www.php.net/manual/en/intl.constants.php */ - public function withUnicodeIDNAOption(int $option): self + public function withUnicodeIDNAOption(int $option): RootZoneDatabaseInterface { if ($option === $this->unicodeIDNAOption) { return $this; diff --git a/src/TopLevelDomainsConverter.php b/src/TopLevelDomainsConverter.php index e2efc75c..63d23bc8 100644 --- a/src/TopLevelDomainsConverter.php +++ b/src/TopLevelDomainsConverter.php @@ -16,7 +16,6 @@ namespace Pdp; use DateTimeImmutable; -use Pdp\Contract\Exception; use SplTempFileObject; use function preg_match; use function strpos; @@ -98,7 +97,7 @@ private function extractRootZone(string $content): string { try { $tld = PublicSuffix::fromUnknownSection($content)->toAscii(); - } catch (Exception $exception) { + } catch (ExceptionInterface $exception) { throw UnableToLoadTopLevelDomains::dueToInvalidRootZoneDomain($content, $exception); } diff --git a/src/UnableToLoadRules.php b/src/UnableToLoadRules.php index 9e9e30e0..344c49a2 100644 --- a/src/UnableToLoadRules.php +++ b/src/UnableToLoadRules.php @@ -16,10 +16,9 @@ namespace Pdp; use InvalidArgumentException; -use Pdp\Contract\Exception; use Throwable; -class UnableToLoadRules extends InvalidArgumentException implements Exception +class UnableToLoadRules extends InvalidArgumentException implements ExceptionInterface { public static function dueToInvalidPath(string $path): self { diff --git a/src/UnableToLoadTopLevelDomains.php b/src/UnableToLoadTopLevelDomains.php index b7b30aa6..5c7fdb26 100644 --- a/src/UnableToLoadTopLevelDomains.php +++ b/src/UnableToLoadTopLevelDomains.php @@ -16,10 +16,9 @@ namespace Pdp; use InvalidArgumentException; -use Pdp\Contract\Exception; use Throwable; -class UnableToLoadTopLevelDomains extends InvalidArgumentException implements Exception +class UnableToLoadTopLevelDomains extends InvalidArgumentException implements ExceptionInterface { public static function dueToInvalidHashMap(): self { diff --git a/src/UnableToResolveDomain.php b/src/UnableToResolveDomain.php index 4c55546b..b1a8f503 100644 --- a/src/UnableToResolveDomain.php +++ b/src/UnableToResolveDomain.php @@ -16,10 +16,8 @@ namespace Pdp; use InvalidArgumentException; -use Pdp\Contract\Exception; -use Pdp\Contract\HostInterface; -class UnableToResolveDomain extends InvalidArgumentException implements Exception +class UnableToResolveDomain extends InvalidArgumentException implements ExceptionInterface { private ?HostInterface $domain = null; diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index 086860be..603e649f 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -20,6 +20,7 @@ use Pdp\Domain; use Pdp\InvalidDomain; use Pdp\PublicSuffix; +use Pdp\RootZoneDatabaseInterface; use Pdp\TopLevelDomains; use Pdp\TopLevelDomainsConverter; use Pdp\UnableToLoadTopLevelDomains; @@ -37,7 +38,7 @@ class TopLevelDomainsTest extends TestCase { /** - * @var TopLevelDomains + * @var RootZoneDatabaseInterface */ protected $collection; From 294b75c439d86e3d5050e187cecc6e2d77c6bf42 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 29 Jul 2020 10:56:43 +0200 Subject: [PATCH 201/461] Normalize named constructors --- phpstan.src.neon | 8 +- src/Domain.php | 12 +-- src/DomainInterface.php | 9 -- src/HostInterface.php | 9 +- src/PublicSuffix.php | 13 ++- src/PublicSuffixInterface.php | 4 + ...rter.php => PublicSuffixListConverter.php} | 2 +- src/PublicSuffixListInterface.php | 4 - src/ResolvableHostInterface.php | 2 +- ...esolvableDomain.php => ResolvedDomain.php} | 22 +++-- ...rter.php => RootZoneDatabaseConverter.php} | 4 +- src/Rules.php | 62 ++++++------- src/Storage/Cache/RulesCachePsr16Adapter.php | 2 +- .../TopLevelDomainsCachePsr16Adapter.php | 2 +- src/Storage/Manager.php | 4 +- src/TopLevelDomains.php | 35 +++++--- ....php => PublicSuffixListConverterTest.php} | 14 +-- ...eDomainTest.php => ResolvedDomainTest.php} | 86 +++++++++---------- ....php => RootZoneDatabaseConverterTest.php} | 10 +-- tests/RulesTest.php | 60 ++++++------- tests/TopLevelDomainsTest.php | 22 ++--- 21 files changed, 192 insertions(+), 194 deletions(-) rename src/{RulesConverter.php => PublicSuffixListConverter.php} (98%) rename src/{ResolvableDomain.php => ResolvedDomain.php} (95%) rename src/{TopLevelDomainsConverter.php => RootZoneDatabaseConverter.php} (97%) rename tests/{ConverterTest.php => PublicSuffixListConverterTest.php} (76%) rename tests/{ResolvableDomainTest.php => ResolvedDomainTest.php} (86%) rename tests/{TopLevelDomainsConverterTest.php => RootZoneDatabaseConverterTest.php} (89%) diff --git a/phpstan.src.neon b/phpstan.src.neon index 792f2d6b..81780e82 100644 --- a/phpstan.src.neon +++ b/phpstan.src.neon @@ -12,8 +12,8 @@ parameters: path: src/PublicSuffix.php - message: '#Property Pdp\\TopLevelDomains::\$modifiedDate \(DateTimeImmutable\) does not accept DateTimeInterface.#' path: src/TopLevelDomains.php - - message: '#Method Pdp\\ResolvableDomain::resolve\(\) has parameter \$publicSuffix with no typehint specified.#' - path: src/ResolvableDomain.php - - message: '#Method Pdp\\ResolvableDomain::withSubDomain\(\) has parameter \$subDomain with no typehint specified.#' - path: src/ResolvableDomain.php + - message: '#Method Pdp\\ResolvedDomain::resolve\(\) has parameter \$publicSuffix with no typehint specified.#' + path: src/ResolvedDomain.php + - message: '#Method Pdp\\ResolvedDomain::withSubDomain\(\) has parameter \$subDomain with no typehint specified.#' + path: src/ResolvedDomain.php reportUnmatchedIgnoredErrors: true diff --git a/src/Domain.php b/src/Domain.php index c4c8eb9d..5dcf4821 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -15,7 +15,6 @@ namespace Pdp; -use JsonSerializable; use TypeError; use function array_count_values; use function array_keys; @@ -29,10 +28,9 @@ use function preg_match; use function sprintf; use function strpos; -use function substr; use const IDNA_DEFAULT; -final class Domain extends HostParser implements DomainInterface, JsonSerializable +final class Domain extends HostParser implements DomainInterface { private const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/'; @@ -135,14 +133,6 @@ public function getUnicodeIDNAOption(): int return $this->unicodeIDNAOption; } - public function isResolvable(): bool - { - return null !== $this->domain - && '.' !== substr($this->domain, -1, 1) - && 1 < count($this->labels) - ; - } - public function toAscii(): self { if (null === $this->domain) { diff --git a/src/DomainInterface.php b/src/DomainInterface.php index 4bdd3323..5e42b7e3 100644 --- a/src/DomainInterface.php +++ b/src/DomainInterface.php @@ -65,15 +65,6 @@ public function keys(string $label): array; */ public function getIterator(); - /** - * Tells whether the given domain can be resolved. - * - * A domain is resolvable if: - * - it contains at least 2 labels - * - it is not a absolute domain (end with a '.' character) - */ - public function isResolvable(): bool; - /** * Prepends a label to the domain. * diff --git a/src/HostInterface.php b/src/HostInterface.php index 7fc9c688..f2453f6c 100644 --- a/src/HostInterface.php +++ b/src/HostInterface.php @@ -16,6 +16,7 @@ namespace Pdp; use Countable; +use JsonSerializable; /** * Domain Interface. @@ -24,7 +25,7 @@ * @see https://tools.ietf.org/html/rfc1123#section-2.1 * @see https://tools.ietf.org/html/rfc5890 */ -interface HostInterface extends Countable +interface HostInterface extends Countable, JsonSerializable { /** * Returns the domain content. @@ -38,6 +39,12 @@ public function getContent(): ?string; */ public function count(): int; + /** + * Returns the domain content. + * + */ + public function jsonSerialize(): ?string; + /** * Returns the domain content as a string. */ diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 7cb764cd..7273a67e 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -15,7 +15,6 @@ namespace Pdp; -use JsonSerializable; use function array_reverse; use function count; use function implode; @@ -24,9 +23,9 @@ use function substr; use const IDNA_DEFAULT; -final class PublicSuffix extends HostParser implements JsonSerializable, PublicSuffixInterface +final class PublicSuffix extends HostParser implements PublicSuffixInterface { - private const PSL_SECTION = [PublicSuffixListInterface::PRIVATE_DOMAINS, PublicSuffixListInterface::ICANN_DOMAINS, '']; + private const PSL_SECTION = [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, '']; private ?string $publicSuffix; @@ -73,7 +72,7 @@ public static function __set_state(array $properties): self */ public static function fromICANNSection($publicSuffix = null, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self { - return new self($publicSuffix, PublicSuffixListInterface::ICANN_DOMAINS, $asciiIDNAOption, $unicodeIDNAOption); + return new self($publicSuffix, self::ICANN_DOMAINS, $asciiIDNAOption, $unicodeIDNAOption); } /** @@ -81,7 +80,7 @@ public static function fromICANNSection($publicSuffix = null, int $asciiIDNAOpti */ public static function fromPrivateSection($publicSuffix = null, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self { - return new self($publicSuffix, PublicSuffixListInterface::PRIVATE_DOMAINS, $asciiIDNAOption, $unicodeIDNAOption); + return new self($publicSuffix, self::PRIVATE_DOMAINS, $asciiIDNAOption, $unicodeIDNAOption); } /** @@ -184,12 +183,12 @@ public function isKnown(): bool public function isICANN(): bool { - return PublicSuffixListInterface::ICANN_DOMAINS === $this->section; + return self::ICANN_DOMAINS === $this->section; } public function isPrivate(): bool { - return PublicSuffixListInterface::PRIVATE_DOMAINS === $this->section; + return self::PRIVATE_DOMAINS === $this->section; } public function toAscii(): HostInterface diff --git a/src/PublicSuffixInterface.php b/src/PublicSuffixInterface.php index 590b6cd0..85191586 100644 --- a/src/PublicSuffixInterface.php +++ b/src/PublicSuffixInterface.php @@ -17,6 +17,10 @@ interface PublicSuffixInterface extends HostInterface { + public const ICANN_DOMAINS = 'ICANN_DOMAINS'; + + public const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; + /** * Tells whether the effective TLD has a matching rule in a Public Suffix List. */ diff --git a/src/RulesConverter.php b/src/PublicSuffixListConverter.php similarity index 98% rename from src/RulesConverter.php rename to src/PublicSuffixListConverter.php index 63ffbb30..93ab2062 100644 --- a/src/RulesConverter.php +++ b/src/PublicSuffixListConverter.php @@ -30,7 +30,7 @@ * @author Jeremy Kendall * @author Ignace Nyamagana Butera */ -final class RulesConverter extends HostParser +final class PublicSuffixListConverter extends HostParser { private const PSL_SECTION = [ 'ICANN' => [ diff --git a/src/PublicSuffixListInterface.php b/src/PublicSuffixListInterface.php index b7208668..0e363f9c 100644 --- a/src/PublicSuffixListInterface.php +++ b/src/PublicSuffixListInterface.php @@ -25,10 +25,6 @@ */ interface PublicSuffixListInterface extends JsonSerializable { - public const ICANN_DOMAINS = 'ICANN_DOMAINS'; - - public const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; - public function getAsciiIDNAOption(): int; public function getUnicodeIDNAOption(): int; diff --git a/src/ResolvableHostInterface.php b/src/ResolvableHostInterface.php index acddac72..84020a17 100644 --- a/src/ResolvableHostInterface.php +++ b/src/ResolvableHostInterface.php @@ -17,7 +17,7 @@ interface ResolvableHostInterface extends HostInterface { - public function getDomain(): DomainInterface; + public function getHost(): DomainInterface; public function getPublicSuffix(): PublicSuffixInterface; diff --git a/src/ResolvableDomain.php b/src/ResolvedDomain.php similarity index 95% rename from src/ResolvableDomain.php rename to src/ResolvedDomain.php index ade6a780..eac10198 100644 --- a/src/ResolvableDomain.php +++ b/src/ResolvedDomain.php @@ -15,7 +15,6 @@ namespace Pdp; -use JsonSerializable; use function array_reverse; use function array_slice; use function count; @@ -26,7 +25,7 @@ use function strlen; use function substr; -final class ResolvableDomain implements ResolvableHostInterface, JsonSerializable +final class ResolvedDomain implements ResolvableHostInterface { private const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/'; @@ -86,7 +85,17 @@ private function setPublicSuffix(PublicSuffixInterface $publicSuffix = null): Pu ->withUnicodeIDNAOption($unicodeIDNAOptions); } - if (!$this->domain->isResolvable()) { + $domainContent = $this->domain->getContent(); + + if (null === $domainContent) { + throw UnableToResolveDomain::dueToUnresolvableDomain($this->domain); + } + + if (2 > count($this->domain)) { + throw UnableToResolveDomain::dueToUnresolvableDomain($this->domain); + } + + if ('.' === substr($domainContent, -1, 1)) { throw UnableToResolveDomain::dueToUnresolvableDomain($this->domain); } @@ -167,7 +176,7 @@ public function count(): int return count($this->domain); } - public function getDomain(): DomainInterface + public function getHost(): DomainInterface { return $this->domain; } @@ -212,11 +221,6 @@ public function getPublicSuffix(): PublicSuffixInterface return $this->publicSuffix; } - public function isResolvable(): bool - { - return $this->domain->isResolvable(); - } - public function toAscii(): self { return new self($this->domain->toAscii(), $this->publicSuffix->toAscii()); diff --git a/src/TopLevelDomainsConverter.php b/src/RootZoneDatabaseConverter.php similarity index 97% rename from src/TopLevelDomainsConverter.php rename to src/RootZoneDatabaseConverter.php index 63d23bc8..732a0c0e 100644 --- a/src/TopLevelDomainsConverter.php +++ b/src/RootZoneDatabaseConverter.php @@ -23,13 +23,13 @@ use const DATE_ATOM; /** - * IANA Root Zone Database Parser. + * IANA Root Zone Database Converter. * * This class convert the IANA Root Zone Database into an associative, multidimensional array * * @author Ignace Nyamagana Butera */ -final class TopLevelDomainsConverter +final class RootZoneDatabaseConverter { private const IANA_DATE_FORMAT = 'D M d H:i:s Y e'; diff --git a/src/Rules.php b/src/Rules.php index 76e47fd6..e30d34c3 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -25,6 +25,7 @@ use function json_last_error; use function json_last_error_msg; use function stream_get_contents; +use function substr; use const IDNA_DEFAULT; use const JSON_ERROR_NONE; @@ -36,7 +37,7 @@ */ final class Rules implements PublicSuffixListInterface { - private const PSL_SECTION = [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, '']; + private const PSL_SECTION = [PublicSuffixInterface::PRIVATE_DOMAINS, PublicSuffixInterface::ICANN_DOMAINS, '']; /** * PSL rules as a multidimentional associative array. @@ -64,7 +65,7 @@ private function __construct( * * @throws UnableToLoadRules If the rules can not be loaded from the path */ - public static function createFromPath( + public static function fromPath( string $path, $context = null, int $asciiIDNAOption = IDNA_DEFAULT, @@ -84,25 +85,25 @@ public static function createFromPath( $content = stream_get_contents($resource); fclose($resource); - return self::createFromString($content, $asciiIDNAOption, $unicodeIDNAOption); + return self::fromString($content, $asciiIDNAOption, $unicodeIDNAOption); } /** * Returns a new instance from a string. */ - public static function createFromString( + public static function fromString( string $content, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT ): self { static $converter; - $converter = $converter ?? new RulesConverter(); + $converter = $converter ?? new PublicSuffixListConverter(); return new self($converter->convert($content), $asciiIDNAOption, $unicodeIDNAOption); } - public static function createFromJsonString( + public static function fromJsonString( string $jsonString, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT @@ -152,13 +153,7 @@ public function jsonSerialize(): array */ public function getPublicSuffix($domain, string $section = ''): PublicSuffixInterface { - if (!$domain instanceof ResolvableHostInterface) { - $domain = new ResolvableDomain(new Domain($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption)); - } - - if (!$domain->getDomain()->isResolvable()) { - throw UnableToResolveDomain::dueToUnresolvableDomain($domain); - } + $domain = $this->validateDomain($domain); $publicSuffix = $this->findPublicSuffix($domain, $this->validateSection($section)); @@ -186,7 +181,7 @@ public function getCookieEffectiveTLD($domain): PublicSuffixInterface */ public function getICANNEffectiveTLD($domain): PublicSuffixInterface { - return $this->getPublicSuffix($domain, self::ICANN_DOMAINS); + return $this->getPublicSuffix($domain, PublicSuffixInterface::ICANN_DOMAINS); } /** @@ -198,7 +193,7 @@ public function getICANNEffectiveTLD($domain): PublicSuffixInterface */ public function getPrivateEffectiveTLD($domain): PublicSuffixInterface { - return $this->getPublicSuffix($domain, self::PRIVATE_DOMAINS); + return $this->getPublicSuffix($domain, PublicSuffixInterface::PRIVATE_DOMAINS); } /** @@ -214,7 +209,7 @@ public function resolve($domain, string $section = ''): ResolvableHostInterface return $this->resolveCookieDomain($domain); } - if (self::ICANN_DOMAINS === $section) { + if (PublicSuffixInterface::ICANN_DOMAINS === $section) { return $this->resolveICANNDomain($domain); } @@ -224,12 +219,12 @@ public function resolve($domain, string $section = ''): ResolvableHostInterface /** @var HostInterface */ $domain = $exception->getDomain(); - return new ResolvableDomain($domain); + return new ResolvedDomain($domain); } - return new ResolvableDomain(new Domain($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption)); + return new ResolvedDomain(new Domain($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption)); } catch (ExceptionInterface $exception) { - return new ResolvableDomain(Domain::fromNull($this->asciiIDNAOption, $this->unicodeIDNAOption)); + return new ResolvedDomain(Domain::fromNull($this->asciiIDNAOption, $this->unicodeIDNAOption)); } } @@ -254,7 +249,7 @@ public function resolveICANNDomain($domain): ResolvableHostInterface { $domain = $this->validateDomain($domain); - return $domain->resolve($this->findPublicSuffix($domain, self::ICANN_DOMAINS)); + return $domain->resolve($this->findPublicSuffix($domain, PublicSuffixInterface::ICANN_DOMAINS)); } /** @@ -266,7 +261,7 @@ public function resolvePrivateDomain($domain): ResolvableHostInterface { $domain = $this->validateDomain($domain); - return $domain->resolve($this->findPublicSuffix($domain, self::PRIVATE_DOMAINS)); + return $domain->resolve($this->findPublicSuffix($domain, PublicSuffixInterface::PRIVATE_DOMAINS)); } /** @@ -280,10 +275,19 @@ public function resolvePrivateDomain($domain): ResolvableHostInterface private function validateDomain($domain): ResolvableHostInterface { if (!($domain instanceof ResolvableHostInterface)) { - $domain = new ResolvableDomain(new Domain($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption), null); + $domain = new ResolvedDomain(new Domain($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption), null); + } + + $domainContent = $domain->getContent(); + if (2 > count($domain)) { + throw UnableToResolveDomain::dueToUnresolvableDomain($domain); + } + + if (null === $domainContent) { + throw UnableToResolveDomain::dueToUnresolvableDomain($domain); } - if (!$domain->getDomain()->isResolvable()) { + if ('.' === substr($domainContent, -1, 1)) { throw UnableToResolveDomain::dueToUnresolvableDomain($domain); } @@ -309,20 +313,20 @@ private function validateSection(string $section): string */ private function findPublicSuffix(ResolvableHostInterface $domain, string $section): PublicSuffixInterface { - $asciiDomain = $domain->getDomain(); + $asciiDomain = $domain->getHost(); /** @var DomainInterface $asciiDomain */ $asciiDomain = $asciiDomain->toAscii(); - $icann = $this->findPublicSuffixFromSection($asciiDomain, self::ICANN_DOMAINS); - if (self::ICANN_DOMAINS === $section) { + $icann = $this->findPublicSuffixFromSection($asciiDomain, PublicSuffixInterface::ICANN_DOMAINS); + if (PublicSuffixInterface::ICANN_DOMAINS === $section) { return $icann; } - $private = $this->findPublicSuffixFromSection($asciiDomain, self::PRIVATE_DOMAINS); + $private = $this->findPublicSuffixFromSection($asciiDomain, PublicSuffixInterface::PRIVATE_DOMAINS); if (count($private) > count($icann)) { return $private; } - if (self::PRIVATE_DOMAINS === $section) { + if (PublicSuffixInterface::PRIVATE_DOMAINS === $section) { return PublicSuffix::fromUnknownSection($asciiDomain->label(0), $this->asciiIDNAOption, $this->unicodeIDNAOption); } @@ -363,7 +367,7 @@ private function findPublicSuffixFromSection(DomainInterface $domain, string $se $content = implode('.', array_reverse($matches)); - if (self::PRIVATE_DOMAINS === $section) { + if (PublicSuffixInterface::PRIVATE_DOMAINS === $section) { return PublicSuffix::fromPrivateSection($content, $this->asciiIDNAOption, $this->unicodeIDNAOption); } diff --git a/src/Storage/Cache/RulesCachePsr16Adapter.php b/src/Storage/Cache/RulesCachePsr16Adapter.php index 5f8d1b23..ca86c6c1 100644 --- a/src/Storage/Cache/RulesCachePsr16Adapter.php +++ b/src/Storage/Cache/RulesCachePsr16Adapter.php @@ -107,7 +107,7 @@ public function fetchByUri(string $uri): ?Rules } try { - $rules = Rules::createFromJsonString($cacheData); + $rules = Rules::fromJsonString($cacheData); } catch (Throwable $exception) { $this->cache->delete($cacheKey); $this->logger->warning($exception->getMessage()); diff --git a/src/Storage/Cache/TopLevelDomainsCachePsr16Adapter.php b/src/Storage/Cache/TopLevelDomainsCachePsr16Adapter.php index 9d2c0809..a7c9fb5d 100644 --- a/src/Storage/Cache/TopLevelDomainsCachePsr16Adapter.php +++ b/src/Storage/Cache/TopLevelDomainsCachePsr16Adapter.php @@ -111,7 +111,7 @@ public function fetchByUri(string $uri): ?RootZoneDatabaseInterface } try { - $topLevelDomains = TopLevelDomains::createFromJsonString($cacheData); + $topLevelDomains = TopLevelDomains::fromJsonString($cacheData); } catch (Throwable $exception) { $this->cache->delete($cacheKey); $this->logger->warning($exception->getMessage()); diff --git a/src/Storage/Manager.php b/src/Storage/Manager.php index e7e846c8..91f2a41b 100644 --- a/src/Storage/Manager.php +++ b/src/Storage/Manager.php @@ -69,7 +69,7 @@ public function getRulesLocalCopy(string $url = self::PSL_URL): Rules public function getRulesRemoteCopy(string $uri = null): Rules { $uri = $uri ?? self::PSL_URL; - $rules = Rules::createFromString($this->http->getContent($uri)); + $rules = Rules::fromString($this->http->getContent($uri)); $this->rulesCache->storeByUri($uri, $rules); @@ -96,7 +96,7 @@ public function getTopLevelDomainsLocalCopy(string $uri = null): RootZoneDatabas public function getTopLevelDomainsRemoteCopy(string $uri = null): RootZoneDatabaseInterface { $uri = $uri ?? self::RZD_URL; - $topLevelDomains = TopLevelDomains::createFromString($this->http->getContent($uri)); + $topLevelDomains = TopLevelDomains::fromString($this->http->getContent($uri)); $this->topLevelDomainsCache->storeByUri($uri, $topLevelDomains); diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 3e96cc3a..a97e5fda 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -25,6 +25,7 @@ use function json_last_error; use function json_last_error_msg; use function stream_get_contents; +use function substr; use const DATE_ATOM; use const IDNA_DEFAULT; use const JSON_ERROR_NONE; @@ -71,7 +72,7 @@ private function __construct( * * @throws UnableToLoadTopLevelDomains If the rules can not be loaded from the path */ - public static function createFromPath( + public static function fromPath( string $path, $context = null, int $asciiIDNAOption = IDNA_DEFAULT, @@ -91,17 +92,17 @@ public static function createFromPath( $content = stream_get_contents($resource); fclose($resource); - return self::createFromString($content, $asciiIDNAOption, $unicodeIDNAOption); + return self::fromString($content, $asciiIDNAOption, $unicodeIDNAOption); } - public static function createFromString( + public static function fromString( string $content, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT ): RootZoneDatabaseInterface { static $converter; - $converter = $converter ?? new TopLevelDomainsConverter(); + $converter = $converter ?? new RootZoneDatabaseConverter(); $data = $converter->convert($content); /** @var DateTimeImmutable $modifiedDate */ @@ -116,7 +117,7 @@ public static function createFromString( ); } - public static function createFromJsonString( + public static function fromJsonString( string $jsonString, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT @@ -146,8 +147,8 @@ public static function __set_state(array $properties): RootZoneDatabaseInterface $properties['records'], $properties['version'], $properties['modifiedDate'], - $properties['asciiIDNAOption'] ?? IDNA_DEFAULT, - $properties['unicodeIDNAOption'] ?? IDNA_DEFAULT + $properties['asciiIDNAOption'], + $properties['unicodeIDNAOption'] ); } @@ -268,7 +269,7 @@ public function contains($tld): bool public function resolve($domain): ResolvableHostInterface { if ($domain instanceof ResolvableHostInterface) { - $domain = $domain->getDomain(); + $domain = $domain->getHost(); $domain ->withUnicodeIDNAOption($this->unicodeIDNAOption) ->withAsciiIDNAOption($this->asciiIDNAOption); @@ -278,12 +279,22 @@ public function resolve($domain): ResolvableHostInterface $domain = new Domain($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption); } - /** @var DomainInterface $asciiDomain */ - $asciiDomain = $domain->toAscii(); - if (!$asciiDomain->isResolvable()) { + $domainContent = $domain->getContent(); + if (null === $domainContent) { + throw UnableToResolveDomain::dueToUnresolvableDomain($domain); + } + + if (2 > count($domain)) { throw UnableToResolveDomain::dueToUnresolvableDomain($domain); } + if ('.' === substr($domainContent, -1, 1)) { + throw UnableToResolveDomain::dueToUnresolvableDomain($domain); + } + + /** @var DomainInterface $asciiDomain */ + $asciiDomain = $domain->toAscii(); + $publicSuffix = null; $label = $asciiDomain->label(0); foreach ($this as $tld) { @@ -293,7 +304,7 @@ public function resolve($domain): ResolvableHostInterface } } - return new ResolvableDomain($domain, PublicSuffix::fromUnknownSection($publicSuffix)); + return new ResolvedDomain($domain, PublicSuffix::fromUnknownSection($publicSuffix)); } /** diff --git a/tests/ConverterTest.php b/tests/PublicSuffixListConverterTest.php similarity index 76% rename from tests/ConverterTest.php rename to tests/PublicSuffixListConverterTest.php index 20da0e7e..5f20e183 100644 --- a/tests/ConverterTest.php +++ b/tests/PublicSuffixListConverterTest.php @@ -15,20 +15,20 @@ namespace Pdp\Tests; -use Pdp\RulesConverter; +use Pdp\PublicSuffixListConverter; use Pdp\UnableToLoadRules; use PHPUnit\Framework\TestCase; /** - * @coversDefaultClass \Pdp\RulesConverter + * @coversDefaultClass \Pdp\PublicSuffixListConverter */ -class ConverterTest extends TestCase +class PublicSuffixListConverterTest extends TestCase { public function testConverter(): void { /** @var string $string */ $string = file_get_contents(__DIR__.'/data/public_suffix_list.dat'); - $retval = (new RulesConverter())->convert($string); + $retval = (new PublicSuffixListConverter())->convert($string); self::assertNotEmpty($retval['ICANN_DOMAINS']); self::assertNotEmpty($retval['PRIVATE_DOMAINS']); @@ -41,19 +41,19 @@ public function testConvertThrowsExceptionWithInvalidContent(): void self::expectException(UnableToLoadRules::class); - (new RulesConverter())->convert($content); + (new PublicSuffixListConverter())->convert($content); } public function testConvertWithEmptyString(): void { - $retVal = (new RulesConverter())->convert(''); + $retVal = (new PublicSuffixListConverter())->convert(''); self::assertEquals(['ICANN_DOMAINS' => [], 'PRIVATE_DOMAINS' => []], $retVal); } public function testConvertWithInvalidString(): void { - $retVal = (new RulesConverter())->convert('foobar'); + $retVal = (new PublicSuffixListConverter())->convert('foobar'); self::assertEquals(['ICANN_DOMAINS' => [], 'PRIVATE_DOMAINS' => []], $retVal); } diff --git a/tests/ResolvableDomainTest.php b/tests/ResolvedDomainTest.php similarity index 86% rename from tests/ResolvableDomainTest.php rename to tests/ResolvedDomainTest.php index 5ce135f4..0086434a 100644 --- a/tests/ResolvableDomainTest.php +++ b/tests/ResolvedDomainTest.php @@ -18,7 +18,7 @@ use Pdp\Domain; use Pdp\InvalidDomain; use Pdp\PublicSuffix; -use Pdp\ResolvableDomain; +use Pdp\ResolvedDomain; use Pdp\UnableToResolveDomain; use PHPUnit\Framework\TestCase; use TypeError; @@ -27,9 +27,9 @@ use const IDNA_NONTRANSITIONAL_TO_UNICODE; /** - * @coversDefaultClass \Pdp\ResolvableDomain + * @coversDefaultClass \Pdp\ResolvedDomain */ -class ResolvableDomainTest extends TestCase +class ResolvedDomainTest extends TestCase { /** * @covers ::__construct @@ -42,7 +42,7 @@ class ResolvableDomainTest extends TestCase */ public function testRegistrableDomainIsNullWithFoundDomain(): void { - $domain = new ResolvableDomain(new Domain('faketld')); + $domain = new ResolvedDomain(new Domain('faketld')); self::assertNull($domain->getPublicSuffix()->getContent()); self::assertNull($domain->getRegistrableDomain()->getContent()); self::assertNull($domain->getSubDomain()->getContent()); @@ -60,7 +60,7 @@ public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain(?stri { self::expectException(UnableToResolveDomain::class); - new ResolvableDomain(new Domain($domain), PublicSuffix::fromICANNSection($publicSuffix)); + new ResolvedDomain(new Domain($domain), PublicSuffix::fromICANNSection($publicSuffix)); } public function provideWrongConstructor(): iterable @@ -93,7 +93,7 @@ public function provideWrongConstructor(): iterable */ public function testDomainInternalPhpMethod(): void { - $domain = new ResolvableDomain(new Domain('www.ulb.ac.be'), PublicSuffix::fromICANNSection('ac.be')); + $domain = new ResolvedDomain(new Domain('www.ulb.ac.be'), PublicSuffix::fromICANNSection('ac.be')); $generateDomain = eval('return '.var_export($domain, true).';'); self::assertEquals($domain, $generateDomain); self::assertEquals('"www.ulb.ac.be"', json_encode($domain->jsonSerialize())); @@ -149,11 +149,11 @@ public function testToIDN( ): void { $objPublicSuffix = (null === $publicSuffix) ? PublicSuffix::fromNull() : PublicSuffix::fromICANNSection($publicSuffix); - $domain = new ResolvableDomain(new Domain($domain), $objPublicSuffix); + $domain = new ResolvedDomain(new Domain($domain), $objPublicSuffix); self::assertSame($expectedDomain, $domain->getContent()); self::assertSame($expectedSuffix, $domain->getPublicSuffix()->getContent()); - /** @var ResolvableDomain $domainIDN */ + /** @var ResolvedDomain $domainIDN */ $domainIDN = $domain->toUnicode(); self::assertSame($expectedIDNDomain, $domainIDN->getContent()); self::assertSame($expectedIDNSuffix, $domainIDN->getPublicSuffix()->getContent()); @@ -249,11 +249,11 @@ public function testToAscii( ): void { $objPublicSuffix = (null === $publicSuffix) ? PublicSuffix::fromNull() : PublicSuffix::fromICANNSection($publicSuffix); - $domain = new ResolvableDomain(new Domain($domain), $objPublicSuffix); + $domain = new ResolvedDomain(new Domain($domain), $objPublicSuffix); self::assertSame($expectedDomain, $domain->getContent()); self::assertSame($expectedSuffix, $domain->getPublicSuffix()->getContent()); - /** @var ResolvableDomain $domainIDN */ + /** @var ResolvedDomain $domainIDN */ $domainIDN = $domain->toAscii(); self::assertSame($expectedAsciiDomain, $domainIDN->getContent()); self::assertSame($expectedAsciiSuffix, $domainIDN->getPublicSuffix()->getContent()); @@ -313,7 +313,7 @@ public function toAsciiProvider(): iterable * @param mixed $publicSuffix the public suffix to resolve * @param ?string $expected */ - public function testResolveWorks(ResolvableDomain $domain, $publicSuffix, ?string $expected): void + public function testResolveWorks(ResolvedDomain $domain, $publicSuffix, ?string $expected): void { self::assertSame($expected, $domain->resolve($publicSuffix)->getPublicSuffix()->getContent()); } @@ -321,7 +321,7 @@ public function testResolveWorks(ResolvableDomain $domain, $publicSuffix, ?strin public function resolvePassProvider(): iterable { $publicSuffix = PublicSuffix::fromICANNSection('ac.be'); - $domain = new ResolvableDomain(new Domain('ulb.ac.be'), $publicSuffix); + $domain = new ResolvedDomain(new Domain('ulb.ac.be'), $publicSuffix); return [ 'null public suffix' => [ @@ -350,12 +350,12 @@ public function resolvePassProvider(): iterable 'expected' => 'be', ], 'idn domain name' => [ - 'domain' => new ResolvableDomain(new Domain('Яндекс.РФ'), PublicSuffix::fromICANNSection('рф')), + 'domain' => new ResolvedDomain(new Domain('Яндекс.РФ'), PublicSuffix::fromICANNSection('рф')), 'public suffix' => PublicSuffix::fromICANNSection('рф'), 'expected' => 'рф', ], 'idn domain name with ascii public suffix' => [ - 'domain' => new ResolvableDomain(new Domain('Яндекс.РФ'), PublicSuffix::fromICANNSection('рф')), + 'domain' => new ResolvedDomain(new Domain('Яндекс.РФ'), PublicSuffix::fromICANNSection('рф')), 'public suffix' => PublicSuffix::fromICANNSection('xn--p1ai'), 'expected' => 'рф', ], @@ -366,7 +366,7 @@ public function resolvePassProvider(): iterable * @covers ::resolve * @dataProvider resolveFailsProvider */ - public function testResolveFails(ResolvableDomain $domain, PublicSuffix $publicSuffix): void + public function testResolveFails(ResolvedDomain $domain, PublicSuffix $publicSuffix): void { self::expectException(UnableToResolveDomain::class); $domain->resolve($publicSuffix); @@ -375,7 +375,7 @@ public function testResolveFails(ResolvableDomain $domain, PublicSuffix $publicS public function resolveFailsProvider(): iterable { $publicSuffix = PublicSuffix::fromICANNSection('ac.be'); - $domain = new ResolvableDomain(new Domain('ulb.ac.be'), $publicSuffix); + $domain = new ResolvedDomain(new Domain('ulb.ac.be'), $publicSuffix); return [ 'public suffix mismatch' => [ @@ -383,19 +383,19 @@ public function resolveFailsProvider(): iterable 'public suffix' => PublicSuffix::fromICANNSection('ac.fr'), ], 'domain name can not contains public suffix' => [ - 'domain' => new ResolvableDomain(new Domain('localhost')), + 'domain' => new ResolvedDomain(new Domain('localhost')), 'public suffix' => $publicSuffix, ], 'domain name is equal to public suffix' => [ - 'domain' => new ResolvableDomain(new Domain('ac.be')), + 'domain' => new ResolvedDomain(new Domain('ac.be')), 'public suffix' => $publicSuffix, ], 'partial public suffix' => [ - 'domain' => new ResolvableDomain($domain), + 'domain' => new ResolvedDomain($domain), 'public suffix' => PublicSuffix::fromICANNSection('c.be'), ], 'mismatch idn public suffix' => [ - 'domain' => new ResolvableDomain(new Domain('www.食狮.公司.cn')), + 'domain' => new ResolvedDomain(new Domain('www.食狮.公司.cn')), 'public suffix' => PublicSuffix::fromICANNSection('cn.公司'), ], ]; @@ -407,7 +407,7 @@ public function resolveFailsProvider(): iterable public function testResolveReturnsInstance(): void { $publicSuffix = PublicSuffix::fromICANNSection('ac.be'); - $domain = new ResolvableDomain(new Domain('ulb.ac.be'), $publicSuffix); + $domain = new ResolvedDomain(new Domain('ulb.ac.be'), $publicSuffix); self::assertEquals($domain, $domain->resolve($publicSuffix)); self::assertNotSame($domain, $domain->resolve(PublicSuffix::fromPrivateSection('ac.be'))); } @@ -419,7 +419,7 @@ public function testResolveReturnsInstance(): void * @param mixed $subdomain the subdomain to add * @param ?string $expected */ - public function testWithSubDomainWorks(ResolvableDomain $domain, $subdomain, ?string $expected): void + public function testWithSubDomainWorks(ResolvedDomain $domain, $subdomain, ?string $expected): void { $result = $domain->withSubDomain($subdomain); @@ -432,27 +432,27 @@ public function withSubDomainWorksProvider(): iterable { return [ 'simple addition' => [ - 'domain' => new ResolvableDomain(new Domain('example.com'), PublicSuffix::fromICANNSection('com')), + 'domain' => new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANNSection('com')), 'subdomain' => 'www', 'expected' => 'www', ], 'simple addition IDN (1)' => [ - 'domain' => new ResolvableDomain(new Domain('example.com'), PublicSuffix::fromICANNSection('com')), + 'domain' => new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANNSection('com')), 'subdomain' => new Domain('bébé'), 'expected' => 'xn--bb-bjab', ], 'simple addition IDN (2)' => [ - 'domain' => new ResolvableDomain(new Domain('Яндекс.РФ'), PublicSuffix::fromICANNSection('рф')), + 'domain' => new ResolvedDomain(new Domain('Яндекс.РФ'), PublicSuffix::fromICANNSection('рф')), 'subdomain' => 'bébé', 'expected' => 'bébé', ], 'simple removal' => [ - 'domain' => new ResolvableDomain(new Domain('example.com'), PublicSuffix::fromICANNSection('com')), + 'domain' => new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANNSection('com')), 'subdomain' => null, 'expected' => null, ], 'simple removal IDN' => [ - 'domain' => new ResolvableDomain(new Domain('bébé.Яндекс.РФ'), PublicSuffix::fromICANNSection('рф')), + 'domain' => new ResolvedDomain(new Domain('bébé.Яндекс.РФ'), PublicSuffix::fromICANNSection('рф')), 'subdomain' => 'xn--bb-bjab', 'expected' => 'bébé', ], @@ -466,7 +466,7 @@ public function testWithSubDomainFailsWithNullDomain(): void { self::expectException(UnableToResolveDomain::class); - (new ResolvableDomain(new Domain(null)))->withSubDomain('www'); + (new ResolvedDomain(new Domain(null)))->withSubDomain('www'); } /** @@ -476,7 +476,7 @@ public function testWithSubDomainFailsWithOneLabelDomain(): void { self::expectException(UnableToResolveDomain::class); - (new ResolvableDomain(new Domain('localhost')))->withSubDomain('www'); + (new ResolvedDomain(new Domain('localhost')))->withSubDomain('www'); } /** @@ -486,7 +486,7 @@ public function testWithEmptySubdomain(): void { self::expectException(InvalidDomain::class); - $domain = new ResolvableDomain(new Domain('www.example.com'), PublicSuffix::fromICANNSection('com')); + $domain = new ResolvedDomain(new Domain('www.example.com'), PublicSuffix::fromICANNSection('com')); $domain->withSubDomain(''); } @@ -496,7 +496,7 @@ public function testWithEmptySubdomain(): void public function testWithSubDomainFailsWithNonStringableObject(): void { self::expectException(TypeError::class); - $domain = new ResolvableDomain(new Domain('www.example.com'), PublicSuffix::fromICANNSection('com')); + $domain = new ResolvedDomain(new Domain('www.example.com'), PublicSuffix::fromICANNSection('com')); $domain->withSubDomain(date_create()); } @@ -508,7 +508,7 @@ public function testWithSubDomainWithoutPublicSuffixInfo(): void { self::expectException(UnableToResolveDomain::class); - (new ResolvableDomain(new Domain('www.example.com')))->withSubDomain('www'); + (new ResolvedDomain(new Domain('www.example.com')))->withSubDomain('www'); } /** @@ -519,7 +519,7 @@ public function testWithSubDomainWithoutPublicSuffixInfo(): void * @param ?string $expected */ public function testWithPublicSuffixWorks( - ResolvableDomain $domain, + ResolvedDomain $domain, $publicSuffix, ?string $expected, bool $isKnown, @@ -533,7 +533,7 @@ public function testWithPublicSuffixWorks( public function withPublicSuffixWorksProvider(): iterable { - $base_domain = new ResolvableDomain(new Domain('example.com'), PublicSuffix::fromICANNSection('com')); + $base_domain = new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANNSection('com')); return [ 'simple update (1)' => [ @@ -577,7 +577,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'simple update IDN (2)' => [ - 'domain' => new ResolvableDomain(new Domain('www.bébé.be'), PublicSuffix::fromICANNSection('be')), + 'domain' => new ResolvedDomain(new Domain('www.bébé.be'), PublicSuffix::fromICANNSection('be')), 'publicSuffix' => PublicSuffix::fromICANNSection('xn--p1ai'), 'expected' => 'рф', 'isKnown' => true, @@ -585,7 +585,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'adding the public suffix to a single label domain' => [ - 'domain' => new ResolvableDomain(new Domain('localhost')), + 'domain' => new ResolvedDomain(new Domain('localhost')), 'publicSuffix' => 'www', 'expected' => 'www', 'isKnown' => false, @@ -593,7 +593,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'removing the public suffix list' => [ - 'domain' => new ResolvableDomain(new Domain('www.bébé.be'), PublicSuffix::fromICANNSection('be')), + 'domain' => new ResolvedDomain(new Domain('www.bébé.be'), PublicSuffix::fromICANNSection('be')), 'publicSuffix' => null, 'expected' => null, 'isKnown' => false, @@ -601,7 +601,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'with custom IDNA domain options' =>[ - 'domain' => new ResolvableDomain(new Domain('www.bébé.be', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE), PublicSuffix::fromICANNSection('be')), + 'domain' => new ResolvedDomain(new Domain('www.bébé.be', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE), PublicSuffix::fromICANNSection('be')), 'publicSuffix' => null, 'expected' => null, 'isKnown' => false, @@ -618,7 +618,7 @@ public function testWithPublicSuffixFailsWithNullDomain(): void { self::expectException(InvalidDomain::class); - (new ResolvableDomain(new Domain()))->withPublicSuffix('www'); + (new ResolvedDomain(new Domain()))->withPublicSuffix('www'); } /** @@ -642,7 +642,7 @@ public function testResolveWorksWithCustomIDNAOptions( ?string $expectedWithLabel ): void { $domainHost = new Domain($domainName, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); - $domain = new ResolvableDomain($domainHost, PublicSuffix::fromICANNSection($publicSuffix)); + $domain = new ResolvedDomain($domainHost, PublicSuffix::fromICANNSection($publicSuffix)); self::assertSame($expectedContent, $domain->getContent()); self::assertSame($expectedAscii, $domain->toAscii()->getContent()); @@ -703,19 +703,19 @@ public function resolveCustomIDNAOptionsProvider(): iterable public function testInstanceCreationWithCustomIDNAOptions(): void { - $domain = new ResolvableDomain( + $domain = new ResolvedDomain( new Domain('example.com', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE), PublicSuffix::fromICANNSection('com') ); - /** @var ResolvableDomain $instance */ + /** @var ResolvedDomain $instance */ $instance = $domain->toAscii(); self::assertSame( [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] ); - /** @var ResolvableDomain $instance */ + /** @var ResolvedDomain $instance */ $instance = $domain->toUnicode(); self::assertSame( [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], diff --git a/tests/TopLevelDomainsConverterTest.php b/tests/RootZoneDatabaseConverterTest.php similarity index 89% rename from tests/TopLevelDomainsConverterTest.php rename to tests/RootZoneDatabaseConverterTest.php index a72cd1ef..639755d8 100644 --- a/tests/TopLevelDomainsConverterTest.php +++ b/tests/RootZoneDatabaseConverterTest.php @@ -15,20 +15,20 @@ namespace Pdp\Tests; -use Pdp\TopLevelDomainsConverter; +use Pdp\RootZoneDatabaseConverter; use Pdp\UnableToLoadTopLevelDomains; use PHPUnit\Framework\TestCase; /** - * @coversDefaultClass \Pdp\TopLevelDomainsConverter + * @coversDefaultClass \Pdp\RootZoneDatabaseConverter */ -class TopLevelDomainsConverterTest extends TestCase +class RootZoneDatabaseConverterTest extends TestCase { public function testConverter(): void { /** @var string $string */ $string = file_get_contents(__DIR__.'/data/root_zones.dat'); - $res = (new TopLevelDomainsConverter())->convert($string); + $res = (new RootZoneDatabaseConverter())->convert($string); self::assertArrayHasKey('version', $res); self::assertArrayHasKey('modifiedDate', $res); self::assertArrayHasKey('records', $res); @@ -41,7 +41,7 @@ public function testConverter(): void public function testConverterThrowsException(string $content): void { self::expectException(UnableToLoadTopLevelDomains::class); - (new TopLevelDomainsConverter())->convert($content); + (new RootZoneDatabaseConverter())->convert($content); } public function invalidContentProvider(): iterable diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 6de127ca..71d311d2 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -18,7 +18,8 @@ use Pdp\Domain; use Pdp\InvalidDomain; use Pdp\PublicSuffix; -use Pdp\ResolvableDomain; +use Pdp\PublicSuffixInterface; +use Pdp\ResolvedDomain; use Pdp\Rules; use Pdp\Storage\Cache\Psr16FileCache; use Pdp\Storage\Cache\RulesCachePsr16Adapter; @@ -57,15 +58,15 @@ public function setUp(): void } /** - * @covers ::createFromPath - * @covers ::createFromString + * @covers ::fromPath + * @covers ::fromString * @covers ::__construct */ public function testCreateFromPath(): void { /** @var string $string */ $string = file_get_contents(__DIR__.'/data/public_suffix_list.dat'); - $rulesFromString = Rules::createFromString($string); + $rulesFromString = Rules::fromString($string); $context = stream_context_create([ 'http'=> [ @@ -73,18 +74,18 @@ public function testCreateFromPath(): void 'header' => "Accept-language: en\r\nCookie: foo=bar\r\n", ], ]); - $rulesFromPath = Rules::createFromPath(__DIR__.'/data/public_suffix_list.dat', $context); + $rulesFromPath = Rules::fromPath(__DIR__.'/data/public_suffix_list.dat', $context); self::assertEquals($rulesFromString, $rulesFromPath); } /** - * @covers ::createFromPath + * @covers ::fromPath */ public function testCreateFromPathThrowsException(): void { self::expectException(UnableToLoadRules::class); - Rules::createFromPath('/foo/bar.dat'); + Rules::fromPath('/foo/bar.dat'); } /** @@ -129,7 +130,6 @@ public function testwithIDNAOptions(): void * @covers ::resolvePrivateDomain * @covers ::validateDomain * @covers ::validateSection - * @covers \Pdp\Domain::isResolvable * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\HostParser::parse */ @@ -163,7 +163,6 @@ public function testResolveThrowsExceptionOnWrongDomainType(): void /** * @covers ::resolve * @covers ::validateSection - * @covers \Pdp\Domain::isResolvable * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection @@ -179,7 +178,6 @@ public function testIsSuffixValidFalse(): void /** * @covers ::resolve * @covers ::validateSection - * @covers \Pdp\Domain::isResolvable * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection @@ -190,7 +188,7 @@ public function testIsSuffixValidFalse(): void */ public function testIsSuffixValidTrue(): void { - $domain = $this->rules->resolve('www.example.com', Rules::ICANN_DOMAINS); + $domain = $this->rules->resolve('www.example.com', PublicSuffixInterface::ICANN_DOMAINS); self::assertTrue($domain->getPublicSuffix()->isKnown()); self::assertTrue($domain->getPublicSuffix()->isICANN()); self::assertFalse($domain->getPublicSuffix()->isPrivate()); @@ -201,7 +199,6 @@ public function testIsSuffixValidTrue(): void * @covers ::resolveCookieDomain * @covers ::validateDomain * @covers ::validateSection - * @covers \Pdp\Domain::isResolvable * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection @@ -223,7 +220,6 @@ public function testIsSuffixValidFalseWithPunycoded(): void * @covers ::resolveICANNDomain * @covers ::validateDomain * @covers ::validateSection - * @covers \Pdp\Domain::isResolvable * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection @@ -234,7 +230,7 @@ public function testIsSuffixValidFalseWithPunycoded(): void */ public function testSubDomainIsNull(): void { - $domain = $this->rules->resolve('ulb.ac.be', Rules::ICANN_DOMAINS); + $domain = $this->rules->resolve('ulb.ac.be', PublicSuffixInterface::ICANN_DOMAINS); self::assertTrue($domain->getPublicSuffix()->isKnown()); self::assertTrue($domain->getPublicSuffix()->isICANN()); self::assertFalse($domain->getPublicSuffix()->isPrivate()); @@ -272,7 +268,6 @@ public function testWithPrivateDomain(): void /** * @covers ::resolve - * @covers \Pdp\Domain::isResolvable */ public function testWithAbsoluteHostInvalid(): void { @@ -296,7 +291,7 @@ public function testWithAbsoluteHostInvalid(): void */ public function testWithPrivateDomainInvalid(): void { - $domain = $this->rules->resolve('private.ulb.ac.be', Rules::PRIVATE_DOMAINS); + $domain = $this->rules->resolve('private.ulb.ac.be', PublicSuffixInterface::PRIVATE_DOMAINS); self::assertSame('private.ulb.ac.be', $domain->getContent()); self::assertFalse($domain->getPublicSuffix()->isKnown()); self::assertFalse($domain->getPublicSuffix()->isICANN()); @@ -316,7 +311,7 @@ public function testWithPrivateDomainInvalid(): void */ public function testWithPrivateDomainValid(): void { - $domain = $this->rules->resolve('thephpleague.github.io', Rules::PRIVATE_DOMAINS); + $domain = $this->rules->resolve('thephpleague.github.io', PublicSuffixInterface::PRIVATE_DOMAINS); self::assertSame('thephpleague.github.io', $domain->getContent()); self::assertTrue($domain->getPublicSuffix()->isKnown()); self::assertFalse($domain->getPublicSuffix()->isICANN()); @@ -352,7 +347,7 @@ public function testWithICANNDomainInvalid(): void */ public function testWithDomainObject(): void { - $domain = new ResolvableDomain( + $domain = new ResolvedDomain( new Domain('private.ulb.ac.be'), PublicSuffix::fromICANNSection('ac.be') ); @@ -391,7 +386,7 @@ public function testWithDomainInterfaceObject(): void */ public function testGetRegistrableDomain(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { - $foundRegistrableDomain = $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getRegistrableDomain(); + $foundRegistrableDomain = $this->rules->resolve($domain, PublicSuffixInterface::ICANN_DOMAINS)->getRegistrableDomain(); self::assertSame($registrableDomain, $foundRegistrableDomain->getContent()); } @@ -408,7 +403,7 @@ public function testGetRegistrableDomain(?string $publicSuffix, ?string $registr */ public function testGetPublicSuffix(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { - $effectiveTLD = $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getPublicSuffix(); + $effectiveTLD = $this->rules->resolve($domain, PublicSuffixInterface::ICANN_DOMAINS)->getPublicSuffix(); self::assertSame($publicSuffix, $effectiveTLD->getContent()); } @@ -425,7 +420,7 @@ public function testGetPublicSuffix(?string $publicSuffix, ?string $registrableD */ public function testGetDomain(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { - self::assertSame($expectedDomain, $this->rules->resolve($domain, Rules::ICANN_DOMAINS)->getContent()); + self::assertSame($expectedDomain, $this->rules->resolve($domain, PublicSuffixInterface::ICANN_DOMAINS)->getContent()); } public function parseDataProvider(): iterable @@ -457,7 +452,6 @@ public function parseDataProvider(): iterable /** * @covers ::getPublicSuffix * @covers ::validateSection - * @covers \Pdp\Domain::isResolvable * @covers \Pdp\HostParser::parse * @dataProvider invalidParseProvider */ @@ -470,14 +464,13 @@ public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix(string $dom public function invalidParseProvider(): iterable { return [ - 'single label host' => ['localhost', Rules::ICANN_DOMAINS], + 'single label host' => ['localhost', PublicSuffixInterface::ICANN_DOMAINS], ]; } /** * @covers ::getPublicSuffix * @covers ::validateSection - * @covers \Pdp\Domain::isResolvable * @covers \Pdp\HostParser::parse * @dataProvider invalidDomainParseProvider */ @@ -492,13 +485,13 @@ public function invalidDomainParseProvider(): iterable $long_label = implode('.', array_fill(0, 62, 'a')); return [ - 'IPv6' => ['[::1]', Rules::ICANN_DOMAINS], - 'IPv4' => ['192.168.1.2', Rules::ICANN_DOMAINS], - 'multiple label with URI delimiter' => ['local.ho/st', Rules::ICANN_DOMAINS], - 'invalid host: label too long' => [implode('', array_fill(0, 64, 'a')).'.com', Rules::ICANN_DOMAINS], - 'invalid host: host too long' => ["$long_label.$long_label.$long_label. $long_label.$long_label", Rules::ICANN_DOMAINS], - 'invalid host: invalid label according to RFC3986' => ['www.fußball.com-', Rules::ICANN_DOMAINS], - 'invalid host: host contains space' => ['re view.com', Rules::ICANN_DOMAINS], + 'IPv6' => ['[::1]', PublicSuffixInterface::ICANN_DOMAINS], + 'IPv4' => ['192.168.1.2', PublicSuffixInterface::ICANN_DOMAINS], + 'multiple label with URI delimiter' => ['local.ho/st', PublicSuffixInterface::ICANN_DOMAINS], + 'invalid host: label too long' => [implode('', array_fill(0, 64, 'a')).'.com', PublicSuffixInterface::ICANN_DOMAINS], + 'invalid host: host too long' => ["$long_label.$long_label.$long_label. $long_label.$long_label", PublicSuffixInterface::ICANN_DOMAINS], + 'invalid host: invalid label according to RFC3986' => ['www.fußball.com-', PublicSuffixInterface::ICANN_DOMAINS], + 'invalid host: host contains space' => ['re view.com', PublicSuffixInterface::ICANN_DOMAINS], ]; } @@ -506,7 +499,6 @@ public function invalidDomainParseProvider(): iterable /** * @covers ::getPublicSuffix * @covers ::validateSection - * @covers \Pdp\Domain::isResolvable * @covers \Pdp\HostParser::parse * @dataProvider validPublicSectionProvider * @param ?string $domain @@ -675,7 +667,7 @@ public function testPublicSuffixSpec(): void */ public function testResolveWithIDNAOptions(): void { - $resolvedByDefault = $this->rules->resolve('foo.de', Rules::ICANN_DOMAINS); + $resolvedByDefault = $this->rules->resolve('foo.de', PublicSuffixInterface::ICANN_DOMAINS); self::assertSame( [IDNA_DEFAULT, IDNA_DEFAULT], [$resolvedByDefault->getAsciiIDNAOption(), $resolvedByDefault->getUnicodeIDNAOption()] @@ -691,7 +683,7 @@ public function testResolveWithIDNAOptions(): void ->withAsciiIDNAOption(IDNA_NONTRANSITIONAL_TO_ASCII) ->withUnicodeIDNAOption(IDNA_NONTRANSITIONAL_TO_UNICODE); - $resolved = $rules->resolve('foo.de', Rules::ICANN_DOMAINS); + $resolved = $rules->resolve('foo.de', PublicSuffixInterface::ICANN_DOMAINS); self::assertSame( [$rules->getAsciiIDNAOption(), $rules->getUnicodeIDNAOption()], [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption()] diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index 603e649f..2e0b621c 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -20,9 +20,9 @@ use Pdp\Domain; use Pdp\InvalidDomain; use Pdp\PublicSuffix; +use Pdp\RootZoneDatabaseConverter; use Pdp\RootZoneDatabaseInterface; use Pdp\TopLevelDomains; -use Pdp\TopLevelDomainsConverter; use Pdp\UnableToLoadTopLevelDomains; use Pdp\UnableToResolveDomain; use PHPUnit\Framework\TestCase; @@ -44,12 +44,12 @@ class TopLevelDomainsTest extends TestCase public function setUp(): void { - $this->collection = TopLevelDomains::createFromPath(__DIR__.'/data/tlds-alpha-by-domain.txt'); + $this->collection = TopLevelDomains::fromPath(__DIR__.'/data/tlds-alpha-by-domain.txt'); } /** - * @covers ::createFromPath - * @covers ::createFromString + * @covers ::fromPath + * @covers ::fromString * @covers ::__construct */ public function testCreateFromPath(): void @@ -61,17 +61,17 @@ public function testCreateFromPath(): void ], ]); - $collection = TopLevelDomains::createFromPath(__DIR__.'/data/tlds-alpha-by-domain.txt', $context); + $collection = TopLevelDomains::fromPath(__DIR__.'/data/tlds-alpha-by-domain.txt', $context); self::assertEquals($this->collection, $collection); } /** - * @covers ::createFromPath + * @covers ::fromPath */ public function testCreateFromPathThrowsException(): void { self::expectException(UnableToLoadTopLevelDomains::class); - TopLevelDomains::createFromPath('/foo/bar.dat'); + TopLevelDomains::fromPath('/foo/bar.dat'); } /** @@ -86,7 +86,7 @@ public function testSetState(): void public function testGetterProperties(): void { - $collection = TopLevelDomains::createFromPath(__DIR__.'/data/root_zones.dat'); + $collection = TopLevelDomains::fromPath(__DIR__.'/data/root_zones.dat'); self::assertCount(15, $collection); self::assertSame('2018082200', $collection->getVersion()); self::assertEquals( @@ -95,7 +95,7 @@ public function testGetterProperties(): void ); self::assertFalse($collection->isEmpty()); - $converter = new TopLevelDomainsConverter(); + $converter = new RootZoneDatabaseConverter(); /** @var string $content */ $content = file_get_contents(__DIR__.'/data/root_zones.dat'); $data = $converter->convert($content); @@ -186,7 +186,7 @@ public function testResolveWithUnResolvableDomain(): void public function testResolveWithUnregisteredTLD(): void { - $collection = TopLevelDomains::createFromPath(__DIR__.'/data/root_zones.dat'); + $collection = TopLevelDomains::fromPath(__DIR__.'/data/root_zones.dat'); self::assertNull($collection->resolve('localhost.locale')->getPublicSuffix()->getContent()); } @@ -199,7 +199,7 @@ public function testResolveWithIDNAOptions(): void ] ); - $collection = TopLevelDomains::createFromPath( + $collection = TopLevelDomains::fromPath( __DIR__.'/data/root_zones.dat', null, IDNA_NONTRANSITIONAL_TO_ASCII, From eb46208dddcc909d84d3bfb69960138954508504 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 29 Jul 2020 11:01:34 +0200 Subject: [PATCH 202/461] Rename ResolveHostInterface --- src/PublicSuffixListInterface.php | 14 +++++++------- src/ResolvedDomain.php | 2 +- ...HostInterface.php => ResolvedHostInterface.php} | 2 +- src/RootZoneDatabaseInterface.php | 2 +- src/Rules.php | 14 +++++++------- src/TopLevelDomains.php | 4 ++-- 6 files changed, 19 insertions(+), 19 deletions(-) rename src/{ResolvableHostInterface.php => ResolvedHostInterface.php} (97%) diff --git a/src/PublicSuffixListInterface.php b/src/PublicSuffixListInterface.php index 0e363f9c..bca8a2e0 100644 --- a/src/PublicSuffixListInterface.php +++ b/src/PublicSuffixListInterface.php @@ -36,49 +36,49 @@ public function jsonSerialize(): array; * * @throws ExceptionInterface If the PublicSuffix can not be resolve. */ - public function getCookieEffectiveTLD(ResolvableHostInterface $domain): PublicSuffixInterface; + public function getCookieEffectiveTLD(ResolvedHostInterface $domain): PublicSuffixInterface; /** * Determines the public suffix for a given domain against the PSL rules for ICANN domain detection.. * * @throws ExceptionInterface If the PublicSuffix can not be resolve. */ - public function getICANNEffectiveTLD(ResolvableHostInterface $domain): PublicSuffixInterface; + public function getICANNEffectiveTLD(ResolvedHostInterface $domain): PublicSuffixInterface; /** * Determines the public suffix for a given domain against the PSL rules for private domain detection.. * * @throws ExceptionInterface If the PublicSuffix can not be resolve. */ - public function getPrivateEffectiveTLD(ResolvableHostInterface $domain): PublicSuffixInterface; + public function getPrivateEffectiveTLD(ResolvedHostInterface $domain): PublicSuffixInterface; /** * Returns PSL info for a given domain. * * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolve($domain, string $section = ''): ResolvableHostInterface; + public function resolve($domain, string $section = ''): ResolvedHostInterface; /** * Returns PSL info for a given domain against the PSL rules for cookie domain detection. * * @param mixed $domain the domain value */ - public function resolveCookieDomain($domain): ResolvableHostInterface; + public function resolveCookieDomain($domain): ResolvedHostInterface; /** * Returns PSL info for a given domain against the PSL rules for ICANN domain detection. * * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolveICANNDomain($domain): ResolvableHostInterface; + public function resolveICANNDomain($domain): ResolvedHostInterface; /** * Returns PSL info for a given domain against the PSL rules for private domain detection. * * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolvePrivateDomain($domain): ResolvableHostInterface; + public function resolvePrivateDomain($domain): ResolvedHostInterface; /** * Sets conversion options for idn_to_ascii. diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index eac10198..0711deef 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -25,7 +25,7 @@ use function strlen; use function substr; -final class ResolvedDomain implements ResolvableHostInterface +final class ResolvedDomain implements ResolvedHostInterface { private const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/'; diff --git a/src/ResolvableHostInterface.php b/src/ResolvedHostInterface.php similarity index 97% rename from src/ResolvableHostInterface.php rename to src/ResolvedHostInterface.php index 84020a17..769e3b93 100644 --- a/src/ResolvableHostInterface.php +++ b/src/ResolvedHostInterface.php @@ -15,7 +15,7 @@ namespace Pdp; -interface ResolvableHostInterface extends HostInterface +interface ResolvedHostInterface extends HostInterface { public function getHost(): DomainInterface; diff --git a/src/RootZoneDatabaseInterface.php b/src/RootZoneDatabaseInterface.php index 6e236b1e..c723e36d 100644 --- a/src/RootZoneDatabaseInterface.php +++ b/src/RootZoneDatabaseInterface.php @@ -87,7 +87,7 @@ public function contains($tld): bool; * * @param mixed $domain a domain in a type that can be converted into a DomainInterface instance */ - public function resolve($domain): ResolvableHostInterface; + public function resolve($domain): ResolvedHostInterface; /** * Sets conversion options for idn_to_ascii. diff --git a/src/Rules.php b/src/Rules.php index e30d34c3..2f20af15 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -201,7 +201,7 @@ public function getPrivateEffectiveTLD($domain): PublicSuffixInterface * * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolve($domain, string $section = ''): ResolvableHostInterface + public function resolve($domain, string $section = ''): ResolvedHostInterface { $section = $this->validateSection($section); try { @@ -233,7 +233,7 @@ public function resolve($domain, string $section = ''): ResolvableHostInterface * * @param mixed $domain the domain value */ - public function resolveCookieDomain($domain): ResolvableHostInterface + public function resolveCookieDomain($domain): ResolvedHostInterface { $domain = $this->validateDomain($domain); @@ -245,7 +245,7 @@ public function resolveCookieDomain($domain): ResolvableHostInterface * * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolveICANNDomain($domain): ResolvableHostInterface + public function resolveICANNDomain($domain): ResolvedHostInterface { $domain = $this->validateDomain($domain); @@ -257,7 +257,7 @@ public function resolveICANNDomain($domain): ResolvableHostInterface * * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolvePrivateDomain($domain): ResolvableHostInterface + public function resolvePrivateDomain($domain): ResolvedHostInterface { $domain = $this->validateDomain($domain); @@ -272,9 +272,9 @@ public function resolvePrivateDomain($domain): ResolvableHostInterface * @throws InvalidDomain if the domain is invalid * @throws UnableToResolveDomain if the domain is not resolvable */ - private function validateDomain($domain): ResolvableHostInterface + private function validateDomain($domain): ResolvedHostInterface { - if (!($domain instanceof ResolvableHostInterface)) { + if (!($domain instanceof ResolvedHostInterface)) { $domain = new ResolvedDomain(new Domain($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption), null); } @@ -311,7 +311,7 @@ private function validateSection(string $section): string /** * Returns the matched public suffix. */ - private function findPublicSuffix(ResolvableHostInterface $domain, string $section): PublicSuffixInterface + private function findPublicSuffix(ResolvedHostInterface $domain, string $section): PublicSuffixInterface { $asciiDomain = $domain->getHost(); /** @var DomainInterface $asciiDomain */ diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index a97e5fda..590c2c98 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -266,9 +266,9 @@ public function contains($tld): bool * * @param mixed $domain a domain in a type that can be converted into a DomainInterface instance */ - public function resolve($domain): ResolvableHostInterface + public function resolve($domain): ResolvedHostInterface { - if ($domain instanceof ResolvableHostInterface) { + if ($domain instanceof ResolvedHostInterface) { $domain = $domain->getHost(); $domain ->withUnicodeIDNAOption($this->unicodeIDNAOption) From db1b9df583bd6cd81c95daf2d3093b59ef57e32a Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 29 Jul 2020 11:35:03 +0200 Subject: [PATCH 203/461] Rename exceptions --- bin/update-pdp | 2 +- src/PublicSuffixListConverter.php | 8 +++---- src/RootZoneDatabaseConverter.php | 16 ++++++------- src/Rules.php | 6 ++--- .../TopLevelDomainsCachePsr16Adapter.php | 4 ++-- src/Storage/Installer.php | 6 ++--- src/Storage/Manager.php | 24 +++++++++---------- src/TopLevelDomains.php | 8 +++---- ...s.php => UnableToLoadPublicSuffixList.php} | 2 +- ...s.php => UnableToLoadRootZoneDatabase.php} | 2 +- tests/PublicSuffixListConverterTest.php | 4 ++-- tests/RootZoneDatabaseConverterTest.php | 4 ++-- tests/RulesTest.php | 8 +++---- tests/TopLevelDomainsTest.php | 4 ++-- 14 files changed, 49 insertions(+), 49 deletions(-) rename src/{UnableToLoadRules.php => UnableToLoadPublicSuffixList.php} (91%) rename src/{UnableToLoadTopLevelDomains.php => UnableToLoadRootZoneDatabase.php} (94%) diff --git a/bin/update-pdp b/bin/update-pdp index 34009e77..6365674c 100755 --- a/bin/update-pdp +++ b/bin/update-pdp @@ -109,7 +109,7 @@ if (!extension_loaded('curl')) { $installer = new Installer(new Logger( STDOUT, STDERR)); $output->success("$yellow Updating your Pdp local cache.$reset"); -if ($installer->updateLocalCopies($arguments)) { +if ($installer->updateLocalCache($arguments)) { $output->success("$green Pdp local cache successfully updated. $reset"); die(0); diff --git a/src/PublicSuffixListConverter.php b/src/PublicSuffixListConverter.php index 93ab2062..5064c663 100644 --- a/src/PublicSuffixListConverter.php +++ b/src/PublicSuffixListConverter.php @@ -34,11 +34,11 @@ final class PublicSuffixListConverter extends HostParser { private const PSL_SECTION = [ 'ICANN' => [ - 'BEGIN' => 'ICANN_DOMAINS', + 'BEGIN' => PublicSuffixInterface::ICANN_DOMAINS, 'END' => '', ], 'PRIVATE' => [ - 'BEGIN' => 'PRIVATE_DOMAINS', + 'BEGIN' => PublicSuffixInterface::PRIVATE_DOMAINS, 'END' => '', ], ]; @@ -92,7 +92,7 @@ private function getSection(string $section, string $line): string * @param array $ruleParts One line (rule) from the Public Suffix List * exploded on '.', or the remaining portion of that array during recursion * - * @throws UnableToLoadRules if the domain name can not be converted using IDN to ASCII algorithm + * @throws UnableToLoadPublicSuffixList if the domain name can not be converted using IDN to ASCII algorithm */ private function addRule(array $list, array $ruleParts): array { @@ -105,7 +105,7 @@ private function addRule(array $list, array $ruleParts): array $line = array_pop($ruleParts); $rule = $this->idnToAscii($line); } catch (ExceptionInterface $exception) { - throw UnableToLoadRules::dueToInvalidRule($line ?? null, $exception); + throw UnableToLoadPublicSuffixList::dueToInvalidRule($line ?? null, $exception); } $isDomain = true; diff --git a/src/RootZoneDatabaseConverter.php b/src/RootZoneDatabaseConverter.php index 732a0c0e..422e183d 100644 --- a/src/RootZoneDatabaseConverter.php +++ b/src/RootZoneDatabaseConverter.php @@ -36,7 +36,7 @@ final class RootZoneDatabaseConverter /** * Converts the IANA Root Zone Database into a TopLevelDomains associative array. * - * @throws UnableToLoadTopLevelDomains if the content is invalid or can not be correctly parsed and converted + * @throws UnableToLoadRootZoneDatabase if the content is invalid or can not be correctly parsed and converted */ public function convert(string $content): array { @@ -58,25 +58,25 @@ public function convert(string $content): array continue; } - throw UnableToLoadTopLevelDomains::dueToInvalidLine($line); + throw UnableToLoadRootZoneDatabase::dueToInvalidLine($line); } if (isset($data['version'], $data['modifiedDate'], $data['records'])) { return $data; } - throw UnableToLoadTopLevelDomains::dueToFailedConversion(); + throw UnableToLoadRootZoneDatabase::dueToFailedConversion(); } /** * Extract IANA Root Zone Database header info. * - * @throws UnableToLoadTopLevelDomains if the Header line is invalid + * @throws UnableToLoadRootZoneDatabase if the Header line is invalid */ private function extractHeader(string $content): array { if (1 !== preg_match('/^\# Version (?\d+), Last Updated (?.*?)$/', $content, $matches)) { - throw UnableToLoadTopLevelDomains::dueToInvalidVersionLine($content); + throw UnableToLoadRootZoneDatabase::dueToInvalidVersionLine($content); } /** @var DateTimeImmutable $date */ @@ -91,18 +91,18 @@ private function extractHeader(string $content): array /** * Extract IANA Root Zone. * - * @throws UnableToLoadTopLevelDomains If the Root Zone is invalid + * @throws UnableToLoadRootZoneDatabase If the Root Zone is invalid */ private function extractRootZone(string $content): string { try { $tld = PublicSuffix::fromUnknownSection($content)->toAscii(); } catch (ExceptionInterface $exception) { - throw UnableToLoadTopLevelDomains::dueToInvalidRootZoneDomain($content, $exception); + throw UnableToLoadRootZoneDatabase::dueToInvalidRootZoneDomain($content, $exception); } if (1 !== $tld->count() || '' === $tld->getContent()) { - throw UnableToLoadTopLevelDomains::dueToInvalidRootZoneDomain($content); + throw UnableToLoadRootZoneDatabase::dueToInvalidRootZoneDomain($content); } return (string) $tld; diff --git a/src/Rules.php b/src/Rules.php index 2f20af15..f1f60277 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -63,7 +63,7 @@ private function __construct( * * @param null|resource $context * - * @throws UnableToLoadRules If the rules can not be loaded from the path + * @throws UnableToLoadPublicSuffixList If the rules can not be loaded from the path */ public static function fromPath( string $path, @@ -78,7 +78,7 @@ public static function fromPath( $resource = @fopen(...$args); if (false === $resource) { - throw UnableToLoadRules::dueToInvalidPath($path); + throw UnableToLoadPublicSuffixList::dueToInvalidPath($path); } /** @var string $content */ @@ -111,7 +111,7 @@ public static function fromJsonString( $data = json_decode($jsonString, true); $errorCode = json_last_error(); if (JSON_ERROR_NONE !== $errorCode) { - throw UnableToLoadRules::dueToInvalidJson($errorCode, json_last_error_msg()); + throw UnableToLoadPublicSuffixList::dueToInvalidJson($errorCode, json_last_error_msg()); } return new self($data, $asciiIDNAOption, $unicodeIDNAOption); diff --git a/src/Storage/Cache/TopLevelDomainsCachePsr16Adapter.php b/src/Storage/Cache/TopLevelDomainsCachePsr16Adapter.php index a7c9fb5d..29206708 100644 --- a/src/Storage/Cache/TopLevelDomainsCachePsr16Adapter.php +++ b/src/Storage/Cache/TopLevelDomainsCachePsr16Adapter.php @@ -20,7 +20,7 @@ use DateTimeInterface; use Pdp\RootZoneDatabaseInterface; use Pdp\TopLevelDomains; -use Pdp\UnableToLoadTopLevelDomains; +use Pdp\UnableToLoadRootZoneDatabase; use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; use Psr\SimpleCache\CacheInterface; @@ -100,7 +100,7 @@ private function setTtl($ttl): ?DateInterval /** * Gets the Public Suffix List Rules. * - * @throws UnableToLoadTopLevelDomains + * @throws UnableToLoadRootZoneDatabase */ public function fetchByUri(string $uri): ?RootZoneDatabaseInterface { diff --git a/src/Storage/Installer.php b/src/Storage/Installer.php index df083840..c1ed45fc 100644 --- a/src/Storage/Installer.php +++ b/src/Storage/Installer.php @@ -59,7 +59,7 @@ public function __construct(LoggerInterface $logger = null) /** * Refresh the locale cache. */ - public function updateLocalCopies(array $arguments = []): bool + public function updateLocalCache(array $arguments = []): bool { $context = $arguments + self::DEFAULT_CONTEXT; $context = filter_var_array($context, [ @@ -76,8 +76,8 @@ public function updateLocalCopies(array $arguments = []): bool new TopLevelDomainsCachePsr16Adapter($psr16Cache, $context[self::TTL_KEY], $this->logger), ); - $storage->getRulesRemoteCopy($context[self::URI_KEY_PSL]); - $storage->getTopLevelDomainsRemoteCopy($context[self::URI_KEY_PSL]); + $storage->getPublicSuffixListRemoteCopy($context[self::URI_KEY_PSL]); + $storage->getRootZoneDatabaseRemoteCopy($context[self::URI_KEY_PSL]); } catch (Throwable $exception) { $this->logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); diff --git a/src/Storage/Manager.php b/src/Storage/Manager.php index 91f2a41b..9223dd2c 100644 --- a/src/Storage/Manager.php +++ b/src/Storage/Manager.php @@ -21,8 +21,8 @@ use Pdp\Storage\Cache\TopLevelDomainsCache; use Pdp\Storage\Http\Client; use Pdp\TopLevelDomains; -use Pdp\UnableToLoadRules; -use Pdp\UnableToLoadTopLevelDomains; +use Pdp\UnableToLoadPublicSuffixList; +use Pdp\UnableToLoadRootZoneDatabase; /** * Public Suffix List Manager. @@ -54,19 +54,19 @@ public function __construct(Client $http, RulesCache $rulesCache, TopLevelDomain /** * Gets the Public Suffix List from the Local Storage or the Remote Storage. * - * @throws UnableToLoadRules + * @throws UnableToLoadPublicSuffixList */ - public function getRulesLocalCopy(string $url = self::PSL_URL): Rules + public function getPublicSuffixListLocalCopy(string $url = self::PSL_URL): Rules { - return $this->rulesCache->fetchByUri($url) ?? $this->getRulesRemoteCopy($url); + return $this->rulesCache->fetchByUri($url) ?? $this->getPublicSuffixListRemoteCopy($url); } /** * Gets the Public Suffix List from an the Remote Storage. * - * @throws UnableToLoadRules + * @throws UnableToLoadPublicSuffixList */ - public function getRulesRemoteCopy(string $uri = null): Rules + public function getPublicSuffixListRemoteCopy(string $uri = null): Rules { $uri = $uri ?? self::PSL_URL; $rules = Rules::fromString($this->http->getContent($uri)); @@ -79,21 +79,21 @@ public function getRulesRemoteCopy(string $uri = null): Rules /** * Gets the Top Level Domains from the Local Storage or the Remote Storage. * - * @throws UnableToLoadTopLevelDomains + * @throws UnableToLoadRootZoneDatabase */ - public function getTopLevelDomainsLocalCopy(string $uri = null): RootZoneDatabaseInterface + public function getRootZoneDatabaseLocalCopy(string $uri = null): RootZoneDatabaseInterface { $uri = $uri ?? self::RZD_URL; - return $this->topLevelDomainsCache->fetchByUri($uri) ?? $this->getTopLevelDomainsRemoteCopy($uri); + return $this->topLevelDomainsCache->fetchByUri($uri) ?? $this->getRootZoneDatabaseRemoteCopy($uri); } /** * Gets the Top Level Domains from the Remote Storage. * - * @throws UnableToLoadTopLevelDomains + * @throws UnableToLoadRootZoneDatabase */ - public function getTopLevelDomainsRemoteCopy(string $uri = null): RootZoneDatabaseInterface + public function getRootZoneDatabaseRemoteCopy(string $uri = null): RootZoneDatabaseInterface { $uri = $uri ?? self::RZD_URL; $topLevelDomains = TopLevelDomains::fromString($this->http->getContent($uri)); diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 590c2c98..8a78864b 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -70,7 +70,7 @@ private function __construct( * * @param null|resource $context * - * @throws UnableToLoadTopLevelDomains If the rules can not be loaded from the path + * @throws UnableToLoadRootZoneDatabase If the rules can not be loaded from the path */ public static function fromPath( string $path, @@ -85,7 +85,7 @@ public static function fromPath( $resource = @fopen(...$args); if (false === $resource) { - throw UnableToLoadTopLevelDomains::dueToInvalidPath($path); + throw UnableToLoadRootZoneDatabase::dueToInvalidPath($path); } /** @var string $content */ @@ -125,11 +125,11 @@ public static function fromJsonString( $data = json_decode($jsonString, true); $errorCode = json_last_error(); if (JSON_ERROR_NONE !== $errorCode) { - throw UnableToLoadTopLevelDomains::dueToInvalidJson($errorCode, json_last_error_msg()); + throw UnableToLoadRootZoneDatabase::dueToInvalidJson($errorCode, json_last_error_msg()); } if (!isset($data['records'], $data['version'], $data['modifiedDate'])) { - throw UnableToLoadTopLevelDomains::dueToInvalidHashMap(); + throw UnableToLoadRootZoneDatabase::dueToInvalidHashMap(); } /** @var DateTimeImmutable $modifiedDate */ diff --git a/src/UnableToLoadRules.php b/src/UnableToLoadPublicSuffixList.php similarity index 91% rename from src/UnableToLoadRules.php rename to src/UnableToLoadPublicSuffixList.php index 344c49a2..de01a8aa 100644 --- a/src/UnableToLoadRules.php +++ b/src/UnableToLoadPublicSuffixList.php @@ -18,7 +18,7 @@ use InvalidArgumentException; use Throwable; -class UnableToLoadRules extends InvalidArgumentException implements ExceptionInterface +class UnableToLoadPublicSuffixList extends InvalidArgumentException implements ExceptionInterface { public static function dueToInvalidPath(string $path): self { diff --git a/src/UnableToLoadTopLevelDomains.php b/src/UnableToLoadRootZoneDatabase.php similarity index 94% rename from src/UnableToLoadTopLevelDomains.php rename to src/UnableToLoadRootZoneDatabase.php index 5c7fdb26..0fee707b 100644 --- a/src/UnableToLoadTopLevelDomains.php +++ b/src/UnableToLoadRootZoneDatabase.php @@ -18,7 +18,7 @@ use InvalidArgumentException; use Throwable; -class UnableToLoadTopLevelDomains extends InvalidArgumentException implements ExceptionInterface +class UnableToLoadRootZoneDatabase extends InvalidArgumentException implements ExceptionInterface { public static function dueToInvalidHashMap(): self { diff --git a/tests/PublicSuffixListConverterTest.php b/tests/PublicSuffixListConverterTest.php index 5f20e183..b868bd60 100644 --- a/tests/PublicSuffixListConverterTest.php +++ b/tests/PublicSuffixListConverterTest.php @@ -16,7 +16,7 @@ namespace Pdp\Tests; use Pdp\PublicSuffixListConverter; -use Pdp\UnableToLoadRules; +use Pdp\UnableToLoadPublicSuffixList; use PHPUnit\Framework\TestCase; /** @@ -39,7 +39,7 @@ public function testConvertThrowsExceptionWithInvalidContent(): void /** @var string $content */ $content = file_get_contents(__DIR__.'/data/invalid_suffix_list_content.dat'); - self::expectException(UnableToLoadRules::class); + self::expectException(UnableToLoadPublicSuffixList::class); (new PublicSuffixListConverter())->convert($content); } diff --git a/tests/RootZoneDatabaseConverterTest.php b/tests/RootZoneDatabaseConverterTest.php index 639755d8..ef9ed9bc 100644 --- a/tests/RootZoneDatabaseConverterTest.php +++ b/tests/RootZoneDatabaseConverterTest.php @@ -16,7 +16,7 @@ namespace Pdp\Tests; use Pdp\RootZoneDatabaseConverter; -use Pdp\UnableToLoadTopLevelDomains; +use Pdp\UnableToLoadRootZoneDatabase; use PHPUnit\Framework\TestCase; /** @@ -40,7 +40,7 @@ public function testConverter(): void */ public function testConverterThrowsException(string $content): void { - self::expectException(UnableToLoadTopLevelDomains::class); + self::expectException(UnableToLoadRootZoneDatabase::class); (new RootZoneDatabaseConverter())->convert($content); } diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 71d311d2..e015a3ba 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -26,7 +26,7 @@ use Pdp\Storage\Cache\TopLevelDomainsCachePsr16Adapter; use Pdp\Storage\Http\CurlClient; use Pdp\Storage\Manager; -use Pdp\UnableToLoadRules; +use Pdp\UnableToLoadPublicSuffixList; use Pdp\UnableToResolveDomain; use PHPUnit\Framework\TestCase; use TypeError; @@ -54,7 +54,7 @@ public function setUp(): void new TopLevelDomainsCachePsr16Adapter($psr16Cache) ); - $this->rules = $manager->getRulesLocalCopy(); + $this->rules = $manager->getPublicSuffixListLocalCopy(); } /** @@ -84,7 +84,7 @@ public function testCreateFromPath(): void */ public function testCreateFromPathThrowsException(): void { - self::expectException(UnableToLoadRules::class); + self::expectException(UnableToLoadPublicSuffixList::class); Rules::fromPath('/foo/bar.dat'); } @@ -679,7 +679,7 @@ public function testResolveWithIDNAOptions(): void new TopLevelDomainsCachePsr16Adapter($psr16Cache) ); - $rules = $manager->getRulesLocalCopy() + $rules = $manager->getPublicSuffixListLocalCopy() ->withAsciiIDNAOption(IDNA_NONTRANSITIONAL_TO_ASCII) ->withUnicodeIDNAOption(IDNA_NONTRANSITIONAL_TO_UNICODE); diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index 2e0b621c..c49d3e48 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -23,7 +23,7 @@ use Pdp\RootZoneDatabaseConverter; use Pdp\RootZoneDatabaseInterface; use Pdp\TopLevelDomains; -use Pdp\UnableToLoadTopLevelDomains; +use Pdp\UnableToLoadRootZoneDatabase; use Pdp\UnableToResolveDomain; use PHPUnit\Framework\TestCase; use TypeError; @@ -70,7 +70,7 @@ public function testCreateFromPath(): void */ public function testCreateFromPathThrowsException(): void { - self::expectException(UnableToLoadTopLevelDomains::class); + self::expectException(UnableToLoadRootZoneDatabase::class); TopLevelDomains::fromPath('/foo/bar.dat'); } From e582de92d4258ba8762f8118def68999b86a5538 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 30 Jul 2020 22:56:53 +0200 Subject: [PATCH 204/461] Remove subnamespace Cache and Http --- bin/update-pdp | 144 +++++++++++++----- phpstan.src.neon | 2 + phpstan.tests.neon | 34 ++--- src/Domain.php | 11 +- src/DomainInterface.php | 2 - src/HostInterface.php | 2 - src/HostParser.php | 36 ++--- src/PublicSuffix.php | 20 +-- src/PublicSuffixListConverter.php | 8 - src/PublicSuffixListInterface.php | 8 +- src/RootZoneDatabaseConverter.php | 7 - src/RootZoneDatabaseInterface.php | 5 - src/Rules.php | 19 +-- .../CurlClient.php => CurlHttpClient.php} | 8 +- ...on.php => CurlHttpHttpClientException.php} | 4 +- .../{Http/Client.php => HttpClient.php} | 6 +- ...tException.php => HttpClientException.php} | 4 +- src/Storage/Installer.php | 89 ----------- src/Storage/{Cache => }/Logger.php | 2 +- src/Storage/Manager.php | 7 +- src/Storage/Output.php | 41 ----- .../{Cache => }/Psr16CacheException.php | 2 +- src/Storage/{Cache => }/Psr16FileCache.php | 2 +- src/Storage/{Cache => }/RulesCache.php | 2 +- .../{Cache => }/RulesCachePsr16Adapter.php | 2 +- .../{Cache => }/TopLevelDomainsCache.php | 2 +- .../TopLevelDomainsCachePsr16Adapter.php | 2 +- src/TopLevelDomains.php | 5 - tests/PublicSuffixTest.php | 25 --- tests/RulesTest.php | 138 ++++++++++++----- ...lClientTest.php => CurlHttpClientTest.php} | 20 +-- .../{Cache => }/Psr16FileCacheTest.php | 8 +- 32 files changed, 278 insertions(+), 389 deletions(-) rename src/Storage/{Http/CurlClient.php => CurlHttpClient.php} (88%) rename src/Storage/{Http/CurlClientException.php => CurlHttpHttpClientException.php} (79%) rename src/Storage/{Http/Client.php => HttpClient.php} (85%) rename src/Storage/{Http/ClientException.php => HttpClientException.php} (85%) delete mode 100644 src/Storage/Installer.php rename src/Storage/{Cache => }/Logger.php (98%) delete mode 100644 src/Storage/Output.php rename src/Storage/{Cache => }/Psr16CacheException.php (95%) rename src/Storage/{Cache => }/Psr16FileCache.php (99%) rename src/Storage/{Cache => }/RulesCache.php (97%) rename src/Storage/{Cache => }/RulesCachePsr16Adapter.php (99%) rename src/Storage/{Cache => }/TopLevelDomainsCache.php (97%) rename src/Storage/{Cache => }/TopLevelDomainsCachePsr16Adapter.php (99%) rename tests/Storage/{Http/CurlClientTest.php => CurlHttpClientTest.php} (62%) rename tests/Storage/{Cache => }/Psr16FileCacheTest.php (98%) diff --git a/bin/update-pdp b/bin/update-pdp index 6365674c..76c62062 100755 --- a/bin/update-pdp +++ b/bin/update-pdp @@ -14,9 +14,32 @@ declare(strict_types=1); -use Pdp\Storage\Cache\Logger; -use Pdp\Storage\Installer; -use Pdp\Storage\Output; +use Pdp\Storage\Logger; +use Pdp\Storage\Psr16FileCache; +use Pdp\Storage\RulesCachePsr16Adapter; +use Pdp\Storage\TopLevelDomainsCachePsr16Adapter; +use Pdp\Storage\CurlHttpClient; +use Pdp\Storage\Manager; + +const KEY_CACHE_DIR = 'cache-dir'; +const KEY_URI_PSL = 'psl'; +const KEY_URI_RZD = 'rzd'; +const KEY_TTL = 'ttl'; +const DEFAULT_VALUES = [ + KEY_URI_PSL => 'https://publicsuffix.org/list/public_suffix_list.dat', + KEY_URI_RZD => 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt', + KEY_TTL => '1 DAY', +]; + +function success(string $message): void +{ + fwrite(STDOUT, $message.PHP_EOL); +} + +function fail(string $message): void +{ + fwrite(STDERR, $message.PHP_EOL); +} function get_vendor_path(): ?string { @@ -36,13 +59,12 @@ if (null === $vendor) { You must set up the project dependencies using composer see https://getcomposer.org TEXT; - fwrite(STDERR, $message); + fail($message); die(1); } require $vendor.'/autoload.php'; -$output = new Output(); $default_cache_dir = dirname(__DIR__).'/data'; /** @@ -57,64 +79,114 @@ $yellow = chr(27)."[33m"; $arguments = getopt('h::', [ 'h', 'help', - Installer::CACHE_DIR_KEY.':', - Installer::URI_KEY_PSL.':', - Installer::URI_KEY_RZD.':', - Installer::TTL_KEY.':', -]) + [ - Installer::CACHE_DIR_KEY => $default_cache_dir, - Installer::TTL_KEY => '1 DAY', -]; + KEY_CACHE_DIR.':', + KEY_URI_PSL.':', + KEY_URI_RZD.':', + KEY_TTL.':', +]); -if (isset($arguments['help']) || isset($arguments['h'])) { +if (isset($arguments['help']) || isset($arguments['h']) || [] === $arguments) { $script = basename(__FILE__); $helpText = <<success($helpText); + success(sprintf( + $helpText, + KEY_URI_PSL, + DEFAULT_VALUES[KEY_URI_PSL], + KEY_URI_RZD, + DEFAULT_VALUES[KEY_URI_RZD], + KEY_TTL, + DEFAULT_VALUES[KEY_TTL], + KEY_CACHE_DIR + )); die(0); } if (!extension_loaded('curl')) { - $output->fail("$redbg The required PHP cURL extension is missing. $reset"); + fail("$redbg The required PHP cURL extension is missing. $reset"); die(1); } -$installer = new Installer(new Logger( STDOUT, STDERR)); -$output->success("$yellow Updating your Pdp local cache.$reset"); -if ($installer->updateLocalCache($arguments)) { - $output->success("$green Pdp local cache successfully updated. $reset"); +$context = filter_var_array($arguments + [KEY_CACHE_DIR => $default_cache_dir] + DEFAULT_VALUES, [ + KEY_URI_PSL => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW, 'default' => ''], + KEY_URI_RZD => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW, 'default' => ''], + KEY_TTL => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW], + KEY_CACHE_DIR => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW], +]); + +try { + $logger = new Logger( STDOUT, STDERR); + $cache = new Psr16FileCache($context[KEY_CACHE_DIR]); + $manager = new Manager( + new CurlHttpClient(), + new RulesCachePsr16Adapter($cache, $context[KEY_TTL], $logger), + new TopLevelDomainsCachePsr16Adapter($cache, $context[KEY_TTL], $logger), + ); + +} catch (Throwable $exception) { + if (null !== $logger) { + $logger->error('Local cache update initialisation failed with {exception}', ['exception' => $exception->getMessage()]); + } + fail("$redbg The script failed on initialisation.$reset"); - die(0); + die(1); +} + +success("$yellow Starting updating your local cache.$reset"); +$error = 0; +$pslUri = trim($context[KEY_URI_PSL]); +if ('' !== $pslUri) { + try { + $manager->getPublicSuffixListRemoteCopy($pslUri); + } catch (Throwable $exception) { + $logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); + fail("$redbg The command failed to update the public suffix list local cache. $reset"); + ++$error; + } +} + +$rzdUri = trim($context[KEY_URI_RZD]); +if ('' !== $rzdUri) { + try { + $manager->getRootZoneDatabaseRemoteCopy($context[KEY_URI_RZD]); + } catch (Throwable $exception) { + $logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); + fail("$redbg The command failed to update the root zone database local cache. $reset"); + ++$error; + } } -$output->fail("$redbg The command failed to update Pdp local cache successfully. $reset"); +if (0 === $error) { + success("$green Pdp local cache successfully updated. $reset"); + + die(0); +} die(1); diff --git a/phpstan.src.neon b/phpstan.src.neon index 81780e82..7e58b121 100644 --- a/phpstan.src.neon +++ b/phpstan.src.neon @@ -16,4 +16,6 @@ parameters: path: src/ResolvedDomain.php - message: '#Method Pdp\\ResolvedDomain::withSubDomain\(\) has parameter \$subDomain with no typehint specified.#' path: src/ResolvedDomain.php + - message: '#PHPDoc tag @param for parameter \$domain with type mixed is not subtype of native type Pdp\\HostInterface.#' + path: src/PublicSuffixListInterface.php reportUnmatchedIgnoredErrors: true diff --git a/phpstan.tests.neon b/phpstan.tests.neon index 08525d36..d143abc0 100644 --- a/phpstan.tests.neon +++ b/phpstan.tests.neon @@ -5,21 +5,21 @@ includes: parameters: checkMissingIterableValueType: false ignoreErrors: - - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Cache\\Psr16FileCache::set\(\) expects string, null given.#' - path: tests/Storage/Cache/Psr16FileCacheTest.php - - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Cache\\Psr16FileCache::delete\(\) expects string, null given.#' - path: tests/Storage/Cache/Psr16FileCacheTest.php - - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Cache\\Psr16FileCache::get\(\) expects string, null given.#' - path: tests/Storage/Cache/Psr16FileCacheTest.php - - message: '#Parameter \#3 \$ttl of method Pdp\\Storage\\Cache\\Psr16FileCache::set\(\) expects DateInterval\|int\|null, DateTime\|false given.#' - path: tests/Storage/Cache/Psr16FileCacheTest.php - - message: '#Parameter \#1 \$keys of method Pdp\\Storage\\Cache\\Psr16FileCache::deleteMultiple\(\) expects iterable, null given.#' - path: tests/Storage/Cache/Psr16FileCacheTest.php - - message: '#Parameter \#1 \$keys of method Pdp\\Storage\\Cache\\Psr16FileCache::getMultiple\(\) expects iterable, null given.#' - path: tests/Storage/Cache/Psr16FileCacheTest.php - - message: '#Parameter \#1 \$values of method Pdp\\Storage\\Cache\\Psr16FileCache::setMultiple\(\) expects iterable, null given.#' - path: tests/Storage/Cache/Psr16FileCacheTest.php - - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Cache\\Psr16FileCache::has\(\) expects string, null given.#' - path: tests/Storage/Cache/Psr16FileCacheTest.php + - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Psr16FileCache::set\(\) expects string, null given.#' + path: tests/Storage/Psr16FileCacheTest.php + - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Psr16FileCache::delete\(\) expects string, null given.#' + path: tests/Storage/Psr16FileCacheTest.php + - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Psr16FileCache::get\(\) expects string, null given.#' + path: tests/Storage/Psr16FileCacheTest.php + - message: '#Parameter \#3 \$ttl of method Pdp\\Storage\\Psr16FileCache::set\(\) expects DateInterval\|int\|null, DateTime\|false given.#' + path: tests/Storage/Psr16FileCacheTest.php + - message: '#Parameter \#1 \$keys of method Pdp\\Storage\\Psr16FileCache::deleteMultiple\(\) expects iterable, null given.#' + path: tests/Storage/Psr16FileCacheTest.php + - message: '#Parameter \#1 \$keys of method Pdp\\Storage\\Psr16FileCache::getMultiple\(\) expects iterable, null given.#' + path: tests/Storage/Psr16FileCacheTest.php + - message: '#Parameter \#1 \$values of method Pdp\\Storage\\Psr16FileCache::setMultiple\(\) expects iterable, null given.#' + path: tests/Storage/Psr16FileCacheTest.php + - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Psr16FileCache::has\(\) expects string, null given.#' + path: tests/Storage/Psr16FileCacheTest.php - message: '#Parameter \#1 \$exception of method PHPUnit\\Framework\\TestCase::expectException\(\) expects class-string\, string given.#' - path: tests/Storage/Cache/Psr16FileCacheTest.php + path: tests/Storage/Psr16FileCacheTest.php diff --git a/src/Domain.php b/src/Domain.php index 5dcf4821..24cd7fdb 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -34,13 +34,13 @@ final class Domain extends HostParser implements DomainInterface { private const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/'; - private ?string $domain; - /** * @var array */ private array $labels; + private ?string $domain; + private int $asciiIDNAOption; private int $unicodeIDNAOption; @@ -53,14 +53,13 @@ public function __construct( int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT ) { - $this->asciiIDNAOption = $asciiIDNAOption; - $this->unicodeIDNAOption = $unicodeIDNAOption; - $infos = $this->parse($domain, $asciiIDNAOption, $unicodeIDNAOption); - $this->labels = $infos['labels']; + $this->labels = $this->parse($domain, $asciiIDNAOption, $unicodeIDNAOption); $this->domain = implode('.', array_reverse($this->labels)); if ([] === $this->labels) { $this->domain = null; } + $this->asciiIDNAOption = $asciiIDNAOption; + $this->unicodeIDNAOption = $unicodeIDNAOption; } public static function __set_state(array $properties): self diff --git a/src/DomainInterface.php b/src/DomainInterface.php index 5e42b7e3..70093173 100644 --- a/src/DomainInterface.php +++ b/src/DomainInterface.php @@ -18,8 +18,6 @@ use IteratorAggregate; /** - * Domain Interface. - * * @see https://tools.ietf.org/html/rfc1034#section-3.5 * @see https://tools.ietf.org/html/rfc1123#section-2.1 * @see https://tools.ietf.org/html/rfc5890 diff --git a/src/HostInterface.php b/src/HostInterface.php index f2453f6c..2e07087d 100644 --- a/src/HostInterface.php +++ b/src/HostInterface.php @@ -19,8 +19,6 @@ use JsonSerializable; /** - * Domain Interface. - * * @see https://tools.ietf.org/html/rfc1034#section-3.5 * @see https://tools.ietf.org/html/rfc1123#section-2.1 * @see https://tools.ietf.org/html/rfc5890 diff --git a/src/HostParser.php b/src/HostParser.php index a0e3799e..aa484a2e 100644 --- a/src/HostParser.php +++ b/src/HostParser.php @@ -49,9 +49,6 @@ use const IDNA_ERROR_TRAILING_HYPHEN; use const INTL_IDNA_VARIANT_UTS46; -/** - * @author Ignace Nyamagana Butera - */ abstract class HostParser { /** @@ -98,25 +95,13 @@ private static function getIdnErrors(int $errorByte): string * @throws InvalidDomain if the string can not be converted to ASCII using IDN UTS46 algorithm */ final protected function idnToAscii(string $domain, int $option = IDNA_DEFAULT): string - { - [$domain, ] = $this->transformToAscii($domain, $option); - - return $domain; - } - - /** - * Returns the IDNA ASCII form and its isTransitionalDifferent state. - * - * @throws InvalidDomain if the string can not be converted to ASCII using IDN UTS46 algorithm - */ - private function transformToAscii(string $domain, int $option): array { $domain = rawurldecode($domain); static $pattern = '/[^\x20-\x7f]/'; if (1 !== preg_match($pattern, $domain)) { - return [strtolower($domain), ['isTransitionalDifferent' => false]]; + return strtolower($domain); } $output = idn_to_ascii($domain, $option, INTL_IDNA_VARIANT_UTS46, $infos); @@ -135,7 +120,7 @@ private function transformToAscii(string $domain, int $option): array // @codeCoverageIgnoreEnd if (false === strpos($output, '%')) { - return [$output, $infos]; + return $output; } throw InvalidDomain::dueToInvalidCharacters($domain); @@ -188,11 +173,11 @@ final protected function parse($domain = null, int $asciiOption = 0, int $unicod } if (null === $domain) { - return ['labels' => [], 'isTransitionalDifferent' => false]; + return []; } if ('' === $domain) { - return ['labels' => [''], 'isTransitionalDifferent' => false]; + return ['']; } if (!is_string($domain) && !method_exists($domain, '__toString')) { @@ -216,10 +201,7 @@ final protected function parse($domain = null, int $asciiOption = 0, int $unicod ) ^(?:(?®_name)\.){0,126}(?®_name)\.?$/ix'; if (1 === preg_match($domain_name, $formatted_domain)) { - return [ - 'labels' => array_reverse(explode('.', strtolower($formatted_domain))), - 'isTransitionalDifferent' => false, - ]; + return array_reverse(explode('.', strtolower($formatted_domain))); } // a domain name can not contains URI delimiters or space @@ -234,9 +216,11 @@ final protected function parse($domain = null, int $asciiOption = 0, int $unicod throw InvalidDomain::dueToMalformedLabels($domain); } - [$ascii_domain, $infos] = $this->transformToAscii($domain, $asciiOption); - $infos['labels'] = array_reverse(explode('.', $this->idnToUnicode($ascii_domain, $unicodeOption))); + $ascii_domain = $this->idnToAscii($domain, $asciiOption); + + /** @var array $labels */ + $labels = array_reverse(explode('.', $this->idnToUnicode($ascii_domain, $unicodeOption))); - return $infos; + return $labels; } } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 7273a67e..d779f7b4 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -20,7 +20,6 @@ use function implode; use function in_array; use function reset; -use function substr; use const IDNA_DEFAULT; final class PublicSuffix extends HostParser implements PublicSuffixInterface @@ -37,8 +36,6 @@ final class PublicSuffix extends HostParser implements PublicSuffixInterface private int $unicodeIDNAOption; - private bool $isTransitionalDifferent; - /** * @param mixed|null $publicSuffix a public suffix in a type that is supported */ @@ -48,9 +45,7 @@ private function __construct( int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT ) { - $infos = $this->parse($publicSuffix, $asciiIDNAOption, $unicodeIDNAOption); - $this->labels = $infos['labels']; - $this->isTransitionalDifferent = $infos['isTransitionalDifferent']; + $this->labels = $this->parse($publicSuffix, $asciiIDNAOption, $unicodeIDNAOption); $this->publicSuffix = $this->setPublicSuffix(); $this->section = $this->setSection($section); $this->asciiIDNAOption = $asciiIDNAOption; @@ -153,14 +148,6 @@ public function __toString(): string return (string) $this->publicSuffix; } - public function isResolvable(): bool - { - return null !== $this->publicSuffix - && '.' !== substr($this->publicSuffix, -1, 1) - && 1 < count($this->labels) - ; - } - public function getAsciiIDNAOption(): int { return $this->asciiIDNAOption; @@ -171,11 +158,6 @@ public function getUnicodeIDNAOption(): int return $this->unicodeIDNAOption; } - public function isTransitionalDifferent(): bool - { - return $this->isTransitionalDifferent; - } - public function isKnown(): bool { return '' !== $this->section; diff --git a/src/PublicSuffixListConverter.php b/src/PublicSuffixListConverter.php index 5064c663..5fc5ff4b 100644 --- a/src/PublicSuffixListConverter.php +++ b/src/PublicSuffixListConverter.php @@ -22,14 +22,6 @@ use function strpos; use function substr; -/** - * Public Suffix List Parser. - * - * This class convert the Public Suffix List into an associative, multidimensional array - * - * @author Jeremy Kendall - * @author Ignace Nyamagana Butera - */ final class PublicSuffixListConverter extends HostParser { private const PSL_SECTION = [ diff --git a/src/PublicSuffixListInterface.php b/src/PublicSuffixListInterface.php index bca8a2e0..1f88cc06 100644 --- a/src/PublicSuffixListInterface.php +++ b/src/PublicSuffixListInterface.php @@ -17,12 +17,6 @@ use JsonSerializable; -/** - * A class to resolve domain name against the Public Suffix list. - * - * @author Jeremy Kendall - * @author Ignace Nyamagana Butera - */ interface PublicSuffixListInterface extends JsonSerializable { public function getAsciiIDNAOption(): int; @@ -57,7 +51,7 @@ public function getPrivateEffectiveTLD(ResolvedHostInterface $domain): PublicSuf * * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolve($domain, string $section = ''): ResolvedHostInterface; + public function resolve(HostInterface $domain): ResolvedHostInterface; /** * Returns PSL info for a given domain against the PSL rules for cookie domain detection. diff --git a/src/RootZoneDatabaseConverter.php b/src/RootZoneDatabaseConverter.php index 422e183d..bc09c8a3 100644 --- a/src/RootZoneDatabaseConverter.php +++ b/src/RootZoneDatabaseConverter.php @@ -22,13 +22,6 @@ use function trim; use const DATE_ATOM; -/** - * IANA Root Zone Database Converter. - * - * This class convert the IANA Root Zone Database into an associative, multidimensional array - * - * @author Ignace Nyamagana Butera - */ final class RootZoneDatabaseConverter { private const IANA_DATE_FORMAT = 'D M d H:i:s Y e'; diff --git a/src/RootZoneDatabaseInterface.php b/src/RootZoneDatabaseInterface.php index c723e36d..a9b11e1a 100644 --- a/src/RootZoneDatabaseInterface.php +++ b/src/RootZoneDatabaseInterface.php @@ -20,11 +20,6 @@ use IteratorAggregate; use JsonSerializable; -/** - * A class to resolve domain name against the IANA Root Database. - * - * @author Ignace Nyamagana Butera - */ interface RootZoneDatabaseInterface extends Countable, IteratorAggregate, JsonSerializable { /** diff --git a/src/Rules.php b/src/Rules.php index f1f60277..a11c0ea9 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -29,12 +29,6 @@ use const IDNA_DEFAULT; use const JSON_ERROR_NONE; -/** - * A class to resolve domain name against the Public Suffix list. - * - * @author Jeremy Kendall - * @author Ignace Nyamagana Butera - */ final class Rules implements PublicSuffixListInterface { private const PSL_SECTION = [PublicSuffixInterface::PRIVATE_DOMAINS, PublicSuffixInterface::ICANN_DOMAINS, '']; @@ -201,19 +195,10 @@ public function getPrivateEffectiveTLD($domain): PublicSuffixInterface * * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolve($domain, string $section = ''): ResolvedHostInterface + public function resolve($domain): ResolvedHostInterface { - $section = $this->validateSection($section); try { - if ('' === $section) { - return $this->resolveCookieDomain($domain); - } - - if (PublicSuffixInterface::ICANN_DOMAINS === $section) { - return $this->resolveICANNDomain($domain); - } - - return $this->resolvePrivateDomain($domain); + return $this->resolveCookieDomain($domain); } catch (UnableToResolveDomain $exception) { if ($exception->hasDomain()) { /** @var HostInterface */ diff --git a/src/Storage/Http/CurlClient.php b/src/Storage/CurlHttpClient.php similarity index 88% rename from src/Storage/Http/CurlClient.php rename to src/Storage/CurlHttpClient.php index f3cbb9c1..9750c2d9 100644 --- a/src/Storage/Http/CurlClient.php +++ b/src/Storage/CurlHttpClient.php @@ -13,7 +13,7 @@ declare(strict_types=1); -namespace Pdp\Storage\Http; +namespace Pdp\Storage; use function curl_close; use function curl_errno; @@ -29,7 +29,7 @@ use const CURLOPT_SSL_VERIFYHOST; use const CURLOPT_SSL_VERIFYPEER; -final class CurlClient implements Client +final class CurlHttpClient implements HttpClient { private array $options; @@ -53,7 +53,7 @@ public function __construct(array $options = []) $res = @curl_setopt_array($curl, $this->options); curl_close($curl); if (!$res) { - throw new CurlClientException('Please verify your curl additionnal options'); + throw new CurlHttpHttpClientException('Please verify your curl additionnal options'); } } @@ -71,7 +71,7 @@ public function getContent(string $url): string $message = curl_error($curl); curl_close($curl); if (CURLE_OK !== $code) { - throw new CurlClientException($message, $code); + throw new CurlHttpHttpClientException($message, $code); } return $content; diff --git a/src/Storage/Http/CurlClientException.php b/src/Storage/CurlHttpHttpClientException.php similarity index 79% rename from src/Storage/Http/CurlClientException.php rename to src/Storage/CurlHttpHttpClientException.php index 609807b1..fd9f8dcf 100644 --- a/src/Storage/Http/CurlClientException.php +++ b/src/Storage/CurlHttpHttpClientException.php @@ -13,10 +13,10 @@ declare(strict_types=1); -namespace Pdp\Storage\Http; +namespace Pdp\Storage; use RuntimeException; -class CurlClientException extends RuntimeException implements ClientException +class CurlHttpHttpClientException extends RuntimeException implements HttpClientException { } diff --git a/src/Storage/Http/Client.php b/src/Storage/HttpClient.php similarity index 85% rename from src/Storage/Http/Client.php rename to src/Storage/HttpClient.php index 7b9b8b5e..b5b4cd03 100644 --- a/src/Storage/Http/Client.php +++ b/src/Storage/HttpClient.php @@ -11,7 +11,7 @@ * file that was distributed with this source code. */ -namespace Pdp\Storage\Http; +namespace Pdp\Storage; /** * Interface for http adapters. @@ -24,12 +24,12 @@ * @author William Durand * @author Jeremy Kendall */ -interface Client +interface HttpClient { /** * Returns the content fetched from a given URL. * - * @throws ClientException If an errors occurs while fetching the content from a given URL + * @throws HttpClientException If an errors occurs while fetching the content from a given URL */ public function getContent(string $url): string; } diff --git a/src/Storage/Http/ClientException.php b/src/Storage/HttpClientException.php similarity index 85% rename from src/Storage/Http/ClientException.php rename to src/Storage/HttpClientException.php index 32988d61..7fee7507 100644 --- a/src/Storage/Http/ClientException.php +++ b/src/Storage/HttpClientException.php @@ -13,10 +13,10 @@ declare(strict_types=1); -namespace Pdp\Storage\Http; +namespace Pdp\Storage; use Throwable; -interface ClientException extends Throwable +interface HttpClientException extends Throwable { } diff --git a/src/Storage/Installer.php b/src/Storage/Installer.php deleted file mode 100644 index c1ed45fc..00000000 --- a/src/Storage/Installer.php +++ /dev/null @@ -1,89 +0,0 @@ - - */ -final class Installer -{ - public const CACHE_DIR_KEY = 'cache-dir'; - public const URI_KEY_PSL = 'psl'; - public const URI_KEY_RZD = 'rzd'; - public const TTL_KEY = 'ttl'; - public const DEFAULT_CONTEXT = [ - self::CACHE_DIR_KEY => '', - self::URI_KEY_PSL => null, - self::URI_KEY_RZD => null, - self::TTL_KEY => '1 DAY', - ]; - - public const DEFAULT_REMOTE_URI = [ - self::URI_KEY_PSL => 'https://publicsuffix.org/list/public_suffix_list.dat', - self::URI_KEY_RZD => 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt', - ]; - - private LoggerInterface $logger; - - public function __construct(LoggerInterface $logger = null) - { - $this->logger = $logger ?? new NullLogger(); - } - - /** - * Refresh the locale cache. - */ - public function updateLocalCache(array $arguments = []): bool - { - $context = $arguments + self::DEFAULT_CONTEXT; - $context = filter_var_array($context, [ - self::URI_KEY_PSL => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW, 'default' => self::DEFAULT_REMOTE_URI[self::URI_KEY_PSL]], - self::URI_KEY_RZD => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW, 'default' => self::DEFAULT_REMOTE_URI[self::URI_KEY_RZD]], - self::TTL_KEY => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW, 'default' => '1 DAY'], - ]); - - try { - $psr16Cache = new Psr16FileCache($context[self::CACHE_DIR_KEY]); - $storage = new Manager( - new CurlClient(), - new RulesCachePsr16Adapter($psr16Cache, $context[self::TTL_KEY], $this->logger), - new TopLevelDomainsCachePsr16Adapter($psr16Cache, $context[self::TTL_KEY], $this->logger), - ); - - $storage->getPublicSuffixListRemoteCopy($context[self::URI_KEY_PSL]); - $storage->getRootZoneDatabaseRemoteCopy($context[self::URI_KEY_PSL]); - } catch (Throwable $exception) { - $this->logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); - - return false; - } - - return true; - } -} diff --git a/src/Storage/Cache/Logger.php b/src/Storage/Logger.php similarity index 98% rename from src/Storage/Cache/Logger.php rename to src/Storage/Logger.php index f42b6d10..28dcf5a3 100644 --- a/src/Storage/Cache/Logger.php +++ b/src/Storage/Logger.php @@ -13,7 +13,7 @@ declare(strict_types=1); -namespace Pdp\Storage\Cache; +namespace Pdp\Storage; use Psr\Log\AbstractLogger; use Psr\Log\LogLevel; diff --git a/src/Storage/Manager.php b/src/Storage/Manager.php index 9223dd2c..2ebdc920 100644 --- a/src/Storage/Manager.php +++ b/src/Storage/Manager.php @@ -17,9 +17,6 @@ use Pdp\RootZoneDatabaseInterface; use Pdp\Rules; -use Pdp\Storage\Cache\RulesCache; -use Pdp\Storage\Cache\TopLevelDomainsCache; -use Pdp\Storage\Http\Client; use Pdp\TopLevelDomains; use Pdp\UnableToLoadPublicSuffixList; use Pdp\UnableToLoadRootZoneDatabase; @@ -38,13 +35,13 @@ final class Manager public const PSL_URL = 'https://publicsuffix.org/list/public_suffix_list.dat'; private const RZD_URL = 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt'; - private Client $http; + private HttpClient $http; private RulesCache $rulesCache; private TopLevelDomainsCache $topLevelDomainsCache; - public function __construct(Client $http, RulesCache $rulesCache, TopLevelDomainsCache $topLevelDomainsCache) + public function __construct(HttpClient $http, RulesCache $rulesCache, TopLevelDomainsCache $topLevelDomainsCache) { $this->http = $http; $this->rulesCache = $rulesCache; diff --git a/src/Storage/Output.php b/src/Storage/Output.php deleted file mode 100644 index 6a2470ce..00000000 --- a/src/Storage/Output.php +++ /dev/null @@ -1,41 +0,0 @@ - - */ final class TopLevelDomains implements RootZoneDatabaseInterface { private DateTimeImmutable $modifiedDate; diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 2ef31ba4..dd50f373 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -196,8 +196,6 @@ public function countableProvider(): iterable } /** - * @covers ::isTransitionalDifferent - * * @dataProvider customIDNAProvider */ public function testResolveWithCustomIDNAOptions( @@ -248,29 +246,6 @@ public function customIDNAProvider(): iterable ]; } - /** - * @covers ::isTransitionalDifferent - * - * @dataProvider transitionalProvider - */ - public function testIsTransitionalDifference(PublicSuffix $publicSuffix, bool $expected): void - { - self::assertSame($expected, $publicSuffix->isTransitionalDifferent()); - } - - public function transitionalProvider(): iterable - { - return [ - 'simple' => [PublicSuffix::fromUnknownSection('example.com'), false], - 'idna' => [PublicSuffix::fromUnknownSection('français.fr'), false], - 'in domain' => [PublicSuffix::fromUnknownSection('faß.de'), true], - 'in domain 2' => [PublicSuffix::fromUnknownSection('βόλος.com'), true], - 'in domain 3' => [PublicSuffix::fromUnknownSection('ශ්‍රී.com'), true], - 'in domain 4' => [PublicSuffix::fromUnknownSection('نامه‌ای.com'), true], - 'in label' => [PublicSuffix::fromUnknownSection('faß.test.de'), true], - ]; - } - /** * @covers ::getAsciiIDNAOption * @covers ::getUnicodeIDNAOption diff --git a/tests/RulesTest.php b/tests/RulesTest.php index e015a3ba..b70ed81e 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -21,11 +21,11 @@ use Pdp\PublicSuffixInterface; use Pdp\ResolvedDomain; use Pdp\Rules; -use Pdp\Storage\Cache\Psr16FileCache; -use Pdp\Storage\Cache\RulesCachePsr16Adapter; -use Pdp\Storage\Cache\TopLevelDomainsCachePsr16Adapter; -use Pdp\Storage\Http\CurlClient; +use Pdp\Storage\CurlHttpClient; use Pdp\Storage\Manager; +use Pdp\Storage\Psr16FileCache; +use Pdp\Storage\RulesCachePsr16Adapter; +use Pdp\Storage\TopLevelDomainsCachePsr16Adapter; use Pdp\UnableToLoadPublicSuffixList; use Pdp\UnableToResolveDomain; use PHPUnit\Framework\TestCase; @@ -38,7 +38,7 @@ /** * @coversDefaultClass \Pdp\Rules */ -class RulesTest extends TestCase +final class RulesTest extends TestCase { /** * @var Rules @@ -49,7 +49,7 @@ public function setUp(): void { $psr16Cache = new Psr16FileCache(__DIR__.'/data'); $manager = new Manager( - new CurlClient(), + new CurlHttpClient(), new RulesCachePsr16Adapter($psr16Cache), new TopLevelDomainsCachePsr16Adapter($psr16Cache) ); @@ -150,16 +150,6 @@ public function testThrowsTypeErrorOnWrongInput(): void $this->rules->resolve(date_create()); } - /** - * @covers ::resolve - * @covers ::validateSection - */ - public function testResolveThrowsExceptionOnWrongDomainType(): void - { - self::expectException(UnableToResolveDomain::class); - $this->rules->resolve('www.example.com', 'foobar'); - } - /** * @covers ::resolve * @covers ::validateSection @@ -188,7 +178,7 @@ public function testIsSuffixValidFalse(): void */ public function testIsSuffixValidTrue(): void { - $domain = $this->rules->resolve('www.example.com', PublicSuffixInterface::ICANN_DOMAINS); + $domain = $this->rules->resolve('www.example.com'); self::assertTrue($domain->getPublicSuffix()->isKnown()); self::assertTrue($domain->getPublicSuffix()->isICANN()); self::assertFalse($domain->getPublicSuffix()->isPrivate()); @@ -230,7 +220,7 @@ public function testIsSuffixValidFalseWithPunycoded(): void */ public function testSubDomainIsNull(): void { - $domain = $this->rules->resolve('ulb.ac.be', PublicSuffixInterface::ICANN_DOMAINS); + $domain = $this->rules->resolve('ulb.ac.be'); self::assertTrue($domain->getPublicSuffix()->isKnown()); self::assertTrue($domain->getPublicSuffix()->isICANN()); self::assertFalse($domain->getPublicSuffix()->isPrivate()); @@ -291,7 +281,7 @@ public function testWithAbsoluteHostInvalid(): void */ public function testWithPrivateDomainInvalid(): void { - $domain = $this->rules->resolve('private.ulb.ac.be', PublicSuffixInterface::PRIVATE_DOMAINS); + $domain = $this->rules->resolvePrivateDomain('private.ulb.ac.be'); self::assertSame('private.ulb.ac.be', $domain->getContent()); self::assertFalse($domain->getPublicSuffix()->isKnown()); self::assertFalse($domain->getPublicSuffix()->isICANN()); @@ -311,7 +301,7 @@ public function testWithPrivateDomainInvalid(): void */ public function testWithPrivateDomainValid(): void { - $domain = $this->rules->resolve('thephpleague.github.io', PublicSuffixInterface::PRIVATE_DOMAINS); + $domain = $this->rules->resolvePrivateDomain('thephpleague.github.io'); self::assertSame('thephpleague.github.io', $domain->getContent()); self::assertTrue($domain->getPublicSuffix()->isKnown()); self::assertFalse($domain->getPublicSuffix()->isICANN()); @@ -386,7 +376,7 @@ public function testWithDomainInterfaceObject(): void */ public function testGetRegistrableDomain(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { - $foundRegistrableDomain = $this->rules->resolve($domain, PublicSuffixInterface::ICANN_DOMAINS)->getRegistrableDomain(); + $foundRegistrableDomain = $this->rules->resolve($domain)->getRegistrableDomain(); self::assertSame($registrableDomain, $foundRegistrableDomain->getContent()); } @@ -403,7 +393,7 @@ public function testGetRegistrableDomain(?string $publicSuffix, ?string $registr */ public function testGetPublicSuffix(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { - $effectiveTLD = $this->rules->resolve($domain, PublicSuffixInterface::ICANN_DOMAINS)->getPublicSuffix(); + $effectiveTLD = $this->rules->resolve($domain)->getPublicSuffix(); self::assertSame($publicSuffix, $effectiveTLD->getContent()); } @@ -420,7 +410,7 @@ public function testGetPublicSuffix(?string $publicSuffix, ?string $registrableD */ public function testGetDomain(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { - self::assertSame($expectedDomain, $this->rules->resolve($domain, PublicSuffixInterface::ICANN_DOMAINS)->getContent()); + self::assertSame($expectedDomain, $this->rules->resolve($domain)->getContent()); } public function parseDataProvider(): iterable @@ -428,24 +418,92 @@ public function parseDataProvider(): iterable return [ // public suffix, registrable domain, domain // BEGIN https://github.com/jeremykendall/php-domain-parser/issues/16 - 'com tld' => ['com', 'example.com', 'us.example.com', 'us.example.com'], - 'na tld' => ['na', 'example.na', 'us.example.na', 'us.example.na'], - 'us.na tld' => ['us.na', 'example.us.na', 'www.example.us.na', 'www.example.us.na'], - 'org tld' => ['org', 'example.org', 'us.example.org', 'us.example.org'], - 'biz tld (1)' => ['biz', 'broken.biz', 'webhop.broken.biz', 'webhop.broken.biz'], - 'biz tld (2)' => ['biz', 'webhop.biz', 'www.broken.webhop.biz', 'www.broken.webhop.biz'], + 'com tld' => [ + 'publicSuffix' => 'com', + 'registrableDomain' => 'example.com', + 'domain' => 'us.example.com', + 'expectedDomain' => 'us.example.com', + ], + 'na tld' => [ + 'publicSuffix' => 'na', + 'registrableDomain' => 'example.na', + 'domain' => 'us.example.na', + 'expectedDomain' => 'us.example.na', + ], + 'us.na tld' => [ + 'publicSuffix' => 'us.na', + 'registrableDomain' => 'example.us.na', + 'domain' => 'www.example.us.na', + 'expectedDomain' => 'www.example.us.na', + ], + 'org tld' => [ + 'publicSuffix' => 'org', + 'registrableDomain' => 'example.org', + 'domain' => 'us.example.org', + 'expectedDomain' => 'us.example.org', + ], + 'biz tld (1)' => [ + 'publicSuffix' => 'biz', + 'registrableDomain' => 'broken.biz', + 'domain' => 'webhop.broken.biz', + 'expectedDomain' => 'webhop.broken.biz', + ], + 'biz tld (2)' => [ + 'publicSuffix' => 'webhop.biz', + 'registrableDomain' => 'broken.webhop.biz', + 'domain' => 'www.broken.webhop.biz', + 'expectedDomain' => 'www.broken.webhop.biz', + ], // END https://github.com/jeremykendall/php-domain-parser/issues/16 // Test ipv6 URL - 'IP (1)' => [null, null, '[::1]', null], - 'IP (2)' => [null, null, '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', null], - 'IP (3)' => [null, null, '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', null], + 'IP (1)' => [ + 'publicSuffix' => null, + 'registrableDomain' => null, + 'domain' => '[::1]', + 'expectedDomain' => null, ], + 'IP (2)' => [ + 'publicSuffix' => null, + 'registrableDomain' => null, + 'domain' => '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', + 'expectedDomain' => null, + ], + 'IP (3)' => [ + 'publicSuffix' => null, + 'registrableDomain' => null, + 'domain' => '[2001:db8:85a3:8d3:1319:8a2e:370:7348]', + 'expectedDomain' => null, + ], // Test IP address: Fixes #43 - 'IP (4)' => [null, null, '192.168.1.2', null], + 'IP (4)' => [ + 'publicSuffix' => null, + 'registrableDomain' => null, + 'domain' => '192.168.1.2', + 'expectedDomain' => null, + ], // Link-local addresses and zone indices - 'IP (5)' => [null, null, '[fe80::3%25eth0]', null], - 'IP (6)' => [null, null, '[fe80::1%2511]', null], - 'fake tld' => ['faketld', 'example.faketld', 'example.faketld', 'example.faketld'], - 'fake tld with space' => [null, null, 'fake.t ld', null], + 'IP (5)' => [ + 'publicSuffix' => null, + 'registrableDomain' => null, + 'domain' => '[fe80::3%25eth0]', + 'expectedDomain' => null, ], + 'IP (6)' => [ + 'publicSuffix' => null, + 'registrableDomain' => null, + 'domain' => '[fe80::1%2511]', + 'expectedDomain' => null, + ], + 'fake tld' => [ + 'publicSuffix' => 'faketld', + 'registrableDomain' => 'example.faketld', + 'domain' => 'example.faketld', + 'expectedDomain' => 'example.faketld', + ], + 'fake tld with space' => [ + 'publicSuffix' => null, + 'registrableDomain' => null, + 'domain' => 'fake.t ld', + 'expectedDomain' => null, + ], ]; } @@ -667,14 +725,14 @@ public function testPublicSuffixSpec(): void */ public function testResolveWithIDNAOptions(): void { - $resolvedByDefault = $this->rules->resolve('foo.de', PublicSuffixInterface::ICANN_DOMAINS); + $resolvedByDefault = $this->rules->resolve('foo.de'); self::assertSame( [IDNA_DEFAULT, IDNA_DEFAULT], [$resolvedByDefault->getAsciiIDNAOption(), $resolvedByDefault->getUnicodeIDNAOption()] ); $psr16Cache = new Psr16FileCache(__DIR__.'/data'); $manager = new Manager( - new CurlClient(), + new CurlHttpClient(), new RulesCachePsr16Adapter($psr16Cache), new TopLevelDomainsCachePsr16Adapter($psr16Cache) ); @@ -683,7 +741,7 @@ public function testResolveWithIDNAOptions(): void ->withAsciiIDNAOption(IDNA_NONTRANSITIONAL_TO_ASCII) ->withUnicodeIDNAOption(IDNA_NONTRANSITIONAL_TO_UNICODE); - $resolved = $rules->resolve('foo.de', PublicSuffixInterface::ICANN_DOMAINS); + $resolved = $rules->resolve('foo.de'); self::assertSame( [$rules->getAsciiIDNAOption(), $rules->getUnicodeIDNAOption()], [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption()] diff --git a/tests/Storage/Http/CurlClientTest.php b/tests/Storage/CurlHttpClientTest.php similarity index 62% rename from tests/Storage/Http/CurlClientTest.php rename to tests/Storage/CurlHttpClientTest.php index 92621852..8a5936d1 100644 --- a/tests/Storage/Http/CurlClientTest.php +++ b/tests/Storage/CurlHttpClientTest.php @@ -13,16 +13,16 @@ declare(strict_types=1); -namespace Pdp\Tests\Storage\Http; +namespace Pdp\Tests\Storage; -use Pdp\Storage\Http\CurlClient; -use Pdp\Storage\Http\CurlClientException; +use Pdp\Storage\CurlHttpClient; +use Pdp\Storage\CurlHttpHttpClientException; use PHPUnit\Framework\TestCase; /** - * @coversDefaultClass \Pdp\Storage\Http\CurlClient + * @coversDefaultClass \Pdp\Storage\CurlHttpClient */ -class CurlClientTest extends TestCase +final class CurlHttpClientTest extends TestCase { /** * @covers ::__construct @@ -30,7 +30,7 @@ class CurlClientTest extends TestCase */ public function testGetContent(): void { - $content = (new CurlClient())->getContent('https://www.google.com'); + $content = (new CurlHttpClient())->getContent('https://www.google.com'); self::assertStringContainsString('google', $content); } @@ -41,8 +41,8 @@ public function testGetContent(): void */ public function testThrowsException(): void { - self::expectException(CurlClientException::class); - (new CurlClient())->getContent('https://qsfsdfqdf.dfsf'); + self::expectException(CurlHttpHttpClientException::class); + (new CurlHttpClient())->getContent('https://qsfsdfqdf.dfsf'); } /** @@ -50,7 +50,7 @@ public function testThrowsException(): void */ public function testConstructorThrowsException(): void { - self::expectException(CurlClientException::class); - new CurlClient(['foo' => 'bar']); + self::expectException(CurlHttpHttpClientException::class); + new CurlHttpClient(['foo' => 'bar']); } } diff --git a/tests/Storage/Cache/Psr16FileCacheTest.php b/tests/Storage/Psr16FileCacheTest.php similarity index 98% rename from tests/Storage/Cache/Psr16FileCacheTest.php rename to tests/Storage/Psr16FileCacheTest.php index 638d15c5..502c54b0 100644 --- a/tests/Storage/Cache/Psr16FileCacheTest.php +++ b/tests/Storage/Psr16FileCacheTest.php @@ -13,14 +13,14 @@ declare(strict_types=1); -namespace Pdp\Tests\Storage\Cache; +namespace Pdp\Tests\Storage; use DateInterval; use Generator; use Iterator; use org\bovigo\vfs\vfsStream; -use Pdp\Storage\Cache\Psr16CacheException; -use Pdp\Storage\Cache\Psr16FileCache; +use Pdp\Storage\Psr16CacheException; +use Pdp\Storage\Psr16FileCache; use PHPUnit\Framework\TestCase; use Psr\SimpleCache\InvalidArgumentException; use function dirname; @@ -38,7 +38,7 @@ final class Psr16FileCacheTest extends TestCase { /** - * @var \Pdp\Storage\Cache\Psr16FileCache + * @var \Pdp\Storage\Psr16FileCache */ protected $cache; From c3fdc1a2b091deb2f891ab7a37b1e73d05dceb27 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 30 Jul 2020 23:54:41 +0200 Subject: [PATCH 205/461] Adding an InvalidHost exception class --- src/HostInterface.php | 4 ++-- src/HostParser.php | 31 +++++++++++++++--------------- src/InvalidDomain.php | 24 ++--------------------- src/InvalidHost.php | 36 +++++++++++++++++++++++++++++++++++ tests/DomainTest.php | 10 +++++++--- tests/PublicSuffixTest.php | 5 +++-- tests/ResolvedDomainTest.php | 7 ++++--- tests/RulesTest.php | 32 +++++++++++++++++++++++++++---- tests/TopLevelDomainsTest.php | 4 ++-- 9 files changed, 100 insertions(+), 53 deletions(-) create mode 100644 src/InvalidHost.php diff --git a/src/HostInterface.php b/src/HostInterface.php index 2e07087d..48c090f8 100644 --- a/src/HostInterface.php +++ b/src/HostInterface.php @@ -73,8 +73,8 @@ public function getUnicodeIDNAOption(): int; * an instance with its content converted to its IDNA ASCII form * * @throws ExceptionInterface if the domain can not be converted to ASCII using IDN UTS46 algorithm - * @return static * + * @return static */ public function toAscii(): self; @@ -85,8 +85,8 @@ public function toAscii(): self; * an instance with its content converted to its IDNA UTF8 form * * @throws ExceptionInterface if the domain can not be converted to Unicode using IDN UTS46 algorithm - * @return static * + * @return static */ public function toUnicode(): self; diff --git a/src/HostParser.php b/src/HostParser.php index aa484a2e..4d2d03f9 100644 --- a/src/HostParser.php +++ b/src/HostParser.php @@ -92,7 +92,7 @@ private static function getIdnErrors(int $errorByte): string * * This method returns the string converted to IDN ASCII form * - * @throws InvalidDomain if the string can not be converted to ASCII using IDN UTS46 algorithm + * @throws InvalidHost if the string can not be converted to ASCII using IDN UTS46 algorithm */ final protected function idnToAscii(string $domain, int $option = IDNA_DEFAULT): string { @@ -106,11 +106,11 @@ final protected function idnToAscii(string $domain, int $option = IDNA_DEFAULT): $output = idn_to_ascii($domain, $option, INTL_IDNA_VARIANT_UTS46, $infos); if ([] === $infos) { - throw InvalidDomain::dueToIDNAError($domain); + throw InvalidHost::dueToIDNAError($domain); } if (0 !== $infos['errors']) { - throw InvalidDomain::dueToIDNAError($domain, self::getIdnErrors($infos['errors'])); + throw InvalidHost::dueToIDNAError($domain, self::getIdnErrors($infos['errors'])); } // @codeCoverageIgnoreStart @@ -123,7 +123,7 @@ final protected function idnToAscii(string $domain, int $option = IDNA_DEFAULT): return $output; } - throw InvalidDomain::dueToInvalidCharacters($domain); + throw InvalidHost::dueToInvalidCharacters($domain); } /** @@ -131,18 +131,18 @@ final protected function idnToAscii(string $domain, int $option = IDNA_DEFAULT): * * This method returns the string converted to IDN UNICODE form * - * @throws InvalidDomain if the string can not be converted to UNICODE using IDN UTS46 algorithm + * @throws InvalidHost if the string can not be converted to UNICODE using IDN UTS46 algorithm * @throws UnexpectedValueException if the intl extension is misconfigured */ final protected function idnToUnicode(string $domain, int $option = IDNA_DEFAULT): string { $output = idn_to_utf8($domain, $option, INTL_IDNA_VARIANT_UTS46, $info); if ([] === $info) { - throw InvalidDomain::dueToIDNAError($domain); + throw InvalidHost::dueToIDNAError($domain); } if (0 !== $info['errors']) { - throw InvalidDomain::dueToIDNAError($domain, self::getIdnErrors($info['errors'])); + throw InvalidHost::dueToIDNAError($domain, self::getIdnErrors($info['errors'])); } // @codeCoverageIgnoreStart @@ -164,7 +164,8 @@ final protected function idnToUnicode(string $domain, int $option = IDNA_DEFAULT * * @param mixed $domain a domain * - * @throws InvalidDomain If the domain is invalid + * @throws InvalidHost If the domain is not a host + * @throws InvalidDomain If the host is not a domain */ final protected function parse($domain = null, int $asciiOption = 0, int $unicodeOption = 0): array { @@ -212,15 +213,15 @@ final protected function parse($domain = null, int $asciiOption = 0, int $unicod // if the domain name does not contains UTF-8 chars then it is malformed static $pattern = '/[^\x20-\x7f]/'; - if (1 !== preg_match($pattern, $formatted_domain)) { - throw InvalidDomain::dueToMalformedLabels($domain); - } + if (1 === preg_match($pattern, $formatted_domain)) { + $ascii_domain = $this->idnToAscii($domain, $asciiOption); - $ascii_domain = $this->idnToAscii($domain, $asciiOption); + /** @var array $labels */ + $labels = array_reverse(explode('.', $this->idnToUnicode($ascii_domain, $unicodeOption))); - /** @var array $labels */ - $labels = array_reverse(explode('.', $this->idnToUnicode($ascii_domain, $unicodeOption))); + return $labels; + } - return $labels; + throw InvalidDomain::dueToInvalidCharacters($domain); } } diff --git a/src/InvalidDomain.php b/src/InvalidDomain.php index 1cab67ea..aeb9cd43 100644 --- a/src/InvalidDomain.php +++ b/src/InvalidDomain.php @@ -15,38 +15,18 @@ namespace Pdp; -use InvalidArgumentException; use function sprintf; -class InvalidDomain extends InvalidArgumentException implements ExceptionInterface +class InvalidDomain extends InvalidHost { public static function dueToInvalidLabelKey(int $key): self { return new self(sprintf('the given key `%s` is invalid', $key)); } - public static function dueToUnsupportedLabelType(): self - { - return new self('The label can not be NULL'); - } - public static function dueToInvalidCharacters(string $domain): self { - return new self(sprintf('The host `%s` is invalid: it contains invalid characters', $domain)); - } - - public static function dueToIDNAError(string $domain, string $message = ''): self - { - if ('' === $message) { - return new self(sprintf('The host `%s` is invalid', $domain)); - } - - return new self(sprintf('The host `%s` is invalid : %s', $domain, $message)); - } - - public static function dueToMalformedLabels(string $domain): self - { - return new self(sprintf('The domain `%s` is invalid: the labels are malformed', $domain)); + return new self(sprintf('The domain `%s` is invalid: it contains invalid characters', $domain)); } public static function dueToUnsupportedType(string $domain): self diff --git a/src/InvalidHost.php b/src/InvalidHost.php new file mode 100644 index 00000000..4ae06877 --- /dev/null +++ b/src/InvalidHost.php @@ -0,0 +1,36 @@ +toUnicode(); } @@ -367,7 +370,8 @@ public function testWithLabelFailsWithInvalidKey(): void */ public function testWithLabelFailsWithInvalidLabel2(): void { - self::expectException(InvalidDomain::class); + self::expectException(InvalidHost::class); + (new Domain('example.com'))->withLabel(-1, ''); } diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index dd50f373..114c180d 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -17,6 +17,7 @@ use InvalidArgumentException; use Pdp\InvalidDomain; +use Pdp\InvalidHost; use Pdp\PublicSuffix; use PHPUnit\Framework\TestCase; use function json_encode; @@ -123,7 +124,7 @@ public function invalidPublicSuffixProvider(): iterable */ public function testPSToAsciiThrowsException(): void { - self::expectException(InvalidDomain::class); + self::expectException(InvalidHost::class); PublicSuffix::fromUnknownSection('a⒈com'); } @@ -134,7 +135,7 @@ public function testPSToAsciiThrowsException(): void */ public function testToUnicodeThrowsException(): void { - self::expectException(InvalidDomain::class); + self::expectException(InvalidHost::class); PublicSuffix::fromUnknownSection('xn--a-ecp.ru')->toUnicode(); } diff --git a/tests/ResolvedDomainTest.php b/tests/ResolvedDomainTest.php index 0086434a..fede1090 100644 --- a/tests/ResolvedDomainTest.php +++ b/tests/ResolvedDomainTest.php @@ -16,7 +16,7 @@ namespace Pdp\Tests; use Pdp\Domain; -use Pdp\InvalidDomain; +use Pdp\InvalidHost; use Pdp\PublicSuffix; use Pdp\ResolvedDomain; use Pdp\UnableToResolveDomain; @@ -484,9 +484,10 @@ public function testWithSubDomainFailsWithOneLabelDomain(): void */ public function testWithEmptySubdomain(): void { - self::expectException(InvalidDomain::class); + self::expectException(InvalidHost::class); $domain = new ResolvedDomain(new Domain('www.example.com'), PublicSuffix::fromICANNSection('com')); + $domain->withSubDomain(''); } @@ -616,7 +617,7 @@ public function withPublicSuffixWorksProvider(): iterable */ public function testWithPublicSuffixFailsWithNullDomain(): void { - self::expectException(InvalidDomain::class); + self::expectException(InvalidHost::class); (new ResolvedDomain(new Domain()))->withPublicSuffix('www'); } diff --git a/tests/RulesTest.php b/tests/RulesTest.php index b70ed81e..8899890d 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -17,6 +17,7 @@ use Pdp\Domain; use Pdp\InvalidDomain; +use Pdp\InvalidHost; use Pdp\PublicSuffix; use Pdp\PublicSuffixInterface; use Pdp\ResolvedDomain; @@ -30,7 +31,9 @@ use Pdp\UnableToResolveDomain; use PHPUnit\Framework\TestCase; use TypeError; +use function array_fill; use function file_get_contents; +use function implode; use const IDNA_DEFAULT; use const IDNA_NONTRANSITIONAL_TO_ASCII; use const IDNA_NONTRANSITIONAL_TO_UNICODE; @@ -530,26 +533,47 @@ public function invalidParseProvider(): iterable * @covers ::getPublicSuffix * @covers ::validateSection * @covers \Pdp\HostParser::parse + * * @dataProvider invalidDomainParseProvider */ public function testGetPublicSuffixThrowsInvalidDomainException(string $domain, string $section): void { self::expectException(InvalidDomain::class); + $this->rules->getPublicSuffix($domain, $section); } public function invalidDomainParseProvider(): iterable { - $long_label = implode('.', array_fill(0, 62, 'a')); - return [ 'IPv6' => ['[::1]', PublicSuffixInterface::ICANN_DOMAINS], 'IPv4' => ['192.168.1.2', PublicSuffixInterface::ICANN_DOMAINS], - 'multiple label with URI delimiter' => ['local.ho/st', PublicSuffixInterface::ICANN_DOMAINS], 'invalid host: label too long' => [implode('', array_fill(0, 64, 'a')).'.com', PublicSuffixInterface::ICANN_DOMAINS], - 'invalid host: host too long' => ["$long_label.$long_label.$long_label. $long_label.$long_label", PublicSuffixInterface::ICANN_DOMAINS], + ]; + } + + /** + * @covers ::getPublicSuffix + * @covers ::validateSection + * @covers \Pdp\HostParser::parse + * + * @dataProvider invalidHostParseProvider + */ + public function testGetPublicSuffixThrowsInvalidHostException(string $domain, string $section): void + { + self::expectException(InvalidHost::class); + $this->rules->getPublicSuffix($domain, $section); + } + + public function invalidHostParseProvider(): iterable + { + $long_label = implode('.', array_fill(0, 62, 'a')); + + return [ + 'multiple label with URI delimiter' => ['local.ho/st', PublicSuffixInterface::ICANN_DOMAINS], 'invalid host: invalid label according to RFC3986' => ['www.fußball.com-', PublicSuffixInterface::ICANN_DOMAINS], 'invalid host: host contains space' => ['re view.com', PublicSuffixInterface::ICANN_DOMAINS], + 'invalid host: host too long' => ["$long_label.$long_label.$long_label. $long_label.$long_label", PublicSuffixInterface::ICANN_DOMAINS], ]; } diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index c49d3e48..07fac5e5 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -18,7 +18,7 @@ use DateTimeImmutable; use DateTimeZone; use Pdp\Domain; -use Pdp\InvalidDomain; +use Pdp\InvalidHost; use Pdp\PublicSuffix; use Pdp\RootZoneDatabaseConverter; use Pdp\RootZoneDatabaseInterface; @@ -172,7 +172,7 @@ public function testResolveThrowsTypeError(): void public function testResolveWithInvalidDomain(): void { - self::expectException(InvalidDomain::class); + self::expectException(InvalidHost::class); $this->collection->resolve('###'); } From 491626b37d450fe3cb5f329435493f60a290acb2 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 31 Jul 2020 15:00:07 +0200 Subject: [PATCH 206/461] Rename storage related classes --- bin/update-pdp | 64 ++++++------------- src/Storage/CurlHttpClient.php | 4 +- ...eption.php => CurlHttpClientException.php} | 2 +- src/Storage/Manager.php | 15 +---- ...lesCache.php => PublicSuffixListCache.php} | 11 +--- ... => PublicSuffixListCachePsr16Adapter.php} | 11 +--- ...insCache.php => RootZoneDatabaseCache.php} | 11 +--- ... => RootZoneDatabaseCachePsr16Adapter.php} | 11 +--- tests/RulesTest.php | 12 ++-- tests/Storage/CurlHttpClientTest.php | 6 +- 10 files changed, 39 insertions(+), 108 deletions(-) rename src/Storage/{CurlHttpHttpClientException.php => CurlHttpClientException.php} (83%) rename src/Storage/{RulesCache.php => PublicSuffixListCache.php} (74%) rename src/Storage/{RulesCachePsr16Adapter.php => PublicSuffixListCachePsr16Adapter.php} (92%) rename src/Storage/{TopLevelDomainsCache.php => RootZoneDatabaseCache.php} (74%) rename src/Storage/{TopLevelDomainsCachePsr16Adapter.php => RootZoneDatabaseCachePsr16Adapter.php} (92%) diff --git a/bin/update-pdp b/bin/update-pdp index 76c62062..f492dffc 100755 --- a/bin/update-pdp +++ b/bin/update-pdp @@ -16,20 +16,14 @@ declare(strict_types=1); use Pdp\Storage\Logger; use Pdp\Storage\Psr16FileCache; -use Pdp\Storage\RulesCachePsr16Adapter; -use Pdp\Storage\TopLevelDomainsCachePsr16Adapter; +use Pdp\Storage\PublicSuffixListCachePsr16Adapter; +use Pdp\Storage\RootZoneDatabaseCachePsr16Adapter; use Pdp\Storage\CurlHttpClient; use Pdp\Storage\Manager; const KEY_CACHE_DIR = 'cache-dir'; -const KEY_URI_PSL = 'psl'; -const KEY_URI_RZD = 'rzd'; const KEY_TTL = 'ttl'; -const DEFAULT_VALUES = [ - KEY_URI_PSL => 'https://publicsuffix.org/list/public_suffix_list.dat', - KEY_URI_RZD => 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt', - KEY_TTL => '1 DAY', -]; +const DEFAULT_TTL = '1 DAY'; function success(string $message): void { @@ -80,8 +74,6 @@ $arguments = getopt('h::', [ 'h', 'help', KEY_CACHE_DIR.':', - KEY_URI_PSL.':', - KEY_URI_RZD.':', KEY_TTL.':', ]); @@ -92,8 +84,6 @@ if (isset($arguments['help']) || isset($arguments['h']) || [] === $arguments) { $script [options] {$yellow}Options:$reset -$green --%s=URL$reset set the URL to use to refresh the Public Suffix List ({$yellow}default:$reset '%s') -$green --%s=URL$reset set the URL to use to refresh the Root Zone Database ({$yellow}default:$reset '%s') $green --%s=TTL$reset set the TTL for the cache ({$yellow}default:$reset '%s') $green --%s=PATH$reset set the cache root directory ({$yellow}default:$reset '$default_cache_dir') $green -h, --help$reset show the following help message @@ -108,20 +98,13 @@ $green -h, --help$reset show the following help message Refresh all the cache using another cache directory $green$script --cache-dir=/temp$reset - Refresh all the cache using another Public Suffix List URI but with the default URI for the Root Zone Database - $green$script --psl="https://example.com/public-suffix-list"$reset - Read more at https://github.com/jeremykendall/php-domain-parser/ HELP; success(sprintf( $helpText, - KEY_URI_PSL, - DEFAULT_VALUES[KEY_URI_PSL], - KEY_URI_RZD, - DEFAULT_VALUES[KEY_URI_RZD], KEY_TTL, - DEFAULT_VALUES[KEY_TTL], + DEFAULT_TTL, KEY_CACHE_DIR )); @@ -134,9 +117,7 @@ if (!extension_loaded('curl')) { die(1); } -$context = filter_var_array($arguments + [KEY_CACHE_DIR => $default_cache_dir] + DEFAULT_VALUES, [ - KEY_URI_PSL => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW, 'default' => ''], - KEY_URI_RZD => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW, 'default' => ''], +$context = filter_var_array($arguments + [KEY_CACHE_DIR => $default_cache_dir, KEY_TTL => DEFAULT_TTL], [ KEY_TTL => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW], KEY_CACHE_DIR => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW], ]); @@ -146,8 +127,8 @@ try { $cache = new Psr16FileCache($context[KEY_CACHE_DIR]); $manager = new Manager( new CurlHttpClient(), - new RulesCachePsr16Adapter($cache, $context[KEY_TTL], $logger), - new TopLevelDomainsCachePsr16Adapter($cache, $context[KEY_TTL], $logger), + new PublicSuffixListCachePsr16Adapter($cache, $context[KEY_TTL], $logger), + new RootZoneDatabaseCachePsr16Adapter($cache, $context[KEY_TTL], $logger), ); } catch (Throwable $exception) { @@ -161,26 +142,21 @@ try { success("$yellow Starting updating your local cache.$reset"); $error = 0; -$pslUri = trim($context[KEY_URI_PSL]); -if ('' !== $pslUri) { - try { - $manager->getPublicSuffixListRemoteCopy($pslUri); - } catch (Throwable $exception) { - $logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); - fail("$redbg The command failed to update the public suffix list local cache. $reset"); - ++$error; - } + +try { + $manager->getPublicSuffixListRemoteCopy(); +} catch (Throwable $exception) { + $logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); + fail("$redbg The command failed to update the public suffix list local cache. $reset"); + ++$error; } -$rzdUri = trim($context[KEY_URI_RZD]); -if ('' !== $rzdUri) { - try { - $manager->getRootZoneDatabaseRemoteCopy($context[KEY_URI_RZD]); - } catch (Throwable $exception) { - $logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); - fail("$redbg The command failed to update the root zone database local cache. $reset"); - ++$error; - } +try { + $manager->getRootZoneDatabaseRemoteCopy(); +} catch (Throwable $exception) { + $logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); + fail("$redbg The command failed to update the root zone database local cache. $reset"); + ++$error; } if (0 === $error) { diff --git a/src/Storage/CurlHttpClient.php b/src/Storage/CurlHttpClient.php index 9750c2d9..6502f7b5 100644 --- a/src/Storage/CurlHttpClient.php +++ b/src/Storage/CurlHttpClient.php @@ -53,7 +53,7 @@ public function __construct(array $options = []) $res = @curl_setopt_array($curl, $this->options); curl_close($curl); if (!$res) { - throw new CurlHttpHttpClientException('Please verify your curl additionnal options'); + throw new CurlHttpClientException('Please verify your curl additionnal options'); } } @@ -71,7 +71,7 @@ public function getContent(string $url): string $message = curl_error($curl); curl_close($curl); if (CURLE_OK !== $code) { - throw new CurlHttpHttpClientException($message, $code); + throw new CurlHttpClientException($message, $code); } return $content; diff --git a/src/Storage/CurlHttpHttpClientException.php b/src/Storage/CurlHttpClientException.php similarity index 83% rename from src/Storage/CurlHttpHttpClientException.php rename to src/Storage/CurlHttpClientException.php index fd9f8dcf..4b7354df 100644 --- a/src/Storage/CurlHttpHttpClientException.php +++ b/src/Storage/CurlHttpClientException.php @@ -17,6 +17,6 @@ use RuntimeException; -class CurlHttpHttpClientException extends RuntimeException implements HttpClientException +class CurlHttpClientException extends RuntimeException implements HttpClientException { } diff --git a/src/Storage/Manager.php b/src/Storage/Manager.php index 2ebdc920..600b0989 100644 --- a/src/Storage/Manager.php +++ b/src/Storage/Manager.php @@ -21,15 +21,6 @@ use Pdp\UnableToLoadPublicSuffixList; use Pdp\UnableToLoadRootZoneDatabase; -/** - * Public Suffix List Manager. - * - * This class obtains, writes, caches, and returns PHP representations - * of the Public Suffix List ICANN section - * - * @author Jeremy Kendall - * @author Ignace Nyamagana Butera - */ final class Manager { public const PSL_URL = 'https://publicsuffix.org/list/public_suffix_list.dat'; @@ -37,11 +28,11 @@ final class Manager private HttpClient $http; - private RulesCache $rulesCache; + private PublicSuffixListCache $rulesCache; - private TopLevelDomainsCache $topLevelDomainsCache; + private RootZoneDatabaseCache $topLevelDomainsCache; - public function __construct(HttpClient $http, RulesCache $rulesCache, TopLevelDomainsCache $topLevelDomainsCache) + public function __construct(HttpClient $http, PublicSuffixListCache $rulesCache, RootZoneDatabaseCache $topLevelDomainsCache) { $this->http = $http; $this->rulesCache = $rulesCache; diff --git a/src/Storage/RulesCache.php b/src/Storage/PublicSuffixListCache.php similarity index 74% rename from src/Storage/RulesCache.php rename to src/Storage/PublicSuffixListCache.php index daeea26f..93798c9d 100644 --- a/src/Storage/RulesCache.php +++ b/src/Storage/PublicSuffixListCache.php @@ -17,16 +17,7 @@ use Pdp\Rules; -/** - * Public Suffix List Manager. - * - * This class obtains, writes, caches, and returns PHP representations - * of the Public Suffix List ICANN section - * - * @author Jeremy Kendall - * @author Ignace Nyamagana Butera - */ -interface RulesCache +interface PublicSuffixListCache { /** * Gets the Public Suffix List Rules. diff --git a/src/Storage/RulesCachePsr16Adapter.php b/src/Storage/PublicSuffixListCachePsr16Adapter.php similarity index 92% rename from src/Storage/RulesCachePsr16Adapter.php rename to src/Storage/PublicSuffixListCachePsr16Adapter.php index 30a664c6..d53cb41b 100644 --- a/src/Storage/RulesCachePsr16Adapter.php +++ b/src/Storage/PublicSuffixListCachePsr16Adapter.php @@ -35,16 +35,7 @@ use function strtolower; use const FILTER_VALIDATE_INT; -/** - * Public Suffix List Manager. - * - * This class obtains, writes, caches, and returns PHP representations - * of the Public Suffix List ICANN section - * - * @author Jeremy Kendall - * @author Ignace Nyamagana Butera - */ -final class RulesCachePsr16Adapter implements RulesCache +final class PublicSuffixListCachePsr16Adapter implements PublicSuffixListCache { private const CACHE_PREFIX = 'PSL_FULL_'; diff --git a/src/Storage/TopLevelDomainsCache.php b/src/Storage/RootZoneDatabaseCache.php similarity index 74% rename from src/Storage/TopLevelDomainsCache.php rename to src/Storage/RootZoneDatabaseCache.php index e4610fc6..6e9348ed 100644 --- a/src/Storage/TopLevelDomainsCache.php +++ b/src/Storage/RootZoneDatabaseCache.php @@ -17,16 +17,7 @@ use Pdp\RootZoneDatabaseInterface; -/** - * Top Level Domains Cache Provider. - * - * This class obtains, writes, caches, and returns PHP representations - * of the Public Suffix List ICANN section - * - * @author Jeremy Kendall - * @author Ignace Nyamagana Butera - */ -interface TopLevelDomainsCache +interface RootZoneDatabaseCache { /** * Gets the Top Level Domains from the Cache. diff --git a/src/Storage/TopLevelDomainsCachePsr16Adapter.php b/src/Storage/RootZoneDatabaseCachePsr16Adapter.php similarity index 92% rename from src/Storage/TopLevelDomainsCachePsr16Adapter.php rename to src/Storage/RootZoneDatabaseCachePsr16Adapter.php index cc0de125..5bef32de 100644 --- a/src/Storage/TopLevelDomainsCachePsr16Adapter.php +++ b/src/Storage/RootZoneDatabaseCachePsr16Adapter.php @@ -37,16 +37,7 @@ use function strtolower; use const FILTER_VALIDATE_INT; -/** - * Public Suffix List Manager. - * - * This class obtains, writes, caches, and returns PHP representations - * of the Public Suffix List ICANN section - * - * @author Jeremy Kendall - * @author Ignace Nyamagana Butera - */ -final class TopLevelDomainsCachePsr16Adapter implements TopLevelDomainsCache +final class RootZoneDatabaseCachePsr16Adapter implements RootZoneDatabaseCache { private const CACHE_PREFIX = 'RZD'; diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 8899890d..39ed7b84 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -25,8 +25,8 @@ use Pdp\Storage\CurlHttpClient; use Pdp\Storage\Manager; use Pdp\Storage\Psr16FileCache; -use Pdp\Storage\RulesCachePsr16Adapter; -use Pdp\Storage\TopLevelDomainsCachePsr16Adapter; +use Pdp\Storage\PublicSuffixListCachePsr16Adapter; +use Pdp\Storage\RootZoneDatabaseCachePsr16Adapter; use Pdp\UnableToLoadPublicSuffixList; use Pdp\UnableToResolveDomain; use PHPUnit\Framework\TestCase; @@ -53,8 +53,8 @@ public function setUp(): void $psr16Cache = new Psr16FileCache(__DIR__.'/data'); $manager = new Manager( new CurlHttpClient(), - new RulesCachePsr16Adapter($psr16Cache), - new TopLevelDomainsCachePsr16Adapter($psr16Cache) + new PublicSuffixListCachePsr16Adapter($psr16Cache), + new RootZoneDatabaseCachePsr16Adapter($psr16Cache) ); $this->rules = $manager->getPublicSuffixListLocalCopy(); @@ -757,8 +757,8 @@ public function testResolveWithIDNAOptions(): void $psr16Cache = new Psr16FileCache(__DIR__.'/data'); $manager = new Manager( new CurlHttpClient(), - new RulesCachePsr16Adapter($psr16Cache), - new TopLevelDomainsCachePsr16Adapter($psr16Cache) + new PublicSuffixListCachePsr16Adapter($psr16Cache), + new RootZoneDatabaseCachePsr16Adapter($psr16Cache) ); $rules = $manager->getPublicSuffixListLocalCopy() diff --git a/tests/Storage/CurlHttpClientTest.php b/tests/Storage/CurlHttpClientTest.php index 8a5936d1..735c0360 100644 --- a/tests/Storage/CurlHttpClientTest.php +++ b/tests/Storage/CurlHttpClientTest.php @@ -16,7 +16,7 @@ namespace Pdp\Tests\Storage; use Pdp\Storage\CurlHttpClient; -use Pdp\Storage\CurlHttpHttpClientException; +use Pdp\Storage\CurlHttpClientException; use PHPUnit\Framework\TestCase; /** @@ -41,7 +41,7 @@ public function testGetContent(): void */ public function testThrowsException(): void { - self::expectException(CurlHttpHttpClientException::class); + self::expectException(CurlHttpClientException::class); (new CurlHttpClient())->getContent('https://qsfsdfqdf.dfsf'); } @@ -50,7 +50,7 @@ public function testThrowsException(): void */ public function testConstructorThrowsException(): void { - self::expectException(CurlHttpHttpClientException::class); + self::expectException(CurlHttpClientException::class); new CurlHttpClient(['foo' => 'bar']); } } From f2d0a9a3f952575fa1cbe5d7fdb5a17c603ddd0a Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 31 Jul 2020 15:35:16 +0200 Subject: [PATCH 207/461] Improve Cache adapter --- src/Storage/Manager.php | 35 +++++++++---------- .../PublicSuffixListCachePsr16Adapter.php | 11 +++++- .../RootZoneDatabaseCachePsr16Adapter.php | 11 +++++- tests/RulesTest.php | 11 +++--- 4 files changed, 40 insertions(+), 28 deletions(-) diff --git a/src/Storage/Manager.php b/src/Storage/Manager.php index 600b0989..50e533c2 100644 --- a/src/Storage/Manager.php +++ b/src/Storage/Manager.php @@ -15,6 +15,7 @@ namespace Pdp\Storage; +use Pdp\PublicSuffixListInterface; use Pdp\RootZoneDatabaseInterface; use Pdp\Rules; use Pdp\TopLevelDomains; @@ -23,20 +24,20 @@ final class Manager { - public const PSL_URL = 'https://publicsuffix.org/list/public_suffix_list.dat'; + private const PSL_URL = 'https://publicsuffix.org/list/public_suffix_list.dat'; private const RZD_URL = 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt'; private HttpClient $http; - private PublicSuffixListCache $rulesCache; + private PublicSuffixListCache $publicSuffixListCache; - private RootZoneDatabaseCache $topLevelDomainsCache; + private RootZoneDatabaseCache $rootZoneDatabaseCache; public function __construct(HttpClient $http, PublicSuffixListCache $rulesCache, RootZoneDatabaseCache $topLevelDomainsCache) { $this->http = $http; - $this->rulesCache = $rulesCache; - $this->topLevelDomainsCache = $topLevelDomainsCache; + $this->publicSuffixListCache = $rulesCache; + $this->rootZoneDatabaseCache = $topLevelDomainsCache; } /** @@ -44,9 +45,9 @@ public function __construct(HttpClient $http, PublicSuffixListCache $rulesCache, * * @throws UnableToLoadPublicSuffixList */ - public function getPublicSuffixListLocalCopy(string $url = self::PSL_URL): Rules + public function getPublicSuffixListLocalCopy(string $uri = self::PSL_URL): PublicSuffixListInterface { - return $this->rulesCache->fetchByUri($url) ?? $this->getPublicSuffixListRemoteCopy($url); + return $this->publicSuffixListCache->fetchByUri($uri) ?? $this->getPublicSuffixListRemoteCopy($uri); } /** @@ -54,12 +55,11 @@ public function getPublicSuffixListLocalCopy(string $url = self::PSL_URL): Rules * * @throws UnableToLoadPublicSuffixList */ - public function getPublicSuffixListRemoteCopy(string $uri = null): Rules + public function getPublicSuffixListRemoteCopy(string $uri = self::PSL_URL): PublicSuffixListInterface { - $uri = $uri ?? self::PSL_URL; $rules = Rules::fromString($this->http->getContent($uri)); - $this->rulesCache->storeByUri($uri, $rules); + $this->publicSuffixListCache->storeByUri($uri, $rules); return $rules; } @@ -69,11 +69,9 @@ public function getPublicSuffixListRemoteCopy(string $uri = null): Rules * * @throws UnableToLoadRootZoneDatabase */ - public function getRootZoneDatabaseLocalCopy(string $uri = null): RootZoneDatabaseInterface + public function getRootZoneDatabaseLocalCopy(string $uri = self::RZD_URL): RootZoneDatabaseInterface { - $uri = $uri ?? self::RZD_URL; - - return $this->topLevelDomainsCache->fetchByUri($uri) ?? $this->getRootZoneDatabaseRemoteCopy($uri); + return $this->rootZoneDatabaseCache->fetchByUri($uri) ?? $this->getRootZoneDatabaseRemoteCopy($uri); } /** @@ -81,13 +79,12 @@ public function getRootZoneDatabaseLocalCopy(string $uri = null): RootZoneDataba * * @throws UnableToLoadRootZoneDatabase */ - public function getRootZoneDatabaseRemoteCopy(string $uri = null): RootZoneDatabaseInterface + public function getRootZoneDatabaseRemoteCopy(string $uri = self::RZD_URL): RootZoneDatabaseInterface { - $uri = $uri ?? self::RZD_URL; - $topLevelDomains = TopLevelDomains::fromString($this->http->getContent($uri)); + $rootZoneDatabase = TopLevelDomains::fromString($this->http->getContent($uri)); - $this->topLevelDomainsCache->storeByUri($uri, $topLevelDomains); + $this->rootZoneDatabaseCache->storeByUri($uri, $rootZoneDatabase); - return $topLevelDomains; + return $rootZoneDatabase; } } diff --git a/src/Storage/PublicSuffixListCachePsr16Adapter.php b/src/Storage/PublicSuffixListCachePsr16Adapter.php index d53cb41b..994e35f0 100644 --- a/src/Storage/PublicSuffixListCachePsr16Adapter.php +++ b/src/Storage/PublicSuffixListCachePsr16Adapter.php @@ -83,7 +83,16 @@ private function setTtl($ttl): ?DateInterval )); } - return DateInterval::createFromDateString($ttl); + /** @var DateInterval|false $date */ + $date = @DateInterval::createFromDateString($ttl); + if (!$date instanceof DateInterval) { + throw new Psr16CacheException(sprintf( + 'The ttl value "%s" can not be parsable by `DateInterval::createFromDateString`', + $ttl + )); + } + + return $date; } /** diff --git a/src/Storage/RootZoneDatabaseCachePsr16Adapter.php b/src/Storage/RootZoneDatabaseCachePsr16Adapter.php index 5bef32de..40bbfc39 100644 --- a/src/Storage/RootZoneDatabaseCachePsr16Adapter.php +++ b/src/Storage/RootZoneDatabaseCachePsr16Adapter.php @@ -85,7 +85,16 @@ private function setTtl($ttl): ?DateInterval )); } - return DateInterval::createFromDateString($ttl); + /** @var DateInterval|false $date */ + $date = @DateInterval::createFromDateString($ttl); + if (!$date instanceof DateInterval) { + throw new Psr16CacheException(sprintf( + 'The ttl value "%s" can not be parsable by `DateInterval::createFromDateString`', + $ttl + )); + } + + return $date; } /** diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 39ed7b84..72af1783 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -50,14 +50,10 @@ final class RulesTest extends TestCase public function setUp(): void { - $psr16Cache = new Psr16FileCache(__DIR__.'/data'); - $manager = new Manager( - new CurlHttpClient(), - new PublicSuffixListCachePsr16Adapter($psr16Cache), - new RootZoneDatabaseCachePsr16Adapter($psr16Cache) - ); + /** @var string $string */ + $string = file_get_contents(__DIR__.'/data/public_suffix_list.dat'); - $this->rules = $manager->getPublicSuffixListLocalCopy(); + $this->rules = Rules::fromString($string); } /** @@ -761,6 +757,7 @@ public function testResolveWithIDNAOptions(): void new RootZoneDatabaseCachePsr16Adapter($psr16Cache) ); + /** @var Rules $rules */ $rules = $manager->getPublicSuffixListLocalCopy() ->withAsciiIDNAOption(IDNA_NONTRANSITIONAL_TO_ASCII) ->withUnicodeIDNAOption(IDNA_NONTRANSITIONAL_TO_UNICODE); From e99a1caf1ae7acfecc63603f9e797178bec841fc Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 31 Jul 2020 15:37:44 +0200 Subject: [PATCH 208/461] Improve type hinting and docblock --- src/Storage/Manager.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Storage/Manager.php b/src/Storage/Manager.php index 50e533c2..f08297fb 100644 --- a/src/Storage/Manager.php +++ b/src/Storage/Manager.php @@ -43,6 +43,7 @@ public function __construct(HttpClient $http, PublicSuffixListCache $rulesCache, /** * Gets the Public Suffix List from the Local Storage or the Remote Storage. * + * @throws HttpClientException * @throws UnableToLoadPublicSuffixList */ public function getPublicSuffixListLocalCopy(string $uri = self::PSL_URL): PublicSuffixListInterface @@ -53,6 +54,7 @@ public function getPublicSuffixListLocalCopy(string $uri = self::PSL_URL): Publi /** * Gets the Public Suffix List from an the Remote Storage. * + * @throws HttpClientException * @throws UnableToLoadPublicSuffixList */ public function getPublicSuffixListRemoteCopy(string $uri = self::PSL_URL): PublicSuffixListInterface @@ -67,6 +69,7 @@ public function getPublicSuffixListRemoteCopy(string $uri = self::PSL_URL): Publ /** * Gets the Top Level Domains from the Local Storage or the Remote Storage. * + * @throws HttpClientException * @throws UnableToLoadRootZoneDatabase */ public function getRootZoneDatabaseLocalCopy(string $uri = self::RZD_URL): RootZoneDatabaseInterface @@ -77,6 +80,7 @@ public function getRootZoneDatabaseLocalCopy(string $uri = self::RZD_URL): RootZ /** * Gets the Top Level Domains from the Remote Storage. * + * @throws HttpClientException * @throws UnableToLoadRootZoneDatabase */ public function getRootZoneDatabaseRemoteCopy(string $uri = self::RZD_URL): RootZoneDatabaseInterface From d554ec75533bae5f2f3a502365e85692d30a91a8 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 1 Aug 2020 15:42:03 +0200 Subject: [PATCH 209/461] Update interface naming code --- phpstan.src.neon | 4 +- src/Domain.php | 10 +-- src/{DomainInterface.php => DomainName.php} | 2 +- src/{HostParser.php => DomainNameParser.php} | 12 ++-- ...icSuffixInterface.php => EffectiveTLD.php} | 2 +- src/ExceptionInterface.php | 3 + src/{HostInterface.php => Host.php} | 2 +- ...nvalidDomain.php => InvalidDomainName.php} | 2 +- src/PublicSuffix.php | 10 +-- ...ListInterface.php => PublicSuffixList.php} | 16 ++--- src/PublicSuffixListConverter.php | 6 +- src/ResolvedDomain.php | 54 ++++++++-------- ...lvedHostInterface.php => ResolvedHost.php} | 16 ++--- ...baseInterface.php => RootZoneDatabase.php} | 8 +-- src/Rules.php | 52 ++++++++-------- src/Storage/Manager.php | 12 ++-- src/Storage/RootZoneDatabaseCache.php | 6 +- .../RootZoneDatabaseCachePsr16Adapter.php | 6 +- src/TopLevelDomains.php | 26 ++++---- src/UnableToResolveDomain.php | 8 +-- tests/DomainTest.php | 6 +- tests/PublicSuffixTest.php | 4 +- tests/RulesTest.php | 61 +++++++++---------- tests/TopLevelDomainsTest.php | 4 +- 24 files changed, 167 insertions(+), 165 deletions(-) rename src/{DomainInterface.php => DomainName.php} (98%) rename src/{HostParser.php => DomainNameParser.php} (95%) rename src/{PublicSuffixInterface.php => EffectiveTLD.php} (94%) rename src/{HostInterface.php => Host.php} (98%) rename src/{InvalidDomain.php => InvalidDomainName.php} (96%) rename src/{PublicSuffixListInterface.php => PublicSuffixList.php} (79%) rename src/{ResolvedHostInterface.php => ResolvedHost.php} (77%) rename src/{RootZoneDatabaseInterface.php => RootZoneDatabase.php} (93%) diff --git a/phpstan.src.neon b/phpstan.src.neon index 7e58b121..4fd69b17 100644 --- a/phpstan.src.neon +++ b/phpstan.src.neon @@ -16,6 +16,6 @@ parameters: path: src/ResolvedDomain.php - message: '#Method Pdp\\ResolvedDomain::withSubDomain\(\) has parameter \$subDomain with no typehint specified.#' path: src/ResolvedDomain.php - - message: '#PHPDoc tag @param for parameter \$domain with type mixed is not subtype of native type Pdp\\HostInterface.#' - path: src/PublicSuffixListInterface.php + - message: '#PHPDoc tag @param for parameter \$domain with type mixed is not subtype of native type Pdp\\Host.#' + path: src/PublicSuffixList.php reportUnmatchedIgnoredErrors: true diff --git a/src/Domain.php b/src/Domain.php index 24cd7fdb..2326017c 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -30,7 +30,7 @@ use function strpos; use const IDNA_DEFAULT; -final class Domain extends HostParser implements DomainInterface +final class Domain extends DomainNameParser implements DomainName { private const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/'; @@ -168,12 +168,12 @@ public function toUnicode(): self */ private function normalizeContent($domain): string { - if ($domain instanceof HostInterface) { + if ($domain instanceof Host) { $domain = $domain->getContent(); } if (null === $domain || (!is_string($domain) && !method_exists($domain, '__toString'))) { - throw new TypeError(sprintf('The label must be a '.HostInterface::class.', a stringable object or a string, `%s` given', gettype($domain))); + throw new TypeError(sprintf('The label must be a '.Host::class.', a stringable object or a string, `%s` given', gettype($domain))); } $domain = (string) $domain; @@ -202,7 +202,7 @@ public function withLabel(int $key, $label): self { $nb_labels = count($this->labels); if ($key < - $nb_labels - 1 || $key > $nb_labels) { - throw InvalidDomain::dueToInvalidLabelKey($key); + throw InvalidDomainName::dueToInvalidLabelKey($key); } if (0 > $key) { @@ -232,7 +232,7 @@ public function withoutLabel(int $key, int ...$keys): self $nb_labels = count($this->labels); foreach ($keys as &$offset) { if (- $nb_labels > $offset || $nb_labels - 1 < $offset) { - throw InvalidDomain::dueToInvalidLabelKey($key); + throw InvalidDomainName::dueToInvalidLabelKey($key); } if (0 > $offset) { diff --git a/src/DomainInterface.php b/src/DomainName.php similarity index 98% rename from src/DomainInterface.php rename to src/DomainName.php index 70093173..2cc0433c 100644 --- a/src/DomainInterface.php +++ b/src/DomainName.php @@ -22,7 +22,7 @@ * @see https://tools.ietf.org/html/rfc1123#section-2.1 * @see https://tools.ietf.org/html/rfc5890 */ -interface DomainInterface extends HostInterface, IteratorAggregate +interface DomainName extends Host, IteratorAggregate { /** * Retrieves a single domain label. diff --git a/src/HostParser.php b/src/DomainNameParser.php similarity index 95% rename from src/HostParser.php rename to src/DomainNameParser.php index 4d2d03f9..49e2b94f 100644 --- a/src/HostParser.php +++ b/src/DomainNameParser.php @@ -49,7 +49,7 @@ use const IDNA_ERROR_TRAILING_HYPHEN; use const INTL_IDNA_VARIANT_UTS46; -abstract class HostParser +abstract class DomainNameParser { /** * Get and format IDN conversion error message. @@ -165,11 +165,11 @@ final protected function idnToUnicode(string $domain, int $option = IDNA_DEFAULT * @param mixed $domain a domain * * @throws InvalidHost If the domain is not a host - * @throws InvalidDomain If the host is not a domain + * @throws InvalidDomainName If the host is not a domain */ final protected function parse($domain = null, int $asciiOption = 0, int $unicodeOption = 0): array { - if ($domain instanceof HostInterface) { + if ($domain instanceof Host) { $domain = $domain->getContent(); } @@ -188,7 +188,7 @@ final protected function parse($domain = null, int $asciiOption = 0, int $unicod $domain = (string) $domain; $res = filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); if (false !== $res) { - throw InvalidDomain::dueToUnsupportedType($domain); + throw InvalidDomainName::dueToUnsupportedType($domain); } $formatted_domain = rawurldecode($domain); @@ -208,7 +208,7 @@ final protected function parse($domain = null, int $asciiOption = 0, int $unicod // a domain name can not contains URI delimiters or space static $gen_delims = '/[:\/?#\[\]@ ]/'; if (1 === preg_match($gen_delims, $formatted_domain)) { - throw InvalidDomain::dueToInvalidCharacters($domain); + throw InvalidDomainName::dueToInvalidCharacters($domain); } // if the domain name does not contains UTF-8 chars then it is malformed @@ -222,6 +222,6 @@ final protected function parse($domain = null, int $asciiOption = 0, int $unicod return $labels; } - throw InvalidDomain::dueToInvalidCharacters($domain); + throw InvalidDomainName::dueToInvalidCharacters($domain); } } diff --git a/src/PublicSuffixInterface.php b/src/EffectiveTLD.php similarity index 94% rename from src/PublicSuffixInterface.php rename to src/EffectiveTLD.php index 85191586..2922137e 100644 --- a/src/PublicSuffixInterface.php +++ b/src/EffectiveTLD.php @@ -15,7 +15,7 @@ namespace Pdp; -interface PublicSuffixInterface extends HostInterface +interface EffectiveTLD extends Host { public const ICANN_DOMAINS = 'ICANN_DOMAINS'; diff --git a/src/ExceptionInterface.php b/src/ExceptionInterface.php index c7cc27ad..5172453b 100644 --- a/src/ExceptionInterface.php +++ b/src/ExceptionInterface.php @@ -17,6 +17,9 @@ use Throwable; +/** + * Marker interface for package-specific exceptions. + */ interface ExceptionInterface extends Throwable { } diff --git a/src/HostInterface.php b/src/Host.php similarity index 98% rename from src/HostInterface.php rename to src/Host.php index 48c090f8..8ffedbd1 100644 --- a/src/HostInterface.php +++ b/src/Host.php @@ -23,7 +23,7 @@ * @see https://tools.ietf.org/html/rfc1123#section-2.1 * @see https://tools.ietf.org/html/rfc5890 */ -interface HostInterface extends Countable, JsonSerializable +interface Host extends Countable, JsonSerializable { /** * Returns the domain content. diff --git a/src/InvalidDomain.php b/src/InvalidDomainName.php similarity index 96% rename from src/InvalidDomain.php rename to src/InvalidDomainName.php index aeb9cd43..6b6dd6d0 100644 --- a/src/InvalidDomain.php +++ b/src/InvalidDomainName.php @@ -17,7 +17,7 @@ use function sprintf; -class InvalidDomain extends InvalidHost +class InvalidDomainName extends InvalidHost { public static function dueToInvalidLabelKey(int $key): self { diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index d779f7b4..7c3e8a52 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -22,7 +22,7 @@ use function reset; use const IDNA_DEFAULT; -final class PublicSuffix extends HostParser implements PublicSuffixInterface +final class PublicSuffix extends DomainNameParser implements EffectiveTLD { private const PSL_SECTION = [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, '']; @@ -99,7 +99,7 @@ public function count(): int /** * Set the public suffix content. * - * @throws InvalidDomain if the public suffix is invalid + * @throws InvalidDomainName if the public suffix is invalid */ private function setPublicSuffix(): ?string { @@ -112,7 +112,7 @@ private function setPublicSuffix(): ?string return $publicSuffix; } - throw InvalidDomain::dueToInvalidPublicSuffix($publicSuffix); + throw InvalidDomainName::dueToInvalidPublicSuffix($publicSuffix); } /** @@ -173,7 +173,7 @@ public function isPrivate(): bool return self::PRIVATE_DOMAINS === $this->section; } - public function toAscii(): HostInterface + public function toAscii(): Host { if (null === $this->publicSuffix) { return $this; @@ -187,7 +187,7 @@ public function toAscii(): HostInterface return new self($publicSuffix, $this->section, $this->asciiIDNAOption, $this->unicodeIDNAOption); } - public function toUnicode(): HostInterface + public function toUnicode(): Host { if (null === $this->publicSuffix || false === strpos($this->publicSuffix, 'xn--')) { return $this; diff --git a/src/PublicSuffixListInterface.php b/src/PublicSuffixList.php similarity index 79% rename from src/PublicSuffixListInterface.php rename to src/PublicSuffixList.php index 1f88cc06..55869895 100644 --- a/src/PublicSuffixListInterface.php +++ b/src/PublicSuffixList.php @@ -17,7 +17,7 @@ use JsonSerializable; -interface PublicSuffixListInterface extends JsonSerializable +interface PublicSuffixList extends JsonSerializable { public function getAsciiIDNAOption(): int; @@ -30,49 +30,49 @@ public function jsonSerialize(): array; * * @throws ExceptionInterface If the PublicSuffix can not be resolve. */ - public function getCookieEffectiveTLD(ResolvedHostInterface $domain): PublicSuffixInterface; + public function getCookieEffectiveTLD(ResolvedHost $domain): PublicSuffix; /** * Determines the public suffix for a given domain against the PSL rules for ICANN domain detection.. * * @throws ExceptionInterface If the PublicSuffix can not be resolve. */ - public function getICANNEffectiveTLD(ResolvedHostInterface $domain): PublicSuffixInterface; + public function getICANNEffectiveTLD(ResolvedHost $domain): PublicSuffix; /** * Determines the public suffix for a given domain against the PSL rules for private domain detection.. * * @throws ExceptionInterface If the PublicSuffix can not be resolve. */ - public function getPrivateEffectiveTLD(ResolvedHostInterface $domain): PublicSuffixInterface; + public function getPrivateEffectiveTLD(ResolvedHost $domain): PublicSuffix; /** * Returns PSL info for a given domain. * * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolve(HostInterface $domain): ResolvedHostInterface; + public function resolve(Host $domain): ResolvedHost; /** * Returns PSL info for a given domain against the PSL rules for cookie domain detection. * * @param mixed $domain the domain value */ - public function resolveCookieDomain($domain): ResolvedHostInterface; + public function resolveCookieDomain($domain): ResolvedHost; /** * Returns PSL info for a given domain against the PSL rules for ICANN domain detection. * * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolveICANNDomain($domain): ResolvedHostInterface; + public function resolveICANNDomain($domain): ResolvedHost; /** * Returns PSL info for a given domain against the PSL rules for private domain detection. * * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolvePrivateDomain($domain): ResolvedHostInterface; + public function resolvePrivateDomain($domain): ResolvedHost; /** * Sets conversion options for idn_to_ascii. diff --git a/src/PublicSuffixListConverter.php b/src/PublicSuffixListConverter.php index 5fc5ff4b..a7e41055 100644 --- a/src/PublicSuffixListConverter.php +++ b/src/PublicSuffixListConverter.php @@ -22,15 +22,15 @@ use function strpos; use function substr; -final class PublicSuffixListConverter extends HostParser +final class PublicSuffixListConverter extends DomainNameParser { private const PSL_SECTION = [ 'ICANN' => [ - 'BEGIN' => PublicSuffixInterface::ICANN_DOMAINS, + 'BEGIN' => PublicSuffix::ICANN_DOMAINS, 'END' => '', ], 'PRIVATE' => [ - 'BEGIN' => PublicSuffixInterface::PRIVATE_DOMAINS, + 'BEGIN' => PublicSuffix::PRIVATE_DOMAINS, 'END' => '', ], ]; diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 0711deef..119e0cc3 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -25,19 +25,19 @@ use function strlen; use function substr; -final class ResolvedDomain implements ResolvedHostInterface +final class ResolvedDomain implements ResolvedHost { private const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/'; - private DomainInterface $domain; + private DomainName $domain; - private PublicSuffixInterface $publicSuffix; + private PublicSuffix $publicSuffix; - private DomainInterface $registrableDomain; + private DomainName $registrableDomain; - private DomainInterface $subDomain; + private DomainName $subDomain; - public function __construct(HostInterface $domain, ?PublicSuffixInterface $publicSuffix = null) + public function __construct(Host $domain, ?PublicSuffix $publicSuffix = null) { $this->domain = $this->setDomain($domain); $this->publicSuffix = $this->setPublicSuffix($publicSuffix); @@ -56,9 +56,9 @@ public static function __set_state(array $properties): self /** * Sets the domain. */ - private function setDomain(HostInterface $domain): DomainInterface + private function setDomain(Host $domain): DomainName { - if ($domain instanceof DomainInterface) { + if ($domain instanceof DomainName) { return $domain; } @@ -70,7 +70,7 @@ private function setDomain(HostInterface $domain): DomainInterface * * @throws UnableToResolveDomain If the public suffic can not be attached to the domain */ - private function setPublicSuffix(PublicSuffixInterface $publicSuffix = null): PublicSuffixInterface + private function setPublicSuffix(PublicSuffix $publicSuffix = null): PublicSuffix { $asciiIDNAOptions = $this->domain->getAsciiIDNAOption(); $unicodeIDNAOptions = $this->domain->getUnicodeIDNAOption(); @@ -118,7 +118,7 @@ private function setPublicSuffix(PublicSuffixInterface $publicSuffix = null): Pu /** * Normalize the domain name encoding content. */ - private function normalize(PublicSuffixInterface $subject): PublicSuffixInterface + private function normalize(PublicSuffix $subject): PublicSuffix { if (1 !== preg_match(self::REGEXP_IDN_PATTERN, $this->domain->__toString())) { return $subject->toAscii(); @@ -130,7 +130,7 @@ private function normalize(PublicSuffixInterface $subject): PublicSuffixInterfac /** * Computes the registrable domain part. */ - private function setRegistrableDomain(): DomainInterface + private function setRegistrableDomain(): DomainName { if (null === $this->publicSuffix->getContent()) { return Domain::fromNull($this->domain->getAsciiIDNAOption(), $this->domain->getUnicodeIDNAOption()); @@ -147,7 +147,7 @@ private function setRegistrableDomain(): DomainInterface /** * Computes the sub domain part. */ - private function setSubDomain(): DomainInterface + private function setSubDomain(): DomainName { $asciiIDNAOptions = $this->domain->getAsciiIDNAOption(); $unicodeIDNAOptions = $this->domain->getUnicodeIDNAOption(); @@ -176,7 +176,7 @@ public function count(): int return count($this->domain); } - public function getHost(): DomainInterface + public function getHost(): DomainName { return $this->domain; } @@ -206,17 +206,17 @@ public function getUnicodeIDNAOption(): int return $this->domain->getUnicodeIDNAOption(); } - public function getRegistrableDomain(): DomainInterface + public function getRegistrableDomain(): DomainName { return $this->registrableDomain; } - public function getSubDomain(): DomainInterface + public function getSubDomain(): DomainName { return $this->subDomain; } - public function getPublicSuffix(): PublicSuffixInterface + public function getPublicSuffix(): PublicSuffix { return $this->publicSuffix; } @@ -233,7 +233,7 @@ public function toUnicode(): self public function resolve($publicSuffix): self { - if (!$publicSuffix instanceof PublicSuffixInterface) { + if (!$publicSuffix instanceof PublicSuffix) { $publicSuffix = PublicSuffix::fromUnknownSection($publicSuffix); } @@ -245,7 +245,7 @@ public function resolve($publicSuffix): self */ public function withPublicSuffix($publicSuffix): self { - if (!$publicSuffix instanceof PublicSuffixInterface) { + if (!$publicSuffix instanceof PublicSuffix) { $publicSuffix = PublicSuffix::fromUnknownSection($publicSuffix); } @@ -262,14 +262,14 @@ public function withPublicSuffix($publicSuffix): self ); } - /** @var DomainInterface $domain */ + /** @var DomainName $domain */ $domain = new Domain( $domain.'.'.$publicSuffix->getContent(), $this->domain->getAsciiIDNAOption(), $this->domain->getUnicodeIDNAOption() ); - /** @var PublicSuffixInterface $publicSuffix */ + /** @var PublicSuffix $publicSuffix */ $publicSuffix = $publicSuffix ->withAsciiIDNAOption($this->domain->getAsciiIDNAOption()) ->withUnicodeIDNAOption($this->domain->getUnicodeIDNAOption()); @@ -290,7 +290,7 @@ public function withSubDomain($subDomain): self $subDomain = Domain::fromNull($this->getAsciiIDNAOption(), $this->getUnicodeIDNAOption()); } - if (!$subDomain instanceof DomainInterface) { + if (!$subDomain instanceof DomainName) { $subDomain = new Domain($subDomain); } @@ -299,10 +299,10 @@ public function withSubDomain($subDomain): self return $this; } - /** @var DomainInterface $subDomain */ + /** @var DomainName $subDomain */ $subDomain = $subDomain->toAscii(); if (1 === preg_match(self::REGEXP_IDN_PATTERN, (string) $this->domain->getContent())) { - /** @var DomainInterface $subDomain */ + /** @var DomainName $subDomain */ $subDomain = $subDomain->toUnicode(); } @@ -324,10 +324,10 @@ public function withAsciiIDNAOption(int $option): self return $this; } - /** @var DomainInterface $asciiDomain */ + /** @var DomainName $asciiDomain */ $asciiDomain = $this->domain->withAsciiIDNAOption($option); - /** @var PublicSuffixInterface $asciiPublicSuffix */ + /** @var PublicSuffix $asciiPublicSuffix */ $asciiPublicSuffix = $this->publicSuffix->withAsciiIDNAOption($option); return new self($asciiDomain, $asciiPublicSuffix); @@ -342,10 +342,10 @@ public function withUnicodeIDNAOption(int $option): self return $this; } - /** @var DomainInterface $unicodeDomain */ + /** @var DomainName $unicodeDomain */ $unicodeDomain = $this->domain->withUnicodeIDNAOption($option); - /** @var PublicSuffixInterface $unicodePublicSuffix */ + /** @var PublicSuffix $unicodePublicSuffix */ $unicodePublicSuffix = $this->publicSuffix->withUnicodeIDNAOption($option); return new self($unicodeDomain, $unicodePublicSuffix); diff --git a/src/ResolvedHostInterface.php b/src/ResolvedHost.php similarity index 77% rename from src/ResolvedHostInterface.php rename to src/ResolvedHost.php index 769e3b93..a1daa853 100644 --- a/src/ResolvedHostInterface.php +++ b/src/ResolvedHost.php @@ -15,15 +15,15 @@ namespace Pdp; -interface ResolvedHostInterface extends HostInterface +interface ResolvedHost extends Host { - public function getHost(): DomainInterface; + public function getHost(): DomainName; - public function getPublicSuffix(): PublicSuffixInterface; + public function getPublicSuffix(): PublicSuffix; - public function getSubDomain(): DomainInterface; + public function getSubDomain(): DomainName; - public function getRegistrableDomain(): DomainInterface; + public function getRegistrableDomain(): DomainName; /** * Returns an instance with the specified sub domain added. @@ -33,7 +33,7 @@ public function getRegistrableDomain(): DomainInterface; * * @throws ExceptionInterface If the Sub domain can not be added to the current Domain */ - public function withSubDomain(HostInterface $subDomain): self; + public function withSubDomain(Host $subDomain): self; /** * Returns an instance with the specified public suffix added. @@ -44,7 +44,7 @@ public function withSubDomain(HostInterface $subDomain): self; * If the domain already has a public suffix it will be replaced by the new value * otherwise the public suffix content is added to or remove from the current domain. */ - public function withPublicSuffix(PublicSuffixInterface $publicSuffix): self; + public function withPublicSuffix(PublicSuffix $publicSuffix): self; /** * Returns a Domain object with a new resolve public suffix. @@ -57,5 +57,5 @@ public function withPublicSuffix(PublicSuffixInterface $publicSuffix): self; * This method MUST retain the state of the current instance, and return * an instance that contains the modified Public Suffix Information. */ - public function resolve(PublicSuffixInterface $publicSuffix): self; + public function resolve(PublicSuffix $publicSuffix): self; } diff --git a/src/RootZoneDatabaseInterface.php b/src/RootZoneDatabase.php similarity index 93% rename from src/RootZoneDatabaseInterface.php rename to src/RootZoneDatabase.php index a9b11e1a..8a60b126 100644 --- a/src/RootZoneDatabaseInterface.php +++ b/src/RootZoneDatabase.php @@ -20,7 +20,7 @@ use IteratorAggregate; use JsonSerializable; -interface RootZoneDatabaseInterface extends Countable, IteratorAggregate, JsonSerializable +interface RootZoneDatabase extends Countable, IteratorAggregate, JsonSerializable { /** * Returns the Version ID. @@ -82,7 +82,7 @@ public function contains($tld): bool; * * @param mixed $domain a domain in a type that can be converted into a DomainInterface instance */ - public function resolve($domain): ResolvedHostInterface; + public function resolve($domain): ResolvedHost; /** * Sets conversion options for idn_to_ascii. @@ -91,7 +91,7 @@ public function resolve($domain): ResolvedHostInterface; * * @see https://www.php.net/manual/en/intl.constants.php */ - public function withAsciiIDNAOption(int $option): RootZoneDatabaseInterface; + public function withAsciiIDNAOption(int $option): RootZoneDatabase; /** * Sets conversion options for idn_to_utf8. @@ -100,5 +100,5 @@ public function withAsciiIDNAOption(int $option): RootZoneDatabaseInterface; * * @see https://www.php.net/manual/en/intl.constants.php */ - public function withUnicodeIDNAOption(int $option): RootZoneDatabaseInterface; + public function withUnicodeIDNAOption(int $option): RootZoneDatabase; } diff --git a/src/Rules.php b/src/Rules.php index a11c0ea9..68690cdc 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -29,9 +29,9 @@ use const IDNA_DEFAULT; use const JSON_ERROR_NONE; -final class Rules implements PublicSuffixListInterface +final class Rules implements PublicSuffixList { - private const PSL_SECTION = [PublicSuffixInterface::PRIVATE_DOMAINS, PublicSuffixInterface::ICANN_DOMAINS, '']; + private const PSL_SECTION = [PublicSuffix::PRIVATE_DOMAINS, PublicSuffix::ICANN_DOMAINS, '']; /** * PSL rules as a multidimentional associative array. @@ -145,7 +145,7 @@ public function jsonSerialize(): array * * @throws UnableToResolveDomain If the PublicSuffix can not be resolve. */ - public function getPublicSuffix($domain, string $section = ''): PublicSuffixInterface + public function getPublicSuffix($domain, string $section = ''): PublicSuffix { $domain = $this->validateDomain($domain); @@ -161,7 +161,7 @@ public function getPublicSuffix($domain, string $section = ''): PublicSuffixInte * * @throws UnableToResolveDomain If the PublicSuffix can not be resolve. */ - public function getCookieEffectiveTLD($domain): PublicSuffixInterface + public function getCookieEffectiveTLD($domain): PublicSuffix { return $this->getPublicSuffix($domain, ''); } @@ -173,9 +173,9 @@ public function getCookieEffectiveTLD($domain): PublicSuffixInterface * * @throws UnableToResolveDomain If the PublicSuffix can not be resolve. */ - public function getICANNEffectiveTLD($domain): PublicSuffixInterface + public function getICANNEffectiveTLD($domain): PublicSuffix { - return $this->getPublicSuffix($domain, PublicSuffixInterface::ICANN_DOMAINS); + return $this->getPublicSuffix($domain, PublicSuffix::ICANN_DOMAINS); } /** @@ -185,9 +185,9 @@ public function getICANNEffectiveTLD($domain): PublicSuffixInterface * * @throws UnableToResolveDomain If the PublicSuffix can not be resolve. */ - public function getPrivateEffectiveTLD($domain): PublicSuffixInterface + public function getPrivateEffectiveTLD($domain): PublicSuffix { - return $this->getPublicSuffix($domain, PublicSuffixInterface::PRIVATE_DOMAINS); + return $this->getPublicSuffix($domain, PublicSuffix::PRIVATE_DOMAINS); } /** @@ -195,13 +195,13 @@ public function getPrivateEffectiveTLD($domain): PublicSuffixInterface * * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolve($domain): ResolvedHostInterface + public function resolve($domain): ResolvedHost { try { return $this->resolveCookieDomain($domain); } catch (UnableToResolveDomain $exception) { if ($exception->hasDomain()) { - /** @var HostInterface */ + /** @var Host */ $domain = $exception->getDomain(); return new ResolvedDomain($domain); @@ -218,7 +218,7 @@ public function resolve($domain): ResolvedHostInterface * * @param mixed $domain the domain value */ - public function resolveCookieDomain($domain): ResolvedHostInterface + public function resolveCookieDomain($domain): ResolvedHost { $domain = $this->validateDomain($domain); @@ -230,11 +230,11 @@ public function resolveCookieDomain($domain): ResolvedHostInterface * * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolveICANNDomain($domain): ResolvedHostInterface + public function resolveICANNDomain($domain): ResolvedHost { $domain = $this->validateDomain($domain); - return $domain->resolve($this->findPublicSuffix($domain, PublicSuffixInterface::ICANN_DOMAINS)); + return $domain->resolve($this->findPublicSuffix($domain, PublicSuffix::ICANN_DOMAINS)); } /** @@ -242,11 +242,11 @@ public function resolveICANNDomain($domain): ResolvedHostInterface * * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolvePrivateDomain($domain): ResolvedHostInterface + public function resolvePrivateDomain($domain): ResolvedHost { $domain = $this->validateDomain($domain); - return $domain->resolve($this->findPublicSuffix($domain, PublicSuffixInterface::PRIVATE_DOMAINS)); + return $domain->resolve($this->findPublicSuffix($domain, PublicSuffix::PRIVATE_DOMAINS)); } /** @@ -254,12 +254,12 @@ public function resolvePrivateDomain($domain): ResolvedHostInterface * * @param mixed $domain a type that supports instantiating a Domain from. * - * @throws InvalidDomain if the domain is invalid + * @throws InvalidDomainName if the domain is invalid * @throws UnableToResolveDomain if the domain is not resolvable */ - private function validateDomain($domain): ResolvedHostInterface + private function validateDomain($domain): ResolvedHost { - if (!($domain instanceof ResolvedHostInterface)) { + if (!($domain instanceof ResolvedHost)) { $domain = new ResolvedDomain(new Domain($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption), null); } @@ -296,22 +296,22 @@ private function validateSection(string $section): string /** * Returns the matched public suffix. */ - private function findPublicSuffix(ResolvedHostInterface $domain, string $section): PublicSuffixInterface + private function findPublicSuffix(ResolvedHost $domain, string $section): PublicSuffix { $asciiDomain = $domain->getHost(); - /** @var DomainInterface $asciiDomain */ + /** @var DomainName $asciiDomain */ $asciiDomain = $asciiDomain->toAscii(); - $icann = $this->findPublicSuffixFromSection($asciiDomain, PublicSuffixInterface::ICANN_DOMAINS); - if (PublicSuffixInterface::ICANN_DOMAINS === $section) { + $icann = $this->findPublicSuffixFromSection($asciiDomain, PublicSuffix::ICANN_DOMAINS); + if (PublicSuffix::ICANN_DOMAINS === $section) { return $icann; } - $private = $this->findPublicSuffixFromSection($asciiDomain, PublicSuffixInterface::PRIVATE_DOMAINS); + $private = $this->findPublicSuffixFromSection($asciiDomain, PublicSuffix::PRIVATE_DOMAINS); if (count($private) > count($icann)) { return $private; } - if (PublicSuffixInterface::PRIVATE_DOMAINS === $section) { + if (PublicSuffix::PRIVATE_DOMAINS === $section) { return PublicSuffix::fromUnknownSection($asciiDomain->label(0), $this->asciiIDNAOption, $this->unicodeIDNAOption); } @@ -321,7 +321,7 @@ private function findPublicSuffix(ResolvedHostInterface $domain, string $section /** * Returns the public suffix matched against a given PSL section. */ - private function findPublicSuffixFromSection(DomainInterface $domain, string $section): PublicSuffixInterface + private function findPublicSuffixFromSection(DomainName $domain, string $section): PublicSuffix { $rules = $this->rules[$section] ?? []; $matches = []; @@ -352,7 +352,7 @@ private function findPublicSuffixFromSection(DomainInterface $domain, string $se $content = implode('.', array_reverse($matches)); - if (PublicSuffixInterface::PRIVATE_DOMAINS === $section) { + if (PublicSuffix::PRIVATE_DOMAINS === $section) { return PublicSuffix::fromPrivateSection($content, $this->asciiIDNAOption, $this->unicodeIDNAOption); } diff --git a/src/Storage/Manager.php b/src/Storage/Manager.php index f08297fb..597da66a 100644 --- a/src/Storage/Manager.php +++ b/src/Storage/Manager.php @@ -15,8 +15,8 @@ namespace Pdp\Storage; -use Pdp\PublicSuffixListInterface; -use Pdp\RootZoneDatabaseInterface; +use Pdp\PublicSuffixList; +use Pdp\RootZoneDatabase; use Pdp\Rules; use Pdp\TopLevelDomains; use Pdp\UnableToLoadPublicSuffixList; @@ -46,7 +46,7 @@ public function __construct(HttpClient $http, PublicSuffixListCache $rulesCache, * @throws HttpClientException * @throws UnableToLoadPublicSuffixList */ - public function getPublicSuffixListLocalCopy(string $uri = self::PSL_URL): PublicSuffixListInterface + public function getPublicSuffixListLocalCopy(string $uri = self::PSL_URL): PublicSuffixList { return $this->publicSuffixListCache->fetchByUri($uri) ?? $this->getPublicSuffixListRemoteCopy($uri); } @@ -57,7 +57,7 @@ public function getPublicSuffixListLocalCopy(string $uri = self::PSL_URL): Publi * @throws HttpClientException * @throws UnableToLoadPublicSuffixList */ - public function getPublicSuffixListRemoteCopy(string $uri = self::PSL_URL): PublicSuffixListInterface + public function getPublicSuffixListRemoteCopy(string $uri = self::PSL_URL): PublicSuffixList { $rules = Rules::fromString($this->http->getContent($uri)); @@ -72,7 +72,7 @@ public function getPublicSuffixListRemoteCopy(string $uri = self::PSL_URL): Publ * @throws HttpClientException * @throws UnableToLoadRootZoneDatabase */ - public function getRootZoneDatabaseLocalCopy(string $uri = self::RZD_URL): RootZoneDatabaseInterface + public function getRootZoneDatabaseLocalCopy(string $uri = self::RZD_URL): RootZoneDatabase { return $this->rootZoneDatabaseCache->fetchByUri($uri) ?? $this->getRootZoneDatabaseRemoteCopy($uri); } @@ -83,7 +83,7 @@ public function getRootZoneDatabaseLocalCopy(string $uri = self::RZD_URL): RootZ * @throws HttpClientException * @throws UnableToLoadRootZoneDatabase */ - public function getRootZoneDatabaseRemoteCopy(string $uri = self::RZD_URL): RootZoneDatabaseInterface + public function getRootZoneDatabaseRemoteCopy(string $uri = self::RZD_URL): RootZoneDatabase { $rootZoneDatabase = TopLevelDomains::fromString($this->http->getContent($uri)); diff --git a/src/Storage/RootZoneDatabaseCache.php b/src/Storage/RootZoneDatabaseCache.php index 6e9348ed..8f6ec228 100644 --- a/src/Storage/RootZoneDatabaseCache.php +++ b/src/Storage/RootZoneDatabaseCache.php @@ -15,14 +15,14 @@ namespace Pdp\Storage; -use Pdp\RootZoneDatabaseInterface; +use Pdp\RootZoneDatabase; interface RootZoneDatabaseCache { /** * Gets the Top Level Domains from the Cache. */ - public function fetchByUri(string $uri): ?RootZoneDatabaseInterface; + public function fetchByUri(string $uri): ?RootZoneDatabase; /** * Cache the Top Level Domains List. @@ -31,5 +31,5 @@ public function fetchByUri(string $uri): ?RootZoneDatabaseInterface; * * Returns true if the refresh was successful, false otherwise */ - public function storeByUri(string $uri, RootZoneDatabaseInterface $topLevelDomains): bool; + public function storeByUri(string $uri, RootZoneDatabase $topLevelDomains): bool; } diff --git a/src/Storage/RootZoneDatabaseCachePsr16Adapter.php b/src/Storage/RootZoneDatabaseCachePsr16Adapter.php index 40bbfc39..68ba6c13 100644 --- a/src/Storage/RootZoneDatabaseCachePsr16Adapter.php +++ b/src/Storage/RootZoneDatabaseCachePsr16Adapter.php @@ -18,7 +18,7 @@ use DateInterval; use DateTimeImmutable; use DateTimeInterface; -use Pdp\RootZoneDatabaseInterface; +use Pdp\RootZoneDatabase; use Pdp\TopLevelDomains; use Pdp\UnableToLoadRootZoneDatabase; use Psr\Log\LoggerInterface; @@ -102,7 +102,7 @@ private function setTtl($ttl): ?DateInterval * * @throws UnableToLoadRootZoneDatabase */ - public function fetchByUri(string $uri): ?RootZoneDatabaseInterface + public function fetchByUri(string $uri): ?RootZoneDatabase { $cacheKey = $this->getCacheKey($uri); $cacheData = $this->cache->get($cacheKey); @@ -130,7 +130,7 @@ private function getCacheKey(string $str): string return sprintf('%s_FULL_%s', self::CACHE_PREFIX, md5(strtolower($str))); } - public function storeByUri(string $uri, RootZoneDatabaseInterface $topLevelDomains): bool + public function storeByUri(string $uri, RootZoneDatabase $topLevelDomains): bool { try { $result = $this->cache->set($this->getCacheKey($uri), json_encode($topLevelDomains), $this->ttl); diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 79e299ec..079b191c 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -30,7 +30,7 @@ use const IDNA_DEFAULT; use const JSON_ERROR_NONE; -final class TopLevelDomains implements RootZoneDatabaseInterface +final class TopLevelDomains implements RootZoneDatabase { private DateTimeImmutable $modifiedDate; @@ -72,7 +72,7 @@ public static function fromPath( $context = null, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT - ): RootZoneDatabaseInterface { + ): RootZoneDatabase { $args = [$path, 'r', false]; if (null !== $context) { $args[] = $context; @@ -94,7 +94,7 @@ public static function fromString( string $content, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT - ): RootZoneDatabaseInterface { + ): RootZoneDatabase { static $converter; $converter = $converter ?? new RootZoneDatabaseConverter(); @@ -116,7 +116,7 @@ public static function fromJsonString( string $jsonString, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT - ): RootZoneDatabaseInterface { + ): RootZoneDatabase { $data = json_decode($jsonString, true); $errorCode = json_last_error(); if (JSON_ERROR_NONE !== $errorCode) { @@ -136,7 +136,7 @@ public static function fromJsonString( /** * {@inheritdoc} */ - public static function __set_state(array $properties): RootZoneDatabaseInterface + public static function __set_state(array $properties): RootZoneDatabase { return new self( $properties['records'], @@ -233,7 +233,7 @@ public function jsonSerialize(): array public function contains($tld): bool { try { - if (!$tld instanceof DomainInterface) { + if (!$tld instanceof DomainName) { $tld = new Domain($tld, $this->asciiIDNAOption, $this->unicodeIDNAOption); } } catch (ExceptionInterface $exception) { @@ -244,7 +244,7 @@ public function contains($tld): bool return false; } - /** @var DomainInterface $asciiDomain */ + /** @var DomainName $asciiDomain */ $asciiDomain = $tld->toAscii(); $label = $asciiDomain->label(0); foreach ($this as $knownTld) { @@ -261,16 +261,16 @@ public function contains($tld): bool * * @param mixed $domain a domain in a type that can be converted into a DomainInterface instance */ - public function resolve($domain): ResolvedHostInterface + public function resolve($domain): ResolvedHost { - if ($domain instanceof ResolvedHostInterface) { + if ($domain instanceof ResolvedHost) { $domain = $domain->getHost(); $domain ->withUnicodeIDNAOption($this->unicodeIDNAOption) ->withAsciiIDNAOption($this->asciiIDNAOption); } - if (!$domain instanceof DomainInterface) { + if (!$domain instanceof DomainName) { $domain = new Domain($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption); } @@ -287,7 +287,7 @@ public function resolve($domain): ResolvedHostInterface throw UnableToResolveDomain::dueToUnresolvableDomain($domain); } - /** @var DomainInterface $asciiDomain */ + /** @var DomainName $asciiDomain */ $asciiDomain = $domain->toAscii(); $publicSuffix = null; @@ -309,7 +309,7 @@ public function resolve($domain): ResolvedHostInterface * * @see https://www.php.net/manual/en/intl.constants.php */ - public function withAsciiIDNAOption(int $option): RootZoneDatabaseInterface + public function withAsciiIDNAOption(int $option): RootZoneDatabase { if ($option === $this->asciiIDNAOption) { return $this; @@ -328,7 +328,7 @@ public function withAsciiIDNAOption(int $option): RootZoneDatabaseInterface * * @see https://www.php.net/manual/en/intl.constants.php */ - public function withUnicodeIDNAOption(int $option): RootZoneDatabaseInterface + public function withUnicodeIDNAOption(int $option): RootZoneDatabase { if ($option === $this->unicodeIDNAOption) { return $this; diff --git a/src/UnableToResolveDomain.php b/src/UnableToResolveDomain.php index b1a8f503..8b3eed15 100644 --- a/src/UnableToResolveDomain.php +++ b/src/UnableToResolveDomain.php @@ -19,9 +19,9 @@ class UnableToResolveDomain extends InvalidArgumentException implements ExceptionInterface { - private ?HostInterface $domain = null; + private ?Host $domain = null; - public static function dueToUnresolvableDomain(?HostInterface $domain): self + public static function dueToUnresolvableDomain(?Host $domain): self { $content = $domain; if (null !== $content) { @@ -34,7 +34,7 @@ public static function dueToUnresolvableDomain(?HostInterface $domain): self return $exception; } - public static function dueToMissingRegistrableDomain(HostInterface $domain = null): self + public static function dueToMissingRegistrableDomain(Host $domain = null): self { $content = $domain; if (null !== $content) { @@ -57,7 +57,7 @@ public function hasDomain(): bool return null !== $this->domain; } - public function getDomain(): ?HostInterface + public function getDomain(): ?Host { return $this->domain; } diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 09a5eb82..8d8403c8 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -16,7 +16,7 @@ namespace Pdp\Tests; use Pdp\Domain; -use Pdp\InvalidDomain; +use Pdp\InvalidDomainName; use Pdp\InvalidHost; use PHPUnit\Framework\TestCase; use TypeError; @@ -361,7 +361,7 @@ public function testWithLabelFailsWithTypeError(): void */ public function testWithLabelFailsWithInvalidKey(): void { - self::expectException(InvalidDomain::class); + self::expectException(InvalidDomainName::class); (new Domain('example.com'))->withLabel(-4, 'www'); } @@ -460,7 +460,7 @@ public function withoutLabelWorksProvider(): iterable */ public function testwithoutLabelFailsWithInvalidKey(): void { - self::expectException(InvalidDomain::class); + self::expectException(InvalidDomainName::class); (new Domain('example.com'))->withoutLabel(-3); } diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 114c180d..6a4e6776 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -16,7 +16,7 @@ namespace Pdp\Tests; use InvalidArgumentException; -use Pdp\InvalidDomain; +use Pdp\InvalidDomainName; use Pdp\InvalidHost; use Pdp\PublicSuffix; use PHPUnit\Framework\TestCase; @@ -104,7 +104,7 @@ public function PSProvider(): iterable */ public function testConstructorThrowsException(string $publicSuffix): void { - self::expectException(InvalidDomain::class); + self::expectException(InvalidDomainName::class); PublicSuffix::fromUnknownSection($publicSuffix); } diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 72af1783..ec68e0e0 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -16,10 +16,9 @@ namespace Pdp\Tests; use Pdp\Domain; -use Pdp\InvalidDomain; +use Pdp\InvalidDomainName; use Pdp\InvalidHost; use Pdp\PublicSuffix; -use Pdp\PublicSuffixInterface; use Pdp\ResolvedDomain; use Pdp\Rules; use Pdp\Storage\CurlHttpClient; @@ -130,7 +129,7 @@ public function testwithIDNAOptions(): void * @covers ::validateDomain * @covers ::validateSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\HostParser::parse + * @covers \Pdp\DomainNameParser::parse */ public function testNullWillReturnNullDomain(): void { @@ -141,7 +140,7 @@ public function testNullWillReturnNullDomain(): void /** * @covers ::resolve - * @covers \Pdp\HostParser::parse + * @covers \Pdp\DomainNameParser::parse */ public function testThrowsTypeErrorOnWrongInput(): void { @@ -156,7 +155,7 @@ public function testThrowsTypeErrorOnWrongInput(): void * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown - * @covers \Pdp\HostParser::parse + * @covers \Pdp\DomainNameParser::parse */ public function testIsSuffixValidFalse(): void { @@ -173,7 +172,7 @@ public function testIsSuffixValidFalse(): void * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\PublicSuffix::isICANN * @covers \Pdp\PublicSuffix::isPrivate - * @covers \Pdp\HostParser::parse + * @covers \Pdp\DomainNameParser::parse */ public function testIsSuffixValidTrue(): void { @@ -194,7 +193,7 @@ public function testIsSuffixValidTrue(): void * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\PublicSuffix::isICANN * @covers \Pdp\PublicSuffix::isPrivate - * @covers \Pdp\HostParser::parse + * @covers \Pdp\DomainNameParser::parse */ public function testIsSuffixValidFalseWithPunycoded(): void { @@ -215,7 +214,7 @@ public function testIsSuffixValidFalseWithPunycoded(): void * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\PublicSuffix::isICANN * @covers \Pdp\PublicSuffix::isPrivate - * @covers \Pdp\HostParser::parse + * @covers \Pdp\DomainNameParser::parse */ public function testSubDomainIsNull(): void { @@ -230,7 +229,7 @@ public function testSubDomainIsNull(): void * @covers ::resolveCookieDomain * @covers ::validateDomain * @covers ::validateSection - * @covers \Pdp\HostParser::parse + * @covers \Pdp\DomainNameParser::parse */ public function testWithExceptionName(): void { @@ -244,7 +243,7 @@ public function testWithExceptionName(): void * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\HostParser::parse + * @covers \Pdp\DomainNameParser::parse */ public function testWithPrivateDomain(): void { @@ -276,7 +275,7 @@ public function testWithAbsoluteHostInvalid(): void * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\HostParser::parse + * @covers \Pdp\DomainNameParser::parse */ public function testWithPrivateDomainInvalid(): void { @@ -296,7 +295,7 @@ public function testWithPrivateDomainInvalid(): void * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\HostParser::parse + * @covers \Pdp\DomainNameParser::parse */ public function testWithPrivateDomainValid(): void { @@ -314,7 +313,7 @@ public function testWithPrivateDomainValid(): void * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\HostParser::parse + * @covers \Pdp\DomainNameParser::parse */ public function testWithICANNDomainInvalid(): void { @@ -332,7 +331,7 @@ public function testWithICANNDomainInvalid(): void * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection - * @covers \Pdp\HostParser::parse + * @covers \Pdp\DomainNameParser::parse */ public function testWithDomainObject(): void { @@ -352,7 +351,7 @@ public function testWithDomainObject(): void /** * @covers ::getPublicSuffix - * @covers \Pdp\HostParser::parse + * @covers \Pdp\DomainNameParser::parse */ public function testWithDomainInterfaceObject(): void { @@ -384,7 +383,7 @@ public function testGetRegistrableDomain(?string $publicSuffix, ?string $registr * @covers ::resolve * @covers ::resolveICANNDomain * @covers ::validateDomain - * @covers \Pdp\HostParser::parse + * @covers \Pdp\DomainNameParser::parse * @dataProvider parseDataProvider * @param ?string $publicSuffix * @param ?string $registrableDomain @@ -399,7 +398,7 @@ public function testGetPublicSuffix(?string $publicSuffix, ?string $registrableD /** * @covers ::resolve - * @covers \Pdp\HostParser::parse + * @covers \Pdp\DomainNameParser::parse * @covers \Pdp\Domain::getContent * @dataProvider parseDataProvider * @@ -509,7 +508,7 @@ public function parseDataProvider(): iterable /** * @covers ::getPublicSuffix * @covers ::validateSection - * @covers \Pdp\HostParser::parse + * @covers \Pdp\DomainNameParser::parse * @dataProvider invalidParseProvider */ public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix(string $domain, string $section): void @@ -521,20 +520,20 @@ public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix(string $dom public function invalidParseProvider(): iterable { return [ - 'single label host' => ['localhost', PublicSuffixInterface::ICANN_DOMAINS], + 'single label host' => ['localhost', PublicSuffix::ICANN_DOMAINS], ]; } /** * @covers ::getPublicSuffix * @covers ::validateSection - * @covers \Pdp\HostParser::parse + * @covers \Pdp\DomainNameParser::parse * * @dataProvider invalidDomainParseProvider */ public function testGetPublicSuffixThrowsInvalidDomainException(string $domain, string $section): void { - self::expectException(InvalidDomain::class); + self::expectException(InvalidDomainName::class); $this->rules->getPublicSuffix($domain, $section); } @@ -542,16 +541,16 @@ public function testGetPublicSuffixThrowsInvalidDomainException(string $domain, public function invalidDomainParseProvider(): iterable { return [ - 'IPv6' => ['[::1]', PublicSuffixInterface::ICANN_DOMAINS], - 'IPv4' => ['192.168.1.2', PublicSuffixInterface::ICANN_DOMAINS], - 'invalid host: label too long' => [implode('', array_fill(0, 64, 'a')).'.com', PublicSuffixInterface::ICANN_DOMAINS], + 'IPv6' => ['[::1]', PublicSuffix::ICANN_DOMAINS], + 'IPv4' => ['192.168.1.2', PublicSuffix::ICANN_DOMAINS], + 'invalid host: label too long' => [implode('', array_fill(0, 64, 'a')).'.com', PublicSuffix::ICANN_DOMAINS], ]; } /** * @covers ::getPublicSuffix * @covers ::validateSection - * @covers \Pdp\HostParser::parse + * @covers \Pdp\DomainNameParser::parse * * @dataProvider invalidHostParseProvider */ @@ -566,10 +565,10 @@ public function invalidHostParseProvider(): iterable $long_label = implode('.', array_fill(0, 62, 'a')); return [ - 'multiple label with URI delimiter' => ['local.ho/st', PublicSuffixInterface::ICANN_DOMAINS], - 'invalid host: invalid label according to RFC3986' => ['www.fußball.com-', PublicSuffixInterface::ICANN_DOMAINS], - 'invalid host: host contains space' => ['re view.com', PublicSuffixInterface::ICANN_DOMAINS], - 'invalid host: host too long' => ["$long_label.$long_label.$long_label. $long_label.$long_label", PublicSuffixInterface::ICANN_DOMAINS], + 'multiple label with URI delimiter' => ['local.ho/st', PublicSuffix::ICANN_DOMAINS], + 'invalid host: invalid label according to RFC3986' => ['www.fußball.com-', PublicSuffix::ICANN_DOMAINS], + 'invalid host: host contains space' => ['re view.com', PublicSuffix::ICANN_DOMAINS], + 'invalid host: host too long' => ["$long_label.$long_label.$long_label. $long_label.$long_label", PublicSuffix::ICANN_DOMAINS], ]; } @@ -577,7 +576,7 @@ public function invalidHostParseProvider(): iterable /** * @covers ::getPublicSuffix * @covers ::validateSection - * @covers \Pdp\HostParser::parse + * @covers \Pdp\DomainNameParser::parse * @dataProvider validPublicSectionProvider * @param ?string $domain * @param ?string $expected @@ -633,7 +632,7 @@ public function checkPublicSuffix(?string $input, ?string $expected): void * * @covers ::resolve * @covers ::findPublicSuffixFromSection - * @covers \Pdp\HostParser::parse + * @covers \Pdp\DomainNameParser::parse */ public function testPublicSuffixSpec(): void { diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index 07fac5e5..5eb9209b 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -20,8 +20,8 @@ use Pdp\Domain; use Pdp\InvalidHost; use Pdp\PublicSuffix; +use Pdp\RootZoneDatabase; use Pdp\RootZoneDatabaseConverter; -use Pdp\RootZoneDatabaseInterface; use Pdp\TopLevelDomains; use Pdp\UnableToLoadRootZoneDatabase; use Pdp\UnableToResolveDomain; @@ -38,7 +38,7 @@ class TopLevelDomainsTest extends TestCase { /** - * @var RootZoneDatabaseInterface + * @var RootZoneDatabase */ protected $collection; From 83c87ec13de385d42936896bc3771e0a8c0aacad Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 1 Aug 2020 15:52:41 +0200 Subject: [PATCH 210/461] IDNConversion independent interface --- src/DomainNameParser.php | 2 +- src/Host.php | 45 +------------- src/IDNConversion.php | 59 +++++++++++++++++++ src/PublicSuffixList.php | 38 +++--------- src/ResolvedDomain.php | 2 +- ...esolvedHost.php => ResolvedDomainName.php} | 2 +- src/RootZoneDatabase.php | 40 +------------ src/Rules.php | 16 ++--- src/TopLevelDomains.php | 4 +- 9 files changed, 84 insertions(+), 124 deletions(-) create mode 100644 src/IDNConversion.php rename src/{ResolvedHost.php => ResolvedDomainName.php} (97%) diff --git a/src/DomainNameParser.php b/src/DomainNameParser.php index 49e2b94f..d3a1922d 100644 --- a/src/DomainNameParser.php +++ b/src/DomainNameParser.php @@ -164,7 +164,7 @@ final protected function idnToUnicode(string $domain, int $option = IDNA_DEFAULT * * @param mixed $domain a domain * - * @throws InvalidHost If the domain is not a host + * @throws InvalidHost If the domain is not a host * @throws InvalidDomainName If the host is not a domain */ final protected function parse($domain = null, int $asciiOption = 0, int $unicodeOption = 0): array diff --git a/src/Host.php b/src/Host.php index 8ffedbd1..dea98b80 100644 --- a/src/Host.php +++ b/src/Host.php @@ -23,7 +23,7 @@ * @see https://tools.ietf.org/html/rfc1123#section-2.1 * @see https://tools.ietf.org/html/rfc5890 */ -interface Host extends Countable, JsonSerializable +interface Host extends Countable, JsonSerializable, IDNConversion { /** * Returns the domain content. @@ -33,13 +33,12 @@ public function getContent(): ?string; /** * {@inheritdoc} * - * Labels The total number. + * The labels total number. */ public function count(): int; /** * Returns the domain content. - * */ public function jsonSerialize(): ?string; @@ -48,24 +47,6 @@ public function jsonSerialize(): ?string; */ public function __toString(): string; - /** - * Gets conversion options for idn_to_ascii. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - */ - public function getAsciiIDNAOption(): int; - - /** - * Gets conversion options for idn_to_utf8. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - */ - public function getUnicodeIDNAOption(): int; - /** * Converts the domain to its IDNA ASCII form. * @@ -89,26 +70,4 @@ public function toAscii(): self; * @return static */ public function toUnicode(): self; - - /** - * Sets conversion options for idn_to_ascii. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - * - * @return static - */ - public function withAsciiIDNAOption(int $option): self; - - /** - * Sets conversion options for idn_to_utf8. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - * - * @return static - */ - public function withUnicodeIDNAOption(int $option): self; } diff --git a/src/IDNConversion.php b/src/IDNConversion.php new file mode 100644 index 00000000..56ad63ce --- /dev/null +++ b/src/IDNConversion.php @@ -0,0 +1,59 @@ +resolveCookieDomain($domain); @@ -218,7 +218,7 @@ public function resolve($domain): ResolvedHost * * @param mixed $domain the domain value */ - public function resolveCookieDomain($domain): ResolvedHost + public function resolveCookieDomain($domain): ResolvedDomainName { $domain = $this->validateDomain($domain); @@ -230,7 +230,7 @@ public function resolveCookieDomain($domain): ResolvedHost * * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolveICANNDomain($domain): ResolvedHost + public function resolveICANNDomain($domain): ResolvedDomainName { $domain = $this->validateDomain($domain); @@ -242,7 +242,7 @@ public function resolveICANNDomain($domain): ResolvedHost * * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolvePrivateDomain($domain): ResolvedHost + public function resolvePrivateDomain($domain): ResolvedDomainName { $domain = $this->validateDomain($domain); @@ -254,12 +254,12 @@ public function resolvePrivateDomain($domain): ResolvedHost * * @param mixed $domain a type that supports instantiating a Domain from. * - * @throws InvalidDomainName if the domain is invalid + * @throws InvalidDomainName if the domain is invalid * @throws UnableToResolveDomain if the domain is not resolvable */ - private function validateDomain($domain): ResolvedHost + private function validateDomain($domain): ResolvedDomainName { - if (!($domain instanceof ResolvedHost)) { + if (!($domain instanceof ResolvedDomainName)) { $domain = new ResolvedDomain(new Domain($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption), null); } @@ -296,7 +296,7 @@ private function validateSection(string $section): string /** * Returns the matched public suffix. */ - private function findPublicSuffix(ResolvedHost $domain, string $section): PublicSuffix + private function findPublicSuffix(ResolvedDomainName $domain, string $section): PublicSuffix { $asciiDomain = $domain->getHost(); /** @var DomainName $asciiDomain */ diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 079b191c..5a0c668f 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -261,9 +261,9 @@ public function contains($tld): bool * * @param mixed $domain a domain in a type that can be converted into a DomainInterface instance */ - public function resolve($domain): ResolvedHost + public function resolve($domain): ResolvedDomainName { - if ($domain instanceof ResolvedHost) { + if ($domain instanceof ResolvedDomainName) { $domain = $domain->getHost(); $domain ->withUnicodeIDNAOption($this->unicodeIDNAOption) From 033f0daa4899d62b1cbd281a4599d2456cefaafc Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 1 Aug 2020 16:05:44 +0200 Subject: [PATCH 211/461] Improve Interface typehinting --- phpstan.src.neon | 2 -- src/PublicSuffixList.php | 31 +++++++++++++++++-------------- src/RootZoneDatabase.php | 8 ++------ src/TopLevelDomains.php | 2 -- 4 files changed, 19 insertions(+), 24 deletions(-) diff --git a/phpstan.src.neon b/phpstan.src.neon index 4fd69b17..81780e82 100644 --- a/phpstan.src.neon +++ b/phpstan.src.neon @@ -16,6 +16,4 @@ parameters: path: src/ResolvedDomain.php - message: '#Method Pdp\\ResolvedDomain::withSubDomain\(\) has parameter \$subDomain with no typehint specified.#' path: src/ResolvedDomain.php - - message: '#PHPDoc tag @param for parameter \$domain with type mixed is not subtype of native type Pdp\\Host.#' - path: src/PublicSuffixList.php reportUnmatchedIgnoredErrors: true diff --git a/src/PublicSuffixList.php b/src/PublicSuffixList.php index b4c3fa53..eac478fa 100644 --- a/src/PublicSuffixList.php +++ b/src/PublicSuffixList.php @@ -19,54 +19,57 @@ interface PublicSuffixList extends IDNConversion, JsonSerializable { + /** + * Returns an array representation of the Public Suffix List Rules JSON serializable + */ public function jsonSerialize(): array; /** - * Determines the public suffix for a given domain against the PSL rules for cookie domain detection.. + * Determines the effective TLD against the PSL rules for cookie domain detection. * * @throws ExceptionInterface If the PublicSuffix can not be resolve. */ - public function getCookieEffectiveTLD(ResolvedDomainName $domain): PublicSuffix; + public function getCookieEffectiveTLD(Host $domain): PublicSuffix; /** - * Determines the public suffix for a given domain against the PSL rules for ICANN domain detection.. + * Determines the effective TLD against the PSL rules for ICANN domain detection. * * @throws ExceptionInterface If the PublicSuffix can not be resolve. */ - public function getICANNEffectiveTLD(ResolvedDomainName $domain): PublicSuffix; + public function getICANNEffectiveTLD(Host $domain): PublicSuffix; /** - * Determines the public suffix for a given domain against the PSL rules for private domain detection.. + * Determines the effective TLD against the PSL rules for private domain detection. * - * @throws ExceptionInterface If the PublicSuffix can not be resolve. + * @throws ExceptionInterface If the effective TLD can not be resolve. */ - public function getPrivateEffectiveTLD(ResolvedDomainName $domain): PublicSuffix; + public function getPrivateEffectiveTLD(Host $domain): PublicSuffix; /** * Returns PSL info for a given domain. * - * @param mixed $domain a type that supports instantiating a Domain from. + * If the effective TLD can not be resolved it returns a null ResolvedDomainName */ public function resolve(Host $domain): ResolvedDomainName; /** * Returns PSL info for a given domain against the PSL rules for cookie domain detection. * - * @param mixed $domain the domain value + * @throws ExceptionInterface If the effective TLD can not be resolve. */ - public function resolveCookieDomain($domain): ResolvedDomainName; + public function resolveCookieDomain(Host $domain): ResolvedDomainName; /** * Returns PSL info for a given domain against the PSL rules for ICANN domain detection. * - * @param mixed $domain a type that supports instantiating a Domain from. + * @throws ExceptionInterface If the effective TLD can not be resolve. */ - public function resolveICANNDomain($domain): ResolvedDomainName; + public function resolveICANNDomain(Host $domain): ResolvedDomainName; /** * Returns PSL info for a given domain against the PSL rules for private domain detection. * - * @param mixed $domain a type that supports instantiating a Domain from. + * @throws ExceptionInterface If the effective TLD can not be resolve. */ - public function resolvePrivateDomain($domain): ResolvedDomainName; + public function resolvePrivateDomain(Host $domain): ResolvedDomainName; } diff --git a/src/RootZoneDatabase.php b/src/RootZoneDatabase.php index 3416af5a..9617a51c 100644 --- a/src/RootZoneDatabase.php +++ b/src/RootZoneDatabase.php @@ -54,15 +54,11 @@ public function jsonSerialize(): array; /** * Tells whether the submitted TLD is a valid Top Level Domain. - * - * @param mixed $tld a TLD in a type that can be converted into a DomainInterface instance */ - public function contains($tld): bool; + public function contains(Host $tld): bool; /** * Returns a domain where its public suffix is the found TLD. - * - * @param mixed $domain a domain in a type that can be converted into a DomainInterface instance */ - public function resolve($domain): ResolvedDomainName; + public function resolve(Host $domain): ResolvedDomainName; } diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 5a0c668f..5edd7b1a 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -244,7 +244,6 @@ public function contains($tld): bool return false; } - /** @var DomainName $asciiDomain */ $asciiDomain = $tld->toAscii(); $label = $asciiDomain->label(0); foreach ($this as $knownTld) { @@ -287,7 +286,6 @@ public function resolve($domain): ResolvedDomainName throw UnableToResolveDomain::dueToUnresolvableDomain($domain); } - /** @var DomainName $asciiDomain */ $asciiDomain = $domain->toAscii(); $publicSuffix = null; From cb728aa107356a0ce7717bc9c714d0e3532e74c5 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 1 Aug 2020 18:58:58 +0200 Subject: [PATCH 212/461] Remove Rules::getPublicSuffix method and simplify Rules internal codebase --- src/PublicSuffixList.php | 2 +- src/PublicSuffixListConverter.php | 4 +- src/ResolvedDomain.php | 10 +-- src/Rules.php | 110 ++++++++------------------- src/TopLevelDomains.php | 63 ++------------- src/UnableToLoadPublicSuffixList.php | 10 +++ tests/RulesTest.php | 83 ++++++-------------- tests/TopLevelDomainsTest.php | 59 +++++++------- 8 files changed, 105 insertions(+), 236 deletions(-) diff --git a/src/PublicSuffixList.php b/src/PublicSuffixList.php index eac478fa..1eb3f60f 100644 --- a/src/PublicSuffixList.php +++ b/src/PublicSuffixList.php @@ -20,7 +20,7 @@ interface PublicSuffixList extends IDNConversion, JsonSerializable { /** - * Returns an array representation of the Public Suffix List Rules JSON serializable + * Returns an array representation of the Public Suffix List Rules JSON serializable. */ public function jsonSerialize(): array; diff --git a/src/PublicSuffixListConverter.php b/src/PublicSuffixListConverter.php index a7e41055..19fdd5e7 100644 --- a/src/PublicSuffixListConverter.php +++ b/src/PublicSuffixListConverter.php @@ -26,11 +26,11 @@ final class PublicSuffixListConverter extends DomainNameParser { private const PSL_SECTION = [ 'ICANN' => [ - 'BEGIN' => PublicSuffix::ICANN_DOMAINS, + 'BEGIN' => EffectiveTLD::ICANN_DOMAINS, 'END' => '', ], 'PRIVATE' => [ - 'BEGIN' => PublicSuffix::PRIVATE_DOMAINS, + 'BEGIN' => EffectiveTLD::PRIVATE_DOMAINS, 'END' => '', ], ]; diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 6cad9dec..20442a8d 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -39,24 +39,18 @@ final class ResolvedDomain implements ResolvedDomainName public function __construct(Host $domain, ?PublicSuffix $publicSuffix = null) { - $this->domain = $this->setDomain($domain); + $this->domain = $this->setDomainName($domain); $this->publicSuffix = $this->setPublicSuffix($publicSuffix); $this->registrableDomain = $this->setRegistrableDomain(); $this->subDomain = $this->setSubDomain(); } - /** - * {@inheritdoc} - */ public static function __set_state(array $properties): self { return new self($properties['domain'], $properties['publicSuffix']); } - /** - * Sets the domain. - */ - private function setDomain(Host $domain): DomainName + private function setDomainName(Host $domain): DomainName { if ($domain instanceof DomainName) { return $domain; diff --git a/src/Rules.php b/src/Rules.php index 100c3f36..188cb759 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -20,7 +20,7 @@ use function fclose; use function fopen; use function implode; -use function in_array; +use function is_array; use function json_decode; use function json_last_error; use function json_last_error_msg; @@ -31,7 +31,7 @@ final class Rules implements PublicSuffixList { - private const PSL_SECTION = [PublicSuffix::PRIVATE_DOMAINS, PublicSuffix::ICANN_DOMAINS, '']; + private const PSL_SECTION = [EffectiveTLD::PRIVATE_DOMAINS, EffectiveTLD::ICANN_DOMAINS, '']; /** * PSL rules as a multidimentional associative array. @@ -42,11 +42,8 @@ final class Rules implements PublicSuffixList private int $unicodeIDNAOption; - private function __construct( - array $rules, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT - ) { + private function __construct(array $rules, int $asciiIDNAOption, int $unicodeIDNAOption) + { $this->rules = $rules; $this->asciiIDNAOption = $asciiIDNAOption; $this->unicodeIDNAOption = $unicodeIDNAOption; @@ -108,19 +105,20 @@ public static function fromJsonString( throw UnableToLoadPublicSuffixList::dueToInvalidJson($errorCode, json_last_error_msg()); } + if (!isset($data[EffectiveTLD::ICANN_DOMAINS], $data[EffectiveTLD::PRIVATE_DOMAINS])) { + throw UnableToLoadPublicSuffixList::dueToInvalidHashMap(); + } + + if (!is_array($data[EffectiveTLD::ICANN_DOMAINS]) || !is_array($data[EffectiveTLD::PRIVATE_DOMAINS])) { + throw UnableToLoadPublicSuffixList::dueToCorruptedSection(); + } + return new self($data, $asciiIDNAOption, $unicodeIDNAOption); } - /** - * {@inheritdoc} - */ public static function __set_state(array $properties): self { - return new self( - $properties['rules'], - $properties['asciiIDNAOption'] ?? IDNA_DEFAULT, - $properties['unicodeIDNAOption'] ?? IDNA_DEFAULT - ); + return new self($properties['rules'], $properties['asciiIDNAOption'], $properties['unicodeIDNAOption']); } public function getAsciiIDNAOption(): int @@ -139,60 +137,48 @@ public function jsonSerialize(): array } /** - * Determines the public suffix for a given domain. - * * @param mixed $domain a type that supports instantiating a Domain from. * * @throws UnableToResolveDomain If the PublicSuffix can not be resolve. */ - public function getPublicSuffix($domain, string $section = ''): PublicSuffix + public function getCookieEffectiveTLD($domain): PublicSuffix { $domain = $this->validateDomain($domain); - $publicSuffix = $this->findPublicSuffix($domain, $this->validateSection($section)); + $publicSuffix = $this->findPublicSuffix($domain, ''); return $domain->resolve($publicSuffix)->getPublicSuffix(); } /** - * Determines the public suffix for a given domain against the PSL rules for cookie domain detection.. - * - * @param mixed $domain a type that supports instantiating a Domain from. - * - * @throws UnableToResolveDomain If the PublicSuffix can not be resolve. - */ - public function getCookieEffectiveTLD($domain): PublicSuffix - { - return $this->getPublicSuffix($domain, ''); - } - - /** - * Determines the public suffix for a given domain against the PSL rules for ICANN domain detection.. - * * @param mixed $domain a type that supports instantiating a Domain from. * * @throws UnableToResolveDomain If the PublicSuffix can not be resolve. */ public function getICANNEffectiveTLD($domain): PublicSuffix { - return $this->getPublicSuffix($domain, PublicSuffix::ICANN_DOMAINS); + $domain = $this->validateDomain($domain); + + $publicSuffix = $this->findPublicSuffix($domain, EffectiveTLD::ICANN_DOMAINS); + + return $domain->resolve($publicSuffix)->getPublicSuffix(); } /** - * Determines the public suffix for a given domain against the PSL rules for private domain detection.. - * * @param mixed $domain a type that supports instantiating a Domain from. * * @throws UnableToResolveDomain If the PublicSuffix can not be resolve. */ public function getPrivateEffectiveTLD($domain): PublicSuffix { - return $this->getPublicSuffix($domain, PublicSuffix::PRIVATE_DOMAINS); + $domain = $this->validateDomain($domain); + + $publicSuffix = $this->findPublicSuffix($domain, EffectiveTLD::PRIVATE_DOMAINS); + + return $domain->resolve($publicSuffix)->getPublicSuffix(); } /** - * Returns PSL info for a given domain. - * * @param mixed $domain a type that supports instantiating a Domain from. */ public function resolve($domain): ResolvedDomainName @@ -214,8 +200,6 @@ public function resolve($domain): ResolvedDomainName } /** - * Returns PSL info for a given domain against the PSL rules for cookie domain detection. - * * @param mixed $domain the domain value */ public function resolveCookieDomain($domain): ResolvedDomainName @@ -226,20 +210,16 @@ public function resolveCookieDomain($domain): ResolvedDomainName } /** - * Returns PSL info for a given domain against the PSL rules for ICANN domain detection. - * * @param mixed $domain a type that supports instantiating a Domain from. */ public function resolveICANNDomain($domain): ResolvedDomainName { $domain = $this->validateDomain($domain); - return $domain->resolve($this->findPublicSuffix($domain, PublicSuffix::ICANN_DOMAINS)); + return $domain->resolve($this->findPublicSuffix($domain, EffectiveTLD::ICANN_DOMAINS)); } /** - * Returns PSL info for a given domain against the PSL rules for private domain detection. - * * @param mixed $domain a type that supports instantiating a Domain from. */ public function resolvePrivateDomain($domain): ResolvedDomainName @@ -260,7 +240,7 @@ public function resolvePrivateDomain($domain): ResolvedDomainName private function validateDomain($domain): ResolvedDomainName { if (!($domain instanceof ResolvedDomainName)) { - $domain = new ResolvedDomain(new Domain($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption), null); + $domain = new ResolvedDomain(new Domain($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption)); } $domainContent = $domain->getContent(); @@ -279,20 +259,6 @@ private function validateDomain($domain): ResolvedDomainName return $domain; } - /** - * Assert the section status. - * - * @throws ExceptionInterface if the submitted section is not supported - */ - private function validateSection(string $section): string - { - if (in_array($section, self::PSL_SECTION, true)) { - return $section; - } - - throw UnableToResolveDomain::dueToUnSupportedSection($section); - } - /** * Returns the matched public suffix. */ @@ -301,17 +267,17 @@ private function findPublicSuffix(ResolvedDomainName $domain, string $section): $asciiDomain = $domain->getHost(); /** @var DomainName $asciiDomain */ $asciiDomain = $asciiDomain->toAscii(); - $icann = $this->findPublicSuffixFromSection($asciiDomain, PublicSuffix::ICANN_DOMAINS); - if (PublicSuffix::ICANN_DOMAINS === $section) { + $icann = $this->findPublicSuffixFromSection($asciiDomain, EffectiveTLD::ICANN_DOMAINS); + if (EffectiveTLD::ICANN_DOMAINS === $section) { return $icann; } - $private = $this->findPublicSuffixFromSection($asciiDomain, PublicSuffix::PRIVATE_DOMAINS); + $private = $this->findPublicSuffixFromSection($asciiDomain, EffectiveTLD::PRIVATE_DOMAINS); if (count($private) > count($icann)) { return $private; } - if (PublicSuffix::PRIVATE_DOMAINS === $section) { + if (EffectiveTLD::PRIVATE_DOMAINS === $section) { return PublicSuffix::fromUnknownSection($asciiDomain->label(0), $this->asciiIDNAOption, $this->unicodeIDNAOption); } @@ -359,13 +325,6 @@ private function findPublicSuffixFromSection(DomainName $domain, string $section return PublicSuffix::fromICANNSection($content, $this->asciiIDNAOption, $this->unicodeIDNAOption); } - /** - * Sets conversion options for idn_to_ascii. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - */ public function withAsciiIDNAOption(int $asciiIDNAOption): self { if ($asciiIDNAOption === $this->asciiIDNAOption) { @@ -378,13 +337,6 @@ public function withAsciiIDNAOption(int $asciiIDNAOption): self return $clone; } - /** - * Sets conversion options for idn_to_utf8. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - */ public function withUnicodeIDNAOption(int $unicodeIDNAOption): self { if ($unicodeIDNAOption === $this->unicodeIDNAOption) { diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 5edd7b1a..d474544a 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -46,8 +46,8 @@ private function __construct( array $records, string $version, DateTimeInterface $modifiedDate, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT + int $asciiIDNAOption, + int $unicodeIDNAOption ) { if ($modifiedDate instanceof DateTime) { $modifiedDate = DateTimeImmutable::createFromMutable($modifiedDate); @@ -72,7 +72,7 @@ public static function fromPath( $context = null, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT - ): RootZoneDatabase { + ): self { $args = [$path, 'r', false]; if (null !== $context) { $args[] = $context; @@ -94,7 +94,7 @@ public static function fromString( string $content, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT - ): RootZoneDatabase { + ): self { static $converter; $converter = $converter ?? new RootZoneDatabaseConverter(); @@ -116,7 +116,7 @@ public static function fromJsonString( string $jsonString, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT - ): RootZoneDatabase { + ): self { $data = json_decode($jsonString, true); $errorCode = json_last_error(); if (JSON_ERROR_NONE !== $errorCode) { @@ -133,9 +133,6 @@ public static function fromJsonString( return new self($data['records'], $data['version'], $modifiedDate, $asciiIDNAOption, $unicodeIDNAOption); } - /** - * {@inheritdoc} - */ public static function __set_state(array $properties): RootZoneDatabase { return new self( @@ -147,65 +144,36 @@ public static function __set_state(array $properties): RootZoneDatabase ); } - /** - * Returns the Version ID. - */ public function getVersion(): string { return $this->version; } - /** - * Returns the List Last Modified Date. - */ public function getModifiedDate(): DateTimeImmutable { return $this->modifiedDate; } - /** - * Gets conversion options for idn_to_ascii. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - */ public function getAsciiIDNAOption(): int { return $this->asciiIDNAOption; } - /** - * Gets conversion options for idn_to_utf8. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - */ public function getUnicodeIDNAOption(): int { return $this->unicodeIDNAOption; } - /** - * {@inheritdoc} - */ public function count(): int { return count($this->records); } - /** - * Tells whether the list is empty. - */ public function isEmpty(): bool { return [] === $this->records; } - /** - * {@inheritdoc} - */ public function getIterator() { foreach ($this->records as $tld) { @@ -213,9 +181,6 @@ public function getIterator() } } - /** - * Returns an array representation of the list. - */ public function jsonSerialize(): array { return [ @@ -226,8 +191,6 @@ public function jsonSerialize(): array } /** - * Tells whether the submitted TLD is a valid Top Level Domain. - * * @param mixed $tld a TLD in a type that can be converted into a DomainInterface instance */ public function contains($tld): bool @@ -256,8 +219,6 @@ public function contains($tld): bool } /** - * Returns a domain where its public suffix is the found TLD. - * * @param mixed $domain a domain in a type that can be converted into a DomainInterface instance */ public function resolve($domain): ResolvedDomainName @@ -300,13 +261,6 @@ public function resolve($domain): ResolvedDomainName return new ResolvedDomain($domain, PublicSuffix::fromUnknownSection($publicSuffix)); } - /** - * Sets conversion options for idn_to_ascii. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - */ public function withAsciiIDNAOption(int $option): RootZoneDatabase { if ($option === $this->asciiIDNAOption) { @@ -319,13 +273,6 @@ public function withAsciiIDNAOption(int $option): RootZoneDatabase return $clone; } - /** - * Sets conversion options for idn_to_utf8. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - */ public function withUnicodeIDNAOption(int $option): RootZoneDatabase { if ($option === $this->unicodeIDNAOption) { diff --git a/src/UnableToLoadPublicSuffixList.php b/src/UnableToLoadPublicSuffixList.php index de01a8aa..5872c95c 100644 --- a/src/UnableToLoadPublicSuffixList.php +++ b/src/UnableToLoadPublicSuffixList.php @@ -34,4 +34,14 @@ public static function dueToInvalidRule(?string $line, Throwable $exception): se { return new self('The following rule "'.$line ?? 'NULL'.'" could not be processed because it is invalid', 0, $exception); } + + public static function dueToInvalidHashMap(): self + { + return new self('The public suffix list data are missing one of the required ICANN or PRIVATE domain section.'); + } + + public static function dueToCorruptedSection(): self + { + return new self('The public suffix list section data are corrupted.'); + } } diff --git a/tests/RulesTest.php b/tests/RulesTest.php index ec68e0e0..9331e6e3 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -21,11 +21,6 @@ use Pdp\PublicSuffix; use Pdp\ResolvedDomain; use Pdp\Rules; -use Pdp\Storage\CurlHttpClient; -use Pdp\Storage\Manager; -use Pdp\Storage\Psr16FileCache; -use Pdp\Storage\PublicSuffixListCachePsr16Adapter; -use Pdp\Storage\RootZoneDatabaseCachePsr16Adapter; use Pdp\UnableToLoadPublicSuffixList; use Pdp\UnableToResolveDomain; use PHPUnit\Framework\TestCase; @@ -127,7 +122,6 @@ public function testwithIDNAOptions(): void * @covers ::resolveICANNDomain * @covers ::resolvePrivateDomain * @covers ::validateDomain - * @covers ::validateSection * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\DomainNameParser::parse */ @@ -150,7 +144,6 @@ public function testThrowsTypeErrorOnWrongInput(): void /** * @covers ::resolve - * @covers ::validateSection * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection @@ -165,7 +158,6 @@ public function testIsSuffixValidFalse(): void /** * @covers ::resolve - * @covers ::validateSection * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection @@ -186,7 +178,6 @@ public function testIsSuffixValidTrue(): void * @covers ::resolve * @covers ::resolveCookieDomain * @covers ::validateDomain - * @covers ::validateSection * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection @@ -207,7 +198,6 @@ public function testIsSuffixValidFalseWithPunycoded(): void * @covers ::resolve * @covers ::resolveICANNDomain * @covers ::validateDomain - * @covers ::validateSection * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection @@ -228,7 +218,6 @@ public function testSubDomainIsNull(): void * @covers ::resolve * @covers ::resolveCookieDomain * @covers ::validateDomain - * @covers ::validateSection * @covers \Pdp\DomainNameParser::parse */ public function testWithExceptionName(): void @@ -239,7 +228,6 @@ public function testWithExceptionName(): void /** * @covers ::resolve - * @covers ::validateSection * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection @@ -271,7 +259,6 @@ public function testWithAbsoluteHostInvalid(): void * @covers ::resolve * @covers ::resolvePrivateDomain * @covers ::validateDomain - * @covers ::validateSection * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection @@ -291,7 +278,6 @@ public function testWithPrivateDomainInvalid(): void * @covers ::resolve * @covers ::resolvePrivateDomain * @covers ::validateDomain - * @covers ::validateSection * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection @@ -309,7 +295,6 @@ public function testWithPrivateDomainValid(): void /** * @covers ::resolve - * @covers ::validateSection * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection @@ -327,7 +312,6 @@ public function testWithICANNDomainInvalid(): void /** * @covers ::resolve - * @covers ::validateSection * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection @@ -350,7 +334,7 @@ public function testWithDomainObject(): void } /** - * @covers ::getPublicSuffix + * @covers ::getCookieEffectiveTLD * @covers \Pdp\DomainNameParser::parse */ public function testWithDomainInterfaceObject(): void @@ -359,7 +343,7 @@ public function testWithDomainInterfaceObject(): void self::assertSame( 'ac.be', - $this->rules->getPublicSuffix($domain)->getContent() + $this->rules->getCookieEffectiveTLD($domain)->getContent() ); } @@ -506,58 +490,49 @@ public function parseDataProvider(): iterable } /** - * @covers ::getPublicSuffix - * @covers ::validateSection + * @covers ::validateDomain * @covers \Pdp\DomainNameParser::parse - * @dataProvider invalidParseProvider */ - public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix(string $domain, string $section): void + public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix(): void { self::expectException(UnableToResolveDomain::class); - $this->rules->getPublicSuffix($domain, $section); - } - public function invalidParseProvider(): iterable - { - return [ - 'single label host' => ['localhost', PublicSuffix::ICANN_DOMAINS], - ]; + $this->rules->getICANNEffectiveTLD('localhost'); } /** - * @covers ::getPublicSuffix - * @covers ::validateSection + * @covers ::getICANNEffectiveTLD * @covers \Pdp\DomainNameParser::parse * * @dataProvider invalidDomainParseProvider */ - public function testGetPublicSuffixThrowsInvalidDomainException(string $domain, string $section): void + public function testGetPublicSuffixThrowsInvalidDomainException(string $domain): void { self::expectException(InvalidDomainName::class); - $this->rules->getPublicSuffix($domain, $section); + $this->rules->getICANNEffectiveTLD($domain); } public function invalidDomainParseProvider(): iterable { return [ - 'IPv6' => ['[::1]', PublicSuffix::ICANN_DOMAINS], - 'IPv4' => ['192.168.1.2', PublicSuffix::ICANN_DOMAINS], - 'invalid host: label too long' => [implode('', array_fill(0, 64, 'a')).'.com', PublicSuffix::ICANN_DOMAINS], + 'IPv6' => ['[::1]'], + 'IPv4' => ['192.168.1.2'], + 'invalid host: label too long' => [implode('', array_fill(0, 64, 'a')).'.com'], ]; } /** - * @covers ::getPublicSuffix - * @covers ::validateSection + * @covers ::getICANNEffectiveTLD * @covers \Pdp\DomainNameParser::parse * * @dataProvider invalidHostParseProvider */ - public function testGetPublicSuffixThrowsInvalidHostException(string $domain, string $section): void + public function testGetPublicSuffixThrowsInvalidHostException(string $domain): void { self::expectException(InvalidHost::class); - $this->rules->getPublicSuffix($domain, $section); + + $this->rules->getICANNEffectiveTLD($domain); } public function invalidHostParseProvider(): iterable @@ -565,17 +540,16 @@ public function invalidHostParseProvider(): iterable $long_label = implode('.', array_fill(0, 62, 'a')); return [ - 'multiple label with URI delimiter' => ['local.ho/st', PublicSuffix::ICANN_DOMAINS], - 'invalid host: invalid label according to RFC3986' => ['www.fußball.com-', PublicSuffix::ICANN_DOMAINS], - 'invalid host: host contains space' => ['re view.com', PublicSuffix::ICANN_DOMAINS], - 'invalid host: host too long' => ["$long_label.$long_label.$long_label. $long_label.$long_label", PublicSuffix::ICANN_DOMAINS], + 'multiple label with URI delimiter' => ['local.ho/st'], + 'invalid host: invalid label according to RFC3986' => ['www.fußball.com-'], + 'invalid host: host contains space' => ['re view.com'], + 'invalid host: host too long' => ["$long_label.$long_label.$long_label. $long_label.$long_label"], ]; } /** - * @covers ::getPublicSuffix - * @covers ::validateSection + * @covers ::getCookieEffectiveTLD * @covers \Pdp\DomainNameParser::parse * @dataProvider validPublicSectionProvider * @param ?string $domain @@ -583,7 +557,7 @@ public function invalidHostParseProvider(): iterable */ public function testPublicSuffixSection(?string $domain, ?string $expected): void { - $publicSuffix = $this->rules->getPublicSuffix($domain); + $publicSuffix = $this->rules->getCookieEffectiveTLD($domain); self::assertSame($expected, $publicSuffix->getContent()); } @@ -749,19 +723,12 @@ public function testResolveWithIDNAOptions(): void [IDNA_DEFAULT, IDNA_DEFAULT], [$resolvedByDefault->getAsciiIDNAOption(), $resolvedByDefault->getUnicodeIDNAOption()] ); - $psr16Cache = new Psr16FileCache(__DIR__.'/data'); - $manager = new Manager( - new CurlHttpClient(), - new PublicSuffixListCachePsr16Adapter($psr16Cache), - new RootZoneDatabaseCachePsr16Adapter($psr16Cache) - ); - - /** @var Rules $rules */ - $rules = $manager->getPublicSuffixListLocalCopy() - ->withAsciiIDNAOption(IDNA_NONTRANSITIONAL_TO_ASCII) - ->withUnicodeIDNAOption(IDNA_NONTRANSITIONAL_TO_UNICODE); + /** @var string $string */ + $string = file_get_contents(__DIR__.'/data/public_suffix_list.dat'); + $rules = Rules::fromString($string, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); $resolved = $rules->resolve('foo.de'); + self::assertSame( [$rules->getAsciiIDNAOption(), $rules->getUnicodeIDNAOption()], [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption()] diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index 5eb9209b..ed147bb6 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -20,7 +20,6 @@ use Pdp\Domain; use Pdp\InvalidHost; use Pdp\PublicSuffix; -use Pdp\RootZoneDatabase; use Pdp\RootZoneDatabaseConverter; use Pdp\TopLevelDomains; use Pdp\UnableToLoadRootZoneDatabase; @@ -38,13 +37,13 @@ class TopLevelDomainsTest extends TestCase { /** - * @var RootZoneDatabase + * @var TopLevelDomains */ - protected $collection; + protected $topLevelDomains; public function setUp(): void { - $this->collection = TopLevelDomains::fromPath(__DIR__.'/data/tlds-alpha-by-domain.txt'); + $this->topLevelDomains = TopLevelDomains::fromPath(__DIR__.'/data/tlds-alpha-by-domain.txt'); } /** @@ -61,8 +60,8 @@ public function testCreateFromPath(): void ], ]); - $collection = TopLevelDomains::fromPath(__DIR__.'/data/tlds-alpha-by-domain.txt', $context); - self::assertEquals($this->collection, $collection); + $topLevelDomains = TopLevelDomains::fromPath(__DIR__.'/data/tlds-alpha-by-domain.txt', $context); + self::assertEquals($this->topLevelDomains, $topLevelDomains); } /** @@ -80,28 +79,28 @@ public function testCreateFromPathThrowsException(): void */ public function testSetState(): void { - $collection = eval('return '.var_export($this->collection, true).';'); - self::assertEquals($this->collection, $collection); + $topLevelDomains = eval('return '.var_export($this->topLevelDomains, true).';'); + self::assertEquals($this->topLevelDomains, $topLevelDomains); } public function testGetterProperties(): void { - $collection = TopLevelDomains::fromPath(__DIR__.'/data/root_zones.dat'); - self::assertCount(15, $collection); - self::assertSame('2018082200', $collection->getVersion()); + $topLevelDomains = TopLevelDomains::fromPath(__DIR__.'/data/root_zones.dat'); + self::assertCount(15, $topLevelDomains); + self::assertSame('2018082200', $topLevelDomains->getVersion()); self::assertEquals( new DateTimeImmutable('2018-08-22 07:07:01', new DateTimeZone('UTC')), - $collection->getModifiedDate() + $topLevelDomains->getModifiedDate() ); - self::assertFalse($collection->isEmpty()); + self::assertFalse($topLevelDomains->isEmpty()); $converter = new RootZoneDatabaseConverter(); /** @var string $content */ $content = file_get_contents(__DIR__.'/data/root_zones.dat'); $data = $converter->convert($content); - self::assertEquals($data, $collection->jsonSerialize()); + self::assertEquals($data, $topLevelDomains->jsonSerialize()); - foreach ($collection as $tld) { + foreach ($topLevelDomains as $tld) { self::assertInstanceOf(PublicSuffix::class, $tld); } } @@ -114,19 +113,19 @@ public function testGetterProperties(): void */ public function testwithIDNAOptions(): void { - self::assertSame($this->collection, $this->collection->withAsciiIDNAOption( - $this->collection->getAsciiIDNAOption() + self::assertSame($this->topLevelDomains, $this->topLevelDomains->withAsciiIDNAOption( + $this->topLevelDomains->getAsciiIDNAOption() )); - self::assertNotEquals($this->collection, $this->collection->withAsciiIDNAOption( + self::assertNotEquals($this->topLevelDomains, $this->topLevelDomains->withAsciiIDNAOption( 128 )); - self::assertSame($this->collection, $this->collection->withUnicodeIDNAOption( - $this->collection->getUnicodeIDNAOption() + self::assertSame($this->topLevelDomains, $this->topLevelDomains->withUnicodeIDNAOption( + $this->topLevelDomains->getUnicodeIDNAOption() )); - self::assertNotEquals($this->collection, $this->collection->withUnicodeIDNAOption( + self::assertNotEquals($this->topLevelDomains, $this->topLevelDomains->withUnicodeIDNAOption( 128 )); } @@ -140,7 +139,7 @@ public function testResolve($tld): void { self::assertSame( (new Domain($tld))->label(0), - $this->collection->resolve($tld)->getPublicSuffix()->getContent() + $this->topLevelDomains->resolve($tld)->getPublicSuffix()->getContent() ); } @@ -167,21 +166,22 @@ public function __toString() public function testResolveThrowsTypeError(): void { self::expectException(TypeError::class); - $this->collection->resolve(new DateTimeImmutable()); + + $this->topLevelDomains->resolve(new DateTimeImmutable()); } public function testResolveWithInvalidDomain(): void { self::expectException(InvalidHost::class); - $this->collection->resolve('###'); + $this->topLevelDomains->resolve('###'); } public function testResolveWithUnResolvableDomain(): void { self::expectException(UnableToResolveDomain::class); - $this->collection->resolve('localhost'); + $this->topLevelDomains->resolve('localhost'); } public function testResolveWithUnregisteredTLD(): void @@ -192,11 +192,10 @@ public function testResolveWithUnregisteredTLD(): void public function testResolveWithIDNAOptions(): void { - $resolved = $this->collection->resolve('foo.de'); + $resolved = $this->topLevelDomains->resolve('foo.de'); self::assertSame( [IDNA_DEFAULT, IDNA_DEFAULT], - [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption(), - ] + [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption()] ); $collection = TopLevelDomains::fromPath( @@ -219,7 +218,7 @@ public function testResolveWithIDNAOptions(): void */ public function testContainsReturnsTrue($tld): void { - self::assertTrue($this->collection->contains($tld)); + self::assertTrue($this->topLevelDomains->contains($tld)); } public function validTldProvider(): iterable @@ -251,7 +250,7 @@ public function __toString() */ public function testContainsReturnsFalse($tld): void { - self::assertFalse($this->collection->contains($tld)); + self::assertFalse($this->topLevelDomains->contains($tld)); } public function invalidTldProvider(): iterable From cb511bf3f3a3d44c3b9683adada44dde195a11c9 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 1 Aug 2020 19:23:39 +0200 Subject: [PATCH 213/461] Simplify PublicSuffixList interface --- src/PublicSuffixList.php | 29 +++---------------- src/Rules.php | 50 +++------------------------------ tests/RulesTest.php | 60 +++++++++++++++++++++------------------- 3 files changed, 40 insertions(+), 99 deletions(-) diff --git a/src/PublicSuffixList.php b/src/PublicSuffixList.php index 1eb3f60f..ae30b31d 100644 --- a/src/PublicSuffixList.php +++ b/src/PublicSuffixList.php @@ -24,31 +24,10 @@ interface PublicSuffixList extends IDNConversion, JsonSerializable */ public function jsonSerialize(): array; - /** - * Determines the effective TLD against the PSL rules for cookie domain detection. - * - * @throws ExceptionInterface If the PublicSuffix can not be resolve. - */ - public function getCookieEffectiveTLD(Host $domain): PublicSuffix; - - /** - * Determines the effective TLD against the PSL rules for ICANN domain detection. - * - * @throws ExceptionInterface If the PublicSuffix can not be resolve. - */ - public function getICANNEffectiveTLD(Host $domain): PublicSuffix; - - /** - * Determines the effective TLD against the PSL rules for private domain detection. - * - * @throws ExceptionInterface If the effective TLD can not be resolve. - */ - public function getPrivateEffectiveTLD(Host $domain): PublicSuffix; - /** * Returns PSL info for a given domain. * - * If the effective TLD can not be resolved it returns a null ResolvedDomainName + * If the effective TLD can not be resolved it returns a ResolvedDomainName with a null public suffix */ public function resolve(Host $domain): ResolvedDomainName; @@ -57,19 +36,19 @@ public function resolve(Host $domain): ResolvedDomainName; * * @throws ExceptionInterface If the effective TLD can not be resolve. */ - public function resolveCookieDomain(Host $domain): ResolvedDomainName; + public function getCookieDomain(Host $domain): ResolvedDomainName; /** * Returns PSL info for a given domain against the PSL rules for ICANN domain detection. * * @throws ExceptionInterface If the effective TLD can not be resolve. */ - public function resolveICANNDomain(Host $domain): ResolvedDomainName; + public function getICANNDomain(Host $domain): ResolvedDomainName; /** * Returns PSL info for a given domain against the PSL rules for private domain detection. * * @throws ExceptionInterface If the effective TLD can not be resolve. */ - public function resolvePrivateDomain(Host $domain): ResolvedDomainName; + public function getPrivateDomain(Host $domain): ResolvedDomainName; } diff --git a/src/Rules.php b/src/Rules.php index 188cb759..329af61b 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -136,55 +136,13 @@ public function jsonSerialize(): array return $this->rules; } - /** - * @param mixed $domain a type that supports instantiating a Domain from. - * - * @throws UnableToResolveDomain If the PublicSuffix can not be resolve. - */ - public function getCookieEffectiveTLD($domain): PublicSuffix - { - $domain = $this->validateDomain($domain); - - $publicSuffix = $this->findPublicSuffix($domain, ''); - - return $domain->resolve($publicSuffix)->getPublicSuffix(); - } - - /** - * @param mixed $domain a type that supports instantiating a Domain from. - * - * @throws UnableToResolveDomain If the PublicSuffix can not be resolve. - */ - public function getICANNEffectiveTLD($domain): PublicSuffix - { - $domain = $this->validateDomain($domain); - - $publicSuffix = $this->findPublicSuffix($domain, EffectiveTLD::ICANN_DOMAINS); - - return $domain->resolve($publicSuffix)->getPublicSuffix(); - } - - /** - * @param mixed $domain a type that supports instantiating a Domain from. - * - * @throws UnableToResolveDomain If the PublicSuffix can not be resolve. - */ - public function getPrivateEffectiveTLD($domain): PublicSuffix - { - $domain = $this->validateDomain($domain); - - $publicSuffix = $this->findPublicSuffix($domain, EffectiveTLD::PRIVATE_DOMAINS); - - return $domain->resolve($publicSuffix)->getPublicSuffix(); - } - /** * @param mixed $domain a type that supports instantiating a Domain from. */ public function resolve($domain): ResolvedDomainName { try { - return $this->resolveCookieDomain($domain); + return $this->getCookieDomain($domain); } catch (UnableToResolveDomain $exception) { if ($exception->hasDomain()) { /** @var Host */ @@ -202,7 +160,7 @@ public function resolve($domain): ResolvedDomainName /** * @param mixed $domain the domain value */ - public function resolveCookieDomain($domain): ResolvedDomainName + public function getCookieDomain($domain): ResolvedDomainName { $domain = $this->validateDomain($domain); @@ -212,7 +170,7 @@ public function resolveCookieDomain($domain): ResolvedDomainName /** * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolveICANNDomain($domain): ResolvedDomainName + public function getICANNDomain($domain): ResolvedDomainName { $domain = $this->validateDomain($domain); @@ -222,7 +180,7 @@ public function resolveICANNDomain($domain): ResolvedDomainName /** * @param mixed $domain a type that supports instantiating a Domain from. */ - public function resolvePrivateDomain($domain): ResolvedDomainName + public function getPrivateDomain($domain): ResolvedDomainName { $domain = $this->validateDomain($domain); diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 9331e6e3..9d9e8d2f 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -118,9 +118,9 @@ public function testwithIDNAOptions(): void /** * @covers ::resolve - * @covers ::resolveCookieDomain - * @covers ::resolveICANNDomain - * @covers ::resolvePrivateDomain + * @covers ::getCookieDomain + * @covers ::getICANNDomain + * @covers ::getPrivateDomain * @covers ::validateDomain * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\DomainNameParser::parse @@ -176,7 +176,7 @@ public function testIsSuffixValidTrue(): void /** * @covers ::resolve - * @covers ::resolveCookieDomain + * @covers ::getCookieDomain * @covers ::validateDomain * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection @@ -196,7 +196,7 @@ public function testIsSuffixValidFalseWithPunycoded(): void /** * @covers ::resolve - * @covers ::resolveICANNDomain + * @covers ::getICANNDomain * @covers ::validateDomain * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection @@ -216,7 +216,7 @@ public function testSubDomainIsNull(): void /** * @covers ::resolve - * @covers ::resolveCookieDomain + * @covers ::getCookieDomain * @covers ::validateDomain * @covers \Pdp\DomainNameParser::parse */ @@ -244,6 +244,10 @@ public function testWithPrivateDomain(): void /** * @covers ::resolve + * @covers ::findPublicSuffix + * @covers ::findPublicSuffixFromSection + * @covers \Pdp\PublicSuffix::setSection + * @covers \Pdp\DomainNameParser::parse */ public function testWithAbsoluteHostInvalid(): void { @@ -257,7 +261,7 @@ public function testWithAbsoluteHostInvalid(): void /** * @covers ::resolve - * @covers ::resolvePrivateDomain + * @covers ::getPrivateDomain * @covers ::validateDomain * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection @@ -266,7 +270,7 @@ public function testWithAbsoluteHostInvalid(): void */ public function testWithPrivateDomainInvalid(): void { - $domain = $this->rules->resolvePrivateDomain('private.ulb.ac.be'); + $domain = $this->rules->getPrivateDomain('private.ulb.ac.be'); self::assertSame('private.ulb.ac.be', $domain->getContent()); self::assertFalse($domain->getPublicSuffix()->isKnown()); self::assertFalse($domain->getPublicSuffix()->isICANN()); @@ -276,7 +280,7 @@ public function testWithPrivateDomainInvalid(): void /** * @covers ::resolve - * @covers ::resolvePrivateDomain + * @covers ::getPrivateDomain * @covers ::validateDomain * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection @@ -285,7 +289,7 @@ public function testWithPrivateDomainInvalid(): void */ public function testWithPrivateDomainValid(): void { - $domain = $this->rules->resolvePrivateDomain('thephpleague.github.io'); + $domain = $this->rules->getPrivateDomain('thephpleague.github.io'); self::assertSame('thephpleague.github.io', $domain->getContent()); self::assertTrue($domain->getPublicSuffix()->isKnown()); self::assertFalse($domain->getPublicSuffix()->isICANN()); @@ -334,7 +338,7 @@ public function testWithDomainObject(): void } /** - * @covers ::getCookieEffectiveTLD + * @covers ::getCookieDomain * @covers \Pdp\DomainNameParser::parse */ public function testWithDomainInterfaceObject(): void @@ -343,13 +347,13 @@ public function testWithDomainInterfaceObject(): void self::assertSame( 'ac.be', - $this->rules->getCookieEffectiveTLD($domain)->getContent() + $this->rules->getCookieDomain($domain)->getPublicSuffix()->getContent() ); } /** * @covers ::resolve - * @covers ::resolveICANNDomain + * @covers ::getICANNDomain * @covers ::validateDomain * @dataProvider parseDataProvider * @param ?string $publicSuffix @@ -365,7 +369,7 @@ public function testGetRegistrableDomain(?string $publicSuffix, ?string $registr /** * @covers ::resolve - * @covers ::resolveICANNDomain + * @covers ::getICANNDomain * @covers ::validateDomain * @covers \Pdp\DomainNameParser::parse * @dataProvider parseDataProvider @@ -497,11 +501,11 @@ public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix(): void { self::expectException(UnableToResolveDomain::class); - $this->rules->getICANNEffectiveTLD('localhost'); + $this->rules->getICANNDomain('localhost'); } /** - * @covers ::getICANNEffectiveTLD + * @covers ::getICANNDomain * @covers \Pdp\DomainNameParser::parse * * @dataProvider invalidDomainParseProvider @@ -510,7 +514,7 @@ public function testGetPublicSuffixThrowsInvalidDomainException(string $domain): { self::expectException(InvalidDomainName::class); - $this->rules->getICANNEffectiveTLD($domain); + $this->rules->getICANNDomain($domain); } public function invalidDomainParseProvider(): iterable @@ -523,7 +527,7 @@ public function invalidDomainParseProvider(): iterable } /** - * @covers ::getICANNEffectiveTLD + * @covers ::getICANNDomain * @covers \Pdp\DomainNameParser::parse * * @dataProvider invalidHostParseProvider @@ -532,7 +536,7 @@ public function testGetPublicSuffixThrowsInvalidHostException(string $domain): v { self::expectException(InvalidHost::class); - $this->rules->getICANNEffectiveTLD($domain); + $this->rules->getICANNDomain($domain); } public function invalidHostParseProvider(): iterable @@ -547,9 +551,8 @@ public function invalidHostParseProvider(): iterable ]; } - /** - * @covers ::getCookieEffectiveTLD + * @covers ::getCookieDomain * @covers \Pdp\DomainNameParser::parse * @dataProvider validPublicSectionProvider * @param ?string $domain @@ -557,7 +560,7 @@ public function invalidHostParseProvider(): iterable */ public function testPublicSuffixSection(?string $domain, ?string $expected): void { - $publicSuffix = $this->rules->getCookieEffectiveTLD($domain); + $publicSuffix = $this->rules->getCookieDomain($domain)->getPublicSuffix(); self::assertSame($expected, $publicSuffix->getContent()); } @@ -736,16 +739,17 @@ public function testResolveWithIDNAOptions(): void } /** - * @covers ::getCookieEffectiveTLD - * @covers ::getICANNEffectiveTLD - * @covers ::getPrivateEffectiveTLD + * @covers ::getCookieDomain + * @covers ::getICANNDomain + * @covers ::getPrivateDomain + * * @dataProvider effectiveTLDProvider */ public function testEffectiveTLDResolution(string $host, string $cookieETLD, string $icannETLD, string $privateETLD): void { - self::assertSame($cookieETLD, (string) $this->rules->getCookieEffectiveTLD($host)); - self::assertSame($icannETLD, (string) $this->rules->getICANNEffectiveTLD($host)); - self::assertSame($privateETLD, (string) $this->rules->getPrivateEffectiveTLD($host)); + self::assertSame($cookieETLD, (string) $this->rules->getCookieDomain($host)->getPublicSuffix()); + self::assertSame($icannETLD, (string) $this->rules->getICANNDomain($host)->getPublicSuffix()); + self::assertSame($privateETLD, (string) $this->rules->getPrivateDomain($host)->getPublicSuffix()); } public function effectiveTLDProvider(): iterable From 0b405eb95caa39386fe63bb5232a01d4c676381b Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 1 Aug 2020 19:50:38 +0200 Subject: [PATCH 214/461] Simplify PublicSuffix class --- src/PublicSuffix.php | 70 ++++++++++++++++---------------------- src/PublicSuffixList.php | 18 ++++++---- src/Rules.php | 41 ++++++++++------------ tests/PublicSuffixTest.php | 2 -- tests/RulesTest.php | 11 ------ 5 files changed, 58 insertions(+), 84 deletions(-) diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 7c3e8a52..689e31f1 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -18,36 +18,36 @@ use function array_reverse; use function count; use function implode; -use function in_array; use function reset; use const IDNA_DEFAULT; final class PublicSuffix extends DomainNameParser implements EffectiveTLD { - private const PSL_SECTION = [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS, '']; - private ?string $publicSuffix; private string $section; - private array $labels; + private int $labelsCount; private int $asciiIDNAOption; private int $unicodeIDNAOption; /** - * @param mixed|null $publicSuffix a public suffix in a type that is supported + * @param mixed $publicSuffix a public suffix in a type that is supported */ private function __construct( - $publicSuffix = null, - string $section = '', - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT + $publicSuffix, + string $section, + int $asciiIDNAOption, + int $unicodeIDNAOption ) { - $this->labels = $this->parse($publicSuffix, $asciiIDNAOption, $unicodeIDNAOption); - $this->publicSuffix = $this->setPublicSuffix(); - $this->section = $this->setSection($section); + $this->setPublicSuffix($this->parse($publicSuffix, $asciiIDNAOption, $unicodeIDNAOption)); + $this->section = ''; + if (null !== $this->publicSuffix) { + $this->section = $section; + } + $this->asciiIDNAOption = $asciiIDNAOption; $this->unicodeIDNAOption = $unicodeIDNAOption; } @@ -65,7 +65,7 @@ public static function __set_state(array $properties): self /** * @param mixed $publicSuffix a public suffix */ - public static function fromICANNSection($publicSuffix = null, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self + public static function fromICANNSection($publicSuffix, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self { return new self($publicSuffix, self::ICANN_DOMAINS, $asciiIDNAOption, $unicodeIDNAOption); } @@ -73,7 +73,7 @@ public static function fromICANNSection($publicSuffix = null, int $asciiIDNAOpti /** * @param mixed $publicSuffix a public suffix */ - public static function fromPrivateSection($publicSuffix = null, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self + public static function fromPrivateSection($publicSuffix, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self { return new self($publicSuffix, self::PRIVATE_DOMAINS, $asciiIDNAOption, $unicodeIDNAOption); } @@ -81,7 +81,7 @@ public static function fromPrivateSection($publicSuffix = null, int $asciiIDNAOp /** * @param mixed $publicSuffix a public suffix */ - public static function fromUnknownSection($publicSuffix = null, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self + public static function fromUnknownSection($publicSuffix, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self { return new self($publicSuffix, '', $asciiIDNAOption, $unicodeIDNAOption); } @@ -91,46 +91,34 @@ public static function fromNull(int $asciiIDNAOption = IDNA_DEFAULT, int $unicod return new self(null, '', $asciiIDNAOption, $unicodeIDNAOption); } - public function count(): int - { - return count($this->labels); - } - /** * Set the public suffix content. * * @throws InvalidDomainName if the public suffix is invalid */ - private function setPublicSuffix(): ?string + private function setPublicSuffix(array $labels): void { - if ([] === $this->labels) { - return null; + if ([] === $labels) { + $this->publicSuffix = null; + $this->labelsCount = 0; + + return; } - $publicSuffix = implode('.', array_reverse($this->labels)); - if ('' !== reset($this->labels)) { - return $publicSuffix; + $publicSuffix = implode('.', array_reverse($labels)); + if ('' !== reset($labels)) { + $this->publicSuffix = $publicSuffix; + $this->labelsCount = count($labels); + + return; } throw InvalidDomainName::dueToInvalidPublicSuffix($publicSuffix); } - /** - * Set the public suffix section. - * - * @throws UnableToResolveDomain if the submitted section is not supported - */ - private function setSection(string $section): string + public function count(): int { - if (!in_array($section, self::PSL_SECTION, true)) { - throw new UnableToResolveDomain('"'.$section.'" is an unknown Public Suffix List section'); - } - - if (null === $this->publicSuffix) { - return ''; - } - - return $section; + return $this->labelsCount; } public function jsonSerialize(): ?string diff --git a/src/PublicSuffixList.php b/src/PublicSuffixList.php index ae30b31d..af28103a 100644 --- a/src/PublicSuffixList.php +++ b/src/PublicSuffixList.php @@ -28,27 +28,31 @@ public function jsonSerialize(): array; * Returns PSL info for a given domain. * * If the effective TLD can not be resolved it returns a ResolvedDomainName with a null public suffix + * If the host is not a valid domaine it returns a ResolvedDomainName with a null Domain name */ - public function resolve(Host $domain): ResolvedDomainName; + public function resolve(Host $host): ResolvedDomainName; /** * Returns PSL info for a given domain against the PSL rules for cookie domain detection. * - * @throws ExceptionInterface If the effective TLD can not be resolve. + * @throws InvalidDomainName if the domain is invalid + * @throws UnableToResolveDomain if the domain or the TLD are not resolvable of not resolved */ - public function getCookieDomain(Host $domain): ResolvedDomainName; + public function getCookieDomain(Host $host): ResolvedDomainName; /** * Returns PSL info for a given domain against the PSL rules for ICANN domain detection. * - * @throws ExceptionInterface If the effective TLD can not be resolve. + * @throws InvalidDomainName if the domain is invalid + * @throws UnableToResolveDomain if the domain or the TLD are not resolvable of not resolved */ - public function getICANNDomain(Host $domain): ResolvedDomainName; + public function getICANNDomain(Host $host): ResolvedDomainName; /** * Returns PSL info for a given domain against the PSL rules for private domain detection. * - * @throws ExceptionInterface If the effective TLD can not be resolve. + * @throws InvalidDomainName if the domain is invalid + * @throws UnableToResolveDomain if the domain or the TLD are not resolvable of not resolved */ - public function getPrivateDomain(Host $domain): ResolvedDomainName; + public function getPrivateDomain(Host $host): ResolvedDomainName; } diff --git a/src/Rules.php b/src/Rules.php index 329af61b..e7f1a79c 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -31,8 +31,6 @@ final class Rules implements PublicSuffixList { - private const PSL_SECTION = [EffectiveTLD::PRIVATE_DOMAINS, EffectiveTLD::ICANN_DOMAINS, '']; - /** * PSL rules as a multidimentional associative array. */ @@ -137,63 +135,60 @@ public function jsonSerialize(): array } /** - * @param mixed $domain a type that supports instantiating a Domain from. + * @param mixed $host a type that supports instantiating a Domain from. */ - public function resolve($domain): ResolvedDomainName + public function resolve($host): ResolvedDomainName { try { - return $this->getCookieDomain($domain); + return $this->getCookieDomain($host); } catch (UnableToResolveDomain $exception) { if ($exception->hasDomain()) { /** @var Host */ - $domain = $exception->getDomain(); + $host = $exception->getDomain(); - return new ResolvedDomain($domain); + return new ResolvedDomain($host); } - return new ResolvedDomain(new Domain($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption)); + return new ResolvedDomain(new Domain($host, $this->asciiIDNAOption, $this->unicodeIDNAOption)); } catch (ExceptionInterface $exception) { return new ResolvedDomain(Domain::fromNull($this->asciiIDNAOption, $this->unicodeIDNAOption)); } } /** - * @param mixed $domain the domain value + * @param mixed $host the domain value */ - public function getCookieDomain($domain): ResolvedDomainName + public function getCookieDomain($host): ResolvedDomainName { - $domain = $this->validateDomain($domain); + $host = $this->validateDomain($host); - return $domain->resolve($this->findPublicSuffix($domain, '')); + return $host->resolve($this->findPublicSuffix($host, '')); } /** - * @param mixed $domain a type that supports instantiating a Domain from. + * @param mixed $host a type that supports instantiating a Domain from. */ - public function getICANNDomain($domain): ResolvedDomainName + public function getICANNDomain($host): ResolvedDomainName { - $domain = $this->validateDomain($domain); + $host = $this->validateDomain($host); - return $domain->resolve($this->findPublicSuffix($domain, EffectiveTLD::ICANN_DOMAINS)); + return $host->resolve($this->findPublicSuffix($host, EffectiveTLD::ICANN_DOMAINS)); } /** - * @param mixed $domain a type that supports instantiating a Domain from. + * @param mixed $host a type that supports instantiating a Domain from. */ - public function getPrivateDomain($domain): ResolvedDomainName + public function getPrivateDomain($host): ResolvedDomainName { - $domain = $this->validateDomain($domain); + $host = $this->validateDomain($host); - return $domain->resolve($this->findPublicSuffix($domain, PublicSuffix::PRIVATE_DOMAINS)); + return $host->resolve($this->findPublicSuffix($host, PublicSuffix::PRIVATE_DOMAINS)); } /** * Assert the domain is valid and is resolvable. * * @param mixed $domain a type that supports instantiating a Domain from. - * - * @throws InvalidDomainName if the domain is invalid - * @throws UnableToResolveDomain if the domain is not resolvable */ private function validateDomain($domain): ResolvedDomainName { diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 6a4e6776..e0393a00 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -47,7 +47,6 @@ public function testInternalPhpMethod(): void /** * @covers ::__construct * @covers ::parse - * @covers ::setSection * @covers ::getContent * @covers ::toUnicode */ @@ -60,7 +59,6 @@ public function testPSToUnicodeWithUrlEncode(): void * @covers ::__construct * @covers ::parse * @covers ::setPublicSuffix - * @covers ::setSection * @covers ::isKnown * @covers ::isICANN * @covers ::isPrivate diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 9d9e8d2f..8b65af9e 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -122,7 +122,6 @@ public function testwithIDNAOptions(): void * @covers ::getICANNDomain * @covers ::getPrivateDomain * @covers ::validateDomain - * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\DomainNameParser::parse */ public function testNullWillReturnNullDomain(): void @@ -146,7 +145,6 @@ public function testThrowsTypeErrorOnWrongInput(): void * @covers ::resolve * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection - * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\DomainNameParser::parse */ @@ -160,7 +158,6 @@ public function testIsSuffixValidFalse(): void * @covers ::resolve * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection - * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\PublicSuffix::isICANN * @covers \Pdp\PublicSuffix::isPrivate @@ -180,7 +177,6 @@ public function testIsSuffixValidTrue(): void * @covers ::validateDomain * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection - * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\PublicSuffix::isICANN * @covers \Pdp\PublicSuffix::isPrivate @@ -200,7 +196,6 @@ public function testIsSuffixValidFalseWithPunycoded(): void * @covers ::validateDomain * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection - * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\PublicSuffix::isICANN * @covers \Pdp\PublicSuffix::isPrivate @@ -230,7 +225,6 @@ public function testWithExceptionName(): void * @covers ::resolve * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection - * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\DomainNameParser::parse */ public function testWithPrivateDomain(): void @@ -246,7 +240,6 @@ public function testWithPrivateDomain(): void * @covers ::resolve * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection - * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\DomainNameParser::parse */ public function testWithAbsoluteHostInvalid(): void @@ -265,7 +258,6 @@ public function testWithAbsoluteHostInvalid(): void * @covers ::validateDomain * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection - * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\DomainNameParser::parse */ public function testWithPrivateDomainInvalid(): void @@ -284,7 +276,6 @@ public function testWithPrivateDomainInvalid(): void * @covers ::validateDomain * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection - * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\DomainNameParser::parse */ public function testWithPrivateDomainValid(): void @@ -301,7 +292,6 @@ public function testWithPrivateDomainValid(): void * @covers ::resolve * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection - * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\DomainNameParser::parse */ public function testWithICANNDomainInvalid(): void @@ -318,7 +308,6 @@ public function testWithICANNDomainInvalid(): void * @covers ::resolve * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection - * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\DomainNameParser::parse */ public function testWithDomainObject(): void From 61f06946913c0e1e783ada1aadbed4f3f3b84e64 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 1 Aug 2020 20:59:45 +0200 Subject: [PATCH 215/461] Re-implement PublicSuffix as a decorator of the Domain class --- phpstan.src.neon | 4 - src/InvalidDomainName.php | 12 ++- src/InvalidHost.php | 7 +- src/PublicSuffix.php | 130 ++++++++++----------------- src/ResolvedDomain.php | 4 +- src/RootZoneDatabaseConverter.php | 2 +- src/Rules.php | 8 +- src/TopLevelDomains.php | 4 +- src/UnableToLoadPublicSuffixList.php | 4 +- src/UnableToLoadRootZoneDatabase.php | 4 +- tests/PublicSuffixTest.php | 38 +++----- tests/ResolvedDomainTest.php | 76 ++++++++-------- tests/RulesTest.php | 4 +- 13 files changed, 117 insertions(+), 180 deletions(-) diff --git a/phpstan.src.neon b/phpstan.src.neon index 81780e82..4f123862 100644 --- a/phpstan.src.neon +++ b/phpstan.src.neon @@ -6,10 +6,6 @@ parameters: treatPhpDocTypesAsCertain: false ignoreErrors: - '#should be covariant with return type#' - - message: '#Method Pdp\\PublicSuffix::toAscii\(\) should return static\(Pdp\\PublicSuffix\) but returns Pdp\\PublicSuffix.#' - path: src/PublicSuffix.php - - message: '#Method Pdp\\PublicSuffix::toUnicode\(\) should return static\(Pdp\\PublicSuffix\) but returns Pdp\\PublicSuffix.#' - path: src/PublicSuffix.php - message: '#Property Pdp\\TopLevelDomains::\$modifiedDate \(DateTimeImmutable\) does not accept DateTimeInterface.#' path: src/TopLevelDomains.php - message: '#Method Pdp\\ResolvedDomain::resolve\(\) has parameter \$publicSuffix with no typehint specified.#' diff --git a/src/InvalidDomainName.php b/src/InvalidDomainName.php index 6b6dd6d0..03578a0c 100644 --- a/src/InvalidDomainName.php +++ b/src/InvalidDomainName.php @@ -15,27 +15,25 @@ namespace Pdp; -use function sprintf; - class InvalidDomainName extends InvalidHost { public static function dueToInvalidLabelKey(int $key): self { - return new self(sprintf('the given key `%s` is invalid', $key)); + return new self('the given key `'.$key.'` is invalid.'); } public static function dueToInvalidCharacters(string $domain): self { - return new self(sprintf('The domain `%s` is invalid: it contains invalid characters', $domain)); + return new self('The domain `'.$domain.'` is invalid: it contains invalid characters.'); } public static function dueToUnsupportedType(string $domain): self { - return new self(sprintf('The domain `%s` is invalid: this is an IPv4 host', $domain)); + return new self('The domain `'.$domain.'` is invalid: this is an IPv4 host.'); } - public static function dueToInvalidPublicSuffix(string $publicSuffix): self + public static function dueToInvalidPublicSuffix(Host $publicSuffix): self { - return new self(sprintf('The public suffix `%s` is invalid', $publicSuffix)); + return new self('The public suffix `"'.$publicSuffix->getContent() ?? 'NULL'.'"` is invalid.'); } } diff --git a/src/InvalidHost.php b/src/InvalidHost.php index 4ae06877..6fb29063 100644 --- a/src/InvalidHost.php +++ b/src/InvalidHost.php @@ -16,21 +16,20 @@ namespace Pdp; use InvalidArgumentException; -use function sprintf; class InvalidHost extends InvalidArgumentException implements ExceptionInterface { public static function dueToInvalidCharacters(string $domain): self { - return new self(sprintf('The host `%s` is invalid: it contains invalid characters', $domain)); + return new self('The host `'.$domain.'` is invalid: it contains invalid characters.'); } public static function dueToIDNAError(string $domain, string $message = ''): self { if ('' === $message) { - return new self(sprintf('The host `%s` is invalid', $domain)); + return new self('The host `'.$domain.'` is invalid.'); } - return new self(sprintf('The host `%s` is invalid : %s', $domain, $message)); + return new self('The host `'.$domain.'` is invalid : '.$message); } } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 689e31f1..03f5e976 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -15,120 +15,76 @@ namespace Pdp; -use function array_reverse; use function count; -use function implode; -use function reset; use const IDNA_DEFAULT; -final class PublicSuffix extends DomainNameParser implements EffectiveTLD +final class PublicSuffix implements EffectiveTLD { - private ?string $publicSuffix; + private DomainName $publicSuffix; private string $section; - private int $labelsCount; - - private int $asciiIDNAOption; - - private int $unicodeIDNAOption; + private function __construct(DomainName $publicSuffix, string $section) + { + if ('' === $publicSuffix->label(0)) { + throw InvalidDomainName::dueToInvalidPublicSuffix($publicSuffix); + } - /** - * @param mixed $publicSuffix a public suffix in a type that is supported - */ - private function __construct( - $publicSuffix, - string $section, - int $asciiIDNAOption, - int $unicodeIDNAOption - ) { - $this->setPublicSuffix($this->parse($publicSuffix, $asciiIDNAOption, $unicodeIDNAOption)); - $this->section = ''; - if (null !== $this->publicSuffix) { - $this->section = $section; + if (null === $publicSuffix->getContent()) { + $section = ''; } - $this->asciiIDNAOption = $asciiIDNAOption; - $this->unicodeIDNAOption = $unicodeIDNAOption; + $this->publicSuffix = $publicSuffix; + $this->section = $section; } public static function __set_state(array $properties): self { - return new self( - $properties['publicSuffix'], - $properties['section'], - $properties['asciiIDNAOption'], - $properties['unicodeIDNAOption'] - ); + return new self($properties['publicSuffix'], $properties['section']); } /** * @param mixed $publicSuffix a public suffix */ - public static function fromICANNSection($publicSuffix, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self + public static function fromICANN($publicSuffix, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self { - return new self($publicSuffix, self::ICANN_DOMAINS, $asciiIDNAOption, $unicodeIDNAOption); + return new self(new Domain($publicSuffix, $asciiIDNAOption, $unicodeIDNAOption), self::ICANN_DOMAINS); } /** * @param mixed $publicSuffix a public suffix */ - public static function fromPrivateSection($publicSuffix, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self + public static function fromPrivate($publicSuffix, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self { - return new self($publicSuffix, self::PRIVATE_DOMAINS, $asciiIDNAOption, $unicodeIDNAOption); + return new self(new Domain($publicSuffix, $asciiIDNAOption, $unicodeIDNAOption), self::PRIVATE_DOMAINS); } /** * @param mixed $publicSuffix a public suffix */ - public static function fromUnknownSection($publicSuffix, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self + public static function fromUnknown($publicSuffix, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self { - return new self($publicSuffix, '', $asciiIDNAOption, $unicodeIDNAOption); + return new self(new Domain($publicSuffix, $asciiIDNAOption, $unicodeIDNAOption), ''); } public static function fromNull(int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self { - return new self(null, '', $asciiIDNAOption, $unicodeIDNAOption); - } - - /** - * Set the public suffix content. - * - * @throws InvalidDomainName if the public suffix is invalid - */ - private function setPublicSuffix(array $labels): void - { - if ([] === $labels) { - $this->publicSuffix = null; - $this->labelsCount = 0; - - return; - } - - $publicSuffix = implode('.', array_reverse($labels)); - if ('' !== reset($labels)) { - $this->publicSuffix = $publicSuffix; - $this->labelsCount = count($labels); - - return; - } - - throw InvalidDomainName::dueToInvalidPublicSuffix($publicSuffix); + return new self(Domain::fromNull($asciiIDNAOption, $unicodeIDNAOption), ''); } public function count(): int { - return $this->labelsCount; + return count($this->publicSuffix); } public function jsonSerialize(): ?string { - return $this->getContent(); + return $this->publicSuffix->jsonSerialize(); } public function getContent(): ?string { - return $this->publicSuffix; + return $this->publicSuffix->getContent(); } public function __toString(): string @@ -138,12 +94,12 @@ public function __toString(): string public function getAsciiIDNAOption(): int { - return $this->asciiIDNAOption; + return $this->publicSuffix->getAsciiIDNAOption(); } public function getUnicodeIDNAOption(): int { - return $this->unicodeIDNAOption; + return $this->publicSuffix->getUnicodeIDNAOption(); } public function isKnown(): bool @@ -163,47 +119,51 @@ public function isPrivate(): bool public function toAscii(): Host { - if (null === $this->publicSuffix) { + $newPublicSuffix = $this->publicSuffix->toAscii(); + if ($newPublicSuffix->getContent() === $this->publicSuffix->getContent()) { return $this; } - $publicSuffix = $this->idnToAscii($this->publicSuffix, $this->asciiIDNAOption); - if ($publicSuffix === $this->publicSuffix) { - return $this; - } + $clone = clone $this; + $clone->publicSuffix = $newPublicSuffix; - return new self($publicSuffix, $this->section, $this->asciiIDNAOption, $this->unicodeIDNAOption); + return $clone; } public function toUnicode(): Host { - if (null === $this->publicSuffix || false === strpos($this->publicSuffix, 'xn--')) { + $newPublicSuffix = $this->publicSuffix->toUnicode(); + if ($newPublicSuffix->getContent() === $this->publicSuffix->getContent()) { return $this; } - return new self( - $this->idnToUnicode($this->publicSuffix, $this->unicodeIDNAOption), - $this->section, - $this->asciiIDNAOption, - $this->unicodeIDNAOption - ); + $clone = clone $this; + $clone->publicSuffix = $newPublicSuffix; + + return $clone; } public function withAsciiIDNAOption(int $option): self { - if ($option === $this->asciiIDNAOption) { + if ($option === $this->publicSuffix->getAsciiIDNAOption()) { return $this; } - return new self($this->publicSuffix, $this->section, $option, $this->unicodeIDNAOption); + $clone = clone $this; + $clone->publicSuffix = $this->publicSuffix->withAsciiIDNAOption($option); + + return $clone; } public function withUnicodeIDNAOption(int $option): self { - if ($option === $this->unicodeIDNAOption) { + if ($option === $this->publicSuffix->getUnicodeIDNAOption()) { return $this; } - return new self($this->publicSuffix, $this->section, $this->asciiIDNAOption, $option); + $clone = clone $this; + $clone->publicSuffix = $this->publicSuffix->withUnicodeIDNAOption($option); + + return $clone; } } diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 20442a8d..d8e99845 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -228,7 +228,7 @@ public function toUnicode(): self public function resolve($publicSuffix): self { if (!$publicSuffix instanceof PublicSuffix) { - $publicSuffix = PublicSuffix::fromUnknownSection($publicSuffix); + $publicSuffix = PublicSuffix::fromUnknown($publicSuffix); } return new self($this->domain, $publicSuffix); @@ -240,7 +240,7 @@ public function resolve($publicSuffix): self public function withPublicSuffix($publicSuffix): self { if (!$publicSuffix instanceof PublicSuffix) { - $publicSuffix = PublicSuffix::fromUnknownSection($publicSuffix); + $publicSuffix = PublicSuffix::fromUnknown($publicSuffix); } $publicSuffix = $this->normalize($publicSuffix); diff --git a/src/RootZoneDatabaseConverter.php b/src/RootZoneDatabaseConverter.php index bc09c8a3..60799eba 100644 --- a/src/RootZoneDatabaseConverter.php +++ b/src/RootZoneDatabaseConverter.php @@ -89,7 +89,7 @@ private function extractHeader(string $content): array private function extractRootZone(string $content): string { try { - $tld = PublicSuffix::fromUnknownSection($content)->toAscii(); + $tld = PublicSuffix::fromUnknown($content)->toAscii(); } catch (ExceptionInterface $exception) { throw UnableToLoadRootZoneDatabase::dueToInvalidRootZoneDomain($content, $exception); } diff --git a/src/Rules.php b/src/Rules.php index e7f1a79c..d29ab82a 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -231,7 +231,7 @@ private function findPublicSuffix(ResolvedDomainName $domain, string $section): } if (EffectiveTLD::PRIVATE_DOMAINS === $section) { - return PublicSuffix::fromUnknownSection($asciiDomain->label(0), $this->asciiIDNAOption, $this->unicodeIDNAOption); + return PublicSuffix::fromUnknown($asciiDomain->label(0), $this->asciiIDNAOption, $this->unicodeIDNAOption); } return $icann; @@ -266,16 +266,16 @@ private function findPublicSuffixFromSection(DomainName $domain, string $section } if ([] === $matches) { - return PublicSuffix::fromUnknownSection($domain->label(0), $this->asciiIDNAOption, $this->unicodeIDNAOption); + return PublicSuffix::fromUnknown($domain->label(0), $this->asciiIDNAOption, $this->unicodeIDNAOption); } $content = implode('.', array_reverse($matches)); if (PublicSuffix::PRIVATE_DOMAINS === $section) { - return PublicSuffix::fromPrivateSection($content, $this->asciiIDNAOption, $this->unicodeIDNAOption); + return PublicSuffix::fromPrivate($content, $this->asciiIDNAOption, $this->unicodeIDNAOption); } - return PublicSuffix::fromICANNSection($content, $this->asciiIDNAOption, $this->unicodeIDNAOption); + return PublicSuffix::fromICANN($content, $this->asciiIDNAOption, $this->unicodeIDNAOption); } public function withAsciiIDNAOption(int $asciiIDNAOption): self diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index d474544a..633b6a34 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -177,7 +177,7 @@ public function isEmpty(): bool public function getIterator() { foreach ($this->records as $tld) { - yield PublicSuffix::fromICANNSection($tld, $this->asciiIDNAOption, $this->unicodeIDNAOption)->toAscii(); + yield PublicSuffix::fromUnknown($tld, $this->asciiIDNAOption, $this->unicodeIDNAOption)->toAscii(); } } @@ -258,7 +258,7 @@ public function resolve($domain): ResolvedDomainName } } - return new ResolvedDomain($domain, PublicSuffix::fromUnknownSection($publicSuffix)); + return new ResolvedDomain($domain, PublicSuffix::fromUnknown($publicSuffix)); } public function withAsciiIDNAOption(int $option): RootZoneDatabase diff --git a/src/UnableToLoadPublicSuffixList.php b/src/UnableToLoadPublicSuffixList.php index 5872c95c..1a1589e0 100644 --- a/src/UnableToLoadPublicSuffixList.php +++ b/src/UnableToLoadPublicSuffixList.php @@ -22,7 +22,7 @@ class UnableToLoadPublicSuffixList extends InvalidArgumentException implements E { public static function dueToInvalidPath(string $path): self { - return new self($path.': failed to open stream: No such file or directory'); + return new self($path.': failed to open stream: No such file or directory.'); } public static function dueToInvalidJson(int $code, string $message): self @@ -32,7 +32,7 @@ public static function dueToInvalidJson(int $code, string $message): self public static function dueToInvalidRule(?string $line, Throwable $exception): self { - return new self('The following rule "'.$line ?? 'NULL'.'" could not be processed because it is invalid', 0, $exception); + return new self('The following rule "'.$line ?? 'NULL'.'" could not be processed because it is invalid.', 0, $exception); } public static function dueToInvalidHashMap(): self diff --git a/src/UnableToLoadRootZoneDatabase.php b/src/UnableToLoadRootZoneDatabase.php index 0fee707b..d9bd8cc7 100644 --- a/src/UnableToLoadRootZoneDatabase.php +++ b/src/UnableToLoadRootZoneDatabase.php @@ -37,7 +37,7 @@ public static function dueToInvalidVersionLine(string $line): self public static function dueToFailedConversion(): self { - return new self('Invalid content: TLD conversion failed'); + return new self('Invalid content: TLD conversion failed.'); } public static function dueToInvalidLine(string $line): self @@ -47,7 +47,7 @@ public static function dueToInvalidLine(string $line): self public static function dueToInvalidPath(string $path): self { - return new self($path.': failed to open stream: No such file or directory'); + return new self($path.': failed to open stream: No such file or directory.'); } public static function dueToInvalidJson(int $code, string $message): self diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index e0393a00..58c1694e 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -37,7 +37,7 @@ class PublicSuffixTest extends TestCase */ public function testInternalPhpMethod(): void { - $publicSuffix = PublicSuffix::fromICANNSection('ac.be'); + $publicSuffix = PublicSuffix::fromICANN('ac.be'); $generatePublicSuffix = eval('return '.var_export($publicSuffix, true).';'); self::assertEquals($publicSuffix, $generatePublicSuffix); self::assertEquals('"ac.be"', json_encode($publicSuffix)); @@ -46,19 +46,16 @@ public function testInternalPhpMethod(): void /** * @covers ::__construct - * @covers ::parse * @covers ::getContent * @covers ::toUnicode */ public function testPSToUnicodeWithUrlEncode(): void { - self::assertSame('bébe', PublicSuffix::fromUnknownSection('b%C3%A9be')->toUnicode()->getContent()); + self::assertSame('bébe', PublicSuffix::fromUnknown('b%C3%A9be')->toUnicode()->getContent()); } /** * @covers ::__construct - * @covers ::parse - * @covers ::setPublicSuffix * @covers ::isKnown * @covers ::isICANN * @covers ::isPrivate @@ -68,11 +65,11 @@ public function testPSToUnicodeWithUrlEncode(): void public function testSetSection(?string $publicSuffix, string $section, bool $isKnown, bool $isIcann, bool $isPrivate): void { if ('' === $section) { - $ps = PublicSuffix::fromUnknownSection($publicSuffix); + $ps = PublicSuffix::fromUnknown($publicSuffix); } elseif ('ICANN_DOMAINS' === $section) { - $ps = PublicSuffix::fromICANNSection($publicSuffix); + $ps = PublicSuffix::fromICANN($publicSuffix); } elseif ('PRIVATE_DOMAINS' === $section) { - $ps = PublicSuffix::fromPrivateSection($publicSuffix); + $ps = PublicSuffix::fromPrivate($publicSuffix); } if (!isset($ps)) { @@ -95,16 +92,13 @@ public function PSProvider(): iterable /** * @covers ::__construct - * @covers ::parse - * @covers ::setPublicSuffix * @dataProvider invalidPublicSuffixProvider - * */ public function testConstructorThrowsException(string $publicSuffix): void { self::expectException(InvalidDomainName::class); - PublicSuffix::fromUnknownSection($publicSuffix); + PublicSuffix::fromUnknown($publicSuffix); } public function invalidPublicSuffixProvider(): iterable @@ -117,39 +111,34 @@ public function invalidPublicSuffixProvider(): iterable /** * @covers ::__construct - * @covers ::parse - * @covers ::idnToAscii */ public function testPSToAsciiThrowsException(): void { self::expectException(InvalidHost::class); - PublicSuffix::fromUnknownSection('a⒈com'); + PublicSuffix::fromUnknown('a⒈com'); } /** * @covers ::toUnicode - * @covers ::idnToUnicode */ public function testToUnicodeThrowsException(): void { self::expectException(InvalidHost::class); - PublicSuffix::fromUnknownSection('xn--a-ecp.ru')->toUnicode(); + PublicSuffix::fromUnknown('xn--a-ecp.ru')->toUnicode(); } /** * @covers ::toAscii * @covers ::toUnicode - * @covers ::idnToAscii - * @covers ::idnToUnicode * * @dataProvider conversionReturnsTheSameInstanceProvider * @param ?string $publicSuffix */ public function testConversionReturnsTheSameInstance(?string $publicSuffix): void { - $instance = PublicSuffix::fromUnknownSection($publicSuffix); + $instance = PublicSuffix::fromUnknown($publicSuffix); self::assertSame($instance->toUnicode(), $instance); self::assertSame($instance->toAscii(), $instance); } @@ -164,11 +153,10 @@ public function conversionReturnsTheSameInstanceProvider(): iterable /** * @covers ::toUnicode - * @covers ::idnToUnicode */ public function testToUnicodeReturnsSameInstance(): void { - $instance = PublicSuffix::fromUnknownSection('食狮.公司.cn'); + $instance = PublicSuffix::fromUnknown('食狮.公司.cn'); self::assertSame($instance->toUnicode(), $instance); } @@ -180,7 +168,7 @@ public function testToUnicodeReturnsSameInstance(): void */ public function testCountable(?string $domain, int $nbLabels, array $labels): void { - $domain = PublicSuffix::fromUnknownSection($domain); + $domain = PublicSuffix::fromUnknown($domain); self::assertCount($nbLabels, $domain); } @@ -203,7 +191,7 @@ public function testResolveWithCustomIDNAOptions( string $expectedAscii, string $expectedUnicode ): void { - $publicSuffix = PublicSuffix::fromUnknownSection($name, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); + $publicSuffix = PublicSuffix::fromUnknown($name, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); self::assertSame($expectedContent, $publicSuffix->getContent()); self::assertSame($expectedAscii, $publicSuffix->toAscii()->getContent()); self::assertSame($expectedUnicode, $publicSuffix->toUnicode()->getContent()); @@ -253,7 +241,7 @@ public function customIDNAProvider(): iterable */ public function testwithIDNAOptions(): void { - $publicSuffix = PublicSuffix::fromUnknownSection('com'); + $publicSuffix = PublicSuffix::fromUnknown('com'); self::assertSame($publicSuffix, $publicSuffix->withAsciiIDNAOption( $publicSuffix->getAsciiIDNAOption() diff --git a/tests/ResolvedDomainTest.php b/tests/ResolvedDomainTest.php index fede1090..19a085d6 100644 --- a/tests/ResolvedDomainTest.php +++ b/tests/ResolvedDomainTest.php @@ -33,7 +33,6 @@ class ResolvedDomainTest extends TestCase { /** * @covers ::__construct - * @covers ::setPublicSuffix * @covers ::setRegistrableDomain * @covers ::setSubDomain * @covers ::getPublicSuffix @@ -50,7 +49,6 @@ public function testRegistrableDomainIsNullWithFoundDomain(): void /** * @covers ::__construct - * @covers ::setPublicSuffix * @covers ::normalize * @dataProvider provideWrongConstructor * @@ -60,7 +58,7 @@ public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain(?stri { self::expectException(UnableToResolveDomain::class); - new ResolvedDomain(new Domain($domain), PublicSuffix::fromICANNSection($publicSuffix)); + new ResolvedDomain(new Domain($domain), PublicSuffix::fromICANN($publicSuffix)); } public function provideWrongConstructor(): iterable @@ -93,7 +91,7 @@ public function provideWrongConstructor(): iterable */ public function testDomainInternalPhpMethod(): void { - $domain = new ResolvedDomain(new Domain('www.ulb.ac.be'), PublicSuffix::fromICANNSection('ac.be')); + $domain = new ResolvedDomain(new Domain('www.ulb.ac.be'), PublicSuffix::fromICANN('ac.be')); $generateDomain = eval('return '.var_export($domain, true).';'); self::assertEquals($domain, $generateDomain); self::assertEquals('"www.ulb.ac.be"', json_encode($domain->jsonSerialize())); @@ -123,7 +121,6 @@ public function countableProvider(): iterable } /** - * @covers ::setPublicSuffix * @covers ::normalize * @covers ::setRegistrableDomain * @covers ::setSubDomain @@ -147,7 +144,7 @@ public function testToIDN( ?string $expectedIDNDomain, ?string $expectedIDNSuffix ): void { - $objPublicSuffix = (null === $publicSuffix) ? PublicSuffix::fromNull() : PublicSuffix::fromICANNSection($publicSuffix); + $objPublicSuffix = (null === $publicSuffix) ? PublicSuffix::fromNull() : PublicSuffix::fromICANN($publicSuffix); $domain = new ResolvedDomain(new Domain($domain), $objPublicSuffix); self::assertSame($expectedDomain, $domain->getContent()); @@ -222,7 +219,6 @@ public function toUnicodeProvider(): iterable } /** - * @covers ::setPublicSuffix * @covers ::normalize * @covers ::setRegistrableDomain * @covers ::setSubDomain @@ -247,7 +243,7 @@ public function testToAscii( ?string $expectedAsciiDomain, ?string $expectedAsciiSuffix ): void { - $objPublicSuffix = (null === $publicSuffix) ? PublicSuffix::fromNull() : PublicSuffix::fromICANNSection($publicSuffix); + $objPublicSuffix = (null === $publicSuffix) ? PublicSuffix::fromNull() : PublicSuffix::fromICANN($publicSuffix); $domain = new ResolvedDomain(new Domain($domain), $objPublicSuffix); self::assertSame($expectedDomain, $domain->getContent()); @@ -320,7 +316,7 @@ public function testResolveWorks(ResolvedDomain $domain, $publicSuffix, ?string public function resolvePassProvider(): iterable { - $publicSuffix = PublicSuffix::fromICANNSection('ac.be'); + $publicSuffix = PublicSuffix::fromICANN('ac.be'); $domain = new ResolvedDomain(new Domain('ulb.ac.be'), $publicSuffix); return [ @@ -346,17 +342,17 @@ public function resolvePassProvider(): iterable ], 'update public suffix' => [ 'domain' => $domain, - 'public suffix' => PublicSuffix::fromICANNSection('be'), + 'public suffix' => PublicSuffix::fromICANN('be'), 'expected' => 'be', ], 'idn domain name' => [ - 'domain' => new ResolvedDomain(new Domain('Яндекс.РФ'), PublicSuffix::fromICANNSection('рф')), - 'public suffix' => PublicSuffix::fromICANNSection('рф'), + 'domain' => new ResolvedDomain(new Domain('Яндекс.РФ'), PublicSuffix::fromICANN('рф')), + 'public suffix' => PublicSuffix::fromICANN('рф'), 'expected' => 'рф', ], 'idn domain name with ascii public suffix' => [ - 'domain' => new ResolvedDomain(new Domain('Яндекс.РФ'), PublicSuffix::fromICANNSection('рф')), - 'public suffix' => PublicSuffix::fromICANNSection('xn--p1ai'), + 'domain' => new ResolvedDomain(new Domain('Яндекс.РФ'), PublicSuffix::fromICANN('рф')), + 'public suffix' => PublicSuffix::fromICANN('xn--p1ai'), 'expected' => 'рф', ], ]; @@ -374,13 +370,13 @@ public function testResolveFails(ResolvedDomain $domain, PublicSuffix $publicSuf public function resolveFailsProvider(): iterable { - $publicSuffix = PublicSuffix::fromICANNSection('ac.be'); + $publicSuffix = PublicSuffix::fromICANN('ac.be'); $domain = new ResolvedDomain(new Domain('ulb.ac.be'), $publicSuffix); return [ 'public suffix mismatch' => [ 'domain' => $domain, - 'public suffix' => PublicSuffix::fromICANNSection('ac.fr'), + 'public suffix' => PublicSuffix::fromICANN('ac.fr'), ], 'domain name can not contains public suffix' => [ 'domain' => new ResolvedDomain(new Domain('localhost')), @@ -392,11 +388,11 @@ public function resolveFailsProvider(): iterable ], 'partial public suffix' => [ 'domain' => new ResolvedDomain($domain), - 'public suffix' => PublicSuffix::fromICANNSection('c.be'), + 'public suffix' => PublicSuffix::fromICANN('c.be'), ], 'mismatch idn public suffix' => [ 'domain' => new ResolvedDomain(new Domain('www.食狮.公司.cn')), - 'public suffix' => PublicSuffix::fromICANNSection('cn.公司'), + 'public suffix' => PublicSuffix::fromICANN('cn.公司'), ], ]; } @@ -406,10 +402,10 @@ public function resolveFailsProvider(): iterable */ public function testResolveReturnsInstance(): void { - $publicSuffix = PublicSuffix::fromICANNSection('ac.be'); + $publicSuffix = PublicSuffix::fromICANN('ac.be'); $domain = new ResolvedDomain(new Domain('ulb.ac.be'), $publicSuffix); self::assertEquals($domain, $domain->resolve($publicSuffix)); - self::assertNotSame($domain, $domain->resolve(PublicSuffix::fromPrivateSection('ac.be'))); + self::assertNotSame($domain, $domain->resolve(PublicSuffix::fromPrivate('ac.be'))); } /** @@ -432,27 +428,27 @@ public function withSubDomainWorksProvider(): iterable { return [ 'simple addition' => [ - 'domain' => new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANNSection('com')), + 'domain' => new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANN('com')), 'subdomain' => 'www', 'expected' => 'www', ], 'simple addition IDN (1)' => [ - 'domain' => new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANNSection('com')), + 'domain' => new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANN('com')), 'subdomain' => new Domain('bébé'), 'expected' => 'xn--bb-bjab', ], 'simple addition IDN (2)' => [ - 'domain' => new ResolvedDomain(new Domain('Яндекс.РФ'), PublicSuffix::fromICANNSection('рф')), + 'domain' => new ResolvedDomain(new Domain('Яндекс.РФ'), PublicSuffix::fromICANN('рф')), 'subdomain' => 'bébé', 'expected' => 'bébé', ], 'simple removal' => [ - 'domain' => new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANNSection('com')), + 'domain' => new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANN('com')), 'subdomain' => null, 'expected' => null, ], 'simple removal IDN' => [ - 'domain' => new ResolvedDomain(new Domain('bébé.Яндекс.РФ'), PublicSuffix::fromICANNSection('рф')), + 'domain' => new ResolvedDomain(new Domain('bébé.Яндекс.РФ'), PublicSuffix::fromICANN('рф')), 'subdomain' => 'xn--bb-bjab', 'expected' => 'bébé', ], @@ -486,7 +482,7 @@ public function testWithEmptySubdomain(): void { self::expectException(InvalidHost::class); - $domain = new ResolvedDomain(new Domain('www.example.com'), PublicSuffix::fromICANNSection('com')); + $domain = new ResolvedDomain(new Domain('www.example.com'), PublicSuffix::fromICANN('com')); $domain->withSubDomain(''); } @@ -497,7 +493,7 @@ public function testWithEmptySubdomain(): void public function testWithSubDomainFailsWithNonStringableObject(): void { self::expectException(TypeError::class); - $domain = new ResolvedDomain(new Domain('www.example.com'), PublicSuffix::fromICANNSection('com')); + $domain = new ResolvedDomain(new Domain('www.example.com'), PublicSuffix::fromICANN('com')); $domain->withSubDomain(date_create()); } @@ -534,7 +530,7 @@ public function testWithPublicSuffixWorks( public function withPublicSuffixWorksProvider(): iterable { - $base_domain = new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANNSection('com')); + $base_domain = new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANN('com')); return [ 'simple update (1)' => [ @@ -547,7 +543,7 @@ public function withPublicSuffixWorksProvider(): iterable ], 'simple update (2)' => [ 'domain' => $base_domain, - 'publicSuffix' => PublicSuffix::fromPrivateSection('github.io'), + 'publicSuffix' => PublicSuffix::fromPrivate('github.io'), 'expected' => 'github.io', 'isKnown' => true, 'isICANN' => false, @@ -555,7 +551,7 @@ public function withPublicSuffixWorksProvider(): iterable ], 'same public suffix but PSL info is changed' => [ 'domain' => $base_domain, - 'publicSuffix' => PublicSuffix::fromPrivateSection('com'), + 'publicSuffix' => PublicSuffix::fromPrivate('com'), 'expected' => 'com', 'isKnown' => true, 'isICANN' => false, @@ -563,7 +559,7 @@ public function withPublicSuffixWorksProvider(): iterable ], 'same public suffix but PSL info does not changed' => [ 'domain' => $base_domain, - 'publicSuffix' => PublicSuffix::fromICANNSection('com'), + 'publicSuffix' => PublicSuffix::fromICANN('com'), 'expected' => 'com', 'isKnown' => true, 'isICANN' => true, @@ -571,15 +567,15 @@ public function withPublicSuffixWorksProvider(): iterable ], 'simple update IDN (1)' => [ 'domain' => $base_domain, - 'publicSuffix' => PublicSuffix::fromICANNSection('рф'), + 'publicSuffix' => PublicSuffix::fromICANN('рф'), 'expected' => 'xn--p1ai', 'isKnown' => true, 'isICANN' => true, 'isPrivate' => false, ], 'simple update IDN (2)' => [ - 'domain' => new ResolvedDomain(new Domain('www.bébé.be'), PublicSuffix::fromICANNSection('be')), - 'publicSuffix' => PublicSuffix::fromICANNSection('xn--p1ai'), + 'domain' => new ResolvedDomain(new Domain('www.bébé.be'), PublicSuffix::fromICANN('be')), + 'publicSuffix' => PublicSuffix::fromICANN('xn--p1ai'), 'expected' => 'рф', 'isKnown' => true, 'isICANN' => true, @@ -594,7 +590,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'removing the public suffix list' => [ - 'domain' => new ResolvedDomain(new Domain('www.bébé.be'), PublicSuffix::fromICANNSection('be')), + 'domain' => new ResolvedDomain(new Domain('www.bébé.be'), PublicSuffix::fromICANN('be')), 'publicSuffix' => null, 'expected' => null, 'isKnown' => false, @@ -602,7 +598,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'with custom IDNA domain options' =>[ - 'domain' => new ResolvedDomain(new Domain('www.bébé.be', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE), PublicSuffix::fromICANNSection('be')), + 'domain' => new ResolvedDomain(new Domain('www.bébé.be', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE), PublicSuffix::fromICANN('be')), 'publicSuffix' => null, 'expected' => null, 'isKnown' => false, @@ -643,7 +639,7 @@ public function testResolveWorksWithCustomIDNAOptions( ?string $expectedWithLabel ): void { $domainHost = new Domain($domainName, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); - $domain = new ResolvedDomain($domainHost, PublicSuffix::fromICANNSection($publicSuffix)); + $domain = new ResolvedDomain($domainHost, PublicSuffix::fromICANN($publicSuffix)); self::assertSame($expectedContent, $domain->getContent()); self::assertSame($expectedAscii, $domain->toAscii()->getContent()); @@ -706,7 +702,7 @@ public function testInstanceCreationWithCustomIDNAOptions(): void { $domain = new ResolvedDomain( new Domain('example.com', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE), - PublicSuffix::fromICANNSection('com') + PublicSuffix::fromICANN('com') ); /** @var ResolvedDomain $instance */ @@ -723,7 +719,7 @@ public function testInstanceCreationWithCustomIDNAOptions(): void [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] ); - $instance = $domain->withPublicSuffix(PublicSuffix::fromICANNSection('us')); + $instance = $domain->withPublicSuffix(PublicSuffix::fromICANN('us')); self::assertSame( [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] @@ -734,7 +730,7 @@ public function testInstanceCreationWithCustomIDNAOptions(): void [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] ); - $instance = $domain->resolve(PublicSuffix::fromICANNSection('com')); + $instance = $domain->resolve(PublicSuffix::fromICANN('com')); self::assertSame( [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] diff --git a/tests/RulesTest.php b/tests/RulesTest.php index 8b65af9e..c7fed7c3 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -314,7 +314,7 @@ public function testWithDomainObject(): void { $domain = new ResolvedDomain( new Domain('private.ulb.ac.be'), - PublicSuffix::fromICANNSection('ac.be') + PublicSuffix::fromICANN('ac.be') ); $newDomain = $this->rules->resolve($domain); @@ -332,7 +332,7 @@ public function testWithDomainObject(): void */ public function testWithDomainInterfaceObject(): void { - $domain = PublicSuffix::fromICANNSection('ulb.ac.be'); + $domain = PublicSuffix::fromICANN('ulb.ac.be'); self::assertSame( 'ac.be', From 33e89c7da959a9aeffaea4bb607d820376e6593f Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 2 Aug 2020 01:38:13 +0200 Subject: [PATCH 216/461] Adding the OuterDomainName interface --- src/EffectiveTLD.php | 2 +- src/OuterDomainName.php | 21 +++++++++++++++++++++ src/PublicSuffix.php | 27 +++++++++++---------------- src/ResolvedDomain.php | 17 ++++------------- src/ResolvedDomainName.php | 4 +--- src/Rules.php | 2 +- src/TopLevelDomains.php | 2 +- tests/PublicSuffixTest.php | 7 ++++--- 8 files changed, 44 insertions(+), 38 deletions(-) create mode 100644 src/OuterDomainName.php diff --git a/src/EffectiveTLD.php b/src/EffectiveTLD.php index 2922137e..4035853d 100644 --- a/src/EffectiveTLD.php +++ b/src/EffectiveTLD.php @@ -15,7 +15,7 @@ namespace Pdp; -interface EffectiveTLD extends Host +interface EffectiveTLD extends Host, OuterDomainName { public const ICANN_DOMAINS = 'ICANN_DOMAINS'; diff --git a/src/OuterDomainName.php b/src/OuterDomainName.php new file mode 100644 index 00000000..21eaed52 --- /dev/null +++ b/src/OuterDomainName.php @@ -0,0 +1,21 @@ +publicSuffix; + } + public function count(): int { return count($this->publicSuffix); @@ -79,7 +84,7 @@ public function count(): int public function jsonSerialize(): ?string { - return $this->publicSuffix->jsonSerialize(); + return $this->publicSuffix->getContent(); } public function getContent(): ?string @@ -89,7 +94,7 @@ public function getContent(): ?string public function __toString(): string { - return (string) $this->publicSuffix; + return $this->publicSuffix->__toString(); } public function getAsciiIDNAOption(): int @@ -117,28 +122,18 @@ public function isPrivate(): bool return self::PRIVATE_DOMAINS === $this->section; } - public function toAscii(): Host + public function toAscii(): self { - $newPublicSuffix = $this->publicSuffix->toAscii(); - if ($newPublicSuffix->getContent() === $this->publicSuffix->getContent()) { - return $this; - } - $clone = clone $this; - $clone->publicSuffix = $newPublicSuffix; + $clone->publicSuffix = $this->publicSuffix->toAscii(); return $clone; } - public function toUnicode(): Host + public function toUnicode(): self { - $newPublicSuffix = $this->publicSuffix->toUnicode(); - if ($newPublicSuffix->getContent() === $this->publicSuffix->getContent()) { - return $this; - } - $clone = clone $this; - $clone->publicSuffix = $newPublicSuffix; + $clone->publicSuffix = $this->publicSuffix->toUnicode(); return $clone; } diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index d8e99845..aaf448e7 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -69,18 +69,11 @@ private function setPublicSuffix(PublicSuffix $publicSuffix = null): PublicSuffi $asciiIDNAOptions = $this->domain->getAsciiIDNAOption(); $unicodeIDNAOptions = $this->domain->getUnicodeIDNAOption(); - if (null === $publicSuffix) { + if (null === $publicSuffix || null === $publicSuffix->getContent()) { return PublicSuffix::fromNull($asciiIDNAOptions, $unicodeIDNAOptions); } - if (null === $publicSuffix->getContent()) { - return $publicSuffix - ->withAsciiIDNAOption($asciiIDNAOptions) - ->withUnicodeIDNAOption($unicodeIDNAOptions); - } - $domainContent = $this->domain->getContent(); - if (null === $domainContent) { throw UnableToResolveDomain::dueToUnresolvableDomain($this->domain); } @@ -96,13 +89,11 @@ private function setPublicSuffix(PublicSuffix $publicSuffix = null): PublicSuffi $publicSuffix = $this->normalize($publicSuffix); /** @var string $psContent */ $psContent = $publicSuffix->getContent(); - if ($this->domain->getContent() === $psContent) { + if ($domainContent === $psContent) { throw new UnableToResolveDomain(sprintf('The public suffix `%s` can not be equal to the domain name `%s`', $psContent, $this->domain)); } - /** @var string $domainName */ - $domainName = $this->domain->getContent(); - if ('.'.$psContent !== substr($domainName, - strlen($psContent) - 1)) { + if ('.'.$psContent !== substr($domainContent, - strlen($psContent) - 1)) { throw new UnableToResolveDomain(sprintf('The public suffix `%s` can not be assign to the domain name `%s`', $psContent, $this->domain)); } @@ -170,7 +161,7 @@ public function count(): int return count($this->domain); } - public function getHost(): DomainName + public function getDomain(): DomainName { return $this->domain; } diff --git a/src/ResolvedDomainName.php b/src/ResolvedDomainName.php index 09a32926..83781285 100644 --- a/src/ResolvedDomainName.php +++ b/src/ResolvedDomainName.php @@ -15,10 +15,8 @@ namespace Pdp; -interface ResolvedDomainName extends Host +interface ResolvedDomainName extends Host, OuterDomainName { - public function getHost(): DomainName; - public function getPublicSuffix(): PublicSuffix; public function getSubDomain(): DomainName; diff --git a/src/Rules.php b/src/Rules.php index d29ab82a..0d37ef3b 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -217,7 +217,7 @@ private function validateDomain($domain): ResolvedDomainName */ private function findPublicSuffix(ResolvedDomainName $domain, string $section): PublicSuffix { - $asciiDomain = $domain->getHost(); + $asciiDomain = $domain->getDomain(); /** @var DomainName $asciiDomain */ $asciiDomain = $asciiDomain->toAscii(); $icann = $this->findPublicSuffixFromSection($asciiDomain, EffectiveTLD::ICANN_DOMAINS); diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 633b6a34..aa8b17ae 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -224,7 +224,7 @@ public function contains($tld): bool public function resolve($domain): ResolvedDomainName { if ($domain instanceof ResolvedDomainName) { - $domain = $domain->getHost(); + $domain = $domain->getDomain(); $domain ->withUnicodeIDNAOption($this->unicodeIDNAOption) ->withAsciiIDNAOption($this->asciiIDNAOption); diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index 58c1694e..c338f951 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -139,8 +139,9 @@ public function testToUnicodeThrowsException(): void public function testConversionReturnsTheSameInstance(?string $publicSuffix): void { $instance = PublicSuffix::fromUnknown($publicSuffix); - self::assertSame($instance->toUnicode(), $instance); - self::assertSame($instance->toAscii(), $instance); + + self::assertEquals($instance->toUnicode(), $instance); + self::assertEquals($instance->toAscii(), $instance); } public function conversionReturnsTheSameInstanceProvider(): iterable @@ -158,7 +159,7 @@ public function testToUnicodeReturnsSameInstance(): void { $instance = PublicSuffix::fromUnknown('食狮.公司.cn'); - self::assertSame($instance->toUnicode(), $instance); + self::assertEquals($instance->toUnicode(), $instance); } /** From ebf4e6d5d28e0fc39cd1adb28ff16c6cbecc9a66 Mon Sep 17 00:00:00 2001 From: tacman Date: Sun, 2 Aug 2020 07:55:12 -0400 Subject: [PATCH 217/461] Use manager url rather than self --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5ddab3cc..723b1432 100644 --- a/README.md +++ b/README.md @@ -605,7 +605,7 @@ They are used when instantiated the returned object. ~~~php $manager = new Pdp\Manager(new Pdp\Cache(), new Pdp\CurlHttpClient()); -$tldCollection = $manager->getTLDs(self::RZD_URL); +$tldCollection = $manager->getTLDs(Pdp\Manager::RZD_URL); $domain = $tldCollection->resolve('www.ulb.ac.be'); echo $domain->getPublicSuffix(); // print 'be' ~~~ From 92bfade85d6bd3c776638c9a90bf93d35dbd9110 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 2 Aug 2020 17:17:12 +0200 Subject: [PATCH 218/461] Rename OuterDomainName into ExternalDomainName --- src/EffectiveTLD.php | 2 +- src/{OuterDomainName.php => ExternalDomainName.php} | 2 +- src/ResolvedDomainName.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename src/{OuterDomainName.php => ExternalDomainName.php} (94%) diff --git a/src/EffectiveTLD.php b/src/EffectiveTLD.php index 4035853d..3dd23963 100644 --- a/src/EffectiveTLD.php +++ b/src/EffectiveTLD.php @@ -15,7 +15,7 @@ namespace Pdp; -interface EffectiveTLD extends Host, OuterDomainName +interface EffectiveTLD extends Host, ExternalDomainName { public const ICANN_DOMAINS = 'ICANN_DOMAINS'; diff --git a/src/OuterDomainName.php b/src/ExternalDomainName.php similarity index 94% rename from src/OuterDomainName.php rename to src/ExternalDomainName.php index 21eaed52..d6d291c4 100644 --- a/src/OuterDomainName.php +++ b/src/ExternalDomainName.php @@ -15,7 +15,7 @@ namespace Pdp; -interface OuterDomainName +interface ExternalDomainName { public function getDomain(): DomainName; } diff --git a/src/ResolvedDomainName.php b/src/ResolvedDomainName.php index 83781285..d7f30294 100644 --- a/src/ResolvedDomainName.php +++ b/src/ResolvedDomainName.php @@ -15,7 +15,7 @@ namespace Pdp; -interface ResolvedDomainName extends Host, OuterDomainName +interface ResolvedDomainName extends Host, ExternalDomainName { public function getPublicSuffix(): PublicSuffix; From 23c08458c078d0c5635165279adfcab63a64d1eb Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 2 Aug 2020 17:34:50 +0200 Subject: [PATCH 219/461] Adding prefix parameter --- src/Storage/PublicSuffixListCachePsr16Adapter.php | 9 ++++++--- src/Storage/RootZoneDatabaseCachePsr16Adapter.php | 7 +++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/Storage/PublicSuffixListCachePsr16Adapter.php b/src/Storage/PublicSuffixListCachePsr16Adapter.php index 994e35f0..9fe394bf 100644 --- a/src/Storage/PublicSuffixListCachePsr16Adapter.php +++ b/src/Storage/PublicSuffixListCachePsr16Adapter.php @@ -45,14 +45,17 @@ final class PublicSuffixListCachePsr16Adapter implements PublicSuffixListCache private ?DateInterval $ttl; + private string $prefix; + /** * @param mixed|null $ttl the time to live for the given cache */ - public function __construct(CacheInterface $cache, $ttl = null, LoggerInterface $logger = null) + public function __construct(CacheInterface $cache, $ttl = null, LoggerInterface $logger = null, string $prefix = self::CACHE_PREFIX) { $this->cache = $cache; - $this->logger = $logger ?? new NullLogger(); $this->ttl = $this->setTtl($ttl); + $this->logger = $logger ?? new NullLogger(); + $this->prefix = $prefix; } /** @@ -123,7 +126,7 @@ public function fetchByUri(string $uri): ?Rules */ private function getCacheKey(string $str): string { - return self::CACHE_PREFIX.md5(strtolower($str)); + return $this->prefix.md5(strtolower($str)); } /** diff --git a/src/Storage/RootZoneDatabaseCachePsr16Adapter.php b/src/Storage/RootZoneDatabaseCachePsr16Adapter.php index 68ba6c13..f959fbb9 100644 --- a/src/Storage/RootZoneDatabaseCachePsr16Adapter.php +++ b/src/Storage/RootZoneDatabaseCachePsr16Adapter.php @@ -47,14 +47,17 @@ final class RootZoneDatabaseCachePsr16Adapter implements RootZoneDatabaseCache private ?DateInterval $ttl; + private string $prefix; + /** * @param mixed|null $ttl the time to live for the given cache */ - public function __construct(CacheInterface $cache, $ttl = null, LoggerInterface $logger = null) + public function __construct(CacheInterface $cache, $ttl = null, LoggerInterface $logger = null, string $prefix = self::CACHE_PREFIX) { $this->cache = $cache; - $this->logger = $logger ?? new NullLogger(); $this->ttl = $this->setTtl($ttl); + $this->logger = $logger ?? new NullLogger(); + $this->prefix = $prefix; } /** From ff068a3cdf846ed4d8b01d599c70b980f53d7ab6 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 3 Aug 2020 08:44:06 +0200 Subject: [PATCH 220/461] Remove publicsuffix related methods from Rules --- CHANGELOG.md | 11 +++----- README.md | 64 ++++++++------------------------------------- src/Rules.php | 48 +++++----------------------------- tests/RulesTest.php | 48 ++++++++++++++++------------------ 4 files changed, 44 insertions(+), 127 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1d15e1d..54942526 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,16 +2,13 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in this file -## Next - TBD +## 5.7.0 - TBD ### Added -- `Rules::resolveCookieDomain` -- `Rules::resolveICANNDomain` -- `Rules::resolvePrivateDomain` -- `Rules::getCookieEffectiveTLD` -- `Rules::getICANNEffectiveTLD` -- `Rules::getPrivateeEffectiveTLD` +- `Rules::getCookieDomain` +- `Rules::getICANNDomain` +- `Rules::getPrivateDomain` - `CouldNotResolvePublicSuffix::dueToUnresolvableDomain` ### Fixed diff --git a/README.md b/README.md index 723b1432..1ac13c58 100644 --- a/README.md +++ b/README.md @@ -46,52 +46,23 @@ $ composer require jeremykendall/php-domain-parser Usage -------- -### Public suffix resolution. - -The first objective of the library is using the [Public Suffix List](http://publicsuffix.org/) to easily return the ICANN, the Cookie or -the Private Effective TLD as a `Pdp\PublicSuffix` object using the following methods: - -~~~php -use Pdp\Rules; - -$rules = Rules::createFromPath('/path/to/mozilla/public-suffix.dat'); - -echo $rules->getICANNEffectiveTLD('www.ulb.ac.be'); //display 'ac.be'; -echo $rules->getCookieEffectiveTLD('www.ulb.ac.be'); //display 'ac.be'; -echo $rules->getPrivateEffectiveTLD('www.ulb.ac.be'); //display 'be'; -~~~ +### Domain part resolutions -The methods are available since version `5.7.0` to ease the package usage. Prior to this version you could use the -`Rules::getPublicSuffix` method with an optional `$section` argument to get the same results: +The first objective of the library is using the [Public Suffix List](http://publicsuffix.org/) to easily resolve domain information. ~~~php use Pdp\Rules; $rules = Rules::createFromPath('/path/to/mozilla/public-suffix.dat'); -echo $rules->getPublicSuffix('www.ulb.ac.be'); // get the cookie effective TLD, display 'ac.be'; -echo $rules->getPublicSuffix('www.ulb.ac.be', Rules::ICANN_DOMAINS); //get the ICANN effective TLD, display 'ac.be'; -echo $rules->getPublicSuffix('www.ulb.ac.be', Rules::PRIVATE_DOMAINS); //get the Private effective TLD, display 'be'; +echo $rules->getCookieDomain('www.ulb.ac.be'); // returns a Pdp\Domain object whose Public Suffix is 'ac.be'; +echo $rules->getICANNDomain('www.ulb.ac.be'); // returns a Pdp\Domain object whose Public Suffix is 'ac.be'; +echo $rules->getPrivateDomain('www.ulb.ac.be'); // returns a Pdp\Domain object whose Public Suffix is 'be'; ~~~ +* Warning: If the Domain is not found an exception is thrown. * -If the Public Suffix is not found or in case of error an exception which extends `Pdp\Exception` is thrown. - -### Domain resolution. - -Apart the Public Suffix the package can resolve domain and their information also using Mozilla's [Public Suffix List](http://publicsuffix.org/) - -~~~php -use Pdp\Rules; - -$rules = Rules::createFromPath('/path/to/mozilla/public-suffix.dat'); - -echo $rules->resolveCookieDomain('www.ulb.ac.be'); // returns a Pdp\Domain object whose Public Suffix is 'ac.be'; -echo $rules->resolveICANNDomain('www.ulb.ac.be'); // returns a Pdp\Domain object whose Public Suffix is 'ac.be'; -echo $rules->resolvePrivateDomain('www.ulb.ac.be'); // returns a Pdp\Domain object whose Public Suffix is 'be'; -~~~ - -The methods are available since version `5.7.0` to ease the package usage. Prior to this version you could use the +These methods are available since version `5.7.0` to ease the package usage. Prior to this version you could use the `Rules::resolve` method with an optional `$section` argument to get the same results: ~~~php @@ -104,7 +75,7 @@ echo $rules->resolve('www.ulb.ac.be', Rules::ICANN_DOMAINS); // returns a Pdp\Do echo $rules->resolve('www.ulb.ac.be', Rules::PRIVATE_DOMAINS); // returns a Pdp\Domain object whose Public Suffix is 'be'; ~~~ -If the Domain is not resolved or in case of error a null `Pdp\Domain` is returned. +* Warning: If the Domain can not be resolved or in case of error a null `Pdp\Domain` is returned. * ### Top Level Domains resolution @@ -127,11 +98,11 @@ If the Domain is not resolved or in case of error a null `Pdp\Domain` is returne ~~~php resolveICANNDomain('www.ulb.ac.be'); //$domain is a Pdp\Domain object +$domain = $rules->getICANNDomain('www.ulb.ac.be'); //$domain is a Pdp\Domain object echo $domain->getContent(); // 'www.ulb.ac.be' echo $domain->getPublicSuffix(); // 'ac.be' echo $domain->getRegistrableDomain(); // 'ulb.ac.be' @@ -142,20 +113,7 @@ $domain->isICANN(); // returns true $domain->isPrivate(); // returns false $domain->labels(); // returns ['be', 'ac', 'ulb', 'www'] -$publicSuffix = $rules->getPrivateEffectiveTLD('mydomain.github.io'); //$publicSuffix is a Pdp\PublicSuffix object -echo $publicSuffix->getContent(); // 'github.io' -$publicSuffix->isKnown(); // returns true -$publicSuffix->isICANN(); // returns false -$publicSuffix->isPrivate(); // returns true -$publicSuffix->labels(); // returns ['io', 'github'] - -$altSuffix = $rules->getICANNEffectiveTLD('mydomain.github.io'); -echo $altSuffix->getContent(); // 'io' -$altSuffix->isKnown(); // returns true -$altSuffix->isICANN(); // returns true -$altSuffix->isPrivate(); // returns false - -$tldList = $manager->getTLDs(); //$tldList is a Pdp\TopLevelDomains object +$tldList = TopLevelDomains::createFromPath('/path/to/IANA/RootZoneDatabase.txt'); //$tldList is a Pdp\TopLevelDomains object $domain = $tldList->resolve('www.ulb.ac.be'); //$domain is a Pdp\Domain object $tldList->contains('be'); //returns true $tldList->contains('localhost'); //return false diff --git a/src/Rules.php b/src/Rules.php index 47862b0c..8cb6297c 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -200,42 +200,6 @@ public function getPublicSuffix($domain, string $section = self::ALL_DOMAINS): P return PublicSuffix::createFromDomain($domain->resolve($publicSuffix)); } - /** - * Determines the public suffix for a given domain against the PSL rules for cookie domain detection.. - * - * @param mixed $domain - * - * @throws CouldNotResolvePublicSuffix If the PublicSuffix can not be resolve. - */ - public function getCookieEffectiveTLD($domain): PublicSuffix - { - return $this->getPublicSuffix($domain, ''); - } - - /** - * Determines the public suffix for a given domain against the PSL rules for ICANN domain detection.. - * - * @param mixed $domain - * - * @throws CouldNotResolvePublicSuffix If the PublicSuffix can not be resolve. - */ - public function getICANNEffectiveTLD($domain): PublicSuffix - { - return $this->getPublicSuffix($domain, self::ICANN_DOMAINS); - } - - /** - * Determines the public suffix for a given domain against the PSL rules for private domain detection.. - * - * @param mixed $domain - * - * @throws CouldNotResolvePublicSuffix If the PublicSuffix can not be resolve. - */ - public function getPrivateEffectiveTLD($domain): PublicSuffix - { - return $this->getPublicSuffix($domain, self::PRIVATE_DOMAINS); - } - /** * Returns PSL info for a given domain. * @@ -249,12 +213,12 @@ public function resolve($domain, string $section = self::ALL_DOMAINS): Domain $section = $this->validateSection($section); try { if ('' === $section) { - return $this->resolveCookieDomain($domain); + return $this->getCookieDomain($domain); } elseif (self::ICANN_DOMAINS === $section) { - return $this->resolveICANNDomain($domain); + return $this->getICANNDomain($domain); } - return $this->resolvePrivateDomain($domain); + return $this->getPrivateDomain($domain); } catch (CouldNotResolvePublicSuffix $exception) { if ($exception->hasDomain()) { /** @var Domain */ @@ -274,7 +238,7 @@ public function resolve($domain, string $section = self::ALL_DOMAINS): Domain * * @param mixed $domain the domain value */ - public function resolveCookieDomain($domain): Domain + public function getCookieDomain($domain): Domain { $domain = $this->validateDomain($domain); @@ -286,7 +250,7 @@ public function resolveCookieDomain($domain): Domain * * @param mixed $domain */ - public function resolveICANNDomain($domain): Domain + public function getICANNDomain($domain): Domain { $domain = $this->validateDomain($domain); @@ -298,7 +262,7 @@ public function resolveICANNDomain($domain): Domain * * @param mixed $domain */ - public function resolvePrivateDomain($domain): Domain + public function getPrivateDomain($domain): Domain { $domain = $this->validateDomain($domain); diff --git a/tests/RulesTest.php b/tests/RulesTest.php index b05b3733..b25dd5e9 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -32,7 +32,7 @@ use const IDNA_NONTRANSITIONAL_TO_UNICODE; /** - * @coversDefaultClass Pdp\Rules + * @coversDefaultClass \Pdp\Rules */ class RulesTest extends TestCase { @@ -114,9 +114,9 @@ public function testwithIDNAOptions(): void /** * @covers ::resolve - * @covers ::resolveCookieDomain - * @covers ::resolveICANNDomain - * @covers ::resolvePrivateDomain + * @covers ::getCookieDomain + * @covers ::getICANNDomain + * @covers ::getPrivateDomain * @covers ::validateDomain * @covers ::validateSection * @covers \Pdp\Domain::isResolvable @@ -155,12 +155,12 @@ public function testResolveThrowsExceptionOnWrongDomainType(): void /** * @covers ::resolve * @covers ::validateSection - * @covers \Pdp\Domain::isResolvable * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection + * @covers \Pdp\Domain::isKnown + * @covers \Pdp\Domain::isResolvable * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown - * @covers \Pdp\Domain::isKnown * @covers \Pdp\IDNAConverterTrait::parse */ public function testIsSuffixValidFalse(): void @@ -172,13 +172,13 @@ public function testIsSuffixValidFalse(): void /** * @covers ::resolve * @covers ::validateSection - * @covers \Pdp\Domain::isResolvable * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\PublicSuffix::isICANN * @covers \Pdp\PublicSuffix::isPrivate + * @covers \Pdp\Domain::isResolvable * @covers \Pdp\Domain::withPublicSuffix * @covers \Pdp\Domain::isKnown * @covers \Pdp\Domain::isICANN @@ -195,16 +195,16 @@ public function testIsSuffixValidTrue(): void /** * @covers ::resolve - * @covers ::resolveCookieDomain + * @covers ::getCookieDomain * @covers ::validateDomain * @covers ::validateSection - * @covers \Pdp\Domain::isResolvable * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\PublicSuffix::isICANN * @covers \Pdp\PublicSuffix::isPrivate + * @covers \Pdp\Domain::isResolvable * @covers \Pdp\Domain::withPublicSuffix * @covers \Pdp\Domain::isKnown * @covers \Pdp\Domain::isICANN @@ -221,16 +221,16 @@ public function testIsSuffixValidFalseWithPunycoded(): void /** * @covers ::resolve - * @covers ::resolveICANNDomain + * @covers ::getICANNDomain * @covers ::validateDomain * @covers ::validateSection - * @covers \Pdp\Domain::isResolvable * @covers ::findPublicSuffix * @covers ::findPublicSuffixFromSection * @covers \Pdp\PublicSuffix::setSection * @covers \Pdp\PublicSuffix::isKnown * @covers \Pdp\PublicSuffix::isICANN * @covers \Pdp\PublicSuffix::isPrivate + * @covers \Pdp\Domain::isResolvable * @covers \Pdp\Domain::withPublicSuffix * @covers \Pdp\Domain::isKnown * @covers \Pdp\Domain::isICANN @@ -247,7 +247,7 @@ public function testSubDomainIsNull(): void /** * @covers ::resolve - * @covers ::resolveCookieDomain + * @covers ::getCookieDomain * @covers ::validateDomain * @covers ::validateSection * @covers \Pdp\IDNAConverterTrait::parse @@ -291,7 +291,7 @@ public function testWithAbsoluteHostInvalid(): void /** * @covers ::resolve - * @covers ::resolvePrivateDomain + * @covers ::getPrivateDomain * @covers ::validateDomain * @covers ::validateSection * @covers ::findPublicSuffix @@ -311,7 +311,7 @@ public function testWithPrivateDomainInvalid(): void /** * @covers ::resolve - * @covers ::resolvePrivateDomain + * @covers ::getPrivateDomain * @covers ::validateDomain * @covers ::validateSection * @covers ::findPublicSuffix @@ -381,7 +381,7 @@ public function testWithDomainInterfaceObject(): void /** * @covers ::resolve - * @covers ::resolveICANNDomain + * @covers ::getICANNDomain * @covers ::validateDomain * @covers \Pdp\Domain::setRegistrableDomain * @covers \Pdp\Domain::getRegistrableDomain @@ -399,7 +399,7 @@ public function testGetRegistrableDomain($publicSuffix, $registrableDomain, $dom /** * @covers ::resolve - * @covers ::resolveICANNDomain + * @covers ::getICANNDomain * @covers ::validateDomain * @covers \Pdp\IDNAConverterTrait::parse * @covers \Pdp\Domain::setPublicSuffix @@ -477,8 +477,6 @@ public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix($domain, $s public function invalidParseProvider(): iterable { - $long_label = implode('.', array_fill(0, 62, 'a')); - return [ 'single label host' => ['localhost', Rules::ICANN_DOMAINS], ]; @@ -710,20 +708,20 @@ public function testResolveWithIDNAOptions(): void } /** - * @covers ::getCookieEffectiveTLD - * @covers ::getICANNEffectiveTLD - * @covers ::getPrivateEffectiveTLD + * @covers ::getCookieDomain + * @covers ::getICANNDomain + * @covers ::getPrivateDomain * @dataProvider effectiveTLDProvider * @param string $host * @param string $cookieETLD * @param string $icannETLD * @param string $privateETLD */ - public function testEffectiveTLDResolution(string $host, string $cookieETLD, string $icannETLD, string $privateETLD): void + public function testGetCookieDomain(string $host, string $cookieETLD, string $icannETLD, string $privateETLD): void { - self::assertSame($cookieETLD, (string) $this->rules->getCookieEffectiveTLD($host)); - self::assertSame($icannETLD, (string) $this->rules->getICANNEffectiveTLD($host)); - self::assertSame($privateETLD, (string) $this->rules->getPrivateEffectiveTLD($host)); + self::assertSame($cookieETLD, (string) $this->rules->getCookieDomain($host)->getPublicSuffix()); + self::assertSame($icannETLD, (string) $this->rules->getICANNDomain($host)->getPublicSuffix()); + self::assertSame($privateETLD, (string) $this->rules->getPrivateDomain($host)->getPublicSuffix()); } public function effectiveTLDProvider(): iterable From c03843e4d5426b86f04e771745b755c3cfa104bf Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 3 Aug 2020 08:55:15 +0200 Subject: [PATCH 221/461] Prepare 5.7.0 release --- CHANGELOG.md | 2 +- README.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54942526..12d73bb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in this file -## 5.7.0 - TBD +## 5.7.0 - 2020-08-02 ### Added diff --git a/README.md b/README.md index 1ac13c58..82798156 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ echo $rules->getICANNDomain('www.ulb.ac.be'); // returns a Pdp\Domain object who echo $rules->getPrivateDomain('www.ulb.ac.be'); // returns a Pdp\Domain object whose Public Suffix is 'be'; ~~~ -* Warning: If the Domain is not found an exception is thrown. * +**WARNING: If the Domain can not be resolved an exception is thrown.** These methods are available since version `5.7.0` to ease the package usage. Prior to this version you could use the `Rules::resolve` method with an optional `$section` argument to get the same results: @@ -75,7 +75,7 @@ echo $rules->resolve('www.ulb.ac.be', Rules::ICANN_DOMAINS); // returns a Pdp\Do echo $rules->resolve('www.ulb.ac.be', Rules::PRIVATE_DOMAINS); // returns a Pdp\Domain object whose Public Suffix is 'be'; ~~~ -* Warning: If the Domain can not be resolved or in case of error a null `Pdp\Domain` is returned. * +**WARNING: If the Domain can not be resolved or in case of error a null `Pdp\Domain` is returned.** ### Top Level Domains resolution From 4f2c86e6d3259a94c75ba39bff8247b92288d6fc Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 5 Aug 2020 07:13:41 +0200 Subject: [PATCH 222/461] #280 bug fix cache throws when default cache directory is not present --- CHANGELOG.md | 19 +++++++++++++++++++ src/Cache.php | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12d73bb7..a1e9ed2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,24 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in this file +## 5.7.1 - 2020-08-04 + +### Added + +- None + +### Fixed + +- Cache throws when cache directory doesn't exist [#280](https://github.com/jeremykendall/php-domain-parser/issues/280) + +### Deprecated + +- None + +### Removed + +- None + ## 5.7.0 - 2020-08-02 ### Added @@ -15,6 +33,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - Improve type hinting and return type by dropping EOL PHP versions support. - Improve development environment by dropping EOL PHP versions support. +- Composer script ### Deprecated diff --git a/src/Cache.php b/src/Cache.php index a2ca4ce7..69e47ea1 100644 --- a/src/Cache.php +++ b/src/Cache.php @@ -83,7 +83,7 @@ public function __construct(string $cache_path = '') { if ('' === $cache_path) { /** @var string $cache_path */ - $cache_path = realpath(dirname(__DIR__).DIRECTORY_SEPARATOR.'data'); + $cache_path = realpath(dirname(__DIR__)).DIRECTORY_SEPARATOR.'data'; } if (!file_exists($cache_path) && file_exists(dirname($cache_path))) { From bb56a4105d38fc7800241a56942b9260d8acbba3 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sat, 8 Aug 2020 13:47:27 +0200 Subject: [PATCH 223/461] Adding ResolvedDomainName::getSecondLevelDomain --- src/ResolvedDomain.php | 5 +++++ src/ResolvedDomainName.php | 2 ++ tests/ResolvedDomainTest.php | 4 ++++ 3 files changed, 11 insertions(+) diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index aaf448e7..9655e781 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -196,6 +196,11 @@ public function getRegistrableDomain(): DomainName return $this->registrableDomain; } + public function getSecondLevelDomain(): ?string + { + return $this->registrableDomain->label(-1); + } + public function getSubDomain(): DomainName { return $this->subDomain; diff --git a/src/ResolvedDomainName.php b/src/ResolvedDomainName.php index d7f30294..59da1aa1 100644 --- a/src/ResolvedDomainName.php +++ b/src/ResolvedDomainName.php @@ -23,6 +23,8 @@ public function getSubDomain(): DomainName; public function getRegistrableDomain(): DomainName; + public function getSecondLevelDomain(): ?string; + /** * Returns an instance with the specified sub domain added. * diff --git a/tests/ResolvedDomainTest.php b/tests/ResolvedDomainTest.php index 19a085d6..7c9bc98c 100644 --- a/tests/ResolvedDomainTest.php +++ b/tests/ResolvedDomainTest.php @@ -38,12 +38,14 @@ class ResolvedDomainTest extends TestCase * @covers ::getPublicSuffix * @covers ::getRegistrableDomain * @covers ::getSubDomain + * @covers ::getSecondLevelDomain */ public function testRegistrableDomainIsNullWithFoundDomain(): void { $domain = new ResolvedDomain(new Domain('faketld')); self::assertNull($domain->getPublicSuffix()->getContent()); self::assertNull($domain->getRegistrableDomain()->getContent()); + self::assertNull($domain->getSecondLevelDomain()); self::assertNull($domain->getSubDomain()->getContent()); } @@ -409,6 +411,7 @@ public function testResolveReturnsInstance(): void } /** + * @covers ::getSecondLevelDomain * @covers ::withSubDomain * @dataProvider withSubDomainWorksProvider * @@ -422,6 +425,7 @@ public function testWithSubDomainWorks(ResolvedDomain $domain, $subdomain, ?stri self::assertSame($expected, $result->getSubDomain()->getContent()); self::assertEquals($domain->getPublicSuffix(), $result->getPublicSuffix()); self::assertEquals($domain->getRegistrableDomain(), $result->getRegistrableDomain()); + self::assertSame($domain->getSecondLevelDomain(), $result->getSecondLevelDomain()); } public function withSubDomainWorksProvider(): iterable From f35a32ce9f68b02af205b4d64ca40abba91b7fa1 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 9 Aug 2020 11:27:53 +0200 Subject: [PATCH 224/461] Remove DomainName::getSecondLevelDomain --- src/ResolvedDomain.php | 5 ----- src/ResolvedDomainName.php | 2 -- tests/ResolvedDomainTest.php | 4 ---- 3 files changed, 11 deletions(-) diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 9655e781..aaf448e7 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -196,11 +196,6 @@ public function getRegistrableDomain(): DomainName return $this->registrableDomain; } - public function getSecondLevelDomain(): ?string - { - return $this->registrableDomain->label(-1); - } - public function getSubDomain(): DomainName { return $this->subDomain; diff --git a/src/ResolvedDomainName.php b/src/ResolvedDomainName.php index 59da1aa1..d7f30294 100644 --- a/src/ResolvedDomainName.php +++ b/src/ResolvedDomainName.php @@ -23,8 +23,6 @@ public function getSubDomain(): DomainName; public function getRegistrableDomain(): DomainName; - public function getSecondLevelDomain(): ?string; - /** * Returns an instance with the specified sub domain added. * diff --git a/tests/ResolvedDomainTest.php b/tests/ResolvedDomainTest.php index 7c9bc98c..19a085d6 100644 --- a/tests/ResolvedDomainTest.php +++ b/tests/ResolvedDomainTest.php @@ -38,14 +38,12 @@ class ResolvedDomainTest extends TestCase * @covers ::getPublicSuffix * @covers ::getRegistrableDomain * @covers ::getSubDomain - * @covers ::getSecondLevelDomain */ public function testRegistrableDomainIsNullWithFoundDomain(): void { $domain = new ResolvedDomain(new Domain('faketld')); self::assertNull($domain->getPublicSuffix()->getContent()); self::assertNull($domain->getRegistrableDomain()->getContent()); - self::assertNull($domain->getSecondLevelDomain()); self::assertNull($domain->getSubDomain()->getContent()); } @@ -411,7 +409,6 @@ public function testResolveReturnsInstance(): void } /** - * @covers ::getSecondLevelDomain * @covers ::withSubDomain * @dataProvider withSubDomainWorksProvider * @@ -425,7 +422,6 @@ public function testWithSubDomainWorks(ResolvedDomain $domain, $subdomain, ?stri self::assertSame($expected, $result->getSubDomain()->getContent()); self::assertEquals($domain->getPublicSuffix(), $result->getPublicSuffix()); self::assertEquals($domain->getRegistrableDomain(), $result->getRegistrableDomain()); - self::assertSame($domain->getSecondLevelDomain(), $result->getSecondLevelDomain()); } public function withSubDomainWorksProvider(): iterable From a8077f19a8ef0503742bb8c6ad90e7c30b666f0d Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sat, 15 Aug 2020 18:19:03 +0200 Subject: [PATCH 225/461] Adding more interfaces for the local storage feature --- bin/update-pdp | 53 ++++++----- phpstan.tests.neon | 16 ++-- .../{ => Cache}/Psr16CacheException.php | 2 +- src/Storage/{ => Cache}/Psr16FileCache.php | 2 +- .../{ => Cache}/PublicSuffixListCache.php | 12 +-- .../PublicSuffixListCachePsr16Adapter.php | 13 +-- .../{ => Cache}/RootZoneDatabaseCache.php | 6 +- .../RootZoneDatabaseCachePsr16Adapter.php | 12 +-- .../{HttpClient.php => Http/Client.php} | 6 +- .../ClientException.php} | 4 +- .../CurlClient.php} | 8 +- .../CurlClientException.php} | 4 +- src/Storage/Http/PublicSuffixListClient.php | 30 ++++++ .../Http/PublicSuffixListCurlClient.php | 45 +++++++++ src/Storage/Http/RootZoneDatabaseClient.php | 32 +++++++ .../Http/RootZoneDatabaseCurlClient.php | 45 +++++++++ src/Storage/Manager.php | 94 ------------------- src/Storage/PublicSuffixListStorage.php | 47 ++++++++++ src/Storage/RootZoneDatabaseStorage.php | 47 ++++++++++ tests/Storage/CurlHttpClientTest.php | 16 ++-- tests/Storage/Psr16FileCacheTest.php | 14 +-- 21 files changed, 333 insertions(+), 175 deletions(-) rename src/Storage/{ => Cache}/Psr16CacheException.php (95%) rename src/Storage/{ => Cache}/Psr16FileCache.php (99%) rename src/Storage/{ => Cache}/PublicSuffixListCache.php (67%) rename src/Storage/{ => Cache}/PublicSuffixListCachePsr16Adapter.php (92%) rename src/Storage/{ => Cache}/RootZoneDatabaseCache.php (86%) rename src/Storage/{ => Cache}/RootZoneDatabaseCachePsr16Adapter.php (90%) rename src/Storage/{HttpClient.php => Http/Client.php} (85%) rename src/Storage/{HttpClientException.php => Http/ClientException.php} (85%) rename src/Storage/{CurlHttpClient.php => Http/CurlClient.php} (89%) rename src/Storage/{CurlHttpClientException.php => Http/CurlClientException.php} (79%) create mode 100644 src/Storage/Http/PublicSuffixListClient.php create mode 100644 src/Storage/Http/PublicSuffixListCurlClient.php create mode 100644 src/Storage/Http/RootZoneDatabaseClient.php create mode 100644 src/Storage/Http/RootZoneDatabaseCurlClient.php delete mode 100644 src/Storage/Manager.php create mode 100644 src/Storage/PublicSuffixListStorage.php create mode 100644 src/Storage/RootZoneDatabaseStorage.php diff --git a/bin/update-pdp b/bin/update-pdp index f492dffc..d7ce77a2 100755 --- a/bin/update-pdp +++ b/bin/update-pdp @@ -14,16 +14,19 @@ declare(strict_types=1); +use Pdp\PublicSuffixListConverter; +use Pdp\RootZoneDatabaseConverter; +use Pdp\Storage\Http\PublicSuffixListClient; +use Pdp\Storage\Http\RootZoneDatabaseClient; use Pdp\Storage\Logger; -use Pdp\Storage\Psr16FileCache; -use Pdp\Storage\PublicSuffixListCachePsr16Adapter; -use Pdp\Storage\RootZoneDatabaseCachePsr16Adapter; -use Pdp\Storage\CurlHttpClient; -use Pdp\Storage\Manager; +use Pdp\Storage\Cache\Psr16FileCache; +use Pdp\Storage\Cache\PublicSuffixListCachePsr16Adapter; +use Pdp\Storage\Cache\RootZoneDatabaseCachePsr16Adapter; +use Pdp\Storage\Http\CurlClient; +use Pdp\Storage\Http\PublicSuffixListCurlClient; +use Pdp\Storage\Http\RootZoneDatabaseCurlClient; const KEY_CACHE_DIR = 'cache-dir'; -const KEY_TTL = 'ttl'; -const DEFAULT_TTL = '1 DAY'; function success(string $message): void { @@ -74,7 +77,6 @@ $arguments = getopt('h::', [ 'h', 'help', KEY_CACHE_DIR.':', - KEY_TTL.':', ]); if (isset($arguments['help']) || isset($arguments['h']) || [] === $arguments) { @@ -84,7 +86,6 @@ if (isset($arguments['help']) || isset($arguments['h']) || [] === $arguments) { $script [options] {$yellow}Options:$reset -$green --%s=TTL$reset set the TTL for the cache ({$yellow}default:$reset '%s') $green --%s=PATH$reset set the cache root directory ({$yellow}default:$reset '$default_cache_dir') $green -h, --help$reset show the following help message @@ -92,9 +93,6 @@ $green -h, --help$reset show the following help message The {$green}update-php$reset command updates your PDP local cache. {$yellow}Examples:$reset - Refresh all the cache for a TTL of 3 DAY - $green$script --ttl="3 DAYS"$reset - Refresh all the cache using another cache directory $green$script --cache-dir=/temp$reset @@ -103,8 +101,6 @@ HELP; success(sprintf( $helpText, - KEY_TTL, - DEFAULT_TTL, KEY_CACHE_DIR )); @@ -117,20 +113,22 @@ if (!extension_loaded('curl')) { die(1); } -$context = filter_var_array($arguments + [KEY_CACHE_DIR => $default_cache_dir, KEY_TTL => DEFAULT_TTL], [ - KEY_TTL => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW], +$context = filter_var_array($arguments + [KEY_CACHE_DIR => $default_cache_dir], [ KEY_CACHE_DIR => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW], ]); +$ttl = new DateInterval('P1D'); +$logger = new Logger( STDOUT, STDERR); +$curlClient = new CurlClient(); + + try { - $logger = new Logger( STDOUT, STDERR); $cache = new Psr16FileCache($context[KEY_CACHE_DIR]); - $manager = new Manager( - new CurlHttpClient(), - new PublicSuffixListCachePsr16Adapter($cache, $context[KEY_TTL], $logger), - new RootZoneDatabaseCachePsr16Adapter($cache, $context[KEY_TTL], $logger), - ); + $pslClient = new PublicSuffixListCurlClient($curlClient, new PublicSuffixListConverter()); + $pslCache = new PublicSuffixListCachePsr16Adapter($cache, $ttl, $logger); + $rzdClient = new RootZoneDatabaseCurlClient($curlClient, new RootZoneDatabaseConverter()); + $rzdCache = new RootZoneDatabaseCachePsr16Adapter($cache, $ttl, $logger); } catch (Throwable $exception) { if (null !== $logger) { $logger->error('Local cache update initialisation failed with {exception}', ['exception' => $exception->getMessage()]); @@ -144,7 +142,10 @@ success("$yellow Starting updating your local cache.$reset"); $error = 0; try { - $manager->getPublicSuffixListRemoteCopy(); + $publicSuffixList = $pslClient->getByUri(PublicSuffixListClient::PSL_URL); + if (!$pslCache->storeByUri(PublicSuffixListClient::PSL_URL, $publicSuffixList)) { + throw new RuntimeException('Could not save the Public Suffix List to the `'.$context[KEY_CACHE_DIR].'` cache.'); + } } catch (Throwable $exception) { $logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); fail("$redbg The command failed to update the public suffix list local cache. $reset"); @@ -152,7 +153,10 @@ try { } try { - $manager->getRootZoneDatabaseRemoteCopy(); + $rootZoneDatabase = $rzdClient->getByUri(RootZoneDatabaseClient::RZD_URL); + if (!$rzdCache->storeByUri(RootZoneDatabaseClient::RZD_URL, $rootZoneDatabase)) { + throw new RuntimeException('Could not save the Root Zone Database to the `'.$context[KEY_CACHE_DIR].'` cache.'); + } } catch (Throwable $exception) { $logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); fail("$redbg The command failed to update the root zone database local cache. $reset"); @@ -165,4 +169,5 @@ if (0 === $error) { die(0); } +fail("$redbg The command failed to update the root zone database local cache. $reset"); die(1); diff --git a/phpstan.tests.neon b/phpstan.tests.neon index d143abc0..366b7e00 100644 --- a/phpstan.tests.neon +++ b/phpstan.tests.neon @@ -5,21 +5,21 @@ includes: parameters: checkMissingIterableValueType: false ignoreErrors: - - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Psr16FileCache::set\(\) expects string, null given.#' + - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Cache\\Psr16FileCache::set\(\) expects string, null given.#' path: tests/Storage/Psr16FileCacheTest.php - - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Psr16FileCache::delete\(\) expects string, null given.#' + - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Cache\\Psr16FileCache::delete\(\) expects string, null given.#' path: tests/Storage/Psr16FileCacheTest.php - - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Psr16FileCache::get\(\) expects string, null given.#' + - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Cache\\Psr16FileCache::get\(\) expects string, null given.#' path: tests/Storage/Psr16FileCacheTest.php - - message: '#Parameter \#3 \$ttl of method Pdp\\Storage\\Psr16FileCache::set\(\) expects DateInterval\|int\|null, DateTime\|false given.#' + - message: '#Parameter \#3 \$ttl of method Pdp\\Storage\\Cache\\Psr16FileCache::set\(\) expects DateInterval\|int\|null, DateTime\|false given.#' path: tests/Storage/Psr16FileCacheTest.php - - message: '#Parameter \#1 \$keys of method Pdp\\Storage\\Psr16FileCache::deleteMultiple\(\) expects iterable, null given.#' + - message: '#Parameter \#1 \$keys of method Pdp\\Storage\\Cache\\Psr16FileCache::deleteMultiple\(\) expects iterable, null given.#' path: tests/Storage/Psr16FileCacheTest.php - - message: '#Parameter \#1 \$keys of method Pdp\\Storage\\Psr16FileCache::getMultiple\(\) expects iterable, null given.#' + - message: '#Parameter \#1 \$keys of method Pdp\\Storage\\Cache\\Psr16FileCache::getMultiple\(\) expects iterable, null given.#' path: tests/Storage/Psr16FileCacheTest.php - - message: '#Parameter \#1 \$values of method Pdp\\Storage\\Psr16FileCache::setMultiple\(\) expects iterable, null given.#' + - message: '#Parameter \#1 \$values of method Pdp\\Storage\\Cache\\Psr16FileCache::setMultiple\(\) expects iterable, null given.#' path: tests/Storage/Psr16FileCacheTest.php - - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Psr16FileCache::has\(\) expects string, null given.#' + - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Cache\\Psr16FileCache::has\(\) expects string, null given.#' path: tests/Storage/Psr16FileCacheTest.php - message: '#Parameter \#1 \$exception of method PHPUnit\\Framework\\TestCase::expectException\(\) expects class-string\, string given.#' path: tests/Storage/Psr16FileCacheTest.php diff --git a/src/Storage/Psr16CacheException.php b/src/Storage/Cache/Psr16CacheException.php similarity index 95% rename from src/Storage/Psr16CacheException.php rename to src/Storage/Cache/Psr16CacheException.php index eebe8cdb..54c64eb2 100644 --- a/src/Storage/Psr16CacheException.php +++ b/src/Storage/Cache/Psr16CacheException.php @@ -13,7 +13,7 @@ declare(strict_types=1); -namespace Pdp\Storage; +namespace Pdp\Storage\Cache; use Psr\SimpleCache\InvalidArgumentException as PsrCacheException; diff --git a/src/Storage/Psr16FileCache.php b/src/Storage/Cache/Psr16FileCache.php similarity index 99% rename from src/Storage/Psr16FileCache.php rename to src/Storage/Cache/Psr16FileCache.php index c60fc7eb..f8dc8d0d 100644 --- a/src/Storage/Psr16FileCache.php +++ b/src/Storage/Cache/Psr16FileCache.php @@ -13,7 +13,7 @@ declare(strict_types=1); -namespace Pdp\Storage; +namespace Pdp\Storage\Cache; use DateInterval; use DateTimeImmutable; diff --git a/src/Storage/PublicSuffixListCache.php b/src/Storage/Cache/PublicSuffixListCache.php similarity index 67% rename from src/Storage/PublicSuffixListCache.php rename to src/Storage/Cache/PublicSuffixListCache.php index 93798c9d..16d7d5d2 100644 --- a/src/Storage/PublicSuffixListCache.php +++ b/src/Storage/Cache/PublicSuffixListCache.php @@ -13,23 +13,23 @@ declare(strict_types=1); -namespace Pdp\Storage; +namespace Pdp\Storage\Cache; -use Pdp\Rules; +use Pdp\PublicSuffixList; interface PublicSuffixListCache { /** - * Gets the Public Suffix List Rules. + * Retrieves the Public Suffix List from Cache. */ - public function fetchByUri(string $uri): ?Rules; + public function fetchByUri(string $uri): ?PublicSuffixList; /** - * Cache the Public Suffix List Rules. + * Caches the Public Suffix List. * * If a local cache already exists, it will be overwritten. * * Returns true if the refresh was successful, false otherwise */ - public function storeByUri(string $uri, Rules $rules): bool; + public function storeByUri(string $uri, PublicSuffixList $publicSuffixList): bool; } diff --git a/src/Storage/PublicSuffixListCachePsr16Adapter.php b/src/Storage/Cache/PublicSuffixListCachePsr16Adapter.php similarity index 92% rename from src/Storage/PublicSuffixListCachePsr16Adapter.php rename to src/Storage/Cache/PublicSuffixListCachePsr16Adapter.php index 9fe394bf..2873c2f0 100644 --- a/src/Storage/PublicSuffixListCachePsr16Adapter.php +++ b/src/Storage/Cache/PublicSuffixListCachePsr16Adapter.php @@ -13,11 +13,12 @@ declare(strict_types=1); -namespace Pdp\Storage; +namespace Pdp\Storage\Cache; use DateInterval; use DateTimeImmutable; use DateTimeInterface; +use Pdp\PublicSuffixList; use Pdp\Rules; use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; @@ -132,22 +133,22 @@ private function getCacheKey(string $str): string /** * Cache the Top Level Domain List. */ - public function storeByUri(string $uri, Rules $rules): bool + public function storeByUri(string $uri, PublicSuffixList $publicSuffixList): bool { try { - $result = $this->cache->set($this->getCacheKey($uri), json_encode($rules), $this->ttl); + $result = $this->cache->set($this->getCacheKey($uri), json_encode($publicSuffixList), $this->ttl); } catch (Throwable $exception) { $this->logger->info( - 'The Public Suffix List could not be saved with the following `'.$uri.'`:'.$exception->getMessage(), + 'The Public Suffix List could not be saved with the following URI: `'.$uri.'`:'.$exception->getMessage(), ['exception' => $exception] ); return false; } - $message = 'The Public Suffix List is stored for the following `'.$uri.'`'; + $message = 'The Public Suffix List is stored for the following URI: `'.$uri.'`.'; if (!$result) { - $message = 'The Public Suffix List could not be stored for the following '.$uri.'.'; + $message = 'The Public Suffix List could not be stored for the following URI: `'.$uri.'`.'; } $this->logger->info($message); diff --git a/src/Storage/RootZoneDatabaseCache.php b/src/Storage/Cache/RootZoneDatabaseCache.php similarity index 86% rename from src/Storage/RootZoneDatabaseCache.php rename to src/Storage/Cache/RootZoneDatabaseCache.php index 8f6ec228..2fcdc5a3 100644 --- a/src/Storage/RootZoneDatabaseCache.php +++ b/src/Storage/Cache/RootZoneDatabaseCache.php @@ -13,19 +13,19 @@ declare(strict_types=1); -namespace Pdp\Storage; +namespace Pdp\Storage\Cache; use Pdp\RootZoneDatabase; interface RootZoneDatabaseCache { /** - * Gets the Top Level Domains from the Cache. + * Retrieves the Root Zone Database from the Cache. */ public function fetchByUri(string $uri): ?RootZoneDatabase; /** - * Cache the Top Level Domains List. + * Cache the Root Zone Database. * * If a local cache already exists, it will be overwritten. * diff --git a/src/Storage/RootZoneDatabaseCachePsr16Adapter.php b/src/Storage/Cache/RootZoneDatabaseCachePsr16Adapter.php similarity index 90% rename from src/Storage/RootZoneDatabaseCachePsr16Adapter.php rename to src/Storage/Cache/RootZoneDatabaseCachePsr16Adapter.php index f959fbb9..62b7fb71 100644 --- a/src/Storage/RootZoneDatabaseCachePsr16Adapter.php +++ b/src/Storage/Cache/RootZoneDatabaseCachePsr16Adapter.php @@ -13,7 +13,7 @@ declare(strict_types=1); -namespace Pdp\Storage; +namespace Pdp\Storage\Cache; use DateInterval; use DateTimeImmutable; @@ -39,7 +39,7 @@ final class RootZoneDatabaseCachePsr16Adapter implements RootZoneDatabaseCache { - private const CACHE_PREFIX = 'RZD'; + private const CACHE_PREFIX = 'RZD_FULL_'; private CacheInterface $cache; @@ -130,7 +130,7 @@ public function fetchByUri(string $uri): ?RootZoneDatabase */ private function getCacheKey(string $str): string { - return sprintf('%s_FULL_%s', self::CACHE_PREFIX, md5(strtolower($str))); + return $this->prefix.md5(strtolower($str)); } public function storeByUri(string $uri, RootZoneDatabase $topLevelDomains): bool @@ -139,16 +139,16 @@ public function storeByUri(string $uri, RootZoneDatabase $topLevelDomains): bool $result = $this->cache->set($this->getCacheKey($uri), json_encode($topLevelDomains), $this->ttl); } catch (Throwable $exception) { $this->logger->info( - 'The Top Level Domains could not be saved with the following `'.$uri.'`:'.$exception->getMessage(), + 'The Root Zone Database could not be saved with the following URI: `'.$uri.'` :'.$exception->getMessage(), ['exception' => $exception] ); return false; } - $message = 'The Root Zone Domains List is stored for the following `'.$uri.'`'; + $message = 'The Root Zone Database is stored for the following URI: `'.$uri.'`.'; if (!$result) { - $message = 'The Root Zone Domains List could not be stored for the following '.$uri.'.'; + $message = 'The Root Zone Database could not be stored for the following URI: `'.$uri.'`.'; } $this->logger->info($message); diff --git a/src/Storage/HttpClient.php b/src/Storage/Http/Client.php similarity index 85% rename from src/Storage/HttpClient.php rename to src/Storage/Http/Client.php index b5b4cd03..7b9b8b5e 100644 --- a/src/Storage/HttpClient.php +++ b/src/Storage/Http/Client.php @@ -11,7 +11,7 @@ * file that was distributed with this source code. */ -namespace Pdp\Storage; +namespace Pdp\Storage\Http; /** * Interface for http adapters. @@ -24,12 +24,12 @@ * @author William Durand * @author Jeremy Kendall */ -interface HttpClient +interface Client { /** * Returns the content fetched from a given URL. * - * @throws HttpClientException If an errors occurs while fetching the content from a given URL + * @throws ClientException If an errors occurs while fetching the content from a given URL */ public function getContent(string $url): string; } diff --git a/src/Storage/HttpClientException.php b/src/Storage/Http/ClientException.php similarity index 85% rename from src/Storage/HttpClientException.php rename to src/Storage/Http/ClientException.php index 7fee7507..32988d61 100644 --- a/src/Storage/HttpClientException.php +++ b/src/Storage/Http/ClientException.php @@ -13,10 +13,10 @@ declare(strict_types=1); -namespace Pdp\Storage; +namespace Pdp\Storage\Http; use Throwable; -interface HttpClientException extends Throwable +interface ClientException extends Throwable { } diff --git a/src/Storage/CurlHttpClient.php b/src/Storage/Http/CurlClient.php similarity index 89% rename from src/Storage/CurlHttpClient.php rename to src/Storage/Http/CurlClient.php index 6502f7b5..f3cbb9c1 100644 --- a/src/Storage/CurlHttpClient.php +++ b/src/Storage/Http/CurlClient.php @@ -13,7 +13,7 @@ declare(strict_types=1); -namespace Pdp\Storage; +namespace Pdp\Storage\Http; use function curl_close; use function curl_errno; @@ -29,7 +29,7 @@ use const CURLOPT_SSL_VERIFYHOST; use const CURLOPT_SSL_VERIFYPEER; -final class CurlHttpClient implements HttpClient +final class CurlClient implements Client { private array $options; @@ -53,7 +53,7 @@ public function __construct(array $options = []) $res = @curl_setopt_array($curl, $this->options); curl_close($curl); if (!$res) { - throw new CurlHttpClientException('Please verify your curl additionnal options'); + throw new CurlClientException('Please verify your curl additionnal options'); } } @@ -71,7 +71,7 @@ public function getContent(string $url): string $message = curl_error($curl); curl_close($curl); if (CURLE_OK !== $code) { - throw new CurlHttpClientException($message, $code); + throw new CurlClientException($message, $code); } return $content; diff --git a/src/Storage/CurlHttpClientException.php b/src/Storage/Http/CurlClientException.php similarity index 79% rename from src/Storage/CurlHttpClientException.php rename to src/Storage/Http/CurlClientException.php index 4b7354df..609807b1 100644 --- a/src/Storage/CurlHttpClientException.php +++ b/src/Storage/Http/CurlClientException.php @@ -13,10 +13,10 @@ declare(strict_types=1); -namespace Pdp\Storage; +namespace Pdp\Storage\Http; use RuntimeException; -class CurlHttpClientException extends RuntimeException implements HttpClientException +class CurlClientException extends RuntimeException implements ClientException { } diff --git a/src/Storage/Http/PublicSuffixListClient.php b/src/Storage/Http/PublicSuffixListClient.php new file mode 100644 index 00000000..f11962f9 --- /dev/null +++ b/src/Storage/Http/PublicSuffixListClient.php @@ -0,0 +1,30 @@ +client = $client; + $this->converter = $converter; + } + + public function getByUri(string $uri = self::PSL_URL): PublicSuffixList + { + $rawBody = $this->client->getContent($uri); + $rawPsl = $this->converter->convert($rawBody); + + /** @var string $jsonEncodedPsl */ + $jsonEncodedPsl = json_encode($rawPsl); + + return Rules::fromJsonString($jsonEncodedPsl); + } +} diff --git a/src/Storage/Http/RootZoneDatabaseClient.php b/src/Storage/Http/RootZoneDatabaseClient.php new file mode 100644 index 00000000..49c69d2a --- /dev/null +++ b/src/Storage/Http/RootZoneDatabaseClient.php @@ -0,0 +1,32 @@ +client = $client; + $this->converter = $converter; + } + + public function getByUri(string $uri = self::RZD_URL): RootZoneDatabase + { + $rawBody = $this->client->getContent($uri); + $rawRzd = $this->converter->convert($rawBody); + + /** @var string $jsonEncodedRzd */ + $jsonEncodedRzd = json_encode($rawRzd); + + return TopLevelDomains::fromJsonString($jsonEncodedRzd); + } +} diff --git a/src/Storage/Manager.php b/src/Storage/Manager.php deleted file mode 100644 index 597da66a..00000000 --- a/src/Storage/Manager.php +++ /dev/null @@ -1,94 +0,0 @@ -http = $http; - $this->publicSuffixListCache = $rulesCache; - $this->rootZoneDatabaseCache = $topLevelDomainsCache; - } - - /** - * Gets the Public Suffix List from the Local Storage or the Remote Storage. - * - * @throws HttpClientException - * @throws UnableToLoadPublicSuffixList - */ - public function getPublicSuffixListLocalCopy(string $uri = self::PSL_URL): PublicSuffixList - { - return $this->publicSuffixListCache->fetchByUri($uri) ?? $this->getPublicSuffixListRemoteCopy($uri); - } - - /** - * Gets the Public Suffix List from an the Remote Storage. - * - * @throws HttpClientException - * @throws UnableToLoadPublicSuffixList - */ - public function getPublicSuffixListRemoteCopy(string $uri = self::PSL_URL): PublicSuffixList - { - $rules = Rules::fromString($this->http->getContent($uri)); - - $this->publicSuffixListCache->storeByUri($uri, $rules); - - return $rules; - } - - /** - * Gets the Top Level Domains from the Local Storage or the Remote Storage. - * - * @throws HttpClientException - * @throws UnableToLoadRootZoneDatabase - */ - public function getRootZoneDatabaseLocalCopy(string $uri = self::RZD_URL): RootZoneDatabase - { - return $this->rootZoneDatabaseCache->fetchByUri($uri) ?? $this->getRootZoneDatabaseRemoteCopy($uri); - } - - /** - * Gets the Top Level Domains from the Remote Storage. - * - * @throws HttpClientException - * @throws UnableToLoadRootZoneDatabase - */ - public function getRootZoneDatabaseRemoteCopy(string $uri = self::RZD_URL): RootZoneDatabase - { - $rootZoneDatabase = TopLevelDomains::fromString($this->http->getContent($uri)); - - $this->rootZoneDatabaseCache->storeByUri($uri, $rootZoneDatabase); - - return $rootZoneDatabase; - } -} diff --git a/src/Storage/PublicSuffixListStorage.php b/src/Storage/PublicSuffixListStorage.php new file mode 100644 index 00000000..190bee60 --- /dev/null +++ b/src/Storage/PublicSuffixListStorage.php @@ -0,0 +1,47 @@ +client = $client; + $this->cache = $cache; + } + + public function getByUri(string $uri = self::PSL_URL): PublicSuffixList + { + $publicSuffixList = $this->cache->fetchByUri($uri); + if (null !== $publicSuffixList) { + return $publicSuffixList; + } + + $publicSuffixList = $this->client->getByUri($uri); + + $this->cache->storeByUri($uri, $publicSuffixList); + + return $publicSuffixList; + } +} diff --git a/src/Storage/RootZoneDatabaseStorage.php b/src/Storage/RootZoneDatabaseStorage.php new file mode 100644 index 00000000..f7943032 --- /dev/null +++ b/src/Storage/RootZoneDatabaseStorage.php @@ -0,0 +1,47 @@ +client = $client; + $this->cache = $cache; + } + + public function getByUri(string $uri = self::RZD_URL): RootZoneDatabase + { + $rootZoneDatabase = $this->cache->fetchByUri($uri); + if (null !== $rootZoneDatabase) { + return $rootZoneDatabase; + } + + $rootZoneDatabase = $this->client->getByUri($uri); + + $this->cache->storeByUri($uri, $rootZoneDatabase); + + return $rootZoneDatabase; + } +} diff --git a/tests/Storage/CurlHttpClientTest.php b/tests/Storage/CurlHttpClientTest.php index 735c0360..2fb39d10 100644 --- a/tests/Storage/CurlHttpClientTest.php +++ b/tests/Storage/CurlHttpClientTest.php @@ -15,12 +15,12 @@ namespace Pdp\Tests\Storage; -use Pdp\Storage\CurlHttpClient; -use Pdp\Storage\CurlHttpClientException; +use Pdp\Storage\Http\CurlClient; +use Pdp\Storage\Http\CurlClientException; use PHPUnit\Framework\TestCase; /** - * @coversDefaultClass \Pdp\Storage\CurlHttpClient + * @coversDefaultClass \Pdp\Storage\Http\CurlClient */ final class CurlHttpClientTest extends TestCase { @@ -30,7 +30,7 @@ final class CurlHttpClientTest extends TestCase */ public function testGetContent(): void { - $content = (new CurlHttpClient())->getContent('https://www.google.com'); + $content = (new \Pdp\Storage\Http\CurlClient())->getContent('https://www.google.com'); self::assertStringContainsString('google', $content); } @@ -41,8 +41,8 @@ public function testGetContent(): void */ public function testThrowsException(): void { - self::expectException(CurlHttpClientException::class); - (new CurlHttpClient())->getContent('https://qsfsdfqdf.dfsf'); + self::expectException(CurlClientException::class); + (new CurlClient())->getContent('https://qsfsdfqdf.dfsf'); } /** @@ -50,7 +50,7 @@ public function testThrowsException(): void */ public function testConstructorThrowsException(): void { - self::expectException(CurlHttpClientException::class); - new CurlHttpClient(['foo' => 'bar']); + self::expectException(CurlClientException::class); + new CurlClient(['foo' => 'bar']); } } diff --git a/tests/Storage/Psr16FileCacheTest.php b/tests/Storage/Psr16FileCacheTest.php index 502c54b0..dd0933fa 100644 --- a/tests/Storage/Psr16FileCacheTest.php +++ b/tests/Storage/Psr16FileCacheTest.php @@ -19,8 +19,8 @@ use Generator; use Iterator; use org\bovigo\vfs\vfsStream; -use Pdp\Storage\Psr16CacheException; -use Pdp\Storage\Psr16FileCache; +use Pdp\Storage\Cache\Psr16CacheException; +use Pdp\Storage\Cache\Psr16FileCache; use PHPUnit\Framework\TestCase; use Psr\SimpleCache\InvalidArgumentException; use function dirname; @@ -38,7 +38,7 @@ final class Psr16FileCacheTest extends TestCase { /** - * @var \Pdp\Storage\Psr16FileCache + * @var \Pdp\Storage\Cache\Psr16FileCache */ protected $cache; @@ -57,7 +57,7 @@ public function setUp(): void $this->root = vfsStream::setup('pdp'); vfsStream::create(['cache' => []], $this->root); $this->cacheDir = vfsStream::url('pdp/cache'); - $this->cache = new Psr16FileCache($this->cacheDir); + $this->cache = new \Pdp\Storage\Cache\Psr16FileCache($this->cacheDir); } public function tearDown(): void @@ -128,7 +128,7 @@ public function testDelete(): void public function testGetInvalidArg(): void { - self::expectException(Psr16CacheException::class); + self::expectException(\Pdp\Storage\Cache\Psr16CacheException::class); $this->cache->get(null); } @@ -142,7 +142,7 @@ public function testInvalidKey(): void public function testSetInvalidTTL(): void { - self::expectException(Psr16CacheException::class); + self::expectException(\Pdp\Storage\Cache\Psr16CacheException::class); $this->cache->set('foo', 'bar', date_create()); } @@ -421,7 +421,7 @@ public function testSetMultipleExpireDateIntervalInt(): void public function testSetMultipleInvalidArg(): void { - self::expectException(Psr16CacheException::class); + self::expectException(\Pdp\Storage\Cache\Psr16CacheException::class); $this->cache->setMultiple(null); } From 839b8d382c4748833f52b6b9e33fe299baa60c67 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 17 Aug 2020 08:13:30 +0200 Subject: [PATCH 226/461] Decouple storage feature --- composer.json | 18 +- src/Storage/Cache/Psr16CacheException.php | 22 - src/Storage/Cache/Psr16FileCache.php | 329 ----------- .../RootZoneDatabaseCachePsr16Adapter.php | 158 ------ src/Storage/Http/Client.php | 35 -- src/Storage/Http/ClientException.php | 22 - src/Storage/Http/CurlClient.php | 79 --- src/Storage/Http/CurlClientException.php | 22 - .../Http/PublicSuffixListCurlClient.php | 45 -- .../Http/RootZoneDatabaseCurlClient.php | 45 -- ...chePsr16Adapter.php => JsonPsr16Cache.php} | 95 ++-- src/Storage/Logger.php | 81 --- .../{Cache => }/PublicSuffixListCache.php | 2 +- .../PublicSuffixListCachePsr16Adapter.php | 59 ++ .../{Http => }/PublicSuffixListClient.php | 5 +- .../PublicSuffixListClientPsr18Adapter.php | 65 +++ src/Storage/PublicSuffixListStorage.php | 4 +- .../{Cache => }/RootZoneDatabaseCache.php | 2 +- .../RootZoneDatabaseCachePsr16Adapter.php | 59 ++ .../{Http => }/RootZoneDatabaseClient.php | 5 +- .../RootZoneDatabaseClientPsr18Adapter.php | 65 +++ src/Storage/RootZoneDatabaseStorage.php | 6 +- src/UnableToLoadPublicSuffixList.php | 10 + src/UnableToLoadRootZoneDatabase.php | 10 + tests/Storage/CurlHttpClientTest.php | 56 -- tests/Storage/Psr16FileCacheTest.php | 520 ------------------ 26 files changed, 322 insertions(+), 1497 deletions(-) delete mode 100644 src/Storage/Cache/Psr16CacheException.php delete mode 100644 src/Storage/Cache/Psr16FileCache.php delete mode 100644 src/Storage/Cache/RootZoneDatabaseCachePsr16Adapter.php delete mode 100644 src/Storage/Http/Client.php delete mode 100644 src/Storage/Http/ClientException.php delete mode 100644 src/Storage/Http/CurlClient.php delete mode 100644 src/Storage/Http/CurlClientException.php delete mode 100644 src/Storage/Http/PublicSuffixListCurlClient.php delete mode 100644 src/Storage/Http/RootZoneDatabaseCurlClient.php rename src/Storage/{Cache/PublicSuffixListCachePsr16Adapter.php => JsonPsr16Cache.php} (56%) delete mode 100644 src/Storage/Logger.php rename src/Storage/{Cache => }/PublicSuffixListCache.php (96%) create mode 100644 src/Storage/PublicSuffixListCachePsr16Adapter.php rename src/Storage/{Http => }/PublicSuffixListClient.php (82%) create mode 100644 src/Storage/PublicSuffixListClientPsr18Adapter.php rename src/Storage/{Cache => }/RootZoneDatabaseCache.php (96%) create mode 100644 src/Storage/RootZoneDatabaseCachePsr16Adapter.php rename src/Storage/{Http => }/RootZoneDatabaseClient.php (84%) create mode 100644 src/Storage/RootZoneDatabaseClientPsr18Adapter.php delete mode 100644 tests/Storage/CurlHttpClientTest.php delete mode 100644 tests/Storage/Psr16FileCacheTest.php diff --git a/composer.json b/composer.json index bf212c6e..6147d384 100644 --- a/composer.json +++ b/composer.json @@ -44,21 +44,23 @@ "require-dev": { "composer/composer": "^1.6", "friendsofphp/php-cs-fixer": "^2.16", - "mikey179/vfsstream": "^1.6.7", "phpstan/phpstan": "^0.12", "phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan-strict-rules": "^0.12", "phpunit/phpunit": "^9.0", "psr/log": "^1.1", - "psr/simple-cache": "^1.0.1" + "psr/simple-cache": "^1.0.1", + "guzzlehttp/guzzle": "^7.0.0", + "guzzlehttp/psr7": "^1.6.0", + "psr/http-factory": "^1.0.0", + "symfony/cache": "^v5.0.0" }, "suggest": { - "psr/simple-cache-implementation": "To enable using other cache providers", - "psr/log-implementation": "To enable using other logger providers", - "ext-curl": "To use the package http client", - "league/uri": "To parse URL and validate host", - "psr/log": "^1.1", - "psr/simple-cache": "^1.0.1" + "psr/simple-cache-implementation": "To use the storage functionnality which depends on PSR-16", + "psr/log-implementation": "To use the storage functionnality which depends on PSR-3", + "psr/http-client-implementation": "To use the storage functionnality which depends on PSR-18", + "psr/http-factory": "To use the storage functionnality which depends on PSR-17", + "league/uri": "To parse URL and validate host" }, "autoload": { "psr-4": { diff --git a/src/Storage/Cache/Psr16CacheException.php b/src/Storage/Cache/Psr16CacheException.php deleted file mode 100644 index 54c64eb2..00000000 --- a/src/Storage/Cache/Psr16CacheException.php +++ /dev/null @@ -1,22 +0,0 @@ -mkdir($cachePath); // ensure that the parent path exists - } - - if (!is_writable($cachePath.DIRECTORY_SEPARATOR)) { - throw new InvalidArgumentException(sprintf('cache path does not exist or is not writable: %s', $cachePath)); - } - - $this->cachePath = $cachePath; - } - - /** - * {@inheritdoc} - */ - public function get($key, $default = null) - { - $path = $this->getPath($key); - $expires_at = @filemtime($path); - if (false === $expires_at) { - return $default; // file not found - } - - if (time() >= $expires_at) { - @unlink($path); // file expired - - return $default; - } - - $data = @file_get_contents($path); - if (false === $data) { - return $default; // race condition: file not found - } - - if ('b:0;' === $data) { - return false; // because we can't otherwise distinguish a FALSE return-value from unserialize() - } - - $value = @unserialize($data); - if (false === $value) { - return $default; // unserialize() failed - } - - return $value; - } - - /** - * {@inheritdoc} - */ - public function set($key, $value, $ttl = null) - { - if (!is_writable($this->cachePath.DIRECTORY_SEPARATOR)) { - return false; - } - - $expires_at = $this->getExpireAt($ttl); - $path = $this->getPath($key); - $dir = dirname($path); - - if (!file_exists($dir)) { - // ensure that the parent path exists: - $this->mkdir($dir); - } - - $temp_path = $this->cachePath.DIRECTORY_SEPARATOR.uniqid('', true); - if (false === @file_put_contents($temp_path, serialize($value))) { - return false; - } - - if (false === @chmod($temp_path, $this->fileMode)) { - return false; - } - - if (@touch($temp_path, $expires_at) && @rename($temp_path, $path)) { - return true; - } - - @unlink($temp_path); - - return false; - } - - /** - * Returns the expiration time expressed in the number of seconds since the Unix Epoch. - * - * @param mixed $ttl a valid time to live type - */ - private function getExpireAt($ttl): int - { - $ttl = $ttl ?? self::CACHE_TTL; - if (is_int($ttl)) { - return time() + $ttl; - } - - if ($ttl instanceof DateInterval) { - $now = new DateTimeImmutable('@'.time()); - - return $now->add($ttl)->getTimestamp(); - } - - throw new Psr16CacheException(sprintf('Expected TTL to be an int, a DateInterval or null; received "%s"', is_object($ttl) ? get_class($ttl) : gettype($ttl))); - } - - /** - * {@inheritdoc} - */ - public function delete($key) - { - return @unlink($this->getPath($key)); - } - - /** - * {@inheritdoc} - */ - public function clear() - { - $success = true; - - $paths = $this->listPaths(); - foreach ($paths as $path) { - if (!unlink($path)) { - $success = false; - } - } - - return $success; - } - - /** - * {@inheritdoc} - */ - public function getMultiple($keys, $default = null) - { - if (!is_iterable($keys)) { - throw new Psr16CacheException('keys must be either of type array or Traversable'); - } - - $values = []; - foreach ($keys as $key) { - $values[$key] = $this->get($key) ?? $default; - } - - return $values; - } - - /** - * {@inheritdoc} - */ - public function setMultiple($values, $ttl = null) - { - if (!is_iterable($values)) { - throw new Psr16CacheException('keys must be either of type array or Traversable'); - } - - $ok = true; - - foreach ($values as $key => $value) { - $this->validateKey($key); - $ok = $this->set($key, $value, $ttl) && $ok; - } - - return $ok; - } - - /** - * {@inheritdoc} - */ - public function deleteMultiple($keys): bool - { - if (!is_iterable($keys)) { - throw new Psr16CacheException('keys must be either of type array or Traversable'); - } - - $successful = false; - foreach ($keys as $key) { - $this->validateKey($key); - $successful = $this->delete($key); - if (false === $successful) { - break; - } - } - - return $successful; - } - - /** - * {@inheritdoc} - */ - public function has($key): bool - { - return $this->get($key, $this) !== $this; - } - - /** - * For a given cache key, obtain the absolute file path. - * - * @param string $key - * - *@throws Psr16CacheException if the specified key contains a character reserved by PSR-16 - * @return string absolute path to cache-file - * - */ - private function getPath($key): string - { - $this->validateKey($key); - - return $this->cachePath.DIRECTORY_SEPARATOR.self::FILE_PREFIX.$key.self::FILE_EXTENSION; - } - - private function listPaths(): Generator - { - $iterator = new FilesystemIterator( - $this->cachePath, - FilesystemIterator::CURRENT_AS_PATHNAME | FilesystemIterator::SKIP_DOTS - ); - - /** @var string $path */ - foreach ($iterator as $path) { - if (!is_dir($path)) { - yield $path; - } - } - } - - /** - * @param string $key - * - * @throws Psr16CacheException - */ - private function validateKey($key): void - { - if (!is_string($key)) { - throw new Psr16CacheException(sprintf('Expected key to be a string; received "%s"', is_object($key) ? get_class($key) : gettype($key))); - } - - if (1 === preg_match(self::PSR16_RESERVED, $key, $match)) { - throw new Psr16CacheException(sprintf('invalid character in key: %s', $match[0])); - } - } - - /** - * Recursively create directories and apply permission mask. - * - * @param string $path absolute directory path - */ - private function mkdir($path): void - { - $parent_path = dirname($path); - - if (!file_exists($parent_path)) { - $this->mkdir($parent_path); // recursively create parent dirs first - } - - mkdir($path); - chmod($path, $this->dirMode); - } -} diff --git a/src/Storage/Cache/RootZoneDatabaseCachePsr16Adapter.php b/src/Storage/Cache/RootZoneDatabaseCachePsr16Adapter.php deleted file mode 100644 index 62b7fb71..00000000 --- a/src/Storage/Cache/RootZoneDatabaseCachePsr16Adapter.php +++ /dev/null @@ -1,158 +0,0 @@ -cache = $cache; - $this->ttl = $this->setTtl($ttl); - $this->logger = $logger ?? new NullLogger(); - $this->prefix = $prefix; - } - - /** - * Set the cache TTL. - * - * @param mixed $ttl the cache TTL - * - * @throws TypeError if the value type is not recognized - */ - private function setTtl($ttl): ?DateInterval - { - if ($ttl instanceof DateInterval || null === $ttl) { - return $ttl; - } - - if ($ttl instanceof DateTimeInterface) { - return (new DateTimeImmutable('NOW', $ttl->getTimezone()))->diff($ttl); - } - - if (false !== ($res = filter_var($ttl, FILTER_VALIDATE_INT))) { - return new DateInterval('PT'.$res.'S'); - } - - if (!is_string($ttl)) { - throw new TypeError(sprintf( - 'The ttl must null, an integer, a string a DateTimeInterface or a DateInterval object %s given', - is_object($ttl) ? get_class($ttl) : gettype($ttl) - )); - } - - /** @var DateInterval|false $date */ - $date = @DateInterval::createFromDateString($ttl); - if (!$date instanceof DateInterval) { - throw new Psr16CacheException(sprintf( - 'The ttl value "%s" can not be parsable by `DateInterval::createFromDateString`', - $ttl - )); - } - - return $date; - } - - /** - * Gets the Public Suffix List Rules. - * - * @throws UnableToLoadRootZoneDatabase - */ - public function fetchByUri(string $uri): ?RootZoneDatabase - { - $cacheKey = $this->getCacheKey($uri); - $cacheData = $this->cache->get($cacheKey); - if (null === $cacheData) { - return null; - } - - try { - $topLevelDomains = TopLevelDomains::fromJsonString($cacheData); - } catch (Throwable $exception) { - $this->cache->delete($cacheKey); - $this->logger->warning($exception->getMessage()); - - return null; - } - - return $topLevelDomains; - } - - /** - * Returns the cache key according to the source URL. - */ - private function getCacheKey(string $str): string - { - return $this->prefix.md5(strtolower($str)); - } - - public function storeByUri(string $uri, RootZoneDatabase $topLevelDomains): bool - { - try { - $result = $this->cache->set($this->getCacheKey($uri), json_encode($topLevelDomains), $this->ttl); - } catch (Throwable $exception) { - $this->logger->info( - 'The Root Zone Database could not be saved with the following URI: `'.$uri.'` :'.$exception->getMessage(), - ['exception' => $exception] - ); - - return false; - } - - $message = 'The Root Zone Database is stored for the following URI: `'.$uri.'`.'; - if (!$result) { - $message = 'The Root Zone Database could not be stored for the following URI: `'.$uri.'`.'; - } - - $this->logger->info($message); - - return $result; - } -} diff --git a/src/Storage/Http/Client.php b/src/Storage/Http/Client.php deleted file mode 100644 index 7b9b8b5e..00000000 --- a/src/Storage/Http/Client.php +++ /dev/null @@ -1,35 +0,0 @@ - - * @author Jeremy Kendall - */ -interface Client -{ - /** - * Returns the content fetched from a given URL. - * - * @throws ClientException If an errors occurs while fetching the content from a given URL - */ - public function getContent(string $url): string; -} diff --git a/src/Storage/Http/ClientException.php b/src/Storage/Http/ClientException.php deleted file mode 100644 index 32988d61..00000000 --- a/src/Storage/Http/ClientException.php +++ /dev/null @@ -1,22 +0,0 @@ -options = $options + [ - CURLOPT_FAILONERROR => true, - CURLOPT_FOLLOWLOCATION => true, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_SSL_VERIFYPEER => true, - CURLOPT_SSL_VERIFYHOST => 2, - CURLOPT_HTTPGET => true, - ]; - - $curl = curl_init(); - $res = @curl_setopt_array($curl, $this->options); - curl_close($curl); - if (!$res) { - throw new CurlClientException('Please verify your curl additionnal options'); - } - } - - /** - * {@inheritdoc} - */ - public function getContent(string $url): string - { - /** @var resource $curl */ - $curl = curl_init($url); - curl_setopt_array($curl, $this->options); - /** @var string $content */ - $content = curl_exec($curl); - $code = curl_errno($curl); - $message = curl_error($curl); - curl_close($curl); - if (CURLE_OK !== $code) { - throw new CurlClientException($message, $code); - } - - return $content; - } -} diff --git a/src/Storage/Http/CurlClientException.php b/src/Storage/Http/CurlClientException.php deleted file mode 100644 index 609807b1..00000000 --- a/src/Storage/Http/CurlClientException.php +++ /dev/null @@ -1,22 +0,0 @@ -client = $client; - $this->converter = $converter; - } - - public function getByUri(string $uri = self::PSL_URL): PublicSuffixList - { - $rawBody = $this->client->getContent($uri); - $rawPsl = $this->converter->convert($rawBody); - - /** @var string $jsonEncodedPsl */ - $jsonEncodedPsl = json_encode($rawPsl); - - return Rules::fromJsonString($jsonEncodedPsl); - } -} diff --git a/src/Storage/Http/RootZoneDatabaseCurlClient.php b/src/Storage/Http/RootZoneDatabaseCurlClient.php deleted file mode 100644 index d4f9b267..00000000 --- a/src/Storage/Http/RootZoneDatabaseCurlClient.php +++ /dev/null @@ -1,45 +0,0 @@ -client = $client; - $this->converter = $converter; - } - - public function getByUri(string $uri = self::RZD_URL): RootZoneDatabase - { - $rawBody = $this->client->getContent($uri); - $rawRzd = $this->converter->convert($rawBody); - - /** @var string $jsonEncodedRzd */ - $jsonEncodedRzd = json_encode($rawRzd); - - return TopLevelDomains::fromJsonString($jsonEncodedRzd); - } -} diff --git a/src/Storage/Cache/PublicSuffixListCachePsr16Adapter.php b/src/Storage/JsonPsr16Cache.php similarity index 56% rename from src/Storage/Cache/PublicSuffixListCachePsr16Adapter.php rename to src/Storage/JsonPsr16Cache.php index 2873c2f0..b34d7468 100644 --- a/src/Storage/Cache/PublicSuffixListCachePsr16Adapter.php +++ b/src/Storage/JsonPsr16Cache.php @@ -13,15 +13,14 @@ declare(strict_types=1); -namespace Pdp\Storage\Cache; +namespace Pdp\Storage; use DateInterval; use DateTimeImmutable; use DateTimeInterface; -use Pdp\PublicSuffixList; -use Pdp\Rules; +use InvalidArgumentException; +use JsonSerializable; use Psr\Log\LoggerInterface; -use Psr\Log\NullLogger; use Psr\SimpleCache\CacheInterface; use Throwable; use TypeError; @@ -36,28 +35,15 @@ use function strtolower; use const FILTER_VALIDATE_INT; -final class PublicSuffixListCachePsr16Adapter implements PublicSuffixListCache +abstract class JsonPsr16Cache { - private const CACHE_PREFIX = 'PSL_FULL_'; + protected const CACHE_PREFIX = 'pdp_'; - private CacheInterface $cache; + protected CacheInterface $cache; - private LoggerInterface $logger; + protected LoggerInterface $logger; - private ?DateInterval $ttl; - - private string $prefix; - - /** - * @param mixed|null $ttl the time to live for the given cache - */ - public function __construct(CacheInterface $cache, $ttl = null, LoggerInterface $logger = null, string $prefix = self::CACHE_PREFIX) - { - $this->cache = $cache; - $this->ttl = $this->setTtl($ttl); - $this->logger = $logger ?? new NullLogger(); - $this->prefix = $prefix; - } + protected ?DateInterval $ttl; /** * Set the cache TTL. @@ -66,7 +52,7 @@ public function __construct(CacheInterface $cache, $ttl = null, LoggerInterface * * @throws TypeError if the value type is not recognized */ - private function setTtl($ttl): ?DateInterval + final protected function setTtl($ttl): ?DateInterval { if ($ttl instanceof DateInterval || null === $ttl) { return $ttl; @@ -90,7 +76,7 @@ private function setTtl($ttl): ?DateInterval /** @var DateInterval|false $date */ $date = @DateInterval::createFromDateString($ttl); if (!$date instanceof DateInterval) { - throw new Psr16CacheException(sprintf( + throw new InvalidArgumentException(sprintf( 'The ttl value "%s" can not be parsable by `DateInterval::createFromDateString`', $ttl )); @@ -99,60 +85,49 @@ private function setTtl($ttl): ?DateInterval return $date; } - /** - * Gets the Public Suffix List Rules. - */ - public function fetchByUri(string $uri): ?Rules + final protected function storeJson(string $uri, JsonSerializable $object): bool { - $cacheKey = $this->getCacheKey($uri); - $cacheData = $this->cache->get($cacheKey); - if (null === $cacheData) { - return $cacheData; - } - try { - $rules = Rules::fromJsonString($cacheData); + $result = $this->cache->set($this->getCacheKey($uri), json_encode($object), $this->ttl); } catch (Throwable $exception) { - $this->cache->delete($cacheKey); - $this->logger->warning($exception->getMessage()); + $this->logger->info( + 'The following URI: `'.$uri.'` could not be cached :'.$exception->getMessage(), + ['exception' => $exception] + ); - return null; + return false; } - return $rules; + $message = 'The following URI: `'.$uri.'` was stored.'; + if (!$result) { + $message = 'The following URI: `'.$uri.'` could not be stored.'; + } + + $this->logger->info($message); + + return $result; } /** * Returns the cache key according to the source URL. */ - private function getCacheKey(string $str): string + final protected function getCacheKey(string $str): string { - return $this->prefix.md5(strtolower($str)); + return self::CACHE_PREFIX.md5(strtolower($str)); } - /** - * Cache the Top Level Domain List. - */ - public function storeByUri(string $uri, PublicSuffixList $publicSuffixList): bool + final protected function fetchJson(string $uri): ?string { - try { - $result = $this->cache->set($this->getCacheKey($uri), json_encode($publicSuffixList), $this->ttl); - } catch (Throwable $exception) { - $this->logger->info( - 'The Public Suffix List could not be saved with the following URI: `'.$uri.'`:'.$exception->getMessage(), - ['exception' => $exception] - ); - - return false; - } + return $this->cache->get($this->getCacheKey($uri)); + } - $message = 'The Public Suffix List is stored for the following URI: `'.$uri.'`.'; - if (!$result) { - $message = 'The Public Suffix List could not be stored for the following URI: `'.$uri.'`.'; + final protected function forgetJson(string $uri, Throwable $exception = null): bool + { + $result = $this->cache->delete($this->getCacheKey($uri)); + if (null !== $exception) { + $this->logger->warning($exception->getMessage()); } - $this->logger->info($message); - return $result; } } diff --git a/src/Storage/Logger.php b/src/Storage/Logger.php deleted file mode 100644 index 28dcf5a3..00000000 --- a/src/Storage/Logger.php +++ /dev/null @@ -1,81 +0,0 @@ - 1, - LogLevel::ALERT => 1, - LogLevel::CRITICAL => 1, - LogLevel::ERROR => 1, - LogLevel::WARNING => 1, - LogLevel::NOTICE => 1, - ]; - - /** - * @var resource - */ - private $out; - - /** - * @var resource - */ - private $error; - - /** - * @param mixed $out a resource default to PHP STDOUT - * @param mixed $error a resource default to PHP STDERR - */ - public function __construct($out = STDOUT, $error = STDERR) - { - if (!is_resource($out)) { - throw new TypeError('The output logger should be a resource.'); - } - - if (!is_resource($error)) { - throw new TypeError('The error output logger channel should be a resource.'); - } - - $this->out = $out; - $this->error = $error; - } - - /** - * @inheritDoc - */ - public function log($level, $message, array $context = []) - { - $replace = []; - foreach ($context as $key => $val) { - $replace['{'.$key.'}'] = $val; - } - - fwrite( - isset(self::ERRORS_LEVELS[$level]) ? $this->error : $this->out, - strtr($message, $replace).PHP_EOL - ); - } -} diff --git a/src/Storage/Cache/PublicSuffixListCache.php b/src/Storage/PublicSuffixListCache.php similarity index 96% rename from src/Storage/Cache/PublicSuffixListCache.php rename to src/Storage/PublicSuffixListCache.php index 16d7d5d2..d6b574dd 100644 --- a/src/Storage/Cache/PublicSuffixListCache.php +++ b/src/Storage/PublicSuffixListCache.php @@ -13,7 +13,7 @@ declare(strict_types=1); -namespace Pdp\Storage\Cache; +namespace Pdp\Storage; use Pdp\PublicSuffixList; diff --git a/src/Storage/PublicSuffixListCachePsr16Adapter.php b/src/Storage/PublicSuffixListCachePsr16Adapter.php new file mode 100644 index 00000000..ae0326cf --- /dev/null +++ b/src/Storage/PublicSuffixListCachePsr16Adapter.php @@ -0,0 +1,59 @@ +cache = $cache; + $this->ttl = $this->setTtl($ttl); + $this->logger = $logger ?? new NullLogger(); + } + + public function fetchByUri(string $uri): ?Rules + { + $cacheData = $this->fetchJson($uri); + if (null === $cacheData) { + return null; + } + + try { + $rules = Rules::fromJsonString($cacheData); + } catch (Throwable $exception) { + $this->forgetJson($uri, $exception); + + return null; + } + + return $rules; + } + + public function storeByUri(string $uri, PublicSuffixList $publicSuffixList): bool + { + return $this->storeJson($uri, $publicSuffixList); + } +} diff --git a/src/Storage/Http/PublicSuffixListClient.php b/src/Storage/PublicSuffixListClient.php similarity index 82% rename from src/Storage/Http/PublicSuffixListClient.php rename to src/Storage/PublicSuffixListClient.php index f11962f9..88094fa2 100644 --- a/src/Storage/Http/PublicSuffixListClient.php +++ b/src/Storage/PublicSuffixListClient.php @@ -13,7 +13,7 @@ declare(strict_types=1); -namespace Pdp\Storage\Http; +namespace Pdp\Storage; use Pdp\PublicSuffixList; use Pdp\UnableToLoadPublicSuffixList; @@ -23,8 +23,7 @@ interface PublicSuffixListClient public const PSL_URL = 'https://publicsuffix.org/list/public_suffix_list.dat'; /** - * @throws ClientException * @throws UnableToLoadPublicSuffixList */ - public function getByUri(string $uri = self::PSL_URL): PublicSuffixList; + public function getByUri(string $uri): PublicSuffixList; } diff --git a/src/Storage/PublicSuffixListClientPsr18Adapter.php b/src/Storage/PublicSuffixListClientPsr18Adapter.php new file mode 100644 index 00000000..1f04ecb2 --- /dev/null +++ b/src/Storage/PublicSuffixListClientPsr18Adapter.php @@ -0,0 +1,65 @@ +client = $client; + $this->requestFactory = $requestFactory; + $this->converter = $converter; + } + + public function getByUri(string $uri): PublicSuffixList + { + $request = $this->requestFactory->createRequest('GET', $uri); + try { + $response = $this->client->sendRequest($request); + } catch (ClientExceptionInterface $exception) { + throw UnableToLoadPublicSuffixList::dueToUnavailableService($uri, $exception); + } + + if (400 <= $response->getStatusCode()) { + throw UnableToLoadPublicSuffixList::dueToUnexpectedContent($uri, $response->getStatusCode()); + } + + $rawPsl = $this->converter->convert($response->getBody()); + + /** @var string $jsonEncodedPsl */ + $jsonEncodedPsl = json_encode($rawPsl); + + return Rules::fromJsonString($jsonEncodedPsl); + } +} diff --git a/src/Storage/PublicSuffixListStorage.php b/src/Storage/PublicSuffixListStorage.php index 190bee60..dfa4cc7b 100644 --- a/src/Storage/PublicSuffixListStorage.php +++ b/src/Storage/PublicSuffixListStorage.php @@ -16,8 +16,6 @@ namespace Pdp\Storage; use Pdp\PublicSuffixList; -use Pdp\Storage\Cache\PublicSuffixListCache; -use Pdp\Storage\Http\PublicSuffixListClient; final class PublicSuffixListStorage implements PublicSuffixListClient { @@ -31,7 +29,7 @@ public function __construct(PublicSuffixListClient $client, PublicSuffixListCach $this->cache = $cache; } - public function getByUri(string $uri = self::PSL_URL): PublicSuffixList + public function getByUri(string $uri): PublicSuffixList { $publicSuffixList = $this->cache->fetchByUri($uri); if (null !== $publicSuffixList) { diff --git a/src/Storage/Cache/RootZoneDatabaseCache.php b/src/Storage/RootZoneDatabaseCache.php similarity index 96% rename from src/Storage/Cache/RootZoneDatabaseCache.php rename to src/Storage/RootZoneDatabaseCache.php index 2fcdc5a3..04e68bf2 100644 --- a/src/Storage/Cache/RootZoneDatabaseCache.php +++ b/src/Storage/RootZoneDatabaseCache.php @@ -13,7 +13,7 @@ declare(strict_types=1); -namespace Pdp\Storage\Cache; +namespace Pdp\Storage; use Pdp\RootZoneDatabase; diff --git a/src/Storage/RootZoneDatabaseCachePsr16Adapter.php b/src/Storage/RootZoneDatabaseCachePsr16Adapter.php new file mode 100644 index 00000000..861d0cbe --- /dev/null +++ b/src/Storage/RootZoneDatabaseCachePsr16Adapter.php @@ -0,0 +1,59 @@ +cache = $cache; + $this->ttl = $this->setTtl($ttl); + $this->logger = $logger ?? new NullLogger(); + } + + public function fetchByUri(string $uri): ?RootZoneDatabase + { + $cacheData = $this->fetchJson($uri); + if (null === $cacheData) { + return null; + } + + try { + $topLevelDomains = TopLevelDomains::fromJsonString($cacheData); + } catch (Throwable $exception) { + $this->forgetJson($uri, $exception); + + return null; + } + + return $topLevelDomains; + } + + public function storeByUri(string $uri, RootZoneDatabase $topLevelDomains): bool + { + return $this->storeJson($uri, $topLevelDomains); + } +} diff --git a/src/Storage/Http/RootZoneDatabaseClient.php b/src/Storage/RootZoneDatabaseClient.php similarity index 84% rename from src/Storage/Http/RootZoneDatabaseClient.php rename to src/Storage/RootZoneDatabaseClient.php index 49c69d2a..47c2a149 100644 --- a/src/Storage/Http/RootZoneDatabaseClient.php +++ b/src/Storage/RootZoneDatabaseClient.php @@ -13,7 +13,7 @@ declare(strict_types=1); -namespace Pdp\Storage\Http; +namespace Pdp\Storage; use Pdp\RootZoneDatabase; use Pdp\UnableToLoadRootZoneDatabase; @@ -25,8 +25,7 @@ interface RootZoneDatabaseClient /** * Gets the Top Level Domains from the Local Storage or the Remote Storage. * - * @throws ClientException * @throws UnableToLoadRootZoneDatabase */ - public function getByUri(string $uri = self::RZD_URL): RootZoneDatabase; + public function getByUri(string $uri): RootZoneDatabase; } diff --git a/src/Storage/RootZoneDatabaseClientPsr18Adapter.php b/src/Storage/RootZoneDatabaseClientPsr18Adapter.php new file mode 100644 index 00000000..4f14eb36 --- /dev/null +++ b/src/Storage/RootZoneDatabaseClientPsr18Adapter.php @@ -0,0 +1,65 @@ +client = $client; + $this->requestFactory = $requestFactory; + $this->converter = $converter; + } + + public function getByUri(string $uri): RootZoneDatabase + { + $request = $this->requestFactory->createRequest('GET', $uri); + try { + $response = $this->client->sendRequest($request); + } catch (ClientExceptionInterface $exception) { + throw UnableToLoadRootZoneDatabase::dueToUnavailableService($uri, $exception); + } + + if (400 <= $response->getStatusCode()) { + throw UnableToLoadRootZoneDatabase::dueToUnexpectedContent($uri, $response->getStatusCode()); + } + + $rawRzd = $this->converter->convert($response->getBody()); + + /** @var string $jsonEncodedRzd */ + $jsonEncodedRzd = json_encode($rawRzd); + + return TopLevelDomains::fromJsonString($jsonEncodedRzd); + } +} diff --git a/src/Storage/RootZoneDatabaseStorage.php b/src/Storage/RootZoneDatabaseStorage.php index f7943032..4d2245c1 100644 --- a/src/Storage/RootZoneDatabaseStorage.php +++ b/src/Storage/RootZoneDatabaseStorage.php @@ -16,10 +16,8 @@ namespace Pdp\Storage; use Pdp\RootZoneDatabase; -use Pdp\Storage\Cache\RootZoneDatabaseCache; -use Pdp\Storage\Http\RootZoneDatabaseClient; -class RootZoneDatabaseStorage implements RootZoneDatabaseClient +final class RootZoneDatabaseStorage implements RootZoneDatabaseClient { private RootZoneDatabaseClient $client; @@ -31,7 +29,7 @@ public function __construct(RootZoneDatabaseClient $client, RootZoneDatabaseCach $this->cache = $cache; } - public function getByUri(string $uri = self::RZD_URL): RootZoneDatabase + public function getByUri(string $uri): RootZoneDatabase { $rootZoneDatabase = $this->cache->fetchByUri($uri); if (null !== $rootZoneDatabase) { diff --git a/src/UnableToLoadPublicSuffixList.php b/src/UnableToLoadPublicSuffixList.php index 1a1589e0..36e3a855 100644 --- a/src/UnableToLoadPublicSuffixList.php +++ b/src/UnableToLoadPublicSuffixList.php @@ -44,4 +44,14 @@ public static function dueToCorruptedSection(): self { return new self('The public suffix list section data are corrupted.'); } + + public static function dueToUnavailableService(string $uri, Throwable $exception): self + { + return new self('Could not access the Public Suffix List URI: `'.$uri.'`.', 0, $exception); + } + + public static function dueToUnexpectedContent(string $uri, int $statusCode): self + { + return new self('Invalid response from Public Suffix List URI: `'.$uri.'`.', $statusCode); + } } diff --git a/src/UnableToLoadRootZoneDatabase.php b/src/UnableToLoadRootZoneDatabase.php index d9bd8cc7..d097682f 100644 --- a/src/UnableToLoadRootZoneDatabase.php +++ b/src/UnableToLoadRootZoneDatabase.php @@ -54,4 +54,14 @@ public static function dueToInvalidJson(int $code, string $message): self { return new self($message, $code); } + + public static function dueToUnavailableService(string $uri, Throwable $exception): self + { + return new self('Could not access the Root Zone Database URI: `'.$uri.'`.', 0, $exception); + } + + public static function dueToUnexpectedContent(string $uri, int $statusCode): self + { + return new self('Invalid response from Root Zone Database URI: `'.$uri.'`.', $statusCode); + } } diff --git a/tests/Storage/CurlHttpClientTest.php b/tests/Storage/CurlHttpClientTest.php deleted file mode 100644 index 2fb39d10..00000000 --- a/tests/Storage/CurlHttpClientTest.php +++ /dev/null @@ -1,56 +0,0 @@ -getContent('https://www.google.com'); - - self::assertStringContainsString('google', $content); - } - - /** - * @covers ::__construct - * @covers ::getContent - */ - public function testThrowsException(): void - { - self::expectException(CurlClientException::class); - (new CurlClient())->getContent('https://qsfsdfqdf.dfsf'); - } - - /** - * @covers ::__construct - */ - public function testConstructorThrowsException(): void - { - self::expectException(CurlClientException::class); - new CurlClient(['foo' => 'bar']); - } -} diff --git a/tests/Storage/Psr16FileCacheTest.php b/tests/Storage/Psr16FileCacheTest.php deleted file mode 100644 index dd0933fa..00000000 --- a/tests/Storage/Psr16FileCacheTest.php +++ /dev/null @@ -1,520 +0,0 @@ -root = vfsStream::setup('pdp'); - vfsStream::create(['cache' => []], $this->root); - $this->cacheDir = vfsStream::url('pdp/cache'); - $this->cache = new \Pdp\Storage\Cache\Psr16FileCache($this->cacheDir); - } - - public function tearDown(): void - { - unset($this->cache, $this->cacheDir, $this->root); - } - - public function testConstructorOnEmptyCachePath(): void - { - $cache = new Psr16FileCache(dirname(__DIR__).'/data'); - self::assertNull($cache->get('invalid_key')); - } - - public function testConstructorOnParentCachePathIsNotExisted(): void - { - $cache = new Psr16FileCache(vfsStream::url('pdp/cache_not_exist')); - self::assertNull($cache->get('invalid_key')); - } - - public function testSetOnNotWritableCachePath(): void - { - self::expectException(\InvalidArgumentException::class); - - new Psr16FileCache('/bin'); - } - - public function testSetOnNotExistingCachePath(): void - { - self::expectException(\InvalidArgumentException::class); - - new Psr16FileCache('/foo/bar'); - } - - /** - * @dataProvider storableValuesProvider - * - * @param mixed $expected the value to cache - */ - public function testSetGet($expected): void - { - $this->cache->set('foo', $expected); - - self::assertEquals($expected, $this->cache->get('foo')); - } - - public function storableValuesProvider(): iterable - { - return [ - 'string' => ['bar'], - 'boolean' => [false], - 'array' => [['foo', 'bar']], - 'class' => [date_create()], - 'null' => [null], - 'float' => [1.1], - ]; - } - - /** - * @depends testSetGet - */ - public function testDelete(): void - { - $this->cache->set('foo', 'bar'); - self::assertEquals('bar', $this->cache->get('foo')); - $this->cache->delete('foo'); - self::assertNull($this->cache->get('foo')); - } - - public function testGetInvalidArg(): void - { - self::expectException(\Pdp\Storage\Cache\Psr16CacheException::class); - - $this->cache->get(null); - } - - public function testInvalidKey(): void - { - self::expectException(Psr16CacheException::class); - - $this->cache->get('foo:bar', 'bar'); - } - - public function testSetInvalidTTL(): void - { - self::expectException(\Pdp\Storage\Cache\Psr16CacheException::class); - $this->cache->set('foo', 'bar', date_create()); - } - - /** - * @depends testDelete - */ - public function testGetNotFound(): void - { - self::assertNull($this->cache->get('notfound')); - } - - /** - * @depends testDelete - */ - public function testGetNotFoundDefault(): void - { - $expected = 'chickpeas'; - self::assertEquals($expected, $this->cache->get('notfound', $expected)); - } - - /** - * @depends testSetGet - * @slow - */ - public function testSetExpire(): void - { - $this->cache->set('foo', 'bar', 1); - self::assertEquals('bar', $this->cache->get('foo')); - - // Wait 3 seconds so the cache expires - sleep(3); - self::assertNull($this->cache->get('foo')); - } - - /** - * @depends testSetGet - * @slow - */ - public function testSetExpireDateInterval(): void - { - $this->cache->set('foo', 'bar', new DateInterval('PT1S')); - self::assertEquals('bar', $this->cache->get('foo')); - - // Wait 3 seconds so the cache expires - sleep(3); - self::assertNull($this->cache->get('foo')); - } - - public function testSetInvalidArg(): void - { - self::expectException(InvalidArgumentException::class); - $this->cache->set(null, 'bar'); - } - - public function testDeleteInvalidArg(): void - { - self::expectException(InvalidArgumentException::class); - $this->cache->delete(null); - } - - /** - * @depends testSetGet - */ - public function testClearCache(): void - { - $this->cache->set('foo', 'bar'); - $this->cache->clear(); - self::assertNull($this->cache->get('foo')); - } - - /** - * @depends testSetGet - */ - public function testHas(): void - { - $this->cache->set('foo', 'bar'); - self::assertTrue($this->cache->has('foo')); - } - - /** - * @depends testHas - */ - public function testHasNot(): void - { - self::assertFalse($this->cache->has('not-found')); - } - - public function testHasInvalidArg(): void - { - self::expectException(InvalidArgumentException::class); - $this->cache->has(null); - } - - /** - * @depends testSetGet - */ - public function testSetGetMultiple(): void - { - $values = [ - 'key1' => 'value1', - 'key2' => 'value2', - 'key3' => 'value3', - ]; - - $this->cache->setMultiple($values); - $result = $this->cache->getMultiple(array_keys($values)); - foreach ($result as $key => $value) { - self::assertTrue(isset($values[$key])); - self::assertEquals($values[$key], $value); - unset($values[$key]); - } - - // The list of values should now be empty - self::assertEquals([], $values); - } - - /** - * @depends testSetGet - */ - public function testSetGetMultipleGenerator(): void - { - $values = [ - 'key1' => 'value1', - 'key2' => 'value2', - 'key3' => 'value3', - ]; - - $gen = function () use ($values): Generator { - foreach ($values as $key => $value) { - yield $key => $value; - } - }; - - $this->cache->setMultiple($gen()); - - $result = $this->cache->getMultiple(array_keys($values)); - foreach ($result as $key => $value) { - self::assertTrue(isset($values[$key])); - self::assertEquals($values[$key], $value); - unset($values[$key]); - } - - // The list of values should now be empty - self::assertEquals([], $values); - } - - /** - * @depends testSetGet - */ - public function testSetGetMultipleGenerator2(): void - { - $values = [ - 'key1' => 'value1', - 'key2' => 'value2', - 'key3' => 'value3', - ]; - - $gen = function () use ($values): Generator { - foreach ($values as $key => $value) { - yield $key; - } - }; - - $this->cache->setMultiple($values); - $result = $this->cache->getMultiple($gen()); - foreach ($result as $key => $value) { - self::assertTrue(isset($values[$key])); - self::assertEquals($values[$key], $value); - unset($values[$key]); - } - - // The list of values should now be empty - self::assertEquals([], $values); - } - - /** - * @depends testSetGetMultiple - * @depends testSetExpire - * @slow - */ - public function testSetMultipleExpireDateIntervalNotExpired(): void - { - $values = [ - 'key1' => 'value1', - 'key2' => 'value2', - 'key3' => 'value3', - ]; - - $this->cache->setMultiple($values, new DateInterval('PT5S')); - $result = $this->cache->getMultiple(array_keys($values)); - $count = 0; - foreach ($result as $key => $value) { - ++$count; - self::assertTrue(isset($values[$key])); - self::assertEquals($values[$key], $value); - unset($values[$key]); - } - self::assertEquals(3, $count); - // The list of values should now be empty - self::assertEquals([], $values); - } - - /** - * @slow - */ - public function testSetMultipleExpireDateIntervalExpired(): void - { - $values = [ - 'key1' => 'value1', - 'key2' => 'value2', - 'key3' => 'value3', - ]; - - $this->cache->setMultiple($values, new \DateInterval('PT1S')); - - // Wait 2 seconds so the cache expires - sleep(2); - - $result = $this->cache->getMultiple(array_keys($values), 'not-found'); - $count = 0; - - $expected = [ - 'key1' => 'not-found', - 'key2' => 'not-found', - 'key3' => 'not-found', - ]; - - foreach ($result as $key => $value) { - ++$count; - self::assertTrue(isset($expected[$key])); - self::assertEquals($expected[$key], $value); - unset($expected[$key]); - } - self::assertEquals(3, $count); - - // The list of values should now be empty - self::assertEquals([], $expected); - } - - /** - * @slow - */ - public function testSetMultipleExpireDateIntervalInt(): void - { - $values = [ - 'key1' => 'value1', - 'key2' => 'value2', - 'key3' => 'value3', - ]; - - $this->cache->setMultiple($values, 1); - - // Wait 2 seconds so the cache expires - sleep(2); - - $result = $this->cache->getMultiple(array_keys($values), 'not-found'); - $count = 0; - - $expected = [ - 'key1' => 'not-found', - 'key2' => 'not-found', - 'key3' => 'not-found', - ]; - - foreach ($result as $key => $value) { - ++$count; - self::assertTrue(isset($expected[$key])); - self::assertEquals($expected[$key], $value); - unset($expected[$key]); - } - self::assertEquals(3, $count); - - // The list of values should now be empty - self::assertEquals([], $expected); - } - - public function testSetMultipleInvalidArg(): void - { - self::expectException(\Pdp\Storage\Cache\Psr16CacheException::class); - - $this->cache->setMultiple(null); - } - - public function testGetMultipleInvalidArg(): void - { - self::expectException(Psr16CacheException::class); - - $result = $this->cache->getMultiple(null); - // If $result was a generator, the generator will only error once the - // first value is requested. - // - // This extra line is just a precaution for that - if ($result instanceof Iterator) { - $result->current(); - } - } - - /** - * @depends testSetGetMultiple - */ - public function testDeleteMultipleDefaultGet(): void - { - $values = [ - 'key1' => 'value1', - 'key2' => 'value2', - 'key3' => 'value3', - ]; - - $this->cache->setMultiple($values); - - $this->cache->deleteMultiple(['key1', 'key3']); - - $result = $this->cache->getMultiple(array_keys($values), 'tea'); - - $expected = [ - 'key1' => 'tea', - 'key2' => 'value2', - 'key3' => 'tea', - ]; - - foreach ($result as $key => $value) { - self::assertTrue(isset($expected[$key])); - self::assertEquals($expected[$key], $value); - unset($expected[$key]); - } - - // The list of values should now be empty - self::assertEquals([], $expected); - } - - /** - * @depends testSetGetMultiple - */ - public function testDeleteMultipleGenerator(): void - { - $values = [ - 'key1' => 'value1', - 'key2' => 'value2', - 'key3' => 'value3', - ]; - - $this->cache->setMultiple($values); - - $gen = function (): Generator { - yield 'key1'; - yield 'key3'; - }; - - $this->cache->deleteMultiple($gen()); - - $result = $this->cache->getMultiple(array_keys($values), 'tea'); - - $expected = [ - 'key1' => 'tea', - 'key2' => 'value2', - 'key3' => 'tea', - ]; - - foreach ($result as $key => $value) { - self::assertTrue(isset($expected[$key])); - self::assertEquals($expected[$key], $value); - unset($expected[$key]); - } - - // The list of values should now be empty - self::assertEquals([], $expected); - } - - public function testDeleteMultipleInvalidArg(): void - { - self::expectException(Psr16CacheException::class); - - $this->cache->deleteMultiple(null); - } -} From f05d68e3f10a401c96abc101051080746fab645f Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 17 Aug 2020 08:13:52 +0200 Subject: [PATCH 227/461] Preparing for using Stringable in PHP8 --- .editorconfig | 3 ++ .php_cs | 1 + bin/update-pdp | 88 +++++++++++++++++++++---------- phpstan.tests.neon | 18 ------- phpunit.xml.dist | 58 ++++++++++---------- src/DomainNameParser.php | 22 +++++--- src/PublicSuffixListConverter.php | 16 +++++- src/ResolvedDomain.php | 6 +-- src/RootZoneDatabaseConverter.php | 21 ++++++-- src/Rules.php | 4 +- src/TopLevelDomains.php | 14 +++-- 11 files changed, 155 insertions(+), 96 deletions(-) diff --git a/.editorconfig b/.editorconfig index e6508c1c..c656199e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -13,3 +13,6 @@ trim_trailing_whitespace = false [*.neon] indent_size = 2 + +[*.xml.dist] +indent_size = 2 diff --git a/.php_cs b/.php_cs index b864d1c6..ffe6bed0 100644 --- a/.php_cs +++ b/.php_cs @@ -14,6 +14,7 @@ EOF; $finder = PhpCsFixer\Finder::create() ->in(__DIR__.'/src') ->in(__DIR__.'/tests') + ->in(__DIR__.'/bin') ; return PhpCsFixer\Config::create() diff --git a/bin/update-pdp b/bin/update-pdp index d7ce77a2..4d0e133c 100755 --- a/bin/update-pdp +++ b/bin/update-pdp @@ -14,17 +14,22 @@ declare(strict_types=1); +use GuzzleHttp\Client; +use GuzzleHttp\Psr7\Request; use Pdp\PublicSuffixListConverter; use Pdp\RootZoneDatabaseConverter; -use Pdp\Storage\Http\PublicSuffixListClient; -use Pdp\Storage\Http\RootZoneDatabaseClient; -use Pdp\Storage\Logger; -use Pdp\Storage\Cache\Psr16FileCache; -use Pdp\Storage\Cache\PublicSuffixListCachePsr16Adapter; -use Pdp\Storage\Cache\RootZoneDatabaseCachePsr16Adapter; -use Pdp\Storage\Http\CurlClient; -use Pdp\Storage\Http\PublicSuffixListCurlClient; -use Pdp\Storage\Http\RootZoneDatabaseCurlClient; +use Pdp\Storage\PublicSuffixListClient; +use Pdp\Storage\RootZoneDatabaseClient; +use Pdp\Storage\PublicSuffixListCachePsr16Adapter; +use Pdp\Storage\RootZoneDatabaseCachePsr16Adapter; +use Pdp\Storage\PublicSuffixListClientPsr18Adapter; +use Pdp\Storage\RootZoneDatabaseClientPsr18Adapter; +use Psr\Http\Message\RequestFactoryInterface; +use Psr\Http\Message\RequestInterface; +use Psr\Log\AbstractLogger; +use Psr\Log\LogLevel; +use Symfony\Component\Cache\Adapter\FilesystemAdapter; +use Symfony\Component\Cache\Psr16Cache; const KEY_CACHE_DIR = 'cache-dir'; @@ -64,6 +69,37 @@ require $vendor.'/autoload.php'; $default_cache_dir = dirname(__DIR__).'/data'; +$requestFactory = new class implements RequestFactoryInterface { + public function createRequest(string $method, $uri): RequestInterface + { + return new Request($method, $uri); + } +}; + +$logger = new class extends AbstractLogger { + public function log($level, $message, array $context = []) + { + static $errorLevels = [ + LogLevel::EMERGENCY => 1, + LogLevel::ALERT => 1, + LogLevel::CRITICAL => 1, + LogLevel::ERROR => 1, + LogLevel::WARNING => 1, + LogLevel::NOTICE => 1, + ]; + + $replace = []; + foreach ($context as $key => $val) { + $replace['{'.$key.'}'] = $val; + } + + fwrite( + isset($errorLevels[$level]) ? STDERR : STDOUT, + strtr($message, $replace).PHP_EOL + ); + } +}; + /** * CLI colors */ @@ -107,31 +143,19 @@ HELP; die(0); } -if (!extension_loaded('curl')) { - fail("$redbg The required PHP cURL extension is missing. $reset"); - - die(1); -} - $context = filter_var_array($arguments + [KEY_CACHE_DIR => $default_cache_dir], [ KEY_CACHE_DIR => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW], ]); $ttl = new DateInterval('P1D'); -$logger = new Logger( STDOUT, STDERR); -$curlClient = new CurlClient(); - +$psrHttpClient = new Client(); try { - $cache = new Psr16FileCache($context[KEY_CACHE_DIR]); - $pslClient = new PublicSuffixListCurlClient($curlClient, new PublicSuffixListConverter()); - $pslCache = new PublicSuffixListCachePsr16Adapter($cache, $ttl, $logger); - - $rzdClient = new RootZoneDatabaseCurlClient($curlClient, new RootZoneDatabaseConverter()); - $rzdCache = new RootZoneDatabaseCachePsr16Adapter($cache, $ttl, $logger); + $filesystemCache = new FilesystemAdapter('', 3600, $context[KEY_CACHE_DIR]); + $cache = new Psr16Cache($filesystemCache); } catch (Throwable $exception) { if (null !== $logger) { - $logger->error('Local cache update initialisation failed with {exception}', ['exception' => $exception->getMessage()]); + $logger->error('Local cache initialisation failed with {exception}', ['exception' => $exception->getMessage()]); } fail("$redbg The script failed on initialisation.$reset"); @@ -142,8 +166,11 @@ success("$yellow Starting updating your local cache.$reset"); $error = 0; try { - $publicSuffixList = $pslClient->getByUri(PublicSuffixListClient::PSL_URL); - if (!$pslCache->storeByUri(PublicSuffixListClient::PSL_URL, $publicSuffixList)) { + $client = new PublicSuffixListClientPsr18Adapter($psrHttpClient, $requestFactory, new PublicSuffixListConverter()); + $storage = new PublicSuffixListCachePsr16Adapter($cache, $ttl, $logger); + + $publicSuffixList = $client->getByUri(PublicSuffixListClient::PSL_URL); + if (!$storage->storeByUri(PublicSuffixListClient::PSL_URL, $publicSuffixList)) { throw new RuntimeException('Could not save the Public Suffix List to the `'.$context[KEY_CACHE_DIR].'` cache.'); } } catch (Throwable $exception) { @@ -153,8 +180,11 @@ try { } try { - $rootZoneDatabase = $rzdClient->getByUri(RootZoneDatabaseClient::RZD_URL); - if (!$rzdCache->storeByUri(RootZoneDatabaseClient::RZD_URL, $rootZoneDatabase)) { + $client = new RootZoneDatabaseClientPsr18Adapter($psrHttpClient, $requestFactory, new RootZoneDatabaseConverter()); + $storage = new RootZoneDatabaseCachePsr16Adapter($cache, $ttl, $logger); + + $rootZoneDatabase = $client->getByUri(RootZoneDatabaseClient::RZD_URL); + if (!$storage->storeByUri(RootZoneDatabaseClient::RZD_URL, $rootZoneDatabase)) { throw new RuntimeException('Could not save the Root Zone Database to the `'.$context[KEY_CACHE_DIR].'` cache.'); } } catch (Throwable $exception) { diff --git a/phpstan.tests.neon b/phpstan.tests.neon index 366b7e00..98746216 100644 --- a/phpstan.tests.neon +++ b/phpstan.tests.neon @@ -5,21 +5,3 @@ includes: parameters: checkMissingIterableValueType: false ignoreErrors: - - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Cache\\Psr16FileCache::set\(\) expects string, null given.#' - path: tests/Storage/Psr16FileCacheTest.php - - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Cache\\Psr16FileCache::delete\(\) expects string, null given.#' - path: tests/Storage/Psr16FileCacheTest.php - - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Cache\\Psr16FileCache::get\(\) expects string, null given.#' - path: tests/Storage/Psr16FileCacheTest.php - - message: '#Parameter \#3 \$ttl of method Pdp\\Storage\\Cache\\Psr16FileCache::set\(\) expects DateInterval\|int\|null, DateTime\|false given.#' - path: tests/Storage/Psr16FileCacheTest.php - - message: '#Parameter \#1 \$keys of method Pdp\\Storage\\Cache\\Psr16FileCache::deleteMultiple\(\) expects iterable, null given.#' - path: tests/Storage/Psr16FileCacheTest.php - - message: '#Parameter \#1 \$keys of method Pdp\\Storage\\Cache\\Psr16FileCache::getMultiple\(\) expects iterable, null given.#' - path: tests/Storage/Psr16FileCacheTest.php - - message: '#Parameter \#1 \$values of method Pdp\\Storage\\Cache\\Psr16FileCache::setMultiple\(\) expects iterable, null given.#' - path: tests/Storage/Psr16FileCacheTest.php - - message: '#Parameter \#1 \$key of method Pdp\\Storage\\Cache\\Psr16FileCache::has\(\) expects string, null given.#' - path: tests/Storage/Psr16FileCacheTest.php - - message: '#Parameter \#1 \$exception of method PHPUnit\\Framework\\TestCase::expectException\(\) expects class-string\, string given.#' - path: tests/Storage/Psr16FileCacheTest.php diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 61f72782..a8d153f0 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,33 +1,33 @@ - - - + + - - tests - + + tests + - - - - src - - - - - - - - - - + + src + + + + + + + + + + diff --git a/src/DomainNameParser.php b/src/DomainNameParser.php index d3a1922d..f667226b 100644 --- a/src/DomainNameParser.php +++ b/src/DomainNameParser.php @@ -24,7 +24,6 @@ use function idn_to_ascii; use function idn_to_utf8; use function implode; -use function is_string; use function method_exists; use function preg_match; use function rawurldecode; @@ -136,6 +135,10 @@ final protected function idnToAscii(string $domain, int $option = IDNA_DEFAULT): */ final protected function idnToUnicode(string $domain, int $option = IDNA_DEFAULT): string { + if (false === strpos($domain, 'xn--')) { + return $domain; + } + $output = idn_to_utf8($domain, $option, INTL_IDNA_VARIANT_UTS46, $info); if ([] === $info) { throw InvalidHost::dueToIDNAError($domain); @@ -159,13 +162,14 @@ final protected function idnToUnicode(string $domain, int $option = IDNA_DEFAULT * Returns an array containing the formatted domain name labels * and the domain transitional information. * - * For example: parse('wWw.uLb.Ac.be') should return - * ['labels' => ['be', 'ac', 'ulb', 'www'], 'isTransitionalDifferant' => false];. + * For example: parse('wWw.uLb.Ac.be') should return ['be', 'ac', 'ulb', 'www'];. * * @param mixed $domain a domain * * @throws InvalidHost If the domain is not a host * @throws InvalidDomainName If the host is not a domain + * + * @return array */ final protected function parse($domain = null, int $asciiOption = 0, int $unicodeOption = 0): array { @@ -177,15 +181,19 @@ final protected function parse($domain = null, int $asciiOption = 0, int $unicod return []; } - if ('' === $domain) { - return ['']; + if (is_object($domain) && method_exists($domain, '__toString')) { + $domain = (string) $domain; } - if (!is_string($domain) && !method_exists($domain, '__toString')) { - throw new TypeError(sprintf('The domain must be a scalar, a stringable object, a DomainInterface object or null; `%s` given', gettype($domain))); + if (!is_scalar($domain)) { + throw new TypeError(sprintf('The domain must be a string, a stringable object, a Host object or NULL; `%s` given', gettype($domain))); } $domain = (string) $domain; + if ('' === $domain) { + return ['']; + } + $res = filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); if (false !== $res) { throw InvalidDomainName::dueToUnsupportedType($domain); diff --git a/src/PublicSuffixListConverter.php b/src/PublicSuffixListConverter.php index 19fdd5e7..866126e2 100644 --- a/src/PublicSuffixListConverter.php +++ b/src/PublicSuffixListConverter.php @@ -16,8 +16,12 @@ namespace Pdp; use SplTempFileObject; +use TypeError; use function array_pop; use function explode; +use function gettype; +use function is_object; +use function method_exists; use function preg_match; use function strpos; use function substr; @@ -39,9 +43,19 @@ final class PublicSuffixListConverter extends DomainNameParser /** * Convert the Public Suffix List into an associative, multidimensional array. + * + * @param object|string $content The object should expose the __toString method */ - public function convert(string $content): array + public function convert($content): array { + if (is_object($content) && method_exists($content, '__toString')) { + $content = (string) $content; + } + + if (!is_string($content)) { + throw new TypeError('The content to be converted should be a string or a Stringable object, `'.gettype($content).'` given.'); + } + $rules = ['ICANN_DOMAINS' => [], 'PRIVATE_DOMAINS' => []]; $section = ''; $file = new SplTempFileObject(); diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index aaf448e7..0cb902d7 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -52,11 +52,11 @@ public static function __set_state(array $properties): self private function setDomainName(Host $domain): DomainName { - if ($domain instanceof DomainName) { - return $domain; + if (!$domain instanceof DomainName) { + return new Domain($domain, $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()); } - return new Domain($domain, $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()); + return $domain; } /** diff --git a/src/RootZoneDatabaseConverter.php b/src/RootZoneDatabaseConverter.php index 60799eba..29238c70 100644 --- a/src/RootZoneDatabaseConverter.php +++ b/src/RootZoneDatabaseConverter.php @@ -16,11 +16,16 @@ namespace Pdp; use DateTimeImmutable; +use DateTimeInterface; use SplTempFileObject; +use TypeError; +use function gettype; +use function is_object; +use function is_string; +use function method_exists; use function preg_match; use function strpos; use function trim; -use const DATE_ATOM; final class RootZoneDatabaseConverter { @@ -29,10 +34,20 @@ final class RootZoneDatabaseConverter /** * Converts the IANA Root Zone Database into a TopLevelDomains associative array. * + * @param object|string $content The object should expose the __toString method + * * @throws UnableToLoadRootZoneDatabase if the content is invalid or can not be correctly parsed and converted */ - public function convert(string $content): array + public function convert($content): array { + if (is_object($content) && method_exists($content, '__toString')) { + $content = (string) $content; + } + + if (!is_string($content)) { + throw new TypeError('The content to be converted should be a string or a Stringable object, `'.gettype($content).'` given.'); + } + $data = []; $file = new SplTempFileObject(); $file->fwrite($content); @@ -77,7 +92,7 @@ private function extractHeader(string $content): array return [ 'version' => $matches['version'], - 'modifiedDate' => $date->format(DATE_ATOM), + 'modifiedDate' => $date->format(DateTimeInterface::ATOM), ]; } diff --git a/src/Rules.php b/src/Rules.php index 0d37ef3b..4e322490 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -79,9 +79,11 @@ public static function fromPath( /** * Returns a new instance from a string. + * + * @param object|string $content a string or an object which exposes the __toString method */ public static function fromString( - string $content, + $content, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT ): self { diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index aa8b17ae..c43c5615 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -26,7 +26,6 @@ use function json_last_error_msg; use function stream_get_contents; use function substr; -use const DATE_ATOM; use const IDNA_DEFAULT; use const JSON_ERROR_NONE; @@ -90,8 +89,13 @@ public static function fromPath( return self::fromString($content, $asciiIDNAOption, $unicodeIDNAOption); } + /** + * Returns a new instance from a string. + * + * @param object|string $content a string or an object which exposes the __toString method + */ public static function fromString( - string $content, + $content, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT ): self { @@ -101,7 +105,7 @@ public static function fromString( $data = $converter->convert($content); /** @var DateTimeImmutable $modifiedDate */ - $modifiedDate = DateTimeImmutable::createFromFormat(DATE_ATOM, $data['modifiedDate']); + $modifiedDate = DateTimeImmutable::createFromFormat(DateTimeInterface::ATOM, $data['modifiedDate']); return new self( $data['records'], @@ -128,7 +132,7 @@ public static function fromJsonString( } /** @var DateTimeImmutable $modifiedDate */ - $modifiedDate = DateTimeImmutable::createFromFormat(DATE_ATOM, $data['modifiedDate']); + $modifiedDate = DateTimeImmutable::createFromFormat(DateTimeInterface::ATOM, $data['modifiedDate']); return new self($data['records'], $data['version'], $modifiedDate, $asciiIDNAOption, $unicodeIDNAOption); } @@ -186,7 +190,7 @@ public function jsonSerialize(): array return [ 'version' => $this->version, 'records' => $this->records, - 'modifiedDate' => $this->modifiedDate->format(DATE_ATOM), + 'modifiedDate' => $this->modifiedDate->format(DateTimeInterface::ATOM), ]; } From 44a114c78456bcc5a51eac7cfd9b75600c3e3720 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 17 Aug 2020 10:02:10 +0200 Subject: [PATCH 228/461] Improve Storage codebase --- bin/update-pdp | 20 ++++----- phpunit.xml.dist | 10 ++--- ...{JsonPsr16Cache.php => Psr16JsonCache.php} | 37 +++++++++------ src/Storage/PublicSuffixListCache.php | 2 +- .../PublicSuffixListCachePsr16Adapter.php | 21 ++------- src/Storage/PublicSuffixListClient.php | 29 ------------ src/Storage/PublicSuffixListLocalStorage.php | 45 +++++++++++++++++++ ....php => PublicSuffixListRemoteStorage.php} | 2 +- src/Storage/PublicSuffixListStorage.php | 30 +++---------- src/Storage/RootZoneDatabaseCache.php | 2 +- .../RootZoneDatabaseCachePsr16Adapter.php | 21 ++------- src/Storage/RootZoneDatabaseClient.php | 31 ------------- src/Storage/RootZoneDatabaseLocalStorage.php | 45 +++++++++++++++++++ ....php => RootZoneDatabaseRemoteStorage.php} | 2 +- src/Storage/RootZoneDatabaseStorage.php | 34 +++++--------- 15 files changed, 158 insertions(+), 173 deletions(-) rename src/Storage/{JsonPsr16Cache.php => Psr16JsonCache.php} (69%) delete mode 100644 src/Storage/PublicSuffixListClient.php create mode 100644 src/Storage/PublicSuffixListLocalStorage.php rename src/Storage/{PublicSuffixListClientPsr18Adapter.php => PublicSuffixListRemoteStorage.php} (95%) delete mode 100644 src/Storage/RootZoneDatabaseClient.php create mode 100644 src/Storage/RootZoneDatabaseLocalStorage.php rename src/Storage/{RootZoneDatabaseClientPsr18Adapter.php => RootZoneDatabaseRemoteStorage.php} (95%) diff --git a/bin/update-pdp b/bin/update-pdp index 4d0e133c..a18edb85 100755 --- a/bin/update-pdp +++ b/bin/update-pdp @@ -18,12 +18,12 @@ use GuzzleHttp\Client; use GuzzleHttp\Psr7\Request; use Pdp\PublicSuffixListConverter; use Pdp\RootZoneDatabaseConverter; -use Pdp\Storage\PublicSuffixListClient; -use Pdp\Storage\RootZoneDatabaseClient; use Pdp\Storage\PublicSuffixListCachePsr16Adapter; +use Pdp\Storage\PublicSuffixListRemoteStorage; +use Pdp\Storage\PublicSuffixListStorage; use Pdp\Storage\RootZoneDatabaseCachePsr16Adapter; -use Pdp\Storage\PublicSuffixListClientPsr18Adapter; -use Pdp\Storage\RootZoneDatabaseClientPsr18Adapter; +use Pdp\Storage\RootZoneDatabaseRemoteStorage; +use Pdp\Storage\RootZoneDatabaseStorage; use Psr\Http\Message\RequestFactoryInterface; use Psr\Http\Message\RequestInterface; use Psr\Log\AbstractLogger; @@ -166,11 +166,11 @@ success("$yellow Starting updating your local cache.$reset"); $error = 0; try { - $client = new PublicSuffixListClientPsr18Adapter($psrHttpClient, $requestFactory, new PublicSuffixListConverter()); + $client = new PublicSuffixListRemoteStorage($psrHttpClient, $requestFactory, new PublicSuffixListConverter()); $storage = new PublicSuffixListCachePsr16Adapter($cache, $ttl, $logger); - $publicSuffixList = $client->getByUri(PublicSuffixListClient::PSL_URL); - if (!$storage->storeByUri(PublicSuffixListClient::PSL_URL, $publicSuffixList)) { + $publicSuffixList = $client->getByUri(PublicSuffixListStorage::PSL_URL); + if (!$storage->storeByUri(PublicSuffixListStorage::PSL_URL, $publicSuffixList)) { throw new RuntimeException('Could not save the Public Suffix List to the `'.$context[KEY_CACHE_DIR].'` cache.'); } } catch (Throwable $exception) { @@ -180,11 +180,11 @@ try { } try { - $client = new RootZoneDatabaseClientPsr18Adapter($psrHttpClient, $requestFactory, new RootZoneDatabaseConverter()); + $client = new RootZoneDatabaseRemoteStorage($psrHttpClient, $requestFactory, new RootZoneDatabaseConverter()); $storage = new RootZoneDatabaseCachePsr16Adapter($cache, $ttl, $logger); - $rootZoneDatabase = $client->getByUri(RootZoneDatabaseClient::RZD_URL); - if (!$storage->storeByUri(RootZoneDatabaseClient::RZD_URL, $rootZoneDatabase)) { + $rootZoneDatabase = $client->getByUri(RootZoneDatabaseStorage::RZD_URL); + if (!$storage->storeByUri(RootZoneDatabaseStorage::RZD_URL, $rootZoneDatabase)) { throw new RuntimeException('Could not save the Root Zone Database to the `'.$context[KEY_CACHE_DIR].'` cache.'); } } catch (Throwable $exception) { diff --git a/phpunit.xml.dist b/phpunit.xml.dist index a8d153f0..e5b65193 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -13,11 +13,6 @@ processIsolation="false" stopOnFailure="false"> - - - tests - - src @@ -27,6 +22,11 @@ + + + tests + + diff --git a/src/Storage/JsonPsr16Cache.php b/src/Storage/Psr16JsonCache.php similarity index 69% rename from src/Storage/JsonPsr16Cache.php rename to src/Storage/Psr16JsonCache.php index b34d7468..13b02cc9 100644 --- a/src/Storage/JsonPsr16Cache.php +++ b/src/Storage/Psr16JsonCache.php @@ -21,6 +21,7 @@ use InvalidArgumentException; use JsonSerializable; use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; use Psr\SimpleCache\CacheInterface; use Throwable; use TypeError; @@ -35,7 +36,7 @@ use function strtolower; use const FILTER_VALIDATE_INT; -abstract class JsonPsr16Cache +abstract class Psr16JsonCache { protected const CACHE_PREFIX = 'pdp_'; @@ -45,6 +46,16 @@ abstract class JsonPsr16Cache protected ?DateInterval $ttl; + /** + * @param mixed $ttl the time to live for the given cache + */ + public function __construct(CacheInterface $cache, $ttl = null, LoggerInterface $logger = null) + { + $this->cache = $cache; + $this->ttl = $this->setTtl($ttl); + $this->logger = $logger ?? new NullLogger(); + } + /** * Set the cache TTL. * @@ -68,7 +79,7 @@ final protected function setTtl($ttl): ?DateInterval if (!is_string($ttl)) { throw new TypeError(sprintf( - 'The ttl must null, an integer, a string a DateTimeInterface or a DateInterval object %s given', + 'The ttl must null, an integer, a string a DateTimeInterface or a DateInterval object %s given.', is_object($ttl) ? get_class($ttl) : gettype($ttl) )); } @@ -77,7 +88,7 @@ final protected function setTtl($ttl): ?DateInterval $date = @DateInterval::createFromDateString($ttl); if (!$date instanceof DateInterval) { throw new InvalidArgumentException(sprintf( - 'The ttl value "%s" can not be parsable by `DateInterval::createFromDateString`', + 'The ttl value "%s" can not be parsable by `DateInterval::createFromDateString`.', $ttl )); } @@ -85,22 +96,22 @@ final protected function setTtl($ttl): ?DateInterval return $date; } - final protected function storeJson(string $uri, JsonSerializable $object): bool + final protected function store(string $uri, JsonSerializable $object): bool { try { - $result = $this->cache->set($this->getCacheKey($uri), json_encode($object), $this->ttl); + $result = $this->cache->set($this->cacheKey($uri), json_encode($object), $this->ttl); } catch (Throwable $exception) { $this->logger->info( - 'The following URI: `'.$uri.'` could not be cached :'.$exception->getMessage(), + 'The content associated with URI: `'.$uri.'` could not be cached :'.$exception->getMessage(), ['exception' => $exception] ); return false; } - $message = 'The following URI: `'.$uri.'` was stored.'; + $message = 'The content associated with URI: `'.$uri.'` was stored.'; if (!$result) { - $message = 'The following URI: `'.$uri.'` could not be stored.'; + $message = 'The content associated with URI: `'.$uri.'` could not be stored.'; } $this->logger->info($message); @@ -111,19 +122,19 @@ final protected function storeJson(string $uri, JsonSerializable $object): bool /** * Returns the cache key according to the source URL. */ - final protected function getCacheKey(string $str): string + private function cacheKey(string $str): string { return self::CACHE_PREFIX.md5(strtolower($str)); } - final protected function fetchJson(string $uri): ?string + final protected function fetch(string $uri): ?string { - return $this->cache->get($this->getCacheKey($uri)); + return $this->cache->get($this->cacheKey($uri)); } - final protected function forgetJson(string $uri, Throwable $exception = null): bool + final protected function forget(string $uri, Throwable $exception = null): bool { - $result = $this->cache->delete($this->getCacheKey($uri)); + $result = $this->cache->delete($this->cacheKey($uri)); if (null !== $exception) { $this->logger->warning($exception->getMessage()); } diff --git a/src/Storage/PublicSuffixListCache.php b/src/Storage/PublicSuffixListCache.php index d6b574dd..366463d2 100644 --- a/src/Storage/PublicSuffixListCache.php +++ b/src/Storage/PublicSuffixListCache.php @@ -29,7 +29,7 @@ public function fetchByUri(string $uri): ?PublicSuffixList; * * If a local cache already exists, it will be overwritten. * - * Returns true if the refresh was successful, false otherwise + * Returns true if the action was successful, false otherwise */ public function storeByUri(string $uri, PublicSuffixList $publicSuffixList): bool; } diff --git a/src/Storage/PublicSuffixListCachePsr16Adapter.php b/src/Storage/PublicSuffixListCachePsr16Adapter.php index ae0326cf..af85fcd9 100644 --- a/src/Storage/PublicSuffixListCachePsr16Adapter.php +++ b/src/Storage/PublicSuffixListCachePsr16Adapter.php @@ -17,26 +17,13 @@ use Pdp\PublicSuffixList; use Pdp\Rules; -use Psr\Log\LoggerInterface; -use Psr\Log\NullLogger; -use Psr\SimpleCache\CacheInterface; use Throwable; -final class PublicSuffixListCachePsr16Adapter extends JsonPsr16Cache implements PublicSuffixListCache +final class PublicSuffixListCachePsr16Adapter extends Psr16JsonCache implements PublicSuffixListCache { - /** - * @param mixed $ttl the time to live for the given cache - */ - public function __construct(CacheInterface $cache, $ttl = null, LoggerInterface $logger = null) - { - $this->cache = $cache; - $this->ttl = $this->setTtl($ttl); - $this->logger = $logger ?? new NullLogger(); - } - public function fetchByUri(string $uri): ?Rules { - $cacheData = $this->fetchJson($uri); + $cacheData = $this->fetch($uri); if (null === $cacheData) { return null; } @@ -44,7 +31,7 @@ public function fetchByUri(string $uri): ?Rules try { $rules = Rules::fromJsonString($cacheData); } catch (Throwable $exception) { - $this->forgetJson($uri, $exception); + $this->forget($uri, $exception); return null; } @@ -54,6 +41,6 @@ public function fetchByUri(string $uri): ?Rules public function storeByUri(string $uri, PublicSuffixList $publicSuffixList): bool { - return $this->storeJson($uri, $publicSuffixList); + return $this->store($uri, $publicSuffixList); } } diff --git a/src/Storage/PublicSuffixListClient.php b/src/Storage/PublicSuffixListClient.php deleted file mode 100644 index 88094fa2..00000000 --- a/src/Storage/PublicSuffixListClient.php +++ /dev/null @@ -1,29 +0,0 @@ -client = $client; + $this->cache = $cache; + } + + public function getByUri(string $uri): PublicSuffixList + { + $publicSuffixList = $this->cache->fetchByUri($uri); + if (null !== $publicSuffixList) { + return $publicSuffixList; + } + + $publicSuffixList = $this->client->getByUri($uri); + + $this->cache->storeByUri($uri, $publicSuffixList); + + return $publicSuffixList; + } +} diff --git a/src/Storage/PublicSuffixListClientPsr18Adapter.php b/src/Storage/PublicSuffixListRemoteStorage.php similarity index 95% rename from src/Storage/PublicSuffixListClientPsr18Adapter.php rename to src/Storage/PublicSuffixListRemoteStorage.php index 1f04ecb2..2f1c4dd4 100644 --- a/src/Storage/PublicSuffixListClientPsr18Adapter.php +++ b/src/Storage/PublicSuffixListRemoteStorage.php @@ -24,7 +24,7 @@ use Psr\Http\Message\RequestFactoryInterface; use function json_encode; -final class PublicSuffixListClientPsr18Adapter implements PublicSuffixListClient +final class PublicSuffixListRemoteStorage implements PublicSuffixListStorage { private ClientInterface $client; diff --git a/src/Storage/PublicSuffixListStorage.php b/src/Storage/PublicSuffixListStorage.php index dfa4cc7b..7322ec4e 100644 --- a/src/Storage/PublicSuffixListStorage.php +++ b/src/Storage/PublicSuffixListStorage.php @@ -16,30 +16,14 @@ namespace Pdp\Storage; use Pdp\PublicSuffixList; +use Pdp\UnableToLoadPublicSuffixList; -final class PublicSuffixListStorage implements PublicSuffixListClient +interface PublicSuffixListStorage { - private PublicSuffixListClient $client; + public const PSL_URL = 'https://publicsuffix.org/list/public_suffix_list.dat'; - private PublicSuffixListCache $cache; - - public function __construct(PublicSuffixListClient $client, PublicSuffixListCache $cache) - { - $this->client = $client; - $this->cache = $cache; - } - - public function getByUri(string $uri): PublicSuffixList - { - $publicSuffixList = $this->cache->fetchByUri($uri); - if (null !== $publicSuffixList) { - return $publicSuffixList; - } - - $publicSuffixList = $this->client->getByUri($uri); - - $this->cache->storeByUri($uri, $publicSuffixList); - - return $publicSuffixList; - } + /** + * @throws UnableToLoadPublicSuffixList + */ + public function getByUri(string $uri): PublicSuffixList; } diff --git a/src/Storage/RootZoneDatabaseCache.php b/src/Storage/RootZoneDatabaseCache.php index 04e68bf2..2c448002 100644 --- a/src/Storage/RootZoneDatabaseCache.php +++ b/src/Storage/RootZoneDatabaseCache.php @@ -29,7 +29,7 @@ public function fetchByUri(string $uri): ?RootZoneDatabase; * * If a local cache already exists, it will be overwritten. * - * Returns true if the refresh was successful, false otherwise + * Returns true if the action was successful, false otherwise */ public function storeByUri(string $uri, RootZoneDatabase $topLevelDomains): bool; } diff --git a/src/Storage/RootZoneDatabaseCachePsr16Adapter.php b/src/Storage/RootZoneDatabaseCachePsr16Adapter.php index 861d0cbe..13a59e4b 100644 --- a/src/Storage/RootZoneDatabaseCachePsr16Adapter.php +++ b/src/Storage/RootZoneDatabaseCachePsr16Adapter.php @@ -17,26 +17,13 @@ use Pdp\RootZoneDatabase; use Pdp\TopLevelDomains; -use Psr\Log\LoggerInterface; -use Psr\Log\NullLogger; -use Psr\SimpleCache\CacheInterface; use Throwable; -final class RootZoneDatabaseCachePsr16Adapter extends JsonPsr16Cache implements RootZoneDatabaseCache +final class RootZoneDatabaseCachePsr16Adapter extends Psr16JsonCache implements RootZoneDatabaseCache { - /** - * @param mixed $ttl the time to live for the given cache - */ - public function __construct(CacheInterface $cache, $ttl = null, LoggerInterface $logger = null) - { - $this->cache = $cache; - $this->ttl = $this->setTtl($ttl); - $this->logger = $logger ?? new NullLogger(); - } - public function fetchByUri(string $uri): ?RootZoneDatabase { - $cacheData = $this->fetchJson($uri); + $cacheData = $this->fetch($uri); if (null === $cacheData) { return null; } @@ -44,7 +31,7 @@ public function fetchByUri(string $uri): ?RootZoneDatabase try { $topLevelDomains = TopLevelDomains::fromJsonString($cacheData); } catch (Throwable $exception) { - $this->forgetJson($uri, $exception); + $this->forget($uri, $exception); return null; } @@ -54,6 +41,6 @@ public function fetchByUri(string $uri): ?RootZoneDatabase public function storeByUri(string $uri, RootZoneDatabase $topLevelDomains): bool { - return $this->storeJson($uri, $topLevelDomains); + return $this->store($uri, $topLevelDomains); } } diff --git a/src/Storage/RootZoneDatabaseClient.php b/src/Storage/RootZoneDatabaseClient.php deleted file mode 100644 index 47c2a149..00000000 --- a/src/Storage/RootZoneDatabaseClient.php +++ /dev/null @@ -1,31 +0,0 @@ -client = $client; + $this->cache = $cache; + } + + public function getByUri(string $uri): RootZoneDatabase + { + $rootZoneDatabase = $this->cache->fetchByUri($uri); + if (null !== $rootZoneDatabase) { + return $rootZoneDatabase; + } + + $rootZoneDatabase = $this->client->getByUri($uri); + + $this->cache->storeByUri($uri, $rootZoneDatabase); + + return $rootZoneDatabase; + } +} diff --git a/src/Storage/RootZoneDatabaseClientPsr18Adapter.php b/src/Storage/RootZoneDatabaseRemoteStorage.php similarity index 95% rename from src/Storage/RootZoneDatabaseClientPsr18Adapter.php rename to src/Storage/RootZoneDatabaseRemoteStorage.php index 4f14eb36..bbad5991 100644 --- a/src/Storage/RootZoneDatabaseClientPsr18Adapter.php +++ b/src/Storage/RootZoneDatabaseRemoteStorage.php @@ -24,7 +24,7 @@ use Psr\Http\Message\RequestFactoryInterface; use function json_encode; -final class RootZoneDatabaseClientPsr18Adapter implements RootZoneDatabaseClient +final class RootZoneDatabaseRemoteStorage implements RootZoneDatabaseStorage { private ClientInterface $client; diff --git a/src/Storage/RootZoneDatabaseStorage.php b/src/Storage/RootZoneDatabaseStorage.php index 4d2245c1..1b03b508 100644 --- a/src/Storage/RootZoneDatabaseStorage.php +++ b/src/Storage/RootZoneDatabaseStorage.php @@ -16,30 +16,16 @@ namespace Pdp\Storage; use Pdp\RootZoneDatabase; +use Pdp\UnableToLoadRootZoneDatabase; -final class RootZoneDatabaseStorage implements RootZoneDatabaseClient +interface RootZoneDatabaseStorage { - private RootZoneDatabaseClient $client; - - private RootZoneDatabaseCache $cache; - - public function __construct(RootZoneDatabaseClient $client, RootZoneDatabaseCache $cache) - { - $this->client = $client; - $this->cache = $cache; - } - - public function getByUri(string $uri): RootZoneDatabase - { - $rootZoneDatabase = $this->cache->fetchByUri($uri); - if (null !== $rootZoneDatabase) { - return $rootZoneDatabase; - } - - $rootZoneDatabase = $this->client->getByUri($uri); - - $this->cache->storeByUri($uri, $rootZoneDatabase); - - return $rootZoneDatabase; - } + public const RZD_URL = 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt'; + + /** + * Gets the Top Level Domains from the Local Storage or the Remote Storage. + * + * @throws UnableToLoadRootZoneDatabase + */ + public function getByUri(string $uri): RootZoneDatabase; } From 1f47db8568f9a75887a71099a7e3113cf46225d0 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 17 Aug 2020 10:38:26 +0200 Subject: [PATCH 229/461] Symplify Storage codebase --- bin/update-pdp | 15 +++++++-------- src/Storage/PublicSuffixListLocalStorage.php | 2 +- src/Storage/PublicSuffixListRemoteStorage.php | 19 +++---------------- src/Storage/RootZoneDatabaseLocalStorage.php | 2 +- src/Storage/RootZoneDatabaseRemoteStorage.php | 15 ++------------- 5 files changed, 14 insertions(+), 39 deletions(-) diff --git a/bin/update-pdp b/bin/update-pdp index a18edb85..121dad26 100755 --- a/bin/update-pdp +++ b/bin/update-pdp @@ -16,8 +16,6 @@ declare(strict_types=1); use GuzzleHttp\Client; use GuzzleHttp\Psr7\Request; -use Pdp\PublicSuffixListConverter; -use Pdp\RootZoneDatabaseConverter; use Pdp\Storage\PublicSuffixListCachePsr16Adapter; use Pdp\Storage\PublicSuffixListRemoteStorage; use Pdp\Storage\PublicSuffixListStorage; @@ -115,7 +113,7 @@ $arguments = getopt('h::', [ KEY_CACHE_DIR.':', ]); -if (isset($arguments['help']) || isset($arguments['h']) || [] === $arguments) { +if (isset($arguments['help']) || isset($arguments['h'])) { $script = basename(__FILE__); $helpText = << $default_cache_dir], ]); $ttl = new DateInterval('P1D'); -$psrHttpClient = new Client(); +$httpClient = new Client(); try { - $filesystemCache = new FilesystemAdapter('', 3600, $context[KEY_CACHE_DIR]); - $cache = new Psr16Cache($filesystemCache); + $cache = new Psr16Cache(new FilesystemAdapter('pdp', 3600, $context[KEY_CACHE_DIR])); } catch (Throwable $exception) { if (null !== $logger) { $logger->error('Local cache initialisation failed with {exception}', ['exception' => $exception->getMessage()]); @@ -166,10 +163,11 @@ success("$yellow Starting updating your local cache.$reset"); $error = 0; try { - $client = new PublicSuffixListRemoteStorage($psrHttpClient, $requestFactory, new PublicSuffixListConverter()); + $client = new PublicSuffixListRemoteStorage($httpClient, $requestFactory); $storage = new PublicSuffixListCachePsr16Adapter($cache, $ttl, $logger); $publicSuffixList = $client->getByUri(PublicSuffixListStorage::PSL_URL); + if (!$storage->storeByUri(PublicSuffixListStorage::PSL_URL, $publicSuffixList)) { throw new RuntimeException('Could not save the Public Suffix List to the `'.$context[KEY_CACHE_DIR].'` cache.'); } @@ -180,10 +178,11 @@ try { } try { - $client = new RootZoneDatabaseRemoteStorage($psrHttpClient, $requestFactory, new RootZoneDatabaseConverter()); + $client = new RootZoneDatabaseRemoteStorage($httpClient, $requestFactory); $storage = new RootZoneDatabaseCachePsr16Adapter($cache, $ttl, $logger); $rootZoneDatabase = $client->getByUri(RootZoneDatabaseStorage::RZD_URL); + if (!$storage->storeByUri(RootZoneDatabaseStorage::RZD_URL, $rootZoneDatabase)) { throw new RuntimeException('Could not save the Root Zone Database to the `'.$context[KEY_CACHE_DIR].'` cache.'); } diff --git a/src/Storage/PublicSuffixListLocalStorage.php b/src/Storage/PublicSuffixListLocalStorage.php index 7f7949c5..9b015822 100644 --- a/src/Storage/PublicSuffixListLocalStorage.php +++ b/src/Storage/PublicSuffixListLocalStorage.php @@ -23,7 +23,7 @@ final class PublicSuffixListLocalStorage implements PublicSuffixListStorage private PublicSuffixListCache $cache; - public function __construct(PublicSuffixListStorage $client, PublicSuffixListCache $cache) + public function __construct(PublicSuffixListCache $cache, PublicSuffixListStorage $client) { $this->client = $client; $this->cache = $cache; diff --git a/src/Storage/PublicSuffixListRemoteStorage.php b/src/Storage/PublicSuffixListRemoteStorage.php index 2f1c4dd4..83d8e84d 100644 --- a/src/Storage/PublicSuffixListRemoteStorage.php +++ b/src/Storage/PublicSuffixListRemoteStorage.php @@ -16,13 +16,11 @@ namespace Pdp\Storage; use Pdp\PublicSuffixList; -use Pdp\PublicSuffixListConverter; use Pdp\Rules; use Pdp\UnableToLoadPublicSuffixList; use Psr\Http\Client\ClientExceptionInterface; use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestFactoryInterface; -use function json_encode; final class PublicSuffixListRemoteStorage implements PublicSuffixListStorage { @@ -30,16 +28,10 @@ final class PublicSuffixListRemoteStorage implements PublicSuffixListStorage private RequestFactoryInterface $requestFactory; - private PublicSuffixListConverter $converter; - - public function __construct( - ClientInterface $client, - RequestFactoryInterface $requestFactory, - PublicSuffixListConverter $converter - ) { + public function __construct(ClientInterface $client, RequestFactoryInterface $requestFactory) + { $this->client = $client; $this->requestFactory = $requestFactory; - $this->converter = $converter; } public function getByUri(string $uri): PublicSuffixList @@ -55,11 +47,6 @@ public function getByUri(string $uri): PublicSuffixList throw UnableToLoadPublicSuffixList::dueToUnexpectedContent($uri, $response->getStatusCode()); } - $rawPsl = $this->converter->convert($response->getBody()); - - /** @var string $jsonEncodedPsl */ - $jsonEncodedPsl = json_encode($rawPsl); - - return Rules::fromJsonString($jsonEncodedPsl); + return Rules::fromString($response->getBody()); } } diff --git a/src/Storage/RootZoneDatabaseLocalStorage.php b/src/Storage/RootZoneDatabaseLocalStorage.php index 70a8421d..9d47c257 100644 --- a/src/Storage/RootZoneDatabaseLocalStorage.php +++ b/src/Storage/RootZoneDatabaseLocalStorage.php @@ -23,7 +23,7 @@ final class RootZoneDatabaseLocalStorage implements RootZoneDatabaseStorage private RootZoneDatabaseCache $cache; - public function __construct(RootZoneDatabaseStorage $client, RootZoneDatabaseCache $cache) + public function __construct(RootZoneDatabaseCache $cache, RootZoneDatabaseStorage $client) { $this->client = $client; $this->cache = $cache; diff --git a/src/Storage/RootZoneDatabaseRemoteStorage.php b/src/Storage/RootZoneDatabaseRemoteStorage.php index bbad5991..9eb5d53f 100644 --- a/src/Storage/RootZoneDatabaseRemoteStorage.php +++ b/src/Storage/RootZoneDatabaseRemoteStorage.php @@ -16,13 +16,11 @@ namespace Pdp\Storage; use Pdp\RootZoneDatabase; -use Pdp\RootZoneDatabaseConverter; use Pdp\TopLevelDomains; use Pdp\UnableToLoadRootZoneDatabase; use Psr\Http\Client\ClientExceptionInterface; use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestFactoryInterface; -use function json_encode; final class RootZoneDatabaseRemoteStorage implements RootZoneDatabaseStorage { @@ -30,16 +28,12 @@ final class RootZoneDatabaseRemoteStorage implements RootZoneDatabaseStorage private RequestFactoryInterface $requestFactory; - private RootZoneDatabaseConverter $converter; - public function __construct( ClientInterface $client, - RequestFactoryInterface $requestFactory, - RootZoneDatabaseConverter $converter + RequestFactoryInterface $requestFactory ) { $this->client = $client; $this->requestFactory = $requestFactory; - $this->converter = $converter; } public function getByUri(string $uri): RootZoneDatabase @@ -55,11 +49,6 @@ public function getByUri(string $uri): RootZoneDatabase throw UnableToLoadRootZoneDatabase::dueToUnexpectedContent($uri, $response->getStatusCode()); } - $rawRzd = $this->converter->convert($response->getBody()); - - /** @var string $jsonEncodedRzd */ - $jsonEncodedRzd = json_encode($rawRzd); - - return TopLevelDomains::fromJsonString($jsonEncodedRzd); + return TopLevelDomains::fromString($response->getBody()); } } From f0576123e7d8702f26d0663a8b812e15be6480c6 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 17 Aug 2020 21:51:40 +0200 Subject: [PATCH 230/461] Adding test suites for Storage --- src/Storage/Psr16JsonCache.php | 2 +- src/Storage/RootZoneDatabaseRemoteStorage.php | 6 +- .../PublicSuffixListLocalStorageTest.php | 81 +++ .../PublicSuffixListPsr16AdapterTest.php | 575 ++++++++++++++++++ .../PublicSuffixListRemoteStorageTest.php | 107 ++++ .../RootZoneDatabaseLocalStorageTest.php | 79 +++ .../RootZoneDatabasePsr16AdapterTest.php | 575 ++++++++++++++++++ .../RootZoneDatabaseRemoteStorageTest.php | 108 ++++ 8 files changed, 1528 insertions(+), 5 deletions(-) create mode 100644 tests/Storage/PublicSuffixListLocalStorageTest.php create mode 100644 tests/Storage/PublicSuffixListPsr16AdapterTest.php create mode 100644 tests/Storage/PublicSuffixListRemoteStorageTest.php create mode 100644 tests/Storage/RootZoneDatabaseLocalStorageTest.php create mode 100644 tests/Storage/RootZoneDatabasePsr16AdapterTest.php create mode 100644 tests/Storage/RootZoneDatabaseRemoteStorageTest.php diff --git a/src/Storage/Psr16JsonCache.php b/src/Storage/Psr16JsonCache.php index 13b02cc9..eb68f38a 100644 --- a/src/Storage/Psr16JsonCache.php +++ b/src/Storage/Psr16JsonCache.php @@ -102,7 +102,7 @@ final protected function store(string $uri, JsonSerializable $object): bool $result = $this->cache->set($this->cacheKey($uri), json_encode($object), $this->ttl); } catch (Throwable $exception) { $this->logger->info( - 'The content associated with URI: `'.$uri.'` could not be cached :'.$exception->getMessage(), + 'The content associated with URI: `'.$uri.'` could not be cached: '.$exception->getMessage(), ['exception' => $exception] ); diff --git a/src/Storage/RootZoneDatabaseRemoteStorage.php b/src/Storage/RootZoneDatabaseRemoteStorage.php index 9eb5d53f..9121ccc3 100644 --- a/src/Storage/RootZoneDatabaseRemoteStorage.php +++ b/src/Storage/RootZoneDatabaseRemoteStorage.php @@ -28,10 +28,8 @@ final class RootZoneDatabaseRemoteStorage implements RootZoneDatabaseStorage private RequestFactoryInterface $requestFactory; - public function __construct( - ClientInterface $client, - RequestFactoryInterface $requestFactory - ) { + public function __construct(ClientInterface $client, RequestFactoryInterface $requestFactory) + { $this->client = $client; $this->requestFactory = $requestFactory; } diff --git a/tests/Storage/PublicSuffixListLocalStorageTest.php b/tests/Storage/PublicSuffixListLocalStorageTest.php new file mode 100644 index 00000000..dd703d81 --- /dev/null +++ b/tests/Storage/PublicSuffixListLocalStorageTest.php @@ -0,0 +1,81 @@ +getByUri('http://www.example.com'); + + self::assertInstanceOf(Rules::class, $psl); + } + + public function testIsCanReturnAPublicSuffixListInstanceFromTheInnerStorage(): void + { + $cache = new class() implements PublicSuffixListCache { + public function fetchByUri(string $uri): ?PublicSuffixList + { + return null; + } + + public function storeByUri(string $uri, PublicSuffixList $publicSuffixList): bool + { + return true; + } + }; + + $client = new class() implements PublicSuffixListStorage { + public function getByUri(string $uri): PublicSuffixList + { + return Rules::fromPath(dirname(__DIR__).'/data/public_suffix_list.dat'); + } + }; + + $storage = new PublicSuffixListLocalStorage($cache, $client); + $psl = $storage->getByUri('http://www.example.com'); + + self::assertInstanceOf(Rules::class, $psl); + } +} diff --git a/tests/Storage/PublicSuffixListPsr16AdapterTest.php b/tests/Storage/PublicSuffixListPsr16AdapterTest.php new file mode 100644 index 00000000..94025774 --- /dev/null +++ b/tests/Storage/PublicSuffixListPsr16AdapterTest.php @@ -0,0 +1,575 @@ +fetchByUri('http://www.example.com')); + } + + public function testItReturnsAnInstanceIfTheCorrectCacheExists(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return json_encode(Rules::fromPath(dirname(__DIR__).'/data/public_suffix_list.dat')); + } + + public function set($key, $value, $ttl = null) + { + return false; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + $pslCache = new PublicSuffixListCachePsr16Adapter($cache, 86400); + + self::assertEquals( + Rules::fromPath(dirname(__DIR__).'/data/public_suffix_list.dat'), + $pslCache->fetchByUri('http://www.example.com') + ); + } + + public function testItReturnsNullIfTheCacheContentContainsInvalidJsonData(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return 'foobar'; + } + + public function set($key, $value, $ttl = null) + { + return false; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + $logger = new class() extends AbstractLogger { + private array $logs = []; + + public function log($level, $message, array $context = []) + { + $replace = []; + foreach ($context as $key => $val) { + $replace['{'.$key.'}'] = $val; + } + + $this->logs[] = strtr($message, $replace); + } + + public function logs(): array + { + return $this->logs; + } + }; + + $pslCache = new PublicSuffixListCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); + self::assertNull($pslCache->fetchByUri('http://www.example.com')); + self::assertSame('Failed to JSON decode the string: Syntax error.', $logger->logs()[0]); + } + + public function testItReturnsNullIfTheCacheContentCannotBeConvertedToTheCorrectInstance(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return '{"foo":"bar"}'; + } + + public function set($key, $value, $ttl = null) + { + return false; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + $logger = new class() extends AbstractLogger { + private array $logs = []; + + public function log($level, $message, array $context = []) + { + $replace = []; + foreach ($context as $key => $val) { + $replace['{'.$key.'}'] = $val; + } + + $this->logs[] = strtr($message, $replace); + } + + public function logs(): array + { + return $this->logs; + } + }; + + $pslCache = new PublicSuffixListCachePsr16Adapter($cache, new \DateTimeImmutable('+1 DAY'), $logger); + self::assertNull($pslCache->fetchByUri('http://www.example.com')); + self::assertSame( + 'The public suffix list data are missing one of the required ICANN or PRIVATE domain section.', + $logger->logs()[0] + ); + } + + public function testItThrowsOnConstructionIfTheTTLIsNotTheCorrectType(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return null; + } + + public function set($key, $value, $ttl = null) + { + return false; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + self::expectException(TypeError::class); + + new PublicSuffixListCachePsr16Adapter($cache, []); + } + + public function testItThrowsOnConstructionIfTheTTLStringCanNotBeParsed(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return null; + } + + public function set($key, $value, $ttl = null) + { + return false; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + self::expectException(InvalidArgumentException::class); + + new PublicSuffixListCachePsr16Adapter($cache, 'foobar'); + } + + public function testItCanStoreAPublicSuffixListInstance(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return null; + } + + public function set($key, $value, $ttl = null) + { + return true; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + $logger = new class() extends AbstractLogger { + private array $logs = []; + + public function log($level, $message, array $context = []) + { + $replace = []; + foreach ($context as $key => $val) { + $replace['{'.$key.'}'] = $val; + } + + $this->logs[] = strtr($message, $replace); + } + + public function logs(): array + { + return $this->logs; + } + }; + + $psl = Rules::fromPath(dirname(__DIR__).'/data/public_suffix_list.dat'); + $pslCache = new PublicSuffixListCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); + + self::assertTrue($pslCache->storeByUri('http://www.example.com', $psl)); + self::assertSame('The content associated with URI: `http://www.example.com` was stored.', $logger->logs()[0]); + } + + public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return null; + } + + public function set($key, $value, $ttl = null) + { + return false; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + $logger = new class() extends AbstractLogger { + private array $logs = []; + + public function log($level, $message, array $context = []) + { + $replace = []; + foreach ($context as $key => $val) { + $replace['{'.$key.'}'] = $val; + } + + $this->logs[] = strtr($message, $replace); + } + + public function logs(): array + { + return $this->logs; + } + }; + + $psl = Rules::fromPath(dirname(__DIR__).'/data/public_suffix_list.dat'); + $pslCache = new PublicSuffixListCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); + + self::assertFalse($pslCache->storeByUri('http://www.example.com', $psl)); + self::assertSame('The content associated with URI: `http://www.example.com` could not be stored.', $logger->logs()[0]); + } + + + public function testItReturnsFalseIfItCantCacheAPublicSuffixListInstance(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return null; + } + + public function set($key, $value, $ttl = null) + { + throw new class('Something went wrong.', 0) extends RuntimeException implements CacheException { + }; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + $logger = new class() extends AbstractLogger { + private array $logs = []; + + public function log($level, $message, array $context = []) + { + $replace = []; + foreach ($context as $key => $val) { + $replace['{'.$key.'}'] = $val; + } + + $this->logs[] = strtr($message, $replace); + } + + public function logs(): array + { + return $this->logs; + } + }; + + $psl = Rules::fromPath(dirname(__DIR__).'/data/public_suffix_list.dat'); + $pslCache = new PublicSuffixListCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); + + self::assertFalse($pslCache->storeByUri('http://www.example.com', $psl)); + self::assertSame('The content associated with URI: `http://www.example.com` could not be cached: Something went wrong.', $logger->logs()[0]); + } +} diff --git a/tests/Storage/PublicSuffixListRemoteStorageTest.php b/tests/Storage/PublicSuffixListRemoteStorageTest.php new file mode 100644 index 00000000..fd55dc94 --- /dev/null +++ b/tests/Storage/PublicSuffixListRemoteStorageTest.php @@ -0,0 +1,107 @@ +getByUri('http://www.example.com'); + + self::assertInstanceOf(Rules::class, $psl); + } + + public function testItWillThrowIfTheClientCanNotConnectToTheRemoteURI(): void + { + $client = new class() implements ClientInterface { + public function sendRequest(RequestInterface $request): ResponseInterface + { + throw new ConnectException('foobar', $request, null); + } + }; + + $requestFactory = new class() implements RequestFactoryInterface { + public function createRequest(string $method, $uri): RequestInterface + { + return new Request($method, $uri); + } + }; + + self::expectException(UnableToLoadPublicSuffixList::class); + self::expectExceptionMessage('Could not access the Public Suffix List URI: `http://www.example.com`.'); + + $storage = new PublicSuffixListRemoteStorage($client, $requestFactory); + $storage->getByUri('http://www.example.com'); + } + + public function testItWillThrowIfTheReturnedStatusCodeIsNotOK(): void + { + $client = new class() implements ClientInterface { + public function sendRequest(RequestInterface $request): ResponseInterface + { + return new Response(404); + } + }; + + $requestFactory = new class() implements RequestFactoryInterface { + public function createRequest(string $method, $uri): RequestInterface + { + return new Request($method, $uri); + } + }; + + self::expectException(UnableToLoadPublicSuffixList::class); + self::expectExceptionMessage('Invalid response from Public Suffix List URI: `http://www.example.com`.'); + self::expectExceptionCode(404); + + $storage = new PublicSuffixListRemoteStorage($client, $requestFactory); + $storage->getByUri('http://www.example.com'); + } +} diff --git a/tests/Storage/RootZoneDatabaseLocalStorageTest.php b/tests/Storage/RootZoneDatabaseLocalStorageTest.php new file mode 100644 index 00000000..d286fe3c --- /dev/null +++ b/tests/Storage/RootZoneDatabaseLocalStorageTest.php @@ -0,0 +1,79 @@ +getByUri('http://www.example.com')); + } + + public function testIsCanReturnARootZoneDatabaseInstanceFromTheInnerStorage(): void + { + $cache = new class() implements RootZoneDatabaseCache { + public function fetchByUri(string $uri): ?RootZoneDatabase + { + return null; + } + + public function storeByUri(string $uri, RootZoneDatabase $publicSuffixList): bool + { + return true; + } + }; + + $client = new class() implements RootZoneDatabaseStorage { + public function getByUri(string $uri): RootZoneDatabase + { + return TopLevelDomains::fromPath(dirname(__DIR__).'/data/tlds-alpha-by-domain.txt'); + } + }; + + $storage = new RootZoneDatabaseLocalStorage($cache, $client); + + self::assertInstanceOf(TopLevelDomains::class, $storage->getByUri('http://www.example.com')); + } +} diff --git a/tests/Storage/RootZoneDatabasePsr16AdapterTest.php b/tests/Storage/RootZoneDatabasePsr16AdapterTest.php new file mode 100644 index 00000000..c7cb9a3e --- /dev/null +++ b/tests/Storage/RootZoneDatabasePsr16AdapterTest.php @@ -0,0 +1,575 @@ +fetchByUri('http://www.example.com')); + } + + public function testItReturnsAnInstanceIfTheCorrectCacheExists(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return json_encode(TopLevelDomains::fromPath(dirname(__DIR__).'/data/tlds-alpha-by-domain.txt')); + } + + public function set($key, $value, $ttl = null) + { + return false; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + $pslCache = new RootZoneDatabaseCachePsr16Adapter($cache, 86400); + + self::assertEquals( + TopLevelDomains::fromPath(dirname(__DIR__).'/data/tlds-alpha-by-domain.txt'), + $pslCache->fetchByUri('http://www.example.com') + ); + } + + public function testItReturnsNullIfTheCacheContentContainsInvalidJsonData(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return 'foobar'; + } + + public function set($key, $value, $ttl = null) + { + return false; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + $logger = new class() extends AbstractLogger { + private array $logs = []; + + public function log($level, $message, array $context = []) + { + $replace = []; + foreach ($context as $key => $val) { + $replace['{'.$key.'}'] = $val; + } + + $this->logs[] = strtr($message, $replace); + } + + public function logs(): array + { + return $this->logs; + } + }; + + $pslCache = new RootZoneDatabaseCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); + self::assertNull($pslCache->fetchByUri('http://www.example.com')); + self::assertSame('Failed to JSON decode the string: Syntax error.', $logger->logs()[0]); + } + + public function testItReturnsNullIfTheCacheContentCannotBeConvertedToTheCorrectInstance(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return '{"foo":"bar"}'; + } + + public function set($key, $value, $ttl = null) + { + return false; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + $logger = new class() extends AbstractLogger { + private array $logs = []; + + public function log($level, $message, array $context = []) + { + $replace = []; + foreach ($context as $key => $val) { + $replace['{'.$key.'}'] = $val; + } + + $this->logs[] = strtr($message, $replace); + } + + public function logs(): array + { + return $this->logs; + } + }; + + $pslCache = new RootZoneDatabaseCachePsr16Adapter($cache, new \DateTimeImmutable('+1 DAY'), $logger); + self::assertNull($pslCache->fetchByUri('http://www.example.com')); + self::assertSame( + 'The decoded hashmap structure is missing at least one of the required properties: `records`, `version` and/or `modifiedDate`.', + $logger->logs()[0] + ); + } + + public function testItThrowsOnConstructionIfTheTTLIsNotTheCorrectType(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return null; + } + + public function set($key, $value, $ttl = null) + { + return false; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + self::expectException(TypeError::class); + + new RootZoneDatabaseCachePsr16Adapter($cache, []); + } + + public function testItThrowsOnConstructionIfTheTTLStringCanNotBeParsed(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return null; + } + + public function set($key, $value, $ttl = null) + { + return false; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + self::expectException(InvalidArgumentException::class); + + new RootZoneDatabaseCachePsr16Adapter($cache, 'foobar'); + } + + public function testItCanStoreAPublicSuffixListInstance(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return null; + } + + public function set($key, $value, $ttl = null) + { + return true; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + $logger = new class() extends AbstractLogger { + private array $logs = []; + + public function log($level, $message, array $context = []) + { + $replace = []; + foreach ($context as $key => $val) { + $replace['{'.$key.'}'] = $val; + } + + $this->logs[] = strtr($message, $replace); + } + + public function logs(): array + { + return $this->logs; + } + }; + + $rzd = TopLevelDomains::fromPath(dirname(__DIR__).'/data/tlds-alpha-by-domain.txt'); + $pslCache = new RootZoneDatabaseCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); + + self::assertTrue($pslCache->storeByUri('http://www.example.com', $rzd)); + self::assertSame('The content associated with URI: `http://www.example.com` was stored.', $logger->logs()[0]); + } + + public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return null; + } + + public function set($key, $value, $ttl = null) + { + return false; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + $logger = new class() extends AbstractLogger { + private array $logs = []; + + public function log($level, $message, array $context = []) + { + $replace = []; + foreach ($context as $key => $val) { + $replace['{'.$key.'}'] = $val; + } + + $this->logs[] = strtr($message, $replace); + } + + public function logs(): array + { + return $this->logs; + } + }; + + $rzd = TopLevelDomains::fromPath(dirname(__DIR__).'/data/tlds-alpha-by-domain.txt'); + $pslCache = new RootZoneDatabaseCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); + + self::assertFalse($pslCache->storeByUri('http://www.example.com', $rzd)); + self::assertSame('The content associated with URI: `http://www.example.com` could not be stored.', $logger->logs()[0]); + } + + + public function testItReturnsFalseIfItCantCacheAPublicSuffixListInstance(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return null; + } + + public function set($key, $value, $ttl = null) + { + throw new class('Something went wrong.', 0) extends RuntimeException implements CacheException { + }; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + $logger = new class() extends AbstractLogger { + private array $logs = []; + + public function log($level, $message, array $context = []) + { + $replace = []; + foreach ($context as $key => $val) { + $replace['{'.$key.'}'] = $val; + } + + $this->logs[] = strtr($message, $replace); + } + + public function logs(): array + { + return $this->logs; + } + }; + + $rzd = TopLevelDomains::fromPath(dirname(__DIR__).'/data/tlds-alpha-by-domain.txt'); + $pslCache = new RootZoneDatabaseCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); + + self::assertFalse($pslCache->storeByUri('http://www.example.com', $rzd)); + self::assertSame('The content associated with URI: `http://www.example.com` could not be cached: Something went wrong.', $logger->logs()[0]); + } +} diff --git a/tests/Storage/RootZoneDatabaseRemoteStorageTest.php b/tests/Storage/RootZoneDatabaseRemoteStorageTest.php new file mode 100644 index 00000000..31576751 --- /dev/null +++ b/tests/Storage/RootZoneDatabaseRemoteStorageTest.php @@ -0,0 +1,108 @@ +getByUri('http://www.example.com'); + + self::assertInstanceOf(TopLevelDomains::class, $rzd); + } + + public function testItWillThrowIfTheClientCanNotConnectToTheRemoteURI(): void + { + $client = new class() implements ClientInterface { + public function sendRequest(RequestInterface $request): ResponseInterface + { + throw new ConnectException('foobar', $request, null); + } + }; + + $requestFactory = new class() implements RequestFactoryInterface { + public function createRequest(string $method, $uri): RequestInterface + { + return new Request($method, $uri); + } + }; + + self::expectException(UnableToLoadRootZoneDatabase::class); + self::expectExceptionMessage('Could not access the Root Zone Database URI: `http://www.example.com`.'); + + $storage = new RootZoneDatabaseRemoteStorage($client, $requestFactory); + $storage->getByUri('http://www.example.com'); + } + + public function testItWillThrowIfTheReturnedStatusCodeIsNotOK(): void + { + $client = new class() implements ClientInterface { + public function sendRequest(RequestInterface $request): ResponseInterface + { + return new Response(404); + } + }; + + $requestFactory = new class() implements RequestFactoryInterface { + public function createRequest(string $method, $uri): RequestInterface + { + return new Request($method, $uri); + } + }; + + self::expectException(UnableToLoadRootZoneDatabase::class); + self::expectExceptionMessage('Invalid response from Root Zone Database URI: `http://www.example.com`.'); + self::expectExceptionCode(404); + + $storage = new RootZoneDatabaseRemoteStorage($client, $requestFactory); + $storage->getByUri('http://www.example.com'); + } +} From 5ca0f99c8a362eadada7d66d3d688dfe0df086aa Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 17 Aug 2020 21:52:06 +0200 Subject: [PATCH 231/461] Improve Codebase --- src/TopLevelDomains.php | 3 +- src/UnableToLoadPublicSuffixList.php | 2 +- src/UnableToLoadRootZoneDatabase.php | 2 +- tests/DomainTest.php | 64 +------ tests/PublicSuffixTest.php | 37 +--- tests/ResolvedDomainTest.php | 60 ------- tests/RulesTest.php | 166 ++---------------- tests/TopLevelDomainsTest.php | 21 ++- ...ULL_5a3cc7f81795bb2e48e848af42d287b4.cache | 1 - 9 files changed, 33 insertions(+), 323 deletions(-) delete mode 100644 tests/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index c43c5615..5088dce2 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -228,8 +228,7 @@ public function contains($tld): bool public function resolve($domain): ResolvedDomainName { if ($domain instanceof ResolvedDomainName) { - $domain = $domain->getDomain(); - $domain + $domain = $domain->getDomain() ->withUnicodeIDNAOption($this->unicodeIDNAOption) ->withAsciiIDNAOption($this->asciiIDNAOption); } diff --git a/src/UnableToLoadPublicSuffixList.php b/src/UnableToLoadPublicSuffixList.php index 36e3a855..260384aa 100644 --- a/src/UnableToLoadPublicSuffixList.php +++ b/src/UnableToLoadPublicSuffixList.php @@ -27,7 +27,7 @@ public static function dueToInvalidPath(string $path): self public static function dueToInvalidJson(int $code, string $message): self { - return new self($message, $code); + return new self('Failed to JSON decode the string: '.$message.'.', $code); } public static function dueToInvalidRule(?string $line, Throwable $exception): self diff --git a/src/UnableToLoadRootZoneDatabase.php b/src/UnableToLoadRootZoneDatabase.php index d097682f..b942f59c 100644 --- a/src/UnableToLoadRootZoneDatabase.php +++ b/src/UnableToLoadRootZoneDatabase.php @@ -52,7 +52,7 @@ public static function dueToInvalidPath(string $path): self public static function dueToInvalidJson(int $code, string $message): self { - return new self($message, $code); + return new self('Failed to JSON decode the string: '.$message.'.', $code); } public static function dueToUnavailableService(string $uri, Throwable $exception): self diff --git a/tests/DomainTest.php b/tests/DomainTest.php index 8d8403c8..2f009caa 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -30,10 +30,8 @@ class DomainTest extends TestCase { /** + * @covers \Pdp\InvalidHost * @dataProvider invalidDomainProvider - * @covers ::__construct - * @covers ::parse - * @covers ::idnToAscii */ public function testToAsciiThrowsException(string $domain): void { @@ -51,10 +49,6 @@ public function invalidDomainProvider(): iterable ]; } - /** - * @covers ::toUnicode - * @covers ::idnToUnicode - */ public function testToUnicodeThrowsException(): void { self::expectException(InvalidHost::class); @@ -62,13 +56,6 @@ public function testToUnicodeThrowsException(): void (new Domain('xn--a-ecp.ru'))->toUnicode(); } - /** - * @covers ::__construct - * @covers ::__set_state - * @covers ::__toString - * @covers ::jsonSerialize - * @covers ::getIterator - */ public function testDomainInternalPhpMethod(): void { $domain = new Domain('www.ulb.ac.be'); @@ -80,8 +67,6 @@ public function testDomainInternalPhpMethod(): void } /** - * @covers ::getIterator - * @covers ::count * @dataProvider countableProvider * * @param string[] $labels @@ -104,9 +89,6 @@ public function countableProvider(): iterable ]; } - /** - * @covers ::label - */ public function testGetLabel(): void { $domain = new Domain('master.example.com'); @@ -117,9 +99,6 @@ public function testGetLabel(): void self::assertNull($domain->label(-23)); } - /** - * @covers ::keys - */ public function testOffsets(): void { $domain = new Domain('master.com.example.com'); @@ -127,9 +106,6 @@ public function testOffsets(): void self::assertSame([], $domain->keys('toto')); } - /** - * @covers ::labels - */ public function testLabels(): void { $domain = new Domain('master.com.example.com'); @@ -145,11 +121,6 @@ public function testLabels(): void } /** - * @covers ::parse - * @covers ::getContent - * @covers ::idnToUnicode - * @covers ::toUnicode - * @covers \Pdp\PublicSuffix::toUnicode * @dataProvider toUnicodeProvider * * @param ?string $domain @@ -211,12 +182,6 @@ public function toUnicodeProvider(): iterable } /** - * @covers ::parse - * @covers ::getContent - * @covers ::idnToAscii - * @covers ::toAscii - * @covers \Pdp\PublicSuffix::toAscii - * * @dataProvider toAsciiProvider * @param ?string $domain * @param ?string $expectedDomain @@ -267,8 +232,6 @@ public function toAsciiProvider(): iterable } /** - * @covers ::withLabel - * @covers ::normalizeContent * @dataProvider withLabelWorksProvider * * @param ?string $expected @@ -347,27 +310,18 @@ public function withLabelWorksProvider(): iterable ]; } - /** - * @covers ::withLabel - */ public function testWithLabelFailsWithTypeError(): void { self::expectException(TypeError::class); (new Domain('example.com'))->withLabel(1, null); } - /** - * @covers ::withLabel - */ public function testWithLabelFailsWithInvalidKey(): void { self::expectException(InvalidDomainName::class); (new Domain('example.com'))->withLabel(-4, 'www'); } - /** - * @covers ::withLabel - */ public function testWithLabelFailsWithInvalidLabel2(): void { self::expectException(InvalidHost::class); @@ -376,9 +330,6 @@ public function testWithLabelFailsWithInvalidLabel2(): void } /** - * @covers ::append - * @covers ::withLabel - * * @dataProvider validAppend */ public function testAppend(string $raw, string $append, string $expected): void @@ -397,9 +348,6 @@ public function validAppend(): iterable } /** - * @covers ::prepend - * @covers ::withLabel - * * @dataProvider validPrepend */ public function testPrepend(string $raw, string $prepend, string $expected): void @@ -417,7 +365,6 @@ public function validPrepend(): iterable } /** - * @covers ::withoutLabel * @dataProvider withoutLabelWorksProvider * @param ?string $expected */ @@ -455,26 +402,17 @@ public function withoutLabelWorksProvider(): iterable ]; } - /** - * @covers ::withoutLabel - */ public function testwithoutLabelFailsWithInvalidKey(): void { self::expectException(InvalidDomainName::class); (new Domain('example.com'))->withoutLabel(-3); } - /** - * @covers ::withoutLabel - */ public function testwithoutLabelWorksWithMultipleKeys(): void { self::assertNull((new Domain('www.example.com'))->withoutLabel(0, 1, 2)->getContent()); } - /** - * @covers ::__construct - */ public function testConstructWithCustomIDNAOptions(): void { $domain = new Domain('example.com', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); diff --git a/tests/PublicSuffixTest.php b/tests/PublicSuffixTest.php index c338f951..2b9549bb 100644 --- a/tests/PublicSuffixTest.php +++ b/tests/PublicSuffixTest.php @@ -29,12 +29,6 @@ */ class PublicSuffixTest extends TestCase { - /** - * @covers ::__construct - * @covers ::__set_state - * @covers ::__toString - * @covers ::jsonSerialize - */ public function testInternalPhpMethod(): void { $publicSuffix = PublicSuffix::fromICANN('ac.be'); @@ -44,21 +38,12 @@ public function testInternalPhpMethod(): void self::assertSame('ac.be', (string) $publicSuffix); } - /** - * @covers ::__construct - * @covers ::getContent - * @covers ::toUnicode - */ public function testPSToUnicodeWithUrlEncode(): void { self::assertSame('bébe', PublicSuffix::fromUnknown('b%C3%A9be')->toUnicode()->getContent()); } /** - * @covers ::__construct - * @covers ::isKnown - * @covers ::isICANN - * @covers ::isPrivate * @dataProvider PSProvider * @param ?string $publicSuffix */ @@ -91,7 +76,6 @@ public function PSProvider(): iterable } /** - * @covers ::__construct * @dataProvider invalidPublicSuffixProvider */ public function testConstructorThrowsException(string $publicSuffix): void @@ -109,9 +93,6 @@ public function invalidPublicSuffixProvider(): iterable ]; } - /** - * @covers ::__construct - */ public function testPSToAsciiThrowsException(): void { self::expectException(InvalidHost::class); @@ -119,9 +100,6 @@ public function testPSToAsciiThrowsException(): void PublicSuffix::fromUnknown('a⒈com'); } - /** - * @covers ::toUnicode - */ public function testToUnicodeThrowsException(): void { self::expectException(InvalidHost::class); @@ -130,9 +108,6 @@ public function testToUnicodeThrowsException(): void } /** - * @covers ::toAscii - * @covers ::toUnicode - * * @dataProvider conversionReturnsTheSameInstanceProvider * @param ?string $publicSuffix */ @@ -152,9 +127,6 @@ public function conversionReturnsTheSameInstanceProvider(): iterable ]; } - /** - * @covers ::toUnicode - */ public function testToUnicodeReturnsSameInstance(): void { $instance = PublicSuffix::fromUnknown('食狮.公司.cn'); @@ -163,7 +135,6 @@ public function testToUnicodeReturnsSameInstance(): void } /** - * @covers ::count * @dataProvider countableProvider * @param ?string $domain */ @@ -234,13 +205,7 @@ public function customIDNAProvider(): iterable ]; } - /** - * @covers ::getAsciiIDNAOption - * @covers ::getUnicodeIDNAOption - * @covers ::withAsciiIDNAOption - * @covers ::withUnicodeIDNAOption - */ - public function testwithIDNAOptions(): void + public function testWithIDNAOptions(): void { $publicSuffix = PublicSuffix::fromUnknown('com'); diff --git a/tests/ResolvedDomainTest.php b/tests/ResolvedDomainTest.php index 19a085d6..7d9eefd1 100644 --- a/tests/ResolvedDomainTest.php +++ b/tests/ResolvedDomainTest.php @@ -31,14 +31,6 @@ */ class ResolvedDomainTest extends TestCase { - /** - * @covers ::__construct - * @covers ::setRegistrableDomain - * @covers ::setSubDomain - * @covers ::getPublicSuffix - * @covers ::getRegistrableDomain - * @covers ::getSubDomain - */ public function testRegistrableDomainIsNullWithFoundDomain(): void { $domain = new ResolvedDomain(new Domain('faketld')); @@ -48,10 +40,7 @@ public function testRegistrableDomainIsNullWithFoundDomain(): void } /** - * @covers ::__construct - * @covers ::normalize * @dataProvider provideWrongConstructor - * * @param ?string $domain */ public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain(?string $domain, string $publicSuffix): void @@ -83,12 +72,6 @@ public function provideWrongConstructor(): iterable ]; } - /** - * @covers ::__construct - * @covers ::__set_state - * @covers ::__toString - * @covers ::jsonSerialize - */ public function testDomainInternalPhpMethod(): void { $domain = new ResolvedDomain(new Domain('www.ulb.ac.be'), PublicSuffix::fromICANN('ac.be')); @@ -99,8 +82,6 @@ public function testDomainInternalPhpMethod(): void } /** - * @covers ::normalize - * @covers ::count * @dataProvider countableProvider * @param ?string $domain */ @@ -121,13 +102,6 @@ public function countableProvider(): iterable } /** - * @covers ::normalize - * @covers ::setRegistrableDomain - * @covers ::setSubDomain - * @covers ::getContent - * @covers ::getPublicSuffix - * @covers ::toUnicode - * @covers \Pdp\PublicSuffix::toUnicode * @dataProvider toUnicodeProvider * @param ?string $domain * @param ?string $publicSuffix @@ -219,14 +193,6 @@ public function toUnicodeProvider(): iterable } /** - * @covers ::normalize - * @covers ::setRegistrableDomain - * @covers ::setSubDomain - * @covers ::getContent - * @covers ::getPublicSuffix - * @covers ::toAscii - * @covers \Pdp\PublicSuffix::toAscii - * * @dataProvider toAsciiProvider * @param ?string $domain * @param ?string $publicSuffix @@ -302,8 +268,6 @@ public function toAsciiProvider(): iterable } /** - * @covers ::resolve - * @covers ::normalize * @dataProvider resolvePassProvider * * @param mixed $publicSuffix the public suffix to resolve @@ -359,7 +323,6 @@ public function resolvePassProvider(): iterable } /** - * @covers ::resolve * @dataProvider resolveFailsProvider */ public function testResolveFails(ResolvedDomain $domain, PublicSuffix $publicSuffix): void @@ -397,9 +360,6 @@ public function resolveFailsProvider(): iterable ]; } - /** - * @covers ::resolve - */ public function testResolveReturnsInstance(): void { $publicSuffix = PublicSuffix::fromICANN('ac.be'); @@ -409,7 +369,6 @@ public function testResolveReturnsInstance(): void } /** - * @covers ::withSubDomain * @dataProvider withSubDomainWorksProvider * * @param mixed $subdomain the subdomain to add @@ -455,9 +414,6 @@ public function withSubDomainWorksProvider(): iterable ]; } - /** - * @covers ::withSubDomain - */ public function testWithSubDomainFailsWithNullDomain(): void { self::expectException(UnableToResolveDomain::class); @@ -465,9 +421,6 @@ public function testWithSubDomainFailsWithNullDomain(): void (new ResolvedDomain(new Domain(null)))->withSubDomain('www'); } - /** - * @covers ::withSubDomain - */ public function testWithSubDomainFailsWithOneLabelDomain(): void { self::expectException(UnableToResolveDomain::class); @@ -475,9 +428,6 @@ public function testWithSubDomainFailsWithOneLabelDomain(): void (new ResolvedDomain(new Domain('localhost')))->withSubDomain('www'); } - /** - * @covers ::withSubDomain - */ public function testWithEmptySubdomain(): void { self::expectException(InvalidHost::class); @@ -487,9 +437,6 @@ public function testWithEmptySubdomain(): void $domain->withSubDomain(''); } - /** - * @covers ::withSubDomain - */ public function testWithSubDomainFailsWithNonStringableObject(): void { self::expectException(TypeError::class); @@ -498,9 +445,6 @@ public function testWithSubDomainFailsWithNonStringableObject(): void $domain->withSubDomain(date_create()); } - /** - * @covers ::withSubDomain - */ public function testWithSubDomainWithoutPublicSuffixInfo(): void { self::expectException(UnableToResolveDomain::class); @@ -509,7 +453,6 @@ public function testWithSubDomainWithoutPublicSuffixInfo(): void } /** - * @covers ::withPublicSuffix * @dataProvider withPublicSuffixWorksProvider * * @param mixed $publicSuffix the public suffix @@ -608,9 +551,6 @@ public function withPublicSuffixWorksProvider(): iterable ]; } - /** - * @covers ::withPublicSuffix - */ public function testWithPublicSuffixFailsWithNullDomain(): void { self::expectException(InvalidHost::class); diff --git a/tests/RulesTest.php b/tests/RulesTest.php index c7fed7c3..ae27587e 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -50,11 +50,6 @@ public function setUp(): void $this->rules = Rules::fromString($string); } - /** - * @covers ::fromPath - * @covers ::fromString - * @covers ::__construct - */ public function testCreateFromPath(): void { /** @var string $string */ @@ -72,32 +67,20 @@ public function testCreateFromPath(): void self::assertEquals($rulesFromString, $rulesFromPath); } - /** - * @covers ::fromPath - */ public function testCreateFromPathThrowsException(): void { self::expectException(UnableToLoadPublicSuffixList::class); + Rules::fromPath('/foo/bar.dat'); } - /** - * @covers ::__set_state - * @covers ::__construct - */ public function testDomainInternalPhpMethod(): void { $generateRules = eval('return '.var_export($this->rules, true).';'); self::assertEquals($this->rules, $generateRules); } - /** - * @covers ::getAsciiIDNAOption - * @covers ::getUnicodeIDNAOption - * @covers ::withAsciiIDNAOption - * @covers ::withUnicodeIDNAOption - */ - public function testwithIDNAOptions(): void + public function testWithIDNAOptions(): void { self::assertSame($this->rules, $this->rules->withAsciiIDNAOption( $this->rules->getAsciiIDNAOption() @@ -116,135 +99,75 @@ public function testwithIDNAOptions(): void )); } - /** - * @covers ::resolve - * @covers ::getCookieDomain - * @covers ::getICANNDomain - * @covers ::getPrivateDomain - * @covers ::validateDomain - * @covers \Pdp\DomainNameParser::parse - */ public function testNullWillReturnNullDomain(): void { $domain = $this->rules->resolve('COM'); + self::assertFalse($domain->getPublicSuffix()->isKnown()); } - - /** - * @covers ::resolve - * @covers \Pdp\DomainNameParser::parse - */ public function testThrowsTypeErrorOnWrongInput(): void { self::expectException(TypeError::class); + $this->rules->resolve(date_create()); } - /** - * @covers ::resolve - * @covers ::findPublicSuffix - * @covers ::findPublicSuffixFromSection - * @covers \Pdp\PublicSuffix::isKnown - * @covers \Pdp\DomainNameParser::parse - */ public function testIsSuffixValidFalse(): void { $domain = $this->rules->resolve('www.example.faketld'); + self::assertFalse($domain->getPublicSuffix()->isKnown()); } - /** - * @covers ::resolve - * @covers ::findPublicSuffix - * @covers ::findPublicSuffixFromSection - * @covers \Pdp\PublicSuffix::isKnown - * @covers \Pdp\PublicSuffix::isICANN - * @covers \Pdp\PublicSuffix::isPrivate - * @covers \Pdp\DomainNameParser::parse - */ public function testIsSuffixValidTrue(): void { $domain = $this->rules->resolve('www.example.com'); + self::assertTrue($domain->getPublicSuffix()->isKnown()); self::assertTrue($domain->getPublicSuffix()->isICANN()); self::assertFalse($domain->getPublicSuffix()->isPrivate()); } - /** - * @covers ::resolve - * @covers ::getCookieDomain - * @covers ::validateDomain - * @covers ::findPublicSuffix - * @covers ::findPublicSuffixFromSection - * @covers \Pdp\PublicSuffix::isKnown - * @covers \Pdp\PublicSuffix::isICANN - * @covers \Pdp\PublicSuffix::isPrivate - * @covers \Pdp\DomainNameParser::parse - */ public function testIsSuffixValidFalseWithPunycoded(): void { $domain = $this->rules->resolve('www.example.xn--85x722f'); + self::assertFalse($domain->getPublicSuffix()->isKnown()); self::assertFalse($domain->getPublicSuffix()->isICANN()); self::assertFalse($domain->getPublicSuffix()->isPrivate()); } - /** - * @covers ::resolve - * @covers ::getICANNDomain - * @covers ::validateDomain - * @covers ::findPublicSuffix - * @covers ::findPublicSuffixFromSection - * @covers \Pdp\PublicSuffix::isKnown - * @covers \Pdp\PublicSuffix::isICANN - * @covers \Pdp\PublicSuffix::isPrivate - * @covers \Pdp\DomainNameParser::parse - */ public function testSubDomainIsNull(): void { $domain = $this->rules->resolve('ulb.ac.be'); + self::assertTrue($domain->getPublicSuffix()->isKnown()); self::assertTrue($domain->getPublicSuffix()->isICANN()); self::assertFalse($domain->getPublicSuffix()->isPrivate()); } - /** - * @covers ::resolve - * @covers ::getCookieDomain - * @covers ::validateDomain - * @covers \Pdp\DomainNameParser::parse - */ public function testWithExceptionName(): void { $domain = $this->rules->resolve('_b%C3%A9bé.be-'); + self::assertNull($domain->getContent()); } - /** - * @covers ::resolve - * @covers ::findPublicSuffix - * @covers ::findPublicSuffixFromSection - * @covers \Pdp\DomainNameParser::parse - */ public function testWithPrivateDomain(): void { $domain = $this->rules->resolve('thephpleague.github.io'); + self::assertTrue($domain->getPublicSuffix()->isKnown()); self::assertFalse($domain->getPublicSuffix()->isICANN()); self::assertTrue($domain->getPublicSuffix()->isPrivate()); self::assertSame('github.io', $domain->getPublicSuffix()->getContent()); } - /** - * @covers ::resolve - * @covers ::findPublicSuffix - * @covers ::findPublicSuffixFromSection - * @covers \Pdp\DomainNameParser::parse - */ public function testWithAbsoluteHostInvalid(): void { $domain = $this->rules->resolve('private.ulb.ac.be.'); + self::assertSame('private.ulb.ac.be.', $domain->getContent()); self::assertFalse($domain->getPublicSuffix()->isKnown()); self::assertFalse($domain->getPublicSuffix()->isICANN()); @@ -252,17 +175,10 @@ public function testWithAbsoluteHostInvalid(): void self::assertNull($domain->getPublicSuffix()->getContent()); } - /** - * @covers ::resolve - * @covers ::getPrivateDomain - * @covers ::validateDomain - * @covers ::findPublicSuffix - * @covers ::findPublicSuffixFromSection - * @covers \Pdp\DomainNameParser::parse - */ public function testWithPrivateDomainInvalid(): void { $domain = $this->rules->getPrivateDomain('private.ulb.ac.be'); + self::assertSame('private.ulb.ac.be', $domain->getContent()); self::assertFalse($domain->getPublicSuffix()->isKnown()); self::assertFalse($domain->getPublicSuffix()->isICANN()); @@ -270,17 +186,10 @@ public function testWithPrivateDomainInvalid(): void self::assertSame('be', $domain->getPublicSuffix()->getContent()); } - /** - * @covers ::resolve - * @covers ::getPrivateDomain - * @covers ::validateDomain - * @covers ::findPublicSuffix - * @covers ::findPublicSuffixFromSection - * @covers \Pdp\DomainNameParser::parse - */ public function testWithPrivateDomainValid(): void { $domain = $this->rules->getPrivateDomain('thephpleague.github.io'); + self::assertSame('thephpleague.github.io', $domain->getContent()); self::assertTrue($domain->getPublicSuffix()->isKnown()); self::assertFalse($domain->getPublicSuffix()->isICANN()); @@ -288,15 +197,10 @@ public function testWithPrivateDomainValid(): void self::assertSame('github.io', $domain->getPublicSuffix()->getContent()); } - /** - * @covers ::resolve - * @covers ::findPublicSuffix - * @covers ::findPublicSuffixFromSection - * @covers \Pdp\DomainNameParser::parse - */ public function testWithICANNDomainInvalid(): void { $domain = $this->rules->resolve('private.ulb.ac.be'); + self::assertSame('private.ulb.ac.be', $domain->getContent()); self::assertTrue($domain->getPublicSuffix()->isKnown()); self::assertTrue($domain->getPublicSuffix()->isICANN()); @@ -304,12 +208,6 @@ public function testWithICANNDomainInvalid(): void self::assertSame('ac.be', $domain->getPublicSuffix()->getContent()); } - /** - * @covers ::resolve - * @covers ::findPublicSuffix - * @covers ::findPublicSuffixFromSection - * @covers \Pdp\DomainNameParser::parse - */ public function testWithDomainObject(): void { $domain = new ResolvedDomain( @@ -318,6 +216,7 @@ public function testWithDomainObject(): void ); $newDomain = $this->rules->resolve($domain); + self::assertSame('private.ulb.ac.be', $domain->getContent()); self::assertTrue($domain->getPublicSuffix()->isKnown()); self::assertTrue($domain->getPublicSuffix()->isICANN()); @@ -326,10 +225,6 @@ public function testWithDomainObject(): void self::assertEquals($domain, $newDomain); } - /** - * @covers ::getCookieDomain - * @covers \Pdp\DomainNameParser::parse - */ public function testWithDomainInterfaceObject(): void { $domain = PublicSuffix::fromICANN('ulb.ac.be'); @@ -341,9 +236,6 @@ public function testWithDomainInterfaceObject(): void } /** - * @covers ::resolve - * @covers ::getICANNDomain - * @covers ::validateDomain * @dataProvider parseDataProvider * @param ?string $publicSuffix * @param ?string $registrableDomain @@ -357,10 +249,6 @@ public function testGetRegistrableDomain(?string $publicSuffix, ?string $registr } /** - * @covers ::resolve - * @covers ::getICANNDomain - * @covers ::validateDomain - * @covers \Pdp\DomainNameParser::parse * @dataProvider parseDataProvider * @param ?string $publicSuffix * @param ?string $registrableDomain @@ -374,11 +262,7 @@ public function testGetPublicSuffix(?string $publicSuffix, ?string $registrableD } /** - * @covers ::resolve - * @covers \Pdp\DomainNameParser::parse - * @covers \Pdp\Domain::getContent * @dataProvider parseDataProvider - * * @param ?string $publicSuffix * @param ?string $registrableDomain * @param ?string $expectedDomain @@ -580,9 +464,8 @@ public function validPublicSectionProvider(): iterable * on the domain name and checks the result is the public suffix expected." * * @see http://publicsuffix.org/list/ - * - * @param string|null $input Domain and public suffix - * @param string|null $expected Expected result + * @param ?string $input + * @param ?string $expected */ public function checkPublicSuffix(?string $input, ?string $expected): void { @@ -593,12 +476,7 @@ public function checkPublicSuffix(?string $input, ?string $expected): void * This test case is based on the test data linked at * http://publicsuffix.org/list/ and provided by Rob Strading of Comodo. * - * @see - * http://mxr.mozilla.org/mozilla-central/source/netwerk/test/unit/data/test_psl.txt?raw=1 - * - * @covers ::resolve - * @covers ::findPublicSuffixFromSection - * @covers \Pdp\DomainNameParser::parse + * @see http://mxr.mozilla.org/mozilla-central/source/netwerk/test/unit/data/test_psl.txt?raw=1 */ public function testPublicSuffixSpec(): void { @@ -704,10 +582,6 @@ public function testPublicSuffixSpec(): void $this->checkPublicSuffix('xn--fiqs8s', null); } - /** - * @covers ::getAsciiIDNAOption - * @covers ::getUnicodeIDNAOption - */ public function testResolveWithIDNAOptions(): void { $resolvedByDefault = $this->rules->resolve('foo.de'); @@ -728,10 +602,6 @@ public function testResolveWithIDNAOptions(): void } /** - * @covers ::getCookieDomain - * @covers ::getICANNDomain - * @covers ::getPrivateDomain - * * @dataProvider effectiveTLDProvider */ public function testEffectiveTLDResolution(string $host, string $cookieETLD, string $icannETLD, string $privateETLD): void diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index ed147bb6..584f1c7d 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -36,10 +36,7 @@ */ class TopLevelDomainsTest extends TestCase { - /** - * @var TopLevelDomains - */ - protected $topLevelDomains; + protected TopLevelDomains $topLevelDomains; public function setUp(): void { @@ -61,6 +58,7 @@ public function testCreateFromPath(): void ]); $topLevelDomains = TopLevelDomains::fromPath(__DIR__.'/data/tlds-alpha-by-domain.txt', $context); + self::assertEquals($this->topLevelDomains, $topLevelDomains); } @@ -70,6 +68,7 @@ public function testCreateFromPath(): void public function testCreateFromPathThrowsException(): void { self::expectException(UnableToLoadRootZoneDatabase::class); + TopLevelDomains::fromPath('/foo/bar.dat'); } @@ -80,12 +79,14 @@ public function testCreateFromPathThrowsException(): void public function testSetState(): void { $topLevelDomains = eval('return '.var_export($this->topLevelDomains, true).';'); + self::assertEquals($this->topLevelDomains, $topLevelDomains); } public function testGetterProperties(): void { $topLevelDomains = TopLevelDomains::fromPath(__DIR__.'/data/root_zones.dat'); + self::assertCount(15, $topLevelDomains); self::assertSame('2018082200', $topLevelDomains->getVersion()); self::assertEquals( @@ -105,13 +106,7 @@ public function testGetterProperties(): void } } - /** - * @covers ::getAsciiIDNAOption - * @covers ::getUnicodeIDNAOption - * @covers ::withAsciiIDNAOption - * @covers ::withUnicodeIDNAOption - */ - public function testwithIDNAOptions(): void + public function testWithIDNAOptions(): void { self::assertSame($this->topLevelDomains, $this->topLevelDomains->withAsciiIDNAOption( $this->topLevelDomains->getAsciiIDNAOption() @@ -187,12 +182,14 @@ public function testResolveWithUnResolvableDomain(): void public function testResolveWithUnregisteredTLD(): void { $collection = TopLevelDomains::fromPath(__DIR__.'/data/root_zones.dat'); + self::assertNull($collection->resolve('localhost.locale')->getPublicSuffix()->getContent()); } public function testResolveWithIDNAOptions(): void { $resolved = $this->topLevelDomains->resolve('foo.de'); + self::assertSame( [IDNA_DEFAULT, IDNA_DEFAULT], [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption()] @@ -204,7 +201,9 @@ public function testResolveWithIDNAOptions(): void IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE ); + $resolved = $collection->resolve('foo.de'); + self::assertSame( [IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE], [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption()] diff --git a/tests/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache b/tests/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache deleted file mode 100644 index 440985f6..00000000 --- a/tests/data/pdp-PSL_FULL_5a3cc7f81795bb2e48e848af42d287b4.cache +++ /dev/null @@ -1 +0,0 @@ -s:112551:"{"ICANN_DOMAINS":{"ac":{"com":[],"edu":[],"gov":[],"net":[],"mil":[],"org":[]},"ad":{"nom":[]},"ae":{"co":[],"net":[],"org":[],"sch":[],"ac":[],"gov":[],"mil":[]},"aero":{"accident-investigation":[],"accident-prevention":[],"aerobatic":[],"aeroclub":[],"aerodrome":[],"agents":[],"aircraft":[],"airline":[],"airport":[],"air-surveillance":[],"airtraffic":[],"air-traffic-control":[],"ambulance":[],"amusement":[],"association":[],"author":[],"ballooning":[],"broker":[],"caa":[],"cargo":[],"catering":[],"certification":[],"championship":[],"charter":[],"civilaviation":[],"club":[],"conference":[],"consultant":[],"consulting":[],"control":[],"council":[],"crew":[],"design":[],"dgca":[],"educator":[],"emergency":[],"engine":[],"engineer":[],"entertainment":[],"equipment":[],"exchange":[],"express":[],"federation":[],"flight":[],"fuel":[],"gliding":[],"government":[],"groundhandling":[],"group":[],"hanggliding":[],"homebuilt":[],"insurance":[],"journal":[],"journalist":[],"leasing":[],"logistics":[],"magazine":[],"maintenance":[],"media":[],"microlight":[],"modelling":[],"navigation":[],"parachuting":[],"paragliding":[],"passenger-association":[],"pilot":[],"press":[],"production":[],"recreation":[],"repbody":[],"res":[],"research":[],"rotorcraft":[],"safety":[],"scientist":[],"services":[],"show":[],"skydiving":[],"software":[],"student":[],"trader":[],"trading":[],"trainer":[],"union":[],"workinggroup":[],"works":[]},"af":{"gov":[],"com":[],"org":[],"net":[],"edu":[]},"ag":{"com":[],"org":[],"net":[],"co":[],"nom":[]},"ai":{"off":[],"com":[],"net":[],"org":[]},"al":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"am":{"co":[],"com":[],"commune":[],"net":[],"org":[]},"ao":{"ed":[],"gv":[],"og":[],"co":[],"pb":[],"it":[]},"aq":[],"ar":{"com":[],"edu":[],"gob":[],"gov":[],"int":[],"mil":[],"musica":[],"net":[],"org":[],"tur":[]},"arpa":{"e164":[],"in-addr":[],"ip6":[],"iris":[],"uri":[],"urn":[]},"as":{"gov":[]},"asia":[],"at":{"ac":{"sth":[]},"co":[],"gv":[],"or":[]},"au":{"com":[],"net":[],"org":[],"edu":{"act":[],"catholic":[],"nsw":{"schools":[]},"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"gov":{"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"asn":[],"id":[],"info":[],"conf":[],"oz":[],"act":[],"nsw":[],"nt":[],"qld":[],"sa":[],"tas":[],"vic":[],"wa":[]},"aw":{"com":[]},"ax":[],"az":{"com":[],"net":[],"int":[],"gov":[],"org":[],"edu":[],"info":[],"pp":[],"mil":[],"name":[],"pro":[],"biz":[]},"ba":{"com":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"bb":{"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"store":[],"tv":[]},"bd":{"*":[]},"be":{"ac":[]},"bf":{"gov":[]},"bg":{"a":[],"b":[],"c":[],"d":[],"e":[],"f":[],"g":[],"h":[],"i":[],"j":[],"k":[],"l":[],"m":[],"n":[],"o":[],"p":[],"q":[],"r":[],"s":[],"t":[],"u":[],"v":[],"w":[],"x":[],"y":[],"z":[],"0":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[],"9":[]},"bh":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"bi":{"co":[],"com":[],"edu":[],"or":[],"org":[]},"biz":[],"bj":{"asso":[],"barreau":[],"gouv":[]},"bm":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bn":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bo":{"com":[],"edu":[],"gob":[],"int":[],"org":[],"net":[],"mil":[],"tv":[],"web":[],"academia":[],"agro":[],"arte":[],"blog":[],"bolivia":[],"ciencia":[],"cooperativa":[],"democracia":[],"deporte":[],"ecologia":[],"economia":[],"empresa":[],"indigena":[],"industria":[],"info":[],"medicina":[],"movimiento":[],"musica":[],"natural":[],"nombre":[],"noticias":[],"patria":[],"politica":[],"profesional":[],"plurinacional":[],"pueblo":[],"revista":[],"salud":[],"tecnologia":[],"tksat":[],"transporte":[],"wiki":[]},"br":{"9guacu":[],"abc":[],"adm":[],"adv":[],"agr":[],"aju":[],"am":[],"anani":[],"aparecida":[],"app":[],"arq":[],"art":[],"ato":[],"b":[],"barueri":[],"belem":[],"bhz":[],"bib":[],"bio":[],"blog":[],"bmd":[],"boavista":[],"bsb":[],"campinagrande":[],"campinas":[],"caxias":[],"cim":[],"cng":[],"cnt":[],"com":[],"contagem":[],"coop":[],"coz":[],"cri":[],"cuiaba":[],"curitiba":[],"def":[],"des":[],"det":[],"dev":[],"ecn":[],"eco":[],"edu":[],"emp":[],"enf":[],"eng":[],"esp":[],"etc":[],"eti":[],"far":[],"feira":[],"flog":[],"floripa":[],"fm":[],"fnd":[],"fortal":[],"fot":[],"foz":[],"fst":[],"g12":[],"geo":[],"ggf":[],"goiania":[],"gov":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]},"gru":[],"imb":[],"ind":[],"inf":[],"jab":[],"jampa":[],"jdf":[],"joinville":[],"jor":[],"jus":[],"leg":[],"lel":[],"log":[],"londrina":[],"macapa":[],"maceio":[],"manaus":[],"maringa":[],"mat":[],"med":[],"mil":[],"morena":[],"mp":[],"mus":[],"natal":[],"net":[],"niteroi":[],"nom":{"*":[]},"not":[],"ntr":[],"odo":[],"ong":[],"org":[],"osasco":[],"palmas":[],"poa":[],"ppg":[],"pro":[],"psc":[],"psi":[],"pvh":[],"qsl":[],"radio":[],"rec":[],"recife":[],"rep":[],"ribeirao":[],"rio":[],"riobranco":[],"riopreto":[],"salvador":[],"sampa":[],"santamaria":[],"santoandre":[],"saobernardo":[],"saogonca":[],"seg":[],"sjc":[],"slg":[],"slz":[],"sorocaba":[],"srv":[],"taxi":[],"tc":[],"tec":[],"teo":[],"the":[],"tmp":[],"trd":[],"tur":[],"tv":[],"udi":[],"vet":[],"vix":[],"vlog":[],"wiki":[],"zlg":[]},"bs":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"bt":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"bv":[],"bw":{"co":[],"org":[]},"by":{"gov":[],"mil":[],"com":[],"of":[]},"bz":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"ca":{"ab":[],"bc":[],"mb":[],"nb":[],"nf":[],"nl":[],"ns":[],"nt":[],"nu":[],"on":[],"pe":[],"qc":[],"sk":[],"yk":[],"gc":[]},"cat":[],"cc":[],"cd":{"gov":[]},"cf":[],"cg":[],"ch":[],"ci":{"org":[],"or":[],"com":[],"co":[],"edu":[],"ed":[],"ac":[],"net":[],"go":[],"asso":[],"xn--aroport-bya":[],"int":[],"presse":[],"md":[],"gouv":[]},"ck":{"*":[],"www":{"!":""}},"cl":{"aprendemas":[],"co":[],"gob":[],"gov":[],"mil":[]},"cm":{"co":[],"com":[],"gov":[],"net":[]},"cn":{"ac":[],"com":[],"edu":[],"gov":[],"net":[],"org":[],"mil":[],"xn--55qx5d":[],"xn--io0a7i":[],"xn--od0alg":[],"ah":[],"bj":[],"cq":[],"fj":[],"gd":[],"gs":[],"gz":[],"gx":[],"ha":[],"hb":[],"he":[],"hi":[],"hl":[],"hn":[],"jl":[],"js":[],"jx":[],"ln":[],"nm":[],"nx":[],"qh":[],"sc":[],"sd":[],"sh":[],"sn":[],"sx":[],"tj":[],"xj":[],"xz":[],"yn":[],"zj":[],"hk":[],"mo":[],"tw":[]},"co":{"arts":[],"com":[],"edu":[],"firm":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"rec":[],"web":[]},"com":[],"coop":[],"cr":{"ac":[],"co":[],"ed":[],"fi":[],"go":[],"or":[],"sa":[]},"cu":{"com":[],"edu":[],"org":[],"net":[],"gov":[],"inf":[]},"cv":[],"cw":{"com":[],"edu":[],"net":[],"org":[]},"cx":{"gov":[]},"cy":{"ac":[],"biz":[],"com":[],"ekloges":[],"gov":[],"ltd":[],"name":[],"net":[],"org":[],"parliament":[],"press":[],"pro":[],"tm":[]},"cz":[],"de":[],"dj":[],"dk":[],"dm":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"do":{"art":[],"com":[],"edu":[],"gob":[],"gov":[],"mil":[],"net":[],"org":[],"sld":[],"web":[]},"dz":{"com":[],"org":[],"net":[],"gov":[],"edu":[],"asso":[],"pol":[],"art":[]},"ec":{"com":[],"info":[],"net":[],"fin":[],"k12":[],"med":[],"pro":[],"org":[],"edu":[],"gov":[],"gob":[],"mil":[]},"edu":[],"ee":{"edu":[],"gov":[],"riik":[],"lib":[],"med":[],"com":[],"pri":[],"aip":[],"org":[],"fie":[]},"eg":{"com":[],"edu":[],"eun":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sci":[]},"er":{"*":[]},"es":{"com":[],"nom":[],"org":[],"gob":[],"edu":[]},"et":{"com":[],"gov":[],"org":[],"edu":[],"biz":[],"name":[],"info":[],"net":[]},"eu":[],"fi":{"aland":[]},"fj":{"ac":[],"biz":[],"com":[],"gov":[],"info":[],"mil":[],"name":[],"net":[],"org":[],"pro":[]},"fk":{"*":[]},"fm":[],"fo":[],"fr":{"asso":[],"com":[],"gouv":[],"nom":[],"prd":[],"tm":[],"aeroport":[],"avocat":[],"avoues":[],"cci":[],"chambagri":[],"chirurgiens-dentistes":[],"experts-comptables":[],"geometre-expert":[],"greta":[],"huissier-justice":[],"medecin":[],"notaires":[],"pharmacien":[],"port":[],"veterinaire":[]},"ga":[],"gb":[],"gd":[],"ge":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"net":[],"pvt":[]},"gf":[],"gg":{"co":[],"net":[],"org":[]},"gh":{"com":[],"edu":[],"gov":[],"org":[],"mil":[]},"gi":{"com":[],"ltd":[],"gov":[],"mod":[],"edu":[],"org":[]},"gl":{"co":[],"com":[],"edu":[],"net":[],"org":[]},"gm":[],"gn":{"ac":[],"com":[],"edu":[],"gov":[],"org":[],"net":[]},"gov":[],"gp":{"com":[],"net":[],"mobi":[],"edu":[],"org":[],"asso":[]},"gq":[],"gr":{"com":[],"edu":[],"net":[],"org":[],"gov":[]},"gs":[],"gt":{"com":[],"edu":[],"gob":[],"ind":[],"mil":[],"net":[],"org":[]},"gu":{"com":[],"edu":[],"gov":[],"guam":[],"info":[],"net":[],"org":[],"web":[]},"gw":[],"gy":{"co":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"hk":{"com":[],"edu":[],"gov":[],"idv":[],"net":[],"org":[],"xn--55qx5d":[],"xn--wcvs22d":[],"xn--lcvr32d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--ciqpn":[],"xn--gmq050i":[],"xn--zf0avx":[],"xn--io0a7i":[],"xn--mk0axi":[],"xn--od0alg":[],"xn--od0aq3b":[],"xn--tn0ag":[],"xn--uc0atv":[],"xn--uc0ay4a":[]},"hm":[],"hn":{"com":[],"edu":[],"org":[],"net":[],"mil":[],"gob":[]},"hr":{"iz":[],"from":[],"name":[],"com":[]},"ht":{"com":[],"shop":[],"firm":[],"info":[],"adult":[],"net":[],"pro":[],"org":[],"med":[],"art":[],"coop":[],"pol":[],"asso":[],"edu":[],"rel":[],"gouv":[],"perso":[]},"hu":{"co":[],"info":[],"org":[],"priv":[],"sport":[],"tm":[],"2000":[],"agrar":[],"bolt":[],"casino":[],"city":[],"erotica":[],"erotika":[],"film":[],"forum":[],"games":[],"hotel":[],"ingatlan":[],"jogasz":[],"konyvelo":[],"lakas":[],"media":[],"news":[],"reklam":[],"sex":[],"shop":[],"suli":[],"szex":[],"tozsde":[],"utazas":[],"video":[]},"id":{"ac":[],"biz":[],"co":[],"desa":[],"go":[],"mil":[],"my":[],"net":[],"or":[],"ponpes":[],"sch":[],"web":[]},"ie":{"gov":[]},"il":{"ac":[],"co":[],"gov":[],"idf":[],"k12":[],"muni":[],"net":[],"org":[]},"im":{"ac":[],"co":{"ltd":[],"plc":[]},"com":[],"net":[],"org":[],"tt":[],"tv":[]},"in":{"co":[],"firm":[],"net":[],"org":[],"gen":[],"ind":[],"nic":[],"ac":[],"edu":[],"res":[],"gov":[],"mil":[]},"info":[],"int":{"eu":[]},"io":{"com":[]},"iq":{"gov":[],"edu":[],"mil":[],"com":[],"org":[],"net":[]},"ir":{"ac":[],"co":[],"gov":[],"id":[],"net":[],"org":[],"sch":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[]},"is":{"net":[],"com":[],"edu":[],"gov":[],"org":[],"int":[]},"it":{"gov":[],"edu":[],"abr":[],"abruzzo":[],"aosta-valley":[],"aostavalley":[],"bas":[],"basilicata":[],"cal":[],"calabria":[],"cam":[],"campania":[],"emilia-romagna":[],"emiliaromagna":[],"emr":[],"friuli-v-giulia":[],"friuli-ve-giulia":[],"friuli-vegiulia":[],"friuli-venezia-giulia":[],"friuli-veneziagiulia":[],"friuli-vgiulia":[],"friuliv-giulia":[],"friulive-giulia":[],"friulivegiulia":[],"friulivenezia-giulia":[],"friuliveneziagiulia":[],"friulivgiulia":[],"fvg":[],"laz":[],"lazio":[],"lig":[],"liguria":[],"lom":[],"lombardia":[],"lombardy":[],"lucania":[],"mar":[],"marche":[],"mol":[],"molise":[],"piedmont":[],"piemonte":[],"pmn":[],"pug":[],"puglia":[],"sar":[],"sardegna":[],"sardinia":[],"sic":[],"sicilia":[],"sicily":[],"taa":[],"tos":[],"toscana":[],"trentin-sud-tirol":[],"xn--trentin-sd-tirol-rzb":[],"trentin-sudtirol":[],"xn--trentin-sdtirol-7vb":[],"trentin-sued-tirol":[],"trentin-suedtirol":[],"trentino-a-adige":[],"trentino-aadige":[],"trentino-alto-adige":[],"trentino-altoadige":[],"trentino-s-tirol":[],"trentino-stirol":[],"trentino-sud-tirol":[],"xn--trentino-sd-tirol-c3b":[],"trentino-sudtirol":[],"xn--trentino-sdtirol-szb":[],"trentino-sued-tirol":[],"trentino-suedtirol":[],"trentino":[],"trentinoa-adige":[],"trentinoaadige":[],"trentinoalto-adige":[],"trentinoaltoadige":[],"trentinos-tirol":[],"trentinostirol":[],"trentinosud-tirol":[],"xn--trentinosd-tirol-rzb":[],"trentinosudtirol":[],"xn--trentinosdtirol-7vb":[],"trentinosued-tirol":[],"trentinosuedtirol":[],"trentinsud-tirol":[],"xn--trentinsd-tirol-6vb":[],"trentinsudtirol":[],"xn--trentinsdtirol-nsb":[],"trentinsued-tirol":[],"trentinsuedtirol":[],"tuscany":[],"umb":[],"umbria":[],"val-d-aosta":[],"val-daosta":[],"vald-aosta":[],"valdaosta":[],"valle-aosta":[],"valle-d-aosta":[],"valle-daosta":[],"valleaosta":[],"valled-aosta":[],"valledaosta":[],"vallee-aoste":[],"xn--valle-aoste-ebb":[],"vallee-d-aoste":[],"xn--valle-d-aoste-ehb":[],"valleeaoste":[],"xn--valleaoste-e7a":[],"valleedaoste":[],"xn--valledaoste-ebb":[],"vao":[],"vda":[],"ven":[],"veneto":[],"ag":[],"agrigento":[],"al":[],"alessandria":[],"alto-adige":[],"altoadige":[],"an":[],"ancona":[],"andria-barletta-trani":[],"andria-trani-barletta":[],"andriabarlettatrani":[],"andriatranibarletta":[],"ao":[],"aosta":[],"aoste":[],"ap":[],"aq":[],"aquila":[],"ar":[],"arezzo":[],"ascoli-piceno":[],"ascolipiceno":[],"asti":[],"at":[],"av":[],"avellino":[],"ba":[],"balsan-sudtirol":[],"xn--balsan-sdtirol-nsb":[],"balsan-suedtirol":[],"balsan":[],"bari":[],"barletta-trani-andria":[],"barlettatraniandria":[],"belluno":[],"benevento":[],"bergamo":[],"bg":[],"bi":[],"biella":[],"bl":[],"bn":[],"bo":[],"bologna":[],"bolzano-altoadige":[],"bolzano":[],"bozen-sudtirol":[],"xn--bozen-sdtirol-2ob":[],"bozen-suedtirol":[],"bozen":[],"br":[],"brescia":[],"brindisi":[],"bs":[],"bt":[],"bulsan-sudtirol":[],"xn--bulsan-sdtirol-nsb":[],"bulsan-suedtirol":[],"bulsan":[],"bz":[],"ca":[],"cagliari":[],"caltanissetta":[],"campidano-medio":[],"campidanomedio":[],"campobasso":[],"carbonia-iglesias":[],"carboniaiglesias":[],"carrara-massa":[],"carraramassa":[],"caserta":[],"catania":[],"catanzaro":[],"cb":[],"ce":[],"cesena-forli":[],"xn--cesena-forl-mcb":[],"cesenaforli":[],"xn--cesenaforl-i8a":[],"ch":[],"chieti":[],"ci":[],"cl":[],"cn":[],"co":[],"como":[],"cosenza":[],"cr":[],"cremona":[],"crotone":[],"cs":[],"ct":[],"cuneo":[],"cz":[],"dell-ogliastra":[],"dellogliastra":[],"en":[],"enna":[],"fc":[],"fe":[],"fermo":[],"ferrara":[],"fg":[],"fi":[],"firenze":[],"florence":[],"fm":[],"foggia":[],"forli-cesena":[],"xn--forl-cesena-fcb":[],"forlicesena":[],"xn--forlcesena-c8a":[],"fr":[],"frosinone":[],"ge":[],"genoa":[],"genova":[],"go":[],"gorizia":[],"gr":[],"grosseto":[],"iglesias-carbonia":[],"iglesiascarbonia":[],"im":[],"imperia":[],"is":[],"isernia":[],"kr":[],"la-spezia":[],"laquila":[],"laspezia":[],"latina":[],"lc":[],"le":[],"lecce":[],"lecco":[],"li":[],"livorno":[],"lo":[],"lodi":[],"lt":[],"lu":[],"lucca":[],"macerata":[],"mantova":[],"massa-carrara":[],"massacarrara":[],"matera":[],"mb":[],"mc":[],"me":[],"medio-campidano":[],"mediocampidano":[],"messina":[],"mi":[],"milan":[],"milano":[],"mn":[],"mo":[],"modena":[],"monza-brianza":[],"monza-e-della-brianza":[],"monza":[],"monzabrianza":[],"monzaebrianza":[],"monzaedellabrianza":[],"ms":[],"mt":[],"na":[],"naples":[],"napoli":[],"no":[],"novara":[],"nu":[],"nuoro":[],"og":[],"ogliastra":[],"olbia-tempio":[],"olbiatempio":[],"or":[],"oristano":[],"ot":[],"pa":[],"padova":[],"padua":[],"palermo":[],"parma":[],"pavia":[],"pc":[],"pd":[],"pe":[],"perugia":[],"pesaro-urbino":[],"pesarourbino":[],"pescara":[],"pg":[],"pi":[],"piacenza":[],"pisa":[],"pistoia":[],"pn":[],"po":[],"pordenone":[],"potenza":[],"pr":[],"prato":[],"pt":[],"pu":[],"pv":[],"pz":[],"ra":[],"ragusa":[],"ravenna":[],"rc":[],"re":[],"reggio-calabria":[],"reggio-emilia":[],"reggiocalabria":[],"reggioemilia":[],"rg":[],"ri":[],"rieti":[],"rimini":[],"rm":[],"rn":[],"ro":[],"roma":[],"rome":[],"rovigo":[],"sa":[],"salerno":[],"sassari":[],"savona":[],"si":[],"siena":[],"siracusa":[],"so":[],"sondrio":[],"sp":[],"sr":[],"ss":[],"suedtirol":[],"xn--sdtirol-n2a":[],"sv":[],"ta":[],"taranto":[],"te":[],"tempio-olbia":[],"tempioolbia":[],"teramo":[],"terni":[],"tn":[],"to":[],"torino":[],"tp":[],"tr":[],"trani-andria-barletta":[],"trani-barletta-andria":[],"traniandriabarletta":[],"tranibarlettaandria":[],"trapani":[],"trento":[],"treviso":[],"trieste":[],"ts":[],"turin":[],"tv":[],"ud":[],"udine":[],"urbino-pesaro":[],"urbinopesaro":[],"va":[],"varese":[],"vb":[],"vc":[],"ve":[],"venezia":[],"venice":[],"verbania":[],"vercelli":[],"verona":[],"vi":[],"vibo-valentia":[],"vibovalentia":[],"vicenza":[],"viterbo":[],"vr":[],"vs":[],"vt":[],"vv":[]},"je":{"co":[],"net":[],"org":[]},"jm":{"*":[]},"jo":{"com":[],"org":[],"net":[],"edu":[],"sch":[],"gov":[],"mil":[],"name":[]},"jobs":[],"jp":{"ac":[],"ad":[],"co":[],"ed":[],"go":[],"gr":[],"lg":[],"ne":[],"or":[],"aichi":{"aisai":[],"ama":[],"anjo":[],"asuke":[],"chiryu":[],"chita":[],"fuso":[],"gamagori":[],"handa":[],"hazu":[],"hekinan":[],"higashiura":[],"ichinomiya":[],"inazawa":[],"inuyama":[],"isshiki":[],"iwakura":[],"kanie":[],"kariya":[],"kasugai":[],"kira":[],"kiyosu":[],"komaki":[],"konan":[],"kota":[],"mihama":[],"miyoshi":[],"nishio":[],"nisshin":[],"obu":[],"oguchi":[],"oharu":[],"okazaki":[],"owariasahi":[],"seto":[],"shikatsu":[],"shinshiro":[],"shitara":[],"tahara":[],"takahama":[],"tobishima":[],"toei":[],"togo":[],"tokai":[],"tokoname":[],"toyoake":[],"toyohashi":[],"toyokawa":[],"toyone":[],"toyota":[],"tsushima":[],"yatomi":[]},"akita":{"akita":[],"daisen":[],"fujisato":[],"gojome":[],"hachirogata":[],"happou":[],"higashinaruse":[],"honjo":[],"honjyo":[],"ikawa":[],"kamikoani":[],"kamioka":[],"katagami":[],"kazuno":[],"kitaakita":[],"kosaka":[],"kyowa":[],"misato":[],"mitane":[],"moriyoshi":[],"nikaho":[],"noshiro":[],"odate":[],"oga":[],"ogata":[],"semboku":[],"yokote":[],"yurihonjo":[]},"aomori":{"aomori":[],"gonohe":[],"hachinohe":[],"hashikami":[],"hiranai":[],"hirosaki":[],"itayanagi":[],"kuroishi":[],"misawa":[],"mutsu":[],"nakadomari":[],"noheji":[],"oirase":[],"owani":[],"rokunohe":[],"sannohe":[],"shichinohe":[],"shingo":[],"takko":[],"towada":[],"tsugaru":[],"tsuruta":[]},"chiba":{"abiko":[],"asahi":[],"chonan":[],"chosei":[],"choshi":[],"chuo":[],"funabashi":[],"futtsu":[],"hanamigawa":[],"ichihara":[],"ichikawa":[],"ichinomiya":[],"inzai":[],"isumi":[],"kamagaya":[],"kamogawa":[],"kashiwa":[],"katori":[],"katsuura":[],"kimitsu":[],"kisarazu":[],"kozaki":[],"kujukuri":[],"kyonan":[],"matsudo":[],"midori":[],"mihama":[],"minamiboso":[],"mobara":[],"mutsuzawa":[],"nagara":[],"nagareyama":[],"narashino":[],"narita":[],"noda":[],"oamishirasato":[],"omigawa":[],"onjuku":[],"otaki":[],"sakae":[],"sakura":[],"shimofusa":[],"shirako":[],"shiroi":[],"shisui":[],"sodegaura":[],"sosa":[],"tako":[],"tateyama":[],"togane":[],"tohnosho":[],"tomisato":[],"urayasu":[],"yachimata":[],"yachiyo":[],"yokaichiba":[],"yokoshibahikari":[],"yotsukaido":[]},"ehime":{"ainan":[],"honai":[],"ikata":[],"imabari":[],"iyo":[],"kamijima":[],"kihoku":[],"kumakogen":[],"masaki":[],"matsuno":[],"matsuyama":[],"namikata":[],"niihama":[],"ozu":[],"saijo":[],"seiyo":[],"shikokuchuo":[],"tobe":[],"toon":[],"uchiko":[],"uwajima":[],"yawatahama":[]},"fukui":{"echizen":[],"eiheiji":[],"fukui":[],"ikeda":[],"katsuyama":[],"mihama":[],"minamiechizen":[],"obama":[],"ohi":[],"ono":[],"sabae":[],"sakai":[],"takahama":[],"tsuruga":[],"wakasa":[]},"fukuoka":{"ashiya":[],"buzen":[],"chikugo":[],"chikuho":[],"chikujo":[],"chikushino":[],"chikuzen":[],"chuo":[],"dazaifu":[],"fukuchi":[],"hakata":[],"higashi":[],"hirokawa":[],"hisayama":[],"iizuka":[],"inatsuki":[],"kaho":[],"kasuga":[],"kasuya":[],"kawara":[],"keisen":[],"koga":[],"kurate":[],"kurogi":[],"kurume":[],"minami":[],"miyako":[],"miyama":[],"miyawaka":[],"mizumaki":[],"munakata":[],"nakagawa":[],"nakama":[],"nishi":[],"nogata":[],"ogori":[],"okagaki":[],"okawa":[],"oki":[],"omuta":[],"onga":[],"onojo":[],"oto":[],"saigawa":[],"sasaguri":[],"shingu":[],"shinyoshitomi":[],"shonai":[],"soeda":[],"sue":[],"tachiarai":[],"tagawa":[],"takata":[],"toho":[],"toyotsu":[],"tsuiki":[],"ukiha":[],"umi":[],"usui":[],"yamada":[],"yame":[],"yanagawa":[],"yukuhashi":[]},"fukushima":{"aizubange":[],"aizumisato":[],"aizuwakamatsu":[],"asakawa":[],"bandai":[],"date":[],"fukushima":[],"furudono":[],"futaba":[],"hanawa":[],"higashi":[],"hirata":[],"hirono":[],"iitate":[],"inawashiro":[],"ishikawa":[],"iwaki":[],"izumizaki":[],"kagamiishi":[],"kaneyama":[],"kawamata":[],"kitakata":[],"kitashiobara":[],"koori":[],"koriyama":[],"kunimi":[],"miharu":[],"mishima":[],"namie":[],"nango":[],"nishiaizu":[],"nishigo":[],"okuma":[],"omotego":[],"ono":[],"otama":[],"samegawa":[],"shimogo":[],"shirakawa":[],"showa":[],"soma":[],"sukagawa":[],"taishin":[],"tamakawa":[],"tanagura":[],"tenei":[],"yabuki":[],"yamato":[],"yamatsuri":[],"yanaizu":[],"yugawa":[]},"gifu":{"anpachi":[],"ena":[],"gifu":[],"ginan":[],"godo":[],"gujo":[],"hashima":[],"hichiso":[],"hida":[],"higashishirakawa":[],"ibigawa":[],"ikeda":[],"kakamigahara":[],"kani":[],"kasahara":[],"kasamatsu":[],"kawaue":[],"kitagata":[],"mino":[],"minokamo":[],"mitake":[],"mizunami":[],"motosu":[],"nakatsugawa":[],"ogaki":[],"sakahogi":[],"seki":[],"sekigahara":[],"shirakawa":[],"tajimi":[],"takayama":[],"tarui":[],"toki":[],"tomika":[],"wanouchi":[],"yamagata":[],"yaotsu":[],"yoro":[]},"gunma":{"annaka":[],"chiyoda":[],"fujioka":[],"higashiagatsuma":[],"isesaki":[],"itakura":[],"kanna":[],"kanra":[],"katashina":[],"kawaba":[],"kiryu":[],"kusatsu":[],"maebashi":[],"meiwa":[],"midori":[],"minakami":[],"naganohara":[],"nakanojo":[],"nanmoku":[],"numata":[],"oizumi":[],"ora":[],"ota":[],"shibukawa":[],"shimonita":[],"shinto":[],"showa":[],"takasaki":[],"takayama":[],"tamamura":[],"tatebayashi":[],"tomioka":[],"tsukiyono":[],"tsumagoi":[],"ueno":[],"yoshioka":[]},"hiroshima":{"asaminami":[],"daiwa":[],"etajima":[],"fuchu":[],"fukuyama":[],"hatsukaichi":[],"higashihiroshima":[],"hongo":[],"jinsekikogen":[],"kaita":[],"kui":[],"kumano":[],"kure":[],"mihara":[],"miyoshi":[],"naka":[],"onomichi":[],"osakikamijima":[],"otake":[],"saka":[],"sera":[],"seranishi":[],"shinichi":[],"shobara":[],"takehara":[]},"hokkaido":{"abashiri":[],"abira":[],"aibetsu":[],"akabira":[],"akkeshi":[],"asahikawa":[],"ashibetsu":[],"ashoro":[],"assabu":[],"atsuma":[],"bibai":[],"biei":[],"bifuka":[],"bihoro":[],"biratori":[],"chippubetsu":[],"chitose":[],"date":[],"ebetsu":[],"embetsu":[],"eniwa":[],"erimo":[],"esan":[],"esashi":[],"fukagawa":[],"fukushima":[],"furano":[],"furubira":[],"haboro":[],"hakodate":[],"hamatonbetsu":[],"hidaka":[],"higashikagura":[],"higashikawa":[],"hiroo":[],"hokuryu":[],"hokuto":[],"honbetsu":[],"horokanai":[],"horonobe":[],"ikeda":[],"imakane":[],"ishikari":[],"iwamizawa":[],"iwanai":[],"kamifurano":[],"kamikawa":[],"kamishihoro":[],"kamisunagawa":[],"kamoenai":[],"kayabe":[],"kembuchi":[],"kikonai":[],"kimobetsu":[],"kitahiroshima":[],"kitami":[],"kiyosato":[],"koshimizu":[],"kunneppu":[],"kuriyama":[],"kuromatsunai":[],"kushiro":[],"kutchan":[],"kyowa":[],"mashike":[],"matsumae":[],"mikasa":[],"minamifurano":[],"mombetsu":[],"moseushi":[],"mukawa":[],"muroran":[],"naie":[],"nakagawa":[],"nakasatsunai":[],"nakatombetsu":[],"nanae":[],"nanporo":[],"nayoro":[],"nemuro":[],"niikappu":[],"niki":[],"nishiokoppe":[],"noboribetsu":[],"numata":[],"obihiro":[],"obira":[],"oketo":[],"okoppe":[],"otaru":[],"otobe":[],"otofuke":[],"otoineppu":[],"oumu":[],"ozora":[],"pippu":[],"rankoshi":[],"rebun":[],"rikubetsu":[],"rishiri":[],"rishirifuji":[],"saroma":[],"sarufutsu":[],"shakotan":[],"shari":[],"shibecha":[],"shibetsu":[],"shikabe":[],"shikaoi":[],"shimamaki":[],"shimizu":[],"shimokawa":[],"shinshinotsu":[],"shintoku":[],"shiranuka":[],"shiraoi":[],"shiriuchi":[],"sobetsu":[],"sunagawa":[],"taiki":[],"takasu":[],"takikawa":[],"takinoue":[],"teshikaga":[],"tobetsu":[],"tohma":[],"tomakomai":[],"tomari":[],"toya":[],"toyako":[],"toyotomi":[],"toyoura":[],"tsubetsu":[],"tsukigata":[],"urakawa":[],"urausu":[],"uryu":[],"utashinai":[],"wakkanai":[],"wassamu":[],"yakumo":[],"yoichi":[]},"hyogo":{"aioi":[],"akashi":[],"ako":[],"amagasaki":[],"aogaki":[],"asago":[],"ashiya":[],"awaji":[],"fukusaki":[],"goshiki":[],"harima":[],"himeji":[],"ichikawa":[],"inagawa":[],"itami":[],"kakogawa":[],"kamigori":[],"kamikawa":[],"kasai":[],"kasuga":[],"kawanishi":[],"miki":[],"minamiawaji":[],"nishinomiya":[],"nishiwaki":[],"ono":[],"sanda":[],"sannan":[],"sasayama":[],"sayo":[],"shingu":[],"shinonsen":[],"shiso":[],"sumoto":[],"taishi":[],"taka":[],"takarazuka":[],"takasago":[],"takino":[],"tamba":[],"tatsuno":[],"toyooka":[],"yabu":[],"yashiro":[],"yoka":[],"yokawa":[]},"ibaraki":{"ami":[],"asahi":[],"bando":[],"chikusei":[],"daigo":[],"fujishiro":[],"hitachi":[],"hitachinaka":[],"hitachiomiya":[],"hitachiota":[],"ibaraki":[],"ina":[],"inashiki":[],"itako":[],"iwama":[],"joso":[],"kamisu":[],"kasama":[],"kashima":[],"kasumigaura":[],"koga":[],"miho":[],"mito":[],"moriya":[],"naka":[],"namegata":[],"oarai":[],"ogawa":[],"omitama":[],"ryugasaki":[],"sakai":[],"sakuragawa":[],"shimodate":[],"shimotsuma":[],"shirosato":[],"sowa":[],"suifu":[],"takahagi":[],"tamatsukuri":[],"tokai":[],"tomobe":[],"tone":[],"toride":[],"tsuchiura":[],"tsukuba":[],"uchihara":[],"ushiku":[],"yachiyo":[],"yamagata":[],"yawara":[],"yuki":[]},"ishikawa":{"anamizu":[],"hakui":[],"hakusan":[],"kaga":[],"kahoku":[],"kanazawa":[],"kawakita":[],"komatsu":[],"nakanoto":[],"nanao":[],"nomi":[],"nonoichi":[],"noto":[],"shika":[],"suzu":[],"tsubata":[],"tsurugi":[],"uchinada":[],"wajima":[]},"iwate":{"fudai":[],"fujisawa":[],"hanamaki":[],"hiraizumi":[],"hirono":[],"ichinohe":[],"ichinoseki":[],"iwaizumi":[],"iwate":[],"joboji":[],"kamaishi":[],"kanegasaki":[],"karumai":[],"kawai":[],"kitakami":[],"kuji":[],"kunohe":[],"kuzumaki":[],"miyako":[],"mizusawa":[],"morioka":[],"ninohe":[],"noda":[],"ofunato":[],"oshu":[],"otsuchi":[],"rikuzentakata":[],"shiwa":[],"shizukuishi":[],"sumita":[],"tanohata":[],"tono":[],"yahaba":[],"yamada":[]},"kagawa":{"ayagawa":[],"higashikagawa":[],"kanonji":[],"kotohira":[],"manno":[],"marugame":[],"mitoyo":[],"naoshima":[],"sanuki":[],"tadotsu":[],"takamatsu":[],"tonosho":[],"uchinomi":[],"utazu":[],"zentsuji":[]},"kagoshima":{"akune":[],"amami":[],"hioki":[],"isa":[],"isen":[],"izumi":[],"kagoshima":[],"kanoya":[],"kawanabe":[],"kinko":[],"kouyama":[],"makurazaki":[],"matsumoto":[],"minamitane":[],"nakatane":[],"nishinoomote":[],"satsumasendai":[],"soo":[],"tarumizu":[],"yusui":[]},"kanagawa":{"aikawa":[],"atsugi":[],"ayase":[],"chigasaki":[],"ebina":[],"fujisawa":[],"hadano":[],"hakone":[],"hiratsuka":[],"isehara":[],"kaisei":[],"kamakura":[],"kiyokawa":[],"matsuda":[],"minamiashigara":[],"miura":[],"nakai":[],"ninomiya":[],"odawara":[],"oi":[],"oiso":[],"sagamihara":[],"samukawa":[],"tsukui":[],"yamakita":[],"yamato":[],"yokosuka":[],"yugawara":[],"zama":[],"zushi":[]},"kochi":{"aki":[],"geisei":[],"hidaka":[],"higashitsuno":[],"ino":[],"kagami":[],"kami":[],"kitagawa":[],"kochi":[],"mihara":[],"motoyama":[],"muroto":[],"nahari":[],"nakamura":[],"nankoku":[],"nishitosa":[],"niyodogawa":[],"ochi":[],"okawa":[],"otoyo":[],"otsuki":[],"sakawa":[],"sukumo":[],"susaki":[],"tosa":[],"tosashimizu":[],"toyo":[],"tsuno":[],"umaji":[],"yasuda":[],"yusuhara":[]},"kumamoto":{"amakusa":[],"arao":[],"aso":[],"choyo":[],"gyokuto":[],"kamiamakusa":[],"kikuchi":[],"kumamoto":[],"mashiki":[],"mifune":[],"minamata":[],"minamioguni":[],"nagasu":[],"nishihara":[],"oguni":[],"ozu":[],"sumoto":[],"takamori":[],"uki":[],"uto":[],"yamaga":[],"yamato":[],"yatsushiro":[]},"kyoto":{"ayabe":[],"fukuchiyama":[],"higashiyama":[],"ide":[],"ine":[],"joyo":[],"kameoka":[],"kamo":[],"kita":[],"kizu":[],"kumiyama":[],"kyotamba":[],"kyotanabe":[],"kyotango":[],"maizuru":[],"minami":[],"minamiyamashiro":[],"miyazu":[],"muko":[],"nagaokakyo":[],"nakagyo":[],"nantan":[],"oyamazaki":[],"sakyo":[],"seika":[],"tanabe":[],"uji":[],"ujitawara":[],"wazuka":[],"yamashina":[],"yawata":[]},"mie":{"asahi":[],"inabe":[],"ise":[],"kameyama":[],"kawagoe":[],"kiho":[],"kisosaki":[],"kiwa":[],"komono":[],"kumano":[],"kuwana":[],"matsusaka":[],"meiwa":[],"mihama":[],"minamiise":[],"misugi":[],"miyama":[],"nabari":[],"shima":[],"suzuka":[],"tado":[],"taiki":[],"taki":[],"tamaki":[],"toba":[],"tsu":[],"udono":[],"ureshino":[],"watarai":[],"yokkaichi":[]},"miyagi":{"furukawa":[],"higashimatsushima":[],"ishinomaki":[],"iwanuma":[],"kakuda":[],"kami":[],"kawasaki":[],"marumori":[],"matsushima":[],"minamisanriku":[],"misato":[],"murata":[],"natori":[],"ogawara":[],"ohira":[],"onagawa":[],"osaki":[],"rifu":[],"semine":[],"shibata":[],"shichikashuku":[],"shikama":[],"shiogama":[],"shiroishi":[],"tagajo":[],"taiwa":[],"tome":[],"tomiya":[],"wakuya":[],"watari":[],"yamamoto":[],"zao":[]},"miyazaki":{"aya":[],"ebino":[],"gokase":[],"hyuga":[],"kadogawa":[],"kawaminami":[],"kijo":[],"kitagawa":[],"kitakata":[],"kitaura":[],"kobayashi":[],"kunitomi":[],"kushima":[],"mimata":[],"miyakonojo":[],"miyazaki":[],"morotsuka":[],"nichinan":[],"nishimera":[],"nobeoka":[],"saito":[],"shiiba":[],"shintomi":[],"takaharu":[],"takanabe":[],"takazaki":[],"tsuno":[]},"nagano":{"achi":[],"agematsu":[],"anan":[],"aoki":[],"asahi":[],"azumino":[],"chikuhoku":[],"chikuma":[],"chino":[],"fujimi":[],"hakuba":[],"hara":[],"hiraya":[],"iida":[],"iijima":[],"iiyama":[],"iizuna":[],"ikeda":[],"ikusaka":[],"ina":[],"karuizawa":[],"kawakami":[],"kiso":[],"kisofukushima":[],"kitaaiki":[],"komagane":[],"komoro":[],"matsukawa":[],"matsumoto":[],"miasa":[],"minamiaiki":[],"minamimaki":[],"minamiminowa":[],"minowa":[],"miyada":[],"miyota":[],"mochizuki":[],"nagano":[],"nagawa":[],"nagiso":[],"nakagawa":[],"nakano":[],"nozawaonsen":[],"obuse":[],"ogawa":[],"okaya":[],"omachi":[],"omi":[],"ookuwa":[],"ooshika":[],"otaki":[],"otari":[],"sakae":[],"sakaki":[],"saku":[],"sakuho":[],"shimosuwa":[],"shinanomachi":[],"shiojiri":[],"suwa":[],"suzaka":[],"takagi":[],"takamori":[],"takayama":[],"tateshina":[],"tatsuno":[],"togakushi":[],"togura":[],"tomi":[],"ueda":[],"wada":[],"yamagata":[],"yamanouchi":[],"yasaka":[],"yasuoka":[]},"nagasaki":{"chijiwa":[],"futsu":[],"goto":[],"hasami":[],"hirado":[],"iki":[],"isahaya":[],"kawatana":[],"kuchinotsu":[],"matsuura":[],"nagasaki":[],"obama":[],"omura":[],"oseto":[],"saikai":[],"sasebo":[],"seihi":[],"shimabara":[],"shinkamigoto":[],"togitsu":[],"tsushima":[],"unzen":[]},"nara":{"ando":[],"gose":[],"heguri":[],"higashiyoshino":[],"ikaruga":[],"ikoma":[],"kamikitayama":[],"kanmaki":[],"kashiba":[],"kashihara":[],"katsuragi":[],"kawai":[],"kawakami":[],"kawanishi":[],"koryo":[],"kurotaki":[],"mitsue":[],"miyake":[],"nara":[],"nosegawa":[],"oji":[],"ouda":[],"oyodo":[],"sakurai":[],"sango":[],"shimoichi":[],"shimokitayama":[],"shinjo":[],"soni":[],"takatori":[],"tawaramoto":[],"tenkawa":[],"tenri":[],"uda":[],"yamatokoriyama":[],"yamatotakada":[],"yamazoe":[],"yoshino":[]},"niigata":{"aga":[],"agano":[],"gosen":[],"itoigawa":[],"izumozaki":[],"joetsu":[],"kamo":[],"kariwa":[],"kashiwazaki":[],"minamiuonuma":[],"mitsuke":[],"muika":[],"murakami":[],"myoko":[],"nagaoka":[],"niigata":[],"ojiya":[],"omi":[],"sado":[],"sanjo":[],"seiro":[],"seirou":[],"sekikawa":[],"shibata":[],"tagami":[],"tainai":[],"tochio":[],"tokamachi":[],"tsubame":[],"tsunan":[],"uonuma":[],"yahiko":[],"yoita":[],"yuzawa":[]},"oita":{"beppu":[],"bungoono":[],"bungotakada":[],"hasama":[],"hiji":[],"himeshima":[],"hita":[],"kamitsue":[],"kokonoe":[],"kuju":[],"kunisaki":[],"kusu":[],"oita":[],"saiki":[],"taketa":[],"tsukumi":[],"usa":[],"usuki":[],"yufu":[]},"okayama":{"akaiwa":[],"asakuchi":[],"bizen":[],"hayashima":[],"ibara":[],"kagamino":[],"kasaoka":[],"kibichuo":[],"kumenan":[],"kurashiki":[],"maniwa":[],"misaki":[],"nagi":[],"niimi":[],"nishiawakura":[],"okayama":[],"satosho":[],"setouchi":[],"shinjo":[],"shoo":[],"soja":[],"takahashi":[],"tamano":[],"tsuyama":[],"wake":[],"yakage":[]},"okinawa":{"aguni":[],"ginowan":[],"ginoza":[],"gushikami":[],"haebaru":[],"higashi":[],"hirara":[],"iheya":[],"ishigaki":[],"ishikawa":[],"itoman":[],"izena":[],"kadena":[],"kin":[],"kitadaito":[],"kitanakagusuku":[],"kumejima":[],"kunigami":[],"minamidaito":[],"motobu":[],"nago":[],"naha":[],"nakagusuku":[],"nakijin":[],"nanjo":[],"nishihara":[],"ogimi":[],"okinawa":[],"onna":[],"shimoji":[],"taketomi":[],"tarama":[],"tokashiki":[],"tomigusuku":[],"tonaki":[],"urasoe":[],"uruma":[],"yaese":[],"yomitan":[],"yonabaru":[],"yonaguni":[],"zamami":[]},"osaka":{"abeno":[],"chihayaakasaka":[],"chuo":[],"daito":[],"fujiidera":[],"habikino":[],"hannan":[],"higashiosaka":[],"higashisumiyoshi":[],"higashiyodogawa":[],"hirakata":[],"ibaraki":[],"ikeda":[],"izumi":[],"izumiotsu":[],"izumisano":[],"kadoma":[],"kaizuka":[],"kanan":[],"kashiwara":[],"katano":[],"kawachinagano":[],"kishiwada":[],"kita":[],"kumatori":[],"matsubara":[],"minato":[],"minoh":[],"misaki":[],"moriguchi":[],"neyagawa":[],"nishi":[],"nose":[],"osakasayama":[],"sakai":[],"sayama":[],"sennan":[],"settsu":[],"shijonawate":[],"shimamoto":[],"suita":[],"tadaoka":[],"taishi":[],"tajiri":[],"takaishi":[],"takatsuki":[],"tondabayashi":[],"toyonaka":[],"toyono":[],"yao":[]},"saga":{"ariake":[],"arita":[],"fukudomi":[],"genkai":[],"hamatama":[],"hizen":[],"imari":[],"kamimine":[],"kanzaki":[],"karatsu":[],"kashima":[],"kitagata":[],"kitahata":[],"kiyama":[],"kouhoku":[],"kyuragi":[],"nishiarita":[],"ogi":[],"omachi":[],"ouchi":[],"saga":[],"shiroishi":[],"taku":[],"tara":[],"tosu":[],"yoshinogari":[]},"saitama":{"arakawa":[],"asaka":[],"chichibu":[],"fujimi":[],"fujimino":[],"fukaya":[],"hanno":[],"hanyu":[],"hasuda":[],"hatogaya":[],"hatoyama":[],"hidaka":[],"higashichichibu":[],"higashimatsuyama":[],"honjo":[],"ina":[],"iruma":[],"iwatsuki":[],"kamiizumi":[],"kamikawa":[],"kamisato":[],"kasukabe":[],"kawagoe":[],"kawaguchi":[],"kawajima":[],"kazo":[],"kitamoto":[],"koshigaya":[],"kounosu":[],"kuki":[],"kumagaya":[],"matsubushi":[],"minano":[],"misato":[],"miyashiro":[],"miyoshi":[],"moroyama":[],"nagatoro":[],"namegawa":[],"niiza":[],"ogano":[],"ogawa":[],"ogose":[],"okegawa":[],"omiya":[],"otaki":[],"ranzan":[],"ryokami":[],"saitama":[],"sakado":[],"satte":[],"sayama":[],"shiki":[],"shiraoka":[],"soka":[],"sugito":[],"toda":[],"tokigawa":[],"tokorozawa":[],"tsurugashima":[],"urawa":[],"warabi":[],"yashio":[],"yokoze":[],"yono":[],"yorii":[],"yoshida":[],"yoshikawa":[],"yoshimi":[]},"shiga":{"aisho":[],"gamo":[],"higashiomi":[],"hikone":[],"koka":[],"konan":[],"kosei":[],"koto":[],"kusatsu":[],"maibara":[],"moriyama":[],"nagahama":[],"nishiazai":[],"notogawa":[],"omihachiman":[],"otsu":[],"ritto":[],"ryuoh":[],"takashima":[],"takatsuki":[],"torahime":[],"toyosato":[],"yasu":[]},"shimane":{"akagi":[],"ama":[],"gotsu":[],"hamada":[],"higashiizumo":[],"hikawa":[],"hikimi":[],"izumo":[],"kakinoki":[],"masuda":[],"matsue":[],"misato":[],"nishinoshima":[],"ohda":[],"okinoshima":[],"okuizumo":[],"shimane":[],"tamayu":[],"tsuwano":[],"unnan":[],"yakumo":[],"yasugi":[],"yatsuka":[]},"shizuoka":{"arai":[],"atami":[],"fuji":[],"fujieda":[],"fujikawa":[],"fujinomiya":[],"fukuroi":[],"gotemba":[],"haibara":[],"hamamatsu":[],"higashiizu":[],"ito":[],"iwata":[],"izu":[],"izunokuni":[],"kakegawa":[],"kannami":[],"kawanehon":[],"kawazu":[],"kikugawa":[],"kosai":[],"makinohara":[],"matsuzaki":[],"minamiizu":[],"mishima":[],"morimachi":[],"nishiizu":[],"numazu":[],"omaezaki":[],"shimada":[],"shimizu":[],"shimoda":[],"shizuoka":[],"susono":[],"yaizu":[],"yoshida":[]},"tochigi":{"ashikaga":[],"bato":[],"haga":[],"ichikai":[],"iwafune":[],"kaminokawa":[],"kanuma":[],"karasuyama":[],"kuroiso":[],"mashiko":[],"mibu":[],"moka":[],"motegi":[],"nasu":[],"nasushiobara":[],"nikko":[],"nishikata":[],"nogi":[],"ohira":[],"ohtawara":[],"oyama":[],"sakura":[],"sano":[],"shimotsuke":[],"shioya":[],"takanezawa":[],"tochigi":[],"tsuga":[],"ujiie":[],"utsunomiya":[],"yaita":[]},"tokushima":{"aizumi":[],"anan":[],"ichiba":[],"itano":[],"kainan":[],"komatsushima":[],"matsushige":[],"mima":[],"minami":[],"miyoshi":[],"mugi":[],"nakagawa":[],"naruto":[],"sanagochi":[],"shishikui":[],"tokushima":[],"wajiki":[]},"tokyo":{"adachi":[],"akiruno":[],"akishima":[],"aogashima":[],"arakawa":[],"bunkyo":[],"chiyoda":[],"chofu":[],"chuo":[],"edogawa":[],"fuchu":[],"fussa":[],"hachijo":[],"hachioji":[],"hamura":[],"higashikurume":[],"higashimurayama":[],"higashiyamato":[],"hino":[],"hinode":[],"hinohara":[],"inagi":[],"itabashi":[],"katsushika":[],"kita":[],"kiyose":[],"kodaira":[],"koganei":[],"kokubunji":[],"komae":[],"koto":[],"kouzushima":[],"kunitachi":[],"machida":[],"meguro":[],"minato":[],"mitaka":[],"mizuho":[],"musashimurayama":[],"musashino":[],"nakano":[],"nerima":[],"ogasawara":[],"okutama":[],"ome":[],"oshima":[],"ota":[],"setagaya":[],"shibuya":[],"shinagawa":[],"shinjuku":[],"suginami":[],"sumida":[],"tachikawa":[],"taito":[],"tama":[],"toshima":[]},"tottori":{"chizu":[],"hino":[],"kawahara":[],"koge":[],"kotoura":[],"misasa":[],"nanbu":[],"nichinan":[],"sakaiminato":[],"tottori":[],"wakasa":[],"yazu":[],"yonago":[]},"toyama":{"asahi":[],"fuchu":[],"fukumitsu":[],"funahashi":[],"himi":[],"imizu":[],"inami":[],"johana":[],"kamiichi":[],"kurobe":[],"nakaniikawa":[],"namerikawa":[],"nanto":[],"nyuzen":[],"oyabe":[],"taira":[],"takaoka":[],"tateyama":[],"toga":[],"tonami":[],"toyama":[],"unazuki":[],"uozu":[],"yamada":[]},"wakayama":{"arida":[],"aridagawa":[],"gobo":[],"hashimoto":[],"hidaka":[],"hirogawa":[],"inami":[],"iwade":[],"kainan":[],"kamitonda":[],"katsuragi":[],"kimino":[],"kinokawa":[],"kitayama":[],"koya":[],"koza":[],"kozagawa":[],"kudoyama":[],"kushimoto":[],"mihama":[],"misato":[],"nachikatsuura":[],"shingu":[],"shirahama":[],"taiji":[],"tanabe":[],"wakayama":[],"yuasa":[],"yura":[]},"yamagata":{"asahi":[],"funagata":[],"higashine":[],"iide":[],"kahoku":[],"kaminoyama":[],"kaneyama":[],"kawanishi":[],"mamurogawa":[],"mikawa":[],"murayama":[],"nagai":[],"nakayama":[],"nanyo":[],"nishikawa":[],"obanazawa":[],"oe":[],"oguni":[],"ohkura":[],"oishida":[],"sagae":[],"sakata":[],"sakegawa":[],"shinjo":[],"shirataka":[],"shonai":[],"takahata":[],"tendo":[],"tozawa":[],"tsuruoka":[],"yamagata":[],"yamanobe":[],"yonezawa":[],"yuza":[]},"yamaguchi":{"abu":[],"hagi":[],"hikari":[],"hofu":[],"iwakuni":[],"kudamatsu":[],"mitou":[],"nagato":[],"oshima":[],"shimonoseki":[],"shunan":[],"tabuse":[],"tokuyama":[],"toyota":[],"ube":[],"yuu":[]},"yamanashi":{"chuo":[],"doshi":[],"fuefuki":[],"fujikawa":[],"fujikawaguchiko":[],"fujiyoshida":[],"hayakawa":[],"hokuto":[],"ichikawamisato":[],"kai":[],"kofu":[],"koshu":[],"kosuge":[],"minami-alps":[],"minobu":[],"nakamichi":[],"nanbu":[],"narusawa":[],"nirasaki":[],"nishikatsura":[],"oshino":[],"otsuki":[],"showa":[],"tabayama":[],"tsuru":[],"uenohara":[],"yamanakako":[],"yamanashi":[]},"xn--4pvxs":[],"xn--vgu402c":[],"xn--c3s14m":[],"xn--f6qx53a":[],"xn--8pvr4u":[],"xn--uist22h":[],"xn--djrs72d6uy":[],"xn--mkru45i":[],"xn--0trq7p7nn":[],"xn--8ltr62k":[],"xn--2m4a15e":[],"xn--efvn9s":[],"xn--32vp30h":[],"xn--4it797k":[],"xn--1lqs71d":[],"xn--5rtp49c":[],"xn--5js045d":[],"xn--ehqz56n":[],"xn--1lqs03n":[],"xn--qqqt11m":[],"xn--kbrq7o":[],"xn--pssu33l":[],"xn--ntsq17g":[],"xn--uisz3g":[],"xn--6btw5a":[],"xn--1ctwo":[],"xn--6orx2r":[],"xn--rht61e":[],"xn--rht27z":[],"xn--djty4k":[],"xn--nit225k":[],"xn--rht3d":[],"xn--klty5x":[],"xn--kltx9a":[],"xn--kltp7d":[],"xn--uuwu58a":[],"xn--zbx025d":[],"xn--ntso0iqx3a":[],"xn--elqq16h":[],"xn--4it168d":[],"xn--klt787d":[],"xn--rny31h":[],"xn--7t0a264c":[],"xn--5rtq34k":[],"xn--k7yn95e":[],"xn--tor131o":[],"xn--d5qv7z876c":[],"kawasaki":{"*":[],"city":{"!":""}},"kitakyushu":{"*":[],"city":{"!":""}},"kobe":{"*":[],"city":{"!":""}},"nagoya":{"*":[],"city":{"!":""}},"sapporo":{"*":[],"city":{"!":""}},"sendai":{"*":[],"city":{"!":""}},"yokohama":{"*":[],"city":{"!":""}}},"ke":{"ac":[],"co":[],"go":[],"info":[],"me":[],"mobi":[],"ne":[],"or":[],"sc":[]},"kg":{"org":[],"net":[],"com":[],"edu":[],"gov":[],"mil":[]},"kh":{"*":[]},"ki":{"edu":[],"biz":[],"net":[],"org":[],"gov":[],"info":[],"com":[]},"km":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"ass":[],"com":[],"coop":[],"asso":[],"presse":[],"medecin":[],"notaires":[],"pharmaciens":[],"veterinaire":[],"gouv":[]},"kn":{"net":[],"org":[],"edu":[],"gov":[]},"kp":{"com":[],"edu":[],"gov":[],"org":[],"rep":[],"tra":[]},"kr":{"ac":[],"co":[],"es":[],"go":[],"hs":[],"kg":[],"mil":[],"ms":[],"ne":[],"or":[],"pe":[],"re":[],"sc":[],"busan":[],"chungbuk":[],"chungnam":[],"daegu":[],"daejeon":[],"gangwon":[],"gwangju":[],"gyeongbuk":[],"gyeonggi":[],"gyeongnam":[],"incheon":[],"jeju":[],"jeonbuk":[],"jeonnam":[],"seoul":[],"ulsan":[]},"kw":{"com":[],"edu":[],"emb":[],"gov":[],"ind":[],"net":[],"org":[]},"ky":{"edu":[],"gov":[],"com":[],"org":[],"net":[]},"kz":{"org":[],"edu":[],"net":[],"gov":[],"mil":[],"com":[]},"la":{"int":[],"net":[],"info":[],"edu":[],"gov":[],"per":[],"com":[],"org":[]},"lb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"lc":{"com":[],"net":[],"co":[],"org":[],"edu":[],"gov":[]},"li":[],"lk":{"gov":[],"sch":[],"net":[],"int":[],"com":[],"org":[],"edu":[],"ngo":[],"soc":[],"web":[],"ltd":[],"assn":[],"grp":[],"hotel":[],"ac":[]},"lr":{"com":[],"edu":[],"gov":[],"org":[],"net":[]},"ls":{"ac":[],"biz":[],"co":[],"edu":[],"gov":[],"info":[],"net":[],"org":[],"sc":[]},"lt":{"gov":[]},"lu":[],"lv":{"com":[],"edu":[],"gov":[],"org":[],"mil":[],"id":[],"net":[],"asn":[],"conf":[]},"ly":{"com":[],"net":[],"gov":[],"plc":[],"edu":[],"sch":[],"med":[],"org":[],"id":[]},"ma":{"co":[],"net":[],"gov":[],"org":[],"ac":[],"press":[]},"mc":{"tm":[],"asso":[]},"md":[],"me":{"co":[],"net":[],"org":[],"edu":[],"ac":[],"gov":[],"its":[],"priv":[]},"mg":{"org":[],"nom":[],"gov":[],"prd":[],"tm":[],"edu":[],"mil":[],"com":[],"co":[]},"mh":[],"mil":[],"mk":{"com":[],"org":[],"net":[],"edu":[],"gov":[],"inf":[],"name":[]},"ml":{"com":[],"edu":[],"gouv":[],"gov":[],"net":[],"org":[],"presse":[]},"mm":{"*":[]},"mn":{"gov":[],"edu":[],"org":[]},"mo":{"com":[],"net":[],"org":[],"edu":[],"gov":[]},"mobi":[],"mp":[],"mq":[],"mr":{"gov":[]},"ms":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"mt":{"com":[],"edu":[],"net":[],"org":[]},"mu":{"com":[],"net":[],"org":[],"gov":[],"ac":[],"co":[],"or":[]},"museum":{"academy":[],"agriculture":[],"air":[],"airguard":[],"alabama":[],"alaska":[],"amber":[],"ambulance":[],"american":[],"americana":[],"americanantiques":[],"americanart":[],"amsterdam":[],"and":[],"annefrank":[],"anthro":[],"anthropology":[],"antiques":[],"aquarium":[],"arboretum":[],"archaeological":[],"archaeology":[],"architecture":[],"art":[],"artanddesign":[],"artcenter":[],"artdeco":[],"arteducation":[],"artgallery":[],"arts":[],"artsandcrafts":[],"asmatart":[],"assassination":[],"assisi":[],"association":[],"astronomy":[],"atlanta":[],"austin":[],"australia":[],"automotive":[],"aviation":[],"axis":[],"badajoz":[],"baghdad":[],"bahn":[],"bale":[],"baltimore":[],"barcelona":[],"baseball":[],"basel":[],"baths":[],"bauern":[],"beauxarts":[],"beeldengeluid":[],"bellevue":[],"bergbau":[],"berkeley":[],"berlin":[],"bern":[],"bible":[],"bilbao":[],"bill":[],"birdart":[],"birthplace":[],"bonn":[],"boston":[],"botanical":[],"botanicalgarden":[],"botanicgarden":[],"botany":[],"brandywinevalley":[],"brasil":[],"bristol":[],"british":[],"britishcolumbia":[],"broadcast":[],"brunel":[],"brussel":[],"brussels":[],"bruxelles":[],"building":[],"burghof":[],"bus":[],"bushey":[],"cadaques":[],"california":[],"cambridge":[],"can":[],"canada":[],"capebreton":[],"carrier":[],"cartoonart":[],"casadelamoneda":[],"castle":[],"castres":[],"celtic":[],"center":[],"chattanooga":[],"cheltenham":[],"chesapeakebay":[],"chicago":[],"children":[],"childrens":[],"childrensgarden":[],"chiropractic":[],"chocolate":[],"christiansburg":[],"cincinnati":[],"cinema":[],"circus":[],"civilisation":[],"civilization":[],"civilwar":[],"clinton":[],"clock":[],"coal":[],"coastaldefence":[],"cody":[],"coldwar":[],"collection":[],"colonialwilliamsburg":[],"coloradoplateau":[],"columbia":[],"columbus":[],"communication":[],"communications":[],"community":[],"computer":[],"computerhistory":[],"xn--comunicaes-v6a2o":[],"contemporary":[],"contemporaryart":[],"convent":[],"copenhagen":[],"corporation":[],"xn--correios-e-telecomunicaes-ghc29a":[],"corvette":[],"costume":[],"countryestate":[],"county":[],"crafts":[],"cranbrook":[],"creation":[],"cultural":[],"culturalcenter":[],"culture":[],"cyber":[],"cymru":[],"dali":[],"dallas":[],"database":[],"ddr":[],"decorativearts":[],"delaware":[],"delmenhorst":[],"denmark":[],"depot":[],"design":[],"detroit":[],"dinosaur":[],"discovery":[],"dolls":[],"donostia":[],"durham":[],"eastafrica":[],"eastcoast":[],"education":[],"educational":[],"egyptian":[],"eisenbahn":[],"elburg":[],"elvendrell":[],"embroidery":[],"encyclopedic":[],"england":[],"entomology":[],"environment":[],"environmentalconservation":[],"epilepsy":[],"essex":[],"estate":[],"ethnology":[],"exeter":[],"exhibition":[],"family":[],"farm":[],"farmequipment":[],"farmers":[],"farmstead":[],"field":[],"figueres":[],"filatelia":[],"film":[],"fineart":[],"finearts":[],"finland":[],"flanders":[],"florida":[],"force":[],"fortmissoula":[],"fortworth":[],"foundation":[],"francaise":[],"frankfurt":[],"franziskaner":[],"freemasonry":[],"freiburg":[],"fribourg":[],"frog":[],"fundacio":[],"furniture":[],"gallery":[],"garden":[],"gateway":[],"geelvinck":[],"gemological":[],"geology":[],"georgia":[],"giessen":[],"glas":[],"glass":[],"gorge":[],"grandrapids":[],"graz":[],"guernsey":[],"halloffame":[],"hamburg":[],"handson":[],"harvestcelebration":[],"hawaii":[],"health":[],"heimatunduhren":[],"hellas":[],"helsinki":[],"hembygdsforbund":[],"heritage":[],"histoire":[],"historical":[],"historicalsociety":[],"historichouses":[],"historisch":[],"historisches":[],"history":[],"historyofscience":[],"horology":[],"house":[],"humanities":[],"illustration":[],"imageandsound":[],"indian":[],"indiana":[],"indianapolis":[],"indianmarket":[],"intelligence":[],"interactive":[],"iraq":[],"iron":[],"isleofman":[],"jamison":[],"jefferson":[],"jerusalem":[],"jewelry":[],"jewish":[],"jewishart":[],"jfk":[],"journalism":[],"judaica":[],"judygarland":[],"juedisches":[],"juif":[],"karate":[],"karikatur":[],"kids":[],"koebenhavn":[],"koeln":[],"kunst":[],"kunstsammlung":[],"kunstunddesign":[],"labor":[],"labour":[],"lajolla":[],"lancashire":[],"landes":[],"lans":[],"xn--lns-qla":[],"larsson":[],"lewismiller":[],"lincoln":[],"linz":[],"living":[],"livinghistory":[],"localhistory":[],"london":[],"losangeles":[],"louvre":[],"loyalist":[],"lucerne":[],"luxembourg":[],"luzern":[],"mad":[],"madrid":[],"mallorca":[],"manchester":[],"mansion":[],"mansions":[],"manx":[],"marburg":[],"maritime":[],"maritimo":[],"maryland":[],"marylhurst":[],"media":[],"medical":[],"medizinhistorisches":[],"meeres":[],"memorial":[],"mesaverde":[],"michigan":[],"midatlantic":[],"military":[],"mill":[],"miners":[],"mining":[],"minnesota":[],"missile":[],"missoula":[],"modern":[],"moma":[],"money":[],"monmouth":[],"monticello":[],"montreal":[],"moscow":[],"motorcycle":[],"muenchen":[],"muenster":[],"mulhouse":[],"muncie":[],"museet":[],"museumcenter":[],"museumvereniging":[],"music":[],"national":[],"nationalfirearms":[],"nationalheritage":[],"nativeamerican":[],"naturalhistory":[],"naturalhistorymuseum":[],"naturalsciences":[],"nature":[],"naturhistorisches":[],"natuurwetenschappen":[],"naumburg":[],"naval":[],"nebraska":[],"neues":[],"newhampshire":[],"newjersey":[],"newmexico":[],"newport":[],"newspaper":[],"newyork":[],"niepce":[],"norfolk":[],"north":[],"nrw":[],"nyc":[],"nyny":[],"oceanographic":[],"oceanographique":[],"omaha":[],"online":[],"ontario":[],"openair":[],"oregon":[],"oregontrail":[],"otago":[],"oxford":[],"pacific":[],"paderborn":[],"palace":[],"paleo":[],"palmsprings":[],"panama":[],"paris":[],"pasadena":[],"pharmacy":[],"philadelphia":[],"philadelphiaarea":[],"philately":[],"phoenix":[],"photography":[],"pilots":[],"pittsburgh":[],"planetarium":[],"plantation":[],"plants":[],"plaza":[],"portal":[],"portland":[],"portlligat":[],"posts-and-telecommunications":[],"preservation":[],"presidio":[],"press":[],"project":[],"public":[],"pubol":[],"quebec":[],"railroad":[],"railway":[],"research":[],"resistance":[],"riodejaneiro":[],"rochester":[],"rockart":[],"roma":[],"russia":[],"saintlouis":[],"salem":[],"salvadordali":[],"salzburg":[],"sandiego":[],"sanfrancisco":[],"santabarbara":[],"santacruz":[],"santafe":[],"saskatchewan":[],"satx":[],"savannahga":[],"schlesisches":[],"schoenbrunn":[],"schokoladen":[],"school":[],"schweiz":[],"science":[],"scienceandhistory":[],"scienceandindustry":[],"sciencecenter":[],"sciencecenters":[],"science-fiction":[],"sciencehistory":[],"sciences":[],"sciencesnaturelles":[],"scotland":[],"seaport":[],"settlement":[],"settlers":[],"shell":[],"sherbrooke":[],"sibenik":[],"silk":[],"ski":[],"skole":[],"society":[],"sologne":[],"soundandvision":[],"southcarolina":[],"southwest":[],"space":[],"spy":[],"square":[],"stadt":[],"stalbans":[],"starnberg":[],"state":[],"stateofdelaware":[],"station":[],"steam":[],"steiermark":[],"stjohn":[],"stockholm":[],"stpetersburg":[],"stuttgart":[],"suisse":[],"surgeonshall":[],"surrey":[],"svizzera":[],"sweden":[],"sydney":[],"tank":[],"tcm":[],"technology":[],"telekommunikation":[],"television":[],"texas":[],"textile":[],"theater":[],"time":[],"timekeeping":[],"topology":[],"torino":[],"touch":[],"town":[],"transport":[],"tree":[],"trolley":[],"trust":[],"trustee":[],"uhren":[],"ulm":[],"undersea":[],"university":[],"usa":[],"usantiques":[],"usarts":[],"uscountryestate":[],"usculture":[],"usdecorativearts":[],"usgarden":[],"ushistory":[],"ushuaia":[],"uslivinghistory":[],"utah":[],"uvic":[],"valley":[],"vantaa":[],"versailles":[],"viking":[],"village":[],"virginia":[],"virtual":[],"virtuel":[],"vlaanderen":[],"volkenkunde":[],"wales":[],"wallonie":[],"war":[],"washingtondc":[],"watchandclock":[],"watch-and-clock":[],"western":[],"westfalen":[],"whaling":[],"wildlife":[],"williamsburg":[],"windmill":[],"workshop":[],"york":[],"yorkshire":[],"yosemite":[],"youth":[],"zoological":[],"zoology":[],"xn--9dbhblg6di":[],"xn--h1aegh":[]},"mv":{"aero":[],"biz":[],"com":[],"coop":[],"edu":[],"gov":[],"info":[],"int":[],"mil":[],"museum":[],"name":[],"net":[],"org":[],"pro":[]},"mw":{"ac":[],"biz":[],"co":[],"com":[],"coop":[],"edu":[],"gov":[],"int":[],"museum":[],"net":[],"org":[]},"mx":{"com":[],"org":[],"gob":[],"edu":[],"net":[]},"my":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"mil":[],"name":[]},"mz":{"ac":[],"adv":[],"co":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"na":{"info":[],"pro":[],"name":[],"school":[],"or":[],"dr":[],"us":[],"mx":[],"ca":[],"in":[],"cc":[],"tv":[],"ws":[],"mobi":[],"co":[],"com":[],"org":[]},"name":[],"nc":{"asso":[],"nom":[]},"ne":[],"net":[],"nf":{"com":[],"net":[],"per":[],"rec":[],"web":[],"arts":[],"firm":[],"info":[],"other":[],"store":[]},"ng":{"com":[],"edu":[],"gov":[],"i":[],"mil":[],"mobi":[],"name":[],"net":[],"org":[],"sch":[]},"ni":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gob":[],"in":[],"info":[],"int":[],"mil":[],"net":[],"nom":[],"org":[],"web":[]},"nl":[],"no":{"fhs":[],"vgs":[],"fylkesbibl":[],"folkebibl":[],"museum":[],"idrett":[],"priv":[],"mil":[],"stat":[],"dep":[],"kommune":[],"herad":[],"aa":{"gs":[]},"ah":{"gs":[]},"bu":{"gs":[]},"fm":{"gs":[]},"hl":{"gs":[]},"hm":{"gs":[]},"jan-mayen":{"gs":[]},"mr":{"gs":[]},"nl":{"gs":[]},"nt":{"gs":[]},"of":{"gs":[]},"ol":{"gs":[]},"oslo":{"gs":[]},"rl":{"gs":[]},"sf":{"gs":[]},"st":{"gs":[]},"svalbard":{"gs":[]},"tm":{"gs":[]},"tr":{"gs":[]},"va":{"gs":[]},"vf":{"gs":[]},"akrehamn":[],"xn--krehamn-dxa":[],"algard":[],"xn--lgrd-poac":[],"arna":[],"brumunddal":[],"bryne":[],"bronnoysund":[],"xn--brnnysund-m8ac":[],"drobak":[],"xn--drbak-wua":[],"egersund":[],"fetsund":[],"floro":[],"xn--flor-jra":[],"fredrikstad":[],"hokksund":[],"honefoss":[],"xn--hnefoss-q1a":[],"jessheim":[],"jorpeland":[],"xn--jrpeland-54a":[],"kirkenes":[],"kopervik":[],"krokstadelva":[],"langevag":[],"xn--langevg-jxa":[],"leirvik":[],"mjondalen":[],"xn--mjndalen-64a":[],"mo-i-rana":[],"mosjoen":[],"xn--mosjen-eya":[],"nesoddtangen":[],"orkanger":[],"osoyro":[],"xn--osyro-wua":[],"raholt":[],"xn--rholt-mra":[],"sandnessjoen":[],"xn--sandnessjen-ogb":[],"skedsmokorset":[],"slattum":[],"spjelkavik":[],"stathelle":[],"stavern":[],"stjordalshalsen":[],"xn--stjrdalshalsen-sqb":[],"tananger":[],"tranby":[],"vossevangen":[],"afjord":[],"xn--fjord-lra":[],"agdenes":[],"al":[],"xn--l-1fa":[],"alesund":[],"xn--lesund-hua":[],"alstahaug":[],"alta":[],"xn--lt-liac":[],"alaheadju":[],"xn--laheadju-7ya":[],"alvdal":[],"amli":[],"xn--mli-tla":[],"amot":[],"xn--mot-tla":[],"andebu":[],"andoy":[],"xn--andy-ira":[],"andasuolo":[],"ardal":[],"xn--rdal-poa":[],"aremark":[],"arendal":[],"xn--s-1fa":[],"aseral":[],"xn--seral-lra":[],"asker":[],"askim":[],"askvoll":[],"askoy":[],"xn--asky-ira":[],"asnes":[],"xn--snes-poa":[],"audnedaln":[],"aukra":[],"aure":[],"aurland":[],"aurskog-holand":[],"xn--aurskog-hland-jnb":[],"austevoll":[],"austrheim":[],"averoy":[],"xn--avery-yua":[],"balestrand":[],"ballangen":[],"balat":[],"xn--blt-elab":[],"balsfjord":[],"bahccavuotna":[],"xn--bhccavuotna-k7a":[],"bamble":[],"bardu":[],"beardu":[],"beiarn":[],"bajddar":[],"xn--bjddar-pta":[],"baidar":[],"xn--bidr-5nac":[],"berg":[],"bergen":[],"berlevag":[],"xn--berlevg-jxa":[],"bearalvahki":[],"xn--bearalvhki-y4a":[],"bindal":[],"birkenes":[],"bjarkoy":[],"xn--bjarky-fya":[],"bjerkreim":[],"bjugn":[],"bodo":[],"xn--bod-2na":[],"badaddja":[],"xn--bdddj-mrabd":[],"budejju":[],"bokn":[],"bremanger":[],"bronnoy":[],"xn--brnny-wuac":[],"bygland":[],"bykle":[],"barum":[],"xn--brum-voa":[],"telemark":{"bo":[],"xn--b-5ga":[]},"nordland":{"bo":[],"xn--b-5ga":[],"heroy":[],"xn--hery-ira":[]},"bievat":[],"xn--bievt-0qa":[],"bomlo":[],"xn--bmlo-gra":[],"batsfjord":[],"xn--btsfjord-9za":[],"bahcavuotna":[],"xn--bhcavuotna-s4a":[],"dovre":[],"drammen":[],"drangedal":[],"dyroy":[],"xn--dyry-ira":[],"donna":[],"xn--dnna-gra":[],"eid":[],"eidfjord":[],"eidsberg":[],"eidskog":[],"eidsvoll":[],"eigersund":[],"elverum":[],"enebakk":[],"engerdal":[],"etne":[],"etnedal":[],"evenes":[],"evenassi":[],"xn--eveni-0qa01ga":[],"evje-og-hornnes":[],"farsund":[],"fauske":[],"fuossko":[],"fuoisku":[],"fedje":[],"fet":[],"finnoy":[],"xn--finny-yua":[],"fitjar":[],"fjaler":[],"fjell":[],"flakstad":[],"flatanger":[],"flekkefjord":[],"flesberg":[],"flora":[],"fla":[],"xn--fl-zia":[],"folldal":[],"forsand":[],"fosnes":[],"frei":[],"frogn":[],"froland":[],"frosta":[],"frana":[],"xn--frna-woa":[],"froya":[],"xn--frya-hra":[],"fusa":[],"fyresdal":[],"forde":[],"xn--frde-gra":[],"gamvik":[],"gangaviika":[],"xn--ggaviika-8ya47h":[],"gaular":[],"gausdal":[],"gildeskal":[],"xn--gildeskl-g0a":[],"giske":[],"gjemnes":[],"gjerdrum":[],"gjerstad":[],"gjesdal":[],"gjovik":[],"xn--gjvik-wua":[],"gloppen":[],"gol":[],"gran":[],"grane":[],"granvin":[],"gratangen":[],"grimstad":[],"grong":[],"kraanghke":[],"xn--kranghke-b0a":[],"grue":[],"gulen":[],"hadsel":[],"halden":[],"halsa":[],"hamar":[],"hamaroy":[],"habmer":[],"xn--hbmer-xqa":[],"hapmir":[],"xn--hpmir-xqa":[],"hammerfest":[],"hammarfeasta":[],"xn--hmmrfeasta-s4ac":[],"haram":[],"hareid":[],"harstad":[],"hasvik":[],"aknoluokta":[],"xn--koluokta-7ya57h":[],"hattfjelldal":[],"aarborte":[],"haugesund":[],"hemne":[],"hemnes":[],"hemsedal":[],"more-og-romsdal":{"heroy":[],"sande":[]},"xn--mre-og-romsdal-qqb":{"xn--hery-ira":[],"sande":[]},"hitra":[],"hjartdal":[],"hjelmeland":[],"hobol":[],"xn--hobl-ira":[],"hof":[],"hol":[],"hole":[],"holmestrand":[],"holtalen":[],"xn--holtlen-hxa":[],"hornindal":[],"horten":[],"hurdal":[],"hurum":[],"hvaler":[],"hyllestad":[],"hagebostad":[],"xn--hgebostad-g3a":[],"hoyanger":[],"xn--hyanger-q1a":[],"hoylandet":[],"xn--hylandet-54a":[],"ha":[],"xn--h-2fa":[],"ibestad":[],"inderoy":[],"xn--indery-fya":[],"iveland":[],"jevnaker":[],"jondal":[],"jolster":[],"xn--jlster-bya":[],"karasjok":[],"karasjohka":[],"xn--krjohka-hwab49j":[],"karlsoy":[],"galsa":[],"xn--gls-elac":[],"karmoy":[],"xn--karmy-yua":[],"kautokeino":[],"guovdageaidnu":[],"klepp":[],"klabu":[],"xn--klbu-woa":[],"kongsberg":[],"kongsvinger":[],"kragero":[],"xn--krager-gya":[],"kristiansand":[],"kristiansund":[],"krodsherad":[],"xn--krdsherad-m8a":[],"kvalsund":[],"rahkkeravju":[],"xn--rhkkervju-01af":[],"kvam":[],"kvinesdal":[],"kvinnherad":[],"kviteseid":[],"kvitsoy":[],"xn--kvitsy-fya":[],"kvafjord":[],"xn--kvfjord-nxa":[],"giehtavuoatna":[],"kvanangen":[],"xn--kvnangen-k0a":[],"navuotna":[],"xn--nvuotna-hwa":[],"kafjord":[],"xn--kfjord-iua":[],"gaivuotna":[],"xn--givuotna-8ya":[],"larvik":[],"lavangen":[],"lavagis":[],"loabat":[],"xn--loabt-0qa":[],"lebesby":[],"davvesiida":[],"leikanger":[],"leirfjord":[],"leka":[],"leksvik":[],"lenvik":[],"leangaviika":[],"xn--leagaviika-52b":[],"lesja":[],"levanger":[],"lier":[],"lierne":[],"lillehammer":[],"lillesand":[],"lindesnes":[],"lindas":[],"xn--linds-pra":[],"lom":[],"loppa":[],"lahppi":[],"xn--lhppi-xqa":[],"lund":[],"lunner":[],"luroy":[],"xn--lury-ira":[],"luster":[],"lyngdal":[],"lyngen":[],"ivgu":[],"lardal":[],"lerdal":[],"xn--lrdal-sra":[],"lodingen":[],"xn--ldingen-q1a":[],"lorenskog":[],"xn--lrenskog-54a":[],"loten":[],"xn--lten-gra":[],"malvik":[],"masoy":[],"xn--msy-ula0h":[],"muosat":[],"xn--muost-0qa":[],"mandal":[],"marker":[],"marnardal":[],"masfjorden":[],"meland":[],"meldal":[],"melhus":[],"meloy":[],"xn--mely-ira":[],"meraker":[],"xn--merker-kua":[],"moareke":[],"xn--moreke-jua":[],"midsund":[],"midtre-gauldal":[],"modalen":[],"modum":[],"molde":[],"moskenes":[],"moss":[],"mosvik":[],"malselv":[],"xn--mlselv-iua":[],"malatvuopmi":[],"xn--mlatvuopmi-s4a":[],"namdalseid":[],"aejrie":[],"namsos":[],"namsskogan":[],"naamesjevuemie":[],"xn--nmesjevuemie-tcba":[],"laakesvuemie":[],"nannestad":[],"narvik":[],"narviika":[],"naustdal":[],"nedre-eiker":[],"akershus":{"nes":[]},"buskerud":{"nes":[]},"nesna":[],"nesodden":[],"nesseby":[],"unjarga":[],"xn--unjrga-rta":[],"nesset":[],"nissedal":[],"nittedal":[],"nord-aurdal":[],"nord-fron":[],"nord-odal":[],"norddal":[],"nordkapp":[],"davvenjarga":[],"xn--davvenjrga-y4a":[],"nordre-land":[],"nordreisa":[],"raisa":[],"xn--risa-5na":[],"nore-og-uvdal":[],"notodden":[],"naroy":[],"xn--nry-yla5g":[],"notteroy":[],"xn--nttery-byae":[],"odda":[],"oksnes":[],"xn--ksnes-uua":[],"oppdal":[],"oppegard":[],"xn--oppegrd-ixa":[],"orkdal":[],"orland":[],"xn--rland-uua":[],"orskog":[],"xn--rskog-uua":[],"orsta":[],"xn--rsta-fra":[],"hedmark":{"os":[],"valer":[],"xn--vler-qoa":[]},"hordaland":{"os":[]},"osen":[],"osteroy":[],"xn--ostery-fya":[],"ostre-toten":[],"xn--stre-toten-zcb":[],"overhalla":[],"ovre-eiker":[],"xn--vre-eiker-k8a":[],"oyer":[],"xn--yer-zna":[],"oygarden":[],"xn--ygarden-p1a":[],"oystre-slidre":[],"xn--ystre-slidre-ujb":[],"porsanger":[],"porsangu":[],"xn--porsgu-sta26f":[],"porsgrunn":[],"radoy":[],"xn--rady-ira":[],"rakkestad":[],"rana":[],"ruovat":[],"randaberg":[],"rauma":[],"rendalen":[],"rennebu":[],"rennesoy":[],"xn--rennesy-v1a":[],"rindal":[],"ringebu":[],"ringerike":[],"ringsaker":[],"rissa":[],"risor":[],"xn--risr-ira":[],"roan":[],"rollag":[],"rygge":[],"ralingen":[],"xn--rlingen-mxa":[],"rodoy":[],"xn--rdy-0nab":[],"romskog":[],"xn--rmskog-bya":[],"roros":[],"xn--rros-gra":[],"rost":[],"xn--rst-0na":[],"royken":[],"xn--ryken-vua":[],"royrvik":[],"xn--ryrvik-bya":[],"rade":[],"xn--rde-ula":[],"salangen":[],"siellak":[],"saltdal":[],"salat":[],"xn--slt-elab":[],"xn--slat-5na":[],"samnanger":[],"vestfold":{"sande":[]},"sandefjord":[],"sandnes":[],"sandoy":[],"xn--sandy-yua":[],"sarpsborg":[],"sauda":[],"sauherad":[],"sel":[],"selbu":[],"selje":[],"seljord":[],"sigdal":[],"siljan":[],"sirdal":[],"skaun":[],"skedsmo":[],"ski":[],"skien":[],"skiptvet":[],"skjervoy":[],"xn--skjervy-v1a":[],"skierva":[],"xn--skierv-uta":[],"skjak":[],"xn--skjk-soa":[],"skodje":[],"skanland":[],"xn--sknland-fxa":[],"skanit":[],"xn--sknit-yqa":[],"smola":[],"xn--smla-hra":[],"snillfjord":[],"snasa":[],"xn--snsa-roa":[],"snoasa":[],"snaase":[],"xn--snase-nra":[],"sogndal":[],"sokndal":[],"sola":[],"solund":[],"songdalen":[],"sortland":[],"spydeberg":[],"stange":[],"stavanger":[],"steigen":[],"steinkjer":[],"stjordal":[],"xn--stjrdal-s1a":[],"stokke":[],"stor-elvdal":[],"stord":[],"stordal":[],"storfjord":[],"omasvuotna":[],"strand":[],"stranda":[],"stryn":[],"sula":[],"suldal":[],"sund":[],"sunndal":[],"surnadal":[],"sveio":[],"svelvik":[],"sykkylven":[],"sogne":[],"xn--sgne-gra":[],"somna":[],"xn--smna-gra":[],"sondre-land":[],"xn--sndre-land-0cb":[],"sor-aurdal":[],"xn--sr-aurdal-l8a":[],"sor-fron":[],"xn--sr-fron-q1a":[],"sor-odal":[],"xn--sr-odal-q1a":[],"sor-varanger":[],"xn--sr-varanger-ggb":[],"matta-varjjat":[],"xn--mtta-vrjjat-k7af":[],"sorfold":[],"xn--srfold-bya":[],"sorreisa":[],"xn--srreisa-q1a":[],"sorum":[],"xn--srum-gra":[],"tana":[],"deatnu":[],"time":[],"tingvoll":[],"tinn":[],"tjeldsund":[],"dielddanuorri":[],"tjome":[],"xn--tjme-hra":[],"tokke":[],"tolga":[],"torsken":[],"tranoy":[],"xn--trany-yua":[],"tromso":[],"xn--troms-zua":[],"tromsa":[],"romsa":[],"trondheim":[],"troandin":[],"trysil":[],"trana":[],"xn--trna-woa":[],"trogstad":[],"xn--trgstad-r1a":[],"tvedestrand":[],"tydal":[],"tynset":[],"tysfjord":[],"divtasvuodna":[],"divttasvuotna":[],"tysnes":[],"tysvar":[],"xn--tysvr-vra":[],"tonsberg":[],"xn--tnsberg-q1a":[],"ullensaker":[],"ullensvang":[],"ulvik":[],"utsira":[],"vadso":[],"xn--vads-jra":[],"cahcesuolo":[],"xn--hcesuolo-7ya35b":[],"vaksdal":[],"valle":[],"vang":[],"vanylven":[],"vardo":[],"xn--vard-jra":[],"varggat":[],"xn--vrggt-xqad":[],"vefsn":[],"vaapste":[],"vega":[],"vegarshei":[],"xn--vegrshei-c0a":[],"vennesla":[],"verdal":[],"verran":[],"vestby":[],"vestnes":[],"vestre-slidre":[],"vestre-toten":[],"vestvagoy":[],"xn--vestvgy-ixa6o":[],"vevelstad":[],"vik":[],"vikna":[],"vindafjord":[],"volda":[],"voss":[],"varoy":[],"xn--vry-yla5g":[],"vagan":[],"xn--vgan-qoa":[],"voagat":[],"vagsoy":[],"xn--vgsy-qoa0j":[],"vaga":[],"xn--vg-yiab":[],"ostfold":{"valer":[]},"xn--stfold-9xa":{"xn--vler-qoa":[]}},"np":{"*":[]},"nr":{"biz":[],"info":[],"gov":[],"edu":[],"org":[],"net":[],"com":[]},"nu":[],"nz":{"ac":[],"co":[],"cri":[],"geek":[],"gen":[],"govt":[],"health":[],"iwi":[],"kiwi":[],"maori":[],"mil":[],"xn--mori-qsa":[],"net":[],"org":[],"parliament":[],"school":[]},"om":{"co":[],"com":[],"edu":[],"gov":[],"med":[],"museum":[],"net":[],"org":[],"pro":[]},"onion":[],"org":[],"pa":{"ac":[],"gob":[],"com":[],"org":[],"sld":[],"edu":[],"net":[],"ing":[],"abo":[],"med":[],"nom":[]},"pe":{"edu":[],"gob":[],"nom":[],"mil":[],"org":[],"com":[],"net":[]},"pf":{"com":[],"org":[],"edu":[]},"pg":{"*":[]},"ph":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"ngo":[],"mil":[],"i":[]},"pk":{"com":[],"net":[],"edu":[],"org":[],"fam":[],"biz":[],"web":[],"gov":[],"gob":[],"gok":[],"gon":[],"gop":[],"gos":[],"info":[]},"pl":{"com":[],"net":[],"org":[],"aid":[],"agro":[],"atm":[],"auto":[],"biz":[],"edu":[],"gmina":[],"gsm":[],"info":[],"mail":[],"miasta":[],"media":[],"mil":[],"nieruchomosci":[],"nom":[],"pc":[],"powiat":[],"priv":[],"realestate":[],"rel":[],"sex":[],"shop":[],"sklep":[],"sos":[],"szkola":[],"targi":[],"tm":[],"tourism":[],"travel":[],"turystyka":[],"gov":{"ap":[],"ic":[],"is":[],"us":[],"kmpsp":[],"kppsp":[],"kwpsp":[],"psp":[],"wskr":[],"kwp":[],"mw":[],"ug":[],"um":[],"umig":[],"ugim":[],"upow":[],"uw":[],"starostwo":[],"pa":[],"po":[],"psse":[],"pup":[],"rzgw":[],"sa":[],"so":[],"sr":[],"wsa":[],"sko":[],"uzs":[],"wiih":[],"winb":[],"pinb":[],"wios":[],"witd":[],"wzmiuw":[],"piw":[],"wiw":[],"griw":[],"wif":[],"oum":[],"sdn":[],"zp":[],"uppo":[],"mup":[],"wuoz":[],"konsulat":[],"oirm":[]},"augustow":[],"babia-gora":[],"bedzin":[],"beskidy":[],"bialowieza":[],"bialystok":[],"bielawa":[],"bieszczady":[],"boleslawiec":[],"bydgoszcz":[],"bytom":[],"cieszyn":[],"czeladz":[],"czest":[],"dlugoleka":[],"elblag":[],"elk":[],"glogow":[],"gniezno":[],"gorlice":[],"grajewo":[],"ilawa":[],"jaworzno":[],"jelenia-gora":[],"jgora":[],"kalisz":[],"kazimierz-dolny":[],"karpacz":[],"kartuzy":[],"kaszuby":[],"katowice":[],"kepno":[],"ketrzyn":[],"klodzko":[],"kobierzyce":[],"kolobrzeg":[],"konin":[],"konskowola":[],"kutno":[],"lapy":[],"lebork":[],"legnica":[],"lezajsk":[],"limanowa":[],"lomza":[],"lowicz":[],"lubin":[],"lukow":[],"malbork":[],"malopolska":[],"mazowsze":[],"mazury":[],"mielec":[],"mielno":[],"mragowo":[],"naklo":[],"nowaruda":[],"nysa":[],"olawa":[],"olecko":[],"olkusz":[],"olsztyn":[],"opoczno":[],"opole":[],"ostroda":[],"ostroleka":[],"ostrowiec":[],"ostrowwlkp":[],"pila":[],"pisz":[],"podhale":[],"podlasie":[],"polkowice":[],"pomorze":[],"pomorskie":[],"prochowice":[],"pruszkow":[],"przeworsk":[],"pulawy":[],"radom":[],"rawa-maz":[],"rybnik":[],"rzeszow":[],"sanok":[],"sejny":[],"slask":[],"slupsk":[],"sosnowiec":[],"stalowa-wola":[],"skoczow":[],"starachowice":[],"stargard":[],"suwalki":[],"swidnica":[],"swiebodzin":[],"swinoujscie":[],"szczecin":[],"szczytno":[],"tarnobrzeg":[],"tgory":[],"turek":[],"tychy":[],"ustka":[],"walbrzych":[],"warmia":[],"warszawa":[],"waw":[],"wegrow":[],"wielun":[],"wlocl":[],"wloclawek":[],"wodzislaw":[],"wolomin":[],"wroclaw":[],"zachpomor":[],"zagan":[],"zarow":[],"zgora":[],"zgorzelec":[]},"pm":[],"pn":{"gov":[],"co":[],"org":[],"edu":[],"net":[]},"post":[],"pr":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"isla":[],"pro":[],"biz":[],"info":[],"name":[],"est":[],"prof":[],"ac":[]},"pro":{"aaa":[],"aca":[],"acct":[],"avocat":[],"bar":[],"cpa":[],"eng":[],"jur":[],"law":[],"med":[],"recht":[]},"ps":{"edu":[],"gov":[],"sec":[],"plo":[],"com":[],"org":[],"net":[]},"pt":{"net":[],"gov":[],"org":[],"edu":[],"int":[],"publ":[],"com":[],"nome":[]},"pw":{"co":[],"ne":[],"or":[],"ed":[],"go":[],"belau":[]},"py":{"com":[],"coop":[],"edu":[],"gov":[],"mil":[],"net":[],"org":[]},"qa":{"com":[],"edu":[],"gov":[],"mil":[],"name":[],"net":[],"org":[],"sch":[]},"re":{"asso":[],"com":[],"nom":[]},"ro":{"arts":[],"com":[],"firm":[],"info":[],"nom":[],"nt":[],"org":[],"rec":[],"store":[],"tm":[],"www":[]},"rs":{"ac":[],"co":[],"edu":[],"gov":[],"in":[],"org":[]},"ru":[],"rw":{"ac":[],"co":[],"coop":[],"gov":[],"mil":[],"net":[],"org":[]},"sa":{"com":[],"net":[],"org":[],"gov":[],"med":[],"pub":[],"edu":[],"sch":[]},"sb":{"com":[],"edu":[],"gov":[],"net":[],"org":[]},"sc":{"com":[],"gov":[],"net":[],"org":[],"edu":[]},"sd":{"com":[],"net":[],"org":[],"edu":[],"med":[],"tv":[],"gov":[],"info":[]},"se":{"a":[],"ac":[],"b":[],"bd":[],"brand":[],"c":[],"d":[],"e":[],"f":[],"fh":[],"fhsk":[],"fhv":[],"g":[],"h":[],"i":[],"k":[],"komforb":[],"kommunalforbund":[],"komvux":[],"l":[],"lanbib":[],"m":[],"n":[],"naturbruksgymn":[],"o":[],"org":[],"p":[],"parti":[],"pp":[],"press":[],"r":[],"s":[],"t":[],"tm":[],"u":[],"w":[],"x":[],"y":[],"z":[]},"sg":{"com":[],"net":[],"org":[],"gov":[],"edu":[],"per":[]},"sh":{"com":[],"net":[],"gov":[],"org":[],"mil":[]},"si":[],"sj":[],"sk":[],"sl":{"com":[],"net":[],"edu":[],"gov":[],"org":[]},"sm":[],"sn":{"art":[],"com":[],"edu":[],"gouv":[],"org":[],"perso":[],"univ":[]},"so":{"com":[],"edu":[],"gov":[],"me":[],"net":[],"org":[]},"sr":[],"ss":{"biz":[],"com":[],"edu":[],"gov":[],"net":[],"org":[]},"st":{"co":[],"com":[],"consulado":[],"edu":[],"embaixada":[],"gov":[],"mil":[],"net":[],"org":[],"principe":[],"saotome":[],"store":[]},"su":[],"sv":{"com":[],"edu":[],"gob":[],"org":[],"red":[]},"sx":{"gov":[]},"sy":{"edu":[],"gov":[],"net":[],"mil":[],"com":[],"org":[]},"sz":{"co":[],"ac":[],"org":[]},"tc":[],"td":[],"tel":[],"tf":[],"tg":[],"th":{"ac":[],"co":[],"go":[],"in":[],"mi":[],"net":[],"or":[]},"tj":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"go":[],"gov":[],"int":[],"mil":[],"name":[],"net":[],"nic":[],"org":[],"test":[],"web":[]},"tk":[],"tl":{"gov":[]},"tm":{"com":[],"co":[],"org":[],"net":[],"nom":[],"gov":[],"mil":[],"edu":[]},"tn":{"com":[],"ens":[],"fin":[],"gov":[],"ind":[],"intl":[],"nat":[],"net":[],"org":[],"info":[],"perso":[],"tourism":[],"edunet":[],"rnrt":[],"rns":[],"rnu":[],"mincom":[],"agrinet":[],"defense":[],"turen":[]},"to":{"com":[],"gov":[],"net":[],"org":[],"edu":[],"mil":[]},"tr":{"av":[],"bbs":[],"bel":[],"biz":[],"com":[],"dr":[],"edu":[],"gen":[],"gov":[],"info":[],"mil":[],"k12":[],"kep":[],"name":[],"net":[],"org":[],"pol":[],"tel":[],"tsk":[],"tv":[],"web":[],"nc":{"gov":[]}},"tt":{"co":[],"com":[],"org":[],"net":[],"biz":[],"info":[],"pro":[],"int":[],"coop":[],"jobs":[],"mobi":[],"travel":[],"museum":[],"aero":[],"name":[],"gov":[],"edu":[]},"tv":[],"tw":{"edu":[],"gov":[],"mil":[],"com":[],"net":[],"org":[],"idv":[],"game":[],"ebiz":[],"club":[],"xn--zf0ao64a":[],"xn--uc0atv":[],"xn--czrw28b":[]},"tz":{"ac":[],"co":[],"go":[],"hotel":[],"info":[],"me":[],"mil":[],"mobi":[],"ne":[],"or":[],"sc":[],"tv":[]},"ua":{"com":[],"edu":[],"gov":[],"in":[],"net":[],"org":[],"cherkassy":[],"cherkasy":[],"chernigov":[],"chernihiv":[],"chernivtsi":[],"chernovtsy":[],"ck":[],"cn":[],"cr":[],"crimea":[],"cv":[],"dn":[],"dnepropetrovsk":[],"dnipropetrovsk":[],"donetsk":[],"dp":[],"if":[],"ivano-frankivsk":[],"kh":[],"kharkiv":[],"kharkov":[],"kherson":[],"khmelnitskiy":[],"khmelnytskyi":[],"kiev":[],"kirovograd":[],"km":[],"kr":[],"krym":[],"ks":[],"kv":[],"kyiv":[],"lg":[],"lt":[],"lugansk":[],"lutsk":[],"lv":[],"lviv":[],"mk":[],"mykolaiv":[],"nikolaev":[],"od":[],"odesa":[],"odessa":[],"pl":[],"poltava":[],"rivne":[],"rovno":[],"rv":[],"sb":[],"sebastopol":[],"sevastopol":[],"sm":[],"sumy":[],"te":[],"ternopil":[],"uz":[],"uzhgorod":[],"vinnica":[],"vinnytsia":[],"vn":[],"volyn":[],"yalta":[],"zaporizhzhe":[],"zaporizhzhia":[],"zhitomir":[],"zhytomyr":[],"zp":[],"zt":[]},"ug":{"co":[],"or":[],"ac":[],"sc":[],"go":[],"ne":[],"com":[],"org":[]},"uk":{"ac":[],"co":[],"gov":[],"ltd":[],"me":[],"net":[],"nhs":[],"org":[],"plc":[],"police":[],"sch":{"*":[]}},"us":{"dni":[],"fed":[],"isa":[],"kids":[],"nsn":[],"ak":{"k12":[],"cc":[],"lib":[]},"al":{"k12":[],"cc":[],"lib":[]},"ar":{"k12":[],"cc":[],"lib":[]},"as":{"k12":[],"cc":[],"lib":[]},"az":{"k12":[],"cc":[],"lib":[]},"ca":{"k12":[],"cc":[],"lib":[]},"co":{"k12":[],"cc":[],"lib":[]},"ct":{"k12":[],"cc":[],"lib":[]},"dc":{"k12":[],"cc":[],"lib":[]},"de":{"k12":[],"cc":[]},"fl":{"k12":[],"cc":[],"lib":[]},"ga":{"k12":[],"cc":[],"lib":[]},"gu":{"k12":[],"cc":[],"lib":[]},"hi":{"cc":[],"lib":[]},"ia":{"k12":[],"cc":[],"lib":[]},"id":{"k12":[],"cc":[],"lib":[]},"il":{"k12":[],"cc":[],"lib":[]},"in":{"k12":[],"cc":[],"lib":[]},"ks":{"k12":[],"cc":[],"lib":[]},"ky":{"k12":[],"cc":[],"lib":[]},"la":{"k12":[],"cc":[],"lib":[]},"ma":{"k12":{"pvt":[],"chtr":[],"paroch":[]},"cc":[],"lib":[]},"md":{"k12":[],"cc":[],"lib":[]},"me":{"k12":[],"cc":[],"lib":[]},"mi":{"k12":[],"cc":[],"lib":[],"ann-arbor":[],"cog":[],"dst":[],"eaton":[],"gen":[],"mus":[],"tec":[],"washtenaw":[]},"mn":{"k12":[],"cc":[],"lib":[]},"mo":{"k12":[],"cc":[],"lib":[]},"ms":{"k12":[],"cc":[],"lib":[]},"mt":{"k12":[],"cc":[],"lib":[]},"nc":{"k12":[],"cc":[],"lib":[]},"nd":{"cc":[],"lib":[]},"ne":{"k12":[],"cc":[],"lib":[]},"nh":{"k12":[],"cc":[],"lib":[]},"nj":{"k12":[],"cc":[],"lib":[]},"nm":{"k12":[],"cc":[],"lib":[]},"nv":{"k12":[],"cc":[],"lib":[]},"ny":{"k12":[],"cc":[],"lib":[]},"oh":{"k12":[],"cc":[],"lib":[]},"ok":{"k12":[],"cc":[],"lib":[]},"or":{"k12":[],"cc":[],"lib":[]},"pa":{"k12":[],"cc":[],"lib":[]},"pr":{"k12":[],"cc":[],"lib":[]},"ri":{"cc":[],"lib":[]},"sc":{"k12":[],"cc":[],"lib":[]},"sd":{"cc":[],"lib":[]},"tn":{"k12":[],"cc":[],"lib":[]},"tx":{"k12":[],"cc":[],"lib":[]},"ut":{"k12":[],"cc":[],"lib":[]},"vi":{"k12":[],"cc":[],"lib":[]},"vt":{"k12":[],"cc":[],"lib":[]},"va":{"k12":[],"cc":[],"lib":[]},"wa":{"k12":[],"cc":[],"lib":[]},"wi":{"k12":[],"cc":[],"lib":[]},"wv":{"cc":[]},"wy":{"k12":[],"cc":[],"lib":[]}},"uy":{"com":[],"edu":[],"gub":[],"mil":[],"net":[],"org":[]},"uz":{"co":[],"com":[],"net":[],"org":[]},"va":[],"vc":{"com":[],"net":[],"org":[],"gov":[],"mil":[],"edu":[]},"ve":{"arts":[],"co":[],"com":[],"e12":[],"edu":[],"firm":[],"gob":[],"gov":[],"info":[],"int":[],"mil":[],"net":[],"org":[],"rec":[],"store":[],"tec":[],"web":[]},"vg":[],"vi":{"co":[],"com":[],"k12":[],"net":[],"org":[]},"vn":{"com":[],"net":[],"org":[],"edu":[],"gov":[],"int":[],"ac":[],"biz":[],"info":[],"name":[],"pro":[],"health":[]},"vu":{"com":[],"edu":[],"net":[],"org":[]},"wf":[],"ws":{"com":[],"net":[],"org":[],"gov":[],"edu":[]},"yt":[],"xn--mgbaam7a8h":[],"xn--y9a3aq":[],"xn--54b7fta0cc":[],"xn--90ae":[],"xn--90ais":[],"xn--fiqs8s":[],"xn--fiqz9s":[],"xn--lgbbat1ad8j":[],"xn--wgbh1c":[],"xn--e1a4c":[],"xn--qxa6a":[],"xn--mgbah1a3hjkrd":[],"xn--node":[],"xn--qxam":[],"xn--j6w193g":{"xn--55qx5d":[],"xn--wcvs22d":[],"xn--mxtq1m":[],"xn--gmqw5a":[],"xn--od0alg":[],"xn--uc0atv":[]},"xn--2scrj9c":[],"xn--3hcrj9c":[],"xn--45br5cyl":[],"xn--h2breg3eve":[],"xn--h2brj9c8c":[],"xn--mgbgu82a":[],"xn--rvc1e0am3e":[],"xn--h2brj9c":[],"xn--mgbbh1a":[],"xn--mgbbh1a71e":[],"xn--fpcrj9c3d":[],"xn--gecrj9c":[],"xn--s9brj9c":[],"xn--45brj9c":[],"xn--xkc2dl3a5ee0h":[],"xn--mgba3a4f16a":[],"xn--mgba3a4fra":[],"xn--mgbtx2b":[],"xn--mgbayh7gpa":[],"xn--3e0b707e":[],"xn--80ao21a":[],"xn--fzc2c9e2c":[],"xn--xkc2al3hye2a":[],"xn--mgbc0a9azcg":[],"xn--d1alf":[],"xn--l1acc":[],"xn--mix891f":[],"xn--mix082f":[],"xn--mgbx4cd0ab":[],"xn--mgb9awbf":[],"xn--mgbai9azgqp6j":[],"xn--mgbai9a5eva00b":[],"xn--ygbi2ammx":[],"xn--90a3ac":{"xn--o1ac":[],"xn--c1avg":[],"xn--90azh":[],"xn--d1at":[],"xn--o1ach":[],"xn--80au":[]},"xn--p1ai":[],"xn--wgbl6a":[],"xn--mgberp4a5d4ar":[],"xn--mgberp4a5d4a87g":[],"xn--mgbqly7c0a67fbc":[],"xn--mgbqly7cvafr":[],"xn--mgbpl2fh":[],"xn--yfro4i67o":[],"xn--clchc0ea0b2g2a9gcd":[],"xn--ogbpf8fl":[],"xn--mgbtf8fl":[],"xn--o3cw4h":{"xn--12c1fe0br":[],"xn--12co0c3b4eva":[],"xn--h3cuzk1di":[],"xn--o3cyx2a":[],"xn--m3ch0j3a":[],"xn--12cfi8ixb8l":[]},"xn--pgbs0dh":[],"xn--kpry57d":[],"xn--kprw13d":[],"xn--nnx388a":[],"xn--j1amh":[],"xn--mgb2ddes":[],"xxx":[],"ye":{"*":[]},"za":{"ac":[],"agric":[],"alt":[],"co":[],"edu":[],"gov":[],"grondar":[],"law":[],"mil":[],"net":[],"ngo":[],"nic":[],"nis":[],"nom":[],"org":[],"school":[],"tm":[],"web":[]},"zm":{"ac":[],"biz":[],"co":[],"com":[],"edu":[],"gov":[],"info":[],"mil":[],"net":[],"org":[],"sch":[]},"zw":{"ac":[],"co":[],"gov":[],"mil":[],"org":[]},"aaa":[],"aarp":[],"abarth":[],"abb":[],"abbott":[],"abbvie":[],"abc":[],"able":[],"abogado":[],"abudhabi":[],"academy":[],"accenture":[],"accountant":[],"accountants":[],"aco":[],"actor":[],"adac":[],"ads":[],"adult":[],"aeg":[],"aetna":[],"afamilycompany":[],"afl":[],"africa":[],"agakhan":[],"agency":[],"aig":[],"airbus":[],"airforce":[],"airtel":[],"akdn":[],"alfaromeo":[],"alibaba":[],"alipay":[],"allfinanz":[],"allstate":[],"ally":[],"alsace":[],"alstom":[],"amazon":[],"americanexpress":[],"americanfamily":[],"amex":[],"amfam":[],"amica":[],"amsterdam":[],"analytics":[],"android":[],"anquan":[],"anz":[],"aol":[],"apartments":[],"app":[],"apple":[],"aquarelle":[],"arab":[],"aramco":[],"archi":[],"army":[],"art":[],"arte":[],"asda":[],"associates":[],"athleta":[],"attorney":[],"auction":[],"audi":[],"audible":[],"audio":[],"auspost":[],"author":[],"auto":[],"autos":[],"avianca":[],"aws":[],"axa":[],"azure":[],"baby":[],"baidu":[],"banamex":[],"bananarepublic":[],"band":[],"bank":[],"bar":[],"barcelona":[],"barclaycard":[],"barclays":[],"barefoot":[],"bargains":[],"baseball":[],"basketball":[],"bauhaus":[],"bayern":[],"bbc":[],"bbt":[],"bbva":[],"bcg":[],"bcn":[],"beats":[],"beauty":[],"beer":[],"bentley":[],"berlin":[],"best":[],"bestbuy":[],"bet":[],"bharti":[],"bible":[],"bid":[],"bike":[],"bing":[],"bingo":[],"bio":[],"black":[],"blackfriday":[],"blockbuster":[],"blog":[],"bloomberg":[],"blue":[],"bms":[],"bmw":[],"bnpparibas":[],"boats":[],"boehringer":[],"bofa":[],"bom":[],"bond":[],"boo":[],"book":[],"booking":[],"bosch":[],"bostik":[],"boston":[],"bot":[],"boutique":[],"box":[],"bradesco":[],"bridgestone":[],"broadway":[],"broker":[],"brother":[],"brussels":[],"budapest":[],"bugatti":[],"build":[],"builders":[],"business":[],"buy":[],"buzz":[],"bzh":[],"cab":[],"cafe":[],"cal":[],"call":[],"calvinklein":[],"cam":[],"camera":[],"camp":[],"cancerresearch":[],"canon":[],"capetown":[],"capital":[],"capitalone":[],"car":[],"caravan":[],"cards":[],"care":[],"career":[],"careers":[],"cars":[],"casa":[],"case":[],"caseih":[],"cash":[],"casino":[],"catering":[],"catholic":[],"cba":[],"cbn":[],"cbre":[],"cbs":[],"ceb":[],"center":[],"ceo":[],"cern":[],"cfa":[],"cfd":[],"chanel":[],"channel":[],"charity":[],"chase":[],"chat":[],"cheap":[],"chintai":[],"christmas":[],"chrome":[],"church":[],"cipriani":[],"circle":[],"cisco":[],"citadel":[],"citi":[],"citic":[],"city":[],"cityeats":[],"claims":[],"cleaning":[],"click":[],"clinic":[],"clinique":[],"clothing":[],"cloud":[],"club":[],"clubmed":[],"coach":[],"codes":[],"coffee":[],"college":[],"cologne":[],"comcast":[],"commbank":[],"community":[],"company":[],"compare":[],"computer":[],"comsec":[],"condos":[],"construction":[],"consulting":[],"contact":[],"contractors":[],"cooking":[],"cookingchannel":[],"cool":[],"corsica":[],"country":[],"coupon":[],"coupons":[],"courses":[],"cpa":[],"credit":[],"creditcard":[],"creditunion":[],"cricket":[],"crown":[],"crs":[],"cruise":[],"cruises":[],"csc":[],"cuisinella":[],"cymru":[],"cyou":[],"dabur":[],"dad":[],"dance":[],"data":[],"date":[],"dating":[],"datsun":[],"day":[],"dclk":[],"dds":[],"deal":[],"dealer":[],"deals":[],"degree":[],"delivery":[],"dell":[],"deloitte":[],"delta":[],"democrat":[],"dental":[],"dentist":[],"desi":[],"design":[],"dev":[],"dhl":[],"diamonds":[],"diet":[],"digital":[],"direct":[],"directory":[],"discount":[],"discover":[],"dish":[],"diy":[],"dnp":[],"docs":[],"doctor":[],"dog":[],"domains":[],"dot":[],"download":[],"drive":[],"dtv":[],"dubai":[],"duck":[],"dunlop":[],"dupont":[],"durban":[],"dvag":[],"dvr":[],"earth":[],"eat":[],"eco":[],"edeka":[],"education":[],"email":[],"emerck":[],"energy":[],"engineer":[],"engineering":[],"enterprises":[],"epson":[],"equipment":[],"ericsson":[],"erni":[],"esq":[],"estate":[],"etisalat":[],"eurovision":[],"eus":[],"events":[],"exchange":[],"expert":[],"exposed":[],"express":[],"extraspace":[],"fage":[],"fail":[],"fairwinds":[],"faith":[],"family":[],"fan":[],"fans":[],"farm":[],"farmers":[],"fashion":[],"fast":[],"fedex":[],"feedback":[],"ferrari":[],"ferrero":[],"fiat":[],"fidelity":[],"fido":[],"film":[],"final":[],"finance":[],"financial":[],"fire":[],"firestone":[],"firmdale":[],"fish":[],"fishing":[],"fit":[],"fitness":[],"flickr":[],"flights":[],"flir":[],"florist":[],"flowers":[],"fly":[],"foo":[],"food":[],"foodnetwork":[],"football":[],"ford":[],"forex":[],"forsale":[],"forum":[],"foundation":[],"fox":[],"free":[],"fresenius":[],"frl":[],"frogans":[],"frontdoor":[],"frontier":[],"ftr":[],"fujitsu":[],"fujixerox":[],"fun":[],"fund":[],"furniture":[],"futbol":[],"fyi":[],"gal":[],"gallery":[],"gallo":[],"gallup":[],"game":[],"games":[],"gap":[],"garden":[],"gay":[],"gbiz":[],"gdn":[],"gea":[],"gent":[],"genting":[],"george":[],"ggee":[],"gift":[],"gifts":[],"gives":[],"giving":[],"glade":[],"glass":[],"gle":[],"global":[],"globo":[],"gmail":[],"gmbh":[],"gmo":[],"gmx":[],"godaddy":[],"gold":[],"goldpoint":[],"golf":[],"goo":[],"goodyear":[],"goog":[],"google":[],"gop":[],"got":[],"grainger":[],"graphics":[],"gratis":[],"green":[],"gripe":[],"grocery":[],"group":[],"guardian":[],"gucci":[],"guge":[],"guide":[],"guitars":[],"guru":[],"hair":[],"hamburg":[],"hangout":[],"haus":[],"hbo":[],"hdfc":[],"hdfcbank":[],"health":[],"healthcare":[],"help":[],"helsinki":[],"here":[],"hermes":[],"hgtv":[],"hiphop":[],"hisamitsu":[],"hitachi":[],"hiv":[],"hkt":[],"hockey":[],"holdings":[],"holiday":[],"homedepot":[],"homegoods":[],"homes":[],"homesense":[],"honda":[],"horse":[],"hospital":[],"host":[],"hosting":[],"hot":[],"hoteles":[],"hotels":[],"hotmail":[],"house":[],"how":[],"hsbc":[],"hughes":[],"hyatt":[],"hyundai":[],"ibm":[],"icbc":[],"ice":[],"icu":[],"ieee":[],"ifm":[],"ikano":[],"imamat":[],"imdb":[],"immo":[],"immobilien":[],"inc":[],"industries":[],"infiniti":[],"ing":[],"ink":[],"institute":[],"insurance":[],"insure":[],"intel":[],"international":[],"intuit":[],"investments":[],"ipiranga":[],"irish":[],"ismaili":[],"ist":[],"istanbul":[],"itau":[],"itv":[],"iveco":[],"jaguar":[],"java":[],"jcb":[],"jcp":[],"jeep":[],"jetzt":[],"jewelry":[],"jio":[],"jll":[],"jmp":[],"jnj":[],"joburg":[],"jot":[],"joy":[],"jpmorgan":[],"jprs":[],"juegos":[],"juniper":[],"kaufen":[],"kddi":[],"kerryhotels":[],"kerrylogistics":[],"kerryproperties":[],"kfh":[],"kia":[],"kim":[],"kinder":[],"kindle":[],"kitchen":[],"kiwi":[],"koeln":[],"komatsu":[],"kosher":[],"kpmg":[],"kpn":[],"krd":[],"kred":[],"kuokgroup":[],"kyoto":[],"lacaixa":[],"lamborghini":[],"lamer":[],"lancaster":[],"lancia":[],"land":[],"landrover":[],"lanxess":[],"lasalle":[],"lat":[],"latino":[],"latrobe":[],"law":[],"lawyer":[],"lds":[],"lease":[],"leclerc":[],"lefrak":[],"legal":[],"lego":[],"lexus":[],"lgbt":[],"lidl":[],"life":[],"lifeinsurance":[],"lifestyle":[],"lighting":[],"like":[],"lilly":[],"limited":[],"limo":[],"lincoln":[],"linde":[],"link":[],"lipsy":[],"live":[],"living":[],"lixil":[],"llc":[],"llp":[],"loan":[],"loans":[],"locker":[],"locus":[],"loft":[],"lol":[],"london":[],"lotte":[],"lotto":[],"love":[],"lpl":[],"lplfinancial":[],"ltd":[],"ltda":[],"lundbeck":[],"lupin":[],"luxe":[],"luxury":[],"macys":[],"madrid":[],"maif":[],"maison":[],"makeup":[],"man":[],"management":[],"mango":[],"map":[],"market":[],"marketing":[],"markets":[],"marriott":[],"marshalls":[],"maserati":[],"mattel":[],"mba":[],"mckinsey":[],"med":[],"media":[],"meet":[],"melbourne":[],"meme":[],"memorial":[],"men":[],"menu":[],"merckmsd":[],"metlife":[],"miami":[],"microsoft":[],"mini":[],"mint":[],"mit":[],"mitsubishi":[],"mlb":[],"mls":[],"mma":[],"mobile":[],"moda":[],"moe":[],"moi":[],"mom":[],"monash":[],"money":[],"monster":[],"mormon":[],"mortgage":[],"moscow":[],"moto":[],"motorcycles":[],"mov":[],"movie":[],"msd":[],"mtn":[],"mtr":[],"mutual":[],"nab":[],"nagoya":[],"nationwide":[],"natura":[],"navy":[],"nba":[],"nec":[],"netbank":[],"netflix":[],"network":[],"neustar":[],"new":[],"newholland":[],"news":[],"next":[],"nextdirect":[],"nexus":[],"nfl":[],"ngo":[],"nhk":[],"nico":[],"nike":[],"nikon":[],"ninja":[],"nissan":[],"nissay":[],"nokia":[],"northwesternmutual":[],"norton":[],"now":[],"nowruz":[],"nowtv":[],"nra":[],"nrw":[],"ntt":[],"nyc":[],"obi":[],"observer":[],"off":[],"office":[],"okinawa":[],"olayan":[],"olayangroup":[],"oldnavy":[],"ollo":[],"omega":[],"one":[],"ong":[],"onl":[],"online":[],"onyourside":[],"ooo":[],"open":[],"oracle":[],"orange":[],"organic":[],"origins":[],"osaka":[],"otsuka":[],"ott":[],"ovh":[],"page":[],"panasonic":[],"paris":[],"pars":[],"partners":[],"parts":[],"party":[],"passagens":[],"pay":[],"pccw":[],"pet":[],"pfizer":[],"pharmacy":[],"phd":[],"philips":[],"phone":[],"photo":[],"photography":[],"photos":[],"physio":[],"pics":[],"pictet":[],"pictures":[],"pid":[],"pin":[],"ping":[],"pink":[],"pioneer":[],"pizza":[],"place":[],"play":[],"playstation":[],"plumbing":[],"plus":[],"pnc":[],"pohl":[],"poker":[],"politie":[],"porn":[],"pramerica":[],"praxi":[],"press":[],"prime":[],"prod":[],"productions":[],"prof":[],"progressive":[],"promo":[],"properties":[],"property":[],"protection":[],"pru":[],"prudential":[],"pub":[],"pwc":[],"qpon":[],"quebec":[],"quest":[],"qvc":[],"racing":[],"radio":[],"raid":[],"read":[],"realestate":[],"realtor":[],"realty":[],"recipes":[],"red":[],"redstone":[],"redumbrella":[],"rehab":[],"reise":[],"reisen":[],"reit":[],"reliance":[],"ren":[],"rent":[],"rentals":[],"repair":[],"report":[],"republican":[],"rest":[],"restaurant":[],"review":[],"reviews":[],"rexroth":[],"rich":[],"richardli":[],"ricoh":[],"rightathome":[],"ril":[],"rio":[],"rip":[],"rmit":[],"rocher":[],"rocks":[],"rodeo":[],"rogers":[],"room":[],"rsvp":[],"rugby":[],"ruhr":[],"run":[],"rwe":[],"ryukyu":[],"saarland":[],"safe":[],"safety":[],"sakura":[],"sale":[],"salon":[],"samsclub":[],"samsung":[],"sandvik":[],"sandvikcoromant":[],"sanofi":[],"sap":[],"sarl":[],"sas":[],"save":[],"saxo":[],"sbi":[],"sbs":[],"sca":[],"scb":[],"schaeffler":[],"schmidt":[],"scholarships":[],"school":[],"schule":[],"schwarz":[],"science":[],"scjohnson":[],"scot":[],"search":[],"seat":[],"secure":[],"security":[],"seek":[],"select":[],"sener":[],"services":[],"ses":[],"seven":[],"sew":[],"sex":[],"sexy":[],"sfr":[],"shangrila":[],"sharp":[],"shaw":[],"shell":[],"shia":[],"shiksha":[],"shoes":[],"shop":[],"shopping":[],"shouji":[],"show":[],"showtime":[],"shriram":[],"silk":[],"sina":[],"singles":[],"site":[],"ski":[],"skin":[],"sky":[],"skype":[],"sling":[],"smart":[],"smile":[],"sncf":[],"soccer":[],"social":[],"softbank":[],"software":[],"sohu":[],"solar":[],"solutions":[],"song":[],"sony":[],"soy":[],"spa":[],"space":[],"sport":[],"spot":[],"spreadbetting":[],"srl":[],"stada":[],"staples":[],"star":[],"statebank":[],"statefarm":[],"stc":[],"stcgroup":[],"stockholm":[],"storage":[],"store":[],"stream":[],"studio":[],"study":[],"style":[],"sucks":[],"supplies":[],"supply":[],"support":[],"surf":[],"surgery":[],"suzuki":[],"swatch":[],"swiftcover":[],"swiss":[],"sydney":[],"systems":[],"tab":[],"taipei":[],"talk":[],"taobao":[],"target":[],"tatamotors":[],"tatar":[],"tattoo":[],"tax":[],"taxi":[],"tci":[],"tdk":[],"team":[],"tech":[],"technology":[],"temasek":[],"tennis":[],"teva":[],"thd":[],"theater":[],"theatre":[],"tiaa":[],"tickets":[],"tienda":[],"tiffany":[],"tips":[],"tires":[],"tirol":[],"tjmaxx":[],"tjx":[],"tkmaxx":[],"tmall":[],"today":[],"tokyo":[],"tools":[],"top":[],"toray":[],"toshiba":[],"total":[],"tours":[],"town":[],"toyota":[],"toys":[],"trade":[],"trading":[],"training":[],"travel":[],"travelchannel":[],"travelers":[],"travelersinsurance":[],"trust":[],"trv":[],"tube":[],"tui":[],"tunes":[],"tushu":[],"tvs":[],"ubank":[],"ubs":[],"unicom":[],"university":[],"uno":[],"uol":[],"ups":[],"vacations":[],"vana":[],"vanguard":[],"vegas":[],"ventures":[],"verisign":[],"versicherung":[],"vet":[],"viajes":[],"video":[],"vig":[],"viking":[],"villas":[],"vin":[],"vip":[],"virgin":[],"visa":[],"vision":[],"viva":[],"vivo":[],"vlaanderen":[],"vodka":[],"volkswagen":[],"volvo":[],"vote":[],"voting":[],"voto":[],"voyage":[],"vuelos":[],"wales":[],"walmart":[],"walter":[],"wang":[],"wanggou":[],"watch":[],"watches":[],"weather":[],"weatherchannel":[],"webcam":[],"weber":[],"website":[],"wed":[],"wedding":[],"weibo":[],"weir":[],"whoswho":[],"wien":[],"wiki":[],"williamhill":[],"win":[],"windows":[],"wine":[],"winners":[],"wme":[],"wolterskluwer":[],"woodside":[],"work":[],"works":[],"world":[],"wow":[],"wtc":[],"wtf":[],"xbox":[],"xerox":[],"xfinity":[],"xihuan":[],"xin":[],"xn--11b4c3d":[],"xn--1ck2e1b":[],"xn--1qqw23a":[],"xn--30rr7y":[],"xn--3bst00m":[],"xn--3ds443g":[],"xn--3oq18vl8pn36a":[],"xn--3pxu8k":[],"xn--42c2d9a":[],"xn--45q11c":[],"xn--4gbrim":[],"xn--55qw42g":[],"xn--55qx5d":[],"xn--5su34j936bgsg":[],"xn--5tzm5g":[],"xn--6frz82g":[],"xn--6qq986b3xl":[],"xn--80adxhks":[],"xn--80aqecdr1a":[],"xn--80asehdb":[],"xn--80aswg":[],"xn--8y0a063a":[],"xn--9dbq2a":[],"xn--9et52u":[],"xn--9krt00a":[],"xn--b4w605ferd":[],"xn--bck1b9a5dre4c":[],"xn--c1avg":[],"xn--c2br7g":[],"xn--cck2b3b":[],"xn--cckwcxetd":[],"xn--cg4bki":[],"xn--czr694b":[],"xn--czrs0t":[],"xn--czru2d":[],"xn--d1acj3b":[],"xn--eckvdtc9d":[],"xn--efvy88h":[],"xn--fct429k":[],"xn--fhbei":[],"xn--fiq228c5hs":[],"xn--fiq64b":[],"xn--fjq720a":[],"xn--flw351e":[],"xn--fzys8d69uvgm":[],"xn--g2xx48c":[],"xn--gckr3f0f":[],"xn--gk3at1e":[],"xn--hxt814e":[],"xn--i1b6b1a6a2e":[],"xn--imr513n":[],"xn--io0a7i":[],"xn--j1aef":[],"xn--jlq480n2rg":[],"xn--jlq61u9w7b":[],"xn--jvr189m":[],"xn--kcrx77d1x4a":[],"xn--kput3i":[],"xn--mgba3a3ejt":[],"xn--mgba7c0bbn0a":[],"xn--mgbaakc7dvf":[],"xn--mgbab2bd":[],"xn--mgbca7dzdo":[],"xn--mgbi4ecexp":[],"xn--mgbt3dhd":[],"xn--mk1bu44c":[],"xn--mxtq1m":[],"xn--ngbc5azd":[],"xn--ngbe9e0a":[],"xn--ngbrx":[],"xn--nqv7f":[],"xn--nqv7fs00ema":[],"xn--nyqy26a":[],"xn--otu796d":[],"xn--p1acf":[],"xn--pssy2u":[],"xn--q9jyb4c":[],"xn--qcka1pmc":[],"xn--rhqv96g":[],"xn--rovu88b":[],"xn--ses554g":[],"xn--t60b56a":[],"xn--tckwe":[],"xn--tiq49xqyj":[],"xn--unup4y":[],"xn--vermgensberater-ctb":[],"xn--vermgensberatung-pwb":[],"xn--vhquv":[],"xn--vuq861b":[],"xn--w4r85el8fhu5dnra":[],"xn--w4rs40l":[],"xn--xhq521b":[],"xn--zfr164b":[],"xyz":[],"yachts":[],"yahoo":[],"yamaxun":[],"yandex":[],"yodobashi":[],"yoga":[],"yokohama":[],"you":[],"youtube":[],"yun":[],"zappos":[],"zara":[],"zero":[],"zip":[],"zone":[],"zuerich":[]},"PRIVATE_DOMAINS":{"ua":{"cc":[],"inf":[],"ltd":[],"biz":[],"co":[],"pp":[],"v":[]},"to":{"611":[],"oya":[],"vpnplus":[],"quickconnect":{"direct":[]},"nyan":[]},"com":{"adobeaemcloud":{"dev":{"*":[]}},"kasserver":[],"amazonaws":{"compute":{"*":[]},"compute-1":{"*":[]},"us-east-1":{"dualstack":{"s3":[]}},"elb":{"*":[]},"s3":[],"s3-ap-northeast-1":[],"s3-ap-northeast-2":[],"s3-ap-south-1":[],"s3-ap-southeast-1":[],"s3-ap-southeast-2":[],"s3-ca-central-1":[],"s3-eu-central-1":[],"s3-eu-west-1":[],"s3-eu-west-2":[],"s3-eu-west-3":[],"s3-external-1":[],"s3-fips-us-gov-west-1":[],"s3-sa-east-1":[],"s3-us-gov-west-1":[],"s3-us-east-2":[],"s3-us-west-1":[],"s3-us-west-2":[],"ap-northeast-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-south-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ca-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-central-1":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"eu-west-3":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"us-east-2":{"s3":[],"dualstack":{"s3":[]},"s3-website":[]},"ap-northeast-1":{"dualstack":{"s3":[]}},"ap-southeast-1":{"dualstack":{"s3":[]}},"ap-southeast-2":{"dualstack":{"s3":[]}},"eu-west-1":{"dualstack":{"s3":[]}},"sa-east-1":{"dualstack":{"s3":[]}},"s3-website-us-east-1":[],"s3-website-us-west-1":[],"s3-website-us-west-2":[],"s3-website-ap-northeast-1":[],"s3-website-ap-southeast-1":[],"s3-website-ap-southeast-2":[],"s3-website-eu-west-1":[],"s3-website-sa-east-1":[]},"elasticbeanstalk":{"ap-northeast-1":[],"ap-northeast-2":[],"ap-northeast-3":[],"ap-south-1":[],"ap-southeast-1":[],"ap-southeast-2":[],"ca-central-1":[],"eu-central-1":[],"eu-west-1":[],"eu-west-2":[],"eu-west-3":[],"sa-east-1":[],"us-east-1":[],"us-east-2":[],"us-gov-west-1":[],"us-west-1":[],"us-west-2":[]},"on-aptible":[],"myasustor":[],"balena-devices":[],"betainabox":[],"bplaced":[],"ar":[],"br":[],"cn":[],"de":[],"eu":[],"gb":[],"hu":[],"jpn":[],"kr":[],"mex":[],"no":[],"qc":[],"ru":[],"sa":[],"uk":[],"us":[],"uy":[],"za":[],"africa":[],"gr":[],"co":[],"xenapponazure":[],"jdevcloud":[],"wpdevcloud":[],"cloudcontrolled":[],"cloudcontrolapp":[],"trycloudflare":[],"customer-oci":{"*":[],"oci":{"*":[]},"ocp":{"*":[]},"ocs":{"*":[]}},"dattolocal":[],"dattorelay":[],"dattoweb":[],"mydatto":[],"builtwithdark":[],"drayddns":[],"dreamhosters":[],"mydrobo":[],"dyndns-at-home":[],"dyndns-at-work":[],"dyndns-blog":[],"dyndns-free":[],"dyndns-home":[],"dyndns-ip":[],"dyndns-mail":[],"dyndns-office":[],"dyndns-pics":[],"dyndns-remote":[],"dyndns-server":[],"dyndns-web":[],"dyndns-wiki":[],"dyndns-work":[],"blogdns":[],"cechire":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dyn-o-saur":[],"dynalias":[],"est-a-la-maison":[],"est-a-la-masion":[],"est-le-patron":[],"est-mon-blogueur":[],"from-ak":[],"from-al":[],"from-ar":[],"from-ca":[],"from-ct":[],"from-dc":[],"from-de":[],"from-fl":[],"from-ga":[],"from-hi":[],"from-ia":[],"from-id":[],"from-il":[],"from-in":[],"from-ks":[],"from-ky":[],"from-ma":[],"from-md":[],"from-mi":[],"from-mn":[],"from-mo":[],"from-ms":[],"from-mt":[],"from-nc":[],"from-nd":[],"from-ne":[],"from-nh":[],"from-nj":[],"from-nm":[],"from-nv":[],"from-oh":[],"from-ok":[],"from-or":[],"from-pa":[],"from-pr":[],"from-ri":[],"from-sc":[],"from-sd":[],"from-tn":[],"from-tx":[],"from-ut":[],"from-va":[],"from-vt":[],"from-wa":[],"from-wi":[],"from-wv":[],"from-wy":[],"getmyip":[],"gotdns":[],"hobby-site":[],"homelinux":[],"homeunix":[],"iamallama":[],"is-a-anarchist":[],"is-a-blogger":[],"is-a-bookkeeper":[],"is-a-bulls-fan":[],"is-a-caterer":[],"is-a-chef":[],"is-a-conservative":[],"is-a-cpa":[],"is-a-cubicle-slave":[],"is-a-democrat":[],"is-a-designer":[],"is-a-doctor":[],"is-a-financialadvisor":[],"is-a-geek":[],"is-a-green":[],"is-a-guru":[],"is-a-hard-worker":[],"is-a-hunter":[],"is-a-landscaper":[],"is-a-lawyer":[],"is-a-liberal":[],"is-a-libertarian":[],"is-a-llama":[],"is-a-musician":[],"is-a-nascarfan":[],"is-a-nurse":[],"is-a-painter":[],"is-a-personaltrainer":[],"is-a-photographer":[],"is-a-player":[],"is-a-republican":[],"is-a-rockstar":[],"is-a-socialist":[],"is-a-student":[],"is-a-teacher":[],"is-a-techie":[],"is-a-therapist":[],"is-an-accountant":[],"is-an-actor":[],"is-an-actress":[],"is-an-anarchist":[],"is-an-artist":[],"is-an-engineer":[],"is-an-entertainer":[],"is-certified":[],"is-gone":[],"is-into-anime":[],"is-into-cars":[],"is-into-cartoons":[],"is-into-games":[],"is-leet":[],"is-not-certified":[],"is-slick":[],"is-uberleet":[],"is-with-theband":[],"isa-geek":[],"isa-hockeynut":[],"issmarterthanyou":[],"likes-pie":[],"likescandy":[],"neat-url":[],"saves-the-whales":[],"selfip":[],"sells-for-less":[],"sells-for-u":[],"servebbs":[],"simple-url":[],"space-to-rent":[],"teaches-yoga":[],"writesthisblog":[],"ddnsfree":[],"ddnsgeek":[],"giize":[],"gleeze":[],"kozow":[],"loseyourip":[],"ooguy":[],"theworkpc":[],"mytuleap":[],"evennode":{"eu-1":[],"eu-2":[],"eu-3":[],"eu-4":[],"us-1":[],"us-2":[],"us-3":[],"us-4":[]},"onfabrica":[],"fbsbx":{"apps":[]},"fastly-terrarium":[],"fastvps-server":[],"mydobiss":[],"firebaseapp":[],"freebox-os":[],"freeboxos":[],"gentapps":[],"gentlentapis":[],"githubusercontent":[],"0emm":{"*":[]},"appspot":{"r":{"*":[]}},"blogspot":[],"codespot":[],"googleapis":[],"googlecode":[],"pagespeedmobilizer":[],"publishproxy":[],"withgoogle":[],"withyoutube":[],"awsmppl":[],"herokuapp":[],"herokussl":[],"myravendb":[],"pixolino":[],"dopaas":[],"hidora":[],"ik-server":{"jcloud":[]},"jelastic":{"demo":[]},"joyent":{"cns":{"*":[]}},"lpusercontent":[],"lmpm":{"app":[]},"linode":{"members":[],"nodebalancer":{"*":[]}},"linodeobjects":{"*":[]},"barsycenter":[],"barsyonline":[],"miniserver":[],"meteorapp":{"eu":[]},"4u":[],"nfshost":[],"001www":[],"ddnslive":[],"myiphost":[],"blogsyte":[],"ciscofreak":[],"damnserver":[],"ditchyourip":[],"dnsiskinky":[],"dynns":[],"geekgalaxy":[],"health-carereform":[],"homesecuritymac":[],"homesecuritypc":[],"myactivedirectory":[],"mysecuritycamera":[],"net-freaks":[],"onthewifi":[],"point2this":[],"quicksytes":[],"securitytactics":[],"serveexchange":[],"servehumour":[],"servep2p":[],"servesarcasm":[],"stufftoread":[],"unusualperson":[],"workisboring":[],"3utilities":[],"ddnsking":[],"myvnc":[],"servebeer":[],"servecounterstrike":[],"serveftp":[],"servegame":[],"servehalflife":[],"servehttp":[],"serveirc":[],"servemp3":[],"servepics":[],"servequake":[],"observableusercontent":{"static":[]},"operaunite":[],"skygearapp":[],"outsystemscloud":[],"ownprovider":[],"pgfog":[],"pagefrontapp":[],"pagexl":[],"gotpantheon":[],"platter-app":[],"pleskns":[],"prgmr":{"xen":[]},"qualifioapp":[],"qbuser":[],"qa2":[],"dev-myqnapcloud":[],"alpha-myqnapcloud":[],"myqnapcloud":[],"quipelements":{"*":[]},"rackmaze":[],"rhcloud":[],"render":{"app":[]},"onrender":[],"logoip":[],"scrysec":[],"firewall-gateway":[],"myshopblocks":[],"shopitsite":[],"1kapp":[],"appchizi":[],"applinzi":[],"sinaapp":[],"vipsinaapp":[],"bounty-full":{"alpha":[],"beta":[]},"stackhero-network":[],"playstation-cloud":[],"stdlib":{"api":[]},"temp-dns":[],"dsmynas":[],"familyds":[],"thingdustdata":[],"bloxcms":[],"townnews-staging":[],"hk":[],"wafflecell":[],"remotewd":[],"wiardweb":{"pages":[]},"xnbay":{"u2":[],"u2-local":[]},"yolasite":[],"wpenginepowered":[],"impertrixcdn":[],"impertrix":[]},"net":{"adobeaemcloud":[],"alwaysdata":[],"cloudfront":[],"t3l3p0rt":[],"myfritz":[],"blackbaudcdn":[],"boomla":[],"bplaced":[],"square7":[],"gb":[],"hu":[],"jp":[],"se":[],"uk":[],"in":[],"clic2000":[],"cloudaccess":[],"cdn77-ssl":[],"cdn77":{"r":[]},"cloudeity":[],"feste-ip":[],"knx-server":[],"static-access":[],"cryptonomic":{"*":[]},"dattolocal":[],"mydatto":[],"debian":[],"bitbridge":[],"at-band-camp":[],"blogdns":[],"broke-it":[],"buyshouses":[],"dnsalias":[],"dnsdojo":[],"does-it":[],"dontexist":[],"dynalias":[],"dynathome":[],"endofinternet":[],"from-az":[],"from-co":[],"from-la":[],"from-ny":[],"gets-it":[],"ham-radio-op":[],"homeftp":[],"homeip":[],"homelinux":[],"homeunix":[],"in-the-band":[],"is-a-chef":[],"is-a-geek":[],"isa-geek":[],"kicks-ass":[],"office-on-the":[],"podzone":[],"scrapper-site":[],"selfip":[],"sells-it":[],"servebbs":[],"serveftp":[],"thruhere":[],"webhop":[],"definima":[],"casacam":[],"dynu":[],"dynv6":[],"twmail":[],"ru":[],"channelsdvr":{"u":[]},"fastlylb":{"map":[]},"fastly":{"freetls":[],"map":[],"prod":{"a":[],"global":[]},"ssl":{"a":[],"b":[],"global":[]}},"edgeapp":[],"flynnhosting":[],"cloudfunctions":[],"moonscale":[],"in-dsl":[],"in-vpn":[],"ipifony":[],"iobb":[],"cloudjiffy":[],"elastx":{"jls-sto1":[]},"saveincloud":{"jelastic":[]},"kinghost":[],"uni5":[],"barsy":[],"memset":[],"azurewebsites":[],"azure-mobile":[],"cloudapp":[],"dnsup":[],"hicam":[],"now-dns":[],"ownip":[],"vpndns":[],"eating-organic":[],"mydissent":[],"myeffect":[],"mymediapc":[],"mypsx":[],"mysecuritycamera":[],"nhlfan":[],"no-ip":[],"pgafan":[],"privatizehealthinsurance":[],"bounceme":[],"ddns":[],"redirectme":[],"serveblog":[],"serveminecraft":[],"sytes":[],"cloudycluster":[],"rackmaze":[],"schokokeks":[],"firewall-gateway":[],"seidat":[],"senseering":[],"siteleaf":[],"srcf":{"soc":[],"user":[]},"dsmynas":[],"familyds":[],"community-pro":[],"meinforum":[],"yandexcloud":{"storage":[],"website":[]},"za":[]},"pl":{"beep":[],"krasnik":[],"leczna":[],"lubartow":[],"lublin":[],"poniatowa":[],"swidnik":[],"co":[],"art":[],"gliwice":[],"krakow":[],"poznan":[],"wroc":[],"zakopane":[],"gda":[],"gdansk":[],"gdynia":[],"med":[],"sopot":[]},"ca":{"barsy":[],"awdev":{"*":[]},"co":[],"blogspot":[],"no-ip":[]},"estate":{"compute":{"*":[]}},"network":{"alces":{"*":[]},"co":[],"arvo":[],"azimuth":[]},"org":{"altervista":[],"amune":{"tele":[]},"pimienta":[],"poivron":[],"potager":[],"sweetpepper":[],"ae":[],"us":[],"certmgr":[],"cdn77":{"c":[],"rsc":[]},"cdn77-secure":{"origin":{"ssl":[]}},"cloudns":[],"duckdns":[],"tunk":[],"dyndns":{"go":[],"home":[]},"blogdns":[],"blogsite":[],"boldlygoingnowhere":[],"dnsalias":[],"dnsdojo":[],"doesntexist":[],"dontexist":[],"doomdns":[],"dvrdns":[],"dynalias":[],"endofinternet":[],"endoftheinternet":[],"from-me":[],"game-host":[],"gotdns":[],"hobby-site":[],"homedns":[],"homeftp":[],"homelinux":[],"homeunix":[],"is-a-bruinsfan":[],"is-a-candidate":[],"is-a-celticsfan":[],"is-a-chef":[],"is-a-geek":[],"is-a-knight":[],"is-a-linux-user":[],"is-a-patsfan":[],"is-a-soxfan":[],"is-found":[],"is-lost":[],"is-saved":[],"is-very-bad":[],"is-very-evil":[],"is-very-good":[],"is-very-nice":[],"is-very-sweet":[],"isa-geek":[],"kicks-ass":[],"misconfused":[],"podzone":[],"readmyblog":[],"selfip":[],"sellsyourhome":[],"servebbs":[],"serveftp":[],"servegame":[],"stuff-4-sale":[],"webhop":[],"ddnss":[],"accesscam":[],"camdvr":[],"freeddns":[],"mywire":[],"webredirect":[],"eu":{"al":[],"asso":[],"at":[],"au":[],"be":[],"bg":[],"ca":[],"cd":[],"ch":[],"cn":[],"cy":[],"cz":[],"de":[],"dk":[],"edu":[],"ee":[],"es":[],"fi":[],"fr":[],"gr":[],"hr":[],"hu":[],"ie":[],"il":[],"in":[],"int":[],"is":[],"it":[],"jp":[],"kr":[],"lt":[],"lu":[],"lv":[],"mc":[],"me":[],"mk":[],"mt":[],"my":[],"net":[],"ng":[],"nl":[],"no":[],"nz":[],"paris":[],"pl":[],"pt":[],"q-a":[],"ro":[],"ru":[],"se":[],"si":[],"sk":[],"tr":[],"uk":[],"us":[]},"twmail":[],"fedorainfracloud":[],"fedorapeople":[],"fedoraproject":{"cloud":[],"os":{"app":[]},"stg":{"os":{"app":[]}}},"freedesktop":[],"hepforge":[],"in-dsl":[],"in-vpn":[],"js":[],"uklugs":[],"barsy":[],"mayfirst":[],"mozilla-iot":[],"bmoattachments":[],"dynserv":[],"now-dns":[],"cable-modem":[],"collegefan":[],"couchpotatofries":[],"mlbfan":[],"mysecuritycamera":[],"nflfan":[],"read-books":[],"ufcfan":[],"hopto":[],"myftp":[],"no-ip":[],"zapto":[],"pubtls":[],"my-firewall":[],"myfirewall":[],"spdns":[],"dsmynas":[],"familyds":[],"edugit":[],"tuxfamily":[],"diskstation":[],"hk":[],"wmflabs":[],"toolforge":[],"wmcloud":[],"za":[]},"cn":{"com":{"amazonaws":{"compute":{"*":[]},"eb":{"cn-north-1":[],"cn-northwest-1":[]},"elb":{"*":[]},"cn-north-1":{"s3":[]}}},"instantcloud":[]},"nl":{"amsw":[],"virtueeldomein":[],"co":[],"hosting-cluster":[],"blogspot":[],"khplay":[],"transurl":{"*":[]},"cistron":[],"demon":[]},"io":{"apigee":[],"b-data":[],"backplaneapp":[],"banzaicloud":{"app":[],"backyards":{"*":[]}},"boxfuse":[],"browsersafetymark":[],"bigv":{"uk0":[]},"cleverapps":[],"dappnode":{"dyndns":[]},"dedyn":[],"drud":[],"definima":[],"enonic":{"customer":[]},"shw":[],"github":[],"gitlab":[],"lolipop":[],"hasura-app":[],"hostyhosting":[],"moonscale":{"*":[]},"jele":[],"loginline":[],"barsy":[],"azurecontainer":{"*":[]},"ngrok":[],"nodeart":{"stage":[]},"nodum":[],"nid":[],"pantheonsite":[],"dyn53":[],"protonet":[],"qcx":{"sys":{"*":[]}},"vaporcloud":[],"vbrplsbx":{"g":[]},"on-k3s":{"*":[]},"on-rio":{"*":[]},"readthedocs":[],"resindevice":[],"resinstaging":{"devices":[]},"hzc":[],"sandcats":[],"shiftedit":[],"mo-siemens":[],"lair":{"apps":[]},"stolos":{"*":[]},"spacekit":[],"utwente":[],"applicationcloud":[],"scapp":[],"s5y":{"*":[]},"telebit":[],"thingdust":{"dev":{"cust":[]},"disrec":{"cust":[]},"prod":{"cust":[]},"testing":{"cust":[]}},"2038":[],"wedeploy":[],"basicserver":[],"virtualserver":[]},"jp":{"ne":{"aseinet":{"user":[]},"gehirn":[]},"usercontent":[],"blogspot":[]},"vc":{"gv":{"d":[]},"0e":[],"nom":[]},"eus":{"party":{"user":[]}},"ws":{"advisor":{"*":[]},"cloud66":[],"dyndns":[],"mypets":[]},"cloud":{"banzai":{"*":[]},"statics":{"*":[]},"jele":[],"linkyard":[],"magentosite":{"*":[]},"perspecta":[],"vapor":[],"on-rancher":{"*":[]},"sensiosite":{"*":[]},"trafficplex":[],"urown":[],"voorloper":[]},"la":{"bnr":[],"c":[],"nym":[]},"ch":{"square7":[],"blogspot":[],"linkyard-cloud":[],"dnsking":[],"gotdns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"de":{"bplaced":[],"square7":[],"com":[],"cosidns":{"dyn":[]},"dynamisches-dns":[],"dnsupdater":[],"internet-dns":[],"l-o-g-i-n":[],"dnshome":[],"fuettertdasnetz":[],"isteingeek":[],"istmein":[],"lebtimnetz":[],"leitungsen":[],"traeumtgerade":[],"ddnss":{"dyn":[],"dyndns":[]},"dyndns1":[],"dyn-ip24":[],"home-webserver":{"dyn":[]},"myhome-server":[],"goip":[],"blogspot":[],"dyn-berlin":[],"in-berlin":[],"in-brb":[],"in-butter":[],"in-dsl":[],"in-vpn":[],"mein-iserv":[],"schulserver":[],"test-iserv":[],"keymachine":[],"git-repos":[],"lcube-server":[],"svn-repos":[],"barsy":[],"logoip":[],"firewall-gateway":[],"my-gateway":[],"my-router":[],"spdns":[],"speedpartner":{"customer":[]},"taifun-dns":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[],"dd-dns":[],"dray-dns":[],"draydns":[],"dyn-vpn":[],"dynvpn":[],"mein-vigor":[],"my-vigor":[],"my-wan":[],"syno-ds":[],"synology-diskstation":[],"synology-ds":[],"uberspace":{"*":[]},"virtualuser":[],"virtual-user":[],"community-pro":[],"diskussionsbereich":[]},"uk":{"co":{"bytemark":{"dh":[],"vm":[]},"blogspot":[],"layershift":{"j":[]},"barsy":[],"barsyonline":[],"nh-serv":[],"no-ip":[],"wellbeingzone":[],"gwiddle":[]},"conn":[],"copro":[],"gov":{"service":[],"homeoffice":[]},"org":{"glug":[],"lug":[],"lugs":[]},"barsy":[]},"eu":{"mycd":[],"cloudns":[],"barsy":[],"wellbeingzone":[],"spdns":[],"transurl":{"*":[]},"diskstation":[]},"co":{"carrd":[],"crd":[],"otap":{"*":[]},"com":{"blogspot":[]},"leadpages":[],"lpages":[],"mypi":[],"n4t":[],"nodum":[],"repl":[]},"ai":{"uwu":[],"nom":[]},"se":{"com":[],"blogspot":[],"conf":[]},"bz":{"za":[],"nom":[],"nym":[]},"group":{"discourse":[]},"team":{"discourse":[],"jelastic":[]},"dev":{"lcl":{"*":[]},"stg":{"*":[]},"workers":[],"curv":[],"fly":[],"iserv":[],"loginline":[],"platter-app":[],"vercel":[],"webhare":{"*":[]}},"me":{"c66":[],"daplie":{"localhost":[]},"edgestack":[],"couk":[],"ukco":[],"filegear":[],"filegear-au":[],"filegear-de":[],"filegear-gb":[],"filegear-ie":[],"filegear-jp":[],"filegear-sg":[],"glitch":[],"ravendb":[],"barsy":[],"nctu":[],"soundcast":[],"tcp4":[],"brasilia":[],"ddns":[],"dnsfor":[],"hopto":[],"loginto":[],"noip":[],"webhop":[],"nym":[],"diskstation":[],"dscloud":[],"i234":[],"myds":[],"synology":[],"wedeploy":[],"yombo":[],"nohost":[]},"zone":{"cloud66":[],"hs":[],"triton":{"*":[]},"lima":[]},"host":{"cloudaccess":[],"freesite":[],"fastvps":[],"myfast":[],"jele":[],"mircloud":[],"pcloud":[],"half":[]},"site":{"cloudera":[],"cyon":[],"fastvps":[],"jele":[],"lelux":[],"loginline":[],"barsy":[],"opensocial":[],"platformsh":{"*":[]},"byen":[],"mintere":[]},"app":{"wnext":[],"run":{"a":[]},"web":[],"hasura":[],"loginline":[],"netlify":[],"telebit":[],"vercel":[]},"cz":{"co":[],"realm":[],"e4":[],"blogspot":[],"metacentrum":{"cloud":[],"custom":[]},"muni":{"cloud":{"flt":[],"usr":[]}}},"asia":{"cloudns":[]},"biz":{"cloudns":[],"dyndns":[],"for-better":[],"for-more":[],"for-some":[],"for-the":[],"selfip":[],"webhop":[],"bpl":[],"orx":[],"mmafan":[],"myftp":[],"no-ip":[],"dscloud":[]},"club":{"cloudns":[],"jele":[],"barsy":[],"pony":[]},"cc":{"cloudns":[],"ftpaccess":[],"game-server":[],"myphotos":[],"scrapping":[],"twmail":[],"csx":[],"fantasyleague":[]},"in":{"cloudns":[],"blogspot":[],"barsy":[]},"info":{"cloudns":[],"dynamic-dns":[],"dyndns":[],"barrel-of-knowledge":[],"barrell-of-knowledge":[],"for-our":[],"groks-the":[],"groks-this":[],"here-for-more":[],"knowsitall":[],"selfip":[],"webhop":[],"barsy":[],"mayfirst":[],"forumz":[],"nsupdate":[],"dvrcam":[],"ilovecollege":[],"no-ip":[],"dnsupdate":[],"v-info":[]},"pro":{"cloudns":[],"dnstrace":{"bci":[]},"barsy":[]},"pw":{"cloudns":[],"x443":[],"nom":[]},"us":{"cloudns":[],"drud":[],"is-by":[],"land-4-sale":[],"stuff-4-sale":[],"graphox":[],"freeddns":[],"golffan":[],"noip":[],"pointto":[],"platterp":[],"de":{"lib":[]}},"gdn":{"cnpy":[]},"no":{"co":[],"blogspot":[]},"be":{"webhosting":[],"blogspot":[],"transurl":{"*":[]}},"ru":{"ac":[],"edu":[],"gov":[],"int":[],"mil":[],"test":[],"adygeya":[],"bashkiria":[],"bir":[],"cbg":[],"com":[],"dagestan":[],"grozny":[],"kalmykia":[],"kustanai":[],"marine":[],"mordovia":[],"msk":[],"mytis":[],"nalchik":[],"nov":[],"pyatigorsk":[],"spb":[],"vladikavkaz":[],"vladimir":[],"blogspot":[],"regruhosting":{"jelastic":[]},"myjino":{"hosting":{"*":[]},"landing":{"*":[]},"spectrum":{"*":[]},"vps":{"*":[]}},"cldmail":{"hb":[]},"net":[],"org":[],"pp":[],"ras":[]},"is":{"cupcake":[],"blogspot":[]},"link":{"cyon":[],"mypep":[],"dweb":{"*":[]}},"dk":{"biz":[],"co":[],"firm":[],"reg":[],"store":[],"blogspot":[]},"earth":{"dapps":{"*":[],"bzz":{"*":[]}}},"th":{"online":[],"shop":[]},"fi":{"dy":[],"blogspot":[],"xn--hkkinen-5wa":[],"iki":[]},"tv":{"dyndns":[],"better-than":[],"on-the-web":[],"worse-than":[]},"cx":{"ath":[],"info":[]},"name":{"her":{"forgot":[]},"his":{"forgot":[]}},"nu":{"merseine":[],"mine":[],"shacknet":[],"nom":[],"uwu":[],"enterprisecloud":[]},"rocks":{"myddns":[],"lima-city":[],"webspace":[]},"xyz":{"blogsite":[],"fhapp":[],"crafting":[],"zapto":[],"telebit":{"*":[]}},"fr":{"en-root":[],"fbx-os":[],"fbxos":[],"freebox-os":[],"freeboxos":[],"blogspot":[],"on-web":[],"chirurgiens-dentistes-en-france":[]},"one":{"onred":{"staging":[]},"for":[],"homelink":[]},"tw":{"com":{"mymailer":[]},"url":[],"blogspot":[],"nym":[]},"su":{"abkhazia":[],"adygeya":[],"aktyubinsk":[],"arkhangelsk":[],"armenia":[],"ashgabad":[],"azerbaijan":[],"balashov":[],"bashkiria":[],"bryansk":[],"bukhara":[],"chimkent":[],"dagestan":[],"east-kazakhstan":[],"exnet":[],"georgia":[],"grozny":[],"ivanovo":[],"jambyl":[],"kalmykia":[],"kaluga":[],"karacol":[],"karaganda":[],"karelia":[],"khakassia":[],"krasnodar":[],"kurgan":[],"kustanai":[],"lenug":[],"mangyshlak":[],"mordovia":[],"msk":[],"murmansk":[],"nalchik":[],"navoi":[],"north-kazakhstan":[],"nov":[],"obninsk":[],"penza":[],"pokrovsk":[],"sochi":[],"spb":[],"tashkent":[],"termez":[],"togliatti":[],"troitsk":[],"tselinograd":[],"tula":[],"tuva":[],"vladikavkaz":[],"vladimir":[],"vologda":[],"nym":[]},"space":{"myfast":[],"linkitools":[],"uber":[],"xs4all":[]},"at":{"funkfeuer":{"wien":[]},"futurecms":{"*":[],"ex":{"*":[]},"in":{"*":[]}},"futurehosting":[],"futuremailing":[],"ortsinfo":{"ex":{"*":[]},"kunden":{"*":[]}},"co":{"blogspot":[]},"biz":[],"info":[],"priv":[],"12hp":[],"2ix":[],"4lima":[],"lima-city":[]},"ms":{"lab":[]},"si":{"gitpage":[],"blogspot":[],"nom":[]},"digital":{"cloudapps":{"london":[]}},"im":{"ro":[],"nom":[]},"ro":{"shop":[],"blogspot":[],"nym":[]},"ae":{"blogspot":[],"nom":[]},"al":{"blogspot":[],"nom":[]},"am":{"blogspot":[],"neko":[],"nyaa":[]},"ba":{"blogspot":[]},"bg":{"blogspot":[],"barsy":[]},"bj":{"blogspot":[]},"cf":{"blogspot":[]},"cl":{"blogspot":[],"nom":[]},"id":{"co":{"blogspot":[]}},"il":{"co":{"blogspot":[]}},"ke":{"co":{"blogspot":[]},"nom":[]},"nz":{"co":{"blogspot":[]},"nym":[]},"za":{"co":{"blogspot":[]}},"ar":{"com":{"blogspot":[]}},"au":{"com":{"blogspot":[]}},"br":{"com":{"blogspot":[]},"leg":{"ac":[],"al":[],"am":[],"ap":[],"ba":[],"ce":[],"df":[],"es":[],"go":[],"ma":[],"mg":[],"ms":[],"mt":[],"pa":[],"pb":[],"pe":[],"pi":[],"pr":[],"rj":[],"rn":[],"ro":[],"rr":[],"rs":[],"sc":[],"se":[],"sp":[],"to":[]}},"by":{"com":{"blogspot":[]},"nym":[]},"cy":{"com":{"blogspot":[],"scaleforce":{"j":[]}}},"ee":{"com":{"blogspot":[]}},"eg":{"com":{"blogspot":[]}},"es":{"com":{"blogspot":[]}},"mt":{"com":{"blogspot":[]}},"ng":{"com":{"blogspot":[]},"col":[],"firm":[],"gen":[],"ltd":[],"ngo":[]},"tr":{"com":{"blogspot":[]}},"uy":{"com":{"blogspot":[]},"nom":[]},"cv":{"blogspot":[]},"gr":{"blogspot":[],"nym":[]},"hk":{"blogspot":[],"nym":[],"ltd":[],"inc":[]},"hr":{"blogspot":[],"free":[]},"hu":{"blogspot":[]},"ie":{"blogspot":[],"nym":[]},"it":{"blogspot":[],"16-b":[],"32-b":[],"64-b":[],"syncloud":[]},"kr":{"blogspot":[]},"li":{"blogspot":[],"caa":[],"nom":[],"nym":[]},"lt":{"blogspot":[],"nym":[]},"lu":{"blogspot":[],"nym":[]},"md":{"blogspot":[],"at":[],"de":[],"jp":[],"to":[]},"mk":{"blogspot":[],"nom":[]},"mr":{"blogspot":[]},"mx":{"blogspot":[],"nym":[]},"my":{"blogspot":[]},"pe":{"blogspot":[],"nym":[]},"pt":{"blogspot":[],"nym":[]},"qa":{"blogspot":[],"nom":[]},"re":{"blogspot":[]},"rs":{"blogspot":[],"ua":[],"nom":[],"ox":[]},"sg":{"blogspot":[]},"sk":{"blogspot":[],"nym":[]},"sn":{"blogspot":[]},"td":{"blogspot":[]},"ug":{"blogspot":[],"nom":[]},"vn":{"blogspot":[]},"goog":{"cloud":[]},"ci":{"fin":[],"nl":[]},"run":{"hs":[],"development":[],"ravendb":[],"repl":[]},"sh":{"hashbang":[],"platform":{"bc":[],"ent":[],"eu":[],"us":[]},"now":[],"vxl":[],"wedeploy":[]},"community":{"ravendb":[],"myforum":[]},"city":{"ng":[]},"gl":{"biz":[],"nom":[],"xx":[]},"ink":{"ng":[]},"school":{"ng":[]},"so":{"sch":[]},"gg":{"kaas":[],"cya":[],"panel":{"daemon":[]}},"systems":{"knightpoint":[]},"krd":{"co":[],"edu":[]},"business":{"co":[]},"education":{"co":[]},"events":{"co":[]},"financial":{"co":[]},"place":{"co":[]},"technology":{"co":[]},"bs":{"we":[]},"services":{"loginline":[]},"menu":{"barsy":[]},"mobi":{"barsy":[],"dscloud":[]},"online":{"barsy":[]},"pub":{"barsy":[]},"shop":{"barsy":[]},"support":{"barsy":[]},"casa":{"nabu":{"ui":[]}},"fashion":{"of":[],"on":[]},"football":{"of":[]},"london":{"in":[],"of":[]},"men":{"for":[]},"mom":{"and":[],"for":[]},"sale":{"for":[]},"work":{"of":[],"to":[]},"top":{"now-dns":[],"ntdll":[]},"ovh":{"nerdpol":[]},"mn":{"nyc":[],"nym":[]},"af":{"nom":[]},"ec":{"nym":[]},"gd":{"nom":[]},"ge":{"nom":[]},"gt":{"nom":[],"blog":[],"de":[],"to":[]},"gy":{"nym":[],"be":[]},"hn":{"nom":[],"cc":[]},"kz":{"nym":[]},"lc":{"nym":[],"oy":[]},"lv":{"nom":[]},"st":{"nom":[],"noho":[]},"sx":{"nym":[]},"tj":{"nom":[]},"vg":{"nom":[],"at":[]},"hosting":{"opencraft":[]},"pm":{"own":[]},"codes":{"owo":{"*":[]}},"page":{"pdns":[],"plesk":[],"prvcy":[]},"bn":{"co":[]},"fit":{"ptplus":[]},"edu":{"rit":{"git-pages":[]}},"scot":{"gov":[]},"store":{"shopware":[]},"land":{"static":{"dev":[],"sites":[]}},"farm":{"storj":[]},"cool":{"de":[]},"pictures":{"1337":[]},"rip":{"clan":[]},"management":{"router":[]},"ax":{"be":[],"cat":[],"es":[],"eu":[],"gg":[],"mc":[],"us":[],"xy":[]},"gp":{"app":[]},"kg":{"blog":[],"io":[],"jp":[],"tv":[],"uk":[],"us":[]},"ls":{"de":[]},"porn":{"indie":[]},"tc":{"ch":[],"me":[],"we":[]},"vu":{"blog":[],"dev":[],"me":[],"cn":[]},"academy":{"official":[]},"faith":{"ybo":[]},"party":{"ybo":[]},"review":{"ybo":[]},"science":{"ybo":[]},"trade":{"ybo":[]},"design":{"bss":[]}}}"; \ No newline at end of file From 162019ec0f5d0124652dba38e946b90735580a68 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 23 Aug 2020 21:55:12 +0200 Subject: [PATCH 232/461] Adding processing the second level domain --- phpstan.src.neon | 2 + src/ResolvedDomain.php | 44 +++++++++++++----- src/ResolvedDomainName.php | 17 ++++++- tests/ResolvedDomainTest.php | 87 +++++++++++++++++++++++++++--------- 4 files changed, 117 insertions(+), 33 deletions(-) diff --git a/phpstan.src.neon b/phpstan.src.neon index 4f123862..28076679 100644 --- a/phpstan.src.neon +++ b/phpstan.src.neon @@ -12,4 +12,6 @@ parameters: path: src/ResolvedDomain.php - message: '#Method Pdp\\ResolvedDomain::withSubDomain\(\) has parameter \$subDomain with no typehint specified.#' path: src/ResolvedDomain.php + - message: '#Call to function array_keys\(\) requires parameter \#3 to be set.#' + path: src/Domain.php reportUnmatchedIgnoredErrors: true diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 0cb902d7..83870755 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -191,9 +191,14 @@ public function getUnicodeIDNAOption(): int return $this->domain->getUnicodeIDNAOption(); } - public function getRegistrableDomain(): DomainName + public function getRegistrableDomain(): ResolvedDomain { - return $this->registrableDomain; + return new self($this->registrableDomain, $this->publicSuffix); + } + + public function getSecondLevelDomain(): ?string + { + return $this->registrableDomain->label(-1); } public function getSubDomain(): DomainName @@ -271,15 +276,14 @@ public function withSubDomain($subDomain): self throw UnableToResolveDomain::dueToMissingRegistrableDomain($this); } - if (null === $subDomain) { - $subDomain = Domain::fromNull($this->getAsciiIDNAOption(), $this->getUnicodeIDNAOption()); - } - if (!$subDomain instanceof DomainName) { $subDomain = new Domain($subDomain); } - $subDomain = $subDomain ?? Domain::fromNull($this->getAsciiIDNAOption(), $this->getUnicodeIDNAOption()); + $subDomain = $subDomain + ->withAsciiIDNAOption($this->getAsciiIDNAOption()) + ->withUnicodeIDNAOption($this->getUnicodeIDNAOption()); + if ($this->subDomain == $subDomain) { return $this; } @@ -291,13 +295,33 @@ public function withSubDomain($subDomain): self $subDomain = $subDomain->toUnicode(); } - $domain = new Domain( + return new self(new Domain( $subDomain.'.'.$this->registrableDomain, $this->getAsciiIDNAOption(), $this->getUnicodeIDNAOption() - ); + ), $this->publicSuffix); + } - return new self($domain, $this->publicSuffix); + public function withSecondLevelDomain($label): self + { + if (null === $this->registrableDomain->getContent()) { + throw UnableToResolveDomain::dueToMissingRegistrableDomain($this); + } + + $newRegistrableDomain = $this->registrableDomain->withLabel(-1, $label); + if ($newRegistrableDomain == $this->registrableDomain) { + return $this; + } + + if (null === $this->subDomain->getContent()) { + return new self($newRegistrableDomain, $this->publicSuffix); + } + + return new self(new Domain( + $this->subDomain->getContent().'.'.$newRegistrableDomain->getContent(), + $this->getAsciiIDNAOption(), + $this->getUnicodeIDNAOption() + ), $this->publicSuffix); } /** diff --git a/src/ResolvedDomainName.php b/src/ResolvedDomainName.php index d7f30294..71a0a472 100644 --- a/src/ResolvedDomainName.php +++ b/src/ResolvedDomainName.php @@ -19,9 +19,11 @@ interface ResolvedDomainName extends Host, ExternalDomainName { public function getPublicSuffix(): PublicSuffix; - public function getSubDomain(): DomainName; + public function getSecondLevelDomain(): ?string; + + public function getRegistrableDomain(): self; - public function getRegistrableDomain(): DomainName; + public function getSubDomain(): DomainName; /** * Returns an instance with the specified sub domain added. @@ -33,6 +35,17 @@ public function getRegistrableDomain(): DomainName; */ public function withSubDomain(Host $subDomain): self; + /** + * Returns an instance with the specified second level domain label added. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the second level domain label + * + * @param ?string $label + * @throws ExceptionInterface If the second level domain label can not be added + */ + public function withSecondLevelDomain(?string $label): self; + /** * Returns an instance with the specified public suffix added. * diff --git a/tests/ResolvedDomainTest.php b/tests/ResolvedDomainTest.php index 7d9eefd1..de1ee200 100644 --- a/tests/ResolvedDomainTest.php +++ b/tests/ResolvedDomainTest.php @@ -37,6 +37,7 @@ public function testRegistrableDomainIsNullWithFoundDomain(): void self::assertNull($domain->getPublicSuffix()->getContent()); self::assertNull($domain->getRegistrableDomain()->getContent()); self::assertNull($domain->getSubDomain()->getContent()); + self::assertNull($domain->getSecondLevelDomain()); } /** @@ -467,8 +468,12 @@ public function testWithPublicSuffixWorks( bool $isPrivate ): void { $result = $domain->withPublicSuffix($publicSuffix); + $newPublicSuffix = $result->getPublicSuffix(); - self::assertSame($expected, $result->getPublicSuffix()->getContent()); + self::assertSame($expected, $newPublicSuffix->getContent()); + self::assertSame($isKnown, $newPublicSuffix->isKnown()); + self::assertSame($isICANN, $newPublicSuffix->isICANN()); + self::assertSame($isPrivate, $newPublicSuffix->isPrivate()); } public function withPublicSuffixWorksProvider(): iterable @@ -565,27 +570,24 @@ public function testWithPublicSuffixFailsWithNullDomain(): void * @param ?string $expectedUnicode * @param ?string $expectedRegistrable * @param ?string $expectedSubDomain - * @param ?string $expectedWithLabel */ public function testResolveWorksWithCustomIDNAOptions( string $domainName, string $publicSuffix, - string $withLabel, ?string $expectedContent, ?string $expectedAscii, ?string $expectedUnicode, ?string $expectedRegistrable, - ?string $expectedSubDomain, - ?string $expectedWithLabel + ?string $expectedSubDomain ): void { - $domainHost = new Domain($domainName, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); - $domain = new ResolvedDomain($domainHost, PublicSuffix::fromICANN($publicSuffix)); - - self::assertSame($expectedContent, $domain->getContent()); - self::assertSame($expectedAscii, $domain->toAscii()->getContent()); - self::assertSame($expectedUnicode, $domain->toUnicode()->getContent()); - self::assertSame($expectedRegistrable, $domain->getRegistrableDomain()->getContent()); - self::assertSame($expectedSubDomain, $domain->getSubDomain()->getContent()); + $host = new Domain($domainName, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); + $resolvedDomain = new ResolvedDomain($host, PublicSuffix::fromICANN($publicSuffix)); + + self::assertSame($expectedContent, $resolvedDomain->getContent()); + self::assertSame($expectedAscii, $resolvedDomain->toAscii()->getContent()); + self::assertSame($expectedUnicode, $resolvedDomain->toUnicode()->getContent()); + self::assertSame($expectedRegistrable, $resolvedDomain->getRegistrableDomain()->getContent()); + self::assertSame($expectedSubDomain, $resolvedDomain->getSubDomain()->getContent()); } public function resolveCustomIDNAOptionsProvider(): iterable @@ -594,46 +596,38 @@ public function resolveCustomIDNAOptionsProvider(): iterable 'without deviation characters' => [ 'example.com', 'com', - 'größe', 'example.com', 'example.com', 'example.com', 'example.com', null, - 'xn--gre-6ka8i.com', ], 'without deviation characters with label' => [ 'www.example.com', 'com', - 'größe', 'www.example.com', 'www.example.com', 'www.example.com', 'example.com', 'www', - 'xn--gre-6ka8i.example.com', ], 'with deviation in domain' => [ 'www.faß.de', 'de', - 'größe', 'www.faß.de', 'www.xn--fa-hia.de', 'www.faß.de', 'faß.de', 'www', - 'größe.faß.de', ], 'with deviation in label' => [ 'faß.test.de', 'de', - 'größe', 'faß.test.de', 'xn--fa-hia.test.de', 'faß.test.de', 'test.de', 'faß', - 'größe.test.de', ], ]; } @@ -676,4 +670,55 @@ public function testInstanceCreationWithCustomIDNAOptions(): void [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] ); } + + /** + * @dataProvider withSldWorksProvider + * @param ?string $host + * @param ?string $publicSuffix + * @param ?string $sld + * @param ?string $expectedSld + * @param ?string $expectedHost + */ + public function testWithSecondLevelDomain( + ?string $host, + ?string $publicSuffix, + ?string $sld, + ?string $expectedSld, + ?string $expectedHost + ): void { + $domain = new ResolvedDomain(new Domain($host), PublicSuffix::fromICANN($publicSuffix)); + $newDomain = $domain->withSecondLevelDomain($sld); + + self::assertSame($expectedSld, $newDomain->getSecondLevelDomain()); + self::assertEquals($expectedHost, $newDomain->getContent()); + self::assertEquals($domain->getPublicSuffix(), $newDomain->getPublicSuffix()); + self::assertEquals($domain->getSubDomain(), $newDomain->getSubDomain()); + } + + public function withSldWorksProvider(): iterable + { + return [ + [ + 'host' => 'example.com', + 'publicSuffix' => 'com', + 'sld' => 'www', + 'expectedSld' => 'www', + 'expectedHost' => 'www.com', + ], + [ + 'host' => 'www.example.com', + 'publicSuffix' => 'com', + 'sld' => 'www', + 'expectedSld' => 'www', + 'expectedHost' => 'www.www.com', + ], + [ + 'host' => 'www.bbc.co.uk', + 'publicSuffix' => 'co.uk', + 'sld' => 'hamburger', + 'expectedSld' => 'hamburger', + 'expectedHost' => 'www.hamburger.co.uk', + ], + ]; + } } From c8fb661892052684f1f5cfc6ddb2bfbd6f6d9a76 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 23 Aug 2020 21:55:31 +0200 Subject: [PATCH 233/461] Improve Domain resolution --- src/Domain.php | 20 +++++++++++--------- src/DomainName.php | 4 +--- src/Rules.php | 39 +++++++++++++++++---------------------- src/TopLevelDomains.php | 31 ++++++++++--------------------- 4 files changed, 39 insertions(+), 55 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 2326017c..9a7b5f44 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -27,7 +27,6 @@ use function ksort; use function preg_match; use function sprintf; -use function strpos; use const IDNA_DEFAULT; final class Domain extends DomainNameParser implements DomainName @@ -112,9 +111,11 @@ public function label(int $key): ?string return $this->labels[$key] ?? null; } - public function keys(string $label): array + public function keys(string $label = null): array { - return array_keys($this->labels, $label, true); + $args = (null !== $label) ? [$label, true] : []; + + return array_keys($this->labels, ...$args); } public function labels(): array @@ -148,15 +149,16 @@ public function toAscii(): self public function toUnicode(): self { - if (null === $this->domain || false === strpos($this->domain, 'xn--')) { + if (null === $this->domain) { return $this; } - return new self( - $this->idnToUnicode($this->domain, $this->unicodeIDNAOption), - $this->asciiIDNAOption, - $this->unicodeIDNAOption - ); + $domain = $this->idnToUnicode($this->domain, $this->unicodeIDNAOption); + if ($domain === $this->domain) { + return $this; + } + + return new self($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption); } /** diff --git a/src/DomainName.php b/src/DomainName.php index 2cc0433c..5e3ea647 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -49,11 +49,9 @@ public function labels(): array; * If a value is specified only the keys associated with * the given value will be returned * - * @param string $label the total number of argument given to the method - * * @return array */ - public function keys(string $label): array; + public function keys(string $label = null): array; /** * {@inheritdoc} diff --git a/src/Rules.php b/src/Rules.php index 4e322490..5c278b04 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -162,9 +162,9 @@ public function resolve($host): ResolvedDomainName */ public function getCookieDomain($host): ResolvedDomainName { - $host = $this->validateDomain($host); + $domain = $this->validateDomain($host); - return $host->resolve($this->findPublicSuffix($host, '')); + return new ResolvedDomain($domain, $this->findPublicSuffix($domain, '')); } /** @@ -172,9 +172,9 @@ public function getCookieDomain($host): ResolvedDomainName */ public function getICANNDomain($host): ResolvedDomainName { - $host = $this->validateDomain($host); + $domain = $this->validateDomain($host); - return $host->resolve($this->findPublicSuffix($host, EffectiveTLD::ICANN_DOMAINS)); + return new ResolvedDomain($domain, $this->findPublicSuffix($domain, EffectiveTLD::ICANN_DOMAINS)); } /** @@ -182,9 +182,9 @@ public function getICANNDomain($host): ResolvedDomainName */ public function getPrivateDomain($host): ResolvedDomainName { - $host = $this->validateDomain($host); + $domain = $this->validateDomain($host); - return $host->resolve($this->findPublicSuffix($host, PublicSuffix::PRIVATE_DOMAINS)); + return new ResolvedDomain($domain, $this->findPublicSuffix($domain, PublicSuffix::PRIVATE_DOMAINS)); } /** @@ -192,36 +192,31 @@ public function getPrivateDomain($host): ResolvedDomainName * * @param mixed $domain a type that supports instantiating a Domain from. */ - private function validateDomain($domain): ResolvedDomainName + private function validateDomain($domain): DomainName { - if (!($domain instanceof ResolvedDomainName)) { - $domain = new ResolvedDomain(new Domain($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption)); + if ($domain instanceof ExternalDomainName) { + $domain = $domain->getDomain(); } - $domainContent = $domain->getContent(); - if (2 > count($domain)) { - throw UnableToResolveDomain::dueToUnresolvableDomain($domain); - } - - if (null === $domainContent) { - throw UnableToResolveDomain::dueToUnresolvableDomain($domain); + if (!($domain instanceof DomainName)) { + $domain = new Domain($domain); } - if ('.' === substr($domainContent, -1, 1)) { + if ((2 > count($domain)) || ('.' === substr((string) $domain, -1, 1))) { throw UnableToResolveDomain::dueToUnresolvableDomain($domain); } - return $domain; + return $domain + ->withAsciiIDNAOption($this->asciiIDNAOption) + ->withUnicodeIDNAOption($this->unicodeIDNAOption); } /** * Returns the matched public suffix. */ - private function findPublicSuffix(ResolvedDomainName $domain, string $section): PublicSuffix + private function findPublicSuffix(DomainName $domain, string $section): PublicSuffix { - $asciiDomain = $domain->getDomain(); - /** @var DomainName $asciiDomain */ - $asciiDomain = $asciiDomain->toAscii(); + $asciiDomain = $domain->toAscii(); $icann = $this->findPublicSuffixFromSection($asciiDomain, EffectiveTLD::ICANN_DOMAINS); if (EffectiveTLD::ICANN_DOMAINS === $section) { return $icann; diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 5088dce2..d39f0b7e 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -227,41 +227,30 @@ public function contains($tld): bool */ public function resolve($domain): ResolvedDomainName { - if ($domain instanceof ResolvedDomainName) { - $domain = $domain->getDomain() - ->withUnicodeIDNAOption($this->unicodeIDNAOption) - ->withAsciiIDNAOption($this->asciiIDNAOption); + if ($domain instanceof ExternalDomainName) { + $domain = $domain->getDomain(); } if (!$domain instanceof DomainName) { - $domain = new Domain($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption); + $domain = new Domain($domain); } - $domainContent = $domain->getContent(); - if (null === $domainContent) { + if ((2 > count($domain)) || ('.' === substr((string) $domain, -1, 1))) { throw UnableToResolveDomain::dueToUnresolvableDomain($domain); } - if (2 > count($domain)) { - throw UnableToResolveDomain::dueToUnresolvableDomain($domain); - } + $domain = $domain + ->withAsciiIDNAOption($this->asciiIDNAOption) + ->withUnicodeIDNAOption($this->unicodeIDNAOption); - if ('.' === substr($domainContent, -1, 1)) { - throw UnableToResolveDomain::dueToUnresolvableDomain($domain); - } - - $asciiDomain = $domain->toAscii(); - - $publicSuffix = null; - $label = $asciiDomain->label(0); + $label = $domain->toAscii()->label(0); foreach ($this as $tld) { if ($tld->getContent() === $label) { - $publicSuffix = $tld; - break; + return new ResolvedDomain($domain, PublicSuffix::fromUnknown($tld)); } } - return new ResolvedDomain($domain, PublicSuffix::fromUnknown($publicSuffix)); + return new ResolvedDomain($domain, PublicSuffix::fromNull($this->asciiIDNAOption, $this->unicodeIDNAOption)); } public function withAsciiIDNAOption(int $option): RootZoneDatabase From 2df2ad2a2a03542eebf609bf3315bde46f4b04de Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 23 Aug 2020 22:03:42 +0200 Subject: [PATCH 234/461] Improve Domain resolution --- src/ResolvedDomain.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 83870755..382dde29 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -73,19 +73,16 @@ private function setPublicSuffix(PublicSuffix $publicSuffix = null): PublicSuffi return PublicSuffix::fromNull($asciiIDNAOptions, $unicodeIDNAOptions); } - $domainContent = $this->domain->getContent(); - if (null === $domainContent) { - throw UnableToResolveDomain::dueToUnresolvableDomain($this->domain); - } - if (2 > count($this->domain)) { throw UnableToResolveDomain::dueToUnresolvableDomain($this->domain); } - if ('.' === substr($domainContent, -1, 1)) { + if ('.' === substr((string) $this->domain, -1, 1)) { throw UnableToResolveDomain::dueToUnresolvableDomain($this->domain); } + /** @var string $domainContent */ + $domainContent = $this->domain->getContent(); $publicSuffix = $this->normalize($publicSuffix); /** @var string $psContent */ $psContent = $publicSuffix->getContent(); From 45f74757d67510db1ed13f1a5ff09635be5c46c1 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 24 Aug 2020 17:11:35 +0200 Subject: [PATCH 235/461] Improve ResolvedDomain codebase --- src/ResolvedDomain.php | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 382dde29..11c96b82 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -81,16 +81,13 @@ private function setPublicSuffix(PublicSuffix $publicSuffix = null): PublicSuffi throw UnableToResolveDomain::dueToUnresolvableDomain($this->domain); } - /** @var string $domainContent */ - $domainContent = $this->domain->getContent(); $publicSuffix = $this->normalize($publicSuffix); - /** @var string $psContent */ - $psContent = $publicSuffix->getContent(); - if ($domainContent === $psContent) { - throw new UnableToResolveDomain(sprintf('The public suffix `%s` can not be equal to the domain name `%s`', $psContent, $this->domain)); + if ($this->domain->getContent() === $publicSuffix->getContent()) { + throw new UnableToResolveDomain(sprintf('The public suffix and the domain name are is identical `%s`.', $this->domain)); } - if ('.'.$psContent !== substr($domainContent, - strlen($psContent) - 1)) { + $psContent = (string) $publicSuffix; + if ('.'.$psContent !== substr((string) $this->domain, - strlen($psContent) - 1)) { throw new UnableToResolveDomain(sprintf('The public suffix `%s` can not be assign to the domain name `%s`', $psContent, $this->domain)); } From da8286d5c2cd207ce1d29d35dd24ff64a3c37631 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 24 Aug 2020 21:10:24 +0200 Subject: [PATCH 236/461] Adding funding information --- .github/FUNDING.yml | 1 + composer.json | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..70fdf4b1 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [nyamsprod] diff --git a/composer.json b/composer.json index 783e8d34..eaaacee7 100644 --- a/composer.json +++ b/composer.json @@ -23,6 +23,12 @@ "homepage": "https://github.com/jeremykendall/php-domain-parser/graphs/contributors" } ], + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nyamsprod" + } + ], "bin": [ "bin/update-psl" ], From b98f5e71881526a3243c4cff5146ba6c5ed38112 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 24 Aug 2020 21:12:32 +0200 Subject: [PATCH 237/461] Update release date --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a1e9ed2e..660070b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in this file -## 5.7.1 - 2020-08-04 +## 5.7.1 - 2020-08-24 ### Added From be49e88730e94b7e53c79cb32a522973cffe3964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Viktor=20Sz=C3=A9pe?= Date: Sun, 13 Sep 2020 11:44:36 +0200 Subject: [PATCH 238/461] Add a missing new line to README --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 82798156..7c9b5a28 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,8 @@ If the Domain is not resolved or in case of error a null `Pdp\Domain` is returne ~~~php Date: Thu, 17 Sep 2020 20:47:41 +0200 Subject: [PATCH 239/461] Moving test files to its own directory --- .../invalid_suffix_list_content.dat | 0 {tests/data => test_data}/public_suffix_list.dat | 0 {tests/data => test_data}/root_zones.dat | 0 {tests/data => test_data}/tlds-alpha-by-domain.txt | 0 tests/PublicSuffixListConverterTest.php | 5 +++-- tests/RootZoneDatabaseConverterTest.php | 3 ++- tests/RulesTest.php | 9 +++++---- tests/Storage/PublicSuffixListLocalStorageTest.php | 6 +++--- tests/Storage/PublicSuffixListPsr16AdapterTest.php | 10 +++++----- tests/Storage/PublicSuffixListRemoteStorageTest.php | 2 +- tests/Storage/RootZoneDatabaseLocalStorageTest.php | 6 +++--- tests/Storage/RootZoneDatabasePsr16AdapterTest.php | 10 +++++----- tests/Storage/RootZoneDatabaseRemoteStorageTest.php | 2 +- tests/TopLevelDomainsTest.php | 13 +++++++------ 14 files changed, 35 insertions(+), 31 deletions(-) rename {tests/data => test_data}/invalid_suffix_list_content.dat (100%) rename {tests/data => test_data}/public_suffix_list.dat (100%) rename {tests/data => test_data}/root_zones.dat (100%) rename {tests/data => test_data}/tlds-alpha-by-domain.txt (100%) diff --git a/tests/data/invalid_suffix_list_content.dat b/test_data/invalid_suffix_list_content.dat similarity index 100% rename from tests/data/invalid_suffix_list_content.dat rename to test_data/invalid_suffix_list_content.dat diff --git a/tests/data/public_suffix_list.dat b/test_data/public_suffix_list.dat similarity index 100% rename from tests/data/public_suffix_list.dat rename to test_data/public_suffix_list.dat diff --git a/tests/data/root_zones.dat b/test_data/root_zones.dat similarity index 100% rename from tests/data/root_zones.dat rename to test_data/root_zones.dat diff --git a/tests/data/tlds-alpha-by-domain.txt b/test_data/tlds-alpha-by-domain.txt similarity index 100% rename from tests/data/tlds-alpha-by-domain.txt rename to test_data/tlds-alpha-by-domain.txt diff --git a/tests/PublicSuffixListConverterTest.php b/tests/PublicSuffixListConverterTest.php index b868bd60..7897e882 100644 --- a/tests/PublicSuffixListConverterTest.php +++ b/tests/PublicSuffixListConverterTest.php @@ -18,6 +18,7 @@ use Pdp\PublicSuffixListConverter; use Pdp\UnableToLoadPublicSuffixList; use PHPUnit\Framework\TestCase; +use function dirname; /** * @coversDefaultClass \Pdp\PublicSuffixListConverter @@ -27,7 +28,7 @@ class PublicSuffixListConverterTest extends TestCase public function testConverter(): void { /** @var string $string */ - $string = file_get_contents(__DIR__.'/data/public_suffix_list.dat'); + $string = file_get_contents(dirname(__DIR__).'/test_data/public_suffix_list.dat'); $retval = (new PublicSuffixListConverter())->convert($string); self::assertNotEmpty($retval['ICANN_DOMAINS']); @@ -37,7 +38,7 @@ public function testConverter(): void public function testConvertThrowsExceptionWithInvalidContent(): void { /** @var string $content */ - $content = file_get_contents(__DIR__.'/data/invalid_suffix_list_content.dat'); + $content = file_get_contents(dirname(__DIR__).'/test_data/invalid_suffix_list_content.dat'); self::expectException(UnableToLoadPublicSuffixList::class); diff --git a/tests/RootZoneDatabaseConverterTest.php b/tests/RootZoneDatabaseConverterTest.php index ef9ed9bc..ad032b68 100644 --- a/tests/RootZoneDatabaseConverterTest.php +++ b/tests/RootZoneDatabaseConverterTest.php @@ -18,6 +18,7 @@ use Pdp\RootZoneDatabaseConverter; use Pdp\UnableToLoadRootZoneDatabase; use PHPUnit\Framework\TestCase; +use function dirname; /** * @coversDefaultClass \Pdp\RootZoneDatabaseConverter @@ -27,7 +28,7 @@ class RootZoneDatabaseConverterTest extends TestCase public function testConverter(): void { /** @var string $string */ - $string = file_get_contents(__DIR__.'/data/root_zones.dat'); + $string = file_get_contents(dirname(__DIR__).'/test_data/root_zones.dat'); $res = (new RootZoneDatabaseConverter())->convert($string); self::assertArrayHasKey('version', $res); self::assertArrayHasKey('modifiedDate', $res); diff --git a/tests/RulesTest.php b/tests/RulesTest.php index ae27587e..9a358525 100644 --- a/tests/RulesTest.php +++ b/tests/RulesTest.php @@ -26,6 +26,7 @@ use PHPUnit\Framework\TestCase; use TypeError; use function array_fill; +use function dirname; use function file_get_contents; use function implode; use const IDNA_DEFAULT; @@ -45,7 +46,7 @@ final class RulesTest extends TestCase public function setUp(): void { /** @var string $string */ - $string = file_get_contents(__DIR__.'/data/public_suffix_list.dat'); + $string = file_get_contents(dirname(__DIR__).'/test_data/public_suffix_list.dat'); $this->rules = Rules::fromString($string); } @@ -53,7 +54,7 @@ public function setUp(): void public function testCreateFromPath(): void { /** @var string $string */ - $string = file_get_contents(__DIR__.'/data/public_suffix_list.dat'); + $string = file_get_contents(dirname(__DIR__).'/test_data/public_suffix_list.dat'); $rulesFromString = Rules::fromString($string); $context = stream_context_create([ @@ -62,7 +63,7 @@ public function testCreateFromPath(): void 'header' => "Accept-language: en\r\nCookie: foo=bar\r\n", ], ]); - $rulesFromPath = Rules::fromPath(__DIR__.'/data/public_suffix_list.dat', $context); + $rulesFromPath = Rules::fromPath(dirname(__DIR__).'/test_data/public_suffix_list.dat', $context); self::assertEquals($rulesFromString, $rulesFromPath); } @@ -591,7 +592,7 @@ public function testResolveWithIDNAOptions(): void ); /** @var string $string */ - $string = file_get_contents(__DIR__.'/data/public_suffix_list.dat'); + $string = file_get_contents(dirname(__DIR__).'/test_data/public_suffix_list.dat'); $rules = Rules::fromString($string, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); $resolved = $rules->resolve('foo.de'); diff --git a/tests/Storage/PublicSuffixListLocalStorageTest.php b/tests/Storage/PublicSuffixListLocalStorageTest.php index dd703d81..41bb3935 100644 --- a/tests/Storage/PublicSuffixListLocalStorageTest.php +++ b/tests/Storage/PublicSuffixListLocalStorageTest.php @@ -30,7 +30,7 @@ public function testIsCanReturnAPublicSuffixListInstanceFromCache(): void $cache = new class() implements PublicSuffixListCache { public function fetchByUri(string $uri): ?PublicSuffixList { - return Rules::fromPath(dirname(__DIR__).'/data/public_suffix_list.dat'); + return Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); } public function storeByUri(string $uri, PublicSuffixList $publicSuffixList): bool @@ -42,7 +42,7 @@ public function storeByUri(string $uri, PublicSuffixList $publicSuffixList): boo $client = new class() implements PublicSuffixListStorage { public function getByUri(string $uri): PublicSuffixList { - return Rules::fromPath(dirname(__DIR__).'/data/public_suffix_list.dat'); + return Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); } }; @@ -69,7 +69,7 @@ public function storeByUri(string $uri, PublicSuffixList $publicSuffixList): boo $client = new class() implements PublicSuffixListStorage { public function getByUri(string $uri): PublicSuffixList { - return Rules::fromPath(dirname(__DIR__).'/data/public_suffix_list.dat'); + return Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); } }; diff --git a/tests/Storage/PublicSuffixListPsr16AdapterTest.php b/tests/Storage/PublicSuffixListPsr16AdapterTest.php index 94025774..65f80ff6 100644 --- a/tests/Storage/PublicSuffixListPsr16AdapterTest.php +++ b/tests/Storage/PublicSuffixListPsr16AdapterTest.php @@ -85,7 +85,7 @@ public function testItReturnsAnInstanceIfTheCorrectCacheExists(): void $cache = new class() implements CacheInterface { public function get($key, $default = null) { - return json_encode(Rules::fromPath(dirname(__DIR__).'/data/public_suffix_list.dat')); + return json_encode(Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat')); } public function set($key, $value, $ttl = null) @@ -126,7 +126,7 @@ public function has($key) $pslCache = new PublicSuffixListCachePsr16Adapter($cache, 86400); self::assertEquals( - Rules::fromPath(dirname(__DIR__).'/data/public_suffix_list.dat'), + Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'), $pslCache->fetchByUri('http://www.example.com') ); } @@ -426,7 +426,7 @@ public function logs(): array } }; - $psl = Rules::fromPath(dirname(__DIR__).'/data/public_suffix_list.dat'); + $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); $pslCache = new PublicSuffixListCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); self::assertTrue($pslCache->storeByUri('http://www.example.com', $psl)); @@ -495,7 +495,7 @@ public function logs(): array } }; - $psl = Rules::fromPath(dirname(__DIR__).'/data/public_suffix_list.dat'); + $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); $pslCache = new PublicSuffixListCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); self::assertFalse($pslCache->storeByUri('http://www.example.com', $psl)); @@ -566,7 +566,7 @@ public function logs(): array } }; - $psl = Rules::fromPath(dirname(__DIR__).'/data/public_suffix_list.dat'); + $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); $pslCache = new PublicSuffixListCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); self::assertFalse($pslCache->storeByUri('http://www.example.com', $psl)); diff --git a/tests/Storage/PublicSuffixListRemoteStorageTest.php b/tests/Storage/PublicSuffixListRemoteStorageTest.php index fd55dc94..69687b27 100644 --- a/tests/Storage/PublicSuffixListRemoteStorageTest.php +++ b/tests/Storage/PublicSuffixListRemoteStorageTest.php @@ -40,7 +40,7 @@ public function testIsCanReturnAPublicSuffixListInstance(): void public function sendRequest(RequestInterface $request): ResponseInterface { /** @var string $body */ - $body = file_get_contents(dirname(__DIR__).'/data/public_suffix_list.dat'); + $body = file_get_contents(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); return new Response(200, [], $body); } }; diff --git a/tests/Storage/RootZoneDatabaseLocalStorageTest.php b/tests/Storage/RootZoneDatabaseLocalStorageTest.php index d286fe3c..313ef709 100644 --- a/tests/Storage/RootZoneDatabaseLocalStorageTest.php +++ b/tests/Storage/RootZoneDatabaseLocalStorageTest.php @@ -30,7 +30,7 @@ public function testIsCanReturnARootZoneDatabaseInstanceFromCache(): void $cache = new class() implements RootZoneDatabaseCache { public function fetchByUri(string $uri): ?RootZoneDatabase { - return TopLevelDomains::fromPath(dirname(__DIR__).'/data/tlds-alpha-by-domain.txt'); + return TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); } public function storeByUri(string $uri, RootZoneDatabase $topLevelDomains): bool @@ -42,7 +42,7 @@ public function storeByUri(string $uri, RootZoneDatabase $topLevelDomains): bool $client = new class() implements RootZoneDatabaseStorage { public function getByUri(string $uri): RootZoneDatabase { - return TopLevelDomains::fromPath(dirname(__DIR__).'/data/tlds-alpha-by-domain.txt'); + return TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); } }; @@ -68,7 +68,7 @@ public function storeByUri(string $uri, RootZoneDatabase $publicSuffixList): boo $client = new class() implements RootZoneDatabaseStorage { public function getByUri(string $uri): RootZoneDatabase { - return TopLevelDomains::fromPath(dirname(__DIR__).'/data/tlds-alpha-by-domain.txt'); + return TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); } }; diff --git a/tests/Storage/RootZoneDatabasePsr16AdapterTest.php b/tests/Storage/RootZoneDatabasePsr16AdapterTest.php index c7cb9a3e..dc8988f4 100644 --- a/tests/Storage/RootZoneDatabasePsr16AdapterTest.php +++ b/tests/Storage/RootZoneDatabasePsr16AdapterTest.php @@ -85,7 +85,7 @@ public function testItReturnsAnInstanceIfTheCorrectCacheExists(): void $cache = new class() implements CacheInterface { public function get($key, $default = null) { - return json_encode(TopLevelDomains::fromPath(dirname(__DIR__).'/data/tlds-alpha-by-domain.txt')); + return json_encode(TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt')); } public function set($key, $value, $ttl = null) @@ -126,7 +126,7 @@ public function has($key) $pslCache = new RootZoneDatabaseCachePsr16Adapter($cache, 86400); self::assertEquals( - TopLevelDomains::fromPath(dirname(__DIR__).'/data/tlds-alpha-by-domain.txt'), + TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'), $pslCache->fetchByUri('http://www.example.com') ); } @@ -426,7 +426,7 @@ public function logs(): array } }; - $rzd = TopLevelDomains::fromPath(dirname(__DIR__).'/data/tlds-alpha-by-domain.txt'); + $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); $pslCache = new RootZoneDatabaseCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); self::assertTrue($pslCache->storeByUri('http://www.example.com', $rzd)); @@ -495,7 +495,7 @@ public function logs(): array } }; - $rzd = TopLevelDomains::fromPath(dirname(__DIR__).'/data/tlds-alpha-by-domain.txt'); + $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); $pslCache = new RootZoneDatabaseCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); self::assertFalse($pslCache->storeByUri('http://www.example.com', $rzd)); @@ -566,7 +566,7 @@ public function logs(): array } }; - $rzd = TopLevelDomains::fromPath(dirname(__DIR__).'/data/tlds-alpha-by-domain.txt'); + $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); $pslCache = new RootZoneDatabaseCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); self::assertFalse($pslCache->storeByUri('http://www.example.com', $rzd)); diff --git a/tests/Storage/RootZoneDatabaseRemoteStorageTest.php b/tests/Storage/RootZoneDatabaseRemoteStorageTest.php index 31576751..417714d6 100644 --- a/tests/Storage/RootZoneDatabaseRemoteStorageTest.php +++ b/tests/Storage/RootZoneDatabaseRemoteStorageTest.php @@ -40,7 +40,7 @@ public function testIsCanReturnARootZoneDatabaseInstance(): void public function sendRequest(RequestInterface $request): ResponseInterface { /** @var string $body */ - $body = file_get_contents(dirname(__DIR__).'/data/tlds-alpha-by-domain.txt'); + $body = file_get_contents(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); return new Response(200, [], $body); } diff --git a/tests/TopLevelDomainsTest.php b/tests/TopLevelDomainsTest.php index 584f1c7d..e678b32d 100644 --- a/tests/TopLevelDomainsTest.php +++ b/tests/TopLevelDomainsTest.php @@ -26,6 +26,7 @@ use Pdp\UnableToResolveDomain; use PHPUnit\Framework\TestCase; use TypeError; +use function dirname; use function file_get_contents; use const IDNA_DEFAULT; use const IDNA_NONTRANSITIONAL_TO_ASCII; @@ -40,7 +41,7 @@ class TopLevelDomainsTest extends TestCase public function setUp(): void { - $this->topLevelDomains = TopLevelDomains::fromPath(__DIR__.'/data/tlds-alpha-by-domain.txt'); + $this->topLevelDomains = TopLevelDomains::fromPath(dirname(__DIR__).'/test_data/tlds-alpha-by-domain.txt'); } /** @@ -57,7 +58,7 @@ public function testCreateFromPath(): void ], ]); - $topLevelDomains = TopLevelDomains::fromPath(__DIR__.'/data/tlds-alpha-by-domain.txt', $context); + $topLevelDomains = TopLevelDomains::fromPath(dirname(__DIR__).'/test_data/tlds-alpha-by-domain.txt', $context); self::assertEquals($this->topLevelDomains, $topLevelDomains); } @@ -85,7 +86,7 @@ public function testSetState(): void public function testGetterProperties(): void { - $topLevelDomains = TopLevelDomains::fromPath(__DIR__.'/data/root_zones.dat'); + $topLevelDomains = TopLevelDomains::fromPath(dirname(__DIR__).'/test_data/root_zones.dat'); self::assertCount(15, $topLevelDomains); self::assertSame('2018082200', $topLevelDomains->getVersion()); @@ -97,7 +98,7 @@ public function testGetterProperties(): void $converter = new RootZoneDatabaseConverter(); /** @var string $content */ - $content = file_get_contents(__DIR__.'/data/root_zones.dat'); + $content = file_get_contents(dirname(__DIR__).'/test_data/root_zones.dat'); $data = $converter->convert($content); self::assertEquals($data, $topLevelDomains->jsonSerialize()); @@ -181,7 +182,7 @@ public function testResolveWithUnResolvableDomain(): void public function testResolveWithUnregisteredTLD(): void { - $collection = TopLevelDomains::fromPath(__DIR__.'/data/root_zones.dat'); + $collection = TopLevelDomains::fromPath(dirname(__DIR__).'/test_data/root_zones.dat'); self::assertNull($collection->resolve('localhost.locale')->getPublicSuffix()->getContent()); } @@ -196,7 +197,7 @@ public function testResolveWithIDNAOptions(): void ); $collection = TopLevelDomains::fromPath( - __DIR__.'/data/root_zones.dat', + dirname(__DIR__).'/test_data/root_zones.dat', null, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE From c1bbdb9e0f0211abd38340f5a5077915a4a37a12 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 17 Sep 2020 21:08:38 +0200 Subject: [PATCH 240/461] Moving tests into the src directory --- .php_cs | 1 - composer.json | 14 +------------- phpstan.src.neon => phpstan.neon | 2 ++ phpstan.tests.neon | 7 ------- phpunit.xml.dist | 11 +++++++---- {tests => src}/DomainTest.php | 5 +---- {tests => src}/PublicSuffixListConverterTest.php | 4 +--- {tests => src}/PublicSuffixTest.php | 5 +---- {tests => src}/ResolvedDomainTest.php | 7 +------ {tests => src}/RootZoneDatabaseConverterTest.php | 4 +--- {tests => src}/RulesTest.php | 12 ++---------- .../Storage/PublicSuffixListLocalStorageTest.php | 5 +---- .../Storage/PublicSuffixListPsr16AdapterTest.php | 3 +-- .../Storage/PublicSuffixListRemoteStorageTest.php | 3 +-- .../Storage/RootZoneDatabaseLocalStorageTest.php | 5 +---- .../Storage/RootZoneDatabasePsr16AdapterTest.php | 3 +-- .../Storage/RootZoneDatabaseRemoteStorageTest.php | 3 +-- {tests => src}/TopLevelDomainsTest.php | 9 +-------- 18 files changed, 24 insertions(+), 79 deletions(-) rename phpstan.src.neon => phpstan.neon (90%) delete mode 100644 phpstan.tests.neon rename {tests => src}/DomainTest.php (99%) rename {tests => src}/PublicSuffixListConverterTest.php (94%) rename {tests => src}/PublicSuffixTest.php (98%) rename {tests => src}/ResolvedDomainTest.php (99%) rename {tests => src}/RootZoneDatabaseConverterTest.php (96%) rename {tests => src}/RulesTest.php (99%) rename {tests => src}/Storage/PublicSuffixListLocalStorageTest.php (94%) rename {tests => src}/Storage/PublicSuffixListPsr16AdapterTest.php (99%) rename {tests => src}/Storage/PublicSuffixListRemoteStorageTest.php (97%) rename {tests => src}/Storage/RootZoneDatabaseLocalStorageTest.php (94%) rename {tests => src}/Storage/RootZoneDatabasePsr16AdapterTest.php (99%) rename {tests => src}/Storage/RootZoneDatabaseRemoteStorageTest.php (97%) rename {tests => src}/TopLevelDomainsTest.php (97%) diff --git a/.php_cs b/.php_cs index ffe6bed0..5ab3bf42 100644 --- a/.php_cs +++ b/.php_cs @@ -13,7 +13,6 @@ EOF; $finder = PhpCsFixer\Finder::create() ->in(__DIR__.'/src') - ->in(__DIR__.'/tests') ->in(__DIR__.'/bin') ; diff --git a/composer.json b/composer.json index 6147d384..81d7c4d5 100644 --- a/composer.json +++ b/composer.json @@ -67,19 +67,9 @@ "Pdp\\": "src/" } }, - "autoload-dev": { - "psr-4": { - "Pdp\\Tests\\": "tests/" - } - }, "scripts": { "phpcs": "php-cs-fixer fix -vvv --diff --dry-run --allow-risky=yes --ansi", - "phpstan-src": "phpstan analyse -l max -c phpstan.src.neon src --ansi", - "phpstan-tests": "phpstan analyse -l max -c phpstan.tests.neon tests --ansi", - "phpstan": [ - "@phpstan-src", - "@phpstan-tests" - ], + "phpstan": "phpstan analyse -l max -c phpstan.neon src --ansi", "phpunit": "phpunit --coverage-text", "test": [ "@phpcs", @@ -90,8 +80,6 @@ "scripts-descriptions": { "phpcs": "Runs coding style test suite", "phpstan": "Runs complete codebase static analysis", - "phpstan-src": "Runs PHP stan on the source code", - "phpstan-test": "Runs PHP stan on the test suite", "phpunit": "Runs unit and functional testing", "test": "Runs the complete test suite" }, diff --git a/phpstan.src.neon b/phpstan.neon similarity index 90% rename from phpstan.src.neon rename to phpstan.neon index 28076679..b0749432 100644 --- a/phpstan.src.neon +++ b/phpstan.neon @@ -1,5 +1,7 @@ includes: - vendor/phpstan/phpstan-strict-rules/rules.neon + - vendor/phpstan/phpstan-phpunit/extension.neon + - vendor/phpstan/phpstan-phpunit/rules.neon parameters: checkMissingIterableValueType: false checkGenericClassInNonGenericObjectType: false diff --git a/phpstan.tests.neon b/phpstan.tests.neon deleted file mode 100644 index 98746216..00000000 --- a/phpstan.tests.neon +++ /dev/null @@ -1,7 +0,0 @@ -includes: - - vendor/phpstan/phpstan-strict-rules/rules.neon - - vendor/phpstan/phpstan-phpunit/extension.neon - - vendor/phpstan/phpstan-phpunit/rules.neon -parameters: - checkMissingIterableValueType: false - ignoreErrors: diff --git a/phpunit.xml.dist b/phpunit.xml.dist index e5b65193..e0050e50 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -16,18 +16,21 @@ src + + src + - + - - tests + + src - + diff --git a/tests/DomainTest.php b/src/DomainTest.php similarity index 99% rename from tests/DomainTest.php rename to src/DomainTest.php index 2f009caa..40d68cce 100644 --- a/tests/DomainTest.php +++ b/src/DomainTest.php @@ -13,11 +13,8 @@ declare(strict_types=1); -namespace Pdp\Tests; +namespace Pdp; -use Pdp\Domain; -use Pdp\InvalidDomainName; -use Pdp\InvalidHost; use PHPUnit\Framework\TestCase; use TypeError; use const IDNA_DEFAULT; diff --git a/tests/PublicSuffixListConverterTest.php b/src/PublicSuffixListConverterTest.php similarity index 94% rename from tests/PublicSuffixListConverterTest.php rename to src/PublicSuffixListConverterTest.php index 7897e882..b369b0a1 100644 --- a/tests/PublicSuffixListConverterTest.php +++ b/src/PublicSuffixListConverterTest.php @@ -13,10 +13,8 @@ declare(strict_types=1); -namespace Pdp\Tests; +namespace Pdp; -use Pdp\PublicSuffixListConverter; -use Pdp\UnableToLoadPublicSuffixList; use PHPUnit\Framework\TestCase; use function dirname; diff --git a/tests/PublicSuffixTest.php b/src/PublicSuffixTest.php similarity index 98% rename from tests/PublicSuffixTest.php rename to src/PublicSuffixTest.php index 2b9549bb..d0f03629 100644 --- a/tests/PublicSuffixTest.php +++ b/src/PublicSuffixTest.php @@ -13,12 +13,9 @@ declare(strict_types=1); -namespace Pdp\Tests; +namespace Pdp; use InvalidArgumentException; -use Pdp\InvalidDomainName; -use Pdp\InvalidHost; -use Pdp\PublicSuffix; use PHPUnit\Framework\TestCase; use function json_encode; use const IDNA_NONTRANSITIONAL_TO_ASCII; diff --git a/tests/ResolvedDomainTest.php b/src/ResolvedDomainTest.php similarity index 99% rename from tests/ResolvedDomainTest.php rename to src/ResolvedDomainTest.php index de1ee200..00524e30 100644 --- a/tests/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -13,13 +13,8 @@ declare(strict_types=1); -namespace Pdp\Tests; +namespace Pdp; -use Pdp\Domain; -use Pdp\InvalidHost; -use Pdp\PublicSuffix; -use Pdp\ResolvedDomain; -use Pdp\UnableToResolveDomain; use PHPUnit\Framework\TestCase; use TypeError; use function date_create; diff --git a/tests/RootZoneDatabaseConverterTest.php b/src/RootZoneDatabaseConverterTest.php similarity index 96% rename from tests/RootZoneDatabaseConverterTest.php rename to src/RootZoneDatabaseConverterTest.php index ad032b68..206a458f 100644 --- a/tests/RootZoneDatabaseConverterTest.php +++ b/src/RootZoneDatabaseConverterTest.php @@ -13,10 +13,8 @@ declare(strict_types=1); -namespace Pdp\Tests; +namespace Pdp; -use Pdp\RootZoneDatabaseConverter; -use Pdp\UnableToLoadRootZoneDatabase; use PHPUnit\Framework\TestCase; use function dirname; diff --git a/tests/RulesTest.php b/src/RulesTest.php similarity index 99% rename from tests/RulesTest.php rename to src/RulesTest.php index 9a358525..3c425574 100644 --- a/tests/RulesTest.php +++ b/src/RulesTest.php @@ -13,16 +13,8 @@ declare(strict_types=1); -namespace Pdp\Tests; - -use Pdp\Domain; -use Pdp\InvalidDomainName; -use Pdp\InvalidHost; -use Pdp\PublicSuffix; -use Pdp\ResolvedDomain; -use Pdp\Rules; -use Pdp\UnableToLoadPublicSuffixList; -use Pdp\UnableToResolveDomain; +namespace Pdp; + use PHPUnit\Framework\TestCase; use TypeError; use function array_fill; diff --git a/tests/Storage/PublicSuffixListLocalStorageTest.php b/src/Storage/PublicSuffixListLocalStorageTest.php similarity index 94% rename from tests/Storage/PublicSuffixListLocalStorageTest.php rename to src/Storage/PublicSuffixListLocalStorageTest.php index 41bb3935..65268658 100644 --- a/tests/Storage/PublicSuffixListLocalStorageTest.php +++ b/src/Storage/PublicSuffixListLocalStorageTest.php @@ -13,13 +13,10 @@ declare(strict_types=1); -namespace Pdp\Tests\Storage; +namespace Pdp\Storage; use Pdp\PublicSuffixList; use Pdp\Rules; -use Pdp\Storage\PublicSuffixListCache; -use Pdp\Storage\PublicSuffixListLocalStorage; -use Pdp\Storage\PublicSuffixListStorage; use PHPUnit\Framework\TestCase; use function dirname; diff --git a/tests/Storage/PublicSuffixListPsr16AdapterTest.php b/src/Storage/PublicSuffixListPsr16AdapterTest.php similarity index 99% rename from tests/Storage/PublicSuffixListPsr16AdapterTest.php rename to src/Storage/PublicSuffixListPsr16AdapterTest.php index 65f80ff6..0dcd9030 100644 --- a/tests/Storage/PublicSuffixListPsr16AdapterTest.php +++ b/src/Storage/PublicSuffixListPsr16AdapterTest.php @@ -13,11 +13,10 @@ declare(strict_types=1); -namespace Pdp\Tests\Storage; +namespace Pdp\Storage; use InvalidArgumentException; use Pdp\Rules; -use Pdp\Storage\PublicSuffixListCachePsr16Adapter; use PHPUnit\Framework\TestCase; use Psr\Log\AbstractLogger; use Psr\SimpleCache\CacheException; diff --git a/tests/Storage/PublicSuffixListRemoteStorageTest.php b/src/Storage/PublicSuffixListRemoteStorageTest.php similarity index 97% rename from tests/Storage/PublicSuffixListRemoteStorageTest.php rename to src/Storage/PublicSuffixListRemoteStorageTest.php index 69687b27..93f723f5 100644 --- a/tests/Storage/PublicSuffixListRemoteStorageTest.php +++ b/src/Storage/PublicSuffixListRemoteStorageTest.php @@ -13,13 +13,12 @@ declare(strict_types=1); -namespace Pdp\Tests\Storage; +namespace Pdp\Storage; use GuzzleHttp\Exception\ConnectException; use GuzzleHttp\Psr7\Request; use GuzzleHttp\Psr7\Response; use Pdp\Rules; -use Pdp\Storage\PublicSuffixListRemoteStorage; use Pdp\UnableToLoadPublicSuffixList; use PHPUnit\Framework\TestCase; use Psr\Http\Client\ClientInterface; diff --git a/tests/Storage/RootZoneDatabaseLocalStorageTest.php b/src/Storage/RootZoneDatabaseLocalStorageTest.php similarity index 94% rename from tests/Storage/RootZoneDatabaseLocalStorageTest.php rename to src/Storage/RootZoneDatabaseLocalStorageTest.php index 313ef709..2bec04ec 100644 --- a/tests/Storage/RootZoneDatabaseLocalStorageTest.php +++ b/src/Storage/RootZoneDatabaseLocalStorageTest.php @@ -13,12 +13,9 @@ declare(strict_types=1); -namespace Pdp\Tests\Storage; +namespace Pdp\Storage; use Pdp\RootZoneDatabase; -use Pdp\Storage\RootZoneDatabaseCache; -use Pdp\Storage\RootZoneDatabaseLocalStorage; -use Pdp\Storage\RootZoneDatabaseStorage; use Pdp\TopLevelDomains; use PHPUnit\Framework\TestCase; use function dirname; diff --git a/tests/Storage/RootZoneDatabasePsr16AdapterTest.php b/src/Storage/RootZoneDatabasePsr16AdapterTest.php similarity index 99% rename from tests/Storage/RootZoneDatabasePsr16AdapterTest.php rename to src/Storage/RootZoneDatabasePsr16AdapterTest.php index dc8988f4..bd074c43 100644 --- a/tests/Storage/RootZoneDatabasePsr16AdapterTest.php +++ b/src/Storage/RootZoneDatabasePsr16AdapterTest.php @@ -13,10 +13,9 @@ declare(strict_types=1); -namespace Pdp\Tests\Storage; +namespace Pdp\Storage; use InvalidArgumentException; -use Pdp\Storage\RootZoneDatabaseCachePsr16Adapter; use Pdp\TopLevelDomains; use PHPUnit\Framework\TestCase; use Psr\Log\AbstractLogger; diff --git a/tests/Storage/RootZoneDatabaseRemoteStorageTest.php b/src/Storage/RootZoneDatabaseRemoteStorageTest.php similarity index 97% rename from tests/Storage/RootZoneDatabaseRemoteStorageTest.php rename to src/Storage/RootZoneDatabaseRemoteStorageTest.php index 417714d6..f6bce093 100644 --- a/tests/Storage/RootZoneDatabaseRemoteStorageTest.php +++ b/src/Storage/RootZoneDatabaseRemoteStorageTest.php @@ -13,12 +13,11 @@ declare(strict_types=1); -namespace Pdp\Tests\Storage; +namespace Pdp\Storage; use GuzzleHttp\Exception\ConnectException; use GuzzleHttp\Psr7\Request; use GuzzleHttp\Psr7\Response; -use Pdp\Storage\RootZoneDatabaseRemoteStorage; use Pdp\TopLevelDomains; use Pdp\UnableToLoadRootZoneDatabase; use PHPUnit\Framework\TestCase; diff --git a/tests/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php similarity index 97% rename from tests/TopLevelDomainsTest.php rename to src/TopLevelDomainsTest.php index e678b32d..f71814a8 100644 --- a/tests/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -13,17 +13,10 @@ declare(strict_types=1); -namespace Pdp\Tests; +namespace Pdp; use DateTimeImmutable; use DateTimeZone; -use Pdp\Domain; -use Pdp\InvalidHost; -use Pdp\PublicSuffix; -use Pdp\RootZoneDatabaseConverter; -use Pdp\TopLevelDomains; -use Pdp\UnableToLoadRootZoneDatabase; -use Pdp\UnableToResolveDomain; use PHPUnit\Framework\TestCase; use TypeError; use function dirname; From 10ff2cdf5d043321c77f0da753183ff852eb135a Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Fri, 18 Sep 2020 20:04:19 +0200 Subject: [PATCH 241/461] Update gitattributes file --- .gitattributes | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitattributes b/.gitattributes index a19fc681..a1029c3f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5,9 +5,9 @@ /.github export-ignore /.gitignore export-ignore /.php_cs export-ignore -/.phpstan.src.neon export-ignore -/.phpstan.tests.neon export-ignore +/.phpstan.neon export-ignore /.travis.yml export-ignore /README.md export-ignore /phpunit.xml.dist export-ignore -/tests export-ignore +/CHANGELOG.md export-ignore +/**/*Test.php export-ignore From 52c6cb7b45216fcaad5b8cfa28ccd32c5e2f5797 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Fri, 18 Sep 2020 20:09:21 +0200 Subject: [PATCH 242/461] Update gitattributes file --- .gitattributes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index a1029c3f..37141d4d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5,7 +5,7 @@ /.github export-ignore /.gitignore export-ignore /.php_cs export-ignore -/.phpstan.neon export-ignore +/phpstan.neon export-ignore /.travis.yml export-ignore /README.md export-ignore /phpunit.xml.dist export-ignore From 4b1d7b78d66ebe45a1d91f24c6a63ad7e579a3fb Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Fri, 18 Sep 2020 20:12:20 +0200 Subject: [PATCH 243/461] Add PHP8 support in composer --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 81d7c4d5..5bbec8ce 100644 --- a/composer.json +++ b/composer.json @@ -37,7 +37,7 @@ "psl" ], "require": { - "php": "^7.4", + "php": "^7.4|^8.0", "ext-intl": "*", "ext-json": "*" }, From 4bea248409e1e0d11345ec3882ae276ec6bdf5e6 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Fri, 18 Sep 2020 20:13:51 +0200 Subject: [PATCH 244/461] Add PHP8 support in composer --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 5bbec8ce..3316a273 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,7 @@ } ], "bin": [ - "bin/update-psl" + "bin/update-pdp" ], "keywords": [ "Public Suffix List", @@ -85,7 +85,7 @@ }, "extra": { "branch-alias": { - "dev-master": "5.x-dev" + "dev-master": "6.x-dev" } }, "config": { From 0aae7048ea037f8dbc1c9b935d2311f6d51738aa Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 20 Sep 2020 23:05:09 +0200 Subject: [PATCH 245/461] Remove IDNAConversion interface from PublicSuffix and RootZoneDatabase interfaces --- src/PublicSuffixList.php | 11 +-- src/RootZoneDatabase.php | 7 +- src/Rules.php | 175 +++++++++++++++++------------------- src/RulesTest.php | 29 +----- src/TopLevelDomains.php | 105 ++++------------------ src/TopLevelDomainsTest.php | 31 +------ 6 files changed, 118 insertions(+), 240 deletions(-) diff --git a/src/PublicSuffixList.php b/src/PublicSuffixList.php index af28103a..72dbe873 100644 --- a/src/PublicSuffixList.php +++ b/src/PublicSuffixList.php @@ -16,8 +16,9 @@ namespace Pdp; use JsonSerializable; +use const IDNA_DEFAULT; -interface PublicSuffixList extends IDNConversion, JsonSerializable +interface PublicSuffixList extends JsonSerializable { /** * Returns an array representation of the Public Suffix List Rules JSON serializable. @@ -30,7 +31,7 @@ public function jsonSerialize(): array; * If the effective TLD can not be resolved it returns a ResolvedDomainName with a null public suffix * If the host is not a valid domaine it returns a ResolvedDomainName with a null Domain name */ - public function resolve(Host $host): ResolvedDomainName; + public function resolve(Host $host, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): ResolvedDomainName; /** * Returns PSL info for a given domain against the PSL rules for cookie domain detection. @@ -38,7 +39,7 @@ public function resolve(Host $host): ResolvedDomainName; * @throws InvalidDomainName if the domain is invalid * @throws UnableToResolveDomain if the domain or the TLD are not resolvable of not resolved */ - public function getCookieDomain(Host $host): ResolvedDomainName; + public function getCookieDomain(Host $host, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): ResolvedDomainName; /** * Returns PSL info for a given domain against the PSL rules for ICANN domain detection. @@ -46,7 +47,7 @@ public function getCookieDomain(Host $host): ResolvedDomainName; * @throws InvalidDomainName if the domain is invalid * @throws UnableToResolveDomain if the domain or the TLD are not resolvable of not resolved */ - public function getICANNDomain(Host $host): ResolvedDomainName; + public function getICANNDomain(Host $host, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): ResolvedDomainName; /** * Returns PSL info for a given domain against the PSL rules for private domain detection. @@ -54,5 +55,5 @@ public function getICANNDomain(Host $host): ResolvedDomainName; * @throws InvalidDomainName if the domain is invalid * @throws UnableToResolveDomain if the domain or the TLD are not resolvable of not resolved */ - public function getPrivateDomain(Host $host): ResolvedDomainName; + public function getPrivateDomain(Host $host, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): ResolvedDomainName; } diff --git a/src/RootZoneDatabase.php b/src/RootZoneDatabase.php index 9617a51c..ee5a96a6 100644 --- a/src/RootZoneDatabase.php +++ b/src/RootZoneDatabase.php @@ -19,8 +19,9 @@ use DateTimeImmutable; use IteratorAggregate; use JsonSerializable; +use const IDNA_DEFAULT; -interface RootZoneDatabase extends Countable, IteratorAggregate, IDNConversion, JsonSerializable +interface RootZoneDatabase extends Countable, IteratorAggregate, JsonSerializable { /** * Returns the Version ID. @@ -55,10 +56,10 @@ public function jsonSerialize(): array; /** * Tells whether the submitted TLD is a valid Top Level Domain. */ - public function contains(Host $tld): bool; + public function contains(Host $tld, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): bool; /** * Returns a domain where its public suffix is the found TLD. */ - public function resolve(Host $domain): ResolvedDomainName; + public function resolve(Host $domain, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): ResolvedDomainName; } diff --git a/src/Rules.php b/src/Rules.php index 5c278b04..c89d5c96 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -36,15 +36,9 @@ final class Rules implements PublicSuffixList */ private array $rules; - private int $asciiIDNAOption; - - private int $unicodeIDNAOption; - - private function __construct(array $rules, int $asciiIDNAOption, int $unicodeIDNAOption) + private function __construct(array $rules) { $this->rules = $rules; - $this->asciiIDNAOption = $asciiIDNAOption; - $this->unicodeIDNAOption = $unicodeIDNAOption; } /** @@ -54,12 +48,8 @@ private function __construct(array $rules, int $asciiIDNAOption, int $unicodeIDN * * @throws UnableToLoadPublicSuffixList If the rules can not be loaded from the path */ - public static function fromPath( - string $path, - $context = null, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT - ): self { + public static function fromPath(string $path, $context = null): self + { $args = [$path, 'r', false]; if (null !== $context) { $args[] = $context; @@ -74,7 +64,7 @@ public static function fromPath( $content = stream_get_contents($resource); fclose($resource); - return self::fromString($content, $asciiIDNAOption, $unicodeIDNAOption); + return self::fromString($content); } /** @@ -82,23 +72,17 @@ public static function fromPath( * * @param object|string $content a string or an object which exposes the __toString method */ - public static function fromString( - $content, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT - ): self { + public static function fromString($content): self + { static $converter; $converter = $converter ?? new PublicSuffixListConverter(); - return new self($converter->convert($content), $asciiIDNAOption, $unicodeIDNAOption); + return new self($converter->convert($content)); } - public static function fromJsonString( - string $jsonString, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT - ): self { + public static function fromJsonString(string $jsonString): self + { $data = json_decode($jsonString, true); $errorCode = json_last_error(); if (JSON_ERROR_NONE !== $errorCode) { @@ -113,22 +97,12 @@ public static function fromJsonString( throw UnableToLoadPublicSuffixList::dueToCorruptedSection(); } - return new self($data, $asciiIDNAOption, $unicodeIDNAOption); + return new self($data); } public static function __set_state(array $properties): self { - return new self($properties['rules'], $properties['asciiIDNAOption'], $properties['unicodeIDNAOption']); - } - - public function getAsciiIDNAOption(): int - { - return $this->asciiIDNAOption; - } - - public function getUnicodeIDNAOption(): int - { - return $this->unicodeIDNAOption; + return new self($properties['rules']); } public function jsonSerialize(): array @@ -139,52 +113,81 @@ public function jsonSerialize(): array /** * @param mixed $host a type that supports instantiating a Domain from. */ - public function resolve($host): ResolvedDomainName - { + public function resolve( + $host, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ): ResolvedDomainName { try { - return $this->getCookieDomain($host); + return $this->getCookieDomain($host, $asciiIDNAOption, $unicodeIDNAOption); } catch (UnableToResolveDomain $exception) { if ($exception->hasDomain()) { /** @var Host */ $host = $exception->getDomain(); + $host = $host->withAsciiIDNAOption($asciiIDNAOption)->withUnicodeIDNAOption($unicodeIDNAOption); + return new ResolvedDomain($host); } - return new ResolvedDomain(new Domain($host, $this->asciiIDNAOption, $this->unicodeIDNAOption)); + return new ResolvedDomain(new Domain($host, $asciiIDNAOption, $unicodeIDNAOption)); } catch (ExceptionInterface $exception) { - return new ResolvedDomain(Domain::fromNull($this->asciiIDNAOption, $this->unicodeIDNAOption)); + return new ResolvedDomain(Domain::fromNull($asciiIDNAOption, $unicodeIDNAOption)); } } /** * @param mixed $host the domain value */ - public function getCookieDomain($host): ResolvedDomainName - { - $domain = $this->validateDomain($host); - - return new ResolvedDomain($domain, $this->findPublicSuffix($domain, '')); + public function getCookieDomain( + $host, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ): ResolvedDomainName { + $domain = $this->validateDomain($host, $asciiIDNAOption, $unicodeIDNAOption); + + return new ResolvedDomain($domain, $this->findPublicSuffix( + $domain, + '', + $asciiIDNAOption, + $unicodeIDNAOption + )); } /** * @param mixed $host a type that supports instantiating a Domain from. */ - public function getICANNDomain($host): ResolvedDomainName - { - $domain = $this->validateDomain($host); - - return new ResolvedDomain($domain, $this->findPublicSuffix($domain, EffectiveTLD::ICANN_DOMAINS)); + public function getICANNDomain( + $host, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ): ResolvedDomainName { + $domain = $this->validateDomain($host, $asciiIDNAOption, $unicodeIDNAOption); + + return new ResolvedDomain($domain, $this->findPublicSuffix( + $domain, + EffectiveTLD::ICANN_DOMAINS, + $asciiIDNAOption, + $unicodeIDNAOption + )); } /** * @param mixed $host a type that supports instantiating a Domain from. */ - public function getPrivateDomain($host): ResolvedDomainName - { - $domain = $this->validateDomain($host); - - return new ResolvedDomain($domain, $this->findPublicSuffix($domain, PublicSuffix::PRIVATE_DOMAINS)); + public function getPrivateDomain( + $host, + int $asciiIDNAOption = IDNA_DEFAULT, + int $unicodeIDNAOption = IDNA_DEFAULT + ): ResolvedDomainName { + $domain = $this->validateDomain($host, $asciiIDNAOption, $unicodeIDNAOption); + + return new ResolvedDomain($domain, $this->findPublicSuffix( + $domain, + PublicSuffix::PRIVATE_DOMAINS, + $asciiIDNAOption, + $unicodeIDNAOption + )); } /** @@ -192,7 +195,7 @@ public function getPrivateDomain($host): ResolvedDomainName * * @param mixed $domain a type that supports instantiating a Domain from. */ - private function validateDomain($domain): DomainName + private function validateDomain($domain, int $asciiIDNAOption, int $unicodeIDNAOption): DomainName { if ($domain instanceof ExternalDomainName) { $domain = $domain->getDomain(); @@ -207,28 +210,32 @@ private function validateDomain($domain): DomainName } return $domain - ->withAsciiIDNAOption($this->asciiIDNAOption) - ->withUnicodeIDNAOption($this->unicodeIDNAOption); + ->withAsciiIDNAOption($asciiIDNAOption) + ->withUnicodeIDNAOption($unicodeIDNAOption); } /** * Returns the matched public suffix. */ - private function findPublicSuffix(DomainName $domain, string $section): PublicSuffix - { + private function findPublicSuffix( + DomainName $domain, + string $section, + int $asciiIDNAOption, + int $unicodeIDNAOption + ): PublicSuffix { $asciiDomain = $domain->toAscii(); - $icann = $this->findPublicSuffixFromSection($asciiDomain, EffectiveTLD::ICANN_DOMAINS); + $icann = $this->findPublicSuffixFromSection($asciiDomain, EffectiveTLD::ICANN_DOMAINS, $asciiIDNAOption, $unicodeIDNAOption); if (EffectiveTLD::ICANN_DOMAINS === $section) { return $icann; } - $private = $this->findPublicSuffixFromSection($asciiDomain, EffectiveTLD::PRIVATE_DOMAINS); + $private = $this->findPublicSuffixFromSection($asciiDomain, EffectiveTLD::PRIVATE_DOMAINS, $asciiIDNAOption, $unicodeIDNAOption); if (count($private) > count($icann)) { return $private; } if (EffectiveTLD::PRIVATE_DOMAINS === $section) { - return PublicSuffix::fromUnknown($asciiDomain->label(0), $this->asciiIDNAOption, $this->unicodeIDNAOption); + return PublicSuffix::fromUnknown($asciiDomain->label(0), $asciiIDNAOption, $unicodeIDNAOption); } return $icann; @@ -237,8 +244,12 @@ private function findPublicSuffix(DomainName $domain, string $section): PublicSu /** * Returns the public suffix matched against a given PSL section. */ - private function findPublicSuffixFromSection(DomainName $domain, string $section): PublicSuffix - { + private function findPublicSuffixFromSection( + DomainName $domain, + string $section, + int $asciiIDNAOption, + int $unicodeIDNAOption + ): PublicSuffix { $rules = $this->rules[$section] ?? []; $matches = []; foreach ($domain as $label) { @@ -263,39 +274,15 @@ private function findPublicSuffixFromSection(DomainName $domain, string $section } if ([] === $matches) { - return PublicSuffix::fromUnknown($domain->label(0), $this->asciiIDNAOption, $this->unicodeIDNAOption); + return PublicSuffix::fromUnknown($domain->label(0), $asciiIDNAOption, $unicodeIDNAOption); } $content = implode('.', array_reverse($matches)); if (PublicSuffix::PRIVATE_DOMAINS === $section) { - return PublicSuffix::fromPrivate($content, $this->asciiIDNAOption, $this->unicodeIDNAOption); + return PublicSuffix::fromPrivate($content, $asciiIDNAOption, $unicodeIDNAOption); } - return PublicSuffix::fromICANN($content, $this->asciiIDNAOption, $this->unicodeIDNAOption); - } - - public function withAsciiIDNAOption(int $asciiIDNAOption): self - { - if ($asciiIDNAOption === $this->asciiIDNAOption) { - return $this; - } - - $clone = clone $this; - $clone->asciiIDNAOption = $asciiIDNAOption; - - return $clone; - } - - public function withUnicodeIDNAOption(int $unicodeIDNAOption): self - { - if ($unicodeIDNAOption === $this->unicodeIDNAOption) { - return $this; - } - - $clone = clone $this; - $clone->unicodeIDNAOption = $unicodeIDNAOption; - - return $clone; + return PublicSuffix::fromICANN($content, $asciiIDNAOption, $unicodeIDNAOption); } } diff --git a/src/RulesTest.php b/src/RulesTest.php index 3c425574..2c50656d 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -73,25 +73,6 @@ public function testDomainInternalPhpMethod(): void self::assertEquals($this->rules, $generateRules); } - public function testWithIDNAOptions(): void - { - self::assertSame($this->rules, $this->rules->withAsciiIDNAOption( - $this->rules->getAsciiIDNAOption() - )); - - self::assertNotEquals($this->rules, $this->rules->withAsciiIDNAOption( - IDNA_NONTRANSITIONAL_TO_ASCII - )); - - self::assertSame($this->rules, $this->rules->withUnicodeIDNAOption( - $this->rules->getUnicodeIDNAOption() - )); - - self::assertNotEquals($this->rules, $this->rules->withUnicodeIDNAOption( - IDNA_NONTRANSITIONAL_TO_UNICODE - )); - } - public function testNullWillReturnNullDomain(): void { $domain = $this->rules->resolve('COM'); @@ -585,13 +566,11 @@ public function testResolveWithIDNAOptions(): void /** @var string $string */ $string = file_get_contents(dirname(__DIR__).'/test_data/public_suffix_list.dat'); - $rules = Rules::fromString($string, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); - $resolved = $rules->resolve('foo.de'); + $rules = Rules::fromString($string); + $resolved = $rules->resolve('foo.de', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); - self::assertSame( - [$rules->getAsciiIDNAOption(), $rules->getUnicodeIDNAOption()], - [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption()] - ); + self::assertSame(IDNA_NONTRANSITIONAL_TO_ASCII, $resolved->getAsciiIDNAOption()); + self::assertSame(IDNA_NONTRANSITIONAL_TO_UNICODE, $resolved->getUnicodeIDNAOption()); } /** diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index d39f0b7e..38928dc4 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -37,17 +37,8 @@ final class TopLevelDomains implements RootZoneDatabase private array $records; - private int $asciiIDNAOption; - - private int $unicodeIDNAOption; - - private function __construct( - array $records, - string $version, - DateTimeInterface $modifiedDate, - int $asciiIDNAOption, - int $unicodeIDNAOption - ) { + private function __construct(array $records, string $version, DateTimeInterface $modifiedDate) + { if ($modifiedDate instanceof DateTime) { $modifiedDate = DateTimeImmutable::createFromMutable($modifiedDate); } @@ -55,8 +46,6 @@ private function __construct( $this->records = $records; $this->version = $version; $this->modifiedDate = $modifiedDate; - $this->asciiIDNAOption = $asciiIDNAOption; - $this->unicodeIDNAOption = $unicodeIDNAOption; } /** @@ -66,12 +55,8 @@ private function __construct( * * @throws UnableToLoadRootZoneDatabase If the rules can not be loaded from the path */ - public static function fromPath( - string $path, - $context = null, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT - ): self { + public static function fromPath(string $path, $context = null): self + { $args = [$path, 'r', false]; if (null !== $context) { $args[] = $context; @@ -86,7 +71,7 @@ public static function fromPath( $content = stream_get_contents($resource); fclose($resource); - return self::fromString($content, $asciiIDNAOption, $unicodeIDNAOption); + return self::fromString($content); } /** @@ -94,11 +79,8 @@ public static function fromPath( * * @param object|string $content a string or an object which exposes the __toString method */ - public static function fromString( - $content, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT - ): self { + public static function fromString($content): self + { static $converter; $converter = $converter ?? new RootZoneDatabaseConverter(); @@ -107,20 +89,11 @@ public static function fromString( /** @var DateTimeImmutable $modifiedDate */ $modifiedDate = DateTimeImmutable::createFromFormat(DateTimeInterface::ATOM, $data['modifiedDate']); - return new self( - $data['records'], - $data['version'], - $modifiedDate, - $asciiIDNAOption, - $unicodeIDNAOption - ); + return new self($data['records'], $data['version'], $modifiedDate); } - public static function fromJsonString( - string $jsonString, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT - ): self { + public static function fromJsonString(string $jsonString): self + { $data = json_decode($jsonString, true); $errorCode = json_last_error(); if (JSON_ERROR_NONE !== $errorCode) { @@ -134,18 +107,12 @@ public static function fromJsonString( /** @var DateTimeImmutable $modifiedDate */ $modifiedDate = DateTimeImmutable::createFromFormat(DateTimeInterface::ATOM, $data['modifiedDate']); - return new self($data['records'], $data['version'], $modifiedDate, $asciiIDNAOption, $unicodeIDNAOption); + return new self($data['records'], $data['version'], $modifiedDate); } public static function __set_state(array $properties): RootZoneDatabase { - return new self( - $properties['records'], - $properties['version'], - $properties['modifiedDate'], - $properties['asciiIDNAOption'], - $properties['unicodeIDNAOption'] - ); + return new self($properties['records'], $properties['version'], $properties['modifiedDate']); } public function getVersion(): string @@ -158,16 +125,6 @@ public function getModifiedDate(): DateTimeImmutable return $this->modifiedDate; } - public function getAsciiIDNAOption(): int - { - return $this->asciiIDNAOption; - } - - public function getUnicodeIDNAOption(): int - { - return $this->unicodeIDNAOption; - } - public function count(): int { return count($this->records); @@ -181,7 +138,7 @@ public function isEmpty(): bool public function getIterator() { foreach ($this->records as $tld) { - yield PublicSuffix::fromUnknown($tld, $this->asciiIDNAOption, $this->unicodeIDNAOption)->toAscii(); + yield PublicSuffix::fromUnknown($tld)->toAscii(); } } @@ -197,11 +154,11 @@ public function jsonSerialize(): array /** * @param mixed $tld a TLD in a type that can be converted into a DomainInterface instance */ - public function contains($tld): bool + public function contains($tld, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): bool { try { if (!$tld instanceof DomainName) { - $tld = new Domain($tld, $this->asciiIDNAOption, $this->unicodeIDNAOption); + $tld = new Domain($tld, $asciiIDNAOption, $unicodeIDNAOption); } } catch (ExceptionInterface $exception) { return false; @@ -225,7 +182,7 @@ public function contains($tld): bool /** * @param mixed $domain a domain in a type that can be converted into a DomainInterface instance */ - public function resolve($domain): ResolvedDomainName + public function resolve($domain, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): ResolvedDomainName { if ($domain instanceof ExternalDomainName) { $domain = $domain->getDomain(); @@ -240,8 +197,8 @@ public function resolve($domain): ResolvedDomainName } $domain = $domain - ->withAsciiIDNAOption($this->asciiIDNAOption) - ->withUnicodeIDNAOption($this->unicodeIDNAOption); + ->withAsciiIDNAOption($asciiIDNAOption) + ->withUnicodeIDNAOption($unicodeIDNAOption); $label = $domain->toAscii()->label(0); foreach ($this as $tld) { @@ -250,30 +207,6 @@ public function resolve($domain): ResolvedDomainName } } - return new ResolvedDomain($domain, PublicSuffix::fromNull($this->asciiIDNAOption, $this->unicodeIDNAOption)); - } - - public function withAsciiIDNAOption(int $option): RootZoneDatabase - { - if ($option === $this->asciiIDNAOption) { - return $this; - } - - $clone = clone $this; - $clone->asciiIDNAOption = $option; - - return $clone; - } - - public function withUnicodeIDNAOption(int $option): RootZoneDatabase - { - if ($option === $this->unicodeIDNAOption) { - return $this; - } - - $clone = clone $this; - $clone->unicodeIDNAOption = $option; - - return $clone; + return new ResolvedDomain($domain, PublicSuffix::fromNull($asciiIDNAOption, $unicodeIDNAOption)); } } diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index f71814a8..609f48e0 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -100,25 +100,6 @@ public function testGetterProperties(): void } } - public function testWithIDNAOptions(): void - { - self::assertSame($this->topLevelDomains, $this->topLevelDomains->withAsciiIDNAOption( - $this->topLevelDomains->getAsciiIDNAOption() - )); - - self::assertNotEquals($this->topLevelDomains, $this->topLevelDomains->withAsciiIDNAOption( - 128 - )); - - self::assertSame($this->topLevelDomains, $this->topLevelDomains->withUnicodeIDNAOption( - $this->topLevelDomains->getUnicodeIDNAOption() - )); - - self::assertNotEquals($this->topLevelDomains, $this->topLevelDomains->withUnicodeIDNAOption( - 128 - )); - } - /** * @dataProvider validDomainProvider * @@ -191,17 +172,13 @@ public function testResolveWithIDNAOptions(): void $collection = TopLevelDomains::fromPath( dirname(__DIR__).'/test_data/root_zones.dat', - null, - IDNA_NONTRANSITIONAL_TO_ASCII, - IDNA_NONTRANSITIONAL_TO_UNICODE + null ); - $resolved = $collection->resolve('foo.de'); + $resolved = $collection->resolve('foo.de', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); - self::assertSame( - [IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE], - [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption()] - ); + self::assertSame(IDNA_NONTRANSITIONAL_TO_ASCII, $resolved->getAsciiIDNAOption()); + self::assertSame(IDNA_NONTRANSITIONAL_TO_UNICODE, $resolved->getUnicodeIDNAOption()); } /** From 4b23f8a720b569136eb07063871ed6ae5ce9b5c9 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 24 Sep 2020 22:46:33 +0200 Subject: [PATCH 246/461] Update Storage feature --- bin/update-pdp | 38 +++++++++---------- ...che.php => JsonSerializablePsr16Cache.php} | 8 ++-- ...age.php => PublicSuffixListRepository.php} | 2 +- ...age.php => RootZoneDatabaseRepository.php} | 2 +- ...hePsr16Adapter.php => RulesPsr16Cache.php} | 15 ++++++-- ...dapterTest.php => RulesPsr16CacheTest.php} | 24 ++++++------ ...RemoteStorage.php => RulesPsr18Client.php} | 2 +- ...orageTest.php => RulesPsr18ClientTest.php} | 10 ++--- ...stLocalStorage.php => RulesRepository.php} | 10 ++--- ...torageTest.php => RulesRepositoryTest.php} | 13 ++++--- ...pter.php => TopLevelDomainsPsr16Cache.php} | 15 ++++++-- ....php => TopLevelDomainsPsr16CacheTest.php} | 37 +++++++++--------- ...age.php => TopLevelDomainsPsr18Client.php} | 2 +- ...php => TopLevelDomainsPsr18ClientTest.php} | 10 ++--- ...rage.php => TopLevelDomainsRepository.php} | 10 ++--- ....php => TopLevelDomainsRepositoryTest.php} | 13 ++++--- 16 files changed, 117 insertions(+), 94 deletions(-) rename src/Storage/{Psr16JsonCache.php => JsonSerializablePsr16Cache.php} (93%) rename src/Storage/{PublicSuffixListStorage.php => PublicSuffixListRepository.php} (95%) rename src/Storage/{RootZoneDatabaseStorage.php => RootZoneDatabaseRepository.php} (95%) rename src/Storage/{PublicSuffixListCachePsr16Adapter.php => RulesPsr16Cache.php} (70%) rename src/Storage/{PublicSuffixListPsr16AdapterTest.php => RulesPsr16CacheTest.php} (93%) rename src/Storage/{PublicSuffixListRemoteStorage.php => RulesPsr18Client.php} (95%) rename src/Storage/{PublicSuffixListRemoteStorageTest.php => RulesPsr18ClientTest.php} (90%) rename src/Storage/{PublicSuffixListLocalStorage.php => RulesRepository.php} (72%) rename src/Storage/{PublicSuffixListLocalStorageTest.php => RulesRepositoryTest.php} (85%) rename src/Storage/{RootZoneDatabaseCachePsr16Adapter.php => TopLevelDomainsPsr16Cache.php} (70%) rename src/Storage/{RootZoneDatabasePsr16AdapterTest.php => TopLevelDomainsPsr16CacheTest.php} (90%) rename src/Storage/{RootZoneDatabaseRemoteStorage.php => TopLevelDomainsPsr18Client.php} (95%) rename src/Storage/{RootZoneDatabaseRemoteStorageTest.php => TopLevelDomainsPsr18ClientTest.php} (90%) rename src/Storage/{RootZoneDatabaseLocalStorage.php => TopLevelDomainsRepository.php} (72%) rename src/Storage/{RootZoneDatabaseLocalStorageTest.php => TopLevelDomainsRepositoryTest.php} (84%) diff --git a/bin/update-pdp b/bin/update-pdp index 121dad26..bc8af958 100755 --- a/bin/update-pdp +++ b/bin/update-pdp @@ -16,12 +16,12 @@ declare(strict_types=1); use GuzzleHttp\Client; use GuzzleHttp\Psr7\Request; -use Pdp\Storage\PublicSuffixListCachePsr16Adapter; -use Pdp\Storage\PublicSuffixListRemoteStorage; -use Pdp\Storage\PublicSuffixListStorage; -use Pdp\Storage\RootZoneDatabaseCachePsr16Adapter; -use Pdp\Storage\RootZoneDatabaseRemoteStorage; -use Pdp\Storage\RootZoneDatabaseStorage; +use Pdp\Storage\RulesPsr16Cache; +use Pdp\Storage\RulesPsr18Client; +use Pdp\Storage\PublicSuffixListRepository; +use Pdp\Storage\TopLevelDomainsPsr16Cache; +use Pdp\Storage\TopLevelDomainsPsr18Client; +use Pdp\Storage\RootZoneDatabaseRepository; use Psr\Http\Message\RequestFactoryInterface; use Psr\Http\Message\RequestInterface; use Psr\Log\AbstractLogger; @@ -104,7 +104,7 @@ $logger = new class extends AbstractLogger { $cyan = chr(27)."[36m"; $green = chr(27)."[32m"; $reset = chr(27)."[0m"; -$redbg = chr(27)."[41m"; +$redBg = chr(27)."[41m"; $yellow = chr(27)."[33m"; $arguments = getopt('h::', [ @@ -154,7 +154,7 @@ try { if (null !== $logger) { $logger->error('Local cache initialisation failed with {exception}', ['exception' => $exception->getMessage()]); } - fail("$redbg The script failed on initialisation.$reset"); + fail("$redBg The script failed on initialisation.$reset"); die(1); } @@ -163,32 +163,32 @@ success("$yellow Starting updating your local cache.$reset"); $error = 0; try { - $client = new PublicSuffixListRemoteStorage($httpClient, $requestFactory); - $storage = new PublicSuffixListCachePsr16Adapter($cache, $ttl, $logger); + $rulesClient = new RulesPsr18Client($httpClient, $requestFactory); + $rulesCache = new RulesPsr16Cache($cache, $ttl, $logger); - $publicSuffixList = $client->getByUri(PublicSuffixListStorage::PSL_URL); + $rules = $rulesClient->getByUri(PublicSuffixListRepository::PSL_URL); - if (!$storage->storeByUri(PublicSuffixListStorage::PSL_URL, $publicSuffixList)) { + if (!$rulesCache->storeByUri(PublicSuffixListRepository::PSL_URL, $rules)) { throw new RuntimeException('Could not save the Public Suffix List to the `'.$context[KEY_CACHE_DIR].'` cache.'); } } catch (Throwable $exception) { $logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); - fail("$redbg The command failed to update the public suffix list local cache. $reset"); + fail("$redBg The command failed to update the public suffix list local cache. $reset"); ++$error; } try { - $client = new RootZoneDatabaseRemoteStorage($httpClient, $requestFactory); - $storage = new RootZoneDatabaseCachePsr16Adapter($cache, $ttl, $logger); + $topLevelDomainClient = new TopLevelDomainsPsr18Client($httpClient, $requestFactory); + $topLevelDomainCache = new TopLevelDomainsPsr16Cache($cache, $ttl, $logger); - $rootZoneDatabase = $client->getByUri(RootZoneDatabaseStorage::RZD_URL); + $topLevelDomains = $topLevelDomainClient->getByUri(RootZoneDatabaseRepository::RZD_URL); - if (!$storage->storeByUri(RootZoneDatabaseStorage::RZD_URL, $rootZoneDatabase)) { + if (!$topLevelDomainCache->storeByUri(RootZoneDatabaseRepository::RZD_URL, $topLevelDomains)) { throw new RuntimeException('Could not save the Root Zone Database to the `'.$context[KEY_CACHE_DIR].'` cache.'); } } catch (Throwable $exception) { $logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); - fail("$redbg The command failed to update the root zone database local cache. $reset"); + fail("$redBg The command failed to update the root zone database local cache. $reset"); ++$error; } @@ -198,5 +198,5 @@ if (0 === $error) { die(0); } -fail("$redbg The command failed to update the root zone database local cache. $reset"); +fail("$redBg The command failed to update the root zone database local cache. $reset"); die(1); diff --git a/src/Storage/Psr16JsonCache.php b/src/Storage/JsonSerializablePsr16Cache.php similarity index 93% rename from src/Storage/Psr16JsonCache.php rename to src/Storage/JsonSerializablePsr16Cache.php index eb68f38a..9b20d555 100644 --- a/src/Storage/Psr16JsonCache.php +++ b/src/Storage/JsonSerializablePsr16Cache.php @@ -36,7 +36,7 @@ use function strtolower; use const FILTER_VALIDATE_INT; -abstract class Psr16JsonCache +final class JsonSerializablePsr16Cache { protected const CACHE_PREFIX = 'pdp_'; @@ -96,7 +96,7 @@ final protected function setTtl($ttl): ?DateInterval return $date; } - final protected function store(string $uri, JsonSerializable $object): bool + public function store(string $uri, JsonSerializable $object): bool { try { $result = $this->cache->set($this->cacheKey($uri), json_encode($object), $this->ttl); @@ -127,12 +127,12 @@ private function cacheKey(string $str): string return self::CACHE_PREFIX.md5(strtolower($str)); } - final protected function fetch(string $uri): ?string + public function fetch(string $uri): ?string { return $this->cache->get($this->cacheKey($uri)); } - final protected function forget(string $uri, Throwable $exception = null): bool + public function forget(string $uri, Throwable $exception = null): bool { $result = $this->cache->delete($this->cacheKey($uri)); if (null !== $exception) { diff --git a/src/Storage/PublicSuffixListStorage.php b/src/Storage/PublicSuffixListRepository.php similarity index 95% rename from src/Storage/PublicSuffixListStorage.php rename to src/Storage/PublicSuffixListRepository.php index 7322ec4e..ad1fc962 100644 --- a/src/Storage/PublicSuffixListStorage.php +++ b/src/Storage/PublicSuffixListRepository.php @@ -18,7 +18,7 @@ use Pdp\PublicSuffixList; use Pdp\UnableToLoadPublicSuffixList; -interface PublicSuffixListStorage +interface PublicSuffixListRepository { public const PSL_URL = 'https://publicsuffix.org/list/public_suffix_list.dat'; diff --git a/src/Storage/RootZoneDatabaseStorage.php b/src/Storage/RootZoneDatabaseRepository.php similarity index 95% rename from src/Storage/RootZoneDatabaseStorage.php rename to src/Storage/RootZoneDatabaseRepository.php index 1b03b508..1bbaddff 100644 --- a/src/Storage/RootZoneDatabaseStorage.php +++ b/src/Storage/RootZoneDatabaseRepository.php @@ -18,7 +18,7 @@ use Pdp\RootZoneDatabase; use Pdp\UnableToLoadRootZoneDatabase; -interface RootZoneDatabaseStorage +interface RootZoneDatabaseRepository { public const RZD_URL = 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt'; diff --git a/src/Storage/PublicSuffixListCachePsr16Adapter.php b/src/Storage/RulesPsr16Cache.php similarity index 70% rename from src/Storage/PublicSuffixListCachePsr16Adapter.php rename to src/Storage/RulesPsr16Cache.php index af85fcd9..25a3f8c2 100644 --- a/src/Storage/PublicSuffixListCachePsr16Adapter.php +++ b/src/Storage/RulesPsr16Cache.php @@ -19,11 +19,18 @@ use Pdp\Rules; use Throwable; -final class PublicSuffixListCachePsr16Adapter extends Psr16JsonCache implements PublicSuffixListCache +final class RulesPsr16Cache implements PublicSuffixListCache { + private JsonSerializablePsr16Cache $cache; + + public function __construct(JsonSerializablePsr16Cache $cache) + { + $this->cache = $cache; + } + public function fetchByUri(string $uri): ?Rules { - $cacheData = $this->fetch($uri); + $cacheData = $this->cache->fetch($uri); if (null === $cacheData) { return null; } @@ -31,7 +38,7 @@ public function fetchByUri(string $uri): ?Rules try { $rules = Rules::fromJsonString($cacheData); } catch (Throwable $exception) { - $this->forget($uri, $exception); + $this->cache->forget($uri, $exception); return null; } @@ -41,6 +48,6 @@ public function fetchByUri(string $uri): ?Rules public function storeByUri(string $uri, PublicSuffixList $publicSuffixList): bool { - return $this->store($uri, $publicSuffixList); + return $this->cache->store($uri, $publicSuffixList); } } diff --git a/src/Storage/PublicSuffixListPsr16AdapterTest.php b/src/Storage/RulesPsr16CacheTest.php similarity index 93% rename from src/Storage/PublicSuffixListPsr16AdapterTest.php rename to src/Storage/RulesPsr16CacheTest.php index 0dcd9030..5a978ec5 100644 --- a/src/Storage/PublicSuffixListPsr16AdapterTest.php +++ b/src/Storage/RulesPsr16CacheTest.php @@ -27,9 +27,9 @@ use function json_encode; /** - * @coversDefaultClass \Pdp\Storage\PublicSuffixListCachePsr16Adapter + * @coversDefaultClass \Pdp\Storage\RulesPsr16Cache */ -final class PublicSuffixListPsr16AdapterTest extends TestCase +final class RulesPsr16CacheTest extends TestCase { public function testItReturnsNullIfTheCacheDoesNotExists(): void { @@ -74,7 +74,7 @@ public function has($key) } }; - $pslCache = new PublicSuffixListCachePsr16Adapter($cache, '1 DAY'); + $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, '1 DAY')); self::assertNull($pslCache->fetchByUri('http://www.example.com')); } @@ -122,7 +122,7 @@ public function has($key) } }; - $pslCache = new PublicSuffixListCachePsr16Adapter($cache, 86400); + $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 86400)); self::assertEquals( Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'), @@ -192,7 +192,8 @@ public function logs(): array } }; - $pslCache = new PublicSuffixListCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); + $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 86400, $logger)); + self::assertNull($pslCache->fetchByUri('http://www.example.com')); self::assertSame('Failed to JSON decode the string: Syntax error.', $logger->logs()[0]); } @@ -259,7 +260,8 @@ public function logs(): array } }; - $pslCache = new PublicSuffixListCachePsr16Adapter($cache, new \DateTimeImmutable('+1 DAY'), $logger); + $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, new \DateTimeImmutable('+1 DAY'), $logger)); + self::assertNull($pslCache->fetchByUri('http://www.example.com')); self::assertSame( 'The public suffix list data are missing one of the required ICANN or PRIVATE domain section.', @@ -312,7 +314,7 @@ public function has($key) self::expectException(TypeError::class); - new PublicSuffixListCachePsr16Adapter($cache, []); + new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, [])); } public function testItThrowsOnConstructionIfTheTTLStringCanNotBeParsed(): void @@ -360,7 +362,7 @@ public function has($key) self::expectException(InvalidArgumentException::class); - new PublicSuffixListCachePsr16Adapter($cache, 'foobar'); + new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'foobar')); } public function testItCanStoreAPublicSuffixListInstance(): void @@ -426,7 +428,7 @@ public function logs(): array }; $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new PublicSuffixListCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); + $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, new \DateInterval('P1D'), $logger)); self::assertTrue($pslCache->storeByUri('http://www.example.com', $psl)); self::assertSame('The content associated with URI: `http://www.example.com` was stored.', $logger->logs()[0]); @@ -495,7 +497,7 @@ public function logs(): array }; $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new PublicSuffixListCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); + $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, new \DateInterval('P1D'), $logger)); self::assertFalse($pslCache->storeByUri('http://www.example.com', $psl)); self::assertSame('The content associated with URI: `http://www.example.com` could not be stored.', $logger->logs()[0]); @@ -566,7 +568,7 @@ public function logs(): array }; $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new PublicSuffixListCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); + $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, new \DateInterval('P1D'), $logger)); self::assertFalse($pslCache->storeByUri('http://www.example.com', $psl)); self::assertSame('The content associated with URI: `http://www.example.com` could not be cached: Something went wrong.', $logger->logs()[0]); diff --git a/src/Storage/PublicSuffixListRemoteStorage.php b/src/Storage/RulesPsr18Client.php similarity index 95% rename from src/Storage/PublicSuffixListRemoteStorage.php rename to src/Storage/RulesPsr18Client.php index 83d8e84d..aa01619f 100644 --- a/src/Storage/PublicSuffixListRemoteStorage.php +++ b/src/Storage/RulesPsr18Client.php @@ -22,7 +22,7 @@ use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestFactoryInterface; -final class PublicSuffixListRemoteStorage implements PublicSuffixListStorage +final class RulesPsr18Client implements PublicSuffixListRepository { private ClientInterface $client; diff --git a/src/Storage/PublicSuffixListRemoteStorageTest.php b/src/Storage/RulesPsr18ClientTest.php similarity index 90% rename from src/Storage/PublicSuffixListRemoteStorageTest.php rename to src/Storage/RulesPsr18ClientTest.php index 93f723f5..320a44a6 100644 --- a/src/Storage/PublicSuffixListRemoteStorageTest.php +++ b/src/Storage/RulesPsr18ClientTest.php @@ -29,9 +29,9 @@ use function file_get_contents; /** - * @coversDefaultClass \Pdp\Storage\PublicSuffixListRemoteStorage + * @coversDefaultClass \Pdp\Storage\RulesPsr18Client */ -final class PublicSuffixListRemoteStorageTest extends TestCase +final class RulesPsr18ClientTest extends TestCase { public function testIsCanReturnAPublicSuffixListInstance(): void { @@ -51,7 +51,7 @@ public function createRequest(string $method, $uri): RequestInterface } }; - $storage = new PublicSuffixListRemoteStorage($client, $requestFactory); + $storage = new RulesPsr18Client($client, $requestFactory); $psl = $storage->getByUri('http://www.example.com'); self::assertInstanceOf(Rules::class, $psl); @@ -76,7 +76,7 @@ public function createRequest(string $method, $uri): RequestInterface self::expectException(UnableToLoadPublicSuffixList::class); self::expectExceptionMessage('Could not access the Public Suffix List URI: `http://www.example.com`.'); - $storage = new PublicSuffixListRemoteStorage($client, $requestFactory); + $storage = new RulesPsr18Client($client, $requestFactory); $storage->getByUri('http://www.example.com'); } @@ -100,7 +100,7 @@ public function createRequest(string $method, $uri): RequestInterface self::expectExceptionMessage('Invalid response from Public Suffix List URI: `http://www.example.com`.'); self::expectExceptionCode(404); - $storage = new PublicSuffixListRemoteStorage($client, $requestFactory); + $storage = new RulesPsr18Client($client, $requestFactory); $storage->getByUri('http://www.example.com'); } } diff --git a/src/Storage/PublicSuffixListLocalStorage.php b/src/Storage/RulesRepository.php similarity index 72% rename from src/Storage/PublicSuffixListLocalStorage.php rename to src/Storage/RulesRepository.php index 9b015822..7658ac79 100644 --- a/src/Storage/PublicSuffixListLocalStorage.php +++ b/src/Storage/RulesRepository.php @@ -17,15 +17,15 @@ use Pdp\PublicSuffixList; -final class PublicSuffixListLocalStorage implements PublicSuffixListStorage +final class RulesRepository implements PublicSuffixListRepository { - private PublicSuffixListStorage $client; + private PublicSuffixListRepository $repository; private PublicSuffixListCache $cache; - public function __construct(PublicSuffixListCache $cache, PublicSuffixListStorage $client) + public function __construct(PublicSuffixListRepository $repository, PublicSuffixListCache $cache) { - $this->client = $client; + $this->repository = $repository; $this->cache = $cache; } @@ -36,7 +36,7 @@ public function getByUri(string $uri): PublicSuffixList return $publicSuffixList; } - $publicSuffixList = $this->client->getByUri($uri); + $publicSuffixList = $this->repository->getByUri($uri); $this->cache->storeByUri($uri, $publicSuffixList); diff --git a/src/Storage/PublicSuffixListLocalStorageTest.php b/src/Storage/RulesRepositoryTest.php similarity index 85% rename from src/Storage/PublicSuffixListLocalStorageTest.php rename to src/Storage/RulesRepositoryTest.php index 65268658..afd3e933 100644 --- a/src/Storage/PublicSuffixListLocalStorageTest.php +++ b/src/Storage/RulesRepositoryTest.php @@ -20,7 +20,10 @@ use PHPUnit\Framework\TestCase; use function dirname; -final class PublicSuffixListLocalStorageTest extends TestCase +/** + * @coversDefaultClass \Pdp\Storage\RulesRepository + */ +final class RulesRepositoryTest extends TestCase { public function testIsCanReturnAPublicSuffixListInstanceFromCache(): void { @@ -36,14 +39,14 @@ public function storeByUri(string $uri, PublicSuffixList $publicSuffixList): boo } }; - $client = new class() implements PublicSuffixListStorage { + $client = new class() implements PublicSuffixListRepository { public function getByUri(string $uri): PublicSuffixList { return Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); } }; - $storage = new PublicSuffixListLocalStorage($cache, $client); + $storage = new RulesRepository($client, $cache); $psl = $storage->getByUri('http://www.example.com'); self::assertInstanceOf(Rules::class, $psl); @@ -63,14 +66,14 @@ public function storeByUri(string $uri, PublicSuffixList $publicSuffixList): boo } }; - $client = new class() implements PublicSuffixListStorage { + $client = new class() implements PublicSuffixListRepository { public function getByUri(string $uri): PublicSuffixList { return Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); } }; - $storage = new PublicSuffixListLocalStorage($cache, $client); + $storage = new RulesRepository($client, $cache); $psl = $storage->getByUri('http://www.example.com'); self::assertInstanceOf(Rules::class, $psl); diff --git a/src/Storage/RootZoneDatabaseCachePsr16Adapter.php b/src/Storage/TopLevelDomainsPsr16Cache.php similarity index 70% rename from src/Storage/RootZoneDatabaseCachePsr16Adapter.php rename to src/Storage/TopLevelDomainsPsr16Cache.php index 13a59e4b..c53fd205 100644 --- a/src/Storage/RootZoneDatabaseCachePsr16Adapter.php +++ b/src/Storage/TopLevelDomainsPsr16Cache.php @@ -19,11 +19,18 @@ use Pdp\TopLevelDomains; use Throwable; -final class RootZoneDatabaseCachePsr16Adapter extends Psr16JsonCache implements RootZoneDatabaseCache +final class TopLevelDomainsPsr16Cache implements RootZoneDatabaseCache { + private JsonSerializablePsr16Cache $cache; + + public function __construct(JsonSerializablePsr16Cache $cache) + { + $this->cache = $cache; + } + public function fetchByUri(string $uri): ?RootZoneDatabase { - $cacheData = $this->fetch($uri); + $cacheData = $this->cache->fetch($uri); if (null === $cacheData) { return null; } @@ -31,7 +38,7 @@ public function fetchByUri(string $uri): ?RootZoneDatabase try { $topLevelDomains = TopLevelDomains::fromJsonString($cacheData); } catch (Throwable $exception) { - $this->forget($uri, $exception); + $this->cache->forget($uri, $exception); return null; } @@ -41,6 +48,6 @@ public function fetchByUri(string $uri): ?RootZoneDatabase public function storeByUri(string $uri, RootZoneDatabase $topLevelDomains): bool { - return $this->store($uri, $topLevelDomains); + return $this->cache->store($uri, $topLevelDomains); } } diff --git a/src/Storage/RootZoneDatabasePsr16AdapterTest.php b/src/Storage/TopLevelDomainsPsr16CacheTest.php similarity index 90% rename from src/Storage/RootZoneDatabasePsr16AdapterTest.php rename to src/Storage/TopLevelDomainsPsr16CacheTest.php index bd074c43..aa715b62 100644 --- a/src/Storage/RootZoneDatabasePsr16AdapterTest.php +++ b/src/Storage/TopLevelDomainsPsr16CacheTest.php @@ -27,9 +27,9 @@ use function json_encode; /** - * @coversDefaultClass \Pdp\Storage\RootZoneDatabaseCachePsr16Adapter + * @coversDefaultClass \Pdp\Storage\TopLevelDomainsPsr16Cache */ -final class RootZoneDatabasePsr16AdapterTest extends TestCase +final class TopLevelDomainsPsr16CacheTest extends TestCase { public function testItReturnsNullIfTheCacheDoesNotExists(): void { @@ -74,9 +74,9 @@ public function has($key) } }; - $pslCache = new RootZoneDatabaseCachePsr16Adapter($cache, '1 DAY'); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, '1 DAY')); - self::assertNull($pslCache->fetchByUri('http://www.example.com')); + self::assertNull($cache->fetchByUri('http://www.example.com')); } public function testItReturnsAnInstanceIfTheCorrectCacheExists(): void @@ -122,11 +122,11 @@ public function has($key) } }; - $pslCache = new RootZoneDatabaseCachePsr16Adapter($cache, 86400); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 86400)); self::assertEquals( TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'), - $pslCache->fetchByUri('http://www.example.com') + $cache->fetchByUri('http://www.example.com') ); } @@ -192,8 +192,9 @@ public function logs(): array } }; - $pslCache = new RootZoneDatabaseCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); - self::assertNull($pslCache->fetchByUri('http://www.example.com')); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 86400, $logger)); + + self::assertNull($cache->fetchByUri('http://www.example.com')); self::assertSame('Failed to JSON decode the string: Syntax error.', $logger->logs()[0]); } @@ -259,8 +260,8 @@ public function logs(): array } }; - $pslCache = new RootZoneDatabaseCachePsr16Adapter($cache, new \DateTimeImmutable('+1 DAY'), $logger); - self::assertNull($pslCache->fetchByUri('http://www.example.com')); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 86400, $logger)); + self::assertNull($cache->fetchByUri('http://www.example.com')); self::assertSame( 'The decoded hashmap structure is missing at least one of the required properties: `records`, `version` and/or `modifiedDate`.', $logger->logs()[0] @@ -312,7 +313,7 @@ public function has($key) self::expectException(TypeError::class); - new RootZoneDatabaseCachePsr16Adapter($cache, []); + new JsonSerializablePsr16Cache($cache, []); } public function testItThrowsOnConstructionIfTheTTLStringCanNotBeParsed(): void @@ -360,7 +361,7 @@ public function has($key) self::expectException(InvalidArgumentException::class); - new RootZoneDatabaseCachePsr16Adapter($cache, 'foobar'); + new JsonSerializablePsr16Cache($cache, 'foobar'); } public function testItCanStoreAPublicSuffixListInstance(): void @@ -426,9 +427,9 @@ public function logs(): array }; $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $pslCache = new RootZoneDatabaseCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, new \DateInterval('P1D'), $logger)); - self::assertTrue($pslCache->storeByUri('http://www.example.com', $rzd)); + self::assertTrue($cache->storeByUri('http://www.example.com', $rzd)); self::assertSame('The content associated with URI: `http://www.example.com` was stored.', $logger->logs()[0]); } @@ -495,9 +496,9 @@ public function logs(): array }; $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $pslCache = new RootZoneDatabaseCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, new \DateInterval('P1D'), $logger)); - self::assertFalse($pslCache->storeByUri('http://www.example.com', $rzd)); + self::assertFalse($cache->storeByUri('http://www.example.com', $rzd)); self::assertSame('The content associated with URI: `http://www.example.com` could not be stored.', $logger->logs()[0]); } @@ -566,9 +567,9 @@ public function logs(): array }; $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $pslCache = new RootZoneDatabaseCachePsr16Adapter($cache, new \DateInterval('P1D'), $logger); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, new \DateInterval('P1D'), $logger)); - self::assertFalse($pslCache->storeByUri('http://www.example.com', $rzd)); + self::assertFalse($cache->storeByUri('http://www.example.com', $rzd)); self::assertSame('The content associated with URI: `http://www.example.com` could not be cached: Something went wrong.', $logger->logs()[0]); } } diff --git a/src/Storage/RootZoneDatabaseRemoteStorage.php b/src/Storage/TopLevelDomainsPsr18Client.php similarity index 95% rename from src/Storage/RootZoneDatabaseRemoteStorage.php rename to src/Storage/TopLevelDomainsPsr18Client.php index 9121ccc3..0e50753f 100644 --- a/src/Storage/RootZoneDatabaseRemoteStorage.php +++ b/src/Storage/TopLevelDomainsPsr18Client.php @@ -22,7 +22,7 @@ use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestFactoryInterface; -final class RootZoneDatabaseRemoteStorage implements RootZoneDatabaseStorage +final class TopLevelDomainsPsr18Client implements RootZoneDatabaseRepository { private ClientInterface $client; diff --git a/src/Storage/RootZoneDatabaseRemoteStorageTest.php b/src/Storage/TopLevelDomainsPsr18ClientTest.php similarity index 90% rename from src/Storage/RootZoneDatabaseRemoteStorageTest.php rename to src/Storage/TopLevelDomainsPsr18ClientTest.php index f6bce093..9f75213f 100644 --- a/src/Storage/RootZoneDatabaseRemoteStorageTest.php +++ b/src/Storage/TopLevelDomainsPsr18ClientTest.php @@ -29,9 +29,9 @@ use function file_get_contents; /** - * @coversDefaultClass \Pdp\Storage\RootZoneDatabaseRemoteStorage + * @coversDefaultClass \Pdp\Storage\TopLevelDomainsPsr18Client */ -final class RootZoneDatabaseRemoteStorageTest extends TestCase +final class TopLevelDomainsPsr18ClientTest extends TestCase { public function testIsCanReturnARootZoneDatabaseInstance(): void { @@ -52,7 +52,7 @@ public function createRequest(string $method, $uri): RequestInterface } }; - $storage = new RootZoneDatabaseRemoteStorage($client, $requestFactory); + $storage = new TopLevelDomainsPsr18Client($client, $requestFactory); $rzd = $storage->getByUri('http://www.example.com'); self::assertInstanceOf(TopLevelDomains::class, $rzd); @@ -77,7 +77,7 @@ public function createRequest(string $method, $uri): RequestInterface self::expectException(UnableToLoadRootZoneDatabase::class); self::expectExceptionMessage('Could not access the Root Zone Database URI: `http://www.example.com`.'); - $storage = new RootZoneDatabaseRemoteStorage($client, $requestFactory); + $storage = new TopLevelDomainsPsr18Client($client, $requestFactory); $storage->getByUri('http://www.example.com'); } @@ -101,7 +101,7 @@ public function createRequest(string $method, $uri): RequestInterface self::expectExceptionMessage('Invalid response from Root Zone Database URI: `http://www.example.com`.'); self::expectExceptionCode(404); - $storage = new RootZoneDatabaseRemoteStorage($client, $requestFactory); + $storage = new TopLevelDomainsPsr18Client($client, $requestFactory); $storage->getByUri('http://www.example.com'); } } diff --git a/src/Storage/RootZoneDatabaseLocalStorage.php b/src/Storage/TopLevelDomainsRepository.php similarity index 72% rename from src/Storage/RootZoneDatabaseLocalStorage.php rename to src/Storage/TopLevelDomainsRepository.php index 9d47c257..76b6003a 100644 --- a/src/Storage/RootZoneDatabaseLocalStorage.php +++ b/src/Storage/TopLevelDomainsRepository.php @@ -17,15 +17,15 @@ use Pdp\RootZoneDatabase; -final class RootZoneDatabaseLocalStorage implements RootZoneDatabaseStorage +final class TopLevelDomainsRepository implements RootZoneDatabaseRepository { - private RootZoneDatabaseStorage $client; + private RootZoneDatabaseRepository $repository; private RootZoneDatabaseCache $cache; - public function __construct(RootZoneDatabaseCache $cache, RootZoneDatabaseStorage $client) + public function __construct(RootZoneDatabaseRepository $repository, RootZoneDatabaseCache $cache) { - $this->client = $client; + $this->repository = $repository; $this->cache = $cache; } @@ -36,7 +36,7 @@ public function getByUri(string $uri): RootZoneDatabase return $rootZoneDatabase; } - $rootZoneDatabase = $this->client->getByUri($uri); + $rootZoneDatabase = $this->repository->getByUri($uri); $this->cache->storeByUri($uri, $rootZoneDatabase); diff --git a/src/Storage/RootZoneDatabaseLocalStorageTest.php b/src/Storage/TopLevelDomainsRepositoryTest.php similarity index 84% rename from src/Storage/RootZoneDatabaseLocalStorageTest.php rename to src/Storage/TopLevelDomainsRepositoryTest.php index 2bec04ec..53243078 100644 --- a/src/Storage/RootZoneDatabaseLocalStorageTest.php +++ b/src/Storage/TopLevelDomainsRepositoryTest.php @@ -20,7 +20,10 @@ use PHPUnit\Framework\TestCase; use function dirname; -final class RootZoneDatabaseLocalStorageTest extends TestCase +/** + * @coversDefaultClass \Pdp\Storage\TopLevelDomainsRepository + */ +final class TopLevelDomainsRepositoryTest extends TestCase { public function testIsCanReturnARootZoneDatabaseInstanceFromCache(): void { @@ -36,14 +39,14 @@ public function storeByUri(string $uri, RootZoneDatabase $topLevelDomains): bool } }; - $client = new class() implements RootZoneDatabaseStorage { + $client = new class() implements RootZoneDatabaseRepository { public function getByUri(string $uri): RootZoneDatabase { return TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); } }; - $storage = new RootZoneDatabaseLocalStorage($cache, $client); + $storage = new TopLevelDomainsRepository($client, $cache); self::assertInstanceOf(TopLevelDomains::class, $storage->getByUri('http://www.example.com')); } @@ -62,14 +65,14 @@ public function storeByUri(string $uri, RootZoneDatabase $publicSuffixList): boo } }; - $client = new class() implements RootZoneDatabaseStorage { + $client = new class() implements RootZoneDatabaseRepository { public function getByUri(string $uri): RootZoneDatabase { return TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); } }; - $storage = new RootZoneDatabaseLocalStorage($cache, $client); + $storage = new TopLevelDomainsRepository($client, $cache); self::assertInstanceOf(TopLevelDomains::class, $storage->getByUri('http://www.example.com')); } From 8dad4ee84f6801b491325450faf575bcccaf9205 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Fri, 25 Sep 2020 22:41:22 +0200 Subject: [PATCH 247/461] Add JsonSerializablePsr16Cache tests --- bin/update-pdp | 7 +- src/Storage/JsonSerializablePsr16Cache.php | 33 +- .../JsonSerializablePsr16CacheTest.php | 467 ++++++++++++++++++ src/Storage/RulesPsr16CacheTest.php | 118 +---- src/Storage/TopLevelDomainsPsr16CacheTest.php | 118 +---- 5 files changed, 508 insertions(+), 235 deletions(-) create mode 100644 src/Storage/JsonSerializablePsr16CacheTest.php diff --git a/bin/update-pdp b/bin/update-pdp index bc8af958..55e57dc9 100755 --- a/bin/update-pdp +++ b/bin/update-pdp @@ -16,6 +16,7 @@ declare(strict_types=1); use GuzzleHttp\Client; use GuzzleHttp\Psr7\Request; +use Pdp\Storage\JsonSerializablePsr16Cache; use Pdp\Storage\RulesPsr16Cache; use Pdp\Storage\RulesPsr18Client; use Pdp\Storage\PublicSuffixListRepository; @@ -145,7 +146,6 @@ $context = filter_var_array($arguments + [KEY_CACHE_DIR => $default_cache_dir], KEY_CACHE_DIR => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW], ]); -$ttl = new DateInterval('P1D'); $httpClient = new Client(); try { @@ -158,13 +158,14 @@ try { die(1); } +$jsonCache = new JsonSerializablePsr16Cache('pdp_', $cache, new DateInterval('P1D'), $logger); success("$yellow Starting updating your local cache.$reset"); $error = 0; try { $rulesClient = new RulesPsr18Client($httpClient, $requestFactory); - $rulesCache = new RulesPsr16Cache($cache, $ttl, $logger); + $rulesCache = new RulesPsr16Cache($jsonCache); $rules = $rulesClient->getByUri(PublicSuffixListRepository::PSL_URL); @@ -179,7 +180,7 @@ try { try { $topLevelDomainClient = new TopLevelDomainsPsr18Client($httpClient, $requestFactory); - $topLevelDomainCache = new TopLevelDomainsPsr16Cache($cache, $ttl, $logger); + $topLevelDomainCache = new TopLevelDomainsPsr16Cache($jsonCache); $topLevelDomains = $topLevelDomainClient->getByUri(RootZoneDatabaseRepository::RZD_URL); diff --git a/src/Storage/JsonSerializablePsr16Cache.php b/src/Storage/JsonSerializablePsr16Cache.php index 9b20d555..c85e9474 100644 --- a/src/Storage/JsonSerializablePsr16Cache.php +++ b/src/Storage/JsonSerializablePsr16Cache.php @@ -38,19 +38,20 @@ final class JsonSerializablePsr16Cache { - protected const CACHE_PREFIX = 'pdp_'; + private string $keyPrefix; - protected CacheInterface $cache; + private CacheInterface $cache; - protected LoggerInterface $logger; + private LoggerInterface $logger; - protected ?DateInterval $ttl; + private ?DateInterval $ttl; /** * @param mixed $ttl the time to live for the given cache */ - public function __construct(CacheInterface $cache, $ttl = null, LoggerInterface $logger = null) + public function __construct(string $keyPrefix, CacheInterface $cache, $ttl = null, LoggerInterface $logger = null) { + $this->keyPrefix = $keyPrefix; $this->cache = $cache; $this->ttl = $this->setTtl($ttl); $this->logger = $logger ?? new NullLogger(); @@ -63,7 +64,7 @@ public function __construct(CacheInterface $cache, $ttl = null, LoggerInterface * * @throws TypeError if the value type is not recognized */ - final protected function setTtl($ttl): ?DateInterval + private function setTtl($ttl): ?DateInterval { if ($ttl instanceof DateInterval || null === $ttl) { return $ttl; @@ -96,22 +97,22 @@ final protected function setTtl($ttl): ?DateInterval return $date; } - public function store(string $uri, JsonSerializable $object): bool + public function store(string $key, JsonSerializable $object): bool { try { - $result = $this->cache->set($this->cacheKey($uri), json_encode($object), $this->ttl); + $result = $this->cache->set($this->cacheKey($key), json_encode($object), $this->ttl); } catch (Throwable $exception) { $this->logger->info( - 'The content associated with URI: `'.$uri.'` could not be cached: '.$exception->getMessage(), + 'The content associated with: `'.$key.'` could not be cached: '.$exception->getMessage(), ['exception' => $exception] ); return false; } - $message = 'The content associated with URI: `'.$uri.'` was stored.'; + $message = 'The content associated with: `'.$key.'` was stored.'; if (!$result) { - $message = 'The content associated with URI: `'.$uri.'` could not be stored.'; + $message = 'The content associated with: `'.$key.'` could not be stored.'; } $this->logger->info($message); @@ -124,17 +125,17 @@ public function store(string $uri, JsonSerializable $object): bool */ private function cacheKey(string $str): string { - return self::CACHE_PREFIX.md5(strtolower($str)); + return $this->keyPrefix.md5(strtolower($str)); } - public function fetch(string $uri): ?string + public function fetch(string $key): ?string { - return $this->cache->get($this->cacheKey($uri)); + return $this->cache->get($this->cacheKey($key)); } - public function forget(string $uri, Throwable $exception = null): bool + public function forget(string $key, Throwable $exception = null): bool { - $result = $this->cache->delete($this->cacheKey($uri)); + $result = $this->cache->delete($this->cacheKey($key)); if (null !== $exception) { $this->logger->warning($exception->getMessage()); } diff --git a/src/Storage/JsonSerializablePsr16CacheTest.php b/src/Storage/JsonSerializablePsr16CacheTest.php new file mode 100644 index 00000000..ccfafd6a --- /dev/null +++ b/src/Storage/JsonSerializablePsr16CacheTest.php @@ -0,0 +1,467 @@ + 'bar']; + } + }; + + self::assertFalse($cache->store('http://www.example.com', $jsonInstance)); + } + + public function testItReturnsAJsonStringIfTheCacheExists(): void + { + $cache = new class() implements CacheInterface { + private array $data = []; + + public function get($key, $default = null) + { + return $this->data[$key] ?? $default; + } + + public function set($key, $value, $ttl = null) + { + $this->data[$key] = $value; + + return true; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + $jsonInstance = new class() implements JsonSerializable { + public function jsonSerialize(): array + { + return ['foo' => 'bar']; + } + }; + + $cache = new JsonSerializablePsr16Cache('pdp_', $cache, 86400); + $cache->store('http://www.example.com', $jsonInstance); + + self::assertEquals('{"foo":"bar"}', $cache->fetch('http://www.example.com')); + } + + public function testItThrowsOnConstructionIfTheTTLIsNotTheCorrectType(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return null; + } + + public function set($key, $value, $ttl = null) + { + return false; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + self::expectException(TypeError::class); + + new JsonSerializablePsr16Cache('pdp_', $cache, []); + } + + public function testItThrowsOnConstructionIfTheTTLStringCanNotBeParsed(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return null; + } + + public function set($key, $value, $ttl = null) + { + return false; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + self::expectException(InvalidArgumentException::class); + + new JsonSerializablePsr16Cache('pdp_', $cache, 'foobar'); + } + + public function testItCanStoreAPublicSuffixListInstance(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return null; + } + + public function set($key, $value, $ttl = null) + { + return true; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + $logger = new class() extends AbstractLogger { + private array $logs = []; + + public function log($level, $message, array $context = []) + { + $replace = []; + foreach ($context as $key => $val) { + $replace['{'.$key.'}'] = $val; + } + + $this->logs[] = strtr($message, $replace); + } + + public function logs(): array + { + return $this->logs; + } + }; + + $jsonInstance = new class() implements JsonSerializable { + public function jsonSerialize(): array + { + return ['foo' => 'bar']; + } + }; + $cache = new JsonSerializablePsr16Cache('pdp_', $cache, new \DateInterval('P1D'), $logger); + + self::assertTrue($cache->store('http://www.example.com', $jsonInstance)); + self::assertSame('The content associated with: `http://www.example.com` was stored.', $logger->logs()[0]); + } + + public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return null; + } + + public function set($key, $value, $ttl = null) + { + return false; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + $logger = new class() extends AbstractLogger { + private array $logs = []; + + public function log($level, $message, array $context = []) + { + $replace = []; + foreach ($context as $key => $val) { + $replace['{'.$key.'}'] = $val; + } + + $this->logs[] = strtr($message, $replace); + } + + public function logs(): array + { + return $this->logs; + } + }; + + $jsonInstance = new class() implements JsonSerializable { + public function jsonSerialize(): array + { + return ['foo' => 'bar']; + } + }; + + $cache = new JsonSerializablePsr16Cache('pdp_', $cache, new \DateTimeImmutable('+1 DAY'), $logger); + + self::assertFalse($cache->store('http://www.example.com', $jsonInstance)); + self::assertSame('The content associated with: `http://www.example.com` could not be stored.', $logger->logs()[0]); + } + + + public function testItReturnsFalseIfItCantCacheAPublicSuffixListInstance(): void + { + $cache = new class() implements CacheInterface { + public function get($key, $default = null) + { + return null; + } + + public function set($key, $value, $ttl = null) + { + throw new class('Something went wrong.', 0) extends RuntimeException implements CacheException { + }; + } + + public function delete($key) + { + return true; + } + + public function clear() + { + return true; + } + + public function getMultiple($keys, $default = null) + { + return []; + } + + public function setMultiple($values, $ttl = null) + { + return true; + } + public function deleteMultiple($keys) + { + return true; + } + + public function has($key) + { + return true; + } + }; + + $logger = new class() extends AbstractLogger { + private array $logs = []; + + public function log($level, $message, array $context = []) + { + $replace = []; + foreach ($context as $key => $val) { + $replace['{'.$key.'}'] = $val; + } + + $this->logs[] = strtr($message, $replace); + } + + public function logs(): array + { + return $this->logs; + } + }; + + $jsonInstance = new class() implements JsonSerializable { + public function jsonSerialize(): array + { + return ['foo' => 'bar']; + } + }; + + $cache = new JsonSerializablePsr16Cache('pdp_', $cache, new \DateInterval('P1D'), $logger); + + self::assertFalse($cache->store('http://www.example.com', $jsonInstance)); + self::assertSame('The content associated with: `http://www.example.com` could not be cached: Something went wrong.', $logger->logs()[0]); + } +} diff --git a/src/Storage/RulesPsr16CacheTest.php b/src/Storage/RulesPsr16CacheTest.php index 5a978ec5..9121027b 100644 --- a/src/Storage/RulesPsr16CacheTest.php +++ b/src/Storage/RulesPsr16CacheTest.php @@ -15,14 +15,12 @@ namespace Pdp\Storage; -use InvalidArgumentException; use Pdp\Rules; use PHPUnit\Framework\TestCase; use Psr\Log\AbstractLogger; use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; use RuntimeException; -use TypeError; use function dirname; use function json_encode; @@ -74,7 +72,7 @@ public function has($key) } }; - $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, '1 DAY')); + $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, '1 DAY')); self::assertNull($pslCache->fetchByUri('http://www.example.com')); } @@ -122,7 +120,7 @@ public function has($key) } }; - $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 86400)); + $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, 86400)); self::assertEquals( Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'), @@ -192,7 +190,7 @@ public function logs(): array } }; - $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 86400, $logger)); + $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, 86400, $logger)); self::assertNull($pslCache->fetchByUri('http://www.example.com')); self::assertSame('Failed to JSON decode the string: Syntax error.', $logger->logs()[0]); @@ -260,7 +258,7 @@ public function logs(): array } }; - $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, new \DateTimeImmutable('+1 DAY'), $logger)); + $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, new \DateTimeImmutable('+1 DAY'), $logger)); self::assertNull($pslCache->fetchByUri('http://www.example.com')); self::assertSame( @@ -269,102 +267,6 @@ public function logs(): array ); } - public function testItThrowsOnConstructionIfTheTTLIsNotTheCorrectType(): void - { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return null; - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; - - self::expectException(TypeError::class); - - new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, [])); - } - - public function testItThrowsOnConstructionIfTheTTLStringCanNotBeParsed(): void - { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return null; - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; - - self::expectException(InvalidArgumentException::class); - - new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'foobar')); - } - public function testItCanStoreAPublicSuffixListInstance(): void { $cache = new class() implements CacheInterface { @@ -428,10 +330,10 @@ public function logs(): array }; $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, new \DateInterval('P1D'), $logger)); + $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, new \DateInterval('P1D'), $logger)); self::assertTrue($pslCache->storeByUri('http://www.example.com', $psl)); - self::assertSame('The content associated with URI: `http://www.example.com` was stored.', $logger->logs()[0]); + self::assertSame('The content associated with: `http://www.example.com` was stored.', $logger->logs()[0]); } public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void @@ -497,10 +399,10 @@ public function logs(): array }; $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, new \DateInterval('P1D'), $logger)); + $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, new \DateInterval('P1D'), $logger)); self::assertFalse($pslCache->storeByUri('http://www.example.com', $psl)); - self::assertSame('The content associated with URI: `http://www.example.com` could not be stored.', $logger->logs()[0]); + self::assertSame('The content associated with: `http://www.example.com` could not be stored.', $logger->logs()[0]); } @@ -568,9 +470,9 @@ public function logs(): array }; $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, new \DateInterval('P1D'), $logger)); + $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, new \DateInterval('P1D'), $logger)); self::assertFalse($pslCache->storeByUri('http://www.example.com', $psl)); - self::assertSame('The content associated with URI: `http://www.example.com` could not be cached: Something went wrong.', $logger->logs()[0]); + self::assertSame('The content associated with: `http://www.example.com` could not be cached: Something went wrong.', $logger->logs()[0]); } } diff --git a/src/Storage/TopLevelDomainsPsr16CacheTest.php b/src/Storage/TopLevelDomainsPsr16CacheTest.php index aa715b62..d52a94ad 100644 --- a/src/Storage/TopLevelDomainsPsr16CacheTest.php +++ b/src/Storage/TopLevelDomainsPsr16CacheTest.php @@ -15,14 +15,12 @@ namespace Pdp\Storage; -use InvalidArgumentException; use Pdp\TopLevelDomains; use PHPUnit\Framework\TestCase; use Psr\Log\AbstractLogger; use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; use RuntimeException; -use TypeError; use function dirname; use function json_encode; @@ -74,7 +72,7 @@ public function has($key) } }; - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, '1 DAY')); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, '1 DAY')); self::assertNull($cache->fetchByUri('http://www.example.com')); } @@ -122,7 +120,7 @@ public function has($key) } }; - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 86400)); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, 86400)); self::assertEquals( TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'), @@ -192,7 +190,7 @@ public function logs(): array } }; - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 86400, $logger)); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, 86400, $logger)); self::assertNull($cache->fetchByUri('http://www.example.com')); self::assertSame('Failed to JSON decode the string: Syntax error.', $logger->logs()[0]); @@ -260,7 +258,7 @@ public function logs(): array } }; - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 86400, $logger)); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, 86400, $logger)); self::assertNull($cache->fetchByUri('http://www.example.com')); self::assertSame( 'The decoded hashmap structure is missing at least one of the required properties: `records`, `version` and/or `modifiedDate`.', @@ -268,102 +266,6 @@ public function logs(): array ); } - public function testItThrowsOnConstructionIfTheTTLIsNotTheCorrectType(): void - { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return null; - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; - - self::expectException(TypeError::class); - - new JsonSerializablePsr16Cache($cache, []); - } - - public function testItThrowsOnConstructionIfTheTTLStringCanNotBeParsed(): void - { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return null; - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; - - self::expectException(InvalidArgumentException::class); - - new JsonSerializablePsr16Cache($cache, 'foobar'); - } - public function testItCanStoreAPublicSuffixListInstance(): void { $cache = new class() implements CacheInterface { @@ -427,10 +329,10 @@ public function logs(): array }; $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, new \DateInterval('P1D'), $logger)); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, new \DateInterval('P1D'), $logger)); self::assertTrue($cache->storeByUri('http://www.example.com', $rzd)); - self::assertSame('The content associated with URI: `http://www.example.com` was stored.', $logger->logs()[0]); + self::assertSame('The content associated with: `http://www.example.com` was stored.', $logger->logs()[0]); } public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void @@ -496,10 +398,10 @@ public function logs(): array }; $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, new \DateInterval('P1D'), $logger)); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, new \DateInterval('P1D'), $logger)); self::assertFalse($cache->storeByUri('http://www.example.com', $rzd)); - self::assertSame('The content associated with URI: `http://www.example.com` could not be stored.', $logger->logs()[0]); + self::assertSame('The content associated with: `http://www.example.com` could not be stored.', $logger->logs()[0]); } @@ -567,9 +469,9 @@ public function logs(): array }; $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, new \DateInterval('P1D'), $logger)); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, new \DateInterval('P1D'), $logger)); self::assertFalse($cache->storeByUri('http://www.example.com', $rzd)); - self::assertSame('The content associated with URI: `http://www.example.com` could not be cached: Something went wrong.', $logger->logs()[0]); + self::assertSame('The content associated with: `http://www.example.com` could not be cached: Something went wrong.', $logger->logs()[0]); } } From 4b1fad7951e916b8dd995fab78bf040c89e6d84c Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 27 Sep 2020 12:10:49 +0200 Subject: [PATCH 248/461] Remove IDNA Options from Interface resolving methods --- src/PublicSuffixList.php | 9 ++- src/RootZoneDatabase.php | 5 +- src/Rules.php | 115 ++++++++++++------------------------ src/RulesTest.php | 3 +- src/TopLevelDomains.php | 13 ++-- src/TopLevelDomainsTest.php | 3 +- 6 files changed, 53 insertions(+), 95 deletions(-) diff --git a/src/PublicSuffixList.php b/src/PublicSuffixList.php index 72dbe873..c60038e0 100644 --- a/src/PublicSuffixList.php +++ b/src/PublicSuffixList.php @@ -16,7 +16,6 @@ namespace Pdp; use JsonSerializable; -use const IDNA_DEFAULT; interface PublicSuffixList extends JsonSerializable { @@ -31,7 +30,7 @@ public function jsonSerialize(): array; * If the effective TLD can not be resolved it returns a ResolvedDomainName with a null public suffix * If the host is not a valid domaine it returns a ResolvedDomainName with a null Domain name */ - public function resolve(Host $host, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): ResolvedDomainName; + public function resolve(Host $host): ResolvedDomainName; /** * Returns PSL info for a given domain against the PSL rules for cookie domain detection. @@ -39,7 +38,7 @@ public function resolve(Host $host, int $asciiIDNAOption = IDNA_DEFAULT, int $un * @throws InvalidDomainName if the domain is invalid * @throws UnableToResolveDomain if the domain or the TLD are not resolvable of not resolved */ - public function getCookieDomain(Host $host, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): ResolvedDomainName; + public function getCookieDomain(Host $host): ResolvedDomainName; /** * Returns PSL info for a given domain against the PSL rules for ICANN domain detection. @@ -47,7 +46,7 @@ public function getCookieDomain(Host $host, int $asciiIDNAOption = IDNA_DEFAULT, * @throws InvalidDomainName if the domain is invalid * @throws UnableToResolveDomain if the domain or the TLD are not resolvable of not resolved */ - public function getICANNDomain(Host $host, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): ResolvedDomainName; + public function getICANNDomain(Host $host): ResolvedDomainName; /** * Returns PSL info for a given domain against the PSL rules for private domain detection. @@ -55,5 +54,5 @@ public function getICANNDomain(Host $host, int $asciiIDNAOption = IDNA_DEFAULT, * @throws InvalidDomainName if the domain is invalid * @throws UnableToResolveDomain if the domain or the TLD are not resolvable of not resolved */ - public function getPrivateDomain(Host $host, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): ResolvedDomainName; + public function getPrivateDomain(Host $host): ResolvedDomainName; } diff --git a/src/RootZoneDatabase.php b/src/RootZoneDatabase.php index ee5a96a6..4ddf7d83 100644 --- a/src/RootZoneDatabase.php +++ b/src/RootZoneDatabase.php @@ -19,7 +19,6 @@ use DateTimeImmutable; use IteratorAggregate; use JsonSerializable; -use const IDNA_DEFAULT; interface RootZoneDatabase extends Countable, IteratorAggregate, JsonSerializable { @@ -56,10 +55,10 @@ public function jsonSerialize(): array; /** * Tells whether the submitted TLD is a valid Top Level Domain. */ - public function contains(Host $tld, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): bool; + public function contains(Host $tld): bool; /** * Returns a domain where its public suffix is the found TLD. */ - public function resolve(Host $domain, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): ResolvedDomainName; + public function resolve(Host $domain): ResolvedDomainName; } diff --git a/src/Rules.php b/src/Rules.php index c89d5c96..f4a56e40 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -26,7 +26,6 @@ use function json_last_error_msg; use function stream_get_contents; use function substr; -use const IDNA_DEFAULT; use const JSON_ERROR_NONE; final class Rules implements PublicSuffixList @@ -113,81 +112,52 @@ public function jsonSerialize(): array /** * @param mixed $host a type that supports instantiating a Domain from. */ - public function resolve( - $host, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT - ): ResolvedDomainName { + public function resolve($host): ResolvedDomainName + { try { - return $this->getCookieDomain($host, $asciiIDNAOption, $unicodeIDNAOption); + return $this->getCookieDomain($host); } catch (UnableToResolveDomain $exception) { if ($exception->hasDomain()) { /** @var Host */ $host = $exception->getDomain(); - $host = $host->withAsciiIDNAOption($asciiIDNAOption)->withUnicodeIDNAOption($unicodeIDNAOption); - return new ResolvedDomain($host); } - return new ResolvedDomain(new Domain($host, $asciiIDNAOption, $unicodeIDNAOption)); + return new ResolvedDomain(new Domain($host)); } catch (ExceptionInterface $exception) { - return new ResolvedDomain(Domain::fromNull($asciiIDNAOption, $unicodeIDNAOption)); + return new ResolvedDomain(Domain::fromNull()); } } /** * @param mixed $host the domain value */ - public function getCookieDomain( - $host, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT - ): ResolvedDomainName { - $domain = $this->validateDomain($host, $asciiIDNAOption, $unicodeIDNAOption); - - return new ResolvedDomain($domain, $this->findPublicSuffix( - $domain, - '', - $asciiIDNAOption, - $unicodeIDNAOption - )); + public function getCookieDomain($host): ResolvedDomainName + { + $domain = $this->validateDomain($host); + + return new ResolvedDomain($domain, $this->findPublicSuffix($domain, '')); } /** * @param mixed $host a type that supports instantiating a Domain from. */ - public function getICANNDomain( - $host, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT - ): ResolvedDomainName { - $domain = $this->validateDomain($host, $asciiIDNAOption, $unicodeIDNAOption); - - return new ResolvedDomain($domain, $this->findPublicSuffix( - $domain, - EffectiveTLD::ICANN_DOMAINS, - $asciiIDNAOption, - $unicodeIDNAOption - )); + public function getICANNDomain($host): ResolvedDomainName + { + $domain = $this->validateDomain($host); + + return new ResolvedDomain($domain, $this->findPublicSuffix($domain, EffectiveTLD::ICANN_DOMAINS)); } /** * @param mixed $host a type that supports instantiating a Domain from. */ - public function getPrivateDomain( - $host, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT - ): ResolvedDomainName { - $domain = $this->validateDomain($host, $asciiIDNAOption, $unicodeIDNAOption); - - return new ResolvedDomain($domain, $this->findPublicSuffix( - $domain, - PublicSuffix::PRIVATE_DOMAINS, - $asciiIDNAOption, - $unicodeIDNAOption - )); + public function getPrivateDomain($host): ResolvedDomainName + { + $domain = $this->validateDomain($host); + + return new ResolvedDomain($domain, $this->findPublicSuffix($domain, PublicSuffix::PRIVATE_DOMAINS)); } /** @@ -195,7 +165,7 @@ public function getPrivateDomain( * * @param mixed $domain a type that supports instantiating a Domain from. */ - private function validateDomain($domain, int $asciiIDNAOption, int $unicodeIDNAOption): DomainName + private function validateDomain($domain): DomainName { if ($domain instanceof ExternalDomainName) { $domain = $domain->getDomain(); @@ -209,50 +179,43 @@ private function validateDomain($domain, int $asciiIDNAOption, int $unicodeIDNAO throw UnableToResolveDomain::dueToUnresolvableDomain($domain); } - return $domain - ->withAsciiIDNAOption($asciiIDNAOption) - ->withUnicodeIDNAOption($unicodeIDNAOption); + return $domain; } /** * Returns the matched public suffix. */ - private function findPublicSuffix( - DomainName $domain, - string $section, - int $asciiIDNAOption, - int $unicodeIDNAOption - ): PublicSuffix { - $asciiDomain = $domain->toAscii(); - $icann = $this->findPublicSuffixFromSection($asciiDomain, EffectiveTLD::ICANN_DOMAINS, $asciiIDNAOption, $unicodeIDNAOption); + private function findPublicSuffix(DomainName $domain, string $section): PublicSuffix + { + $icann = $this->findPublicSuffixFromSection($domain, EffectiveTLD::ICANN_DOMAINS); if (EffectiveTLD::ICANN_DOMAINS === $section) { return $icann; } - $private = $this->findPublicSuffixFromSection($asciiDomain, EffectiveTLD::PRIVATE_DOMAINS, $asciiIDNAOption, $unicodeIDNAOption); + $private = $this->findPublicSuffixFromSection($domain, EffectiveTLD::PRIVATE_DOMAINS, ); if (count($private) > count($icann)) { return $private; } - if (EffectiveTLD::PRIVATE_DOMAINS === $section) { - return PublicSuffix::fromUnknown($asciiDomain->label(0), $asciiIDNAOption, $unicodeIDNAOption); + if (EffectiveTLD::PRIVATE_DOMAINS !== $section) { + return $icann; } - return $icann; + return PublicSuffix::fromUnknown( + $domain->toAscii()->label(0), + $domain->getAsciiIDNAOption(), + $domain->getUnicodeIDNAOption() + ); } /** * Returns the public suffix matched against a given PSL section. */ - private function findPublicSuffixFromSection( - DomainName $domain, - string $section, - int $asciiIDNAOption, - int $unicodeIDNAOption - ): PublicSuffix { + private function findPublicSuffixFromSection(DomainName $domain, string $section): PublicSuffix + { $rules = $this->rules[$section] ?? []; $matches = []; - foreach ($domain as $label) { + foreach ($domain->toAscii() as $label) { //match exception rule if (isset($rules[$label], $rules[$label]['!'])) { break; @@ -274,15 +237,15 @@ private function findPublicSuffixFromSection( } if ([] === $matches) { - return PublicSuffix::fromUnknown($domain->label(0), $asciiIDNAOption, $unicodeIDNAOption); + return PublicSuffix::fromUnknown($domain->toAscii()->label(0), $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()); } $content = implode('.', array_reverse($matches)); if (PublicSuffix::PRIVATE_DOMAINS === $section) { - return PublicSuffix::fromPrivate($content, $asciiIDNAOption, $unicodeIDNAOption); + return PublicSuffix::fromPrivate($content, $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()); } - return PublicSuffix::fromICANN($content, $asciiIDNAOption, $unicodeIDNAOption); + return PublicSuffix::fromICANN($content, $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()); } } diff --git a/src/RulesTest.php b/src/RulesTest.php index 2c50656d..e0481cb1 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -567,7 +567,8 @@ public function testResolveWithIDNAOptions(): void /** @var string $string */ $string = file_get_contents(dirname(__DIR__).'/test_data/public_suffix_list.dat'); $rules = Rules::fromString($string); - $resolved = $rules->resolve('foo.de', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); + $domain = new Domain('foo.de', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); + $resolved = $rules->resolve($domain); self::assertSame(IDNA_NONTRANSITIONAL_TO_ASCII, $resolved->getAsciiIDNAOption()); self::assertSame(IDNA_NONTRANSITIONAL_TO_UNICODE, $resolved->getUnicodeIDNAOption()); diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 38928dc4..26cd1ff1 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -26,7 +26,6 @@ use function json_last_error_msg; use function stream_get_contents; use function substr; -use const IDNA_DEFAULT; use const JSON_ERROR_NONE; final class TopLevelDomains implements RootZoneDatabase @@ -154,11 +153,11 @@ public function jsonSerialize(): array /** * @param mixed $tld a TLD in a type that can be converted into a DomainInterface instance */ - public function contains($tld, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): bool + public function contains($tld): bool { try { if (!$tld instanceof DomainName) { - $tld = new Domain($tld, $asciiIDNAOption, $unicodeIDNAOption); + $tld = new Domain($tld); } } catch (ExceptionInterface $exception) { return false; @@ -182,7 +181,7 @@ public function contains($tld, int $asciiIDNAOption = IDNA_DEFAULT, int $unicode /** * @param mixed $domain a domain in a type that can be converted into a DomainInterface instance */ - public function resolve($domain, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): ResolvedDomainName + public function resolve($domain): ResolvedDomainName { if ($domain instanceof ExternalDomainName) { $domain = $domain->getDomain(); @@ -196,10 +195,6 @@ public function resolve($domain, int $asciiIDNAOption = IDNA_DEFAULT, int $unico throw UnableToResolveDomain::dueToUnresolvableDomain($domain); } - $domain = $domain - ->withAsciiIDNAOption($asciiIDNAOption) - ->withUnicodeIDNAOption($unicodeIDNAOption); - $label = $domain->toAscii()->label(0); foreach ($this as $tld) { if ($tld->getContent() === $label) { @@ -207,6 +202,6 @@ public function resolve($domain, int $asciiIDNAOption = IDNA_DEFAULT, int $unico } } - return new ResolvedDomain($domain, PublicSuffix::fromNull($asciiIDNAOption, $unicodeIDNAOption)); + return new ResolvedDomain($domain, PublicSuffix::fromNull($domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption())); } } diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 609f48e0..f5c46f26 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -175,7 +175,8 @@ public function testResolveWithIDNAOptions(): void null ); - $resolved = $collection->resolve('foo.de', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); + $domain = new Domain('foo.de', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); + $resolved = $collection->resolve($domain); self::assertSame(IDNA_NONTRANSITIONAL_TO_ASCII, $resolved->getAsciiIDNAOption()); self::assertSame(IDNA_NONTRANSITIONAL_TO_UNICODE, $resolved->getUnicodeIDNAOption()); From cef6b10df221cc4317f69d2c653845fcde138a5e Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 27 Sep 2020 21:39:39 +0200 Subject: [PATCH 249/461] Improve typehinting in ResolveDomainName --- src/ResolvedDomain.php | 18 +++++++++--------- src/ResolvedDomainName.php | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 11c96b82..4e740ce7 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -31,13 +31,13 @@ final class ResolvedDomain implements ResolvedDomainName private DomainName $domain; - private PublicSuffix $publicSuffix; + private EffectiveTLD $publicSuffix; private DomainName $registrableDomain; private DomainName $subDomain; - public function __construct(Host $domain, ?PublicSuffix $publicSuffix = null) + public function __construct(Host $domain, ?EffectiveTLD $publicSuffix = null) { $this->domain = $this->setDomainName($domain); $this->publicSuffix = $this->setPublicSuffix($publicSuffix); @@ -64,7 +64,7 @@ private function setDomainName(Host $domain): DomainName * * @throws UnableToResolveDomain If the public suffic can not be attached to the domain */ - private function setPublicSuffix(PublicSuffix $publicSuffix = null): PublicSuffix + private function setPublicSuffix(EffectiveTLD $publicSuffix = null): EffectiveTLD { $asciiIDNAOptions = $this->domain->getAsciiIDNAOption(); $unicodeIDNAOptions = $this->domain->getUnicodeIDNAOption(); @@ -97,7 +97,7 @@ private function setPublicSuffix(PublicSuffix $publicSuffix = null): PublicSuffi /** * Normalize the domain name encoding content. */ - private function normalize(PublicSuffix $subject): PublicSuffix + private function normalize(EffectiveTLD $subject): EffectiveTLD { if (1 !== preg_match(self::REGEXP_IDN_PATTERN, $this->domain->__toString())) { return $subject->toAscii(); @@ -200,7 +200,7 @@ public function getSubDomain(): DomainName return $this->subDomain; } - public function getPublicSuffix(): PublicSuffix + public function getPublicSuffix(): EffectiveTLD { return $this->publicSuffix; } @@ -217,7 +217,7 @@ public function toUnicode(): self public function resolve($publicSuffix): self { - if (!$publicSuffix instanceof PublicSuffix) { + if (!$publicSuffix instanceof EffectiveTLD) { $publicSuffix = PublicSuffix::fromUnknown($publicSuffix); } @@ -229,7 +229,7 @@ public function resolve($publicSuffix): self */ public function withPublicSuffix($publicSuffix): self { - if (!$publicSuffix instanceof PublicSuffix) { + if (!$publicSuffix instanceof EffectiveTLD) { $publicSuffix = PublicSuffix::fromUnknown($publicSuffix); } @@ -253,7 +253,7 @@ public function withPublicSuffix($publicSuffix): self $this->domain->getUnicodeIDNAOption() ); - /** @var PublicSuffix $publicSuffix */ + /** @var EffectiveTLD $publicSuffix */ $publicSuffix = $publicSuffix ->withAsciiIDNAOption($this->domain->getAsciiIDNAOption()) ->withUnicodeIDNAOption($this->domain->getUnicodeIDNAOption()); @@ -348,7 +348,7 @@ public function withUnicodeIDNAOption(int $option): self /** @var DomainName $unicodeDomain */ $unicodeDomain = $this->domain->withUnicodeIDNAOption($option); - /** @var PublicSuffix $unicodePublicSuffix */ + /** @var EffectiveTLD $unicodePublicSuffix */ $unicodePublicSuffix = $this->publicSuffix->withUnicodeIDNAOption($option); return new self($unicodeDomain, $unicodePublicSuffix); diff --git a/src/ResolvedDomainName.php b/src/ResolvedDomainName.php index 71a0a472..eae2429b 100644 --- a/src/ResolvedDomainName.php +++ b/src/ResolvedDomainName.php @@ -17,7 +17,7 @@ interface ResolvedDomainName extends Host, ExternalDomainName { - public function getPublicSuffix(): PublicSuffix; + public function getPublicSuffix(): EffectiveTLD; public function getSecondLevelDomain(): ?string; @@ -55,7 +55,7 @@ public function withSecondLevelDomain(?string $label): self; * If the domain already has a public suffix it will be replaced by the new value * otherwise the public suffix content is added to or remove from the current domain. */ - public function withPublicSuffix(PublicSuffix $publicSuffix): self; + public function withPublicSuffix(EffectiveTLD $publicSuffix): self; /** * Returns a Domain object with a new resolve public suffix. From 6c4d6f64e4d339ae1a2e32d586ae845fa0700b60 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 27 Sep 2020 21:40:00 +0200 Subject: [PATCH 250/461] Improve Codebase for resolver methods --- src/DomainNameParser.php | 20 ++++++++++---------- src/RootZoneDatabaseConverterTest.php | 26 ++++++++++++++------------ src/Rules.php | 25 ++++++++++++------------- src/TopLevelDomains.php | 2 +- 4 files changed, 37 insertions(+), 36 deletions(-) diff --git a/src/DomainNameParser.php b/src/DomainNameParser.php index f667226b..a6b09c0d 100644 --- a/src/DomainNameParser.php +++ b/src/DomainNameParser.php @@ -171,7 +171,7 @@ final protected function idnToUnicode(string $domain, int $option = IDNA_DEFAULT * * @return array */ - final protected function parse($domain = null, int $asciiOption = 0, int $unicodeOption = 0): array + final protected function parse($domain = null, int $asciiOption = IDNA_DEFAULT, int $unicodeOption = IDNA_DEFAULT): array { if ($domain instanceof Host) { $domain = $domain->getContent(); @@ -199,33 +199,33 @@ final protected function parse($domain = null, int $asciiOption = 0, int $unicod throw InvalidDomainName::dueToUnsupportedType($domain); } - $formatted_domain = rawurldecode($domain); + $formattedDomain = rawurldecode($domain); // Note that unreserved is purposely missing . as it is used to separate labels. - static $domain_name = '/(?(DEFINE) + static $domainName = '/(?(DEFINE) (?[a-z0-9_~\-]) (?[!$&\'()*+,;=]) (?%[A-F0-9]{2}) (?(?:(?&unreserved)|(?&sub_delims)|(?&encoded)){1,63}) ) ^(?:(?®_name)\.){0,126}(?®_name)\.?$/ix'; - if (1 === preg_match($domain_name, $formatted_domain)) { - return array_reverse(explode('.', strtolower($formatted_domain))); + if (1 === preg_match($domainName, $formattedDomain)) { + return array_reverse(explode('.', strtolower($formattedDomain))); } // a domain name can not contains URI delimiters or space - static $gen_delims = '/[:\/?#\[\]@ ]/'; - if (1 === preg_match($gen_delims, $formatted_domain)) { + static $genDelimiters = '/[:\/?#\[\]@ ]/'; + if (1 === preg_match($genDelimiters, $formattedDomain)) { throw InvalidDomainName::dueToInvalidCharacters($domain); } // if the domain name does not contains UTF-8 chars then it is malformed static $pattern = '/[^\x20-\x7f]/'; - if (1 === preg_match($pattern, $formatted_domain)) { - $ascii_domain = $this->idnToAscii($domain, $asciiOption); + if (1 === preg_match($pattern, $formattedDomain)) { + $asciiDomain = $this->idnToAscii($domain, $asciiOption); /** @var array $labels */ - $labels = array_reverse(explode('.', $this->idnToUnicode($ascii_domain, $unicodeOption))); + $labels = array_reverse(explode('.', $this->idnToUnicode($asciiDomain, $unicodeOption))); return $labels; } diff --git a/src/RootZoneDatabaseConverterTest.php b/src/RootZoneDatabaseConverterTest.php index 206a458f..c9de66fb 100644 --- a/src/RootZoneDatabaseConverterTest.php +++ b/src/RootZoneDatabaseConverterTest.php @@ -28,6 +28,7 @@ public function testConverter(): void /** @var string $string */ $string = file_get_contents(dirname(__DIR__).'/test_data/root_zones.dat'); $res = (new RootZoneDatabaseConverter())->convert($string); + self::assertArrayHasKey('version', $res); self::assertArrayHasKey('modifiedDate', $res); self::assertArrayHasKey('records', $res); @@ -40,12 +41,13 @@ public function testConverter(): void public function testConverterThrowsException(string $content): void { self::expectException(UnableToLoadRootZoneDatabase::class); + (new RootZoneDatabaseConverter())->convert($content); } public function invalidContentProvider(): iterable { - $double_header = << [$double_header], - 'invalid header' => [$invalid_header], + 'double header' => [$doubleHeader], + 'invalid header' => [$invalidHeader], 'empty content' => [''], - 'header not on the first line' => [$header_no_first_line], - 'invalid tld content' => [$invalid_tld_content], - 'invalid root zone' => [$invalid_tld_content_not_root_zone], - 'empty tld' => [$invalid_tld_content_empty_tld], + 'header not on the first line' => [$headerNoFirstLine], + 'invalid tld content' => [$invalidTldContent], + 'invalid root zone' => [$invalidTldContentNotRootZone], + 'empty tld' => [$invalidTldContentEmptyTld], ]; } } diff --git a/src/Rules.php b/src/Rules.php index f4a56e40..d28d14eb 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -136,8 +136,9 @@ public function resolve($host): ResolvedDomainName public function getCookieDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); + $publicSuffix = $this->getPublicSuffix($domain, ''); - return new ResolvedDomain($domain, $this->findPublicSuffix($domain, '')); + return new ResolvedDomain($domain, $publicSuffix); } /** @@ -146,8 +147,9 @@ public function getCookieDomain($host): ResolvedDomainName public function getICANNDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); + $publicSuffix = $this->getPublicSuffix($domain, EffectiveTLD::ICANN_DOMAINS); - return new ResolvedDomain($domain, $this->findPublicSuffix($domain, EffectiveTLD::ICANN_DOMAINS)); + return new ResolvedDomain($domain, $publicSuffix); } /** @@ -156,8 +158,9 @@ public function getICANNDomain($host): ResolvedDomainName public function getPrivateDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); + $publicSuffix = $this->getPublicSuffix($domain, EffectiveTLD::PRIVATE_DOMAINS); - return new ResolvedDomain($domain, $this->findPublicSuffix($domain, PublicSuffix::PRIVATE_DOMAINS)); + return new ResolvedDomain($domain, $publicSuffix); } /** @@ -185,33 +188,29 @@ private function validateDomain($domain): DomainName /** * Returns the matched public suffix. */ - private function findPublicSuffix(DomainName $domain, string $section): PublicSuffix + private function getPublicSuffix(DomainName $domain, string $section): EffectiveTLD { - $icann = $this->findPublicSuffixFromSection($domain, EffectiveTLD::ICANN_DOMAINS); + $icann = $this->getPublicSuffixFromSection($domain, EffectiveTLD::ICANN_DOMAINS); if (EffectiveTLD::ICANN_DOMAINS === $section) { return $icann; } - $private = $this->findPublicSuffixFromSection($domain, EffectiveTLD::PRIVATE_DOMAINS, ); + $private = $this->getPublicSuffixFromSection($domain, EffectiveTLD::PRIVATE_DOMAINS); if (count($private) > count($icann)) { return $private; } - if (EffectiveTLD::PRIVATE_DOMAINS !== $section) { + if ('' === $section) { return $icann; } - return PublicSuffix::fromUnknown( - $domain->toAscii()->label(0), - $domain->getAsciiIDNAOption(), - $domain->getUnicodeIDNAOption() - ); + return PublicSuffix::fromUnknown($domain->toAscii()->label(0), $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()); } /** * Returns the public suffix matched against a given PSL section. */ - private function findPublicSuffixFromSection(DomainName $domain, string $section): PublicSuffix + private function getPublicSuffixFromSection(DomainName $domain, string $section): EffectiveTLD { $rules = $this->rules[$section] ?? []; $matches = []; diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 26cd1ff1..e1967fa3 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -198,7 +198,7 @@ public function resolve($domain): ResolvedDomainName $label = $domain->toAscii()->label(0); foreach ($this as $tld) { if ($tld->getContent() === $label) { - return new ResolvedDomain($domain, PublicSuffix::fromUnknown($tld)); + return new ResolvedDomain($domain, PublicSuffix::fromUnknown($tld, $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption())); } } From 7f20ec31a032ccaf497fa3376de321033c637c2e Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 27 Sep 2020 22:37:18 +0200 Subject: [PATCH 251/461] Improve TypeHinting throug out the codebase --- src/ResolvedDomain.php | 2 +- src/ResolvedDomainName.php | 2 +- src/ResolvedDomainTest.php | 2 +- src/TopLevelDomains.php | 13 +++++++++---- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 4e740ce7..44bbd9fd 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -330,7 +330,7 @@ public function withAsciiIDNAOption(int $option): self /** @var DomainName $asciiDomain */ $asciiDomain = $this->domain->withAsciiIDNAOption($option); - /** @var PublicSuffix $asciiPublicSuffix */ + /** @var EffectiveTLD $asciiPublicSuffix */ $asciiPublicSuffix = $this->publicSuffix->withAsciiIDNAOption($option); return new self($asciiDomain, $asciiPublicSuffix); diff --git a/src/ResolvedDomainName.php b/src/ResolvedDomainName.php index eae2429b..56d123c7 100644 --- a/src/ResolvedDomainName.php +++ b/src/ResolvedDomainName.php @@ -68,5 +68,5 @@ public function withPublicSuffix(EffectiveTLD $publicSuffix): self; * This method MUST retain the state of the current instance, and return * an instance that contains the modified Public Suffix Information. */ - public function resolve(PublicSuffix $publicSuffix): self; + public function resolve(EffectiveTLD $publicSuffix): self; } diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 00524e30..c003ac4d 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -321,7 +321,7 @@ public function resolvePassProvider(): iterable /** * @dataProvider resolveFailsProvider */ - public function testResolveFails(ResolvedDomain $domain, PublicSuffix $publicSuffix): void + public function testResolveFails(ResolvedDomain $domain, EffectiveTLD $publicSuffix): void { self::expectException(UnableToResolveDomain::class); $domain->resolve($publicSuffix); diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index e1967fa3..9565b6da 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -155,18 +155,23 @@ public function jsonSerialize(): array */ public function contains($tld): bool { - try { - if (!$tld instanceof DomainName) { + if ($tld instanceof ExternalDomainName) { + $tld = $tld->getDomain(); + } + + if (!$tld instanceof DomainName) { + try { $tld = new Domain($tld); + } catch (ExceptionInterface $exception) { + return false; } - } catch (ExceptionInterface $exception) { - return false; } if (1 !== count($tld)) { return false; } + /** @var DomainName $asciiDomain */ $asciiDomain = $tld->toAscii(); $label = $asciiDomain->label(0); foreach ($this as $knownTld) { From 4a8bd7fc0e7c5d4b397afd3a5a472c4ce85dd244 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 28 Sep 2020 20:40:07 +0200 Subject: [PATCH 252/461] Adding a PSR storage factory --- bin/update-pdp | 33 ++---- composer.json | 8 +- src/Storage/JsonSerializablePsr16Cache.php | 16 +-- .../JsonSerializablePsr16CacheTest.php | 14 +-- src/Storage/PsrStorageFactory.php | 103 ++++++++++++++++++ src/Storage/PublicSuffixListCacheFactory.php | 24 ++++ src/Storage/PublicSuffixListClientFactory.php | 21 ++++ src/Storage/PublicSuffixListRepository.php | 2 - src/Storage/PublicSuffixListStorage.php | 26 +++++ .../PublicSuffixListStorageFactory.php | 24 ++++ src/Storage/RemoteStorageURL.php | 23 ++++ src/Storage/RootZoneDatabaseCacheFactory.php | 24 ++++ src/Storage/RootZoneDatabaseClientFactory.php | 21 ++++ src/Storage/RootZoneDatabaseRepository.php | 4 - src/Storage/RootZoneDatabaseStorage.php | 26 +++++ .../RootZoneDatabaseStorageFactory.php | 24 ++++ src/Storage/RulesPsr16CacheTest.php | 14 +-- src/Storage/RulesRepository.php | 12 +- src/Storage/TopLevelDomainsPsr16CacheTest.php | 14 +-- src/Storage/TopLevelDomainsRepository.php | 12 +- src/UnableToLoadPublicSuffixList.php | 5 + src/UnableToLoadRootZoneDatabase.php | 5 + 22 files changed, 389 insertions(+), 66 deletions(-) create mode 100644 src/Storage/PsrStorageFactory.php create mode 100644 src/Storage/PublicSuffixListCacheFactory.php create mode 100644 src/Storage/PublicSuffixListClientFactory.php create mode 100644 src/Storage/PublicSuffixListStorage.php create mode 100644 src/Storage/PublicSuffixListStorageFactory.php create mode 100644 src/Storage/RemoteStorageURL.php create mode 100644 src/Storage/RootZoneDatabaseCacheFactory.php create mode 100644 src/Storage/RootZoneDatabaseClientFactory.php create mode 100644 src/Storage/RootZoneDatabaseStorage.php create mode 100644 src/Storage/RootZoneDatabaseStorageFactory.php diff --git a/bin/update-pdp b/bin/update-pdp index 55e57dc9..45e47ffe 100755 --- a/bin/update-pdp +++ b/bin/update-pdp @@ -16,13 +16,7 @@ declare(strict_types=1); use GuzzleHttp\Client; use GuzzleHttp\Psr7\Request; -use Pdp\Storage\JsonSerializablePsr16Cache; -use Pdp\Storage\RulesPsr16Cache; -use Pdp\Storage\RulesPsr18Client; -use Pdp\Storage\PublicSuffixListRepository; -use Pdp\Storage\TopLevelDomainsPsr16Cache; -use Pdp\Storage\TopLevelDomainsPsr18Client; -use Pdp\Storage\RootZoneDatabaseRepository; +use Pdp\Storage\PsrStorageFactory; use Psr\Http\Message\RequestFactoryInterface; use Psr\Http\Message\RequestInterface; use Psr\Log\AbstractLogger; @@ -146,7 +140,6 @@ $context = filter_var_array($arguments + [KEY_CACHE_DIR => $default_cache_dir], KEY_CACHE_DIR => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW], ]); -$httpClient = new Client(); try { $cache = new Psr16Cache(new FilesystemAdapter('pdp', 3600, $context[KEY_CACHE_DIR])); @@ -158,20 +151,16 @@ try { die(1); } -$jsonCache = new JsonSerializablePsr16Cache('pdp_', $cache, new DateInterval('P1D'), $logger); +$factory = new PsrStorageFactory(new Client(), $requestFactory, $cache, $logger); +$cachePrefix = 'pdp_'; +$cacheTtl = new DateInterval('P1D'); success("$yellow Starting updating your local cache.$reset"); $error = 0; try { - $rulesClient = new RulesPsr18Client($httpClient, $requestFactory); - $rulesCache = new RulesPsr16Cache($jsonCache); - - $rules = $rulesClient->getByUri(PublicSuffixListRepository::PSL_URL); - - if (!$rulesCache->storeByUri(PublicSuffixListRepository::PSL_URL, $rules)) { - throw new RuntimeException('Could not save the Public Suffix List to the `'.$context[KEY_CACHE_DIR].'` cache.'); - } + $rulesStorage = $factory->createPublicSuffixListStorage($cachePrefix, $cacheTtl); + $rulesStorage->saveByUri(PsrStorageFactory::PSL_URL); } catch (Throwable $exception) { $logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); fail("$redBg The command failed to update the public suffix list local cache. $reset"); @@ -179,14 +168,8 @@ try { } try { - $topLevelDomainClient = new TopLevelDomainsPsr18Client($httpClient, $requestFactory); - $topLevelDomainCache = new TopLevelDomainsPsr16Cache($jsonCache); - - $topLevelDomains = $topLevelDomainClient->getByUri(RootZoneDatabaseRepository::RZD_URL); - - if (!$topLevelDomainCache->storeByUri(RootZoneDatabaseRepository::RZD_URL, $topLevelDomains)) { - throw new RuntimeException('Could not save the Root Zone Database to the `'.$context[KEY_CACHE_DIR].'` cache.'); - } + $topLevelDomainsStorage = $factory->createRootZoneDatabaseStorage($cachePrefix, $cacheTtl); + $topLevelDomainsStorage->saveByUri(PsrStorageFactory::RZD_URL); } catch (Throwable $exception) { $logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); fail("$redBg The command failed to update the root zone database local cache. $reset"); diff --git a/composer.json b/composer.json index 3316a273..f0fb6114 100644 --- a/composer.json +++ b/composer.json @@ -42,12 +42,12 @@ "ext-json": "*" }, "require-dev": { - "composer/composer": "^1.6", + "composer/composer": "^1.10|^2.0", "friendsofphp/php-cs-fixer": "^2.16", "phpstan/phpstan": "^0.12", "phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^9.0", + "phpunit/phpunit": "^9.3", "psr/log": "^1.1", "psr/simple-cache": "^1.0.1", "guzzlehttp/guzzle": "^7.0.0", @@ -56,10 +56,10 @@ "symfony/cache": "^v5.0.0" }, "suggest": { - "psr/simple-cache-implementation": "To use the storage functionnality which depends on PSR-16", - "psr/log-implementation": "To use the storage functionnality which depends on PSR-3", "psr/http-client-implementation": "To use the storage functionnality which depends on PSR-18", "psr/http-factory": "To use the storage functionnality which depends on PSR-17", + "psr/log-implementation": "To use the storage functionnality which depends on PSR-3", + "psr/simple-cache-implementation": "To use the storage functionnality which depends on PSR-16", "league/uri": "To parse URL and validate host" }, "autoload": { diff --git a/src/Storage/JsonSerializablePsr16Cache.php b/src/Storage/JsonSerializablePsr16Cache.php index c85e9474..534c6923 100644 --- a/src/Storage/JsonSerializablePsr16Cache.php +++ b/src/Storage/JsonSerializablePsr16Cache.php @@ -38,22 +38,22 @@ final class JsonSerializablePsr16Cache { - private string $keyPrefix; + private string $cachePrefix; private CacheInterface $cache; private LoggerInterface $logger; - private ?DateInterval $ttl; + private ?DateInterval $cacheTtl; /** - * @param mixed $ttl the time to live for the given cache + * @param mixed $cacheTtl the time to live for the given cache */ - public function __construct(string $keyPrefix, CacheInterface $cache, $ttl = null, LoggerInterface $logger = null) + public function __construct(CacheInterface $cache, string $cachePrefix = '', $cacheTtl = null, LoggerInterface $logger = null) { - $this->keyPrefix = $keyPrefix; $this->cache = $cache; - $this->ttl = $this->setTtl($ttl); + $this->cachePrefix = $cachePrefix; + $this->cacheTtl = $this->setTtl($cacheTtl); $this->logger = $logger ?? new NullLogger(); } @@ -100,7 +100,7 @@ private function setTtl($ttl): ?DateInterval public function store(string $key, JsonSerializable $object): bool { try { - $result = $this->cache->set($this->cacheKey($key), json_encode($object), $this->ttl); + $result = $this->cache->set($this->cacheKey($key), json_encode($object), $this->cacheTtl); } catch (Throwable $exception) { $this->logger->info( 'The content associated with: `'.$key.'` could not be cached: '.$exception->getMessage(), @@ -125,7 +125,7 @@ public function store(string $key, JsonSerializable $object): bool */ private function cacheKey(string $str): string { - return $this->keyPrefix.md5(strtolower($str)); + return $this->cachePrefix.md5(strtolower($str)); } public function fetch(string $key): ?string diff --git a/src/Storage/JsonSerializablePsr16CacheTest.php b/src/Storage/JsonSerializablePsr16CacheTest.php index ccfafd6a..08b7b385 100644 --- a/src/Storage/JsonSerializablePsr16CacheTest.php +++ b/src/Storage/JsonSerializablePsr16CacheTest.php @@ -72,7 +72,7 @@ public function has($key) } }; - $cache = new JsonSerializablePsr16Cache('pdp_', $cache, '1 DAY'); + $cache = new JsonSerializablePsr16Cache($cache, 'pdp_', '1 DAY'); $jsonInstance = new class() implements JsonSerializable { public function jsonSerialize(): array { @@ -137,7 +137,7 @@ public function jsonSerialize(): array } }; - $cache = new JsonSerializablePsr16Cache('pdp_', $cache, 86400); + $cache = new JsonSerializablePsr16Cache($cache, 'pdp_', 86400); $cache->store('http://www.example.com', $jsonInstance); self::assertEquals('{"foo":"bar"}', $cache->fetch('http://www.example.com')); @@ -188,7 +188,7 @@ public function has($key) self::expectException(TypeError::class); - new JsonSerializablePsr16Cache('pdp_', $cache, []); + new JsonSerializablePsr16Cache($cache, 'pdp_', []); } public function testItThrowsOnConstructionIfTheTTLStringCanNotBeParsed(): void @@ -236,7 +236,7 @@ public function has($key) self::expectException(InvalidArgumentException::class); - new JsonSerializablePsr16Cache('pdp_', $cache, 'foobar'); + new JsonSerializablePsr16Cache($cache, 'pdp_', 'foobar'); } public function testItCanStoreAPublicSuffixListInstance(): void @@ -307,7 +307,7 @@ public function jsonSerialize(): array return ['foo' => 'bar']; } }; - $cache = new JsonSerializablePsr16Cache('pdp_', $cache, new \DateInterval('P1D'), $logger); + $cache = new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger); self::assertTrue($cache->store('http://www.example.com', $jsonInstance)); self::assertSame('The content associated with: `http://www.example.com` was stored.', $logger->logs()[0]); @@ -382,7 +382,7 @@ public function jsonSerialize(): array } }; - $cache = new JsonSerializablePsr16Cache('pdp_', $cache, new \DateTimeImmutable('+1 DAY'), $logger); + $cache = new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateTimeImmutable('+1 DAY'), $logger); self::assertFalse($cache->store('http://www.example.com', $jsonInstance)); self::assertSame('The content associated with: `http://www.example.com` could not be stored.', $logger->logs()[0]); @@ -459,7 +459,7 @@ public function jsonSerialize(): array } }; - $cache = new JsonSerializablePsr16Cache('pdp_', $cache, new \DateInterval('P1D'), $logger); + $cache = new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger); self::assertFalse($cache->store('http://www.example.com', $jsonInstance)); self::assertSame('The content associated with: `http://www.example.com` could not be cached: Something went wrong.', $logger->logs()[0]); diff --git a/src/Storage/PsrStorageFactory.php b/src/Storage/PsrStorageFactory.php new file mode 100644 index 00000000..a0c1e287 --- /dev/null +++ b/src/Storage/PsrStorageFactory.php @@ -0,0 +1,103 @@ +client = $client; + $this->requestFactory = $requestFactory; + $this->cache = $cache; + $this->logger = $logger; + } + + public function createPublicSuffixListClient(): PublicSuffixListRepository + { + return new RulesPsr18Client($this->client, $this->requestFactory); + } + + /** + * @param mixed $cacheTtl The cache TTL + */ + public function createPublicSuffixListCache(string $cachePrefix = '', $cacheTtl = null): PublicSuffixListCache + { + return new RulesPsr16Cache( + new JsonSerializablePsr16Cache($this->cache, $cachePrefix, $cacheTtl, $this->logger) + ); + } + + /** + * @param mixed $cacheTtl The cache TTL + */ + public function createPublicSuffixListStorage(string $cachePrefix = '', $cacheTtl = null): PublicSuffixListStorage + { + return new RulesRepository( + $this->createPublicSuffixListClient(), + $this->createPublicSuffixListCache($cachePrefix, $cacheTtl) + ); + } + + public function createRootZoneDatabaseClient(): RootZoneDatabaseRepository + { + return new TopLevelDomainsPsr18Client($this->client, $this->requestFactory); + } + + /** + * @param mixed $cacheTtl The cache TTL + */ + public function createRootZoneDatabaseCache(string $cachePrefix = '', $cacheTtl = null): RootZoneDatabaseCache + { + return new TopLevelDomainsPsr16Cache( + new JsonSerializablePsr16Cache($this->cache, $cachePrefix, $cacheTtl, $this->logger) + ); + } + + /** + * @param mixed $cacheTtl The cache TTL + */ + public function createRootZoneDatabaseStorage(string $cachePrefix = '', $cacheTtl = null): RootZoneDatabaseStorage + { + return new TopLevelDomainsRepository( + $this->createRootZoneDatabaseClient(), + $this->createRootZoneDatabaseCache($cachePrefix, $cacheTtl) + ); + } +} diff --git a/src/Storage/PublicSuffixListCacheFactory.php b/src/Storage/PublicSuffixListCacheFactory.php new file mode 100644 index 00000000..867a4435 --- /dev/null +++ b/src/Storage/PublicSuffixListCacheFactory.php @@ -0,0 +1,24 @@ +fetchByUri('http://www.example.com')); } @@ -120,7 +120,7 @@ public function has($key) } }; - $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, 86400)); + $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', 86400)); self::assertEquals( Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'), @@ -190,7 +190,7 @@ public function logs(): array } }; - $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, 86400, $logger)); + $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', 86400, $logger)); self::assertNull($pslCache->fetchByUri('http://www.example.com')); self::assertSame('Failed to JSON decode the string: Syntax error.', $logger->logs()[0]); @@ -258,7 +258,7 @@ public function logs(): array } }; - $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, new \DateTimeImmutable('+1 DAY'), $logger)); + $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateTimeImmutable('+1 DAY'), $logger)); self::assertNull($pslCache->fetchByUri('http://www.example.com')); self::assertSame( @@ -330,7 +330,7 @@ public function logs(): array }; $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, new \DateInterval('P1D'), $logger)); + $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger)); self::assertTrue($pslCache->storeByUri('http://www.example.com', $psl)); self::assertSame('The content associated with: `http://www.example.com` was stored.', $logger->logs()[0]); @@ -399,7 +399,7 @@ public function logs(): array }; $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, new \DateInterval('P1D'), $logger)); + $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger)); self::assertFalse($pslCache->storeByUri('http://www.example.com', $psl)); self::assertSame('The content associated with: `http://www.example.com` could not be stored.', $logger->logs()[0]); @@ -470,7 +470,7 @@ public function logs(): array }; $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, new \DateInterval('P1D'), $logger)); + $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger)); self::assertFalse($pslCache->storeByUri('http://www.example.com', $psl)); self::assertSame('The content associated with: `http://www.example.com` could not be cached: Something went wrong.', $logger->logs()[0]); diff --git a/src/Storage/RulesRepository.php b/src/Storage/RulesRepository.php index 7658ac79..64f46b7a 100644 --- a/src/Storage/RulesRepository.php +++ b/src/Storage/RulesRepository.php @@ -16,8 +16,9 @@ namespace Pdp\Storage; use Pdp\PublicSuffixList; +use Pdp\UnableToLoadPublicSuffixList; -final class RulesRepository implements PublicSuffixListRepository +final class RulesRepository implements PublicSuffixListStorage { private PublicSuffixListRepository $repository; @@ -42,4 +43,13 @@ public function getByUri(string $uri): PublicSuffixList return $publicSuffixList; } + + public function saveByUri(string $uri): void + { + $publicSuffixList = $this->repository->getByUri($uri); + + if (!$this->cache->storeByUri($uri, $publicSuffixList)) { + throw UnableToLoadPublicSuffixList::dueToCachingIssues(); + } + } } diff --git a/src/Storage/TopLevelDomainsPsr16CacheTest.php b/src/Storage/TopLevelDomainsPsr16CacheTest.php index d52a94ad..dced28df 100644 --- a/src/Storage/TopLevelDomainsPsr16CacheTest.php +++ b/src/Storage/TopLevelDomainsPsr16CacheTest.php @@ -72,7 +72,7 @@ public function has($key) } }; - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, '1 DAY')); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', '1 DAY')); self::assertNull($cache->fetchByUri('http://www.example.com')); } @@ -120,7 +120,7 @@ public function has($key) } }; - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, 86400)); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', 86400)); self::assertEquals( TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'), @@ -190,7 +190,7 @@ public function logs(): array } }; - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, 86400, $logger)); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', 86400, $logger)); self::assertNull($cache->fetchByUri('http://www.example.com')); self::assertSame('Failed to JSON decode the string: Syntax error.', $logger->logs()[0]); @@ -258,7 +258,7 @@ public function logs(): array } }; - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, 86400, $logger)); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', 86400, $logger)); self::assertNull($cache->fetchByUri('http://www.example.com')); self::assertSame( 'The decoded hashmap structure is missing at least one of the required properties: `records`, `version` and/or `modifiedDate`.', @@ -329,7 +329,7 @@ public function logs(): array }; $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, new \DateInterval('P1D'), $logger)); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger)); self::assertTrue($cache->storeByUri('http://www.example.com', $rzd)); self::assertSame('The content associated with: `http://www.example.com` was stored.', $logger->logs()[0]); @@ -398,7 +398,7 @@ public function logs(): array }; $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, new \DateInterval('P1D'), $logger)); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger)); self::assertFalse($cache->storeByUri('http://www.example.com', $rzd)); self::assertSame('The content associated with: `http://www.example.com` could not be stored.', $logger->logs()[0]); @@ -469,7 +469,7 @@ public function logs(): array }; $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache('pdp_', $cache, new \DateInterval('P1D'), $logger)); + $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger)); self::assertFalse($cache->storeByUri('http://www.example.com', $rzd)); self::assertSame('The content associated with: `http://www.example.com` could not be cached: Something went wrong.', $logger->logs()[0]); diff --git a/src/Storage/TopLevelDomainsRepository.php b/src/Storage/TopLevelDomainsRepository.php index 76b6003a..15c6b5c0 100644 --- a/src/Storage/TopLevelDomainsRepository.php +++ b/src/Storage/TopLevelDomainsRepository.php @@ -16,8 +16,9 @@ namespace Pdp\Storage; use Pdp\RootZoneDatabase; +use Pdp\UnableToLoadRootZoneDatabase; -final class TopLevelDomainsRepository implements RootZoneDatabaseRepository +final class TopLevelDomainsRepository implements RootZoneDatabaseStorage { private RootZoneDatabaseRepository $repository; @@ -42,4 +43,13 @@ public function getByUri(string $uri): RootZoneDatabase return $rootZoneDatabase; } + + public function saveByUri(string $uri): void + { + $rootZoneDatabase = $this->repository->getByUri($uri); + + if (!$this->cache->storeByUri($uri, $rootZoneDatabase)) { + throw UnableToLoadRootZoneDatabase::dueToCachingIssues(); + } + } } diff --git a/src/UnableToLoadPublicSuffixList.php b/src/UnableToLoadPublicSuffixList.php index 260384aa..86a1b4e4 100644 --- a/src/UnableToLoadPublicSuffixList.php +++ b/src/UnableToLoadPublicSuffixList.php @@ -54,4 +54,9 @@ public static function dueToUnexpectedContent(string $uri, int $statusCode): sel { return new self('Invalid response from Public Suffix List URI: `'.$uri.'`.', $statusCode); } + + public static function dueToCachingIssues(): self + { + return new self('Could not save the Public Suffix List to the Cache.'); + } } diff --git a/src/UnableToLoadRootZoneDatabase.php b/src/UnableToLoadRootZoneDatabase.php index b942f59c..3859fa5c 100644 --- a/src/UnableToLoadRootZoneDatabase.php +++ b/src/UnableToLoadRootZoneDatabase.php @@ -64,4 +64,9 @@ public static function dueToUnexpectedContent(string $uri, int $statusCode): sel { return new self('Invalid response from Root Zone Database URI: `'.$uri.'`.', $statusCode); } + + public static function dueToCachingIssues(): self + { + return new self('Could not save the Root Zone Database to the Cache.'); + } } From b0b6299842fdfcf8e54c691545e7efe7f4ee3e92 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 28 Sep 2020 21:08:34 +0200 Subject: [PATCH 253/461] Reduce Storage interface --- src/Storage/PsrStorageFactory.php | 46 ++++--------------- src/Storage/PublicSuffixListCacheFactory.php | 24 ---------- src/Storage/PublicSuffixListClientFactory.php | 21 --------- src/Storage/RootZoneDatabaseCacheFactory.php | 24 ---------- src/Storage/RootZoneDatabaseClientFactory.php | 21 --------- 5 files changed, 8 insertions(+), 128 deletions(-) delete mode 100644 src/Storage/PublicSuffixListCacheFactory.php delete mode 100644 src/Storage/PublicSuffixListClientFactory.php delete mode 100644 src/Storage/RootZoneDatabaseCacheFactory.php delete mode 100644 src/Storage/RootZoneDatabaseClientFactory.php diff --git a/src/Storage/PsrStorageFactory.php b/src/Storage/PsrStorageFactory.php index a0c1e287..f4e8150a 100644 --- a/src/Storage/PsrStorageFactory.php +++ b/src/Storage/PsrStorageFactory.php @@ -22,11 +22,7 @@ final class PsrStorageFactory implements RemoteStorageURL, - PublicSuffixListCacheFactory, - PublicSuffixListClientFactory, PublicSuffixListStorageFactory, - RootZoneDatabaseCacheFactory, - RootZoneDatabaseClientFactory, RootZoneDatabaseStorageFactory { private ClientInterface $client; @@ -49,44 +45,16 @@ public function __construct( $this->logger = $logger; } - public function createPublicSuffixListClient(): PublicSuffixListRepository - { - return new RulesPsr18Client($this->client, $this->requestFactory); - } - - /** - * @param mixed $cacheTtl The cache TTL - */ - public function createPublicSuffixListCache(string $cachePrefix = '', $cacheTtl = null): PublicSuffixListCache - { - return new RulesPsr16Cache( - new JsonSerializablePsr16Cache($this->cache, $cachePrefix, $cacheTtl, $this->logger) - ); - } - /** * @param mixed $cacheTtl The cache TTL */ public function createPublicSuffixListStorage(string $cachePrefix = '', $cacheTtl = null): PublicSuffixListStorage { return new RulesRepository( - $this->createPublicSuffixListClient(), - $this->createPublicSuffixListCache($cachePrefix, $cacheTtl) - ); - } - - public function createRootZoneDatabaseClient(): RootZoneDatabaseRepository - { - return new TopLevelDomainsPsr18Client($this->client, $this->requestFactory); - } - - /** - * @param mixed $cacheTtl The cache TTL - */ - public function createRootZoneDatabaseCache(string $cachePrefix = '', $cacheTtl = null): RootZoneDatabaseCache - { - return new TopLevelDomainsPsr16Cache( - new JsonSerializablePsr16Cache($this->cache, $cachePrefix, $cacheTtl, $this->logger) + new RulesPsr18Client($this->client, $this->requestFactory), + new RulesPsr16Cache( + new JsonSerializablePsr16Cache($this->cache, $cachePrefix, $cacheTtl, $this->logger) + ) ); } @@ -96,8 +64,10 @@ public function createRootZoneDatabaseCache(string $cachePrefix = '', $cacheTtl public function createRootZoneDatabaseStorage(string $cachePrefix = '', $cacheTtl = null): RootZoneDatabaseStorage { return new TopLevelDomainsRepository( - $this->createRootZoneDatabaseClient(), - $this->createRootZoneDatabaseCache($cachePrefix, $cacheTtl) + new TopLevelDomainsPsr18Client($this->client, $this->requestFactory), + new TopLevelDomainsPsr16Cache( + new JsonSerializablePsr16Cache($this->cache, $cachePrefix, $cacheTtl, $this->logger) + ) ); } } diff --git a/src/Storage/PublicSuffixListCacheFactory.php b/src/Storage/PublicSuffixListCacheFactory.php deleted file mode 100644 index 867a4435..00000000 --- a/src/Storage/PublicSuffixListCacheFactory.php +++ /dev/null @@ -1,24 +0,0 @@ - Date: Mon, 28 Sep 2020 22:22:47 +0200 Subject: [PATCH 254/461] Inital update of the README document --- README.md | 669 ++++++++++-------------------------------------------- 1 file changed, 120 insertions(+), 549 deletions(-) diff --git a/README.md b/README.md index 5ddab3cc..7fdc7ffd 100644 --- a/README.md +++ b/README.md @@ -1,110 +1,61 @@ # PHP Domain Parser - -**PHP Domain Parser** is a [Public Suffix List](http://publicsuffix.org/) based -domain parser implemented in PHP. +**PHP Domain Parser** is a [Public Suffix List](http://publicsuffix.org/) based domain parser implemented in PHP. [![Build Status][ico-travis]][link-travis] [![Total Downloads][ico-packagist]][link-packagist] [![Latest Stable Version][ico-release]][link-release] [![Software License][ico-license]][link-license] - -Motivation -------- +## Motivation While there are plenty of excellent URL parsers and builders available, there -are very few projects that can accurately parse a url into its component +are very few projects that can accurately parse a domaine into its component subdomain, registrable domain, and public suffix parts. Consider the domain www.pref.okinawa.jp. In this domain, the *public suffix* portion is **okinawa.jp**, the *registrable domain* is **pref.okinawa.jp**, and the *subdomain* is **www**. You can't regex that. -PHP Domain Parser is built around accurate Public Suffix List based parsing. For URL parsing, building or manipulation please refer to [libraries][link-parse-library] focused on those area of development. - -System Requirements -------- - -You need: - -- **PHP >= 7.2.5** but the latest stable version of PHP is recommended -- the `intl` extension +PHP Domain Parser is built around: -Dependencies -------- +- accurate Public Suffix List based parsing. +- accurate Root Zone Database parsing. -- [PSR-16](http://www.php-fig.org/psr/psr-16/) -- [PSR-3](http://www.php-fig.org/psr/psr-3/) *since version 5.6* +## Installation -Installation --------- +### Composer ~~~ $ composer require jeremykendall/php-domain-parser ~~~ -Usage --------- - -### Public suffix resolution. - -The first objective of the library is using the [Public Suffix List](http://publicsuffix.org/) to easily return the ICANN, the Cookie or -the Private Effective TLD as a `Pdp\PublicSuffix` object using the following methods: - -~~~php -use Pdp\Rules; - -$rules = Rules::createFromPath('/path/to/mozilla/public-suffix.dat'); - -echo $rules->getICANNEffectiveTLD('www.ulb.ac.be'); //display 'ac.be'; -echo $rules->getCookieEffectiveTLD('www.ulb.ac.be'); //display 'ac.be'; -echo $rules->getPrivateEffectiveTLD('www.ulb.ac.be'); //display 'be'; -~~~ - -The methods are available since version `5.7.0` to ease the package usage. Prior to this version you could use the -`Rules::getPublicSuffix` method with an optional `$section` argument to get the same results: - -~~~php -use Pdp\Rules; - -$rules = Rules::createFromPath('/path/to/mozilla/public-suffix.dat'); - -echo $rules->getPublicSuffix('www.ulb.ac.be'); // get the cookie effective TLD, display 'ac.be'; -echo $rules->getPublicSuffix('www.ulb.ac.be', Rules::ICANN_DOMAINS); //get the ICANN effective TLD, display 'ac.be'; -echo $rules->getPublicSuffix('www.ulb.ac.be', Rules::PRIVATE_DOMAINS); //get the Private effective TLD, display 'be'; -~~~ - - -If the Public Suffix is not found or in case of error an exception which extends `Pdp\Exception` is thrown. - -### Domain resolution. +### System Requirements -Apart the Public Suffix the package can resolve domain and their information also using Mozilla's [Public Suffix List](http://publicsuffix.org/) +You need: -~~~php -use Pdp\Rules; +- **PHP >= 7.4** but the latest stable version of PHP is recommended +- the `intl` extension -$rules = Rules::createFromPath('/path/to/mozilla/public-suffix.dat'); +## Usage -echo $rules->resolveCookieDomain('www.ulb.ac.be'); // returns a Pdp\Domain object whose Public Suffix is 'ac.be'; -echo $rules->resolveICANNDomain('www.ulb.ac.be'); // returns a Pdp\Domain object whose Public Suffix is 'ac.be'; -echo $rules->resolvePrivateDomain('www.ulb.ac.be'); // returns a Pdp\Domain object whose Public Suffix is 'be'; -~~~ +### Public Suffix List Resolution -The methods are available since version `5.7.0` to ease the package usage. Prior to this version you could use the -`Rules::resolve` method with an optional `$section` argument to get the same results: +The first objective of the library is to use the [Public Suffix List](http://publicsuffix.org/) to easily resolve a +domain as a `Pdp\ResolvedDomain` object using the following methods: ~~~php +resolve('www.ulb.ac.be'); // returns a Pdp\Domain object whose Public Suffix is 'ac.be'; -echo $rules->resolve('www.ulb.ac.be', Rules::ICANN_DOMAINS); // returns a Pdp\Domain object whose Public Suffix is 'ac.be'; -echo $rules->resolve('www.ulb.ac.be', Rules::PRIVATE_DOMAINS); // returns a Pdp\Domain object whose Public Suffix is 'be'; +echo $rules->resolve('www.ulb.ac.be')->getPublicSuffix(); //display 'ac.be'; +echo $rules->getCookieDomain('www.ulb.ac.be')->getPublicSuffix(); //display 'ac.be'; +echo $rules->getICANNDomain('www.ulb.ac.be')->getPublicSuffix(); //display 'ac.be'; +echo $rules->getPrivateDomain('www.ulb.ac.be')->getPublicSuffix(); //display 'be'; ~~~ -If the Domain is not resolved or in case of error a null `Pdp\Domain` is returned. +If the domain can not be resolved or in case of error an exception which extends `Pdp\UnableToResolveDomain` is thrown. ### Top Level Domains resolution @@ -115,129 +66,63 @@ top domain against the newly registered TLD. ~~~php use Pdp\TopLevelDomains; -$rules = TopLevelDomains::createFromPath('/path/to/iana/tlds-alpha-by-domain.txt'); - -echo $rules->resolve('www.UlB.Ac.bE')->getPublicSuffix(); //display 'be'; -~~~ - -If the Domain is not resolved or in case of error a null `Pdp\Domain` is returned. - -### The Domain and Public Suffix objects. - -~~~php -resolveICANNDomain('www.ulb.ac.be'); //$domain is a Pdp\Domain object -echo $domain->getContent(); // 'www.ulb.ac.be' -echo $domain->getPublicSuffix(); // 'ac.be' -echo $domain->getRegistrableDomain(); // 'ulb.ac.be' -echo $domain->getSubDomain(); // 'www' -$domain->isResolvable(); // returns true -$domain->isKnown(); // returns true -$domain->isICANN(); // returns true -$domain->isPrivate(); // returns false -$domain->labels(); // returns ['be', 'ac', 'ulb', 'www'] - -$publicSuffix = $rules->getPrivateEffectiveTLD('mydomain.github.io'); //$publicSuffix is a Pdp\PublicSuffix object -echo $publicSuffix->getContent(); // 'github.io' -$publicSuffix->isKnown(); // returns true -$publicSuffix->isICANN(); // returns false -$publicSuffix->isPrivate(); // returns true -$publicSuffix->labels(); // returns ['io', 'github'] - -$altSuffix = $rules->getICANNEffectiveTLD('mydomain.github.io'); -echo $altSuffix->getContent(); // 'io' -$altSuffix->isKnown(); // returns true -$altSuffix->isICANN(); // returns true -$altSuffix->isPrivate(); // returns false - -$tldList = $manager->getTLDs(); //$tldList is a Pdp\TopLevelDomains object -$domain = $tldList->resolve('www.ulb.ac.be'); //$domain is a Pdp\Domain object -$tldList->contains('be'); //returns true -$tldList->contains('localhost'); //return false -foreach ($tldList as $tld) { - //$tld is a Pdp\PublisSuffix object -} -~~~ - -Using the above code you have parse, validate and resolve a domain name and its public suffix status against the Public Suffix list. - -**Starting with vesion 5.5 support for IDNA options is added to the package** - -**Before** - -~~~php -$rules = Rules::createFromPath('/path/to/mozilla/public-suffix.dat'); //$rules is a Pdp\Rules object - -$domain = $rules->resolve('faß.test.de'); -echo $domain->toAscii()->getContent(); // 'fass.test.de' -~~~ - -**After** +$iana = TopLevelDomains::fromPath('/path/to/iana/tlds-alpha-by-domain.txt'); -~~~php -$rules = Rules::createFromPath( - '/path/to/mozilla/public-suffix.dat', - null, // PHP resource context (see fopen context argument) - IDNA_NONTRANSITIONAL_TO_ASCII, - IDNA_NONTRANSITIONAL_TO_UNICODE -); //$rules is a Pdp\Rules object - -$domain = $rules->resolve('faß.test.de'); -echo $domain->toAscii()->getContent(); // 'xn--fa-hia.test.de' +echo $iana->resolve('www.UlB.Ac.bE')->getPublicSuffix(); //display 'be'; ~~~ -Documentation --------- +If the Domain is not resolved or in case of error a null `Pdp\UnableToResolveDomain` is returned. -### Domain objects +### Domain object ~~~php use Pdp\Domain; -use Pdp\PublicSuffix; -$publicSuffix = new PublicSuffix('com'); -$domain = new Domain('www.bébé.ExAmple.com', $publicSuffix); +$domain = new Domain('www.bébé.ExAmple.com'); $domain->getContent(); // www.bébé.example.com echo $domain; // www.bébé.example.com -echo $domain->getLabel(0); // 'com' -echo $domain->getLabel(-1); // 'www' +echo $domain->label(0); // 'com' +echo $domain->label(-1); // 'www' $domain->keys('example'); // array(1) count($domain); //returns 4 -$domain->getPublicSuffix(); // 'com' -$domain->getRegistrableDomain(); // 'example.com' -$domain->getSubDomain(); // 'www.bébé' -$domain->isKnown(); // returns false -$domain->isICANN(); // returns false -$domain->isPrivate(); // returns false iterator_to_array($domain, false); // ['com', 'example', 'bébé', 'www'] $domain->labels(); // ['com', 'example', 'bébé', 'www'] since v5.5 $domain->toAscii()->getContent(); // www.xn--bb-bjab.example.com -echo (new Domain('www.xn--bb-bjab.example.com'))->toAscii() // www.bébé.example.com +echo (new Domain('www.xn--bb-bjab.example.com'))->toAscii(); // www.bébé.example.com $domain->getAsciiIDNAOption(); // IDNA_DEFAULT $domain->getUnicodeIDNAOption(); // IDNA_DEFAULT ~~~ -The `Pdp\Domain` and `Pdp\PublicSuffix` objects are an immutable value object representing a valid domain name. These objects let's you access the domain properties. +Using the above code you have parse, validate a domain name. The domain object has no information regarding its effective TLD. +To gain information against those databases you need to use their respective instance. -*The getter methods return normalized and lowercased domain labels or `null` if no value was found for a particular domain part.* +The `Pdp\Domain` object supports IDNA options for a better transformation between i18n and ascii domain name. + +~~~php +toAscii()->getContent(); // 'fass.test.de' + +$altDomain = new Domain('faß.test.de', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); +echo $altDomain->toAscii()->getContent(); // 'xn--fa-hia.test.de' +~~~ + +The `Pdp\Domain` object is an immutable value object representing a valid domain name. + +*The getter methods return normalized and lowercased domain labels or `null` if no value is found for a particular domain part.* Theses objects also implements PHP's `Countable`, `IteratorAggregate` and `JsonSerializable` interfaces to ease retrieving the domain labels and properties. Modify the domain content is only possible for the `Pdp\Domain` object using the following methods: ~~~php -public function Domain::isResolvable(); public function Domain::withLabel(int $key, $label): Domain public function Domain::withoutLabel(int $key, int ...$keys): Domain public function Domain::append($label): Domain public function Domain::prepend($label): Domain -public function Domain::withPublicSuffix($publicSuffix): Domain -public function Domain::withSubDomain($subDomain): Domain public function Domain::withAsciiIDNAOption(int $option): Domain public function Domain::withUnicodeIDNAOption(int $option): Domain ~~~ @@ -265,35 +150,30 @@ Because the `Pdp\Domain` object is immutable: **WARNING: URI and URL accept registered name which encompass domain name. Therefore, some URI host are invalid domain name and will trigger an exception if you try to instantiate a `Pdp\Domain` with them.** -The `Pdp\Domain` object can tell whether a public suffix can be attached to it using the `Pdp\Domain::isResolvable` method. +Here's a more complex example: ~~~php -use Pdp\Domain; - -$domain = new Domain('www.ExAmple.com'); -$domain->isResolvable(); //returns true; +isResolvable(); //returns false; -~~~ +use Pdp\Rules; -Here's a more complex example: +$rules = Rules::fromPath('/path/to/public/suffix/list.dat'); -~~~php $domain = $rules->resolve('www.bbc.co.uk'); -$domain->getContent(); //returns 'www.bbc.co.uk'; -$domain->getPublicSuffix(); //returns 'co.uk'; -$domain->isKnown(); //return true; -$domain->isICANN(); //return true; +$domain->getContent(); //returns 'www.bbc.co.uk'; +echo $domain->getPublicSuffix(); //returns 'co.uk'; +$domain>getPublicSuffix()->isKnown(); //return true; +$domain>getPublicSuffix()->isICANN(); //return true; $newDomain = $domain ->withPublicSuffix('com') ->withSubDomain('shop') - ->withLabel(-2, 'example') + ->withSecondLevelDomain('example') ; -$newDomain->getContent(); //returns 'shop.example.com'; -$newDomain->getPublicSuffix(); //returns 'com'; -$newDomain->isKnown(); //return false; + +$newDomain->getContent(); //returns 'shop.example.com'; +$newDomain->getPublicSuffix(); //returns 'com'; +$newDomain->getPublicSuffix()->isKnown(); //return false; ~~~ **WARNING: in the example above the public suffix informations are lost because the newly attached public suffix had none.** @@ -315,97 +195,29 @@ $newDomain->isKnown(); //return true; ### Public suffix resolution. -~~~php -resolve('www.Ulb.AC.be'); // resolution is done against all the sections available echo $domain; // returns www.ulb.ac.be -echo json_encode($domain, JSON_PRETTY_PRINT); -// returns -// { -// "domain": "www.ulb.ac.be", -// "registrableDomain": "ulb.ac.be", -// "subDomain": "www", -// "publicSuffix": "ac.be", -// "isKnown": true, -// "isICANN": true, -// "isPrivate": false -// } +echo $domain->getPublicSuffix(); +// returns "ac.be" //The same domain will return a different result using the PSL PRIVATE DOMAIN SECTION only -$domain = $rules->resolve('www.Ulb.AC.be', Rules::PRIVATE_DOMAINS); -echo json_encode($domain, JSON_PRETTY_PRINT); -// returns -// { -// "domain": "www.ulb.ac.be", -// "registrableDomain": "ac.be", -// "subDomain": "www.ulb", -// "publicSuffix": "be", -// "isKnown": false, -// "isICANN": false, -// "isPrivate": false -// } +$domain = $rules->getPrivateDomain('www.Ulb.AC.be'); +echo $domain->getPublicSuffix(); +// returns "be" ~~~ **The domain public suffix status depends on the PSL section used to resolve it:** -- `Pdp\Domain::isKnown` returns `true` if the public suffix is found in the selected PSL; -- `Pdp\Domain::isICANN` returns `true` if the public suffix is found using a PSL which includes the ICANN DOMAINS section; -- `Pdp\Domain::isPrivate` returns `true` if the public suffix is found using a PSL which includes the PRIVATE DOMAINS section; +- `Pdp\PublicSuffix::isKnown` returns `true` if the public suffix is found in the selected PSL; +- `Pdp\PublicSuffix::isICANN` returns `true` if the public suffix is found using a PSL which includes the ICANN DOMAINS section; +- `Pdp\PublicSuffix::isPrivate` returns `true` if the public suffix is found using a PSL which includes the PRIVATE DOMAINS section; **WARNING:** @@ -415,8 +227,6 @@ echo json_encode($domain, JSON_PRETTY_PRINT); ### Top Level Domains resolutions -**since version 5.4** - ~~~php contains('be'); // resolution is done against the retrieves list $domain = json_encode($tlds->resolve('www.Ulb.Ac.BE'), JSON_PRETTY_PRINT); -// returns -// { -// "domain": "www.ulb.ac.be", -// "registrableDomain": "ac.be", -// "subDomain": "www.ulb", -// "publicSuffix": "be", -// "isKnown": true, -// "isICANN": true, -// "isPrivate": false -// } +// returns "www.ulb.ac.be" ~~~ -### Managing the package lists - -The library comes bundle with a service which enables resolving domain name without the constant network overhead of continously downloading the PSL. The `Pdp\Manager` class retrieves, converts and caches the PSL as well as creates the corresponding `Pdp\Rules` object on demand. It internally uses a `Pdp\Converter` object to convert the fetched PSL into its `array` representation when required. - -~~~php -refreshRules('https://publicsuffix.org/list/public_suffix_list.dat'); -if ($retval) { - //the local cache has been updated -} else { - //the local cache was not updated -} -~~~ - -#### Returning `Pdp\Rules` and `Pdp\TopLevelDomains` objects - -~~~php -public Manager::getRules( - string $url = self::PSL_URL, - $ttl = null, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT -): Rules - -public Manager::getTLDs( - string $url = self::RZD_URL, - $ttl = null, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT -): TopLevelDomains -~~~ - -These methods return a `Pdp\Rules` or `Pdp\TopLevelDomains` objects seeded with their corresponding data fetch from the cache or from the external resources depending on the submitted `$ttl` argument. - -These methods take an optional `$url` argument which specifies the PSL source URL. If no local cache exists for the submitted source URL, the method will: - -1. call `Manager::refreshRules` with the given URL and `$ttl` argument to update its local cache -2. instantiate the `Rules` or the `TopLevelDomains` objects with the newly cached data. - -On error, theses methods will throw an `Pdp\Exception`. - - **since version 5.5** - -the following optional arguments are added to the methods: - -- `$asciiIDNAOption` optional IDNA option for ascii conversion; -- `$asciiIDNAOption` optional IDNA option for unicode conversion; - -**theses arguments are a combination of `IDNA_*` constants (except `IDNA_ERROR_*` constants).** - -They are used when instantiated the returned object. +#### Refreshing the cached PSL and RZD data **THIS IS THE RECOMMENDED WAY OF USING THE LIBRARY** ~~~php -$manager = new Pdp\Manager(new Pdp\Cache(), new Pdp\CurlHttpClient()); -$tldCollection = $manager->getTLDs(self::RZD_URL); -$domain = $tldCollection->resolve('www.ulb.ac.be'); -echo $domain->getPublicSuffix(); // print 'be' -~~~ - -### Automatic Updates - -It is important to always have an up to date PSL. In order to do so the library comes bundle with an auto-update script located in the `bin` directory. - -~~~bash -$ php ./bin/update-psl -~~~ - -This script requires: - -- The PHP `curl` extension -- The `Pdp\Installer` class which organizes how to update the cache. -- The `Pdp\Cache` and `Pdp\CurlHttpClient` classes to retrieve and cache the PSL -- A `Psr3` implementation. - -You can add a composer script in your `composer.json` file to update the PSL cache every time after the `install` or the `update` command are executed. - -~~~bash -{ - "scripts": { - "post-install-cmd": "\\Pdp\\Installer::updateLocalCache", - "post-update-cmd": "\\Pdp\\Installer::updateLocalCache" - } -} -~~~ - -#### Advanced usage of the update-psl script - -**since version 5.6.0** - -The following command is accessible to the end user: - -```bash -$ php bin/update-psl --rzd --rzd-url=http://localhost/rzd-mirror/list.txt --ttl="8 HOURS" --cache-dir="/tmp" -```` - -This lines means: - -- the only cache that will be updated will be the one for the Root Zone Domains; -- it will be updated using the submitted URL; -- the data will be cached for 8 hours; -- the cache directory will be the `/tmp` directory.; - -##### Options and arguments - -- `--cache-dir` : specify the root directory used to save the cached data; -- `h`, `--h`, `--help` : display the helper message; -- `--psl`: specify that the PSL cache must be updated; -- `--psl-url`: specify that PSL source URL; -- `--rzd`: specify that the RZD cache must be updated; -- `--rzd-url`: specify that RZD source URL; -- `--ttl`: specify the cache TTL; - -#### Alternatives to the update-psl script - -**Using the `update-psl` script is not a requirement but your MUST update regularly your PSL information to keep your cache data up to date.** - -For example, below I'm using the `Manager` with - -- the [Symfony Cache component](https://github.com/symfony/cache) -- the [Guzzle](https://github.com/guzzle/guzzle) client. - -Of course you can add more setups depending on your usage. - -**Be sure to adapt the following code to your own framework/situation. The following code is given as an example without warranty of it working out of the box.** - -~~~php -client = $client; + return new Request($method, $uri); } +}; - public function getContent(string $url): string - { - try { - return $client->get($url)->getBody()->getContents(); - } catch (Throwable $e) { - throw new HttpClientException($e->getMessage(), $e->getCode(), $e); - } - } -} +$cachePrefix = 'pdp_'; +$cacheTtl = new DateInterval('P1D'); +$factory = new PsrStorageFactory(new Client(), $requestFactory, $cache); +$pslStorage = $factory->createPublicSuffixListStorage($cachePrefix, $cacheTtl); +$rzdStorage = $factory->createRootZoneDatabaseStorage($cachePrefix, $cacheTtl); -$dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbuser', 'dbpass'); -$manager = new Manager( - new PDOCache($dbh, 'psl', 86400), - new GuzzleHttpClientAdapter(new GuzzleClient()) -); -$manager->refreshRules(); -//the rules are saved to the database for 1 day -//the rules are fetched using GuzzlClient - -$rules = $manager->getRules(); -$domain = $rules->resolve('nl.shop.bébé.faketld'); -$domain->getDomain(); //returns 'nl.shop.bébé.faketld' -$domain->getPublicSuffix(); //returns 'faketld' -$domain->getRegistrableDomain(); //returns 'bébé.faketld' -$domain->getSubDomain(); //returns 'nl.shop' -$domain->isKnown(); //returns false +$rules = $pslStorage->getByUri(PsrStorageFactory::PSL_URL); +$tldDomains = $rzdStorage->getByUri(PsrStorageFactory::RZD_URL); ~~~ +### Automatic Updates + +It is important to always have an up to date Public Suffix List and a Root Zone Database. +This library no longer provide an out of the box script to do so as implementing such job heavily depends on your application setup. + Changelog ------- @@ -764,37 +365,9 @@ License The MIT License (MIT). Please see [License File](LICENSE) for more information. - Attribution ------- -The HTTP adapter interface and the cURL HTTP adapter were inspired by (er, -lifted from) Will Durand's excellent -[Geocoder](https://github.com/willdurand/Geocoder) project. His MIT license and -copyright notice are below. - -``` -Copyright (c) 2011-2013 William Durand - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -``` - Portions of the `Pdp\Converter` and `Pdp\Rules` are derivative works of the PHP [registered-domain-libs](https://github.com/usrflo/registered-domain-libs). Those parts of this codebase are heavily commented, and I've included a copy of @@ -809,5 +382,3 @@ the Apache Software Foundation License 2.0 in this project. [link-packagist]: https://packagist.org/packages/jeremykendall/php-domain-parser [link-release]: https://github.com/jeremykendall/php-domain-parser/releases [link-license]: https://github.com/jeremykendall/php-domain-parser/blob/master/LICENSE - -[link-parse-library]: https://packagist.org/explore/?query=rfc3986 From 34770836311ee4f76ee6cb995364e0909ff4e0ae Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Tue, 29 Sep 2020 16:45:01 +0200 Subject: [PATCH 255/461] Simplify Storage Interface --- README.md | 95 +++----------- bin/update-pdp | 6 +- src/Storage/PsrStorageFactory.php | 4 +- src/Storage/PublicSuffixListCache.php | 11 +- ...ository.php => PublicSuffixListClient.php} | 4 +- src/Storage/PublicSuffixListStorage.php | 9 +- src/Storage/RootZoneDatabaseCache.php | 11 +- ...ository.php => RootZoneDatabaseClient.php} | 4 +- src/Storage/RootZoneDatabaseStorage.php | 9 +- .../RootZoneDatabaseStorageFactory.php | 2 +- src/Storage/RulesPsr16Cache.php | 9 +- src/Storage/RulesPsr16CacheTest.php | 14 +- src/Storage/RulesPsr18Client.php | 4 +- src/Storage/RulesPsr18ClientTest.php | 6 +- src/Storage/RulesRepository.php | 55 -------- src/Storage/RulesRepositoryTest.php | 81 ------------ src/Storage/RulesStorage.php | 50 +++++++ src/Storage/RulesStorageTest.php | 124 ++++++++++++++++++ src/Storage/TopLevelDomainsPsr16Cache.php | 9 +- src/Storage/TopLevelDomainsPsr16CacheTest.php | 14 +- src/Storage/TopLevelDomainsPsr18Client.php | 4 +- .../TopLevelDomainsPsr18ClientTest.php | 6 +- src/Storage/TopLevelDomainsRepository.php | 55 -------- src/Storage/TopLevelDomainsStorage.php | 50 +++++++ ...est.php => TopLevelDomainsStorageTest.php} | 38 ++++-- src/UnableToLoadPublicSuffixList.php | 5 - src/UnableToLoadRootZoneDatabase.php | 5 - 27 files changed, 338 insertions(+), 346 deletions(-) rename src/Storage/{PublicSuffixListRepository.php => PublicSuffixListClient.php} (85%) rename src/Storage/{RootZoneDatabaseRepository.php => RootZoneDatabaseClient.php} (85%) delete mode 100644 src/Storage/RulesRepository.php delete mode 100644 src/Storage/RulesRepositoryTest.php create mode 100644 src/Storage/RulesStorage.php create mode 100644 src/Storage/RulesStorageTest.php delete mode 100644 src/Storage/TopLevelDomainsRepository.php create mode 100644 src/Storage/TopLevelDomainsStorage.php rename src/Storage/{TopLevelDomainsRepositoryTest.php => TopLevelDomainsStorageTest.php} (59%) diff --git a/README.md b/README.md index 7fdc7ffd..e7059013 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ domain as a `Pdp\ResolvedDomain` object using the following methods: resolve('www.ulb.ac.be')->getPublicSuffix(); //display 'ac.be'; echo $rules->getCookieDomain('www.ulb.ac.be')->getPublicSuffix(); //display 'ac.be'; @@ -55,25 +55,33 @@ echo $rules->getICANNDomain('www.ulb.ac.be')->getPublicSuffix(); //display 'ac echo $rules->getPrivateDomain('www.ulb.ac.be')->getPublicSuffix(); //display 'be'; ~~~ -If the domain can not be resolved or in case of error an exception which extends `Pdp\UnableToResolveDomain` is thrown. +In case of an error an exception which extends `Pdp\ExceptionInterface` is thrown. ### Top Level Domains resolution -While the [Public Suffix List](http://publicsuffix.org/) is a community based list. We can parse the Top Level domain -information given by the [IANA website](https://data.iana.org/TLD/tlds-alpha-by-domain.txt) to always resolve +While the [Public Suffix List](http://publicsuffix.org/) is a community based list, the package provides access to +the Top Level domain information given by the [IANA website](https://data.iana.org/TLD/tlds-alpha-by-domain.txt) to always resolve top domain against the newly registered TLD. ~~~php use Pdp\TopLevelDomains; -$iana = TopLevelDomains::fromPath('/path/to/iana/tlds-alpha-by-domain.txt'); +$iana = TopLevelDomains::fromPath('/path/to/cache/tlds-alpha-by-domain.txt'); echo $iana->resolve('www.UlB.Ac.bE')->getPublicSuffix(); //display 'be'; ~~~ -If the Domain is not resolved or in case of error a null `Pdp\UnableToResolveDomain` is returned. +In case of an error an exception which extends `Pdp\ExceptionInterface` is thrown. -### Domain object +### Domain, ResolvedDomain and PublicSuffix + +In order to resolve a specific domain the package needs to make a distinction +between several domain representations. Each on of them is expressed as an immutable value object +which implements the `Pdp\Host` interface. + +#### Domain + +A `Pdp\Domain` instance is a host that exposes its labels and allow to change them. ~~~php use Pdp\Domain; @@ -110,22 +118,7 @@ $altDomain = new Domain('faß.test.de', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONT echo $altDomain->toAscii()->getContent(); // 'xn--fa-hia.test.de' ~~~ -The `Pdp\Domain` object is an immutable value object representing a valid domain name. - -*The getter methods return normalized and lowercased domain labels or `null` if no value is found for a particular domain part.* - -Theses objects also implements PHP's `Countable`, `IteratorAggregate` and `JsonSerializable` interfaces to ease retrieving the domain labels and properties. - -Modify the domain content is only possible for the `Pdp\Domain` object using the following methods: - -~~~php -public function Domain::withLabel(int $key, $label): Domain -public function Domain::withoutLabel(int $key, int ...$keys): Domain -public function Domain::append($label): Domain -public function Domain::prepend($label): Domain -public function Domain::withAsciiIDNAOption(int $option): Domain -public function Domain::withUnicodeIDNAOption(int $option): Domain -~~~ +The object also implements PHP's `Countable`, `IteratorAggregate` and `JsonSerializable` interfaces to ease retrieving the domain labels and properties. ~~~php use Pdp\Domain; @@ -143,57 +136,7 @@ echo $domain; // 'www.bébé.be' echo $newDomain // 'shop.com' ~~~ -Because the `Pdp\Domain` object is immutable: - -- If the method change any of the current object property, a new object is returned. -- If a modification is not possible a `Pdp\Exception` exception is thrown. - -**WARNING: URI and URL accept registered name which encompass domain name. Therefore, some URI host are invalid domain name and will trigger an exception if you try to instantiate a `Pdp\Domain` with them.** - -Here's a more complex example: - -~~~php -resolve('www.bbc.co.uk'); -$domain->getContent(); //returns 'www.bbc.co.uk'; -echo $domain->getPublicSuffix(); //returns 'co.uk'; -$domain>getPublicSuffix()->isKnown(); //return true; -$domain>getPublicSuffix()->isICANN(); //return true; - -$newDomain = $domain - ->withPublicSuffix('com') - ->withSubDomain('shop') - ->withSecondLevelDomain('example') -; - -$newDomain->getContent(); //returns 'shop.example.com'; -$newDomain->getPublicSuffix(); //returns 'com'; -$newDomain->getPublicSuffix()->isKnown(); //return false; -~~~ - -**WARNING: in the example above the public suffix informations are lost because the newly attached public suffix had none.** - -To avoid this data loss you should use a `Pdp\PublicSuffix` object instead. - -~~~php -$domain = $rules->resolve('www.bbc.co.uk'); -$newPublicSuffix = $rules->getPublicSuffix('example.com'); //$newPublicSuffix is a Pdp\PublicSuffix object -$newDomain = $domain - ->withPublicSuffix($newPublicSuffix) - ->withSubDomain('shop') - ->withLabel(-2, 'example') -; -$newDomain->getContent(); //returns 'shop.example.com'; -$newDomain->getPublicSuffix(); //returns 'com'; -$newDomain->isKnown(); //return true; -~~~ - -### Public suffix resolution. +#### Public suffix resolution. **THIS EXAMPLE ILLUSTRATES HOW THE OBJECT WORK BUT SHOULD BE AVOIDED IN PRODUCTON** @@ -314,8 +257,8 @@ $factory = new PsrStorageFactory(new Client(), $requestFactory, $cache); $pslStorage = $factory->createPublicSuffixListStorage($cachePrefix, $cacheTtl); $rzdStorage = $factory->createRootZoneDatabaseStorage($cachePrefix, $cacheTtl); -$rules = $pslStorage->getByUri(PsrStorageFactory::PSL_URL); -$tldDomains = $rzdStorage->getByUri(PsrStorageFactory::RZD_URL); +$rules = $pslStorage->get(PsrStorageFactory::PSL_URL); +$tldDomains = $rzdStorage->get(PsrStorageFactory::RZD_URL); ~~~ ### Automatic Updates diff --git a/bin/update-pdp b/bin/update-pdp index 45e47ffe..f3f357a0 100755 --- a/bin/update-pdp +++ b/bin/update-pdp @@ -160,7 +160,8 @@ $error = 0; try { $rulesStorage = $factory->createPublicSuffixListStorage($cachePrefix, $cacheTtl); - $rulesStorage->saveByUri(PsrStorageFactory::PSL_URL); + $rulesStorage->delete(PsrStorageFactory::PSL_URL); + $rulesStorage->get(PsrStorageFactory::PSL_URL); } catch (Throwable $exception) { $logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); fail("$redBg The command failed to update the public suffix list local cache. $reset"); @@ -169,7 +170,8 @@ try { try { $topLevelDomainsStorage = $factory->createRootZoneDatabaseStorage($cachePrefix, $cacheTtl); - $topLevelDomainsStorage->saveByUri(PsrStorageFactory::RZD_URL); + $topLevelDomainsStorage->delete(PsrStorageFactory::RZD_URL); + $topLevelDomainsStorage->get(PsrStorageFactory::RZD_URL); } catch (Throwable $exception) { $logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); fail("$redBg The command failed to update the root zone database local cache. $reset"); diff --git a/src/Storage/PsrStorageFactory.php b/src/Storage/PsrStorageFactory.php index f4e8150a..d2550392 100644 --- a/src/Storage/PsrStorageFactory.php +++ b/src/Storage/PsrStorageFactory.php @@ -50,7 +50,7 @@ public function __construct( */ public function createPublicSuffixListStorage(string $cachePrefix = '', $cacheTtl = null): PublicSuffixListStorage { - return new RulesRepository( + return new RulesStorage( new RulesPsr18Client($this->client, $this->requestFactory), new RulesPsr16Cache( new JsonSerializablePsr16Cache($this->cache, $cachePrefix, $cacheTtl, $this->logger) @@ -63,7 +63,7 @@ public function createPublicSuffixListStorage(string $cachePrefix = '', $cacheTt */ public function createRootZoneDatabaseStorage(string $cachePrefix = '', $cacheTtl = null): RootZoneDatabaseStorage { - return new TopLevelDomainsRepository( + return new TopLevelDomainsStorage( new TopLevelDomainsPsr18Client($this->client, $this->requestFactory), new TopLevelDomainsPsr16Cache( new JsonSerializablePsr16Cache($this->cache, $cachePrefix, $cacheTtl, $this->logger) diff --git a/src/Storage/PublicSuffixListCache.php b/src/Storage/PublicSuffixListCache.php index 366463d2..20dde9fa 100644 --- a/src/Storage/PublicSuffixListCache.php +++ b/src/Storage/PublicSuffixListCache.php @@ -22,7 +22,7 @@ interface PublicSuffixListCache /** * Retrieves the Public Suffix List from Cache. */ - public function fetchByUri(string $uri): ?PublicSuffixList; + public function fetch(string $uri): ?PublicSuffixList; /** * Caches the Public Suffix List. @@ -31,5 +31,12 @@ public function fetchByUri(string $uri): ?PublicSuffixList; * * Returns true if the action was successful, false otherwise */ - public function storeByUri(string $uri, PublicSuffixList $publicSuffixList): bool; + public function store(string $uri, PublicSuffixList $publicSuffixList): bool; + + /** + * Deletes the Public Suffix List entry. + * + * Returns true if the action was successful, false otherwise + */ + public function delete(string $uri): bool; } diff --git a/src/Storage/PublicSuffixListRepository.php b/src/Storage/PublicSuffixListClient.php similarity index 85% rename from src/Storage/PublicSuffixListRepository.php rename to src/Storage/PublicSuffixListClient.php index 02b41145..09cb09d4 100644 --- a/src/Storage/PublicSuffixListRepository.php +++ b/src/Storage/PublicSuffixListClient.php @@ -18,10 +18,10 @@ use Pdp\PublicSuffixList; use Pdp\UnableToLoadPublicSuffixList; -interface PublicSuffixListRepository +interface PublicSuffixListClient { /** * @throws UnableToLoadPublicSuffixList */ - public function getByUri(string $uri): PublicSuffixList; + public function get(string $uri): PublicSuffixList; } diff --git a/src/Storage/PublicSuffixListStorage.php b/src/Storage/PublicSuffixListStorage.php index e79337c1..889c7076 100644 --- a/src/Storage/PublicSuffixListStorage.php +++ b/src/Storage/PublicSuffixListStorage.php @@ -15,12 +15,7 @@ namespace Pdp\Storage; -use Pdp\UnableToLoadPublicSuffixList; - -interface PublicSuffixListStorage extends PublicSuffixListRepository +interface PublicSuffixListStorage extends PublicSuffixListClient { - /** - * @throws UnableToLoadPublicSuffixList - */ - public function saveByUri(string $uri): void; + public function delete(string $uri): bool; } diff --git a/src/Storage/RootZoneDatabaseCache.php b/src/Storage/RootZoneDatabaseCache.php index 2c448002..da9af168 100644 --- a/src/Storage/RootZoneDatabaseCache.php +++ b/src/Storage/RootZoneDatabaseCache.php @@ -22,7 +22,7 @@ interface RootZoneDatabaseCache /** * Retrieves the Root Zone Database from the Cache. */ - public function fetchByUri(string $uri): ?RootZoneDatabase; + public function fetch(string $uri): ?RootZoneDatabase; /** * Cache the Root Zone Database. @@ -31,5 +31,12 @@ public function fetchByUri(string $uri): ?RootZoneDatabase; * * Returns true if the action was successful, false otherwise */ - public function storeByUri(string $uri, RootZoneDatabase $topLevelDomains): bool; + public function store(string $uri, RootZoneDatabase $topLevelDomains): bool; + + /** + * Deletes the Root Zone Database entry. + * + * Returns true if the action was successful, false otherwise + */ + public function delete(string $uri): bool; } diff --git a/src/Storage/RootZoneDatabaseRepository.php b/src/Storage/RootZoneDatabaseClient.php similarity index 85% rename from src/Storage/RootZoneDatabaseRepository.php rename to src/Storage/RootZoneDatabaseClient.php index 2334fdaf..09d1765f 100644 --- a/src/Storage/RootZoneDatabaseRepository.php +++ b/src/Storage/RootZoneDatabaseClient.php @@ -18,10 +18,10 @@ use Pdp\RootZoneDatabase; use Pdp\UnableToLoadRootZoneDatabase; -interface RootZoneDatabaseRepository +interface RootZoneDatabaseClient { /** * @throws UnableToLoadRootZoneDatabase */ - public function getByUri(string $uri): RootZoneDatabase; + public function get(string $uri): RootZoneDatabase; } diff --git a/src/Storage/RootZoneDatabaseStorage.php b/src/Storage/RootZoneDatabaseStorage.php index 75e897b7..d628e262 100644 --- a/src/Storage/RootZoneDatabaseStorage.php +++ b/src/Storage/RootZoneDatabaseStorage.php @@ -15,12 +15,7 @@ namespace Pdp\Storage; -use Pdp\UnableToLoadRootZoneDatabase; - -interface RootZoneDatabaseStorage extends RootZoneDatabaseRepository +interface RootZoneDatabaseStorage extends RootZoneDatabaseClient { - /** - * @throws UnableToLoadRootZoneDatabase - */ - public function saveByUri(string $uri): void; + public function delete(string $uri): bool; } diff --git a/src/Storage/RootZoneDatabaseStorageFactory.php b/src/Storage/RootZoneDatabaseStorageFactory.php index 1e03e53e..57eed4c1 100644 --- a/src/Storage/RootZoneDatabaseStorageFactory.php +++ b/src/Storage/RootZoneDatabaseStorageFactory.php @@ -20,5 +20,5 @@ interface RootZoneDatabaseStorageFactory /** * @param mixed $cacheTtl The cache TTL */ - public function createRootZoneDatabaseStorage(string $cachePrefix = '', $cacheTtl = null): RootZoneDatabaseRepository; + public function createRootZoneDatabaseStorage(string $cachePrefix = '', $cacheTtl = null): RootZoneDatabaseClient; } diff --git a/src/Storage/RulesPsr16Cache.php b/src/Storage/RulesPsr16Cache.php index 25a3f8c2..649e06fd 100644 --- a/src/Storage/RulesPsr16Cache.php +++ b/src/Storage/RulesPsr16Cache.php @@ -28,7 +28,7 @@ public function __construct(JsonSerializablePsr16Cache $cache) $this->cache = $cache; } - public function fetchByUri(string $uri): ?Rules + public function fetch(string $uri): ?Rules { $cacheData = $this->cache->fetch($uri); if (null === $cacheData) { @@ -46,8 +46,13 @@ public function fetchByUri(string $uri): ?Rules return $rules; } - public function storeByUri(string $uri, PublicSuffixList $publicSuffixList): bool + public function store(string $uri, PublicSuffixList $publicSuffixList): bool { return $this->cache->store($uri, $publicSuffixList); } + + public function delete(string $uri): bool + { + return $this->cache->forget($uri); + } } diff --git a/src/Storage/RulesPsr16CacheTest.php b/src/Storage/RulesPsr16CacheTest.php index 9bcd1f01..d470e2c7 100644 --- a/src/Storage/RulesPsr16CacheTest.php +++ b/src/Storage/RulesPsr16CacheTest.php @@ -74,7 +74,7 @@ public function has($key) $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', '1 DAY')); - self::assertNull($pslCache->fetchByUri('http://www.example.com')); + self::assertNull($pslCache->fetch('http://www.example.com')); } public function testItReturnsAnInstanceIfTheCorrectCacheExists(): void @@ -124,7 +124,7 @@ public function has($key) self::assertEquals( Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'), - $pslCache->fetchByUri('http://www.example.com') + $pslCache->fetch('http://www.example.com') ); } @@ -192,7 +192,7 @@ public function logs(): array $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', 86400, $logger)); - self::assertNull($pslCache->fetchByUri('http://www.example.com')); + self::assertNull($pslCache->fetch('http://www.example.com')); self::assertSame('Failed to JSON decode the string: Syntax error.', $logger->logs()[0]); } @@ -260,7 +260,7 @@ public function logs(): array $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateTimeImmutable('+1 DAY'), $logger)); - self::assertNull($pslCache->fetchByUri('http://www.example.com')); + self::assertNull($pslCache->fetch('http://www.example.com')); self::assertSame( 'The public suffix list data are missing one of the required ICANN or PRIVATE domain section.', $logger->logs()[0] @@ -332,7 +332,7 @@ public function logs(): array $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger)); - self::assertTrue($pslCache->storeByUri('http://www.example.com', $psl)); + self::assertTrue($pslCache->store('http://www.example.com', $psl)); self::assertSame('The content associated with: `http://www.example.com` was stored.', $logger->logs()[0]); } @@ -401,7 +401,7 @@ public function logs(): array $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger)); - self::assertFalse($pslCache->storeByUri('http://www.example.com', $psl)); + self::assertFalse($pslCache->store('http://www.example.com', $psl)); self::assertSame('The content associated with: `http://www.example.com` could not be stored.', $logger->logs()[0]); } @@ -472,7 +472,7 @@ public function logs(): array $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger)); - self::assertFalse($pslCache->storeByUri('http://www.example.com', $psl)); + self::assertFalse($pslCache->store('http://www.example.com', $psl)); self::assertSame('The content associated with: `http://www.example.com` could not be cached: Something went wrong.', $logger->logs()[0]); } } diff --git a/src/Storage/RulesPsr18Client.php b/src/Storage/RulesPsr18Client.php index aa01619f..d81bee99 100644 --- a/src/Storage/RulesPsr18Client.php +++ b/src/Storage/RulesPsr18Client.php @@ -22,7 +22,7 @@ use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestFactoryInterface; -final class RulesPsr18Client implements PublicSuffixListRepository +final class RulesPsr18Client implements PublicSuffixListClient { private ClientInterface $client; @@ -34,7 +34,7 @@ public function __construct(ClientInterface $client, RequestFactoryInterface $re $this->requestFactory = $requestFactory; } - public function getByUri(string $uri): PublicSuffixList + public function get(string $uri): PublicSuffixList { $request = $this->requestFactory->createRequest('GET', $uri); try { diff --git a/src/Storage/RulesPsr18ClientTest.php b/src/Storage/RulesPsr18ClientTest.php index 320a44a6..9e90d637 100644 --- a/src/Storage/RulesPsr18ClientTest.php +++ b/src/Storage/RulesPsr18ClientTest.php @@ -52,7 +52,7 @@ public function createRequest(string $method, $uri): RequestInterface }; $storage = new RulesPsr18Client($client, $requestFactory); - $psl = $storage->getByUri('http://www.example.com'); + $psl = $storage->get('http://www.example.com'); self::assertInstanceOf(Rules::class, $psl); } @@ -77,7 +77,7 @@ public function createRequest(string $method, $uri): RequestInterface self::expectExceptionMessage('Could not access the Public Suffix List URI: `http://www.example.com`.'); $storage = new RulesPsr18Client($client, $requestFactory); - $storage->getByUri('http://www.example.com'); + $storage->get('http://www.example.com'); } public function testItWillThrowIfTheReturnedStatusCodeIsNotOK(): void @@ -101,6 +101,6 @@ public function createRequest(string $method, $uri): RequestInterface self::expectExceptionCode(404); $storage = new RulesPsr18Client($client, $requestFactory); - $storage->getByUri('http://www.example.com'); + $storage->get('http://www.example.com'); } } diff --git a/src/Storage/RulesRepository.php b/src/Storage/RulesRepository.php deleted file mode 100644 index 64f46b7a..00000000 --- a/src/Storage/RulesRepository.php +++ /dev/null @@ -1,55 +0,0 @@ -repository = $repository; - $this->cache = $cache; - } - - public function getByUri(string $uri): PublicSuffixList - { - $publicSuffixList = $this->cache->fetchByUri($uri); - if (null !== $publicSuffixList) { - return $publicSuffixList; - } - - $publicSuffixList = $this->repository->getByUri($uri); - - $this->cache->storeByUri($uri, $publicSuffixList); - - return $publicSuffixList; - } - - public function saveByUri(string $uri): void - { - $publicSuffixList = $this->repository->getByUri($uri); - - if (!$this->cache->storeByUri($uri, $publicSuffixList)) { - throw UnableToLoadPublicSuffixList::dueToCachingIssues(); - } - } -} diff --git a/src/Storage/RulesRepositoryTest.php b/src/Storage/RulesRepositoryTest.php deleted file mode 100644 index afd3e933..00000000 --- a/src/Storage/RulesRepositoryTest.php +++ /dev/null @@ -1,81 +0,0 @@ -getByUri('http://www.example.com'); - - self::assertInstanceOf(Rules::class, $psl); - } - - public function testIsCanReturnAPublicSuffixListInstanceFromTheInnerStorage(): void - { - $cache = new class() implements PublicSuffixListCache { - public function fetchByUri(string $uri): ?PublicSuffixList - { - return null; - } - - public function storeByUri(string $uri, PublicSuffixList $publicSuffixList): bool - { - return true; - } - }; - - $client = new class() implements PublicSuffixListRepository { - public function getByUri(string $uri): PublicSuffixList - { - return Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - } - }; - - $storage = new RulesRepository($client, $cache); - $psl = $storage->getByUri('http://www.example.com'); - - self::assertInstanceOf(Rules::class, $psl); - } -} diff --git a/src/Storage/RulesStorage.php b/src/Storage/RulesStorage.php new file mode 100644 index 00000000..a27b5acb --- /dev/null +++ b/src/Storage/RulesStorage.php @@ -0,0 +1,50 @@ +client = $client; + $this->cache = $cache; + } + + public function get(string $uri): PublicSuffixList + { + $publicSuffixList = $this->cache->fetch($uri); + if (null !== $publicSuffixList) { + return $publicSuffixList; + } + + $publicSuffixList = $this->client->get($uri); + + $this->cache->store($uri, $publicSuffixList); + + return $publicSuffixList; + } + + public function delete(string $uri): bool + { + return $this->cache->delete($uri); + } +} diff --git a/src/Storage/RulesStorageTest.php b/src/Storage/RulesStorageTest.php new file mode 100644 index 00000000..792037e0 --- /dev/null +++ b/src/Storage/RulesStorageTest.php @@ -0,0 +1,124 @@ +get('http://www.example.com'); + + self::assertInstanceOf(Rules::class, $psl); + } + + public function testIsCanReturnAPublicSuffixListInstanceFromTheInnerStorage(): void + { + $cache = new class() implements PublicSuffixListCache { + public function fetch(string $uri): ?PublicSuffixList + { + return null; + } + + public function store(string $uri, PublicSuffixList $publicSuffixList): bool + { + return true; + } + + public function delete(string $uri): bool + { + return true; + } + }; + + $client = new class() implements PublicSuffixListClient { + public function get(string $uri): PublicSuffixList + { + return Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); + } + }; + + $storage = new RulesStorage($client, $cache); + $psl = $storage->get('http://www.example.com'); + + self::assertInstanceOf(Rules::class, $psl); + } + + public function testIsCanDeleteAPublicSuffixListInstanceFromTheInnerStorage(): void + { + $cache = new class() implements PublicSuffixListCache { + public function fetch(string $uri): ?PublicSuffixList + { + return null; + } + + public function store(string $uri, PublicSuffixList $publicSuffixList): bool + { + return true; + } + + public function delete(string $uri): bool + { + return 'http://www.example.com' === $uri; + } + }; + + $client = new class() implements PublicSuffixListClient { + public function get(string $uri): PublicSuffixList + { + return Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); + } + }; + + $storage = new RulesStorage($client, $cache); + $storage->get('http://www.example.com'); + + self::assertTrue($storage->delete('http://www.example.com')); + self::assertFalse($storage->delete('https://www.example.com')); + } +} diff --git a/src/Storage/TopLevelDomainsPsr16Cache.php b/src/Storage/TopLevelDomainsPsr16Cache.php index c53fd205..6f1bb414 100644 --- a/src/Storage/TopLevelDomainsPsr16Cache.php +++ b/src/Storage/TopLevelDomainsPsr16Cache.php @@ -28,7 +28,7 @@ public function __construct(JsonSerializablePsr16Cache $cache) $this->cache = $cache; } - public function fetchByUri(string $uri): ?RootZoneDatabase + public function fetch(string $uri): ?RootZoneDatabase { $cacheData = $this->cache->fetch($uri); if (null === $cacheData) { @@ -46,8 +46,13 @@ public function fetchByUri(string $uri): ?RootZoneDatabase return $topLevelDomains; } - public function storeByUri(string $uri, RootZoneDatabase $topLevelDomains): bool + public function store(string $uri, RootZoneDatabase $topLevelDomains): bool { return $this->cache->store($uri, $topLevelDomains); } + + public function delete(string $uri): bool + { + return $this->cache->forget($uri); + } } diff --git a/src/Storage/TopLevelDomainsPsr16CacheTest.php b/src/Storage/TopLevelDomainsPsr16CacheTest.php index dced28df..f7f3075a 100644 --- a/src/Storage/TopLevelDomainsPsr16CacheTest.php +++ b/src/Storage/TopLevelDomainsPsr16CacheTest.php @@ -74,7 +74,7 @@ public function has($key) $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', '1 DAY')); - self::assertNull($cache->fetchByUri('http://www.example.com')); + self::assertNull($cache->fetch('http://www.example.com')); } public function testItReturnsAnInstanceIfTheCorrectCacheExists(): void @@ -124,7 +124,7 @@ public function has($key) self::assertEquals( TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'), - $cache->fetchByUri('http://www.example.com') + $cache->fetch('http://www.example.com') ); } @@ -192,7 +192,7 @@ public function logs(): array $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', 86400, $logger)); - self::assertNull($cache->fetchByUri('http://www.example.com')); + self::assertNull($cache->fetch('http://www.example.com')); self::assertSame('Failed to JSON decode the string: Syntax error.', $logger->logs()[0]); } @@ -259,7 +259,7 @@ public function logs(): array }; $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', 86400, $logger)); - self::assertNull($cache->fetchByUri('http://www.example.com')); + self::assertNull($cache->fetch('http://www.example.com')); self::assertSame( 'The decoded hashmap structure is missing at least one of the required properties: `records`, `version` and/or `modifiedDate`.', $logger->logs()[0] @@ -331,7 +331,7 @@ public function logs(): array $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger)); - self::assertTrue($cache->storeByUri('http://www.example.com', $rzd)); + self::assertTrue($cache->store('http://www.example.com', $rzd)); self::assertSame('The content associated with: `http://www.example.com` was stored.', $logger->logs()[0]); } @@ -400,7 +400,7 @@ public function logs(): array $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger)); - self::assertFalse($cache->storeByUri('http://www.example.com', $rzd)); + self::assertFalse($cache->store('http://www.example.com', $rzd)); self::assertSame('The content associated with: `http://www.example.com` could not be stored.', $logger->logs()[0]); } @@ -471,7 +471,7 @@ public function logs(): array $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger)); - self::assertFalse($cache->storeByUri('http://www.example.com', $rzd)); + self::assertFalse($cache->store('http://www.example.com', $rzd)); self::assertSame('The content associated with: `http://www.example.com` could not be cached: Something went wrong.', $logger->logs()[0]); } } diff --git a/src/Storage/TopLevelDomainsPsr18Client.php b/src/Storage/TopLevelDomainsPsr18Client.php index 0e50753f..87576b56 100644 --- a/src/Storage/TopLevelDomainsPsr18Client.php +++ b/src/Storage/TopLevelDomainsPsr18Client.php @@ -22,7 +22,7 @@ use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestFactoryInterface; -final class TopLevelDomainsPsr18Client implements RootZoneDatabaseRepository +final class TopLevelDomainsPsr18Client implements RootZoneDatabaseClient { private ClientInterface $client; @@ -34,7 +34,7 @@ public function __construct(ClientInterface $client, RequestFactoryInterface $re $this->requestFactory = $requestFactory; } - public function getByUri(string $uri): RootZoneDatabase + public function get(string $uri): RootZoneDatabase { $request = $this->requestFactory->createRequest('GET', $uri); try { diff --git a/src/Storage/TopLevelDomainsPsr18ClientTest.php b/src/Storage/TopLevelDomainsPsr18ClientTest.php index 9f75213f..11c43089 100644 --- a/src/Storage/TopLevelDomainsPsr18ClientTest.php +++ b/src/Storage/TopLevelDomainsPsr18ClientTest.php @@ -53,7 +53,7 @@ public function createRequest(string $method, $uri): RequestInterface }; $storage = new TopLevelDomainsPsr18Client($client, $requestFactory); - $rzd = $storage->getByUri('http://www.example.com'); + $rzd = $storage->get('http://www.example.com'); self::assertInstanceOf(TopLevelDomains::class, $rzd); } @@ -78,7 +78,7 @@ public function createRequest(string $method, $uri): RequestInterface self::expectExceptionMessage('Could not access the Root Zone Database URI: `http://www.example.com`.'); $storage = new TopLevelDomainsPsr18Client($client, $requestFactory); - $storage->getByUri('http://www.example.com'); + $storage->get('http://www.example.com'); } public function testItWillThrowIfTheReturnedStatusCodeIsNotOK(): void @@ -102,6 +102,6 @@ public function createRequest(string $method, $uri): RequestInterface self::expectExceptionCode(404); $storage = new TopLevelDomainsPsr18Client($client, $requestFactory); - $storage->getByUri('http://www.example.com'); + $storage->get('http://www.example.com'); } } diff --git a/src/Storage/TopLevelDomainsRepository.php b/src/Storage/TopLevelDomainsRepository.php deleted file mode 100644 index 15c6b5c0..00000000 --- a/src/Storage/TopLevelDomainsRepository.php +++ /dev/null @@ -1,55 +0,0 @@ -repository = $repository; - $this->cache = $cache; - } - - public function getByUri(string $uri): RootZoneDatabase - { - $rootZoneDatabase = $this->cache->fetchByUri($uri); - if (null !== $rootZoneDatabase) { - return $rootZoneDatabase; - } - - $rootZoneDatabase = $this->repository->getByUri($uri); - - $this->cache->storeByUri($uri, $rootZoneDatabase); - - return $rootZoneDatabase; - } - - public function saveByUri(string $uri): void - { - $rootZoneDatabase = $this->repository->getByUri($uri); - - if (!$this->cache->storeByUri($uri, $rootZoneDatabase)) { - throw UnableToLoadRootZoneDatabase::dueToCachingIssues(); - } - } -} diff --git a/src/Storage/TopLevelDomainsStorage.php b/src/Storage/TopLevelDomainsStorage.php new file mode 100644 index 00000000..29c86077 --- /dev/null +++ b/src/Storage/TopLevelDomainsStorage.php @@ -0,0 +1,50 @@ +repository = $repository; + $this->cache = $cache; + } + + public function get(string $uri): RootZoneDatabase + { + $rootZoneDatabase = $this->cache->fetch($uri); + if (null !== $rootZoneDatabase) { + return $rootZoneDatabase; + } + + $rootZoneDatabase = $this->repository->get($uri); + + $this->cache->store($uri, $rootZoneDatabase); + + return $rootZoneDatabase; + } + + public function delete(string $uri): bool + { + return $this->cache->delete($uri); + } +} diff --git a/src/Storage/TopLevelDomainsRepositoryTest.php b/src/Storage/TopLevelDomainsStorageTest.php similarity index 59% rename from src/Storage/TopLevelDomainsRepositoryTest.php rename to src/Storage/TopLevelDomainsStorageTest.php index 53243078..cc8ef7d3 100644 --- a/src/Storage/TopLevelDomainsRepositoryTest.php +++ b/src/Storage/TopLevelDomainsStorageTest.php @@ -21,59 +21,69 @@ use function dirname; /** - * @coversDefaultClass \Pdp\Storage\TopLevelDomainsRepository + * @coversDefaultClass \Pdp\Storage\TopLevelDomainsStorage */ -final class TopLevelDomainsRepositoryTest extends TestCase +final class TopLevelDomainsStorageTest extends TestCase { public function testIsCanReturnARootZoneDatabaseInstanceFromCache(): void { $cache = new class() implements RootZoneDatabaseCache { - public function fetchByUri(string $uri): ?RootZoneDatabase + public function fetch(string $uri): ?RootZoneDatabase { return TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); } - public function storeByUri(string $uri, RootZoneDatabase $topLevelDomains): bool + public function store(string $uri, RootZoneDatabase $topLevelDomains): bool + { + return true; + } + + public function delete(string $uri): bool { return true; } }; - $client = new class() implements RootZoneDatabaseRepository { - public function getByUri(string $uri): RootZoneDatabase + $client = new class() implements RootZoneDatabaseClient { + public function get(string $uri): RootZoneDatabase { return TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); } }; - $storage = new TopLevelDomainsRepository($client, $cache); + $storage = new TopLevelDomainsStorage($client, $cache); - self::assertInstanceOf(TopLevelDomains::class, $storage->getByUri('http://www.example.com')); + self::assertInstanceOf(TopLevelDomains::class, $storage->get('http://www.example.com')); } public function testIsCanReturnARootZoneDatabaseInstanceFromTheInnerStorage(): void { $cache = new class() implements RootZoneDatabaseCache { - public function fetchByUri(string $uri): ?RootZoneDatabase + public function fetch(string $uri): ?RootZoneDatabase { return null; } - public function storeByUri(string $uri, RootZoneDatabase $publicSuffixList): bool + public function store(string $uri, RootZoneDatabase $publicSuffixList): bool + { + return true; + } + + public function delete(string $uri): bool { return true; } }; - $client = new class() implements RootZoneDatabaseRepository { - public function getByUri(string $uri): RootZoneDatabase + $client = new class() implements RootZoneDatabaseClient { + public function get(string $uri): RootZoneDatabase { return TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); } }; - $storage = new TopLevelDomainsRepository($client, $cache); + $storage = new TopLevelDomainsStorage($client, $cache); - self::assertInstanceOf(TopLevelDomains::class, $storage->getByUri('http://www.example.com')); + self::assertInstanceOf(TopLevelDomains::class, $storage->get('http://www.example.com')); } } diff --git a/src/UnableToLoadPublicSuffixList.php b/src/UnableToLoadPublicSuffixList.php index 86a1b4e4..260384aa 100644 --- a/src/UnableToLoadPublicSuffixList.php +++ b/src/UnableToLoadPublicSuffixList.php @@ -54,9 +54,4 @@ public static function dueToUnexpectedContent(string $uri, int $statusCode): sel { return new self('Invalid response from Public Suffix List URI: `'.$uri.'`.', $statusCode); } - - public static function dueToCachingIssues(): self - { - return new self('Could not save the Public Suffix List to the Cache.'); - } } diff --git a/src/UnableToLoadRootZoneDatabase.php b/src/UnableToLoadRootZoneDatabase.php index 3859fa5c..b942f59c 100644 --- a/src/UnableToLoadRootZoneDatabase.php +++ b/src/UnableToLoadRootZoneDatabase.php @@ -64,9 +64,4 @@ public static function dueToUnexpectedContent(string $uri, int $statusCode): sel { return new self('Invalid response from Root Zone Database URI: `'.$uri.'`.', $statusCode); } - - public static function dueToCachingIssues(): self - { - return new self('Could not save the Root Zone Database to the Cache.'); - } } From edbd6119e19f1231d4cb7f1f6da2ee128febc3b2 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Tue, 29 Sep 2020 20:44:28 +0200 Subject: [PATCH 256/461] Adding the DomainResolver interface --- src/DomainResolver.php | 27 +++++++++++++++++++++++++++ src/PublicSuffixList.php | 10 +--------- src/RootZoneDatabase.php | 7 +------ 3 files changed, 29 insertions(+), 15 deletions(-) create mode 100644 src/DomainResolver.php diff --git a/src/DomainResolver.php b/src/DomainResolver.php new file mode 100644 index 00000000..48afb3f1 --- /dev/null +++ b/src/DomainResolver.php @@ -0,0 +1,27 @@ + Date: Tue, 29 Sep 2020 21:03:45 +0200 Subject: [PATCH 257/461] Update v6 documentation --- README.md | 88 +++++++++++++++------------------------- src/RootZoneDatabase.php | 2 +- src/RulesTest.php | 7 +--- 3 files changed, 36 insertions(+), 61 deletions(-) diff --git a/README.md b/README.md index e7059013..b9fe0e88 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Consider the domain www.pref.okinawa.jp. In this domain, the *public suffix* portion is **okinawa.jp**, the *registrable domain* is **pref.okinawa.jp**, and the *subdomain* is **www**. You can't regex that. -PHP Domain Parser is built around: +PHP Domain Parser is compliant around: - accurate Public Suffix List based parsing. - accurate Root Zone Database parsing. @@ -101,7 +101,7 @@ $domain->getAsciiIDNAOption(); // IDNA_DEFAULT $domain->getUnicodeIDNAOption(); // IDNA_DEFAULT ~~~ -Using the above code you have parse, validate a domain name. The domain object has no information regarding its effective TLD. +Using the above code you have parsed and validated a domain name. The domain object has no information regarding its effective TLD. To gain information against those databases you need to use their respective instance. The `Pdp\Domain` object supports IDNA options for a better transformation between i18n and ascii domain name. @@ -133,15 +133,23 @@ $newDomain = $domain ->withoutLabel(1) ; echo $domain; // 'www.bébé.be' -echo $newDomain // 'shop.com' +echo $newDomain; // 'shop.com' ~~~ -#### Public suffix resolution. +#### Public Suffix -**THIS EXAMPLE ILLUSTRATES HOW THE OBJECT WORK BUT SHOULD BE AVOIDED IN PRODUCTON** +**The domain public suffix status depends on the PSL section used to resolve it:** + +- `Pdp\PublicSuffix::isKnown` returns `true` if the public suffix is part of the selected PSL; +- `Pdp\PublicSuffix::isICANN` returns `true` if the public suffix is part of the PSL ICANN DOMAINS section; +- `Pdp\PublicSuffix::isPrivate` returns `true` if the public suffix is part of the PSL PRIVATE DOMAINS section; + +#### Resolved Domain + +**THIS EXAMPLE ILLUSTRATES HOW THE OBJECT WORK BUT SHOULD BE AVOIDED IN PRODUCTION** ~~~php -$pdp_url = 'https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat'; +$pdp_url = 'https://example.com/public_suffix_list.dat'; $rules = Pdp\Rules::fromPath($pdp_url); $domain = $rules->resolve('www.Ulb.AC.be'); // resolution is done against all the sections available @@ -156,55 +164,18 @@ echo $domain->getPublicSuffix(); // returns "be" ~~~ -**The domain public suffix status depends on the PSL section used to resolve it:** - -- `Pdp\PublicSuffix::isKnown` returns `true` if the public suffix is found in the selected PSL; -- `Pdp\PublicSuffix::isICANN` returns `true` if the public suffix is found using a PSL which includes the ICANN DOMAINS section; -- `Pdp\PublicSuffix::isPrivate` returns `true` if the public suffix is found using a PSL which includes the PRIVATE DOMAINS section; - **WARNING:** -**You should never use the library this way in production, without, at least, a caching mechanism to reduce PSL downloads.** - -**Using the PSL to determine what is a valid domain name and what isn't is dangerous, particularly in these days where new gTLDs are arriving at a rapid pace. The DNS is the proper source for this information. If you must use this library for this purpose, please consider integrating a PSL update mechanism into your software.** - -### Top Level Domains resolutions - -~~~php -contains('be'); // resolution is done against the retrieves list -$domain = json_encode($tlds->resolve('www.Ulb.Ac.BE'), JSON_PRETTY_PRINT); -// returns "www.ulb.ac.be" -~~~ +**Using the PSL to determine what is a valid domain name and what isn't is dangerous, particularly in these days when new gTLDs are arriving at a rapid pace. +The IANA Root Zone Database is the proper source for this information. +Either way, if you must use this library for this purpose, please consider integrating an automatic update mechanism into your software.** ## Managing the package databases The library comes bundle with a service which enables resolving domain name without the constant network overhead of continuously downloading the remote databases. -The `Pdp\Storage\PsrStorageFactory` enables returns instances that retrieve, convert and cache the Public Suffix List as well as the IANA Root Zone Database. +The `Pdp\Storage\PsrStorageFactory` enables returning storage instances that retrieve, convert and cache the Public Suffix List as well as the IANA Root Zone Database. ### Instantiate `Pdp\Storage\PsrStorageFactory` @@ -216,8 +187,8 @@ To work as intended, the `Pdp\Storage\PsrStorageFactory` constructor requires: When creating a new storage instance you will require: -- a `$cachePrefix` argument to optionally add a prefix to your cache index; -- a `$ttl` argument if you need to set the default `$ttl`; +- a `$cachePrefix` argument to optionally add a prefix to your cache index, default to the empty string `'''`; +- a `$ttl` argument if you need to set the default `$ttl`, default to `null` to use the underlying caching default TTL; The `$ttl` argument can be: @@ -225,13 +196,20 @@ The `$ttl` argument can be: - a `DateInterval` object (see PSR-16); - a `DateTimeInterface` object representing the date and time when the item should expire; -The package comes bundle no longer provide any implementation of such interfaces are -they are many robust implementation that can easily be found on packagist.org. +However, the package no longer provides any implementation of such interfaces are +they are many robust implementations that can easily be found on packagist.org. #### Refreshing the cached PSL and RZD data **THIS IS THE RECOMMENDED WAY OF USING THE LIBRARY** +For the purpose of this example we used: + +- Guzzle as a PSR-18 implementation HTTP client +- The Symfony Cache Component to use a PSR-16 cache implementation + +You could easily use other packages as long as they implement the required PSR interfaces. + ~~~php get(PsrStorageFactory::RZD_URL); ### Automatic Updates -It is important to always have an up to date Public Suffix List and a Root Zone Database. -This library no longer provide an out of the box script to do so as implementing such job heavily depends on your application setup. +It is important to always have an up to date Public Suffix List and Root Zone Database. +This library no longer provide an out of the box script to do so as implementing such a job heavily depends on your application setup. Changelog ------- @@ -300,7 +278,7 @@ Credits ------- - [Jeremy Kendall](https://github.com/jeremykendall) -- [ignace nyamagana butera](https://github.com/nyamsprod) +- [Ignace Nyamagana Butera](https://github.com/nyamsprod) - [All Contributors](https://github.com/jeremykendall/php-domain-parser/contributors) License diff --git a/src/RootZoneDatabase.php b/src/RootZoneDatabase.php index b8294ba4..2bba5e0a 100644 --- a/src/RootZoneDatabase.php +++ b/src/RootZoneDatabase.php @@ -53,7 +53,7 @@ public function getIterator(); public function jsonSerialize(): array; /** - * Tells whether the submitted TLD is a valid Top Level Domain. + * Tells whether the submitted host is a valid Top Level Domain. */ public function contains(Host $tld): bool; } diff --git a/src/RulesTest.php b/src/RulesTest.php index e0481cb1..a98ff491 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -45,10 +45,6 @@ public function setUp(): void public function testCreateFromPath(): void { - /** @var string $string */ - $string = file_get_contents(dirname(__DIR__).'/test_data/public_suffix_list.dat'); - $rulesFromString = Rules::fromString($string); - $context = stream_context_create([ 'http'=> [ 'method' => 'GET', @@ -57,7 +53,7 @@ public function testCreateFromPath(): void ]); $rulesFromPath = Rules::fromPath(dirname(__DIR__).'/test_data/public_suffix_list.dat', $context); - self::assertEquals($rulesFromString, $rulesFromPath); + self::assertEquals($this->rules, $rulesFromPath); } public function testCreateFromPathThrowsException(): void @@ -70,6 +66,7 @@ public function testCreateFromPathThrowsException(): void public function testDomainInternalPhpMethod(): void { $generateRules = eval('return '.var_export($this->rules, true).';'); + self::assertEquals($this->rules, $generateRules); } From a9569d2a363e0bce491b2e0142ccf639f17d7cbc Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Tue, 29 Sep 2020 21:12:05 +0200 Subject: [PATCH 258/461] Remove the bin directory --- bin/update-pdp | 188 ------------------------------------------------- 1 file changed, 188 deletions(-) delete mode 100755 bin/update-pdp diff --git a/bin/update-pdp b/bin/update-pdp deleted file mode 100755 index f3f357a0..00000000 --- a/bin/update-pdp +++ /dev/null @@ -1,188 +0,0 @@ -#!/usr/bin/env php - 1, - LogLevel::ALERT => 1, - LogLevel::CRITICAL => 1, - LogLevel::ERROR => 1, - LogLevel::WARNING => 1, - LogLevel::NOTICE => 1, - ]; - - $replace = []; - foreach ($context as $key => $val) { - $replace['{'.$key.'}'] = $val; - } - - fwrite( - isset($errorLevels[$level]) ? STDERR : STDOUT, - strtr($message, $replace).PHP_EOL - ); - } -}; - -/** - * CLI colors - */ -$cyan = chr(27)."[36m"; -$green = chr(27)."[32m"; -$reset = chr(27)."[0m"; -$redBg = chr(27)."[41m"; -$yellow = chr(27)."[33m"; - -$arguments = getopt('h::', [ - 'h', - 'help', - KEY_CACHE_DIR.':', -]); - -if (isset($arguments['help']) || isset($arguments['h'])) { - $script = basename(__FILE__); - $helpText = << $default_cache_dir], [ - KEY_CACHE_DIR => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_FLAG_STRIP_LOW], -]); - - -try { - $cache = new Psr16Cache(new FilesystemAdapter('pdp', 3600, $context[KEY_CACHE_DIR])); -} catch (Throwable $exception) { - if (null !== $logger) { - $logger->error('Local cache initialisation failed with {exception}', ['exception' => $exception->getMessage()]); - } - fail("$redBg The script failed on initialisation.$reset"); - - die(1); -} - -$factory = new PsrStorageFactory(new Client(), $requestFactory, $cache, $logger); -$cachePrefix = 'pdp_'; -$cacheTtl = new DateInterval('P1D'); -success("$yellow Starting updating your local cache.$reset"); -$error = 0; - -try { - $rulesStorage = $factory->createPublicSuffixListStorage($cachePrefix, $cacheTtl); - $rulesStorage->delete(PsrStorageFactory::PSL_URL); - $rulesStorage->get(PsrStorageFactory::PSL_URL); -} catch (Throwable $exception) { - $logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); - fail("$redBg The command failed to update the public suffix list local cache. $reset"); - ++$error; -} - -try { - $topLevelDomainsStorage = $factory->createRootZoneDatabaseStorage($cachePrefix, $cacheTtl); - $topLevelDomainsStorage->delete(PsrStorageFactory::RZD_URL); - $topLevelDomainsStorage->get(PsrStorageFactory::RZD_URL); -} catch (Throwable $exception) { - $logger->error('Local cache update failed with {exception}', ['exception' => $exception->getMessage()]); - fail("$redBg The command failed to update the root zone database local cache. $reset"); - ++$error; -} - -if (0 === $error) { - success("$green Pdp local cache successfully updated. $reset"); - - die(0); -} - -fail("$redBg The command failed to update the root zone database local cache. $reset"); -die(1); From 8fa66788ce4b2eb7eecc491d2d721aa8f747fcfe Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Tue, 29 Sep 2020 21:14:00 +0200 Subject: [PATCH 259/461] Remove data directory --- .gitignore | 4 +--- data/.gitignore | 0 2 files changed, 1 insertion(+), 3 deletions(-) delete mode 100755 data/.gitignore diff --git a/.gitignore b/.gitignore index 7fc5e378..b4d65bf6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,7 @@ -tags +data composer.lock vendor -*.swp docs -*~ build .idea .php_cs.cache diff --git a/data/.gitignore b/data/.gitignore deleted file mode 100755 index e69de29b..00000000 From 414fc685c61a71ef8431d6889e889647789854be Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 30 Sep 2020 18:55:24 +0200 Subject: [PATCH 260/461] Switching from travis to github actions --- .github/FUNDING.yml | 1 + .github/workflows/quality-assurance.yaml | 32 +++++++++++++++++++ .gitignore | 2 +- .php_cs | 1 - .travis.yml | 39 ------------------------ 5 files changed, 34 insertions(+), 41 deletions(-) create mode 100644 .github/FUNDING.yml create mode 100644 .github/workflows/quality-assurance.yaml delete mode 100644 .travis.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..70fdf4b1 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [nyamsprod] diff --git a/.github/workflows/quality-assurance.yaml b/.github/workflows/quality-assurance.yaml new file mode 100644 index 00000000..f397f6a0 --- /dev/null +++ b/.github/workflows/quality-assurance.yaml @@ -0,0 +1,32 @@ +--- +name: Quality Assurance +on: + push: ~ + pull_request: ~ + +jobs: + phpunit: + name: PHPUnit tests on ${{ matrix.php }} ${{ matrix.composer-flags }} + runs-on: ubuntu-latest + strategy: + matrix: + php: [ '7.4' ] + composer-flags: [ '' ] + phpunit-flags: [ '--coverage-text' ] + include: + - php: '8.0' + composer-flags: '--ignore-platform-req=php' + phpunit-flags: '--no-coverage' + steps: + - uses: actions/checkout@v2 + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: pcov + tools: composer:v2 + - run: composer update --no-progress ${{ matrix.composer-flags }} + - run: vendor/bin/php-cs-fixer fix -vvv --diff --dry-run --allow-risky=yes --ansi + if: ${{ matrix.php == '7.4' }} + - run: vendor/bin/phpstan analyse -l max -c phpstan.neon src --ansi + if: ${{ matrix.php == '7.4' }} + - run: vendor/bin/phpunit ${{ matrix.phpunit-flags }} diff --git a/.gitignore b/.gitignore index b4d65bf6..25babfa5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,8 @@ data -composer.lock vendor docs build .idea .php_cs.cache .phpunit.result.cache +composer.lock diff --git a/.php_cs b/.php_cs index 5ab3bf42..25b3ab9f 100644 --- a/.php_cs +++ b/.php_cs @@ -13,7 +13,6 @@ EOF; $finder = PhpCsFixer\Finder::create() ->in(__DIR__.'/src') - ->in(__DIR__.'/bin') ; return PhpCsFixer\Config::create() diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 0f54ef0a..00000000 --- a/.travis.yml +++ /dev/null @@ -1,39 +0,0 @@ -language: php -sudo: false -cache: - directories: - - "$HOME/.composer/cache" -matrix: - include: - - php: 7.4 - env: - - COLLECT_COVERAGE=false - - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source --prefer-lowest --prefer-stable" - - RUN_PHPSTAN=false - - VALIDATE_CODING_STYLE=false - - php: 7.4 - env: - - COLLECT_COVERAGE=true - - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source" - - RUN_PHPSTAN=true - - VALIDATE_CODING_STYLE=true - - php: nightly - env: - - COLLECT_COVERAGE=false - - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source --ignore-platform-reqs" - - RUN_PHPSTAN=false - - VALIDATE_CODING_STYLE=false - allow_failures: - - php: nightly - fast_finish: true -before_install: - - travis_retry composer self-update -install: - - travis_retry composer update $COMPOSER_ARGS -script: - - if [ "$VALIDATE_CODING_STYLE" == "true" ]; then composer phpcs; fi - - if [ "$RUN_PHPSTAN" == "true" ]; then composer phpstan; fi - - composer phpunit -after_script: - - if [ "$COLLECT_COVERAGE" == "true" ]; then wget https://scrutinizer-ci.com/ocular.phar - && php ocular.phar code-coverage:upload --format=php-clover build/clover.xml; fi From 4fcc68c9ca0dc244a100dd0e0de972a92f930227 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 30 Sep 2020 19:47:05 +0200 Subject: [PATCH 261/461] Remove useless copyrights from source code --- .php_cs | 2 -- LICENSE | 2 +- src/Domain.php | 2 -- src/DomainName.php | 2 -- src/DomainNameParser.php | 2 -- src/DomainResolver.php | 2 -- src/DomainTest.php | 2 -- src/EffectiveTLD.php | 2 -- src/ExceptionInterface.php | 2 -- src/ExternalDomainName.php | 2 -- src/Host.php | 2 -- src/IDNConversion.php | 2 -- src/InvalidDomainName.php | 2 -- src/InvalidHost.php | 2 -- src/PublicSuffix.php | 2 -- src/PublicSuffixList.php | 2 -- src/PublicSuffixListConverter.php | 2 -- src/PublicSuffixListConverterTest.php | 2 -- src/PublicSuffixTest.php | 2 -- src/ResolvedDomain.php | 2 -- src/ResolvedDomainName.php | 2 -- src/ResolvedDomainTest.php | 2 -- src/RootZoneDatabase.php | 2 -- src/RootZoneDatabaseConverter.php | 2 -- src/RootZoneDatabaseConverterTest.php | 2 -- src/Rules.php | 2 -- src/RulesTest.php | 2 -- src/Storage/JsonSerializablePsr16Cache.php | 2 -- src/Storage/JsonSerializablePsr16CacheTest.php | 2 -- src/Storage/PsrStorageFactory.php | 2 -- src/Storage/PublicSuffixListCache.php | 2 -- src/Storage/PublicSuffixListClient.php | 2 -- src/Storage/PublicSuffixListStorage.php | 2 -- src/Storage/PublicSuffixListStorageFactory.php | 2 -- src/Storage/RemoteStorageURL.php | 2 -- src/Storage/RootZoneDatabaseCache.php | 2 -- src/Storage/RootZoneDatabaseClient.php | 2 -- src/Storage/RootZoneDatabaseStorage.php | 2 -- src/Storage/RootZoneDatabaseStorageFactory.php | 2 -- src/Storage/RulesPsr16Cache.php | 2 -- src/Storage/RulesPsr16CacheTest.php | 2 -- src/Storage/RulesPsr18Client.php | 2 -- src/Storage/RulesPsr18ClientTest.php | 2 -- src/Storage/RulesStorage.php | 2 -- src/Storage/RulesStorageTest.php | 2 -- src/Storage/TopLevelDomainsPsr16Cache.php | 2 -- src/Storage/TopLevelDomainsPsr16CacheTest.php | 2 -- src/Storage/TopLevelDomainsPsr18Client.php | 2 -- src/Storage/TopLevelDomainsPsr18ClientTest.php | 2 -- src/Storage/TopLevelDomainsStorage.php | 2 -- src/Storage/TopLevelDomainsStorageTest.php | 2 -- src/TopLevelDomains.php | 2 -- src/TopLevelDomainsTest.php | 2 -- src/UnableToLoadPublicSuffixList.php | 2 -- src/UnableToLoadRootZoneDatabase.php | 2 -- src/UnableToResolveDomain.php | 2 -- 56 files changed, 1 insertion(+), 111 deletions(-) diff --git a/.php_cs b/.php_cs index 25b3ab9f..724a2247 100644 --- a/.php_cs +++ b/.php_cs @@ -5,8 +5,6 @@ PHP Domain Parser: Public Suffix List based URL parsing. @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository -@copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - For the full copyright and license information, please view the LICENSE file that was distributed with this source code. EOF; diff --git a/LICENSE b/LICENSE index 8ba95d80..f757ef1c 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (C) 2013-2019 Jeremy Kendall, http://about.me/jeremykendall +Copyright (C) 2013 Jeremy Kendall, http://about.me/jeremykendall Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/src/Domain.php b/src/Domain.php index 9a7b5f44..a8f46080 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/DomainName.php b/src/DomainName.php index 5e3ea647..ae220dba 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/DomainNameParser.php b/src/DomainNameParser.php index a6b09c0d..c892f746 100644 --- a/src/DomainNameParser.php +++ b/src/DomainNameParser.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/DomainResolver.php b/src/DomainResolver.php index 48afb3f1..c784e471 100644 --- a/src/DomainResolver.php +++ b/src/DomainResolver.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/DomainTest.php b/src/DomainTest.php index 40d68cce..80580dd8 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/EffectiveTLD.php b/src/EffectiveTLD.php index 3dd23963..958e7d5e 100644 --- a/src/EffectiveTLD.php +++ b/src/EffectiveTLD.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/ExceptionInterface.php b/src/ExceptionInterface.php index 5172453b..71c11ce0 100644 --- a/src/ExceptionInterface.php +++ b/src/ExceptionInterface.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/ExternalDomainName.php b/src/ExternalDomainName.php index d6d291c4..37f57100 100644 --- a/src/ExternalDomainName.php +++ b/src/ExternalDomainName.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Host.php b/src/Host.php index dea98b80..86a9f724 100644 --- a/src/Host.php +++ b/src/Host.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/IDNConversion.php b/src/IDNConversion.php index 56ad63ce..0944151d 100644 --- a/src/IDNConversion.php +++ b/src/IDNConversion.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/InvalidDomainName.php b/src/InvalidDomainName.php index 03578a0c..6b2672b1 100644 --- a/src/InvalidDomainName.php +++ b/src/InvalidDomainName.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/InvalidHost.php b/src/InvalidHost.php index 6fb29063..b11a1c95 100644 --- a/src/InvalidHost.php +++ b/src/InvalidHost.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 7936f615..d741a54e 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/PublicSuffixList.php b/src/PublicSuffixList.php index 4b6cd07b..56cfdcbb 100644 --- a/src/PublicSuffixList.php +++ b/src/PublicSuffixList.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/PublicSuffixListConverter.php b/src/PublicSuffixListConverter.php index 866126e2..206602c9 100644 --- a/src/PublicSuffixListConverter.php +++ b/src/PublicSuffixListConverter.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/PublicSuffixListConverterTest.php b/src/PublicSuffixListConverterTest.php index b369b0a1..13ed98e9 100644 --- a/src/PublicSuffixListConverterTest.php +++ b/src/PublicSuffixListConverterTest.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/PublicSuffixTest.php b/src/PublicSuffixTest.php index d0f03629..6251bf3d 100644 --- a/src/PublicSuffixTest.php +++ b/src/PublicSuffixTest.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 44bbd9fd..4603c97c 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/ResolvedDomainName.php b/src/ResolvedDomainName.php index 56d123c7..10d5a93d 100644 --- a/src/ResolvedDomainName.php +++ b/src/ResolvedDomainName.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index c003ac4d..a36d64ea 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/RootZoneDatabase.php b/src/RootZoneDatabase.php index 2bba5e0a..1279cc9b 100644 --- a/src/RootZoneDatabase.php +++ b/src/RootZoneDatabase.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/RootZoneDatabaseConverter.php b/src/RootZoneDatabaseConverter.php index 29238c70..ee6512c4 100644 --- a/src/RootZoneDatabaseConverter.php +++ b/src/RootZoneDatabaseConverter.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/RootZoneDatabaseConverterTest.php b/src/RootZoneDatabaseConverterTest.php index c9de66fb..76b40a42 100644 --- a/src/RootZoneDatabaseConverterTest.php +++ b/src/RootZoneDatabaseConverterTest.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Rules.php b/src/Rules.php index d28d14eb..ac4a3ba0 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/RulesTest.php b/src/RulesTest.php index a98ff491..cd89abb5 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/JsonSerializablePsr16Cache.php b/src/Storage/JsonSerializablePsr16Cache.php index 534c6923..199db1a0 100644 --- a/src/Storage/JsonSerializablePsr16Cache.php +++ b/src/Storage/JsonSerializablePsr16Cache.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/JsonSerializablePsr16CacheTest.php b/src/Storage/JsonSerializablePsr16CacheTest.php index 08b7b385..b736cb9b 100644 --- a/src/Storage/JsonSerializablePsr16CacheTest.php +++ b/src/Storage/JsonSerializablePsr16CacheTest.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/PsrStorageFactory.php b/src/Storage/PsrStorageFactory.php index d2550392..4948cca6 100644 --- a/src/Storage/PsrStorageFactory.php +++ b/src/Storage/PsrStorageFactory.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/PublicSuffixListCache.php b/src/Storage/PublicSuffixListCache.php index 20dde9fa..d7d54bb3 100644 --- a/src/Storage/PublicSuffixListCache.php +++ b/src/Storage/PublicSuffixListCache.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/PublicSuffixListClient.php b/src/Storage/PublicSuffixListClient.php index 09cb09d4..11266858 100644 --- a/src/Storage/PublicSuffixListClient.php +++ b/src/Storage/PublicSuffixListClient.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/PublicSuffixListStorage.php b/src/Storage/PublicSuffixListStorage.php index 889c7076..4db13c35 100644 --- a/src/Storage/PublicSuffixListStorage.php +++ b/src/Storage/PublicSuffixListStorage.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/PublicSuffixListStorageFactory.php b/src/Storage/PublicSuffixListStorageFactory.php index 24e9a014..fd13c469 100644 --- a/src/Storage/PublicSuffixListStorageFactory.php +++ b/src/Storage/PublicSuffixListStorageFactory.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/RemoteStorageURL.php b/src/Storage/RemoteStorageURL.php index 60749ca4..73c8971b 100644 --- a/src/Storage/RemoteStorageURL.php +++ b/src/Storage/RemoteStorageURL.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/RootZoneDatabaseCache.php b/src/Storage/RootZoneDatabaseCache.php index da9af168..bf64368a 100644 --- a/src/Storage/RootZoneDatabaseCache.php +++ b/src/Storage/RootZoneDatabaseCache.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/RootZoneDatabaseClient.php b/src/Storage/RootZoneDatabaseClient.php index 09d1765f..b79b0a44 100644 --- a/src/Storage/RootZoneDatabaseClient.php +++ b/src/Storage/RootZoneDatabaseClient.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/RootZoneDatabaseStorage.php b/src/Storage/RootZoneDatabaseStorage.php index d628e262..f7a5de12 100644 --- a/src/Storage/RootZoneDatabaseStorage.php +++ b/src/Storage/RootZoneDatabaseStorage.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/RootZoneDatabaseStorageFactory.php b/src/Storage/RootZoneDatabaseStorageFactory.php index 57eed4c1..7c87e832 100644 --- a/src/Storage/RootZoneDatabaseStorageFactory.php +++ b/src/Storage/RootZoneDatabaseStorageFactory.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/RulesPsr16Cache.php b/src/Storage/RulesPsr16Cache.php index 649e06fd..3234091a 100644 --- a/src/Storage/RulesPsr16Cache.php +++ b/src/Storage/RulesPsr16Cache.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/RulesPsr16CacheTest.php b/src/Storage/RulesPsr16CacheTest.php index d470e2c7..1c93fff6 100644 --- a/src/Storage/RulesPsr16CacheTest.php +++ b/src/Storage/RulesPsr16CacheTest.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/RulesPsr18Client.php b/src/Storage/RulesPsr18Client.php index d81bee99..b8e24bb5 100644 --- a/src/Storage/RulesPsr18Client.php +++ b/src/Storage/RulesPsr18Client.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/RulesPsr18ClientTest.php b/src/Storage/RulesPsr18ClientTest.php index 9e90d637..1cef6c17 100644 --- a/src/Storage/RulesPsr18ClientTest.php +++ b/src/Storage/RulesPsr18ClientTest.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/RulesStorage.php b/src/Storage/RulesStorage.php index a27b5acb..a9057616 100644 --- a/src/Storage/RulesStorage.php +++ b/src/Storage/RulesStorage.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/RulesStorageTest.php b/src/Storage/RulesStorageTest.php index 792037e0..2323fee0 100644 --- a/src/Storage/RulesStorageTest.php +++ b/src/Storage/RulesStorageTest.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/TopLevelDomainsPsr16Cache.php b/src/Storage/TopLevelDomainsPsr16Cache.php index 6f1bb414..636b09b8 100644 --- a/src/Storage/TopLevelDomainsPsr16Cache.php +++ b/src/Storage/TopLevelDomainsPsr16Cache.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/TopLevelDomainsPsr16CacheTest.php b/src/Storage/TopLevelDomainsPsr16CacheTest.php index f7f3075a..132a40da 100644 --- a/src/Storage/TopLevelDomainsPsr16CacheTest.php +++ b/src/Storage/TopLevelDomainsPsr16CacheTest.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/TopLevelDomainsPsr18Client.php b/src/Storage/TopLevelDomainsPsr18Client.php index 87576b56..0cdd3ec0 100644 --- a/src/Storage/TopLevelDomainsPsr18Client.php +++ b/src/Storage/TopLevelDomainsPsr18Client.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/TopLevelDomainsPsr18ClientTest.php b/src/Storage/TopLevelDomainsPsr18ClientTest.php index 11c43089..8f627302 100644 --- a/src/Storage/TopLevelDomainsPsr18ClientTest.php +++ b/src/Storage/TopLevelDomainsPsr18ClientTest.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/TopLevelDomainsStorage.php b/src/Storage/TopLevelDomainsStorage.php index 29c86077..1e0acb2f 100644 --- a/src/Storage/TopLevelDomainsStorage.php +++ b/src/Storage/TopLevelDomainsStorage.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/Storage/TopLevelDomainsStorageTest.php b/src/Storage/TopLevelDomainsStorageTest.php index cc8ef7d3..44cf9e45 100644 --- a/src/Storage/TopLevelDomainsStorageTest.php +++ b/src/Storage/TopLevelDomainsStorageTest.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 9565b6da..ee7743b2 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index f5c46f26..e1dc01f4 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/UnableToLoadPublicSuffixList.php b/src/UnableToLoadPublicSuffixList.php index 260384aa..ff407c19 100644 --- a/src/UnableToLoadPublicSuffixList.php +++ b/src/UnableToLoadPublicSuffixList.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/UnableToLoadRootZoneDatabase.php b/src/UnableToLoadRootZoneDatabase.php index b942f59c..e24a71f4 100644 --- a/src/UnableToLoadRootZoneDatabase.php +++ b/src/UnableToLoadRootZoneDatabase.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ diff --git a/src/UnableToResolveDomain.php b/src/UnableToResolveDomain.php index 8b3eed15..a1a95d68 100644 --- a/src/UnableToResolveDomain.php +++ b/src/UnableToResolveDomain.php @@ -5,8 +5,6 @@ * * @see http://github.com/jeremykendall/php-domain-parser for the canonical source repository * - * @copyright Copyright (c) 2017 Jeremy Kendall (http://jeremykendall.net) - * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ From 05396bc6265acf51948401f1268960094e89c62e Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 30 Sep 2020 20:09:22 +0200 Subject: [PATCH 262/461] Update package CHANGELOG --- CHANGELOG.md | 83 ++++++++++++++++++++++++++++++++++++++------------- composer.json | 2 +- 2 files changed, 64 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61d266de..b9bb4a8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,22 +2,65 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in this file -## Next - TBD +## 6.x.x - TBD ### Added -- `Rules::resolveCookieDomain` -- `Rules::resolveICANNDomain` -- `Rules::resolvePrivateDomain` -- `Rules::getCookieEffectiveTLD` -- `Rules::getICANNEffectiveTLD` -- `Rules::getPrivateeEffectiveTLD` +- Adding proper interfaces +- Public Suffix List and IANA Root Zone Database are fully decoupled +- Optional storage capability based on PSR related interface. + +### Fixed + +- The Domain not longer directly exposes Effective TLD status. +- Effective TLD resolver no longer accept IDNA options. + +### Deprecated + +- None + +### Removed + +- Support for PHP7.4- +- Composer script for automatic updates of the remote databases +- CLI command `bin/update-psl` +- `Pdp\Cache`, `Pdp\CacheException`: The package PSR-16 Cache implementation using the underlying filesystem. +- `Pdp\HttpClient`, `Pdp\CurlHttpClient` and `Pdp\HttpClientException`: The package Http Client. +- `Pdp\Installer`, `Pdp\Manager`: The package source manager and installer +- `Pdp\Logger`: The package logger implementation + +## 5.7.1 - 2020-08-24 + +### Added + +- None + +### Fixed + +- Cache throws when cache directory doesn't exist [#280](https://github.com/jeremykendall/php-domain-parser/issues/280) + +### Deprecated + +- None + +### Removed + +- None + +## 5.7.0 - 2020-08-02 + +### Added + +- `Rules::getCookieDomain` +- `Rules::getICANNDomain` +- `Rules::getPrivateDomain` - `CouldNotResolvePublicSuffix::dueToUnresolvableDomain` ### Fixed - Improve type hinting and return type by dropping EOL PHP versions support. - Improve development environment by dropping EOL PHP versions support. +- Composer script ### Deprecated @@ -76,12 +119,12 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\TopLevelDomains` to allow resolving domain againts IANA Root zone database - `Pdp\TLDConverter` converts the IANA Root Zones database into an associative array -- `Pdp\Service\Manager::getTLDs` a service to return a cache version of the IANA Root zone database -- `Pdp\Service\Manager::refreshTLDs` a service to refresh the cache version of the IANA Root zone database +- `Pdp\Manager::getTLDs` a service to return a cache version of the IANA Root zone database +- `Pdp\Manager::refreshTLDs` a service to refresh the cache version of the IANA Root zone database - added a new `$ttl` parameter to improve PSR-16 supports to - - `Pdp\Service\Manager::__construct` - - `Pdp\Service\Manager::getRules` - - `Pdp\Service\Manager::refreshRules` + - `Pdp\Manager::__construct` + - `Pdp\Manager::getRules` + - `Pdp\Manager::refreshRules` - `Pdp\Exception\CouldNotLoadTLDs` exception ### Fixed @@ -119,8 +162,8 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\Domain` domain part computation (public suffix, registrable domain and sub domain) - `Pdp\Domain` and `Pdp\PublicSuffix` host validation compliance to RFC improved -- Improve `Pdp\Converter` and `Pdp\Service\Manager` class to better report error on IDN conversion. -- Improve `Pdp\Service\Installer` vendor directory resolution see [PR #222](https://github.com/jeremykendall/php-domain-parser/pull/222) +- Improve `Pdp\Converter` and `Pdp\Manager` class to better report error on IDN conversion. +- Improve `Pdp\Installer` vendor directory resolution see [PR #222](https://github.com/jeremykendall/php-domain-parser/pull/222) - `Pdp\Exception` nows extends `InvalidArgumentException` instead of `RuntimeException` ### Deprecated @@ -184,9 +227,9 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\Exception` a base exception for the library - `Pdp\Rules` a class to resolve domain name against the public suffix list - `Pdp\Domain` an immutable value object to represents a parsed domain name -- `Pdp\Service\Installer` a class to enable improve PSL maintenance -- `Pdp\Storage\Cache` a PSR-16 file cache implementation to cache a local copy of the PSL -- `Pdp\Service\Manager` a class to enable managing PSL sources and `Rules` objects creation +- `Pdp\Installer` a class to enable improve PSL maintenance +- `Pdp\Cache` a PSR-16 file cache implementation to cache a local copy of the PSL +- `Pdp\Manager` a class to enable managing PSL sources and `Rules` objects creation - `Pdp\Converter` a class to convert the PSL into a PHP array ### Fixed @@ -204,6 +247,6 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - PHP5 support - URL Parsing capabilities and domain name validation - `Pdp\PublicSuffixList` class replaced by the `Pdp\Rules` class -- `Pdp\PublicSuffixManager` class replaced by the `Pdp\Service\Manager` class -- `Pdp\HttpAdapter\HttpAdapterInterface` interface replaced by the `Pdp\Client\HttpClient` interface -- `Pdp\HttpAdapter\CurlHttpAdapter` class replaced by the `Pdp\Client\CurlHttpClient` class +- `Pdp\PublicSuffixManager` class replaced by the `Pdp\Manager` class +- `Pdp\HttpAdapter\HttpAdapterInterface` interface replaced by the `Pdp\HttpClient` interface +- `Pdp\HttpAdapter\CurlHttpAdapter` class replaced by the `Pdp\CurlHttpClient` class diff --git a/composer.json b/composer.json index f0fb6114..b2de5c6a 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "jeremykendall/php-domain-parser", - "description": "Public Suffix List based URL parsing implemented in PHP.", + "description": "Public Suffix List and IANA Root Zone Database based Domain parsing implemented in PHP.", "homepage": "https://github.com/jeremykendall/php-domain-parser", "support": { "issues": "https://github.com/jeremykendall/php-domain-parser/issues", From ec0bd067f25d5e1f21b0201ad6360d93e08b8200 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 30 Sep 2020 20:51:23 +0200 Subject: [PATCH 263/461] Update README and composer package --- README.md | 2 +- composer.json | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index b9fe0e88..c9c166ee 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # PHP Domain Parser **PHP Domain Parser** is a [Public Suffix List](http://publicsuffix.org/) based domain parser implemented in PHP. -[![Build Status][ico-travis]][link-travis] +![Quality Assurance](https://github.com/jeremykendall/php-domain-parser/workflows/Quality%20Assurance/badge.svg) [![Total Downloads][ico-packagist]][link-packagist] [![Latest Stable Version][ico-release]][link-release] [![Software License][ico-license]][link-license] diff --git a/composer.json b/composer.json index b2de5c6a..4706a5de 100644 --- a/composer.json +++ b/composer.json @@ -23,9 +23,6 @@ "homepage": "https://github.com/jeremykendall/php-domain-parser/graphs/contributors" } ], - "bin": [ - "bin/update-pdp" - ], "keywords": [ "Public Suffix List", "Top Level Domains", From a6e87a4d858733d64f85b22ebcad317e3e7a049f Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 30 Sep 2020 20:53:39 +0200 Subject: [PATCH 264/461] bug fix version constraint with PHP8 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 4706a5de..80497999 100644 --- a/composer.json +++ b/composer.json @@ -34,7 +34,7 @@ "psl" ], "require": { - "php": "^7.4|^8.0", + "php": "^7.4 || ^8.0", "ext-intl": "*", "ext-json": "*" }, From 6f92d4beb424f543937a84dbd78cee73927c5a2c Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 30 Sep 2020 21:29:51 +0200 Subject: [PATCH 265/461] Improve Storage related interfaces --- src/Storage/JsonSerializableCache.php | 25 ++++++++++++++ src/Storage/JsonSerializablePsr16Cache.php | 8 ++--- .../JsonSerializablePsr16CacheTest.php | 2 +- src/Storage/PsrStorageFactory.php | 10 +++--- .../{RulesPsr16Cache.php => RulesCache.php} | 18 ++++++---- ...sPsr16CacheTest.php => RulesCacheTest.php} | 34 +++++++++++++------ ...sr16Cache.php => TopLevelDomainsCache.php} | 15 +++++--- ...eTest.php => TopLevelDomainsCacheTest.php} | 33 +++++++++++++----- 8 files changed, 107 insertions(+), 38 deletions(-) create mode 100644 src/Storage/JsonSerializableCache.php rename src/Storage/{RulesPsr16Cache.php => RulesCache.php} (66%) rename src/Storage/{RulesPsr16CacheTest.php => RulesCacheTest.php} (91%) rename src/Storage/{TopLevelDomainsPsr16Cache.php => TopLevelDomainsCache.php} (70%) rename src/Storage/{TopLevelDomainsPsr16CacheTest.php => TopLevelDomainsCacheTest.php} (91%) diff --git a/src/Storage/JsonSerializableCache.php b/src/Storage/JsonSerializableCache.php new file mode 100644 index 00000000..944a753a --- /dev/null +++ b/src/Storage/JsonSerializableCache.php @@ -0,0 +1,25 @@ +cache->get($this->cacheKey($key)); } - public function forget(string $key, Throwable $exception = null): bool + public function forget(string $key): bool { $result = $this->cache->delete($this->cacheKey($key)); - if (null !== $exception) { - $this->logger->warning($exception->getMessage()); + if (!$result) { + $this->logger->warning('The content associated with: `'.$key.'` could not be deleted.'); } return $result; diff --git a/src/Storage/JsonSerializablePsr16CacheTest.php b/src/Storage/JsonSerializablePsr16CacheTest.php index b736cb9b..61e2cdae 100644 --- a/src/Storage/JsonSerializablePsr16CacheTest.php +++ b/src/Storage/JsonSerializablePsr16CacheTest.php @@ -23,7 +23,7 @@ use TypeError; /** - * @coversDefaultClass \Pdp\Storage\JsonSerializablePsr16Cache + * @coversDefaultClass JsonSerializableCache */ final class JsonSerializablePsr16CacheTest extends TestCase { diff --git a/src/Storage/PsrStorageFactory.php b/src/Storage/PsrStorageFactory.php index 4948cca6..5ac9325e 100644 --- a/src/Storage/PsrStorageFactory.php +++ b/src/Storage/PsrStorageFactory.php @@ -50,8 +50,9 @@ public function createPublicSuffixListStorage(string $cachePrefix = '', $cacheTt { return new RulesStorage( new RulesPsr18Client($this->client, $this->requestFactory), - new RulesPsr16Cache( - new JsonSerializablePsr16Cache($this->cache, $cachePrefix, $cacheTtl, $this->logger) + new RulesCache( + new JsonSerializablePsr16Cache($this->cache, $cachePrefix, $cacheTtl, $this->logger), + $this->logger ) ); } @@ -63,8 +64,9 @@ public function createRootZoneDatabaseStorage(string $cachePrefix = '', $cacheTt { return new TopLevelDomainsStorage( new TopLevelDomainsPsr18Client($this->client, $this->requestFactory), - new TopLevelDomainsPsr16Cache( - new JsonSerializablePsr16Cache($this->cache, $cachePrefix, $cacheTtl, $this->logger) + new TopLevelDomainsCache( + new JsonSerializablePsr16Cache($this->cache, $cachePrefix, $cacheTtl, $this->logger), + $this->logger ) ); } diff --git a/src/Storage/RulesPsr16Cache.php b/src/Storage/RulesCache.php similarity index 66% rename from src/Storage/RulesPsr16Cache.php rename to src/Storage/RulesCache.php index 3234091a..68885b48 100644 --- a/src/Storage/RulesPsr16Cache.php +++ b/src/Storage/RulesCache.php @@ -15,18 +15,22 @@ use Pdp\PublicSuffixList; use Pdp\Rules; +use Psr\Log\LoggerInterface; use Throwable; -final class RulesPsr16Cache implements PublicSuffixListCache +final class RulesCache implements PublicSuffixListCache { - private JsonSerializablePsr16Cache $cache; + private JsonSerializableCache $cache; - public function __construct(JsonSerializablePsr16Cache $cache) + private ?LoggerInterface $logger; + + public function __construct(JsonSerializableCache $cache, LoggerInterface $logger = null) { $this->cache = $cache; + $this->logger = $logger; } - public function fetch(string $uri): ?Rules + public function fetch(string $uri): ?PublicSuffixList { $cacheData = $this->cache->fetch($uri); if (null === $cacheData) { @@ -36,8 +40,10 @@ public function fetch(string $uri): ?Rules try { $rules = Rules::fromJsonString($cacheData); } catch (Throwable $exception) { - $this->cache->forget($uri, $exception); - + $this->cache->forget($uri); + if (null !== $this->logger) { + $this->logger->error($exception->getMessage()); + } return null; } diff --git a/src/Storage/RulesPsr16CacheTest.php b/src/Storage/RulesCacheTest.php similarity index 91% rename from src/Storage/RulesPsr16CacheTest.php rename to src/Storage/RulesCacheTest.php index 1c93fff6..7981307f 100644 --- a/src/Storage/RulesPsr16CacheTest.php +++ b/src/Storage/RulesCacheTest.php @@ -23,9 +23,9 @@ use function json_encode; /** - * @coversDefaultClass \Pdp\Storage\RulesPsr16Cache + * @coversDefaultClass \Pdp\Storage\RulesCache */ -final class RulesPsr16CacheTest extends TestCase +final class RulesCacheTest extends TestCase { public function testItReturnsNullIfTheCacheDoesNotExists(): void { @@ -70,7 +70,7 @@ public function has($key) } }; - $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', '1 DAY')); + $pslCache = new RulesCache(new JsonSerializablePsr16Cache($cache, 'pdp_', '1 DAY')); self::assertNull($pslCache->fetch('http://www.example.com')); } @@ -118,7 +118,7 @@ public function has($key) } }; - $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', 86400)); + $pslCache = new RulesCache(new JsonSerializablePsr16Cache($cache, 'pdp_', 86400)); self::assertEquals( Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'), @@ -188,8 +188,10 @@ public function logs(): array } }; - $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', 86400, $logger)); - + $pslCache = new RulesCache( + new JsonSerializablePsr16Cache($cache, 'pdp_', 86400, $logger), + $logger + ); self::assertNull($pslCache->fetch('http://www.example.com')); self::assertSame('Failed to JSON decode the string: Syntax error.', $logger->logs()[0]); } @@ -256,7 +258,10 @@ public function logs(): array } }; - $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateTimeImmutable('+1 DAY'), $logger)); + $pslCache = new RulesCache( + new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateTimeImmutable('+1 DAY'), $logger), + $logger + ); self::assertNull($pslCache->fetch('http://www.example.com')); self::assertSame( @@ -328,7 +333,10 @@ public function logs(): array }; $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger)); + $pslCache = new RulesCache( + new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger), + $logger + ); self::assertTrue($pslCache->store('http://www.example.com', $psl)); self::assertSame('The content associated with: `http://www.example.com` was stored.', $logger->logs()[0]); @@ -397,7 +405,10 @@ public function logs(): array }; $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger)); + $pslCache = new RulesCache( + new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger), + $logger + ); self::assertFalse($pslCache->store('http://www.example.com', $psl)); self::assertSame('The content associated with: `http://www.example.com` could not be stored.', $logger->logs()[0]); @@ -468,7 +479,10 @@ public function logs(): array }; $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new RulesPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger)); + $pslCache = new RulesCache( + new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger), + $logger + ); self::assertFalse($pslCache->store('http://www.example.com', $psl)); self::assertSame('The content associated with: `http://www.example.com` could not be cached: Something went wrong.', $logger->logs()[0]); diff --git a/src/Storage/TopLevelDomainsPsr16Cache.php b/src/Storage/TopLevelDomainsCache.php similarity index 70% rename from src/Storage/TopLevelDomainsPsr16Cache.php rename to src/Storage/TopLevelDomainsCache.php index 636b09b8..033a40e6 100644 --- a/src/Storage/TopLevelDomainsPsr16Cache.php +++ b/src/Storage/TopLevelDomainsCache.php @@ -15,15 +15,19 @@ use Pdp\RootZoneDatabase; use Pdp\TopLevelDomains; +use Psr\Log\LoggerInterface; use Throwable; -final class TopLevelDomainsPsr16Cache implements RootZoneDatabaseCache +final class TopLevelDomainsCache implements RootZoneDatabaseCache { - private JsonSerializablePsr16Cache $cache; + private JsonSerializableCache $cache; - public function __construct(JsonSerializablePsr16Cache $cache) + private ?LoggerInterface $logger; + + public function __construct(JsonSerializableCache $cache, LoggerInterface $logger = null) { $this->cache = $cache; + $this->logger = $logger; } public function fetch(string $uri): ?RootZoneDatabase @@ -36,7 +40,10 @@ public function fetch(string $uri): ?RootZoneDatabase try { $topLevelDomains = TopLevelDomains::fromJsonString($cacheData); } catch (Throwable $exception) { - $this->cache->forget($uri, $exception); + $this->cache->forget($uri); + if (null !== $this->logger) { + $this->logger->error($exception->getMessage()); + } return null; } diff --git a/src/Storage/TopLevelDomainsPsr16CacheTest.php b/src/Storage/TopLevelDomainsCacheTest.php similarity index 91% rename from src/Storage/TopLevelDomainsPsr16CacheTest.php rename to src/Storage/TopLevelDomainsCacheTest.php index 132a40da..58db356a 100644 --- a/src/Storage/TopLevelDomainsPsr16CacheTest.php +++ b/src/Storage/TopLevelDomainsCacheTest.php @@ -23,9 +23,9 @@ use function json_encode; /** - * @coversDefaultClass \Pdp\Storage\TopLevelDomainsPsr16Cache + * @coversDefaultClass \Pdp\Storage\TopLevelDomainsCache */ -final class TopLevelDomainsPsr16CacheTest extends TestCase +final class TopLevelDomainsCacheTest extends TestCase { public function testItReturnsNullIfTheCacheDoesNotExists(): void { @@ -70,7 +70,7 @@ public function has($key) } }; - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', '1 DAY')); + $cache = new TopLevelDomainsCache(new JsonSerializablePsr16Cache($cache, 'pdp_', '1 DAY')); self::assertNull($cache->fetch('http://www.example.com')); } @@ -118,7 +118,7 @@ public function has($key) } }; - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', 86400)); + $cache = new TopLevelDomainsCache(new JsonSerializablePsr16Cache($cache, 'pdp_', 86400)); self::assertEquals( TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'), @@ -188,7 +188,10 @@ public function logs(): array } }; - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', 86400, $logger)); + $cache = new TopLevelDomainsCache( + new JsonSerializablePsr16Cache($cache, 'pdp_', 86400, $logger), + $logger + ); self::assertNull($cache->fetch('http://www.example.com')); self::assertSame('Failed to JSON decode the string: Syntax error.', $logger->logs()[0]); @@ -256,7 +259,10 @@ public function logs(): array } }; - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', 86400, $logger)); + $cache = new TopLevelDomainsCache( + new JsonSerializablePsr16Cache($cache, 'pdp_', 86400, $logger), + $logger + ); self::assertNull($cache->fetch('http://www.example.com')); self::assertSame( 'The decoded hashmap structure is missing at least one of the required properties: `records`, `version` and/or `modifiedDate`.', @@ -327,7 +333,10 @@ public function logs(): array }; $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger)); + $cache = new TopLevelDomainsCache( + new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger), + $logger + ); self::assertTrue($cache->store('http://www.example.com', $rzd)); self::assertSame('The content associated with: `http://www.example.com` was stored.', $logger->logs()[0]); @@ -396,7 +405,10 @@ public function logs(): array }; $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger)); + $cache = new TopLevelDomainsCache( + new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger), + $logger + ); self::assertFalse($cache->store('http://www.example.com', $rzd)); self::assertSame('The content associated with: `http://www.example.com` could not be stored.', $logger->logs()[0]); @@ -467,7 +479,10 @@ public function logs(): array }; $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $cache = new TopLevelDomainsPsr16Cache(new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger)); + $cache = new TopLevelDomainsCache( + new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger), + $logger + ); self::assertFalse($cache->store('http://www.example.com', $rzd)); self::assertSame('The content associated with: `http://www.example.com` could not be cached: Something went wrong.', $logger->logs()[0]); From 28e00edd48e8f2f50aedffe7aa8e99fea8dbb13d Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 30 Sep 2020 21:45:13 +0200 Subject: [PATCH 266/461] Improve changelog --- CHANGELOG.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9bb4a8c..806977f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,19 +1,19 @@ # Changelog -All Notable changes to `PHP Domain Parser` **5.x** series will be documented in this file +All Notable changes to `PHP Domain Parser` starting from the **5.x** series will be documented in this file ## 6.x.x - TBD ### Added -- Adding proper interfaces +- Adding proper Interfaces around domain name and domain name parsing - Public Suffix List and IANA Root Zone Database are fully decoupled -- Optional storage capability based on PSR related interface. +- Optional storage capability based on PSR related interfaces to improve interoperability with any framework ### Fixed -- The Domain not longer directly exposes Effective TLD status. -- Effective TLD resolver no longer accept IDNA options. +- The `Pdp\Domain` class not longer directly exposes Effective TLD status. +- Effective TLD resolver (`Pdp\Rules::resolve` and `Pdp\TopLevelDomains::resolve`) no longer accept IDNA options. ### Deprecated @@ -27,7 +27,9 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in - `Pdp\Cache`, `Pdp\CacheException`: The package PSR-16 Cache implementation using the underlying filesystem. - `Pdp\HttpClient`, `Pdp\CurlHttpClient` and `Pdp\HttpClientException`: The package Http Client. - `Pdp\Installer`, `Pdp\Manager`: The package source manager and installer -- `Pdp\Logger`: The package logger implementation +- `Pdp\Logger`, The package logger implementation +- `Pdp\Rules::ALL_DOMAINS` constant deprecated in version 5.3 +- `Pdp\Domain::getDomain` deprecaed in version 5.3 ## 5.7.1 - 2020-08-24 From 889b86db68f9eab917ed442c8709633644d07d87 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 30 Sep 2020 21:47:52 +0200 Subject: [PATCH 267/461] Remove useless development dependency --- composer.json | 1 - 1 file changed, 1 deletion(-) diff --git a/composer.json b/composer.json index 80497999..f71a00e4 100644 --- a/composer.json +++ b/composer.json @@ -39,7 +39,6 @@ "ext-json": "*" }, "require-dev": { - "composer/composer": "^1.10|^2.0", "friendsofphp/php-cs-fixer": "^2.16", "phpstan/phpstan": "^0.12", "phpstan/phpstan-phpunit": "^0.12", From 6c94350f72562f34a1a4f127df9b1da2acfc0356 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 30 Sep 2020 21:54:31 +0200 Subject: [PATCH 268/461] Simplify logger usage --- src/Storage/RulesCache.php | 10 +++++----- src/Storage/TopLevelDomainsCache.php | 9 ++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/Storage/RulesCache.php b/src/Storage/RulesCache.php index 68885b48..f829290e 100644 --- a/src/Storage/RulesCache.php +++ b/src/Storage/RulesCache.php @@ -16,18 +16,19 @@ use Pdp\PublicSuffixList; use Pdp\Rules; use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; use Throwable; final class RulesCache implements PublicSuffixListCache { private JsonSerializableCache $cache; - private ?LoggerInterface $logger; + private LoggerInterface $logger; public function __construct(JsonSerializableCache $cache, LoggerInterface $logger = null) { $this->cache = $cache; - $this->logger = $logger; + $this->logger = $logger ?? new NullLogger(); } public function fetch(string $uri): ?PublicSuffixList @@ -41,9 +42,8 @@ public function fetch(string $uri): ?PublicSuffixList $rules = Rules::fromJsonString($cacheData); } catch (Throwable $exception) { $this->cache->forget($uri); - if (null !== $this->logger) { - $this->logger->error($exception->getMessage()); - } + $this->logger->error($exception->getMessage()); + return null; } diff --git a/src/Storage/TopLevelDomainsCache.php b/src/Storage/TopLevelDomainsCache.php index 033a40e6..b7100390 100644 --- a/src/Storage/TopLevelDomainsCache.php +++ b/src/Storage/TopLevelDomainsCache.php @@ -16,18 +16,19 @@ use Pdp\RootZoneDatabase; use Pdp\TopLevelDomains; use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; use Throwable; final class TopLevelDomainsCache implements RootZoneDatabaseCache { private JsonSerializableCache $cache; - private ?LoggerInterface $logger; + private LoggerInterface $logger; public function __construct(JsonSerializableCache $cache, LoggerInterface $logger = null) { $this->cache = $cache; - $this->logger = $logger; + $this->logger = $logger ?? new NullLogger(); } public function fetch(string $uri): ?RootZoneDatabase @@ -41,9 +42,7 @@ public function fetch(string $uri): ?RootZoneDatabase $topLevelDomains = TopLevelDomains::fromJsonString($cacheData); } catch (Throwable $exception) { $this->cache->forget($uri); - if (null !== $this->logger) { - $this->logger->error($exception->getMessage()); - } + $this->logger->error($exception->getMessage()); return null; } From 341cf00c9bc6b951bccab08eeb97ca791a466102 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 1 Oct 2020 19:17:22 +0200 Subject: [PATCH 269/461] Update documetation --- README.md | 114 +++++++----------------------------------------------- 1 file changed, 14 insertions(+), 100 deletions(-) diff --git a/README.md b/README.md index c9c166ee..aa3a6fcd 100644 --- a/README.md +++ b/README.md @@ -49,10 +49,12 @@ use Pdp\Rules; $rules = Rules::fromPath('/path/to/cache/public-suffix-list.dat'); -echo $rules->resolve('www.ulb.ac.be')->getPublicSuffix(); //display 'ac.be'; -echo $rules->getCookieDomain('www.ulb.ac.be')->getPublicSuffix(); //display 'ac.be'; -echo $rules->getICANNDomain('www.ulb.ac.be')->getPublicSuffix(); //display 'ac.be'; -echo $rules->getPrivateDomain('www.ulb.ac.be')->getPublicSuffix(); //display 'be'; +$resolvedDomain = $rules->resolve('www.PreF.OkiNawA.jP'); +echo $resolvedDomain->getDomain(); //display 'www.pref.okinawa.jp'; +echo $resolvedDomain->getPublicSuffix(); //display 'okinawa.jp'; +echo $resolvedDomain->getSecondLevelDomain(); //display 'pref'; +echo $resolvedDomain->getRegistrableDomain(); //display 'pref.okinawa.jp'; +echo $resolvedDomain->getSubDomain(); //display 'www'; ~~~ In case of an error an exception which extends `Pdp\ExceptionInterface` is thrown. @@ -61,109 +63,23 @@ In case of an error an exception which extends `Pdp\ExceptionInterface` is throw While the [Public Suffix List](http://publicsuffix.org/) is a community based list, the package provides access to the Top Level domain information given by the [IANA website](https://data.iana.org/TLD/tlds-alpha-by-domain.txt) to always resolve -top domain against the newly registered TLD. +top domain against all registered TLD even the new ones. ~~~php use Pdp\TopLevelDomains; $iana = TopLevelDomains::fromPath('/path/to/cache/tlds-alpha-by-domain.txt'); -echo $iana->resolve('www.UlB.Ac.bE')->getPublicSuffix(); //display 'be'; +$resolvedDomain = $iana->resolve('www.PreF.OkiNawA.jP'); +echo $resolvedDomain->getDomain(); //display 'www.pref.okinawa.jp'; +echo $resolvedDomain->getPublicSuffix(); //display 'jp'; +echo $resolvedDomain->getSecondLevelDomain(); //display 'okinawa'; +echo $resolvedDomain->getRegistrableDomain(); //display 'okinawa.jp'; +echo $resolvedDomain->getSubDomain(); //display 'www.pref'; ~~~ In case of an error an exception which extends `Pdp\ExceptionInterface` is thrown. -### Domain, ResolvedDomain and PublicSuffix - -In order to resolve a specific domain the package needs to make a distinction -between several domain representations. Each on of them is expressed as an immutable value object -which implements the `Pdp\Host` interface. - -#### Domain - -A `Pdp\Domain` instance is a host that exposes its labels and allow to change them. - -~~~php -use Pdp\Domain; - -$domain = new Domain('www.bébé.ExAmple.com'); -$domain->getContent(); // www.bébé.example.com -echo $domain; // www.bébé.example.com -echo $domain->label(0); // 'com' -echo $domain->label(-1); // 'www' -$domain->keys('example'); // array(1) -count($domain); //returns 4 -iterator_to_array($domain, false); // ['com', 'example', 'bébé', 'www'] -$domain->labels(); // ['com', 'example', 'bébé', 'www'] since v5.5 -$domain->toAscii()->getContent(); // www.xn--bb-bjab.example.com -echo (new Domain('www.xn--bb-bjab.example.com'))->toAscii(); // www.bébé.example.com -$domain->getAsciiIDNAOption(); // IDNA_DEFAULT -$domain->getUnicodeIDNAOption(); // IDNA_DEFAULT -~~~ - -Using the above code you have parsed and validated a domain name. The domain object has no information regarding its effective TLD. -To gain information against those databases you need to use their respective instance. - -The `Pdp\Domain` object supports IDNA options for a better transformation between i18n and ascii domain name. - -~~~php -toAscii()->getContent(); // 'fass.test.de' - -$altDomain = new Domain('faß.test.de', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); -echo $altDomain->toAscii()->getContent(); // 'xn--fa-hia.test.de' -~~~ - -The object also implements PHP's `Countable`, `IteratorAggregate` and `JsonSerializable` interfaces to ease retrieving the domain labels and properties. - -~~~php -use Pdp\Domain; - -$domain = new Domain('www.bébé.be'); -$domain->getContent(); // 'www.bébé.be' -echo $domain->toAscii(); // 'www.xn--bb-bjab.be' -echo $domain->toUnicode(); // 'www.bébé.be' -$newDomain = $domain - ->withLabel(-1, 'shop') - ->withLabel(0, 'com') - ->withoutLabel(1) -; -echo $domain; // 'www.bébé.be' -echo $newDomain; // 'shop.com' -~~~ - -#### Public Suffix - -**The domain public suffix status depends on the PSL section used to resolve it:** - -- `Pdp\PublicSuffix::isKnown` returns `true` if the public suffix is part of the selected PSL; -- `Pdp\PublicSuffix::isICANN` returns `true` if the public suffix is part of the PSL ICANN DOMAINS section; -- `Pdp\PublicSuffix::isPrivate` returns `true` if the public suffix is part of the PSL PRIVATE DOMAINS section; - -#### Resolved Domain - -**THIS EXAMPLE ILLUSTRATES HOW THE OBJECT WORK BUT SHOULD BE AVOIDED IN PRODUCTION** - -~~~php -$pdp_url = 'https://example.com/public_suffix_list.dat'; -$rules = Pdp\Rules::fromPath($pdp_url); - -$domain = $rules->resolve('www.Ulb.AC.be'); // resolution is done against all the sections available -echo $domain; // returns www.ulb.ac.be -echo $domain->getPublicSuffix(); -// returns "ac.be" - -//The same domain will return a different result using the PSL PRIVATE DOMAIN SECTION only - -$domain = $rules->getPrivateDomain('www.Ulb.AC.be'); -echo $domain->getPublicSuffix(); -// returns "be" -~~~ - **WARNING:** **You should never use the library this way in production, without, at least, a caching mechanism to reduce HTTP calls.** @@ -174,7 +90,7 @@ Either way, if you must use this library for this purpose, please consider integ ## Managing the package databases -The library comes bundle with a service which enables resolving domain name without the constant network overhead of continuously downloading the remote databases. +The library comes bundle with a **optional** service which enables resolving domain name without the constant network overhead of continuously downloading the remote databases. The `Pdp\Storage\PsrStorageFactory` enables returning storage instances that retrieve, convert and cache the Public Suffix List as well as the IANA Root Zone Database. ### Instantiate `Pdp\Storage\PsrStorageFactory` @@ -294,12 +210,10 @@ Portions of the `Pdp\Converter` and `Pdp\Rules` are derivative works of the PHP Those parts of this codebase are heavily commented, and I've included a copy of the Apache Software Foundation License 2.0 in this project. -[ico-travis]: https://img.shields.io/travis/jeremykendall/php-domain-parser/master.svg?style=flat-square [ico-packagist]: https://img.shields.io/packagist/dt/jeremykendall/php-domain-parser.svg?style=flat-square [ico-release]: https://img.shields.io/github/release/jeremykendall/php-domain-parser.svg?style=flat-square [ico-license]: https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square -[link-travis]: https://travis-ci.org/jeremykendall/php-domain-parser [link-packagist]: https://packagist.org/packages/jeremykendall/php-domain-parser [link-release]: https://github.com/jeremykendall/php-domain-parser/releases [link-license]: https://github.com/jeremykendall/php-domain-parser/blob/master/LICENSE From 4c359bbaea314fc5b01ef4ba02d0bd0f54a5dbf8 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 1 Oct 2020 21:12:31 +0200 Subject: [PATCH 270/461] Remove JsonSerializablePsr16Cache --- README.md | 19 +- src/Storage/JsonSerializableCache.php | 25 - .../JsonSerializablePsr16CacheTest.php | 465 ------------------ src/Storage/PsrStorageFactory.php | 19 +- src/Storage/PublicSuffixListCache.php | 2 +- src/Storage/RootZoneDatabaseCache.php | 4 +- src/Storage/RulesCache.php | 62 --- ...ablePsr16Cache.php => RulesPsr16Cache.php} | 61 +-- ...sCacheTest.php => RulesPsr16CacheTest.php} | 140 +----- src/Storage/RulesStorage.php | 2 +- src/Storage/RulesStorageTest.php | 6 +- src/Storage/TopLevelDomainsCache.php | 62 --- src/Storage/TopLevelDomainsPsr16Cache.php | 130 +++++ ....php => TopLevelDomainsPsr16CacheTest.php} | 140 +----- src/Storage/TopLevelDomainsStorage.php | 2 +- src/Storage/TopLevelDomainsStorageTest.php | 6 +- 16 files changed, 201 insertions(+), 944 deletions(-) delete mode 100644 src/Storage/JsonSerializableCache.php delete mode 100644 src/Storage/JsonSerializablePsr16CacheTest.php delete mode 100644 src/Storage/RulesCache.php rename src/Storage/{JsonSerializablePsr16Cache.php => RulesPsr16Cache.php} (64%) rename src/Storage/{RulesCacheTest.php => RulesPsr16CacheTest.php} (65%) delete mode 100644 src/Storage/TopLevelDomainsCache.php create mode 100644 src/Storage/TopLevelDomainsPsr16Cache.php rename src/Storage/{TopLevelDomainsCacheTest.php => TopLevelDomainsPsr16CacheTest.php} (65%) diff --git a/README.md b/README.md index aa3a6fcd..79d853ce 100644 --- a/README.md +++ b/README.md @@ -82,16 +82,22 @@ In case of an error an exception which extends `Pdp\ExceptionInterface` is throw **WARNING:** -**You should never use the library this way in production, without, at least, a caching mechanism to reduce HTTP calls.** +**You should never use the library this way in production, without, at least, a caching mechanism to reduce PSL downloads.** -**Using the PSL to determine what is a valid domain name and what isn't is dangerous, particularly in these days when new gTLDs are arriving at a rapid pace. -The IANA Root Zone Database is the proper source for this information. -Either way, if you must use this library for this purpose, please consider integrating an automatic update mechanism into your software.** +**Using the Public Suffix List to determine what is a valid domain name and what isn't is dangerous, particularly in these days when new gTLDs are arriving at a rapid pace.** +**The DNS is the proper source for this information.** + +**If you are looking to know the validity of a Top Level Domain, the IANA Root Zone Database is the proper source for this information.** + +**If you must use this library for any of the above purposes, please consider integrating an update mechanism into your software.** ## Managing the package databases -The library comes bundle with a **optional** service which enables resolving domain name without the constant network overhead of continuously downloading the remote databases. -The `Pdp\Storage\PsrStorageFactory` enables returning storage instances that retrieve, convert and cache the Public Suffix List as well as the IANA Root Zone Database. +Depending on your software the mechanism to store your database may differ, nevertheless, the library comes bundle with a **optional service** +which enables resolving domain name without the constant network overhead of continuously downloading the remote databases. + +The `Pdp\Storage\PsrStorageFactory` enables returning storage instances that retrieve, convert and cache the Public Suffix List as well as the IANA Root Zone Database using +standard interfaces published by the PHP-FIG to improve its interoperability with any modern PHP codebase. ### Instantiate `Pdp\Storage\PsrStorageFactory` @@ -99,7 +105,6 @@ To work as intended, the `Pdp\Storage\PsrStorageFactory` constructor requires: - a [PSR-16](http://www.php-fig.org/psr/psr-16/) A Cache object to store the rules locally. - a [PSR-18](http://www.php-fig.org/psr/psr-18/) A PSR-18 HTTP Client. -- a [PSR-3](http://www.php-fig.org/psr/psr-3/) A Logger object to log storage usage. When creating a new storage instance you will require: diff --git a/src/Storage/JsonSerializableCache.php b/src/Storage/JsonSerializableCache.php deleted file mode 100644 index 944a753a..00000000 --- a/src/Storage/JsonSerializableCache.php +++ /dev/null @@ -1,25 +0,0 @@ - 'bar']; - } - }; - - self::assertFalse($cache->store('http://www.example.com', $jsonInstance)); - } - - public function testItReturnsAJsonStringIfTheCacheExists(): void - { - $cache = new class() implements CacheInterface { - private array $data = []; - - public function get($key, $default = null) - { - return $this->data[$key] ?? $default; - } - - public function set($key, $value, $ttl = null) - { - $this->data[$key] = $value; - - return true; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; - - $jsonInstance = new class() implements JsonSerializable { - public function jsonSerialize(): array - { - return ['foo' => 'bar']; - } - }; - - $cache = new JsonSerializablePsr16Cache($cache, 'pdp_', 86400); - $cache->store('http://www.example.com', $jsonInstance); - - self::assertEquals('{"foo":"bar"}', $cache->fetch('http://www.example.com')); - } - - public function testItThrowsOnConstructionIfTheTTLIsNotTheCorrectType(): void - { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return null; - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; - - self::expectException(TypeError::class); - - new JsonSerializablePsr16Cache($cache, 'pdp_', []); - } - - public function testItThrowsOnConstructionIfTheTTLStringCanNotBeParsed(): void - { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return null; - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; - - self::expectException(InvalidArgumentException::class); - - new JsonSerializablePsr16Cache($cache, 'pdp_', 'foobar'); - } - - public function testItCanStoreAPublicSuffixListInstance(): void - { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return null; - } - - public function set($key, $value, $ttl = null) - { - return true; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; - - $logger = new class() extends AbstractLogger { - private array $logs = []; - - public function log($level, $message, array $context = []) - { - $replace = []; - foreach ($context as $key => $val) { - $replace['{'.$key.'}'] = $val; - } - - $this->logs[] = strtr($message, $replace); - } - - public function logs(): array - { - return $this->logs; - } - }; - - $jsonInstance = new class() implements JsonSerializable { - public function jsonSerialize(): array - { - return ['foo' => 'bar']; - } - }; - $cache = new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger); - - self::assertTrue($cache->store('http://www.example.com', $jsonInstance)); - self::assertSame('The content associated with: `http://www.example.com` was stored.', $logger->logs()[0]); - } - - public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void - { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return null; - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; - - $logger = new class() extends AbstractLogger { - private array $logs = []; - - public function log($level, $message, array $context = []) - { - $replace = []; - foreach ($context as $key => $val) { - $replace['{'.$key.'}'] = $val; - } - - $this->logs[] = strtr($message, $replace); - } - - public function logs(): array - { - return $this->logs; - } - }; - - $jsonInstance = new class() implements JsonSerializable { - public function jsonSerialize(): array - { - return ['foo' => 'bar']; - } - }; - - $cache = new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateTimeImmutable('+1 DAY'), $logger); - - self::assertFalse($cache->store('http://www.example.com', $jsonInstance)); - self::assertSame('The content associated with: `http://www.example.com` could not be stored.', $logger->logs()[0]); - } - - - public function testItReturnsFalseIfItCantCacheAPublicSuffixListInstance(): void - { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return null; - } - - public function set($key, $value, $ttl = null) - { - throw new class('Something went wrong.', 0) extends RuntimeException implements CacheException { - }; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; - - $logger = new class() extends AbstractLogger { - private array $logs = []; - - public function log($level, $message, array $context = []) - { - $replace = []; - foreach ($context as $key => $val) { - $replace['{'.$key.'}'] = $val; - } - - $this->logs[] = strtr($message, $replace); - } - - public function logs(): array - { - return $this->logs; - } - }; - - $jsonInstance = new class() implements JsonSerializable { - public function jsonSerialize(): array - { - return ['foo' => 'bar']; - } - }; - - $cache = new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger); - - self::assertFalse($cache->store('http://www.example.com', $jsonInstance)); - self::assertSame('The content associated with: `http://www.example.com` could not be cached: Something went wrong.', $logger->logs()[0]); - } -} diff --git a/src/Storage/PsrStorageFactory.php b/src/Storage/PsrStorageFactory.php index 5ac9325e..d60d3230 100644 --- a/src/Storage/PsrStorageFactory.php +++ b/src/Storage/PsrStorageFactory.php @@ -15,7 +15,6 @@ use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestFactoryInterface; -use Psr\Log\LoggerInterface; use Psr\SimpleCache\CacheInterface; final class PsrStorageFactory implements @@ -28,19 +27,15 @@ final class PsrStorageFactory implements private RequestFactoryInterface $requestFactory; private CacheInterface $cache; - - private ?LoggerInterface $logger; - + public function __construct( ClientInterface $client, RequestFactoryInterface $requestFactory, - CacheInterface $cache, - LoggerInterface $logger = null + CacheInterface $cache ) { $this->client = $client; $this->requestFactory = $requestFactory; $this->cache = $cache; - $this->logger = $logger; } /** @@ -50,10 +45,7 @@ public function createPublicSuffixListStorage(string $cachePrefix = '', $cacheTt { return new RulesStorage( new RulesPsr18Client($this->client, $this->requestFactory), - new RulesCache( - new JsonSerializablePsr16Cache($this->cache, $cachePrefix, $cacheTtl, $this->logger), - $this->logger - ) + new RulesPsr16Cache($this->cache, $cachePrefix, $cacheTtl) ); } @@ -64,10 +56,7 @@ public function createRootZoneDatabaseStorage(string $cachePrefix = '', $cacheTt { return new TopLevelDomainsStorage( new TopLevelDomainsPsr18Client($this->client, $this->requestFactory), - new TopLevelDomainsCache( - new JsonSerializablePsr16Cache($this->cache, $cachePrefix, $cacheTtl, $this->logger), - $this->logger - ) + new TopLevelDomainsPsr16Cache($this->cache, $cachePrefix, $cacheTtl) ); } } diff --git a/src/Storage/PublicSuffixListCache.php b/src/Storage/PublicSuffixListCache.php index d7d54bb3..4bf2d950 100644 --- a/src/Storage/PublicSuffixListCache.php +++ b/src/Storage/PublicSuffixListCache.php @@ -36,5 +36,5 @@ public function store(string $uri, PublicSuffixList $publicSuffixList): bool; * * Returns true if the action was successful, false otherwise */ - public function delete(string $uri): bool; + public function forget(string $uri): bool; } diff --git a/src/Storage/RootZoneDatabaseCache.php b/src/Storage/RootZoneDatabaseCache.php index bf64368a..ab388c0a 100644 --- a/src/Storage/RootZoneDatabaseCache.php +++ b/src/Storage/RootZoneDatabaseCache.php @@ -29,12 +29,12 @@ public function fetch(string $uri): ?RootZoneDatabase; * * Returns true if the action was successful, false otherwise */ - public function store(string $uri, RootZoneDatabase $topLevelDomains): bool; + public function store(string $uri, RootZoneDatabase $rootZoneDatabase): bool; /** * Deletes the Root Zone Database entry. * * Returns true if the action was successful, false otherwise */ - public function delete(string $uri): bool; + public function forget(string $uri): bool; } diff --git a/src/Storage/RulesCache.php b/src/Storage/RulesCache.php deleted file mode 100644 index f829290e..00000000 --- a/src/Storage/RulesCache.php +++ /dev/null @@ -1,62 +0,0 @@ -cache = $cache; - $this->logger = $logger ?? new NullLogger(); - } - - public function fetch(string $uri): ?PublicSuffixList - { - $cacheData = $this->cache->fetch($uri); - if (null === $cacheData) { - return null; - } - - try { - $rules = Rules::fromJsonString($cacheData); - } catch (Throwable $exception) { - $this->cache->forget($uri); - $this->logger->error($exception->getMessage()); - - return null; - } - - return $rules; - } - - public function store(string $uri, PublicSuffixList $publicSuffixList): bool - { - return $this->cache->store($uri, $publicSuffixList); - } - - public function delete(string $uri): bool - { - return $this->cache->forget($uri); - } -} diff --git a/src/Storage/JsonSerializablePsr16Cache.php b/src/Storage/RulesPsr16Cache.php similarity index 64% rename from src/Storage/JsonSerializablePsr16Cache.php rename to src/Storage/RulesPsr16Cache.php index 5d2a8b7e..1c95898f 100644 --- a/src/Storage/JsonSerializablePsr16Cache.php +++ b/src/Storage/RulesPsr16Cache.php @@ -17,42 +17,36 @@ use DateTimeImmutable; use DateTimeInterface; use InvalidArgumentException; -use JsonSerializable; -use Psr\Log\LoggerInterface; -use Psr\Log\NullLogger; +use Pdp\PublicSuffixList; +use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; -use Throwable; use TypeError; use function filter_var; use function get_class; use function gettype; use function is_object; use function is_string; -use function json_encode; use function md5; use function sprintf; use function strtolower; use const FILTER_VALIDATE_INT; -final class JsonSerializablePsr16Cache implements JsonSerializableCache +final class RulesPsr16Cache implements PublicSuffixListCache { - private string $cachePrefix; - private CacheInterface $cache; - private LoggerInterface $logger; + private string $cachePrefix; private ?DateInterval $cacheTtl; /** - * @param mixed $cacheTtl the time to live for the given cache + * @param mixed $cacheTtl cache TTL */ - public function __construct(CacheInterface $cache, string $cachePrefix = '', $cacheTtl = null, LoggerInterface $logger = null) + public function __construct(CacheInterface $cache, string $cachePrefix = '', $cacheTtl = null) { $this->cache = $cache; $this->cachePrefix = $cachePrefix; $this->cacheTtl = $this->setTtl($cacheTtl); - $this->logger = $logger ?? new NullLogger(); } /** @@ -95,27 +89,21 @@ private function setTtl($ttl): ?DateInterval return $date; } - public function store(string $key, JsonSerializable $object): bool + public function fetch(string $uri): ?PublicSuffixList { - try { - $result = $this->cache->set($this->cacheKey($key), json_encode($object), $this->cacheTtl); - } catch (Throwable $exception) { - $this->logger->info( - 'The content associated with: `'.$key.'` could not be cached: '.$exception->getMessage(), - ['exception' => $exception] - ); - - return false; + $cacheKey = $this->cacheKey($uri); + $publicSuffixList = $this->cache->get($cacheKey); + if (null === $publicSuffixList) { + return null; } - $message = 'The content associated with: `'.$key.'` was stored.'; - if (!$result) { - $message = 'The content associated with: `'.$key.'` could not be stored.'; - } + if (!$publicSuffixList instanceof PublicSuffixList) { + $this->cache->delete($cacheKey); - $this->logger->info($message); + return null; + } - return $result; + return $publicSuffixList; } /** @@ -126,18 +114,17 @@ private function cacheKey(string $str): string return $this->cachePrefix.md5(strtolower($str)); } - public function fetch(string $key): ?string + public function store(string $uri, PublicSuffixList $publicSuffixList): bool { - return $this->cache->get($this->cacheKey($key)); + try { + return $this->cache->set($this->cacheKey($uri), $publicSuffixList, $this->cacheTtl); + } catch (CacheException $exception) { + return false; + } } - public function forget(string $key): bool + public function forget(string $uri): bool { - $result = $this->cache->delete($this->cacheKey($key)); - if (!$result) { - $this->logger->warning('The content associated with: `'.$key.'` could not be deleted.'); - } - - return $result; + return $this->cache->delete($this->cacheKey($uri)); } } diff --git a/src/Storage/RulesCacheTest.php b/src/Storage/RulesPsr16CacheTest.php similarity index 65% rename from src/Storage/RulesCacheTest.php rename to src/Storage/RulesPsr16CacheTest.php index 7981307f..44f841ab 100644 --- a/src/Storage/RulesCacheTest.php +++ b/src/Storage/RulesPsr16CacheTest.php @@ -15,17 +15,15 @@ use Pdp\Rules; use PHPUnit\Framework\TestCase; -use Psr\Log\AbstractLogger; use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; use RuntimeException; use function dirname; -use function json_encode; /** - * @coversDefaultClass \Pdp\Storage\RulesCache + * @coversDefaultClass \Pdp\Storage\RulesPsr16Cache */ -final class RulesCacheTest extends TestCase +final class RulesPsr16CacheTest extends TestCase { public function testItReturnsNullIfTheCacheDoesNotExists(): void { @@ -70,7 +68,7 @@ public function has($key) } }; - $pslCache = new RulesCache(new JsonSerializablePsr16Cache($cache, 'pdp_', '1 DAY')); + $pslCache = new RulesPsr16Cache($cache, 'pdp_', '1 DAY'); self::assertNull($pslCache->fetch('http://www.example.com')); } @@ -80,7 +78,7 @@ public function testItReturnsAnInstanceIfTheCorrectCacheExists(): void $cache = new class() implements CacheInterface { public function get($key, $default = null) { - return json_encode(Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat')); + return Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); } public function set($key, $value, $ttl = null) @@ -118,7 +116,7 @@ public function has($key) } }; - $pslCache = new RulesCache(new JsonSerializablePsr16Cache($cache, 'pdp_', 86400)); + $pslCache = new RulesPsr16Cache($cache, 'pdp_', 86400); self::assertEquals( Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'), @@ -169,31 +167,8 @@ public function has($key) } }; - $logger = new class() extends AbstractLogger { - private array $logs = []; - - public function log($level, $message, array $context = []) - { - $replace = []; - foreach ($context as $key => $val) { - $replace['{'.$key.'}'] = $val; - } - - $this->logs[] = strtr($message, $replace); - } - - public function logs(): array - { - return $this->logs; - } - }; - - $pslCache = new RulesCache( - new JsonSerializablePsr16Cache($cache, 'pdp_', 86400, $logger), - $logger - ); + $pslCache = new RulesPsr16Cache($cache, 'pdp_', 86400); self::assertNull($pslCache->fetch('http://www.example.com')); - self::assertSame('Failed to JSON decode the string: Syntax error.', $logger->logs()[0]); } public function testItReturnsNullIfTheCacheContentCannotBeConvertedToTheCorrectInstance(): void @@ -239,35 +214,9 @@ public function has($key) } }; - $logger = new class() extends AbstractLogger { - private array $logs = []; - - public function log($level, $message, array $context = []) - { - $replace = []; - foreach ($context as $key => $val) { - $replace['{'.$key.'}'] = $val; - } - - $this->logs[] = strtr($message, $replace); - } - - public function logs(): array - { - return $this->logs; - } - }; - - $pslCache = new RulesCache( - new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateTimeImmutable('+1 DAY'), $logger), - $logger - ); + $pslCache = new RulesPsr16Cache($cache, 'pdp_', new \DateTimeImmutable('+1 DAY')); self::assertNull($pslCache->fetch('http://www.example.com')); - self::assertSame( - 'The public suffix list data are missing one of the required ICANN or PRIVATE domain section.', - $logger->logs()[0] - ); } public function testItCanStoreAPublicSuffixListInstance(): void @@ -313,33 +262,10 @@ public function has($key) } }; - $logger = new class() extends AbstractLogger { - private array $logs = []; - - public function log($level, $message, array $context = []) - { - $replace = []; - foreach ($context as $key => $val) { - $replace['{'.$key.'}'] = $val; - } - - $this->logs[] = strtr($message, $replace); - } - - public function logs(): array - { - return $this->logs; - } - }; - $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new RulesCache( - new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger), - $logger - ); + $pslCache = new RulesPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); self::assertTrue($pslCache->store('http://www.example.com', $psl)); - self::assertSame('The content associated with: `http://www.example.com` was stored.', $logger->logs()[0]); } public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void @@ -385,33 +311,10 @@ public function has($key) } }; - $logger = new class() extends AbstractLogger { - private array $logs = []; - - public function log($level, $message, array $context = []) - { - $replace = []; - foreach ($context as $key => $val) { - $replace['{'.$key.'}'] = $val; - } - - $this->logs[] = strtr($message, $replace); - } - - public function logs(): array - { - return $this->logs; - } - }; - $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new RulesCache( - new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger), - $logger - ); + $pslCache = new RulesPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); self::assertFalse($pslCache->store('http://www.example.com', $psl)); - self::assertSame('The content associated with: `http://www.example.com` could not be stored.', $logger->logs()[0]); } @@ -459,32 +362,9 @@ public function has($key) } }; - $logger = new class() extends AbstractLogger { - private array $logs = []; - - public function log($level, $message, array $context = []) - { - $replace = []; - foreach ($context as $key => $val) { - $replace['{'.$key.'}'] = $val; - } - - $this->logs[] = strtr($message, $replace); - } - - public function logs(): array - { - return $this->logs; - } - }; - $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new RulesCache( - new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger), - $logger - ); + $pslCache = new RulesPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); self::assertFalse($pslCache->store('http://www.example.com', $psl)); - self::assertSame('The content associated with: `http://www.example.com` could not be cached: Something went wrong.', $logger->logs()[0]); } } diff --git a/src/Storage/RulesStorage.php b/src/Storage/RulesStorage.php index a9057616..78f610cd 100644 --- a/src/Storage/RulesStorage.php +++ b/src/Storage/RulesStorage.php @@ -43,6 +43,6 @@ public function get(string $uri): PublicSuffixList public function delete(string $uri): bool { - return $this->cache->delete($uri); + return $this->cache->forget($uri); } } diff --git a/src/Storage/RulesStorageTest.php b/src/Storage/RulesStorageTest.php index 2323fee0..248fe748 100644 --- a/src/Storage/RulesStorageTest.php +++ b/src/Storage/RulesStorageTest.php @@ -36,7 +36,7 @@ public function store(string $uri, PublicSuffixList $publicSuffixList): bool return true; } - public function delete(string $uri): bool + public function forget(string $uri): bool { return true; } @@ -68,7 +68,7 @@ public function store(string $uri, PublicSuffixList $publicSuffixList): bool return true; } - public function delete(string $uri): bool + public function forget(string $uri): bool { return true; } @@ -100,7 +100,7 @@ public function store(string $uri, PublicSuffixList $publicSuffixList): bool return true; } - public function delete(string $uri): bool + public function forget(string $uri): bool { return 'http://www.example.com' === $uri; } diff --git a/src/Storage/TopLevelDomainsCache.php b/src/Storage/TopLevelDomainsCache.php deleted file mode 100644 index b7100390..00000000 --- a/src/Storage/TopLevelDomainsCache.php +++ /dev/null @@ -1,62 +0,0 @@ -cache = $cache; - $this->logger = $logger ?? new NullLogger(); - } - - public function fetch(string $uri): ?RootZoneDatabase - { - $cacheData = $this->cache->fetch($uri); - if (null === $cacheData) { - return null; - } - - try { - $topLevelDomains = TopLevelDomains::fromJsonString($cacheData); - } catch (Throwable $exception) { - $this->cache->forget($uri); - $this->logger->error($exception->getMessage()); - - return null; - } - - return $topLevelDomains; - } - - public function store(string $uri, RootZoneDatabase $topLevelDomains): bool - { - return $this->cache->store($uri, $topLevelDomains); - } - - public function delete(string $uri): bool - { - return $this->cache->forget($uri); - } -} diff --git a/src/Storage/TopLevelDomainsPsr16Cache.php b/src/Storage/TopLevelDomainsPsr16Cache.php new file mode 100644 index 00000000..b91ec02e --- /dev/null +++ b/src/Storage/TopLevelDomainsPsr16Cache.php @@ -0,0 +1,130 @@ +cache = $cache; + $this->cachePrefix = $cachePrefix; + $this->cacheTtl = $this->setTtl($cacheTtl); + } + + /** + * Set the cache TTL. + * + * @param mixed $ttl the cache TTL + * + * @throws TypeError if the value type is not recognized + */ + private function setTtl($ttl): ?DateInterval + { + if ($ttl instanceof DateInterval || null === $ttl) { + return $ttl; + } + + if ($ttl instanceof DateTimeInterface) { + return (new DateTimeImmutable('NOW', $ttl->getTimezone()))->diff($ttl); + } + + if (false !== ($res = filter_var($ttl, FILTER_VALIDATE_INT))) { + return new DateInterval('PT'.$res.'S'); + } + + if (!is_string($ttl)) { + throw new TypeError(sprintf( + 'The ttl must null, an integer, a string a DateTimeInterface or a DateInterval object %s given.', + is_object($ttl) ? get_class($ttl) : gettype($ttl) + )); + } + + /** @var DateInterval|false $date */ + $date = @DateInterval::createFromDateString($ttl); + if (!$date instanceof DateInterval) { + throw new InvalidArgumentException(sprintf( + 'The ttl value "%s" can not be parsable by `DateInterval::createFromDateString`.', + $ttl + )); + } + + return $date; + } + + public function fetch(string $uri): ?RootZoneDatabase + { + $cacheKey = $this->cacheKey($uri); + $rootZoneDatabase = $this->cache->get($cacheKey); + if (null === $rootZoneDatabase) { + return null; + } + + if (!$rootZoneDatabase instanceof RootZoneDatabase) { + $this->cache->delete($cacheKey); + + return null; + } + + return $rootZoneDatabase; + } + + /** + * Returns the cache key according to the source URL. + */ + private function cacheKey(string $str): string + { + return $this->cachePrefix.md5(strtolower($str)); + } + + public function store(string $uri, RootZoneDatabase $rootZoneDatabase): bool + { + try { + return $this->cache->set($this->cacheKey($uri), $rootZoneDatabase, $this->cacheTtl); + } catch (CacheException $exception) { + return false; + } + } + + public function forget(string $uri): bool + { + return $this->cache->delete($this->cacheKey($uri)); + } +} diff --git a/src/Storage/TopLevelDomainsCacheTest.php b/src/Storage/TopLevelDomainsPsr16CacheTest.php similarity index 65% rename from src/Storage/TopLevelDomainsCacheTest.php rename to src/Storage/TopLevelDomainsPsr16CacheTest.php index 58db356a..57ac06f2 100644 --- a/src/Storage/TopLevelDomainsCacheTest.php +++ b/src/Storage/TopLevelDomainsPsr16CacheTest.php @@ -15,17 +15,15 @@ use Pdp\TopLevelDomains; use PHPUnit\Framework\TestCase; -use Psr\Log\AbstractLogger; use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; use RuntimeException; use function dirname; -use function json_encode; /** - * @coversDefaultClass \Pdp\Storage\TopLevelDomainsCache + * @coversDefaultClass \Pdp\Storage\TopLevelDomainsPsr16Cache */ -final class TopLevelDomainsCacheTest extends TestCase +final class TopLevelDomainsPsr16CacheTest extends TestCase { public function testItReturnsNullIfTheCacheDoesNotExists(): void { @@ -70,7 +68,7 @@ public function has($key) } }; - $cache = new TopLevelDomainsCache(new JsonSerializablePsr16Cache($cache, 'pdp_', '1 DAY')); + $cache = new TopLevelDomainsPsr16Cache($cache, 'pdp_', '1 DAY'); self::assertNull($cache->fetch('http://www.example.com')); } @@ -80,7 +78,7 @@ public function testItReturnsAnInstanceIfTheCorrectCacheExists(): void $cache = new class() implements CacheInterface { public function get($key, $default = null) { - return json_encode(TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt')); + return TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); } public function set($key, $value, $ttl = null) @@ -118,7 +116,7 @@ public function has($key) } }; - $cache = new TopLevelDomainsCache(new JsonSerializablePsr16Cache($cache, 'pdp_', 86400)); + $cache = new TopLevelDomainsPsr16Cache($cache, 'pdp_', 86400); self::assertEquals( TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'), @@ -169,32 +167,9 @@ public function has($key) } }; - $logger = new class() extends AbstractLogger { - private array $logs = []; - - public function log($level, $message, array $context = []) - { - $replace = []; - foreach ($context as $key => $val) { - $replace['{'.$key.'}'] = $val; - } - - $this->logs[] = strtr($message, $replace); - } - - public function logs(): array - { - return $this->logs; - } - }; - - $cache = new TopLevelDomainsCache( - new JsonSerializablePsr16Cache($cache, 'pdp_', 86400, $logger), - $logger - ); + $cache = new TopLevelDomainsPsr16Cache($cache, 'pdp_', 86400); self::assertNull($cache->fetch('http://www.example.com')); - self::assertSame('Failed to JSON decode the string: Syntax error.', $logger->logs()[0]); } public function testItReturnsNullIfTheCacheContentCannotBeConvertedToTheCorrectInstance(): void @@ -240,34 +215,8 @@ public function has($key) } }; - $logger = new class() extends AbstractLogger { - private array $logs = []; - - public function log($level, $message, array $context = []) - { - $replace = []; - foreach ($context as $key => $val) { - $replace['{'.$key.'}'] = $val; - } - - $this->logs[] = strtr($message, $replace); - } - - public function logs(): array - { - return $this->logs; - } - }; - - $cache = new TopLevelDomainsCache( - new JsonSerializablePsr16Cache($cache, 'pdp_', 86400, $logger), - $logger - ); + $cache = new TopLevelDomainsPsr16Cache($cache, 'pdp_', 86400); self::assertNull($cache->fetch('http://www.example.com')); - self::assertSame( - 'The decoded hashmap structure is missing at least one of the required properties: `records`, `version` and/or `modifiedDate`.', - $logger->logs()[0] - ); } public function testItCanStoreAPublicSuffixListInstance(): void @@ -313,33 +262,10 @@ public function has($key) } }; - $logger = new class() extends AbstractLogger { - private array $logs = []; - - public function log($level, $message, array $context = []) - { - $replace = []; - foreach ($context as $key => $val) { - $replace['{'.$key.'}'] = $val; - } - - $this->logs[] = strtr($message, $replace); - } - - public function logs(): array - { - return $this->logs; - } - }; - $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $cache = new TopLevelDomainsCache( - new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger), - $logger - ); + $cache = new TopLevelDomainsPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); self::assertTrue($cache->store('http://www.example.com', $rzd)); - self::assertSame('The content associated with: `http://www.example.com` was stored.', $logger->logs()[0]); } public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void @@ -385,33 +311,10 @@ public function has($key) } }; - $logger = new class() extends AbstractLogger { - private array $logs = []; - - public function log($level, $message, array $context = []) - { - $replace = []; - foreach ($context as $key => $val) { - $replace['{'.$key.'}'] = $val; - } - - $this->logs[] = strtr($message, $replace); - } - - public function logs(): array - { - return $this->logs; - } - }; - $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $cache = new TopLevelDomainsCache( - new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger), - $logger - ); + $cache = new TopLevelDomainsPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); self::assertFalse($cache->store('http://www.example.com', $rzd)); - self::assertSame('The content associated with: `http://www.example.com` could not be stored.', $logger->logs()[0]); } @@ -459,32 +362,9 @@ public function has($key) } }; - $logger = new class() extends AbstractLogger { - private array $logs = []; - - public function log($level, $message, array $context = []) - { - $replace = []; - foreach ($context as $key => $val) { - $replace['{'.$key.'}'] = $val; - } - - $this->logs[] = strtr($message, $replace); - } - - public function logs(): array - { - return $this->logs; - } - }; - $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $cache = new TopLevelDomainsCache( - new JsonSerializablePsr16Cache($cache, 'pdp_', new \DateInterval('P1D'), $logger), - $logger - ); + $cache = new TopLevelDomainsPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); self::assertFalse($cache->store('http://www.example.com', $rzd)); - self::assertSame('The content associated with: `http://www.example.com` could not be cached: Something went wrong.', $logger->logs()[0]); } } diff --git a/src/Storage/TopLevelDomainsStorage.php b/src/Storage/TopLevelDomainsStorage.php index 1e0acb2f..2a422b9b 100644 --- a/src/Storage/TopLevelDomainsStorage.php +++ b/src/Storage/TopLevelDomainsStorage.php @@ -43,6 +43,6 @@ public function get(string $uri): RootZoneDatabase public function delete(string $uri): bool { - return $this->cache->delete($uri); + return $this->cache->forget($uri); } } diff --git a/src/Storage/TopLevelDomainsStorageTest.php b/src/Storage/TopLevelDomainsStorageTest.php index 44cf9e45..23c147d3 100644 --- a/src/Storage/TopLevelDomainsStorageTest.php +++ b/src/Storage/TopLevelDomainsStorageTest.php @@ -31,12 +31,12 @@ public function fetch(string $uri): ?RootZoneDatabase return TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); } - public function store(string $uri, RootZoneDatabase $topLevelDomains): bool + public function store(string $uri, RootZoneDatabase $rootZoneDatabase): bool { return true; } - public function delete(string $uri): bool + public function forget(string $uri): bool { return true; } @@ -67,7 +67,7 @@ public function store(string $uri, RootZoneDatabase $publicSuffixList): bool return true; } - public function delete(string $uri): bool + public function forget(string $uri): bool { return true; } From d49e62efbf2a45599e91c73dad7abcb8a96071fa Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 1 Oct 2020 21:14:52 +0200 Subject: [PATCH 271/461] Remove PSR-3 depedency from composer --- composer.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/composer.json b/composer.json index f71a00e4..a4d1395b 100644 --- a/composer.json +++ b/composer.json @@ -44,7 +44,6 @@ "phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan-strict-rules": "^0.12", "phpunit/phpunit": "^9.3", - "psr/log": "^1.1", "psr/simple-cache": "^1.0.1", "guzzlehttp/guzzle": "^7.0.0", "guzzlehttp/psr7": "^1.6.0", @@ -54,7 +53,6 @@ "suggest": { "psr/http-client-implementation": "To use the storage functionnality which depends on PSR-18", "psr/http-factory": "To use the storage functionnality which depends on PSR-17", - "psr/log-implementation": "To use the storage functionnality which depends on PSR-3", "psr/simple-cache-implementation": "To use the storage functionnality which depends on PSR-16", "league/uri": "To parse URL and validate host" }, From 92ea718893d38ded57e4602fd05b0740f113944e Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 1 Oct 2020 21:21:47 +0200 Subject: [PATCH 272/461] Normalize URL constant names --- README.md | 4 ++-- src/Storage/RemoteStorageURL.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 79d853ce..3dcb2a6a 100644 --- a/README.md +++ b/README.md @@ -156,8 +156,8 @@ $factory = new PsrStorageFactory(new Client(), $requestFactory, $cache); $pslStorage = $factory->createPublicSuffixListStorage($cachePrefix, $cacheTtl); $rzdStorage = $factory->createRootZoneDatabaseStorage($cachePrefix, $cacheTtl); -$rules = $pslStorage->get(PsrStorageFactory::PSL_URL); -$tldDomains = $rzdStorage->get(PsrStorageFactory::RZD_URL); +$rules = $pslStorage->get(PsrStorageFactory::URL_PSL); +$tldDomains = $rzdStorage->get(PsrStorageFactory::URL_RZD); ~~~ ### Automatic Updates diff --git a/src/Storage/RemoteStorageURL.php b/src/Storage/RemoteStorageURL.php index 73c8971b..b4aab646 100644 --- a/src/Storage/RemoteStorageURL.php +++ b/src/Storage/RemoteStorageURL.php @@ -15,7 +15,7 @@ interface RemoteStorageURL { - public const PSL_URL = 'https://publicsuffix.org/list/public_suffix_list.dat'; + public const URL_PSL = 'https://publicsuffix.org/list/public_suffix_list.dat'; - public const RZD_URL = 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt'; + public const URL_RZD = 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt'; } From 277efdef7b5a30359fc861c2d79d3d086a9a1219 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 1 Oct 2020 21:44:37 +0200 Subject: [PATCH 273/461] Update Storage class constructor signature --- README.md | 3 ++- src/Storage/PsrStorageFactory.php | 21 +++++++++------------ src/Storage/RulesStorage.php | 8 ++++---- src/Storage/RulesStorageTest.php | 6 +++--- src/Storage/TopLevelDomainsStorage.php | 10 +++++----- src/Storage/TopLevelDomainsStorageTest.php | 4 ++-- 6 files changed, 25 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 3dcb2a6a..7877750b 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,7 @@ use Symfony\Component\Cache\Adapter\FilesystemAdapter; use Symfony\Component\Cache\Psr16Cache; $cache = new Psr16Cache(new FilesystemAdapter('pdp', 3600, __DIR__.'/data')); +$client = new Client(); $requestFactory = new class implements RequestFactoryInterface { public function createRequest(string $method, $uri): RequestInterface { @@ -152,7 +153,7 @@ $requestFactory = new class implements RequestFactoryInterface { $cachePrefix = 'pdp_'; $cacheTtl = new DateInterval('P1D'); -$factory = new PsrStorageFactory(new Client(), $requestFactory, $cache); +$factory = new PsrStorageFactory($cache, $client, $requestFactory); $pslStorage = $factory->createPublicSuffixListStorage($cachePrefix, $cacheTtl); $rzdStorage = $factory->createRootZoneDatabaseStorage($cachePrefix, $cacheTtl); diff --git a/src/Storage/PsrStorageFactory.php b/src/Storage/PsrStorageFactory.php index d60d3230..e386fa31 100644 --- a/src/Storage/PsrStorageFactory.php +++ b/src/Storage/PsrStorageFactory.php @@ -22,20 +22,17 @@ final class PsrStorageFactory implements PublicSuffixListStorageFactory, RootZoneDatabaseStorageFactory { + private CacheInterface $cache; + private ClientInterface $client; private RequestFactoryInterface $requestFactory; - private CacheInterface $cache; - - public function __construct( - ClientInterface $client, - RequestFactoryInterface $requestFactory, - CacheInterface $cache - ) { + public function __construct(CacheInterface $cache, ClientInterface $client, RequestFactoryInterface $requestFactory) + { + $this->cache = $cache; $this->client = $client; $this->requestFactory = $requestFactory; - $this->cache = $cache; } /** @@ -44,8 +41,8 @@ public function __construct( public function createPublicSuffixListStorage(string $cachePrefix = '', $cacheTtl = null): PublicSuffixListStorage { return new RulesStorage( - new RulesPsr18Client($this->client, $this->requestFactory), - new RulesPsr16Cache($this->cache, $cachePrefix, $cacheTtl) + new RulesPsr16Cache($this->cache, $cachePrefix, $cacheTtl), + new RulesPsr18Client($this->client, $this->requestFactory) ); } @@ -55,8 +52,8 @@ public function createPublicSuffixListStorage(string $cachePrefix = '', $cacheTt public function createRootZoneDatabaseStorage(string $cachePrefix = '', $cacheTtl = null): RootZoneDatabaseStorage { return new TopLevelDomainsStorage( - new TopLevelDomainsPsr18Client($this->client, $this->requestFactory), - new TopLevelDomainsPsr16Cache($this->cache, $cachePrefix, $cacheTtl) + new TopLevelDomainsPsr16Cache($this->cache, $cachePrefix, $cacheTtl), + new TopLevelDomainsPsr18Client($this->client, $this->requestFactory) ); } } diff --git a/src/Storage/RulesStorage.php b/src/Storage/RulesStorage.php index 78f610cd..18fb5daa 100644 --- a/src/Storage/RulesStorage.php +++ b/src/Storage/RulesStorage.php @@ -17,14 +17,14 @@ final class RulesStorage implements PublicSuffixListStorage { - private PublicSuffixListClient $client; - private PublicSuffixListCache $cache; - public function __construct(PublicSuffixListClient $client, PublicSuffixListCache $cache) + private PublicSuffixListClient $client; + + public function __construct(PublicSuffixListCache $cache, PublicSuffixListClient $client) { - $this->client = $client; $this->cache = $cache; + $this->client = $client; } public function get(string $uri): PublicSuffixList diff --git a/src/Storage/RulesStorageTest.php b/src/Storage/RulesStorageTest.php index 248fe748..d34c5713 100644 --- a/src/Storage/RulesStorageTest.php +++ b/src/Storage/RulesStorageTest.php @@ -49,7 +49,7 @@ public function get(string $uri): PublicSuffixList } }; - $storage = new RulesStorage($client, $cache); + $storage = new RulesStorage($cache, $client); $psl = $storage->get('http://www.example.com'); self::assertInstanceOf(Rules::class, $psl); @@ -81,7 +81,7 @@ public function get(string $uri): PublicSuffixList } }; - $storage = new RulesStorage($client, $cache); + $storage = new RulesStorage($cache, $client); $psl = $storage->get('http://www.example.com'); self::assertInstanceOf(Rules::class, $psl); @@ -113,7 +113,7 @@ public function get(string $uri): PublicSuffixList } }; - $storage = new RulesStorage($client, $cache); + $storage = new RulesStorage($cache, $client); $storage->get('http://www.example.com'); self::assertTrue($storage->delete('http://www.example.com')); diff --git a/src/Storage/TopLevelDomainsStorage.php b/src/Storage/TopLevelDomainsStorage.php index 2a422b9b..d9ea09fe 100644 --- a/src/Storage/TopLevelDomainsStorage.php +++ b/src/Storage/TopLevelDomainsStorage.php @@ -17,14 +17,14 @@ final class TopLevelDomainsStorage implements RootZoneDatabaseStorage { - private RootZoneDatabaseClient $repository; - private RootZoneDatabaseCache $cache; - public function __construct(RootZoneDatabaseClient $repository, RootZoneDatabaseCache $cache) + private RootZoneDatabaseClient $client; + + public function __construct(RootZoneDatabaseCache $cache, RootZoneDatabaseClient $client) { - $this->repository = $repository; $this->cache = $cache; + $this->client = $client; } public function get(string $uri): RootZoneDatabase @@ -34,7 +34,7 @@ public function get(string $uri): RootZoneDatabase return $rootZoneDatabase; } - $rootZoneDatabase = $this->repository->get($uri); + $rootZoneDatabase = $this->client->get($uri); $this->cache->store($uri, $rootZoneDatabase); diff --git a/src/Storage/TopLevelDomainsStorageTest.php b/src/Storage/TopLevelDomainsStorageTest.php index 23c147d3..7de67719 100644 --- a/src/Storage/TopLevelDomainsStorageTest.php +++ b/src/Storage/TopLevelDomainsStorageTest.php @@ -49,7 +49,7 @@ public function get(string $uri): RootZoneDatabase } }; - $storage = new TopLevelDomainsStorage($client, $cache); + $storage = new TopLevelDomainsStorage($cache, $client); self::assertInstanceOf(TopLevelDomains::class, $storage->get('http://www.example.com')); } @@ -80,7 +80,7 @@ public function get(string $uri): RootZoneDatabase } }; - $storage = new TopLevelDomainsStorage($client, $cache); + $storage = new TopLevelDomainsStorage($cache, $client); self::assertInstanceOf(TopLevelDomains::class, $storage->get('http://www.example.com')); } From 6a64b510fe01d600c0b3cdd69d97cce3d1b393ef Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Fri, 2 Oct 2020 16:39:54 +0200 Subject: [PATCH 274/461] Simplify naming classes --- src/Storage/PsrStorageFactory.php | 17 +++------- src/Storage/PublicSuffixListCache.php | 11 +------ src/Storage/PublicSuffixListClient.php | 9 ----- ...che.php => PublicSuffixListPsr16Cache.php} | 13 ++------ ...php => PublicSuffixListPsr16CacheTest.php} | 33 +++++++------------ ...nt.php => PublicSuffixListPsr18Client.php} | 11 +------ ...hp => PublicSuffixListPsr18ClientTest.php} | 19 +++-------- src/Storage/PublicSuffixListStorage.php | 9 ----- .../PublicSuffixListStorageFactory.php | 9 ----- src/Storage/RemoteStorageURL.php | 9 ----- src/Storage/RootZoneDatabaseCache.php | 11 +------ src/Storage/RootZoneDatabaseClient.php | 9 ----- ...che.php => RootZoneDatabasePsr16Cache.php} | 13 ++------ ...php => RootZoneDatabasePsr16CacheTest.php} | 33 +++++++------------ ...nt.php => RootZoneDatabasePsr18Client.php} | 11 +------ ...hp => RootZoneDatabasePsr18ClientTest.php} | 19 +++-------- src/Storage/RootZoneDatabaseStorage.php | 9 ----- .../RootZoneDatabaseStorageFactory.php | 8 ----- src/Storage/RulesStorage.php | 11 +------ src/Storage/RulesStorageTest.php | 11 +------ src/Storage/TopLevelDomainsStorage.php | 11 +------ src/Storage/TopLevelDomainsStorageTest.php | 11 +------ 22 files changed, 50 insertions(+), 247 deletions(-) rename src/Storage/{RulesPsr16Cache.php => PublicSuffixListPsr16Cache.php} (87%) rename src/Storage/{RulesPsr16CacheTest.php => PublicSuffixListPsr16CacheTest.php} (87%) rename src/Storage/{RulesPsr18Client.php => PublicSuffixListPsr18Client.php} (76%) rename src/Storage/{RulesPsr18ClientTest.php => PublicSuffixListPsr18ClientTest.php} (83%) rename src/Storage/{TopLevelDomainsPsr16Cache.php => RootZoneDatabasePsr16Cache.php} (87%) rename src/Storage/{TopLevelDomainsPsr16CacheTest.php => RootZoneDatabasePsr16CacheTest.php} (87%) rename src/Storage/{TopLevelDomainsPsr18Client.php => RootZoneDatabasePsr18Client.php} (75%) rename src/Storage/{TopLevelDomainsPsr18ClientTest.php => RootZoneDatabasePsr18ClientTest.php} (82%) diff --git a/src/Storage/PsrStorageFactory.php b/src/Storage/PsrStorageFactory.php index e386fa31..136ad571 100644 --- a/src/Storage/PsrStorageFactory.php +++ b/src/Storage/PsrStorageFactory.php @@ -1,14 +1,5 @@ cache, $cachePrefix, $cacheTtl), - new RulesPsr18Client($this->client, $this->requestFactory) + new PublicSuffixListPsr16Cache($this->cache, $cachePrefix, $cacheTtl), + new PublicSuffixListPsr18Client($this->client, $this->requestFactory) ); } @@ -52,8 +43,8 @@ public function createPublicSuffixListStorage(string $cachePrefix = '', $cacheTt public function createRootZoneDatabaseStorage(string $cachePrefix = '', $cacheTtl = null): RootZoneDatabaseStorage { return new TopLevelDomainsStorage( - new TopLevelDomainsPsr16Cache($this->cache, $cachePrefix, $cacheTtl), - new TopLevelDomainsPsr18Client($this->client, $this->requestFactory) + new RootZoneDatabasePsr16Cache($this->cache, $cachePrefix, $cacheTtl), + new RootZoneDatabasePsr18Client($this->client, $this->requestFactory) ); } } diff --git a/src/Storage/PublicSuffixListCache.php b/src/Storage/PublicSuffixListCache.php index 4bf2d950..e5525611 100644 --- a/src/Storage/PublicSuffixListCache.php +++ b/src/Storage/PublicSuffixListCache.php @@ -1,14 +1,5 @@ cachePrefix.md5(strtolower($str)); } - public function store(string $uri, PublicSuffixList $publicSuffixList): bool + public function remember(string $uri, PublicSuffixList $publicSuffixList): bool { try { return $this->cache->set($this->cacheKey($uri), $publicSuffixList, $this->cacheTtl); diff --git a/src/Storage/RulesPsr16CacheTest.php b/src/Storage/PublicSuffixListPsr16CacheTest.php similarity index 87% rename from src/Storage/RulesPsr16CacheTest.php rename to src/Storage/PublicSuffixListPsr16CacheTest.php index 44f841ab..08ba0d38 100644 --- a/src/Storage/RulesPsr16CacheTest.php +++ b/src/Storage/PublicSuffixListPsr16CacheTest.php @@ -1,14 +1,5 @@ fetch('http://www.example.com')); } @@ -116,7 +107,7 @@ public function has($key) } }; - $pslCache = new RulesPsr16Cache($cache, 'pdp_', 86400); + $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', 86400); self::assertEquals( Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'), @@ -167,7 +158,7 @@ public function has($key) } }; - $pslCache = new RulesPsr16Cache($cache, 'pdp_', 86400); + $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', 86400); self::assertNull($pslCache->fetch('http://www.example.com')); } @@ -214,7 +205,7 @@ public function has($key) } }; - $pslCache = new RulesPsr16Cache($cache, 'pdp_', new \DateTimeImmutable('+1 DAY')); + $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new \DateTimeImmutable('+1 DAY')); self::assertNull($pslCache->fetch('http://www.example.com')); } @@ -263,9 +254,9 @@ public function has($key) }; $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new RulesPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); - self::assertTrue($pslCache->store('http://www.example.com', $psl)); + self::assertTrue($pslCache->remember('http://www.example.com', $psl)); } public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void @@ -312,9 +303,9 @@ public function has($key) }; $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new RulesPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); - self::assertFalse($pslCache->store('http://www.example.com', $psl)); + self::assertFalse($pslCache->remember('http://www.example.com', $psl)); } @@ -363,8 +354,8 @@ public function has($key) }; $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new RulesPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); - self::assertFalse($pslCache->store('http://www.example.com', $psl)); + self::assertFalse($pslCache->remember('http://www.example.com', $psl)); } } diff --git a/src/Storage/RulesPsr18Client.php b/src/Storage/PublicSuffixListPsr18Client.php similarity index 76% rename from src/Storage/RulesPsr18Client.php rename to src/Storage/PublicSuffixListPsr18Client.php index b8e24bb5..ae41b748 100644 --- a/src/Storage/RulesPsr18Client.php +++ b/src/Storage/PublicSuffixListPsr18Client.php @@ -1,14 +1,5 @@ get('http://www.example.com'); self::assertInstanceOf(Rules::class, $psl); @@ -74,7 +65,7 @@ public function createRequest(string $method, $uri): RequestInterface self::expectException(UnableToLoadPublicSuffixList::class); self::expectExceptionMessage('Could not access the Public Suffix List URI: `http://www.example.com`.'); - $storage = new RulesPsr18Client($client, $requestFactory); + $storage = new PublicSuffixListPsr18Client($client, $requestFactory); $storage->get('http://www.example.com'); } @@ -98,7 +89,7 @@ public function createRequest(string $method, $uri): RequestInterface self::expectExceptionMessage('Invalid response from Public Suffix List URI: `http://www.example.com`.'); self::expectExceptionCode(404); - $storage = new RulesPsr18Client($client, $requestFactory); + $storage = new PublicSuffixListPsr18Client($client, $requestFactory); $storage->get('http://www.example.com'); } } diff --git a/src/Storage/PublicSuffixListStorage.php b/src/Storage/PublicSuffixListStorage.php index 4db13c35..dcb2337a 100644 --- a/src/Storage/PublicSuffixListStorage.php +++ b/src/Storage/PublicSuffixListStorage.php @@ -1,14 +1,5 @@ cachePrefix.md5(strtolower($str)); } - public function store(string $uri, RootZoneDatabase $rootZoneDatabase): bool + public function remember(string $uri, RootZoneDatabase $rootZoneDatabase): bool { try { return $this->cache->set($this->cacheKey($uri), $rootZoneDatabase, $this->cacheTtl); diff --git a/src/Storage/TopLevelDomainsPsr16CacheTest.php b/src/Storage/RootZoneDatabasePsr16CacheTest.php similarity index 87% rename from src/Storage/TopLevelDomainsPsr16CacheTest.php rename to src/Storage/RootZoneDatabasePsr16CacheTest.php index 57ac06f2..fd0fd5d9 100644 --- a/src/Storage/TopLevelDomainsPsr16CacheTest.php +++ b/src/Storage/RootZoneDatabasePsr16CacheTest.php @@ -1,14 +1,5 @@ fetch('http://www.example.com')); } @@ -116,7 +107,7 @@ public function has($key) } }; - $cache = new TopLevelDomainsPsr16Cache($cache, 'pdp_', 86400); + $cache = new RootZoneDatabasePsr16Cache($cache, 'pdp_', 86400); self::assertEquals( TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'), @@ -167,7 +158,7 @@ public function has($key) } }; - $cache = new TopLevelDomainsPsr16Cache($cache, 'pdp_', 86400); + $cache = new RootZoneDatabasePsr16Cache($cache, 'pdp_', 86400); self::assertNull($cache->fetch('http://www.example.com')); } @@ -215,7 +206,7 @@ public function has($key) } }; - $cache = new TopLevelDomainsPsr16Cache($cache, 'pdp_', 86400); + $cache = new RootZoneDatabasePsr16Cache($cache, 'pdp_', 86400); self::assertNull($cache->fetch('http://www.example.com')); } @@ -263,9 +254,9 @@ public function has($key) }; $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $cache = new TopLevelDomainsPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + $cache = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); - self::assertTrue($cache->store('http://www.example.com', $rzd)); + self::assertTrue($cache->remember('http://www.example.com', $rzd)); } public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void @@ -312,9 +303,9 @@ public function has($key) }; $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $cache = new TopLevelDomainsPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + $cache = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); - self::assertFalse($cache->store('http://www.example.com', $rzd)); + self::assertFalse($cache->remember('http://www.example.com', $rzd)); } @@ -363,8 +354,8 @@ public function has($key) }; $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $cache = new TopLevelDomainsPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + $cache = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); - self::assertFalse($cache->store('http://www.example.com', $rzd)); + self::assertFalse($cache->remember('http://www.example.com', $rzd)); } } diff --git a/src/Storage/TopLevelDomainsPsr18Client.php b/src/Storage/RootZoneDatabasePsr18Client.php similarity index 75% rename from src/Storage/TopLevelDomainsPsr18Client.php rename to src/Storage/RootZoneDatabasePsr18Client.php index 0cdd3ec0..ed8c1d54 100644 --- a/src/Storage/TopLevelDomainsPsr18Client.php +++ b/src/Storage/RootZoneDatabasePsr18Client.php @@ -1,14 +1,5 @@ get('http://www.example.com'); self::assertInstanceOf(TopLevelDomains::class, $rzd); @@ -75,7 +66,7 @@ public function createRequest(string $method, $uri): RequestInterface self::expectException(UnableToLoadRootZoneDatabase::class); self::expectExceptionMessage('Could not access the Root Zone Database URI: `http://www.example.com`.'); - $storage = new TopLevelDomainsPsr18Client($client, $requestFactory); + $storage = new RootZoneDatabasePsr18Client($client, $requestFactory); $storage->get('http://www.example.com'); } @@ -99,7 +90,7 @@ public function createRequest(string $method, $uri): RequestInterface self::expectExceptionMessage('Invalid response from Root Zone Database URI: `http://www.example.com`.'); self::expectExceptionCode(404); - $storage = new TopLevelDomainsPsr18Client($client, $requestFactory); + $storage = new RootZoneDatabasePsr18Client($client, $requestFactory); $storage->get('http://www.example.com'); } } diff --git a/src/Storage/RootZoneDatabaseStorage.php b/src/Storage/RootZoneDatabaseStorage.php index f7a5de12..71ec2379 100644 --- a/src/Storage/RootZoneDatabaseStorage.php +++ b/src/Storage/RootZoneDatabaseStorage.php @@ -1,14 +1,5 @@ client->get($uri); - $this->cache->store($uri, $publicSuffixList); + $this->cache->remember($uri, $publicSuffixList); return $publicSuffixList; } diff --git a/src/Storage/RulesStorageTest.php b/src/Storage/RulesStorageTest.php index d34c5713..b3505bb2 100644 --- a/src/Storage/RulesStorageTest.php +++ b/src/Storage/RulesStorageTest.php @@ -1,14 +1,5 @@ client->get($uri); - $this->cache->store($uri, $rootZoneDatabase); + $this->cache->remember($uri, $rootZoneDatabase); return $rootZoneDatabase; } diff --git a/src/Storage/TopLevelDomainsStorageTest.php b/src/Storage/TopLevelDomainsStorageTest.php index 7de67719..8abee5e2 100644 --- a/src/Storage/TopLevelDomainsStorageTest.php +++ b/src/Storage/TopLevelDomainsStorageTest.php @@ -1,14 +1,5 @@ Date: Fri, 2 Oct 2020 16:40:03 +0200 Subject: [PATCH 275/461] Remove headers --- .php_cs | 15 --------------- src/Domain.php | 9 --------- src/DomainName.php | 9 --------- src/DomainNameParser.php | 9 --------- src/DomainResolver.php | 9 --------- src/DomainTest.php | 9 --------- src/EffectiveTLD.php | 9 --------- src/ExceptionInterface.php | 9 --------- src/ExternalDomainName.php | 9 --------- src/Host.php | 9 --------- src/IDNConversion.php | 9 --------- src/InvalidDomainName.php | 9 --------- src/InvalidHost.php | 9 --------- src/PublicSuffix.php | 9 --------- src/PublicSuffixList.php | 9 --------- src/PublicSuffixListConverter.php | 9 --------- src/PublicSuffixListConverterTest.php | 9 --------- src/PublicSuffixTest.php | 9 --------- src/ResolvedDomain.php | 9 --------- src/ResolvedDomainName.php | 9 --------- src/ResolvedDomainTest.php | 9 --------- src/RootZoneDatabase.php | 9 --------- src/RootZoneDatabaseConverter.php | 9 --------- src/RootZoneDatabaseConverterTest.php | 9 --------- src/Rules.php | 9 --------- src/RulesTest.php | 9 --------- src/Storage/RulesStorageTest.php | 4 ++-- src/Storage/TopLevelDomainsStorageTest.php | 2 +- src/TopLevelDomains.php | 9 --------- src/TopLevelDomainsTest.php | 9 --------- src/UnableToLoadPublicSuffixList.php | 9 --------- src/UnableToLoadRootZoneDatabase.php | 9 --------- src/UnableToResolveDomain.php | 9 --------- 33 files changed, 3 insertions(+), 288 deletions(-) diff --git a/.php_cs b/.php_cs index 724a2247..ff29a34d 100644 --- a/.php_cs +++ b/.php_cs @@ -1,14 +1,5 @@ in(__DIR__.'/src') ; @@ -18,12 +9,6 @@ return PhpCsFixer\Config::create() '@PSR2' => true, 'array_syntax' => ['syntax' => 'short'], 'concat_space' => ['spacing' => 'none'], - 'header_comment' => [ - 'commentType' => 'PHPDoc', - 'header' => $header, - 'location' => 'after_open', - 'separate' => 'both', - ], 'new_with_braces' => true, 'no_blank_lines_after_phpdoc' => true, 'no_empty_phpdoc' => true, diff --git a/src/Domain.php b/src/Domain.php index a8f46080..6977b9d2 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -1,14 +1,5 @@ Date: Wed, 21 Oct 2020 20:47:16 +0200 Subject: [PATCH 276/461] Adding PHP8 support to v5 using @szepeviktor fix --- .travis.yml | 7 ++++++- composer.json | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index fbd4839b..9866f68a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,9 +44,14 @@ matrix: - php: nightly env: - COLLECT_COVERAGE=false - - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source --ignore-platform-reqs" + - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source" - RUN_PHPSTAN=false - VALIDATE_CODING_STYLE=false + install: + - composer remove --no-interaction --no-update --dev "friendsofphp/php-cs-fixer" + - travis_retry composer require $COMPOSER_ARGS --no-update --dev "composer/composer:2.0.x-dev" + - travis_retry composer require $COMPOSER_ARGS --no-update --dev "phpunit/phpunit:^9.3.11" + - travis_retry composer update $COMPOSER_ARGS allow_failures: - php: nightly fast_finish: true diff --git a/composer.json b/composer.json index eaaacee7..b0641ade 100644 --- a/composer.json +++ b/composer.json @@ -43,9 +43,9 @@ "psl" ], "require": { - "php": "^7.2.5", "ext-intl": "*", "ext-json": "*", + "php": "^7.2.5 || ^8.0", "psr/log": "^1.1", "psr/simple-cache": "^1.0.1" }, From c872ed56a14528e150a163e8350c62813bb0b6a8 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 25 Oct 2020 14:57:28 +0100 Subject: [PATCH 277/461] Adding support for PHP8 exception for the CurlHttpClient --- src/CurlHttpClient.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/CurlHttpClient.php b/src/CurlHttpClient.php index 4de9b075..d7d622a1 100644 --- a/src/CurlHttpClient.php +++ b/src/CurlHttpClient.php @@ -15,6 +15,7 @@ namespace Pdp; +use Throwable; use function curl_close; use function curl_errno; use function curl_error; @@ -52,8 +53,13 @@ public function __construct(array $options = []) CURLOPT_HTTPGET => true, ]; - $curl = curl_init(); - $res = @curl_setopt_array($curl, $this->options); + try { + $curl = curl_init(); + $res = @curl_setopt_array($curl, $this->options); + } catch (Throwable $exception) { + throw new Exception('Please verify your curl additionnal options', $exception->getCode(), $exception); + } + curl_close($curl); if (!$res) { throw new Exception('Please verify your curl additionnal options'); From 212270e62877e1cc4e4686dc7ad92b4fae0718f2 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 25 Oct 2020 15:44:44 +0100 Subject: [PATCH 278/461] prepare 5.7.2 release --- CHANGELOG.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 660070b6..f12c49e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,24 @@ All Notable changes to `PHP Domain Parser` **5.x** series will be documented in this file +## 5.7.2 - 2020-10-25 + +### Added + +- None + +### Fixed + +- Added support for PHP8 see [#289](https://github.com/jeremykendall/php-domain-parser/pull/289) based on works by [@szepeviktor](https://github.com/szepeviktor) + +### Deprecated + +- None + +### Removed + +- None + ## 5.7.1 - 2020-08-24 ### Added From 5865efb36a229d0809e43195e2ed220253327bc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Viktor=20Sz=C3=A9pe?= Date: Sun, 25 Oct 2020 16:12:09 +0100 Subject: [PATCH 279/461] scrutinizer is not set up See https://scrutinizer-ci.com/g/jeremykendall/php-domain-parser --- .travis.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9866f68a..a60457ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -62,7 +62,4 @@ install: script: - if [ "$VALIDATE_CODING_STYLE" == "true" ]; then composer phpcs; fi - if [ "$RUN_PHPSTAN" == "true" ]; then composer phpstan; fi - - composer phpunit -after_script: - - if [ "$COLLECT_COVERAGE" == "true" ]; then wget https://scrutinizer-ci.com/ocular.phar - && php ocular.phar code-coverage:upload --format=php-clover build/clover.xml; fi + - composer run-script phpunit From 3b9606f54eb7d80881a7be7eb2284f1c37b36701 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 25 Oct 2020 19:42:23 +0100 Subject: [PATCH 280/461] Update package configuration against PHP8 and PHPUnit and Travis --- .travis.yml | 19 +++++-------------- composer.json | 4 ++-- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/.travis.yml b/.travis.yml index a60457ee..3f838af1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,50 +7,41 @@ matrix: include: - php: 7.2 env: - - COLLECT_COVERAGE=false - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source --prefer-lowest --prefer-stable" - RUN_PHPSTAN=false - VALIDATE_CODING_STYLE=false - php: 7.2 env: - - COLLECT_COVERAGE=true - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source" - - RUN_PHPSTAN=true - - VALIDATE_CODING_STYLE=true + - RUN_PHPSTAN=false + - VALIDATE_CODING_STYLE=false - php: 7.3 env: - - COLLECT_COVERAGE=false - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source --prefer-lowest --prefer-stable" - RUN_PHPSTAN=false - VALIDATE_CODING_STYLE=false - php: 7.3 env: - - COLLECT_COVERAGE=true - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source" - - RUN_PHPSTAN=true - - VALIDATE_CODING_STYLE=true + - RUN_PHPSTAN=false + - VALIDATE_CODING_STYLE=false - php: 7.4 env: - - COLLECT_COVERAGE=false - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source --prefer-lowest --prefer-stable" - RUN_PHPSTAN=false - VALIDATE_CODING_STYLE=false - php: 7.4 env: - - COLLECT_COVERAGE=true - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source" - RUN_PHPSTAN=true - VALIDATE_CODING_STYLE=true - php: nightly env: - - COLLECT_COVERAGE=false - COMPOSER_ARGS="--no-interaction --no-suggest --prefer-source" - RUN_PHPSTAN=false - VALIDATE_CODING_STYLE=false install: - composer remove --no-interaction --no-update --dev "friendsofphp/php-cs-fixer" - - travis_retry composer require $COMPOSER_ARGS --no-update --dev "composer/composer:2.0.x-dev" - - travis_retry composer require $COMPOSER_ARGS --no-update --dev "phpunit/phpunit:^9.3.11" - travis_retry composer update $COMPOSER_ARGS allow_failures: - php: nightly @@ -62,4 +53,4 @@ install: script: - if [ "$VALIDATE_CODING_STYLE" == "true" ]; then composer phpcs; fi - if [ "$RUN_PHPSTAN" == "true" ]; then composer phpstan; fi - - composer run-script phpunit + - composer phpunit diff --git a/composer.json b/composer.json index b0641ade..5c560160 100644 --- a/composer.json +++ b/composer.json @@ -50,13 +50,13 @@ "psr/simple-cache": "^1.0.1" }, "require-dev": { - "composer/composer": "^1.6", + "composer/composer": "^1.6 || ^2.0", "friendsofphp/php-cs-fixer": "^2.16", "mikey179/vfsstream": "^1.6.7", "phpstan/phpstan": "^0.12", "phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^8.0" + "phpunit/phpunit": "^8.0 || ^9.3" }, "suggest": { "psr/simple-cache-implementation": "To enable using other cache providers", From 8331da576635ec1bb976a09ea378f5f4093b8618 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 12 Nov 2020 08:17:05 +0100 Subject: [PATCH 281/461] Make Rules get methods more stricts --- composer.json | 2 +- src/PublicSuffixList.php | 6 +++--- src/Rules.php | 6 ++++++ src/RulesTest.php | 35 ++++++++++++++++------------------- src/UnableToResolveDomain.php | 10 ++++++++++ 5 files changed, 36 insertions(+), 23 deletions(-) diff --git a/composer.json b/composer.json index b8ee3c36..e7f8767b 100644 --- a/composer.json +++ b/composer.json @@ -69,7 +69,7 @@ }, "scripts": { "phpcs": "php-cs-fixer fix -vvv --diff --dry-run --allow-risky=yes --ansi", - "phpstan": "phpstan analyse -l max -c phpstan.neon src --ansi", + "phpstan": "phpstan analyse -l max -c phpstan.neon src --ansi --memory-limit 192M", "phpunit": "phpunit --coverage-text", "test": [ "@phpcs", diff --git a/src/PublicSuffixList.php b/src/PublicSuffixList.php index 679f006a..fa46b71b 100644 --- a/src/PublicSuffixList.php +++ b/src/PublicSuffixList.php @@ -17,7 +17,7 @@ public function jsonSerialize(): array; * Returns PSL info for a given domain against the PSL rules for cookie domain detection. * * @throws InvalidDomainName if the domain is invalid - * @throws UnableToResolveDomain if the domain or the TLD are not resolvable of not resolved + * @throws UnableToResolveDomain if the effective TLD can not be resolved */ public function getCookieDomain(Host $host): ResolvedDomainName; @@ -25,7 +25,7 @@ public function getCookieDomain(Host $host): ResolvedDomainName; * Returns PSL info for a given domain against the PSL rules for ICANN domain detection. * * @throws InvalidDomainName if the domain is invalid - * @throws UnableToResolveDomain if the domain or the TLD are not resolvable of not resolved + * @throws UnableToResolveDomain if the domain does not contain a ICANN Effective TLD */ public function getICANNDomain(Host $host): ResolvedDomainName; @@ -33,7 +33,7 @@ public function getICANNDomain(Host $host): ResolvedDomainName; * Returns PSL info for a given domain against the PSL rules for private domain detection. * * @throws InvalidDomainName if the domain is invalid - * @throws UnableToResolveDomain if the domain or the TLD are not resolvable of not resolved + * @throws UnableToResolveDomain if the domain does not contain a private Effective TLD */ public function getPrivateDomain(Host $host): ResolvedDomainName; } diff --git a/src/Rules.php b/src/Rules.php index 0199743c..8884ec24 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -137,6 +137,9 @@ public function getICANNDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); $publicSuffix = $this->getPublicSuffix($domain, EffectiveTLD::ICANN_DOMAINS); + if (!$publicSuffix->isICANN()) { + throw UnableToResolveDomain::dueToMissingPublicSuffix($domain, EffectiveTLD::ICANN_DOMAINS); + } return new ResolvedDomain($domain, $publicSuffix); } @@ -148,6 +151,9 @@ public function getPrivateDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); $publicSuffix = $this->getPublicSuffix($domain, EffectiveTLD::PRIVATE_DOMAINS); + if (!$publicSuffix->isPrivate()) { + throw UnableToResolveDomain::dueToMissingPublicSuffix($domain, EffectiveTLD::PRIVATE_DOMAINS); + } return new ResolvedDomain($domain, $publicSuffix); } diff --git a/src/RulesTest.php b/src/RulesTest.php index ed263f12..03a33f4c 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -135,15 +135,24 @@ public function testWithAbsoluteHostInvalid(): void self::assertNull($domain->getPublicSuffix()->getContent()); } + public function testWithICANNDomainInvalid(): void + { + $domain = 'example.invalidICANNTLD'; + + self::expectException(UnableToResolveDomain::class); + self::expectExceptionMessage('The domain "'.strtolower($domain).'" does not contain a "ICANN" TLD.'); + + $this->rules->getICANNDomain($domain); + } + public function testWithPrivateDomainInvalid(): void { - $domain = $this->rules->getPrivateDomain('private.ulb.ac.be'); + $domain = 'private.ulb.ac.be'; - self::assertSame('private.ulb.ac.be', $domain->getContent()); - self::assertFalse($domain->getPublicSuffix()->isKnown()); - self::assertFalse($domain->getPublicSuffix()->isICANN()); - self::assertFalse($domain->getPublicSuffix()->isPrivate()); - self::assertSame('be', $domain->getPublicSuffix()->getContent()); + self::expectException(UnableToResolveDomain::class); + self::expectExceptionMessage('The domain "'.$domain.'" does not contain a "private" TLD.'); + + $this->rules->getPrivateDomain($domain); } public function testWithPrivateDomainValid(): void @@ -157,7 +166,7 @@ public function testWithPrivateDomainValid(): void self::assertSame('github.io', $domain->getPublicSuffix()->getContent()); } - public function testWithICANNDomainInvalid(): void + public function testResolvingICANNDomainInvalid(): void { $domain = $this->rules->resolve('private.ulb.ac.be'); @@ -573,18 +582,6 @@ public function testEffectiveTLDResolution(string $host, string $cookieETLD, str public function effectiveTLDProvider(): iterable { return [ - 'simple TLD' => [ - 'host' => 'www.example.com', - 'cookieETLD' => 'com', - 'icannETLD' => 'com', - 'privateETLD' => 'com', - ], - 'complex ICANN TLD' => [ - 'host' => 'www.ulb.ac.be', - 'cookieETLD' => 'ac.be', - 'icannETLD' => 'ac.be', - 'privateETLD' => 'be', - ], 'private domain effective TLD' => [ 'host' => 'myblog.blogspot.com', 'cookieETLD' => 'blogspot.com', diff --git a/src/UnableToResolveDomain.php b/src/UnableToResolveDomain.php index 10dcc82c..bcc83b35 100644 --- a/src/UnableToResolveDomain.php +++ b/src/UnableToResolveDomain.php @@ -10,6 +10,16 @@ class UnableToResolveDomain extends InvalidArgumentException implements Exceptio { private ?Host $domain = null; + public static function dueToMissingPublicSuffix(Host $domain, string $type): self + { + $domainType = (EffectiveTLD::PRIVATE_DOMAINS === $type) ? 'private' : 'ICANN'; + + $exception = new self('The domain "'.$domain->getContent().'" does not contain a "'.$domainType.'" TLD.'); + $exception->domain = $domain; + + return $exception; + } + public static function dueToUnresolvableDomain(?Host $domain): self { $content = $domain; From f61df11e0d8e18325d3cb39130c6fe29bf9597f8 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 12 Nov 2020 22:18:57 +0100 Subject: [PATCH 282/461] Rename exceptions --- src/CannotProcessHost.php | 11 ++++++++ ...DomainName.php => CannotResolveDomain.php} | 2 +- ...{InvalidHost.php => CannotResolveHost.php} | 2 +- src/Domain.php | 4 +-- src/DomainName.php | 6 ++--- src/DomainNameParser.php | 26 +++++++++---------- src/DomainTest.php | 12 ++++----- src/ExceptionInterface.php | 14 ---------- src/Host.php | 8 +++--- src/PublicSuffix.php | 2 +- src/PublicSuffixList.php | 6 ++--- src/PublicSuffixListConverter.php | 2 +- src/PublicSuffixTest.php | 6 ++--- src/ResolvedDomainName.php | 6 ++--- src/ResolvedDomainTest.php | 4 +-- src/RootZoneDatabaseConverter.php | 2 +- src/Rules.php | 4 ++- src/RulesTest.php | 4 +-- src/TopLevelDomains.php | 2 +- src/TopLevelDomainsTest.php | 2 +- src/UnableToLoadPublicSuffixList.php | 2 +- src/UnableToLoadRootZoneDatabase.php | 2 +- src/UnableToResolveDomain.php | 2 +- 23 files changed, 65 insertions(+), 66 deletions(-) create mode 100644 src/CannotProcessHost.php rename src/{InvalidDomainName.php => CannotResolveDomain.php} (93%) rename src/{InvalidHost.php => CannotResolveHost.php} (86%) delete mode 100644 src/ExceptionInterface.php diff --git a/src/CannotProcessHost.php b/src/CannotProcessHost.php new file mode 100644 index 00000000..27e4146f --- /dev/null +++ b/src/CannotProcessHost.php @@ -0,0 +1,11 @@ +labels); if ($key < - $nb_labels - 1 || $key > $nb_labels) { - throw InvalidDomainName::dueToInvalidLabelKey($key); + throw CannotResolveDomain::dueToInvalidLabelKey($key); } if (0 > $key) { @@ -223,7 +223,7 @@ public function withoutLabel(int $key, int ...$keys): self $nb_labels = count($this->labels); foreach ($keys as &$offset) { if (- $nb_labels > $offset || $nb_labels - 1 < $offset) { - throw InvalidDomainName::dueToInvalidLabelKey($key); + throw CannotResolveDomain::dueToInvalidLabelKey($key); } if (0 > $offset) { diff --git a/src/DomainName.php b/src/DomainName.php index 914b16e1..e844c1f0 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -79,8 +79,8 @@ public function append($label): self; * * @param mixed $label a domain label * - * @throws ExceptionInterface If the key is out of bounds - * @throws ExceptionInterface If the label is converted to the NULL value + * @throws CannotProcessHost If the key is out of bounds + * @throws CannotProcessHost If the label is converted to the NULL value */ public function withLabel(int $key, $label): self; @@ -95,7 +95,7 @@ public function withLabel(int $key, $label): self; * * @param int ...$keys * - * @throws ExceptionInterface If the key is out of bounds + * @throws CannotProcessHost If the key is out of bounds */ public function withoutLabel(int $key, int ...$keys): self; } diff --git a/src/DomainNameParser.php b/src/DomainNameParser.php index e841d2d0..1230699c 100644 --- a/src/DomainNameParser.php +++ b/src/DomainNameParser.php @@ -80,7 +80,7 @@ private static function getIdnErrors(int $errorByte): string * * This method returns the string converted to IDN ASCII form * - * @throws InvalidHost if the string can not be converted to ASCII using IDN UTS46 algorithm + * @throws CannotResolveHost if the string can not be converted to ASCII using IDN UTS46 algorithm */ final protected function idnToAscii(string $domain, int $option = IDNA_DEFAULT): string { @@ -94,11 +94,11 @@ final protected function idnToAscii(string $domain, int $option = IDNA_DEFAULT): $output = idn_to_ascii($domain, $option, INTL_IDNA_VARIANT_UTS46, $infos); if ([] === $infos) { - throw InvalidHost::dueToIDNAError($domain); + throw CannotResolveHost::dueToIDNAError($domain); } if (0 !== $infos['errors']) { - throw InvalidHost::dueToIDNAError($domain, self::getIdnErrors($infos['errors'])); + throw CannotResolveHost::dueToIDNAError($domain, self::getIdnErrors($infos['errors'])); } // @codeCoverageIgnoreStart @@ -111,7 +111,7 @@ final protected function idnToAscii(string $domain, int $option = IDNA_DEFAULT): return $output; } - throw InvalidHost::dueToInvalidCharacters($domain); + throw CannotResolveHost::dueToInvalidCharacters($domain); } /** @@ -119,7 +119,7 @@ final protected function idnToAscii(string $domain, int $option = IDNA_DEFAULT): * * This method returns the string converted to IDN UNICODE form * - * @throws InvalidHost if the string can not be converted to UNICODE using IDN UTS46 algorithm + * @throws CannotResolveHost if the string can not be converted to UNICODE using IDN UTS46 algorithm * @throws UnexpectedValueException if the intl extension is misconfigured */ final protected function idnToUnicode(string $domain, int $option = IDNA_DEFAULT): string @@ -130,11 +130,11 @@ final protected function idnToUnicode(string $domain, int $option = IDNA_DEFAULT $output = idn_to_utf8($domain, $option, INTL_IDNA_VARIANT_UTS46, $info); if ([] === $info) { - throw InvalidHost::dueToIDNAError($domain); + throw CannotResolveHost::dueToIDNAError($domain); } if (0 !== $info['errors']) { - throw InvalidHost::dueToIDNAError($domain, self::getIdnErrors($info['errors'])); + throw CannotResolveHost::dueToIDNAError($domain, self::getIdnErrors($info['errors'])); } // @codeCoverageIgnoreStart @@ -155,10 +155,10 @@ final protected function idnToUnicode(string $domain, int $option = IDNA_DEFAULT * * @param mixed $domain a domain * - * @throws InvalidHost If the domain is not a host - * @throws InvalidDomainName If the host is not a domain + *@throws CannotResolveHost If the domain is not a host + * @throws CannotResolveDomain If the host is not a domain + *@return array * - * @return array */ final protected function parse($domain = null, int $asciiOption = IDNA_DEFAULT, int $unicodeOption = IDNA_DEFAULT): array { @@ -185,7 +185,7 @@ final protected function parse($domain = null, int $asciiOption = IDNA_DEFAULT, $res = filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); if (false !== $res) { - throw InvalidDomainName::dueToUnsupportedType($domain); + throw CannotResolveDomain::dueToUnsupportedType($domain); } $formattedDomain = rawurldecode($domain); @@ -205,7 +205,7 @@ final protected function parse($domain = null, int $asciiOption = IDNA_DEFAULT, // a domain name can not contains URI delimiters or space static $genDelimiters = '/[:\/?#\[\]@ ]/'; if (1 === preg_match($genDelimiters, $formattedDomain)) { - throw InvalidDomainName::dueToInvalidCharacters($domain); + throw CannotResolveDomain::dueToInvalidCharacters($domain); } // if the domain name does not contains UTF-8 chars then it is malformed @@ -219,6 +219,6 @@ final protected function parse($domain = null, int $asciiOption = IDNA_DEFAULT, return $labels; } - throw InvalidDomainName::dueToInvalidCharacters($domain); + throw CannotResolveDomain::dueToInvalidCharacters($domain); } } diff --git a/src/DomainTest.php b/src/DomainTest.php index 25bff290..ae855b29 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -16,12 +16,12 @@ class DomainTest extends TestCase { /** - * @covers \Pdp\InvalidHost + * @covers \Pdp\CannotResolveHost * @dataProvider invalidDomainProvider */ public function testToAsciiThrowsException(string $domain): void { - self::expectException(InvalidHost::class); + self::expectException(CannotResolveHost::class); new Domain($domain); } @@ -37,7 +37,7 @@ public function invalidDomainProvider(): iterable public function testToUnicodeThrowsException(): void { - self::expectException(InvalidHost::class); + self::expectException(CannotResolveHost::class); (new Domain('xn--a-ecp.ru'))->toUnicode(); } @@ -304,13 +304,13 @@ public function testWithLabelFailsWithTypeError(): void public function testWithLabelFailsWithInvalidKey(): void { - self::expectException(InvalidDomainName::class); + self::expectException(CannotResolveDomain::class); (new Domain('example.com'))->withLabel(-4, 'www'); } public function testWithLabelFailsWithInvalidLabel2(): void { - self::expectException(InvalidHost::class); + self::expectException(CannotResolveHost::class); (new Domain('example.com'))->withLabel(-1, ''); } @@ -390,7 +390,7 @@ public function withoutLabelWorksProvider(): iterable public function testwithoutLabelFailsWithInvalidKey(): void { - self::expectException(InvalidDomainName::class); + self::expectException(CannotResolveDomain::class); (new Domain('example.com'))->withoutLabel(-3); } diff --git a/src/ExceptionInterface.php b/src/ExceptionInterface.php deleted file mode 100644 index 016c3be7..00000000 --- a/src/ExceptionInterface.php +++ /dev/null @@ -1,14 +0,0 @@ -label(0)) { - throw InvalidDomainName::dueToInvalidPublicSuffix($publicSuffix); + throw CannotResolveDomain::dueToInvalidPublicSuffix($publicSuffix); } if (null === $publicSuffix->getContent()) { diff --git a/src/PublicSuffixList.php b/src/PublicSuffixList.php index fa46b71b..11ff35ba 100644 --- a/src/PublicSuffixList.php +++ b/src/PublicSuffixList.php @@ -16,7 +16,7 @@ public function jsonSerialize(): array; /** * Returns PSL info for a given domain against the PSL rules for cookie domain detection. * - * @throws InvalidDomainName if the domain is invalid + * @throws CannotResolveDomain if the domain is invalid * @throws UnableToResolveDomain if the effective TLD can not be resolved */ public function getCookieDomain(Host $host): ResolvedDomainName; @@ -24,7 +24,7 @@ public function getCookieDomain(Host $host): ResolvedDomainName; /** * Returns PSL info for a given domain against the PSL rules for ICANN domain detection. * - * @throws InvalidDomainName if the domain is invalid + * @throws CannotResolveDomain if the domain is invalid * @throws UnableToResolveDomain if the domain does not contain a ICANN Effective TLD */ public function getICANNDomain(Host $host): ResolvedDomainName; @@ -32,7 +32,7 @@ public function getICANNDomain(Host $host): ResolvedDomainName; /** * Returns PSL info for a given domain against the PSL rules for private domain detection. * - * @throws InvalidDomainName if the domain is invalid + * @throws CannotResolveDomain if the domain is invalid * @throws UnableToResolveDomain if the domain does not contain a private Effective TLD */ public function getPrivateDomain(Host $host): ResolvedDomainName; diff --git a/src/PublicSuffixListConverter.php b/src/PublicSuffixListConverter.php index 63b6826e..07a564c7 100644 --- a/src/PublicSuffixListConverter.php +++ b/src/PublicSuffixListConverter.php @@ -99,7 +99,7 @@ private function addRule(array $list, array $ruleParts): array /** @var string $line */ $line = array_pop($ruleParts); $rule = $this->idnToAscii($line); - } catch (ExceptionInterface $exception) { + } catch (CannotProcessHost $exception) { throw UnableToLoadPublicSuffixList::dueToInvalidRule($line ?? null, $exception); } diff --git a/src/PublicSuffixTest.php b/src/PublicSuffixTest.php index 6f1aa482..d7a98418 100644 --- a/src/PublicSuffixTest.php +++ b/src/PublicSuffixTest.php @@ -66,7 +66,7 @@ public function PSProvider(): iterable */ public function testConstructorThrowsException(string $publicSuffix): void { - self::expectException(InvalidDomainName::class); + self::expectException(CannotResolveDomain::class); PublicSuffix::fromUnknown($publicSuffix); } @@ -81,14 +81,14 @@ public function invalidPublicSuffixProvider(): iterable public function testPSToAsciiThrowsException(): void { - self::expectException(InvalidHost::class); + self::expectException(CannotResolveHost::class); PublicSuffix::fromUnknown('a⒈com'); } public function testToUnicodeThrowsException(): void { - self::expectException(InvalidHost::class); + self::expectException(CannotResolveHost::class); PublicSuffix::fromUnknown('xn--a-ecp.ru')->toUnicode(); } diff --git a/src/ResolvedDomainName.php b/src/ResolvedDomainName.php index 57e0d1ac..b3e475fe 100644 --- a/src/ResolvedDomainName.php +++ b/src/ResolvedDomainName.php @@ -20,7 +20,7 @@ public function getSubDomain(): DomainName; * This method MUST retain the state of the current instance, and return * an instance that contains the new sub domain * - * @throws ExceptionInterface If the Sub domain can not be added to the current Domain + * @throws CannotProcessHost If the Sub domain can not be added to the current Domain */ public function withSubDomain(Host $subDomain): self; @@ -30,8 +30,8 @@ public function withSubDomain(Host $subDomain): self; * This method MUST retain the state of the current instance, and return * an instance that contains the second level domain label * - * @param ?string $label - * @throws ExceptionInterface If the second level domain label can not be added + * @param ?string $label + * @throws CannotProcessHost If the second level domain label can not be added */ public function withSecondLevelDomain(?string $label): self; diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index ce0afdfd..073fc8a3 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -415,7 +415,7 @@ public function testWithSubDomainFailsWithOneLabelDomain(): void public function testWithEmptySubdomain(): void { - self::expectException(InvalidHost::class); + self::expectException(CannotResolveHost::class); $domain = new ResolvedDomain(new Domain('www.example.com'), PublicSuffix::fromICANN('com')); @@ -542,7 +542,7 @@ public function withPublicSuffixWorksProvider(): iterable public function testWithPublicSuffixFailsWithNullDomain(): void { - self::expectException(InvalidHost::class); + self::expectException(CannotResolveHost::class); (new ResolvedDomain(new Domain()))->withPublicSuffix('www'); } diff --git a/src/RootZoneDatabaseConverter.php b/src/RootZoneDatabaseConverter.php index ea4d0504..612d8d2a 100644 --- a/src/RootZoneDatabaseConverter.php +++ b/src/RootZoneDatabaseConverter.php @@ -94,7 +94,7 @@ private function extractRootZone(string $content): string { try { $tld = PublicSuffix::fromUnknown($content)->toAscii(); - } catch (ExceptionInterface $exception) { + } catch (CannotProcessHost $exception) { throw UnableToLoadRootZoneDatabase::dueToInvalidRootZoneDomain($content, $exception); } diff --git a/src/Rules.php b/src/Rules.php index 8884ec24..e9f24945 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -114,7 +114,7 @@ public function resolve($host): ResolvedDomainName } return new ResolvedDomain(new Domain($host)); - } catch (ExceptionInterface $exception) { + } catch (CannotProcessHost $exception) { return new ResolvedDomain(Domain::fromNull()); } } @@ -162,6 +162,8 @@ public function getPrivateDomain($host): ResolvedDomainName * Assert the domain is valid and is resolvable. * * @param mixed $domain a type that supports instantiating a Domain from. + * + * @throws CannotResolveHost If the domain is invalid */ private function validateDomain($domain): DomainName { diff --git a/src/RulesTest.php b/src/RulesTest.php index 03a33f4c..eabf63cd 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -354,7 +354,7 @@ public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix(): void */ public function testGetPublicSuffixThrowsInvalidDomainException(string $domain): void { - self::expectException(InvalidDomainName::class); + self::expectException(CannotResolveDomain::class); $this->rules->getICANNDomain($domain); } @@ -376,7 +376,7 @@ public function invalidDomainParseProvider(): iterable */ public function testGetPublicSuffixThrowsInvalidHostException(string $domain): void { - self::expectException(InvalidHost::class); + self::expectException(CannotResolveHost::class); $this->rules->getICANNDomain($domain); } diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 5361c5e1..1a38eeba 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -151,7 +151,7 @@ public function contains($tld): bool if (!$tld instanceof DomainName) { try { $tld = new Domain($tld); - } catch (ExceptionInterface $exception) { + } catch (CannotProcessHost $exception) { return false; } } diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 053946a4..e903164f 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -131,7 +131,7 @@ public function testResolveThrowsTypeError(): void public function testResolveWithInvalidDomain(): void { - self::expectException(InvalidHost::class); + self::expectException(CannotResolveHost::class); $this->topLevelDomains->resolve('###'); } diff --git a/src/UnableToLoadPublicSuffixList.php b/src/UnableToLoadPublicSuffixList.php index d9ed2b0a..613e0eae 100644 --- a/src/UnableToLoadPublicSuffixList.php +++ b/src/UnableToLoadPublicSuffixList.php @@ -7,7 +7,7 @@ use InvalidArgumentException; use Throwable; -class UnableToLoadPublicSuffixList extends InvalidArgumentException implements ExceptionInterface +class UnableToLoadPublicSuffixList extends InvalidArgumentException implements CannotProcessHost { public static function dueToInvalidPath(string $path): self { diff --git a/src/UnableToLoadRootZoneDatabase.php b/src/UnableToLoadRootZoneDatabase.php index 7f22a148..1ae84e7f 100644 --- a/src/UnableToLoadRootZoneDatabase.php +++ b/src/UnableToLoadRootZoneDatabase.php @@ -7,7 +7,7 @@ use InvalidArgumentException; use Throwable; -class UnableToLoadRootZoneDatabase extends InvalidArgumentException implements ExceptionInterface +class UnableToLoadRootZoneDatabase extends InvalidArgumentException implements CannotProcessHost { public static function dueToInvalidHashMap(): self { diff --git a/src/UnableToResolveDomain.php b/src/UnableToResolveDomain.php index bcc83b35..ee57b710 100644 --- a/src/UnableToResolveDomain.php +++ b/src/UnableToResolveDomain.php @@ -6,7 +6,7 @@ use InvalidArgumentException; -class UnableToResolveDomain extends InvalidArgumentException implements ExceptionInterface +class UnableToResolveDomain extends InvalidArgumentException implements CannotProcessHost { private ?Host $domain = null; From 002d8b5d43b2724258d185de86717b03355da8e7 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Fri, 13 Nov 2020 08:39:42 +0100 Subject: [PATCH 283/461] Improve Exception handling and Documentation readme --- README.md | 88 ++++++++++++++++++++++++++++++++++++- src/CannotResolveDomain.php | 28 ------------ src/CannotResolveHost.php | 24 ---------- src/Domain.php | 4 +- src/DomainNameParser.php | 24 +++++----- src/DomainTest.php | 12 ++--- src/PublicSuffix.php | 2 +- src/PublicSuffixList.php | 6 +-- src/PublicSuffixTest.php | 6 +-- src/ResolvedDomainTest.php | 4 +- src/Rules.php | 5 ++- src/RulesTest.php | 4 +- src/SyntaxError.php | 39 ++++++++++++++++ src/TopLevelDomainsTest.php | 2 +- 14 files changed, 160 insertions(+), 88 deletions(-) delete mode 100644 src/CannotResolveDomain.php delete mode 100644 src/CannotResolveHost.php create mode 100644 src/SyntaxError.php diff --git a/README.md b/README.md index 7877750b..6f8ada82 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,8 @@ You need: ### Public Suffix List Resolution +#### Resolving Domains + The first objective of the library is to use the [Public Suffix List](http://publicsuffix.org/) to easily resolve a domain as a `Pdp\ResolvedDomain` object using the following methods: @@ -57,7 +59,89 @@ echo $resolvedDomain->getRegistrableDomain(); //display 'pref.okinawa.jp'; echo $resolvedDomain->getSubDomain(); //display 'www'; ~~~ -In case of an error an exception which extends `Pdp\ExceptionInterface` is thrown. +In case of an error an exception which extends `Pdp\CannotProcessHost` is thrown. + +#### Public Suffix Type + +The [Public Suffix List](http://publicsuffix.org/) is organized in sections. This library can give you access to this +information via its public suffix object. + +~~~php +resolve('example.github.io')->getPublicSuffix(); + +echo $publicSuffix; // display 'github.io'; +$publicSuffix->isICANN(); // will return false +$publicSuffix->isPrivate(); // will return true +$publicSuffix->isKnown(); // will return true +~~~ + +Because the PSL algorithm is fault tolerant this library exposes more strict methods + +- `Rules::getCookieDomain` +- `Rules::getICANNDomain` +- `Rules::getPrivateDomain` + +These methods act and resolve the domain against the PSL just like the `resolve` method but will throw +an exception if no valid effective TLD is found in the respective PSL section or if the submitted domain is invalid. + +~~~php +getICANNDomain('qfdsf.unknownTLD'); +// will trigger an UnableToResolveDomain exception because `.unknownTLD` is not +// part of the ICANN section + +$rules->getCookieDomain('qfdsf.unknownTLD'); +// will not throw because the domain syntax is correct. + +$rules->getCookieDomain('com'); +// will throw because no public suffix can be determined + +$rules->resolve('com'); +// will return a Nullable Resolved domain +~~~ + +#### Accessing and processing Domain labels + +From the `ResolvedDomain` you can access the underlying domain object using the `ResolvedDomain::getDomain` method. +Accessing this object enables you to work with the domain labels. + +**WARNING: all objects are immutable, modifying the underlying object will not affect the parent object.** + +~~~php +resolve('www.example.com'); +$domain = $resolvedDomain->getDomain(); +$domain->labels(); // returns ['com', 'example', 'www']; +$domain->label(-1); // returns 'www' +$domain->label(0); // returns 'com' +foreach ($domain as $label) { + echo $label, PHP_EOL; +} +// display +// com +// example +// www +~~~ + +You can also add or remove labels according to their key index using the following methods: + +- `Domain::withLabel(int $key, string|Stringable $label): self;` +- `Domain::withoutLabel(int $key, int ...$keys): self;` +- `Domain::append(string|Stringable $label): self;` +- `Domain::prepend(string|Stringable $label): self;` ### Top Level Domains resolution @@ -78,7 +162,7 @@ echo $resolvedDomain->getRegistrableDomain(); //display 'okinawa.jp'; echo $resolvedDomain->getSubDomain(); //display 'www.pref'; ~~~ -In case of an error an exception which extends `Pdp\ExceptionInterface` is thrown. +In case of an error an exception which extends `Pdp\CannotProcessHost` is thrown. **WARNING:** diff --git a/src/CannotResolveDomain.php b/src/CannotResolveDomain.php deleted file mode 100644 index 8af6d65b..00000000 --- a/src/CannotResolveDomain.php +++ /dev/null @@ -1,28 +0,0 @@ -getContent() ?? 'NULL'.'"` is invalid.'); - } -} diff --git a/src/CannotResolveHost.php b/src/CannotResolveHost.php deleted file mode 100644 index ac7127a2..00000000 --- a/src/CannotResolveHost.php +++ /dev/null @@ -1,24 +0,0 @@ -labels); if ($key < - $nb_labels - 1 || $key > $nb_labels) { - throw CannotResolveDomain::dueToInvalidLabelKey($key); + throw SyntaxError::dueToInvalidLabelKey($this, $key); } if (0 > $key) { @@ -223,7 +223,7 @@ public function withoutLabel(int $key, int ...$keys): self $nb_labels = count($this->labels); foreach ($keys as &$offset) { if (- $nb_labels > $offset || $nb_labels - 1 < $offset) { - throw CannotResolveDomain::dueToInvalidLabelKey($key); + throw SyntaxError::dueToInvalidLabelKey($this, $key); } if (0 > $offset) { diff --git a/src/DomainNameParser.php b/src/DomainNameParser.php index 1230699c..9991d753 100644 --- a/src/DomainNameParser.php +++ b/src/DomainNameParser.php @@ -80,7 +80,7 @@ private static function getIdnErrors(int $errorByte): string * * This method returns the string converted to IDN ASCII form * - * @throws CannotResolveHost if the string can not be converted to ASCII using IDN UTS46 algorithm + * @throws SyntaxError if the string can not be converted to ASCII using IDN UTS46 algorithm */ final protected function idnToAscii(string $domain, int $option = IDNA_DEFAULT): string { @@ -94,11 +94,11 @@ final protected function idnToAscii(string $domain, int $option = IDNA_DEFAULT): $output = idn_to_ascii($domain, $option, INTL_IDNA_VARIANT_UTS46, $infos); if ([] === $infos) { - throw CannotResolveHost::dueToIDNAError($domain); + throw SyntaxError::dueToIDNAError($domain); } if (0 !== $infos['errors']) { - throw CannotResolveHost::dueToIDNAError($domain, self::getIdnErrors($infos['errors'])); + throw SyntaxError::dueToIDNAError($domain, self::getIdnErrors($infos['errors'])); } // @codeCoverageIgnoreStart @@ -111,7 +111,7 @@ final protected function idnToAscii(string $domain, int $option = IDNA_DEFAULT): return $output; } - throw CannotResolveHost::dueToInvalidCharacters($domain); + throw SyntaxError::dueToInvalidCharacters($domain); } /** @@ -119,7 +119,7 @@ final protected function idnToAscii(string $domain, int $option = IDNA_DEFAULT): * * This method returns the string converted to IDN UNICODE form * - * @throws CannotResolveHost if the string can not be converted to UNICODE using IDN UTS46 algorithm + * @throws SyntaxError if the string can not be converted to UNICODE using IDN UTS46 algorithm * @throws UnexpectedValueException if the intl extension is misconfigured */ final protected function idnToUnicode(string $domain, int $option = IDNA_DEFAULT): string @@ -130,11 +130,11 @@ final protected function idnToUnicode(string $domain, int $option = IDNA_DEFAULT $output = idn_to_utf8($domain, $option, INTL_IDNA_VARIANT_UTS46, $info); if ([] === $info) { - throw CannotResolveHost::dueToIDNAError($domain); + throw SyntaxError::dueToIDNAError($domain); } if (0 !== $info['errors']) { - throw CannotResolveHost::dueToIDNAError($domain, self::getIdnErrors($info['errors'])); + throw SyntaxError::dueToIDNAError($domain, self::getIdnErrors($info['errors'])); } // @codeCoverageIgnoreStart @@ -155,8 +155,8 @@ final protected function idnToUnicode(string $domain, int $option = IDNA_DEFAULT * * @param mixed $domain a domain * - *@throws CannotResolveHost If the domain is not a host - * @throws CannotResolveDomain If the host is not a domain + *@throws SyntaxError If the host is not a domain + *@throws SyntaxError If the domain is not a host *@return array * */ @@ -185,7 +185,7 @@ final protected function parse($domain = null, int $asciiOption = IDNA_DEFAULT, $res = filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); if (false !== $res) { - throw CannotResolveDomain::dueToUnsupportedType($domain); + throw SyntaxError::dueToUnsupportedType($domain); } $formattedDomain = rawurldecode($domain); @@ -205,7 +205,7 @@ final protected function parse($domain = null, int $asciiOption = IDNA_DEFAULT, // a domain name can not contains URI delimiters or space static $genDelimiters = '/[:\/?#\[\]@ ]/'; if (1 === preg_match($genDelimiters, $formattedDomain)) { - throw CannotResolveDomain::dueToInvalidCharacters($domain); + throw SyntaxError::dueToInvalidCharacters($domain); } // if the domain name does not contains UTF-8 chars then it is malformed @@ -219,6 +219,6 @@ final protected function parse($domain = null, int $asciiOption = IDNA_DEFAULT, return $labels; } - throw CannotResolveDomain::dueToInvalidCharacters($domain); + throw SyntaxError::dueToInvalidCharacters($domain); } } diff --git a/src/DomainTest.php b/src/DomainTest.php index ae855b29..edf6519b 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -16,12 +16,12 @@ class DomainTest extends TestCase { /** - * @covers \Pdp\CannotResolveHost + * @covers \Pdp\SyntaxError * @dataProvider invalidDomainProvider */ public function testToAsciiThrowsException(string $domain): void { - self::expectException(CannotResolveHost::class); + self::expectException(SyntaxError::class); new Domain($domain); } @@ -37,7 +37,7 @@ public function invalidDomainProvider(): iterable public function testToUnicodeThrowsException(): void { - self::expectException(CannotResolveHost::class); + self::expectException(SyntaxError::class); (new Domain('xn--a-ecp.ru'))->toUnicode(); } @@ -304,13 +304,13 @@ public function testWithLabelFailsWithTypeError(): void public function testWithLabelFailsWithInvalidKey(): void { - self::expectException(CannotResolveDomain::class); + self::expectException(SyntaxError::class); (new Domain('example.com'))->withLabel(-4, 'www'); } public function testWithLabelFailsWithInvalidLabel2(): void { - self::expectException(CannotResolveHost::class); + self::expectException(SyntaxError::class); (new Domain('example.com'))->withLabel(-1, ''); } @@ -390,7 +390,7 @@ public function withoutLabelWorksProvider(): iterable public function testwithoutLabelFailsWithInvalidKey(): void { - self::expectException(CannotResolveDomain::class); + self::expectException(SyntaxError::class); (new Domain('example.com'))->withoutLabel(-3); } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 9afb9c88..4f2f208d 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -16,7 +16,7 @@ final class PublicSuffix implements EffectiveTLD private function __construct(DomainName $publicSuffix, string $section) { if ('' === $publicSuffix->label(0)) { - throw CannotResolveDomain::dueToInvalidPublicSuffix($publicSuffix); + throw SyntaxError::dueToInvalidPublicSuffix($publicSuffix); } if (null === $publicSuffix->getContent()) { diff --git a/src/PublicSuffixList.php b/src/PublicSuffixList.php index 11ff35ba..3de72892 100644 --- a/src/PublicSuffixList.php +++ b/src/PublicSuffixList.php @@ -16,7 +16,7 @@ public function jsonSerialize(): array; /** * Returns PSL info for a given domain against the PSL rules for cookie domain detection. * - * @throws CannotResolveDomain if the domain is invalid + * @throws SyntaxError if the domain is invalid * @throws UnableToResolveDomain if the effective TLD can not be resolved */ public function getCookieDomain(Host $host): ResolvedDomainName; @@ -24,7 +24,7 @@ public function getCookieDomain(Host $host): ResolvedDomainName; /** * Returns PSL info for a given domain against the PSL rules for ICANN domain detection. * - * @throws CannotResolveDomain if the domain is invalid + * @throws SyntaxError if the domain is invalid * @throws UnableToResolveDomain if the domain does not contain a ICANN Effective TLD */ public function getICANNDomain(Host $host): ResolvedDomainName; @@ -32,7 +32,7 @@ public function getICANNDomain(Host $host): ResolvedDomainName; /** * Returns PSL info for a given domain against the PSL rules for private domain detection. * - * @throws CannotResolveDomain if the domain is invalid + * @throws SyntaxError if the domain is invalid * @throws UnableToResolveDomain if the domain does not contain a private Effective TLD */ public function getPrivateDomain(Host $host): ResolvedDomainName; diff --git a/src/PublicSuffixTest.php b/src/PublicSuffixTest.php index d7a98418..73c94f2f 100644 --- a/src/PublicSuffixTest.php +++ b/src/PublicSuffixTest.php @@ -66,7 +66,7 @@ public function PSProvider(): iterable */ public function testConstructorThrowsException(string $publicSuffix): void { - self::expectException(CannotResolveDomain::class); + self::expectException(SyntaxError::class); PublicSuffix::fromUnknown($publicSuffix); } @@ -81,14 +81,14 @@ public function invalidPublicSuffixProvider(): iterable public function testPSToAsciiThrowsException(): void { - self::expectException(CannotResolveHost::class); + self::expectException(SyntaxError::class); PublicSuffix::fromUnknown('a⒈com'); } public function testToUnicodeThrowsException(): void { - self::expectException(CannotResolveHost::class); + self::expectException(SyntaxError::class); PublicSuffix::fromUnknown('xn--a-ecp.ru')->toUnicode(); } diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 073fc8a3..2c4014fe 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -415,7 +415,7 @@ public function testWithSubDomainFailsWithOneLabelDomain(): void public function testWithEmptySubdomain(): void { - self::expectException(CannotResolveHost::class); + self::expectException(SyntaxError::class); $domain = new ResolvedDomain(new Domain('www.example.com'), PublicSuffix::fromICANN('com')); @@ -542,7 +542,7 @@ public function withPublicSuffixWorksProvider(): iterable public function testWithPublicSuffixFailsWithNullDomain(): void { - self::expectException(CannotResolveHost::class); + self::expectException(SyntaxError::class); (new ResolvedDomain(new Domain()))->withPublicSuffix('www'); } diff --git a/src/Rules.php b/src/Rules.php index e9f24945..a618b9e7 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -114,7 +114,7 @@ public function resolve($host): ResolvedDomainName } return new ResolvedDomain(new Domain($host)); - } catch (CannotProcessHost $exception) { + } catch (SyntaxError $exception) { return new ResolvedDomain(Domain::fromNull()); } } @@ -163,7 +163,8 @@ public function getPrivateDomain($host): ResolvedDomainName * * @param mixed $domain a type that supports instantiating a Domain from. * - * @throws CannotResolveHost If the domain is invalid + * @throws SyntaxError If the domain is invalid + * @throws UnableToResolveDomain If the domain can not be resolved */ private function validateDomain($domain): DomainName { diff --git a/src/RulesTest.php b/src/RulesTest.php index eabf63cd..a8b52cd4 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -354,7 +354,7 @@ public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix(): void */ public function testGetPublicSuffixThrowsInvalidDomainException(string $domain): void { - self::expectException(CannotResolveDomain::class); + self::expectException(SyntaxError::class); $this->rules->getICANNDomain($domain); } @@ -376,7 +376,7 @@ public function invalidDomainParseProvider(): iterable */ public function testGetPublicSuffixThrowsInvalidHostException(string $domain): void { - self::expectException(CannotResolveHost::class); + self::expectException(SyntaxError::class); $this->rules->getICANNDomain($domain); } diff --git a/src/SyntaxError.php b/src/SyntaxError.php new file mode 100644 index 00000000..f439a66e --- /dev/null +++ b/src/SyntaxError.php @@ -0,0 +1,39 @@ +getContent() ?? 'NULL'.'"` is invalid.'); + } + + public static function dueToUnsupportedType(string $domain): self + { + return new self('The domain `'.$domain.'` is invalid: this is an IPv4 host.'); + } + + public static function dueToInvalidLabelKey(Host $domain, int $key): self + { + return new self('the given key `'.$key.'` is invalid for the domain `"'.$domain->getContent() ?? 'NULL'.'"`.'); + } +} diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index e903164f..52e6f966 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -131,7 +131,7 @@ public function testResolveThrowsTypeError(): void public function testResolveWithInvalidDomain(): void { - self::expectException(CannotResolveHost::class); + self::expectException(SyntaxError::class); $this->topLevelDomains->resolve('###'); } From 32982ae7a6366549202e540fb698820155ecb99a Mon Sep 17 00:00:00 2001 From: Bojan Bedrac Date: Fri, 13 Nov 2020 13:35:29 +0100 Subject: [PATCH 284/461] Typo - fixes a typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6f8ada82..bf5f85c9 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ ## Motivation While there are plenty of excellent URL parsers and builders available, there -are very few projects that can accurately parse a domaine into its component +are very few projects that can accurately parse a domain into its component subdomain, registrable domain, and public suffix parts. Consider the domain www.pref.okinawa.jp. In this domain, the From d21fffd97a2ba08ec452044ae9bb341d2cd748a3 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Fri, 13 Nov 2020 16:40:32 +0100 Subject: [PATCH 285/461] Adding Explicit ::toString and ::value method to Host interface --- README.md | 60 +++++++++++++++++++++---------- composer.json | 10 +++--- src/Domain.php | 10 +++--- src/DomainNameParser.php | 2 +- src/DomainTest.php | 28 +++++++-------- src/Host.php | 14 ++++---- src/PublicSuffix.php | 12 +++---- src/PublicSuffixTest.php | 10 +++--- src/ResolvedDomain.php | 50 +++++++++++++------------- src/ResolvedDomainTest.php | 42 +++++++++++----------- src/RootZoneDatabaseConverter.php | 4 +-- src/Rules.php | 2 +- src/RulesTest.php | 38 ++++++++++---------- src/SyntaxError.php | 4 +-- src/TopLevelDomains.php | 6 ++-- src/TopLevelDomainsTest.php | 10 +++--- src/UnableToResolveDomain.php | 6 ++-- 17 files changed, 167 insertions(+), 141 deletions(-) diff --git a/README.md b/README.md index 6f8ada82..f284afdb 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # PHP Domain Parser + **PHP Domain Parser** is a [Public Suffix List](http://publicsuffix.org/) based domain parser implemented in PHP. ![Quality Assurance](https://github.com/jeremykendall/php-domain-parser/workflows/Quality%20Assurance/badge.svg) @@ -52,11 +53,11 @@ use Pdp\Rules; $rules = Rules::fromPath('/path/to/cache/public-suffix-list.dat'); $resolvedDomain = $rules->resolve('www.PreF.OkiNawA.jP'); -echo $resolvedDomain->getDomain(); //display 'www.pref.okinawa.jp'; -echo $resolvedDomain->getPublicSuffix(); //display 'okinawa.jp'; -echo $resolvedDomain->getSecondLevelDomain(); //display 'pref'; -echo $resolvedDomain->getRegistrableDomain(); //display 'pref.okinawa.jp'; -echo $resolvedDomain->getSubDomain(); //display 'www'; +echo $resolvedDomain->getDomain()->toString(); //display 'www.pref.okinawa.jp'; +echo $resolvedDomain->getPublicSuffix()->toString(); //display 'okinawa.jp'; +echo $resolvedDomain->getSecondLevelDomain(); //display 'pref'; +echo $resolvedDomain->getRegistrableDomain()->toString(); //display 'pref.okinawa.jp'; +echo $resolvedDomain->getSubDomain()->toString(); //display 'www'; ~~~ In case of an error an exception which extends `Pdp\CannotProcessHost` is thrown. @@ -74,10 +75,10 @@ $rules = Rules::fromPath('/path/to/cache/public-suffix-list.dat'); $publicSuffix = $rules->resolve('example.github.io')->getPublicSuffix(); -echo $publicSuffix; // display 'github.io'; -$publicSuffix->isICANN(); // will return false -$publicSuffix->isPrivate(); // will return true -$publicSuffix->isKnown(); // will return true +echo $publicSuffix->toString(); // display 'github.io'; +$publicSuffix->isICANN(); // will return false +$publicSuffix->isPrivate(); // will return true +$publicSuffix->isKnown(); // will return true ~~~ Because the PSL algorithm is fault tolerant this library exposes more strict methods @@ -109,6 +110,21 @@ $rules->resolve('com'); // will return a Nullable Resolved domain ~~~ +It is possible to access the labels that compose the underlying public suffix domain using the following call: + +~~~php +resolve('example.github.io')->getPublicSuffix(); + +$publicSuffixDomain = $publicSuffix->getDomain(); +~~~ + +Domain objects usage is explain in the next section. + #### Accessing and processing Domain labels From the `ResolvedDomain` you can access the underlying domain object using the `ResolvedDomain::getDomain` method. @@ -122,11 +138,12 @@ use Pdp\Rules; $rules = Rules::fromPath('/path/to/cache/public-suffix-list.dat'); -$resolvedDomain = $rules->resolve('www.example.com'); +$resolvedDomain = $rules->resolve('www.ExAmpLE.cOM'); $domain = $resolvedDomain->getDomain(); -$domain->labels(); // returns ['com', 'example', 'www']; -$domain->label(-1); // returns 'www' -$domain->label(0); // returns 'com' +echo $domain->toString(); // display 'www.example.com' +$domain->labels(); // returns ['com', 'example', 'www']; +$domain->label(-1); // returns 'www' +$domain->label(0); // returns 'com' foreach ($domain as $label) { echo $label, PHP_EOL; } @@ -143,6 +160,13 @@ You can also add or remove labels according to their key index using the followi - `Domain::append(string|Stringable $label): self;` - `Domain::prepend(string|Stringable $label): self;` +A domain object is directly returned from the following calls: + +- `ResolvedDomain::getDomain` +- `ResolvedDomain::getRegistrableDomain` +- `ResolvedDomain::getSubDomain` +- `ResolvedDomain::getRegistrableDomain` + ### Top Level Domains resolution While the [Public Suffix List](http://publicsuffix.org/) is a community based list, the package provides access to @@ -155,11 +179,11 @@ use Pdp\TopLevelDomains; $iana = TopLevelDomains::fromPath('/path/to/cache/tlds-alpha-by-domain.txt'); $resolvedDomain = $iana->resolve('www.PreF.OkiNawA.jP'); -echo $resolvedDomain->getDomain(); //display 'www.pref.okinawa.jp'; -echo $resolvedDomain->getPublicSuffix(); //display 'jp'; -echo $resolvedDomain->getSecondLevelDomain(); //display 'okinawa'; -echo $resolvedDomain->getRegistrableDomain(); //display 'okinawa.jp'; -echo $resolvedDomain->getSubDomain(); //display 'www.pref'; +echo $resolvedDomain->getDomain()->toString(); //display 'www.pref.okinawa.jp'; +echo $resolvedDomain->getPublicSuffix()->toString(); //display 'jp'; +echo $resolvedDomain->getSecondLevelDomain(); //display 'okinawa'; +echo $resolvedDomain->getRegistrableDomain()->toString(); //display 'okinawa.jp'; +echo $resolvedDomain->getSubDomain()->toString(); //display 'www.pref'; ~~~ In case of an error an exception which extends `Pdp\CannotProcessHost` is thrown. diff --git a/composer.json b/composer.json index e7f8767b..7d93a240 100644 --- a/composer.json +++ b/composer.json @@ -46,15 +46,17 @@ }, "require-dev": { "friendsofphp/php-cs-fixer": "^2.16", + "guzzlehttp/guzzle": "^7.0.0", + "guzzlehttp/psr7": "^1.6.0", + "nyholm/psr7": "^1.3", "phpstan/phpstan": "^0.12", "phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan-strict-rules": "^0.12", "phpunit/phpunit": "^9.3", - "psr/simple-cache": "^1.0.1", - "guzzlehttp/guzzle": "^7.0.0", - "guzzlehttp/psr7": "^1.6.0", "psr/http-factory": "^1.0.0", - "symfony/cache": "^v5.0.0" + "psr/simple-cache": "^1.0.1", + "symfony/cache": "^v5.0.0", + "symfony/http-client": "^5.1" }, "suggest": { "psr/http-client-implementation": "To use the storage functionnality which depends on PSR-18", diff --git a/src/Domain.php b/src/Domain.php index 70379698..89529bf3 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -73,7 +73,7 @@ public function getIterator() public function jsonSerialize(): ?string { - return $this->getContent(); + return $this->value(); } public function count(): int @@ -81,14 +81,14 @@ public function count(): int return count($this->labels); } - public function getContent(): ?string + public function value(): ?string { return $this->domain; } - public function __toString(): string + public function toString(): string { - return (string) $this->domain; + return (string) $this->value(); } public function label(int $key): ?string @@ -160,7 +160,7 @@ public function toUnicode(): self private function normalizeContent($domain): string { if ($domain instanceof Host) { - $domain = $domain->getContent(); + $domain = $domain->value(); } if (null === $domain || (!is_string($domain) && !method_exists($domain, '__toString'))) { diff --git a/src/DomainNameParser.php b/src/DomainNameParser.php index 9991d753..a6456ba0 100644 --- a/src/DomainNameParser.php +++ b/src/DomainNameParser.php @@ -163,7 +163,7 @@ final protected function idnToUnicode(string $domain, int $option = IDNA_DEFAULT final protected function parse($domain = null, int $asciiOption = IDNA_DEFAULT, int $unicodeOption = IDNA_DEFAULT): array { if ($domain instanceof Host) { - $domain = $domain->getContent(); + $domain = $domain->value(); } if (null === $domain) { diff --git a/src/DomainTest.php b/src/DomainTest.php index edf6519b..6bdea192 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -49,7 +49,7 @@ public function testDomainInternalPhpMethod(): void self::assertEquals($domain, $generateDomain); self::assertSame(['be', 'ac', 'ulb', 'www'], iterator_to_array($domain)); self::assertEquals('"www.ulb.ac.be"', json_encode($domain)); - self::assertSame('www.ulb.ac.be', (string) $domain); + self::assertSame('www.ulb.ac.be', $domain->toString()); } /** @@ -119,11 +119,11 @@ public function testToIDN( ?string $expectedIDNDomain ): void { $domain = new Domain($domain); - self::assertSame($expectedDomain, $domain->getContent()); + self::assertSame($expectedDomain, $domain->value()); /** @var Domain $domainIDN */ $domainIDN = $domain->toUnicode(); - self::assertSame($expectedIDNDomain, $domainIDN->getContent()); + self::assertSame($expectedIDNDomain, $domainIDN->value()); } public function toUnicodeProvider(): iterable @@ -179,11 +179,11 @@ public function testToAscii( ?string $expectedAsciiDomain ): void { $domain = new Domain($domain); - self::assertSame($expectedDomain, $domain->getContent()); + self::assertSame($expectedDomain, $domain->value()); /** @var Domain $domainIDN */ $domainIDN = $domain->toAscii(); - self::assertSame($expectedAsciiDomain, $domainIDN->getContent()); + self::assertSame($expectedAsciiDomain, $domainIDN->value()); } public function toAsciiProvider(): iterable @@ -225,7 +225,7 @@ public function toAsciiProvider(): iterable public function testWithLabelWorks(Domain $domain, int $key, string $label, ?string $expected): void { $result = $domain->withLabel($key, $label); - self::assertSame($expected, $result->getContent()); + self::assertSame($expected, $result->value()); } public function withLabelWorksProvider(): iterable @@ -320,7 +320,7 @@ public function testWithLabelFailsWithInvalidLabel2(): void */ public function testAppend(string $raw, string $append, string $expected): void { - self::assertSame($expected, (string) (new Domain($raw))->append($append)); + self::assertSame($expected, (new Domain($raw))->append($append)->toString()); } public function validAppend(): iterable @@ -338,7 +338,7 @@ public function validAppend(): iterable */ public function testPrepend(string $raw, string $prepend, string $expected): void { - self::assertSame($expected, (string) (new Domain($raw))->prepend($prepend)); + self::assertSame($expected, (new Domain($raw))->prepend($prepend)->toString()); } public function validPrepend(): iterable @@ -357,7 +357,7 @@ public function validPrepend(): iterable public function testwithoutLabelWorks(Domain $domain, int $key, ?string $expected): void { $result = $domain->withoutLabel($key); - self::assertSame($expected, $result->getContent()); + self::assertSame($expected, $result->value()); } public function withoutLabelWorksProvider(): iterable @@ -396,7 +396,7 @@ public function testwithoutLabelFailsWithInvalidKey(): void public function testwithoutLabelWorksWithMultipleKeys(): void { - self::assertNull((new Domain('www.example.com'))->withoutLabel(0, 1, 2)->getContent()); + self::assertNull((new Domain('www.example.com'))->withoutLabel(0, 1, 2)->value()); } public function testConstructWithCustomIDNAOptions(): void @@ -428,10 +428,10 @@ public function testResolveWorksWithCustomIDNAOptions( IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE ); - self::assertSame($expectedContent, $domain->getContent()); - self::assertSame($expectedAscii, $domain->toAscii()->getContent()); - self::assertSame($expectedUnicode, $domain->toUnicode()->getContent()); - self::assertSame($expectedWithLabel, $domain->withLabel(-1, $withLabel)->getContent()); + self::assertSame($expectedContent, $domain->value()); + self::assertSame($expectedAscii, $domain->toAscii()->value()); + self::assertSame($expectedUnicode, $domain->toUnicode()->value()); + self::assertSame($expectedWithLabel, $domain->withLabel(-1, $withLabel)->value()); } public function resolveCustomIDNAOptionsProvider(): iterable diff --git a/src/Host.php b/src/Host.php index d90a12af..db50d6dc 100644 --- a/src/Host.php +++ b/src/Host.php @@ -17,14 +17,12 @@ interface Host extends Countable, JsonSerializable, IDNConversion /** * Returns the domain content. */ - public function getContent(): ?string; + public function value(): ?string; /** - * {@inheritdoc} - * - * The labels total number. + * Returns the domain content as a string. */ - public function count(): int; + public function toString(): string; /** * Returns the domain content. @@ -32,9 +30,11 @@ public function count(): int; public function jsonSerialize(): ?string; /** - * Returns the domain content as a string. + * {@inheritdoc} + * + * The labels total number. */ - public function __toString(): string; + public function count(): int; /** * Converts the domain to its IDNA ASCII form. diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 4f2f208d..9f1f1c7e 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -19,7 +19,7 @@ private function __construct(DomainName $publicSuffix, string $section) throw SyntaxError::dueToInvalidPublicSuffix($publicSuffix); } - if (null === $publicSuffix->getContent()) { + if (null === $publicSuffix->value()) { $section = ''; } @@ -73,17 +73,17 @@ public function count(): int public function jsonSerialize(): ?string { - return $this->publicSuffix->getContent(); + return $this->publicSuffix->value(); } - public function getContent(): ?string + public function value(): ?string { - return $this->publicSuffix->getContent(); + return $this->publicSuffix->value(); } - public function __toString(): string + public function toString(): string { - return $this->publicSuffix->__toString(); + return $this->publicSuffix->toString(); } public function getAsciiIDNAOption(): int diff --git a/src/PublicSuffixTest.php b/src/PublicSuffixTest.php index 73c94f2f..5c8d83e9 100644 --- a/src/PublicSuffixTest.php +++ b/src/PublicSuffixTest.php @@ -21,12 +21,12 @@ public function testInternalPhpMethod(): void $generatePublicSuffix = eval('return '.var_export($publicSuffix, true).';'); self::assertEquals($publicSuffix, $generatePublicSuffix); self::assertEquals('"ac.be"', json_encode($publicSuffix)); - self::assertSame('ac.be', (string) $publicSuffix); + self::assertSame('ac.be', $publicSuffix->toString()); } public function testPSToUnicodeWithUrlEncode(): void { - self::assertSame('bébe', PublicSuffix::fromUnknown('b%C3%A9be')->toUnicode()->getContent()); + self::assertSame('bébe', PublicSuffix::fromUnknown('b%C3%A9be')->toUnicode()->value()); } /** @@ -150,9 +150,9 @@ public function testResolveWithCustomIDNAOptions( string $expectedUnicode ): void { $publicSuffix = PublicSuffix::fromUnknown($name, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); - self::assertSame($expectedContent, $publicSuffix->getContent()); - self::assertSame($expectedAscii, $publicSuffix->toAscii()->getContent()); - self::assertSame($expectedUnicode, $publicSuffix->toUnicode()->getContent()); + self::assertSame($expectedContent, $publicSuffix->value()); + self::assertSame($expectedAscii, $publicSuffix->toAscii()->value()); + self::assertSame($expectedUnicode, $publicSuffix->toUnicode()->value()); /** @var PublicSuffix $instance */ $instance = $publicSuffix->toUnicode(); self::assertSame( diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 60cd70dc..be38797b 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -58,7 +58,7 @@ private function setPublicSuffix(EffectiveTLD $publicSuffix = null): EffectiveTL $asciiIDNAOptions = $this->domain->getAsciiIDNAOption(); $unicodeIDNAOptions = $this->domain->getUnicodeIDNAOption(); - if (null === $publicSuffix || null === $publicSuffix->getContent()) { + if (null === $publicSuffix || null === $publicSuffix->value()) { return PublicSuffix::fromNull($asciiIDNAOptions, $unicodeIDNAOptions); } @@ -66,18 +66,18 @@ private function setPublicSuffix(EffectiveTLD $publicSuffix = null): EffectiveTL throw UnableToResolveDomain::dueToUnresolvableDomain($this->domain); } - if ('.' === substr((string) $this->domain, -1, 1)) { + if ('.' === substr($this->domain->toString(), -1, 1)) { throw UnableToResolveDomain::dueToUnresolvableDomain($this->domain); } $publicSuffix = $this->normalize($publicSuffix); - if ($this->domain->getContent() === $publicSuffix->getContent()) { - throw new UnableToResolveDomain(sprintf('The public suffix and the domain name are is identical `%s`.', $this->domain)); + if ($this->domain->value() === $publicSuffix->value()) { + throw new UnableToResolveDomain(sprintf('The public suffix and the domain name are is identical `%s`.', $this->domain->toString())); } - $psContent = (string) $publicSuffix; - if ('.'.$psContent !== substr((string) $this->domain, - strlen($psContent) - 1)) { - throw new UnableToResolveDomain(sprintf('The public suffix `%s` can not be assign to the domain name `%s`', $psContent, $this->domain)); + $psContent = $publicSuffix->toString(); + if ('.'.$psContent !== substr($this->domain->toString(), - strlen($psContent) - 1)) { + throw new UnableToResolveDomain(sprintf('The public suffix `%s` can not be assign to the domain name `%s`', $psContent, $this->domain->toString())); } return $publicSuffix; @@ -88,7 +88,7 @@ private function setPublicSuffix(EffectiveTLD $publicSuffix = null): EffectiveTL */ private function normalize(EffectiveTLD $subject): EffectiveTLD { - if (1 !== preg_match(self::REGEXP_IDN_PATTERN, $this->domain->__toString())) { + if (1 !== preg_match(self::REGEXP_IDN_PATTERN, $this->domain->toString())) { return $subject->toAscii(); } @@ -100,12 +100,12 @@ private function normalize(EffectiveTLD $subject): EffectiveTLD */ private function setRegistrableDomain(): DomainName { - if (null === $this->publicSuffix->getContent()) { + if (null === $this->publicSuffix->value()) { return Domain::fromNull($this->domain->getAsciiIDNAOption(), $this->domain->getUnicodeIDNAOption()); } $domain = implode('.', array_slice( - explode('.', $this->domain->__toString()), + explode('.', $this->domain->toString()), count($this->domain) - count($this->publicSuffix) - 1 )); @@ -120,7 +120,7 @@ private function setSubDomain(): DomainName $asciiIDNAOptions = $this->domain->getAsciiIDNAOption(); $unicodeIDNAOptions = $this->domain->getUnicodeIDNAOption(); - if (null === $this->registrableDomain->getContent()) { + if (null === $this->registrableDomain->value()) { return Domain::fromNull($asciiIDNAOptions, $unicodeIDNAOptions); } @@ -131,7 +131,7 @@ private function setSubDomain(): DomainName } $domain = implode('.', array_slice( - explode('.', $this->domain->__toString()), + explode('.', $this->domain->toString()), 0, $nbLabels - $nbRegistrableLabels )); @@ -151,17 +151,17 @@ public function getDomain(): DomainName public function jsonSerialize(): ?string { - return $this->domain->getContent(); + return $this->domain->value(); } - public function getContent(): ?string + public function value(): ?string { - return $this->domain->getContent(); + return $this->domain->value(); } - public function __toString(): string + public function toString(): string { - return $this->domain->__toString(); + return $this->domain->toString(); } public function getAsciiIDNAOption(): int @@ -228,7 +228,7 @@ public function withPublicSuffix($publicSuffix): self } $domain = implode('.', array_reverse(array_slice($this->domain->labels(), count($this->publicSuffix)))); - if (null === $publicSuffix->getContent()) { + if (null === $publicSuffix->value()) { return new self( new Domain($domain, $this->domain->getAsciiIDNAOption(), $this->domain->getUnicodeIDNAOption()), null @@ -237,7 +237,7 @@ public function withPublicSuffix($publicSuffix): self /** @var DomainName $domain */ $domain = new Domain( - $domain.'.'.$publicSuffix->getContent(), + $domain.'.'.$publicSuffix->value(), $this->domain->getAsciiIDNAOption(), $this->domain->getUnicodeIDNAOption() ); @@ -255,7 +255,7 @@ public function withPublicSuffix($publicSuffix): self */ public function withSubDomain($subDomain): self { - if (null === $this->registrableDomain->getContent()) { + if (null === $this->registrableDomain->value()) { throw UnableToResolveDomain::dueToMissingRegistrableDomain($this); } @@ -273,13 +273,13 @@ public function withSubDomain($subDomain): self /** @var DomainName $subDomain */ $subDomain = $subDomain->toAscii(); - if (1 === preg_match(self::REGEXP_IDN_PATTERN, (string) $this->domain->getContent())) { + if (1 === preg_match(self::REGEXP_IDN_PATTERN, $this->domain->toString())) { /** @var DomainName $subDomain */ $subDomain = $subDomain->toUnicode(); } return new self(new Domain( - $subDomain.'.'.$this->registrableDomain, + $subDomain->toString().'.'.$this->registrableDomain->toString(), $this->getAsciiIDNAOption(), $this->getUnicodeIDNAOption() ), $this->publicSuffix); @@ -287,7 +287,7 @@ public function withSubDomain($subDomain): self public function withSecondLevelDomain($label): self { - if (null === $this->registrableDomain->getContent()) { + if (null === $this->registrableDomain->value()) { throw UnableToResolveDomain::dueToMissingRegistrableDomain($this); } @@ -296,12 +296,12 @@ public function withSecondLevelDomain($label): self return $this; } - if (null === $this->subDomain->getContent()) { + if (null === $this->subDomain->value()) { return new self($newRegistrableDomain, $this->publicSuffix); } return new self(new Domain( - $this->subDomain->getContent().'.'.$newRegistrableDomain->getContent(), + $this->subDomain->value().'.'.$newRegistrableDomain->value(), $this->getAsciiIDNAOption(), $this->getUnicodeIDNAOption() ), $this->publicSuffix); diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 2c4014fe..1be69ed6 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -18,9 +18,9 @@ class ResolvedDomainTest extends TestCase public function testRegistrableDomainIsNullWithFoundDomain(): void { $domain = new ResolvedDomain(new Domain('faketld')); - self::assertNull($domain->getPublicSuffix()->getContent()); - self::assertNull($domain->getRegistrableDomain()->getContent()); - self::assertNull($domain->getSubDomain()->getContent()); + self::assertNull($domain->getPublicSuffix()->value()); + self::assertNull($domain->getRegistrableDomain()->value()); + self::assertNull($domain->getSubDomain()->value()); self::assertNull($domain->getSecondLevelDomain()); } @@ -63,7 +63,7 @@ public function testDomainInternalPhpMethod(): void $generateDomain = eval('return '.var_export($domain, true).';'); self::assertEquals($domain, $generateDomain); self::assertEquals('"www.ulb.ac.be"', json_encode($domain->jsonSerialize())); - self::assertSame('www.ulb.ac.be', (string) $domain); + self::assertSame('www.ulb.ac.be', $domain->toString()); } /** @@ -106,13 +106,13 @@ public function testToIDN( $objPublicSuffix = (null === $publicSuffix) ? PublicSuffix::fromNull() : PublicSuffix::fromICANN($publicSuffix); $domain = new ResolvedDomain(new Domain($domain), $objPublicSuffix); - self::assertSame($expectedDomain, $domain->getContent()); - self::assertSame($expectedSuffix, $domain->getPublicSuffix()->getContent()); + self::assertSame($expectedDomain, $domain->value()); + self::assertSame($expectedSuffix, $domain->getPublicSuffix()->value()); /** @var ResolvedDomain $domainIDN */ $domainIDN = $domain->toUnicode(); - self::assertSame($expectedIDNDomain, $domainIDN->getContent()); - self::assertSame($expectedIDNSuffix, $domainIDN->getPublicSuffix()->getContent()); + self::assertSame($expectedIDNDomain, $domainIDN->value()); + self::assertSame($expectedIDNSuffix, $domainIDN->getPublicSuffix()->value()); } public function toUnicodeProvider(): iterable @@ -197,13 +197,13 @@ public function testToAscii( $objPublicSuffix = (null === $publicSuffix) ? PublicSuffix::fromNull() : PublicSuffix::fromICANN($publicSuffix); $domain = new ResolvedDomain(new Domain($domain), $objPublicSuffix); - self::assertSame($expectedDomain, $domain->getContent()); - self::assertSame($expectedSuffix, $domain->getPublicSuffix()->getContent()); + self::assertSame($expectedDomain, $domain->value()); + self::assertSame($expectedSuffix, $domain->getPublicSuffix()->value()); /** @var ResolvedDomain $domainIDN */ $domainIDN = $domain->toAscii(); - self::assertSame($expectedAsciiDomain, $domainIDN->getContent()); - self::assertSame($expectedAsciiSuffix, $domainIDN->getPublicSuffix()->getContent()); + self::assertSame($expectedAsciiDomain, $domainIDN->value()); + self::assertSame($expectedAsciiSuffix, $domainIDN->getPublicSuffix()->value()); } public function toAsciiProvider(): iterable @@ -260,7 +260,7 @@ public function toAsciiProvider(): iterable */ public function testResolveWorks(ResolvedDomain $domain, $publicSuffix, ?string $expected): void { - self::assertSame($expected, $domain->resolve($publicSuffix)->getPublicSuffix()->getContent()); + self::assertSame($expected, $domain->resolve($publicSuffix)->getPublicSuffix()->value()); } public function resolvePassProvider(): iterable @@ -363,7 +363,7 @@ public function testWithSubDomainWorks(ResolvedDomain $domain, $subdomain, ?stri { $result = $domain->withSubDomain($subdomain); - self::assertSame($expected, $result->getSubDomain()->getContent()); + self::assertSame($expected, $result->getSubDomain()->value()); self::assertEquals($domain->getPublicSuffix(), $result->getPublicSuffix()); self::assertEquals($domain->getRegistrableDomain(), $result->getRegistrableDomain()); } @@ -454,7 +454,7 @@ public function testWithPublicSuffixWorks( $result = $domain->withPublicSuffix($publicSuffix); $newPublicSuffix = $result->getPublicSuffix(); - self::assertSame($expected, $newPublicSuffix->getContent()); + self::assertSame($expected, $newPublicSuffix->value()); self::assertSame($isKnown, $newPublicSuffix->isKnown()); self::assertSame($isICANN, $newPublicSuffix->isICANN()); self::assertSame($isPrivate, $newPublicSuffix->isPrivate()); @@ -567,11 +567,11 @@ public function testResolveWorksWithCustomIDNAOptions( $host = new Domain($domainName, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); $resolvedDomain = new ResolvedDomain($host, PublicSuffix::fromICANN($publicSuffix)); - self::assertSame($expectedContent, $resolvedDomain->getContent()); - self::assertSame($expectedAscii, $resolvedDomain->toAscii()->getContent()); - self::assertSame($expectedUnicode, $resolvedDomain->toUnicode()->getContent()); - self::assertSame($expectedRegistrable, $resolvedDomain->getRegistrableDomain()->getContent()); - self::assertSame($expectedSubDomain, $resolvedDomain->getSubDomain()->getContent()); + self::assertSame($expectedContent, $resolvedDomain->value()); + self::assertSame($expectedAscii, $resolvedDomain->toAscii()->value()); + self::assertSame($expectedUnicode, $resolvedDomain->toUnicode()->value()); + self::assertSame($expectedRegistrable, $resolvedDomain->getRegistrableDomain()->value()); + self::assertSame($expectedSubDomain, $resolvedDomain->getSubDomain()->value()); } public function resolveCustomIDNAOptionsProvider(): iterable @@ -674,7 +674,7 @@ public function testWithSecondLevelDomain( $newDomain = $domain->withSecondLevelDomain($sld); self::assertSame($expectedSld, $newDomain->getSecondLevelDomain()); - self::assertEquals($expectedHost, $newDomain->getContent()); + self::assertEquals($expectedHost, $newDomain->value()); self::assertEquals($domain->getPublicSuffix(), $newDomain->getPublicSuffix()); self::assertEquals($domain->getSubDomain(), $newDomain->getSubDomain()); } diff --git a/src/RootZoneDatabaseConverter.php b/src/RootZoneDatabaseConverter.php index 612d8d2a..722a25c0 100644 --- a/src/RootZoneDatabaseConverter.php +++ b/src/RootZoneDatabaseConverter.php @@ -98,10 +98,10 @@ private function extractRootZone(string $content): string throw UnableToLoadRootZoneDatabase::dueToInvalidRootZoneDomain($content, $exception); } - if (1 !== $tld->count() || '' === $tld->getContent()) { + if (1 !== $tld->count() || '' === $tld->value()) { throw UnableToLoadRootZoneDatabase::dueToInvalidRootZoneDomain($content); } - return (string) $tld; + return $tld->toString(); } } diff --git a/src/Rules.php b/src/Rules.php index a618b9e7..ee97603b 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -176,7 +176,7 @@ private function validateDomain($domain): DomainName $domain = new Domain($domain); } - if ((2 > count($domain)) || ('.' === substr((string) $domain, -1, 1))) { + if ((2 > count($domain)) || ('.' === substr($domain->toString(), -1, 1))) { throw UnableToResolveDomain::dueToUnresolvableDomain($domain); } diff --git a/src/RulesTest.php b/src/RulesTest.php index a8b52cd4..a7cbfcb6 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -111,7 +111,7 @@ public function testWithExceptionName(): void { $domain = $this->rules->resolve('_b%C3%A9bé.be-'); - self::assertNull($domain->getContent()); + self::assertNull($domain->value()); } public function testWithPrivateDomain(): void @@ -121,18 +121,18 @@ public function testWithPrivateDomain(): void self::assertTrue($domain->getPublicSuffix()->isKnown()); self::assertFalse($domain->getPublicSuffix()->isICANN()); self::assertTrue($domain->getPublicSuffix()->isPrivate()); - self::assertSame('github.io', $domain->getPublicSuffix()->getContent()); + self::assertSame('github.io', $domain->getPublicSuffix()->value()); } public function testWithAbsoluteHostInvalid(): void { $domain = $this->rules->resolve('private.ulb.ac.be.'); - self::assertSame('private.ulb.ac.be.', $domain->getContent()); + self::assertSame('private.ulb.ac.be.', $domain->value()); self::assertFalse($domain->getPublicSuffix()->isKnown()); self::assertFalse($domain->getPublicSuffix()->isICANN()); self::assertFalse($domain->getPublicSuffix()->isPrivate()); - self::assertNull($domain->getPublicSuffix()->getContent()); + self::assertNull($domain->getPublicSuffix()->value()); } public function testWithICANNDomainInvalid(): void @@ -159,22 +159,22 @@ public function testWithPrivateDomainValid(): void { $domain = $this->rules->getPrivateDomain('thephpleague.github.io'); - self::assertSame('thephpleague.github.io', $domain->getContent()); + self::assertSame('thephpleague.github.io', $domain->value()); self::assertTrue($domain->getPublicSuffix()->isKnown()); self::assertFalse($domain->getPublicSuffix()->isICANN()); self::assertTrue($domain->getPublicSuffix()->isPrivate()); - self::assertSame('github.io', $domain->getPublicSuffix()->getContent()); + self::assertSame('github.io', $domain->getPublicSuffix()->value()); } public function testResolvingICANNDomainInvalid(): void { $domain = $this->rules->resolve('private.ulb.ac.be'); - self::assertSame('private.ulb.ac.be', $domain->getContent()); + self::assertSame('private.ulb.ac.be', $domain->value()); self::assertTrue($domain->getPublicSuffix()->isKnown()); self::assertTrue($domain->getPublicSuffix()->isICANN()); self::assertFalse($domain->getPublicSuffix()->isPrivate()); - self::assertSame('ac.be', $domain->getPublicSuffix()->getContent()); + self::assertSame('ac.be', $domain->getPublicSuffix()->value()); } public function testWithDomainObject(): void @@ -186,11 +186,11 @@ public function testWithDomainObject(): void $newDomain = $this->rules->resolve($domain); - self::assertSame('private.ulb.ac.be', $domain->getContent()); + self::assertSame('private.ulb.ac.be', $domain->value()); self::assertTrue($domain->getPublicSuffix()->isKnown()); self::assertTrue($domain->getPublicSuffix()->isICANN()); self::assertFalse($domain->getPublicSuffix()->isPrivate()); - self::assertSame('ac.be', $domain->getPublicSuffix()->getContent()); + self::assertSame('ac.be', $domain->getPublicSuffix()->value()); self::assertEquals($domain, $newDomain); } @@ -200,7 +200,7 @@ public function testWithDomainInterfaceObject(): void self::assertSame( 'ac.be', - $this->rules->getCookieDomain($domain)->getPublicSuffix()->getContent() + $this->rules->getCookieDomain($domain)->getPublicSuffix()->value() ); } @@ -214,7 +214,7 @@ public function testGetRegistrableDomain(?string $publicSuffix, ?string $registr { $foundRegistrableDomain = $this->rules->resolve($domain)->getRegistrableDomain(); - self::assertSame($registrableDomain, $foundRegistrableDomain->getContent()); + self::assertSame($registrableDomain, $foundRegistrableDomain->value()); } /** @@ -227,7 +227,7 @@ public function testGetPublicSuffix(?string $publicSuffix, ?string $registrableD { $effectiveTLD = $this->rules->resolve($domain)->getPublicSuffix(); - self::assertSame($publicSuffix, $effectiveTLD->getContent()); + self::assertSame($publicSuffix, $effectiveTLD->value()); } /** @@ -238,7 +238,7 @@ public function testGetPublicSuffix(?string $publicSuffix, ?string $registrableD */ public function testGetDomain(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { - self::assertSame($expectedDomain, $this->rules->resolve($domain)->getContent()); + self::assertSame($expectedDomain, $this->rules->resolve($domain)->value()); } public function parseDataProvider(): iterable @@ -403,7 +403,7 @@ public function invalidHostParseProvider(): iterable public function testPublicSuffixSection(?string $domain, ?string $expected): void { $publicSuffix = $this->rules->getCookieDomain($domain)->getPublicSuffix(); - self::assertSame($expected, $publicSuffix->getContent()); + self::assertSame($expected, $publicSuffix->value()); } public function validPublicSectionProvider(): iterable @@ -438,7 +438,7 @@ public function validPublicSectionProvider(): iterable */ public function checkPublicSuffix(?string $input, ?string $expected): void { - self::assertSame($expected, $this->rules->resolve($input)->getRegistrableDomain()->getContent()); + self::assertSame($expected, $this->rules->resolve($input)->getRegistrableDomain()->value()); } /** @@ -574,9 +574,9 @@ public function testResolveWithIDNAOptions(): void */ public function testEffectiveTLDResolution(string $host, string $cookieETLD, string $icannETLD, string $privateETLD): void { - self::assertSame($cookieETLD, (string) $this->rules->getCookieDomain($host)->getPublicSuffix()); - self::assertSame($icannETLD, (string) $this->rules->getICANNDomain($host)->getPublicSuffix()); - self::assertSame($privateETLD, (string) $this->rules->getPrivateDomain($host)->getPublicSuffix()); + self::assertSame($cookieETLD, $this->rules->getCookieDomain($host)->getPublicSuffix()->toString()); + self::assertSame($icannETLD, $this->rules->getICANNDomain($host)->getPublicSuffix()->toString()); + self::assertSame($privateETLD, $this->rules->getPrivateDomain($host)->getPublicSuffix()->toString()); } public function effectiveTLDProvider(): iterable diff --git a/src/SyntaxError.php b/src/SyntaxError.php index f439a66e..bd4455b4 100644 --- a/src/SyntaxError.php +++ b/src/SyntaxError.php @@ -24,7 +24,7 @@ public static function dueToIDNAError(string $domain, string $message = ''): sel public static function dueToInvalidPublicSuffix(Host $publicSuffix): self { - return new self('The public suffix `"'.$publicSuffix->getContent() ?? 'NULL'.'"` is invalid.'); + return new self('The public suffix `"'.$publicSuffix->value() ?? 'NULL'.'"` is invalid.'); } public static function dueToUnsupportedType(string $domain): self @@ -34,6 +34,6 @@ public static function dueToUnsupportedType(string $domain): self public static function dueToInvalidLabelKey(Host $domain, int $key): self { - return new self('the given key `'.$key.'` is invalid for the domain `"'.$domain->getContent() ?? 'NULL'.'"`.'); + return new self('the given key `'.$key.'` is invalid for the domain `"'.$domain->value() ?? 'NULL'.'"`.'); } } diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 1a38eeba..d0ef5ebf 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -164,7 +164,7 @@ public function contains($tld): bool $asciiDomain = $tld->toAscii(); $label = $asciiDomain->label(0); foreach ($this as $knownTld) { - if ($knownTld->getContent() === $label) { + if ($knownTld->value() === $label) { return true; } } @@ -185,13 +185,13 @@ public function resolve($domain): ResolvedDomainName $domain = new Domain($domain); } - if ((2 > count($domain)) || ('.' === substr((string) $domain, -1, 1))) { + if ((2 > count($domain)) || ('.' === substr($domain->toString(), -1, 1))) { throw UnableToResolveDomain::dueToUnresolvableDomain($domain); } $label = $domain->toAscii()->label(0); foreach ($this as $tld) { - if ($tld->getContent() === $label) { + if ($tld->value() === $label) { return new ResolvedDomain($domain, PublicSuffix::fromUnknown($tld, $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption())); } } diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 52e6f966..0fcf8eca 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -98,7 +98,7 @@ public function testResolve($tld): void { self::assertSame( (new Domain($tld))->label(0), - $this->topLevelDomains->resolve($tld)->getPublicSuffix()->getContent() + $this->topLevelDomains->resolve($tld)->getPublicSuffix()->value() ); } @@ -114,7 +114,7 @@ public function validDomainProvider(): iterable 'Unicode domain (2)' => ['кто.рф'], 'Unicode domain (3)' => ['Deutsche.Vermögensberatung.vermögensberater'], 'object with __toString method' => [new class() { - public function __toString() + public function __toString(): string { return 'www.இந.இந்தியா'; } @@ -147,7 +147,7 @@ public function testResolveWithUnregisteredTLD(): void { $collection = TopLevelDomains::fromPath(dirname(__DIR__).'/test_data/root_zones.dat'); - self::assertNull($collection->resolve('localhost.locale')->getPublicSuffix()->getContent()); + self::assertNull($collection->resolve('localhost.locale')->getPublicSuffix()->value()); } public function testResolveWithIDNAOptions(): void @@ -195,7 +195,7 @@ public function validTldProvider(): iterable 'Unicode TLD (4)' => ['இந்தியா'], 'Unicode TLD (5)' => ['vermögensberater'], 'object with __toString method' => [new class() { - public function __toString() + public function __toString(): string { return 'COM'; } @@ -228,7 +228,7 @@ public function invalidTldProvider(): iterable 'invalid IDN to ASCII with leading dot' => ['.XN--TTT'], 'null' => [null], 'object with __toString method' => [new class() { - public function __toString() + public function __toString(): string { return 'COMMM'; } diff --git a/src/UnableToResolveDomain.php b/src/UnableToResolveDomain.php index ee57b710..37535be4 100644 --- a/src/UnableToResolveDomain.php +++ b/src/UnableToResolveDomain.php @@ -14,7 +14,7 @@ public static function dueToMissingPublicSuffix(Host $domain, string $type): sel { $domainType = (EffectiveTLD::PRIVATE_DOMAINS === $type) ? 'private' : 'ICANN'; - $exception = new self('The domain "'.$domain->getContent().'" does not contain a "'.$domainType.'" TLD.'); + $exception = new self('The domain "'.$domain->value().'" does not contain a "'.$domainType.'" TLD.'); $exception->domain = $domain; return $exception; @@ -24,7 +24,7 @@ public static function dueToUnresolvableDomain(?Host $domain): self { $content = $domain; if (null !== $content) { - $content = $content->getContent(); + $content = $content->value(); } $exception = new self('The domain "'.$content.'" can not contain a public suffix.'); @@ -37,7 +37,7 @@ public static function dueToMissingRegistrableDomain(Host $domain = null): self { $content = $domain; if (null !== $content) { - $content = $content->getContent(); + $content = $content->value(); } $exception = new self('A subdomain can not be added to a domain "'.$content.'" without a registrable domain part.'); From 84da09b57346cd6a6c1970d96584505da4017c74 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Fri, 13 Nov 2020 21:52:02 +0100 Subject: [PATCH 286/461] Update README --- README.md | 46 +++++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 2f5ad3f3..a2f3cb90 100644 --- a/README.md +++ b/README.md @@ -39,12 +39,23 @@ You need: ## Usage -### Public Suffix List Resolution +### Resolving Domains + +A resolved domain contains the following parts: -#### Resolving Domains +- an effective TLD or public suffix +- a second level domain which represent the label that follow the public suffix +- a registrable domain which represents the effective TLD prepended with the second level domain +- an optional subdomain -The first objective of the library is to use the [Public Suffix List](http://publicsuffix.org/) to easily resolve a -domain as a `Pdp\ResolvedDomain` object using the following methods: +To effectively resolve a domain you need a public source. This library can resolve domains against: + +- The [Public Suffix List](http://publicsuffix.org/) +- The [IANA Root Zone Database](https://data.iana.org/TLD/tlds-alpha-by-domain.txt) + +### Public Suffix List Resolution + +Using the `Pdp\Rules` class you can easily resolve a domain as a `Pdp\ResolvedDomain` object against the [Public Suffix List](http://publicsuffix.org/) as shown below: ~~~php getSubDomain()->toString(); //display 'www'; In case of an error an exception which extends `Pdp\CannotProcessHost` is thrown. -#### Public Suffix Type +#### Public Suffix Section The [Public Suffix List](http://publicsuffix.org/) is organized in sections. This library can give you access to this information via its public suffix object. @@ -97,8 +108,7 @@ use Pdp\Rules; $rules = Rules::fromPath('/path/to/cache/public-suffix-list.dat'); $rules->getICANNDomain('qfdsf.unknownTLD'); -// will trigger an UnableToResolveDomain exception because `.unknownTLD` is not -// part of the ICANN section +// will throw because `.unknownTLD` is not part of the ICANN section $rules->getCookieDomain('qfdsf.unknownTLD'); // will not throw because the domain syntax is correct. @@ -110,7 +120,7 @@ $rules->resolve('com'); // will return a Nullable Resolved domain ~~~ -It is possible to access the labels that compose the underlying public suffix domain using the following call: +It is possible to access the labels composing the underlying public suffix domain using the following call: ~~~php resolve('example.github.io')->getPublicSuffix(); -$publicSuffixDomain = $publicSuffix->getDomain(); +$publicSuffixLabels = $publicSuffix->getDomain(); +$publicSuffixLabels->labels(); // will return ['io', 'github'] ~~~ -Domain objects usage is explain in the next section. +Domain objects usage are explain in the next section. #### Accessing and processing Domain labels @@ -160,13 +171,22 @@ You can also add or remove labels according to their key index using the followi - `Domain::append(string|Stringable $label): self;` - `Domain::prepend(string|Stringable $label): self;` -A domain object is directly returned from the following calls: +The following methods from the `ResolvedDomain` object will return an `Domain` object: - `ResolvedDomain::getDomain` - `ResolvedDomain::getRegistrableDomain` - `ResolvedDomain::getSubDomain` - `ResolvedDomain::getRegistrableDomain` +#### Modifying the ResolvedDomain + +You can still easily modify the returned `ResolvedDomain` object part using the following methods + +- `ResolvedDomain::withSubDomain(Host $subDomain): self` +- `ResolvedDomain::withSecondLevelDomain(?string $label): self` +- `ResolvedDomain::withPublicSuffix(PublicSuffix $publicSuffix): self` +- `ResolvedDomain::resolve(PublicSuffix $publicSuffix): self` + ### Top Level Domains resolution While the [Public Suffix List](http://publicsuffix.org/) is a community based list, the package provides access to @@ -211,8 +231,8 @@ standard interfaces published by the PHP-FIG to improve its interoperability wit To work as intended, the `Pdp\Storage\PsrStorageFactory` constructor requires: -- a [PSR-16](http://www.php-fig.org/psr/psr-16/) A Cache object to store the rules locally. -- a [PSR-18](http://www.php-fig.org/psr/psr-18/) A PSR-18 HTTP Client. +- a [PSR-16](http://www.php-fig.org/psr/psr-16/) Cache object. +- a [PSR-18](http://www.php-fig.org/psr/psr-18/) HTTP Client. When creating a new storage instance you will require: From 9b7180de3b3c6aa203691df31167d5c6a4d7c776 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sat, 14 Nov 2020 21:25:07 +0100 Subject: [PATCH 287/461] Remove ResolvedDomainName::resolve method --- phpstan.neon | 2 - src/ResolvedDomain.php | 15 ++---- src/ResolvedDomainName.php | 13 ----- src/ResolvedDomainTest.php | 107 ------------------------------------- 4 files changed, 3 insertions(+), 134 deletions(-) diff --git a/phpstan.neon b/phpstan.neon index b0749432..67a3d6dd 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -10,8 +10,6 @@ parameters: - '#should be covariant with return type#' - message: '#Property Pdp\\TopLevelDomains::\$modifiedDate \(DateTimeImmutable\) does not accept DateTimeInterface.#' path: src/TopLevelDomains.php - - message: '#Method Pdp\\ResolvedDomain::resolve\(\) has parameter \$publicSuffix with no typehint specified.#' - path: src/ResolvedDomain.php - message: '#Method Pdp\\ResolvedDomain::withSubDomain\(\) has parameter \$subDomain with no typehint specified.#' path: src/ResolvedDomain.php - message: '#Call to function array_keys\(\) requires parameter \#3 to be set.#' diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index be38797b..16761dbf 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -204,15 +204,6 @@ public function toUnicode(): self return new self($this->domain->toUnicode(), $this->publicSuffix->toUnicode()); } - public function resolve($publicSuffix): self - { - if (!$publicSuffix instanceof EffectiveTLD) { - $publicSuffix = PublicSuffix::fromUnknown($publicSuffix); - } - - return new self($this->domain, $publicSuffix); - } - /** * @param mixed $publicSuffix a public suffix */ @@ -227,17 +218,17 @@ public function withPublicSuffix($publicSuffix): self return $this; } - $domain = implode('.', array_reverse(array_slice($this->domain->labels(), count($this->publicSuffix)))); + $host = implode('.', array_reverse(array_slice($this->domain->labels(), count($this->publicSuffix)))); if (null === $publicSuffix->value()) { return new self( - new Domain($domain, $this->domain->getAsciiIDNAOption(), $this->domain->getUnicodeIDNAOption()), + new Domain($host, $this->domain->getAsciiIDNAOption(), $this->domain->getUnicodeIDNAOption()), null ); } /** @var DomainName $domain */ $domain = new Domain( - $domain.'.'.$publicSuffix->value(), + $host.'.'.$publicSuffix->value(), $this->domain->getAsciiIDNAOption(), $this->domain->getUnicodeIDNAOption() ); diff --git a/src/ResolvedDomainName.php b/src/ResolvedDomainName.php index b3e475fe..4e9aab97 100644 --- a/src/ResolvedDomainName.php +++ b/src/ResolvedDomainName.php @@ -45,17 +45,4 @@ public function withSecondLevelDomain(?string $label): self; * otherwise the public suffix content is added to or remove from the current domain. */ public function withPublicSuffix(EffectiveTLD $publicSuffix): self; - - /** - * Returns a Domain object with a new resolve public suffix. - * - * The Public Suffix must be valid for the given domain name. - * ex: if the domain name is www.ulb.ac.be the only valid public suffixes - * are: be, ac.be, ulb.ac.be, or the null public suffix. Any other public - * suffix will throw an Exception. - * - * This method MUST retain the state of the current instance, and return - * an instance that contains the modified Public Suffix Information. - */ - public function resolve(EffectiveTLD $publicSuffix): self; } diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 1be69ed6..8e51f9a8 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -252,107 +252,6 @@ public function toAsciiProvider(): iterable ]; } - /** - * @dataProvider resolvePassProvider - * - * @param mixed $publicSuffix the public suffix to resolve - * @param ?string $expected - */ - public function testResolveWorks(ResolvedDomain $domain, $publicSuffix, ?string $expected): void - { - self::assertSame($expected, $domain->resolve($publicSuffix)->getPublicSuffix()->value()); - } - - public function resolvePassProvider(): iterable - { - $publicSuffix = PublicSuffix::fromICANN('ac.be'); - $domain = new ResolvedDomain(new Domain('ulb.ac.be'), $publicSuffix); - - return [ - 'null public suffix' => [ - 'domain' => $domain, - 'public suffix' => PublicSuffix::fromNull(), - 'expected' => null, - ], - 'null public suffix (with null value)' => [ - 'domain' => $domain, - 'public suffix' => null, - 'expected' => null, - ], - 'same public suffix' => [ - 'domain' => $domain, - 'public suffix' => $publicSuffix, - 'expected' => 'ac.be', - ], - 'same public suffix (with string value)' => [ - 'domain' => $domain, - 'public suffix' => 'ac.be', - 'expected' => 'ac.be', - ], - 'update public suffix' => [ - 'domain' => $domain, - 'public suffix' => PublicSuffix::fromICANN('be'), - 'expected' => 'be', - ], - 'idn domain name' => [ - 'domain' => new ResolvedDomain(new Domain('Яндекс.РФ'), PublicSuffix::fromICANN('рф')), - 'public suffix' => PublicSuffix::fromICANN('рф'), - 'expected' => 'рф', - ], - 'idn domain name with ascii public suffix' => [ - 'domain' => new ResolvedDomain(new Domain('Яндекс.РФ'), PublicSuffix::fromICANN('рф')), - 'public suffix' => PublicSuffix::fromICANN('xn--p1ai'), - 'expected' => 'рф', - ], - ]; - } - - /** - * @dataProvider resolveFailsProvider - */ - public function testResolveFails(ResolvedDomain $domain, EffectiveTLD $publicSuffix): void - { - self::expectException(UnableToResolveDomain::class); - $domain->resolve($publicSuffix); - } - - public function resolveFailsProvider(): iterable - { - $publicSuffix = PublicSuffix::fromICANN('ac.be'); - $domain = new ResolvedDomain(new Domain('ulb.ac.be'), $publicSuffix); - - return [ - 'public suffix mismatch' => [ - 'domain' => $domain, - 'public suffix' => PublicSuffix::fromICANN('ac.fr'), - ], - 'domain name can not contains public suffix' => [ - 'domain' => new ResolvedDomain(new Domain('localhost')), - 'public suffix' => $publicSuffix, - ], - 'domain name is equal to public suffix' => [ - 'domain' => new ResolvedDomain(new Domain('ac.be')), - 'public suffix' => $publicSuffix, - ], - 'partial public suffix' => [ - 'domain' => new ResolvedDomain($domain), - 'public suffix' => PublicSuffix::fromICANN('c.be'), - ], - 'mismatch idn public suffix' => [ - 'domain' => new ResolvedDomain(new Domain('www.食狮.公司.cn')), - 'public suffix' => PublicSuffix::fromICANN('cn.公司'), - ], - ]; - } - - public function testResolveReturnsInstance(): void - { - $publicSuffix = PublicSuffix::fromICANN('ac.be'); - $domain = new ResolvedDomain(new Domain('ulb.ac.be'), $publicSuffix); - self::assertEquals($domain, $domain->resolve($publicSuffix)); - self::assertNotSame($domain, $domain->resolve(PublicSuffix::fromPrivate('ac.be'))); - } - /** * @dataProvider withSubDomainWorksProvider * @@ -647,12 +546,6 @@ public function testInstanceCreationWithCustomIDNAOptions(): void [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] ); - - $instance = $domain->resolve(PublicSuffix::fromICANN('com')); - self::assertSame( - [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], - [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] - ); } /** From 5c6751831ef376159be862ac968399f81032e464 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sat, 14 Nov 2020 21:25:20 +0100 Subject: [PATCH 288/461] Improve README documentation --- README.md | 317 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 226 insertions(+), 91 deletions(-) diff --git a/README.md b/README.md index a2f3cb90..eff15b9d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # PHP Domain Parser -**PHP Domain Parser** is a [Public Suffix List](http://publicsuffix.org/) based domain parser implemented in PHP. +**PHP Domain Parser** is domain parser implemented in PHP. ![Quality Assurance](https://github.com/jeremykendall/php-domain-parser/workflows/Quality%20Assurance/badge.svg) [![Total Downloads][ico-packagist]][link-packagist] @@ -11,11 +11,13 @@ While there are plenty of excellent URL parsers and builders available, there are very few projects that can accurately parse a domain into its component -subdomain, registrable domain, and public suffix parts. +subdomain, registrable domain, second level domain and public suffix parts. Consider the domain www.pref.okinawa.jp. In this domain, the *public suffix* portion is **okinawa.jp**, the *registrable domain* is -**pref.okinawa.jp**, and the *subdomain* is **www**. You can't regex that. +**pref.okinawa.jp**, the *subdomain* is **www** and +the *second level domain* is **pref**. +You can't regex that. PHP Domain Parser is compliant around: @@ -41,21 +43,19 @@ You need: ### Resolving Domains -A resolved domain contains the following parts: - -- an effective TLD or public suffix -- a second level domain which represent the label that follow the public suffix -- a registrable domain which represents the effective TLD prepended with the second level domain -- an optional subdomain - -To effectively resolve a domain you need a public source. This library can resolve domains against: +To effectively resolve a domain you need a public source. This library can +resolve a domain against: - The [Public Suffix List](http://publicsuffix.org/) - The [IANA Root Zone Database](https://data.iana.org/TLD/tlds-alpha-by-domain.txt) -### Public Suffix List Resolution +**WARNING: all objects are immutable, modifying the underlying object will not +affect the parent object.** -Using the `Pdp\Rules` class you can easily resolve a domain as a `Pdp\ResolvedDomain` object against the [Public Suffix List](http://publicsuffix.org/) as shown below: +#### Resolving the Domain against the Public Suffix List + +Using the `Pdp\Rules` class you can resolve a domain as a `Pdp\ResolvedDomain` +object against the [Public Suffix List](http://publicsuffix.org/) as shown below: ~~~php resolve('www.PreF.OkiNawA.jP'); -echo $resolvedDomain->getDomain()->toString(); //display 'www.pref.okinawa.jp'; -echo $resolvedDomain->getPublicSuffix()->toString(); //display 'okinawa.jp'; +echo $resolvedDomain->toString(); //display 'www.pref.okinawa.jp'; +echo $resolvedDomain->getSubDomain()->toString(); //display 'www'; echo $resolvedDomain->getSecondLevelDomain(); //display 'pref'; echo $resolvedDomain->getRegistrableDomain()->toString(); //display 'pref.okinawa.jp'; -echo $resolvedDomain->getSubDomain()->toString(); //display 'www'; +echo $resolvedDomain->getPublicSuffix()->toString(); //display 'okinawa.jp'; +$resolvedDomain->getPublicSuffix()->isICANN(); //returns true; ~~~ -In case of an error an exception which extends `Pdp\CannotProcessHost` is thrown. +In case of an error an exception which implements the `Pdp\CannotProcessHost` +is thrown. + +The `Pdp\ResolvedDomain` instance can be modify using the following methods: -#### Public Suffix Section +~~~php +resolve('shop.example.com'); +$newResolvedDomain = $resolvedDomain + ->withSubDomain('foo.bar') + ->withSecondLevelDomain('test') + ->withPublicSuffix('example'); + +echo $resolvedDomain->toString(); //display 'shop.example.com'; +$resolvedDomain->getPublicSuffix()->isKnown(); //returns true; + +echo $newResolvedDomain->toString(); //display 'foo.bar.test.example'; +$newResolvedDomain->getPublicSuffix()->isKnown(); //returns false; +~~~ + +**WARNING: All the objects are immutable, the changes are applied on the new +instance while the source instance stays unchanged.** + +The public suffix method `isKnown` will always return `false` if +you use a simple string to update the public suffix. +If you use a `PublicSuffix` object the method may return `true`. +See the following section for more information. + +#### Public Suffix List Sections + +The [Public Suffix List](http://publicsuffix.org/) is organized in sections. +This library can give you access to this information via its public suffix +object. ~~~php isPrivate(); // will return true $publicSuffix->isKnown(); // will return true ~~~ -Because the PSL algorithm is fault tolerant this library exposes more strict methods +The public suffix state depends on its value: + +- `isKnown` returns `true` if the value is part of the PSL. +- `isICANN` returns `true` if the value is part of the PSL ICANN section. +- `isPrivate` returns `true` if the value is part of the PSL private section. + +If the value is not present in the PSL all the methods above will return `false`. + +Because the PSL algorithm is fault tolerant this library exposes more strict +methods: - `Rules::getCookieDomain` - `Rules::getICANNDomain` - `Rules::getPrivateDomain` -These methods act and resolve the domain against the PSL just like the `resolve` method but will throw -an exception if no valid effective TLD is found in the respective PSL section or if the submitted domain is invalid. +These methods act and resolve the domain against the PSL just like +the `resolve` method but will throw an exception if no valid effective +TLD is found in the respective PSL section or if the submitted domain +is invalid. ~~~php getICANNDomain('qfdsf.unknownTLD'); -// will throw because `.unknownTLD` is not part of the ICANN section +// will throw because `.unknownTLD` is not part of the ICANN section $rules->getCookieDomain('qfdsf.unknownTLD'); // will not throw because the domain syntax is correct. @@ -119,29 +162,58 @@ $rules->getCookieDomain('com'); $rules->resolve('com'); // will return a Nullable Resolved domain ~~~ + +#### Resolving the Domain against the IANA Root Zone Database -It is possible to access the labels composing the underlying public suffix domain using the following call: +While the [Public Suffix List](http://publicsuffix.org/) is a community based +list, the package provides access to the Top Level domain information given by +the [IANA website](https://data.iana.org/TLD/tlds-alpha-by-domain.txt) to always +resolve top domain against all registered TLD even the new ones. ~~~php -resolve('example.github.io')->getPublicSuffix(); +$iana = TopLevelDomains::fromPath('/path/to/cache/tlds-alpha-by-domain.txt'); -$publicSuffixLabels = $publicSuffix->getDomain(); -$publicSuffixLabels->labels(); // will return ['io', 'github'] +$resolvedDomain = $iana->resolve('www.PreF.OkiNawA.jP'); +echo $resolvedDomain->toString(); //display 'www.pref.okinawa.jp'; +echo $resolvedDomain->getPublicSuffix()->toString(); //display 'jp'; +echo $resolvedDomain->getSecondLevelDomain(); //display 'okinawa'; +echo $resolvedDomain->getRegistrableDomain()->toString(); //display 'okinawa.jp'; +echo $resolvedDomain->getSubDomain()->toString(); //display 'www.pref'; ~~~ - -Domain objects usage are explain in the next section. - -#### Accessing and processing Domain labels -From the `ResolvedDomain` you can access the underlying domain object using the `ResolvedDomain::getDomain` method. -Accessing this object enables you to work with the domain labels. +In case of an error an exception which extends `Pdp\CannotProcessHost` is thrown. + +**WARNING:** + +**You should never use the library this way in production, without, at least, a +caching mechanism to reduce PSL downloads.** + +**Using the Public Suffix List to determine what is a valid domain name and what +isn't is dangerous, particularly in these days when new gTLDs are arriving at a +rapid pace.** + +**The DNS is the proper source for this information.** + +**If you are looking to know the validity of a Top Level Domain, the IANA Root Zone +Database is the proper source for this information.** + +**If you must use this library for any of the above purposes, please consider +integrating an update mechanism into your software.** -**WARNING: all objects are immutable, modifying the underlying object will not affect the parent object.** +### Accessing and processing Domain labels + +If you are interested into manipulating the domain labels without taking into +account the Effective TLD, you can access them using the `getDomain` method +from the `ResolvedDomain` or the `PublicSuffixList` instances. + +Accessing this object enables you to work with the domain labels. + +It is possible to access the labels composing the underlying public suffix +domain using the following call: + +Domain objects usage are explain in the next section. ~~~php resolve('www.ExAmpLE.cOM'); +$resolvedDomain = $rules->resolve('www.bbc.co.uk'); $domain = $resolvedDomain->getDomain(); -echo $domain->toString(); // display 'www.example.com' -$domain->labels(); // returns ['com', 'example', 'www']; +echo $domain->toString(); // display 'www.bbc.co.uk' +$domain->labels(); // returns ['uk', 'co', 'bbc', 'www']; $domain->label(-1); // returns 'www' -$domain->label(0); // returns 'com' +$domain->label(0); // returns 'uk' foreach ($domain as $label) { echo $label, PHP_EOL; } // display -// com -// example +// uk +// co +// bbc // www + +$publicSuffixDomain = $resolvedDomain->getPublicSuffix()->getDomain(); +$publicSuffixDomain->labels(); // returns ['uk', 'co'] ~~~ -You can also add or remove labels according to their key index using the following methods: +You can also add or remove labels according to their key index using the +following methods: + +~~~php +resolve('www.ExAmpLE.cOM'); +$domain = $resolvedDomain->getDomain(); + +$newDomain = $domain + ->withLabel(1, 'com') + ->withoutLabel(0, -1) + ->append('www') + ->prepend('example'); -- `Domain::withLabel(int $key, string|Stringable $label): self;` -- `Domain::withoutLabel(int $key, int ...$keys): self;` -- `Domain::append(string|Stringable $label): self;` -- `Domain::prepend(string|Stringable $label): self;` +echo $domain->toString(); // display 'www.example.com' +echo $newDomain->toString(); // display 'example.com.www' +~~~ -The following methods from the `ResolvedDomain` object will return an `Domain` object: +The following methods from the `ResolvedDomain` object will **also** return +an `Domain` object: -- `ResolvedDomain::getDomain` - `ResolvedDomain::getRegistrableDomain` - `ResolvedDomain::getSubDomain` - `ResolvedDomain::getRegistrableDomain` -#### Modifying the ResolvedDomain +**WARNING: Because of its definition, a domain name can be `null` or a non-empty +string; empty string domain are invalid.** -You can still easily modify the returned `ResolvedDomain` object part using the following methods +To distinguish this possibility the object exposes two (2) formatting methods +`Domain::value` which can be `null` or a `string` and `Domain::toString` which +will always cast the domain value to a string. -- `ResolvedDomain::withSubDomain(Host $subDomain): self` -- `ResolvedDomain::withSecondLevelDomain(?string $label): self` -- `ResolvedDomain::withPublicSuffix(PublicSuffix $publicSuffix): self` -- `ResolvedDomain::resolve(PublicSuffix $publicSuffix): self` + ~~~php + value(); // returns null; +$domain->toString(); // returns ''; + +$domain = new Domain(''); // will throw + ~~~ -### Top Level Domains resolution +### Internationalization -While the [Public Suffix List](http://publicsuffix.org/) is a community based list, the package provides access to -the Top Level domain information given by the [IANA website](https://data.iana.org/TLD/tlds-alpha-by-domain.txt) to always resolve -top domain against all registered TLD even the new ones. +Domain names came in different forms, the package by default will resolve the +domain in its ascii form and convert it back to its source form. This is done +using PHP `ext-intl` extension. -~~~php -use Pdp\TopLevelDomains; +As such: + +All domain objects expose the following methods: -$iana = TopLevelDomains::fromPath('/path/to/cache/tlds-alpha-by-domain.txt'); +```php +public function toAscii(): int; +public function toUnicode(): int; +``` -$resolvedDomain = $iana->resolve('www.PreF.OkiNawA.jP'); -echo $resolvedDomain->getDomain()->toString(); //display 'www.pref.okinawa.jp'; -echo $resolvedDomain->getPublicSuffix()->toString(); //display 'jp'; -echo $resolvedDomain->getSecondLevelDomain(); //display 'okinawa'; -echo $resolvedDomain->getRegistrableDomain()->toString(); //display 'okinawa.jp'; -echo $resolvedDomain->getSubDomain()->toString(); //display 'www.pref'; -~~~ +The domain resolvers use those methods to convert back and forth between +both formats and to return the domain and its public suffix into the +submitted format. -In case of an error an exception which extends `Pdp\CannotProcessHost` is thrown. +~~~php +resolve('bébé.be'); +echo $unicodeDomain->toString(); // returns 'bébé.be' +$unicodeDomain->getSecondLevelDomain(); // returns 'bébé' -**Using the Public Suffix List to determine what is a valid domain name and what isn't is dangerous, particularly in these days when new gTLDs are arriving at a rapid pace.** -**The DNS is the proper source for this information.** +$asciiDomain = $rules->resolve('xn--bb-bjab.be'); +$asciiDomain->toString(); // returns 'xn--bb-bjab.be' +$asciiDomain->getSecondLevelDomain(); // returns 'xn--bb-bjab' + +$asciiDomain->toUnicode() == $unicodeDomain; //returns true +~~~ -**If you are looking to know the validity of a Top Level Domain, the IANA Root Zone Database is the proper source for this information.** +The domain conversion between the ascii and the unicode form can +be controlled using the following interface implemented in all domain objects -**If you must use this library for any of the above purposes, please consider integrating an update mechanism into your software.** +~~~php +interface IDNConversion +{ + public function getAsciiIDNAOption(): int; + public function getUnicodeIDNAOption(): int; + public function withAsciiIDNAOption(int $option): self; + public function withUnicodeIDNAOption(int $option): self; +} +~~~ + +where the `$options` variable should be a combination of `IDNA_*` constants +(except `IDNA_ERROR_*` constants). ## Managing the package databases -Depending on your software the mechanism to store your database may differ, nevertheless, the library comes bundle with a **optional service** -which enables resolving domain name without the constant network overhead of continuously downloading the remote databases. +Depending on your software the mechanism to store your database may differ, +nevertheless, the library comes bundle with a **optional service** which +enables resolving domain name without the constant network overhead of +continuously downloading the remote databases. + +The interfaces defined under the `Pdp\Storage` storage namespace enable +integrating a database managing system and as an example we provided a +PHP-FIG PSR interfaces powered managing system. -The `Pdp\Storage\PsrStorageFactory` enables returning storage instances that retrieve, convert and cache the Public Suffix List as well as the IANA Root Zone Database using -standard interfaces published by the PHP-FIG to improve its interoperability with any modern PHP codebase. +The `Pdp\Storage\PsrStorageFactory` enables returning storage instances that +retrieve, convert and cache the Public Suffix List as well as the IANA Root +Zone Database using standard interfaces published by the PHP-FIG to improve +its interoperability with any modern PHP codebase. ### Instantiate `Pdp\Storage\PsrStorageFactory` To work as intended, the `Pdp\Storage\PsrStorageFactory` constructor requires: - a [PSR-16](http://www.php-fig.org/psr/psr-16/) Cache object. +- a [PSR-17](http://www.php-fig.org/psr/psr-17/) HTTP Factory. - a [PSR-18](http://www.php-fig.org/psr/psr-18/) HTTP Client. When creating a new storage instance you will require: -- a `$cachePrefix` argument to optionally add a prefix to your cache index, default to the empty string `'''`; -- a `$ttl` argument if you need to set the default `$ttl`, default to `null` to use the underlying caching default TTL; +- a `$cachePrefix` argument to optionally add a prefix to your cache index, +default to the empty string; +- a `$ttl` argument if you need to set the default `$ttl`, default to `null` +to use the underlying caching default TTL; The `$ttl` argument can be: - an `int` representing time in second (see PSR-16); - a `DateInterval` object (see PSR-16); -- a `DateTimeInterface` object representing the date and time when the item should expire; +- a `DateTimeInterface` object representing the date and time when the item +will expire; -However, the package no longer provides any implementation of such interfaces are -they are many robust implementations that can easily be found on packagist.org. +However, the package no longer provides any implementation of such interfaces +are they are many robust implementations that can easily be found on packagist. #### Refreshing the cached PSL and RZD data **THIS IS THE RECOMMENDED WAY OF USING THE LIBRARY** -For the purpose of this example we used: +For the purpose of this example we will use: -- Guzzle as a PSR-18 implementation HTTP client -- The Symfony Cache Component to use a PSR-16 cache implementation +- Guzzle as a PSR-18 implementation HTTP client; +- Guzzle to create a PSR-15 RequestFactory object; +- The Symfony Cache Component to use a PSR-16 cache implementation; You could easily use other packages as long as they implement the required PSR interfaces. @@ -289,6 +422,8 @@ $rules = $pslStorage->get(PsrStorageFactory::URL_PSL); $tldDomains = $rzdStorage->get(PsrStorageFactory::URL_RZD); ~~~ +The above code should be adapted to be invoked in your application via your dependency injection container. + ### Automatic Updates It is important to always have an up to date Public Suffix List and Root Zone Database. From 36bbfe063f7a3d5965b030f1f369c6d8d908d66c Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sat, 14 Nov 2020 21:38:05 +0100 Subject: [PATCH 289/461] Improve README documentation --- README.md | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index eff15b9d..51110dd5 100644 --- a/README.md +++ b/README.md @@ -96,9 +96,6 @@ echo $newResolvedDomain->toString(); //display 'foo.bar.test.examp $newResolvedDomain->getPublicSuffix()->isKnown(); //returns false; ~~~ -**WARNING: All the objects are immutable, the changes are applied on the new -instance while the source instance stays unchanged.** - The public suffix method `isKnown` will always return `false` if you use a simple string to update the public suffix. If you use a `PublicSuffix` object the method may return `true`. @@ -224,6 +221,7 @@ $rules = Rules::fromPath('/path/to/cache/public-suffix-list.dat'); $resolvedDomain = $rules->resolve('www.bbc.co.uk'); $domain = $resolvedDomain->getDomain(); echo $domain->toString(); // display 'www.bbc.co.uk' +count($domain); // returns 4 $domain->labels(); // returns ['uk', 'co', 'bbc', 'www']; $domain->label(-1); // returns 'www' $domain->label(0); // returns 'uk' @@ -267,7 +265,6 @@ an `Domain` object: - `ResolvedDomain::getRegistrableDomain` - `ResolvedDomain::getSubDomain` -- `ResolvedDomain::getRegistrableDomain` **WARNING: Because of its definition, a domain name can be `null` or a non-empty string; empty string domain are invalid.** @@ -298,8 +295,8 @@ As such: All domain objects expose the following methods: ```php -public function toAscii(): int; -public function toUnicode(): int; +public function toAscii(): self; +public function toUnicode(): self; ``` The domain resolvers use those methods to convert back and forth between @@ -320,11 +317,11 @@ $asciiDomain = $rules->resolve('xn--bb-bjab.be'); $asciiDomain->toString(); // returns 'xn--bb-bjab.be' $asciiDomain->getSecondLevelDomain(); // returns 'xn--bb-bjab' -$asciiDomain->toUnicode() == $unicodeDomain; //returns true +$asciiDomain->toUnicode()->toString() === $unicodeDomain->toString(); //returns true ~~~ -The domain conversion between the ascii and the unicode form can -be controlled using the following interface implemented in all domain objects +The domain conversion between the ascii and the unicode form can be controlled +using the following interface implemented in all domain objects. ~~~php interface IDNConversion @@ -378,7 +375,7 @@ The `$ttl` argument can be: will expire; However, the package no longer provides any implementation of such interfaces -are they are many robust implementations that can easily be found on packagist. +as they are more robust and battle tested implementations on packagist. #### Refreshing the cached PSL and RZD data @@ -390,7 +387,7 @@ For the purpose of this example we will use: - Guzzle to create a PSR-15 RequestFactory object; - The Symfony Cache Component to use a PSR-16 cache implementation; -You could easily use other packages as long as they implement the required PSR interfaces. +You are free to use other libraries as long as they implement the required PSR interfaces. ~~~php get(PsrStorageFactory::URL_PSL); $tldDomains = $rzdStorage->get(PsrStorageFactory::URL_RZD); ~~~ -The above code should be adapted to be invoked in your application via your dependency injection container. +You should use your dependency injection container to avoid repeating this +code in your application. ### Automatic Updates -It is important to always have an up to date Public Suffix List and Root Zone Database. -This library no longer provide an out of the box script to do so as implementing such a job heavily depends on your application setup. +It is important to always have an up to date Public Suffix List and Root Zone +Database. +This library no longer provide an out of the box script to do so as implementing +such a job heavily depends on your application setup. Changelog ------- -Please see [CHANGELOG](CHANGELOG.md) for more information about what has been changed since version **5.0.0** was released. +Please see [CHANGELOG](CHANGELOG.md) for more information about what has been +changed since version **5.0.0** was released. Contributing ------- -Contributions are welcome and will be fully credited. Please see [CONTRIBUTING](.github/CONTRIBUTING.md) for details. +Contributions are welcome and will be fully credited. Please see +[CONTRIBUTING](.github/CONTRIBUTING.md) for details. Testing ------- @@ -457,7 +459,8 @@ $ composer test Security ------- -If you discover any security related issues, please email nyamsprod@gmail.com instead of using the issue tracker. +If you discover any security related issues, please email nyamsprod@gmail.com +instead of using the issue tracker. Credits ------- From fb73c943ef510d008254405064d6636d883dffa3 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sat, 14 Nov 2020 21:58:52 +0100 Subject: [PATCH 290/461] Improve README documentation regarding i18n --- README.md | 43 +++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 51110dd5..5eb49233 100644 --- a/README.md +++ b/README.md @@ -251,13 +251,13 @@ $resolvedDomain = $rules->resolve('www.ExAmpLE.cOM'); $domain = $resolvedDomain->getDomain(); $newDomain = $domain - ->withLabel(1, 'com') - ->withoutLabel(0, -1) + ->withLabel(1, 'com') //replace 'example' by 'com' + ->withoutLabel(0, -1) //remove the first and last labels ->append('www') - ->prepend('example'); + ->prepend('docs.example'); -echo $domain->toString(); // display 'www.example.com' -echo $newDomain->toString(); // display 'example.com.www' +echo $domain->toString(); // display 'www.example.com' +echo $newDomain->toString(); // display 'docs.example.com.www' ~~~ The following methods from the `ResolvedDomain` object will **also** return @@ -287,21 +287,18 @@ $domain = new Domain(''); // will throw ### Internationalization Domain names came in different forms, the package by default will resolve the -domain in its ascii form and convert it back to its source form. This is done -using PHP `ext-intl` extension. +domain in its ascii form against the public suffix source and convert it back +to its unicode form if needed. This is done using PHP `ext-intl` extension. -As such: - -All domain objects expose the following methods: +As such all domain objects expose the following methods. ```php public function toAscii(): self; public function toUnicode(): self; ``` -The domain resolvers use those methods to convert back and forth between -both formats and to return the domain and its public suffix into the -submitted format. +The domain resolvers use these methods to convert domains between both format +and to return the domain and its public suffix into the submitted format. ~~~php resolve('bébé.be'); -echo $unicodeDomain->toString(); // returns 'bébé.be' +echo $unicodeDomain->toString(); // returns 'bébé.be' $unicodeDomain->getSecondLevelDomain(); // returns 'bébé' $asciiDomain = $rules->resolve('xn--bb-bjab.be'); @@ -333,8 +330,22 @@ interface IDNConversion } ~~~ -where the `$options` variable should be a combination of `IDNA_*` constants -(except `IDNA_ERROR_*` constants). +where the `$options` variable should be a combination of the `IDNA_*` constants +(except `IDNA_ERROR_*` constants) used with the `idn_to_utf8` and `idn_to_ascii` +functions from the `ext-intl` package. + +~~~php +use Pdp\Domain; +use Pdp\Rules; + +$rules = Rules::fromPath('/path/to/cache/public-suffix-list.dat'); +echo $rules->resolve('faß.de')->toString(); // display 'fass.de' + +$domain = new Domain('faß.de', IDNA_NONTRANSITIONAL_TO_ASCII,IDNA_NONTRANSITIONAL_TO_UNICODE); +echo $rules->resolve($domain)->toString(); // display 'faß.de' +~~~ + +**TIPS: Always favor submitting a `Domain` object for resolution rather that a string or a stringable object.** ## Managing the package databases From 8448f3fe5cedf58bd61752d34c4736abaa0f8844 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sat, 14 Nov 2020 22:25:43 +0100 Subject: [PATCH 291/461] Improve README documentation regarding database cache --- README.md | 57 +++++++++++++++++++++++++++---------------------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 5eb49233..14c5fc59 100644 --- a/README.md +++ b/README.md @@ -214,10 +214,7 @@ Domain objects usage are explain in the next section. ~~~php resolve('www.bbc.co.uk'); $domain = $resolvedDomain->getDomain(); echo $domain->toString(); // display 'www.bbc.co.uk' @@ -243,10 +240,8 @@ following methods: ~~~php resolve('www.ExAmpLE.cOM'); $domain = $resolvedDomain->getDomain(); @@ -274,7 +269,6 @@ To distinguish this possibility the object exposes two (2) formatting methods will always cast the domain value to a string. ~~~php - resolve('bébé.be'); echo $unicodeDomain->toString(); // returns 'bébé.be' $unicodeDomain->getSecondLevelDomain(); // returns 'bébé' @@ -336,9 +326,8 @@ functions from the `ext-intl` package. ~~~php use Pdp\Domain; -use Pdp\Rules; -$rules = Rules::fromPath('/path/to/cache/public-suffix-list.dat'); +/** @var Rules $rules */ echo $rules->resolve('faß.de')->toString(); // display 'fass.de' $domain = new Domain('faß.de', IDNA_NONTRANSITIONAL_TO_ASCII,IDNA_NONTRANSITIONAL_TO_UNICODE); @@ -349,19 +338,18 @@ echo $rules->resolve($domain)->toString(); // display 'faß.de' ## Managing the package databases -Depending on your software the mechanism to store your database may differ, +Depending on your application, the mechanism to store your database may differ, nevertheless, the library comes bundle with a **optional service** which enables resolving domain name without the constant network overhead of continuously downloading the remote databases. The interfaces defined under the `Pdp\Storage` storage namespace enable -integrating a database managing system and as an example we provided a -PHP-FIG PSR interfaces powered managing system. +integrating a database managing system and as an implementation example +a PHP-FIG PSR interfaces powered managing system is provided. The `Pdp\Storage\PsrStorageFactory` enables returning storage instances that retrieve, convert and cache the Public Suffix List as well as the IANA Root -Zone Database using standard interfaces published by the PHP-FIG to improve -its interoperability with any modern PHP codebase. +Zone Database using standard interfaces published by the PHP-FIG. ### Instantiate `Pdp\Storage\PsrStorageFactory` @@ -385,17 +373,17 @@ The `$ttl` argument can be: - a `DateTimeInterface` object representing the date and time when the item will expire; -However, the package no longer provides any implementation of such interfaces -as they are more robust and battle tested implementations on packagist. +The package does not provide any implementation of such interfaces as you can +find robust and battle tested implementations on packagist. #### Refreshing the cached PSL and RZD data **THIS IS THE RECOMMENDED WAY OF USING THE LIBRARY** -For the purpose of this example we will use: +For the purpose of this example we will use our PSR powered solution with: -- Guzzle as a PSR-18 implementation HTTP client; -- Guzzle to create a PSR-15 RequestFactory object; +- Guzzle as our PSR-18 HTTP client implementation; +- Guzzle\Psr7 to create a PSR-15 RequestFactory object; - The Symfony Cache Component to use a PSR-16 cache implementation; You are free to use other libraries as long as they implement the required PSR interfaces. @@ -408,10 +396,17 @@ use GuzzleHttp\Psr7\Request; use Pdp\Storage\PsrStorageFactory; use Psr\Http\Message\RequestFactoryInterface; use Psr\Http\Message\RequestInterface; -use Symfony\Component\Cache\Adapter\FilesystemAdapter; +use Symfony\Component\Cache\Adapter\PdoAdapter; use Symfony\Component\Cache\Psr16Cache; -$cache = new Psr16Cache(new FilesystemAdapter('pdp', 3600, __DIR__.'/data')); +$pdoAdapter = new PdoAdapter( + 'mysql:host=localhost;dbname=testdb', + 'pdp', + 3600, + [ 'db_username' => 'user', 'db_password' => 'password'] +); + +$cache = new Psr16Cache($pdoAdapter); $client = new Client(); $requestFactory = new class implements RequestFactoryInterface { public function createRequest(string $method, $uri): RequestInterface @@ -430,8 +425,12 @@ $rules = $pslStorage->get(PsrStorageFactory::URL_PSL); $tldDomains = $rzdStorage->get(PsrStorageFactory::URL_RZD); ~~~ -You should use your dependency injection container to avoid repeating this -code in your application. +**Be sure to adapt the following code to your own framework/situation. +The following code is an example given without warranty of it working +out of the box.** + +**You should use your dependency injection container to avoid repeating this +code in your application.** ### Automatic Updates From 066cc281c9fab129886c2a19bb2e186fd21a83ff Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sat, 14 Nov 2020 22:42:21 +0100 Subject: [PATCH 292/461] Improve README documentation regarding database cache --- README.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 14c5fc59..ff0c408e 100644 --- a/README.md +++ b/README.md @@ -382,11 +382,13 @@ find robust and battle tested implementations on packagist. For the purpose of this example we will use our PSR powered solution with: -- Guzzle as our PSR-18 HTTP client implementation; -- Guzzle\Psr7 to create a PSR-15 RequestFactory object; -- The Symfony Cache Component to use a PSR-16 cache implementation; +- *Guzzle* as our PSR-18 HTTP client; +- *Guzzle\Psr7* to create a PSR-17 compliant `RequestFactoryInterface` object; +- *Symfony Cache Component* as our PSR-16 cache implementation; -You are free to use other libraries as long as they implement the required PSR interfaces. +We will cache both external sources for 24 hours in a PostgreSQL database. + +You are free to use other libraries/solutions as long as they implement the required PSR interfaces. ~~~php 'user', 'db_password' => 'password'] +$pdo = new PDO( + 'pgsql:host=localhost;port:5432;dbname=testdb', + 'user', + 'password', + [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] ); - -$cache = new Psr16Cache($pdoAdapter); +$cache = new Psr16Cache(new PdoAdapter($pdo, 'pdp', 43200)); $client = new Client(); $requestFactory = new class implements RequestFactoryInterface { public function createRequest(string $method, $uri): RequestInterface @@ -425,7 +426,7 @@ $rules = $pslStorage->get(PsrStorageFactory::URL_PSL); $tldDomains = $rzdStorage->get(PsrStorageFactory::URL_RZD); ~~~ -**Be sure to adapt the following code to your own framework/situation. +**Be sure to adapt the following code to your own application. The following code is an example given without warranty of it working out of the box.** @@ -437,7 +438,8 @@ code in your application.** It is important to always have an up to date Public Suffix List and Root Zone Database. This library no longer provide an out of the box script to do so as implementing -such a job heavily depends on your application setup. +such a job heavily depends on your application setup. +You can use the above example script as a starting point to implement such a job. Changelog ------- From 3f6b928f26e4bcaad5a8c17dfd93a03dd071f8a2 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 15 Nov 2020 01:05:03 +0100 Subject: [PATCH 293/461] Adding the UPGRADING --- README.md | 60 +++++++++++--------------- UPGRADING.md | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+), 36 deletions(-) create mode 100644 UPGRADING.md diff --git a/README.md b/README.md index ff0c408e..0f7deae8 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,8 @@ You need: ## Usage +**If you are upgrading from version 5 please check the [upgrading guide](UPGRADING.md) for known issues.** + ### Resolving Domains To effectively resolve a domain you need a public source. This library can @@ -280,61 +282,47 @@ $domain = new Domain(''); // will throw ### Internationalization -Domain names came in different forms, the package by default will resolve the -domain in its ascii form against the public suffix source and convert it back -to its unicode form if needed. This is done using PHP `ext-intl` extension. - -As such all domain objects expose the following methods. - -```php -public function toAscii(): self; -public function toUnicode(): self; -``` - -The domain resolvers use these methods to convert domains between both format -and to return the domain and its public suffix into the submitted format. +Domain names come in different format (ascii and unicode format), the package +by default will convert the domain in its ascii format for resolution against +the public suffix source and convert it back to its unicode form if needed. +This is done using PHP `ext-intl` extension. As such all domain objects expose +a `toAscii` and a `toUnicode` methods which returns a new instance in the +converted format. ~~~php /** @var Rules $rules */ -$unicodeDomain = $rules->resolve('bébé.be'); +$unicodeDomain = $rules->resolve(new Domain('bébé.be')); echo $unicodeDomain->toString(); // returns 'bébé.be' $unicodeDomain->getSecondLevelDomain(); // returns 'bébé' -$asciiDomain = $rules->resolve('xn--bb-bjab.be'); +$asciiDomain = $rules->resolve(new Domain('xn--bb-bjab.be')); $asciiDomain->toString(); // returns 'xn--bb-bjab.be' $asciiDomain->getSecondLevelDomain(); // returns 'xn--bb-bjab' $asciiDomain->toUnicode()->toString() === $unicodeDomain->toString(); //returns true ~~~ -The domain conversion between the ascii and the unicode form can be controlled -using the following interface implemented in all domain objects. - -~~~php -interface IDNConversion -{ - public function getAsciiIDNAOption(): int; - public function getUnicodeIDNAOption(): int; - public function withAsciiIDNAOption(int $option): self; - public function withUnicodeIDNAOption(int $option): self; -} -~~~ - -where the `$options` variable should be a combination of the `IDNA_*` constants -(except `IDNA_ERROR_*` constants) used with the `idn_to_utf8` and `idn_to_ascii` -functions from the `ext-intl` package. +Because the domain conversion occurs during instantiation to normalize the +domain name you are required to give the `IDNA_*` constants on domain +construction. All domain objects accept as optional parameters the +`$asciiIDNAOption` and the `$unicodeIDNAOption` where those variables should be +a combination of the `IDNA_*` constants (except `IDNA_ERROR_*` constants) used +with the `idn_to_utf8` and `idn_to_ascii` functions from the `ext-intl` package. ~~~php use Pdp\Domain; -/** @var Rules $rules */ -echo $rules->resolve('faß.de')->toString(); // display 'fass.de' +$domain = new Domain('faß.de'); +$altDomain = new Domain('faß.de', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); -$domain = new Domain('faß.de', IDNA_NONTRANSITIONAL_TO_ASCII,IDNA_NONTRANSITIONAL_TO_UNICODE); -echo $rules->resolve($domain)->toString(); // display 'faß.de' +/** @var Rules $rules */ +echo $rules->resolve($domain)->toString(); // display 'fass.de' +echo $rules->resolve($altDomain)->toString(); // display 'faß.de' ~~~ -**TIPS: Always favor submitting a `Domain` object for resolution rather that a string or a stringable object.** +**TIP: Always favor submitting a `Domain` object for resolution rather that a +string or an object that can be cast to a string to avoid unexpected format +conversion results.** ## Managing the package databases diff --git a/UPGRADING.md b/UPGRADING.md new file mode 100644 index 00000000..b338ba56 --- /dev/null +++ b/UPGRADING.md @@ -0,0 +1,118 @@ +# PHP Domain Parser Upgrade Guide + +## 5.0 to 6.0 + +In order to take advantage of the new features of PHP, the library dropped the +support of **all versions before and including PHP 7.3**. The minimum supported PHP +version is now **PHP 7.4**. + +**Version 6.0 introduces more interfaces and removed the resource manager system.** + +### Backward Incompatibility Changes + +#### Domain resolution + +The `Pdp\Rules::resolve` and `Pdp\TopLevelDomains::resolve` returns a +`ResolvedDomain` object instead of a `Pdp\Domain` object, thus, the `Domain` +object no longer exposes the components from resolution, this is done by the +new `ResolvedDomain` object instead. + +**version 5** +~~~php +/** @var Domain $domain */ +$domain = $rules->resolve('www.example.com'); +$domain->getDomain(); //returns a string or null and was deprecated +$domain->getPublicSuffix(); //returns a string or null +$domain->getSubDomain(); //returns a string or null +$domain->getRegistrableDomain(); //returns a string or null +$domain->isICANN(); //returns a boolean +$domain->isPrivate(); //returns a boolean +$domain->isKnown(); //returns a boolean +~~~ + +The `Domain` **has access** to the domain parts and to the public suffix list state. + +**version 6** +~~~php +/** @var ResolvedDomain $domain */ +$domain = $rules->resolve('www.example.com'); +$domain->getDomain(); //returns a Domain object similar to v5 Domain object +$domain->getPublicSuffix(); //returns a Public Suffix object +$domain->getSubDomain(); //returns a Domain object +$domain->getRegistrableDomain(); //returns a Domain object +~~~ + +The `Domain` **has no access** to the domain parts or the public suffix list state. + +#### Strict domain resolution + +**version 5** +- `Rules::getCookieDomain` will throw on invalid domain value. +- `Rules::getICANNDomain` will throw on invalid domain value. +- `Rules::getPrivateDomain` will throw on invalid domain value. + +**version 6** +- `Rules::getCookieDomain` will throw on invalid domain value. +- `Rules::getICANNDomain` will throw on public suffix not find in the ICANN Section. +- `Rules::getPrivateDomain` will throw on public suffix not find in the Private Section. + +#### Domain format + +- Domain objects no longer exposes the `__toString` magic methods. +- `Domain::getContent` is renamed `Domain::value` + +**version 5** +~~~php +$domain = new Domain('www.example.com'); +echo $domain; // display 'www.example.com' +$domain->getContent(); // can be a string or null +~~~ + +**version 6** +~~~php +$domain = new Domain('www.example.com'); +echo $domain->toString(); // display 'www.example.com' +$domain->value(); // can be a string or null +~~~ + +#### Methods renamed + +- `Domain::getLabel` method is renamed `Domain::label`. +- `Rules::createFromPath` method is renamed `Rules::fromPath`. +- `TopLevelDomains::createFromPath` method is renamed `TopLevelDomains::fromPath`. +- `Rules::createFromString` method is renamed `Rules::fromString`. +- `TopLevelDomains::createFromString` method is renamed `TopLevelDomains::fromString`. + +#### Classes removed + +- `HttpClient` is removed without replacement. +- `Cache` is removed without replacement. +- `Manager` is removed without replacement. +- `Installer` is removed without replacement. +- `Logger` is removed without replacement. +- The CLI script to update the cache is removed without replacement. + +*Please check the [README](README.md) doc for the alternative* + +#### Methods removed + +- `DomainInterface` is removed use `DomainName` instead or `ResolvedDomainName`. +- `__debugInfo` is removed from all classes. +- `Domain::isResolvable` is removed without replacement. +- `Domain::isTransitionalDifferent` is removed without replacement. +- `Domain::resolve` is removed without replacement. +- `Domain::isTransitionalDifferent` is removed without replacement. +- `PublicSuffix::createFromDomain` is removed without replacement. +- `Rules::getPublicSuffix` is removed use `ResolvedDomain::getPublicSuffix` instead. +- IDNA related methods from `Rules` and `TopLevelDomains` classes are removed +if needed, use the domain objects constructors. + +#### Methods return type changed + +- `Domain::jsonSerialize` no longer returns an array but returns the string +representation or `null` to allow better compatibility with URL components +representation in other languages. + +#### The Rules object instantiation + +The `Rules::__construct` and the `TopLevelDomains::__construct` methods are now private. From 00a6b1ab2d08dbabc74cdba3b698a6ebb5a12ffb Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 15 Nov 2020 10:34:58 +0100 Subject: [PATCH 294/461] Update IDNAConversion interface and usage in the package --- README.md | 20 +++++---- UPGRADING.md | 11 +++-- src/Domain.php | 29 +++++-------- src/DomainName.php | 2 +- src/DomainTest.php | 22 +++------- src/EffectiveTLD.php | 2 +- src/Host.php | 2 +- src/IDNConversion.php | 18 +++----- src/PublicSuffix.php | 54 +++++++++--------------- src/PublicSuffixTest.php | 19 ++------- src/ResolvedDomain.php | 82 ++++++++++--------------------------- src/ResolvedDomainTest.php | 20 +++++---- src/RulesTest.php | 6 +-- src/TopLevelDomainsTest.php | 6 +-- 14 files changed, 108 insertions(+), 185 deletions(-) diff --git a/README.md b/README.md index 0f7deae8..f444b596 100644 --- a/README.md +++ b/README.md @@ -282,7 +282,7 @@ $domain = new Domain(''); // will throw ### Internationalization -Domain names come in different format (ascii and unicode format), the package +Domain names support different format (ascii and unicode format), the package by default will convert the domain in its ascii format for resolution against the public suffix source and convert it back to its unicode form if needed. This is done using PHP `ext-intl` extension. As such all domain objects expose @@ -302,18 +302,22 @@ $asciiDomain->getSecondLevelDomain(); // returns 'xn--bb-bjab' $asciiDomain->toUnicode()->toString() === $unicodeDomain->toString(); //returns true ~~~ -Because the domain conversion occurs during instantiation to normalize the -domain name you are required to give the `IDNA_*` constants on domain -construction. All domain objects accept as optional parameters the -`$asciiIDNAOption` and the `$unicodeIDNAOption` where those variables should be -a combination of the `IDNA_*` constants (except `IDNA_ERROR_*` constants) used -with the `idn_to_utf8` and `idn_to_ascii` functions from the `ext-intl` package. +Because the domain conversion occurs during normalization of the +domain name you should give the `IDNA_*` constants when updating +the domain name value. + +Only the `Pdp\Domain` and the `Pdp\PublicSuffix` +objects accept the following optional parameters: (`$asciiIDNAOption` and +`$unicodeIDNAOption`) to tell the underlying methods using the `idn_to_utf8` +and `idn_to_ascii` functions from the `ext-intl` package how to convert the +value to its unicode or ascii form. Those variables should be a combination of +the `IDNA_*` constants (except `IDNA_ERROR_*` constants). ~~~php use Pdp\Domain; $domain = new Domain('faß.de'); -$altDomain = new Domain('faß.de', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); +$altDomain = $domain->withValue('faß.de', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); /** @var Rules $rules */ echo $rules->resolve($domain)->toString(); // display 'fass.de' diff --git a/UPGRADING.md b/UPGRADING.md index b338ba56..7dedc56b 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -96,16 +96,19 @@ $domain->value(); // can be a string or null #### Methods removed -- `DomainInterface` is removed use `DomainName` instead or `ResolvedDomainName`. - `__debugInfo` is removed from all classes. +- `DomainInterface` is removed use `DomainName` instead or `ResolvedDomainName`. - `Domain::isResolvable` is removed without replacement. -- `Domain::isTransitionalDifferent` is removed without replacement. - `Domain::resolve` is removed without replacement. - `Domain::isTransitionalDifferent` is removed without replacement. +- `Domain::withAsciiIDNAOption` is removed use `Domain::withValue`. +- `Domain::withUnicodeIDNAOption` is removed use `Domain::withValue`. +- `PublicSuffix::isTransitionalDifferent` is removed without replacement. +- `PublicSuffix::withAsciiIDNAOption` is removed use `PublicSuffix::withValue`. +- `PublicSuffix::withUnicodeIDNAOption` is removed use `PublicSuffix::withValue`. - `PublicSuffix::createFromDomain` is removed without replacement. - `Rules::getPublicSuffix` is removed use `ResolvedDomain::getPublicSuffix` instead. -- IDNA related methods from `Rules` and `TopLevelDomains` classes are removed -if needed, use the domain objects constructors. +- IDNA related methods from `Rules` and `TopLevelDomains` are removed. #### Methods return type changed diff --git a/src/Domain.php b/src/Domain.php index 89529bf3..49df9fe2 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -150,6 +150,17 @@ public function toUnicode(): self return new self($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption); } + public function withValue(?string $domain, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOptions = IDNA_DEFAULT): self + { + if ($asciiIDNAOption === $this->asciiIDNAOption && + $unicodeIDNAOptions === $this->unicodeIDNAOption && + $domain === $this->domain) { + return $this; + } + + return new self($domain, $asciiIDNAOption, $unicodeIDNAOptions); + } + /** * Filter a subdomain to update the domain part. * @@ -248,22 +259,4 @@ public function withoutLabel(int $key, int ...$keys): self return new self($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption); } - - public function withAsciiIDNAOption(int $option): self - { - if ($option === $this->asciiIDNAOption) { - return $this; - } - - return new self($this->domain, $option, $this->unicodeIDNAOption); - } - - public function withUnicodeIDNAOption(int $option): self - { - if ($option === $this->unicodeIDNAOption) { - return $this; - } - - return new self($this->domain, $this->asciiIDNAOption, $option); - } } diff --git a/src/DomainName.php b/src/DomainName.php index e844c1f0..7cea0387 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -11,7 +11,7 @@ * @see https://tools.ietf.org/html/rfc1123#section-2.1 * @see https://tools.ietf.org/html/rfc5890 */ -interface DomainName extends Host, IteratorAggregate +interface DomainName extends Host, IteratorAggregate, IDNConversion { /** * Retrieves a single domain label. diff --git a/src/DomainTest.php b/src/DomainTest.php index 6bdea192..45fb1ffa 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -522,27 +522,15 @@ public function testInstanceCreationWithCustomIDNAOptions(): void /** * @covers ::getAsciiIDNAOption * @covers ::getUnicodeIDNAOption - * @covers ::withAsciiIDNAOption - * @covers ::withUnicodeIDNAOption + * @covers ::withValue */ public function testwithIDNAOptions(): void { $domain = new Domain('example.com', IDNA_DEFAULT, IDNA_DEFAULT); - self::assertSame($domain, $domain->withAsciiIDNAOption( - $domain->getAsciiIDNAOption() - )); - - self::assertNotEquals($domain, $domain->withAsciiIDNAOption( - IDNA_NONTRANSITIONAL_TO_ASCII - )); - - self::assertSame($domain, $domain->withUnicodeIDNAOption( - $domain->getUnicodeIDNAOption() - )); - - self::assertNotEquals($domain, $domain->withUnicodeIDNAOption( - IDNA_NONTRANSITIONAL_TO_UNICODE - )); + self::assertSame($domain, $domain->withValue('example.com', $domain->getAsciiIDNAOption())); + self::assertNotEquals($domain, $domain->withValue('example.com', IDNA_NONTRANSITIONAL_TO_ASCII)); + self::assertSame($domain, $domain->withValue('example.com', $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption())); + self::assertNotEquals($domain, $domain->withValue('example.com', $domain->getAsciiIDNAOption(), IDNA_NONTRANSITIONAL_TO_UNICODE)); } } diff --git a/src/EffectiveTLD.php b/src/EffectiveTLD.php index 64bfc2f2..22821cea 100644 --- a/src/EffectiveTLD.php +++ b/src/EffectiveTLD.php @@ -4,7 +4,7 @@ namespace Pdp; -interface EffectiveTLD extends Host, ExternalDomainName +interface EffectiveTLD extends Host, ExternalDomainName, IDNConversion { public const ICANN_DOMAINS = 'ICANN_DOMAINS'; diff --git a/src/Host.php b/src/Host.php index db50d6dc..7cb95775 100644 --- a/src/Host.php +++ b/src/Host.php @@ -12,7 +12,7 @@ * @see https://tools.ietf.org/html/rfc1123#section-2.1 * @see https://tools.ietf.org/html/rfc5890 */ -interface Host extends Countable, JsonSerializable, IDNConversion +interface Host extends Countable, JsonSerializable { /** * Returns the domain content. diff --git a/src/IDNConversion.php b/src/IDNConversion.php index 211a0d8b..2901eb5a 100644 --- a/src/IDNConversion.php +++ b/src/IDNConversion.php @@ -25,24 +25,18 @@ public function getAsciiIDNAOption(): int; public function getUnicodeIDNAOption(): int; /** - * Sets conversion options for idn_to_ascii. + * Sets the host value with its IDNA options. * * combination of IDNA_* constants (except IDNA_ERROR_* constants). * * @see https://www.php.net/manual/en/intl.constants.php * - * @return static - */ - public function withAsciiIDNAOption(int $option): self; - - /** - * Sets conversion options for idn_to_utf8. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php + * This method MUST retain the state of the current instance, and return + * an instance with its content converted to its IDNA ASCII form * + * @param ?string $value + * @throws CannotProcessHost if the domain can not be converted to ASCII using IDN UTS46 algorithm * @return static */ - public function withUnicodeIDNAOption(int $option): self; + public function withValue(?string $value, int $asciiIDNAOption, int $unicodIDNAOption): self; } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 9f1f1c7e..8e59b1e9 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -9,27 +9,27 @@ final class PublicSuffix implements EffectiveTLD { - private DomainName $publicSuffix; + private DomainName $domain; private string $section; - private function __construct(DomainName $publicSuffix, string $section) + private function __construct(DomainName $domain, string $section) { - if ('' === $publicSuffix->label(0)) { - throw SyntaxError::dueToInvalidPublicSuffix($publicSuffix); + if ('' === $domain->label(0)) { + throw SyntaxError::dueToInvalidPublicSuffix($domain); } - if (null === $publicSuffix->value()) { + if (null === $domain->value()) { $section = ''; } - $this->publicSuffix = $publicSuffix; + $this->domain = $domain; $this->section = $section; } public static function __set_state(array $properties): self { - return new self($properties['publicSuffix'], $properties['section']); + return new self($properties['domain'], $properties['section']); } /** @@ -63,37 +63,37 @@ public static function fromNull(int $asciiIDNAOption = IDNA_DEFAULT, int $unicod public function getDomain(): DomainName { - return $this->publicSuffix; + return $this->domain; } public function count(): int { - return count($this->publicSuffix); + return count($this->domain); } public function jsonSerialize(): ?string { - return $this->publicSuffix->value(); + return $this->domain->value(); } public function value(): ?string { - return $this->publicSuffix->value(); + return $this->domain->value(); } public function toString(): string { - return $this->publicSuffix->toString(); + return $this->domain->toString(); } public function getAsciiIDNAOption(): int { - return $this->publicSuffix->getAsciiIDNAOption(); + return $this->domain->getAsciiIDNAOption(); } public function getUnicodeIDNAOption(): int { - return $this->publicSuffix->getUnicodeIDNAOption(); + return $this->domain->getUnicodeIDNAOption(); } public function isKnown(): bool @@ -114,7 +114,7 @@ public function isPrivate(): bool public function toAscii(): self { $clone = clone $this; - $clone->publicSuffix = $this->publicSuffix->toAscii(); + $clone->domain = $this->domain->toAscii(); return $clone; } @@ -122,32 +122,18 @@ public function toAscii(): self public function toUnicode(): self { $clone = clone $this; - $clone->publicSuffix = $this->publicSuffix->toUnicode(); + $clone->domain = $this->domain->toUnicode(); return $clone; } - public function withAsciiIDNAOption(int $option): self + public function withValue(?string $domain, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self { - if ($option === $this->publicSuffix->getAsciiIDNAOption()) { + $newDomain = $this->domain->withValue($domain, $asciiIDNAOption, $unicodeIDNAOption); + if ($newDomain == $this->domain) { return $this; } - $clone = clone $this; - $clone->publicSuffix = $this->publicSuffix->withAsciiIDNAOption($option); - - return $clone; - } - - public function withUnicodeIDNAOption(int $option): self - { - if ($option === $this->publicSuffix->getUnicodeIDNAOption()) { - return $this; - } - - $clone = clone $this; - $clone->publicSuffix = $this->publicSuffix->withUnicodeIDNAOption($option); - - return $clone; + return new self($newDomain, $this->section); } } diff --git a/src/PublicSuffixTest.php b/src/PublicSuffixTest.php index 5c8d83e9..983a5cd8 100644 --- a/src/PublicSuffixTest.php +++ b/src/PublicSuffixTest.php @@ -195,20 +195,9 @@ public function testWithIDNAOptions(): void { $publicSuffix = PublicSuffix::fromUnknown('com'); - self::assertSame($publicSuffix, $publicSuffix->withAsciiIDNAOption( - $publicSuffix->getAsciiIDNAOption() - )); - - self::assertNotEquals($publicSuffix, $publicSuffix->withAsciiIDNAOption( - IDNA_NONTRANSITIONAL_TO_ASCII - )); - - self::assertSame($publicSuffix, $publicSuffix->withUnicodeIDNAOption( - $publicSuffix->getUnicodeIDNAOption() - )); - - self::assertNotEquals($publicSuffix, $publicSuffix->withUnicodeIDNAOption( - IDNA_NONTRANSITIONAL_TO_UNICODE - )); + self::assertSame($publicSuffix, $publicSuffix->withValue('com', $publicSuffix->getAsciiIDNAOption())); + self::assertNotEquals($publicSuffix, $publicSuffix->withValue('com', IDNA_NONTRANSITIONAL_TO_ASCII)); + self::assertSame($publicSuffix, $publicSuffix->withValue('com', $publicSuffix->getAsciiIDNAOption(), $publicSuffix->getUnicodeIDNAOption())); + self::assertNotEquals($publicSuffix, $publicSuffix->withValue('com', $publicSuffix->getAsciiIDNAOption(), IDNA_NONTRANSITIONAL_TO_UNICODE)); } } diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 16761dbf..6b873c7b 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -42,7 +42,7 @@ public static function __set_state(array $properties): self private function setDomainName(Host $domain): DomainName { if (!$domain instanceof DomainName) { - return new Domain($domain, $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()); + return new Domain($domain); } return $domain; @@ -70,6 +70,7 @@ private function setPublicSuffix(EffectiveTLD $publicSuffix = null): EffectiveTL throw UnableToResolveDomain::dueToUnresolvableDomain($this->domain); } + $publicSuffix = $publicSuffix->withValue($publicSuffix->value(), $asciiIDNAOptions, $unicodeIDNAOptions); $publicSuffix = $this->normalize($publicSuffix); if ($this->domain->value() === $publicSuffix->value()) { throw new UnableToResolveDomain(sprintf('The public suffix and the domain name are is identical `%s`.', $this->domain->toString())); @@ -164,16 +165,6 @@ public function toString(): string return $this->domain->toString(); } - public function getAsciiIDNAOption(): int - { - return $this->domain->getAsciiIDNAOption(); - } - - public function getUnicodeIDNAOption(): int - { - return $this->domain->getUnicodeIDNAOption(); - } - public function getRegistrableDomain(): ResolvedDomain { return new self($this->registrableDomain, $this->publicSuffix); @@ -213,6 +204,12 @@ public function withPublicSuffix($publicSuffix): self $publicSuffix = PublicSuffix::fromUnknown($publicSuffix); } + $publicSuffix = $publicSuffix->withValue( + $publicSuffix->value(), + $this->domain->getAsciiIDNAOption(), + $this->domain->getUnicodeIDNAOption() + ); + $publicSuffix = $this->normalize($publicSuffix); if ($this->publicSuffix == $publicSuffix) { return $this; @@ -233,11 +230,6 @@ public function withPublicSuffix($publicSuffix): self $this->domain->getUnicodeIDNAOption() ); - /** @var EffectiveTLD $publicSuffix */ - $publicSuffix = $publicSuffix - ->withAsciiIDNAOption($this->domain->getAsciiIDNAOption()) - ->withUnicodeIDNAOption($this->domain->getUnicodeIDNAOption()); - return new self($domain, $publicSuffix); } @@ -251,12 +243,18 @@ public function withSubDomain($subDomain): self } if (!$subDomain instanceof DomainName) { - $subDomain = new Domain($subDomain); + $subDomain = new Domain( + $subDomain, + $this->domain->getAsciiIDNAOption(), + $this->domain->getUnicodeIDNAOption() + ); } - $subDomain = $subDomain - ->withAsciiIDNAOption($this->getAsciiIDNAOption()) - ->withUnicodeIDNAOption($this->getUnicodeIDNAOption()); + $subDomain = $subDomain->withValue( + $subDomain->value(), + $this->domain->getAsciiIDNAOption(), + $this->domain->getUnicodeIDNAOption() + ); if ($this->subDomain == $subDomain) { return $this; @@ -271,8 +269,8 @@ public function withSubDomain($subDomain): self return new self(new Domain( $subDomain->toString().'.'.$this->registrableDomain->toString(), - $this->getAsciiIDNAOption(), - $this->getUnicodeIDNAOption() + $this->domain->getAsciiIDNAOption(), + $this->domain->getUnicodeIDNAOption() ), $this->publicSuffix); } @@ -293,44 +291,8 @@ public function withSecondLevelDomain($label): self return new self(new Domain( $this->subDomain->value().'.'.$newRegistrableDomain->value(), - $this->getAsciiIDNAOption(), - $this->getUnicodeIDNAOption() + $this->domain->getAsciiIDNAOption(), + $this->domain->getUnicodeIDNAOption() ), $this->publicSuffix); } - - /** - * {@inheritDoc} - */ - public function withAsciiIDNAOption(int $option): self - { - if ($option === $this->domain->getAsciiIDNAOption()) { - return $this; - } - - /** @var DomainName $asciiDomain */ - $asciiDomain = $this->domain->withAsciiIDNAOption($option); - - /** @var EffectiveTLD $asciiPublicSuffix */ - $asciiPublicSuffix = $this->publicSuffix->withAsciiIDNAOption($option); - - return new self($asciiDomain, $asciiPublicSuffix); - } - - /** - * {@inheritDoc} - */ - public function withUnicodeIDNAOption(int $option): self - { - if ($option === $this->domain->getUnicodeIDNAOption()) { - return $this; - } - - /** @var DomainName $unicodeDomain */ - $unicodeDomain = $this->domain->withUnicodeIDNAOption($option); - - /** @var EffectiveTLD $unicodePublicSuffix */ - $unicodePublicSuffix = $this->publicSuffix->withUnicodeIDNAOption($option); - - return new self($unicodeDomain, $unicodePublicSuffix); - } } diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 8e51f9a8..5e038064 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -525,26 +525,30 @@ public function testInstanceCreationWithCustomIDNAOptions(): void /** @var ResolvedDomain $instance */ $instance = $domain->toAscii(); self::assertSame( - [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], - [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] + [$domain->getDomain()->getAsciiIDNAOption(), $domain->getDomain()->getUnicodeIDNAOption()], + [$instance->getDomain()->getAsciiIDNAOption(), $instance->getDomain()->getUnicodeIDNAOption()] ); /** @var ResolvedDomain $instance */ $instance = $domain->toUnicode(); + self::assertSame( - [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], - [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] + [$domain->getDomain()->getAsciiIDNAOption(), $domain->getDomain()->getUnicodeIDNAOption()], + [$instance->getDomain()->getAsciiIDNAOption(), $instance->getDomain()->getUnicodeIDNAOption()] ); $instance = $domain->withPublicSuffix(PublicSuffix::fromICANN('us')); + self::assertSame( - [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], - [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] + [$domain->getDomain()->getAsciiIDNAOption(), $domain->getDomain()->getUnicodeIDNAOption()], + [$instance->getDomain()->getAsciiIDNAOption(), $instance->getDomain()->getUnicodeIDNAOption()] ); + $instance = $domain->withSubDomain(new Domain('foo')); + self::assertSame( - [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], - [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] + [$domain->getDomain()->getAsciiIDNAOption(), $domain->getDomain()->getUnicodeIDNAOption()], + [$instance->getDomain()->getAsciiIDNAOption(), $instance->getDomain()->getUnicodeIDNAOption()] ); } diff --git a/src/RulesTest.php b/src/RulesTest.php index a7cbfcb6..fe474a13 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -556,7 +556,7 @@ public function testResolveWithIDNAOptions(): void $resolvedByDefault = $this->rules->resolve('foo.de'); self::assertSame( [IDNA_DEFAULT, IDNA_DEFAULT], - [$resolvedByDefault->getAsciiIDNAOption(), $resolvedByDefault->getUnicodeIDNAOption()] + [$resolvedByDefault->getDomain()->getAsciiIDNAOption(), $resolvedByDefault->getDomain()->getUnicodeIDNAOption()] ); /** @var string $string */ @@ -565,8 +565,8 @@ public function testResolveWithIDNAOptions(): void $domain = new Domain('foo.de', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); $resolved = $rules->resolve($domain); - self::assertSame(IDNA_NONTRANSITIONAL_TO_ASCII, $resolved->getAsciiIDNAOption()); - self::assertSame(IDNA_NONTRANSITIONAL_TO_UNICODE, $resolved->getUnicodeIDNAOption()); + self::assertSame(IDNA_NONTRANSITIONAL_TO_ASCII, $resolved->getDomain()->getAsciiIDNAOption()); + self::assertSame(IDNA_NONTRANSITIONAL_TO_UNICODE, $resolved->getDomain()->getUnicodeIDNAOption()); } /** diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 0fcf8eca..5e3d0bec 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -156,7 +156,7 @@ public function testResolveWithIDNAOptions(): void self::assertSame( [IDNA_DEFAULT, IDNA_DEFAULT], - [$resolved->getAsciiIDNAOption(), $resolved->getUnicodeIDNAOption()] + [$resolved->getDomain()->getAsciiIDNAOption(), $resolved->getDomain()->getUnicodeIDNAOption()] ); $collection = TopLevelDomains::fromPath( @@ -167,8 +167,8 @@ public function testResolveWithIDNAOptions(): void $domain = new Domain('foo.de', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); $resolved = $collection->resolve($domain); - self::assertSame(IDNA_NONTRANSITIONAL_TO_ASCII, $resolved->getAsciiIDNAOption()); - self::assertSame(IDNA_NONTRANSITIONAL_TO_UNICODE, $resolved->getUnicodeIDNAOption()); + self::assertSame(IDNA_NONTRANSITIONAL_TO_ASCII, $resolved->getDomain()->getAsciiIDNAOption()); + self::assertSame(IDNA_NONTRANSITIONAL_TO_UNICODE, $resolved->getDomain()->getUnicodeIDNAOption()); } /** From 634b0cc80f3e1c8c8065d1643930b4a07ad09e3a Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 15 Nov 2020 14:44:28 +0100 Subject: [PATCH 295/461] Adding more tests --- src/ResolvedDomain.php | 4 ++++ src/Rules.php | 6 ++--- src/RulesTest.php | 45 +++++++++++++++++++++++++++++++++++ src/TopLevelDomainsTest.php | 43 +++++++++++++++++++++++++++++++++ src/UnableToResolveDomain.php | 10 -------- 5 files changed, 94 insertions(+), 14 deletions(-) diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 6b873c7b..055be9d8 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -41,6 +41,10 @@ public static function __set_state(array $properties): self private function setDomainName(Host $domain): DomainName { + if ($domain instanceof ExternalDomainName) { + return $domain->getDomain(); + } + if (!$domain instanceof DomainName) { return new Domain($domain); } diff --git a/src/Rules.php b/src/Rules.php index ee97603b..96ba58e7 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -106,10 +106,8 @@ public function resolve($host): ResolvedDomainName try { return $this->getCookieDomain($host); } catch (UnableToResolveDomain $exception) { - if ($exception->hasDomain()) { - /** @var Host */ - $host = $exception->getDomain(); - + $host = $exception->getDomain(); + if (null !== $host) { return new ResolvedDomain($host); } diff --git a/src/RulesTest.php b/src/RulesTest.php index fe474a13..5040f78b 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -52,6 +52,51 @@ public function testCreateFromPathThrowsException(): void Rules::fromPath('/foo/bar.dat'); } + /** + * @covers ::jsonSerialize + * @covers ::fromJsonString + */ + public function testJsonMethods(): void + { + /** @var string $data */ + $data = json_encode($this->rules); + + self::assertEquals($this->rules, Rules::fromJsonString($data)); + } + + /** + * @covers ::fromJsonString + * @covers \Pdp\UnableToLoadPublicSuffixList + */ + public function testJsonStringFailsWithInvalidJson(): void + { + self::expectException(UnableToLoadPublicSuffixList::class); + + Rules::fromJsonString(''); + } + + /** + * @covers ::fromJsonString + * @covers \Pdp\UnableToLoadPublicSuffixList + */ + public function testJsonStringFailsWithMissingIndexes(): void + { + self::expectException(UnableToLoadPublicSuffixList::class); + + Rules::fromJsonString('{"foo":"bar"}'); + } + + /** + * @covers ::fromJsonString + * @covers \Pdp\UnableToLoadPublicSuffixList + */ + public function testJsonStringFailsWithMissingIndexesCollection(): void + { + self::expectException(UnableToLoadPublicSuffixList::class); + + Rules::fromJsonString('{"ICANN_DOMAINS":"foo","PRIVATE_DOMAINS":"bar"}'); + } + public function testDomainInternalPhpMethod(): void { $generateRules = eval('return '.var_export($this->rules, true).';'); diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 5e3d0bec..3167828c 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -10,6 +10,7 @@ use TypeError; use function dirname; use function file_get_contents; +use function json_encode; use const IDNA_DEFAULT; use const IDNA_NONTRANSITIONAL_TO_ASCII; use const IDNA_NONTRANSITIONAL_TO_UNICODE; @@ -47,6 +48,7 @@ public function testCreateFromPath(): void /** * @covers ::fromPath + * @covers \Pdp\UnableToLoadRootZoneDatabase */ public function testCreateFromPathThrowsException(): void { @@ -66,6 +68,40 @@ public function testSetState(): void self::assertEquals($this->topLevelDomains, $topLevelDomains); } + /** + * @covers ::jsonSerialize + * @covers ::fromJsonString + */ + public function testJsonMethods(): void + { + /** @var string $data */ + $data = json_encode($this->topLevelDomains); + + self::assertEquals($this->topLevelDomains, TopLevelDomains::fromJsonString($data)); + } + + /** + * @covers ::fromJsonString + * @covers \Pdp\UnableToLoadRootZoneDatabase + */ + public function testJsonStringFailsWithInvalidJson(): void + { + self::expectException(UnableToLoadRootZoneDatabase::class); + + TopLevelDomains::fromJsonString(''); + } + + /** + * @covers ::fromJsonString + * @covers \Pdp\UnableToLoadRootZoneDatabase + */ + public function testJsonStringFailsWithMissingIndexes(): void + { + self::expectException(UnableToLoadRootZoneDatabase::class); + + TopLevelDomains::fromJsonString('{"foo":"bar"}'); + } + public function testGetterProperties(): void { $topLevelDomains = TopLevelDomains::fromPath(dirname(__DIR__).'/test_data/root_zones.dat'); @@ -104,6 +140,11 @@ public function testResolve($tld): void public function validDomainProvider(): iterable { + $resolvedDomain = new ResolvedDomain( + new Domain('www.example.com'), + PublicSuffix::fromICANN('com') + ); + return [ 'simple domain' => ['GOOGLE.COM'], 'case insensitive domain (1)' => ['GooGlE.com'], @@ -119,6 +160,7 @@ public function __toString(): string return 'www.இந.இந்தியா'; } }], + 'external domain name' => [$resolvedDomain], ]; } @@ -200,6 +242,7 @@ public function __toString(): string return 'COM'; } }], + 'externalDomain' => [PublicSuffix::fromICANN('com')], ]; } diff --git a/src/UnableToResolveDomain.php b/src/UnableToResolveDomain.php index 37535be4..65424c91 100644 --- a/src/UnableToResolveDomain.php +++ b/src/UnableToResolveDomain.php @@ -46,16 +46,6 @@ public static function dueToMissingRegistrableDomain(Host $domain = null): self return $exception; } - public static function dueToUnSupportedSection(string $section): self - { - return new self('`'.$section.'` is an unknown Public Suffix List section.'); - } - - public function hasDomain(): bool - { - return null !== $this->domain; - } - public function getDomain(): ?Host { return $this->domain; From 60f65aa7624d51a224ff41ea0f25b95d26c8ee1d Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 16 Nov 2020 10:04:03 +0100 Subject: [PATCH 296/461] Improve external database conversion --- phpstan.neon | 2 -- src/PublicSuffixListConverter.php | 3 +- src/PublicSuffixListConverterTest.php | 44 +++++++++++++++++++++++---- src/RootZoneDatabaseConverterTest.php | 44 +++++++++++++++++++++++++-- src/Rules.php | 30 +++++++++--------- src/RulesTest.php | 11 ------- src/TopLevelDomains.php | 22 +++++--------- src/TopLevelDomainsTest.php | 2 +- src/UnableToLoadPublicSuffixList.php | 9 ++---- src/UnableToLoadRootZoneDatabase.php | 4 +-- 10 files changed, 108 insertions(+), 63 deletions(-) diff --git a/phpstan.neon b/phpstan.neon index 67a3d6dd..23548c1f 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -8,8 +8,6 @@ parameters: treatPhpDocTypesAsCertain: false ignoreErrors: - '#should be covariant with return type#' - - message: '#Property Pdp\\TopLevelDomains::\$modifiedDate \(DateTimeImmutable\) does not accept DateTimeInterface.#' - path: src/TopLevelDomains.php - message: '#Method Pdp\\ResolvedDomain::withSubDomain\(\) has parameter \$subDomain with no typehint specified.#' path: src/ResolvedDomain.php - message: '#Call to function array_keys\(\) requires parameter \#3 to be set.#' diff --git a/src/PublicSuffixListConverter.php b/src/PublicSuffixListConverter.php index 07a564c7..a1d4e23b 100644 --- a/src/PublicSuffixListConverter.php +++ b/src/PublicSuffixListConverter.php @@ -45,7 +45,7 @@ public function convert($content): array throw new TypeError('The content to be converted should be a string or a Stringable object, `'.gettype($content).'` given.'); } - $rules = ['ICANN_DOMAINS' => [], 'PRIVATE_DOMAINS' => []]; + $rules = []; $section = ''; $file = new SplTempFileObject(); $file->fwrite($content); @@ -54,6 +54,7 @@ public function convert($content): array foreach ($file as $line) { $section = $this->getSection($section, $line); if ('' !== $section && false === strpos($line, '//')) { + $rules[$section] = $rules[$section] ?? []; $rules[$section] = $this->addRule($rules[$section], explode('.', $line)); } } diff --git a/src/PublicSuffixListConverterTest.php b/src/PublicSuffixListConverterTest.php index 52cb2967..8d737751 100644 --- a/src/PublicSuffixListConverterTest.php +++ b/src/PublicSuffixListConverterTest.php @@ -5,18 +5,27 @@ namespace Pdp; use PHPUnit\Framework\TestCase; +use TypeError; use function dirname; +use function file_get_contents; /** * @coversDefaultClass \Pdp\PublicSuffixListConverter */ class PublicSuffixListConverterTest extends TestCase { + private PublicSuffixListConverter $converter; + + public function setUp(): void + { + $this->converter = new PublicSuffixListConverter(); + } + public function testConverter(): void { /** @var string $string */ $string = file_get_contents(dirname(__DIR__).'/test_data/public_suffix_list.dat'); - $retval = (new PublicSuffixListConverter())->convert($string); + $retval = $this->converter->convert($string); self::assertNotEmpty($retval['ICANN_DOMAINS']); self::assertNotEmpty($retval['PRIVATE_DOMAINS']); @@ -29,20 +38,43 @@ public function testConvertThrowsExceptionWithInvalidContent(): void self::expectException(UnableToLoadPublicSuffixList::class); - (new PublicSuffixListConverter())->convert($content); + $this->converter->convert($content); } public function testConvertWithEmptyString(): void { - $retVal = (new PublicSuffixListConverter())->convert(''); + $retVal = $this->converter->convert(''); - self::assertEquals(['ICANN_DOMAINS' => [], 'PRIVATE_DOMAINS' => []], $retVal); + self::assertEquals([], $retVal); } public function testConvertWithInvalidString(): void { - $retVal = (new PublicSuffixListConverter())->convert('foobar'); + $retVal = $this->converter->convert('foobar'); + + self::assertEquals([], $retVal); + } + + public function testConvertWithStringableObject(): void + { + $stringObject = new class() { + public function __toString(): string + { + return 'foobar'; + } + }; + + $retVal = $this->converter->convert($stringObject); + + self::assertEquals([], $retVal); + } + + public function testConvertThrowsExceptionIfTheInputIsNotSupported(): void + { + $content = new \stdClass(); + + self::expectException(TypeError::class); - self::assertEquals(['ICANN_DOMAINS' => [], 'PRIVATE_DOMAINS' => []], $retVal); + $this->converter->convert($content); } } diff --git a/src/RootZoneDatabaseConverterTest.php b/src/RootZoneDatabaseConverterTest.php index 63ee6a1f..e9a8b229 100644 --- a/src/RootZoneDatabaseConverterTest.php +++ b/src/RootZoneDatabaseConverterTest.php @@ -5,18 +5,47 @@ namespace Pdp; use PHPUnit\Framework\TestCase; +use TypeError; use function dirname; +use function file_get_contents; /** * @coversDefaultClass \Pdp\RootZoneDatabaseConverter */ -class RootZoneDatabaseConverterTest extends TestCase +final class RootZoneDatabaseConverterTest extends TestCase { + private RootZoneDatabaseConverter $converter; + + public function setUp(): void + { + $this->converter = new RootZoneDatabaseConverter(); + } + public function testConverter(): void { /** @var string $string */ $string = file_get_contents(dirname(__DIR__).'/test_data/root_zones.dat'); - $res = (new RootZoneDatabaseConverter())->convert($string); + $res = $this->converter->convert($string); + + self::assertArrayHasKey('version', $res); + self::assertArrayHasKey('modifiedDate', $res); + self::assertArrayHasKey('records', $res); + self::assertIsArray($res['records']); + } + + public function testConvertWithStringableObject(): void + { + $stringObject = new class() { + public function __toString(): string + { + /** @var string $string */ + $string = file_get_contents(dirname(__DIR__).'/test_data/root_zones.dat'); + + return $string; + } + }; + + $res = $this->converter->convert($stringObject); self::assertArrayHasKey('version', $res); self::assertArrayHasKey('modifiedDate', $res); @@ -31,7 +60,16 @@ public function testConverterThrowsException(string $content): void { self::expectException(UnableToLoadRootZoneDatabase::class); - (new RootZoneDatabaseConverter())->convert($content); + $this->converter->convert($content); + } + + public function testConvertThrowsExceptionIfTheInputIsNotSupported(): void + { + $content = new \stdClass(); + + self::expectException(TypeError::class); + + $this->converter->convert($content); } public function invalidContentProvider(): iterable diff --git a/src/Rules.php b/src/Rules.php index 96ba58e7..1fce73ec 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -4,6 +4,7 @@ namespace Pdp; +use JsonException; use function array_reverse; use function count; use function fclose; @@ -11,11 +12,9 @@ use function implode; use function is_array; use function json_decode; -use function json_last_error; -use function json_last_error_msg; use function stream_get_contents; use function substr; -use const JSON_ERROR_NONE; +use const JSON_THROW_ON_ERROR; final class Rules implements PublicSuffixList { @@ -26,6 +25,13 @@ final class Rules implements PublicSuffixList private function __construct(array $rules) { + $rules[EffectiveTLD::ICANN_DOMAINS] = $rules[EffectiveTLD::ICANN_DOMAINS] ?? []; + $rules[EffectiveTLD::PRIVATE_DOMAINS] = $rules[EffectiveTLD::PRIVATE_DOMAINS] ?? []; + + if (!is_array($rules[EffectiveTLD::ICANN_DOMAINS]) || !is_array($rules[EffectiveTLD::PRIVATE_DOMAINS])) { + throw UnableToLoadPublicSuffixList::dueToCorruptedSection(); + } + $this->rules = $rules; } @@ -71,18 +77,10 @@ public static function fromString($content): self public static function fromJsonString(string $jsonString): self { - $data = json_decode($jsonString, true); - $errorCode = json_last_error(); - if (JSON_ERROR_NONE !== $errorCode) { - throw UnableToLoadPublicSuffixList::dueToInvalidJson($errorCode, json_last_error_msg()); - } - - if (!isset($data[EffectiveTLD::ICANN_DOMAINS], $data[EffectiveTLD::PRIVATE_DOMAINS])) { - throw UnableToLoadPublicSuffixList::dueToInvalidHashMap(); - } - - if (!is_array($data[EffectiveTLD::ICANN_DOMAINS]) || !is_array($data[EffectiveTLD::PRIVATE_DOMAINS])) { - throw UnableToLoadPublicSuffixList::dueToCorruptedSection(); + try { + $data = json_decode($jsonString, true, 512, JSON_THROW_ON_ERROR); + } catch (JsonException $exception) { + throw UnableToLoadPublicSuffixList::dueToInvalidJson($exception); } return new self($data); @@ -208,7 +206,7 @@ private function getPublicSuffix(DomainName $domain, string $section): Effective */ private function getPublicSuffixFromSection(DomainName $domain, string $section): EffectiveTLD { - $rules = $this->rules[$section] ?? []; + $rules = $this->rules[$section]; $matches = []; foreach ($domain->toAscii() as $label) { //match exception rule diff --git a/src/RulesTest.php b/src/RulesTest.php index 5040f78b..bca96906 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -75,17 +75,6 @@ public function testJsonStringFailsWithInvalidJson(): void Rules::fromJsonString(''); } - /** - * @covers ::fromJsonString - * @covers \Pdp\UnableToLoadPublicSuffixList - */ - public function testJsonStringFailsWithMissingIndexes(): void - { - self::expectException(UnableToLoadPublicSuffixList::class); - - Rules::fromJsonString('{"foo":"bar"}'); - } - /** * @covers ::fromJsonString * @covers \Pdp\UnableToLoadPublicSuffixList diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index d0ef5ebf..204884a0 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -4,18 +4,16 @@ namespace Pdp; -use DateTime; use DateTimeImmutable; use DateTimeInterface; +use JsonException; use function count; use function fclose; use function fopen; use function json_decode; -use function json_last_error; -use function json_last_error_msg; use function stream_get_contents; use function substr; -use const JSON_ERROR_NONE; +use const JSON_THROW_ON_ERROR; final class TopLevelDomains implements RootZoneDatabase { @@ -25,12 +23,8 @@ final class TopLevelDomains implements RootZoneDatabase private array $records; - private function __construct(array $records, string $version, DateTimeInterface $modifiedDate) + private function __construct(array $records, string $version, DateTimeImmutable $modifiedDate) { - if ($modifiedDate instanceof DateTime) { - $modifiedDate = DateTimeImmutable::createFromMutable($modifiedDate); - } - $this->records = $records; $this->version = $version; $this->modifiedDate = $modifiedDate; @@ -82,14 +76,14 @@ public static function fromString($content): self public static function fromJsonString(string $jsonString): self { - $data = json_decode($jsonString, true); - $errorCode = json_last_error(); - if (JSON_ERROR_NONE !== $errorCode) { - throw UnableToLoadRootZoneDatabase::dueToInvalidJson($errorCode, json_last_error_msg()); + try { + $data = json_decode($jsonString, true, 512, JSON_THROW_ON_ERROR); + } catch (JsonException $exception) { + throw UnableToLoadRootZoneDatabase::dueToInvalidJson($exception); } if (!isset($data['records'], $data['version'], $data['modifiedDate'])) { - throw UnableToLoadRootZoneDatabase::dueToInvalidHashMap(); + throw UnableToLoadRootZoneDatabase::dueToInvalidHashMap(); } /** @var DateTimeImmutable $modifiedDate */ diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 3167828c..c6f49aae 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -18,7 +18,7 @@ /** * @coversDefaultClass \Pdp\TopLevelDomains */ -class TopLevelDomainsTest extends TestCase +final class TopLevelDomainsTest extends TestCase { protected TopLevelDomains $topLevelDomains; diff --git a/src/UnableToLoadPublicSuffixList.php b/src/UnableToLoadPublicSuffixList.php index 613e0eae..0e7bfb62 100644 --- a/src/UnableToLoadPublicSuffixList.php +++ b/src/UnableToLoadPublicSuffixList.php @@ -14,9 +14,9 @@ public static function dueToInvalidPath(string $path): self return new self($path.': failed to open stream: No such file or directory.'); } - public static function dueToInvalidJson(int $code, string $message): self + public static function dueToInvalidJson(Throwable $exception): self { - return new self('Failed to JSON decode the string: '.$message.'.', $code); + return new self('Failed to JSON decode public suffix list string.', 0, $exception); } public static function dueToInvalidRule(?string $line, Throwable $exception): self @@ -24,11 +24,6 @@ public static function dueToInvalidRule(?string $line, Throwable $exception): se return new self('The following rule "'.$line ?? 'NULL'.'" could not be processed because it is invalid.', 0, $exception); } - public static function dueToInvalidHashMap(): self - { - return new self('The public suffix list data are missing one of the required ICANN or PRIVATE domain section.'); - } - public static function dueToCorruptedSection(): self { return new self('The public suffix list section data are corrupted.'); diff --git a/src/UnableToLoadRootZoneDatabase.php b/src/UnableToLoadRootZoneDatabase.php index 1ae84e7f..58bbcf63 100644 --- a/src/UnableToLoadRootZoneDatabase.php +++ b/src/UnableToLoadRootZoneDatabase.php @@ -39,9 +39,9 @@ public static function dueToInvalidPath(string $path): self return new self($path.': failed to open stream: No such file or directory.'); } - public static function dueToInvalidJson(int $code, string $message): self + public static function dueToInvalidJson(Throwable $exception): self { - return new self('Failed to JSON decode the string: '.$message.'.', $code); + return new self('Failed to JSON decode the Root Zone Database string.', 0, $exception); } public static function dueToUnavailableService(string $uri, Throwable $exception): self From c60fd969b7540fd52b9ae2c4f9570e2c8828d955 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 16 Nov 2020 22:01:23 +0100 Subject: [PATCH 297/461] Improve i18n documentation --- README.md | 51 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index f444b596..eb4c6f81 100644 --- a/README.md +++ b/README.md @@ -263,8 +263,7 @@ an `Domain` object: - `ResolvedDomain::getRegistrableDomain` - `ResolvedDomain::getSubDomain` -**WARNING: Because of its definition, a domain name can be `null` or a non-empty -string; empty string domain are invalid.** +**WARNING: Because of its definition, a domain name can be `null` or a string.** To distinguish this possibility the object exposes two (2) formatting methods `Domain::value` which can be `null` or a `string` and `Domain::toString` which @@ -273,16 +272,18 @@ will always cast the domain value to a string. ~~~php use Pdp\Domain; -$domain = new Domain(null); -$domain->value(); // returns null; -$domain->toString(); // returns ''; +$nullDomain = new Domain(null); +$nullDomain->value(); // returns null; +$nullDomain->toString(); // returns ''; -$domain = new Domain(''); // will throw +$emptyDomain = new Domain(''); +$emptyDomain->value(); // returns ''; +$emptyDomain->toString(); // returns ''; ~~~ ### Internationalization -Domain names support different format (ascii and unicode format), the package +Domain names support different formats (ascii and unicode format), the package by default will convert the domain in its ascii format for resolution against the public suffix source and convert it back to its unicode form if needed. This is done using PHP `ext-intl` extension. As such all domain objects expose @@ -303,30 +304,38 @@ $asciiDomain->toUnicode()->toString() === $unicodeDomain->toString(); //returns ~~~ Because the domain conversion occurs during normalization of the -domain name you should give the `IDNA_*` constants when updating -the domain name value. - -Only the `Pdp\Domain` and the `Pdp\PublicSuffix` -objects accept the following optional parameters: (`$asciiIDNAOption` and -`$unicodeIDNAOption`) to tell the underlying methods using the `idn_to_utf8` -and `idn_to_ascii` functions from the `ext-intl` package how to convert the -value to its unicode or ascii form. Those variables should be a combination of -the `IDNA_*` constants (except `IDNA_ERROR_*` constants). +domain name you should give the proper `IDNA_*` constants when creating +or updating the domain name value. + +Since the `ResolvedDomain` only cares about public suffix resolution, +only the `Pdp\Domain` and the `Pdp\PublicSuffix` objects expose methods +to correctly format domain names. their constructor as well as their +`::withValue` methods accepts the following optional parameters: +(`$asciiIDNAOption` and`$unicodeIDNAOption`) to tell the underlying methods +using the `idn_to_utf8` and `idn_to_ascii` functions from the `ext-intl` +package how to convert the value to its unicode or ascii form. Those variables +should be a combination of the `IDNA_*` constants (except `IDNA_ERROR_*` +constants). +You can access the `IDNA_*` current value using the `::getAsciiIDNAOption` and +`::getUnicodeIDNAOption` methods. ~~~php use Pdp\Domain; $domain = new Domain('faß.de'); -$altDomain = $domain->withValue('faß.de', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); +$domain->getAsciiIDNAOption(); // returns IDNA_DEFAULT +$domain->getUnicodeIDNAOption(); // returns IDNA_DEFAULT +echo $domain->value(); // display 'fass.de' -/** @var Rules $rules */ -echo $rules->resolve($domain)->toString(); // display 'fass.de' -echo $rules->resolve($altDomain)->toString(); // display 'faß.de' +$altDomain = $domain->withValue('faß.de', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); +$altDomain->getAsciiIDNAOption(); // returns IDNA_NONTRANSITIONAL_TO_ASCII +$altDomain->getUnicodeIDNAOption(); // returns IDNA_NONTRANSITIONAL_TO_UNICODE +echo $altDomain->value(); // display 'faß.de' ~~~ **TIP: Always favor submitting a `Domain` object for resolution rather that a string or an object that can be cast to a string to avoid unexpected format -conversion results.** +conversion errors/results.** ## Managing the package databases From 5b2ce3409bda2be752055f62768be9c641593c05 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 16 Nov 2020 22:12:41 +0100 Subject: [PATCH 298/461] Update storage package information --- README.md | 36 +++++++++++++----------------------- composer.json | 2 +- 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index eb4c6f81..c5efe556 100644 --- a/README.md +++ b/README.md @@ -339,26 +339,26 @@ conversion errors/results.** ## Managing the package databases -Depending on your application, the mechanism to store your database may differ, +Depending on your application, the mechanism to store your resources may differ, nevertheless, the library comes bundle with a **optional service** which enables resolving domain name without the constant network overhead of continuously downloading the remote databases. -The interfaces defined under the `Pdp\Storage` storage namespace enable -integrating a database managing system and as an implementation example -a PHP-FIG PSR interfaces powered managing system is provided. +The interfaces defined under the `Pdp\Storage` namespace enable +integrating a database managing system and provide an implementation example +using PHP-FIG PSR interfaces. The `Pdp\Storage\PsrStorageFactory` enables returning storage instances that -retrieve, convert and cache the Public Suffix List as well as the IANA Root +retrieve, convert and cache the Public Suffix List and the IANA Root Zone Database using standard interfaces published by the PHP-FIG. ### Instantiate `Pdp\Storage\PsrStorageFactory` To work as intended, the `Pdp\Storage\PsrStorageFactory` constructor requires: -- a [PSR-16](http://www.php-fig.org/psr/psr-16/) Cache object. -- a [PSR-17](http://www.php-fig.org/psr/psr-17/) HTTP Factory. -- a [PSR-18](http://www.php-fig.org/psr/psr-18/) HTTP Client. +- a [PSR-16](http://www.php-fig.org/psr/psr-16/) Simple Cache implementing library. +- a [PSR-17](http://www.php-fig.org/psr/psr-17/) HTTP Factory implementing library. +- a [PSR-18](http://www.php-fig.org/psr/psr-18/) HTTP Client implementing library. When creating a new storage instance you will require: @@ -383,8 +383,8 @@ find robust and battle tested implementations on packagist. For the purpose of this example we will use our PSR powered solution with: -- *Guzzle* as our PSR-18 HTTP client; -- *Guzzle\Psr7* to create a PSR-17 compliant `RequestFactoryInterface` object; +- *Symfony HTTP Client* as our PSR-18 HTTP client; +- *nyholm/psr7* which provide factories to create a PSR-7 objects; - *Symfony Cache Component* as our PSR-16 cache implementation; We will cache both external sources for 24 hours in a PostgreSQL database. @@ -394,11 +394,8 @@ You are free to use other libraries/solutions as long as they implement the requ ~~~php PDO::ERRMODE_EXCEPTION] ); $cache = new Psr16Cache(new PdoAdapter($pdo, 'pdp', 43200)); -$client = new Client(); -$requestFactory = new class implements RequestFactoryInterface { - public function createRequest(string $method, $uri): RequestInterface - { - return new Request($method, $uri); - } -}; - +$client = new Psr18Client(); $cachePrefix = 'pdp_'; $cacheTtl = new DateInterval('P1D'); -$factory = new PsrStorageFactory($cache, $client, $requestFactory); +$factory = new PsrStorageFactory($cache, $client, $client); $pslStorage = $factory->createPublicSuffixListStorage($cachePrefix, $cacheTtl); $rzdStorage = $factory->createRootZoneDatabaseStorage($cachePrefix, $cacheTtl); diff --git a/composer.json b/composer.json index 7d93a240..d165c8cd 100644 --- a/composer.json +++ b/composer.json @@ -60,7 +60,7 @@ }, "suggest": { "psr/http-client-implementation": "To use the storage functionnality which depends on PSR-18", - "psr/http-factory": "To use the storage functionnality which depends on PSR-17", + "psr/http-factory-implementation": "To use the storage functionnality which depends on PSR-17", "psr/simple-cache-implementation": "To use the storage functionnality which depends on PSR-16", "league/uri": "To parse URL and validate host" }, From 5ea788477750a436eceb42fbbd1b2c160df9df1c Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 18 Nov 2020 10:16:03 +0100 Subject: [PATCH 299/461] Update PublicSuffix named constructors --- src/PublicSuffix.php | 25 ++++++---------- src/PublicSuffixTest.php | 31 +++++++++++--------- src/ResolvedDomain.php | 26 +++++++++-------- src/ResolvedDomainTest.php | 48 +++++++++++++++---------------- src/RootZoneDatabaseConverter.php | 2 +- src/Rules.php | 18 ++++++++---- src/RulesTest.php | 4 +-- src/TopLevelDomains.php | 8 ++++-- src/TopLevelDomainsTest.php | 4 +-- 9 files changed, 87 insertions(+), 79 deletions(-) diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 8e59b1e9..1cd60a82 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -32,33 +32,24 @@ public static function __set_state(array $properties): self return new self($properties['domain'], $properties['section']); } - /** - * @param mixed $publicSuffix a public suffix - */ - public static function fromICANN($publicSuffix, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self + public static function fromICANN(DomainName $domain): self { - return new self(new Domain($publicSuffix, $asciiIDNAOption, $unicodeIDNAOption), self::ICANN_DOMAINS); + return new self($domain, self::ICANN_DOMAINS); } - /** - * @param mixed $publicSuffix a public suffix - */ - public static function fromPrivate($publicSuffix, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self + public static function fromPrivate(DomainName $domain): self { - return new self(new Domain($publicSuffix, $asciiIDNAOption, $unicodeIDNAOption), self::PRIVATE_DOMAINS); + return new self($domain, self::PRIVATE_DOMAINS); } - /** - * @param mixed $publicSuffix a public suffix - */ - public static function fromUnknown($publicSuffix, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self + public static function fromUnknown(DomainName $domain): self { - return new self(new Domain($publicSuffix, $asciiIDNAOption, $unicodeIDNAOption), ''); + return new self($domain, ''); } - public static function fromNull(int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self + public static function fromNull(): self { - return new self(Domain::fromNull($asciiIDNAOption, $unicodeIDNAOption), ''); + return new self(Domain::fromNull(), ''); } public function getDomain(): DomainName diff --git a/src/PublicSuffixTest.php b/src/PublicSuffixTest.php index 983a5cd8..c234d872 100644 --- a/src/PublicSuffixTest.php +++ b/src/PublicSuffixTest.php @@ -17,7 +17,8 @@ class PublicSuffixTest extends TestCase { public function testInternalPhpMethod(): void { - $publicSuffix = PublicSuffix::fromICANN('ac.be'); + $domain = new Domain('ac.be'); + $publicSuffix = PublicSuffix::fromICANN($domain); $generatePublicSuffix = eval('return '.var_export($publicSuffix, true).';'); self::assertEquals($publicSuffix, $generatePublicSuffix); self::assertEquals('"ac.be"', json_encode($publicSuffix)); @@ -26,7 +27,8 @@ public function testInternalPhpMethod(): void public function testPSToUnicodeWithUrlEncode(): void { - self::assertSame('bébe', PublicSuffix::fromUnknown('b%C3%A9be')->toUnicode()->value()); + $domain = new Domain('b%C3%A9be'); + self::assertSame('bébe', PublicSuffix::fromUnknown($domain)->toUnicode()->value()); } /** @@ -35,12 +37,14 @@ public function testPSToUnicodeWithUrlEncode(): void */ public function testSetSection(?string $publicSuffix, string $section, bool $isKnown, bool $isIcann, bool $isPrivate): void { + $domain = new Domain($publicSuffix); + if ('' === $section) { - $ps = PublicSuffix::fromUnknown($publicSuffix); + $ps = PublicSuffix::fromUnknown($domain); } elseif ('ICANN_DOMAINS' === $section) { - $ps = PublicSuffix::fromICANN($publicSuffix); + $ps = PublicSuffix::fromICANN($domain); } elseif ('PRIVATE_DOMAINS' === $section) { - $ps = PublicSuffix::fromPrivate($publicSuffix); + $ps = PublicSuffix::fromPrivate($domain); } if (!isset($ps)) { @@ -68,7 +72,7 @@ public function testConstructorThrowsException(string $publicSuffix): void { self::expectException(SyntaxError::class); - PublicSuffix::fromUnknown($publicSuffix); + PublicSuffix::fromUnknown(new Domain($publicSuffix)); } public function invalidPublicSuffixProvider(): iterable @@ -83,14 +87,14 @@ public function testPSToAsciiThrowsException(): void { self::expectException(SyntaxError::class); - PublicSuffix::fromUnknown('a⒈com'); + PublicSuffix::fromUnknown(new Domain('a⒈com')); } public function testToUnicodeThrowsException(): void { self::expectException(SyntaxError::class); - PublicSuffix::fromUnknown('xn--a-ecp.ru')->toUnicode(); + PublicSuffix::fromUnknown(new Domain('xn--a-ecp.ru'))->toUnicode(); } /** @@ -99,7 +103,7 @@ public function testToUnicodeThrowsException(): void */ public function testConversionReturnsTheSameInstance(?string $publicSuffix): void { - $instance = PublicSuffix::fromUnknown($publicSuffix); + $instance = PublicSuffix::fromUnknown(new Domain($publicSuffix)); self::assertEquals($instance->toUnicode(), $instance); self::assertEquals($instance->toAscii(), $instance); @@ -115,7 +119,7 @@ public function conversionReturnsTheSameInstanceProvider(): iterable public function testToUnicodeReturnsSameInstance(): void { - $instance = PublicSuffix::fromUnknown('食狮.公司.cn'); + $instance = PublicSuffix::fromUnknown(new Domain('食狮.公司.cn')); self::assertEquals($instance->toUnicode(), $instance); } @@ -126,7 +130,7 @@ public function testToUnicodeReturnsSameInstance(): void */ public function testCountable(?string $domain, int $nbLabels, array $labels): void { - $domain = PublicSuffix::fromUnknown($domain); + $domain = PublicSuffix::fromUnknown(new Domain($domain)); self::assertCount($nbLabels, $domain); } @@ -149,7 +153,8 @@ public function testResolveWithCustomIDNAOptions( string $expectedAscii, string $expectedUnicode ): void { - $publicSuffix = PublicSuffix::fromUnknown($name, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); + $domain = new Domain($name, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); + $publicSuffix = PublicSuffix::fromUnknown($domain); self::assertSame($expectedContent, $publicSuffix->value()); self::assertSame($expectedAscii, $publicSuffix->toAscii()->value()); self::assertSame($expectedUnicode, $publicSuffix->toUnicode()->value()); @@ -193,7 +198,7 @@ public function customIDNAProvider(): iterable public function testWithIDNAOptions(): void { - $publicSuffix = PublicSuffix::fromUnknown('com'); + $publicSuffix = PublicSuffix::fromUnknown(new Domain('com')); self::assertSame($publicSuffix, $publicSuffix->withValue('com', $publicSuffix->getAsciiIDNAOption())); self::assertNotEquals($publicSuffix, $publicSuffix->withValue('com', IDNA_NONTRANSITIONAL_TO_ASCII)); diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 055be9d8..324cefbb 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -59,11 +59,8 @@ private function setDomainName(Host $domain): DomainName */ private function setPublicSuffix(EffectiveTLD $publicSuffix = null): EffectiveTLD { - $asciiIDNAOptions = $this->domain->getAsciiIDNAOption(); - $unicodeIDNAOptions = $this->domain->getUnicodeIDNAOption(); - if (null === $publicSuffix || null === $publicSuffix->value()) { - return PublicSuffix::fromNull($asciiIDNAOptions, $unicodeIDNAOptions); + return PublicSuffix::fromNull(); } if (2 > count($this->domain)) { @@ -74,7 +71,6 @@ private function setPublicSuffix(EffectiveTLD $publicSuffix = null): EffectiveTL throw UnableToResolveDomain::dueToUnresolvableDomain($this->domain); } - $publicSuffix = $publicSuffix->withValue($publicSuffix->value(), $asciiIDNAOptions, $unicodeIDNAOptions); $publicSuffix = $this->normalize($publicSuffix); if ($this->domain->value() === $publicSuffix->value()) { throw new UnableToResolveDomain(sprintf('The public suffix and the domain name are is identical `%s`.', $this->domain->toString())); @@ -93,6 +89,12 @@ private function setPublicSuffix(EffectiveTLD $publicSuffix = null): EffectiveTL */ private function normalize(EffectiveTLD $subject): EffectiveTLD { + $subject = $subject->withValue( + $subject->value(), + $this->domain->getAsciiIDNAOption(), + $this->domain->getUnicodeIDNAOption() + ); + if (1 !== preg_match(self::REGEXP_IDN_PATTERN, $this->domain->toString())) { return $subject->toAscii(); } @@ -205,15 +207,15 @@ public function toUnicode(): self public function withPublicSuffix($publicSuffix): self { if (!$publicSuffix instanceof EffectiveTLD) { - $publicSuffix = PublicSuffix::fromUnknown($publicSuffix); + if ($publicSuffix instanceof ExternalDomainName) { + $publicSuffix = PublicSuffix::fromUnknown($publicSuffix->getDomain()); + } elseif ($publicSuffix instanceof DomainName) { + $publicSuffix = PublicSuffix::fromUnknown($publicSuffix); + } else { + $publicSuffix = PublicSuffix::fromUnknown(new Domain($publicSuffix)); + } } - $publicSuffix = $publicSuffix->withValue( - $publicSuffix->value(), - $this->domain->getAsciiIDNAOption(), - $this->domain->getUnicodeIDNAOption() - ); - $publicSuffix = $this->normalize($publicSuffix); if ($this->publicSuffix == $publicSuffix) { return $this; diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 5e038064..c9103669 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -32,7 +32,7 @@ public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain(?stri { self::expectException(UnableToResolveDomain::class); - new ResolvedDomain(new Domain($domain), PublicSuffix::fromICANN($publicSuffix)); + new ResolvedDomain(new Domain($domain), PublicSuffix::fromICANN(new Domain($publicSuffix))); } public function provideWrongConstructor(): iterable @@ -59,7 +59,7 @@ public function provideWrongConstructor(): iterable public function testDomainInternalPhpMethod(): void { - $domain = new ResolvedDomain(new Domain('www.ulb.ac.be'), PublicSuffix::fromICANN('ac.be')); + $domain = new ResolvedDomain(new Domain('www.ulb.ac.be'), PublicSuffix::fromICANN(new Domain('ac.be'))); $generateDomain = eval('return '.var_export($domain, true).';'); self::assertEquals($domain, $generateDomain); self::assertEquals('"www.ulb.ac.be"', json_encode($domain->jsonSerialize())); @@ -103,7 +103,7 @@ public function testToIDN( ?string $expectedIDNDomain, ?string $expectedIDNSuffix ): void { - $objPublicSuffix = (null === $publicSuffix) ? PublicSuffix::fromNull() : PublicSuffix::fromICANN($publicSuffix); + $objPublicSuffix = (null === $publicSuffix) ? PublicSuffix::fromNull() : PublicSuffix::fromICANN(new Domain($publicSuffix)); $domain = new ResolvedDomain(new Domain($domain), $objPublicSuffix); self::assertSame($expectedDomain, $domain->value()); @@ -194,7 +194,7 @@ public function testToAscii( ?string $expectedAsciiDomain, ?string $expectedAsciiSuffix ): void { - $objPublicSuffix = (null === $publicSuffix) ? PublicSuffix::fromNull() : PublicSuffix::fromICANN($publicSuffix); + $objPublicSuffix = (null === $publicSuffix) ? PublicSuffix::fromNull() : PublicSuffix::fromICANN(new Domain($publicSuffix)); $domain = new ResolvedDomain(new Domain($domain), $objPublicSuffix); self::assertSame($expectedDomain, $domain->value()); @@ -271,27 +271,27 @@ public function withSubDomainWorksProvider(): iterable { return [ 'simple addition' => [ - 'domain' => new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANN('com')), + 'domain' => new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANN(new Domain('com'))), 'subdomain' => 'www', 'expected' => 'www', ], 'simple addition IDN (1)' => [ - 'domain' => new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANN('com')), + 'domain' => new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANN(new Domain('com'))), 'subdomain' => new Domain('bébé'), 'expected' => 'xn--bb-bjab', ], 'simple addition IDN (2)' => [ - 'domain' => new ResolvedDomain(new Domain('Яндекс.РФ'), PublicSuffix::fromICANN('рф')), + 'domain' => new ResolvedDomain(new Domain('Яндекс.РФ'), PublicSuffix::fromICANN(new Domain('рф'))), 'subdomain' => 'bébé', 'expected' => 'bébé', ], 'simple removal' => [ - 'domain' => new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANN('com')), + 'domain' => new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANN(new Domain('com'))), 'subdomain' => null, 'expected' => null, ], 'simple removal IDN' => [ - 'domain' => new ResolvedDomain(new Domain('bébé.Яндекс.РФ'), PublicSuffix::fromICANN('рф')), + 'domain' => new ResolvedDomain(new Domain('bébé.Яндекс.РФ'), PublicSuffix::fromICANN(new Domain('рф'))), 'subdomain' => 'xn--bb-bjab', 'expected' => 'bébé', ], @@ -316,7 +316,7 @@ public function testWithEmptySubdomain(): void { self::expectException(SyntaxError::class); - $domain = new ResolvedDomain(new Domain('www.example.com'), PublicSuffix::fromICANN('com')); + $domain = new ResolvedDomain(new Domain('www.example.com'), PublicSuffix::fromICANN(new Domain('com'))); $domain->withSubDomain(''); } @@ -324,7 +324,7 @@ public function testWithEmptySubdomain(): void public function testWithSubDomainFailsWithNonStringableObject(): void { self::expectException(TypeError::class); - $domain = new ResolvedDomain(new Domain('www.example.com'), PublicSuffix::fromICANN('com')); + $domain = new ResolvedDomain(new Domain('www.example.com'), PublicSuffix::fromICANN(new Domain('com'))); $domain->withSubDomain(date_create()); } @@ -361,7 +361,7 @@ public function testWithPublicSuffixWorks( public function withPublicSuffixWorksProvider(): iterable { - $base_domain = new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANN('com')); + $base_domain = new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANN(new Domain('com'))); return [ 'simple update (1)' => [ @@ -374,7 +374,7 @@ public function withPublicSuffixWorksProvider(): iterable ], 'simple update (2)' => [ 'domain' => $base_domain, - 'publicSuffix' => PublicSuffix::fromPrivate('github.io'), + 'publicSuffix' => PublicSuffix::fromPrivate(new Domain('github.io')), 'expected' => 'github.io', 'isKnown' => true, 'isICANN' => false, @@ -382,7 +382,7 @@ public function withPublicSuffixWorksProvider(): iterable ], 'same public suffix but PSL info is changed' => [ 'domain' => $base_domain, - 'publicSuffix' => PublicSuffix::fromPrivate('com'), + 'publicSuffix' => PublicSuffix::fromPrivate(new Domain('com')), 'expected' => 'com', 'isKnown' => true, 'isICANN' => false, @@ -390,7 +390,7 @@ public function withPublicSuffixWorksProvider(): iterable ], 'same public suffix but PSL info does not changed' => [ 'domain' => $base_domain, - 'publicSuffix' => PublicSuffix::fromICANN('com'), + 'publicSuffix' => PublicSuffix::fromICANN(new Domain('com')), 'expected' => 'com', 'isKnown' => true, 'isICANN' => true, @@ -398,15 +398,15 @@ public function withPublicSuffixWorksProvider(): iterable ], 'simple update IDN (1)' => [ 'domain' => $base_domain, - 'publicSuffix' => PublicSuffix::fromICANN('рф'), + 'publicSuffix' => PublicSuffix::fromICANN(new Domain('рф')), 'expected' => 'xn--p1ai', 'isKnown' => true, 'isICANN' => true, 'isPrivate' => false, ], 'simple update IDN (2)' => [ - 'domain' => new ResolvedDomain(new Domain('www.bébé.be'), PublicSuffix::fromICANN('be')), - 'publicSuffix' => PublicSuffix::fromICANN('xn--p1ai'), + 'domain' => new ResolvedDomain(new Domain('www.bébé.be'), PublicSuffix::fromICANN(new Domain('be'))), + 'publicSuffix' => PublicSuffix::fromICANN(new Domain('xn--p1ai')), 'expected' => 'рф', 'isKnown' => true, 'isICANN' => true, @@ -421,7 +421,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'removing the public suffix list' => [ - 'domain' => new ResolvedDomain(new Domain('www.bébé.be'), PublicSuffix::fromICANN('be')), + 'domain' => new ResolvedDomain(new Domain('www.bébé.be'), PublicSuffix::fromICANN(new Domain('be'))), 'publicSuffix' => null, 'expected' => null, 'isKnown' => false, @@ -429,7 +429,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'with custom IDNA domain options' =>[ - 'domain' => new ResolvedDomain(new Domain('www.bébé.be', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE), PublicSuffix::fromICANN('be')), + 'domain' => new ResolvedDomain(new Domain('www.bébé.be', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE), PublicSuffix::fromICANN(new Domain('be'))), 'publicSuffix' => null, 'expected' => null, 'isKnown' => false, @@ -464,7 +464,7 @@ public function testResolveWorksWithCustomIDNAOptions( ?string $expectedSubDomain ): void { $host = new Domain($domainName, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); - $resolvedDomain = new ResolvedDomain($host, PublicSuffix::fromICANN($publicSuffix)); + $resolvedDomain = new ResolvedDomain($host, PublicSuffix::fromICANN(new Domain($publicSuffix))); self::assertSame($expectedContent, $resolvedDomain->value()); self::assertSame($expectedAscii, $resolvedDomain->toAscii()->value()); @@ -519,7 +519,7 @@ public function testInstanceCreationWithCustomIDNAOptions(): void { $domain = new ResolvedDomain( new Domain('example.com', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE), - PublicSuffix::fromICANN('com') + PublicSuffix::fromICANN(new Domain('com')) ); /** @var ResolvedDomain $instance */ @@ -537,7 +537,7 @@ public function testInstanceCreationWithCustomIDNAOptions(): void [$instance->getDomain()->getAsciiIDNAOption(), $instance->getDomain()->getUnicodeIDNAOption()] ); - $instance = $domain->withPublicSuffix(PublicSuffix::fromICANN('us')); + $instance = $domain->withPublicSuffix(PublicSuffix::fromICANN(new Domain('us'))); self::assertSame( [$domain->getDomain()->getAsciiIDNAOption(), $domain->getDomain()->getUnicodeIDNAOption()], @@ -567,7 +567,7 @@ public function testWithSecondLevelDomain( ?string $expectedSld, ?string $expectedHost ): void { - $domain = new ResolvedDomain(new Domain($host), PublicSuffix::fromICANN($publicSuffix)); + $domain = new ResolvedDomain(new Domain($host), PublicSuffix::fromICANN(new Domain($publicSuffix))); $newDomain = $domain->withSecondLevelDomain($sld); self::assertSame($expectedSld, $newDomain->getSecondLevelDomain()); diff --git a/src/RootZoneDatabaseConverter.php b/src/RootZoneDatabaseConverter.php index 722a25c0..b8527151 100644 --- a/src/RootZoneDatabaseConverter.php +++ b/src/RootZoneDatabaseConverter.php @@ -93,7 +93,7 @@ private function extractHeader(string $content): array private function extractRootZone(string $content): string { try { - $tld = PublicSuffix::fromUnknown($content)->toAscii(); + $tld = PublicSuffix::fromUnknown(new Domain($content))->toAscii(); } catch (CannotProcessHost $exception) { throw UnableToLoadRootZoneDatabase::dueToInvalidRootZoneDomain($content, $exception); } diff --git a/src/Rules.php b/src/Rules.php index 1fce73ec..42ec7310 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -198,7 +198,9 @@ private function getPublicSuffix(DomainName $domain, string $section): Effective return $icann; } - return PublicSuffix::fromUnknown($domain->toAscii()->label(0), $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()); + $publicSuffix = new Domain($domain->toAscii()->label(0), $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()); + + return PublicSuffix::fromUnknown($publicSuffix); } /** @@ -230,15 +232,21 @@ private function getPublicSuffixFromSection(DomainName $domain, string $section) } if ([] === $matches) { - return PublicSuffix::fromUnknown($domain->toAscii()->label(0), $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()); + $publicSuffix = new Domain($domain->toAscii()->label(0), $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()); + + return PublicSuffix::fromUnknown($publicSuffix); } - $content = implode('.', array_reverse($matches)); + $publicSuffix = new Domain( + implode('.', array_reverse($matches)), + $domain->getAsciiIDNAOption(), + $domain->getUnicodeIDNAOption() + ); if (PublicSuffix::PRIVATE_DOMAINS === $section) { - return PublicSuffix::fromPrivate($content, $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()); + return PublicSuffix::fromPrivate($publicSuffix); } - return PublicSuffix::fromICANN($content, $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()); + return PublicSuffix::fromICANN($publicSuffix); } } diff --git a/src/RulesTest.php b/src/RulesTest.php index bca96906..e71872e1 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -215,7 +215,7 @@ public function testWithDomainObject(): void { $domain = new ResolvedDomain( new Domain('private.ulb.ac.be'), - PublicSuffix::fromICANN('ac.be') + PublicSuffix::fromICANN(new Domain('ac.be')) ); $newDomain = $this->rules->resolve($domain); @@ -230,7 +230,7 @@ public function testWithDomainObject(): void public function testWithDomainInterfaceObject(): void { - $domain = PublicSuffix::fromICANN('ulb.ac.be'); + $domain = PublicSuffix::fromICANN(new Domain('ulb.ac.be')); self::assertSame( 'ac.be', diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 204884a0..f0f5f1e9 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -120,7 +120,7 @@ public function isEmpty(): bool public function getIterator() { foreach ($this->records as $tld) { - yield PublicSuffix::fromUnknown($tld)->toAscii(); + yield PublicSuffix::fromUnknown((new Domain($tld))->toAscii()); } } @@ -186,10 +186,12 @@ public function resolve($domain): ResolvedDomainName $label = $domain->toAscii()->label(0); foreach ($this as $tld) { if ($tld->value() === $label) { - return new ResolvedDomain($domain, PublicSuffix::fromUnknown($tld, $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption())); + $publicSuffix = new Domain($tld, $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()); + + return new ResolvedDomain($domain, PublicSuffix::fromUnknown($publicSuffix)); } } - return new ResolvedDomain($domain, PublicSuffix::fromNull($domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption())); + return new ResolvedDomain($domain, PublicSuffix::fromNull()); } } diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index c6f49aae..951c9014 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -142,7 +142,7 @@ public function validDomainProvider(): iterable { $resolvedDomain = new ResolvedDomain( new Domain('www.example.com'), - PublicSuffix::fromICANN('com') + PublicSuffix::fromICANN(new Domain('com')) ); return [ @@ -242,7 +242,7 @@ public function __toString(): string return 'COM'; } }], - 'externalDomain' => [PublicSuffix::fromICANN('com')], + 'externalDomain' => [PublicSuffix::fromICANN(new Domain('com'))], ]; } From c556e5dba571206428cdb323c8e21f25768e0a3a Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 19 Nov 2020 22:25:21 +0100 Subject: [PATCH 300/461] Adding named constructor and improving Domain conversion --- README.md | 64 +++++++-------- UPGRADING.md | 12 ++- src/Domain.php | 59 +++++++------- src/DomainNameParser.php | 15 ++-- src/DomainTest.php | 124 +++++++----------------------- src/IDNConversion.php | 32 +------- src/PublicSuffix.php | 28 ++----- src/PublicSuffixTest.php | 39 ++++------ src/ResolvedDomain.php | 103 ++++++++++++------------- src/ResolvedDomainTest.php | 111 ++++++++++---------------- src/RootZoneDatabaseConverter.php | 2 +- src/Rules.php | 19 +++-- src/RulesTest.php | 21 ++--- src/TopLevelDomains.php | 12 +-- src/TopLevelDomainsTest.php | 21 ++--- 15 files changed, 253 insertions(+), 409 deletions(-) diff --git a/README.md b/README.md index c5efe556..c79ec229 100644 --- a/README.md +++ b/README.md @@ -272,11 +272,11 @@ will always cast the domain value to a string. ~~~php use Pdp\Domain; -$nullDomain = new Domain(null); +$nullDomain = Domain::fromIDNA2008(null); $nullDomain->value(); // returns null; $nullDomain->toString(); // returns ''; -$emptyDomain = new Domain(''); +$emptyDomain = Domain::fromIDNA2008(''); $emptyDomain->value(); // returns ''; $emptyDomain->toString(); // returns ''; ~~~ @@ -286,56 +286,58 @@ $emptyDomain->toString(); // returns ''; Domain names support different formats (ascii and unicode format), the package by default will convert the domain in its ascii format for resolution against the public suffix source and convert it back to its unicode form if needed. -This is done using PHP `ext-intl` extension. As such all domain objects expose -a `toAscii` and a `toUnicode` methods which returns a new instance in the -converted format. +To do so all domain objects expose a `toAscii` and a `toUnicode` methods which +returns a new instance in the converted format. +By default, resolver will use the IDNA2008 format to convert the submitted string. ~~~php /** @var Rules $rules */ -$unicodeDomain = $rules->resolve(new Domain('bébé.be')); +$unicodeDomain = $rules->resolve(Domain::fromIDNA2008('bébé.be')); echo $unicodeDomain->toString(); // returns 'bébé.be' $unicodeDomain->getSecondLevelDomain(); // returns 'bébé' -$asciiDomain = $rules->resolve(new Domain('xn--bb-bjab.be')); +$asciiDomain = $rules->resolve(Domain::fromIDNA2008('xn--bb-bjab.be')); $asciiDomain->toString(); // returns 'xn--bb-bjab.be' $asciiDomain->getSecondLevelDomain(); // returns 'xn--bb-bjab' $asciiDomain->toUnicode()->toString() === $unicodeDomain->toString(); //returns true ~~~ -Because the domain conversion occurs during normalization of the -domain name you should give the proper `IDNA_*` constants when creating -or updating the domain name value. - Since the `ResolvedDomain` only cares about public suffix resolution, -only the `Pdp\Domain` and the `Pdp\PublicSuffix` objects expose methods -to correctly format domain names. their constructor as well as their -`::withValue` methods accepts the following optional parameters: -(`$asciiIDNAOption` and`$unicodeIDNAOption`) to tell the underlying methods -using the `idn_to_utf8` and `idn_to_ascii` functions from the `ext-intl` -package how to convert the value to its unicode or ascii form. Those variables -should be a combination of the `IDNA_*` constants (except `IDNA_ERROR_*` -constants). -You can access the `IDNA_*` current value using the `::getAsciiIDNAOption` and -`::getUnicodeIDNAOption` methods. +only the `Pdp\Domain` exposes methods to correctly format domain names. +the named constructors highlight the algorithm used to convert the +domain name between ascii and unicode format. +`Domain::fromIDNA2008` convert the value to its unicode format using IDNA 2008 +rules. While `Domain::fromIDNA2003` does it using legacy rules. At any given +moment you can tell which algorithm will be used to convert the domain and in which +format it is using the following methods: ~~~php use Pdp\Domain; -$domain = new Domain('faß.de'); -$domain->getAsciiIDNAOption(); // returns IDNA_DEFAULT -$domain->getUnicodeIDNAOption(); // returns IDNA_DEFAULT -echo $domain->value(); // display 'fass.de' - -$altDomain = $domain->withValue('faß.de', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); -$altDomain->getAsciiIDNAOption(); // returns IDNA_NONTRANSITIONAL_TO_ASCII -$altDomain->getUnicodeIDNAOption(); // returns IDNA_NONTRANSITIONAL_TO_UNICODE -echo $altDomain->value(); // display 'faß.de' +$domain = Domain::fromIDNA2008('faß.de'); +echo $domain->value(); // display 'faß.de' +$domain->isIDNA2008(); // returns true +$domain->isAscii(); // return false +$asciiDomain = $domain->toAscii(); +echo $asciiDomain->value(); // display 'xn--fa-hia.de' +$asciiDomain->isIDNA2008(); // returns true +$asciiDomain->isAscii(); // returns true + +$domain = Domain::fromIDNA2003('faß.de'); +echo $domain->value(); // display 'fass.de' +$domain->isIDNA2008(); // returns true +$domain->isAscii(); // return false +$asciiDomain = $domain->toAscii(); +echo $asciiDomain->value(); // display 'fass.de' +$asciiDomain->isIDNA2008(); // returns true +$asciiDomain->isAscii(); // returns true ~~~ **TIP: Always favor submitting a `Domain` object for resolution rather that a string or an object that can be cast to a string to avoid unexpected format -conversion errors/results.** +conversion errors/results. By default and with lack of information conversion +is done using IDNA 2008 rules.** ## Managing the package databases diff --git a/UPGRADING.md b/UPGRADING.md index 7dedc56b..f0e08760 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -60,6 +60,9 @@ The `Domain` **has no access** to the domain parts or the public suffix list st - Domain objects no longer exposes the `__toString` magic methods. - `Domain::getContent` is renamed `Domain::value` +- The `Domain` constructor is private. To instantiate a domain object you +need to use on of the two named constructor `Domain::fromIDNA2008` or +`Domain::fromIDNA2008`. **version 5** ~~~php @@ -70,7 +73,7 @@ $domain->getContent(); // can be a string or null **version 6** ~~~php -$domain = new Domain('www.example.com'); +$domain = Domain::fromIDNA2008('www.example.com'); echo $domain->toString(); // display 'www.example.com' $domain->value(); // can be a string or null ~~~ @@ -118,4 +121,9 @@ representation in other languages. #### The Rules object instantiation -The `Rules::__construct` and the `TopLevelDomains::__construct` methods are now private. +- `Rules::__construct` +- `TopLevelDomains::__construct` +- `Domain::__construct` +- `PublicSuffix::__construct` + +methods are now all private. diff --git a/src/Domain.php b/src/Domain.php index 49df9fe2..3c6dfb6e 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -17,11 +17,11 @@ use function preg_match; use function sprintf; use const IDNA_DEFAULT; +use const IDNA_NONTRANSITIONAL_TO_ASCII; +use const IDNA_NONTRANSITIONAL_TO_UNICODE; final class Domain extends DomainNameParser implements DomainName { - private const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/'; - /** * @var array */ @@ -36,16 +36,14 @@ final class Domain extends DomainNameParser implements DomainName /** * @param null|mixed $domain */ - public function __construct( - $domain = null, - int $asciiIDNAOption = IDNA_DEFAULT, - int $unicodeIDNAOption = IDNA_DEFAULT - ) { + private function __construct($domain, int $asciiIDNAOption, int $unicodeIDNAOption) + { $this->labels = $this->parse($domain, $asciiIDNAOption, $unicodeIDNAOption); $this->domain = implode('.', array_reverse($this->labels)); if ([] === $this->labels) { $this->domain = null; } + $this->asciiIDNAOption = $asciiIDNAOption; $this->unicodeIDNAOption = $unicodeIDNAOption; } @@ -59,9 +57,20 @@ public static function __set_state(array $properties): self ); } - public static function fromNull(int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self + /** + * @param null|mixed $domain + */ + public static function fromIDNA2003($domain): self { - return new self(null, $asciiIDNAOption, $unicodeIDNAOption); + return new self($domain, IDNA_DEFAULT, IDNA_DEFAULT); + } + + /** + * @param null|mixed $domain + */ + public static function fromIDNA2008($domain): self + { + return new self($domain, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); } public function getIterator() @@ -71,6 +80,17 @@ public function getIterator() } } + public function isIDNA2008(): bool + { + return IDNA_NONTRANSITIONAL_TO_ASCII === $this->asciiIDNAOption; + } + + public function isAscii(): bool + { + return null === $this->domain || + 1 !== preg_match(self::REGEXP_IDN_PATTERN, $this->domain); + } + public function jsonSerialize(): ?string { return $this->value(); @@ -112,16 +132,6 @@ public function labels(): array return $this->labels; } - public function getAsciiIDNAOption(): int - { - return $this->asciiIDNAOption; - } - - public function getUnicodeIDNAOption(): int - { - return $this->unicodeIDNAOption; - } - public function toAscii(): self { if (null === $this->domain) { @@ -150,17 +160,6 @@ public function toUnicode(): self return new self($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption); } - public function withValue(?string $domain, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOptions = IDNA_DEFAULT): self - { - if ($asciiIDNAOption === $this->asciiIDNAOption && - $unicodeIDNAOptions === $this->unicodeIDNAOption && - $domain === $this->domain) { - return $this; - } - - return new self($domain, $asciiIDNAOption, $unicodeIDNAOptions); - } - /** * Filter a subdomain to update the domain part. * diff --git a/src/DomainNameParser.php b/src/DomainNameParser.php index a6456ba0..c9c83c8e 100644 --- a/src/DomainNameParser.php +++ b/src/DomainNameParser.php @@ -39,6 +39,8 @@ abstract class DomainNameParser { + protected const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/'; + /** * Get and format IDN conversion error message. */ @@ -86,9 +88,7 @@ final protected function idnToAscii(string $domain, int $option = IDNA_DEFAULT): { $domain = rawurldecode($domain); - static $pattern = '/[^\x20-\x7f]/'; - - if (1 !== preg_match($pattern, $domain)) { + if (1 !== preg_match(self::REGEXP_IDN_PATTERN, $domain)) { return strtolower($domain); } @@ -160,8 +160,12 @@ final protected function idnToUnicode(string $domain, int $option = IDNA_DEFAULT *@return array * */ - final protected function parse($domain = null, int $asciiOption = IDNA_DEFAULT, int $unicodeOption = IDNA_DEFAULT): array + final protected function parse($domain, int $asciiOption, int $unicodeOption): array { + if ($domain instanceof ExternalDomainName) { + $domain = $domain->getDomain()->value(); + } + if ($domain instanceof Host) { $domain = $domain->value(); } @@ -209,8 +213,7 @@ final protected function parse($domain = null, int $asciiOption = IDNA_DEFAULT, } // if the domain name does not contains UTF-8 chars then it is malformed - static $pattern = '/[^\x20-\x7f]/'; - if (1 === preg_match($pattern, $formattedDomain)) { + if (1 === preg_match(self::REGEXP_IDN_PATTERN, $formattedDomain)) { $asciiDomain = $this->idnToAscii($domain, $asciiOption); /** @var array $labels */ diff --git a/src/DomainTest.php b/src/DomainTest.php index 45fb1ffa..a2bf209b 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -6,9 +6,6 @@ use PHPUnit\Framework\TestCase; use TypeError; -use const IDNA_DEFAULT; -use const IDNA_NONTRANSITIONAL_TO_ASCII; -use const IDNA_NONTRANSITIONAL_TO_UNICODE; /** * @coversDefaultClass \Pdp\Domain @@ -23,7 +20,7 @@ public function testToAsciiThrowsException(string $domain): void { self::expectException(SyntaxError::class); - new Domain($domain); + Domain::fromIDNA2008($domain); } public function invalidDomainProvider(): iterable @@ -39,12 +36,12 @@ public function testToUnicodeThrowsException(): void { self::expectException(SyntaxError::class); - (new Domain('xn--a-ecp.ru'))->toUnicode(); + Domain::fromIDNA2008('xn--a-ecp.ru')->toUnicode(); } public function testDomainInternalPhpMethod(): void { - $domain = new Domain('www.ulb.ac.be'); + $domain = Domain::fromIDNA2008('www.ulb.ac.be'); $generateDomain = eval('return '.var_export($domain, true).';'); self::assertEquals($domain, $generateDomain); self::assertSame(['be', 'ac', 'ulb', 'www'], iterator_to_array($domain)); @@ -60,7 +57,7 @@ public function testDomainInternalPhpMethod(): void */ public function testCountable(?string $domain, int $nbLabels, array $labels): void { - $domain = new Domain($domain); + $domain = Domain::fromIDNA2008($domain); self::assertCount($nbLabels, $domain); self::assertSame($labels, iterator_to_array($domain)); } @@ -77,7 +74,8 @@ public function countableProvider(): iterable public function testGetLabel(): void { - $domain = new Domain('master.example.com'); + $domain = Domain::fromIDNA2008('master.example.com'); + self::assertSame('com', $domain->label(0)); self::assertSame('example', $domain->label(1)); self::assertSame('master', $domain->label(-1)); @@ -87,23 +85,22 @@ public function testGetLabel(): void public function testOffsets(): void { - $domain = new Domain('master.com.example.com'); + $domain = Domain::fromIDNA2008('master.com.example.com'); + self::assertSame([0, 2], $domain->keys('com')); self::assertSame([], $domain->keys('toto')); } public function testLabels(): void { - $domain = new Domain('master.com.example.com'); self::assertSame([ 'com', 'example', 'com', 'master', - ], $domain->labels()); + ], Domain::fromIDNA2008('master.com.example.com')->labels()); - $domain = new Domain(); - self::assertSame([], $domain->labels()); + self::assertSame([], Domain::fromIDNA2008(null)->labels()); } /** @@ -118,7 +115,7 @@ public function testToIDN( ?string $expectedDomain, ?string $expectedIDNDomain ): void { - $domain = new Domain($domain); + $domain = Domain::fromIDNA2008($domain); self::assertSame($expectedDomain, $domain->value()); /** @var Domain $domainIDN */ @@ -178,7 +175,7 @@ public function testToAscii( ?string $expectedDomain, ?string $expectedAsciiDomain ): void { - $domain = new Domain($domain); + $domain = Domain::fromIDNA2008($domain); self::assertSame($expectedDomain, $domain->value()); /** @var Domain $domainIDN */ @@ -230,11 +227,11 @@ public function testWithLabelWorks(Domain $domain, int $key, string $label, ?str public function withLabelWorksProvider(): iterable { - $base_domain = new Domain('www.example.com'); + $base_domain = Domain::fromIDNA2008('www.example.com'); return [ 'null domain' => [ - 'domain' => new Domain(), + 'domain' => Domain::fromIDNA2008(null), 'key' => 0, 'label' => 'localhost', 'expected' => 'localhost', @@ -282,7 +279,7 @@ public function withLabelWorksProvider(): iterable 'expected' => 'xn--p1ai.example.com', ], 'simple update IDN (2)' => [ - 'domain' => new Domain('www.bébé.be'), + 'domain' => Domain::fromIDNA2008('www.bébé.be'), 'key' => 2, 'label' => 'xn--p1ai', 'expected' => 'рф.bébé.be', @@ -299,20 +296,20 @@ public function withLabelWorksProvider(): iterable public function testWithLabelFailsWithTypeError(): void { self::expectException(TypeError::class); - (new Domain('example.com'))->withLabel(1, null); + Domain::fromIDNA2008('example.com')->withLabel(1, null); } public function testWithLabelFailsWithInvalidKey(): void { self::expectException(SyntaxError::class); - (new Domain('example.com'))->withLabel(-4, 'www'); + Domain::fromIDNA2008('example.com')->withLabel(-4, 'www'); } public function testWithLabelFailsWithInvalidLabel2(): void { self::expectException(SyntaxError::class); - (new Domain('example.com'))->withLabel(-1, ''); + Domain::fromIDNA2008('example.com')->withLabel(-1, ''); } /** @@ -320,7 +317,7 @@ public function testWithLabelFailsWithInvalidLabel2(): void */ public function testAppend(string $raw, string $append, string $expected): void { - self::assertSame($expected, (new Domain($raw))->append($append)->toString()); + self::assertSame($expected, Domain::fromIDNA2008($raw)->append($append)->toString()); } public function validAppend(): iterable @@ -338,7 +335,7 @@ public function validAppend(): iterable */ public function testPrepend(string $raw, string $prepend, string $expected): void { - self::assertSame($expected, (new Domain($raw))->prepend($prepend)->toString()); + self::assertSame($expected, Domain::fromIDNA2008($raw)->prepend($prepend)->toString()); } public function validPrepend(): iterable @@ -362,7 +359,7 @@ public function testwithoutLabelWorks(Domain $domain, int $key, ?string $expecte public function withoutLabelWorksProvider(): iterable { - $base_domain = new Domain('www.example.com'); + $base_domain = Domain::fromIDNA2008('www.example.com'); return [ 'simple removal positive offset' => [ @@ -391,21 +388,19 @@ public function withoutLabelWorksProvider(): iterable public function testwithoutLabelFailsWithInvalidKey(): void { self::expectException(SyntaxError::class); - (new Domain('example.com'))->withoutLabel(-3); + Domain::fromIDNA2008('example.com')->withoutLabel(-3); } public function testwithoutLabelWorksWithMultipleKeys(): void { - self::assertNull((new Domain('www.example.com'))->withoutLabel(0, 1, 2)->value()); + self::assertNull(Domain::fromIDNA2008('www.example.com')->withoutLabel(0, 1, 2)->value()); } public function testConstructWithCustomIDNAOptions(): void { - $domain = new Domain('example.com', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); - self::assertSame( - [IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE], - [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()] - ); + $domain = Domain::fromIDNA2008('example.com'); + + self::assertTrue($domain->isIDNA2008()); } /** @@ -423,11 +418,7 @@ public function testResolveWorksWithCustomIDNAOptions( ?string $expectedUnicode, ?string $expectedWithLabel ): void { - $domain = new Domain( - $domainName, - IDNA_NONTRANSITIONAL_TO_ASCII, - IDNA_NONTRANSITIONAL_TO_UNICODE - ); + $domain = Domain::fromIDNA2008($domainName); self::assertSame($expectedContent, $domain->value()); self::assertSame($expectedAscii, $domain->toAscii()->value()); self::assertSame($expectedUnicode, $domain->toUnicode()->value()); @@ -472,65 +463,8 @@ public function resolveCustomIDNAOptionsProvider(): iterable ]; } - public function testInstanceCreationWithCustomIDNAOptions(): void + public function testWithIDNAOptions(): void { - $domain = new Domain( - 'example.com', - IDNA_NONTRANSITIONAL_TO_ASCII, - IDNA_NONTRANSITIONAL_TO_UNICODE - ); - - /** @var Domain $instance */ - $instance = $domain->toAscii(); - self::assertSame( - [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], - [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] - ); - - /** @var Domain $instance */ - $instance = $domain->toUnicode(); - self::assertSame( - [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], - [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] - ); - - $instance = $domain->withLabel(0, 'foo'); - self::assertSame( - [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], - [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] - ); - - $instance = $domain->withoutLabel(0); - self::assertSame( - [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], - [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] - ); - - $instance = $domain->append('bar'); - self::assertSame( - [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], - [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] - ); - - $instance = $domain->prepend('bar'); - self::assertSame( - [$domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()], - [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] - ); - } - - /** - * @covers ::getAsciiIDNAOption - * @covers ::getUnicodeIDNAOption - * @covers ::withValue - */ - public function testwithIDNAOptions(): void - { - $domain = new Domain('example.com', IDNA_DEFAULT, IDNA_DEFAULT); - - self::assertSame($domain, $domain->withValue('example.com', $domain->getAsciiIDNAOption())); - self::assertNotEquals($domain, $domain->withValue('example.com', IDNA_NONTRANSITIONAL_TO_ASCII)); - self::assertSame($domain, $domain->withValue('example.com', $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption())); - self::assertNotEquals($domain, $domain->withValue('example.com', $domain->getAsciiIDNAOption(), IDNA_NONTRANSITIONAL_TO_UNICODE)); + self::assertNotEquals(Domain::fromIDNA2003('example.com'), Domain::fromIDNA2008('example.com')); } } diff --git a/src/IDNConversion.php b/src/IDNConversion.php index 2901eb5a..87b17ca0 100644 --- a/src/IDNConversion.php +++ b/src/IDNConversion.php @@ -7,36 +7,12 @@ interface IDNConversion { /** - * Gets conversion options for idn_to_ascii. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php + * Tells whether IDNA Conversion is done using IDNA2008 algorithm. */ - public function getAsciiIDNAOption(): int; + public function isIDNA2008(): bool; /** - * Gets conversion options for idn_to_utf8. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php + * Tells whether the current domain is in its ascii form. */ - public function getUnicodeIDNAOption(): int; - - /** - * Sets the host value with its IDNA options. - * - * combination of IDNA_* constants (except IDNA_ERROR_* constants). - * - * @see https://www.php.net/manual/en/intl.constants.php - * - * This method MUST retain the state of the current instance, and return - * an instance with its content converted to its IDNA ASCII form - * - * @param ?string $value - * @throws CannotProcessHost if the domain can not be converted to ASCII using IDN UTS46 algorithm - * @return static - */ - public function withValue(?string $value, int $asciiIDNAOption, int $unicodIDNAOption): self; + public function isAscii(): bool; } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 1cd60a82..0be1d3f6 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -5,7 +5,6 @@ namespace Pdp; use function count; -use const IDNA_DEFAULT; final class PublicSuffix implements EffectiveTLD { @@ -47,11 +46,6 @@ public static function fromUnknown(DomainName $domain): self return new self($domain, ''); } - public static function fromNull(): self - { - return new self(Domain::fromNull(), ''); - } - public function getDomain(): DomainName { return $this->domain; @@ -77,16 +71,6 @@ public function toString(): string return $this->domain->toString(); } - public function getAsciiIDNAOption(): int - { - return $this->domain->getAsciiIDNAOption(); - } - - public function getUnicodeIDNAOption(): int - { - return $this->domain->getUnicodeIDNAOption(); - } - public function isKnown(): bool { return '' !== $this->section; @@ -118,13 +102,13 @@ public function toUnicode(): self return $clone; } - public function withValue(?string $domain, int $asciiIDNAOption = IDNA_DEFAULT, int $unicodeIDNAOption = IDNA_DEFAULT): self + public function isAscii(): bool { - $newDomain = $this->domain->withValue($domain, $asciiIDNAOption, $unicodeIDNAOption); - if ($newDomain == $this->domain) { - return $this; - } + return $this->domain->isAscii(); + } - return new self($newDomain, $this->section); + public function isIDNA2008(): bool + { + return $this->domain->isIDNA2008(); } } diff --git a/src/PublicSuffixTest.php b/src/PublicSuffixTest.php index c234d872..fa493b1b 100644 --- a/src/PublicSuffixTest.php +++ b/src/PublicSuffixTest.php @@ -7,8 +7,6 @@ use InvalidArgumentException; use PHPUnit\Framework\TestCase; use function json_encode; -use const IDNA_NONTRANSITIONAL_TO_ASCII; -use const IDNA_NONTRANSITIONAL_TO_UNICODE; /** * @coversDefaultClass \Pdp\PublicSuffix @@ -17,7 +15,7 @@ class PublicSuffixTest extends TestCase { public function testInternalPhpMethod(): void { - $domain = new Domain('ac.be'); + $domain = Domain::fromIDNA2008('ac.be'); $publicSuffix = PublicSuffix::fromICANN($domain); $generatePublicSuffix = eval('return '.var_export($publicSuffix, true).';'); self::assertEquals($publicSuffix, $generatePublicSuffix); @@ -27,7 +25,7 @@ public function testInternalPhpMethod(): void public function testPSToUnicodeWithUrlEncode(): void { - $domain = new Domain('b%C3%A9be'); + $domain = Domain::fromIDNA2008('b%C3%A9be'); self::assertSame('bébe', PublicSuffix::fromUnknown($domain)->toUnicode()->value()); } @@ -37,7 +35,7 @@ public function testPSToUnicodeWithUrlEncode(): void */ public function testSetSection(?string $publicSuffix, string $section, bool $isKnown, bool $isIcann, bool $isPrivate): void { - $domain = new Domain($publicSuffix); + $domain = Domain::fromIDNA2008($publicSuffix); if ('' === $section) { $ps = PublicSuffix::fromUnknown($domain); @@ -72,7 +70,7 @@ public function testConstructorThrowsException(string $publicSuffix): void { self::expectException(SyntaxError::class); - PublicSuffix::fromUnknown(new Domain($publicSuffix)); + PublicSuffix::fromUnknown(Domain::fromIDNA2008($publicSuffix)); } public function invalidPublicSuffixProvider(): iterable @@ -87,14 +85,14 @@ public function testPSToAsciiThrowsException(): void { self::expectException(SyntaxError::class); - PublicSuffix::fromUnknown(new Domain('a⒈com')); + PublicSuffix::fromUnknown(Domain::fromIDNA2008('a⒈com')); } public function testToUnicodeThrowsException(): void { self::expectException(SyntaxError::class); - PublicSuffix::fromUnknown(new Domain('xn--a-ecp.ru'))->toUnicode(); + PublicSuffix::fromUnknown(Domain::fromIDNA2008('xn--a-ecp.ru'))->toUnicode(); } /** @@ -103,7 +101,7 @@ public function testToUnicodeThrowsException(): void */ public function testConversionReturnsTheSameInstance(?string $publicSuffix): void { - $instance = PublicSuffix::fromUnknown(new Domain($publicSuffix)); + $instance = PublicSuffix::fromUnknown(Domain::fromIDNA2008($publicSuffix)); self::assertEquals($instance->toUnicode(), $instance); self::assertEquals($instance->toAscii(), $instance); @@ -119,7 +117,7 @@ public function conversionReturnsTheSameInstanceProvider(): iterable public function testToUnicodeReturnsSameInstance(): void { - $instance = PublicSuffix::fromUnknown(new Domain('食狮.公司.cn')); + $instance = PublicSuffix::fromUnknown(Domain::fromIDNA2008('食狮.公司.cn')); self::assertEquals($instance->toUnicode(), $instance); } @@ -130,7 +128,7 @@ public function testToUnicodeReturnsSameInstance(): void */ public function testCountable(?string $domain, int $nbLabels, array $labels): void { - $domain = PublicSuffix::fromUnknown(new Domain($domain)); + $domain = PublicSuffix::fromUnknown(Domain::fromIDNA2008($domain)); self::assertCount($nbLabels, $domain); } @@ -153,17 +151,12 @@ public function testResolveWithCustomIDNAOptions( string $expectedAscii, string $expectedUnicode ): void { - $domain = new Domain($name, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); + $domain = Domain::fromIDNA2008($name); $publicSuffix = PublicSuffix::fromUnknown($domain); + self::assertSame($expectedContent, $publicSuffix->value()); self::assertSame($expectedAscii, $publicSuffix->toAscii()->value()); self::assertSame($expectedUnicode, $publicSuffix->toUnicode()->value()); - /** @var PublicSuffix $instance */ - $instance = $publicSuffix->toUnicode(); - self::assertSame( - [$publicSuffix->getAsciiIDNAOption(), $publicSuffix->getUnicodeIDNAOption()], - [$instance->getAsciiIDNAOption(), $instance->getUnicodeIDNAOption()] - ); } public function customIDNAProvider(): iterable @@ -198,11 +191,9 @@ public function customIDNAProvider(): iterable public function testWithIDNAOptions(): void { - $publicSuffix = PublicSuffix::fromUnknown(new Domain('com')); - - self::assertSame($publicSuffix, $publicSuffix->withValue('com', $publicSuffix->getAsciiIDNAOption())); - self::assertNotEquals($publicSuffix, $publicSuffix->withValue('com', IDNA_NONTRANSITIONAL_TO_ASCII)); - self::assertSame($publicSuffix, $publicSuffix->withValue('com', $publicSuffix->getAsciiIDNAOption(), $publicSuffix->getUnicodeIDNAOption())); - self::assertNotEquals($publicSuffix, $publicSuffix->withValue('com', $publicSuffix->getAsciiIDNAOption(), IDNA_NONTRANSITIONAL_TO_UNICODE)); + self::assertNotEquals( + PublicSuffix::fromUnknown(Domain::fromIDNA2008('com')), + PublicSuffix::fromUnknown(Domain::fromIDNA2003('com')) + ); } } diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 324cefbb..c05de037 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -9,15 +9,12 @@ use function count; use function explode; use function implode; -use function preg_match; use function sprintf; use function strlen; use function substr; final class ResolvedDomain implements ResolvedDomainName { - private const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/'; - private DomainName $domain; private EffectiveTLD $publicSuffix; @@ -46,7 +43,7 @@ private function setDomainName(Host $domain): DomainName } if (!$domain instanceof DomainName) { - return new Domain($domain); + return Domain::fromIDNA2008($domain); } return $domain; @@ -60,7 +57,9 @@ private function setDomainName(Host $domain): DomainName private function setPublicSuffix(EffectiveTLD $publicSuffix = null): EffectiveTLD { if (null === $publicSuffix || null === $publicSuffix->value()) { - return PublicSuffix::fromNull(); + $domain = $this->domain->isIDNA2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); + + return PublicSuffix::fromUnknown($domain); } if (2 > count($this->domain)) { @@ -89,17 +88,24 @@ private function setPublicSuffix(EffectiveTLD $publicSuffix = null): EffectiveTL */ private function normalize(EffectiveTLD $subject): EffectiveTLD { - $subject = $subject->withValue( - $subject->value(), - $this->domain->getAsciiIDNAOption(), - $this->domain->getUnicodeIDNAOption() - ); - - if (1 !== preg_match(self::REGEXP_IDN_PATTERN, $this->domain->toString())) { - return $subject->toAscii(); + if ($subject->isIDNA2008() === $this->domain->isIDNA2008()) { + return $subject->isAscii() === $this->domain->isAscii() ? $subject : $subject->toUnicode(); + } + + $newDomain = Domain::fromIDNA2003($subject->toUnicode()->value()); + if ($this->domain->isAscii()) { + $newDomain = $newDomain->toAscii(); + } + + if ($subject->isPrivate()) { + return PublicSuffix::fromPrivate($newDomain); + } + + if ($subject->isICANN()) { + return PublicSuffix::fromICANN($newDomain); } - return $subject->toUnicode(); + return PublicSuffix::fromUnknown($newDomain); } /** @@ -108,7 +114,7 @@ private function normalize(EffectiveTLD $subject): EffectiveTLD private function setRegistrableDomain(): DomainName { if (null === $this->publicSuffix->value()) { - return Domain::fromNull($this->domain->getAsciiIDNAOption(), $this->domain->getUnicodeIDNAOption()); + return $this->domain->isIDNA2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); } $domain = implode('.', array_slice( @@ -116,7 +122,9 @@ private function setRegistrableDomain(): DomainName count($this->domain) - count($this->publicSuffix) - 1 )); - return new Domain($domain, $this->domain->getAsciiIDNAOption(), $this->domain->getUnicodeIDNAOption()); + $registrableDomain = $this->domain->isIDNA2008() ? Domain::fromIDNA2008($domain) : Domain::fromIDNA2003($domain); + + return $this->domain->isAscii() ? $registrableDomain->toAscii() : $registrableDomain->toUnicode(); } /** @@ -124,17 +132,14 @@ private function setRegistrableDomain(): DomainName */ private function setSubDomain(): DomainName { - $asciiIDNAOptions = $this->domain->getAsciiIDNAOption(); - $unicodeIDNAOptions = $this->domain->getUnicodeIDNAOption(); - if (null === $this->registrableDomain->value()) { - return Domain::fromNull($asciiIDNAOptions, $unicodeIDNAOptions); + return $this->domain->isIDNA2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); } $nbLabels = count($this->domain); $nbRegistrableLabels = count($this->publicSuffix) + 1; if ($nbLabels === $nbRegistrableLabels) { - return Domain::fromNull($asciiIDNAOptions, $unicodeIDNAOptions); + return $this->domain->isIDNA2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); } $domain = implode('.', array_slice( @@ -143,7 +148,9 @@ private function setSubDomain(): DomainName $nbLabels - $nbRegistrableLabels )); - return new Domain($domain, $asciiIDNAOptions, $unicodeIDNAOptions); + $subDomain = (!$this->domain->isIDNA2008()) ? Domain::fromIDNA2003($domain) : Domain::fromIDNA2008($domain); + + return $this->domain->isAscii() ? $subDomain->toAscii() : $subDomain->toUnicode(); } public function count(): int @@ -212,7 +219,8 @@ public function withPublicSuffix($publicSuffix): self } elseif ($publicSuffix instanceof DomainName) { $publicSuffix = PublicSuffix::fromUnknown($publicSuffix); } else { - $publicSuffix = PublicSuffix::fromUnknown(new Domain($publicSuffix)); + $domain = $this->domain->isIDNA2008() ? Domain::fromIDNA2008($publicSuffix) : Domain::fromIDNA2003($publicSuffix); + $publicSuffix = PublicSuffix::fromUnknown($domain); } } @@ -222,19 +230,15 @@ public function withPublicSuffix($publicSuffix): self } $host = implode('.', array_reverse(array_slice($this->domain->labels(), count($this->publicSuffix)))); + if (null === $publicSuffix->value()) { - return new self( - new Domain($host, $this->domain->getAsciiIDNAOption(), $this->domain->getUnicodeIDNAOption()), - null - ); + $domain = $this->domain->isIDNA2008() ? Domain::fromIDNA2008($host) : Domain::fromIDNA2003($host); + + return new self($domain, null); } - /** @var DomainName $domain */ - $domain = new Domain( - $host.'.'.$publicSuffix->value(), - $this->domain->getAsciiIDNAOption(), - $this->domain->getUnicodeIDNAOption() - ); + $host .= '.'.$publicSuffix->value(); + $domain = $this->domain->isIDNA2008() ? Domain::fromIDNA2008($host) : Domain::fromIDNA2003($host); return new self($domain, $publicSuffix); } @@ -249,35 +253,25 @@ public function withSubDomain($subDomain): self } if (!$subDomain instanceof DomainName) { - $subDomain = new Domain( - $subDomain, - $this->domain->getAsciiIDNAOption(), - $this->domain->getUnicodeIDNAOption() - ); + $subDomain = $this->domain->isIDNA2008() ? Domain::fromIDNA2008($subDomain) : Domain::fromIDNA2003($subDomain); } - $subDomain = $subDomain->withValue( - $subDomain->value(), - $this->domain->getAsciiIDNAOption(), - $this->domain->getUnicodeIDNAOption() - ); - + $subDomain = $this->domain->isIDNA2008() ? Domain::fromIDNA2008($subDomain) : Domain::fromIDNA2003($subDomain); if ($this->subDomain == $subDomain) { return $this; } /** @var DomainName $subDomain */ $subDomain = $subDomain->toAscii(); - if (1 === preg_match(self::REGEXP_IDN_PATTERN, $this->domain->toString())) { + if (!$this->domain->isAscii()) { /** @var DomainName $subDomain */ $subDomain = $subDomain->toUnicode(); } - return new self(new Domain( - $subDomain->toString().'.'.$this->registrableDomain->toString(), - $this->domain->getAsciiIDNAOption(), - $this->domain->getUnicodeIDNAOption() - ), $this->publicSuffix); + $newDomainValue = $subDomain->toString().'.'.$this->registrableDomain->toString(); + $newDomain = $this->domain->isIDNA2008() ? Domain::fromIDNA2008($newDomainValue) : Domain::fromIDNA2003($newDomainValue); + + return new self($newDomain, $this->publicSuffix); } public function withSecondLevelDomain($label): self @@ -295,10 +289,9 @@ public function withSecondLevelDomain($label): self return new self($newRegistrableDomain, $this->publicSuffix); } - return new self(new Domain( - $this->subDomain->value().'.'.$newRegistrableDomain->value(), - $this->domain->getAsciiIDNAOption(), - $this->domain->getUnicodeIDNAOption() - ), $this->publicSuffix); + $newDomainValue = $this->subDomain->value().'.'.$newRegistrableDomain->value(); + $newDomain = $this->domain->isIDNA2008() ? Domain::fromIDNA2008($newDomainValue) : Domain::fromIDNA2003($newDomainValue); + + return new self($newDomain, $this->publicSuffix); } } diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index c9103669..995285c6 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -7,8 +7,6 @@ use PHPUnit\Framework\TestCase; use TypeError; use function date_create; -use const IDNA_NONTRANSITIONAL_TO_ASCII; -use const IDNA_NONTRANSITIONAL_TO_UNICODE; /** * @coversDefaultClass \Pdp\ResolvedDomain @@ -17,7 +15,7 @@ class ResolvedDomainTest extends TestCase { public function testRegistrableDomainIsNullWithFoundDomain(): void { - $domain = new ResolvedDomain(new Domain('faketld')); + $domain = new ResolvedDomain(Domain::fromIDNA2003('faketld')); self::assertNull($domain->getPublicSuffix()->value()); self::assertNull($domain->getRegistrableDomain()->value()); self::assertNull($domain->getSubDomain()->value()); @@ -32,7 +30,7 @@ public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain(?stri { self::expectException(UnableToResolveDomain::class); - new ResolvedDomain(new Domain($domain), PublicSuffix::fromICANN(new Domain($publicSuffix))); + new ResolvedDomain(Domain::fromIDNA2003($domain), PublicSuffix::fromICANN(Domain::fromIDNA2003($publicSuffix))); } public function provideWrongConstructor(): iterable @@ -59,7 +57,7 @@ public function provideWrongConstructor(): iterable public function testDomainInternalPhpMethod(): void { - $domain = new ResolvedDomain(new Domain('www.ulb.ac.be'), PublicSuffix::fromICANN(new Domain('ac.be'))); + $domain = new ResolvedDomain(Domain::fromIDNA2003('www.ulb.ac.be'), PublicSuffix::fromICANN(Domain::fromIDNA2003('ac.be'))); $generateDomain = eval('return '.var_export($domain, true).';'); self::assertEquals($domain, $generateDomain); self::assertEquals('"www.ulb.ac.be"', json_encode($domain->jsonSerialize())); @@ -72,7 +70,7 @@ public function testDomainInternalPhpMethod(): void */ public function testCountable(?string $domain, int $nbLabels): void { - $domain = new Domain($domain); + $domain = Domain::fromIDNA2003($domain); self::assertCount($nbLabels, $domain); } @@ -103,9 +101,9 @@ public function testToIDN( ?string $expectedIDNDomain, ?string $expectedIDNSuffix ): void { - $objPublicSuffix = (null === $publicSuffix) ? PublicSuffix::fromNull() : PublicSuffix::fromICANN(new Domain($publicSuffix)); + $objPublicSuffix = (null === $publicSuffix) ? PublicSuffix::fromUnknown(Domain::fromIDNA2003(null)) : PublicSuffix::fromICANN(Domain::fromIDNA2003($publicSuffix)); - $domain = new ResolvedDomain(new Domain($domain), $objPublicSuffix); + $domain = new ResolvedDomain(Domain::fromIDNA2003($domain), $objPublicSuffix); self::assertSame($expectedDomain, $domain->value()); self::assertSame($expectedSuffix, $domain->getPublicSuffix()->value()); @@ -194,9 +192,9 @@ public function testToAscii( ?string $expectedAsciiDomain, ?string $expectedAsciiSuffix ): void { - $objPublicSuffix = (null === $publicSuffix) ? PublicSuffix::fromNull() : PublicSuffix::fromICANN(new Domain($publicSuffix)); + $objPublicSuffix = (null === $publicSuffix) ? PublicSuffix::fromUnknown(Domain::fromIDNA2003(null)) : PublicSuffix::fromICANN(Domain::fromIDNA2003($publicSuffix)); - $domain = new ResolvedDomain(new Domain($domain), $objPublicSuffix); + $domain = new ResolvedDomain(Domain::fromIDNA2003($domain), $objPublicSuffix); self::assertSame($expectedDomain, $domain->value()); self::assertSame($expectedSuffix, $domain->getPublicSuffix()->value()); @@ -271,27 +269,33 @@ public function withSubDomainWorksProvider(): iterable { return [ 'simple addition' => [ - 'domain' => new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANN(new Domain('com'))), + 'domain' => new ResolvedDomain( + Domain::fromIDNA2003('example.com'), + PublicSuffix::fromICANN(Domain::fromIDNA2003('com')) + ), 'subdomain' => 'www', 'expected' => 'www', ], 'simple addition IDN (1)' => [ - 'domain' => new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANN(new Domain('com'))), - 'subdomain' => new Domain('bébé'), + 'domain' => new ResolvedDomain( + Domain::fromIDNA2003('example.com'), + PublicSuffix::fromICANN(Domain::fromIDNA2003('com')) + ), + 'subdomain' => Domain::fromIDNA2003('bébé'), 'expected' => 'xn--bb-bjab', ], 'simple addition IDN (2)' => [ - 'domain' => new ResolvedDomain(new Domain('Яндекс.РФ'), PublicSuffix::fromICANN(new Domain('рф'))), + 'domain' => new ResolvedDomain(Domain::fromIDNA2003('Яндекс.РФ'), PublicSuffix::fromICANN(Domain::fromIDNA2003('рф'))), 'subdomain' => 'bébé', 'expected' => 'bébé', ], 'simple removal' => [ - 'domain' => new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANN(new Domain('com'))), + 'domain' => new ResolvedDomain(Domain::fromIDNA2003('example.com'), PublicSuffix::fromICANN(Domain::fromIDNA2003('com'))), 'subdomain' => null, 'expected' => null, ], 'simple removal IDN' => [ - 'domain' => new ResolvedDomain(new Domain('bébé.Яндекс.РФ'), PublicSuffix::fromICANN(new Domain('рф'))), + 'domain' => new ResolvedDomain(Domain::fromIDNA2003('bébé.Яндекс.РФ'), PublicSuffix::fromICANN(Domain::fromIDNA2003('рф'))), 'subdomain' => 'xn--bb-bjab', 'expected' => 'bébé', ], @@ -302,21 +306,21 @@ public function testWithSubDomainFailsWithNullDomain(): void { self::expectException(UnableToResolveDomain::class); - (new ResolvedDomain(new Domain(null)))->withSubDomain('www'); + (new ResolvedDomain(Domain::fromIDNA2008(null)))->withSubDomain('www'); } public function testWithSubDomainFailsWithOneLabelDomain(): void { self::expectException(UnableToResolveDomain::class); - (new ResolvedDomain(new Domain('localhost')))->withSubDomain('www'); + (new ResolvedDomain(Domain::fromIDNA2003('localhost')))->withSubDomain('www'); } public function testWithEmptySubdomain(): void { self::expectException(SyntaxError::class); - $domain = new ResolvedDomain(new Domain('www.example.com'), PublicSuffix::fromICANN(new Domain('com'))); + $domain = new ResolvedDomain(Domain::fromIDNA2003('www.example.com'), PublicSuffix::fromICANN(Domain::fromIDNA2003('com'))); $domain->withSubDomain(''); } @@ -324,7 +328,7 @@ public function testWithEmptySubdomain(): void public function testWithSubDomainFailsWithNonStringableObject(): void { self::expectException(TypeError::class); - $domain = new ResolvedDomain(new Domain('www.example.com'), PublicSuffix::fromICANN(new Domain('com'))); + $domain = new ResolvedDomain(Domain::fromIDNA2003('www.example.com'), PublicSuffix::fromICANN(Domain::fromIDNA2003('com'))); $domain->withSubDomain(date_create()); } @@ -333,7 +337,7 @@ public function testWithSubDomainWithoutPublicSuffixInfo(): void { self::expectException(UnableToResolveDomain::class); - (new ResolvedDomain(new Domain('www.example.com')))->withSubDomain('www'); + (new ResolvedDomain(Domain::fromIDNA2003('www.example.com')))->withSubDomain('www'); } /** @@ -361,7 +365,7 @@ public function testWithPublicSuffixWorks( public function withPublicSuffixWorksProvider(): iterable { - $base_domain = new ResolvedDomain(new Domain('example.com'), PublicSuffix::fromICANN(new Domain('com'))); + $base_domain = new ResolvedDomain(Domain::fromIDNA2003('example.com'), PublicSuffix::fromICANN(Domain::fromIDNA2003('com'))); return [ 'simple update (1)' => [ @@ -374,7 +378,7 @@ public function withPublicSuffixWorksProvider(): iterable ], 'simple update (2)' => [ 'domain' => $base_domain, - 'publicSuffix' => PublicSuffix::fromPrivate(new Domain('github.io')), + 'publicSuffix' => PublicSuffix::fromPrivate(Domain::fromIDNA2003('github.io')), 'expected' => 'github.io', 'isKnown' => true, 'isICANN' => false, @@ -382,7 +386,7 @@ public function withPublicSuffixWorksProvider(): iterable ], 'same public suffix but PSL info is changed' => [ 'domain' => $base_domain, - 'publicSuffix' => PublicSuffix::fromPrivate(new Domain('com')), + 'publicSuffix' => PublicSuffix::fromPrivate(Domain::fromIDNA2003('com')), 'expected' => 'com', 'isKnown' => true, 'isICANN' => false, @@ -390,7 +394,7 @@ public function withPublicSuffixWorksProvider(): iterable ], 'same public suffix but PSL info does not changed' => [ 'domain' => $base_domain, - 'publicSuffix' => PublicSuffix::fromICANN(new Domain('com')), + 'publicSuffix' => PublicSuffix::fromICANN(Domain::fromIDNA2003('com')), 'expected' => 'com', 'isKnown' => true, 'isICANN' => true, @@ -398,22 +402,22 @@ public function withPublicSuffixWorksProvider(): iterable ], 'simple update IDN (1)' => [ 'domain' => $base_domain, - 'publicSuffix' => PublicSuffix::fromICANN(new Domain('рф')), + 'publicSuffix' => PublicSuffix::fromICANN(Domain::fromIDNA2008('рф')), 'expected' => 'xn--p1ai', 'isKnown' => true, 'isICANN' => true, 'isPrivate' => false, ], 'simple update IDN (2)' => [ - 'domain' => new ResolvedDomain(new Domain('www.bébé.be'), PublicSuffix::fromICANN(new Domain('be'))), - 'publicSuffix' => PublicSuffix::fromICANN(new Domain('xn--p1ai')), + 'domain' => new ResolvedDomain(Domain::fromIDNA2003('www.bébé.be'), PublicSuffix::fromICANN(Domain::fromIDNA2003('be'))), + 'publicSuffix' => PublicSuffix::fromICANN(Domain::fromIDNA2003('xn--p1ai')), 'expected' => 'рф', 'isKnown' => true, 'isICANN' => true, 'isPrivate' => false, ], 'adding the public suffix to a single label domain' => [ - 'domain' => new ResolvedDomain(new Domain('localhost')), + 'domain' => new ResolvedDomain(Domain::fromIDNA2003('localhost')), 'publicSuffix' => 'www', 'expected' => 'www', 'isKnown' => false, @@ -421,7 +425,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'removing the public suffix list' => [ - 'domain' => new ResolvedDomain(new Domain('www.bébé.be'), PublicSuffix::fromICANN(new Domain('be'))), + 'domain' => new ResolvedDomain(Domain::fromIDNA2003('www.bébé.be'), PublicSuffix::fromICANN(Domain::fromIDNA2003('be'))), 'publicSuffix' => null, 'expected' => null, 'isKnown' => false, @@ -429,7 +433,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'with custom IDNA domain options' =>[ - 'domain' => new ResolvedDomain(new Domain('www.bébé.be', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE), PublicSuffix::fromICANN(new Domain('be'))), + 'domain' => new ResolvedDomain(Domain::fromIDNA2008('www.bébé.be'), PublicSuffix::fromICANN(Domain::fromIDNA2008('be'))), 'publicSuffix' => null, 'expected' => null, 'isKnown' => false, @@ -443,7 +447,7 @@ public function testWithPublicSuffixFailsWithNullDomain(): void { self::expectException(SyntaxError::class); - (new ResolvedDomain(new Domain()))->withPublicSuffix('www'); + (new ResolvedDomain(Domain::fromIDNA2008(null)))->withPublicSuffix('www'); } /** @@ -463,8 +467,8 @@ public function testResolveWorksWithCustomIDNAOptions( ?string $expectedRegistrable, ?string $expectedSubDomain ): void { - $host = new Domain($domainName, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); - $resolvedDomain = new ResolvedDomain($host, PublicSuffix::fromICANN(new Domain($publicSuffix))); + $host = Domain::fromIDNA2008($domainName); + $resolvedDomain = new ResolvedDomain($host, PublicSuffix::fromICANN(Domain::fromIDNA2008($publicSuffix))); self::assertSame($expectedContent, $resolvedDomain->value()); self::assertSame($expectedAscii, $resolvedDomain->toAscii()->value()); @@ -515,43 +519,6 @@ public function resolveCustomIDNAOptionsProvider(): iterable ]; } - public function testInstanceCreationWithCustomIDNAOptions(): void - { - $domain = new ResolvedDomain( - new Domain('example.com', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE), - PublicSuffix::fromICANN(new Domain('com')) - ); - - /** @var ResolvedDomain $instance */ - $instance = $domain->toAscii(); - self::assertSame( - [$domain->getDomain()->getAsciiIDNAOption(), $domain->getDomain()->getUnicodeIDNAOption()], - [$instance->getDomain()->getAsciiIDNAOption(), $instance->getDomain()->getUnicodeIDNAOption()] - ); - - /** @var ResolvedDomain $instance */ - $instance = $domain->toUnicode(); - - self::assertSame( - [$domain->getDomain()->getAsciiIDNAOption(), $domain->getDomain()->getUnicodeIDNAOption()], - [$instance->getDomain()->getAsciiIDNAOption(), $instance->getDomain()->getUnicodeIDNAOption()] - ); - - $instance = $domain->withPublicSuffix(PublicSuffix::fromICANN(new Domain('us'))); - - self::assertSame( - [$domain->getDomain()->getAsciiIDNAOption(), $domain->getDomain()->getUnicodeIDNAOption()], - [$instance->getDomain()->getAsciiIDNAOption(), $instance->getDomain()->getUnicodeIDNAOption()] - ); - - $instance = $domain->withSubDomain(new Domain('foo')); - - self::assertSame( - [$domain->getDomain()->getAsciiIDNAOption(), $domain->getDomain()->getUnicodeIDNAOption()], - [$instance->getDomain()->getAsciiIDNAOption(), $instance->getDomain()->getUnicodeIDNAOption()] - ); - } - /** * @dataProvider withSldWorksProvider * @param ?string $host @@ -567,7 +534,7 @@ public function testWithSecondLevelDomain( ?string $expectedSld, ?string $expectedHost ): void { - $domain = new ResolvedDomain(new Domain($host), PublicSuffix::fromICANN(new Domain($publicSuffix))); + $domain = new ResolvedDomain(Domain::fromIDNA2008($host), PublicSuffix::fromICANN(Domain::fromIDNA2008($publicSuffix))); $newDomain = $domain->withSecondLevelDomain($sld); self::assertSame($expectedSld, $newDomain->getSecondLevelDomain()); diff --git a/src/RootZoneDatabaseConverter.php b/src/RootZoneDatabaseConverter.php index b8527151..cca5b335 100644 --- a/src/RootZoneDatabaseConverter.php +++ b/src/RootZoneDatabaseConverter.php @@ -93,7 +93,7 @@ private function extractHeader(string $content): array private function extractRootZone(string $content): string { try { - $tld = PublicSuffix::fromUnknown(new Domain($content))->toAscii(); + $tld = PublicSuffix::fromUnknown(Domain::fromIDNA2008($content))->toAscii(); } catch (CannotProcessHost $exception) { throw UnableToLoadRootZoneDatabase::dueToInvalidRootZoneDomain($content, $exception); } diff --git a/src/Rules.php b/src/Rules.php index 42ec7310..383bcbfb 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -109,9 +109,9 @@ public function resolve($host): ResolvedDomainName return new ResolvedDomain($host); } - return new ResolvedDomain(new Domain($host)); + return new ResolvedDomain(Domain::fromIDNA2008($host)); } catch (SyntaxError $exception) { - return new ResolvedDomain(Domain::fromNull()); + return new ResolvedDomain(Domain::fromIDNA2008(null)); } } @@ -169,7 +169,7 @@ private function validateDomain($domain): DomainName } if (!($domain instanceof DomainName)) { - $domain = new Domain($domain); + $domain = Domain::fromIDNA2008($domain); } if ((2 > count($domain)) || ('.' === substr($domain->toString(), -1, 1))) { @@ -198,7 +198,8 @@ private function getPublicSuffix(DomainName $domain, string $section): Effective return $icann; } - $publicSuffix = new Domain($domain->toAscii()->label(0), $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()); + $topLabel = $domain->toAscii()->label(0); + $publicSuffix = $domain->isIDNA2008() ? Domain::fromIDNA2008($topLabel) : Domain::fromIDNA2003($topLabel); return PublicSuffix::fromUnknown($publicSuffix); } @@ -232,16 +233,14 @@ private function getPublicSuffixFromSection(DomainName $domain, string $section) } if ([] === $matches) { - $publicSuffix = new Domain($domain->toAscii()->label(0), $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()); + $topLabel = $domain->toAscii()->label(0); + $publicSuffix = $domain->isIDNA2008() ? Domain::fromIDNA2008($topLabel) : Domain::fromIDNA2003($topLabel); return PublicSuffix::fromUnknown($publicSuffix); } - $publicSuffix = new Domain( - implode('.', array_reverse($matches)), - $domain->getAsciiIDNAOption(), - $domain->getUnicodeIDNAOption() - ); + $publicSuffixLabels = implode('.', array_reverse($matches)); + $publicSuffix = $domain->isIDNA2008() ? Domain::fromIDNA2008($publicSuffixLabels) : Domain::fromIDNA2003($publicSuffixLabels); if (PublicSuffix::PRIVATE_DOMAINS === $section) { return PublicSuffix::fromPrivate($publicSuffix); diff --git a/src/RulesTest.php b/src/RulesTest.php index e71872e1..3e958bdf 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -10,9 +10,6 @@ use function dirname; use function file_get_contents; use function implode; -use const IDNA_DEFAULT; -use const IDNA_NONTRANSITIONAL_TO_ASCII; -use const IDNA_NONTRANSITIONAL_TO_UNICODE; /** * @coversDefaultClass \Pdp\Rules @@ -214,8 +211,8 @@ public function testResolvingICANNDomainInvalid(): void public function testWithDomainObject(): void { $domain = new ResolvedDomain( - new Domain('private.ulb.ac.be'), - PublicSuffix::fromICANN(new Domain('ac.be')) + Domain::fromIDNA2008('private.ulb.ac.be'), + PublicSuffix::fromICANN(Domain::fromIDNA2008('ac.be')) ); $newDomain = $this->rules->resolve($domain); @@ -230,7 +227,7 @@ public function testWithDomainObject(): void public function testWithDomainInterfaceObject(): void { - $domain = PublicSuffix::fromICANN(new Domain('ulb.ac.be')); + $domain = PublicSuffix::fromICANN(Domain::fromIDNA2008('ulb.ac.be')); self::assertSame( 'ac.be', @@ -572,7 +569,7 @@ public function testPublicSuffixSpec(): void $this->checkPublicSuffix('www.食狮.中国', '食狮.中国'); $this->checkPublicSuffix('shishi.中国', 'shishi.中国'); $this->checkPublicSuffix('中国', null); - $this->checkPublicSuffix('www.faß.de', 'fass.de'); + $this->checkPublicSuffix('www.faß.de', 'faß.de'); // changed to honour IDNA2008 by default not part of the standard test // Same as above, but punycoded. $this->checkPublicSuffix('xn--85x722f.com.cn', 'xn--85x722f.com.cn'); $this->checkPublicSuffix('xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn'); @@ -588,19 +585,15 @@ public function testPublicSuffixSpec(): void public function testResolveWithIDNAOptions(): void { $resolvedByDefault = $this->rules->resolve('foo.de'); - self::assertSame( - [IDNA_DEFAULT, IDNA_DEFAULT], - [$resolvedByDefault->getDomain()->getAsciiIDNAOption(), $resolvedByDefault->getDomain()->getUnicodeIDNAOption()] - ); + self::assertTrue($resolvedByDefault->getDomain()->isIDNA2008()); /** @var string $string */ $string = file_get_contents(dirname(__DIR__).'/test_data/public_suffix_list.dat'); $rules = Rules::fromString($string); - $domain = new Domain('foo.de', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); + $domain = Domain::fromIDNA2008('foo.de'); $resolved = $rules->resolve($domain); - self::assertSame(IDNA_NONTRANSITIONAL_TO_ASCII, $resolved->getDomain()->getAsciiIDNAOption()); - self::assertSame(IDNA_NONTRANSITIONAL_TO_UNICODE, $resolved->getDomain()->getUnicodeIDNAOption()); + self::assertTrue($resolved->getDomain()->isIDNA2008()); } /** diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index f0f5f1e9..a2de7387 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -120,7 +120,7 @@ public function isEmpty(): bool public function getIterator() { foreach ($this->records as $tld) { - yield PublicSuffix::fromUnknown((new Domain($tld))->toAscii()); + yield PublicSuffix::fromUnknown(Domain::fromIDNA2008($tld)->toAscii()); } } @@ -144,7 +144,7 @@ public function contains($tld): bool if (!$tld instanceof DomainName) { try { - $tld = new Domain($tld); + $tld = Domain::fromIDNA2008($tld); } catch (CannotProcessHost $exception) { return false; } @@ -176,7 +176,7 @@ public function resolve($domain): ResolvedDomainName } if (!$domain instanceof DomainName) { - $domain = new Domain($domain); + $domain = Domain::fromIDNA2008($domain); } if ((2 > count($domain)) || ('.' === substr($domain->toString(), -1, 1))) { @@ -186,12 +186,14 @@ public function resolve($domain): ResolvedDomainName $label = $domain->toAscii()->label(0); foreach ($this as $tld) { if ($tld->value() === $label) { - $publicSuffix = new Domain($tld, $domain->getAsciiIDNAOption(), $domain->getUnicodeIDNAOption()); + $publicSuffix = $domain->isIDNA2008() ? Domain::fromIDNA2008($tld) : Domain::fromIDNA2003($tld); return new ResolvedDomain($domain, PublicSuffix::fromUnknown($publicSuffix)); } } - return new ResolvedDomain($domain, PublicSuffix::fromNull()); + $publicSuffix = $domain->isIDNA2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); + + return new ResolvedDomain($domain, PublicSuffix::fromUnknown($publicSuffix)); } } diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 951c9014..ed412e74 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -11,9 +11,6 @@ use function dirname; use function file_get_contents; use function json_encode; -use const IDNA_DEFAULT; -use const IDNA_NONTRANSITIONAL_TO_ASCII; -use const IDNA_NONTRANSITIONAL_TO_UNICODE; /** * @coversDefaultClass \Pdp\TopLevelDomains @@ -133,7 +130,7 @@ public function testGetterProperties(): void public function testResolve($tld): void { self::assertSame( - (new Domain($tld))->label(0), + Domain::fromIDNA2008($tld)->label(0), $this->topLevelDomains->resolve($tld)->getPublicSuffix()->value() ); } @@ -141,8 +138,8 @@ public function testResolve($tld): void public function validDomainProvider(): iterable { $resolvedDomain = new ResolvedDomain( - new Domain('www.example.com'), - PublicSuffix::fromICANN(new Domain('com')) + Domain::fromIDNA2008('www.example.com'), + PublicSuffix::fromICANN(Domain::fromIDNA2008('com')) ); return [ @@ -196,21 +193,17 @@ public function testResolveWithIDNAOptions(): void { $resolved = $this->topLevelDomains->resolve('foo.de'); - self::assertSame( - [IDNA_DEFAULT, IDNA_DEFAULT], - [$resolved->getDomain()->getAsciiIDNAOption(), $resolved->getDomain()->getUnicodeIDNAOption()] - ); + self::assertTrue($resolved->getDomain()->isIDNA2008()); $collection = TopLevelDomains::fromPath( dirname(__DIR__).'/test_data/root_zones.dat', null ); - $domain = new Domain('foo.de', IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); + $domain = Domain::fromIDNA2003('foo.de'); $resolved = $collection->resolve($domain); - self::assertSame(IDNA_NONTRANSITIONAL_TO_ASCII, $resolved->getDomain()->getAsciiIDNAOption()); - self::assertSame(IDNA_NONTRANSITIONAL_TO_UNICODE, $resolved->getDomain()->getUnicodeIDNAOption()); + self::assertFalse($resolved->getDomain()->isIDNA2008()); } /** @@ -242,7 +235,7 @@ public function __toString(): string return 'COM'; } }], - 'externalDomain' => [PublicSuffix::fromICANN(new Domain('com'))], + 'externalDomain' => [PublicSuffix::fromICANN(Domain::fromIDNA2008('com'))], ]; } From 9e11fab1a42bb3f40d70e4cc6a0d6e842b905a7e Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 19 Nov 2020 22:35:30 +0100 Subject: [PATCH 301/461] Update upgrading documentation --- UPGRADING.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/UPGRADING.md b/UPGRADING.md index f0e08760..335037e5 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -36,10 +36,13 @@ The `Domain` **has access** to the domain parts and to the public suffix list st ~~~php /** @var ResolvedDomain $domain */ $domain = $rules->resolve('www.example.com'); -$domain->getDomain(); //returns a Domain object similar to v5 Domain object -$domain->getPublicSuffix(); //returns a Public Suffix object -$domain->getSubDomain(); //returns a Domain object -$domain->getRegistrableDomain(); //returns a Domain object +$domain->getDomain(); //returns a Domain object similar to v5 Domain object +$domain->getPublicSuffix(); //returns a Public Suffix object +$domain->getPublicSuffix()->isICANN(); //returns a boolean +$domain->getPublicSuffix()->isPrivate(); //returns a boolean +$domain->getPublicSuffix()->isKnown(); //returns a boolean +$domain->getSubDomain(); //returns a Domain object +$domain->getRegistrableDomain(); //returns a Domain object ~~~ The `Domain` **has no access** to the domain parts or the public suffix list state. @@ -104,11 +107,11 @@ $domain->value(); // can be a string or null - `Domain::isResolvable` is removed without replacement. - `Domain::resolve` is removed without replacement. - `Domain::isTransitionalDifferent` is removed without replacement. -- `Domain::withAsciiIDNAOption` is removed use `Domain::withValue`. -- `Domain::withUnicodeIDNAOption` is removed use `Domain::withValue`. +- `Domain::withAsciiIDNAOption` is removed without replacement. +- `Domain::withUnicodeIDNAOption` is removed without replacement. - `PublicSuffix::isTransitionalDifferent` is removed without replacement. -- `PublicSuffix::withAsciiIDNAOption` is removed use `PublicSuffix::withValue`. -- `PublicSuffix::withUnicodeIDNAOption` is removed use `PublicSuffix::withValue`. +- `PublicSuffix::withAsciiIDNAOption` is removed without replacement. +- `PublicSuffix::withUnicodeIDNAOption` is removed without replacement. - `PublicSuffix::createFromDomain` is removed without replacement. - `Rules::getPublicSuffix` is removed use `ResolvedDomain::getPublicSuffix` instead. - IDNA related methods from `Rules` and `TopLevelDomains` are removed. @@ -119,7 +122,7 @@ $domain->value(); // can be a string or null representation or `null` to allow better compatibility with URL components representation in other languages. -#### The Rules object instantiation +#### Objects instantiation - `Rules::__construct` - `TopLevelDomains::__construct` From 824ef2482a473b49015e9c8e8eef8bbab1bd3054 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Fri, 20 Nov 2020 12:34:30 +0100 Subject: [PATCH 302/461] Improve ResolvedDomain DX --- README.md | 38 ++++++++--------- UPGRADING.md | 16 ++++---- src/DomainNameParser.php | 2 +- src/ExternalDomainName.php | 2 +- src/PublicSuffix.php | 2 +- src/ResolvedDomain.php | 14 +++---- src/ResolvedDomainName.php | 20 +++++++-- src/ResolvedDomainTest.php | 34 +++++++-------- src/Rules.php | 2 +- src/RulesTest.php | 82 ++++++++++++++++++------------------- src/TopLevelDomains.php | 4 +- src/TopLevelDomainsTest.php | 8 ++-- 12 files changed, 118 insertions(+), 106 deletions(-) diff --git a/README.md b/README.md index c79ec229..4e45a08c 100644 --- a/README.md +++ b/README.md @@ -67,11 +67,11 @@ $rules = Rules::fromPath('/path/to/cache/public-suffix-list.dat'); $resolvedDomain = $rules->resolve('www.PreF.OkiNawA.jP'); echo $resolvedDomain->toString(); //display 'www.pref.okinawa.jp'; -echo $resolvedDomain->getSubDomain()->toString(); //display 'www'; -echo $resolvedDomain->getSecondLevelDomain(); //display 'pref'; -echo $resolvedDomain->getRegistrableDomain()->toString(); //display 'pref.okinawa.jp'; -echo $resolvedDomain->getPublicSuffix()->toString(); //display 'okinawa.jp'; -$resolvedDomain->getPublicSuffix()->isICANN(); //returns true; +echo $resolvedDomain->subDomain()->toString(); //display 'www'; +echo $resolvedDomain->secondLevelDomain(); //display 'pref'; +echo $resolvedDomain->registrableDomain()->toString(); //display 'pref.okinawa.jp'; +echo $resolvedDomain->publicSuffix()->toString(); //display 'okinawa.jp'; +$resolvedDomain->publicSuffix()->isICANN(); //returns true; ~~~ In case of an error an exception which implements the `Pdp\CannotProcessHost` @@ -92,10 +92,10 @@ $newResolvedDomain = $resolvedDomain ->withPublicSuffix('example'); echo $resolvedDomain->toString(); //display 'shop.example.com'; -$resolvedDomain->getPublicSuffix()->isKnown(); //returns true; +$resolvedDomain->publicSuffix()->isKnown(); //returns true; echo $newResolvedDomain->toString(); //display 'foo.bar.test.example'; -$newResolvedDomain->getPublicSuffix()->isKnown(); //returns false; +$newResolvedDomain->publicSuffix()->isKnown(); //returns false; ~~~ The public suffix method `isKnown` will always return `false` if @@ -115,7 +115,7 @@ use Pdp\Rules; $rules = Rules::fromPath('/path/to/cache/public-suffix-list.dat'); -$publicSuffix = $rules->resolve('example.github.io')->getPublicSuffix(); +$publicSuffix = $rules->resolve('example.github.io')->publicSuffix(); echo $publicSuffix->toString(); // display 'github.io'; $publicSuffix->isICANN(); // will return false @@ -176,10 +176,10 @@ $iana = TopLevelDomains::fromPath('/path/to/cache/tlds-alpha-by-domain.txt'); $resolvedDomain = $iana->resolve('www.PreF.OkiNawA.jP'); echo $resolvedDomain->toString(); //display 'www.pref.okinawa.jp'; -echo $resolvedDomain->getPublicSuffix()->toString(); //display 'jp'; -echo $resolvedDomain->getSecondLevelDomain(); //display 'okinawa'; -echo $resolvedDomain->getRegistrableDomain()->toString(); //display 'okinawa.jp'; -echo $resolvedDomain->getSubDomain()->toString(); //display 'www.pref'; +echo $resolvedDomain->publicSuffix()->toString(); //display 'jp'; +echo $resolvedDomain->secondLevelDomain(); //display 'okinawa'; +echo $resolvedDomain->registrableDomain()->toString(); //display 'okinawa.jp'; +echo $resolvedDomain->subDomain()->toString(); //display 'www.pref'; ~~~ In case of an error an exception which extends `Pdp\CannotProcessHost` is thrown. @@ -218,7 +218,7 @@ Domain objects usage are explain in the next section. resolve('www.bbc.co.uk'); -$domain = $resolvedDomain->getDomain(); +$domain = $resolvedDomain->domain(); echo $domain->toString(); // display 'www.bbc.co.uk' count($domain); // returns 4 $domain->labels(); // returns ['uk', 'co', 'bbc', 'www']; @@ -233,7 +233,7 @@ foreach ($domain as $label) { // bbc // www -$publicSuffixDomain = $resolvedDomain->getPublicSuffix()->getDomain(); +$publicSuffixDomain = $resolvedDomain->publicSuffix()->domain(); $publicSuffixDomain->labels(); // returns ['uk', 'co'] ~~~ @@ -245,7 +245,7 @@ following methods: /** @var Rules $rules */ $resolvedDomain = $rules->resolve('www.ExAmpLE.cOM'); -$domain = $resolvedDomain->getDomain(); +$domain = $resolvedDomain->domain(); $newDomain = $domain ->withLabel(1, 'com') //replace 'example' by 'com' @@ -260,8 +260,8 @@ echo $newDomain->toString(); // display 'docs.example.com.www' The following methods from the `ResolvedDomain` object will **also** return an `Domain` object: -- `ResolvedDomain::getRegistrableDomain` -- `ResolvedDomain::getSubDomain` +- `ResolvedDomain::registrableDomain` +- `ResolvedDomain::subDomain` **WARNING: Because of its definition, a domain name can be `null` or a string.** @@ -294,11 +294,11 @@ By default, resolver will use the IDNA2008 format to convert the submitted strin /** @var Rules $rules */ $unicodeDomain = $rules->resolve(Domain::fromIDNA2008('bébé.be')); echo $unicodeDomain->toString(); // returns 'bébé.be' -$unicodeDomain->getSecondLevelDomain(); // returns 'bébé' +$unicodeDomain->secondLevelDomain(); // returns 'bébé' $asciiDomain = $rules->resolve(Domain::fromIDNA2008('xn--bb-bjab.be')); $asciiDomain->toString(); // returns 'xn--bb-bjab.be' -$asciiDomain->getSecondLevelDomain(); // returns 'xn--bb-bjab' +$asciiDomain->secondLevelDomain(); // returns 'xn--bb-bjab' $asciiDomain->toUnicode()->toString() === $unicodeDomain->toString(); //returns true ~~~ diff --git a/UPGRADING.md b/UPGRADING.md index 335037e5..8be0d4b7 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -35,14 +35,14 @@ The `Domain` **has access** to the domain parts and to the public suffix list st **version 6** ~~~php /** @var ResolvedDomain $domain */ -$domain = $rules->resolve('www.example.com'); -$domain->getDomain(); //returns a Domain object similar to v5 Domain object -$domain->getPublicSuffix(); //returns a Public Suffix object -$domain->getPublicSuffix()->isICANN(); //returns a boolean -$domain->getPublicSuffix()->isPrivate(); //returns a boolean -$domain->getPublicSuffix()->isKnown(); //returns a boolean -$domain->getSubDomain(); //returns a Domain object -$domain->getRegistrableDomain(); //returns a Domain object +$result = $rules->resolve('www.example.com'); +$result->domain(); //returns a Domain object similar to v5 Domain object +$result->publicSuffix(); //returns a Public Suffix object +$result->publicSuffix()->isICANN(); //returns a boolean +$result->publicSuffix()->isPrivate(); //returns a boolean +$result->publicSuffix()->isKnown(); //returns a boolean +$result->subDomain(); //returns a Domain object +$result->registrableDomain(); //returns a Domain object ~~~ The `Domain` **has no access** to the domain parts or the public suffix list state. diff --git a/src/DomainNameParser.php b/src/DomainNameParser.php index c9c83c8e..a2e0c6cf 100644 --- a/src/DomainNameParser.php +++ b/src/DomainNameParser.php @@ -163,7 +163,7 @@ final protected function idnToUnicode(string $domain, int $option = IDNA_DEFAULT final protected function parse($domain, int $asciiOption, int $unicodeOption): array { if ($domain instanceof ExternalDomainName) { - $domain = $domain->getDomain()->value(); + $domain = $domain->domain()->value(); } if ($domain instanceof Host) { diff --git a/src/ExternalDomainName.php b/src/ExternalDomainName.php index 08cff34e..0f5a65f0 100644 --- a/src/ExternalDomainName.php +++ b/src/ExternalDomainName.php @@ -6,5 +6,5 @@ interface ExternalDomainName { - public function getDomain(): DomainName; + public function domain(): DomainName; } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 0be1d3f6..4bb6e79b 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -46,7 +46,7 @@ public static function fromUnknown(DomainName $domain): self return new self($domain, ''); } - public function getDomain(): DomainName + public function domain(): DomainName { return $this->domain; } diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index c05de037..e08dae2d 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -39,7 +39,7 @@ public static function __set_state(array $properties): self private function setDomainName(Host $domain): DomainName { if ($domain instanceof ExternalDomainName) { - return $domain->getDomain(); + return $domain->domain(); } if (!$domain instanceof DomainName) { @@ -158,7 +158,7 @@ public function count(): int return count($this->domain); } - public function getDomain(): DomainName + public function domain(): DomainName { return $this->domain; } @@ -178,22 +178,22 @@ public function toString(): string return $this->domain->toString(); } - public function getRegistrableDomain(): ResolvedDomain + public function registrableDomain(): ResolvedDomain { return new self($this->registrableDomain, $this->publicSuffix); } - public function getSecondLevelDomain(): ?string + public function secondLevelDomain(): ?string { return $this->registrableDomain->label(-1); } - public function getSubDomain(): DomainName + public function subDomain(): DomainName { return $this->subDomain; } - public function getPublicSuffix(): EffectiveTLD + public function publicSuffix(): EffectiveTLD { return $this->publicSuffix; } @@ -215,7 +215,7 @@ public function withPublicSuffix($publicSuffix): self { if (!$publicSuffix instanceof EffectiveTLD) { if ($publicSuffix instanceof ExternalDomainName) { - $publicSuffix = PublicSuffix::fromUnknown($publicSuffix->getDomain()); + $publicSuffix = PublicSuffix::fromUnknown($publicSuffix->domain()); } elseif ($publicSuffix instanceof DomainName) { $publicSuffix = PublicSuffix::fromUnknown($publicSuffix); } else { diff --git a/src/ResolvedDomainName.php b/src/ResolvedDomainName.php index 4e9aab97..a63fef8d 100644 --- a/src/ResolvedDomainName.php +++ b/src/ResolvedDomainName.php @@ -6,13 +6,25 @@ interface ResolvedDomainName extends Host, ExternalDomainName { - public function getPublicSuffix(): EffectiveTLD; + /** + * Returns the domain effective tld component. + */ + public function publicSuffix(): EffectiveTLD; - public function getSecondLevelDomain(): ?string; + /** + * Returns the second level domain component. + */ + public function secondLevelDomain(): ?string; - public function getRegistrableDomain(): self; + /** + * Returns the registrable domain component. + */ + public function registrableDomain(): self; - public function getSubDomain(): DomainName; + /** + * Returns the sub domain component. + */ + public function subDomain(): DomainName; /** * Returns an instance with the specified sub domain added. diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 995285c6..d967b72c 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -16,10 +16,10 @@ class ResolvedDomainTest extends TestCase public function testRegistrableDomainIsNullWithFoundDomain(): void { $domain = new ResolvedDomain(Domain::fromIDNA2003('faketld')); - self::assertNull($domain->getPublicSuffix()->value()); - self::assertNull($domain->getRegistrableDomain()->value()); - self::assertNull($domain->getSubDomain()->value()); - self::assertNull($domain->getSecondLevelDomain()); + self::assertNull($domain->publicSuffix()->value()); + self::assertNull($domain->registrableDomain()->value()); + self::assertNull($domain->subDomain()->value()); + self::assertNull($domain->secondLevelDomain()); } /** @@ -105,12 +105,12 @@ public function testToIDN( $domain = new ResolvedDomain(Domain::fromIDNA2003($domain), $objPublicSuffix); self::assertSame($expectedDomain, $domain->value()); - self::assertSame($expectedSuffix, $domain->getPublicSuffix()->value()); + self::assertSame($expectedSuffix, $domain->publicSuffix()->value()); /** @var ResolvedDomain $domainIDN */ $domainIDN = $domain->toUnicode(); self::assertSame($expectedIDNDomain, $domainIDN->value()); - self::assertSame($expectedIDNSuffix, $domainIDN->getPublicSuffix()->value()); + self::assertSame($expectedIDNSuffix, $domainIDN->publicSuffix()->value()); } public function toUnicodeProvider(): iterable @@ -196,12 +196,12 @@ public function testToAscii( $domain = new ResolvedDomain(Domain::fromIDNA2003($domain), $objPublicSuffix); self::assertSame($expectedDomain, $domain->value()); - self::assertSame($expectedSuffix, $domain->getPublicSuffix()->value()); + self::assertSame($expectedSuffix, $domain->publicSuffix()->value()); /** @var ResolvedDomain $domainIDN */ $domainIDN = $domain->toAscii(); self::assertSame($expectedAsciiDomain, $domainIDN->value()); - self::assertSame($expectedAsciiSuffix, $domainIDN->getPublicSuffix()->value()); + self::assertSame($expectedAsciiSuffix, $domainIDN->publicSuffix()->value()); } public function toAsciiProvider(): iterable @@ -260,9 +260,9 @@ public function testWithSubDomainWorks(ResolvedDomain $domain, $subdomain, ?stri { $result = $domain->withSubDomain($subdomain); - self::assertSame($expected, $result->getSubDomain()->value()); - self::assertEquals($domain->getPublicSuffix(), $result->getPublicSuffix()); - self::assertEquals($domain->getRegistrableDomain(), $result->getRegistrableDomain()); + self::assertSame($expected, $result->subDomain()->value()); + self::assertEquals($domain->publicSuffix(), $result->publicSuffix()); + self::assertEquals($domain->registrableDomain(), $result->registrableDomain()); } public function withSubDomainWorksProvider(): iterable @@ -355,7 +355,7 @@ public function testWithPublicSuffixWorks( bool $isPrivate ): void { $result = $domain->withPublicSuffix($publicSuffix); - $newPublicSuffix = $result->getPublicSuffix(); + $newPublicSuffix = $result->publicSuffix(); self::assertSame($expected, $newPublicSuffix->value()); self::assertSame($isKnown, $newPublicSuffix->isKnown()); @@ -473,8 +473,8 @@ public function testResolveWorksWithCustomIDNAOptions( self::assertSame($expectedContent, $resolvedDomain->value()); self::assertSame($expectedAscii, $resolvedDomain->toAscii()->value()); self::assertSame($expectedUnicode, $resolvedDomain->toUnicode()->value()); - self::assertSame($expectedRegistrable, $resolvedDomain->getRegistrableDomain()->value()); - self::assertSame($expectedSubDomain, $resolvedDomain->getSubDomain()->value()); + self::assertSame($expectedRegistrable, $resolvedDomain->registrableDomain()->value()); + self::assertSame($expectedSubDomain, $resolvedDomain->subDomain()->value()); } public function resolveCustomIDNAOptionsProvider(): iterable @@ -537,10 +537,10 @@ public function testWithSecondLevelDomain( $domain = new ResolvedDomain(Domain::fromIDNA2008($host), PublicSuffix::fromICANN(Domain::fromIDNA2008($publicSuffix))); $newDomain = $domain->withSecondLevelDomain($sld); - self::assertSame($expectedSld, $newDomain->getSecondLevelDomain()); + self::assertSame($expectedSld, $newDomain->secondLevelDomain()); self::assertEquals($expectedHost, $newDomain->value()); - self::assertEquals($domain->getPublicSuffix(), $newDomain->getPublicSuffix()); - self::assertEquals($domain->getSubDomain(), $newDomain->getSubDomain()); + self::assertEquals($domain->publicSuffix(), $newDomain->publicSuffix()); + self::assertEquals($domain->subDomain(), $newDomain->subDomain()); } public function withSldWorksProvider(): iterable diff --git a/src/Rules.php b/src/Rules.php index 383bcbfb..06bd147c 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -165,7 +165,7 @@ public function getPrivateDomain($host): ResolvedDomainName private function validateDomain($domain): DomainName { if ($domain instanceof ExternalDomainName) { - $domain = $domain->getDomain(); + $domain = $domain->domain(); } if (!($domain instanceof DomainName)) { diff --git a/src/RulesTest.php b/src/RulesTest.php index 3e958bdf..4a6bdb18 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -94,7 +94,7 @@ public function testNullWillReturnNullDomain(): void { $domain = $this->rules->resolve('COM'); - self::assertFalse($domain->getPublicSuffix()->isKnown()); + self::assertFalse($domain->publicSuffix()->isKnown()); } public function testThrowsTypeErrorOnWrongInput(): void @@ -108,34 +108,34 @@ public function testIsSuffixValidFalse(): void { $domain = $this->rules->resolve('www.example.faketld'); - self::assertFalse($domain->getPublicSuffix()->isKnown()); + self::assertFalse($domain->publicSuffix()->isKnown()); } public function testIsSuffixValidTrue(): void { $domain = $this->rules->resolve('www.example.com'); - self::assertTrue($domain->getPublicSuffix()->isKnown()); - self::assertTrue($domain->getPublicSuffix()->isICANN()); - self::assertFalse($domain->getPublicSuffix()->isPrivate()); + self::assertTrue($domain->publicSuffix()->isKnown()); + self::assertTrue($domain->publicSuffix()->isICANN()); + self::assertFalse($domain->publicSuffix()->isPrivate()); } public function testIsSuffixValidFalseWithPunycoded(): void { $domain = $this->rules->resolve('www.example.xn--85x722f'); - self::assertFalse($domain->getPublicSuffix()->isKnown()); - self::assertFalse($domain->getPublicSuffix()->isICANN()); - self::assertFalse($domain->getPublicSuffix()->isPrivate()); + self::assertFalse($domain->publicSuffix()->isKnown()); + self::assertFalse($domain->publicSuffix()->isICANN()); + self::assertFalse($domain->publicSuffix()->isPrivate()); } public function testSubDomainIsNull(): void { $domain = $this->rules->resolve('ulb.ac.be'); - self::assertTrue($domain->getPublicSuffix()->isKnown()); - self::assertTrue($domain->getPublicSuffix()->isICANN()); - self::assertFalse($domain->getPublicSuffix()->isPrivate()); + self::assertTrue($domain->publicSuffix()->isKnown()); + self::assertTrue($domain->publicSuffix()->isICANN()); + self::assertFalse($domain->publicSuffix()->isPrivate()); } public function testWithExceptionName(): void @@ -149,10 +149,10 @@ public function testWithPrivateDomain(): void { $domain = $this->rules->resolve('thephpleague.github.io'); - self::assertTrue($domain->getPublicSuffix()->isKnown()); - self::assertFalse($domain->getPublicSuffix()->isICANN()); - self::assertTrue($domain->getPublicSuffix()->isPrivate()); - self::assertSame('github.io', $domain->getPublicSuffix()->value()); + self::assertTrue($domain->publicSuffix()->isKnown()); + self::assertFalse($domain->publicSuffix()->isICANN()); + self::assertTrue($domain->publicSuffix()->isPrivate()); + self::assertSame('github.io', $domain->publicSuffix()->value()); } public function testWithAbsoluteHostInvalid(): void @@ -160,10 +160,10 @@ public function testWithAbsoluteHostInvalid(): void $domain = $this->rules->resolve('private.ulb.ac.be.'); self::assertSame('private.ulb.ac.be.', $domain->value()); - self::assertFalse($domain->getPublicSuffix()->isKnown()); - self::assertFalse($domain->getPublicSuffix()->isICANN()); - self::assertFalse($domain->getPublicSuffix()->isPrivate()); - self::assertNull($domain->getPublicSuffix()->value()); + self::assertFalse($domain->publicSuffix()->isKnown()); + self::assertFalse($domain->publicSuffix()->isICANN()); + self::assertFalse($domain->publicSuffix()->isPrivate()); + self::assertNull($domain->publicSuffix()->value()); } public function testWithICANNDomainInvalid(): void @@ -191,10 +191,10 @@ public function testWithPrivateDomainValid(): void $domain = $this->rules->getPrivateDomain('thephpleague.github.io'); self::assertSame('thephpleague.github.io', $domain->value()); - self::assertTrue($domain->getPublicSuffix()->isKnown()); - self::assertFalse($domain->getPublicSuffix()->isICANN()); - self::assertTrue($domain->getPublicSuffix()->isPrivate()); - self::assertSame('github.io', $domain->getPublicSuffix()->value()); + self::assertTrue($domain->publicSuffix()->isKnown()); + self::assertFalse($domain->publicSuffix()->isICANN()); + self::assertTrue($domain->publicSuffix()->isPrivate()); + self::assertSame('github.io', $domain->publicSuffix()->value()); } public function testResolvingICANNDomainInvalid(): void @@ -202,10 +202,10 @@ public function testResolvingICANNDomainInvalid(): void $domain = $this->rules->resolve('private.ulb.ac.be'); self::assertSame('private.ulb.ac.be', $domain->value()); - self::assertTrue($domain->getPublicSuffix()->isKnown()); - self::assertTrue($domain->getPublicSuffix()->isICANN()); - self::assertFalse($domain->getPublicSuffix()->isPrivate()); - self::assertSame('ac.be', $domain->getPublicSuffix()->value()); + self::assertTrue($domain->publicSuffix()->isKnown()); + self::assertTrue($domain->publicSuffix()->isICANN()); + self::assertFalse($domain->publicSuffix()->isPrivate()); + self::assertSame('ac.be', $domain->publicSuffix()->value()); } public function testWithDomainObject(): void @@ -218,10 +218,10 @@ public function testWithDomainObject(): void $newDomain = $this->rules->resolve($domain); self::assertSame('private.ulb.ac.be', $domain->value()); - self::assertTrue($domain->getPublicSuffix()->isKnown()); - self::assertTrue($domain->getPublicSuffix()->isICANN()); - self::assertFalse($domain->getPublicSuffix()->isPrivate()); - self::assertSame('ac.be', $domain->getPublicSuffix()->value()); + self::assertTrue($domain->publicSuffix()->isKnown()); + self::assertTrue($domain->publicSuffix()->isICANN()); + self::assertFalse($domain->publicSuffix()->isPrivate()); + self::assertSame('ac.be', $domain->publicSuffix()->value()); self::assertEquals($domain, $newDomain); } @@ -231,7 +231,7 @@ public function testWithDomainInterfaceObject(): void self::assertSame( 'ac.be', - $this->rules->getCookieDomain($domain)->getPublicSuffix()->value() + $this->rules->getCookieDomain($domain)->publicSuffix()->value() ); } @@ -243,7 +243,7 @@ public function testWithDomainInterfaceObject(): void */ public function testGetRegistrableDomain(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { - $foundRegistrableDomain = $this->rules->resolve($domain)->getRegistrableDomain(); + $foundRegistrableDomain = $this->rules->resolve($domain)->registrableDomain(); self::assertSame($registrableDomain, $foundRegistrableDomain->value()); } @@ -256,7 +256,7 @@ public function testGetRegistrableDomain(?string $publicSuffix, ?string $registr */ public function testGetPublicSuffix(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { - $effectiveTLD = $this->rules->resolve($domain)->getPublicSuffix(); + $effectiveTLD = $this->rules->resolve($domain)->publicSuffix(); self::assertSame($publicSuffix, $effectiveTLD->value()); } @@ -433,7 +433,7 @@ public function invalidHostParseProvider(): iterable */ public function testPublicSuffixSection(?string $domain, ?string $expected): void { - $publicSuffix = $this->rules->getCookieDomain($domain)->getPublicSuffix(); + $publicSuffix = $this->rules->getCookieDomain($domain)->publicSuffix(); self::assertSame($expected, $publicSuffix->value()); } @@ -469,7 +469,7 @@ public function validPublicSectionProvider(): iterable */ public function checkPublicSuffix(?string $input, ?string $expected): void { - self::assertSame($expected, $this->rules->resolve($input)->getRegistrableDomain()->value()); + self::assertSame($expected, $this->rules->resolve($input)->registrableDomain()->value()); } /** @@ -585,7 +585,7 @@ public function testPublicSuffixSpec(): void public function testResolveWithIDNAOptions(): void { $resolvedByDefault = $this->rules->resolve('foo.de'); - self::assertTrue($resolvedByDefault->getDomain()->isIDNA2008()); + self::assertTrue($resolvedByDefault->domain()->isIDNA2008()); /** @var string $string */ $string = file_get_contents(dirname(__DIR__).'/test_data/public_suffix_list.dat'); @@ -593,7 +593,7 @@ public function testResolveWithIDNAOptions(): void $domain = Domain::fromIDNA2008('foo.de'); $resolved = $rules->resolve($domain); - self::assertTrue($resolved->getDomain()->isIDNA2008()); + self::assertTrue($resolved->domain()->isIDNA2008()); } /** @@ -601,9 +601,9 @@ public function testResolveWithIDNAOptions(): void */ public function testEffectiveTLDResolution(string $host, string $cookieETLD, string $icannETLD, string $privateETLD): void { - self::assertSame($cookieETLD, $this->rules->getCookieDomain($host)->getPublicSuffix()->toString()); - self::assertSame($icannETLD, $this->rules->getICANNDomain($host)->getPublicSuffix()->toString()); - self::assertSame($privateETLD, $this->rules->getPrivateDomain($host)->getPublicSuffix()->toString()); + self::assertSame($cookieETLD, $this->rules->getCookieDomain($host)->publicSuffix()->toString()); + self::assertSame($icannETLD, $this->rules->getICANNDomain($host)->publicSuffix()->toString()); + self::assertSame($privateETLD, $this->rules->getPrivateDomain($host)->publicSuffix()->toString()); } public function effectiveTLDProvider(): iterable diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index a2de7387..a24124c1 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -139,7 +139,7 @@ public function jsonSerialize(): array public function contains($tld): bool { if ($tld instanceof ExternalDomainName) { - $tld = $tld->getDomain(); + $tld = $tld->domain(); } if (!$tld instanceof DomainName) { @@ -172,7 +172,7 @@ public function contains($tld): bool public function resolve($domain): ResolvedDomainName { if ($domain instanceof ExternalDomainName) { - $domain = $domain->getDomain(); + $domain = $domain->domain(); } if (!$domain instanceof DomainName) { diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index ed412e74..f3acbaa7 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -131,7 +131,7 @@ public function testResolve($tld): void { self::assertSame( Domain::fromIDNA2008($tld)->label(0), - $this->topLevelDomains->resolve($tld)->getPublicSuffix()->value() + $this->topLevelDomains->resolve($tld)->publicSuffix()->value() ); } @@ -186,14 +186,14 @@ public function testResolveWithUnregisteredTLD(): void { $collection = TopLevelDomains::fromPath(dirname(__DIR__).'/test_data/root_zones.dat'); - self::assertNull($collection->resolve('localhost.locale')->getPublicSuffix()->value()); + self::assertNull($collection->resolve('localhost.locale')->publicSuffix()->value()); } public function testResolveWithIDNAOptions(): void { $resolved = $this->topLevelDomains->resolve('foo.de'); - self::assertTrue($resolved->getDomain()->isIDNA2008()); + self::assertTrue($resolved->domain()->isIDNA2008()); $collection = TopLevelDomains::fromPath( dirname(__DIR__).'/test_data/root_zones.dat', @@ -203,7 +203,7 @@ public function testResolveWithIDNAOptions(): void $domain = Domain::fromIDNA2003('foo.de'); $resolved = $collection->resolve($domain); - self::assertFalse($resolved->getDomain()->isIDNA2008()); + self::assertFalse($resolved->domain()->isIDNA2008()); } /** From bf8512d42991c9b374fb623fc860531e6fd418c6 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Fri, 20 Nov 2020 22:10:02 +0100 Subject: [PATCH 303/461] Decouple Idna conversion --- README.md | 60 ++++---- src/Domain.php | 110 +++++++++++++-- src/DomainName.php | 12 +- src/DomainNameParser.php | 227 ------------------------------ src/DomainTest.php | 2 +- src/EffectiveTLD.php | 2 +- src/IDNConversion.php | 18 --- src/IntlIdna.php | 140 ++++++++++++++++++ src/PublicSuffix.php | 10 -- src/PublicSuffixListConverter.php | 4 +- src/ResolvedDomain.php | 30 ++-- src/Rules.php | 6 +- src/RulesTest.php | 12 +- src/TopLevelDomains.php | 4 +- src/TopLevelDomainsTest.php | 4 +- 15 files changed, 313 insertions(+), 328 deletions(-) delete mode 100644 src/DomainNameParser.php delete mode 100644 src/IDNConversion.php create mode 100644 src/IntlIdna.php diff --git a/README.md b/README.md index 4e45a08c..792c580f 100644 --- a/README.md +++ b/README.md @@ -51,9 +51,6 @@ resolve a domain against: - The [Public Suffix List](http://publicsuffix.org/) - The [IANA Root Zone Database](https://data.iana.org/TLD/tlds-alpha-by-domain.txt) -**WARNING: all objects are immutable, modifying the underlying object will not -affect the parent object.** - #### Resolving the Domain against the Public Suffix List Using the `Pdp\Rules` class you can resolve a domain as a `Pdp\ResolvedDomain` @@ -66,7 +63,7 @@ use Pdp\Rules; $rules = Rules::fromPath('/path/to/cache/public-suffix-list.dat'); $resolvedDomain = $rules->resolve('www.PreF.OkiNawA.jP'); -echo $resolvedDomain->toString(); //display 'www.pref.okinawa.jp'; +echo $resolvedDomain->toString(); //display 'www.pref.okinawa.jp'; echo $resolvedDomain->subDomain()->toString(); //display 'www'; echo $resolvedDomain->secondLevelDomain(); //display 'pref'; echo $resolvedDomain->registrableDomain()->toString(); //display 'pref.okinawa.jp'; @@ -77,7 +74,7 @@ $resolvedDomain->publicSuffix()->isICANN(); //returns true; In case of an error an exception which implements the `Pdp\CannotProcessHost` is thrown. -The `Pdp\ResolvedDomain` instance can be modify using the following methods: +You can modify the returned `Pdp\ResolvedDomain` instance using the following methods: ~~~php withSecondLevelDomain('test') ->withPublicSuffix('example'); -echo $resolvedDomain->toString(); //display 'shop.example.com'; +echo $resolvedDomain->toString(); //display 'shop.example.com'; $resolvedDomain->publicSuffix()->isKnown(); //returns true; -echo $newResolvedDomain->toString(); //display 'foo.bar.test.example'; +echo $newResolvedDomain->toString(); //display 'foo.bar.test.example'; $newResolvedDomain->publicSuffix()->isKnown(); //returns false; ~~~ The public suffix method `isKnown` will always return `false` if -you use a simple string to update the public suffix. -If you use a `PublicSuffix` object the method may return `true`. -See the following section for more information. +your input is not a `PublicSuffix` object in which case the method may return +`true`. For more information, see the following section. #### Public Suffix List Sections @@ -125,13 +121,15 @@ $publicSuffix->isKnown(); // will return true The public suffix state depends on its value: -- `isKnown` returns `true` if the value is part of the PSL. -- `isICANN` returns `true` if the value is part of the PSL ICANN section. -- `isPrivate` returns `true` if the value is part of the PSL private section. +- `isKnown` returns `true` if the value is present in the PSL. +- `isICANN` returns `true` if the value is present in the PSL ICANN section. +- `isPrivate` returns `true` if the value is present in the PSL private section. If the value is not present in the PSL all the methods above will return `false`. -Because the PSL algorithm is fault tolerant this library exposes more strict +`Rules::resolve` will always return a `ResolvedDomain` even if the domain +syntax is invalid or no entry was found in the desired section. To work around +the limitation of the official algorithm, this library exposes more strict methods: - `Rules::getCookieDomain` @@ -175,7 +173,7 @@ use Pdp\TopLevelDomains; $iana = TopLevelDomains::fromPath('/path/to/cache/tlds-alpha-by-domain.txt'); $resolvedDomain = $iana->resolve('www.PreF.OkiNawA.jP'); -echo $resolvedDomain->toString(); //display 'www.pref.okinawa.jp'; +echo $resolvedDomain->toString(); //display 'www.pref.okinawa.jp'; echo $resolvedDomain->publicSuffix()->toString(); //display 'jp'; echo $resolvedDomain->secondLevelDomain(); //display 'okinawa'; echo $resolvedDomain->registrableDomain()->toString(); //display 'okinawa.jp'; @@ -204,15 +202,19 @@ integrating an update mechanism into your software.** ### Accessing and processing Domain labels If you are interested into manipulating the domain labels without taking into -account the Effective TLD, you can access them using the `getDomain` method -from the `ResolvedDomain` or the `PublicSuffixList` instances. +account the Effective TLD, the library provides a `Domain` object tailored for +manipulating domain labels. You can access the object using the `domain` method +from: + +- the `ResolvedDomain` +- the `PublicSuffix` instances -Accessing this object enables you to work with the domain labels. +or from -It is possible to access the labels composing the underlying public suffix -domain using the following call: +- the `ResolvedDomain::registrableDomain` result which is a `ResolvedDomain` +- from `ResolvedDomain::subDomain` -Domain objects usage are explain in the next section. +`Domain` objects usage are explain in the next section. ~~~php toString(); // display 'www.example.com' echo $newDomain->toString(); // display 'docs.example.com.www' ~~~ -The following methods from the `ResolvedDomain` object will **also** return -an `Domain` object: - -- `ResolvedDomain::registrableDomain` -- `ResolvedDomain::subDomain` - **WARNING: Because of its definition, a domain name can be `null` or a string.** To distinguish this possibility the object exposes two (2) formatting methods @@ -317,20 +313,20 @@ use Pdp\Domain; $domain = Domain::fromIDNA2008('faß.de'); echo $domain->value(); // display 'faß.de' -$domain->isIDNA2008(); // returns true +$domain->isIdna2008(); // returns true $domain->isAscii(); // return false $asciiDomain = $domain->toAscii(); echo $asciiDomain->value(); // display 'xn--fa-hia.de' -$asciiDomain->isIDNA2008(); // returns true +$asciiDomain->isIdna2008(); // returns true $asciiDomain->isAscii(); // returns true $domain = Domain::fromIDNA2003('faß.de'); echo $domain->value(); // display 'fass.de' -$domain->isIDNA2008(); // returns true +$domain->isIdna2008(); // returns true $domain->isAscii(); // return false $asciiDomain = $domain->toAscii(); echo $asciiDomain->value(); // display 'fass.de' -$asciiDomain->isIDNA2008(); // returns true +$asciiDomain->isIdna2008(); // returns true $asciiDomain->isAscii(); // returns true ~~~ @@ -339,7 +335,7 @@ string or an object that can be cast to a string to avoid unexpected format conversion errors/results. By default and with lack of information conversion is done using IDNA 2008 rules.** -## Managing the package databases +## Managing the package external resources Depending on your application, the mechanism to store your resources may differ, nevertheless, the library comes bundle with a **optional service** which diff --git a/src/Domain.php b/src/Domain.php index 3c6dfb6e..7af0f477 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -10,18 +10,29 @@ use function array_reverse; use function array_unshift; use function count; +use function explode; +use function filter_var; use function gettype; use function implode; use function in_array; +use function is_object; +use function is_scalar; use function ksort; +use function method_exists; use function preg_match; +use function rawurldecode; use function sprintf; +use function strtolower; +use const FILTER_FLAG_IPV4; +use const FILTER_VALIDATE_IP; use const IDNA_DEFAULT; use const IDNA_NONTRANSITIONAL_TO_ASCII; use const IDNA_NONTRANSITIONAL_TO_UNICODE; -final class Domain extends DomainNameParser implements DomainName +final class Domain implements DomainName { + private const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/'; + /** * @var array */ @@ -73,6 +84,85 @@ public static function fromIDNA2008($domain): self return new self($domain, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); } + /** + * Parse and format the domain to ensure it is valid. + * Returns an array containing the formatted domain name labels + * and the domain transitional information. + * + * For example: parse('wWw.uLb.Ac.be') should return ['be', 'ac', 'ulb', 'www'];. + * + * @param mixed $domain a domain + * + *@throws SyntaxError If the host is not a domain + *@throws SyntaxError If the domain is not a host + * + *@return array + */ + private function parse($domain, int $asciiOption, int $unicodeOption): array + { + if ($domain instanceof ExternalDomainName) { + $domain = $domain->domain()->value(); + } + + if ($domain instanceof Host) { + $domain = $domain->value(); + } + + if (null === $domain) { + return []; + } + + if (is_object($domain) && method_exists($domain, '__toString')) { + $domain = (string) $domain; + } + + if (!is_scalar($domain)) { + throw new TypeError(sprintf('The domain must be a string, a stringable object, a Host object or NULL; `%s` given', gettype($domain))); + } + + $domain = (string) $domain; + if ('' === $domain) { + return ['']; + } + + $res = filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); + if (false !== $res) { + throw SyntaxError::dueToUnsupportedType($domain); + } + + $formattedDomain = rawurldecode($domain); + + // Note that unreserved is purposely missing . as it is used to separate labels. + static $domainName = '/(?(DEFINE) + (?[a-z0-9_~\-]) + (?[!$&\'()*+,;=]) + (?%[A-F0-9]{2}) + (?(?:(?&unreserved)|(?&sub_delims)|(?&encoded)){1,63}) + ) + ^(?:(?®_name)\.){0,126}(?®_name)\.?$/ix'; + if (1 === preg_match($domainName, $formattedDomain)) { + return array_reverse(explode('.', strtolower($formattedDomain))); + } + + // a domain name can not contains URI delimiters or space + static $genDelimiters = '/[:\/?#\[\]@ ]/'; + if (1 === preg_match($genDelimiters, $formattedDomain)) { + throw SyntaxError::dueToInvalidCharacters($domain); + } + + // if the domain name does not contains UTF-8 chars then it is malformed + if (1 === preg_match(self::REGEXP_IDN_PATTERN, $formattedDomain)) { + $asciiDomain = IntlIdna::toAscii($domain, $asciiOption); + + /** @var array $labels */ + $labels = array_reverse(explode('.', IntlIdna::toUnicode($asciiDomain, $unicodeOption))); + + return $labels; + } + + throw SyntaxError::dueToInvalidCharacters($domain); + } + public function getIterator() { foreach ($this->labels as $offset => $label) { @@ -80,7 +170,7 @@ public function getIterator() } } - public function isIDNA2008(): bool + public function isIdna2008(): bool { return IDNA_NONTRANSITIONAL_TO_ASCII === $this->asciiIDNAOption; } @@ -138,7 +228,7 @@ public function toAscii(): self return $this; } - $domain = $this->idnToAscii($this->domain, $this->asciiIDNAOption); + $domain = IntlIdna::toAscii($this->domain, $this->asciiIDNAOption); if ($domain === $this->domain) { return $this; } @@ -152,7 +242,7 @@ public function toUnicode(): self return $this; } - $domain = $this->idnToUnicode($this->domain, $this->unicodeIDNAOption); + $domain = IntlIdna::toUnicode($this->domain, $this->unicodeIDNAOption); if ($domain === $this->domain) { return $this; } @@ -167,8 +257,12 @@ public function toUnicode(): self * * @throws TypeError if the domain can not be converted */ - private function normalizeContent($domain): string + private function normalize($domain): string { + if ($domain instanceof ExternalDomainName) { + $domain = $domain->domain(); + } + if ($domain instanceof Host) { $domain = $domain->value(); } @@ -183,10 +277,10 @@ private function normalizeContent($domain): string } if (1 === preg_match(self::REGEXP_IDN_PATTERN, $this->domain)) { - return $this->idnToUnicode($domain, $this->unicodeIDNAOption); + return IntlIdna::toUnicode($domain, $this->unicodeIDNAOption); } - return $this->idnToAscii($domain, $this->asciiIDNAOption); + return IntlIdna::toAscii($domain, $this->asciiIDNAOption); } public function prepend($label): self @@ -210,7 +304,7 @@ public function withLabel(int $key, $label): self $key = $nb_labels + $key; } - $label = $this->normalizeContent($label); + $label = $this->normalize($label); if (($this->labels[$key] ?? null) === $label) { return $this; diff --git a/src/DomainName.php b/src/DomainName.php index 7cea0387..26191a70 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -11,8 +11,18 @@ * @see https://tools.ietf.org/html/rfc1123#section-2.1 * @see https://tools.ietf.org/html/rfc5890 */ -interface DomainName extends Host, IteratorAggregate, IDNConversion +interface DomainName extends Host, IteratorAggregate { + /** + * Tells whether IDNA Conversion is done using IDNA2008 algorithm. + */ + public function isIdna2008(): bool; + + /** + * Tells whether the current domain is in its ascii form. + */ + public function isAscii(): bool; + /** * Retrieves a single domain label. * diff --git a/src/DomainNameParser.php b/src/DomainNameParser.php deleted file mode 100644 index a2e0c6cf..00000000 --- a/src/DomainNameParser.php +++ /dev/null @@ -1,227 +0,0 @@ - 'a non-final domain name label (or the whole domain name) is empty', - IDNA_ERROR_LABEL_TOO_LONG => 'a domain name label is longer than 63 bytes', - IDNA_ERROR_DOMAIN_NAME_TOO_LONG => 'a domain name is longer than 255 bytes in its storage form', - IDNA_ERROR_LEADING_HYPHEN => 'a label starts with a hyphen-minus ("-")', - IDNA_ERROR_TRAILING_HYPHEN => 'a label ends with a hyphen-minus ("-")', - IDNA_ERROR_HYPHEN_3_4 => 'a label contains hyphen-minus ("-") in the third and fourth positions', - IDNA_ERROR_LEADING_COMBINING_MARK => 'a label starts with a combining mark', - IDNA_ERROR_DISALLOWED => 'a label or domain name contains disallowed characters', - IDNA_ERROR_PUNYCODE => 'a label starts with "xn--" but does not contain valid Punycode', - IDNA_ERROR_LABEL_HAS_DOT => 'a label contains a dot=full stop', - IDNA_ERROR_INVALID_ACE_LABEL => 'An ACE label does not contain a valid label string', - IDNA_ERROR_BIDI => 'a label does not meet the IDNA BiDi requirements (for right-to-left characters)', - IDNA_ERROR_CONTEXTJ => 'a label does not meet the IDNA CONTEXTJ requirements', - ]; - - $res = []; - foreach ($idnErrors as $error => $reason) { - if ($error === ($errorByte & $error)) { - $res[] = $reason; - } - } - - return [] === $res ? 'Unknown IDNA conversion error.' : implode(', ', $res).'.'; - } - - /** - * Converts the input to its IDNA ASCII form. - * - * This method returns the string converted to IDN ASCII form - * - * @throws SyntaxError if the string can not be converted to ASCII using IDN UTS46 algorithm - */ - final protected function idnToAscii(string $domain, int $option = IDNA_DEFAULT): string - { - $domain = rawurldecode($domain); - - if (1 !== preg_match(self::REGEXP_IDN_PATTERN, $domain)) { - return strtolower($domain); - } - - $output = idn_to_ascii($domain, $option, INTL_IDNA_VARIANT_UTS46, $infos); - if ([] === $infos) { - throw SyntaxError::dueToIDNAError($domain); - } - - if (0 !== $infos['errors']) { - throw SyntaxError::dueToIDNAError($domain, self::getIdnErrors($infos['errors'])); - } - - // @codeCoverageIgnoreStart - if (false === $output) { - throw new UnexpectedValueException(sprintf('The Intl extension is misconfigured for %s, please correct this issue before proceeding.', PHP_OS)); - } - // @codeCoverageIgnoreEnd - - if (false === strpos($output, '%')) { - return $output; - } - - throw SyntaxError::dueToInvalidCharacters($domain); - } - - /** - * Converts the input to its IDNA UNICODE form. - * - * This method returns the string converted to IDN UNICODE form - * - * @throws SyntaxError if the string can not be converted to UNICODE using IDN UTS46 algorithm - * @throws UnexpectedValueException if the intl extension is misconfigured - */ - final protected function idnToUnicode(string $domain, int $option = IDNA_DEFAULT): string - { - if (false === strpos($domain, 'xn--')) { - return $domain; - } - - $output = idn_to_utf8($domain, $option, INTL_IDNA_VARIANT_UTS46, $info); - if ([] === $info) { - throw SyntaxError::dueToIDNAError($domain); - } - - if (0 !== $info['errors']) { - throw SyntaxError::dueToIDNAError($domain, self::getIdnErrors($info['errors'])); - } - - // @codeCoverageIgnoreStart - if (false === $output) { - throw new UnexpectedValueException(sprintf('The Intl extension for %s is misconfigured. Please correct this issue before proceeding.', PHP_OS)); - } - // @codeCoverageIgnoreEnd - - return $output; - } - - /** - * Parse and format the domain to ensure it is valid. - * Returns an array containing the formatted domain name labels - * and the domain transitional information. - * - * For example: parse('wWw.uLb.Ac.be') should return ['be', 'ac', 'ulb', 'www'];. - * - * @param mixed $domain a domain - * - *@throws SyntaxError If the host is not a domain - *@throws SyntaxError If the domain is not a host - *@return array - * - */ - final protected function parse($domain, int $asciiOption, int $unicodeOption): array - { - if ($domain instanceof ExternalDomainName) { - $domain = $domain->domain()->value(); - } - - if ($domain instanceof Host) { - $domain = $domain->value(); - } - - if (null === $domain) { - return []; - } - - if (is_object($domain) && method_exists($domain, '__toString')) { - $domain = (string) $domain; - } - - if (!is_scalar($domain)) { - throw new TypeError(sprintf('The domain must be a string, a stringable object, a Host object or NULL; `%s` given', gettype($domain))); - } - - $domain = (string) $domain; - if ('' === $domain) { - return ['']; - } - - $res = filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); - if (false !== $res) { - throw SyntaxError::dueToUnsupportedType($domain); - } - - $formattedDomain = rawurldecode($domain); - - // Note that unreserved is purposely missing . as it is used to separate labels. - static $domainName = '/(?(DEFINE) - (?[a-z0-9_~\-]) - (?[!$&\'()*+,;=]) - (?%[A-F0-9]{2}) - (?(?:(?&unreserved)|(?&sub_delims)|(?&encoded)){1,63}) - ) - ^(?:(?®_name)\.){0,126}(?®_name)\.?$/ix'; - if (1 === preg_match($domainName, $formattedDomain)) { - return array_reverse(explode('.', strtolower($formattedDomain))); - } - - // a domain name can not contains URI delimiters or space - static $genDelimiters = '/[:\/?#\[\]@ ]/'; - if (1 === preg_match($genDelimiters, $formattedDomain)) { - throw SyntaxError::dueToInvalidCharacters($domain); - } - - // if the domain name does not contains UTF-8 chars then it is malformed - if (1 === preg_match(self::REGEXP_IDN_PATTERN, $formattedDomain)) { - $asciiDomain = $this->idnToAscii($domain, $asciiOption); - - /** @var array $labels */ - $labels = array_reverse(explode('.', $this->idnToUnicode($asciiDomain, $unicodeOption))); - - return $labels; - } - - throw SyntaxError::dueToInvalidCharacters($domain); - } -} diff --git a/src/DomainTest.php b/src/DomainTest.php index a2bf209b..9c03f16f 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -400,7 +400,7 @@ public function testConstructWithCustomIDNAOptions(): void { $domain = Domain::fromIDNA2008('example.com'); - self::assertTrue($domain->isIDNA2008()); + self::assertTrue($domain->isIdna2008()); } /** diff --git a/src/EffectiveTLD.php b/src/EffectiveTLD.php index 22821cea..64bfc2f2 100644 --- a/src/EffectiveTLD.php +++ b/src/EffectiveTLD.php @@ -4,7 +4,7 @@ namespace Pdp; -interface EffectiveTLD extends Host, ExternalDomainName, IDNConversion +interface EffectiveTLD extends Host, ExternalDomainName { public const ICANN_DOMAINS = 'ICANN_DOMAINS'; diff --git a/src/IDNConversion.php b/src/IDNConversion.php deleted file mode 100644 index 87b17ca0..00000000 --- a/src/IDNConversion.php +++ /dev/null @@ -1,18 +0,0 @@ - 'a non-final domain name label (or the whole domain name) is empty', + IDNA_ERROR_LABEL_TOO_LONG => 'a domain name label is longer than 63 bytes', + IDNA_ERROR_DOMAIN_NAME_TOO_LONG => 'a domain name is longer than 255 bytes in its storage form', + IDNA_ERROR_LEADING_HYPHEN => 'a label starts with a hyphen-minus ("-")', + IDNA_ERROR_TRAILING_HYPHEN => 'a label ends with a hyphen-minus ("-")', + IDNA_ERROR_HYPHEN_3_4 => 'a label contains hyphen-minus ("-") in the third and fourth positions', + IDNA_ERROR_LEADING_COMBINING_MARK => 'a label starts with a combining mark', + IDNA_ERROR_DISALLOWED => 'a label or domain name contains disallowed characters', + IDNA_ERROR_PUNYCODE => 'a label starts with "xn--" but does not contain valid Punycode', + IDNA_ERROR_LABEL_HAS_DOT => 'a label contains a dot=full stop', + IDNA_ERROR_INVALID_ACE_LABEL => 'An ACE label does not contain a valid label string', + IDNA_ERROR_BIDI => 'a label does not meet the IDNA BiDi requirements (for right-to-left characters)', + IDNA_ERROR_CONTEXTJ => 'a label does not meet the IDNA CONTEXTJ requirements', + ]; + + private const REGEXP_IDNA_PATTERN = '/[^\x20-\x7f]/'; + + /** + * Get and format IDN conversion error message. + */ + private static function getIDNAErrors(int $errorByte): string + { + $res = []; + foreach (self::IDNA_ERRORS as $error => $reason) { + if ($error === ($errorByte & $error)) { + $res[] = $reason; + } + } + + return [] === $res ? 'Unknown IDNA conversion error.' : implode(', ', $res).'.'; + } + + /** + * Converts the input to its IDNA ASCII form. + * + * This method returns the string converted to IDN ASCII form + * + * @throws SyntaxError if the string can not be converted to ASCII using IDN UTS46 algorithm + */ + public static function toAscii(string $domain, int $option = IDNA_NONTRANSITIONAL_TO_ASCII): string + { + $domain = rawurldecode($domain); + if (1 !== preg_match(self::REGEXP_IDNA_PATTERN, $domain)) { + return strtolower($domain); + } + + $output = idn_to_ascii($domain, $option, INTL_IDNA_VARIANT_UTS46, $infos); + if ([] === $infos) { + throw SyntaxError::dueToIDNAError($domain); + } + + if (0 !== $infos['errors']) { + throw SyntaxError::dueToIDNAError($domain, self::getIDNAErrors($infos['errors'])); + } + + // @codeCoverageIgnoreStart + if (false === $output) { + throw new UnexpectedValueException(sprintf('The Intl extension is misconfigured for %s, please correct this issue before proceeding.', PHP_OS)); + } + // @codeCoverageIgnoreEnd + + if (false === strpos($output, '%')) { + return $output; + } + + throw SyntaxError::dueToInvalidCharacters($domain); + } + + /** + * Converts the input to its IDNA UNICODE form. + * + * This method returns the string converted to IDN UNICODE form + * + * @throws SyntaxError if the string can not be converted to UNICODE using IDN UTS46 algorithm + * @throws UnexpectedValueException if the intl extension is misconfigured + */ + public static function toUnicode(string $domain, int $option = IDNA_NONTRANSITIONAL_TO_UNICODE): string + { + if (false === strpos($domain, 'xn--')) { + return $domain; + } + + $output = idn_to_utf8($domain, $option, INTL_IDNA_VARIANT_UTS46, $info); + if ([] === $info) { + throw SyntaxError::dueToIDNAError($domain); + } + + if (0 !== $info['errors']) { + throw SyntaxError::dueToIDNAError($domain, self::getIDNAErrors($info['errors'])); + } + + // @codeCoverageIgnoreStart + if (false === $output) { + throw new UnexpectedValueException(sprintf('The Intl extension for %s is misconfigured. Please correct this issue before proceeding.', PHP_OS)); + } + // @codeCoverageIgnoreEnd + + return $output; + } +} diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 4bb6e79b..6aaf3e47 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -101,14 +101,4 @@ public function toUnicode(): self return $clone; } - - public function isAscii(): bool - { - return $this->domain->isAscii(); - } - - public function isIDNA2008(): bool - { - return $this->domain->isIDNA2008(); - } } diff --git a/src/PublicSuffixListConverter.php b/src/PublicSuffixListConverter.php index a1d4e23b..ec9a24c0 100644 --- a/src/PublicSuffixListConverter.php +++ b/src/PublicSuffixListConverter.php @@ -15,7 +15,7 @@ use function strpos; use function substr; -final class PublicSuffixListConverter extends DomainNameParser +final class PublicSuffixListConverter { private const PSL_SECTION = [ 'ICANN' => [ @@ -99,7 +99,7 @@ private function addRule(array $list, array $ruleParts): array try { /** @var string $line */ $line = array_pop($ruleParts); - $rule = $this->idnToAscii($line); + $rule = IntlIdna::toAscii($line); } catch (CannotProcessHost $exception) { throw UnableToLoadPublicSuffixList::dueToInvalidRule($line ?? null, $exception); } diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index e08dae2d..128ae317 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -57,7 +57,7 @@ private function setDomainName(Host $domain): DomainName private function setPublicSuffix(EffectiveTLD $publicSuffix = null): EffectiveTLD { if (null === $publicSuffix || null === $publicSuffix->value()) { - $domain = $this->domain->isIDNA2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); + $domain = $this->domain->isIdna2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); return PublicSuffix::fromUnknown($domain); } @@ -88,8 +88,8 @@ private function setPublicSuffix(EffectiveTLD $publicSuffix = null): EffectiveTL */ private function normalize(EffectiveTLD $subject): EffectiveTLD { - if ($subject->isIDNA2008() === $this->domain->isIDNA2008()) { - return $subject->isAscii() === $this->domain->isAscii() ? $subject : $subject->toUnicode(); + if ($subject->domain()->isIdna2008() === $this->domain->isIdna2008()) { + return $subject->domain()->isAscii() === $this->domain->isAscii() ? $subject : $subject->toUnicode(); } $newDomain = Domain::fromIDNA2003($subject->toUnicode()->value()); @@ -114,7 +114,7 @@ private function normalize(EffectiveTLD $subject): EffectiveTLD private function setRegistrableDomain(): DomainName { if (null === $this->publicSuffix->value()) { - return $this->domain->isIDNA2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); + return $this->domain->isIdna2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); } $domain = implode('.', array_slice( @@ -122,7 +122,7 @@ private function setRegistrableDomain(): DomainName count($this->domain) - count($this->publicSuffix) - 1 )); - $registrableDomain = $this->domain->isIDNA2008() ? Domain::fromIDNA2008($domain) : Domain::fromIDNA2003($domain); + $registrableDomain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($domain) : Domain::fromIDNA2003($domain); return $this->domain->isAscii() ? $registrableDomain->toAscii() : $registrableDomain->toUnicode(); } @@ -133,13 +133,13 @@ private function setRegistrableDomain(): DomainName private function setSubDomain(): DomainName { if (null === $this->registrableDomain->value()) { - return $this->domain->isIDNA2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); + return $this->domain->isIdna2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); } $nbLabels = count($this->domain); $nbRegistrableLabels = count($this->publicSuffix) + 1; if ($nbLabels === $nbRegistrableLabels) { - return $this->domain->isIDNA2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); + return $this->domain->isIdna2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); } $domain = implode('.', array_slice( @@ -148,7 +148,7 @@ private function setSubDomain(): DomainName $nbLabels - $nbRegistrableLabels )); - $subDomain = (!$this->domain->isIDNA2008()) ? Domain::fromIDNA2003($domain) : Domain::fromIDNA2008($domain); + $subDomain = (!$this->domain->isIdna2008()) ? Domain::fromIDNA2003($domain) : Domain::fromIDNA2008($domain); return $this->domain->isAscii() ? $subDomain->toAscii() : $subDomain->toUnicode(); } @@ -219,7 +219,7 @@ public function withPublicSuffix($publicSuffix): self } elseif ($publicSuffix instanceof DomainName) { $publicSuffix = PublicSuffix::fromUnknown($publicSuffix); } else { - $domain = $this->domain->isIDNA2008() ? Domain::fromIDNA2008($publicSuffix) : Domain::fromIDNA2003($publicSuffix); + $domain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($publicSuffix) : Domain::fromIDNA2003($publicSuffix); $publicSuffix = PublicSuffix::fromUnknown($domain); } } @@ -232,13 +232,13 @@ public function withPublicSuffix($publicSuffix): self $host = implode('.', array_reverse(array_slice($this->domain->labels(), count($this->publicSuffix)))); if (null === $publicSuffix->value()) { - $domain = $this->domain->isIDNA2008() ? Domain::fromIDNA2008($host) : Domain::fromIDNA2003($host); + $domain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($host) : Domain::fromIDNA2003($host); return new self($domain, null); } $host .= '.'.$publicSuffix->value(); - $domain = $this->domain->isIDNA2008() ? Domain::fromIDNA2008($host) : Domain::fromIDNA2003($host); + $domain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($host) : Domain::fromIDNA2003($host); return new self($domain, $publicSuffix); } @@ -253,10 +253,10 @@ public function withSubDomain($subDomain): self } if (!$subDomain instanceof DomainName) { - $subDomain = $this->domain->isIDNA2008() ? Domain::fromIDNA2008($subDomain) : Domain::fromIDNA2003($subDomain); + $subDomain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($subDomain) : Domain::fromIDNA2003($subDomain); } - $subDomain = $this->domain->isIDNA2008() ? Domain::fromIDNA2008($subDomain) : Domain::fromIDNA2003($subDomain); + $subDomain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($subDomain) : Domain::fromIDNA2003($subDomain); if ($this->subDomain == $subDomain) { return $this; } @@ -269,7 +269,7 @@ public function withSubDomain($subDomain): self } $newDomainValue = $subDomain->toString().'.'.$this->registrableDomain->toString(); - $newDomain = $this->domain->isIDNA2008() ? Domain::fromIDNA2008($newDomainValue) : Domain::fromIDNA2003($newDomainValue); + $newDomain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($newDomainValue) : Domain::fromIDNA2003($newDomainValue); return new self($newDomain, $this->publicSuffix); } @@ -290,7 +290,7 @@ public function withSecondLevelDomain($label): self } $newDomainValue = $this->subDomain->value().'.'.$newRegistrableDomain->value(); - $newDomain = $this->domain->isIDNA2008() ? Domain::fromIDNA2008($newDomainValue) : Domain::fromIDNA2003($newDomainValue); + $newDomain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($newDomainValue) : Domain::fromIDNA2003($newDomainValue); return new self($newDomain, $this->publicSuffix); } diff --git a/src/Rules.php b/src/Rules.php index 06bd147c..05e8d0e4 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -199,7 +199,7 @@ private function getPublicSuffix(DomainName $domain, string $section): Effective } $topLabel = $domain->toAscii()->label(0); - $publicSuffix = $domain->isIDNA2008() ? Domain::fromIDNA2008($topLabel) : Domain::fromIDNA2003($topLabel); + $publicSuffix = $domain->isIdna2008() ? Domain::fromIDNA2008($topLabel) : Domain::fromIDNA2003($topLabel); return PublicSuffix::fromUnknown($publicSuffix); } @@ -234,13 +234,13 @@ private function getPublicSuffixFromSection(DomainName $domain, string $section) if ([] === $matches) { $topLabel = $domain->toAscii()->label(0); - $publicSuffix = $domain->isIDNA2008() ? Domain::fromIDNA2008($topLabel) : Domain::fromIDNA2003($topLabel); + $publicSuffix = $domain->isIdna2008() ? Domain::fromIDNA2008($topLabel) : Domain::fromIDNA2003($topLabel); return PublicSuffix::fromUnknown($publicSuffix); } $publicSuffixLabels = implode('.', array_reverse($matches)); - $publicSuffix = $domain->isIDNA2008() ? Domain::fromIDNA2008($publicSuffixLabels) : Domain::fromIDNA2003($publicSuffixLabels); + $publicSuffix = $domain->isIdna2008() ? Domain::fromIDNA2008($publicSuffixLabels) : Domain::fromIDNA2003($publicSuffixLabels); if (PublicSuffix::PRIVATE_DOMAINS === $section) { return PublicSuffix::fromPrivate($publicSuffix); diff --git a/src/RulesTest.php b/src/RulesTest.php index 4a6bdb18..3ec0d415 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -368,7 +368,7 @@ public function parseDataProvider(): iterable /** * @covers ::validateDomain - * @covers \Pdp\DomainNameParser::parse + * @covers \Pdp\Domain::parse */ public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix(): void { @@ -379,7 +379,7 @@ public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix(): void /** * @covers ::getICANNDomain - * @covers \Pdp\DomainNameParser::parse + * @covers \Pdp\Domain::parse * * @dataProvider invalidDomainParseProvider */ @@ -401,7 +401,7 @@ public function invalidDomainParseProvider(): iterable /** * @covers ::getICANNDomain - * @covers \Pdp\DomainNameParser::parse + * @covers \Pdp\Domain::parse * * @dataProvider invalidHostParseProvider */ @@ -426,7 +426,7 @@ public function invalidHostParseProvider(): iterable /** * @covers ::getCookieDomain - * @covers \Pdp\DomainNameParser::parse + * @covers \Pdp\Domain::parse * @dataProvider validPublicSectionProvider * @param ?string $domain * @param ?string $expected @@ -585,7 +585,7 @@ public function testPublicSuffixSpec(): void public function testResolveWithIDNAOptions(): void { $resolvedByDefault = $this->rules->resolve('foo.de'); - self::assertTrue($resolvedByDefault->domain()->isIDNA2008()); + self::assertTrue($resolvedByDefault->domain()->isIdna2008()); /** @var string $string */ $string = file_get_contents(dirname(__DIR__).'/test_data/public_suffix_list.dat'); @@ -593,7 +593,7 @@ public function testResolveWithIDNAOptions(): void $domain = Domain::fromIDNA2008('foo.de'); $resolved = $rules->resolve($domain); - self::assertTrue($resolved->domain()->isIDNA2008()); + self::assertTrue($resolved->domain()->isIdna2008()); } /** diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index a24124c1..f063d847 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -186,13 +186,13 @@ public function resolve($domain): ResolvedDomainName $label = $domain->toAscii()->label(0); foreach ($this as $tld) { if ($tld->value() === $label) { - $publicSuffix = $domain->isIDNA2008() ? Domain::fromIDNA2008($tld) : Domain::fromIDNA2003($tld); + $publicSuffix = $domain->isIdna2008() ? Domain::fromIDNA2008($tld) : Domain::fromIDNA2003($tld); return new ResolvedDomain($domain, PublicSuffix::fromUnknown($publicSuffix)); } } - $publicSuffix = $domain->isIDNA2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); + $publicSuffix = $domain->isIdna2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); return new ResolvedDomain($domain, PublicSuffix::fromUnknown($publicSuffix)); } diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index f3acbaa7..303b0120 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -193,7 +193,7 @@ public function testResolveWithIDNAOptions(): void { $resolved = $this->topLevelDomains->resolve('foo.de'); - self::assertTrue($resolved->domain()->isIDNA2008()); + self::assertTrue($resolved->domain()->isIdna2008()); $collection = TopLevelDomains::fromPath( dirname(__DIR__).'/test_data/root_zones.dat', @@ -203,7 +203,7 @@ public function testResolveWithIDNAOptions(): void $domain = Domain::fromIDNA2003('foo.de'); $resolved = $collection->resolve($domain); - self::assertFalse($resolved->domain()->isIDNA2008()); + self::assertFalse($resolved->domain()->isIdna2008()); } /** From 9ac6a757ac836b4e7e9ad21a7adc81a82b6ede78 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Fri, 20 Nov 2020 22:28:02 +0100 Subject: [PATCH 304/461] Update Domain --- src/Domain.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 7af0f477..9cad3a9a 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -101,7 +101,7 @@ public static function fromIDNA2008($domain): self private function parse($domain, int $asciiOption, int $unicodeOption): array { if ($domain instanceof ExternalDomainName) { - $domain = $domain->domain()->value(); + $domain = $domain->domain(); } if ($domain instanceof Host) { @@ -151,16 +151,16 @@ private function parse($domain, int $asciiOption, int $unicodeOption): array } // if the domain name does not contains UTF-8 chars then it is malformed - if (1 === preg_match(self::REGEXP_IDN_PATTERN, $formattedDomain)) { - $asciiDomain = IntlIdna::toAscii($domain, $asciiOption); + if (1 !== preg_match(self::REGEXP_IDN_PATTERN, $formattedDomain)) { + throw SyntaxError::dueToInvalidCharacters($domain); + } - /** @var array $labels */ - $labels = array_reverse(explode('.', IntlIdna::toUnicode($asciiDomain, $unicodeOption))); + $asciiDomain = IntlIdna::toAscii($domain, $asciiOption); - return $labels; - } + /** @var array $labels */ + $labels = array_reverse(explode('.', IntlIdna::toUnicode($asciiDomain, $unicodeOption))); - throw SyntaxError::dueToInvalidCharacters($domain); + return $labels; } public function getIterator() From 58ba2ffe34c14d02292a32feff4b50be53bbb6af Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 22 Nov 2020 14:34:29 +0100 Subject: [PATCH 305/461] Making Exception class final too --- src/UnableToLoadPublicSuffixList.php | 2 +- src/UnableToLoadRootZoneDatabase.php | 2 +- src/UnableToResolveDomain.php | 26 ++++++++------------------ 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/src/UnableToLoadPublicSuffixList.php b/src/UnableToLoadPublicSuffixList.php index 0e7bfb62..193ef498 100644 --- a/src/UnableToLoadPublicSuffixList.php +++ b/src/UnableToLoadPublicSuffixList.php @@ -7,7 +7,7 @@ use InvalidArgumentException; use Throwable; -class UnableToLoadPublicSuffixList extends InvalidArgumentException implements CannotProcessHost +final class UnableToLoadPublicSuffixList extends InvalidArgumentException implements CannotProcessHost { public static function dueToInvalidPath(string $path): self { diff --git a/src/UnableToLoadRootZoneDatabase.php b/src/UnableToLoadRootZoneDatabase.php index 58bbcf63..33d58122 100644 --- a/src/UnableToLoadRootZoneDatabase.php +++ b/src/UnableToLoadRootZoneDatabase.php @@ -7,7 +7,7 @@ use InvalidArgumentException; use Throwable; -class UnableToLoadRootZoneDatabase extends InvalidArgumentException implements CannotProcessHost +final class UnableToLoadRootZoneDatabase extends InvalidArgumentException implements CannotProcessHost { public static function dueToInvalidHashMap(): self { diff --git a/src/UnableToResolveDomain.php b/src/UnableToResolveDomain.php index 65424c91..9cebdcb4 100644 --- a/src/UnableToResolveDomain.php +++ b/src/UnableToResolveDomain.php @@ -6,11 +6,11 @@ use InvalidArgumentException; -class UnableToResolveDomain extends InvalidArgumentException implements CannotProcessHost +final class UnableToResolveDomain extends InvalidArgumentException implements CannotProcessHost { - private ?Host $domain = null; + private ?DomainName $domain = null; - public static function dueToMissingPublicSuffix(Host $domain, string $type): self + public static function dueToMissingPublicSuffix(DomainName $domain, string $type): self { $domainType = (EffectiveTLD::PRIVATE_DOMAINS === $type) ? 'private' : 'ICANN'; @@ -20,33 +20,23 @@ public static function dueToMissingPublicSuffix(Host $domain, string $type): sel return $exception; } - public static function dueToUnresolvableDomain(?Host $domain): self + public static function dueToUnresolvableDomain(DomainName $domain): self { - $content = $domain; - if (null !== $content) { - $content = $content->value(); - } - - $exception = new self('The domain "'.$content.'" can not contain a public suffix.'); + $exception = new self('The domain "'.$domain->value().'" can not contain a public suffix.'); $exception->domain = $domain; return $exception; } - public static function dueToMissingRegistrableDomain(Host $domain = null): self + public static function dueToMissingRegistrableDomain(DomainName $domain): self { - $content = $domain; - if (null !== $content) { - $content = $content->value(); - } - - $exception = new self('A subdomain can not be added to a domain "'.$content.'" without a registrable domain part.'); + $exception = new self('A subdomain can not be added to a domain "'.$domain->value().'" without a registrable domain part.'); $exception->domain = $domain; return $exception; } - public function getDomain(): ?Host + public function fetchDomain(): ?DomainName { return $this->domain; } From c8c4b29fb73ca41639b02a11babaa2fc0bc35b14 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 22 Nov 2020 14:34:44 +0100 Subject: [PATCH 306/461] Improve Domain parsing --- src/Domain.php | 91 +++++++++++++++++++++++++++------------- src/DomainName.php | 3 +- src/Host.php | 2 - src/PublicSuffix.php | 32 ++++++++++++-- src/PublicSuffixTest.php | 7 ++++ src/ResolvedDomain.php | 19 +++++---- src/Rules.php | 6 +-- 7 files changed, 111 insertions(+), 49 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 9cad3a9a..9bfaa678 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -4,6 +4,7 @@ namespace Pdp; +use Iterator; use TypeError; use function array_count_values; use function array_keys; @@ -49,12 +50,7 @@ final class Domain implements DomainName */ private function __construct($domain, int $asciiIDNAOption, int $unicodeIDNAOption) { - $this->labels = $this->parse($domain, $asciiIDNAOption, $unicodeIDNAOption); - $this->domain = implode('.', array_reverse($this->labels)); - if ([] === $this->labels) { - $this->domain = null; - } - + [$this->domain, $this->labels] = $this->parseDomain($domain, $asciiIDNAOption, $unicodeIDNAOption); $this->asciiIDNAOption = $asciiIDNAOption; $this->unicodeIDNAOption = $unicodeIDNAOption; } @@ -85,31 +81,57 @@ public static function fromIDNA2008($domain): self } /** - * Parse and format the domain to ensure it is valid. - * Returns an array containing the formatted domain name labels - * and the domain transitional information. - * - * For example: parse('wWw.uLb.Ac.be') should return ['be', 'ac', 'ulb', 'www'];. - * * @param mixed $domain a domain * - *@throws SyntaxError If the host is not a domain - *@throws SyntaxError If the domain is not a host - * - *@return array + * @return array{0:string|null, 1:array} */ - private function parse($domain, int $asciiOption, int $unicodeOption): array + private function parseDomain($domain, int $asciiOption, int $unicodeOption): array { if ($domain instanceof ExternalDomainName) { $domain = $domain->domain(); } - if ($domain instanceof Host) { - $domain = $domain->value(); + if (!$domain instanceof DomainName) { + if ($domain instanceof Host) { + $domain = $domain->value(); + } + + return $this->parseValue($domain, $asciiOption, $unicodeOption); } + if ($domain->isIdna2008()) { + if (IDNA_NONTRANSITIONAL_TO_ASCII === $asciiOption) { + return [$domain->value(), $domain->labels()]; + } + + return $this->parseValue($domain->value(), $asciiOption, $unicodeOption); + } + + if (IDNA_DEFAULT === $asciiOption) { + return [$domain->value(), $domain->labels()]; + } + + return $this->parseValue($domain->value(), $asciiOption, $unicodeOption); + } + + /** + * Parse and format the domain to ensure it is valid. + * Returns an array containing the formatted domain name labels + * and the domain transitional information. + * + * For example: parse('wWw.uLb.Ac.be') should return ['www.ulb.ac.be', ['be', 'ac', 'ulb', 'www']];. + * + * @param mixed $domain a domain + * + * @throws SyntaxError If the host is not a domain + * @throws SyntaxError If the domain is not a host + * + * @return array{0:string|null, 1:array} + */ + private function parseValue($domain, int $asciiOption, int $unicodeOption): array + { if (null === $domain) { - return []; + return [null, []]; } if (is_object($domain) && method_exists($domain, '__toString')) { @@ -122,7 +144,7 @@ private function parse($domain, int $asciiOption, int $unicodeOption): array $domain = (string) $domain; if ('' === $domain) { - return ['']; + return ['', ['']]; } $res = filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); @@ -141,7 +163,9 @@ private function parse($domain, int $asciiOption, int $unicodeOption): array ) ^(?:(?®_name)\.){0,126}(?®_name)\.?$/ix'; if (1 === preg_match($domainName, $formattedDomain)) { - return array_reverse(explode('.', strtolower($formattedDomain))); + $formattedDomain = strtolower($formattedDomain); + + return [$formattedDomain, array_reverse(explode('.', $formattedDomain))]; } // a domain name can not contains URI delimiters or space @@ -155,15 +179,17 @@ private function parse($domain, int $asciiOption, int $unicodeOption): array throw SyntaxError::dueToInvalidCharacters($domain); } - $asciiDomain = IntlIdna::toAscii($domain, $asciiOption); + $formattedDomain = IntlIdna::toUnicode( + IntlIdna::toAscii($domain, $asciiOption), + $unicodeOption + ); - /** @var array $labels */ - $labels = array_reverse(explode('.', IntlIdna::toUnicode($asciiDomain, $unicodeOption))); + $labels = array_reverse(explode('.', $formattedDomain)); - return $labels; + return [$formattedDomain, $labels]; } - public function getIterator() + public function getIterator(): Iterator { foreach ($this->labels as $offset => $label) { yield $label; @@ -177,8 +203,7 @@ public function isIdna2008(): bool public function isAscii(): bool { - return null === $this->domain || - 1 !== preg_match(self::REGEXP_IDN_PATTERN, $this->domain); + return null === $this->domain || 1 !== preg_match(self::REGEXP_IDN_PATTERN, $this->domain); } public function jsonSerialize(): ?string @@ -210,6 +235,9 @@ public function label(int $key): ?string return $this->labels[$key] ?? null; } + /** + * @return array + */ public function keys(string $label = null): array { $args = (null !== $label) ? [$label, true] : []; @@ -217,6 +245,9 @@ public function keys(string $label = null): array return array_keys($this->labels, ...$args); } + /** + * @return array + */ public function labels(): array { return $this->labels; @@ -276,7 +307,7 @@ private function normalize($domain): string return $domain; } - if (1 === preg_match(self::REGEXP_IDN_PATTERN, $this->domain)) { + if (!$this->isAscii()) { return IntlIdna::toUnicode($domain, $this->unicodeIDNAOption); } diff --git a/src/DomainName.php b/src/DomainName.php index 26191a70..b6a33e85 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -4,6 +4,7 @@ namespace Pdp; +use Iterator; use IteratorAggregate; /** @@ -58,7 +59,7 @@ public function keys(string $label = null): array; * The external iterator iterates over the DomainInterface labels * from the right-most label to the left-most label. */ - public function getIterator(); + public function getIterator(): Iterator; /** * Prepends a label to the domain. diff --git a/src/Host.php b/src/Host.php index 7cb95775..06bc8245 100644 --- a/src/Host.php +++ b/src/Host.php @@ -44,7 +44,6 @@ public function count(): int; * * @throws CannotProcessHost if the domain can not be converted to ASCII using IDN UTS46 algorithm * @return static - * */ public function toAscii(): self; @@ -56,7 +55,6 @@ public function toAscii(): self; * * @throws CannotProcessHost if the domain can not be converted to Unicode using IDN UTS46 algorithm * @return static - * */ public function toUnicode(): self; } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 6aaf3e47..7e0d6cb0 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -4,7 +4,9 @@ namespace Pdp; +use TypeError; use function count; +use function get_class; final class PublicSuffix implements EffectiveTLD { @@ -12,8 +14,21 @@ final class PublicSuffix implements EffectiveTLD private string $section; - private function __construct(DomainName $domain, string $section) + /** + * @param DomainName|ExternalDomainName $domain + */ + private function __construct(object $domain, string $section) { + if ($domain instanceof ExternalDomainName) { + $domain = $domain->domain(); + } + + if (!$domain instanceof DomainName) { + throw new TypeError( + 'Domain must be a '.ExternalDomainName::class.' or a '.DomainName::class.' instance; '.get_class($domain).' given.' + ); + } + if ('' === $domain->label(0)) { throw SyntaxError::dueToInvalidPublicSuffix($domain); } @@ -31,17 +46,26 @@ public static function __set_state(array $properties): self return new self($properties['domain'], $properties['section']); } - public static function fromICANN(DomainName $domain): self + /** + * @param DomainName|ExternalDomainName $domain + */ + public static function fromICANN(object $domain): self { return new self($domain, self::ICANN_DOMAINS); } - public static function fromPrivate(DomainName $domain): self + /** + * @param DomainName|ExternalDomainName $domain + */ + public static function fromPrivate(object $domain): self { return new self($domain, self::PRIVATE_DOMAINS); } - public static function fromUnknown(DomainName $domain): self + /** + * @param DomainName|ExternalDomainName $domain + */ + public static function fromUnknown(object $domain): self { return new self($domain, ''); } diff --git a/src/PublicSuffixTest.php b/src/PublicSuffixTest.php index fa493b1b..7856658e 100644 --- a/src/PublicSuffixTest.php +++ b/src/PublicSuffixTest.php @@ -63,6 +63,13 @@ public function PSProvider(): iterable ]; } + public function testConstructorWithHostInstance(): void + { + $domain = PublicSuffix::fromICANN(Domain::fromIDNA2003('ac.be')); + + self::assertEquals($domain, PublicSuffix::fromICANN($domain)); + } + /** * @dataProvider invalidPublicSuffixProvider */ diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 128ae317..56e16064 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -23,7 +23,7 @@ final class ResolvedDomain implements ResolvedDomainName private DomainName $subDomain; - public function __construct(Host $domain, ?EffectiveTLD $publicSuffix = null) + public function __construct(Host $domain, EffectiveTLD $publicSuffix = null) { $this->domain = $this->setDomainName($domain); $this->publicSuffix = $this->setPublicSuffix($publicSuffix); @@ -148,7 +148,7 @@ private function setSubDomain(): DomainName $nbLabels - $nbRegistrableLabels )); - $subDomain = (!$this->domain->isIdna2008()) ? Domain::fromIDNA2003($domain) : Domain::fromIDNA2008($domain); + $subDomain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($domain) : Domain::fromIDNA2003($domain); return $this->domain->isAscii() ? $subDomain->toAscii() : $subDomain->toUnicode(); } @@ -214,13 +214,10 @@ public function toUnicode(): self public function withPublicSuffix($publicSuffix): self { if (!$publicSuffix instanceof EffectiveTLD) { - if ($publicSuffix instanceof ExternalDomainName) { - $publicSuffix = PublicSuffix::fromUnknown($publicSuffix->domain()); - } elseif ($publicSuffix instanceof DomainName) { + if ($publicSuffix instanceof ExternalDomainName || $publicSuffix instanceof DomainName) { $publicSuffix = PublicSuffix::fromUnknown($publicSuffix); } else { - $domain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($publicSuffix) : Domain::fromIDNA2003($publicSuffix); - $publicSuffix = PublicSuffix::fromUnknown($domain); + $publicSuffix = PublicSuffix::fromUnknown(Domain::fromIDNA2008($publicSuffix)); } } @@ -249,7 +246,11 @@ public function withPublicSuffix($publicSuffix): self public function withSubDomain($subDomain): self { if (null === $this->registrableDomain->value()) { - throw UnableToResolveDomain::dueToMissingRegistrableDomain($this); + throw UnableToResolveDomain::dueToMissingRegistrableDomain($this->domain); + } + + if ($subDomain instanceof ExternalDomainName) { + $subDomain = $subDomain->domain(); } if (!$subDomain instanceof DomainName) { @@ -277,7 +278,7 @@ public function withSubDomain($subDomain): self public function withSecondLevelDomain($label): self { if (null === $this->registrableDomain->value()) { - throw UnableToResolveDomain::dueToMissingRegistrableDomain($this); + throw UnableToResolveDomain::dueToMissingRegistrableDomain($this->domain); } $newRegistrableDomain = $this->registrableDomain->withLabel(-1, $label); diff --git a/src/Rules.php b/src/Rules.php index 05e8d0e4..547ddf3e 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -104,9 +104,9 @@ public function resolve($host): ResolvedDomainName try { return $this->getCookieDomain($host); } catch (UnableToResolveDomain $exception) { - $host = $exception->getDomain(); - if (null !== $host) { - return new ResolvedDomain($host); + $domain = $exception->fetchDomain(); + if (null !== $domain) { + return new ResolvedDomain($domain); } return new ResolvedDomain(Domain::fromIDNA2008($host)); From 8ed48867815459a00fa1b5d36b8aef5acc4ef6d7 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 22 Nov 2020 15:02:47 +0100 Subject: [PATCH 307/461] Improve PublicSuffix DX --- src/PublicSuffix.php | 22 +++++++++------------- src/ResolvedDomain.php | 12 ++++-------- src/RulesTest.php | 17 +++++++++++------ src/TopLevelDomainsTest.php | 4 ++-- 4 files changed, 26 insertions(+), 29 deletions(-) diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index 7e0d6cb0..f008d925 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -4,9 +4,7 @@ namespace Pdp; -use TypeError; use function count; -use function get_class; final class PublicSuffix implements EffectiveTLD { @@ -15,18 +13,16 @@ final class PublicSuffix implements EffectiveTLD private string $section; /** - * @param DomainName|ExternalDomainName $domain + * @param mixed $domain the public suffix domain information */ - private function __construct(object $domain, string $section) + private function __construct($domain, string $section) { if ($domain instanceof ExternalDomainName) { $domain = $domain->domain(); } if (!$domain instanceof DomainName) { - throw new TypeError( - 'Domain must be a '.ExternalDomainName::class.' or a '.DomainName::class.' instance; '.get_class($domain).' given.' - ); + $domain = Domain::fromIDNA2008($domain); } if ('' === $domain->label(0)) { @@ -47,25 +43,25 @@ public static function __set_state(array $properties): self } /** - * @param DomainName|ExternalDomainName $domain + * @param mixed $domain the public suffix domain information */ - public static function fromICANN(object $domain): self + public static function fromICANN($domain): self { return new self($domain, self::ICANN_DOMAINS); } /** - * @param DomainName|ExternalDomainName $domain + * @param mixed $domain the public suffix domain information */ - public static function fromPrivate(object $domain): self + public static function fromPrivate($domain): self { return new self($domain, self::PRIVATE_DOMAINS); } /** - * @param DomainName|ExternalDomainName $domain + * @param mixed $domain the public suffix domain information */ - public static function fromUnknown(object $domain): self + public static function fromUnknown($domain): self { return new self($domain, ''); } diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 56e16064..d3ad78c4 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -42,11 +42,11 @@ private function setDomainName(Host $domain): DomainName return $domain->domain(); } - if (!$domain instanceof DomainName) { - return Domain::fromIDNA2008($domain); + if ($domain instanceof DomainName) { + return $domain; } - return $domain; + return Domain::fromIDNA2008($domain->value()); } /** @@ -214,11 +214,7 @@ public function toUnicode(): self public function withPublicSuffix($publicSuffix): self { if (!$publicSuffix instanceof EffectiveTLD) { - if ($publicSuffix instanceof ExternalDomainName || $publicSuffix instanceof DomainName) { - $publicSuffix = PublicSuffix::fromUnknown($publicSuffix); - } else { - $publicSuffix = PublicSuffix::fromUnknown(Domain::fromIDNA2008($publicSuffix)); - } + $publicSuffix = PublicSuffix::fromUnknown($publicSuffix); } $publicSuffix = $this->normalize($publicSuffix); diff --git a/src/RulesTest.php b/src/RulesTest.php index 3ec0d415..d72212a5 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -212,7 +212,7 @@ public function testWithDomainObject(): void { $domain = new ResolvedDomain( Domain::fromIDNA2008('private.ulb.ac.be'), - PublicSuffix::fromICANN(Domain::fromIDNA2008('ac.be')) + PublicSuffix::fromICANN('ac.be') ); $newDomain = $this->rules->resolve($domain); @@ -227,7 +227,7 @@ public function testWithDomainObject(): void public function testWithDomainInterfaceObject(): void { - $domain = PublicSuffix::fromICANN(Domain::fromIDNA2008('ulb.ac.be')); + $domain = PublicSuffix::fromICANN('ulb.ac.be'); self::assertSame( 'ac.be', @@ -368,7 +368,8 @@ public function parseDataProvider(): iterable /** * @covers ::validateDomain - * @covers \Pdp\Domain::parse + * @covers \Pdp\Domain::parseDomain + * @covers \Pdp\Domain::parseValue */ public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix(): void { @@ -379,7 +380,8 @@ public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix(): void /** * @covers ::getICANNDomain - * @covers \Pdp\Domain::parse + * @covers \Pdp\Domain::parseDomain + * @covers \Pdp\Domain::parseValue * * @dataProvider invalidDomainParseProvider */ @@ -401,7 +403,8 @@ public function invalidDomainParseProvider(): iterable /** * @covers ::getICANNDomain - * @covers \Pdp\Domain::parse + * @covers \Pdp\Domain::parseDomain + * @covers \Pdp\Domain::parseValue * * @dataProvider invalidHostParseProvider */ @@ -426,7 +429,9 @@ public function invalidHostParseProvider(): iterable /** * @covers ::getCookieDomain - * @covers \Pdp\Domain::parse + * @covers \Pdp\Domain::parseDomain + * @covers \Pdp\Domain::parseValue + * * @dataProvider validPublicSectionProvider * @param ?string $domain * @param ?string $expected diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 303b0120..0d71a087 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -139,7 +139,7 @@ public function validDomainProvider(): iterable { $resolvedDomain = new ResolvedDomain( Domain::fromIDNA2008('www.example.com'), - PublicSuffix::fromICANN(Domain::fromIDNA2008('com')) + PublicSuffix::fromICANN('com') ); return [ @@ -235,7 +235,7 @@ public function __toString(): string return 'COM'; } }], - 'externalDomain' => [PublicSuffix::fromICANN(Domain::fromIDNA2008('com'))], + 'externalDomain' => [PublicSuffix::fromICANN('com')], ]; } From 3863d4cff6adfe20ae89d76d39d24dc5b2744d8f Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 22 Nov 2020 15:39:25 +0100 Subject: [PATCH 308/461] Improve i18n documentation section --- README.md | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 792c580f..6d83e84a 100644 --- a/README.md +++ b/README.md @@ -279,12 +279,16 @@ $emptyDomain->toString(); // returns ''; ### Internationalization -Domain names support different formats (ascii and unicode format), the package -by default will convert the domain in its ascii format for resolution against -the public suffix source and convert it back to its unicode form if needed. -To do so all domain objects expose a `toAscii` and a `toUnicode` methods which +Domain names support different formats (ascii and unicode format). The package +by default converts the domain in its ascii format for resolution against +the public suffix source and convert it back to its unicode form if needed. +To do domain objects expose a `toAscii` and a `toUnicode` methods which returns a new instance in the converted format. -By default, resolver will use the IDNA2008 format to convert the submitted string. + +The conversion is done using the compliant implementation of +[UTS#46](https://www.unicode.org/reports/tr46/), otherwise known as Unicode IDNA +Compatibility Processing. By default, domain objects use the IDNA2008 format to +convert the submitted string. ~~~php /** @var Rules $rules */ @@ -303,10 +307,11 @@ Since the `ResolvedDomain` only cares about public suffix resolution, only the `Pdp\Domain` exposes methods to correctly format domain names. the named constructors highlight the algorithm used to convert the domain name between ascii and unicode format. -`Domain::fromIDNA2008` convert the value to its unicode format using IDNA 2008 -rules. While `Domain::fromIDNA2003` does it using legacy rules. At any given -moment you can tell which algorithm will be used to convert the domain and in which -format it is using the following methods: + +For backward compatibility, you can also use the IDNA2003 algorithm via the +`Domain::fromIDNA2003`. At any given moment you can tell which algorithm +will be used to convert the domain and in which format it is using the +following methods: ~~~php use Pdp\Domain; From 5f64ead493b182284f7ba7cc295d579755292632 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 22 Nov 2020 15:44:13 +0100 Subject: [PATCH 309/461] Improve storage example --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 6d83e84a..23278ab4 100644 --- a/README.md +++ b/README.md @@ -416,7 +416,14 @@ $factory = new PsrStorageFactory($cache, $client, $client); $pslStorage = $factory->createPublicSuffixListStorage($cachePrefix, $cacheTtl); $rzdStorage = $factory->createRootZoneDatabaseStorage($cachePrefix, $cacheTtl); +// if you need to force refreshing the rules +// before calling them (to use in a refresh script) +// $pslStorage->delete(PsrStorageFactory::URL_PSL); $rules = $pslStorage->get(PsrStorageFactory::URL_PSL); + +// if you need to force refreshing the rules +// before calling them (to use in a refresh script) +// $rzdStorage->delete(PsrStorageFactory::URL_RZD); $tldDomains = $rzdStorage->get(PsrStorageFactory::URL_RZD); ~~~ From 3d1ceea6eb421e1bf7daf04eb5819d571b4a9488 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 22 Nov 2020 19:11:38 +0100 Subject: [PATCH 310/461] Improve ext-intl decoupling --- src/Domain.php | 13 +++++-------- src/IntlIdna.php | 23 ++++++++++++++++++++--- src/PublicSuffixListConverter.php | 2 +- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 9bfaa678..9f4a214e 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -26,9 +26,6 @@ use function strtolower; use const FILTER_FLAG_IPV4; use const FILTER_VALIDATE_IP; -use const IDNA_DEFAULT; -use const IDNA_NONTRANSITIONAL_TO_ASCII; -use const IDNA_NONTRANSITIONAL_TO_UNICODE; final class Domain implements DomainName { @@ -69,7 +66,7 @@ public static function __set_state(array $properties): self */ public static function fromIDNA2003($domain): self { - return new self($domain, IDNA_DEFAULT, IDNA_DEFAULT); + return new self($domain, IntlIdna::IDNA2003_ASCII_OPTIONS, IntlIdna::IDNA2003_UNICODE_OPTIONS); } /** @@ -77,7 +74,7 @@ public static function fromIDNA2003($domain): self */ public static function fromIDNA2008($domain): self { - return new self($domain, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); + return new self($domain, IntlIdna::IDNA2008_ASCII_OPTIONS, IntlIdna::IDNA2008_UNICODE_OPTIONS); } /** @@ -100,14 +97,14 @@ private function parseDomain($domain, int $asciiOption, int $unicodeOption): arr } if ($domain->isIdna2008()) { - if (IDNA_NONTRANSITIONAL_TO_ASCII === $asciiOption) { + if (IntlIdna::IDNA2008_ASCII_OPTIONS === $asciiOption) { return [$domain->value(), $domain->labels()]; } return $this->parseValue($domain->value(), $asciiOption, $unicodeOption); } - if (IDNA_DEFAULT === $asciiOption) { + if (IntlIdna::IDNA2003_ASCII_OPTIONS === $asciiOption) { return [$domain->value(), $domain->labels()]; } @@ -198,7 +195,7 @@ public function getIterator(): Iterator public function isIdna2008(): bool { - return IDNA_NONTRANSITIONAL_TO_ASCII === $this->asciiIDNAOption; + return IntlIdna::IDNA2008_ASCII_OPTIONS === $this->asciiIDNAOption; } public function isAscii(): bool diff --git a/src/IntlIdna.php b/src/IntlIdna.php index 3ed89795..b46ac1c0 100644 --- a/src/IntlIdna.php +++ b/src/IntlIdna.php @@ -13,6 +13,9 @@ use function sprintf; use function strpos; use function strtolower; +use const IDNA_CHECK_BIDI; +use const IDNA_CHECK_CONTEXTJ; +use const IDNA_DEFAULT; use const IDNA_ERROR_BIDI; use const IDNA_ERROR_CONTEXTJ; use const IDNA_ERROR_DISALLOWED; @@ -28,16 +31,30 @@ use const IDNA_ERROR_TRAILING_HYPHEN; use const IDNA_NONTRANSITIONAL_TO_ASCII; use const IDNA_NONTRANSITIONAL_TO_UNICODE; +use const IDNA_USE_STD3_RULES; use const INTL_IDNA_VARIANT_UTS46; final class IntlIdna { + public const IDNA2008_ASCII_OPTIONS = IDNA_NONTRANSITIONAL_TO_ASCII + | IDNA_CHECK_BIDI + | IDNA_USE_STD3_RULES + | IDNA_CHECK_CONTEXTJ; + + public const IDNA2008_UNICODE_OPTIONS = IDNA_NONTRANSITIONAL_TO_UNICODE + | IDNA_CHECK_BIDI + | IDNA_USE_STD3_RULES + | IDNA_CHECK_CONTEXTJ; + + public const IDNA2003_ASCII_OPTIONS = IDNA_DEFAULT; + public const IDNA2003_UNICODE_OPTIONS = IDNA_DEFAULT; + /** * IDNA errors. * * @see http://icu-project.org/apiref/icu4j/com/ibm/icu/text/IDNA.Error.html */ - private const IDNA_ERRORS = [ + private const IDNA_ERRORS = [ IDNA_ERROR_EMPTY_LABEL => 'a non-final domain name label (or the whole domain name) is empty', IDNA_ERROR_LABEL_TOO_LONG => 'a domain name label is longer than 63 bytes', IDNA_ERROR_DOMAIN_NAME_TOO_LONG => 'a domain name is longer than 255 bytes in its storage form', @@ -77,7 +94,7 @@ private static function getIDNAErrors(int $errorByte): string * * @throws SyntaxError if the string can not be converted to ASCII using IDN UTS46 algorithm */ - public static function toAscii(string $domain, int $option = IDNA_NONTRANSITIONAL_TO_ASCII): string + public static function toAscii(string $domain, int $option): string { $domain = rawurldecode($domain); if (1 !== preg_match(self::REGEXP_IDNA_PATTERN, $domain)) { @@ -114,7 +131,7 @@ public static function toAscii(string $domain, int $option = IDNA_NONTRANSITIONA * @throws SyntaxError if the string can not be converted to UNICODE using IDN UTS46 algorithm * @throws UnexpectedValueException if the intl extension is misconfigured */ - public static function toUnicode(string $domain, int $option = IDNA_NONTRANSITIONAL_TO_UNICODE): string + public static function toUnicode(string $domain, int $option): string { if (false === strpos($domain, 'xn--')) { return $domain; diff --git a/src/PublicSuffixListConverter.php b/src/PublicSuffixListConverter.php index ec9a24c0..052b7626 100644 --- a/src/PublicSuffixListConverter.php +++ b/src/PublicSuffixListConverter.php @@ -99,7 +99,7 @@ private function addRule(array $list, array $ruleParts): array try { /** @var string $line */ $line = array_pop($ruleParts); - $rule = IntlIdna::toAscii($line); + $rule = IntlIdna::toAscii($line, IntlIdna::IDNA2003_ASCII_OPTIONS); } catch (CannotProcessHost $exception) { throw UnableToLoadPublicSuffixList::dueToInvalidRule($line ?? null, $exception); } From c6c9755925679b512844ddb444645167d36cc937 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 22 Nov 2020 20:18:48 +0100 Subject: [PATCH 311/461] Improve decoupling from IntlIdna --- src/Domain.php | 86 +++++++++++++++++++++++++++----------------------- 1 file changed, 47 insertions(+), 39 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 9f4a214e..4e10cf97 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -30,6 +30,8 @@ final class Domain implements DomainName { private const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/'; + private const IDNA_2003 = 'IDNA_2003'; + private const IDNA_2008 = 'IDNA_2008'; /** * @var array @@ -38,27 +40,20 @@ final class Domain implements DomainName private ?string $domain; - private int $asciiIDNAOption; - - private int $unicodeIDNAOption; + private string $type; /** * @param null|mixed $domain */ - private function __construct($domain, int $asciiIDNAOption, int $unicodeIDNAOption) + private function __construct($domain, string $type) { - [$this->domain, $this->labels] = $this->parseDomain($domain, $asciiIDNAOption, $unicodeIDNAOption); - $this->asciiIDNAOption = $asciiIDNAOption; - $this->unicodeIDNAOption = $unicodeIDNAOption; + $this->type = $type; + [$this->domain, $this->labels] = $this->parseDomain($domain); } public static function __set_state(array $properties): self { - return new self( - $properties['domain'], - $properties['asciiIDNAOption'], - $properties['unicodeIDNAOption'] - ); + return new self($properties['domain'], $properties['type']); } /** @@ -66,7 +61,7 @@ public static function __set_state(array $properties): self */ public static function fromIDNA2003($domain): self { - return new self($domain, IntlIdna::IDNA2003_ASCII_OPTIONS, IntlIdna::IDNA2003_UNICODE_OPTIONS); + return new self($domain, self::IDNA_2003); } /** @@ -74,7 +69,7 @@ public static function fromIDNA2003($domain): self */ public static function fromIDNA2008($domain): self { - return new self($domain, IntlIdna::IDNA2008_ASCII_OPTIONS, IntlIdna::IDNA2008_UNICODE_OPTIONS); + return new self($domain, self::IDNA_2008); } /** @@ -82,7 +77,7 @@ public static function fromIDNA2008($domain): self * * @return array{0:string|null, 1:array} */ - private function parseDomain($domain, int $asciiOption, int $unicodeOption): array + private function parseDomain($domain): array { if ($domain instanceof ExternalDomainName) { $domain = $domain->domain(); @@ -93,22 +88,22 @@ private function parseDomain($domain, int $asciiOption, int $unicodeOption): arr $domain = $domain->value(); } - return $this->parseValue($domain, $asciiOption, $unicodeOption); + return $this->parseValue($domain); } if ($domain->isIdna2008()) { - if (IntlIdna::IDNA2008_ASCII_OPTIONS === $asciiOption) { + if (self::IDNA_2008 === $this->type) { return [$domain->value(), $domain->labels()]; } - return $this->parseValue($domain->value(), $asciiOption, $unicodeOption); + return $this->parseValue($domain->value()); } - if (IntlIdna::IDNA2003_ASCII_OPTIONS === $asciiOption) { + if (self::IDNA_2003 === $this->type) { return [$domain->value(), $domain->labels()]; } - return $this->parseValue($domain->value(), $asciiOption, $unicodeOption); + return $this->parseValue($domain->value()); } /** @@ -125,7 +120,7 @@ private function parseDomain($domain, int $asciiOption, int $unicodeOption): arr * * @return array{0:string|null, 1:array} */ - private function parseValue($domain, int $asciiOption, int $unicodeOption): array + private function parseValue($domain): array { if (null === $domain) { return [null, []]; @@ -176,16 +171,33 @@ private function parseValue($domain, int $asciiOption, int $unicodeOption): arra throw SyntaxError::dueToInvalidCharacters($domain); } - $formattedDomain = IntlIdna::toUnicode( - IntlIdna::toAscii($domain, $asciiOption), - $unicodeOption - ); + $formattedDomain = $this->domainToUnicode($this->domainToAscii($formattedDomain)); $labels = array_reverse(explode('.', $formattedDomain)); return [$formattedDomain, $labels]; } + private function domainToAscii(string $domain): string + { + $option = IntlIdna::IDNA2008_ASCII_OPTIONS; + if (self::IDNA_2003 === $this->type) { + $option = IntlIdna::IDNA2003_ASCII_OPTIONS; + } + + return IntlIdna::toAscii($domain, $option); + } + + private function domainToUnicode(string $domain): string + { + $option = IntlIdna::IDNA2008_UNICODE_OPTIONS; + if (self::IDNA_2003 === $this->type) { + $option = IntlIdna::IDNA2003_UNICODE_OPTIONS; + } + + return IntlIdna::toUnicode($domain, $option); + } + public function getIterator(): Iterator { foreach ($this->labels as $offset => $label) { @@ -195,7 +207,7 @@ public function getIterator(): Iterator public function isIdna2008(): bool { - return IntlIdna::IDNA2008_ASCII_OPTIONS === $this->asciiIDNAOption; + return self::IDNA_2008 === $this->type; } public function isAscii(): bool @@ -256,12 +268,12 @@ public function toAscii(): self return $this; } - $domain = IntlIdna::toAscii($this->domain, $this->asciiIDNAOption); + $domain = $this->domainToAscii($this->domain); if ($domain === $this->domain) { return $this; } - return new self($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption); + return new self($domain, $this->type); } public function toUnicode(): self @@ -270,12 +282,12 @@ public function toUnicode(): self return $this; } - $domain = IntlIdna::toUnicode($this->domain, $this->unicodeIDNAOption); + $domain = $this->domainToUnicode($this->domain); if ($domain === $this->domain) { return $this; } - return new self($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption); + return new self($domain, $this->type); } /** @@ -305,10 +317,10 @@ private function normalize($domain): string } if (!$this->isAscii()) { - return IntlIdna::toUnicode($domain, $this->unicodeIDNAOption); + return $this->domainToUnicode($domain); } - return IntlIdna::toAscii($domain, $this->asciiIDNAOption); + return $this->domainToAscii($domain); } public function prepend($label): self @@ -342,11 +354,7 @@ public function withLabel(int $key, $label): self $labels[$key] = $label; ksort($labels); - return new self( - implode('.', array_reverse($labels)), - $this->asciiIDNAOption, - $this->unicodeIDNAOption - ); + return new self(implode('.', array_reverse($labels)), $this->type); } public function withoutLabel(int $key, int ...$keys): self @@ -373,11 +381,11 @@ public function withoutLabel(int $key, int ...$keys): self } if ([] === $labels) { - return new self(null, $this->asciiIDNAOption, $this->unicodeIDNAOption); + return new self(null, $this->type); } $domain = implode('.', array_reverse($labels)); - return new self($domain, $this->asciiIDNAOption, $this->unicodeIDNAOption); + return new self($domain, $this->type); } } From f2a2f459d356c92d5a0f9bac2b4ed2859542f706 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 23 Nov 2020 09:55:03 +0100 Subject: [PATCH 312/461] Remove sprintf usage --- src/Domain.php | 5 ++--- src/IntlIdna.php | 5 ++--- src/ResolvedDomain.php | 5 ++--- src/Storage/PublicSuffixListPsr16Cache.php | 16 ++++------------ src/Storage/RootZoneDatabasePsr16Cache.php | 14 ++------------ 5 files changed, 12 insertions(+), 33 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 4e10cf97..4c182b15 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -22,7 +22,6 @@ use function method_exists; use function preg_match; use function rawurldecode; -use function sprintf; use function strtolower; use const FILTER_FLAG_IPV4; use const FILTER_VALIDATE_IP; @@ -131,7 +130,7 @@ private function parseValue($domain): array } if (!is_scalar($domain)) { - throw new TypeError(sprintf('The domain must be a string, a stringable object, a Host object or NULL; `%s` given', gettype($domain))); + throw new TypeError('The domain must be a string, a stringable object, a Host object or NULL; `'.gettype($domain).'` given.'); } $domain = (string) $domain; @@ -308,7 +307,7 @@ private function normalize($domain): string } if (null === $domain || (!is_string($domain) && !method_exists($domain, '__toString'))) { - throw new TypeError(sprintf('The label must be a '.Host::class.', a stringable object or a string, `%s` given', gettype($domain))); + throw new TypeError('The label must be a '.Host::class.', a stringable object or a string, `'.gettype($domain).'` given.'); } $domain = (string) $domain; diff --git a/src/IntlIdna.php b/src/IntlIdna.php index b46ac1c0..6a74267a 100644 --- a/src/IntlIdna.php +++ b/src/IntlIdna.php @@ -10,7 +10,6 @@ use function implode; use function preg_match; use function rawurldecode; -use function sprintf; use function strpos; use function strtolower; use const IDNA_CHECK_BIDI; @@ -112,7 +111,7 @@ public static function toAscii(string $domain, int $option): string // @codeCoverageIgnoreStart if (false === $output) { - throw new UnexpectedValueException(sprintf('The Intl extension is misconfigured for %s, please correct this issue before proceeding.', PHP_OS)); + throw new UnexpectedValueException('The Intl extension is misconfigured for '.PHP_OS.', please correct this issue before proceeding.'); } // @codeCoverageIgnoreEnd @@ -148,7 +147,7 @@ public static function toUnicode(string $domain, int $option): string // @codeCoverageIgnoreStart if (false === $output) { - throw new UnexpectedValueException(sprintf('The Intl extension for %s is misconfigured. Please correct this issue before proceeding.', PHP_OS)); + throw new UnexpectedValueException('The Intl extension for '.PHP_OS.' is misconfigured. Please correct this issue before proceeding.'); } // @codeCoverageIgnoreEnd diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index d3ad78c4..8b72e507 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -9,7 +9,6 @@ use function count; use function explode; use function implode; -use function sprintf; use function strlen; use function substr; @@ -72,12 +71,12 @@ private function setPublicSuffix(EffectiveTLD $publicSuffix = null): EffectiveTL $publicSuffix = $this->normalize($publicSuffix); if ($this->domain->value() === $publicSuffix->value()) { - throw new UnableToResolveDomain(sprintf('The public suffix and the domain name are is identical `%s`.', $this->domain->toString())); + throw new UnableToResolveDomain('The public suffix and the domain name are is identical `'.$this->domain->toString().'`.'); } $psContent = $publicSuffix->toString(); if ('.'.$psContent !== substr($this->domain->toString(), - strlen($psContent) - 1)) { - throw new UnableToResolveDomain(sprintf('The public suffix `%s` can not be assign to the domain name `%s`', $psContent, $this->domain->toString())); + throw new UnableToResolveDomain('The public suffix `'.$psContent.'` can not be assign to the domain name `'.$this->domain->toString().'`'); } return $publicSuffix; diff --git a/src/Storage/PublicSuffixListPsr16Cache.php b/src/Storage/PublicSuffixListPsr16Cache.php index 5353da4b..af29176c 100644 --- a/src/Storage/PublicSuffixListPsr16Cache.php +++ b/src/Storage/PublicSuffixListPsr16Cache.php @@ -13,12 +13,8 @@ use Psr\SimpleCache\CacheInterface; use TypeError; use function filter_var; -use function get_class; -use function gettype; -use function is_object; use function is_string; use function md5; -use function sprintf; use function strtolower; use const FILTER_VALIDATE_INT; @@ -62,19 +58,15 @@ private function setTtl($ttl): ?DateInterval } if (!is_string($ttl)) { - throw new TypeError(sprintf( - 'The ttl must null, an integer, a string a DateTimeInterface or a DateInterval object %s given.', - is_object($ttl) ? get_class($ttl) : gettype($ttl) - )); + throw new TypeError('The ttl must null, an integer, a string, a DateTimeInterface or a DateInterval object.'); } /** @var DateInterval|false $date */ $date = @DateInterval::createFromDateString($ttl); if (!$date instanceof DateInterval) { - throw new InvalidArgumentException(sprintf( - 'The ttl value "%s" can not be parsable by `DateInterval::createFromDateString`.', - $ttl - )); + throw new InvalidArgumentException( + 'The ttl value "'.$ttl.'" can not be parsable by `DateInterval::createFromDateString`.' + ); } return $date; diff --git a/src/Storage/RootZoneDatabasePsr16Cache.php b/src/Storage/RootZoneDatabasePsr16Cache.php index 0d53992a..a2c044ef 100644 --- a/src/Storage/RootZoneDatabasePsr16Cache.php +++ b/src/Storage/RootZoneDatabasePsr16Cache.php @@ -13,12 +13,8 @@ use Psr\SimpleCache\CacheInterface; use TypeError; use function filter_var; -use function get_class; -use function gettype; -use function is_object; use function is_string; use function md5; -use function sprintf; use function strtolower; use const FILTER_VALIDATE_INT; @@ -62,19 +58,13 @@ private function setTtl($ttl): ?DateInterval } if (!is_string($ttl)) { - throw new TypeError(sprintf( - 'The ttl must null, an integer, a string a DateTimeInterface or a DateInterval object %s given.', - is_object($ttl) ? get_class($ttl) : gettype($ttl) - )); + throw new TypeError('The ttl must null, an integer, a string, a DateTimeInterface or a DateInterval object.'); } /** @var DateInterval|false $date */ $date = @DateInterval::createFromDateString($ttl); if (!$date instanceof DateInterval) { - throw new InvalidArgumentException(sprintf( - 'The ttl value "%s" can not be parsable by `DateInterval::createFromDateString`.', - $ttl - )); + throw new InvalidArgumentException('The ttl value "'.$ttl.'" can not be parsable by `DateInterval::createFromDateString`.'); } return $date; From fee1f2cc11e878687179fd470bfad4feaebbc84a Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 23 Nov 2020 09:55:18 +0100 Subject: [PATCH 313/461] Update dependencies and documentation --- README.md | 126 +++++++++++++++++++++++++------------------------- composer.json | 12 ++--- 2 files changed, 68 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md index 23278ab4..9184adf0 100644 --- a/README.md +++ b/README.md @@ -62,13 +62,13 @@ use Pdp\Rules; $rules = Rules::fromPath('/path/to/cache/public-suffix-list.dat'); -$resolvedDomain = $rules->resolve('www.PreF.OkiNawA.jP'); -echo $resolvedDomain->toString(); //display 'www.pref.okinawa.jp'; -echo $resolvedDomain->subDomain()->toString(); //display 'www'; -echo $resolvedDomain->secondLevelDomain(); //display 'pref'; -echo $resolvedDomain->registrableDomain()->toString(); //display 'pref.okinawa.jp'; -echo $resolvedDomain->publicSuffix()->toString(); //display 'okinawa.jp'; -$resolvedDomain->publicSuffix()->isICANN(); //returns true; +$result = $rules->resolve('www.PreF.OkiNawA.jP'); +echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; +echo $result->subDomain()->toString(); //display 'www'; +echo $result->secondLevelDomain(); //display 'pref'; +echo $result->registrableDomain()->toString(); //display 'pref.okinawa.jp'; +echo $result->publicSuffix()->toString(); //display 'okinawa.jp'; +$result->publicSuffix()->isICANN(); //returns true; ~~~ In case of an error an exception which implements the `Pdp\CannotProcessHost` @@ -82,17 +82,17 @@ use Pdp\Rules; $rules = Rules::fromPath('/path/to/cache/public-suffix-list.dat'); -$resolvedDomain = $rules->resolve('shop.example.com'); -$newResolvedDomain = $resolvedDomain +$result = $rules->resolve('shop.example.com'); +$altResult = $result ->withSubDomain('foo.bar') ->withSecondLevelDomain('test') ->withPublicSuffix('example'); -echo $resolvedDomain->toString(); //display 'shop.example.com'; -$resolvedDomain->publicSuffix()->isKnown(); //returns true; +echo $result->domain()->toString(); //display 'shop.example.com'; +$result->publicSuffix()->isKnown(); //returns true; -echo $newResolvedDomain->toString(); //display 'foo.bar.test.example'; -$newResolvedDomain->publicSuffix()->isKnown(); //returns false; +echo $altResult->domain()->toString(); //display 'foo.bar.test.example'; +$altResult->publicSuffix()->isKnown(); //returns false; ~~~ The public suffix method `isKnown` will always return `false` if @@ -113,10 +113,10 @@ $rules = Rules::fromPath('/path/to/cache/public-suffix-list.dat'); $publicSuffix = $rules->resolve('example.github.io')->publicSuffix(); -echo $publicSuffix->toString(); // display 'github.io'; -$publicSuffix->isICANN(); // will return false -$publicSuffix->isPrivate(); // will return true -$publicSuffix->isKnown(); // will return true +echo $publicSuffix->domain()->toString(); //display 'github.io'; +$publicSuffix->isICANN(); //will return false +$publicSuffix->isPrivate(); //will return true +$publicSuffix->isKnown(); //will return true ~~~ The public suffix state depends on its value: @@ -172,12 +172,12 @@ use Pdp\TopLevelDomains; $iana = TopLevelDomains::fromPath('/path/to/cache/tlds-alpha-by-domain.txt'); -$resolvedDomain = $iana->resolve('www.PreF.OkiNawA.jP'); -echo $resolvedDomain->toString(); //display 'www.pref.okinawa.jp'; -echo $resolvedDomain->publicSuffix()->toString(); //display 'jp'; -echo $resolvedDomain->secondLevelDomain(); //display 'okinawa'; -echo $resolvedDomain->registrableDomain()->toString(); //display 'okinawa.jp'; -echo $resolvedDomain->subDomain()->toString(); //display 'www.pref'; +$result = $iana->resolve('www.PreF.OkiNawA.jP'); +echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; +echo $result->publicSuffix()->toString(); //display 'jp'; +echo $result->secondLevelDomain(); //display 'okinawa'; +echo $result->registrableDomain()->toString(); //display 'okinawa.jp'; +echo $result->subDomain()->toString(); //display 'www.pref'; ~~~ In case of an error an exception which extends `Pdp\CannotProcessHost` is thrown. @@ -203,16 +203,12 @@ integrating an update mechanism into your software.** If you are interested into manipulating the domain labels without taking into account the Effective TLD, the library provides a `Domain` object tailored for -manipulating domain labels. You can access the object using the `domain` method -from: - -- the `ResolvedDomain` -- the `PublicSuffix` instances - -or from - -- the `ResolvedDomain::registrableDomain` result which is a `ResolvedDomain` -- from `ResolvedDomain::subDomain` +manipulating domain labels. You can access the object using the following methods: + +- the `ResolvedDomain::domain` method +- the `PublicSuffix::domain` method +- from `ResolvedDomain::subDomain` method +- the `ResolvedDomain::registrableDomain` returns a `ResolvedDomain` `Domain` objects usage are explain in the next section. @@ -277,41 +273,43 @@ $emptyDomain->value(); // returns ''; $emptyDomain->toString(); // returns ''; ~~~ -### Internationalization +### ASCII and Unicode formats. -Domain names support different formats (ascii and unicode format). The package -by default converts the domain in its ascii format for resolution against -the public suffix source and convert it back to its unicode form if needed. -To do domain objects expose a `toAscii` and a `toUnicode` methods which -returns a new instance in the converted format. - -The conversion is done using the compliant implementation of -[UTS#46](https://www.unicode.org/reports/tr46/), otherwise known as Unicode IDNA -Compatibility Processing. By default, domain objects use the IDNA2008 format to -convert the submitted string. +Domain names originally only supported ASCII characters. Nowadays, +they can also be presented under a UNICODE representation. The conversion +between both formats is done using the compliant implementation of +[UTS#46](https://www.unicode.org/reports/tr46/), otherwise known as Unicode +IDNA Compatibility Processing. Domain objects expose a `toAscii` and a +`toUnicode` methods which returns a new instance in the converted format. ~~~php /** @var Rules $rules */ -$unicodeDomain = $rules->resolve(Domain::fromIDNA2008('bébé.be')); -echo $unicodeDomain->toString(); // returns 'bébé.be' -$unicodeDomain->secondLevelDomain(); // returns 'bébé' +$unicodeDomain = $rules->resolve('bébé.be')->domain(); +echo $unicodeDomain->toString(); // returns 'bébé.be' -$asciiDomain = $rules->resolve(Domain::fromIDNA2008('xn--bb-bjab.be')); -$asciiDomain->toString(); // returns 'xn--bb-bjab.be' -$asciiDomain->secondLevelDomain(); // returns 'xn--bb-bjab' +$asciiDomain = $rules->resolve('xn--bb-bjab.be')->domain(); +echo $asciiDomain->toString(); // returns 'xn--bb-bjab.be' $asciiDomain->toUnicode()->toString() === $unicodeDomain->toString(); //returns true +$unicodeDomain->toAscii()->toString() === $asciiDomain->toString(); //returns true ~~~ -Since the `ResolvedDomain` only cares about public suffix resolution, -only the `Pdp\Domain` exposes methods to correctly format domain names. -the named constructors highlight the algorithm used to convert the -domain name between ascii and unicode format. +By default, the library uses IDNA2008 algorithm to convert domain name between +both formats. It is still possible to use the legacy conversion algorithm known +as IDNA2003. -For backward compatibility, you can also use the IDNA2003 algorithm via the -`Domain::fromIDNA2003`. At any given moment you can tell which algorithm -will be used to convert the domain and in which format it is using the -following methods: +Since direct conversion between both algorithms is not possible you need +to explicitly specific on construction which algorithm you will use +when creating a new domain instance via the `Pdp\Domain` object. This +is done via two (2) named constructors: + +- `Pdp\Domain::fromIDNA2008` +- `Pdp\Domain::fromIDNA2003` + +At any given moment the `Pdp\Domain` instance can tell you whether: + +- the algorithm used for converting the domain is `IDNA2008`; +- if the domain value is in `ASCII` mode or not; ~~~php use Pdp\Domain; @@ -320,6 +318,7 @@ $domain = Domain::fromIDNA2008('faß.de'); echo $domain->value(); // display 'faß.de' $domain->isIdna2008(); // returns true $domain->isAscii(); // return false + $asciiDomain = $domain->toAscii(); echo $asciiDomain->value(); // display 'xn--fa-hia.de' $asciiDomain->isIdna2008(); // returns true @@ -327,17 +326,18 @@ $asciiDomain->isAscii(); // returns true $domain = Domain::fromIDNA2003('faß.de'); echo $domain->value(); // display 'fass.de' -$domain->isIdna2008(); // returns true -$domain->isAscii(); // return false +$domain->isIdna2008(); // returns false +$domain->isAscii(); // returns true + $asciiDomain = $domain->toAscii(); echo $asciiDomain->value(); // display 'fass.de' -$asciiDomain->isIdna2008(); // returns true +$asciiDomain->isIdna2008(); // returns false $asciiDomain->isAscii(); // returns true ~~~ -**TIP: Always favor submitting a `Domain` object for resolution rather that a +**TIP: Always favor submitting a `Pdp\Domain` object for resolution rather that a string or an object that can be cast to a string to avoid unexpected format -conversion errors/results. By default and with lack of information conversion +conversion errors/results. By default, and with lack of information conversion is done using IDNA 2008 rules.** ## Managing the package external resources diff --git a/composer.json b/composer.json index d165c8cd..7a794be2 100644 --- a/composer.json +++ b/composer.json @@ -46,17 +46,15 @@ }, "require-dev": { "friendsofphp/php-cs-fixer": "^2.16", - "guzzlehttp/guzzle": "^7.0.0", - "guzzlehttp/psr7": "^1.6.0", - "nyholm/psr7": "^1.3", + "guzzlehttp/guzzle": "^7.0", + "guzzlehttp/psr7": "^1.6", "phpstan/phpstan": "^0.12", "phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan-strict-rules": "^0.12", "phpunit/phpunit": "^9.3", - "psr/http-factory": "^1.0.0", - "psr/simple-cache": "^1.0.1", - "symfony/cache": "^v5.0.0", - "symfony/http-client": "^5.1" + "psr/http-factory": "^1.0", + "psr/simple-cache": "^1.0", + "symfony/cache": "^v5.0" }, "suggest": { "psr/http-client-implementation": "To use the storage functionnality which depends on PSR-18", From 68c517b4e012ac0f67e39153a6b3127c47dceb92 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 23 Nov 2020 12:12:20 +0100 Subject: [PATCH 314/461] Improve documentation --- README.md | 40 ++++++++++++++++++++---------- UPGRADING.md | 70 ++++++++++++++++++++++++++++++---------------------- 2 files changed, 68 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index 9184adf0..9b3b2577 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ PHP Domain Parser is compliant around: ### Composer ~~~ -$ composer require jeremykendall/php-domain-parser +$ composer require jeremykendall/php-domain-parser:^6.0 ~~~ ### System Requirements @@ -160,6 +160,22 @@ $rules->resolve('com'); // will return a Nullable Resolved domain ~~~ + Last but not least it is possible to instantiate a PublicSuffix object + using one of it's named constructor: + + ~~~php + resolve('www.bbc.co.uk'); -$domain = $resolvedDomain->domain(); +$result = $rules->resolve('www.bbc.co.uk'); +$domain = $rules->resolve('www.bbc.co.uk')->domain(); echo $domain->toString(); // display 'www.bbc.co.uk' count($domain); // returns 4 $domain->labels(); // returns ['uk', 'co', 'bbc', 'www']; @@ -231,7 +246,7 @@ foreach ($domain as $label) { // bbc // www -$publicSuffixDomain = $resolvedDomain->publicSuffix()->domain(); +$publicSuffixDomain = $result->publicSuffix()->domain(); $publicSuffixDomain->labels(); // returns ['uk', 'co'] ~~~ @@ -242,8 +257,7 @@ following methods: resolve('www.ExAmpLE.cOM'); -$domain = $resolvedDomain->domain(); +$domain = $rules->resolve('www.ExAmpLE.cOM')->domain(); $newDomain = $domain ->withLabel(1, 'com') //replace 'example' by 'com' diff --git a/UPGRADING.md b/UPGRADING.md index 8be0d4b7..a6b425f8 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -2,14 +2,31 @@ ## 5.0 to 6.0 -In order to take advantage of the new features of PHP, the library dropped the -support of **all versions before and including PHP 7.3**. The minimum supported PHP -version is now **PHP 7.4**. +In order to take advantage of PHP new features, the library dropped the +support of **all versions before and including PHP 7.3**. The minimum supported +PHP version is now **PHP 7.4**. -**Version 6.0 introduces more interfaces and removed the resource manager system.** +**Version 6.0 no longer provides an out of the box resource manager system.** ### Backward Incompatibility Changes +Domains resolution is done using the `IDNA2008` algorithm by default, in v5, +by default, it is done `IDNA2003` instead. + +**version 5** + +~~~php +/** @var Rules $rules */ +echo $rules->resolve('faß.de'); // returns 'fass.de' +~~~ + +**version 6** + +~~~php +/** @var Rules $rules */ +echo $rules->resolve('faß.de')->toString(); // returns 'faß.de' +~~~ + #### Domain resolution The `Pdp\Rules::resolve` and `Pdp\TopLevelDomains::resolve` returns a @@ -18,8 +35,9 @@ object no longer exposes the components from resolution, this is done by the new `ResolvedDomain` object instead. **version 5** + ~~~php -/** @var Domain $domain */ +/** @var Rules $rules */ $domain = $rules->resolve('www.example.com'); $domain->getDomain(); //returns a string or null and was deprecated $domain->getPublicSuffix(); //returns a string or null @@ -30,11 +48,10 @@ $domain->isPrivate(); //returns a boolean $domain->isKnown(); //returns a boolean ~~~ -The `Domain` **has access** to the domain parts and to the public suffix list state. - **version 6** + ~~~php -/** @var ResolvedDomain $domain */ +/** @var Rules $rules */ $result = $rules->resolve('www.example.com'); $result->domain(); //returns a Domain object similar to v5 Domain object $result->publicSuffix(); //returns a Public Suffix object @@ -42,10 +59,10 @@ $result->publicSuffix()->isICANN(); //returns a boolean $result->publicSuffix()->isPrivate(); //returns a boolean $result->publicSuffix()->isKnown(); //returns a boolean $result->subDomain(); //returns a Domain object -$result->registrableDomain(); //returns a Domain object +$result->registrableDomain(); //returns a ResolvedDomain object ~~~ -The `Domain` **has no access** to the domain parts or the public suffix list state. +The `Domain` **no longer has access** to component information. #### Strict domain resolution @@ -61,24 +78,24 @@ The `Domain` **has no access** to the domain parts or the public suffix list st #### Domain format -- Domain objects no longer exposes the `__toString` magic methods. -- `Domain::getContent` is renamed `Domain::value` +- `Domain::__toString` is removed use `Domain::toString`. +- `Domain::getContent` is renamed `Domain::value`. - The `Domain` constructor is private. To instantiate a domain object you -need to use on of the two named constructor `Domain::fromIDNA2008` or +need to use on of the two (2) named constructor `Domain::fromIDNA2008` or `Domain::fromIDNA2008`. **version 5** ~~~php -$domain = new Domain('www.example.com'); -echo $domain; // display 'www.example.com' +$domain = new Domain('faß.de', null, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); $domain->getContent(); // can be a string or null +echo $domain; // display 'faß.de' ~~~ **version 6** ~~~php -$domain = Domain::fromIDNA2008('www.example.com'); -echo $domain->toString(); // display 'www.example.com' +$domain = Domain::fromIDNA2008('faß.de'); $domain->value(); // can be a string or null +echo $domain->toString(); // display 'faß.de' ~~~ #### Methods renamed @@ -102,19 +119,14 @@ $domain->value(); // can be a string or null #### Methods removed +- `__toString` is removed from all classes. - `__debugInfo` is removed from all classes. -- `DomainInterface` is removed use `DomainName` instead or `ResolvedDomainName`. +- `DomainInterface` is removed use `DomainName` or `ResolvedDomainName` instead. - `Domain::isResolvable` is removed without replacement. -- `Domain::resolve` is removed without replacement. -- `Domain::isTransitionalDifferent` is removed without replacement. -- `Domain::withAsciiIDNAOption` is removed without replacement. -- `Domain::withUnicodeIDNAOption` is removed without replacement. -- `PublicSuffix::isTransitionalDifferent` is removed without replacement. -- `PublicSuffix::withAsciiIDNAOption` is removed without replacement. -- `PublicSuffix::withUnicodeIDNAOption` is removed without replacement. +- `Domain::resolve` is removed without replacement. - `PublicSuffix::createFromDomain` is removed without replacement. -- `Rules::getPublicSuffix` is removed use `ResolvedDomain::getPublicSuffix` instead. -- IDNA related methods from `Rules` and `TopLevelDomains` are removed. +- `Rules::getPublicSuffix` is removed use `ResolvedDomain::publicSuffix` instead. +- All v5 IDNA related methods are removed, IDNA is fully handle within the `Domain` object. #### Methods return type changed @@ -127,6 +139,6 @@ representation in other languages. - `Rules::__construct` - `TopLevelDomains::__construct` - `Domain::__construct` -- `PublicSuffix::__construct` +- `PublicSuffix::__construct` -methods are now all private. +methods are now all private please use the provided named constructors instead. From 46888dcf57786659d7801c98931e379b0e35a72c Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 23 Nov 2020 14:54:16 +0100 Subject: [PATCH 315/461] Improve Exception message --- src/Domain.php | 2 +- src/SyntaxError.php | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Domain.php b/src/Domain.php index 4c182b15..778aba65 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -167,7 +167,7 @@ private function parseValue($domain): array // if the domain name does not contains UTF-8 chars then it is malformed if (1 !== preg_match(self::REGEXP_IDN_PATTERN, $formattedDomain)) { - throw SyntaxError::dueToInvalidCharacters($domain); + throw SyntaxError::dueToInvalidLength($domain); } $formattedDomain = $this->domainToUnicode($this->domainToAscii($formattedDomain)); diff --git a/src/SyntaxError.php b/src/SyntaxError.php index bd4455b4..32dc7172 100644 --- a/src/SyntaxError.php +++ b/src/SyntaxError.php @@ -13,6 +13,11 @@ public static function dueToInvalidCharacters(string $domain): self return new self('The host `'.$domain.'` is invalid: it contains invalid characters.'); } + public static function dueToInvalidLength(string $domain): self + { + return new self('The host `'.$domain.'` is invalid: its length is longer than 255 bytes in its storage form.'); + } + public static function dueToIDNAError(string $domain, string $message = ''): self { if ('' === $message) { From a92e043ee2ba877d0bcc8eeb9060f954a42b083b Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 23 Nov 2020 14:54:25 +0100 Subject: [PATCH 316/461] Update CHANGELOG --- CHANGELOG.md | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3963174a..4b455d96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,14 +6,18 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will ### Added -- Adding proper Interfaces around domain name and domain name parsing +- Adding proper Interfaces +- Added `ResolvedDomain` object to normalize Resolver results. - Public Suffix List and IANA Root Zone Database are fully decoupled -- Optional storage capability based on PSR related interfaces to improve interoperability with any framework +- Added `IntlIdna`, IDN support has been completely revamped +- Resolver uses by default UTS#46 IDNA2008 algorithm to convert domain names +- Storage capability is optional and can be based on PHP-FIG related interfaces to improve interoperability ### Fixed - The `Pdp\Domain` class not longer directly exposes Effective TLD status. - Effective TLD resolver (`Pdp\Rules::resolve` and `Pdp\TopLevelDomains::resolve`) no longer accept IDNA options. +- `Rules::getICANNDomain`, `Rules::getPrivateDomain` will throw even if a `PublicSuffix` is found but does not belong to the correct PSL section. ### Deprecated @@ -21,6 +25,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will ### Removed +- `__toString` and `__debugInfo` usage - Support for PHP7.4- - Composer script for automatic updates of the remote databases - CLI command `bin/update-psl` @@ -29,8 +34,15 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - `Pdp\Installer`, `Pdp\Manager`: The package source manager and installer - `Pdp\Logger`, The package logger implementation - `Pdp\Rules::ALL_DOMAINS` constant deprecated in version 5.3 -- `Pdp\Domain::getDomain` deprecaed in version 5.3 -- None +- `Pdp\Domain::getDomain` deprecated in version 5.3 +- `Pdp\Domain::resolve` +- `Pdp\Domain::getPublicSuffix` replaced by `Pdp\ResolvedDomain::publicSuffix` +- `Pdp\Domain::getRegistrableDomain` replaced by `Pdp\ResolvedDomain::registrableDomain` +- `Pdp\Domain::getSubDomain` replaced by `Pdp\ResolvedDomain::subDomain` +- `Pdp\Domain::getLabel` replaced by `Pdp\Domain::label` +- `Pdp\Domain::isTransitionalDifferent` without replacement +- `Pdp\PublicSuffix::createFromDomain` without replacement +- Directly accessing public suffix information from the domain object ## 5.7.2 - 2020-10-25 From 6cde60a1d594b68f5e311ddadd8816e3104a73e2 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 26 Nov 2020 07:58:33 +0100 Subject: [PATCH 317/461] Adding TopLevelDomains::getTopLevelDomains --- CHANGELOG.md | 4 + README.md | 174 ++++++++++++++------------ UPGRADING.md | 2 + src/EffectiveTLD.php | 7 ++ src/PublicSuffix.php | 13 ++ src/RootZoneDatabase.php | 11 +- src/RootZoneDatabaseConverter.php | 4 +- src/RootZoneDatabaseConverterTest.php | 4 +- src/TopLevelDomains.php | 70 +++++------ src/TopLevelDomainsTest.php | 52 ++++---- src/UnableToLoadRootZoneDatabase.php | 2 +- 11 files changed, 181 insertions(+), 162 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b455d96..d8f3cfa7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,12 +12,15 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - Added `IntlIdna`, IDN support has been completely revamped - Resolver uses by default UTS#46 IDNA2008 algorithm to convert domain names - Storage capability is optional and can be based on PHP-FIG related interfaces to improve interoperability +- `Pdp\TopLevelDomains::getTopLevelDomain` which throws on syntax error and if no effective TLD is found. +- `Pdp\PublicSuffix::isIANA` tells whether the TLD was successfully resolved against IANA RZD ### Fixed - The `Pdp\Domain` class not longer directly exposes Effective TLD status. - Effective TLD resolver (`Pdp\Rules::resolve` and `Pdp\TopLevelDomains::resolve`) no longer accept IDNA options. - `Rules::getICANNDomain`, `Rules::getPrivateDomain` will throw even if a `PublicSuffix` is found but does not belong to the correct PSL section. +- `Pdp\TopLevelDomains::resolve` acts like `Pdp\Rules::resolve` and only throw on `TypeError` ### Deprecated @@ -43,6 +46,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - `Pdp\Domain::isTransitionalDifferent` without replacement - `Pdp\PublicSuffix::createFromDomain` without replacement - Directly accessing public suffix information from the domain object +- `Pdp\TopLevelDomains::contains` without replacement ## 5.7.2 - 2020-10-25 diff --git a/README.md b/README.md index 9b3b2577..121a11db 100644 --- a/README.md +++ b/README.md @@ -51,9 +51,9 @@ resolve a domain against: - The [Public Suffix List](http://publicsuffix.org/) - The [IANA Root Zone Database](https://data.iana.org/TLD/tlds-alpha-by-domain.txt) -#### Resolving the Domain against the Public Suffix List +In both cases this is done using the generic `resolve` method. -Using the `Pdp\Rules` class you can resolve a domain as a `Pdp\ResolvedDomain` +Using the `Pdp\Rules` class you resolve your domain as a `Pdp\ResolvedDomain` object against the [Public Suffix List](http://publicsuffix.org/) as shown below: ~~~php @@ -71,8 +71,87 @@ echo $result->publicSuffix()->toString(); //display 'okinawa.jp'; $result->publicSuffix()->isICANN(); //returns true; ~~~ -In case of an error an exception which implements the `Pdp\CannotProcessHost` -is thrown. +Using the `Pdp\TopLevelDomains` class you resolve your domain as a +`Pdp\ResolvedDomain` object against +[IANA Root Zone Database](https://data.iana.org/TLD/tlds-alpha-by-domain.txt). + +~~~php +use Pdp\TopLevelDomains; + +$iana = TopLevelDomains::fromPath('/path/to/cache/tlds-alpha-by-domain.txt'); + +$result = $iana->resolve('www.PreF.OkiNawA.jP'); +echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; +echo $result->publicSuffix()->toString(); //display 'jp'; +echo $result->secondLevelDomain(); //display 'okinawa'; +echo $result->registrableDomain()->toString(); //display 'okinawa.jp'; +echo $result->subDomain()->toString(); //display 'www.pref'; +~~~ + +In case of an error an exception which extends `Pdp\CannotProcessHost` is thrown. + +`:resolve` will always return a `ResolvedDomain` even if the domain +syntax is invalid or no entry is found in the resource. To work around +this limitation, this library exposes more strict methods: + +- `Rules::getCookieDomain` +- `Rules::getICANNDomain` +- `Rules::getPrivateDomain` +and +- `TopLevelDomains::getTopLevelDomain` + +These methods act and resolve the domain against the PSL just like +the `resolve` method but will throw an exception if no valid effective +TLD is found in the respective PSL section or if the submitted domain +is invalid. + +~~~php +getICANNDomain('qfdsf.unknownTLD'); +// will throw because `.unknownTLD` is not part of the ICANN section + +$result = $rules->getCookieDomain('qfdsf.unknownTLD'); +$result->publicSuffix()->value(); // returns 'unknownTLD' +$result->publicSuffix()->isKnown(); // returns false +// will not throw because the domain syntax is correct. + +$rules->getCookieDomain('com'); +// will not throw because the domain syntax is invalid (ie: does not support public suffix) + +$result = $rules->resolve('com'); +$result->publicSuffix()->value(); // returns null +$result->publicSuffix()->isKnown(); // returns false +// will not throw but its public suffix value equal to NULL + +$topLevelDomains = TopLevelDomains::fromPath('/path/to/cache/public-suffix-list.dat'); +$topLevelDomains->getTopLevelDomain('com'); +// will not throw because the domain syntax is invalid (ie: does not support public suffix) + +~~~ + +**WARNING:** + +**You should never use resolve domain name this way in production, without, at +least, a caching mechanism to reduce PSL downloads.** + +**Using the Public Suffix List to determine what is a valid domain name and what +isn't is dangerous, particularly in these days when new gTLDs are arriving at a +rapid pace.** + +**If you are looking to know the validity of a Top Level Domain, the +IANA Root Zone Database is the proper source for this information or alternatively +consider using directly the DNS.** + +**If you must use this library for any of the above purposes, please consider +integrating an updating mechanism into your software.** + + +#### Dealing with the resolution result. You can modify the returned `Pdp\ResolvedDomain` instance using the following methods: @@ -95,11 +174,11 @@ echo $altResult->domain()->toString(); //display 'foo.bar.test.example'; $altResult->publicSuffix()->isKnown(); //returns false; ~~~ -The public suffix method `isKnown` will always return `false` if -your input is not a `PublicSuffix` object in which case the method may return -`true`. For more information, see the following section. +The value returned by `Pdp\PublicSuffix::isKnown` will depends if you use +a proper `Pdp\PublicSuffix` instance or not +with `ResolvedDomain::withPublicSuffix`, more information in the next section. -#### Public Suffix List Sections +#### Public Suffix statuses The [Public Suffix List](http://publicsuffix.org/) is organized in sections. This library can give you access to this information via its public suffix @@ -116,51 +195,18 @@ $publicSuffix = $rules->resolve('example.github.io')->publicSuffix(); echo $publicSuffix->domain()->toString(); //display 'github.io'; $publicSuffix->isICANN(); //will return false $publicSuffix->isPrivate(); //will return true +$publicSuffix->isIANA(); //will return false $publicSuffix->isKnown(); //will return true ~~~ The public suffix state depends on its value: -- `isKnown` returns `true` if the value is present in the PSL. - `isICANN` returns `true` if the value is present in the PSL ICANN section. - `isPrivate` returns `true` if the value is present in the PSL private section. - -If the value is not present in the PSL all the methods above will return `false`. - -`Rules::resolve` will always return a `ResolvedDomain` even if the domain -syntax is invalid or no entry was found in the desired section. To work around -the limitation of the official algorithm, this library exposes more strict -methods: - -- `Rules::getCookieDomain` -- `Rules::getICANNDomain` -- `Rules::getPrivateDomain` - -These methods act and resolve the domain against the PSL just like -the `resolve` method but will throw an exception if no valid effective -TLD is found in the respective PSL section or if the submitted domain -is invalid. - -~~~php -getICANNDomain('qfdsf.unknownTLD'); -// will throw because `.unknownTLD` is not part of the ICANN section - -$rules->getCookieDomain('qfdsf.unknownTLD'); -// will not throw because the domain syntax is correct. - -$rules->getCookieDomain('com'); -// will throw because no public suffix can be determined - -$rules->resolve('com'); -// will return a Nullable Resolved domain -~~~ +- `isKnown` returns `true` if the value was successfully resolved against an external resource. +- `isIANA` returns `true` if the value was successfully resolved against the Root Zone Database. - Last but not least it is possible to instantiate a PublicSuffix object +Last but not least it is possible to instantiate a PublicSuffix object using one of it's named constructor: ~~~php @@ -176,44 +222,6 @@ Using a `PublicSuffix` object instead of a string or `null` with `ResolvedDomain::withPublicSuffix` will ensure that the returned value will always contain the correct information regarding the public suffix resolution. -#### Resolving the Domain against the IANA Root Zone Database - -While the [Public Suffix List](http://publicsuffix.org/) is a community based -list, the package provides access to the Top Level domain information given by -the [IANA website](https://data.iana.org/TLD/tlds-alpha-by-domain.txt) to always -resolve top domain against all registered TLD even the new ones. - -~~~php -use Pdp\TopLevelDomains; - -$iana = TopLevelDomains::fromPath('/path/to/cache/tlds-alpha-by-domain.txt'); - -$result = $iana->resolve('www.PreF.OkiNawA.jP'); -echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; -echo $result->publicSuffix()->toString(); //display 'jp'; -echo $result->secondLevelDomain(); //display 'okinawa'; -echo $result->registrableDomain()->toString(); //display 'okinawa.jp'; -echo $result->subDomain()->toString(); //display 'www.pref'; -~~~ - -In case of an error an exception which extends `Pdp\CannotProcessHost` is thrown. - -**WARNING:** - -**You should never use resolve domain name this way in production, without, at -least, a caching mechanism to reduce PSL downloads.** - -**Using the Public Suffix List to determine what is a valid domain name and what -isn't is dangerous, particularly in these days when new gTLDs are arriving at a -rapid pace.** - -**If you are looking to know the validity of a Top Level Domain, the -IANA Root Zone Database is the proper source for this information or alternatively -consider using directly the DNS.** - -**If you must use this library for any of the above purposes, please consider -integrating an updating mechanism into your software.** - ### Accessing and processing Domain labels If you are interested into manipulating the domain labels without taking into diff --git a/UPGRADING.md b/UPGRADING.md index a6b425f8..dcb59e00 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -105,6 +105,8 @@ echo $domain->toString(); // display 'faß.de' - `TopLevelDomains::createFromPath` method is renamed `TopLevelDomains::fromPath`. - `Rules::createFromString` method is renamed `Rules::fromString`. - `TopLevelDomains::createFromString` method is renamed `TopLevelDomains::fromString`. +- `TopLevelDomains::getVersion` method is renamed `TopLevelDomains::version`. +- `TopLevelDomains::getModifiedDate` method is renamed `TopLevelDomains::lastUpdated`. #### Classes removed diff --git a/src/EffectiveTLD.php b/src/EffectiveTLD.php index 64bfc2f2..5d5e6a2a 100644 --- a/src/EffectiveTLD.php +++ b/src/EffectiveTLD.php @@ -10,6 +10,8 @@ interface EffectiveTLD extends Host, ExternalDomainName public const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; + public const IANA_DOMAINS = 'IANA_DOMAINS'; + /** * Tells whether the effective TLD has a matching rule in a Public Suffix List. */ @@ -24,4 +26,9 @@ public function isICANN(): bool; * Tells whether the effective TLD has a matching rule in a Public Suffix List Private Section. */ public function isPrivate(): bool; + + /** + * Tells whether the effective TLD has a matching rule in the IANA Root Zone Database. + */ + public function isIANA(): bool; } diff --git a/src/PublicSuffix.php b/src/PublicSuffix.php index f008d925..a43705d2 100644 --- a/src/PublicSuffix.php +++ b/src/PublicSuffix.php @@ -58,6 +58,14 @@ public static function fromPrivate($domain): self return new self($domain, self::PRIVATE_DOMAINS); } + /** + * @param mixed $domain the public suffix domain information + */ + public static function fromIANA($domain): self + { + return new self($domain, self::IANA_DOMAINS); + } + /** * @param mixed $domain the public suffix domain information */ @@ -106,6 +114,11 @@ public function isPrivate(): bool return self::PRIVATE_DOMAINS === $this->section; } + public function isIANA(): bool + { + return self::IANA_DOMAINS === $this->section; + } + public function toAscii(): self { $clone = clone $this; diff --git a/src/RootZoneDatabase.php b/src/RootZoneDatabase.php index ed955021..71f30226 100644 --- a/src/RootZoneDatabase.php +++ b/src/RootZoneDatabase.php @@ -14,12 +14,12 @@ interface RootZoneDatabase extends Countable, DomainResolver, IteratorAggregate, /** * Returns the Version ID. */ - public function getVersion(): string; + public function version(): string; /** * Returns the List Last Modified Date. */ - public function getModifiedDate(): DateTimeImmutable; + public function lastUpdated(): DateTimeImmutable; /** * {@inheritdoc} @@ -42,7 +42,10 @@ public function getIterator(); public function jsonSerialize(): array; /** - * Tells whether the submitted host is a valid Top Level Domain. + * Returns PSL info for a given domain against the PSL rules for ICANN domain detection. + * + * @throws SyntaxError if the domain is invalid + * @throws UnableToResolveDomain if the domain does not contain a IANA Effective TLD */ - public function contains(Host $tld): bool; + public function getTopLevelDomain(Host $host): ResolvedDomainName; } diff --git a/src/RootZoneDatabaseConverter.php b/src/RootZoneDatabaseConverter.php index cca5b335..c67e7e08 100644 --- a/src/RootZoneDatabaseConverter.php +++ b/src/RootZoneDatabaseConverter.php @@ -58,7 +58,7 @@ public function convert($content): array throw UnableToLoadRootZoneDatabase::dueToInvalidLine($line); } - if (isset($data['version'], $data['modifiedDate'], $data['records'])) { + if (isset($data['version'], $data['lastUpdated'], $data['records'])) { return $data; } @@ -81,7 +81,7 @@ private function extractHeader(string $content): array return [ 'version' => $matches['version'], - 'modifiedDate' => $date->format(DateTimeInterface::ATOM), + 'lastUpdated' => $date->format(DateTimeInterface::ATOM), ]; } diff --git a/src/RootZoneDatabaseConverterTest.php b/src/RootZoneDatabaseConverterTest.php index e9a8b229..44a2c630 100644 --- a/src/RootZoneDatabaseConverterTest.php +++ b/src/RootZoneDatabaseConverterTest.php @@ -28,7 +28,7 @@ public function testConverter(): void $res = $this->converter->convert($string); self::assertArrayHasKey('version', $res); - self::assertArrayHasKey('modifiedDate', $res); + self::assertArrayHasKey('lastUpdated', $res); self::assertArrayHasKey('records', $res); self::assertIsArray($res['records']); } @@ -48,7 +48,7 @@ public function __toString(): string $res = $this->converter->convert($stringObject); self::assertArrayHasKey('version', $res); - self::assertArrayHasKey('modifiedDate', $res); + self::assertArrayHasKey('lastUpdated', $res); self::assertArrayHasKey('records', $res); self::assertIsArray($res['records']); } diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index f063d847..97f43ec9 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -17,17 +17,17 @@ final class TopLevelDomains implements RootZoneDatabase { - private DateTimeImmutable $modifiedDate; + private DateTimeImmutable $lastUpdated; private string $version; private array $records; - private function __construct(array $records, string $version, DateTimeImmutable $modifiedDate) + private function __construct(array $records, string $version, DateTimeImmutable $lastUpdated) { $this->records = $records; $this->version = $version; - $this->modifiedDate = $modifiedDate; + $this->lastUpdated = $lastUpdated; } /** @@ -68,10 +68,10 @@ public static function fromString($content): self $converter = $converter ?? new RootZoneDatabaseConverter(); $data = $converter->convert($content); - /** @var DateTimeImmutable $modifiedDate */ - $modifiedDate = DateTimeImmutable::createFromFormat(DateTimeInterface::ATOM, $data['modifiedDate']); + /** @var DateTimeImmutable $lastUpdated */ + $lastUpdated = DateTimeImmutable::createFromFormat(DateTimeInterface::ATOM, $data['lastUpdated']); - return new self($data['records'], $data['version'], $modifiedDate); + return new self($data['records'], $data['version'], $lastUpdated); } public static function fromJsonString(string $jsonString): self @@ -82,29 +82,29 @@ public static function fromJsonString(string $jsonString): self throw UnableToLoadRootZoneDatabase::dueToInvalidJson($exception); } - if (!isset($data['records'], $data['version'], $data['modifiedDate'])) { + if (!isset($data['records'], $data['version'], $data['lastUpdated'])) { throw UnableToLoadRootZoneDatabase::dueToInvalidHashMap(); } - /** @var DateTimeImmutable $modifiedDate */ - $modifiedDate = DateTimeImmutable::createFromFormat(DateTimeInterface::ATOM, $data['modifiedDate']); + /** @var DateTimeImmutable $lastUpdated */ + $lastUpdated = DateTimeImmutable::createFromFormat(DateTimeInterface::ATOM, $data['lastUpdated']); - return new self($data['records'], $data['version'], $modifiedDate); + return new self($data['records'], $data['version'], $lastUpdated); } public static function __set_state(array $properties): RootZoneDatabase { - return new self($properties['records'], $properties['version'], $properties['modifiedDate']); + return new self($properties['records'], $properties['version'], $properties['lastUpdated']); } - public function getVersion(): string + public function version(): string { return $this->version; } - public function getModifiedDate(): DateTimeImmutable + public function lastUpdated(): DateTimeImmutable { - return $this->modifiedDate; + return $this->lastUpdated; } public function count(): int @@ -129,47 +129,33 @@ public function jsonSerialize(): array return [ 'version' => $this->version, 'records' => $this->records, - 'modifiedDate' => $this->modifiedDate->format(DateTimeInterface::ATOM), + 'lastUpdated' => $this->lastUpdated->format(DateTimeInterface::ATOM), ]; } /** - * @param mixed $tld a TLD in a type that can be converted into a DomainInterface instance + * @param mixed $host a type that supports instantiating a Domain from. */ - public function contains($tld): bool + public function resolve($host): ResolvedDomainName { - if ($tld instanceof ExternalDomainName) { - $tld = $tld->domain(); - } - - if (!$tld instanceof DomainName) { - try { - $tld = Domain::fromIDNA2008($tld); - } catch (CannotProcessHost $exception) { - return false; + try { + return $this->getTopLevelDomain($host); + } catch (UnableToResolveDomain $exception) { + $domain = $exception->fetchDomain(); + if (null !== $domain) { + return new ResolvedDomain($domain); } - } - if (1 !== count($tld)) { - return false; + return new ResolvedDomain(Domain::fromIDNA2008($host)); + } catch (SyntaxError $exception) { + return new ResolvedDomain(Domain::fromIDNA2008(null)); } - - /** @var DomainName $asciiDomain */ - $asciiDomain = $tld->toAscii(); - $label = $asciiDomain->label(0); - foreach ($this as $knownTld) { - if ($knownTld->value() === $label) { - return true; - } - } - - return false; } /** * @param mixed $domain a domain in a type that can be converted into a DomainInterface instance */ - public function resolve($domain): ResolvedDomainName + public function getTopLevelDomain($domain): ResolvedDomainName { if ($domain instanceof ExternalDomainName) { $domain = $domain->domain(); @@ -188,7 +174,7 @@ public function resolve($domain): ResolvedDomainName if ($tld->value() === $label) { $publicSuffix = $domain->isIdna2008() ? Domain::fromIDNA2008($tld) : Domain::fromIDNA2003($tld); - return new ResolvedDomain($domain, PublicSuffix::fromUnknown($publicSuffix)); + return new ResolvedDomain($domain, PublicSuffix::fromIANA($publicSuffix)); } } diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 0d71a087..04377daf 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -104,10 +104,10 @@ public function testGetterProperties(): void $topLevelDomains = TopLevelDomains::fromPath(dirname(__DIR__).'/test_data/root_zones.dat'); self::assertCount(15, $topLevelDomains); - self::assertSame('2018082200', $topLevelDomains->getVersion()); + self::assertSame('2018082200', $topLevelDomains->version()); self::assertEquals( new DateTimeImmutable('2018-08-22 07:07:01', new DateTimeZone('UTC')), - $topLevelDomains->getModifiedDate() + $topLevelDomains->lastUpdated() ); self::assertFalse($topLevelDomains->isEmpty()); @@ -161,25 +161,41 @@ public function __toString(): string ]; } - public function testResolveThrowsTypeError(): void + public function testTopLevelDomainThrowsTypeError(): void { self::expectException(TypeError::class); - $this->topLevelDomains->resolve(new DateTimeImmutable()); + $this->topLevelDomains->getTopLevelDomain(new DateTimeImmutable()); } - public function testResolveWithInvalidDomain(): void + public function testTopLevelDomainWithInvalidDomain(): void { self::expectException(SyntaxError::class); - $this->topLevelDomains->resolve('###'); + $this->topLevelDomains->getTopLevelDomain('###'); } - public function testResolveWithUnResolvableDomain(): void + public function testResolveWithInvalidDomain(): void + { + $result = $this->topLevelDomains->resolve('###'); + self::assertFalse($result->publicSuffix()->isIANA()); + self::assertNull($result->value()); + } + + public function testTopLevelDomainWithUnResolvableDomain(): void { self::expectException(UnableToResolveDomain::class); - $this->topLevelDomains->resolve('localhost'); + $this->topLevelDomains->getTopLevelDomain('localhost'); + } + + public function testResolveWithUnResolvableDomain(): void + { + $result = $this->topLevelDomains->resolve('localhost'); + + self::assertSame($result->toString(), 'localhost'); + self::assertNull($result->publicSuffix()->value()); + self::assertFalse($result->publicSuffix()->isIANA()); } public function testResolveWithUnregisteredTLD(): void @@ -206,16 +222,6 @@ public function testResolveWithIDNAOptions(): void self::assertFalse($resolved->domain()->isIdna2008()); } - /** - * @dataProvider validTldProvider - * - * @param mixed $tld the tld - */ - public function testContainsReturnsTrue($tld): void - { - self::assertTrue($this->topLevelDomains->contains($tld)); - } - public function validTldProvider(): iterable { return [ @@ -239,16 +245,6 @@ public function __toString(): string ]; } - /** - * @dataProvider invalidTldProvider - * - * @param mixed $tld the tld - */ - public function testContainsReturnsFalse($tld): void - { - self::assertFalse($this->topLevelDomains->contains($tld)); - } - public function invalidTldProvider(): iterable { return [ diff --git a/src/UnableToLoadRootZoneDatabase.php b/src/UnableToLoadRootZoneDatabase.php index 33d58122..5c49082b 100644 --- a/src/UnableToLoadRootZoneDatabase.php +++ b/src/UnableToLoadRootZoneDatabase.php @@ -11,7 +11,7 @@ final class UnableToLoadRootZoneDatabase extends InvalidArgumentException implem { public static function dueToInvalidHashMap(): self { - return new self('The decoded hashmap structure is missing at least one of the required properties: `records`, `version` and/or `modifiedDate`.'); + return new self('The decoded hashmap structure is missing at least one of the required properties: `records`, `version` and/or `lastUpdated`.'); } public static function dueToInvalidRootZoneDomain(string $content, Throwable $exception = null): self From f6aef3f8edfd1d440a12a249af69171dd53da8f3 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 26 Nov 2020 16:36:36 +0100 Subject: [PATCH 318/461] Improve DomainResolver implementation --- README.md | 27 ++++++++++---------- UPGRADING.md | 23 +++++++++++++++++ src/ResolvedDomain.php | 4 +-- src/Rules.php | 7 +----- src/TopLevelDomains.php | 47 ++++++++++++++++++++++++----------- src/TopLevelDomainsTest.php | 28 +++++++++++++++++++++ src/UnableToResolveDomain.php | 29 ++++++++++++++++++--- 7 files changed, 126 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 121a11db..66bf7af2 100644 --- a/README.md +++ b/README.md @@ -45,16 +45,17 @@ You need: ### Resolving Domains -To effectively resolve a domain you need a public source. This library can -resolve a domain against: +This library can resolve a domain against: - The [Public Suffix List](http://publicsuffix.org/) - The [IANA Root Zone Database](https://data.iana.org/TLD/tlds-alpha-by-domain.txt) -In both cases this is done using the generic `resolve` method. +In both cases this is done using the `resolve` method implemented on the resource +instance. The method returns a `Pdp\ResolvedDomain` object which represents the +result of that process. -Using the `Pdp\Rules` class you resolve your domain as a `Pdp\ResolvedDomain` -object against the [Public Suffix List](http://publicsuffix.org/) as shown below: +For the [Public Suffix List](http://publicsuffix.org/) you need to use the +`Pdp\Rules` class as shown below: ~~~php publicSuffix()->toString(); //display 'okinawa.jp'; $result->publicSuffix()->isICANN(); //returns true; ~~~ -Using the `Pdp\TopLevelDomains` class you resolve your domain as a -`Pdp\ResolvedDomain` object against -[IANA Root Zone Database](https://data.iana.org/TLD/tlds-alpha-by-domain.txt). +For the [IANA Root Zone Database](https://data.iana.org/TLD/tlds-alpha-by-domain.txt), +the `Pdp\TopLevelDomains` class is use instead: ~~~php use Pdp\TopLevelDomains; @@ -90,19 +90,21 @@ echo $result->subDomain()->toString(); //display 'www.pref'; In case of an error an exception which extends `Pdp\CannotProcessHost` is thrown. -`:resolve` will always return a `ResolvedDomain` even if the domain -syntax is invalid or no entry is found in the resource. To work around -this limitation, this library exposes more strict methods: +The `resolve` method will always return a `ResolvedDomain` even if the domain +syntax is invalid or no match is found in the resource data. +To work around this limitation, the library exposes more strict methods: - `Rules::getCookieDomain` - `Rules::getICANNDomain` - `Rules::getPrivateDomain` + and + - `TopLevelDomains::getTopLevelDomain` These methods act and resolve the domain against the PSL just like the `resolve` method but will throw an exception if no valid effective -TLD is found in the respective PSL section or if the submitted domain +TLD is found in the specified resource data or if the submitted domain is invalid. ~~~php @@ -131,7 +133,6 @@ $result->publicSuffix()->isKnown(); // returns false $topLevelDomains = TopLevelDomains::fromPath('/path/to/cache/public-suffix-list.dat'); $topLevelDomains->getTopLevelDomain('com'); // will not throw because the domain syntax is invalid (ie: does not support public suffix) - ~~~ **WARNING:** diff --git a/UPGRADING.md b/UPGRADING.md index dcb59e00..c53a1255 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -64,6 +64,29 @@ $result->registrableDomain(); //returns a ResolvedDomain object The `Domain` **no longer has access** to component information. +#### Normalizing domain resolution + +The `Pdp\Rules::resolve` and `Pdp\TopLevelDomains::resolve` domain resolution +rules are identical. They will alway returns a return even if the domain contains +a syntax error. + +**version 5** + +~~~php +/** @var TopLevelDomains $rules */ +$result = $rules->resolve('####'); +//throws an Exception +~~~ + +**version 6** + +~~~php +/** @var TopLevelDomains $rules */ +$result = $rules->resolve('####'); +//returns a ResolvedDomain object +~~~ + + #### Strict domain resolution **version 5** diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 8b72e507..d74c814a 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -71,12 +71,12 @@ private function setPublicSuffix(EffectiveTLD $publicSuffix = null): EffectiveTL $publicSuffix = $this->normalize($publicSuffix); if ($this->domain->value() === $publicSuffix->value()) { - throw new UnableToResolveDomain('The public suffix and the domain name are is identical `'.$this->domain->toString().'`.'); + throw UnableToResolveDomain::dueToIdenticalValue($this->domain); } $psContent = $publicSuffix->toString(); if ('.'.$psContent !== substr($this->domain->toString(), - strlen($psContent) - 1)) { - throw new UnableToResolveDomain('The public suffix `'.$psContent.'` can not be assign to the domain name `'.$this->domain->toString().'`'); + throw UnableToResolveDomain::dueToMismatchedPublicSuffix($this->domain, $publicSuffix); } return $publicSuffix; diff --git a/src/Rules.php b/src/Rules.php index 547ddf3e..fd0b40b2 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -104,12 +104,7 @@ public function resolve($host): ResolvedDomainName try { return $this->getCookieDomain($host); } catch (UnableToResolveDomain $exception) { - $domain = $exception->fetchDomain(); - if (null !== $domain) { - return new ResolvedDomain($domain); - } - - return new ResolvedDomain(Domain::fromIDNA2008($host)); + return new ResolvedDomain($exception->getDomain()); } catch (SyntaxError $exception) { return new ResolvedDomain(Domain::fromIDNA2008(null)); } diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 97f43ec9..fae0399c 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -139,29 +139,31 @@ public function jsonSerialize(): array public function resolve($host): ResolvedDomainName { try { - return $this->getTopLevelDomain($host); - } catch (UnableToResolveDomain $exception) { - $domain = $exception->fetchDomain(); - if (null !== $domain) { - return new ResolvedDomain($domain); - } + $domain = $this->validateDomain($host); - return new ResolvedDomain(Domain::fromIDNA2008($host)); + return new ResolvedDomain($domain, $this->fetchTopLevelDomain($domain)); + } catch (UnableToResolveDomain $exception) { + return new ResolvedDomain($exception->getDomain()); } catch (SyntaxError $exception) { return new ResolvedDomain(Domain::fromIDNA2008(null)); } } /** - * @param mixed $domain a domain in a type that can be converted into a DomainInterface instance + * Assert the domain is valid and is resolvable. + * + * @param mixed $domain a type that supports instantiating a Domain from. + * + * @throws SyntaxError If the domain is invalid + * @throws UnableToResolveDomain If the domain can not be resolved */ - public function getTopLevelDomain($domain): ResolvedDomainName + private function validateDomain($domain): DomainName { if ($domain instanceof ExternalDomainName) { $domain = $domain->domain(); } - if (!$domain instanceof DomainName) { + if (!($domain instanceof DomainName)) { $domain = Domain::fromIDNA2008($domain); } @@ -169,17 +171,34 @@ public function getTopLevelDomain($domain): ResolvedDomainName throw UnableToResolveDomain::dueToUnresolvableDomain($domain); } + return $domain; + } + + private function fetchTopLevelDomain(DomainName $domain): ?EffectiveTLD + { $label = $domain->toAscii()->label(0); foreach ($this as $tld) { if ($tld->value() === $label) { - $publicSuffix = $domain->isIdna2008() ? Domain::fromIDNA2008($tld) : Domain::fromIDNA2003($tld); + $publicSuffix = $domain->isIdna2008() ? Domain::fromIDNA2008($domain->label(0)) : Domain::fromIDNA2003($domain->label(0)); - return new ResolvedDomain($domain, PublicSuffix::fromIANA($publicSuffix)); + return PublicSuffix::fromIANA($publicSuffix); } } - $publicSuffix = $domain->isIdna2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); + return null; + } + + /** + * @param mixed $domain a domain in a type that can be converted into a DomainInterface instance + */ + public function getTopLevelDomain($domain): ResolvedDomainName + { + $domain = $this->validateDomain($domain); + $publicSuffix = $this->fetchTopLevelDomain($domain); + if (null === $publicSuffix) { + throw UnableToResolveDomain::dueToMissingPublicSuffix($domain, EffectiveTLD::IANA_DOMAINS); + } - return new ResolvedDomain($domain, PublicSuffix::fromUnknown($publicSuffix)); + return new ResolvedDomain($domain, PublicSuffix::fromIANA($publicSuffix)); } } diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 04377daf..fc0a6431 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -135,6 +135,19 @@ public function testResolve($tld): void ); } + /** + * @dataProvider validDomainProvider + * + * @param mixed $tld the tld + */ + public function testGetTopLevelDomain($tld): void + { + self::assertSame( + Domain::fromIDNA2008($tld)->label(0), + $this->topLevelDomains->getTopLevelDomain($tld)->publicSuffix()->value() + ); + } + public function validDomainProvider(): iterable { $resolvedDomain = new ResolvedDomain( @@ -198,6 +211,13 @@ public function testResolveWithUnResolvableDomain(): void self::assertFalse($result->publicSuffix()->isIANA()); } + public function testGetTopLevelDomainWithUnResolvableDomain(): void + { + self::expectException(UnableToResolveDomain::class); + + $this->topLevelDomains->getTopLevelDomain('localhost'); + } + public function testResolveWithUnregisteredTLD(): void { $collection = TopLevelDomains::fromPath(dirname(__DIR__).'/test_data/root_zones.dat'); @@ -205,6 +225,14 @@ public function testResolveWithUnregisteredTLD(): void self::assertNull($collection->resolve('localhost.locale')->publicSuffix()->value()); } + public function testGetTopLevelDomainWithUnregisteredTLD(): void + { + self::expectException(UnableToResolveDomain::class); + + $collection = TopLevelDomains::fromPath(dirname(__DIR__).'/test_data/root_zones.dat'); + $collection->getTopLevelDomain('localhost.locale'); + } + public function testResolveWithIDNAOptions(): void { $resolved = $this->topLevelDomains->resolve('foo.de'); diff --git a/src/UnableToResolveDomain.php b/src/UnableToResolveDomain.php index 9cebdcb4..719bea1a 100644 --- a/src/UnableToResolveDomain.php +++ b/src/UnableToResolveDomain.php @@ -8,12 +8,33 @@ final class UnableToResolveDomain extends InvalidArgumentException implements CannotProcessHost { - private ?DomainName $domain = null; + private const DOMAIN_CONVERTER = [ + EffectiveTLD::ICANN_DOMAINS => 'ICANN', + EffectiveTLD::PRIVATE_DOMAINS => 'private', + EffectiveTLD::IANA_DOMAINS => 'IANA', + ]; - public static function dueToMissingPublicSuffix(DomainName $domain, string $type): self + private DomainName $domain; + + public static function dueToIdenticalValue(DomainName $domain): self + { + $exception = new self('The public suffix and the domain name are is identical `'.$domain->toString().'`.'); + $exception->domain = $domain; + + return $exception; + } + + public static function dueToMismatchedPublicSuffix(DomainName $domain, EffectiveTLD $effectiveTLD): self { - $domainType = (EffectiveTLD::PRIVATE_DOMAINS === $type) ? 'private' : 'ICANN'; + $exception = new self('The public suffix `'.$effectiveTLD->value().'` can not be assign to the domain name `'.$domain->toString().'`'); + $exception->domain = $domain; + return $exception; + } + + public static function dueToMissingPublicSuffix(DomainName $domain, string $type): self + { + $domainType = self::DOMAIN_CONVERTER[$type] ?? 'unsupported'; $exception = new self('The domain "'.$domain->value().'" does not contain a "'.$domainType.'" TLD.'); $exception->domain = $domain; @@ -36,7 +57,7 @@ public static function dueToMissingRegistrableDomain(DomainName $domain): self return $exception; } - public function fetchDomain(): ?DomainName + public function getDomain(): DomainName { return $this->domain; } From 7c7cdec8e7f8702e09ea8b384d11f5b077514d01 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 26 Nov 2020 18:12:29 +0100 Subject: [PATCH 319/461] improve documentation index --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 66bf7af2..6283e4ad 100644 --- a/README.md +++ b/README.md @@ -152,7 +152,7 @@ consider using directly the DNS.** integrating an updating mechanism into your software.** -#### Dealing with the resolution result. +### Dealing with the resolution result. You can modify the returned `Pdp\ResolvedDomain` instance using the following methods: @@ -179,7 +179,7 @@ The value returned by `Pdp\PublicSuffix::isKnown` will depends if you use a proper `Pdp\PublicSuffix` instance or not with `ResolvedDomain::withPublicSuffix`, more information in the next section. -#### Public Suffix statuses +### Public Suffix The [Public Suffix List](http://publicsuffix.org/) is organized in sections. This library can give you access to this information via its public suffix @@ -363,7 +363,7 @@ string or an object that can be cast to a string to avoid unexpected format conversion errors/results. By default, and with lack of information conversion is done using IDNA 2008 rules.** -## Managing the package external resources +### Managing the package external resources Depending on your application, the mechanism to store your resources may differ, nevertheless, the library comes bundle with a **optional service** which @@ -378,7 +378,7 @@ The `Pdp\Storage\PsrStorageFactory` enables returning storage instances that retrieve, convert and cache the Public Suffix List and the IANA Root Zone Database using standard interfaces published by the PHP-FIG. -### Instantiate `Pdp\Storage\PsrStorageFactory` +#### Instantiate `Pdp\Storage\PsrStorageFactory` To work as intended, the `Pdp\Storage\PsrStorageFactory` constructor requires: From 7f14d913d5170eef11f600a4e103a823f3fc831c Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 26 Nov 2020 18:19:24 +0100 Subject: [PATCH 320/461] Rename internal methods --- src/Rules.php | 15 +++++++-------- src/TopLevelDomains.php | 6 +++--- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/Rules.php b/src/Rules.php index fd0b40b2..ca8cba86 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -116,9 +116,8 @@ public function resolve($host): ResolvedDomainName public function getCookieDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); - $publicSuffix = $this->getPublicSuffix($domain, ''); - return new ResolvedDomain($domain, $publicSuffix); + return new ResolvedDomain($domain, $this->getEffectiveTLD($domain, '')); } /** @@ -127,7 +126,7 @@ public function getCookieDomain($host): ResolvedDomainName public function getICANNDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); - $publicSuffix = $this->getPublicSuffix($domain, EffectiveTLD::ICANN_DOMAINS); + $publicSuffix = $this->getEffectiveTLD($domain, EffectiveTLD::ICANN_DOMAINS); if (!$publicSuffix->isICANN()) { throw UnableToResolveDomain::dueToMissingPublicSuffix($domain, EffectiveTLD::ICANN_DOMAINS); } @@ -141,7 +140,7 @@ public function getICANNDomain($host): ResolvedDomainName public function getPrivateDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); - $publicSuffix = $this->getPublicSuffix($domain, EffectiveTLD::PRIVATE_DOMAINS); + $publicSuffix = $this->getEffectiveTLD($domain, EffectiveTLD::PRIVATE_DOMAINS); if (!$publicSuffix->isPrivate()) { throw UnableToResolveDomain::dueToMissingPublicSuffix($domain, EffectiveTLD::PRIVATE_DOMAINS); } @@ -177,14 +176,14 @@ private function validateDomain($domain): DomainName /** * Returns the matched public suffix. */ - private function getPublicSuffix(DomainName $domain, string $section): EffectiveTLD + private function getEffectiveTLD(DomainName $domain, string $section): EffectiveTLD { - $icann = $this->getPublicSuffixFromSection($domain, EffectiveTLD::ICANN_DOMAINS); + $icann = $this->getEffectiveTLDFromSection($domain, EffectiveTLD::ICANN_DOMAINS); if (EffectiveTLD::ICANN_DOMAINS === $section) { return $icann; } - $private = $this->getPublicSuffixFromSection($domain, EffectiveTLD::PRIVATE_DOMAINS); + $private = $this->getEffectiveTLDFromSection($domain, EffectiveTLD::PRIVATE_DOMAINS); if (count($private) > count($icann)) { return $private; } @@ -202,7 +201,7 @@ private function getPublicSuffix(DomainName $domain, string $section): Effective /** * Returns the public suffix matched against a given PSL section. */ - private function getPublicSuffixFromSection(DomainName $domain, string $section): EffectiveTLD + private function getEffectiveTLDFromSection(DomainName $domain, string $section): EffectiveTLD { $rules = $this->rules[$section]; $matches = []; diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index fae0399c..b5c9fcd4 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -141,7 +141,7 @@ public function resolve($host): ResolvedDomainName try { $domain = $this->validateDomain($host); - return new ResolvedDomain($domain, $this->fetchTopLevelDomain($domain)); + return new ResolvedDomain($domain, $this->fetchEffectiveTLD($domain)); } catch (UnableToResolveDomain $exception) { return new ResolvedDomain($exception->getDomain()); } catch (SyntaxError $exception) { @@ -174,7 +174,7 @@ private function validateDomain($domain): DomainName return $domain; } - private function fetchTopLevelDomain(DomainName $domain): ?EffectiveTLD + private function fetchEffectiveTLD(DomainName $domain): ?EffectiveTLD { $label = $domain->toAscii()->label(0); foreach ($this as $tld) { @@ -194,7 +194,7 @@ private function fetchTopLevelDomain(DomainName $domain): ?EffectiveTLD public function getTopLevelDomain($domain): ResolvedDomainName { $domain = $this->validateDomain($domain); - $publicSuffix = $this->fetchTopLevelDomain($domain); + $publicSuffix = $this->fetchEffectiveTLD($domain); if (null === $publicSuffix) { throw UnableToResolveDomain::dueToMissingPublicSuffix($domain, EffectiveTLD::IANA_DOMAINS); } From fb4ad00a32c505c4490bc4555e5e2a3a78de3a55 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 26 Nov 2020 18:51:13 +0100 Subject: [PATCH 321/461] Update external constant names --- README.md | 80 ++++++++++++++++++-------------- src/Storage/RemoteStorageURL.php | 4 +- 2 files changed, 48 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index 6283e4ad..3c160bd5 100644 --- a/README.md +++ b/README.md @@ -61,9 +61,9 @@ For the [Public Suffix List](http://publicsuffix.org/) you need to use the resolve('www.PreF.OkiNawA.jP'); +$result = $publicSuffixList->resolve('www.PreF.OkiNawA.jP'); echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; echo $result->subDomain()->toString(); //display 'www'; echo $result->secondLevelDomain(); //display 'pref'; @@ -78,9 +78,9 @@ the `Pdp\TopLevelDomains` class is use instead: ~~~php use Pdp\TopLevelDomains; -$iana = TopLevelDomains::fromPath('/path/to/cache/tlds-alpha-by-domain.txt'); +$rootZoneDatabase = TopLevelDomains::fromPath('/path/to/cache/tlds-alpha-by-domain.txt'); -$result = $iana->resolve('www.PreF.OkiNawA.jP'); +$result = $rootZoneDatabase->resolve('www.PreF.OkiNawA.jP'); echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; echo $result->publicSuffix()->toString(); //display 'jp'; echo $result->secondLevelDomain(); //display 'okinawa'; @@ -112,26 +112,26 @@ is invalid. use Pdp\Rules; use Pdp\TopLevelDomains; -$rules = Rules::fromPath('/path/to/cache/public-suffix-list.dat'); +$publicSuffixList = Rules::fromPath('/path/to/cache/public-suffix-list.dat'); -$rules->getICANNDomain('qfdsf.unknownTLD'); +$publicSuffixList->getICANNDomain('qfdsf.unknownTLD'); // will throw because `.unknownTLD` is not part of the ICANN section -$result = $rules->getCookieDomain('qfdsf.unknownTLD'); +$result = $publicSuffixList->getCookieDomain('qfdsf.unknownTLD'); $result->publicSuffix()->value(); // returns 'unknownTLD' $result->publicSuffix()->isKnown(); // returns false // will not throw because the domain syntax is correct. -$rules->getCookieDomain('com'); +$publicSuffixList->getCookieDomain('com'); // will not throw because the domain syntax is invalid (ie: does not support public suffix) -$result = $rules->resolve('com'); +$result = $publicSuffixList->resolve('com'); $result->publicSuffix()->value(); // returns null $result->publicSuffix()->isKnown(); // returns false // will not throw but its public suffix value equal to NULL -$topLevelDomains = TopLevelDomains::fromPath('/path/to/cache/public-suffix-list.dat'); -$topLevelDomains->getTopLevelDomain('com'); +$rootZoneDatabase = TopLevelDomains::fromPath('/path/to/cache/public-suffix-list.dat'); +$rootZoneDatabase->getTopLevelDomain('com'); // will not throw because the domain syntax is invalid (ie: does not support public suffix) ~~~ @@ -160,9 +160,9 @@ You can modify the returned `Pdp\ResolvedDomain` instance using the following me resolve('shop.example.com'); +$result = $publicSuffixList->resolve('shop.example.com'); $altResult = $result ->withSubDomain('foo.bar') ->withSecondLevelDomain('test') @@ -189,9 +189,9 @@ object. resolve('example.github.io')->publicSuffix(); +$publicSuffix = $publicSuffixList->resolve('example.github.io')->publicSuffix(); echo $publicSuffix->domain()->toString(); //display 'github.io'; $publicSuffix->isICANN(); //will return false @@ -238,9 +238,9 @@ manipulating domain labels. You can access the object using the following method ~~~php resolve('www.bbc.co.uk'); -$domain = $rules->resolve('www.bbc.co.uk')->domain(); +/** @var Rules $publicSuffixList */ +$result = $publicSuffixList->resolve('www.bbc.co.uk'); +$domain = $result->domain(); echo $domain->toString(); // display 'www.bbc.co.uk' count($domain); // returns 4 $domain->labels(); // returns ['uk', 'co', 'bbc', 'www']; @@ -265,8 +265,8 @@ following methods: ~~~php resolve('www.ExAmpLE.cOM')->domain(); +/** @var Rules $publicSuffixList */ +$domain = $publicSuffixList->resolve('www.ExAmpLE.cOM')->domain(); $newDomain = $domain ->withLabel(1, 'com') //replace 'example' by 'com' @@ -306,11 +306,11 @@ IDNA Compatibility Processing. Domain objects expose a `toAscii` and a `toUnicode` methods which returns a new instance in the converted format. ~~~php -/** @var Rules $rules */ -$unicodeDomain = $rules->resolve('bébé.be')->domain(); +/** @var Rules $publicSuffixList */ +$unicodeDomain = $publicSuffixList->resolve('bébé.be')->domain(); echo $unicodeDomain->toString(); // returns 'bébé.be' -$asciiDomain = $rules->resolve('xn--bb-bjab.be')->domain(); +$asciiDomain = $publicSuffixList->resolve('xn--bb-bjab.be')->domain(); echo $asciiDomain->toString(); // returns 'xn--bb-bjab.be' $asciiDomain->toUnicode()->toString() === $unicodeDomain->toString(); //returns true @@ -409,19 +409,22 @@ find robust and battle tested implementations on packagist. For the purpose of this example we will use our PSR powered solution with: -- *Symfony HTTP Client* as our PSR-18 HTTP client; -- *nyholm/psr7* which provide factories to create a PSR-7 objects; -- *Symfony Cache Component* as our PSR-16 cache implementation; +- *Guzzle HTTP Client* as our PSR-18 HTTP client; +- *Guzzle PSR-7 package* which provide factories to create a PSR-7 objects using PSR-17 interfaces; +- *Symfony Cache Component* as our PSR-16 cache implementation provider; We will cache both external sources for 24 hours in a PostgreSQL database. -You are free to use other libraries/solutions as long as they implement the required PSR interfaces. +You are free to use other libraries/solutions/settings as long as they +implement the required PSR interfaces. ~~~php PDO::ERRMODE_EXCEPTION] ); $cache = new Psr16Cache(new PdoAdapter($pdo, 'pdp', 43200)); -$client = new Psr18Client(); +$client = new GuzzleHttp\Client(); +$requestFactory = new class implements RequestFactoryInterface { + public function createRequest(string $method, $uri): RequestInterface + { + return new Request($method, $uri); + } +}; + $cachePrefix = 'pdp_'; $cacheTtl = new DateInterval('P1D'); -$factory = new PsrStorageFactory($cache, $client, $client); +$factory = new PsrStorageFactory($cache, $client, $requestFactory); $pslStorage = $factory->createPublicSuffixListStorage($cachePrefix, $cacheTtl); $rzdStorage = $factory->createRootZoneDatabaseStorage($cachePrefix, $cacheTtl); // if you need to force refreshing the rules // before calling them (to use in a refresh script) -// $pslStorage->delete(PsrStorageFactory::URL_PSL); -$rules = $pslStorage->get(PsrStorageFactory::URL_PSL); +// uncomment this part or adapt it to you script logic +// $pslStorage->delete(PsrStorageFactory::PUBLIC_SUFFIX_LIST_URI); +$publicSuffixList = $pslStorage->get(PsrStorageFactory::PUBLIC_SUFFIX_LIST_URI); // if you need to force refreshing the rules // before calling them (to use in a refresh script) -// $rzdStorage->delete(PsrStorageFactory::URL_RZD); -$tldDomains = $rzdStorage->get(PsrStorageFactory::URL_RZD); +// uncomment this part or adapt it to you script logic +// $rzdStorage->delete(PsrStorageFactory::ROOT_ZONE_DATABASE_URI); +$rootZoneDatabase = $rzdStorage->get(PsrStorageFactory::ROOT_ZONE_DATABASE_URI); ~~~ **Be sure to adapt the following code to your own application. diff --git a/src/Storage/RemoteStorageURL.php b/src/Storage/RemoteStorageURL.php index adeb5eca..163c55a6 100644 --- a/src/Storage/RemoteStorageURL.php +++ b/src/Storage/RemoteStorageURL.php @@ -6,7 +6,7 @@ interface RemoteStorageURL { - public const URL_PSL = 'https://publicsuffix.org/list/public_suffix_list.dat'; + public const PUBLIC_SUFFIX_LIST_URI = 'https://publicsuffix.org/list/public_suffix_list.dat'; - public const URL_RZD = 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt'; + public const ROOT_ZONE_DATABASE_URI = 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt'; } From 60cee22281bc800faa9c0f8430596a82b0b6f0a5 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Fri, 27 Nov 2020 07:11:09 +0100 Subject: [PATCH 322/461] Improve documentation --- README.md | 74 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 51 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 3c160bd5..97225b77 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ echo $result->subDomain()->toString(); //display 'www'; echo $result->secondLevelDomain(); //display 'pref'; echo $result->registrableDomain()->toString(); //display 'pref.okinawa.jp'; echo $result->publicSuffix()->toString(); //display 'okinawa.jp'; -$result->publicSuffix()->isICANN(); //returns true; +$result->publicSuffix()->isICANN(); //return true; ~~~ For the [IANA Root Zone Database](https://data.iana.org/TLD/tlds-alpha-by-domain.txt), @@ -86,26 +86,28 @@ echo $result->publicSuffix()->toString(); //display 'jp'; echo $result->secondLevelDomain(); //display 'okinawa'; echo $result->registrableDomain()->toString(); //display 'okinawa.jp'; echo $result->subDomain()->toString(); //display 'www.pref'; +echo $result->publicSuffix()->isIANA(); //return true ~~~ In case of an error an exception which extends `Pdp\CannotProcessHost` is thrown. The `resolve` method will always return a `ResolvedDomain` even if the domain -syntax is invalid or no match is found in the resource data. -To work around this limitation, the library exposes more strict methods: +syntax is invalid or if there is no match found in the resource data. +To work around this limitation, the library exposes more strict methods, +namely: - `Rules::getCookieDomain` - `Rules::getICANNDomain` - `Rules::getPrivateDomain` -and +for the Public Suffix List and the following method for the Root Zone +Database: - `TopLevelDomains::getTopLevelDomain` -These methods act and resolve the domain against the PSL just like -the `resolve` method but will throw an exception if no valid effective -TLD is found in the specified resource data or if the submitted domain -is invalid. +These methods resolve the domain against their respective data source using +the same rules as the `resolve` method but will instead throw an exception +if no valid effective TLD is found or if the submitted domain is invalid. ~~~php resolve('www.PreF.OkiNawA.jP'); +echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; +echo $result->publicSuffix()->toString(); //display 'jp'; +echo $result->secondLevelDomain(); //display 'okinawa'; +echo $result->registrableDomain()->toString(); //display 'okinawa.jp'; +echo $result->subDomain()->toString(); //display 'www.pref'; +echo $result->publicSuffix()->isIANA(); //return true +~~~ + You can modify the returned `Pdp\ResolvedDomain` instance using the following methods: ~~~php @@ -175,22 +198,22 @@ echo $altResult->domain()->toString(); //display 'foo.bar.test.example'; $altResult->publicSuffix()->isKnown(); //returns false; ~~~ -The value returned by `Pdp\PublicSuffix::isKnown` will depends if you use -a proper `Pdp\PublicSuffix` instance or not -with `ResolvedDomain::withPublicSuffix`, more information in the next section. +**TIP: Always favor submitting a `Pdp\PublicSuffix` object rather that any other +supported type to avoid unexpected results. By default, if the input is not a +`Pdp\PublicSuffix` instance, the resulting public suffix will be labelled as +being unknown. For more information go to the [Public Suffix section](#public-suffix)** ### Public Suffix -The [Public Suffix List](http://publicsuffix.org/) is organized in sections. -This library can give you access to this information via its public suffix -object. +The domain effective TLD is represented using the `Pdp\PublicSuffix`. Depending + on the data source the object exposes different information regarding its +origin. ~~~php resolve('example.github.io')->publicSuffix(); echo $publicSuffix->domain()->toString(); //display 'github.io'; @@ -200,20 +223,21 @@ $publicSuffix->isIANA(); //will return false $publicSuffix->isKnown(); //will return true ~~~ -The public suffix state depends on its value: +The public suffix state depends on its origin: +- `isKnown` returns `true` if the value is present in the data resource. +- `isIANA` returns `true` if the value is present in the Root Zone Database. - `isICANN` returns `true` if the value is present in the PSL ICANN section. - `isPrivate` returns `true` if the value is present in the PSL private section. -- `isKnown` returns `true` if the value was successfully resolved against an external resource. -- `isIANA` returns `true` if the value was successfully resolved against the Root Zone Database. -Last but not least it is possible to instantiate a PublicSuffix object - using one of it's named constructor: +The same information is used when `Pdp\PublicSuffix` object is +instantiate via its named constructors: ~~~php Date: Fri, 27 Nov 2020 07:20:46 +0100 Subject: [PATCH 323/461] Improve documentation --- README.md | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 97225b77..31f144ab 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,17 @@ $rootZoneDatabase->getTopLevelDomain('com'); // will not throw because the domain syntax is invalid (ie: does not support public suffix) ~~~ +To instantiate each domain resolver you can use the following named constructor: + +- `fromString`: instantiate the resolver from a inline string representing the data source; +- `fromJsonString`: instantiate the resolver from a json string representing the data source; +- `fromPath`: instantiate the resolver from a local path or online URL by relying on `fopen`; + +**If the instantiation does not work an exception will be thrown.** + +Once instantiated, you can always convert the data source in a Json Encoded friendly schema +if needed. + **WARNING:** **You should never use resolve domain name this way in production, without, at @@ -155,7 +166,6 @@ integrating an updating mechanism into your software.** **For more information go to the [Managing external data source section](#managing-the-package-external-resources)** - ### Resolved domain information. Whichever methods chosen to resolve the domain on success, the package will @@ -181,10 +191,10 @@ You can modify the returned `Pdp\ResolvedDomain` instance using the following me ~~~php resolve('shop.example.com'); $altResult = $result ->withSubDomain('foo.bar') @@ -266,7 +276,9 @@ manipulating domain labels. You can access the object using the following method ~~~php resolve('www.bbc.co.uk'); $domain = $result->domain(); echo $domain->toString(); // display 'www.bbc.co.uk' @@ -292,8 +304,9 @@ following methods: ~~~php resolve('www.ExAmpLE.cOM')->domain(); $newDomain = $domain @@ -334,7 +347,10 @@ IDNA Compatibility Processing. Domain objects expose a `toAscii` and a `toUnicode` methods which returns a new instance in the converted format. ~~~php -/** @var Rules $publicSuffixList */ +resolve('bébé.be')->domain(); echo $unicodeDomain->toString(); // returns 'bébé.be' From df88f6f35ab0924638366eebb03ef0e5b7f25fdd Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Fri, 27 Nov 2020 07:32:28 +0100 Subject: [PATCH 324/461] renamed RootZoneDatabase::getTopLevelDomain to RootZoneDatabase::getIANADomain --- README.md | 4 ++-- src/DomainResolver.php | 2 +- src/RootZoneDatabase.php | 2 +- src/TopLevelDomains.php | 2 +- src/TopLevelDomainsTest.php | 12 ++++++------ 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 31f144ab..79633f78 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ namely: for the Public Suffix List and the following method for the Root Zone Database: -- `TopLevelDomains::getTopLevelDomain` +- `TopLevelDomains::getIANADomain` These methods resolve the domain against their respective data source using the same rules as the `resolve` method but will instead throw an exception @@ -133,7 +133,7 @@ $result->publicSuffix()->isKnown(); // returns false // will not throw but its public suffix value equal to NULL $rootZoneDatabase = TopLevelDomains::fromPath('/path/to/cache/public-suffix-list.dat'); -$rootZoneDatabase->getTopLevelDomain('com'); +$rootZoneDatabase->getIANADomain('com'); // will not throw because the domain syntax is invalid (ie: does not support public suffix) ~~~ diff --git a/src/DomainResolver.php b/src/DomainResolver.php index a03dc616..0a000823 100644 --- a/src/DomainResolver.php +++ b/src/DomainResolver.php @@ -7,7 +7,7 @@ interface DomainResolver { /** - * Returns PSL info for a given domain. + * Returns the effective TLD info for a given domain against an external data source. * * If the effective TLD can not be resolved it returns a ResolvedDomainName with a null public suffix * If the host is not a valid domain it returns a ResolvedDomainName with a null Domain name diff --git a/src/RootZoneDatabase.php b/src/RootZoneDatabase.php index 71f30226..781052b2 100644 --- a/src/RootZoneDatabase.php +++ b/src/RootZoneDatabase.php @@ -47,5 +47,5 @@ public function jsonSerialize(): array; * @throws SyntaxError if the domain is invalid * @throws UnableToResolveDomain if the domain does not contain a IANA Effective TLD */ - public function getTopLevelDomain(Host $host): ResolvedDomainName; + public function getIANADomain(Host $host): ResolvedDomainName; } diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index b5c9fcd4..26dcce72 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -191,7 +191,7 @@ private function fetchEffectiveTLD(DomainName $domain): ?EffectiveTLD /** * @param mixed $domain a domain in a type that can be converted into a DomainInterface instance */ - public function getTopLevelDomain($domain): ResolvedDomainName + public function getIANADomain($domain): ResolvedDomainName { $domain = $this->validateDomain($domain); $publicSuffix = $this->fetchEffectiveTLD($domain); diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index fc0a6431..5ae81405 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -144,7 +144,7 @@ public function testGetTopLevelDomain($tld): void { self::assertSame( Domain::fromIDNA2008($tld)->label(0), - $this->topLevelDomains->getTopLevelDomain($tld)->publicSuffix()->value() + $this->topLevelDomains->getIANADomain($tld)->publicSuffix()->value() ); } @@ -178,14 +178,14 @@ public function testTopLevelDomainThrowsTypeError(): void { self::expectException(TypeError::class); - $this->topLevelDomains->getTopLevelDomain(new DateTimeImmutable()); + $this->topLevelDomains->getIANADomain(new DateTimeImmutable()); } public function testTopLevelDomainWithInvalidDomain(): void { self::expectException(SyntaxError::class); - $this->topLevelDomains->getTopLevelDomain('###'); + $this->topLevelDomains->getIANADomain('###'); } public function testResolveWithInvalidDomain(): void @@ -199,7 +199,7 @@ public function testTopLevelDomainWithUnResolvableDomain(): void { self::expectException(UnableToResolveDomain::class); - $this->topLevelDomains->getTopLevelDomain('localhost'); + $this->topLevelDomains->getIANADomain('localhost'); } public function testResolveWithUnResolvableDomain(): void @@ -215,7 +215,7 @@ public function testGetTopLevelDomainWithUnResolvableDomain(): void { self::expectException(UnableToResolveDomain::class); - $this->topLevelDomains->getTopLevelDomain('localhost'); + $this->topLevelDomains->getIANADomain('localhost'); } public function testResolveWithUnregisteredTLD(): void @@ -230,7 +230,7 @@ public function testGetTopLevelDomainWithUnregisteredTLD(): void self::expectException(UnableToResolveDomain::class); $collection = TopLevelDomains::fromPath(dirname(__DIR__).'/test_data/root_zones.dat'); - $collection->getTopLevelDomain('localhost.locale'); + $collection->getIANADomain('localhost.locale'); } public function testResolveWithIDNAOptions(): void From b3c6aa4a64f2c1368b17d485af0f2531a4cbc02c Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Fri, 27 Nov 2020 07:35:12 +0100 Subject: [PATCH 325/461] Adding missing returned type --- src/RootZoneDatabase.php | 3 ++- src/TopLevelDomains.php | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/RootZoneDatabase.php b/src/RootZoneDatabase.php index 781052b2..f5dafbf2 100644 --- a/src/RootZoneDatabase.php +++ b/src/RootZoneDatabase.php @@ -6,6 +6,7 @@ use Countable; use DateTimeImmutable; +use Iterator; use IteratorAggregate; use JsonSerializable; @@ -34,7 +35,7 @@ public function isEmpty(): bool; /** * {@inheritdoc} */ - public function getIterator(); + public function getIterator(): Iterator; /** * Returns an array representation of the list. diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 26dcce72..e440a61f 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -6,6 +6,7 @@ use DateTimeImmutable; use DateTimeInterface; +use Iterator; use JsonException; use function count; use function fclose; @@ -117,7 +118,10 @@ public function isEmpty(): bool return [] === $this->records; } - public function getIterator() + /** + * @return Iterator + */ + public function getIterator(): Iterator { foreach ($this->records as $tld) { yield PublicSuffix::fromUnknown(Domain::fromIDNA2008($tld)->toAscii()); From fea0001db10b98b26c5ab5fedbab5372b9a3e881 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Fri, 27 Nov 2020 07:39:35 +0100 Subject: [PATCH 326/461] Update changelogclear --- CHANGELOG.md | 2 +- README.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8f3cfa7..81cafccd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - Added `IntlIdna`, IDN support has been completely revamped - Resolver uses by default UTS#46 IDNA2008 algorithm to convert domain names - Storage capability is optional and can be based on PHP-FIG related interfaces to improve interoperability -- `Pdp\TopLevelDomains::getTopLevelDomain` which throws on syntax error and if no effective TLD is found. +- `Pdp\TopLevelDomains::getIANADomain` which throws on syntax error and if no effective TLD is found (behave like `Pdp\TopLevelDomains::resolve` in v5). - `Pdp\PublicSuffix::isIANA` tells whether the TLD was successfully resolved against IANA RZD ### Fixed diff --git a/README.md b/README.md index 79633f78..e41169e4 100644 --- a/README.md +++ b/README.md @@ -145,8 +145,8 @@ To instantiate each domain resolver you can use the following named constructor: **If the instantiation does not work an exception will be thrown.** -Once instantiated, you can always convert the data source in a Json Encoded friendly schema -if needed. +Once instantiated, you can always convert the data source in a json encoded string as both +resolver exposes the `JsonSerialize` method. **WARNING:** From caee1e39bdd1ed7fc7048d1a974f0b3f8118a804 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 29 Nov 2020 12:12:26 +0100 Subject: [PATCH 327/461] Improve upgrading documentation --- UPGRADING.md | 117 +++++++++++++++++++++++---------------------------- 1 file changed, 53 insertions(+), 64 deletions(-) diff --git a/UPGRADING.md b/UPGRADING.md index c53a1255..f660eaec 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -13,19 +13,12 @@ PHP version is now **PHP 7.4**. Domains resolution is done using the `IDNA2008` algorithm by default, in v5, by default, it is done `IDNA2003` instead. -**version 5** - -~~~php -/** @var Rules $rules */ -echo $rules->resolve('faß.de'); // returns 'fass.de' -~~~ - -**version 6** - -~~~php +```diff +resolve('faß.de')->toString(); // returns 'faß.de' -~~~ +- echo $rules->resolve('faß.de')->__toString(); //returns 'fass.de' ++ echo $rules->resolve('faß.de')->toString(); //returns 'faß.de' +``` #### Domain resolution @@ -34,33 +27,31 @@ The `Pdp\Rules::resolve` and `Pdp\TopLevelDomains::resolve` returns a object no longer exposes the components from resolution, this is done by the new `ResolvedDomain` object instead. -**version 5** - -~~~php +```diff +resolve('www.example.com'); -$domain->getDomain(); //returns a string or null and was deprecated -$domain->getPublicSuffix(); //returns a string or null -$domain->getSubDomain(); //returns a string or null -$domain->getRegistrableDomain(); //returns a string or null -$domain->isICANN(); //returns a boolean -$domain->isPrivate(); //returns a boolean -$domain->isKnown(); //returns a boolean -~~~ +- $rules->resolve('faß.de')->labels(); //returns ['de', 'fass'] ++ $rules->resolve('faß.de')->domain()->labels(); //returns [ 'de', 'faß'] +``` -**version 6** +Public suffix properties are not longer **directly** accessible on the +returned object. + +```diff +resolve('faß.de')->isICANN(); //returns true ++ $rules->resolve('faß.de')->publicSuffix()->isICANN(); //returns true +``` -~~~php +```diff +resolve('www.example.com'); -$result->domain(); //returns a Domain object similar to v5 Domain object -$result->publicSuffix(); //returns a Public Suffix object -$result->publicSuffix()->isICANN(); //returns a boolean -$result->publicSuffix()->isPrivate(); //returns a boolean -$result->publicSuffix()->isKnown(); //returns a boolean -$result->subDomain(); //returns a Domain object -$result->registrableDomain(); //returns a ResolvedDomain object -~~~ +- $rules->resolve('www.example.org')->registrableDomain(); //returns 'example.org' ++ $rules->resolve('www.example.org')->registrableDomain()->toString(); //returns 'example.org' +``` + +Domain components are converted to objects. The `Domain` **no longer has access** to component information. @@ -72,19 +63,12 @@ a syntax error. **version 5** -~~~php -/** @var TopLevelDomains $rules */ -$result = $rules->resolve('####'); -//throws an Exception -~~~ - -**version 6** - -~~~php +```diff +resolve('####'); -//returns a ResolvedDomain object -~~~ +- $result = $rules->resolve('####'); //throws an Exception ++ $result = $rules->resolve('####'); //returns a ResolvedDomain object +``` #### Strict domain resolution @@ -101,25 +85,21 @@ $result = $rules->resolve('####'); #### Domain format -- `Domain::__toString` is removed use `Domain::toString`. -- `Domain::getContent` is renamed `Domain::value`. +- The `Domain::__toString` is removed use `Domain::toString` instead. +- The `Domain::getContent` is removed use `Domain::value` instead. - The `Domain` constructor is private. To instantiate a domain object you need to use on of the two (2) named constructor `Domain::fromIDNA2008` or `Domain::fromIDNA2008`. -**version 5** -~~~php -$domain = new Domain('faß.de', null, IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_NONTRANSITIONAL_TO_UNICODE); -$domain->getContent(); // can be a string or null -echo $domain; // display 'faß.de' -~~~ - -**version 6** -~~~php -$domain = Domain::fromIDNA2008('faß.de'); -$domain->value(); // can be a string or null -echo $domain->toString(); // display 'faß.de' -~~~ +```diff +getContent(); // can be a string or null ++ $domain->value(); // can be a string or null +- echo $domain; // display 'faß.de' ++ echo $domain->toString(); // display 'faß.de' +``` #### Methods renamed @@ -131,7 +111,9 @@ echo $domain->toString(); // display 'faß.de' - `TopLevelDomains::getVersion` method is renamed `TopLevelDomains::version`. - `TopLevelDomains::getModifiedDate` method is renamed `TopLevelDomains::lastUpdated`. -#### Classes removed +#### Resource manager system + +The resource manager system is removed. - `HttpClient` is removed without replacement. - `Cache` is removed without replacement. @@ -140,7 +122,7 @@ echo $domain->toString(); // display 'faß.de' - `Logger` is removed without replacement. - The CLI script to update the cache is removed without replacement. -*Please check the [README](README.md) doc for the alternative* +*Please check the [README](README.md) documentation for alternatives* #### Methods removed @@ -159,6 +141,13 @@ echo $domain->toString(); // display 'faß.de' representation or `null` to allow better compatibility with URL components representation in other languages. +```diff + Date: Sun, 29 Nov 2020 12:22:10 +0100 Subject: [PATCH 328/461] Improve upgrading documentation --- UPGRADING.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/UPGRADING.md b/UPGRADING.md index f660eaec..66e90fbd 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -87,6 +87,7 @@ a syntax error. - The `Domain::__toString` is removed use `Domain::toString` instead. - The `Domain::getContent` is removed use `Domain::value` instead. +- The `Domain::getLabel` is removed use `Domain::label` instead. - The `Domain` constructor is private. To instantiate a domain object you need to use on of the two (2) named constructor `Domain::fromIDNA2008` or `Domain::fromIDNA2008`. @@ -95,15 +96,18 @@ need to use on of the two (2) named constructor `Domain::fromIDNA2008` or getContent(); // can be a string or null +- $domain->getContent(); // can be a string or null + $domain->value(); // can be a string or null -- echo $domain; // display 'faß.de' +- echo $domain; // display 'faß.de' + echo $domain->toString(); // display 'faß.de' +- $domain->getLabel(-1); // returns 'faß' ++ $domain->label(-1); // returns 'faß' ``` #### Methods renamed -- `Domain::getLabel` method is renamed `Domain::label`. +The `create` prefix is removed from all named constructors. + - `Rules::createFromPath` method is renamed `Rules::fromPath`. - `TopLevelDomains::createFromPath` method is renamed `TopLevelDomains::fromPath`. - `Rules::createFromString` method is renamed `Rules::fromString`. @@ -143,9 +147,11 @@ representation in other languages. ```diff resolve('www.example.com'); +- json_encode($result); // returns {"domain":"www.example.com","registrableDomain":"example.com","subDomain":"www","publicSuffix":"com","isKnown":true,"isICANN":true,"isPrivate":false} ++ json_encode($result); // returns '"www.example.com"' ++ json_encode($result->domain()); // returns '"www.example.com"' ``` #### Objects instantiation From adc79f9a6dc61bab2acbea109e96c2f162eb2ca8 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 29 Nov 2020 18:25:53 +0100 Subject: [PATCH 329/461] ResolvedDomainName::publicSuffix renamed ResolvedDomainName::suffix --- CHANGELOG.md | 2 +- README.md | 30 +++++++-------- UPGRADING.md | 26 +++++++++---- src/ResolvedDomain.php | 8 ++-- src/ResolvedDomainName.php | 6 +-- src/ResolvedDomainTest.php | 20 +++++----- src/RulesTest.php | 74 ++++++++++++++++++------------------- src/TopLevelDomainsTest.php | 12 +++--- 8 files changed, 95 insertions(+), 83 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81cafccd..8723b979 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,7 +39,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - `Pdp\Rules::ALL_DOMAINS` constant deprecated in version 5.3 - `Pdp\Domain::getDomain` deprecated in version 5.3 - `Pdp\Domain::resolve` -- `Pdp\Domain::getPublicSuffix` replaced by `Pdp\ResolvedDomain::publicSuffix` +- `Pdp\Domain::getPublicSuffix` replaced by `Pdp\ResolvedDomain::suffix` - `Pdp\Domain::getRegistrableDomain` replaced by `Pdp\ResolvedDomain::registrableDomain` - `Pdp\Domain::getSubDomain` replaced by `Pdp\ResolvedDomain::subDomain` - `Pdp\Domain::getLabel` replaced by `Pdp\Domain::label` diff --git a/README.md b/README.md index e41169e4..4f8fea00 100644 --- a/README.md +++ b/README.md @@ -68,8 +68,8 @@ echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; echo $result->subDomain()->toString(); //display 'www'; echo $result->secondLevelDomain(); //display 'pref'; echo $result->registrableDomain()->toString(); //display 'pref.okinawa.jp'; -echo $result->publicSuffix()->toString(); //display 'okinawa.jp'; -$result->publicSuffix()->isICANN(); //return true; +echo $result->suffix()->toString(); //display 'okinawa.jp'; +$result->suffix()->isICANN(); //return true; ~~~ For the [IANA Root Zone Database](https://data.iana.org/TLD/tlds-alpha-by-domain.txt), @@ -82,11 +82,11 @@ $rootZoneDatabase = TopLevelDomains::fromPath('/path/to/cache/tlds-alpha-by-doma $result = $rootZoneDatabase->resolve('www.PreF.OkiNawA.jP'); echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; -echo $result->publicSuffix()->toString(); //display 'jp'; +echo $result->suffix()->toString(); //display 'jp'; echo $result->secondLevelDomain(); //display 'okinawa'; echo $result->registrableDomain()->toString(); //display 'okinawa.jp'; echo $result->subDomain()->toString(); //display 'www.pref'; -echo $result->publicSuffix()->isIANA(); //return true +echo $result->suffix()->isIANA(); //return true ~~~ In case of an error an exception which extends `Pdp\CannotProcessHost` is thrown. @@ -120,16 +120,16 @@ $publicSuffixList->getICANNDomain('qfdsf.unknownTLD'); // will throw because `.unknownTLD` is not part of the ICANN section $result = $publicSuffixList->getCookieDomain('qfdsf.unknownTLD'); -$result->publicSuffix()->value(); // returns 'unknownTLD' -$result->publicSuffix()->isKnown(); // returns false +$result->suffix()->value(); // returns 'unknownTLD' +$result->suffix()->isKnown(); // returns false // will not throw because the domain syntax is correct. $publicSuffixList->getCookieDomain('com'); // will not throw because the domain syntax is invalid (ie: does not support public suffix) $result = $publicSuffixList->resolve('com'); -$result->publicSuffix()->value(); // returns null -$result->publicSuffix()->isKnown(); // returns false +$result->suffix()->value(); // returns null +$result->suffix()->isKnown(); // returns false // will not throw but its public suffix value equal to NULL $rootZoneDatabase = TopLevelDomains::fromPath('/path/to/cache/public-suffix-list.dat'); @@ -180,11 +180,11 @@ use Pdp\RootZoneDatabase; /** @var RootZoneDatabase $rootZoneDatabase */ $result = $rootZoneDatabase->resolve('www.PreF.OkiNawA.jP'); echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; -echo $result->publicSuffix()->toString(); //display 'jp'; +echo $result->suffix()->toString(); //display 'jp'; echo $result->secondLevelDomain(); //display 'okinawa'; echo $result->registrableDomain()->toString(); //display 'okinawa.jp'; echo $result->subDomain()->toString(); //display 'www.pref'; -echo $result->publicSuffix()->isIANA(); //return true +echo $result->suffix()->isIANA(); //return true ~~~ You can modify the returned `Pdp\ResolvedDomain` instance using the following methods: @@ -199,13 +199,13 @@ $result = $publicSuffixList->resolve('shop.example.com'); $altResult = $result ->withSubDomain('foo.bar') ->withSecondLevelDomain('test') - ->withPublicSuffix('example'); + ->withSuffix('example'); echo $result->domain()->toString(); //display 'shop.example.com'; -$result->publicSuffix()->isKnown(); //returns true; +$result->suffix()->isKnown(); //returns true; echo $altResult->domain()->toString(); //display 'foo.bar.test.example'; -$altResult->publicSuffix()->isKnown(); //returns false; +$altResult->suffix()->isKnown(); //returns false; ~~~ **TIP: Always favor submitting a `Pdp\PublicSuffix` object rather that any other @@ -224,7 +224,7 @@ origin. use Pdp\PublicSuffixList; /** @var PublicSuffixList $publicSuffixList */ -$publicSuffix = $publicSuffixList->resolve('example.github.io')->publicSuffix(); +$publicSuffix = $publicSuffixList->resolve('example.github.io')->suffix(); echo $publicSuffix->domain()->toString(); //display 'github.io'; $publicSuffix->isICANN(); //will return false @@ -295,7 +295,7 @@ foreach ($domain as $label) { // bbc // www -$publicSuffixDomain = $result->publicSuffix()->domain(); +$publicSuffixDomain = $result->suffix()->domain(); $publicSuffixDomain->labels(); // returns ['uk', 'co'] ~~~ diff --git a/UPGRADING.md b/UPGRADING.md index 66e90fbd..b79b5109 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -1,5 +1,9 @@ # PHP Domain Parser Upgrade Guide +This guide will help you migrate from a 5.x version to 6.0.0. It will only +explain backward compatibility breaks, it will not present the new features +([read the documentation](README.md) for that). + ## 5.0 to 6.0 In order to take advantage of PHP new features, the library dropped the @@ -10,7 +14,7 @@ PHP version is now **PHP 7.4**. ### Backward Incompatibility Changes -Domains resolution is done using the `IDNA2008` algorithm by default, in v5, +Domains resolution uses the `IDNA2008` algorithm by default, in v5, by default, it is done `IDNA2003` instead. ```diff @@ -40,8 +44,8 @@ returned object. ```diff resolve('faß.de')->isICANN(); //returns true -+ $rules->resolve('faß.de')->publicSuffix()->isICANN(); //returns true +- $rules->resolve('faß.de')->isICANN(); //returns true ++ $rules->resolve('faß.de')->suffix()->isICANN(); //returns true ``` ```diff @@ -70,7 +74,6 @@ a syntax error. + $result = $rules->resolve('####'); //returns a ResolvedDomain object ``` - #### Strict domain resolution **version 5** @@ -80,8 +83,8 @@ a syntax error. **version 6** - `Rules::getCookieDomain` will throw on invalid domain value. -- `Rules::getICANNDomain` will throw on public suffix not find in the ICANN Section. -- `Rules::getPrivateDomain` will throw on public suffix not find in the Private Section. +- `Rules::getICANNDomain` will throw on invalid domain value **and** on public suffix not find in the ICANN Section. +- `Rules::getPrivateDomain` will throw on invalid domain value **and** on public suffix not find in the Private Section. #### Domain format @@ -151,7 +154,16 @@ representation in other languages. - $result = $rules->resolve('www.example.com'); - json_encode($result); // returns {"domain":"www.example.com","registrableDomain":"example.com","subDomain":"www","publicSuffix":"com","isKnown":true,"isICANN":true,"isPrivate":false} + json_encode($result); // returns '"www.example.com"' -+ json_encode($result->domain()); // returns '"www.example.com"' ++ echo json_encode([ + 'domain' => $result->value(), + 'registrableDomain' => $result->registrableDomain()->value(), + 'subDomain' => $result->subDomain()->value(), + 'publicSuffix' => $result->suffix()->value(), + 'isKnown' => $result->suffix()->isKnown(), + 'isICANN' => $result->suffix()->isICANN(), + 'isPrivate' => $result->suffix()->isPrivate(), +]); +// to get the v5 result ``` #### Objects instantiation diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index d74c814a..54f44e34 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -177,9 +177,9 @@ public function toString(): string return $this->domain->toString(); } - public function registrableDomain(): ResolvedDomain + public function registrableDomain(): DomainName { - return new self($this->registrableDomain, $this->publicSuffix); + return $this->registrableDomain; } public function secondLevelDomain(): ?string @@ -192,7 +192,7 @@ public function subDomain(): DomainName return $this->subDomain; } - public function publicSuffix(): EffectiveTLD + public function suffix(): EffectiveTLD { return $this->publicSuffix; } @@ -210,7 +210,7 @@ public function toUnicode(): self /** * @param mixed $publicSuffix a public suffix */ - public function withPublicSuffix($publicSuffix): self + public function withSuffix($publicSuffix): self { if (!$publicSuffix instanceof EffectiveTLD) { $publicSuffix = PublicSuffix::fromUnknown($publicSuffix); diff --git a/src/ResolvedDomainName.php b/src/ResolvedDomainName.php index a63fef8d..b8727180 100644 --- a/src/ResolvedDomainName.php +++ b/src/ResolvedDomainName.php @@ -9,7 +9,7 @@ interface ResolvedDomainName extends Host, ExternalDomainName /** * Returns the domain effective tld component. */ - public function publicSuffix(): EffectiveTLD; + public function suffix(): EffectiveTLD; /** * Returns the second level domain component. @@ -19,7 +19,7 @@ public function secondLevelDomain(): ?string; /** * Returns the registrable domain component. */ - public function registrableDomain(): self; + public function registrableDomain(): DomainName; /** * Returns the sub domain component. @@ -56,5 +56,5 @@ public function withSecondLevelDomain(?string $label): self; * If the domain already has a public suffix it will be replaced by the new value * otherwise the public suffix content is added to or remove from the current domain. */ - public function withPublicSuffix(EffectiveTLD $publicSuffix): self; + public function withSuffix(EffectiveTLD $publicSuffix): self; } diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index d967b72c..b43a203c 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -16,7 +16,7 @@ class ResolvedDomainTest extends TestCase public function testRegistrableDomainIsNullWithFoundDomain(): void { $domain = new ResolvedDomain(Domain::fromIDNA2003('faketld')); - self::assertNull($domain->publicSuffix()->value()); + self::assertNull($domain->suffix()->value()); self::assertNull($domain->registrableDomain()->value()); self::assertNull($domain->subDomain()->value()); self::assertNull($domain->secondLevelDomain()); @@ -105,12 +105,12 @@ public function testToIDN( $domain = new ResolvedDomain(Domain::fromIDNA2003($domain), $objPublicSuffix); self::assertSame($expectedDomain, $domain->value()); - self::assertSame($expectedSuffix, $domain->publicSuffix()->value()); + self::assertSame($expectedSuffix, $domain->suffix()->value()); /** @var ResolvedDomain $domainIDN */ $domainIDN = $domain->toUnicode(); self::assertSame($expectedIDNDomain, $domainIDN->value()); - self::assertSame($expectedIDNSuffix, $domainIDN->publicSuffix()->value()); + self::assertSame($expectedIDNSuffix, $domainIDN->suffix()->value()); } public function toUnicodeProvider(): iterable @@ -196,12 +196,12 @@ public function testToAscii( $domain = new ResolvedDomain(Domain::fromIDNA2003($domain), $objPublicSuffix); self::assertSame($expectedDomain, $domain->value()); - self::assertSame($expectedSuffix, $domain->publicSuffix()->value()); + self::assertSame($expectedSuffix, $domain->suffix()->value()); /** @var ResolvedDomain $domainIDN */ $domainIDN = $domain->toAscii(); self::assertSame($expectedAsciiDomain, $domainIDN->value()); - self::assertSame($expectedAsciiSuffix, $domainIDN->publicSuffix()->value()); + self::assertSame($expectedAsciiSuffix, $domainIDN->suffix()->value()); } public function toAsciiProvider(): iterable @@ -261,7 +261,7 @@ public function testWithSubDomainWorks(ResolvedDomain $domain, $subdomain, ?stri $result = $domain->withSubDomain($subdomain); self::assertSame($expected, $result->subDomain()->value()); - self::assertEquals($domain->publicSuffix(), $result->publicSuffix()); + self::assertEquals($domain->suffix(), $result->suffix()); self::assertEquals($domain->registrableDomain(), $result->registrableDomain()); } @@ -354,8 +354,8 @@ public function testWithPublicSuffixWorks( bool $isICANN, bool $isPrivate ): void { - $result = $domain->withPublicSuffix($publicSuffix); - $newPublicSuffix = $result->publicSuffix(); + $result = $domain->withSuffix($publicSuffix); + $newPublicSuffix = $result->suffix(); self::assertSame($expected, $newPublicSuffix->value()); self::assertSame($isKnown, $newPublicSuffix->isKnown()); @@ -447,7 +447,7 @@ public function testWithPublicSuffixFailsWithNullDomain(): void { self::expectException(SyntaxError::class); - (new ResolvedDomain(Domain::fromIDNA2008(null)))->withPublicSuffix('www'); + (new ResolvedDomain(Domain::fromIDNA2008(null)))->withSuffix('www'); } /** @@ -539,7 +539,7 @@ public function testWithSecondLevelDomain( self::assertSame($expectedSld, $newDomain->secondLevelDomain()); self::assertEquals($expectedHost, $newDomain->value()); - self::assertEquals($domain->publicSuffix(), $newDomain->publicSuffix()); + self::assertEquals($domain->suffix(), $newDomain->suffix()); self::assertEquals($domain->subDomain(), $newDomain->subDomain()); } diff --git a/src/RulesTest.php b/src/RulesTest.php index d72212a5..8f04fadd 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -94,7 +94,7 @@ public function testNullWillReturnNullDomain(): void { $domain = $this->rules->resolve('COM'); - self::assertFalse($domain->publicSuffix()->isKnown()); + self::assertFalse($domain->suffix()->isKnown()); } public function testThrowsTypeErrorOnWrongInput(): void @@ -108,34 +108,34 @@ public function testIsSuffixValidFalse(): void { $domain = $this->rules->resolve('www.example.faketld'); - self::assertFalse($domain->publicSuffix()->isKnown()); + self::assertFalse($domain->suffix()->isKnown()); } public function testIsSuffixValidTrue(): void { $domain = $this->rules->resolve('www.example.com'); - self::assertTrue($domain->publicSuffix()->isKnown()); - self::assertTrue($domain->publicSuffix()->isICANN()); - self::assertFalse($domain->publicSuffix()->isPrivate()); + self::assertTrue($domain->suffix()->isKnown()); + self::assertTrue($domain->suffix()->isICANN()); + self::assertFalse($domain->suffix()->isPrivate()); } public function testIsSuffixValidFalseWithPunycoded(): void { $domain = $this->rules->resolve('www.example.xn--85x722f'); - self::assertFalse($domain->publicSuffix()->isKnown()); - self::assertFalse($domain->publicSuffix()->isICANN()); - self::assertFalse($domain->publicSuffix()->isPrivate()); + self::assertFalse($domain->suffix()->isKnown()); + self::assertFalse($domain->suffix()->isICANN()); + self::assertFalse($domain->suffix()->isPrivate()); } public function testSubDomainIsNull(): void { $domain = $this->rules->resolve('ulb.ac.be'); - self::assertTrue($domain->publicSuffix()->isKnown()); - self::assertTrue($domain->publicSuffix()->isICANN()); - self::assertFalse($domain->publicSuffix()->isPrivate()); + self::assertTrue($domain->suffix()->isKnown()); + self::assertTrue($domain->suffix()->isICANN()); + self::assertFalse($domain->suffix()->isPrivate()); } public function testWithExceptionName(): void @@ -149,10 +149,10 @@ public function testWithPrivateDomain(): void { $domain = $this->rules->resolve('thephpleague.github.io'); - self::assertTrue($domain->publicSuffix()->isKnown()); - self::assertFalse($domain->publicSuffix()->isICANN()); - self::assertTrue($domain->publicSuffix()->isPrivate()); - self::assertSame('github.io', $domain->publicSuffix()->value()); + self::assertTrue($domain->suffix()->isKnown()); + self::assertFalse($domain->suffix()->isICANN()); + self::assertTrue($domain->suffix()->isPrivate()); + self::assertSame('github.io', $domain->suffix()->value()); } public function testWithAbsoluteHostInvalid(): void @@ -160,10 +160,10 @@ public function testWithAbsoluteHostInvalid(): void $domain = $this->rules->resolve('private.ulb.ac.be.'); self::assertSame('private.ulb.ac.be.', $domain->value()); - self::assertFalse($domain->publicSuffix()->isKnown()); - self::assertFalse($domain->publicSuffix()->isICANN()); - self::assertFalse($domain->publicSuffix()->isPrivate()); - self::assertNull($domain->publicSuffix()->value()); + self::assertFalse($domain->suffix()->isKnown()); + self::assertFalse($domain->suffix()->isICANN()); + self::assertFalse($domain->suffix()->isPrivate()); + self::assertNull($domain->suffix()->value()); } public function testWithICANNDomainInvalid(): void @@ -191,10 +191,10 @@ public function testWithPrivateDomainValid(): void $domain = $this->rules->getPrivateDomain('thephpleague.github.io'); self::assertSame('thephpleague.github.io', $domain->value()); - self::assertTrue($domain->publicSuffix()->isKnown()); - self::assertFalse($domain->publicSuffix()->isICANN()); - self::assertTrue($domain->publicSuffix()->isPrivate()); - self::assertSame('github.io', $domain->publicSuffix()->value()); + self::assertTrue($domain->suffix()->isKnown()); + self::assertFalse($domain->suffix()->isICANN()); + self::assertTrue($domain->suffix()->isPrivate()); + self::assertSame('github.io', $domain->suffix()->value()); } public function testResolvingICANNDomainInvalid(): void @@ -202,10 +202,10 @@ public function testResolvingICANNDomainInvalid(): void $domain = $this->rules->resolve('private.ulb.ac.be'); self::assertSame('private.ulb.ac.be', $domain->value()); - self::assertTrue($domain->publicSuffix()->isKnown()); - self::assertTrue($domain->publicSuffix()->isICANN()); - self::assertFalse($domain->publicSuffix()->isPrivate()); - self::assertSame('ac.be', $domain->publicSuffix()->value()); + self::assertTrue($domain->suffix()->isKnown()); + self::assertTrue($domain->suffix()->isICANN()); + self::assertFalse($domain->suffix()->isPrivate()); + self::assertSame('ac.be', $domain->suffix()->value()); } public function testWithDomainObject(): void @@ -218,10 +218,10 @@ public function testWithDomainObject(): void $newDomain = $this->rules->resolve($domain); self::assertSame('private.ulb.ac.be', $domain->value()); - self::assertTrue($domain->publicSuffix()->isKnown()); - self::assertTrue($domain->publicSuffix()->isICANN()); - self::assertFalse($domain->publicSuffix()->isPrivate()); - self::assertSame('ac.be', $domain->publicSuffix()->value()); + self::assertTrue($domain->suffix()->isKnown()); + self::assertTrue($domain->suffix()->isICANN()); + self::assertFalse($domain->suffix()->isPrivate()); + self::assertSame('ac.be', $domain->suffix()->value()); self::assertEquals($domain, $newDomain); } @@ -231,7 +231,7 @@ public function testWithDomainInterfaceObject(): void self::assertSame( 'ac.be', - $this->rules->getCookieDomain($domain)->publicSuffix()->value() + $this->rules->getCookieDomain($domain)->suffix()->value() ); } @@ -256,7 +256,7 @@ public function testGetRegistrableDomain(?string $publicSuffix, ?string $registr */ public function testGetPublicSuffix(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { - $effectiveTLD = $this->rules->resolve($domain)->publicSuffix(); + $effectiveTLD = $this->rules->resolve($domain)->suffix(); self::assertSame($publicSuffix, $effectiveTLD->value()); } @@ -438,7 +438,7 @@ public function invalidHostParseProvider(): iterable */ public function testPublicSuffixSection(?string $domain, ?string $expected): void { - $publicSuffix = $this->rules->getCookieDomain($domain)->publicSuffix(); + $publicSuffix = $this->rules->getCookieDomain($domain)->suffix(); self::assertSame($expected, $publicSuffix->value()); } @@ -606,9 +606,9 @@ public function testResolveWithIDNAOptions(): void */ public function testEffectiveTLDResolution(string $host, string $cookieETLD, string $icannETLD, string $privateETLD): void { - self::assertSame($cookieETLD, $this->rules->getCookieDomain($host)->publicSuffix()->toString()); - self::assertSame($icannETLD, $this->rules->getICANNDomain($host)->publicSuffix()->toString()); - self::assertSame($privateETLD, $this->rules->getPrivateDomain($host)->publicSuffix()->toString()); + self::assertSame($cookieETLD, $this->rules->getCookieDomain($host)->suffix()->toString()); + self::assertSame($icannETLD, $this->rules->getICANNDomain($host)->suffix()->toString()); + self::assertSame($privateETLD, $this->rules->getPrivateDomain($host)->suffix()->toString()); } public function effectiveTLDProvider(): iterable diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 5ae81405..bf1ee7b4 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -131,7 +131,7 @@ public function testResolve($tld): void { self::assertSame( Domain::fromIDNA2008($tld)->label(0), - $this->topLevelDomains->resolve($tld)->publicSuffix()->value() + $this->topLevelDomains->resolve($tld)->suffix()->value() ); } @@ -144,7 +144,7 @@ public function testGetTopLevelDomain($tld): void { self::assertSame( Domain::fromIDNA2008($tld)->label(0), - $this->topLevelDomains->getIANADomain($tld)->publicSuffix()->value() + $this->topLevelDomains->getIANADomain($tld)->suffix()->value() ); } @@ -191,7 +191,7 @@ public function testTopLevelDomainWithInvalidDomain(): void public function testResolveWithInvalidDomain(): void { $result = $this->topLevelDomains->resolve('###'); - self::assertFalse($result->publicSuffix()->isIANA()); + self::assertFalse($result->suffix()->isIANA()); self::assertNull($result->value()); } @@ -207,8 +207,8 @@ public function testResolveWithUnResolvableDomain(): void $result = $this->topLevelDomains->resolve('localhost'); self::assertSame($result->toString(), 'localhost'); - self::assertNull($result->publicSuffix()->value()); - self::assertFalse($result->publicSuffix()->isIANA()); + self::assertNull($result->suffix()->value()); + self::assertFalse($result->suffix()->isIANA()); } public function testGetTopLevelDomainWithUnResolvableDomain(): void @@ -222,7 +222,7 @@ public function testResolveWithUnregisteredTLD(): void { $collection = TopLevelDomains::fromPath(dirname(__DIR__).'/test_data/root_zones.dat'); - self::assertNull($collection->resolve('localhost.locale')->publicSuffix()->value()); + self::assertNull($collection->resolve('localhost.locale')->suffix()->value()); } public function testGetTopLevelDomainWithUnregisteredTLD(): void From 04a74e434b4aad3e95685544c032f7182daa87e4 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 29 Nov 2020 18:27:26 +0100 Subject: [PATCH 330/461] bugfix upgrading documentation --- UPGRADING.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/UPGRADING.md b/UPGRADING.md index b79b5109..c28dae79 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -155,14 +155,14 @@ representation in other languages. - json_encode($result); // returns {"domain":"www.example.com","registrableDomain":"example.com","subDomain":"www","publicSuffix":"com","isKnown":true,"isICANN":true,"isPrivate":false} + json_encode($result); // returns '"www.example.com"' + echo json_encode([ - 'domain' => $result->value(), - 'registrableDomain' => $result->registrableDomain()->value(), - 'subDomain' => $result->subDomain()->value(), - 'publicSuffix' => $result->suffix()->value(), - 'isKnown' => $result->suffix()->isKnown(), - 'isICANN' => $result->suffix()->isICANN(), - 'isPrivate' => $result->suffix()->isPrivate(), -]); ++ 'domain' => $result->value(), ++ 'registrableDomain' => $result->registrableDomain()->value(), ++ 'subDomain' => $result->subDomain()->value(), ++ 'publicSuffix' => $result->suffix()->value(), ++ 'isKnown' => $result->suffix()->isKnown(), ++ 'isICANN' => $result->suffix()->isICANN(), ++ 'isPrivate' => $result->suffix()->isPrivate(), ++ ]); // to get the v5 result ``` From 75a5cc09e3c44c697e6a0400d6ecdeb6b0509745 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 29 Nov 2020 20:53:55 +0100 Subject: [PATCH 331/461] Improve upgrade documentation --- UPGRADING.md | 60 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/UPGRADING.md b/UPGRADING.md index c28dae79..f31e8f8b 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -35,7 +35,7 @@ new `ResolvedDomain` object instead. resolve('faß.de')->labels(); //returns ['de', 'fass'] -+ $rules->resolve('faß.de')->domain()->labels(); //returns [ 'de', 'faß'] ++ $rules->resolve('faß.de')->domain()->labels(); //returns ['de', 'faß'] ``` Public suffix properties are not longer **directly** accessible on the @@ -65,8 +65,6 @@ The `Pdp\Rules::resolve` and `Pdp\TopLevelDomains::resolve` domain resolution rules are identical. They will alway returns a return even if the domain contains a syntax error. -**version 5** - ```diff getICANNDomain('toto.foobar')->isICANN(); //returns false ++ $rules->getICANNDomain('toto.foobar'); //will throw an exception +- $rules->getPrivateDomain('ulb.ac.be')->isICANN(); //returns false ++ $rules->getPrivateDomain('ulb.ac.be'); //will throw an exception +``` #### Domain format @@ -109,14 +111,23 @@ need to use on of the two (2) named constructor `Domain::fromIDNA2008` or #### Methods renamed -The `create` prefix is removed from all named constructors. +- The `create` prefix is removed from all named constructors. +- The `get` prefix is removed from `RootZoneDatabase` methods. -- `Rules::createFromPath` method is renamed `Rules::fromPath`. -- `TopLevelDomains::createFromPath` method is renamed `TopLevelDomains::fromPath`. -- `Rules::createFromString` method is renamed `Rules::fromString`. -- `TopLevelDomains::createFromString` method is renamed `TopLevelDomains::fromString`. -- `TopLevelDomains::getVersion` method is renamed `TopLevelDomains::version`. -- `TopLevelDomains::getModifiedDate` method is renamed `TopLevelDomains::lastUpdated`. +```diff +getVersion(); //returns 2018082200 ++ $rootZoneDatabase->version(); //returns 2018082200 +- $rootZoneDatabase->getModifiedDate(); //returns \DateTimeImmutable object ++ $rootZoneDatabase->lastUpdated(); //returns \DateTimeImmutable object +``` #### Resource manager system @@ -152,7 +163,15 @@ representation in other languages. resolve('www.example.com'); -- json_encode($result); // returns {"domain":"www.example.com","registrableDomain":"example.com","subDomain":"www","publicSuffix":"com","isKnown":true,"isICANN":true,"isPrivate":false} +- json_encode($result); // returns { +- "domain":"www.example.com", +- "registrableDomain":"example.com", +- "subDomain":"www", +- "publicSuffix":"com", +- "isKnown":true, +- "isICANN":true, +- "isPrivate":false +- } + json_encode($result); // returns '"www.example.com"' + echo json_encode([ + 'domain' => $result->value(), @@ -162,8 +181,7 @@ representation in other languages. + 'isKnown' => $result->suffix()->isKnown(), + 'isICANN' => $result->suffix()->isICANN(), + 'isPrivate' => $result->suffix()->isPrivate(), -+ ]); -// to get the v5 result ++ ]); // to get the v5 result ``` #### Objects instantiation From 2b59af8962de07944e67b2f5eaca17ec6599b77e Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 29 Nov 2020 21:01:42 +0100 Subject: [PATCH 332/461] Improve upgrade documentation --- UPGRADING.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/UPGRADING.md b/UPGRADING.md index f31e8f8b..5c845c12 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -48,6 +48,8 @@ returned object. + $rules->resolve('faß.de')->suffix()->isICANN(); //returns true ``` +Domain components are objects and no longer nullable scalar type. + ```diff resolve('www.example.org')->registrableDomain()->toString(); //returns 'example.org' ``` -Domain components are converted to objects. - The `Domain` **no longer has access** to component information. #### Normalizing domain resolution The `Pdp\Rules::resolve` and `Pdp\TopLevelDomains::resolve` domain resolution -rules are identical. They will alway returns a return even if the domain contains -a syntax error. +rules are identical. They will always return a result even if the domain +contains a syntax error. ```diff resolve('####'); //throws an Exception -+ $result = $rules->resolve('####'); //returns a ResolvedDomain object +/** @var TopLevelDomains $rootZoneDatabase */ +- $result = $rootZoneDatabase->resolve('####'); //throws an Exception ++ $result = $rootZoneDatabase->resolve('####'); //returns a ResolvedDomain object ``` #### Strict domain resolution @@ -84,8 +84,8 @@ of returning a response object. /** @var PublicSuffixList $rules */ - $rules->getICANNDomain('toto.foobar')->isICANN(); //returns false + $rules->getICANNDomain('toto.foobar'); //will throw an exception -- $rules->getPrivateDomain('ulb.ac.be')->isICANN(); //returns false -+ $rules->getPrivateDomain('ulb.ac.be'); //will throw an exception +- $rules->getPrivateDomain('ulb.ac.be')->isPrivate(); //returns false ++ $rules->getPrivateDomain('ulb.ac.be'); //will throw an exception ``` #### Domain format @@ -172,7 +172,7 @@ representation in other languages. - "isICANN":true, - "isPrivate":false - } -+ json_encode($result); // returns '"www.example.com"' ++ json_encode($result); // returns '"www.example.com"' + echo json_encode([ + 'domain' => $result->value(), + 'registrableDomain' => $result->registrableDomain()->value(), From 5a229789391586d1ad3bbdea83ad025f03563a6a Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 29 Nov 2020 21:10:37 +0100 Subject: [PATCH 333/461] prepare 6.0.0 release --- CHANGELOG.md | 5 +++-- README.md | 33 +++++++++++++++++-------------- UPGRADING.md | 17 ++++++++++++---- src/PublicSuffixListConverter.php | 2 +- 4 files changed, 35 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8723b979..87006f32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will be documented in this file -## 6.x.x - TBD +## 6.0.0 - TBD ### Added @@ -42,10 +42,11 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - `Pdp\Domain::getPublicSuffix` replaced by `Pdp\ResolvedDomain::suffix` - `Pdp\Domain::getRegistrableDomain` replaced by `Pdp\ResolvedDomain::registrableDomain` - `Pdp\Domain::getSubDomain` replaced by `Pdp\ResolvedDomain::subDomain` +- `Pdp\Domain::withPublicSuffix` replaced by `Pdp\ResolvedDomain::withSuffix` - `Pdp\Domain::getLabel` replaced by `Pdp\Domain::label` - `Pdp\Domain::isTransitionalDifferent` without replacement - `Pdp\PublicSuffix::createFromDomain` without replacement -- Directly accessing public suffix information from the domain object +- Directly accessing suffix information from the `Pdp\Domain` object - `Pdp\TopLevelDomains::contains` without replacement ## 5.7.2 - 2020-10-25 diff --git a/README.md b/README.md index 4f8fea00..bbb54ee2 100644 --- a/README.md +++ b/README.md @@ -68,8 +68,8 @@ echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; echo $result->subDomain()->toString(); //display 'www'; echo $result->secondLevelDomain(); //display 'pref'; echo $result->registrableDomain()->toString(); //display 'pref.okinawa.jp'; -echo $result->suffix()->toString(); //display 'okinawa.jp'; -$result->suffix()->isICANN(); //return true; +echo $result->suffix()->toString(); //display 'okinawa.jp'; +$result->suffix()->isICANN(); //return true; ~~~ For the [IANA Root Zone Database](https://data.iana.org/TLD/tlds-alpha-by-domain.txt), @@ -82,11 +82,11 @@ $rootZoneDatabase = TopLevelDomains::fromPath('/path/to/cache/tlds-alpha-by-doma $result = $rootZoneDatabase->resolve('www.PreF.OkiNawA.jP'); echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; -echo $result->suffix()->toString(); //display 'jp'; +echo $result->suffix()->toString(); //display 'jp'; echo $result->secondLevelDomain(); //display 'okinawa'; echo $result->registrableDomain()->toString(); //display 'okinawa.jp'; echo $result->subDomain()->toString(); //display 'www.pref'; -echo $result->suffix()->isIANA(); //return true +echo $result->suffix()->isIANA(); //return true ~~~ In case of an error an exception which extends `Pdp\CannotProcessHost` is thrown. @@ -180,11 +180,11 @@ use Pdp\RootZoneDatabase; /** @var RootZoneDatabase $rootZoneDatabase */ $result = $rootZoneDatabase->resolve('www.PreF.OkiNawA.jP'); echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; -echo $result->suffix()->toString(); //display 'jp'; +echo $result->suffix()->toString(); //display 'jp'; echo $result->secondLevelDomain(); //display 'okinawa'; echo $result->registrableDomain()->toString(); //display 'okinawa.jp'; echo $result->subDomain()->toString(); //display 'www.pref'; -echo $result->suffix()->isIANA(); //return true +echo $result->suffix()->isIANA(); //return true ~~~ You can modify the returned `Pdp\ResolvedDomain` instance using the following methods: @@ -202,10 +202,10 @@ $altResult = $result ->withSuffix('example'); echo $result->domain()->toString(); //display 'shop.example.com'; -$result->suffix()->isKnown(); //returns true; +$result->suffix()->isKnown(); //return true; echo $altResult->domain()->toString(); //display 'foo.bar.test.example'; -$altResult->suffix()->isKnown(); //returns false; +$altResult->suffix()->isKnown(); //return false; ~~~ **TIP: Always favor submitting a `Pdp\PublicSuffix` object rather that any other @@ -254,7 +254,7 @@ $unknown = PublicSuffix::fromUnknown('ac.be'); ~~~ Using a `PublicSuffix` object instead of a string or `null` with -`ResolvedDomain::withPublicSuffix` will ensure that the returned value will +`ResolvedDomain::withSuffix` will ensure that the returned value will always contain the correct information regarding the public suffix resolution. Using a `Domain` object instead of a string or `null` with the named @@ -269,8 +269,8 @@ manipulating domain labels. You can access the object using the following method - the `ResolvedDomain::domain` method - the `PublicSuffix::domain` method -- from `ResolvedDomain::subDomain` method -- the `ResolvedDomain::registrableDomain` returns a `ResolvedDomain` +- the `ResolvedDomain::subDomain` method +- the `ResolvedDomain::registrableDomain` method `Domain` objects usage are explain in the next section. @@ -418,12 +418,12 @@ The interfaces defined under the `Pdp\Storage` namespace enable integrating a database managing system and provide an implementation example using PHP-FIG PSR interfaces. +#### Using PHP-FIG interfaces + The `Pdp\Storage\PsrStorageFactory` enables returning storage instances that retrieve, convert and cache the Public Suffix List and the IANA Root Zone Database using standard interfaces published by the PHP-FIG. -#### Instantiate `Pdp\Storage\PsrStorageFactory` - To work as intended, the `Pdp\Storage\PsrStorageFactory` constructor requires: - a [PSR-16](http://www.php-fig.org/psr/psr-16/) Simple Cache implementing library. @@ -445,9 +445,12 @@ The `$ttl` argument can be: will expire; The package does not provide any implementation of such interfaces as you can -find robust and battle tested implementations on packagist. +find [robust](https://packagist.org/providers/psr/simple-cache-implementation) +and [battle tested](https://packagist.org/providers/psr/http-client-implementation) +[implementations](https://packagist.org/providers/psr/http-factory-implementation) +on packagist. -#### Refreshing the cached PSL and RZD data +#### Refreshing the resource using the provided factories **THIS IS THE RECOMMENDED WAY OF USING THE LIBRARY** diff --git a/UPGRADING.md b/UPGRADING.md index 5c845c12..1aba5ed0 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -57,7 +57,16 @@ Domain components are objects and no longer nullable scalar type. + $rules->resolve('www.example.org')->registrableDomain()->toString(); //returns 'example.org' ``` -The `Domain` **no longer has access** to component information. +The `Domain` **no longer has access** to component information. Updating +the resolved component is done on the `ResolvedDomain` and no longer on the +`Domain` object. + +```diff +resolve('www.example.org')->withPublicSuffix('com'); //returns 'example.com' ++ echo $rules->resolve('www.example.org')->withSuffix('com')->toString(); //returns 'example.com' +``` #### Normalizing domain resolution @@ -131,16 +140,16 @@ use Pdp\TopLevelDomains; #### Resource manager system -The resource manager system is removed. +The resource manager system (containing caching and refreshing resource) is removed. - `HttpClient` is removed without replacement. - `Cache` is removed without replacement. -- `Manager` is removed without replacement. - `Installer` is removed without replacement. - `Logger` is removed without replacement. - The CLI script to update the cache is removed without replacement. +- `Manager` is removed and may be replace by the use of `Pdp\Storage\PsrStorageFactory`. -*Please check the [README](README.md) documentation for alternatives* +*Please check the [README](README.md) documentation for more details* #### Methods removed diff --git a/src/PublicSuffixListConverter.php b/src/PublicSuffixListConverter.php index 052b7626..5f45c801 100644 --- a/src/PublicSuffixListConverter.php +++ b/src/PublicSuffixListConverter.php @@ -99,7 +99,7 @@ private function addRule(array $list, array $ruleParts): array try { /** @var string $line */ $line = array_pop($ruleParts); - $rule = IntlIdna::toAscii($line, IntlIdna::IDNA2003_ASCII_OPTIONS); + $rule = IntlIdna::toAscii($line, IntlIdna::IDNA2008_ASCII_OPTIONS); } catch (CannotProcessHost $exception) { throw UnableToLoadPublicSuffixList::dueToInvalidRule($line ?? null, $exception); } From 201d896130e1e15035a46f98b7aa0316bbcc41b7 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 30 Nov 2020 10:20:33 +0100 Subject: [PATCH 334/461] Adding TopLevelDomains::toString --- src/RootZoneDatabase.php | 10 ++++++++- src/RootZoneDatabaseConverter.php | 18 ++++++++--------- src/RootZoneDatabaseConverterTest.php | 15 ++++---------- src/TopLevelDomains.php | 29 ++++++++++++++++++--------- src/TopLevelDomainsTest.php | 16 ++++++++++----- 5 files changed, 52 insertions(+), 36 deletions(-) diff --git a/src/RootZoneDatabase.php b/src/RootZoneDatabase.php index f5dafbf2..a9036e00 100644 --- a/src/RootZoneDatabase.php +++ b/src/RootZoneDatabase.php @@ -10,8 +10,10 @@ use IteratorAggregate; use JsonSerializable; -interface RootZoneDatabase extends Countable, DomainResolver, IteratorAggregate, JsonSerializable +interface RootZoneDatabase extends Countable, DomainNameResolver, IteratorAggregate, JsonSerializable { + public const IANA_DATE_FORMAT = 'D M d H:i:s Y e'; + /** * Returns the Version ID. */ @@ -42,6 +44,12 @@ public function getIterator(): Iterator; */ public function jsonSerialize(): array; + /** + * Returns the string representation of the list. + * Stripped of its optional comments. + */ + public function toString(): string; + /** * Returns PSL info for a given domain against the PSL rules for ICANN domain detection. * diff --git a/src/RootZoneDatabaseConverter.php b/src/RootZoneDatabaseConverter.php index c67e7e08..7434438a 100644 --- a/src/RootZoneDatabaseConverter.php +++ b/src/RootZoneDatabaseConverter.php @@ -18,7 +18,7 @@ final class RootZoneDatabaseConverter { - private const IANA_DATE_FORMAT = 'D M d H:i:s Y e'; + private const REGEXP_HEADER_LINE = '/^\# Version (?\d+), Last Updated (?.*?)$/'; /** * Converts the IANA Root Zone Database into a TopLevelDomains associative array. @@ -27,7 +27,7 @@ final class RootZoneDatabaseConverter * * @throws UnableToLoadRootZoneDatabase if the content is invalid or can not be correctly parsed and converted */ - public function convert($content): array + public static function toArray($content): array { if (is_object($content) && method_exists($content, '__toString')) { $content = (string) $content; @@ -45,13 +45,13 @@ public function convert($content): array foreach ($file as $line) { $line = trim($line); if ([] === $data) { - $data = $this->extractHeader($line); + $data = self::extractHeader($line); continue; } if (false === strpos($line, '#')) { $data['records'] = $data['records'] ?? []; - $data['records'][] = $this->extractRootZone($line); + $data['records'][] = self::extractRootZone($line); continue; } @@ -70,14 +70,14 @@ public function convert($content): array * * @throws UnableToLoadRootZoneDatabase if the Header line is invalid */ - private function extractHeader(string $content): array + private static function extractHeader(string $content): array { - if (1 !== preg_match('/^\# Version (?\d+), Last Updated (?.*?)$/', $content, $matches)) { + if (1 !== preg_match(self::REGEXP_HEADER_LINE, $content, $matches)) { throw UnableToLoadRootZoneDatabase::dueToInvalidVersionLine($content); } /** @var DateTimeImmutable $date */ - $date = DateTimeImmutable::createFromFormat(self::IANA_DATE_FORMAT, $matches['date']); + $date = DateTimeImmutable::createFromFormat(RootZoneDatabase::IANA_DATE_FORMAT, $matches['date']); return [ 'version' => $matches['version'], @@ -90,10 +90,10 @@ private function extractHeader(string $content): array * * @throws UnableToLoadRootZoneDatabase If the Root Zone is invalid */ - private function extractRootZone(string $content): string + private static function extractRootZone(string $content): string { try { - $tld = PublicSuffix::fromUnknown(Domain::fromIDNA2008($content))->toAscii(); + $tld = Suffix::fromUnknown(Domain::fromIDNA2008($content))->toAscii(); } catch (CannotProcessHost $exception) { throw UnableToLoadRootZoneDatabase::dueToInvalidRootZoneDomain($content, $exception); } diff --git a/src/RootZoneDatabaseConverterTest.php b/src/RootZoneDatabaseConverterTest.php index 44a2c630..78de28c5 100644 --- a/src/RootZoneDatabaseConverterTest.php +++ b/src/RootZoneDatabaseConverterTest.php @@ -14,18 +14,11 @@ */ final class RootZoneDatabaseConverterTest extends TestCase { - private RootZoneDatabaseConverter $converter; - - public function setUp(): void - { - $this->converter = new RootZoneDatabaseConverter(); - } - public function testConverter(): void { /** @var string $string */ $string = file_get_contents(dirname(__DIR__).'/test_data/root_zones.dat'); - $res = $this->converter->convert($string); + $res = RootZoneDatabaseConverter::toArray($string); self::assertArrayHasKey('version', $res); self::assertArrayHasKey('lastUpdated', $res); @@ -45,7 +38,7 @@ public function __toString(): string } }; - $res = $this->converter->convert($stringObject); + $res = RootZoneDatabaseConverter::toArray($stringObject); self::assertArrayHasKey('version', $res); self::assertArrayHasKey('lastUpdated', $res); @@ -60,7 +53,7 @@ public function testConverterThrowsException(string $content): void { self::expectException(UnableToLoadRootZoneDatabase::class); - $this->converter->convert($content); + RootZoneDatabaseConverter::toArray($content); } public function testConvertThrowsExceptionIfTheInputIsNotSupported(): void @@ -69,7 +62,7 @@ public function testConvertThrowsExceptionIfTheInputIsNotSupported(): void self::expectException(TypeError::class); - $this->converter->convert($content); + RootZoneDatabaseConverter::toArray($content); } public function invalidContentProvider(): iterable diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index e440a61f..521c1c4c 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -13,6 +13,7 @@ use function fopen; use function json_decode; use function stream_get_contents; +use function strtoupper; use function substr; use const JSON_THROW_ON_ERROR; @@ -64,11 +65,7 @@ public static function fromPath(string $path, $context = null): self */ public static function fromString($content): self { - static $converter; - - $converter = $converter ?? new RootZoneDatabaseConverter(); - - $data = $converter->convert($content); + $data = RootZoneDatabaseConverter::toArray($content); /** @var DateTimeImmutable $lastUpdated */ $lastUpdated = DateTimeImmutable::createFromFormat(DateTimeInterface::ATOM, $data['lastUpdated']); @@ -124,7 +121,7 @@ public function isEmpty(): bool public function getIterator(): Iterator { foreach ($this->records as $tld) { - yield PublicSuffix::fromUnknown(Domain::fromIDNA2008($tld)->toAscii()); + yield Suffix::fromUnknown(Domain::fromIDNA2008($tld)->toAscii()); } } @@ -137,6 +134,18 @@ public function jsonSerialize(): array ]; } + public function toString(): string + { + $output = '# Version '.$this->version + .', Last Updated '.$this->lastUpdated->format(self::IANA_DATE_FORMAT)."\n"; + + foreach ($this->records as $suffix) { + $output .= strtoupper($suffix)."\n"; + } + + return $output; + } + /** * @param mixed $host a type that supports instantiating a Domain from. */ @@ -163,7 +172,7 @@ public function resolve($host): ResolvedDomainName */ private function validateDomain($domain): DomainName { - if ($domain instanceof ExternalDomainName) { + if ($domain instanceof DomainNameProvider) { $domain = $domain->domain(); } @@ -185,7 +194,7 @@ private function fetchEffectiveTLD(DomainName $domain): ?EffectiveTLD if ($tld->value() === $label) { $publicSuffix = $domain->isIdna2008() ? Domain::fromIDNA2008($domain->label(0)) : Domain::fromIDNA2003($domain->label(0)); - return PublicSuffix::fromIANA($publicSuffix); + return Suffix::fromIANA($publicSuffix); } } @@ -200,9 +209,9 @@ public function getIANADomain($domain): ResolvedDomainName $domain = $this->validateDomain($domain); $publicSuffix = $this->fetchEffectiveTLD($domain); if (null === $publicSuffix) { - throw UnableToResolveDomain::dueToMissingPublicSuffix($domain, EffectiveTLD::IANA_DOMAINS); + throw UnableToResolveDomain::dueToMissingSuffix($domain, 'IANA'); } - return new ResolvedDomain($domain, PublicSuffix::fromIANA($publicSuffix)); + return new ResolvedDomain($domain, Suffix::fromIANA($publicSuffix)); } } diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index bf1ee7b4..ddbfaeb7 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -77,6 +77,13 @@ public function testJsonMethods(): void self::assertEquals($this->topLevelDomains, TopLevelDomains::fromJsonString($data)); } + public function testToStringMethod(): void + { + $data = $this->topLevelDomains->toString(); + + self::assertEquals($this->topLevelDomains, TopLevelDomains::fromString($data)); + } + /** * @covers ::fromJsonString * @covers \Pdp\UnableToLoadRootZoneDatabase @@ -111,14 +118,13 @@ public function testGetterProperties(): void ); self::assertFalse($topLevelDomains->isEmpty()); - $converter = new RootZoneDatabaseConverter(); /** @var string $content */ $content = file_get_contents(dirname(__DIR__).'/test_data/root_zones.dat'); - $data = $converter->convert($content); + $data = RootZoneDatabaseConverter::toArray($content); self::assertEquals($data, $topLevelDomains->jsonSerialize()); foreach ($topLevelDomains as $tld) { - self::assertInstanceOf(PublicSuffix::class, $tld); + self::assertInstanceOf(Suffix::class, $tld); } } @@ -152,7 +158,7 @@ public function validDomainProvider(): iterable { $resolvedDomain = new ResolvedDomain( Domain::fromIDNA2008('www.example.com'), - PublicSuffix::fromICANN('com') + Suffix::fromICANN('com') ); return [ @@ -269,7 +275,7 @@ public function __toString(): string return 'COM'; } }], - 'externalDomain' => [PublicSuffix::fromICANN('com')], + 'externalDomain' => [Suffix::fromICANN('com')], ]; } From 38c72e1befaecc1043042658adfdda385dcac9b3 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 30 Nov 2020 10:21:17 +0100 Subject: [PATCH 335/461] Rename PublicSuffix as Suffix --- CHANGELOG.md | 5 +- README.md | 46 ++++++------ UPGRADING.md | 20 +++++- src/Domain.php | 4 +- ...lDomainName.php => DomainNameProvider.php} | 2 +- ...ainResolver.php => DomainNameResolver.php} | 2 +- src/DomainTest.php | 2 +- src/EffectiveTLD.php | 23 +++--- src/PublicSuffixList.php | 6 +- src/PublicSuffixListConverter.php | 16 ++--- src/PublicSuffixListConverterTest.php | 21 ++---- src/ResolvedDomain.php | 72 +++++++++---------- src/ResolvedDomainName.php | 4 +- src/ResolvedDomainTest.php | 46 ++++++------ src/Rules.php | 38 +++++----- src/RulesTest.php | 4 +- src/{PublicSuffix.php => Suffix.php} | 56 +++++++++------ src/{PublicSuffixTest.php => SuffixTest.php} | 44 +++++++----- src/UnableToResolveDomain.php | 13 +--- 19 files changed, 224 insertions(+), 200 deletions(-) rename src/{ExternalDomainName.php => DomainNameProvider.php} (76%) rename src/{DomainResolver.php => DomainNameResolver.php} (93%) rename src/{PublicSuffix.php => Suffix.php} (79%) rename src/{PublicSuffixTest.php => SuffixTest.php} (77%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87006f32..1168b7dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,12 +8,13 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - Adding proper Interfaces - Added `ResolvedDomain` object to normalize Resolver results. +- Added `Suffix` object to replace the `PublicSuffix` object from v5. - Public Suffix List and IANA Root Zone Database are fully decoupled - Added `IntlIdna`, IDN support has been completely revamped - Resolver uses by default UTS#46 IDNA2008 algorithm to convert domain names - Storage capability is optional and can be based on PHP-FIG related interfaces to improve interoperability - `Pdp\TopLevelDomains::getIANADomain` which throws on syntax error and if no effective TLD is found (behave like `Pdp\TopLevelDomains::resolve` in v5). -- `Pdp\PublicSuffix::isIANA` tells whether the TLD was successfully resolved against IANA RZD +- `Pdp\TopLevelDomains::toString` to returns the Root Zone Database file without optional comments ### Fixed @@ -45,7 +46,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - `Pdp\Domain::withPublicSuffix` replaced by `Pdp\ResolvedDomain::withSuffix` - `Pdp\Domain::getLabel` replaced by `Pdp\Domain::label` - `Pdp\Domain::isTransitionalDifferent` without replacement -- `Pdp\PublicSuffix::createFromDomain` without replacement +- `Pdp\PublicSuffix` replaced by `Pdp\Suffix` - Directly accessing suffix information from the `Pdp\Domain` object - `Pdp\TopLevelDomains::contains` without replacement diff --git a/README.md b/README.md index bbb54ee2..180eb0e1 100644 --- a/README.md +++ b/README.md @@ -208,15 +208,15 @@ echo $altResult->domain()->toString(); //display 'foo.bar.test.example'; $altResult->suffix()->isKnown(); //return false; ~~~ -**TIP: Always favor submitting a `Pdp\PublicSuffix` object rather that any other +**TIP: Always favor submitting a `Pdp\Suffix` object rather that any other supported type to avoid unexpected results. By default, if the input is not a -`Pdp\PublicSuffix` instance, the resulting public suffix will be labelled as +`Pdp\Suffix` instance, the resulting public suffix will be labelled as being unknown. For more information go to the [Public Suffix section](#public-suffix)** -### Public Suffix +### Domain Suffix -The domain effective TLD is represented using the `Pdp\PublicSuffix`. Depending - on the data source the object exposes different information regarding its +The domain effective TLD is represented using the `Pdp\Suffix`. Depending on +the data source the object exposes different information regarding its origin. ~~~php @@ -224,36 +224,38 @@ origin. use Pdp\PublicSuffixList; /** @var PublicSuffixList $publicSuffixList */ -$publicSuffix = $publicSuffixList->resolve('example.github.io')->suffix(); - -echo $publicSuffix->domain()->toString(); //display 'github.io'; -$publicSuffix->isICANN(); //will return false -$publicSuffix->isPrivate(); //will return true -$publicSuffix->isIANA(); //will return false -$publicSuffix->isKnown(); //will return true +$suffix = $publicSuffixList->resolve('example.github.io')->suffix(); + +echo $suffix->domain()->toString(); //display 'github.io'; +$suffix->isICANN(); //will return false +$suffix->isPrivate(); //will return true +$suffix->isPublicSuffix(); //will return true +$suffix->isIANA(); //will return false +$suffix->isKnown(); //will return true ~~~ The public suffix state depends on its origin: - `isKnown` returns `true` if the value is present in the data resource. - `isIANA` returns `true` if the value is present in the Root Zone Database. -- `isICANN` returns `true` if the value is present in the PSL ICANN section. -- `isPrivate` returns `true` if the value is present in the PSL private section. +- `isPublicSuffix` returns `true` if the value is present in the Public Suffix List. +- `isICANN` returns `true` if the value is present in the Public Suffix List ICANN section. +- `isPrivate` returns `true` if the value is present in the Public Suffix List private section. -The same information is used when `Pdp\PublicSuffix` object is +The same information is used when `Pdp\Suffix` object is instantiate via its named constructors: ~~~php resolve('www.example.org')->withSuffix('com')->toString(); //returns 'example.com' ``` +The `Pdp\PublicSuffix` object is replaced by the more generic `Pdp\Suffix` object + +```diff +getPublicSuffix('www.example.org'); //returns 'Pdp\PublicSuffix' instance ++ echo $rules->resolve('www.example.org')->suffix(); //returns 'Pdp\Suffix' instance +``` + +The `Pdp\Suffix` class **no longer has direct access** to the underlying domain properties. + +```diff +getLabel(-1); //returns 'co'; ++ $suffix->domain()->label(-1); //returns 'co'; +``` + #### Normalizing domain resolution The `Pdp\Rules::resolve` and `Pdp\TopLevelDomains::resolve` domain resolution @@ -158,7 +177,6 @@ The resource manager system (containing caching and refreshing resource) is remo - `DomainInterface` is removed use `DomainName` or `ResolvedDomainName` instead. - `Domain::isResolvable` is removed without replacement. - `Domain::resolve` is removed without replacement. -- `PublicSuffix::createFromDomain` is removed without replacement. - `Rules::getPublicSuffix` is removed use `ResolvedDomain::publicSuffix` instead. - All v5 IDNA related methods are removed, IDNA is fully handle within the `Domain` object. diff --git a/src/Domain.php b/src/Domain.php index 778aba65..826da267 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -78,7 +78,7 @@ public static function fromIDNA2008($domain): self */ private function parseDomain($domain): array { - if ($domain instanceof ExternalDomainName) { + if ($domain instanceof DomainNameProvider) { $domain = $domain->domain(); } @@ -298,7 +298,7 @@ public function toUnicode(): self */ private function normalize($domain): string { - if ($domain instanceof ExternalDomainName) { + if ($domain instanceof DomainNameProvider) { $domain = $domain->domain(); } diff --git a/src/ExternalDomainName.php b/src/DomainNameProvider.php similarity index 76% rename from src/ExternalDomainName.php rename to src/DomainNameProvider.php index 0f5a65f0..efc7cb91 100644 --- a/src/ExternalDomainName.php +++ b/src/DomainNameProvider.php @@ -4,7 +4,7 @@ namespace Pdp; -interface ExternalDomainName +interface DomainNameProvider { public function domain(): DomainName; } diff --git a/src/DomainResolver.php b/src/DomainNameResolver.php similarity index 93% rename from src/DomainResolver.php rename to src/DomainNameResolver.php index 0a000823..bc76f737 100644 --- a/src/DomainResolver.php +++ b/src/DomainNameResolver.php @@ -4,7 +4,7 @@ namespace Pdp; -interface DomainResolver +interface DomainNameResolver { /** * Returns the effective TLD info for a given domain against an external data source. diff --git a/src/DomainTest.php b/src/DomainTest.php index 9c03f16f..3c4a2d41 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -10,7 +10,7 @@ /** * @coversDefaultClass \Pdp\Domain */ -class DomainTest extends TestCase +final class DomainTest extends TestCase { /** * @covers \Pdp\SyntaxError diff --git a/src/EffectiveTLD.php b/src/EffectiveTLD.php index 5d5e6a2a..d386ac63 100644 --- a/src/EffectiveTLD.php +++ b/src/EffectiveTLD.php @@ -4,19 +4,23 @@ namespace Pdp; -interface EffectiveTLD extends Host, ExternalDomainName +interface EffectiveTLD extends Host, DomainNameProvider { - public const ICANN_DOMAINS = 'ICANN_DOMAINS'; - - public const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; - - public const IANA_DOMAINS = 'IANA_DOMAINS'; - /** * Tells whether the effective TLD has a matching rule in a Public Suffix List. */ public function isKnown(): bool; + /** + * Tells whether the effective TLD has a matching rule in the IANA Root Zone Database. + */ + public function isIANA(): bool; + + /** + * Tells whether the effective TLD has a matching rule in the Public Suffix List. + */ + public function isPublicSuffix(): bool; + /** * Tells whether the effective TLD has a matching rule in a Public Suffix List ICANN Section. */ @@ -26,9 +30,4 @@ public function isICANN(): bool; * Tells whether the effective TLD has a matching rule in a Public Suffix List Private Section. */ public function isPrivate(): bool; - - /** - * Tells whether the effective TLD has a matching rule in the IANA Root Zone Database. - */ - public function isIANA(): bool; } diff --git a/src/PublicSuffixList.php b/src/PublicSuffixList.php index 3de72892..26237f31 100644 --- a/src/PublicSuffixList.php +++ b/src/PublicSuffixList.php @@ -6,8 +6,12 @@ use JsonSerializable; -interface PublicSuffixList extends DomainResolver, JsonSerializable +interface PublicSuffixList extends DomainNameResolver, JsonSerializable { + public const ICANN_DOMAINS = 'ICANN_DOMAINS'; + + public const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; + /** * Returns an array representation of the Public Suffix List Rules JSON serializable. */ diff --git a/src/PublicSuffixListConverter.php b/src/PublicSuffixListConverter.php index 5f45c801..ad170641 100644 --- a/src/PublicSuffixListConverter.php +++ b/src/PublicSuffixListConverter.php @@ -19,11 +19,11 @@ final class PublicSuffixListConverter { private const PSL_SECTION = [ 'ICANN' => [ - 'BEGIN' => EffectiveTLD::ICANN_DOMAINS, + 'BEGIN' => PublicSuffixList::ICANN_DOMAINS, 'END' => '', ], 'PRIVATE' => [ - 'BEGIN' => EffectiveTLD::PRIVATE_DOMAINS, + 'BEGIN' => PublicSuffixList::PRIVATE_DOMAINS, 'END' => '', ], ]; @@ -35,7 +35,7 @@ final class PublicSuffixListConverter * * @param object|string $content The object should expose the __toString method */ - public function convert($content): array + public static function toArray($content): array { if (is_object($content) && method_exists($content, '__toString')) { $content = (string) $content; @@ -52,10 +52,10 @@ public function convert($content): array $file->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); /** @var string $line */ foreach ($file as $line) { - $section = $this->getSection($section, $line); + $section = self::getSection($section, $line); if ('' !== $section && false === strpos($line, '//')) { $rules[$section] = $rules[$section] ?? []; - $rules[$section] = $this->addRule($rules[$section], explode('.', $line)); + $rules[$section] = self::addRule($rules[$section], explode('.', $line)); } } @@ -65,7 +65,7 @@ public function convert($content): array /** * Returns the section type for a given line. */ - private function getSection(string $section, string $line): string + private static function getSection(string $section, string $line): string { if (1 === preg_match(self::REGEX_PSL_SECTION, $line, $matches)) { return self::PSL_SECTION[$matches['type']][$matches['point']]; @@ -90,7 +90,7 @@ private function getSection(string $section, string $line): string * * @throws UnableToLoadPublicSuffixList if the domain name can not be converted using IDN to ASCII algorithm */ - private function addRule(array $list, array $ruleParts): array + private static function addRule(array $list, array $ruleParts): array { // Adheres to canonicalization rule from the "Formal Algorithm" section // of https://publicsuffix.org/list/ @@ -112,7 +112,7 @@ private function addRule(array $list, array $ruleParts): array $list[$rule] = $list[$rule] ?? ($isDomain ? [] : ['!' => '']); if ($isDomain && [] !== $ruleParts) { - $list[$rule] = $this->addRule($list[$rule], $ruleParts); + $list[$rule] = self::addRule($list[$rule], $ruleParts); } return $list; diff --git a/src/PublicSuffixListConverterTest.php b/src/PublicSuffixListConverterTest.php index 8d737751..5197d258 100644 --- a/src/PublicSuffixListConverterTest.php +++ b/src/PublicSuffixListConverterTest.php @@ -12,20 +12,13 @@ /** * @coversDefaultClass \Pdp\PublicSuffixListConverter */ -class PublicSuffixListConverterTest extends TestCase +final class PublicSuffixListConverterTest extends TestCase { - private PublicSuffixListConverter $converter; - - public function setUp(): void - { - $this->converter = new PublicSuffixListConverter(); - } - public function testConverter(): void { /** @var string $string */ $string = file_get_contents(dirname(__DIR__).'/test_data/public_suffix_list.dat'); - $retval = $this->converter->convert($string); + $retval = PublicSuffixListConverter::toArray($string); self::assertNotEmpty($retval['ICANN_DOMAINS']); self::assertNotEmpty($retval['PRIVATE_DOMAINS']); @@ -38,19 +31,19 @@ public function testConvertThrowsExceptionWithInvalidContent(): void self::expectException(UnableToLoadPublicSuffixList::class); - $this->converter->convert($content); + PublicSuffixListConverter::toArray($content); } public function testConvertWithEmptyString(): void { - $retVal = $this->converter->convert(''); + $retVal = PublicSuffixListConverter::toArray(''); self::assertEquals([], $retVal); } public function testConvertWithInvalidString(): void { - $retVal = $this->converter->convert('foobar'); + $retVal = PublicSuffixListConverter::toArray('foobar'); self::assertEquals([], $retVal); } @@ -64,7 +57,7 @@ public function __toString(): string } }; - $retVal = $this->converter->convert($stringObject); + $retVal = PublicSuffixListConverter::toArray($stringObject); self::assertEquals([], $retVal); } @@ -75,6 +68,6 @@ public function testConvertThrowsExceptionIfTheInputIsNotSupported(): void self::expectException(TypeError::class); - $this->converter->convert($content); + PublicSuffixListConverter::toArray($content); } } diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 54f44e34..cb743378 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -16,28 +16,28 @@ final class ResolvedDomain implements ResolvedDomainName { private DomainName $domain; - private EffectiveTLD $publicSuffix; + private EffectiveTLD $suffix; private DomainName $registrableDomain; private DomainName $subDomain; - public function __construct(Host $domain, EffectiveTLD $publicSuffix = null) + public function __construct(Host $domain, EffectiveTLD $suffix = null) { $this->domain = $this->setDomainName($domain); - $this->publicSuffix = $this->setPublicSuffix($publicSuffix); + $this->suffix = $this->setSuffix($suffix); $this->registrableDomain = $this->setRegistrableDomain(); $this->subDomain = $this->setSubDomain(); } public static function __set_state(array $properties): self { - return new self($properties['domain'], $properties['publicSuffix']); + return new self($properties['domain'], $properties['suffix']); } private function setDomainName(Host $domain): DomainName { - if ($domain instanceof ExternalDomainName) { + if ($domain instanceof DomainNameProvider) { return $domain->domain(); } @@ -53,12 +53,12 @@ private function setDomainName(Host $domain): DomainName * * @throws UnableToResolveDomain If the public suffic can not be attached to the domain */ - private function setPublicSuffix(EffectiveTLD $publicSuffix = null): EffectiveTLD + private function setSuffix(EffectiveTLD $suffix = null): EffectiveTLD { - if (null === $publicSuffix || null === $publicSuffix->value()) { + if (null === $suffix || null === $suffix->value()) { $domain = $this->domain->isIdna2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); - return PublicSuffix::fromUnknown($domain); + return Suffix::fromUnknown($domain); } if (2 > count($this->domain)) { @@ -69,17 +69,17 @@ private function setPublicSuffix(EffectiveTLD $publicSuffix = null): EffectiveTL throw UnableToResolveDomain::dueToUnresolvableDomain($this->domain); } - $publicSuffix = $this->normalize($publicSuffix); - if ($this->domain->value() === $publicSuffix->value()) { + $suffix = $this->normalize($suffix); + if ($this->domain->value() === $suffix->value()) { throw UnableToResolveDomain::dueToIdenticalValue($this->domain); } - $psContent = $publicSuffix->toString(); + $psContent = $suffix->toString(); if ('.'.$psContent !== substr($this->domain->toString(), - strlen($psContent) - 1)) { - throw UnableToResolveDomain::dueToMismatchedPublicSuffix($this->domain, $publicSuffix); + throw UnableToResolveDomain::dueToMismatchedSuffix($this->domain, $suffix); } - return $publicSuffix; + return $suffix; } /** @@ -97,14 +97,14 @@ private function normalize(EffectiveTLD $subject): EffectiveTLD } if ($subject->isPrivate()) { - return PublicSuffix::fromPrivate($newDomain); + return Suffix::fromPrivate($newDomain); } if ($subject->isICANN()) { - return PublicSuffix::fromICANN($newDomain); + return Suffix::fromICANN($newDomain); } - return PublicSuffix::fromUnknown($newDomain); + return Suffix::fromUnknown($newDomain); } /** @@ -112,13 +112,13 @@ private function normalize(EffectiveTLD $subject): EffectiveTLD */ private function setRegistrableDomain(): DomainName { - if (null === $this->publicSuffix->value()) { + if (null === $this->suffix->value()) { return $this->domain->isIdna2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); } $domain = implode('.', array_slice( explode('.', $this->domain->toString()), - count($this->domain) - count($this->publicSuffix) - 1 + count($this->domain) - count($this->suffix) - 1 )); $registrableDomain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($domain) : Domain::fromIDNA2003($domain); @@ -136,7 +136,7 @@ private function setSubDomain(): DomainName } $nbLabels = count($this->domain); - $nbRegistrableLabels = count($this->publicSuffix) + 1; + $nbRegistrableLabels = count($this->suffix) + 1; if ($nbLabels === $nbRegistrableLabels) { return $this->domain->isIdna2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); } @@ -194,45 +194,45 @@ public function subDomain(): DomainName public function suffix(): EffectiveTLD { - return $this->publicSuffix; + return $this->suffix; } public function toAscii(): self { - return new self($this->domain->toAscii(), $this->publicSuffix->toAscii()); + return new self($this->domain->toAscii(), $this->suffix->toAscii()); } public function toUnicode(): self { - return new self($this->domain->toUnicode(), $this->publicSuffix->toUnicode()); + return new self($this->domain->toUnicode(), $this->suffix->toUnicode()); } /** - * @param mixed $publicSuffix a public suffix + * @param mixed $suffix a public suffix */ - public function withSuffix($publicSuffix): self + public function withSuffix($suffix): self { - if (!$publicSuffix instanceof EffectiveTLD) { - $publicSuffix = PublicSuffix::fromUnknown($publicSuffix); + if (!$suffix instanceof EffectiveTLD) { + $suffix = Suffix::fromUnknown($suffix); } - $publicSuffix = $this->normalize($publicSuffix); - if ($this->publicSuffix == $publicSuffix) { + $suffix = $this->normalize($suffix); + if ($this->suffix == $suffix) { return $this; } - $host = implode('.', array_reverse(array_slice($this->domain->labels(), count($this->publicSuffix)))); + $host = implode('.', array_reverse(array_slice($this->domain->labels(), count($this->suffix)))); - if (null === $publicSuffix->value()) { + if (null === $suffix->value()) { $domain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($host) : Domain::fromIDNA2003($host); return new self($domain, null); } - $host .= '.'.$publicSuffix->value(); + $host .= '.'.$suffix->value(); $domain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($host) : Domain::fromIDNA2003($host); - return new self($domain, $publicSuffix); + return new self($domain, $suffix); } /** @@ -244,7 +244,7 @@ public function withSubDomain($subDomain): self throw UnableToResolveDomain::dueToMissingRegistrableDomain($this->domain); } - if ($subDomain instanceof ExternalDomainName) { + if ($subDomain instanceof DomainNameProvider) { $subDomain = $subDomain->domain(); } @@ -267,7 +267,7 @@ public function withSubDomain($subDomain): self $newDomainValue = $subDomain->toString().'.'.$this->registrableDomain->toString(); $newDomain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($newDomainValue) : Domain::fromIDNA2003($newDomainValue); - return new self($newDomain, $this->publicSuffix); + return new self($newDomain, $this->suffix); } public function withSecondLevelDomain($label): self @@ -282,12 +282,12 @@ public function withSecondLevelDomain($label): self } if (null === $this->subDomain->value()) { - return new self($newRegistrableDomain, $this->publicSuffix); + return new self($newRegistrableDomain, $this->suffix); } $newDomainValue = $this->subDomain->value().'.'.$newRegistrableDomain->value(); $newDomain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($newDomainValue) : Domain::fromIDNA2003($newDomainValue); - return new self($newDomain, $this->publicSuffix); + return new self($newDomain, $this->suffix); } } diff --git a/src/ResolvedDomainName.php b/src/ResolvedDomainName.php index b8727180..94ef7ac0 100644 --- a/src/ResolvedDomainName.php +++ b/src/ResolvedDomainName.php @@ -4,7 +4,7 @@ namespace Pdp; -interface ResolvedDomainName extends Host, ExternalDomainName +interface ResolvedDomainName extends Host, DomainNameProvider { /** * Returns the domain effective tld component. @@ -56,5 +56,5 @@ public function withSecondLevelDomain(?string $label): self; * If the domain already has a public suffix it will be replaced by the new value * otherwise the public suffix content is added to or remove from the current domain. */ - public function withSuffix(EffectiveTLD $publicSuffix): self; + public function withSuffix(EffectiveTLD $suffix): self; } diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index b43a203c..f8b59064 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -11,7 +11,7 @@ /** * @coversDefaultClass \Pdp\ResolvedDomain */ -class ResolvedDomainTest extends TestCase +final class ResolvedDomainTest extends TestCase { public function testRegistrableDomainIsNullWithFoundDomain(): void { @@ -30,7 +30,7 @@ public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain(?stri { self::expectException(UnableToResolveDomain::class); - new ResolvedDomain(Domain::fromIDNA2003($domain), PublicSuffix::fromICANN(Domain::fromIDNA2003($publicSuffix))); + new ResolvedDomain(Domain::fromIDNA2003($domain), Suffix::fromICANN(Domain::fromIDNA2003($publicSuffix))); } public function provideWrongConstructor(): iterable @@ -57,7 +57,7 @@ public function provideWrongConstructor(): iterable public function testDomainInternalPhpMethod(): void { - $domain = new ResolvedDomain(Domain::fromIDNA2003('www.ulb.ac.be'), PublicSuffix::fromICANN(Domain::fromIDNA2003('ac.be'))); + $domain = new ResolvedDomain(Domain::fromIDNA2003('www.ulb.ac.be'), Suffix::fromICANN(Domain::fromIDNA2003('ac.be'))); $generateDomain = eval('return '.var_export($domain, true).';'); self::assertEquals($domain, $generateDomain); self::assertEquals('"www.ulb.ac.be"', json_encode($domain->jsonSerialize())); @@ -101,7 +101,7 @@ public function testToIDN( ?string $expectedIDNDomain, ?string $expectedIDNSuffix ): void { - $objPublicSuffix = (null === $publicSuffix) ? PublicSuffix::fromUnknown(Domain::fromIDNA2003(null)) : PublicSuffix::fromICANN(Domain::fromIDNA2003($publicSuffix)); + $objPublicSuffix = (null === $publicSuffix) ? Suffix::fromUnknown(Domain::fromIDNA2003(null)) : Suffix::fromICANN(Domain::fromIDNA2003($publicSuffix)); $domain = new ResolvedDomain(Domain::fromIDNA2003($domain), $objPublicSuffix); self::assertSame($expectedDomain, $domain->value()); @@ -192,7 +192,7 @@ public function testToAscii( ?string $expectedAsciiDomain, ?string $expectedAsciiSuffix ): void { - $objPublicSuffix = (null === $publicSuffix) ? PublicSuffix::fromUnknown(Domain::fromIDNA2003(null)) : PublicSuffix::fromICANN(Domain::fromIDNA2003($publicSuffix)); + $objPublicSuffix = (null === $publicSuffix) ? Suffix::fromUnknown(Domain::fromIDNA2003(null)) : Suffix::fromICANN(Domain::fromIDNA2003($publicSuffix)); $domain = new ResolvedDomain(Domain::fromIDNA2003($domain), $objPublicSuffix); self::assertSame($expectedDomain, $domain->value()); @@ -271,7 +271,7 @@ public function withSubDomainWorksProvider(): iterable 'simple addition' => [ 'domain' => new ResolvedDomain( Domain::fromIDNA2003('example.com'), - PublicSuffix::fromICANN(Domain::fromIDNA2003('com')) + Suffix::fromICANN(Domain::fromIDNA2003('com')) ), 'subdomain' => 'www', 'expected' => 'www', @@ -279,23 +279,23 @@ public function withSubDomainWorksProvider(): iterable 'simple addition IDN (1)' => [ 'domain' => new ResolvedDomain( Domain::fromIDNA2003('example.com'), - PublicSuffix::fromICANN(Domain::fromIDNA2003('com')) + Suffix::fromICANN(Domain::fromIDNA2003('com')) ), 'subdomain' => Domain::fromIDNA2003('bébé'), 'expected' => 'xn--bb-bjab', ], 'simple addition IDN (2)' => [ - 'domain' => new ResolvedDomain(Domain::fromIDNA2003('Яндекс.РФ'), PublicSuffix::fromICANN(Domain::fromIDNA2003('рф'))), + 'domain' => new ResolvedDomain(Domain::fromIDNA2003('Яндекс.РФ'), Suffix::fromICANN(Domain::fromIDNA2003('рф'))), 'subdomain' => 'bébé', 'expected' => 'bébé', ], 'simple removal' => [ - 'domain' => new ResolvedDomain(Domain::fromIDNA2003('example.com'), PublicSuffix::fromICANN(Domain::fromIDNA2003('com'))), + 'domain' => new ResolvedDomain(Domain::fromIDNA2003('example.com'), Suffix::fromICANN(Domain::fromIDNA2003('com'))), 'subdomain' => null, 'expected' => null, ], 'simple removal IDN' => [ - 'domain' => new ResolvedDomain(Domain::fromIDNA2003('bébé.Яндекс.РФ'), PublicSuffix::fromICANN(Domain::fromIDNA2003('рф'))), + 'domain' => new ResolvedDomain(Domain::fromIDNA2003('bébé.Яндекс.РФ'), Suffix::fromICANN(Domain::fromIDNA2003('рф'))), 'subdomain' => 'xn--bb-bjab', 'expected' => 'bébé', ], @@ -320,7 +320,7 @@ public function testWithEmptySubdomain(): void { self::expectException(SyntaxError::class); - $domain = new ResolvedDomain(Domain::fromIDNA2003('www.example.com'), PublicSuffix::fromICANN(Domain::fromIDNA2003('com'))); + $domain = new ResolvedDomain(Domain::fromIDNA2003('www.example.com'), Suffix::fromICANN(Domain::fromIDNA2003('com'))); $domain->withSubDomain(''); } @@ -328,7 +328,7 @@ public function testWithEmptySubdomain(): void public function testWithSubDomainFailsWithNonStringableObject(): void { self::expectException(TypeError::class); - $domain = new ResolvedDomain(Domain::fromIDNA2003('www.example.com'), PublicSuffix::fromICANN(Domain::fromIDNA2003('com'))); + $domain = new ResolvedDomain(Domain::fromIDNA2003('www.example.com'), Suffix::fromICANN(Domain::fromIDNA2003('com'))); $domain->withSubDomain(date_create()); } @@ -365,7 +365,7 @@ public function testWithPublicSuffixWorks( public function withPublicSuffixWorksProvider(): iterable { - $base_domain = new ResolvedDomain(Domain::fromIDNA2003('example.com'), PublicSuffix::fromICANN(Domain::fromIDNA2003('com'))); + $base_domain = new ResolvedDomain(Domain::fromIDNA2003('example.com'), Suffix::fromICANN(Domain::fromIDNA2003('com'))); return [ 'simple update (1)' => [ @@ -378,7 +378,7 @@ public function withPublicSuffixWorksProvider(): iterable ], 'simple update (2)' => [ 'domain' => $base_domain, - 'publicSuffix' => PublicSuffix::fromPrivate(Domain::fromIDNA2003('github.io')), + 'publicSuffix' => Suffix::fromPrivate(Domain::fromIDNA2003('github.io')), 'expected' => 'github.io', 'isKnown' => true, 'isICANN' => false, @@ -386,7 +386,7 @@ public function withPublicSuffixWorksProvider(): iterable ], 'same public suffix but PSL info is changed' => [ 'domain' => $base_domain, - 'publicSuffix' => PublicSuffix::fromPrivate(Domain::fromIDNA2003('com')), + 'publicSuffix' => Suffix::fromPrivate(Domain::fromIDNA2003('com')), 'expected' => 'com', 'isKnown' => true, 'isICANN' => false, @@ -394,7 +394,7 @@ public function withPublicSuffixWorksProvider(): iterable ], 'same public suffix but PSL info does not changed' => [ 'domain' => $base_domain, - 'publicSuffix' => PublicSuffix::fromICANN(Domain::fromIDNA2003('com')), + 'publicSuffix' => Suffix::fromICANN(Domain::fromIDNA2003('com')), 'expected' => 'com', 'isKnown' => true, 'isICANN' => true, @@ -402,15 +402,15 @@ public function withPublicSuffixWorksProvider(): iterable ], 'simple update IDN (1)' => [ 'domain' => $base_domain, - 'publicSuffix' => PublicSuffix::fromICANN(Domain::fromIDNA2008('рф')), + 'publicSuffix' => Suffix::fromICANN(Domain::fromIDNA2008('рф')), 'expected' => 'xn--p1ai', 'isKnown' => true, 'isICANN' => true, 'isPrivate' => false, ], 'simple update IDN (2)' => [ - 'domain' => new ResolvedDomain(Domain::fromIDNA2003('www.bébé.be'), PublicSuffix::fromICANN(Domain::fromIDNA2003('be'))), - 'publicSuffix' => PublicSuffix::fromICANN(Domain::fromIDNA2003('xn--p1ai')), + 'domain' => new ResolvedDomain(Domain::fromIDNA2003('www.bébé.be'), Suffix::fromICANN(Domain::fromIDNA2003('be'))), + 'publicSuffix' => Suffix::fromICANN(Domain::fromIDNA2003('xn--p1ai')), 'expected' => 'рф', 'isKnown' => true, 'isICANN' => true, @@ -425,7 +425,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'removing the public suffix list' => [ - 'domain' => new ResolvedDomain(Domain::fromIDNA2003('www.bébé.be'), PublicSuffix::fromICANN(Domain::fromIDNA2003('be'))), + 'domain' => new ResolvedDomain(Domain::fromIDNA2003('www.bébé.be'), Suffix::fromICANN(Domain::fromIDNA2003('be'))), 'publicSuffix' => null, 'expected' => null, 'isKnown' => false, @@ -433,7 +433,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'with custom IDNA domain options' =>[ - 'domain' => new ResolvedDomain(Domain::fromIDNA2008('www.bébé.be'), PublicSuffix::fromICANN(Domain::fromIDNA2008('be'))), + 'domain' => new ResolvedDomain(Domain::fromIDNA2008('www.bébé.be'), Suffix::fromICANN(Domain::fromIDNA2008('be'))), 'publicSuffix' => null, 'expected' => null, 'isKnown' => false, @@ -468,7 +468,7 @@ public function testResolveWorksWithCustomIDNAOptions( ?string $expectedSubDomain ): void { $host = Domain::fromIDNA2008($domainName); - $resolvedDomain = new ResolvedDomain($host, PublicSuffix::fromICANN(Domain::fromIDNA2008($publicSuffix))); + $resolvedDomain = new ResolvedDomain($host, Suffix::fromICANN(Domain::fromIDNA2008($publicSuffix))); self::assertSame($expectedContent, $resolvedDomain->value()); self::assertSame($expectedAscii, $resolvedDomain->toAscii()->value()); @@ -534,7 +534,7 @@ public function testWithSecondLevelDomain( ?string $expectedSld, ?string $expectedHost ): void { - $domain = new ResolvedDomain(Domain::fromIDNA2008($host), PublicSuffix::fromICANN(Domain::fromIDNA2008($publicSuffix))); + $domain = new ResolvedDomain(Domain::fromIDNA2008($host), Suffix::fromICANN(Domain::fromIDNA2008($publicSuffix))); $newDomain = $domain->withSecondLevelDomain($sld); self::assertSame($expectedSld, $newDomain->secondLevelDomain()); diff --git a/src/Rules.php b/src/Rules.php index ca8cba86..6722464c 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -25,10 +25,10 @@ final class Rules implements PublicSuffixList private function __construct(array $rules) { - $rules[EffectiveTLD::ICANN_DOMAINS] = $rules[EffectiveTLD::ICANN_DOMAINS] ?? []; - $rules[EffectiveTLD::PRIVATE_DOMAINS] = $rules[EffectiveTLD::PRIVATE_DOMAINS] ?? []; + $rules[self::ICANN_DOMAINS] = $rules[self::ICANN_DOMAINS] ?? []; + $rules[self::PRIVATE_DOMAINS] = $rules[self::PRIVATE_DOMAINS] ?? []; - if (!is_array($rules[EffectiveTLD::ICANN_DOMAINS]) || !is_array($rules[EffectiveTLD::PRIVATE_DOMAINS])) { + if (!is_array($rules[self::ICANN_DOMAINS]) || !is_array($rules[self::PRIVATE_DOMAINS])) { throw UnableToLoadPublicSuffixList::dueToCorruptedSection(); } @@ -68,11 +68,7 @@ public static function fromPath(string $path, $context = null): self */ public static function fromString($content): self { - static $converter; - - $converter = $converter ?? new PublicSuffixListConverter(); - - return new self($converter->convert($content)); + return new self(PublicSuffixListConverter::toArray($content)); } public static function fromJsonString(string $jsonString): self @@ -126,9 +122,9 @@ public function getCookieDomain($host): ResolvedDomainName public function getICANNDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); - $publicSuffix = $this->getEffectiveTLD($domain, EffectiveTLD::ICANN_DOMAINS); + $publicSuffix = $this->getEffectiveTLD($domain, self::ICANN_DOMAINS); if (!$publicSuffix->isICANN()) { - throw UnableToResolveDomain::dueToMissingPublicSuffix($domain, EffectiveTLD::ICANN_DOMAINS); + throw UnableToResolveDomain::dueToMissingSuffix($domain, 'ICANN'); } return new ResolvedDomain($domain, $publicSuffix); @@ -140,9 +136,9 @@ public function getICANNDomain($host): ResolvedDomainName public function getPrivateDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); - $publicSuffix = $this->getEffectiveTLD($domain, EffectiveTLD::PRIVATE_DOMAINS); + $publicSuffix = $this->getEffectiveTLD($domain, self::PRIVATE_DOMAINS); if (!$publicSuffix->isPrivate()) { - throw UnableToResolveDomain::dueToMissingPublicSuffix($domain, EffectiveTLD::PRIVATE_DOMAINS); + throw UnableToResolveDomain::dueToMissingSuffix($domain, 'private'); } return new ResolvedDomain($domain, $publicSuffix); @@ -158,7 +154,7 @@ public function getPrivateDomain($host): ResolvedDomainName */ private function validateDomain($domain): DomainName { - if ($domain instanceof ExternalDomainName) { + if ($domain instanceof DomainNameProvider) { $domain = $domain->domain(); } @@ -178,12 +174,12 @@ private function validateDomain($domain): DomainName */ private function getEffectiveTLD(DomainName $domain, string $section): EffectiveTLD { - $icann = $this->getEffectiveTLDFromSection($domain, EffectiveTLD::ICANN_DOMAINS); - if (EffectiveTLD::ICANN_DOMAINS === $section) { + $icann = $this->getEffectiveTLDFromSection($domain, self::ICANN_DOMAINS); + if (self::ICANN_DOMAINS === $section) { return $icann; } - $private = $this->getEffectiveTLDFromSection($domain, EffectiveTLD::PRIVATE_DOMAINS); + $private = $this->getEffectiveTLDFromSection($domain, self::PRIVATE_DOMAINS); if (count($private) > count($icann)) { return $private; } @@ -195,7 +191,7 @@ private function getEffectiveTLD(DomainName $domain, string $section): Effective $topLabel = $domain->toAscii()->label(0); $publicSuffix = $domain->isIdna2008() ? Domain::fromIDNA2008($topLabel) : Domain::fromIDNA2003($topLabel); - return PublicSuffix::fromUnknown($publicSuffix); + return Suffix::fromUnknown($publicSuffix); } /** @@ -230,16 +226,16 @@ private function getEffectiveTLDFromSection(DomainName $domain, string $section) $topLabel = $domain->toAscii()->label(0); $publicSuffix = $domain->isIdna2008() ? Domain::fromIDNA2008($topLabel) : Domain::fromIDNA2003($topLabel); - return PublicSuffix::fromUnknown($publicSuffix); + return Suffix::fromUnknown($publicSuffix); } $publicSuffixLabels = implode('.', array_reverse($matches)); $publicSuffix = $domain->isIdna2008() ? Domain::fromIDNA2008($publicSuffixLabels) : Domain::fromIDNA2003($publicSuffixLabels); - if (PublicSuffix::PRIVATE_DOMAINS === $section) { - return PublicSuffix::fromPrivate($publicSuffix); + if (self::PRIVATE_DOMAINS === $section) { + return Suffix::fromPrivate($publicSuffix); } - return PublicSuffix::fromICANN($publicSuffix); + return Suffix::fromICANN($publicSuffix); } } diff --git a/src/RulesTest.php b/src/RulesTest.php index 8f04fadd..5f228c60 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -212,7 +212,7 @@ public function testWithDomainObject(): void { $domain = new ResolvedDomain( Domain::fromIDNA2008('private.ulb.ac.be'), - PublicSuffix::fromICANN('ac.be') + Suffix::fromICANN('ac.be') ); $newDomain = $this->rules->resolve($domain); @@ -227,7 +227,7 @@ public function testWithDomainObject(): void public function testWithDomainInterfaceObject(): void { - $domain = PublicSuffix::fromICANN('ulb.ac.be'); + $domain = Suffix::fromICANN('ulb.ac.be'); self::assertSame( 'ac.be', diff --git a/src/PublicSuffix.php b/src/Suffix.php similarity index 79% rename from src/PublicSuffix.php rename to src/Suffix.php index a43705d2..5ceca957 100644 --- a/src/PublicSuffix.php +++ b/src/Suffix.php @@ -5,9 +5,14 @@ namespace Pdp; use function count; +use function in_array; -final class PublicSuffix implements EffectiveTLD +final class Suffix implements EffectiveTLD { + private const ICANN = 'ICANN'; + private const PRIVATE = 'PRIVATE'; + private const IANA = 'IANA'; + private DomainName $domain; private string $section; @@ -17,7 +22,7 @@ final class PublicSuffix implements EffectiveTLD */ private function __construct($domain, string $section) { - if ($domain instanceof ExternalDomainName) { + if ($domain instanceof DomainNameProvider) { $domain = $domain->domain(); } @@ -47,7 +52,7 @@ public static function __set_state(array $properties): self */ public static function fromICANN($domain): self { - return new self($domain, self::ICANN_DOMAINS); + return new self($domain, self::ICANN); } /** @@ -55,7 +60,7 @@ public static function fromICANN($domain): self */ public static function fromPrivate($domain): self { - return new self($domain, self::PRIVATE_DOMAINS); + return new self($domain, self::PRIVATE); } /** @@ -63,7 +68,7 @@ public static function fromPrivate($domain): self */ public static function fromIANA($domain): self { - return new self($domain, self::IANA_DOMAINS); + return new self($domain, self::IANA); } /** @@ -74,49 +79,54 @@ public static function fromUnknown($domain): self return new self($domain, ''); } - public function domain(): DomainName + public function isKnown(): bool { - return $this->domain; + return '' !== $this->section; } - public function count(): int + public function isIANA(): bool { - return count($this->domain); + return self::IANA === $this->section; } - public function jsonSerialize(): ?string + public function isPublicSuffix(): bool { - return $this->domain->value(); + return in_array($this->section, [self::ICANN, self::PRIVATE], true); } - public function value(): ?string + public function isICANN(): bool { - return $this->domain->value(); + return self::ICANN === $this->section; } - public function toString(): string + public function isPrivate(): bool { - return $this->domain->toString(); + return self::PRIVATE === $this->section; } - public function isKnown(): bool + public function domain(): DomainName { - return '' !== $this->section; + return $this->domain; } - public function isICANN(): bool + public function count(): int { - return self::ICANN_DOMAINS === $this->section; + return count($this->domain); } - public function isPrivate(): bool + public function jsonSerialize(): ?string { - return self::PRIVATE_DOMAINS === $this->section; + return $this->domain->value(); } - public function isIANA(): bool + public function value(): ?string + { + return $this->domain->value(); + } + + public function toString(): string { - return self::IANA_DOMAINS === $this->section; + return $this->domain->toString(); } public function toAscii(): self diff --git a/src/PublicSuffixTest.php b/src/SuffixTest.php similarity index 77% rename from src/PublicSuffixTest.php rename to src/SuffixTest.php index 7856658e..a67b7ad0 100644 --- a/src/PublicSuffixTest.php +++ b/src/SuffixTest.php @@ -9,14 +9,14 @@ use function json_encode; /** - * @coversDefaultClass \Pdp\PublicSuffix + * @coversDefaultClass \Pdp\Suffix */ -class PublicSuffixTest extends TestCase +final class SuffixTest extends TestCase { public function testInternalPhpMethod(): void { $domain = Domain::fromIDNA2008('ac.be'); - $publicSuffix = PublicSuffix::fromICANN($domain); + $publicSuffix = Suffix::fromICANN($domain); $generatePublicSuffix = eval('return '.var_export($publicSuffix, true).';'); self::assertEquals($publicSuffix, $generatePublicSuffix); self::assertEquals('"ac.be"', json_encode($publicSuffix)); @@ -26,7 +26,7 @@ public function testInternalPhpMethod(): void public function testPSToUnicodeWithUrlEncode(): void { $domain = Domain::fromIDNA2008('b%C3%A9be'); - self::assertSame('bébe', PublicSuffix::fromUnknown($domain)->toUnicode()->value()); + self::assertSame('bébe', Suffix::fromUnknown($domain)->toUnicode()->value()); } /** @@ -38,11 +38,11 @@ public function testSetSection(?string $publicSuffix, string $section, bool $isK $domain = Domain::fromIDNA2008($publicSuffix); if ('' === $section) { - $ps = PublicSuffix::fromUnknown($domain); + $ps = Suffix::fromUnknown($domain); } elseif ('ICANN_DOMAINS' === $section) { - $ps = PublicSuffix::fromICANN($domain); + $ps = Suffix::fromICANN($domain); } elseif ('PRIVATE_DOMAINS' === $section) { - $ps = PublicSuffix::fromPrivate($domain); + $ps = Suffix::fromPrivate($domain); } if (!isset($ps)) { @@ -63,11 +63,19 @@ public function PSProvider(): iterable ]; } + public function testIsPublicSuffix(): void + { + self::assertFalse(Suffix::fromIANA('be')->isPublicSuffix()); + self::assertFalse(Suffix::fromUnknown('be')->isPublicSuffix()); + self::assertTrue(Suffix::fromICANN('be')->isPublicSuffix()); + self::assertTrue(Suffix::fromPrivate('be')->isPublicSuffix()); + } + public function testConstructorWithHostInstance(): void { - $domain = PublicSuffix::fromICANN(Domain::fromIDNA2003('ac.be')); + $domain = Suffix::fromICANN(Domain::fromIDNA2003('ac.be')); - self::assertEquals($domain, PublicSuffix::fromICANN($domain)); + self::assertEquals($domain, Suffix::fromICANN($domain)); } /** @@ -77,7 +85,7 @@ public function testConstructorThrowsException(string $publicSuffix): void { self::expectException(SyntaxError::class); - PublicSuffix::fromUnknown(Domain::fromIDNA2008($publicSuffix)); + Suffix::fromUnknown(Domain::fromIDNA2008($publicSuffix)); } public function invalidPublicSuffixProvider(): iterable @@ -92,14 +100,14 @@ public function testPSToAsciiThrowsException(): void { self::expectException(SyntaxError::class); - PublicSuffix::fromUnknown(Domain::fromIDNA2008('a⒈com')); + Suffix::fromUnknown(Domain::fromIDNA2008('a⒈com')); } public function testToUnicodeThrowsException(): void { self::expectException(SyntaxError::class); - PublicSuffix::fromUnknown(Domain::fromIDNA2008('xn--a-ecp.ru'))->toUnicode(); + Suffix::fromUnknown(Domain::fromIDNA2008('xn--a-ecp.ru'))->toUnicode(); } /** @@ -108,7 +116,7 @@ public function testToUnicodeThrowsException(): void */ public function testConversionReturnsTheSameInstance(?string $publicSuffix): void { - $instance = PublicSuffix::fromUnknown(Domain::fromIDNA2008($publicSuffix)); + $instance = Suffix::fromUnknown(Domain::fromIDNA2008($publicSuffix)); self::assertEquals($instance->toUnicode(), $instance); self::assertEquals($instance->toAscii(), $instance); @@ -124,7 +132,7 @@ public function conversionReturnsTheSameInstanceProvider(): iterable public function testToUnicodeReturnsSameInstance(): void { - $instance = PublicSuffix::fromUnknown(Domain::fromIDNA2008('食狮.公司.cn')); + $instance = Suffix::fromUnknown(Domain::fromIDNA2008('食狮.公司.cn')); self::assertEquals($instance->toUnicode(), $instance); } @@ -135,7 +143,7 @@ public function testToUnicodeReturnsSameInstance(): void */ public function testCountable(?string $domain, int $nbLabels, array $labels): void { - $domain = PublicSuffix::fromUnknown(Domain::fromIDNA2008($domain)); + $domain = Suffix::fromUnknown(Domain::fromIDNA2008($domain)); self::assertCount($nbLabels, $domain); } @@ -159,7 +167,7 @@ public function testResolveWithCustomIDNAOptions( string $expectedUnicode ): void { $domain = Domain::fromIDNA2008($name); - $publicSuffix = PublicSuffix::fromUnknown($domain); + $publicSuffix = Suffix::fromUnknown($domain); self::assertSame($expectedContent, $publicSuffix->value()); self::assertSame($expectedAscii, $publicSuffix->toAscii()->value()); @@ -199,8 +207,8 @@ public function customIDNAProvider(): iterable public function testWithIDNAOptions(): void { self::assertNotEquals( - PublicSuffix::fromUnknown(Domain::fromIDNA2008('com')), - PublicSuffix::fromUnknown(Domain::fromIDNA2003('com')) + Suffix::fromUnknown(Domain::fromIDNA2008('com')), + Suffix::fromUnknown(Domain::fromIDNA2003('com')) ); } } diff --git a/src/UnableToResolveDomain.php b/src/UnableToResolveDomain.php index 719bea1a..9f66ada7 100644 --- a/src/UnableToResolveDomain.php +++ b/src/UnableToResolveDomain.php @@ -8,12 +8,6 @@ final class UnableToResolveDomain extends InvalidArgumentException implements CannotProcessHost { - private const DOMAIN_CONVERTER = [ - EffectiveTLD::ICANN_DOMAINS => 'ICANN', - EffectiveTLD::PRIVATE_DOMAINS => 'private', - EffectiveTLD::IANA_DOMAINS => 'IANA', - ]; - private DomainName $domain; public static function dueToIdenticalValue(DomainName $domain): self @@ -24,7 +18,7 @@ public static function dueToIdenticalValue(DomainName $domain): self return $exception; } - public static function dueToMismatchedPublicSuffix(DomainName $domain, EffectiveTLD $effectiveTLD): self + public static function dueToMismatchedSuffix(DomainName $domain, EffectiveTLD $effectiveTLD): self { $exception = new self('The public suffix `'.$effectiveTLD->value().'` can not be assign to the domain name `'.$domain->toString().'`'); $exception->domain = $domain; @@ -32,10 +26,9 @@ public static function dueToMismatchedPublicSuffix(DomainName $domain, Effective return $exception; } - public static function dueToMissingPublicSuffix(DomainName $domain, string $type): self + public static function dueToMissingSuffix(DomainName $domain, string $type): self { - $domainType = self::DOMAIN_CONVERTER[$type] ?? 'unsupported'; - $exception = new self('The domain "'.$domain->value().'" does not contain a "'.$domainType.'" TLD.'); + $exception = new self('The domain "'.$domain->value().'" does not contain a "'.$type.'" TLD.'); $exception->domain = $domain; return $exception; From 00771ac32d51cdb6001a5f3cbce955e7e24d05d7 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 30 Nov 2020 21:24:18 +0100 Subject: [PATCH 336/461] Merge converters into their respective classes --- CHANGELOG.md | 2 +- src/PublicSuffixList.php | 4 - src/PublicSuffixListConverter.php | 120 ------------------------ src/PublicSuffixListConverterTest.php | 73 --------------- src/RootZoneDatabase.php | 8 -- src/RootZoneDatabaseConverter.php | 107 --------------------- src/RootZoneDatabaseConverterTest.php | 128 -------------------------- src/Rules.php | 115 ++++++++++++++++++++++- src/RulesTest.php | 12 ++- src/TopLevelDomains.php | 112 +++++++++++++++++++--- src/TopLevelDomainsTest.php | 88 +++++++++++++++--- 11 files changed, 294 insertions(+), 475 deletions(-) delete mode 100644 src/PublicSuffixListConverter.php delete mode 100644 src/PublicSuffixListConverterTest.php delete mode 100644 src/RootZoneDatabaseConverter.php delete mode 100644 src/RootZoneDatabaseConverterTest.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 1168b7dc..9fe16c8b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,6 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - Resolver uses by default UTS#46 IDNA2008 algorithm to convert domain names - Storage capability is optional and can be based on PHP-FIG related interfaces to improve interoperability - `Pdp\TopLevelDomains::getIANADomain` which throws on syntax error and if no effective TLD is found (behave like `Pdp\TopLevelDomains::resolve` in v5). -- `Pdp\TopLevelDomains::toString` to returns the Root Zone Database file without optional comments ### Fixed @@ -49,6 +48,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - `Pdp\PublicSuffix` replaced by `Pdp\Suffix` - Directly accessing suffix information from the `Pdp\Domain` object - `Pdp\TopLevelDomains::contains` without replacement +- Internal Converter classes to convert external resources into PHP array structures. ## 5.7.2 - 2020-10-25 diff --git a/src/PublicSuffixList.php b/src/PublicSuffixList.php index 26237f31..9e8b24c3 100644 --- a/src/PublicSuffixList.php +++ b/src/PublicSuffixList.php @@ -8,10 +8,6 @@ interface PublicSuffixList extends DomainNameResolver, JsonSerializable { - public const ICANN_DOMAINS = 'ICANN_DOMAINS'; - - public const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; - /** * Returns an array representation of the Public Suffix List Rules JSON serializable. */ diff --git a/src/PublicSuffixListConverter.php b/src/PublicSuffixListConverter.php deleted file mode 100644 index ad170641..00000000 --- a/src/PublicSuffixListConverter.php +++ /dev/null @@ -1,120 +0,0 @@ - [ - 'BEGIN' => PublicSuffixList::ICANN_DOMAINS, - 'END' => '', - ], - 'PRIVATE' => [ - 'BEGIN' => PublicSuffixList::PRIVATE_DOMAINS, - 'END' => '', - ], - ]; - - private const REGEX_PSL_SECTION = ',^// ===(?BEGIN|END) (?ICANN|PRIVATE) DOMAINS===,'; - - /** - * Convert the Public Suffix List into an associative, multidimensional array. - * - * @param object|string $content The object should expose the __toString method - */ - public static function toArray($content): array - { - if (is_object($content) && method_exists($content, '__toString')) { - $content = (string) $content; - } - - if (!is_string($content)) { - throw new TypeError('The content to be converted should be a string or a Stringable object, `'.gettype($content).'` given.'); - } - - $rules = []; - $section = ''; - $file = new SplTempFileObject(); - $file->fwrite($content); - $file->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); - /** @var string $line */ - foreach ($file as $line) { - $section = self::getSection($section, $line); - if ('' !== $section && false === strpos($line, '//')) { - $rules[$section] = $rules[$section] ?? []; - $rules[$section] = self::addRule($rules[$section], explode('.', $line)); - } - } - - return $rules; - } - - /** - * Returns the section type for a given line. - */ - private static function getSection(string $section, string $line): string - { - if (1 === preg_match(self::REGEX_PSL_SECTION, $line, $matches)) { - return self::PSL_SECTION[$matches['type']][$matches['point']]; - } - - return $section; - } - - /** - * Recursive method to build the array representation of the Public Suffix List. - * - * This method is based heavily on the code found in generateEffectiveTLDs.php - * - * @see https://github.com/usrflo/registered-domain-libs/blob/master/generateEffectiveTLDs.php - * A copy of the Apache License, Version 2.0, is provided with this - * distribution - * - * @param array $list Initially an empty array, this eventually - * becomes the array representation of a Public Suffix List section - * @param array $ruleParts One line (rule) from the Public Suffix List - * exploded on '.', or the remaining portion of that array during recursion - * - * @throws UnableToLoadPublicSuffixList if the domain name can not be converted using IDN to ASCII algorithm - */ - private static function addRule(array $list, array $ruleParts): array - { - // Adheres to canonicalization rule from the "Formal Algorithm" section - // of https://publicsuffix.org/list/ - // "The domain and all rules must be canonicalized in the normal way - // for hostnames - lower-case, Punycode (RFC 3492)." - try { - /** @var string $line */ - $line = array_pop($ruleParts); - $rule = IntlIdna::toAscii($line, IntlIdna::IDNA2008_ASCII_OPTIONS); - } catch (CannotProcessHost $exception) { - throw UnableToLoadPublicSuffixList::dueToInvalidRule($line ?? null, $exception); - } - - $isDomain = true; - if (0 === strpos($rule, '!')) { - $rule = substr($rule, 1); - $isDomain = false; - } - - $list[$rule] = $list[$rule] ?? ($isDomain ? [] : ['!' => '']); - if ($isDomain && [] !== $ruleParts) { - $list[$rule] = self::addRule($list[$rule], $ruleParts); - } - - return $list; - } -} diff --git a/src/PublicSuffixListConverterTest.php b/src/PublicSuffixListConverterTest.php deleted file mode 100644 index 5197d258..00000000 --- a/src/PublicSuffixListConverterTest.php +++ /dev/null @@ -1,73 +0,0 @@ -\d+), Last Updated (?.*?)$/'; - - /** - * Converts the IANA Root Zone Database into a TopLevelDomains associative array. - * - * @param object|string $content The object should expose the __toString method - * - * @throws UnableToLoadRootZoneDatabase if the content is invalid or can not be correctly parsed and converted - */ - public static function toArray($content): array - { - if (is_object($content) && method_exists($content, '__toString')) { - $content = (string) $content; - } - - if (!is_string($content)) { - throw new TypeError('The content to be converted should be a string or a Stringable object, `'.gettype($content).'` given.'); - } - - $data = []; - $file = new SplTempFileObject(); - $file->fwrite($content); - $file->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); - /** @var string $line */ - foreach ($file as $line) { - $line = trim($line); - if ([] === $data) { - $data = self::extractHeader($line); - continue; - } - - if (false === strpos($line, '#')) { - $data['records'] = $data['records'] ?? []; - $data['records'][] = self::extractRootZone($line); - continue; - } - - throw UnableToLoadRootZoneDatabase::dueToInvalidLine($line); - } - - if (isset($data['version'], $data['lastUpdated'], $data['records'])) { - return $data; - } - - throw UnableToLoadRootZoneDatabase::dueToFailedConversion(); - } - - /** - * Extract IANA Root Zone Database header info. - * - * @throws UnableToLoadRootZoneDatabase if the Header line is invalid - */ - private static function extractHeader(string $content): array - { - if (1 !== preg_match(self::REGEXP_HEADER_LINE, $content, $matches)) { - throw UnableToLoadRootZoneDatabase::dueToInvalidVersionLine($content); - } - - /** @var DateTimeImmutable $date */ - $date = DateTimeImmutable::createFromFormat(RootZoneDatabase::IANA_DATE_FORMAT, $matches['date']); - - return [ - 'version' => $matches['version'], - 'lastUpdated' => $date->format(DateTimeInterface::ATOM), - ]; - } - - /** - * Extract IANA Root Zone. - * - * @throws UnableToLoadRootZoneDatabase If the Root Zone is invalid - */ - private static function extractRootZone(string $content): string - { - try { - $tld = Suffix::fromUnknown(Domain::fromIDNA2008($content))->toAscii(); - } catch (CannotProcessHost $exception) { - throw UnableToLoadRootZoneDatabase::dueToInvalidRootZoneDomain($content, $exception); - } - - if (1 !== $tld->count() || '' === $tld->value()) { - throw UnableToLoadRootZoneDatabase::dueToInvalidRootZoneDomain($content); - } - - return $tld->toString(); - } -} diff --git a/src/RootZoneDatabaseConverterTest.php b/src/RootZoneDatabaseConverterTest.php deleted file mode 100644 index 78de28c5..00000000 --- a/src/RootZoneDatabaseConverterTest.php +++ /dev/null @@ -1,128 +0,0 @@ - [$doubleHeader], - 'invalid header' => [$invalidHeader], - 'empty content' => [''], - 'header not on the first line' => [$headerNoFirstLine], - 'invalid tld content' => [$invalidTldContent], - 'invalid root zone' => [$invalidTldContentNotRootZone], - 'empty tld' => [$invalidTldContentEmptyTld], - ]; - } -} diff --git a/src/Rules.php b/src/Rules.php index 6722464c..07cb66b1 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -5,19 +5,46 @@ namespace Pdp; use JsonException; +use SplTempFileObject; +use TypeError; +use function array_pop; use function array_reverse; use function count; +use function explode; use function fclose; use function fopen; +use function gettype; use function implode; use function is_array; +use function is_object; +use function is_string; use function json_decode; +use function method_exists; +use function preg_match; use function stream_get_contents; +use function strpos; use function substr; use const JSON_THROW_ON_ERROR; final class Rules implements PublicSuffixList { + private const ICANN_DOMAINS = 'ICANN_DOMAINS'; + + private const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; + + private const PSL_SECTION = [ + 'ICANN' => [ + 'BEGIN' => self::ICANN_DOMAINS, + 'END' => '', + ], + 'PRIVATE' => [ + 'BEGIN' => self::PRIVATE_DOMAINS, + 'END' => '', + ], + ]; + + private const REGEX_PSL_SECTION = ',^// ===(?BEGIN|END) (?ICANN|PRIVATE) DOMAINS===,'; + /** * PSL rules as a multidimentional associative array. */ @@ -68,7 +95,93 @@ public static function fromPath(string $path, $context = null): self */ public static function fromString($content): self { - return new self(PublicSuffixListConverter::toArray($content)); + if (is_object($content) && method_exists($content, '__toString')) { + $content = (string) $content; + } + + if (!is_string($content)) { + throw new TypeError('The content to be converted should be a string or a Stringable object, `'.gettype($content).'` given.'); + } + + return new self(self::parse($content)); + } + + /** + * Convert the Public Suffix List into an associative, multidimensional array. + */ + private static function parse(string $content): array + { + $rules = []; + $section = ''; + $file = new SplTempFileObject(); + $file->fwrite($content); + $file->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); + /** @var string $line */ + foreach ($file as $line) { + $section = self::getSection($section, $line); + if ('' !== $section && false === strpos($line, '//')) { + $rules[$section] = $rules[$section] ?? []; + $rules[$section] = self::addRule($rules[$section], explode('.', $line)); + } + } + + return $rules; + } + + /** + * Returns the section type for a given line. + */ + private static function getSection(string $section, string $line): string + { + if (1 === preg_match(self::REGEX_PSL_SECTION, $line, $matches)) { + return self::PSL_SECTION[$matches['type']][$matches['point']]; + } + + return $section; + } + + /** + * Recursive method to build the array representation of the Public Suffix List. + * + * This method is based heavily on the code found in generateEffectiveTLDs.php + * + * @see https://github.com/usrflo/registered-domain-libs/blob/master/generateEffectiveTLDs.php + * A copy of the Apache License, Version 2.0, is provided with this + * distribution + * + * @param array $list Initially an empty array, this eventually + * becomes the array representation of a Public Suffix List section + * @param array $ruleParts One line (rule) from the Public Suffix List + * exploded on '.', or the remaining portion of that array during recursion + * + * @throws UnableToLoadPublicSuffixList if the domain name can not be converted using IDN to ASCII algorithm + */ + private static function addRule(array $list, array $ruleParts): array + { + // Adheres to canonicalization rule from the "Formal Algorithm" section + // of https://publicsuffix.org/list/ + // "The domain and all rules must be canonicalized in the normal way + // for hostnames - lower-case, Punycode (RFC 3492)." + try { + /** @var string $line */ + $line = array_pop($ruleParts); + $rule = IntlIdna::toAscii($line, IntlIdna::IDNA2008_ASCII_OPTIONS); + } catch (CannotProcessHost $exception) { + throw UnableToLoadPublicSuffixList::dueToInvalidRule($line ?? null, $exception); + } + + $isDomain = true; + if (0 === strpos($rule, '!')) { + $rule = substr($rule, 1); + $isDomain = false; + } + + $list[$rule] = $list[$rule] ?? ($isDomain ? [] : ['!' => '']); + if ($isDomain && [] !== $ruleParts) { + $list[$rule] = self::addRule($list[$rule], $ruleParts); + } + + return $list; } public static function fromJsonString(string $jsonString): self diff --git a/src/RulesTest.php b/src/RulesTest.php index 5f228c60..9a5a87d0 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -16,10 +16,7 @@ */ final class RulesTest extends TestCase { - /** - * @var Rules - */ - private $rules; + private Rules $rules; public function setUp(): void { @@ -49,6 +46,13 @@ public function testCreateFromPathThrowsException(): void Rules::fromPath('/foo/bar.dat'); } + public function testCreateFromPathThrowsExceptionIfTheContentIsInvalid(): void + { + self::expectException(UnableToLoadPublicSuffixList::class); + + Rules::fromPath(dirname(__DIR__).'/test_data/invalid_suffix_list_content.dat'); + } + /** * @covers ::jsonSerialize * @covers ::fromJsonString diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 521c1c4c..e747636d 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -8,17 +8,29 @@ use DateTimeInterface; use Iterator; use JsonException; +use SplTempFileObject; +use TypeError; use function count; use function fclose; use function fopen; +use function gettype; +use function is_object; +use function is_string; use function json_decode; +use function method_exists; +use function preg_match; use function stream_get_contents; -use function strtoupper; +use function strpos; use function substr; +use function trim; use const JSON_THROW_ON_ERROR; final class TopLevelDomains implements RootZoneDatabase { + private const IANA_DATE_FORMAT = 'D M d H:i:s Y e'; + + private const REGEXP_HEADER_LINE = '/^\# Version (?\d+), Last Updated (?.*?)$/'; + private DateTimeImmutable $lastUpdated; private string $version; @@ -65,13 +77,97 @@ public static function fromPath(string $path, $context = null): self */ public static function fromString($content): self { - $data = RootZoneDatabaseConverter::toArray($content); + if (is_object($content) && method_exists($content, '__toString')) { + $content = (string) $content; + } + + if (!is_string($content)) { + throw new TypeError('The content to be converted should be a string or a Stringable object, `'.gettype($content).'` given.'); + } + + $data = self::parse($content); + /** @var DateTimeImmutable $lastUpdated */ $lastUpdated = DateTimeImmutable::createFromFormat(DateTimeInterface::ATOM, $data['lastUpdated']); return new self($data['records'], $data['version'], $lastUpdated); } + /** + * Converts the IANA Root Zone Database into a TopLevelDomains associative array. + * + * @throws UnableToLoadRootZoneDatabase if the content is invalid or can not be correctly parsed and converted + */ + public static function parse(string $content): array + { + $data = []; + $file = new SplTempFileObject(); + $file->fwrite($content); + $file->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); + /** @var string $line */ + foreach ($file as $line) { + $line = trim($line); + if ([] === $data) { + $data = self::extractHeader($line); + continue; + } + + if (false === strpos($line, '#')) { + $data['records'] = $data['records'] ?? []; + $data['records'][] = self::extractRootZone($line); + continue; + } + + throw UnableToLoadRootZoneDatabase::dueToInvalidLine($line); + } + + if (isset($data['version'], $data['lastUpdated'], $data['records'])) { + return $data; + } + + throw UnableToLoadRootZoneDatabase::dueToFailedConversion(); + } + + /** + * Extract IANA Root Zone Database header info. + * + * @throws UnableToLoadRootZoneDatabase if the Header line is invalid + */ + private static function extractHeader(string $content): array + { + if (1 !== preg_match(self::REGEXP_HEADER_LINE, $content, $matches)) { + throw UnableToLoadRootZoneDatabase::dueToInvalidVersionLine($content); + } + + /** @var DateTimeImmutable $date */ + $date = DateTimeImmutable::createFromFormat(self::IANA_DATE_FORMAT, $matches['date']); + + return [ + 'version' => $matches['version'], + 'lastUpdated' => $date->format(DateTimeInterface::ATOM), + ]; + } + + /** + * Extract IANA Root Zone. + * + * @throws UnableToLoadRootZoneDatabase If the Root Zone is invalid + */ + private static function extractRootZone(string $content): string + { + try { + $tld = Suffix::fromUnknown(Domain::fromIDNA2008($content))->toAscii(); + } catch (CannotProcessHost $exception) { + throw UnableToLoadRootZoneDatabase::dueToInvalidRootZoneDomain($content, $exception); + } + + if (1 !== $tld->count() || '' === $tld->value()) { + throw UnableToLoadRootZoneDatabase::dueToInvalidRootZoneDomain($content); + } + + return $tld->toString(); + } + public static function fromJsonString(string $jsonString): self { try { @@ -134,18 +230,6 @@ public function jsonSerialize(): array ]; } - public function toString(): string - { - $output = '# Version '.$this->version - .', Last Updated '.$this->lastUpdated->format(self::IANA_DATE_FORMAT)."\n"; - - foreach ($this->records as $suffix) { - $output .= strtoupper($suffix)."\n"; - } - - return $output; - } - /** * @param mixed $host a type that supports instantiating a Domain from. */ diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index ddbfaeb7..60ff2fa8 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -9,7 +9,6 @@ use PHPUnit\Framework\TestCase; use TypeError; use function dirname; -use function file_get_contents; use function json_encode; /** @@ -17,7 +16,7 @@ */ final class TopLevelDomainsTest extends TestCase { - protected TopLevelDomains $topLevelDomains; + private TopLevelDomains $topLevelDomains; public function setUp(): void { @@ -54,6 +53,77 @@ public function testCreateFromPathThrowsException(): void TopLevelDomains::fromPath('/foo/bar.dat'); } + /** + * @dataProvider invalidContentProvider + */ + public function testConverterThrowsException(string $content): void + { + self::expectException(UnableToLoadRootZoneDatabase::class); + + TopLevelDomains::fromString($content); + } + + public function invalidContentProvider(): iterable + { + $doubleHeader = << [$doubleHeader], + 'invalid header' => [$invalidHeader], + 'empty content' => [''], + 'header not on the first line' => [$headerNoFirstLine], + 'invalid tld content' => [$invalidTldContent], + 'invalid root zone' => [$invalidTldContentNotRootZone], + 'empty tld' => [$invalidTldContentEmptyTld], + ]; + } + /** * @covers ::__set_state * @covers ::__construct @@ -77,13 +147,6 @@ public function testJsonMethods(): void self::assertEquals($this->topLevelDomains, TopLevelDomains::fromJsonString($data)); } - public function testToStringMethod(): void - { - $data = $this->topLevelDomains->toString(); - - self::assertEquals($this->topLevelDomains, TopLevelDomains::fromString($data)); - } - /** * @covers ::fromJsonString * @covers \Pdp\UnableToLoadRootZoneDatabase @@ -117,12 +180,7 @@ public function testGetterProperties(): void $topLevelDomains->lastUpdated() ); self::assertFalse($topLevelDomains->isEmpty()); - - /** @var string $content */ - $content = file_get_contents(dirname(__DIR__).'/test_data/root_zones.dat'); - $data = RootZoneDatabaseConverter::toArray($content); - self::assertEquals($data, $topLevelDomains->jsonSerialize()); - + self::assertArrayHasKey('lastUpdated', $topLevelDomains->jsonSerialize()); foreach ($topLevelDomains as $tld) { self::assertInstanceOf(Suffix::class, $tld); } From 8ad0fae7a0e4c8755726cbd4747cefb7a8913e4e Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Tue, 1 Dec 2020 09:25:16 +0100 Subject: [PATCH 337/461] Remove DomainName::isIdna2008 and add DomainName::clear method instead --- README.md | 12 +++++------- src/Domain.php | 38 +++++++++++++++++-------------------- src/DomainName.php | 7 ++----- src/DomainTest.php | 9 +-------- src/ResolvedDomain.php | 37 +++++++++++++----------------------- src/Rules.php | 10 +++------- src/RulesTest.php | 14 -------------- src/TopLevelDomains.php | 4 ++-- src/TopLevelDomainsTest.php | 17 ----------------- 9 files changed, 43 insertions(+), 105 deletions(-) diff --git a/README.md b/README.md index 180eb0e1..4a515e1d 100644 --- a/README.md +++ b/README.md @@ -319,6 +319,7 @@ $newDomain = $domain echo $domain->toString(); // display 'www.example.com' echo $newDomain->toString(); // display 'docs.example.com.www' +$newDomain->clear()->labels(); //returns [] ~~~ **WARNING: Because of its definition, a domain name can be `null` or a string.** @@ -375,32 +376,29 @@ is done via two (2) named constructors: - `Pdp\Domain::fromIDNA2008` - `Pdp\Domain::fromIDNA2003` -At any given moment the `Pdp\Domain` instance can tell you whether: +At any given moment the `Pdp\Domain` instance can tell you whether it is in +`ASCII` mode or not. -- the algorithm used for converting the domain is `IDNA2008`; -- if the domain value is in `ASCII` mode or not; +**Once instantiated there's no way to tell which algorithm is used to convert +the object from ascii to unicode and vice-versa** ~~~php use Pdp\Domain; $domain = Domain::fromIDNA2008('faß.de'); echo $domain->value(); // display 'faß.de' -$domain->isIdna2008(); // returns true $domain->isAscii(); // return false $asciiDomain = $domain->toAscii(); echo $asciiDomain->value(); // display 'xn--fa-hia.de' -$asciiDomain->isIdna2008(); // returns true $asciiDomain->isAscii(); // returns true $domain = Domain::fromIDNA2003('faß.de'); echo $domain->value(); // display 'fass.de' -$domain->isIdna2008(); // returns false $domain->isAscii(); // returns true $asciiDomain = $domain->toAscii(); echo $asciiDomain->value(); // display 'fass.de' -$asciiDomain->isIdna2008(); // returns false $asciiDomain->isAscii(); // returns true ~~~ diff --git a/src/Domain.php b/src/Domain.php index 826da267..267a9f15 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -84,25 +84,13 @@ private function parseDomain($domain): array if (!$domain instanceof DomainName) { if ($domain instanceof Host) { - $domain = $domain->value(); + $domain = $domain->toUnicode()->value(); } return $this->parseValue($domain); } - if ($domain->isIdna2008()) { - if (self::IDNA_2008 === $this->type) { - return [$domain->value(), $domain->labels()]; - } - - return $this->parseValue($domain->value()); - } - - if (self::IDNA_2003 === $this->type) { - return [$domain->value(), $domain->labels()]; - } - - return $this->parseValue($domain->value()); + return $this->parseValue($domain->toUnicode()->value()); } /** @@ -204,11 +192,6 @@ public function getIterator(): Iterator } } - public function isIdna2008(): bool - { - return self::IDNA_2008 === $this->type; - } - public function isAscii(): bool { return null === $this->domain || 1 !== preg_match(self::REGEXP_IDN_PATTERN, $this->domain); @@ -296,7 +279,7 @@ public function toUnicode(): self * * @throws TypeError if the domain can not be converted */ - private function normalize($domain): string + private function normalize($domain): ?string { if ($domain instanceof DomainNameProvider) { $domain = $domain->domain(); @@ -306,7 +289,11 @@ private function normalize($domain): string $domain = $domain->value(); } - if (null === $domain || (!is_string($domain) && !method_exists($domain, '__toString'))) { + if (null === $domain) { + return $domain; + } + + if ((!is_string($domain) && !method_exists($domain, '__toString'))) { throw new TypeError('The label must be a '.Host::class.', a stringable object or a string, `'.gettype($domain).'` given.'); } @@ -387,4 +374,13 @@ public function withoutLabel(int $key, int ...$keys): self return new self($domain, $this->type); } + + public function clear(): self + { + if (null === $this->domain) { + return $this; + } + + return new self(null, $this->type); + } } diff --git a/src/DomainName.php b/src/DomainName.php index b6a33e85..2139390c 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -14,11 +14,6 @@ */ interface DomainName extends Host, IteratorAggregate { - /** - * Tells whether IDNA Conversion is done using IDNA2008 algorithm. - */ - public function isIdna2008(): bool; - /** * Tells whether the current domain is in its ascii form. */ @@ -79,6 +74,8 @@ public function prepend($label): self; */ public function append($label): self; + public function clear(): self; + /** * Returns an instance with the specified label added at the specified key. * diff --git a/src/DomainTest.php b/src/DomainTest.php index 3c4a2d41..149b6ec1 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -296,7 +296,7 @@ public function withLabelWorksProvider(): iterable public function testWithLabelFailsWithTypeError(): void { self::expectException(TypeError::class); - Domain::fromIDNA2008('example.com')->withLabel(1, null); + Domain::fromIDNA2008('example.com')->withLabel(1, new \stdClass()); } public function testWithLabelFailsWithInvalidKey(): void @@ -396,13 +396,6 @@ public function testwithoutLabelWorksWithMultipleKeys(): void self::assertNull(Domain::fromIDNA2008('www.example.com')->withoutLabel(0, 1, 2)->value()); } - public function testConstructWithCustomIDNAOptions(): void - { - $domain = Domain::fromIDNA2008('example.com'); - - self::assertTrue($domain->isIdna2008()); - } - /** * @dataProvider resolveCustomIDNAOptionsProvider * @param ?string $expectedContent diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index cb743378..8fe1a56a 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -56,9 +56,7 @@ private function setDomainName(Host $domain): DomainName private function setSuffix(EffectiveTLD $suffix = null): EffectiveTLD { if (null === $suffix || null === $suffix->value()) { - $domain = $this->domain->isIdna2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); - - return Suffix::fromUnknown($domain); + return Suffix::fromUnknown($this->domain->clear()); } if (2 > count($this->domain)) { @@ -87,11 +85,7 @@ private function setSuffix(EffectiveTLD $suffix = null): EffectiveTLD */ private function normalize(EffectiveTLD $subject): EffectiveTLD { - if ($subject->domain()->isIdna2008() === $this->domain->isIdna2008()) { - return $subject->domain()->isAscii() === $this->domain->isAscii() ? $subject : $subject->toUnicode(); - } - - $newDomain = Domain::fromIDNA2003($subject->toUnicode()->value()); + $newDomain = $this->domain->clear()->append($subject->toUnicode()->value()); if ($this->domain->isAscii()) { $newDomain = $newDomain->toAscii(); } @@ -113,7 +107,7 @@ private function normalize(EffectiveTLD $subject): EffectiveTLD private function setRegistrableDomain(): DomainName { if (null === $this->suffix->value()) { - return $this->domain->isIdna2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); + return $this->domain->clear(); } $domain = implode('.', array_slice( @@ -121,7 +115,7 @@ private function setRegistrableDomain(): DomainName count($this->domain) - count($this->suffix) - 1 )); - $registrableDomain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($domain) : Domain::fromIDNA2003($domain); + $registrableDomain = $this->domain->clear()->append($domain); return $this->domain->isAscii() ? $registrableDomain->toAscii() : $registrableDomain->toUnicode(); } @@ -132,13 +126,13 @@ private function setRegistrableDomain(): DomainName private function setSubDomain(): DomainName { if (null === $this->registrableDomain->value()) { - return $this->domain->isIdna2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); + return $this->domain->clear(); } $nbLabels = count($this->domain); $nbRegistrableLabels = count($this->suffix) + 1; if ($nbLabels === $nbRegistrableLabels) { - return $this->domain->isIdna2008() ? Domain::fromIDNA2008(null) : Domain::fromIDNA2003(null); + return $this->domain->clear(); } $domain = implode('.', array_slice( @@ -147,7 +141,7 @@ private function setSubDomain(): DomainName $nbLabels - $nbRegistrableLabels )); - $subDomain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($domain) : Domain::fromIDNA2003($domain); + $subDomain = $this->domain->clear()->append($domain); return $this->domain->isAscii() ? $subDomain->toAscii() : $subDomain->toUnicode(); } @@ -224,15 +218,12 @@ public function withSuffix($suffix): self $host = implode('.', array_reverse(array_slice($this->domain->labels(), count($this->suffix)))); if (null === $suffix->value()) { - $domain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($host) : Domain::fromIDNA2003($host); - - return new self($domain, null); + return new self($this->domain->clear()->append($host), null); } $host .= '.'.$suffix->value(); - $domain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($host) : Domain::fromIDNA2003($host); - return new self($domain, $suffix); + return new self($this->domain->clear()->append($host), $suffix); } /** @@ -249,10 +240,10 @@ public function withSubDomain($subDomain): self } if (!$subDomain instanceof DomainName) { - $subDomain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($subDomain) : Domain::fromIDNA2003($subDomain); + $subDomain = $this->domain->clear()->append($subDomain); } - $subDomain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($subDomain) : Domain::fromIDNA2003($subDomain); + $subDomain = $this->domain->clear()->append($subDomain); if ($this->subDomain == $subDomain) { return $this; } @@ -265,9 +256,8 @@ public function withSubDomain($subDomain): self } $newDomainValue = $subDomain->toString().'.'.$this->registrableDomain->toString(); - $newDomain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($newDomainValue) : Domain::fromIDNA2003($newDomainValue); - return new self($newDomain, $this->suffix); + return new self($this->domain->clear()->append($newDomainValue), $this->suffix); } public function withSecondLevelDomain($label): self @@ -286,8 +276,7 @@ public function withSecondLevelDomain($label): self } $newDomainValue = $this->subDomain->value().'.'.$newRegistrableDomain->value(); - $newDomain = $this->domain->isIdna2008() ? Domain::fromIDNA2008($newDomainValue) : Domain::fromIDNA2003($newDomainValue); - return new self($newDomain, $this->suffix); + return new self($this->domain->clear()->append($newDomainValue), $this->suffix); } } diff --git a/src/Rules.php b/src/Rules.php index 07cb66b1..fef62e07 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -301,8 +301,7 @@ private function getEffectiveTLD(DomainName $domain, string $section): Effective return $icann; } - $topLabel = $domain->toAscii()->label(0); - $publicSuffix = $domain->isIdna2008() ? Domain::fromIDNA2008($topLabel) : Domain::fromIDNA2003($topLabel); + $publicSuffix = $domain->clear()->withLabel(0, $domain->label(0)); return Suffix::fromUnknown($publicSuffix); } @@ -336,15 +335,12 @@ private function getEffectiveTLDFromSection(DomainName $domain, string $section) } if ([] === $matches) { - $topLabel = $domain->toAscii()->label(0); - $publicSuffix = $domain->isIdna2008() ? Domain::fromIDNA2008($topLabel) : Domain::fromIDNA2003($topLabel); + $publicSuffix = $domain->clear()->withLabel(0, $domain->label(0)); return Suffix::fromUnknown($publicSuffix); } - $publicSuffixLabels = implode('.', array_reverse($matches)); - $publicSuffix = $domain->isIdna2008() ? Domain::fromIDNA2008($publicSuffixLabels) : Domain::fromIDNA2003($publicSuffixLabels); - + $publicSuffix = $domain->clear()->append(implode('.', array_reverse($matches))); if (self::PRIVATE_DOMAINS === $section) { return Suffix::fromPrivate($publicSuffix); } diff --git a/src/RulesTest.php b/src/RulesTest.php index 9a5a87d0..1578cce1 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -591,20 +591,6 @@ public function testPublicSuffixSpec(): void $this->checkPublicSuffix('xn--fiqs8s', null); } - public function testResolveWithIDNAOptions(): void - { - $resolvedByDefault = $this->rules->resolve('foo.de'); - self::assertTrue($resolvedByDefault->domain()->isIdna2008()); - - /** @var string $string */ - $string = file_get_contents(dirname(__DIR__).'/test_data/public_suffix_list.dat'); - $rules = Rules::fromString($string); - $domain = Domain::fromIDNA2008('foo.de'); - $resolved = $rules->resolve($domain); - - self::assertTrue($resolved->domain()->isIdna2008()); - } - /** * @dataProvider effectiveTLDProvider */ diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index e747636d..302541af 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -217,7 +217,7 @@ public function isEmpty(): bool public function getIterator(): Iterator { foreach ($this->records as $tld) { - yield Suffix::fromUnknown(Domain::fromIDNA2008($tld)->toAscii()); + yield Suffix::fromIANA(Domain::fromIDNA2008($tld)->toAscii()); } } @@ -276,7 +276,7 @@ private function fetchEffectiveTLD(DomainName $domain): ?EffectiveTLD $label = $domain->toAscii()->label(0); foreach ($this as $tld) { if ($tld->value() === $label) { - $publicSuffix = $domain->isIdna2008() ? Domain::fromIDNA2008($domain->label(0)) : Domain::fromIDNA2003($domain->label(0)); + $publicSuffix = $domain->clear()->withLabel(0, $domain->label(0)); return Suffix::fromIANA($publicSuffix); } diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 60ff2fa8..6733cb1e 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -297,23 +297,6 @@ public function testGetTopLevelDomainWithUnregisteredTLD(): void $collection->getIANADomain('localhost.locale'); } - public function testResolveWithIDNAOptions(): void - { - $resolved = $this->topLevelDomains->resolve('foo.de'); - - self::assertTrue($resolved->domain()->isIdna2008()); - - $collection = TopLevelDomains::fromPath( - dirname(__DIR__).'/test_data/root_zones.dat', - null - ); - - $domain = Domain::fromIDNA2003('foo.de'); - $resolved = $collection->resolve($domain); - - self::assertFalse($resolved->domain()->isIdna2008()); - } - public function validTldProvider(): iterable { return [ From face02cb2f1ea91beb6d845c30c83b822eb3ad5e Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 1 Dec 2020 10:45:03 +0100 Subject: [PATCH 338/461] Update wording in DomainName interface --- src/DomainName.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/DomainName.php b/src/DomainName.php index 2139390c..e73453bc 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -74,8 +74,6 @@ public function prepend($label): self; */ public function append($label): self; - public function clear(): self; - /** * Returns an instance with the specified label added at the specified key. * @@ -106,4 +104,12 @@ public function withLabel(int $key, $label): self; * @throws CannotProcessHost If the key is out of bounds */ public function withoutLabel(int $key, int ...$keys): self; + + /** + * Returns an instance with all labels removed. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains no label + */ + public function clear(): self; } From d9502b2769bc23279e8da8529ff0de1a9ac3b69d Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 1 Dec 2020 11:12:43 +0100 Subject: [PATCH 339/461] Improve Cache implementation --- src/Storage/PublicSuffixListPsr16Cache.php | 13 +++++++++++-- src/Storage/RootZoneDatabasePsr16Cache.php | 13 +++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/Storage/PublicSuffixListPsr16Cache.php b/src/Storage/PublicSuffixListPsr16Cache.php index af29176c..8a28e3a6 100644 --- a/src/Storage/PublicSuffixListPsr16Cache.php +++ b/src/Storage/PublicSuffixListPsr16Cache.php @@ -7,6 +7,7 @@ use DateInterval; use DateTimeImmutable; use DateTimeInterface; +use DateTimeZone; use InvalidArgumentException; use Pdp\PublicSuffixList; use Psr\SimpleCache\CacheException; @@ -41,7 +42,8 @@ public function __construct(CacheInterface $cache, string $cachePrefix = '', $ca * * @param mixed $ttl the cache TTL * - * @throws TypeError if the value type is not recognized + * @throws InvalidArgumentException if the value can not be computed + * @throws TypeError if the value type is not recognized */ private function setTtl($ttl): ?DateInterval { @@ -50,7 +52,14 @@ private function setTtl($ttl): ?DateInterval } if ($ttl instanceof DateTimeInterface) { - return (new DateTimeImmutable('NOW', $ttl->getTimezone()))->diff($ttl); + /** @var DateTimeZone $timezone */ + $timezone = $ttl->getTimezone(); + + $now = new DateTimeImmutable('NOW', $timezone); + /** @var DateInterval $ttl */ + $ttl = $now->diff($ttl, false); + + return $ttl; } if (false !== ($res = filter_var($ttl, FILTER_VALIDATE_INT))) { diff --git a/src/Storage/RootZoneDatabasePsr16Cache.php b/src/Storage/RootZoneDatabasePsr16Cache.php index a2c044ef..0821c01f 100644 --- a/src/Storage/RootZoneDatabasePsr16Cache.php +++ b/src/Storage/RootZoneDatabasePsr16Cache.php @@ -7,6 +7,7 @@ use DateInterval; use DateTimeImmutable; use DateTimeInterface; +use DateTimeZone; use InvalidArgumentException; use Pdp\RootZoneDatabase; use Psr\SimpleCache\CacheException; @@ -41,7 +42,8 @@ public function __construct(CacheInterface $cache, string $cachePrefix = '', $ca * * @param mixed $ttl the cache TTL * - * @throws TypeError if the value type is not recognized + * @throws InvalidArgumentException if the value can not be computed + * @throws TypeError if the value type is not recognized */ private function setTtl($ttl): ?DateInterval { @@ -50,7 +52,14 @@ private function setTtl($ttl): ?DateInterval } if ($ttl instanceof DateTimeInterface) { - return (new DateTimeImmutable('NOW', $ttl->getTimezone()))->diff($ttl); + /** @var DateTimeZone $timezone */ + $timezone = $ttl->getTimezone(); + + $now = new DateTimeImmutable('NOW', $timezone); + /** @var DateInterval $ttl */ + $ttl = $now->diff($ttl, false); + + return $ttl; } if (false !== ($res = filter_var($ttl, FILTER_VALIDATE_INT))) { From 727958df724091372de3d848e4713a358f04d1c9 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 1 Dec 2020 23:18:04 +0100 Subject: [PATCH 340/461] make the SLD a DomainName object too --- README.md | 9 +++++---- phpstan.neon | 2 ++ src/ResolvedDomain.php | 15 +++++++++++++-- src/ResolvedDomainName.php | 7 +++---- src/ResolvedDomainTest.php | 4 ++-- 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 4a515e1d..328341a4 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ $publicSuffixList = Rules::fromPath('/path/to/cache/public-suffix-list.dat'); $result = $publicSuffixList->resolve('www.PreF.OkiNawA.jP'); echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; echo $result->subDomain()->toString(); //display 'www'; -echo $result->secondLevelDomain(); //display 'pref'; +echo $result->secondLevelDomain()->toString(); //display 'pref'; echo $result->registrableDomain()->toString(); //display 'pref.okinawa.jp'; echo $result->suffix()->toString(); //display 'okinawa.jp'; $result->suffix()->isICANN(); //return true; @@ -83,7 +83,7 @@ $rootZoneDatabase = TopLevelDomains::fromPath('/path/to/cache/tlds-alpha-by-doma $result = $rootZoneDatabase->resolve('www.PreF.OkiNawA.jP'); echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; echo $result->suffix()->toString(); //display 'jp'; -echo $result->secondLevelDomain(); //display 'okinawa'; +echo $result->secondLevelDomain()->toString(); //display 'okinawa'; echo $result->registrableDomain()->toString(); //display 'okinawa.jp'; echo $result->subDomain()->toString(); //display 'www.pref'; echo $result->suffix()->isIANA(); //return true @@ -181,7 +181,7 @@ use Pdp\RootZoneDatabase; $result = $rootZoneDatabase->resolve('www.PreF.OkiNawA.jP'); echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; echo $result->suffix()->toString(); //display 'jp'; -echo $result->secondLevelDomain(); //display 'okinawa'; +echo $result->secondLevelDomain()->toString(); //display 'okinawa'; echo $result->registrableDomain()->toString(); //display 'okinawa.jp'; echo $result->subDomain()->toString(); //display 'www.pref'; echo $result->suffix()->isIANA(); //return true @@ -270,9 +270,10 @@ account the Effective TLD, the library provides a `Domain` object tailored for manipulating domain labels. You can access the object using the following methods: - the `ResolvedDomain::domain` method -- the `Suffix::domain` method - the `ResolvedDomain::subDomain` method - the `ResolvedDomain::registrableDomain` method +- the `ResolvedDomain::secondLevelDomain` method +- the `Suffix::domain` method `Domain` objects usage are explain in the next section. diff --git a/phpstan.neon b/phpstan.neon index 23548c1f..07ee541c 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -10,6 +10,8 @@ parameters: - '#should be covariant with return type#' - message: '#Method Pdp\\ResolvedDomain::withSubDomain\(\) has parameter \$subDomain with no typehint specified.#' path: src/ResolvedDomain.php + - message: '#Method Pdp\\ResolvedDomain::withSecondLevelDomain\(\) has parameter \$label with no typehint specified.#' + path: src/ResolvedDomain.php - message: '#Call to function array_keys\(\) requires parameter \#3 to be set.#' path: src/Domain.php reportUnmatchedIgnoredErrors: true diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 8fe1a56a..33a52ccc 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -176,9 +176,9 @@ public function registrableDomain(): DomainName return $this->registrableDomain; } - public function secondLevelDomain(): ?string + public function secondLevelDomain(): DomainName { - return $this->registrableDomain->label(-1); + return $this->registrableDomain->clear()->append($this->registrableDomain->label(-1)); } public function subDomain(): DomainName @@ -260,8 +260,19 @@ public function withSubDomain($subDomain): self return new self($this->domain->clear()->append($newDomainValue), $this->suffix); } + /** + * {@inheritDoc} + */ public function withSecondLevelDomain($label): self { + if ($label instanceof DomainNameProvider) { + $label = $label->domain(); + } + + if ($label instanceof Host) { + $label = $label->value(); + } + if (null === $this->registrableDomain->value()) { throw UnableToResolveDomain::dueToMissingRegistrableDomain($this->domain); } diff --git a/src/ResolvedDomainName.php b/src/ResolvedDomainName.php index 94ef7ac0..e70ff9be 100644 --- a/src/ResolvedDomainName.php +++ b/src/ResolvedDomainName.php @@ -14,7 +14,7 @@ public function suffix(): EffectiveTLD; /** * Returns the second level domain component. */ - public function secondLevelDomain(): ?string; + public function secondLevelDomain(): ?DomainName; /** * Returns the registrable domain component. @@ -34,7 +34,7 @@ public function subDomain(): DomainName; * * @throws CannotProcessHost If the Sub domain can not be added to the current Domain */ - public function withSubDomain(Host $subDomain): self; + public function withSubDomain(DomainName $subDomain): self; /** * Returns an instance with the specified second level domain label added. @@ -42,10 +42,9 @@ public function withSubDomain(Host $subDomain): self; * This method MUST retain the state of the current instance, and return * an instance that contains the second level domain label * - * @param ?string $label * @throws CannotProcessHost If the second level domain label can not be added */ - public function withSecondLevelDomain(?string $label): self; + public function withSecondLevelDomain(DomainName $label): self; /** * Returns an instance with the specified public suffix added. diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index f8b59064..b5bce644 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -19,7 +19,7 @@ public function testRegistrableDomainIsNullWithFoundDomain(): void self::assertNull($domain->suffix()->value()); self::assertNull($domain->registrableDomain()->value()); self::assertNull($domain->subDomain()->value()); - self::assertNull($domain->secondLevelDomain()); + self::assertNull($domain->secondLevelDomain()->value()); } /** @@ -537,7 +537,7 @@ public function testWithSecondLevelDomain( $domain = new ResolvedDomain(Domain::fromIDNA2008($host), Suffix::fromICANN(Domain::fromIDNA2008($publicSuffix))); $newDomain = $domain->withSecondLevelDomain($sld); - self::assertSame($expectedSld, $newDomain->secondLevelDomain()); + self::assertSame($expectedSld, $newDomain->secondLevelDomain()->value()); self::assertEquals($expectedHost, $newDomain->value()); self::assertEquals($domain->suffix(), $newDomain->suffix()); self::assertEquals($domain->subDomain(), $newDomain->subDomain()); From 89294d77789033cb9d47734db54029421f086865 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 2 Dec 2020 08:15:29 +0100 Subject: [PATCH 341/461] BugFix ResolvedDomain::withSecondLevelDomain --- src/ResolvedDomain.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 33a52ccc..2d4a1ba8 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -265,19 +265,19 @@ public function withSubDomain($subDomain): self */ public function withSecondLevelDomain($label): self { - if ($label instanceof DomainNameProvider) { - $label = $label->domain(); + if (null === $this->registrableDomain->value()) { + throw UnableToResolveDomain::dueToMissingRegistrableDomain($this->domain); } - if ($label instanceof Host) { - $label = $label->value(); + if ($label instanceof DomainNameProvider) { + $label = $label->domain(); } - if (null === $this->registrableDomain->value()) { - throw UnableToResolveDomain::dueToMissingRegistrableDomain($this->domain); + if (!$label instanceof DomainName) { + $label = Domain::fromIDNA2008($label); } - $newRegistrableDomain = $this->registrableDomain->withLabel(-1, $label); + $newRegistrableDomain = $this->registrableDomain->withoutLabel(-1)->prepend($label->value()); if ($newRegistrableDomain == $this->registrableDomain) { return $this; } From 41544ff1d775cc86ef175eb5c96f3df1e1cb9672 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 2 Dec 2020 09:30:43 +0100 Subject: [PATCH 342/461] Improve ResolvedDomain validation --- src/Rules.php | 12 ++++++------ src/TopLevelDomains.php | 5 ----- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/Rules.php b/src/Rules.php index fef62e07..4fa0492b 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -275,10 +275,6 @@ private function validateDomain($domain): DomainName $domain = Domain::fromIDNA2008($domain); } - if ((2 > count($domain)) || ('.' === substr($domain->toString(), -1, 1))) { - throw UnableToResolveDomain::dueToUnresolvableDomain($domain); - } - return $domain; } @@ -335,9 +331,13 @@ private function getEffectiveTLDFromSection(DomainName $domain, string $section) } if ([] === $matches) { - $publicSuffix = $domain->clear()->withLabel(0, $domain->label(0)); + $label = $domain->label(0); + $publicSuffix = $domain->clear(); + if ('' === $label) { + return Suffix::fromUnknown($publicSuffix); + } - return Suffix::fromUnknown($publicSuffix); + return Suffix::fromUnknown($publicSuffix->append($label)); } $publicSuffix = $domain->clear()->append(implode('.', array_reverse($matches))); diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 302541af..d44a3d3a 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -21,7 +21,6 @@ use function preg_match; use function stream_get_contents; use function strpos; -use function substr; use function trim; use const JSON_THROW_ON_ERROR; @@ -264,10 +263,6 @@ private function validateDomain($domain): DomainName $domain = Domain::fromIDNA2008($domain); } - if ((2 > count($domain)) || ('.' === substr($domain->toString(), -1, 1))) { - throw UnableToResolveDomain::dueToUnresolvableDomain($domain); - } - return $domain; } From 499afe409b35658018a2549d0c36c5d8c0fabe18 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 2 Dec 2020 09:41:14 +0100 Subject: [PATCH 343/461] Adding a private property to ResolvedDomain --- src/ResolvedDomain.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 2d4a1ba8..246b9131 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -18,6 +18,8 @@ final class ResolvedDomain implements ResolvedDomainName private EffectiveTLD $suffix; + private DomainName $secondLevelDomain; + private DomainName $registrableDomain; private DomainName $subDomain; @@ -27,6 +29,7 @@ public function __construct(Host $domain, EffectiveTLD $suffix = null) $this->domain = $this->setDomainName($domain); $this->suffix = $this->setSuffix($suffix); $this->registrableDomain = $this->setRegistrableDomain(); + $this->secondLevelDomain = $this->setSecondLevelDomain(); $this->subDomain = $this->setSubDomain(); } @@ -120,6 +123,11 @@ private function setRegistrableDomain(): DomainName return $this->domain->isAscii() ? $registrableDomain->toAscii() : $registrableDomain->toUnicode(); } + private function setSecondLevelDomain(): DomainName + { + return $this->registrableDomain->clear()->append($this->registrableDomain->label(-1)); + } + /** * Computes the sub domain part. */ @@ -178,7 +186,7 @@ public function registrableDomain(): DomainName public function secondLevelDomain(): DomainName { - return $this->registrableDomain->clear()->append($this->registrableDomain->label(-1)); + return $this->secondLevelDomain; } public function subDomain(): DomainName From 29fcfb8b57ee046ff25b88ca32938461ddcc2c8f Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 2 Dec 2020 12:01:35 +0100 Subject: [PATCH 344/461] Introducing ResolvedDomain::fromHost --- src/ResolvedDomain.php | 28 +++++++++++++++------- src/ResolvedDomainTest.php | 46 ++++++++++++++++++------------------- src/Rules.php | 10 ++++---- src/RulesTest.php | 2 +- src/TopLevelDomains.php | 8 +++---- src/TopLevelDomainsTest.php | 2 +- 6 files changed, 54 insertions(+), 42 deletions(-) diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 246b9131..1fcabb93 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -24,9 +24,19 @@ final class ResolvedDomain implements ResolvedDomainName private DomainName $subDomain; - public function __construct(Host $domain, EffectiveTLD $suffix = null) + /** + * @param mixed $domain the domain to be resolved + */ + public static function fromHost($domain, EffectiveTLD $suffix = null): self + { + $domain = self::setDomainName($domain); + + return new self($domain, $suffix ?? Suffix::fromUnknown($domain->clear())); + } + + private function __construct(DomainName $domain, EffectiveTLD $suffix) { - $this->domain = $this->setDomainName($domain); + $this->domain = $domain; $this->suffix = $this->setSuffix($suffix); $this->registrableDomain = $this->setRegistrableDomain(); $this->secondLevelDomain = $this->setSecondLevelDomain(); @@ -38,7 +48,10 @@ public static function __set_state(array $properties): self return new self($properties['domain'], $properties['suffix']); } - private function setDomainName(Host $domain): DomainName + /** + * @param mixed $domain The domain to be resolved + */ + private static function setDomainName($domain): DomainName { if ($domain instanceof DomainNameProvider) { return $domain->domain(); @@ -48,7 +61,7 @@ private function setDomainName(Host $domain): DomainName return $domain; } - return Domain::fromIDNA2008($domain->value()); + return Domain::fromIDNA2008($domain); } /** @@ -56,9 +69,9 @@ private function setDomainName(Host $domain): DomainName * * @throws UnableToResolveDomain If the public suffic can not be attached to the domain */ - private function setSuffix(EffectiveTLD $suffix = null): EffectiveTLD + private function setSuffix(EffectiveTLD $suffix): EffectiveTLD { - if (null === $suffix || null === $suffix->value()) { + if (null === $suffix->value()) { return Suffix::fromUnknown($this->domain->clear()); } @@ -224,9 +237,8 @@ public function withSuffix($suffix): self } $host = implode('.', array_reverse(array_slice($this->domain->labels(), count($this->suffix)))); - if (null === $suffix->value()) { - return new self($this->domain->clear()->append($host), null); + return new self($this->domain->clear()->append($host), Suffix::fromUnknown($this->domain->clear())); } $host .= '.'.$suffix->value(); diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index b5bce644..fd3a8af9 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -15,7 +15,7 @@ final class ResolvedDomainTest extends TestCase { public function testRegistrableDomainIsNullWithFoundDomain(): void { - $domain = new ResolvedDomain(Domain::fromIDNA2003('faketld')); + $domain = ResolvedDomain::fromHost(Domain::fromIDNA2003('faketld')); self::assertNull($domain->suffix()->value()); self::assertNull($domain->registrableDomain()->value()); self::assertNull($domain->subDomain()->value()); @@ -30,7 +30,7 @@ public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain(?stri { self::expectException(UnableToResolveDomain::class); - new ResolvedDomain(Domain::fromIDNA2003($domain), Suffix::fromICANN(Domain::fromIDNA2003($publicSuffix))); + ResolvedDomain::fromHost(Domain::fromIDNA2003($domain), Suffix::fromICANN(Domain::fromIDNA2003($publicSuffix))); } public function provideWrongConstructor(): iterable @@ -57,7 +57,7 @@ public function provideWrongConstructor(): iterable public function testDomainInternalPhpMethod(): void { - $domain = new ResolvedDomain(Domain::fromIDNA2003('www.ulb.ac.be'), Suffix::fromICANN(Domain::fromIDNA2003('ac.be'))); + $domain = ResolvedDomain::fromHost(Domain::fromIDNA2003('www.ulb.ac.be'), Suffix::fromICANN(Domain::fromIDNA2003('ac.be'))); $generateDomain = eval('return '.var_export($domain, true).';'); self::assertEquals($domain, $generateDomain); self::assertEquals('"www.ulb.ac.be"', json_encode($domain->jsonSerialize())); @@ -103,7 +103,7 @@ public function testToIDN( ): void { $objPublicSuffix = (null === $publicSuffix) ? Suffix::fromUnknown(Domain::fromIDNA2003(null)) : Suffix::fromICANN(Domain::fromIDNA2003($publicSuffix)); - $domain = new ResolvedDomain(Domain::fromIDNA2003($domain), $objPublicSuffix); + $domain = ResolvedDomain::fromHost(Domain::fromIDNA2003($domain), $objPublicSuffix); self::assertSame($expectedDomain, $domain->value()); self::assertSame($expectedSuffix, $domain->suffix()->value()); @@ -194,7 +194,7 @@ public function testToAscii( ): void { $objPublicSuffix = (null === $publicSuffix) ? Suffix::fromUnknown(Domain::fromIDNA2003(null)) : Suffix::fromICANN(Domain::fromIDNA2003($publicSuffix)); - $domain = new ResolvedDomain(Domain::fromIDNA2003($domain), $objPublicSuffix); + $domain = ResolvedDomain::fromHost(Domain::fromIDNA2003($domain), $objPublicSuffix); self::assertSame($expectedDomain, $domain->value()); self::assertSame($expectedSuffix, $domain->suffix()->value()); @@ -269,7 +269,7 @@ public function withSubDomainWorksProvider(): iterable { return [ 'simple addition' => [ - 'domain' => new ResolvedDomain( + 'domain' => ResolvedDomain::fromHost( Domain::fromIDNA2003('example.com'), Suffix::fromICANN(Domain::fromIDNA2003('com')) ), @@ -277,7 +277,7 @@ public function withSubDomainWorksProvider(): iterable 'expected' => 'www', ], 'simple addition IDN (1)' => [ - 'domain' => new ResolvedDomain( + 'domain' => ResolvedDomain::fromHost( Domain::fromIDNA2003('example.com'), Suffix::fromICANN(Domain::fromIDNA2003('com')) ), @@ -285,17 +285,17 @@ public function withSubDomainWorksProvider(): iterable 'expected' => 'xn--bb-bjab', ], 'simple addition IDN (2)' => [ - 'domain' => new ResolvedDomain(Domain::fromIDNA2003('Яндекс.РФ'), Suffix::fromICANN(Domain::fromIDNA2003('рф'))), + 'domain' => ResolvedDomain::fromHost(Domain::fromIDNA2003('Яндекс.РФ'), Suffix::fromICANN(Domain::fromIDNA2003('рф'))), 'subdomain' => 'bébé', 'expected' => 'bébé', ], 'simple removal' => [ - 'domain' => new ResolvedDomain(Domain::fromIDNA2003('example.com'), Suffix::fromICANN(Domain::fromIDNA2003('com'))), + 'domain' => ResolvedDomain::fromHost(Domain::fromIDNA2003('example.com'), Suffix::fromICANN(Domain::fromIDNA2003('com'))), 'subdomain' => null, 'expected' => null, ], 'simple removal IDN' => [ - 'domain' => new ResolvedDomain(Domain::fromIDNA2003('bébé.Яндекс.РФ'), Suffix::fromICANN(Domain::fromIDNA2003('рф'))), + 'domain' => ResolvedDomain::fromHost(Domain::fromIDNA2003('bébé.Яндекс.РФ'), Suffix::fromICANN(Domain::fromIDNA2003('рф'))), 'subdomain' => 'xn--bb-bjab', 'expected' => 'bébé', ], @@ -306,21 +306,21 @@ public function testWithSubDomainFailsWithNullDomain(): void { self::expectException(UnableToResolveDomain::class); - (new ResolvedDomain(Domain::fromIDNA2008(null)))->withSubDomain('www'); + ResolvedDomain::fromHost(Domain::fromIDNA2008(null))->withSubDomain('www'); } public function testWithSubDomainFailsWithOneLabelDomain(): void { self::expectException(UnableToResolveDomain::class); - (new ResolvedDomain(Domain::fromIDNA2003('localhost')))->withSubDomain('www'); + ResolvedDomain::fromHost(Domain::fromIDNA2003('localhost'))->withSubDomain('www'); } public function testWithEmptySubdomain(): void { self::expectException(SyntaxError::class); - $domain = new ResolvedDomain(Domain::fromIDNA2003('www.example.com'), Suffix::fromICANN(Domain::fromIDNA2003('com'))); + $domain = ResolvedDomain::fromHost(Domain::fromIDNA2003('www.example.com'), Suffix::fromICANN(Domain::fromIDNA2003('com'))); $domain->withSubDomain(''); } @@ -328,7 +328,7 @@ public function testWithEmptySubdomain(): void public function testWithSubDomainFailsWithNonStringableObject(): void { self::expectException(TypeError::class); - $domain = new ResolvedDomain(Domain::fromIDNA2003('www.example.com'), Suffix::fromICANN(Domain::fromIDNA2003('com'))); + $domain = ResolvedDomain::fromHost(Domain::fromIDNA2003('www.example.com'), Suffix::fromICANN(Domain::fromIDNA2003('com'))); $domain->withSubDomain(date_create()); } @@ -337,7 +337,7 @@ public function testWithSubDomainWithoutPublicSuffixInfo(): void { self::expectException(UnableToResolveDomain::class); - (new ResolvedDomain(Domain::fromIDNA2003('www.example.com')))->withSubDomain('www'); + ResolvedDomain::fromHost(Domain::fromIDNA2003('www.example.com'))->withSubDomain('www'); } /** @@ -365,7 +365,7 @@ public function testWithPublicSuffixWorks( public function withPublicSuffixWorksProvider(): iterable { - $base_domain = new ResolvedDomain(Domain::fromIDNA2003('example.com'), Suffix::fromICANN(Domain::fromIDNA2003('com'))); + $base_domain = ResolvedDomain::fromHost(Domain::fromIDNA2003('example.com'), Suffix::fromICANN(Domain::fromIDNA2003('com'))); return [ 'simple update (1)' => [ @@ -409,7 +409,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'simple update IDN (2)' => [ - 'domain' => new ResolvedDomain(Domain::fromIDNA2003('www.bébé.be'), Suffix::fromICANN(Domain::fromIDNA2003('be'))), + 'domain' => ResolvedDomain::fromHost(Domain::fromIDNA2003('www.bébé.be'), Suffix::fromICANN(Domain::fromIDNA2003('be'))), 'publicSuffix' => Suffix::fromICANN(Domain::fromIDNA2003('xn--p1ai')), 'expected' => 'рф', 'isKnown' => true, @@ -417,7 +417,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'adding the public suffix to a single label domain' => [ - 'domain' => new ResolvedDomain(Domain::fromIDNA2003('localhost')), + 'domain' => ResolvedDomain::fromHost(Domain::fromIDNA2003('localhost')), 'publicSuffix' => 'www', 'expected' => 'www', 'isKnown' => false, @@ -425,7 +425,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'removing the public suffix list' => [ - 'domain' => new ResolvedDomain(Domain::fromIDNA2003('www.bébé.be'), Suffix::fromICANN(Domain::fromIDNA2003('be'))), + 'domain' => ResolvedDomain::fromHost(Domain::fromIDNA2003('www.bébé.be'), Suffix::fromICANN(Domain::fromIDNA2003('be'))), 'publicSuffix' => null, 'expected' => null, 'isKnown' => false, @@ -433,7 +433,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'with custom IDNA domain options' =>[ - 'domain' => new ResolvedDomain(Domain::fromIDNA2008('www.bébé.be'), Suffix::fromICANN(Domain::fromIDNA2008('be'))), + 'domain' => ResolvedDomain::fromHost(Domain::fromIDNA2008('www.bébé.be'), Suffix::fromICANN(Domain::fromIDNA2008('be'))), 'publicSuffix' => null, 'expected' => null, 'isKnown' => false, @@ -447,7 +447,7 @@ public function testWithPublicSuffixFailsWithNullDomain(): void { self::expectException(SyntaxError::class); - (new ResolvedDomain(Domain::fromIDNA2008(null)))->withSuffix('www'); + ResolvedDomain::fromHost(Domain::fromIDNA2008(null))->withSuffix('www'); } /** @@ -468,7 +468,7 @@ public function testResolveWorksWithCustomIDNAOptions( ?string $expectedSubDomain ): void { $host = Domain::fromIDNA2008($domainName); - $resolvedDomain = new ResolvedDomain($host, Suffix::fromICANN(Domain::fromIDNA2008($publicSuffix))); + $resolvedDomain = ResolvedDomain::fromHost($host, Suffix::fromICANN(Domain::fromIDNA2008($publicSuffix))); self::assertSame($expectedContent, $resolvedDomain->value()); self::assertSame($expectedAscii, $resolvedDomain->toAscii()->value()); @@ -534,7 +534,7 @@ public function testWithSecondLevelDomain( ?string $expectedSld, ?string $expectedHost ): void { - $domain = new ResolvedDomain(Domain::fromIDNA2008($host), Suffix::fromICANN(Domain::fromIDNA2008($publicSuffix))); + $domain = ResolvedDomain::fromHost(Domain::fromIDNA2008($host), Suffix::fromICANN(Domain::fromIDNA2008($publicSuffix))); $newDomain = $domain->withSecondLevelDomain($sld); self::assertSame($expectedSld, $newDomain->secondLevelDomain()->value()); diff --git a/src/Rules.php b/src/Rules.php index 4fa0492b..1271602e 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -213,9 +213,9 @@ public function resolve($host): ResolvedDomainName try { return $this->getCookieDomain($host); } catch (UnableToResolveDomain $exception) { - return new ResolvedDomain($exception->getDomain()); + return ResolvedDomain::fromHost($exception->getDomain()); } catch (SyntaxError $exception) { - return new ResolvedDomain(Domain::fromIDNA2008(null)); + return ResolvedDomain::fromHost(Domain::fromIDNA2008(null)); } } @@ -226,7 +226,7 @@ public function getCookieDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); - return new ResolvedDomain($domain, $this->getEffectiveTLD($domain, '')); + return ResolvedDomain::fromHost($domain, $this->getEffectiveTLD($domain, '')); } /** @@ -240,7 +240,7 @@ public function getICANNDomain($host): ResolvedDomainName throw UnableToResolveDomain::dueToMissingSuffix($domain, 'ICANN'); } - return new ResolvedDomain($domain, $publicSuffix); + return ResolvedDomain::fromHost($domain, $publicSuffix); } /** @@ -254,7 +254,7 @@ public function getPrivateDomain($host): ResolvedDomainName throw UnableToResolveDomain::dueToMissingSuffix($domain, 'private'); } - return new ResolvedDomain($domain, $publicSuffix); + return ResolvedDomain::fromHost($domain, $publicSuffix); } /** diff --git a/src/RulesTest.php b/src/RulesTest.php index 1578cce1..729c9b17 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -214,7 +214,7 @@ public function testResolvingICANNDomainInvalid(): void public function testWithDomainObject(): void { - $domain = new ResolvedDomain( + $domain = ResolvedDomain::fromHost( Domain::fromIDNA2008('private.ulb.ac.be'), Suffix::fromICANN('ac.be') ); diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index d44a3d3a..723cc36c 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -237,11 +237,11 @@ public function resolve($host): ResolvedDomainName try { $domain = $this->validateDomain($host); - return new ResolvedDomain($domain, $this->fetchEffectiveTLD($domain)); + return ResolvedDomain::fromHost($domain, $this->fetchEffectiveTLD($domain)); } catch (UnableToResolveDomain $exception) { - return new ResolvedDomain($exception->getDomain()); + return ResolvedDomain::fromHost($exception->getDomain()); } catch (SyntaxError $exception) { - return new ResolvedDomain(Domain::fromIDNA2008(null)); + return ResolvedDomain::fromHost(Domain::fromIDNA2008(null)); } } @@ -291,6 +291,6 @@ public function getIANADomain($domain): ResolvedDomainName throw UnableToResolveDomain::dueToMissingSuffix($domain, 'IANA'); } - return new ResolvedDomain($domain, Suffix::fromIANA($publicSuffix)); + return ResolvedDomain::fromHost($domain, Suffix::fromIANA($publicSuffix)); } } diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 6733cb1e..1ef52e54 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -214,7 +214,7 @@ public function testGetTopLevelDomain($tld): void public function validDomainProvider(): iterable { - $resolvedDomain = new ResolvedDomain( + $resolvedDomain = ResolvedDomain::fromHost( Domain::fromIDNA2008('www.example.com'), Suffix::fromICANN('com') ); From 3aa2efaad5757c4d32559190966211d3c6723f3a Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 2 Dec 2020 22:30:50 +0100 Subject: [PATCH 345/461] Improve ResolvedDomain implementation --- src/ResolvedDomain.php | 35 ++++++++--------------------------- 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 1fcabb93..0d1ab39e 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -101,20 +101,20 @@ private function setSuffix(EffectiveTLD $suffix): EffectiveTLD */ private function normalize(EffectiveTLD $subject): EffectiveTLD { - $newDomain = $this->domain->clear()->append($subject->toUnicode()->value()); + $newSuffix = $this->domain->clear()->append($subject->toUnicode()->value()); if ($this->domain->isAscii()) { - $newDomain = $newDomain->toAscii(); + $newSuffix = $newSuffix->toAscii(); } if ($subject->isPrivate()) { - return Suffix::fromPrivate($newDomain); + return Suffix::fromPrivate($newSuffix); } if ($subject->isICANN()) { - return Suffix::fromICANN($newDomain); + return Suffix::fromICANN($newSuffix); } - return Suffix::fromUnknown($newDomain); + return Suffix::fromUnknown($newSuffix); } /** @@ -241,9 +241,7 @@ public function withSuffix($suffix): self return new self($this->domain->clear()->append($host), Suffix::fromUnknown($this->domain->clear())); } - $host .= '.'.$suffix->value(); - - return new self($this->domain->clear()->append($host), $suffix); + return new self($this->domain->clear()->append($host. '.'.$suffix->value()), $suffix); } /** @@ -255,23 +253,13 @@ public function withSubDomain($subDomain): self throw UnableToResolveDomain::dueToMissingRegistrableDomain($this->domain); } - if ($subDomain instanceof DomainNameProvider) { - $subDomain = $subDomain->domain(); - } - - if (!$subDomain instanceof DomainName) { - $subDomain = $this->domain->clear()->append($subDomain); - } - - $subDomain = $this->domain->clear()->append($subDomain); + $subDomain = $this->domain->clear()->append(self::setDomainName($subDomain)); if ($this->subDomain == $subDomain) { return $this; } - /** @var DomainName $subDomain */ $subDomain = $subDomain->toAscii(); if (!$this->domain->isAscii()) { - /** @var DomainName $subDomain */ $subDomain = $subDomain->toUnicode(); } @@ -289,14 +277,7 @@ public function withSecondLevelDomain($label): self throw UnableToResolveDomain::dueToMissingRegistrableDomain($this->domain); } - if ($label instanceof DomainNameProvider) { - $label = $label->domain(); - } - - if (!$label instanceof DomainName) { - $label = Domain::fromIDNA2008($label); - } - + $label = self::setDomainName($label); $newRegistrableDomain = $this->registrableDomain->withoutLabel(-1)->prepend($label->value()); if ($newRegistrableDomain == $this->registrableDomain) { return $this; From d6c45d57f473418dd11f5a47a0ddeabc00ad0363 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 2 Dec 2020 22:32:40 +0100 Subject: [PATCH 346/461] Rename EffectiveTLD to EffectiveTopLevelDomain interface --- ...ectiveTLD.php => EffectiveTopLevelDomain.php} | 2 +- src/ResolvedDomain.php | 16 ++++++++-------- src/ResolvedDomainName.php | 4 ++-- src/Rules.php | 4 ++-- src/Suffix.php | 2 +- src/TopLevelDomains.php | 4 ++-- src/UnableToResolveDomain.php | 2 +- 7 files changed, 17 insertions(+), 17 deletions(-) rename src/{EffectiveTLD.php => EffectiveTopLevelDomain.php} (92%) diff --git a/src/EffectiveTLD.php b/src/EffectiveTopLevelDomain.php similarity index 92% rename from src/EffectiveTLD.php rename to src/EffectiveTopLevelDomain.php index d386ac63..a97bf6ab 100644 --- a/src/EffectiveTLD.php +++ b/src/EffectiveTopLevelDomain.php @@ -4,7 +4,7 @@ namespace Pdp; -interface EffectiveTLD extends Host, DomainNameProvider +interface EffectiveTopLevelDomain extends Host, DomainNameProvider { /** * Tells whether the effective TLD has a matching rule in a Public Suffix List. diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 0d1ab39e..5d138895 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -16,7 +16,7 @@ final class ResolvedDomain implements ResolvedDomainName { private DomainName $domain; - private EffectiveTLD $suffix; + private EffectiveTopLevelDomain $suffix; private DomainName $secondLevelDomain; @@ -27,14 +27,14 @@ final class ResolvedDomain implements ResolvedDomainName /** * @param mixed $domain the domain to be resolved */ - public static function fromHost($domain, EffectiveTLD $suffix = null): self + public static function fromHost($domain, EffectiveTopLevelDomain $suffix = null): self { $domain = self::setDomainName($domain); return new self($domain, $suffix ?? Suffix::fromUnknown($domain->clear())); } - private function __construct(DomainName $domain, EffectiveTLD $suffix) + private function __construct(DomainName $domain, EffectiveTopLevelDomain $suffix) { $this->domain = $domain; $this->suffix = $this->setSuffix($suffix); @@ -69,7 +69,7 @@ private static function setDomainName($domain): DomainName * * @throws UnableToResolveDomain If the public suffic can not be attached to the domain */ - private function setSuffix(EffectiveTLD $suffix): EffectiveTLD + private function setSuffix(EffectiveTopLevelDomain $suffix): EffectiveTopLevelDomain { if (null === $suffix->value()) { return Suffix::fromUnknown($this->domain->clear()); @@ -99,7 +99,7 @@ private function setSuffix(EffectiveTLD $suffix): EffectiveTLD /** * Normalize the domain name encoding content. */ - private function normalize(EffectiveTLD $subject): EffectiveTLD + private function normalize(EffectiveTopLevelDomain $subject): EffectiveTopLevelDomain { $newSuffix = $this->domain->clear()->append($subject->toUnicode()->value()); if ($this->domain->isAscii()) { @@ -207,7 +207,7 @@ public function subDomain(): DomainName return $this->subDomain; } - public function suffix(): EffectiveTLD + public function suffix(): EffectiveTopLevelDomain { return $this->suffix; } @@ -227,7 +227,7 @@ public function toUnicode(): self */ public function withSuffix($suffix): self { - if (!$suffix instanceof EffectiveTLD) { + if (!$suffix instanceof EffectiveTopLevelDomain) { $suffix = Suffix::fromUnknown($suffix); } @@ -241,7 +241,7 @@ public function withSuffix($suffix): self return new self($this->domain->clear()->append($host), Suffix::fromUnknown($this->domain->clear())); } - return new self($this->domain->clear()->append($host. '.'.$suffix->value()), $suffix); + return new self($this->domain->clear()->append($host.'.'.$suffix->value()), $suffix); } /** diff --git a/src/ResolvedDomainName.php b/src/ResolvedDomainName.php index e70ff9be..72aed4b8 100644 --- a/src/ResolvedDomainName.php +++ b/src/ResolvedDomainName.php @@ -9,7 +9,7 @@ interface ResolvedDomainName extends Host, DomainNameProvider /** * Returns the domain effective tld component. */ - public function suffix(): EffectiveTLD; + public function suffix(): EffectiveTopLevelDomain; /** * Returns the second level domain component. @@ -55,5 +55,5 @@ public function withSecondLevelDomain(DomainName $label): self; * If the domain already has a public suffix it will be replaced by the new value * otherwise the public suffix content is added to or remove from the current domain. */ - public function withSuffix(EffectiveTLD $suffix): self; + public function withSuffix(EffectiveTopLevelDomain $suffix): self; } diff --git a/src/Rules.php b/src/Rules.php index 1271602e..c8f13cb1 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -281,7 +281,7 @@ private function validateDomain($domain): DomainName /** * Returns the matched public suffix. */ - private function getEffectiveTLD(DomainName $domain, string $section): EffectiveTLD + private function getEffectiveTLD(DomainName $domain, string $section): EffectiveTopLevelDomain { $icann = $this->getEffectiveTLDFromSection($domain, self::ICANN_DOMAINS); if (self::ICANN_DOMAINS === $section) { @@ -305,7 +305,7 @@ private function getEffectiveTLD(DomainName $domain, string $section): Effective /** * Returns the public suffix matched against a given PSL section. */ - private function getEffectiveTLDFromSection(DomainName $domain, string $section): EffectiveTLD + private function getEffectiveTLDFromSection(DomainName $domain, string $section): EffectiveTopLevelDomain { $rules = $this->rules[$section]; $matches = []; diff --git a/src/Suffix.php b/src/Suffix.php index 5ceca957..1b92f2e6 100644 --- a/src/Suffix.php +++ b/src/Suffix.php @@ -7,7 +7,7 @@ use function count; use function in_array; -final class Suffix implements EffectiveTLD +final class Suffix implements EffectiveTopLevelDomain { private const ICANN = 'ICANN'; private const PRIVATE = 'PRIVATE'; diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 723cc36c..ff1fe148 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -211,7 +211,7 @@ public function isEmpty(): bool } /** - * @return Iterator + * @return Iterator */ public function getIterator(): Iterator { @@ -266,7 +266,7 @@ private function validateDomain($domain): DomainName return $domain; } - private function fetchEffectiveTLD(DomainName $domain): ?EffectiveTLD + private function fetchEffectiveTLD(DomainName $domain): ?EffectiveTopLevelDomain { $label = $domain->toAscii()->label(0); foreach ($this as $tld) { diff --git a/src/UnableToResolveDomain.php b/src/UnableToResolveDomain.php index 9f66ada7..8d4b43d7 100644 --- a/src/UnableToResolveDomain.php +++ b/src/UnableToResolveDomain.php @@ -18,7 +18,7 @@ public static function dueToIdenticalValue(DomainName $domain): self return $exception; } - public static function dueToMismatchedSuffix(DomainName $domain, EffectiveTLD $effectiveTLD): self + public static function dueToMismatchedSuffix(DomainName $domain, EffectiveTopLevelDomain $effectiveTLD): self { $exception = new self('The public suffix `'.$effectiveTLD->value().'` can not be assign to the domain name `'.$domain->toString().'`'); $exception->domain = $domain; From 221854eb8a0693117c1b8bfd253574f4bf79e08e Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 6 Dec 2020 20:21:21 +0100 Subject: [PATCH 347/461] Improve ResolvedDomain::fromHost --- src/ResolvedDomain.php | 12 ++++++++++-- src/Rules.php | 14 +++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 5d138895..a1ce0803 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -26,12 +26,20 @@ final class ResolvedDomain implements ResolvedDomainName /** * @param mixed $domain the domain to be resolved + * @param mixed $suffix the domain suffix */ - public static function fromHost($domain, EffectiveTopLevelDomain $suffix = null): self + public static function fromHost($domain, $suffix = null): self { $domain = self::setDomainName($domain); + if (null === $suffix) { + $suffix = Suffix::fromUnknown($domain->clear()); + } + + if (!$suffix instanceof EffectiveTopLevelDomain) { + $suffix = Suffix::fromUnknown($suffix); + } - return new self($domain, $suffix ?? Suffix::fromUnknown($domain->clear())); + return new self($domain, $suffix); } private function __construct(DomainName $domain, EffectiveTopLevelDomain $suffix) diff --git a/src/Rules.php b/src/Rules.php index c8f13cb1..b309a60f 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -226,7 +226,7 @@ public function getCookieDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); - return ResolvedDomain::fromHost($domain, $this->getEffectiveTLD($domain, '')); + return ResolvedDomain::fromHost($domain, $this->getEffectiveTopLevelDomain($domain, '')); } /** @@ -235,7 +235,7 @@ public function getCookieDomain($host): ResolvedDomainName public function getICANNDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); - $publicSuffix = $this->getEffectiveTLD($domain, self::ICANN_DOMAINS); + $publicSuffix = $this->getEffectiveTopLevelDomain($domain, self::ICANN_DOMAINS); if (!$publicSuffix->isICANN()) { throw UnableToResolveDomain::dueToMissingSuffix($domain, 'ICANN'); } @@ -249,7 +249,7 @@ public function getICANNDomain($host): ResolvedDomainName public function getPrivateDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); - $publicSuffix = $this->getEffectiveTLD($domain, self::PRIVATE_DOMAINS); + $publicSuffix = $this->getEffectiveTopLevelDomain($domain, self::PRIVATE_DOMAINS); if (!$publicSuffix->isPrivate()) { throw UnableToResolveDomain::dueToMissingSuffix($domain, 'private'); } @@ -281,14 +281,14 @@ private function validateDomain($domain): DomainName /** * Returns the matched public suffix. */ - private function getEffectiveTLD(DomainName $domain, string $section): EffectiveTopLevelDomain + private function getEffectiveTopLevelDomain(DomainName $domain, string $section): EffectiveTopLevelDomain { - $icann = $this->getEffectiveTLDFromSection($domain, self::ICANN_DOMAINS); + $icann = $this->getEffectiveTopLevelDomainFromSection($domain, self::ICANN_DOMAINS); if (self::ICANN_DOMAINS === $section) { return $icann; } - $private = $this->getEffectiveTLDFromSection($domain, self::PRIVATE_DOMAINS); + $private = $this->getEffectiveTopLevelDomainFromSection($domain, self::PRIVATE_DOMAINS); if (count($private) > count($icann)) { return $private; } @@ -305,7 +305,7 @@ private function getEffectiveTLD(DomainName $domain, string $section): Effective /** * Returns the public suffix matched against a given PSL section. */ - private function getEffectiveTLDFromSection(DomainName $domain, string $section): EffectiveTopLevelDomain + private function getEffectiveTopLevelDomainFromSection(DomainName $domain, string $section): EffectiveTopLevelDomain { $rules = $this->rules[$section]; $matches = []; From 74b35c92196c8736c22841bdfbd44ec961152be9 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 7 Dec 2020 09:10:45 +0100 Subject: [PATCH 348/461] Adding DomainName::slice method --- src/Domain.php | 20 ++++++++++++++++++++ src/DomainName.php | 10 ++++++++++ src/DomainTest.php | 19 +++++++++++++++++++ src/SyntaxError.php | 2 +- 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/Domain.php b/src/Domain.php index 267a9f15..df44e73c 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -9,6 +9,7 @@ use function array_count_values; use function array_keys; use function array_reverse; +use function array_slice; use function array_unshift; use function count; use function explode; @@ -383,4 +384,23 @@ public function clear(): self return new self(null, $this->type); } + + public function slice(int $offset, int $length = null): self + { + $nb_labels = count($this->labels); + if ($offset < - $nb_labels || $offset > $nb_labels) { + throw SyntaxError::dueToInvalidLabelKey($this, $offset); + } + + $labels = array_slice($this->labels, $offset, $length, true); + if ($labels === $this->labels) { + return $this; + } + + if ([] === $labels) { + return new self(null, $this->type); + } + + return new self(implode('.', array_reverse($labels)), $this->type); + } } diff --git a/src/DomainName.php b/src/DomainName.php index e73453bc..a561dced 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -112,4 +112,14 @@ public function withoutLabel(int $key, int ...$keys): self; * an instance that contains no label */ public function clear(): self; + + /** + * Extracts a slice of $length elements starting at position $offset from the Collection. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the selected slice. + * + * If $length is null it returns all elements from $offset to the end of the Domain. + */ + public function slice(int $offset, int $length = null): self; } diff --git a/src/DomainTest.php b/src/DomainTest.php index 149b6ec1..6c2a5f50 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -460,4 +460,23 @@ public function testWithIDNAOptions(): void { self::assertNotEquals(Domain::fromIDNA2003('example.com'), Domain::fromIDNA2008('example.com')); } + + public function testSlice(): void + { + $domain = Domain::fromIDNA2008('ulb.ac.be'); + + self::assertSame($domain->toString(), $domain->slice(-3)->toString()); + self::assertSame($domain->toString(), $domain->slice(0)->toString()); + + self::assertSame('ulb.ac', $domain->slice(1)->toString()); + self::assertSame('ulb', $domain->slice(-1)->toString()); + self::assertSame('be', $domain->slice(-3, 1)->toString()); + } + + public function testSliceThrowsOnOverFlow(): void + { + self::expectException(SyntaxError::class); + + Domain::fromIDNA2008('ulb.ac.be')->slice(5); + } } diff --git a/src/SyntaxError.php b/src/SyntaxError.php index 32dc7172..045121c6 100644 --- a/src/SyntaxError.php +++ b/src/SyntaxError.php @@ -39,6 +39,6 @@ public static function dueToUnsupportedType(string $domain): self public static function dueToInvalidLabelKey(Host $domain, int $key): self { - return new self('the given key `'.$key.'` is invalid for the domain `"'.$domain->value() ?? 'NULL'.'"`.'); + return new self('the given key `'.$key.'` is invalid for the domain `'.($domain->value() ?? 'NULL').'`.'); } } From 836f97d5302222046af382621f268f5066ec508e Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 7 Dec 2020 20:25:22 +0100 Subject: [PATCH 349/461] Improve ResolvedDomain implementation --- src/ResolvedDomain.php | 56 ++++++++++++------------------------------ 1 file changed, 16 insertions(+), 40 deletions(-) diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index a1ce0803..05271457 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -4,11 +4,7 @@ namespace Pdp; -use function array_reverse; -use function array_slice; use function count; -use function explode; -use function implode; use function strlen; use function substr; @@ -134,19 +130,16 @@ private function setRegistrableDomain(): DomainName return $this->domain->clear(); } - $domain = implode('.', array_slice( - explode('.', $this->domain->toString()), - count($this->domain) - count($this->suffix) - 1 - )); - - $registrableDomain = $this->domain->clear()->append($domain); - - return $this->domain->isAscii() ? $registrableDomain->toAscii() : $registrableDomain->toUnicode(); + return $this->domain->slice(0, count($this->suffix) + 1); } private function setSecondLevelDomain(): DomainName { - return $this->registrableDomain->clear()->append($this->registrableDomain->label(-1)); + if (null === $this->suffix->value()) { + return $this->domain->clear(); + } + + return $this->domain->slice(count($this->suffix), 1); } /** @@ -154,25 +147,11 @@ private function setSecondLevelDomain(): DomainName */ private function setSubDomain(): DomainName { - if (null === $this->registrableDomain->value()) { - return $this->domain->clear(); - } - - $nbLabels = count($this->domain); - $nbRegistrableLabels = count($this->suffix) + 1; - if ($nbLabels === $nbRegistrableLabels) { + if (null === $this->suffix->value()) { return $this->domain->clear(); } - $domain = implode('.', array_slice( - explode('.', $this->domain->toString()), - 0, - $nbLabels - $nbRegistrableLabels - )); - - $subDomain = $this->domain->clear()->append($domain); - - return $this->domain->isAscii() ? $subDomain->toAscii() : $subDomain->toUnicode(); + return $this->domain->slice(count($this->suffix) + 1); } public function count(): int @@ -187,7 +166,7 @@ public function domain(): DomainName public function jsonSerialize(): ?string { - return $this->domain->value(); + return $this->domain->jsonSerialize(); } public function value(): ?string @@ -240,15 +219,12 @@ public function withSuffix($suffix): self } $suffix = $this->normalize($suffix); - if ($this->suffix == $suffix) { - return $this; - } - - $host = implode('.', array_reverse(array_slice($this->domain->labels(), count($this->suffix)))); if (null === $suffix->value()) { - return new self($this->domain->clear()->append($host), Suffix::fromUnknown($this->domain->clear())); + return new self($this->domain->slice(count($this->suffix)), Suffix::fromUnknown($this->domain->clear())); } + $host = $this->domain->slice(count($this->suffix))->toString(); + return new self($this->domain->clear()->append($host.'.'.$suffix->value()), $suffix); } @@ -257,12 +233,12 @@ public function withSuffix($suffix): self */ public function withSubDomain($subDomain): self { - if (null === $this->registrableDomain->value()) { + if (null === $this->suffix->value()) { throw UnableToResolveDomain::dueToMissingRegistrableDomain($this->domain); } $subDomain = $this->domain->clear()->append(self::setDomainName($subDomain)); - if ($this->subDomain == $subDomain) { + if ($this->subDomain->value() === $subDomain->value()) { return $this; } @@ -281,13 +257,13 @@ public function withSubDomain($subDomain): self */ public function withSecondLevelDomain($label): self { - if (null === $this->registrableDomain->value()) { + if (null === $this->suffix->value()) { throw UnableToResolveDomain::dueToMissingRegistrableDomain($this->domain); } $label = self::setDomainName($label); $newRegistrableDomain = $this->registrableDomain->withoutLabel(-1)->prepend($label->value()); - if ($newRegistrableDomain == $this->registrableDomain) { + if ($newRegistrableDomain->value() === $this->registrableDomain->value()) { return $this; } From d57084102d0caf9956dd2980f164df12cf2a06c1 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 7 Dec 2020 22:51:15 +0100 Subject: [PATCH 350/461] Improve ResolvedDomain using DomainName::slice method --- CHANGELOG.md | 2 ++ src/Domain.php | 18 ++++++++---------- src/ResolvedDomain.php | 23 ++++++++--------------- src/ResolvedDomainTest.php | 2 +- src/Rules.php | 17 ++++++----------- src/TopLevelDomains.php | 17 ++++++++++------- 6 files changed, 35 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fe16c8b..2b29aba8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will ### Added - Adding proper Interfaces +- Added `Domain::clear` to easily initialize an empty domain object +- Added `Domain::slice` to easily slice a domain object - Added `ResolvedDomain` object to normalize Resolver results. - Added `Suffix` object to replace the `PublicSuffix` object from v5. - Public Suffix List and IANA Root Zone Database are fully decoupled diff --git a/src/Domain.php b/src/Domain.php index df44e73c..9e4785f4 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -367,13 +367,11 @@ public function withoutLabel(int $key, int ...$keys): self } } - if ([] === $labels) { - return new self(null, $this->type); - } - - $domain = implode('.', array_reverse($labels)); + $clone = clone $this; + $clone->labels = $labels; + $clone->domain = [] === $labels ? null : implode('.', array_reverse($labels)); - return new self($domain, $this->type); + return $clone; } public function clear(): self @@ -397,10 +395,10 @@ public function slice(int $offset, int $length = null): self return $this; } - if ([] === $labels) { - return new self(null, $this->type); - } + $clone = clone $this; + $clone->labels = $labels; + $clone->domain = [] === $labels ? null : implode('.', array_reverse($labels)); - return new self(implode('.', array_reverse($labels)), $this->type); + return $clone; } } diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 05271457..a6b55b77 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -5,7 +5,6 @@ namespace Pdp; use function count; -use function strlen; use function substr; final class ResolvedDomain implements ResolvedDomainName @@ -92,8 +91,7 @@ private function setSuffix(EffectiveTopLevelDomain $suffix): EffectiveTopLevelDo throw UnableToResolveDomain::dueToIdenticalValue($this->domain); } - $psContent = $suffix->toString(); - if ('.'.$psContent !== substr($this->domain->toString(), - strlen($psContent) - 1)) { + if ($this->domain->slice(0, count($suffix))->value() !== $suffix->value()) { throw UnableToResolveDomain::dueToMismatchedSuffix($this->domain, $suffix); } @@ -105,7 +103,7 @@ private function setSuffix(EffectiveTopLevelDomain $suffix): EffectiveTopLevelDo */ private function normalize(EffectiveTopLevelDomain $subject): EffectiveTopLevelDomain { - $newSuffix = $this->domain->clear()->append($subject->toUnicode()->value()); + $newSuffix = $this->domain->clear()->append($subject->toUnicode()); if ($this->domain->isAscii()) { $newSuffix = $newSuffix->toAscii(); } @@ -219,13 +217,12 @@ public function withSuffix($suffix): self } $suffix = $this->normalize($suffix); + $domainValue = $this->domain->slice(count($this->suffix)); if (null === $suffix->value()) { - return new self($this->domain->slice(count($this->suffix)), Suffix::fromUnknown($this->domain->clear())); + return new self($domainValue, Suffix::fromUnknown($this->domain->clear())); } - $host = $this->domain->slice(count($this->suffix))->toString(); - - return new self($this->domain->clear()->append($host.'.'.$suffix->value()), $suffix); + return self::fromHost($domainValue->append($suffix), $suffix); } /** @@ -247,9 +244,7 @@ public function withSubDomain($subDomain): self $subDomain = $subDomain->toUnicode(); } - $newDomainValue = $subDomain->toString().'.'.$this->registrableDomain->toString(); - - return new self($this->domain->clear()->append($newDomainValue), $this->suffix); + return new self($this->registrableDomain->prepend($subDomain), $this->suffix); } /** @@ -262,7 +257,7 @@ public function withSecondLevelDomain($label): self } $label = self::setDomainName($label); - $newRegistrableDomain = $this->registrableDomain->withoutLabel(-1)->prepend($label->value()); + $newRegistrableDomain = $this->registrableDomain->withoutLabel(-1)->prepend($label); if ($newRegistrableDomain->value() === $this->registrableDomain->value()) { return $this; } @@ -271,8 +266,6 @@ public function withSecondLevelDomain($label): self return new self($newRegistrableDomain, $this->suffix); } - $newDomainValue = $this->subDomain->value().'.'.$newRegistrableDomain->value(); - - return new self($this->domain->clear()->append($newDomainValue), $this->suffix); + return new self($newRegistrableDomain->prepend($this->subDomain), $this->suffix); } } diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index fd3a8af9..5cf81b0f 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -445,7 +445,7 @@ public function withPublicSuffixWorksProvider(): iterable public function testWithPublicSuffixFailsWithNullDomain(): void { - self::expectException(SyntaxError::class); + self::expectException(UnableToResolveDomain::class); ResolvedDomain::fromHost(Domain::fromIDNA2008(null))->withSuffix('www'); } diff --git a/src/Rules.php b/src/Rules.php index b309a60f..b8e74e3b 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -8,13 +8,11 @@ use SplTempFileObject; use TypeError; use function array_pop; -use function array_reverse; use function count; use function explode; use function fclose; use function fopen; use function gettype; -use function implode; use function is_array; use function is_object; use function is_string; @@ -297,9 +295,7 @@ private function getEffectiveTopLevelDomain(DomainName $domain, string $section) return $icann; } - $publicSuffix = $domain->clear()->withLabel(0, $domain->label(0)); - - return Suffix::fromUnknown($publicSuffix); + return Suffix::fromUnknown($domain->slice(0, 1)); } /** @@ -331,16 +327,15 @@ private function getEffectiveTopLevelDomainFromSection(DomainName $domain, strin } if ([] === $matches) { - $label = $domain->label(0); - $publicSuffix = $domain->clear(); - if ('' === $label) { - return Suffix::fromUnknown($publicSuffix); + $publicSuffix = $domain->slice(0, 1); + if ('' === $publicSuffix->value()) { + return Suffix::fromUnknown($publicSuffix->clear()); } - return Suffix::fromUnknown($publicSuffix->append($label)); + return Suffix::fromUnknown($publicSuffix); } - $publicSuffix = $domain->clear()->append(implode('.', array_reverse($matches))); + $publicSuffix = $domain->slice(0, count($matches)); if (self::PRIVATE_DOMAINS === $section) { return Suffix::fromPrivate($publicSuffix); } diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index ff1fe148..f3da039d 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -14,6 +14,7 @@ use function fclose; use function fopen; use function gettype; +use function in_array; use function is_object; use function is_string; use function json_decode; @@ -237,7 +238,7 @@ public function resolve($host): ResolvedDomainName try { $domain = $this->validateDomain($host); - return ResolvedDomain::fromHost($domain, $this->fetchEffectiveTLD($domain)); + return ResolvedDomain::fromHost($domain, $this->fetchEffectiveTopLevelDomain($domain)); } catch (UnableToResolveDomain $exception) { return ResolvedDomain::fromHost($exception->getDomain()); } catch (SyntaxError $exception) { @@ -266,14 +267,16 @@ private function validateDomain($domain): DomainName return $domain; } - private function fetchEffectiveTLD(DomainName $domain): ?EffectiveTopLevelDomain + private function fetchEffectiveTopLevelDomain(DomainName $domain): ?EffectiveTopLevelDomain { $label = $domain->toAscii()->label(0); + if (in_array($label, [null, ''], true)) { + return null; + } + foreach ($this as $tld) { if ($tld->value() === $label) { - $publicSuffix = $domain->clear()->withLabel(0, $domain->label(0)); - - return Suffix::fromIANA($publicSuffix); + return Suffix::fromIANA($domain->slice(0, 1)); } } @@ -286,11 +289,11 @@ private function fetchEffectiveTLD(DomainName $domain): ?EffectiveTopLevelDomain public function getIANADomain($domain): ResolvedDomainName { $domain = $this->validateDomain($domain); - $publicSuffix = $this->fetchEffectiveTLD($domain); + $publicSuffix = $this->fetchEffectiveTopLevelDomain($domain); if (null === $publicSuffix) { throw UnableToResolveDomain::dueToMissingSuffix($domain, 'IANA'); } - return ResolvedDomain::fromHost($domain, Suffix::fromIANA($publicSuffix)); + return ResolvedDomain::fromHost($domain, $publicSuffix); } } From 1baecc9a48bb09b5337ec0ab2048e34eb0ec59af Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 8 Dec 2020 20:08:19 +0100 Subject: [PATCH 351/461] Removing ResolvedDomain::fromHost --- src/ResolvedDomain.php | 54 +++++++++++++++++++++--------- src/ResolvedDomainTest.php | 66 +++++++++++++++---------------------- src/Rules.php | 41 ++++++++++++++--------- src/RulesTest.php | 5 +-- src/TopLevelDomains.php | 23 ++++++------- src/TopLevelDomainsTest.php | 5 +-- 6 files changed, 103 insertions(+), 91 deletions(-) diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index a6b55b77..b79dd212 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -19,31 +19,53 @@ final class ResolvedDomain implements ResolvedDomainName private DomainName $subDomain; + private function __construct(DomainName $domain, EffectiveTopLevelDomain $suffix) + { + $this->domain = $domain; + $this->suffix = $this->setSuffix($suffix); + $this->registrableDomain = $this->setRegistrableDomain(); + $this->secondLevelDomain = $this->setSecondLevelDomain(); + $this->subDomain = $this->setSubDomain(); + } + /** * @param mixed $domain the domain to be resolved - * @param mixed $suffix the domain suffix */ - public static function fromHost($domain, $suffix = null): self + public static function fromICANN($domain, int $suffixLength): self { $domain = self::setDomainName($domain); - if (null === $suffix) { - $suffix = Suffix::fromUnknown($domain->clear()); - } - if (!$suffix instanceof EffectiveTopLevelDomain) { - $suffix = Suffix::fromUnknown($suffix); - } + return new self($domain, Suffix::fromICANN($domain->slice(0, $suffixLength))); + } + + /** + * @param mixed $domain the domain to be resolved + */ + public static function fromPrivate($domain, int $suffixLength): self + { + $domain = self::setDomainName($domain); - return new self($domain, $suffix); + return new self($domain, Suffix::fromPrivate($domain->slice(0, $suffixLength))); } - private function __construct(DomainName $domain, EffectiveTopLevelDomain $suffix) + /** + * @param mixed $domain the domain to be resolved + */ + public static function fromIANA($domain, int $suffixLength): self { - $this->domain = $domain; - $this->suffix = $this->setSuffix($suffix); - $this->registrableDomain = $this->setRegistrableDomain(); - $this->secondLevelDomain = $this->setSecondLevelDomain(); - $this->subDomain = $this->setSubDomain(); + $domain = self::setDomainName($domain); + + return new self($domain, Suffix::fromIANA($domain->slice(0, $suffixLength))); + } + + /** + * @param mixed $domain the domain to be resolved + */ + public static function fromUnknown($domain, int $suffixLength = 0): self + { + $domain = self::setDomainName($domain); + + return new self($domain, Suffix::fromUnknown($domain->slice(0, $suffixLength))); } public static function __set_state(array $properties): self @@ -222,7 +244,7 @@ public function withSuffix($suffix): self return new self($domainValue, Suffix::fromUnknown($this->domain->clear())); } - return self::fromHost($domainValue->append($suffix), $suffix); + return new self($domainValue->append($suffix), $suffix); } /** diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 5cf81b0f..51110985 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -15,7 +15,7 @@ final class ResolvedDomainTest extends TestCase { public function testRegistrableDomainIsNullWithFoundDomain(): void { - $domain = ResolvedDomain::fromHost(Domain::fromIDNA2003('faketld')); + $domain = ResolvedDomain::fromUnknown(Domain::fromIDNA2003('faketld')); self::assertNull($domain->suffix()->value()); self::assertNull($domain->registrableDomain()->value()); self::assertNull($domain->subDomain()->value()); @@ -26,38 +26,30 @@ public function testRegistrableDomainIsNullWithFoundDomain(): void * @dataProvider provideWrongConstructor * @param ?string $domain */ - public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain(?string $domain, string $publicSuffix): void + public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain(?string $domain, int $length): void { self::expectException(UnableToResolveDomain::class); - ResolvedDomain::fromHost(Domain::fromIDNA2003($domain), Suffix::fromICANN(Domain::fromIDNA2003($publicSuffix))); + ResolvedDomain::fromUnknown($domain, $length); } public function provideWrongConstructor(): iterable { return [ - 'public suffix mismatch' => [ - 'domain' => 'www.ulb.ac.be', - 'publicSuffix' => 'com', - ], 'domain and public suffix are the same' => [ 'domain' => 'co.uk', - 'publicSuffix' => 'co.uk', + 'length' => 2, ], 'domain has no labels' => [ 'domain' => 'localhost', - 'publicSuffix' => 'localhost', - ], - 'domain is null' => [ - 'domain' => null, - 'publicSuffix' => 'com', + 'length' => 1, ], ]; } public function testDomainInternalPhpMethod(): void { - $domain = ResolvedDomain::fromHost(Domain::fromIDNA2003('www.ulb.ac.be'), Suffix::fromICANN(Domain::fromIDNA2003('ac.be'))); + $domain = ResolvedDomain::fromICANN(Domain::fromIDNA2003('www.ulb.ac.be'), 2); $generateDomain = eval('return '.var_export($domain, true).';'); self::assertEquals($domain, $generateDomain); self::assertEquals('"www.ulb.ac.be"', json_encode($domain->jsonSerialize())); @@ -103,7 +95,7 @@ public function testToIDN( ): void { $objPublicSuffix = (null === $publicSuffix) ? Suffix::fromUnknown(Domain::fromIDNA2003(null)) : Suffix::fromICANN(Domain::fromIDNA2003($publicSuffix)); - $domain = ResolvedDomain::fromHost(Domain::fromIDNA2003($domain), $objPublicSuffix); + $domain = ResolvedDomain::fromUnknown(Domain::fromIDNA2003($domain), count($objPublicSuffix)); self::assertSame($expectedDomain, $domain->value()); self::assertSame($expectedSuffix, $domain->suffix()->value()); @@ -194,7 +186,7 @@ public function testToAscii( ): void { $objPublicSuffix = (null === $publicSuffix) ? Suffix::fromUnknown(Domain::fromIDNA2003(null)) : Suffix::fromICANN(Domain::fromIDNA2003($publicSuffix)); - $domain = ResolvedDomain::fromHost(Domain::fromIDNA2003($domain), $objPublicSuffix); + $domain = ResolvedDomain::fromUnknown(Domain::fromIDNA2003($domain), count($objPublicSuffix)); self::assertSame($expectedDomain, $domain->value()); self::assertSame($expectedSuffix, $domain->suffix()->value()); @@ -269,33 +261,27 @@ public function withSubDomainWorksProvider(): iterable { return [ 'simple addition' => [ - 'domain' => ResolvedDomain::fromHost( - Domain::fromIDNA2003('example.com'), - Suffix::fromICANN(Domain::fromIDNA2003('com')) - ), + 'domain' => ResolvedDomain::fromICANN(Domain::fromIDNA2003('example.com'), 1), 'subdomain' => 'www', 'expected' => 'www', ], 'simple addition IDN (1)' => [ - 'domain' => ResolvedDomain::fromHost( - Domain::fromIDNA2003('example.com'), - Suffix::fromICANN(Domain::fromIDNA2003('com')) - ), + 'domain' => ResolvedDomain::fromICANN(Domain::fromIDNA2003('example.com'), 1), 'subdomain' => Domain::fromIDNA2003('bébé'), 'expected' => 'xn--bb-bjab', ], 'simple addition IDN (2)' => [ - 'domain' => ResolvedDomain::fromHost(Domain::fromIDNA2003('Яндекс.РФ'), Suffix::fromICANN(Domain::fromIDNA2003('рф'))), + 'domain' => ResolvedDomain::fromICANN(Domain::fromIDNA2003('Яндекс.РФ'), 1), 'subdomain' => 'bébé', 'expected' => 'bébé', ], 'simple removal' => [ - 'domain' => ResolvedDomain::fromHost(Domain::fromIDNA2003('example.com'), Suffix::fromICANN(Domain::fromIDNA2003('com'))), + 'domain' => ResolvedDomain::fromICANN(Domain::fromIDNA2003('example.com'), 1), 'subdomain' => null, 'expected' => null, ], 'simple removal IDN' => [ - 'domain' => ResolvedDomain::fromHost(Domain::fromIDNA2003('bébé.Яндекс.РФ'), Suffix::fromICANN(Domain::fromIDNA2003('рф'))), + 'domain' => ResolvedDomain::fromICANN(Domain::fromIDNA2003('bébé.Яндекс.РФ'), 1), 'subdomain' => 'xn--bb-bjab', 'expected' => 'bébé', ], @@ -306,21 +292,21 @@ public function testWithSubDomainFailsWithNullDomain(): void { self::expectException(UnableToResolveDomain::class); - ResolvedDomain::fromHost(Domain::fromIDNA2008(null))->withSubDomain('www'); + ResolvedDomain::fromUnknown(Domain::fromIDNA2008(null))->withSubDomain('www'); } public function testWithSubDomainFailsWithOneLabelDomain(): void { self::expectException(UnableToResolveDomain::class); - ResolvedDomain::fromHost(Domain::fromIDNA2003('localhost'))->withSubDomain('www'); + ResolvedDomain::fromUnknown(Domain::fromIDNA2003('localhost'))->withSubDomain('www'); } public function testWithEmptySubdomain(): void { self::expectException(SyntaxError::class); - $domain = ResolvedDomain::fromHost(Domain::fromIDNA2003('www.example.com'), Suffix::fromICANN(Domain::fromIDNA2003('com'))); + $domain = ResolvedDomain::fromICANN(Domain::fromIDNA2003('www.example.com'), 1); $domain->withSubDomain(''); } @@ -328,7 +314,7 @@ public function testWithEmptySubdomain(): void public function testWithSubDomainFailsWithNonStringableObject(): void { self::expectException(TypeError::class); - $domain = ResolvedDomain::fromHost(Domain::fromIDNA2003('www.example.com'), Suffix::fromICANN(Domain::fromIDNA2003('com'))); + $domain = ResolvedDomain::fromICANN(Domain::fromIDNA2003('www.example.com'), 1); $domain->withSubDomain(date_create()); } @@ -337,7 +323,7 @@ public function testWithSubDomainWithoutPublicSuffixInfo(): void { self::expectException(UnableToResolveDomain::class); - ResolvedDomain::fromHost(Domain::fromIDNA2003('www.example.com'))->withSubDomain('www'); + ResolvedDomain::fromUnknown(Domain::fromIDNA2003('www.example.com'))->withSubDomain('www'); } /** @@ -365,7 +351,7 @@ public function testWithPublicSuffixWorks( public function withPublicSuffixWorksProvider(): iterable { - $base_domain = ResolvedDomain::fromHost(Domain::fromIDNA2003('example.com'), Suffix::fromICANN(Domain::fromIDNA2003('com'))); + $base_domain = ResolvedDomain::fromICANN(Domain::fromIDNA2003('example.com'), 1); return [ 'simple update (1)' => [ @@ -409,7 +395,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'simple update IDN (2)' => [ - 'domain' => ResolvedDomain::fromHost(Domain::fromIDNA2003('www.bébé.be'), Suffix::fromICANN(Domain::fromIDNA2003('be'))), + 'domain' => ResolvedDomain::fromICANN(Domain::fromIDNA2003('www.bébé.be'), 1), 'publicSuffix' => Suffix::fromICANN(Domain::fromIDNA2003('xn--p1ai')), 'expected' => 'рф', 'isKnown' => true, @@ -417,7 +403,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'adding the public suffix to a single label domain' => [ - 'domain' => ResolvedDomain::fromHost(Domain::fromIDNA2003('localhost')), + 'domain' => ResolvedDomain::fromUnknown(Domain::fromIDNA2003('localhost')), 'publicSuffix' => 'www', 'expected' => 'www', 'isKnown' => false, @@ -425,7 +411,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'removing the public suffix list' => [ - 'domain' => ResolvedDomain::fromHost(Domain::fromIDNA2003('www.bébé.be'), Suffix::fromICANN(Domain::fromIDNA2003('be'))), + 'domain' => ResolvedDomain::fromICANN(Domain::fromIDNA2003('www.bébé.be'), 1), 'publicSuffix' => null, 'expected' => null, 'isKnown' => false, @@ -433,7 +419,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'with custom IDNA domain options' =>[ - 'domain' => ResolvedDomain::fromHost(Domain::fromIDNA2008('www.bébé.be'), Suffix::fromICANN(Domain::fromIDNA2008('be'))), + 'domain' => ResolvedDomain::fromICANN(Domain::fromIDNA2008('www.bébé.be'), 1), 'publicSuffix' => null, 'expected' => null, 'isKnown' => false, @@ -447,7 +433,7 @@ public function testWithPublicSuffixFailsWithNullDomain(): void { self::expectException(UnableToResolveDomain::class); - ResolvedDomain::fromHost(Domain::fromIDNA2008(null))->withSuffix('www'); + ResolvedDomain::fromUnknown(Domain::fromIDNA2008(null))->withSuffix('www'); } /** @@ -468,7 +454,7 @@ public function testResolveWorksWithCustomIDNAOptions( ?string $expectedSubDomain ): void { $host = Domain::fromIDNA2008($domainName); - $resolvedDomain = ResolvedDomain::fromHost($host, Suffix::fromICANN(Domain::fromIDNA2008($publicSuffix))); + $resolvedDomain = ResolvedDomain::fromICANN($host, count(Domain::fromIDNA2008($publicSuffix))); self::assertSame($expectedContent, $resolvedDomain->value()); self::assertSame($expectedAscii, $resolvedDomain->toAscii()->value()); @@ -534,7 +520,7 @@ public function testWithSecondLevelDomain( ?string $expectedSld, ?string $expectedHost ): void { - $domain = ResolvedDomain::fromHost(Domain::fromIDNA2008($host), Suffix::fromICANN(Domain::fromIDNA2008($publicSuffix))); + $domain = ResolvedDomain::fromICANN(Domain::fromIDNA2008($host), count(Domain::fromIDNA2008($publicSuffix))); $newDomain = $domain->withSecondLevelDomain($sld); self::assertSame($expectedSld, $newDomain->secondLevelDomain()->value()); diff --git a/src/Rules.php b/src/Rules.php index b8e74e3b..862f20fa 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -211,9 +211,9 @@ public function resolve($host): ResolvedDomainName try { return $this->getCookieDomain($host); } catch (UnableToResolveDomain $exception) { - return ResolvedDomain::fromHost($exception->getDomain()); + return ResolvedDomain::fromUnknown($exception->getDomain()); } catch (SyntaxError $exception) { - return ResolvedDomain::fromHost(Domain::fromIDNA2008(null)); + return ResolvedDomain::fromUnknown(Domain::fromIDNA2008(null)); } } @@ -223,8 +223,17 @@ public function resolve($host): ResolvedDomainName public function getCookieDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); + $suffix = $this->getEffectiveTopLevelDomain($domain, ''); + $length = count($suffix); + if ($suffix->isICANN()) { + return ResolvedDomain::fromICANN($domain, $length); + } + + if ($suffix->isPrivate()) { + return ResolvedDomain::fromPrivate($domain, $length); + } - return ResolvedDomain::fromHost($domain, $this->getEffectiveTopLevelDomain($domain, '')); + return ResolvedDomain::fromUnknown($domain, $length); } /** @@ -233,12 +242,12 @@ public function getCookieDomain($host): ResolvedDomainName public function getICANNDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); - $publicSuffix = $this->getEffectiveTopLevelDomain($domain, self::ICANN_DOMAINS); - if (!$publicSuffix->isICANN()) { + $suffix = $this->getEffectiveTopLevelDomain($domain, self::ICANN_DOMAINS); + if (!$suffix->isICANN()) { throw UnableToResolveDomain::dueToMissingSuffix($domain, 'ICANN'); } - return ResolvedDomain::fromHost($domain, $publicSuffix); + return ResolvedDomain::fromICANN($domain, count($suffix)); } /** @@ -247,12 +256,12 @@ public function getICANNDomain($host): ResolvedDomainName public function getPrivateDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); - $publicSuffix = $this->getEffectiveTopLevelDomain($domain, self::PRIVATE_DOMAINS); - if (!$publicSuffix->isPrivate()) { + $suffix = $this->getEffectiveTopLevelDomain($domain, self::PRIVATE_DOMAINS); + if (!$suffix->isPrivate()) { throw UnableToResolveDomain::dueToMissingSuffix($domain, 'private'); } - return ResolvedDomain::fromHost($domain, $publicSuffix); + return ResolvedDomain::fromPrivate($domain, count($suffix)); } /** @@ -327,19 +336,19 @@ private function getEffectiveTopLevelDomainFromSection(DomainName $domain, strin } if ([] === $matches) { - $publicSuffix = $domain->slice(0, 1); - if ('' === $publicSuffix->value()) { - return Suffix::fromUnknown($publicSuffix->clear()); + $suffix = $domain->slice(0, 1); + if ('' === $suffix->value()) { + return Suffix::fromUnknown($suffix->clear()); } - return Suffix::fromUnknown($publicSuffix); + return Suffix::fromUnknown($suffix); } - $publicSuffix = $domain->slice(0, count($matches)); + $suffix = $domain->slice(0, count($matches)); if (self::PRIVATE_DOMAINS === $section) { - return Suffix::fromPrivate($publicSuffix); + return Suffix::fromPrivate($suffix); } - return Suffix::fromICANN($publicSuffix); + return Suffix::fromICANN($suffix); } } diff --git a/src/RulesTest.php b/src/RulesTest.php index 729c9b17..1456d764 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -214,10 +214,7 @@ public function testResolvingICANNDomainInvalid(): void public function testWithDomainObject(): void { - $domain = ResolvedDomain::fromHost( - Domain::fromIDNA2008('private.ulb.ac.be'), - Suffix::fromICANN('ac.be') - ); + $domain = ResolvedDomain::fromICANN(Domain::fromIDNA2008('private.ulb.ac.be'), 2); $newDomain = $this->rules->resolve($domain); diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index f3da039d..3f27459e 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -237,12 +237,14 @@ public function resolve($host): ResolvedDomainName { try { $domain = $this->validateDomain($host); - - return ResolvedDomain::fromHost($domain, $this->fetchEffectiveTopLevelDomain($domain)); + if ($this->containsTopLevelDomain($domain)) { + return ResolvedDomain::fromIANA($domain, 1); + } + return ResolvedDomain::fromUnknown($domain, 0); } catch (UnableToResolveDomain $exception) { - return ResolvedDomain::fromHost($exception->getDomain()); + return ResolvedDomain::fromUnknown($exception->getDomain(), 0); } catch (SyntaxError $exception) { - return ResolvedDomain::fromHost(Domain::fromIDNA2008(null)); + return ResolvedDomain::fromUnknown(Domain::fromIDNA2008(null), 0); } } @@ -267,20 +269,20 @@ private function validateDomain($domain): DomainName return $domain; } - private function fetchEffectiveTopLevelDomain(DomainName $domain): ?EffectiveTopLevelDomain + private function containsTopLevelDomain(DomainName $domain): bool { $label = $domain->toAscii()->label(0); if (in_array($label, [null, ''], true)) { - return null; + return false; } foreach ($this as $tld) { if ($tld->value() === $label) { - return Suffix::fromIANA($domain->slice(0, 1)); + return true; } } - return null; + return false; } /** @@ -289,11 +291,10 @@ private function fetchEffectiveTopLevelDomain(DomainName $domain): ?EffectiveTop public function getIANADomain($domain): ResolvedDomainName { $domain = $this->validateDomain($domain); - $publicSuffix = $this->fetchEffectiveTopLevelDomain($domain); - if (null === $publicSuffix) { + if (!$this->containsTopLevelDomain($domain)) { throw UnableToResolveDomain::dueToMissingSuffix($domain, 'IANA'); } - return ResolvedDomain::fromHost($domain, $publicSuffix); + return ResolvedDomain::fromIANA($domain, 1); } } diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 1ef52e54..faee8f72 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -214,10 +214,7 @@ public function testGetTopLevelDomain($tld): void public function validDomainProvider(): iterable { - $resolvedDomain = ResolvedDomain::fromHost( - Domain::fromIDNA2008('www.example.com'), - Suffix::fromICANN('com') - ); + $resolvedDomain = ResolvedDomain::fromICANN(Domain::fromIDNA2008('www.example.com'), 1); return [ 'simple domain' => ['GOOGLE.COM'], From 1389044a638649c386a2f3f4b773812d83333df1 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 8 Dec 2020 20:30:59 +0100 Subject: [PATCH 352/461] Improve ResolvedDomain --- src/ResolvedDomain.php | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index b79dd212..2d1ef107 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -97,7 +97,7 @@ private static function setDomainName($domain): DomainName private function setSuffix(EffectiveTopLevelDomain $suffix): EffectiveTopLevelDomain { if (null === $suffix->value()) { - return Suffix::fromUnknown($this->domain->clear()); + return $suffix; } if (2 > count($this->domain)) { @@ -108,7 +108,6 @@ private function setSuffix(EffectiveTopLevelDomain $suffix): EffectiveTopLevelDo throw UnableToResolveDomain::dueToUnresolvableDomain($this->domain); } - $suffix = $this->normalize($suffix); if ($this->domain->value() === $suffix->value()) { throw UnableToResolveDomain::dueToIdenticalValue($this->domain); } @@ -135,7 +134,7 @@ private function normalize(EffectiveTopLevelDomain $subject): EffectiveTopLevelD } if ($subject->isICANN()) { - return Suffix::fromICANN($newSuffix); + return Suffix::fromICANN($newSuffix); } return Suffix::fromUnknown($newSuffix); @@ -238,13 +237,10 @@ public function withSuffix($suffix): self $suffix = Suffix::fromUnknown($suffix); } - $suffix = $this->normalize($suffix); - $domainValue = $this->domain->slice(count($this->suffix)); - if (null === $suffix->value()) { - return new self($domainValue, Suffix::fromUnknown($this->domain->clear())); - } - - return new self($domainValue->append($suffix), $suffix); + return new self( + $this->domain->slice(count($this->suffix))->append($suffix), + $this->normalize($suffix) + ); } /** From 8e6d602dc1ce9bc32ef0338bc028ca83f1d1a565 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 8 Dec 2020 20:47:36 +0100 Subject: [PATCH 353/461] Make ResolvedDomain::withSecondLevelDomain more strict --- src/ResolvedDomain.php | 8 ++++---- src/UnableToResolveDomain.php | 13 +++++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 2d1ef107..47bfb4c9 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -275,15 +275,15 @@ public function withSecondLevelDomain($label): self } $label = self::setDomainName($label); + if (1 !== count($label)) { + throw UnableToResolveDomain::dueToInvalidSecondLevelDomain($label); + } + $newRegistrableDomain = $this->registrableDomain->withoutLabel(-1)->prepend($label); if ($newRegistrableDomain->value() === $this->registrableDomain->value()) { return $this; } - if (null === $this->subDomain->value()) { - return new self($newRegistrableDomain, $this->suffix); - } - return new self($newRegistrableDomain->prepend($this->subDomain), $this->suffix); } } diff --git a/src/UnableToResolveDomain.php b/src/UnableToResolveDomain.php index 8d4b43d7..ef637d72 100644 --- a/src/UnableToResolveDomain.php +++ b/src/UnableToResolveDomain.php @@ -10,6 +10,19 @@ final class UnableToResolveDomain extends InvalidArgumentException implements Ca { private DomainName $domain; + public static function dueToInvalidSecondLevelDomain(DomainName $domain): self + { + $value = $domain->value(); + if (null === $value) { + $value = 'NULL'; + } + + $exception = new self('The submitted Second Level Domain is invalid `'.$value.'`; it should contains only one label.'); + $exception->domain = $domain; + + return $exception; + } + public static function dueToIdenticalValue(DomainName $domain): self { $exception = new self('The public suffix and the domain name are is identical `'.$domain->toString().'`.'); From d8a9f3234fbf0931f65ea7233a97be3018f49877 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 8 Dec 2020 21:49:24 +0100 Subject: [PATCH 354/461] Improve ResolvedDomain named constructors --- src/ResolvedDomain.php | 18 ++++++++++++++---- src/ResolvedDomainTest.php | 18 +++++++++--------- src/Rules.php | 10 +++++++--- src/TopLevelDomains.php | 10 +++++----- 4 files changed, 35 insertions(+), 21 deletions(-) diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 47bfb4c9..077191d6 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -51,21 +51,31 @@ public static function fromPrivate($domain, int $suffixLength): self /** * @param mixed $domain the domain to be resolved */ - public static function fromIANA($domain, int $suffixLength): self + public static function fromIANA($domain): self { $domain = self::setDomainName($domain); - return new self($domain, Suffix::fromIANA($domain->slice(0, $suffixLength))); + return new self($domain, Suffix::fromIANA($domain->slice(0, 1))); } /** * @param mixed $domain the domain to be resolved */ - public static function fromUnknown($domain, int $suffixLength = 0): self + public static function fromUnknown($domain): self { $domain = self::setDomainName($domain); - return new self($domain, Suffix::fromUnknown($domain->slice(0, $suffixLength))); + return new self($domain, Suffix::fromUnknown($domain->slice(0, 1))); + } + + /** + * @param mixed $domain the domain to be resolved + */ + public static function fromNull($domain): self + { + $domain = self::setDomainName($domain); + + return new self($domain, Suffix::fromUnknown($domain->clear())); } public static function __set_state(array $properties): self diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 51110985..7d4af5dc 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -15,7 +15,7 @@ final class ResolvedDomainTest extends TestCase { public function testRegistrableDomainIsNullWithFoundDomain(): void { - $domain = ResolvedDomain::fromUnknown(Domain::fromIDNA2003('faketld')); + $domain = ResolvedDomain::fromNull(Domain::fromIDNA2003('faketld')); self::assertNull($domain->suffix()->value()); self::assertNull($domain->registrableDomain()->value()); self::assertNull($domain->subDomain()->value()); @@ -30,7 +30,7 @@ public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain(?stri { self::expectException(UnableToResolveDomain::class); - ResolvedDomain::fromUnknown($domain, $length); + ResolvedDomain::fromICANN($domain, $length); } public function provideWrongConstructor(): iterable @@ -95,7 +95,7 @@ public function testToIDN( ): void { $objPublicSuffix = (null === $publicSuffix) ? Suffix::fromUnknown(Domain::fromIDNA2003(null)) : Suffix::fromICANN(Domain::fromIDNA2003($publicSuffix)); - $domain = ResolvedDomain::fromUnknown(Domain::fromIDNA2003($domain), count($objPublicSuffix)); + $domain = ResolvedDomain::fromPrivate(Domain::fromIDNA2003($domain), count($objPublicSuffix)); self::assertSame($expectedDomain, $domain->value()); self::assertSame($expectedSuffix, $domain->suffix()->value()); @@ -186,7 +186,7 @@ public function testToAscii( ): void { $objPublicSuffix = (null === $publicSuffix) ? Suffix::fromUnknown(Domain::fromIDNA2003(null)) : Suffix::fromICANN(Domain::fromIDNA2003($publicSuffix)); - $domain = ResolvedDomain::fromUnknown(Domain::fromIDNA2003($domain), count($objPublicSuffix)); + $domain = ResolvedDomain::fromICANN(Domain::fromIDNA2003($domain), count($objPublicSuffix)); self::assertSame($expectedDomain, $domain->value()); self::assertSame($expectedSuffix, $domain->suffix()->value()); @@ -292,14 +292,14 @@ public function testWithSubDomainFailsWithNullDomain(): void { self::expectException(UnableToResolveDomain::class); - ResolvedDomain::fromUnknown(Domain::fromIDNA2008(null))->withSubDomain('www'); + ResolvedDomain::fromNull(Domain::fromIDNA2008(null))->withSubDomain('www'); } public function testWithSubDomainFailsWithOneLabelDomain(): void { self::expectException(UnableToResolveDomain::class); - ResolvedDomain::fromUnknown(Domain::fromIDNA2003('localhost'))->withSubDomain('www'); + ResolvedDomain::fromNull(Domain::fromIDNA2003('localhost'))->withSubDomain('www'); } public function testWithEmptySubdomain(): void @@ -323,7 +323,7 @@ public function testWithSubDomainWithoutPublicSuffixInfo(): void { self::expectException(UnableToResolveDomain::class); - ResolvedDomain::fromUnknown(Domain::fromIDNA2003('www.example.com'))->withSubDomain('www'); + ResolvedDomain::fromNull(Domain::fromIDNA2003('www.example.com'))->withSubDomain('www'); } /** @@ -403,7 +403,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'adding the public suffix to a single label domain' => [ - 'domain' => ResolvedDomain::fromUnknown(Domain::fromIDNA2003('localhost')), + 'domain' => ResolvedDomain::fromNull(Domain::fromIDNA2003('localhost')), 'publicSuffix' => 'www', 'expected' => 'www', 'isKnown' => false, @@ -433,7 +433,7 @@ public function testWithPublicSuffixFailsWithNullDomain(): void { self::expectException(UnableToResolveDomain::class); - ResolvedDomain::fromUnknown(Domain::fromIDNA2008(null))->withSuffix('www'); + ResolvedDomain::fromNull(Domain::fromIDNA2008(null))->withSuffix('www'); } /** diff --git a/src/Rules.php b/src/Rules.php index 862f20fa..885913dd 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -211,9 +211,9 @@ public function resolve($host): ResolvedDomainName try { return $this->getCookieDomain($host); } catch (UnableToResolveDomain $exception) { - return ResolvedDomain::fromUnknown($exception->getDomain()); + return ResolvedDomain::fromNull($exception->getDomain()); } catch (SyntaxError $exception) { - return ResolvedDomain::fromUnknown(Domain::fromIDNA2008(null)); + return ResolvedDomain::fromNull(Domain::fromIDNA2008(null)); } } @@ -233,7 +233,11 @@ public function getCookieDomain($host): ResolvedDomainName return ResolvedDomain::fromPrivate($domain, $length); } - return ResolvedDomain::fromUnknown($domain, $length); + if (1 === $length) { + return ResolvedDomain::fromUnknown($domain); + } + + return ResolvedDomain::fromNull($domain); } /** diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 3f27459e..3b7d6a9d 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -238,13 +238,13 @@ public function resolve($host): ResolvedDomainName try { $domain = $this->validateDomain($host); if ($this->containsTopLevelDomain($domain)) { - return ResolvedDomain::fromIANA($domain, 1); + return ResolvedDomain::fromIANA($domain); } - return ResolvedDomain::fromUnknown($domain, 0); + return ResolvedDomain::fromNull($domain); } catch (UnableToResolveDomain $exception) { - return ResolvedDomain::fromUnknown($exception->getDomain(), 0); + return ResolvedDomain::fromNull($exception->getDomain()); } catch (SyntaxError $exception) { - return ResolvedDomain::fromUnknown(Domain::fromIDNA2008(null), 0); + return ResolvedDomain::fromNull(Domain::fromIDNA2008(null)); } } @@ -295,6 +295,6 @@ public function getIANADomain($domain): ResolvedDomainName throw UnableToResolveDomain::dueToMissingSuffix($domain, 'IANA'); } - return ResolvedDomain::fromIANA($domain, 1); + return ResolvedDomain::fromIANA($domain); } } From 9cb8c094c0823835d010d53401455f648e151581 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 9 Dec 2020 08:52:49 +0100 Subject: [PATCH 355/461] Adding EffectiveTopLevelDomain::normalize method --- src/EffectiveTopLevelDomain.php | 8 ++++++++ src/ResolvedDomain.php | 23 +---------------------- src/Suffix.php | 13 +++++++++++++ 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/EffectiveTopLevelDomain.php b/src/EffectiveTopLevelDomain.php index a97bf6ab..97850c50 100644 --- a/src/EffectiveTopLevelDomain.php +++ b/src/EffectiveTopLevelDomain.php @@ -30,4 +30,12 @@ public function isICANN(): bool; * Tells whether the effective TLD has a matching rule in a Public Suffix List Private Section. */ public function isPrivate(): bool; + + /** + * Returns an instance with the public suffix normalize to the submitted domain encoding algorithm. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the same domain information normalize against the submitted domainName + */ + public function normalize(DomainName $domain): self; } diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 077191d6..e6a2a04c 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -129,27 +129,6 @@ private function setSuffix(EffectiveTopLevelDomain $suffix): EffectiveTopLevelDo return $suffix; } - /** - * Normalize the domain name encoding content. - */ - private function normalize(EffectiveTopLevelDomain $subject): EffectiveTopLevelDomain - { - $newSuffix = $this->domain->clear()->append($subject->toUnicode()); - if ($this->domain->isAscii()) { - $newSuffix = $newSuffix->toAscii(); - } - - if ($subject->isPrivate()) { - return Suffix::fromPrivate($newSuffix); - } - - if ($subject->isICANN()) { - return Suffix::fromICANN($newSuffix); - } - - return Suffix::fromUnknown($newSuffix); - } - /** * Computes the registrable domain part. */ @@ -249,7 +228,7 @@ public function withSuffix($suffix): self return new self( $this->domain->slice(count($this->suffix))->append($suffix), - $this->normalize($suffix) + $suffix->normalize($this->domain) ); } diff --git a/src/Suffix.php b/src/Suffix.php index 1b92f2e6..0db36c39 100644 --- a/src/Suffix.php +++ b/src/Suffix.php @@ -144,4 +144,17 @@ public function toUnicode(): self return $clone; } + + public function normalize(DomainName $domain): self + { + $newSuffix = $domain->clear()->append($this->toUnicode()); + if ($domain->isAscii()) { + $newSuffix = $newSuffix->toAscii(); + } + + $clone = clone $this; + $clone->domain = $newSuffix; + + return $clone; + } } From 0cd4eb7878a4435d650e4bc31319e29a9d409e98 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 9 Dec 2020 09:07:20 +0100 Subject: [PATCH 356/461] Improve ResolvedDomain implementation --- src/ResolvedDomain.php | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index e6a2a04c..4eb19b91 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -22,7 +22,10 @@ final class ResolvedDomain implements ResolvedDomainName private function __construct(DomainName $domain, EffectiveTopLevelDomain $suffix) { $this->domain = $domain; - $this->suffix = $this->setSuffix($suffix); + $this->suffix = $suffix; + + $this->validateSuffix(); + $this->registrableDomain = $this->setRegistrableDomain(); $this->secondLevelDomain = $this->setSecondLevelDomain(); $this->subDomain = $this->setSubDomain(); @@ -102,12 +105,12 @@ private static function setDomainName($domain): DomainName /** * Sets the public suffix domain part. * - * @throws UnableToResolveDomain If the public suffic can not be attached to the domain + * @throws UnableToResolveDomain If the suffix can not be attached to the domain */ - private function setSuffix(EffectiveTopLevelDomain $suffix): EffectiveTopLevelDomain + private function validateSuffix(): void { - if (null === $suffix->value()) { - return $suffix; + if (null === $this->suffix->value()) { + return; } if (2 > count($this->domain)) { @@ -118,15 +121,13 @@ private function setSuffix(EffectiveTopLevelDomain $suffix): EffectiveTopLevelDo throw UnableToResolveDomain::dueToUnresolvableDomain($this->domain); } - if ($this->domain->value() === $suffix->value()) { + if ($this->domain->value() === $this->suffix->value()) { throw UnableToResolveDomain::dueToIdenticalValue($this->domain); } - if ($this->domain->slice(0, count($suffix))->value() !== $suffix->value()) { - throw UnableToResolveDomain::dueToMismatchedSuffix($this->domain, $suffix); + if ($this->domain->slice(0, count($this->suffix))->value() !== $this->suffix->value()) { + throw UnableToResolveDomain::dueToMismatchedSuffix($this->domain, $this->suffix); } - - return $suffix; } /** @@ -246,11 +247,6 @@ public function withSubDomain($subDomain): self return $this; } - $subDomain = $subDomain->toAscii(); - if (!$this->domain->isAscii()) { - $subDomain = $subDomain->toUnicode(); - } - return new self($this->registrableDomain->prepend($subDomain), $this->suffix); } From 145e369bb5d79a2d5629e63a38b3810d1cf0cecf Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 9 Dec 2020 09:33:52 +0100 Subject: [PATCH 357/461] bugfix ResolvedDomain interface --- phpstan.neon | 6 ----- src/Domain.php | 6 +++-- src/ResolvedDomain.php | 54 ++++++++++++++------------------------ src/ResolvedDomainName.php | 2 +- 4 files changed, 24 insertions(+), 44 deletions(-) diff --git a/phpstan.neon b/phpstan.neon index 07ee541c..1a52428c 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -8,10 +8,4 @@ parameters: treatPhpDocTypesAsCertain: false ignoreErrors: - '#should be covariant with return type#' - - message: '#Method Pdp\\ResolvedDomain::withSubDomain\(\) has parameter \$subDomain with no typehint specified.#' - path: src/ResolvedDomain.php - - message: '#Method Pdp\\ResolvedDomain::withSecondLevelDomain\(\) has parameter \$label with no typehint specified.#' - path: src/ResolvedDomain.php - - message: '#Call to function array_keys\(\) requires parameter \#3 to be set.#' - path: src/Domain.php reportUnmatchedIgnoredErrors: true diff --git a/src/Domain.php b/src/Domain.php index 9e4785f4..16d39b35 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -232,9 +232,11 @@ public function label(int $key): ?string */ public function keys(string $label = null): array { - $args = (null !== $label) ? [$label, true] : []; + if (null === $label) { + return array_keys($this->labels); + } - return array_keys($this->labels, ...$args); + return array_keys($this->labels, $label, true); } /** diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 4eb19b91..d8d7fc40 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -24,11 +24,8 @@ private function __construct(DomainName $domain, EffectiveTopLevelDomain $suffix $this->domain = $domain; $this->suffix = $suffix; - $this->validateSuffix(); - - $this->registrableDomain = $this->setRegistrableDomain(); - $this->secondLevelDomain = $this->setSecondLevelDomain(); - $this->subDomain = $this->setSubDomain(); + $this->validateState(); + $this->setComponents(); } /** @@ -103,11 +100,11 @@ private static function setDomainName($domain): DomainName } /** - * Sets the public suffix domain part. + * Make sure the Value Object is always in a valid state. * * @throws UnableToResolveDomain If the suffix can not be attached to the domain */ - private function validateSuffix(): void + private function validateState(): void { if (null === $this->suffix->value()) { return; @@ -131,36 +128,23 @@ private function validateSuffix(): void } /** - * Computes the registrable domain part. + * Compute Resolved domain components */ - private function setRegistrableDomain(): DomainName - { - if (null === $this->suffix->value()) { - return $this->domain->clear(); - } - - return $this->domain->slice(0, count($this->suffix) + 1); - } - - private function setSecondLevelDomain(): DomainName + private function setComponents(): void { - if (null === $this->suffix->value()) { - return $this->domain->clear(); - } - - return $this->domain->slice(count($this->suffix), 1); - } + $length = count($this->suffix); + if (0 === $length) { + $nullDomain = $this->domain->clear(); + $this->registrableDomain = $nullDomain; + $this->secondLevelDomain = $nullDomain; + $this->subDomain = $nullDomain; - /** - * Computes the sub domain part. - */ - private function setSubDomain(): DomainName - { - if (null === $this->suffix->value()) { - return $this->domain->clear(); + return; } - return $this->domain->slice(count($this->suffix) + 1); + $this->registrableDomain = $this->domain->slice(0, $length + 1); + $this->secondLevelDomain = $this->domain->slice($length, 1); + $this->subDomain = $this->domain->slice($length + 1); } public function count(): int @@ -219,7 +203,7 @@ public function toUnicode(): self } /** - * @param mixed $suffix a public suffix + * @param mixed $suffix the suffix */ public function withSuffix($suffix): self { @@ -234,7 +218,7 @@ public function withSuffix($suffix): self } /** - * {@inheritDoc} + * @param mixed $subDomain the sub domain */ public function withSubDomain($subDomain): self { @@ -251,7 +235,7 @@ public function withSubDomain($subDomain): self } /** - * {@inheritDoc} + * @param mixed $label the second level domain */ public function withSecondLevelDomain($label): self { diff --git a/src/ResolvedDomainName.php b/src/ResolvedDomainName.php index 72aed4b8..631d3473 100644 --- a/src/ResolvedDomainName.php +++ b/src/ResolvedDomainName.php @@ -14,7 +14,7 @@ public function suffix(): EffectiveTopLevelDomain; /** * Returns the second level domain component. */ - public function secondLevelDomain(): ?DomainName; + public function secondLevelDomain(): DomainName; /** * Returns the registrable domain component. From ba8fd3ee9896e0070291827e73d835fa5d5e123c Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 9 Dec 2020 12:33:28 +0100 Subject: [PATCH 358/461] Improve Static code analysis --- phpstan.neon | 3 - src/Domain.php | 6 + src/DomainName.php | 6 +- src/DomainTest.php | 27 ++ src/PublicSuffixList.php | 2 + src/ResolvedDomain.php | 5 +- src/ResolvedDomainTest.php | 24 ++ src/RootZoneDatabase.php | 7 +- src/Rules.php | 39 ++- src/RulesTest.php | 15 + .../PublicSuffixListPsr16CacheTest.php | 302 +--------------- .../RootZoneDatabasePsr16CacheTest.php | 327 ++---------------- src/Suffix.php | 3 + src/SuffixTest.php | 17 +- src/TopLevelDomains.php | 18 +- src/TopLevelDomainsTest.php | 12 + 16 files changed, 208 insertions(+), 605 deletions(-) diff --git a/phpstan.neon b/phpstan.neon index 1a52428c..6db39376 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -3,9 +3,6 @@ includes: - vendor/phpstan/phpstan-phpunit/extension.neon - vendor/phpstan/phpstan-phpunit/rules.neon parameters: - checkMissingIterableValueType: false - checkGenericClassInNonGenericObjectType: false - treatPhpDocTypesAsCertain: false ignoreErrors: - '#should be covariant with return type#' reportUnmatchedIgnoredErrors: true diff --git a/src/Domain.php b/src/Domain.php index 16d39b35..0f688016 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -51,6 +51,9 @@ private function __construct($domain, string $type) [$this->domain, $this->labels] = $this->parseDomain($domain); } + /** + * @param array{domain:string|null, type:string} $properties + */ public static function __set_state(array $properties): self { return new self($properties['domain'], $properties['type']); @@ -186,6 +189,9 @@ private function domainToUnicode(string $domain): string return IntlIdna::toUnicode($domain, $option); } + /** + * @return Iterator + */ public function getIterator(): Iterator { foreach ($this->labels as $offset => $label) { diff --git a/src/DomainName.php b/src/DomainName.php index a561dced..2f458454 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -11,6 +11,8 @@ * @see https://tools.ietf.org/html/rfc1034#section-3.5 * @see https://tools.ietf.org/html/rfc1123#section-2.1 * @see https://tools.ietf.org/html/rfc5890 + * + * @extends IteratorAggregate */ interface DomainName extends Host, IteratorAggregate { @@ -49,10 +51,10 @@ public function labels(): array; public function keys(string $label = null): array; /** - * {@inheritdoc} - * * The external iterator iterates over the DomainInterface labels * from the right-most label to the left-most label. + * + * @return Iterator */ public function getIterator(): Iterator; diff --git a/src/DomainTest.php b/src/DomainTest.php index 6c2a5f50..09bdbdd7 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -23,6 +23,9 @@ public function testToAsciiThrowsException(string $domain): void Domain::fromIDNA2008($domain); } + /** + * @return iterable + */ public function invalidDomainProvider(): iterable { return [ @@ -62,6 +65,9 @@ public function testCountable(?string $domain, int $nbLabels, array $labels): vo self::assertSame($labels, iterator_to_array($domain)); } + /** + * @return iterable + */ public function countableProvider(): iterable { return [ @@ -123,6 +129,9 @@ public function testToIDN( self::assertSame($expectedIDNDomain, $domainIDN->value()); } + /** + * @return iterable + */ public function toUnicodeProvider(): iterable { return [ @@ -183,6 +192,9 @@ public function testToAscii( self::assertSame($expectedAsciiDomain, $domainIDN->value()); } + /** + * @return iterable + */ public function toAsciiProvider(): iterable { return [ @@ -225,6 +237,9 @@ public function testWithLabelWorks(Domain $domain, int $key, string $label, ?str self::assertSame($expected, $result->value()); } + /** + * @return iterable + */ public function withLabelWorksProvider(): iterable { $base_domain = Domain::fromIDNA2008('www.example.com'); @@ -320,6 +335,9 @@ public function testAppend(string $raw, string $append, string $expected): void self::assertSame($expected, Domain::fromIDNA2008($raw)->append($append)->toString()); } + /** + * @return iterable + */ public function validAppend(): iterable { return [ @@ -338,6 +356,9 @@ public function testPrepend(string $raw, string $prepend, string $expected): voi self::assertSame($expected, Domain::fromIDNA2008($raw)->prepend($prepend)->toString()); } + /** + * @return iterable + */ public function validPrepend(): iterable { return [ @@ -357,6 +378,9 @@ public function testwithoutLabelWorks(Domain $domain, int $key, ?string $expecte self::assertSame($expected, $result->value()); } + /** + * @return iterable + */ public function withoutLabelWorksProvider(): iterable { $base_domain = Domain::fromIDNA2008('www.example.com'); @@ -418,6 +442,9 @@ public function testResolveWorksWithCustomIDNAOptions( self::assertSame($expectedWithLabel, $domain->withLabel(-1, $withLabel)->value()); } + /** + * @return iterable + */ public function resolveCustomIDNAOptionsProvider(): iterable { return [ diff --git a/src/PublicSuffixList.php b/src/PublicSuffixList.php index 9e8b24c3..717e48be 100644 --- a/src/PublicSuffixList.php +++ b/src/PublicSuffixList.php @@ -10,6 +10,8 @@ interface PublicSuffixList extends DomainNameResolver, JsonSerializable { /** * Returns an array representation of the Public Suffix List Rules JSON serializable. + * + * @return array> */ public function jsonSerialize(): array; diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index d8d7fc40..ea929f83 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -78,6 +78,9 @@ public static function fromNull($domain): self return new self($domain, Suffix::fromUnknown($domain->clear())); } + /** + * @param array{domain:DomainName, suffix:EffectiveTopLevelDomain} $properties + */ public static function __set_state(array $properties): self { return new self($properties['domain'], $properties['suffix']); @@ -128,7 +131,7 @@ private function validateState(): void } /** - * Compute Resolved domain components + * Compute resolved domain components. */ private function setComponents(): void { diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 7d4af5dc..144ce074 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -33,6 +33,9 @@ public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain(?stri ResolvedDomain::fromICANN($domain, $length); } + /** + * @return iterable + */ public function provideWrongConstructor(): iterable { return [ @@ -66,6 +69,9 @@ public function testCountable(?string $domain, int $nbLabels): void self::assertCount($nbLabels, $domain); } + /** + * @return iterable + */ public function countableProvider(): iterable { return [ @@ -105,6 +111,9 @@ public function testToIDN( self::assertSame($expectedIDNSuffix, $domainIDN->suffix()->value()); } + /** + * @return iterable + */ public function toUnicodeProvider(): iterable { return [ @@ -196,6 +205,9 @@ public function testToAscii( self::assertSame($expectedAsciiSuffix, $domainIDN->suffix()->value()); } + /** + * @return iterable + */ public function toAsciiProvider(): iterable { return [ @@ -257,6 +269,9 @@ public function testWithSubDomainWorks(ResolvedDomain $domain, $subdomain, ?stri self::assertEquals($domain->registrableDomain(), $result->registrableDomain()); } + /** + * @return iterable + */ public function withSubDomainWorksProvider(): iterable { return [ @@ -349,6 +364,9 @@ public function testWithPublicSuffixWorks( self::assertSame($isPrivate, $newPublicSuffix->isPrivate()); } + /** + * @return iterable + */ public function withPublicSuffixWorksProvider(): iterable { $base_domain = ResolvedDomain::fromICANN(Domain::fromIDNA2003('example.com'), 1); @@ -463,6 +481,9 @@ public function testResolveWorksWithCustomIDNAOptions( self::assertSame($expectedSubDomain, $resolvedDomain->subDomain()->value()); } + /** + * @return iterable + */ public function resolveCustomIDNAOptionsProvider(): iterable { return [ @@ -529,6 +550,9 @@ public function testWithSecondLevelDomain( self::assertEquals($domain->subDomain(), $newDomain->subDomain()); } + /** + * @return iterable + */ public function withSldWorksProvider(): iterable { return [ diff --git a/src/RootZoneDatabase.php b/src/RootZoneDatabase.php index 034e332a..ba890729 100644 --- a/src/RootZoneDatabase.php +++ b/src/RootZoneDatabase.php @@ -10,6 +10,9 @@ use IteratorAggregate; use JsonSerializable; +/** + * @extends IteratorAggregate + */ interface RootZoneDatabase extends Countable, DomainNameResolver, IteratorAggregate, JsonSerializable { /** @@ -33,12 +36,14 @@ public function count(): int; public function isEmpty(): bool; /** - * {@inheritdoc} + * @return Iterator */ public function getIterator(): Iterator; /** * Returns an array representation of the list. + * + * @return array{version:string, records:array, lastUpdated:string} */ public function jsonSerialize(): array; diff --git a/src/Rules.php b/src/Rules.php index 885913dd..e4621b2b 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -45,18 +45,16 @@ final class Rules implements PublicSuffixList /** * PSL rules as a multidimentional associative array. + * + * @var array> */ private array $rules; + /** + * @param array> $rules + */ private function __construct(array $rules) { - $rules[self::ICANN_DOMAINS] = $rules[self::ICANN_DOMAINS] ?? []; - $rules[self::PRIVATE_DOMAINS] = $rules[self::PRIVATE_DOMAINS] ?? []; - - if (!is_array($rules[self::ICANN_DOMAINS]) || !is_array($rules[self::PRIVATE_DOMAINS])) { - throw UnableToLoadPublicSuffixList::dueToCorruptedSection(); - } - $this->rules = $rules; } @@ -106,10 +104,12 @@ public static function fromString($content): self /** * Convert the Public Suffix List into an associative, multidimensional array. + * + * @return array> */ private static function parse(string $content): array { - $rules = []; + $rules = [self::ICANN_DOMAINS => [], self::PRIVATE_DOMAINS => []]; $section = ''; $file = new SplTempFileObject(); $file->fwrite($content); @@ -117,8 +117,7 @@ private static function parse(string $content): array /** @var string $line */ foreach ($file as $line) { $section = self::getSection($section, $line); - if ('' !== $section && false === strpos($line, '//')) { - $rules[$section] = $rules[$section] ?? []; + if (in_array($section, [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS], true) && false === strpos($line, '//')) { $rules[$section] = self::addRule($rules[$section], explode('.', $line)); } } @@ -147,12 +146,14 @@ private static function getSection(string $section, string $line): string * A copy of the Apache License, Version 2.0, is provided with this * distribution * - * @param array $list Initially an empty array, this eventually - * becomes the array representation of a Public Suffix List section - * @param array $ruleParts One line (rule) from the Public Suffix List - * exploded on '.', or the remaining portion of that array during recursion + * @param array $list Initially an empty array, this eventually becomes the array representation of a + * Public Suffix List section + * @param array $ruleParts One line (rule) from the Public Suffix List exploded on '.', or the remaining + * portion of that array during recursion * * @throws UnableToLoadPublicSuffixList if the domain name can not be converted using IDN to ASCII algorithm + * + * @return array */ private static function addRule(array $list, array $ruleParts): array { @@ -190,14 +191,24 @@ public static function fromJsonString(string $jsonString): self throw UnableToLoadPublicSuffixList::dueToInvalidJson($exception); } + if (!is_array($data[self::ICANN_DOMAINS]) || !is_array($data[self::PRIVATE_DOMAINS])) { + throw UnableToLoadPublicSuffixList::dueToCorruptedSection(); + } + return new self($data); } + /** + * @param array{rules:array{ICANN_DOMAINS:array,PRIVATE_DOMAINS:array}} $properties + */ public static function __set_state(array $properties): self { return new self($properties['rules']); } + /** + * @return array> + */ public function jsonSerialize(): array { return $this->rules; diff --git a/src/RulesTest.php b/src/RulesTest.php index 1456d764..1c87b6ab 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -273,6 +273,9 @@ public function testGetDomain(?string $publicSuffix, ?string $registrableDomain, self::assertSame($expectedDomain, $this->rules->resolve($domain)->value()); } + /** + * @return iterable + */ public function parseDataProvider(): iterable { return [ @@ -393,6 +396,9 @@ public function testGetPublicSuffixThrowsInvalidDomainException(string $domain): $this->rules->getICANNDomain($domain); } + /** + * @return iterable + */ public function invalidDomainParseProvider(): iterable { return [ @@ -416,6 +422,9 @@ public function testGetPublicSuffixThrowsInvalidHostException(string $domain): v $this->rules->getICANNDomain($domain); } + /** + * @return iterable + */ public function invalidHostParseProvider(): iterable { $long_label = implode('.', array_fill(0, 62, 'a')); @@ -443,6 +452,9 @@ public function testPublicSuffixSection(?string $domain, ?string $expected): voi self::assertSame($expected, $publicSuffix->value()); } + /** + * @return iterable + */ public function validPublicSectionProvider(): iterable { return [ @@ -598,6 +610,9 @@ public function testEffectiveTLDResolution(string $host, string $cookieETLD, str self::assertSame($privateETLD, $this->rules->getPrivateDomain($host)->suffix()->toString()); } + /** + * @return iterable + */ public function effectiveTLDProvider(): iterable { return [ diff --git a/src/Storage/PublicSuffixListPsr16CacheTest.php b/src/Storage/PublicSuffixListPsr16CacheTest.php index 08ba0d38..e4283149 100644 --- a/src/Storage/PublicSuffixListPsr16CacheTest.php +++ b/src/Storage/PublicSuffixListPsr16CacheTest.php @@ -18,46 +18,8 @@ final class PublicSuffixListPsr16CacheTest extends TestCase { public function testItReturnsNullIfTheCacheDoesNotExists(): void { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return null; - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; + $cache = $this->createStub(CacheInterface::class); + $cache->method('get')->willReturn(null); $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', '1 DAY'); @@ -66,97 +28,19 @@ public function has($key) public function testItReturnsAnInstanceIfTheCorrectCacheExists(): void { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; + $rules = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); + $cache = $this->createStub(CacheInterface::class); + $cache->method('get')->willReturn($rules); $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', 86400); - self::assertEquals( - Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'), - $pslCache->fetch('http://www.example.com') - ); + self::assertEquals($rules, $pslCache->fetch('http://www.example.com')); } public function testItReturnsNullIfTheCacheContentContainsInvalidJsonData(): void { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return 'foobar'; - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; + $cache = $this->createStub(CacheInterface::class); + $cache->method('get')->willReturn('foobar'); $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', 86400); self::assertNull($pslCache->fetch('http://www.example.com')); @@ -164,46 +48,8 @@ public function has($key) public function testItReturnsNullIfTheCacheContentCannotBeConvertedToTheCorrectInstance(): void { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return '{"foo":"bar"}'; - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; + $cache = $this->createStub(CacheInterface::class); + $cache->method('get')->willReturn('{"foo":"bar"}'); $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new \DateTimeImmutable('+1 DAY')); @@ -212,46 +58,8 @@ public function has($key) public function testItCanStoreAPublicSuffixListInstance(): void { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return null; - } - - public function set($key, $value, $ttl = null) - { - return true; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; + $cache = $this->createStub(CacheInterface::class); + $cache->method('set')->willReturn(true); $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); @@ -261,46 +69,8 @@ public function has($key) public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return null; - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; + $cache = $this->createStub(CacheInterface::class); + $cache->method('set')->willReturn(false); $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); @@ -308,50 +78,12 @@ public function has($key) self::assertFalse($pslCache->remember('http://www.example.com', $psl)); } - public function testItReturnsFalseIfItCantCacheAPublicSuffixListInstance(): void { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return null; - } - - public function set($key, $value, $ttl = null) - { - throw new class('Something went wrong.', 0) extends RuntimeException implements CacheException { - }; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } + $exception = new class('Something went wrong.', 0) extends RuntimeException implements CacheException { }; + $cache = $this->createStub(CacheInterface::class); + $cache->method('set')->will(self::throwException($exception)); $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); diff --git a/src/Storage/RootZoneDatabasePsr16CacheTest.php b/src/Storage/RootZoneDatabasePsr16CacheTest.php index fd0fd5d9..96492b6b 100644 --- a/src/Storage/RootZoneDatabasePsr16CacheTest.php +++ b/src/Storage/RootZoneDatabasePsr16CacheTest.php @@ -18,344 +18,77 @@ final class RootZoneDatabasePsr16CacheTest extends TestCase { public function testItReturnsNullIfTheCacheDoesNotExists(): void { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return null; - } + $cache = $this->createStub(CacheInterface::class); + $cache->method('get')->willReturn(null); - public function set($key, $value, $ttl = null) - { - return false; - } + $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', '1 DAY'); - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; - - $cache = new RootZoneDatabasePsr16Cache($cache, 'pdp_', '1 DAY'); - - self::assertNull($cache->fetch('http://www.example.com')); + self::assertNull($instance->fetch('http://www.example.com')); } public function testItReturnsAnInstanceIfTheCorrectCacheExists(): void { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } + $rootZoneDB = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); + $cache = $this->createStub(CacheInterface::class); + $cache->method('get')->willReturn($rootZoneDB); - public function has($key) - { - return true; - } - }; - - $cache = new RootZoneDatabasePsr16Cache($cache, 'pdp_', 86400); + $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', 86400); - self::assertEquals( - TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'), - $cache->fetch('http://www.example.com') - ); + self::assertEquals($rootZoneDB, $instance->fetch('http://www.example.com')); } public function testItReturnsNullIfTheCacheContentContainsInvalidJsonData(): void { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return 'foobar'; - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } + $cache = $this->createStub(CacheInterface::class); + $cache->method('get')->willReturn('foobar'); - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } + $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', 86400); - public function has($key) - { - return true; - } - }; - - $cache = new RootZoneDatabasePsr16Cache($cache, 'pdp_', 86400); - - self::assertNull($cache->fetch('http://www.example.com')); + self::assertNull($instance->fetch('http://www.example.com')); } public function testItReturnsNullIfTheCacheContentCannotBeConvertedToTheCorrectInstance(): void { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return '{"foo":"bar"}'; - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } + $cache = $this->createStub(CacheInterface::class); + $cache->method('get')->willReturn('{"foo":"bar"}'); - public function getMultiple($keys, $default = null) - { - return []; - } + $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', 86400); - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; - - $cache = new RootZoneDatabasePsr16Cache($cache, 'pdp_', 86400); - self::assertNull($cache->fetch('http://www.example.com')); + self::assertNull($instance->fetch('http://www.example.com')); } public function testItCanStoreAPublicSuffixListInstance(): void { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return null; - } - - public function set($key, $value, $ttl = null) - { - return true; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; + $cache = $this->createStub(CacheInterface::class); + $cache->method('set')->willReturn(true); $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $cache = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); - self::assertTrue($cache->remember('http://www.example.com', $rzd)); + self::assertTrue($instance->remember('http://www.example.com', $rzd)); } public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return null; - } - - public function set($key, $value, $ttl = null) - { - return false; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } - }; + $cache = $this->createStub(CacheInterface::class); + $cache->method('set')->willReturn(false); $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $cache = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); - self::assertFalse($cache->remember('http://www.example.com', $rzd)); + self::assertFalse($instance->remember('http://www.example.com', $rzd)); } - public function testItReturnsFalseIfItCantCacheAPublicSuffixListInstance(): void { - $cache = new class() implements CacheInterface { - public function get($key, $default = null) - { - return null; - } - - public function set($key, $value, $ttl = null) - { - throw new class('Something went wrong.', 0) extends RuntimeException implements CacheException { - }; - } - - public function delete($key) - { - return true; - } - - public function clear() - { - return true; - } - - public function getMultiple($keys, $default = null) - { - return []; - } - - public function setMultiple($values, $ttl = null) - { - return true; - } - public function deleteMultiple($keys) - { - return true; - } - - public function has($key) - { - return true; - } + $exception = new class('Something went wrong.', 0) extends RuntimeException implements CacheException { }; + $cache = $this->createStub(CacheInterface::class); + $cache->method('set')->will(self::throwException($exception)); $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $cache = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); - self::assertFalse($cache->remember('http://www.example.com', $rzd)); + self::assertFalse($instance->remember('http://www.example.com', $rzd)); } } diff --git a/src/Suffix.php b/src/Suffix.php index 0db36c39..dbd1a4fc 100644 --- a/src/Suffix.php +++ b/src/Suffix.php @@ -42,6 +42,9 @@ private function __construct($domain, string $section) $this->section = $section; } + /** + * @param array{domain:DomainName, section:string} $properties + */ public static function __set_state(array $properties): self { return new self($properties['domain'], $properties['section']); diff --git a/src/SuffixTest.php b/src/SuffixTest.php index a67b7ad0..ec0f4c78 100644 --- a/src/SuffixTest.php +++ b/src/SuffixTest.php @@ -54,6 +54,9 @@ public function testSetSection(?string $publicSuffix, string $section, bool $isK self::assertSame($isPrivate, $ps->isPrivate()); } + /** + * @return iterable + */ public function PSProvider(): iterable { return [ @@ -88,6 +91,9 @@ public function testConstructorThrowsException(string $publicSuffix): void Suffix::fromUnknown(Domain::fromIDNA2008($publicSuffix)); } + /** + * @return iterable + */ public function invalidPublicSuffixProvider(): iterable { return [ @@ -122,6 +128,9 @@ public function testConversionReturnsTheSameInstance(?string $publicSuffix): voi self::assertEquals($instance->toAscii(), $instance); } + /** + * @return iterable + */ public function conversionReturnsTheSameInstanceProvider(): iterable { return [ @@ -141,13 +150,16 @@ public function testToUnicodeReturnsSameInstance(): void * @dataProvider countableProvider * @param ?string $domain */ - public function testCountable(?string $domain, int $nbLabels, array $labels): void + public function testCountable(?string $domain, int $nbLabels): void { $domain = Suffix::fromUnknown(Domain::fromIDNA2008($domain)); self::assertCount($nbLabels, $domain); } + /** + * @return iterable + */ public function countableProvider(): iterable { return [ @@ -174,6 +186,9 @@ public function testResolveWithCustomIDNAOptions( self::assertSame($expectedUnicode, $publicSuffix->toUnicode()->value()); } + /** + * @return iterable + */ public function customIDNAProvider(): iterable { return [ diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 3b7d6a9d..085def09 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -35,8 +35,14 @@ final class TopLevelDomains implements RootZoneDatabase private string $version; + /** + * @var array + */ private array $records; + /** + * @param array $records + */ private function __construct(array $records, string $version, DateTimeImmutable $lastUpdated) { $this->records = $records; @@ -97,6 +103,8 @@ public static function fromString($content): self * Converts the IANA Root Zone Database into a TopLevelDomains associative array. * * @throws UnableToLoadRootZoneDatabase if the content is invalid or can not be correctly parsed and converted + * + * @return array{version:string, lastUpdated:string, records:array} */ public static function parse(string $content): array { @@ -132,6 +140,8 @@ public static function parse(string $content): array * Extract IANA Root Zone Database header info. * * @throws UnableToLoadRootZoneDatabase if the Header line is invalid + * + * @return array{version:string, lastUpdated:string} */ private static function extractHeader(string $content): array { @@ -186,7 +196,10 @@ public static function fromJsonString(string $jsonString): self return new self($data['records'], $data['version'], $lastUpdated); } - public static function __set_state(array $properties): RootZoneDatabase + /** + * @param array{records:array, version:string, lastUpdated:DateTimeImmutable} $properties + */ + public static function __set_state(array $properties): self { return new self($properties['records'], $properties['version'], $properties['lastUpdated']); } @@ -221,6 +234,9 @@ public function getIterator(): Iterator } } + /** + * @return array{version:string, records:array, lastUpdated:string} + */ public function jsonSerialize(): array { return [ diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index faee8f72..06763132 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -63,6 +63,9 @@ public function testConverterThrowsException(string $content): void TopLevelDomains::fromString($content); } + /** + * @return iterable + */ public function invalidContentProvider(): iterable { $doubleHeader = << + */ public function validDomainProvider(): iterable { $resolvedDomain = ResolvedDomain::fromICANN(Domain::fromIDNA2008('www.example.com'), 1); @@ -294,6 +300,9 @@ public function testGetTopLevelDomainWithUnregisteredTLD(): void $collection->getIANADomain('localhost.locale'); } + /** + * @return iterable + */ public function validTldProvider(): iterable { return [ @@ -317,6 +326,9 @@ public function __toString(): string ]; } + /** + * @return iterable + */ public function invalidTldProvider(): iterable { return [ From 85707f90cbaee0c3b13f41d3b66c986dd837ea55 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 9 Dec 2020 15:53:42 +0100 Subject: [PATCH 359/461] Improve Rules::getCookieDomain and renamed ResolvedDomain named constructor --- README.md | 13 ++++++++----- src/ResolvedDomain.php | 2 +- src/ResolvedDomainTest.php | 12 ++++++------ src/Rules.php | 10 ++++++---- src/TopLevelDomains.php | 6 +++--- 5 files changed, 24 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 328341a4..0299ba11 100644 --- a/README.md +++ b/README.md @@ -171,7 +171,7 @@ integrating an updating mechanism into your software.** Whichever methods chosen to resolve the domain on success, the package will return a `Pdp\ResolvedDomain` instance. -The `Pdp\ResolvedDomain` decorates the `Pdp\Domain` class resolved but also +The `Pdp\ResolvedDomain` decorates the `Pdp\Domain` class resolved but also gives access as separate methods to the domain different components. ~~~php @@ -318,10 +318,13 @@ $newDomain = $domain ->append('www') ->prepend('docs.example'); -echo $domain->toString(); // display 'www.example.com' -echo $newDomain->toString(); // display 'docs.example.com.www' -$newDomain->clear()->labels(); //returns [] -~~~ + + +echo $domain->toString(); //display 'www.example.com' +echo $newDomain->toString(); //display 'docs.example.com.www' +$newDomain->clear()->labels(); //return [] +echo $domain->slice(2)->toString(); //display 'www' +~~~ **WARNING: Because of its definition, a domain name can be `null` or a string.** diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index ea929f83..980b4579 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -71,7 +71,7 @@ public static function fromUnknown($domain): self /** * @param mixed $domain the domain to be resolved */ - public static function fromNull($domain): self + public static function fromNone($domain): self { $domain = self::setDomainName($domain); diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 144ce074..3e01c71e 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -15,7 +15,7 @@ final class ResolvedDomainTest extends TestCase { public function testRegistrableDomainIsNullWithFoundDomain(): void { - $domain = ResolvedDomain::fromNull(Domain::fromIDNA2003('faketld')); + $domain = ResolvedDomain::fromNone(Domain::fromIDNA2003('faketld')); self::assertNull($domain->suffix()->value()); self::assertNull($domain->registrableDomain()->value()); self::assertNull($domain->subDomain()->value()); @@ -307,14 +307,14 @@ public function testWithSubDomainFailsWithNullDomain(): void { self::expectException(UnableToResolveDomain::class); - ResolvedDomain::fromNull(Domain::fromIDNA2008(null))->withSubDomain('www'); + ResolvedDomain::fromNone(Domain::fromIDNA2008(null))->withSubDomain('www'); } public function testWithSubDomainFailsWithOneLabelDomain(): void { self::expectException(UnableToResolveDomain::class); - ResolvedDomain::fromNull(Domain::fromIDNA2003('localhost'))->withSubDomain('www'); + ResolvedDomain::fromNone(Domain::fromIDNA2003('localhost'))->withSubDomain('www'); } public function testWithEmptySubdomain(): void @@ -338,7 +338,7 @@ public function testWithSubDomainWithoutPublicSuffixInfo(): void { self::expectException(UnableToResolveDomain::class); - ResolvedDomain::fromNull(Domain::fromIDNA2003('www.example.com'))->withSubDomain('www'); + ResolvedDomain::fromNone(Domain::fromIDNA2003('www.example.com'))->withSubDomain('www'); } /** @@ -421,7 +421,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'adding the public suffix to a single label domain' => [ - 'domain' => ResolvedDomain::fromNull(Domain::fromIDNA2003('localhost')), + 'domain' => ResolvedDomain::fromNone(Domain::fromIDNA2003('localhost')), 'publicSuffix' => 'www', 'expected' => 'www', 'isKnown' => false, @@ -451,7 +451,7 @@ public function testWithPublicSuffixFailsWithNullDomain(): void { self::expectException(UnableToResolveDomain::class); - ResolvedDomain::fromNull(Domain::fromIDNA2008(null))->withSuffix('www'); + ResolvedDomain::fromNone(Domain::fromIDNA2008(null))->withSuffix('www'); } /** diff --git a/src/Rules.php b/src/Rules.php index e4621b2b..fc7e39d8 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -222,9 +222,9 @@ public function resolve($host): ResolvedDomainName try { return $this->getCookieDomain($host); } catch (UnableToResolveDomain $exception) { - return ResolvedDomain::fromNull($exception->getDomain()); + return ResolvedDomain::fromNone($exception->getDomain()); } catch (SyntaxError $exception) { - return ResolvedDomain::fromNull(Domain::fromIDNA2008(null)); + return ResolvedDomain::fromNone(Domain::fromIDNA2008(null)); } } @@ -248,7 +248,7 @@ public function getCookieDomain($host): ResolvedDomainName return ResolvedDomain::fromUnknown($domain); } - return ResolvedDomain::fromNull($domain); + return ResolvedDomain::fromNone($domain); } /** @@ -324,6 +324,8 @@ private function getEffectiveTopLevelDomain(DomainName $domain, string $section) /** * Returns the public suffix matched against a given PSL section. + * + * @throws UnableToResolveDomain if the domain can not be resolved */ private function getEffectiveTopLevelDomainFromSection(DomainName $domain, string $section): EffectiveTopLevelDomain { @@ -353,7 +355,7 @@ private function getEffectiveTopLevelDomainFromSection(DomainName $domain, strin if ([] === $matches) { $suffix = $domain->slice(0, 1); if ('' === $suffix->value()) { - return Suffix::fromUnknown($suffix->clear()); + throw UnableToResolveDomain::dueToUnresolvableDomain($domain); } return Suffix::fromUnknown($suffix); diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 085def09..a7368fb7 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -256,11 +256,11 @@ public function resolve($host): ResolvedDomainName if ($this->containsTopLevelDomain($domain)) { return ResolvedDomain::fromIANA($domain); } - return ResolvedDomain::fromNull($domain); + return ResolvedDomain::fromNone($domain); } catch (UnableToResolveDomain $exception) { - return ResolvedDomain::fromNull($exception->getDomain()); + return ResolvedDomain::fromNone($exception->getDomain()); } catch (SyntaxError $exception) { - return ResolvedDomain::fromNull(Domain::fromIDNA2008(null)); + return ResolvedDomain::fromNone(Domain::fromIDNA2008(null)); } } From 31a1e2aded22b7245f07f8f529db8f25ccaba274 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 9 Dec 2020 16:38:16 +0100 Subject: [PATCH 360/461] simplify rules --- src/Rules.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Rules.php b/src/Rules.php index fc7e39d8..b8028012 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -353,8 +353,8 @@ private function getEffectiveTopLevelDomainFromSection(DomainName $domain, strin } if ([] === $matches) { - $suffix = $domain->slice(0, 1); - if ('' === $suffix->value()) { + $suffix = $domain->label(0); + if ('' === $suffix) { throw UnableToResolveDomain::dueToUnresolvableDomain($domain); } From 6ce315cb9024daa6d5aebae7d90fc0768152250a Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 9 Dec 2020 20:46:28 +0100 Subject: [PATCH 361/461] Lazy instantiation of Suffix in Rules class --- UPGRADING.md | 23 +++++++++---------- src/Host.php | 4 ++-- src/Rules.php | 40 +++++++++++++++----------------- src/Suffix.php | 51 +++++++++++++++++++++-------------------- src/SuffixTest.php | 2 +- src/TopLevelDomains.php | 6 ++--- 6 files changed, 62 insertions(+), 64 deletions(-) diff --git a/UPGRADING.md b/UPGRADING.md index 8411508e..ffc68204 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -10,7 +10,7 @@ In order to take advantage of PHP new features, the library dropped the support of **all versions before and including PHP 7.3**. The minimum supported PHP version is now **PHP 7.4**. -**Version 6.0 no longer provides an out of the box resource manager system.** +**Version 6.0 no longer provides an out-of-the-box resource manager system.** ### Backward Incompatibility Changes @@ -82,8 +82,8 @@ The `Pdp\Suffix` class **no longer has direct access** to the underlying domain ```diff getLabel(-1); //returns 'co'; ++ $suffix = Suffix::fromICANN('co.uk'); + $suffix->domain()->label(-1); //returns 'co'; ``` @@ -110,10 +110,10 @@ of returning a response object. ```diff getICANNDomain('toto.foobar')->isICANN(); //returns false -+ $rules->getICANNDomain('toto.foobar'); //will throw an exception +- $rules->getICANNDomain('toto.foobar')->isICANN(); //returns false - $rules->getPrivateDomain('ulb.ac.be')->isPrivate(); //returns false -+ $rules->getPrivateDomain('ulb.ac.be'); //will throw an exception ++ $rules->getICANNDomain('toto.foobar'); //will throw an exception ++ $rules->getPrivateDomain('ulb.ac.be'); //will throw an exception ``` #### Domain format @@ -128,12 +128,12 @@ need to use on of the two (2) named constructor `Domain::fromIDNA2008` or ```diff getContent(); // can be a string or null -+ $domain->value(); // can be a string or null - echo $domain; // display 'faß.de' -+ echo $domain->toString(); // display 'faß.de' - $domain->getLabel(-1); // returns 'faß' ++ $domain = Domain::fromIDNA2008('faß.de'); ++ $domain->value(); // can be a string or null ++ echo $domain->toString(); // display 'faß.de' + $domain->label(-1); // returns 'faß' ``` @@ -148,12 +148,12 @@ use Pdp\Rules; use Pdp\TopLevelDomains; - $publicSuffixList = Rules::createFromPath('path/to/public-suffix-data.dat'); -+ $publicSuffixList = Rules::fromPath('path/to/public-suffix-data.dat'); - $rootZoneDatabase = TopLevelDomains::createFromString($rootZoneInlineContent); -+ $rootZoneDatabase = TopLevelDomains::fromString($rootZoneInlineContent); - $rootZoneDatabase->getVersion(); //returns 2018082200 -+ $rootZoneDatabase->version(); //returns 2018082200 - $rootZoneDatabase->getModifiedDate(); //returns \DateTimeImmutable object ++ $publicSuffixList = Rules::fromPath('path/to/public-suffix-data.dat'); ++ $rootZoneDatabase = TopLevelDomains::fromString($rootZoneInlineContent); ++ $rootZoneDatabase->version(); //returns 2018082200 + $rootZoneDatabase->lastUpdated(); //returns \DateTimeImmutable object ``` @@ -216,6 +216,5 @@ representation in other languages. - `Rules::__construct` - `TopLevelDomains::__construct` - `Domain::__construct` -- `PublicSuffix::__construct` methods are now all private please use the provided named constructors instead. diff --git a/src/Host.php b/src/Host.php index 06bc8245..87945e91 100644 --- a/src/Host.php +++ b/src/Host.php @@ -30,8 +30,6 @@ public function toString(): string; public function jsonSerialize(): ?string; /** - * {@inheritdoc} - * * The labels total number. */ public function count(): int; @@ -43,6 +41,7 @@ public function count(): int; * an instance with its content converted to its IDNA ASCII form * * @throws CannotProcessHost if the domain can not be converted to ASCII using IDN UTS46 algorithm + * * @return static */ public function toAscii(): self; @@ -54,6 +53,7 @@ public function toAscii(): self; * an instance with its content converted to its IDNA UTF8 form * * @throws CannotProcessHost if the domain can not be converted to Unicode using IDN UTS46 algorithm + * * @return static */ public function toUnicode(): self; diff --git a/src/Rules.php b/src/Rules.php index b8028012..49b0f218 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -235,16 +235,15 @@ public function getCookieDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); $suffix = $this->getEffectiveTopLevelDomain($domain, ''); - $length = count($suffix); - if ($suffix->isICANN()) { - return ResolvedDomain::fromICANN($domain, $length); + if (self::ICANN_DOMAINS === $suffix[1]) { + return ResolvedDomain::fromICANN($domain, $suffix[0]); } - if ($suffix->isPrivate()) { - return ResolvedDomain::fromPrivate($domain, $length); + if (self::PRIVATE_DOMAINS === $suffix[1]) { + return ResolvedDomain::fromPrivate($domain, $suffix[0]); } - if (1 === $length) { + if (1 === $suffix[0]) { return ResolvedDomain::fromUnknown($domain); } @@ -258,11 +257,11 @@ public function getICANNDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); $suffix = $this->getEffectiveTopLevelDomain($domain, self::ICANN_DOMAINS); - if (!$suffix->isICANN()) { + if (self::ICANN_DOMAINS !== $suffix[1]) { throw UnableToResolveDomain::dueToMissingSuffix($domain, 'ICANN'); } - return ResolvedDomain::fromICANN($domain, count($suffix)); + return ResolvedDomain::fromICANN($domain, $suffix[0]); } /** @@ -272,11 +271,11 @@ public function getPrivateDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); $suffix = $this->getEffectiveTopLevelDomain($domain, self::PRIVATE_DOMAINS); - if (!$suffix->isPrivate()) { + if (self::PRIVATE_DOMAINS !== $suffix[1]) { throw UnableToResolveDomain::dueToMissingSuffix($domain, 'private'); } - return ResolvedDomain::fromPrivate($domain, count($suffix)); + return ResolvedDomain::fromPrivate($domain, $suffix[0]); } /** @@ -302,8 +301,10 @@ private function validateDomain($domain): DomainName /** * Returns the matched public suffix. + * + * @return array{0:int, 1:string} */ - private function getEffectiveTopLevelDomain(DomainName $domain, string $section): EffectiveTopLevelDomain + private function getEffectiveTopLevelDomain(DomainName $domain, string $section): array { $icann = $this->getEffectiveTopLevelDomainFromSection($domain, self::ICANN_DOMAINS); if (self::ICANN_DOMAINS === $section) { @@ -311,7 +312,7 @@ private function getEffectiveTopLevelDomain(DomainName $domain, string $section) } $private = $this->getEffectiveTopLevelDomainFromSection($domain, self::PRIVATE_DOMAINS); - if (count($private) > count($icann)) { + if ($private[0] > $icann[0]) { return $private; } @@ -319,15 +320,17 @@ private function getEffectiveTopLevelDomain(DomainName $domain, string $section) return $icann; } - return Suffix::fromUnknown($domain->slice(0, 1)); + return [1, '']; } /** * Returns the public suffix matched against a given PSL section. * * @throws UnableToResolveDomain if the domain can not be resolved + * + * @return array{0:int, 1:string} */ - private function getEffectiveTopLevelDomainFromSection(DomainName $domain, string $section): EffectiveTopLevelDomain + private function getEffectiveTopLevelDomainFromSection(DomainName $domain, string $section): array { $rules = $this->rules[$section]; $matches = []; @@ -358,14 +361,9 @@ private function getEffectiveTopLevelDomainFromSection(DomainName $domain, strin throw UnableToResolveDomain::dueToUnresolvableDomain($domain); } - return Suffix::fromUnknown($suffix); - } - - $suffix = $domain->slice(0, count($matches)); - if (self::PRIVATE_DOMAINS === $section) { - return Suffix::fromPrivate($suffix); + return [1, '']; } - return Suffix::fromICANN($suffix); + return [count($matches), $section]; } } diff --git a/src/Suffix.php b/src/Suffix.php index dbd1a4fc..9c7dc4f0 100644 --- a/src/Suffix.php +++ b/src/Suffix.php @@ -17,27 +17,8 @@ final class Suffix implements EffectiveTopLevelDomain private string $section; - /** - * @param mixed $domain the public suffix domain information - */ - private function __construct($domain, string $section) + private function __construct(DomainName $domain, string $section) { - if ($domain instanceof DomainNameProvider) { - $domain = $domain->domain(); - } - - if (!$domain instanceof DomainName) { - $domain = Domain::fromIDNA2008($domain); - } - - if ('' === $domain->label(0)) { - throw SyntaxError::dueToInvalidPublicSuffix($domain); - } - - if (null === $domain->value()) { - $section = ''; - } - $this->domain = $domain; $this->section = $section; } @@ -55,7 +36,7 @@ public static function __set_state(array $properties): self */ public static function fromICANN($domain): self { - return new self($domain, self::ICANN); + return new self(self::setDomainName($domain), self::ICANN); } /** @@ -63,7 +44,7 @@ public static function fromICANN($domain): self */ public static function fromPrivate($domain): self { - return new self($domain, self::PRIVATE); + return new self(self::setDomainName($domain), self::PRIVATE); } /** @@ -71,7 +52,7 @@ public static function fromPrivate($domain): self */ public static function fromIANA($domain): self { - return new self($domain, self::IANA); + return new self(self::setDomainName($domain), self::IANA); } /** @@ -79,7 +60,27 @@ public static function fromIANA($domain): self */ public static function fromUnknown($domain): self { - return new self($domain, ''); + return new self(self::setDomainName($domain), ''); + } + + /** + * @param mixed $domain The domain to be resolved + */ + private static function setDomainName($domain): DomainName + { + if ($domain instanceof DomainNameProvider) { + $domain = $domain->domain(); + } + + if (!$domain instanceof DomainName) { + $domain = Domain::fromIDNA2008($domain); + } + + if ('' === $domain->label(0)) { + throw SyntaxError::dueToInvalidPublicSuffix($domain); + } + + return $domain; } public function isKnown(): bool @@ -119,7 +120,7 @@ public function count(): int public function jsonSerialize(): ?string { - return $this->domain->value(); + return $this->domain->jsonSerialize(); } public function value(): ?string diff --git a/src/SuffixTest.php b/src/SuffixTest.php index ec0f4c78..e0df11f6 100644 --- a/src/SuffixTest.php +++ b/src/SuffixTest.php @@ -60,7 +60,7 @@ public function testSetSection(?string $publicSuffix, string $section, bool $isK public function PSProvider(): iterable { return [ - [null, 'ICANN_DOMAINS', false, false, false], + [null, 'ICANN_DOMAINS', true, true, false], ['foo', 'ICANN_DOMAINS', true, true, false], ['foo', 'PRIVATE_DOMAINS', true, false, true], ]; diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index a7368fb7..ba18ea50 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -166,7 +166,7 @@ private static function extractHeader(string $content): array private static function extractRootZone(string $content): string { try { - $tld = Suffix::fromUnknown(Domain::fromIDNA2008($content))->toAscii(); + $tld = Suffix::fromIANA($content)->toAscii(); } catch (CannotProcessHost $exception) { throw UnableToLoadRootZoneDatabase::dueToInvalidRootZoneDomain($content, $exception); } @@ -230,7 +230,7 @@ public function isEmpty(): bool public function getIterator(): Iterator { foreach ($this->records as $tld) { - yield Suffix::fromIANA(Domain::fromIDNA2008($tld)->toAscii()); + yield Suffix::fromIANA($tld)->toAscii(); } } @@ -260,7 +260,7 @@ public function resolve($host): ResolvedDomainName } catch (UnableToResolveDomain $exception) { return ResolvedDomain::fromNone($exception->getDomain()); } catch (SyntaxError $exception) { - return ResolvedDomain::fromNone(Domain::fromIDNA2008(null)); + return ResolvedDomain::fromNone(null); } } From fb6e4648429831d23594df5f8ff10588e5135636 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 10 Dec 2020 08:11:41 +0100 Subject: [PATCH 362/461] Improve Suffix named constructors --- src/ResolvedDomain.php | 16 +--- src/ResolvedDomainTest.php | 16 ++-- src/Rules.php | 45 +++++----- src/Suffix.php | 23 +++++- src/SuffixTest.php | 165 ++++++++++--------------------------- src/SyntaxError.php | 8 +- src/TopLevelDomains.php | 6 +- 7 files changed, 101 insertions(+), 178 deletions(-) diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 980b4579..922c6103 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -55,27 +55,17 @@ public static function fromIANA($domain): self { $domain = self::setDomainName($domain); - return new self($domain, Suffix::fromIANA($domain->slice(0, 1))); + return new self($domain, Suffix::fromIANA($domain->label(0))); } /** * @param mixed $domain the domain to be resolved */ - public static function fromUnknown($domain): self + public static function fromUnknown($domain, int $suffixLength = 0): self { $domain = self::setDomainName($domain); - return new self($domain, Suffix::fromUnknown($domain->slice(0, 1))); - } - - /** - * @param mixed $domain the domain to be resolved - */ - public static function fromNone($domain): self - { - $domain = self::setDomainName($domain); - - return new self($domain, Suffix::fromUnknown($domain->clear())); + return new self($domain, Suffix::fromUnknown($domain->slice(0, $suffixLength))); } /** diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 3e01c71e..bbbf9ec2 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -15,7 +15,7 @@ final class ResolvedDomainTest extends TestCase { public function testRegistrableDomainIsNullWithFoundDomain(): void { - $domain = ResolvedDomain::fromNone(Domain::fromIDNA2003('faketld')); + $domain = ResolvedDomain::fromUnknown(Domain::fromIDNA2003('faketld')); self::assertNull($domain->suffix()->value()); self::assertNull($domain->registrableDomain()->value()); self::assertNull($domain->subDomain()->value()); @@ -101,7 +101,7 @@ public function testToIDN( ): void { $objPublicSuffix = (null === $publicSuffix) ? Suffix::fromUnknown(Domain::fromIDNA2003(null)) : Suffix::fromICANN(Domain::fromIDNA2003($publicSuffix)); - $domain = ResolvedDomain::fromPrivate(Domain::fromIDNA2003($domain), count($objPublicSuffix)); + $domain = ResolvedDomain::fromUnknown(Domain::fromIDNA2003($domain), count($objPublicSuffix)); self::assertSame($expectedDomain, $domain->value()); self::assertSame($expectedSuffix, $domain->suffix()->value()); @@ -195,7 +195,7 @@ public function testToAscii( ): void { $objPublicSuffix = (null === $publicSuffix) ? Suffix::fromUnknown(Domain::fromIDNA2003(null)) : Suffix::fromICANN(Domain::fromIDNA2003($publicSuffix)); - $domain = ResolvedDomain::fromICANN(Domain::fromIDNA2003($domain), count($objPublicSuffix)); + $domain = ResolvedDomain::fromUnknown(Domain::fromIDNA2003($domain), count($objPublicSuffix)); self::assertSame($expectedDomain, $domain->value()); self::assertSame($expectedSuffix, $domain->suffix()->value()); @@ -307,14 +307,14 @@ public function testWithSubDomainFailsWithNullDomain(): void { self::expectException(UnableToResolveDomain::class); - ResolvedDomain::fromNone(Domain::fromIDNA2008(null))->withSubDomain('www'); + ResolvedDomain::fromUnknown(Domain::fromIDNA2008(null))->withSubDomain('www'); } public function testWithSubDomainFailsWithOneLabelDomain(): void { self::expectException(UnableToResolveDomain::class); - ResolvedDomain::fromNone(Domain::fromIDNA2003('localhost'))->withSubDomain('www'); + ResolvedDomain::fromUnknown(Domain::fromIDNA2003('localhost'))->withSubDomain('www'); } public function testWithEmptySubdomain(): void @@ -338,7 +338,7 @@ public function testWithSubDomainWithoutPublicSuffixInfo(): void { self::expectException(UnableToResolveDomain::class); - ResolvedDomain::fromNone(Domain::fromIDNA2003('www.example.com'))->withSubDomain('www'); + ResolvedDomain::fromUnknown(Domain::fromIDNA2003('www.example.com'))->withSubDomain('www'); } /** @@ -421,7 +421,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'adding the public suffix to a single label domain' => [ - 'domain' => ResolvedDomain::fromNone(Domain::fromIDNA2003('localhost')), + 'domain' => ResolvedDomain::fromUnknown(Domain::fromIDNA2003('localhost')), 'publicSuffix' => 'www', 'expected' => 'www', 'isKnown' => false, @@ -451,7 +451,7 @@ public function testWithPublicSuffixFailsWithNullDomain(): void { self::expectException(UnableToResolveDomain::class); - ResolvedDomain::fromNone(Domain::fromIDNA2008(null))->withSuffix('www'); + ResolvedDomain::fromUnknown(Domain::fromIDNA2008(null))->withSuffix('www'); } /** diff --git a/src/Rules.php b/src/Rules.php index 49b0f218..fc532c17 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -222,9 +222,9 @@ public function resolve($host): ResolvedDomainName try { return $this->getCookieDomain($host); } catch (UnableToResolveDomain $exception) { - return ResolvedDomain::fromNone($exception->getDomain()); + return ResolvedDomain::fromUnknown($exception->getDomain()); } catch (SyntaxError $exception) { - return ResolvedDomain::fromNone(Domain::fromIDNA2008(null)); + return ResolvedDomain::fromUnknown(Domain::fromIDNA2008(null)); } } @@ -234,20 +234,16 @@ public function resolve($host): ResolvedDomainName public function getCookieDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); - $suffix = $this->getEffectiveTopLevelDomain($domain, ''); - if (self::ICANN_DOMAINS === $suffix[1]) { - return ResolvedDomain::fromICANN($domain, $suffix[0]); - } - - if (self::PRIVATE_DOMAINS === $suffix[1]) { - return ResolvedDomain::fromPrivate($domain, $suffix[0]); + [$length, $section] = $this->getEffectiveTopLevelDomain($domain, ''); + if (self::ICANN_DOMAINS === $section) { + return ResolvedDomain::fromICANN($domain, $length); } - if (1 === $suffix[0]) { - return ResolvedDomain::fromUnknown($domain); + if (self::PRIVATE_DOMAINS === $section) { + return ResolvedDomain::fromPrivate($domain, $length); } - return ResolvedDomain::fromNone($domain); + return ResolvedDomain::fromUnknown($domain, $length); } /** @@ -256,12 +252,12 @@ public function getCookieDomain($host): ResolvedDomainName public function getICANNDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); - $suffix = $this->getEffectiveTopLevelDomain($domain, self::ICANN_DOMAINS); - if (self::ICANN_DOMAINS !== $suffix[1]) { + [$length, $section] = $this->getEffectiveTopLevelDomain($domain, self::ICANN_DOMAINS); + if (self::ICANN_DOMAINS !== $section) { throw UnableToResolveDomain::dueToMissingSuffix($domain, 'ICANN'); } - return ResolvedDomain::fromICANN($domain, $suffix[0]); + return ResolvedDomain::fromICANN($domain, $length); } /** @@ -270,12 +266,12 @@ public function getICANNDomain($host): ResolvedDomainName public function getPrivateDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); - $suffix = $this->getEffectiveTopLevelDomain($domain, self::PRIVATE_DOMAINS); - if (self::PRIVATE_DOMAINS !== $suffix[1]) { + [$length, $section] = $this->getEffectiveTopLevelDomain($domain, self::PRIVATE_DOMAINS); + if (self::PRIVATE_DOMAINS !== $section) { throw UnableToResolveDomain::dueToMissingSuffix($domain, 'private'); } - return ResolvedDomain::fromPrivate($domain, $suffix[0]); + return ResolvedDomain::fromPrivate($domain, $length); } /** @@ -292,10 +288,14 @@ private function validateDomain($domain): DomainName $domain = $domain->domain(); } - if (!($domain instanceof DomainName)) { + if (!$domain instanceof DomainName) { $domain = Domain::fromIDNA2008($domain); } + if ('' === $domain->label(0)) { + throw UnableToResolveDomain::dueToUnresolvableDomain($domain); + } + return $domain; } @@ -326,8 +326,6 @@ private function getEffectiveTopLevelDomain(DomainName $domain, string $section) /** * Returns the public suffix matched against a given PSL section. * - * @throws UnableToResolveDomain if the domain can not be resolved - * * @return array{0:int, 1:string} */ private function getEffectiveTopLevelDomainFromSection(DomainName $domain, string $section): array @@ -356,11 +354,6 @@ private function getEffectiveTopLevelDomainFromSection(DomainName $domain, strin } if ([] === $matches) { - $suffix = $domain->label(0); - if ('' === $suffix) { - throw UnableToResolveDomain::dueToUnresolvableDomain($domain); - } - return [1, '']; } diff --git a/src/Suffix.php b/src/Suffix.php index 9c7dc4f0..d8fe0ba7 100644 --- a/src/Suffix.php +++ b/src/Suffix.php @@ -36,7 +36,12 @@ public static function __set_state(array $properties): self */ public static function fromICANN($domain): self { - return new self(self::setDomainName($domain), self::ICANN); + $domain = self::setDomainName($domain); + if (1 > count($domain)) { + throw SyntaxError::dueToInvalidSuffix($domain, 'ICANN'); + } + + return new self($domain, self::ICANN); } /** @@ -44,7 +49,12 @@ public static function fromICANN($domain): self */ public static function fromPrivate($domain): self { - return new self(self::setDomainName($domain), self::PRIVATE); + $domain = self::setDomainName($domain); + if (1 > count($domain)) { + throw SyntaxError::dueToInvalidSuffix($domain, 'Private'); + } + + return new self($domain, self::PRIVATE); } /** @@ -52,7 +62,12 @@ public static function fromPrivate($domain): self */ public static function fromIANA($domain): self { - return new self(self::setDomainName($domain), self::IANA); + $domain = self::setDomainName($domain); + if (1 !== count($domain)) { + throw SyntaxError::dueToInvalidSuffix($domain, 'IANA'); + } + + return new self($domain, self::IANA); } /** @@ -77,7 +92,7 @@ private static function setDomainName($domain): DomainName } if ('' === $domain->label(0)) { - throw SyntaxError::dueToInvalidPublicSuffix($domain); + throw SyntaxError::dueToInvalidSuffix($domain); } return $domain; diff --git a/src/SuffixTest.php b/src/SuffixTest.php index e0df11f6..6ba4671d 100644 --- a/src/SuffixTest.php +++ b/src/SuffixTest.php @@ -4,7 +4,6 @@ namespace Pdp; -use InvalidArgumentException; use PHPUnit\Framework\TestCase; use function json_encode; @@ -15,8 +14,7 @@ final class SuffixTest extends TestCase { public function testInternalPhpMethod(): void { - $domain = Domain::fromIDNA2008('ac.be'); - $publicSuffix = Suffix::fromICANN($domain); + $publicSuffix = Suffix::fromICANN('ac.be'); $generatePublicSuffix = eval('return '.var_export($publicSuffix, true).';'); self::assertEquals($publicSuffix, $generatePublicSuffix); self::assertEquals('"ac.be"', json_encode($publicSuffix)); @@ -25,61 +23,9 @@ public function testInternalPhpMethod(): void public function testPSToUnicodeWithUrlEncode(): void { - $domain = Domain::fromIDNA2008('b%C3%A9be'); - self::assertSame('bébe', Suffix::fromUnknown($domain)->toUnicode()->value()); + self::assertSame('bébe', Suffix::fromUnknown('b%C3%A9be')->toUnicode()->value()); } - /** - * @dataProvider PSProvider - * @param ?string $publicSuffix - */ - public function testSetSection(?string $publicSuffix, string $section, bool $isKnown, bool $isIcann, bool $isPrivate): void - { - $domain = Domain::fromIDNA2008($publicSuffix); - - if ('' === $section) { - $ps = Suffix::fromUnknown($domain); - } elseif ('ICANN_DOMAINS' === $section) { - $ps = Suffix::fromICANN($domain); - } elseif ('PRIVATE_DOMAINS' === $section) { - $ps = Suffix::fromPrivate($domain); - } - - if (!isset($ps)) { - throw new InvalidArgumentException('Missing PublicSuffix instance.'); - } - - self::assertSame($isKnown, $ps->isKnown()); - self::assertSame($isIcann, $ps->isICANN()); - self::assertSame($isPrivate, $ps->isPrivate()); - } - - /** - * @return iterable - */ - public function PSProvider(): iterable - { - return [ - [null, 'ICANN_DOMAINS', true, true, false], - ['foo', 'ICANN_DOMAINS', true, true, false], - ['foo', 'PRIVATE_DOMAINS', true, false, true], - ]; - } - - public function testIsPublicSuffix(): void - { - self::assertFalse(Suffix::fromIANA('be')->isPublicSuffix()); - self::assertFalse(Suffix::fromUnknown('be')->isPublicSuffix()); - self::assertTrue(Suffix::fromICANN('be')->isPublicSuffix()); - self::assertTrue(Suffix::fromPrivate('be')->isPublicSuffix()); - } - - public function testConstructorWithHostInstance(): void - { - $domain = Suffix::fromICANN(Domain::fromIDNA2003('ac.be')); - - self::assertEquals($domain, Suffix::fromICANN($domain)); - } /** * @dataProvider invalidPublicSuffixProvider @@ -88,7 +34,7 @@ public function testConstructorThrowsException(string $publicSuffix): void { self::expectException(SyntaxError::class); - Suffix::fromUnknown(Domain::fromIDNA2008($publicSuffix)); + Suffix::fromUnknown($publicSuffix); } /** @@ -102,18 +48,51 @@ public function invalidPublicSuffixProvider(): iterable ]; } - public function testPSToAsciiThrowsException(): void + public function testFromICANN(): void + { + $suffix = Suffix::fromICANN('be'); + + self::assertTrue($suffix->isKnown()); + self::assertTrue($suffix->isPublicSuffix()); + self::assertTrue($suffix->isICANN()); + self::assertFalse($suffix->isPrivate()); + self::assertFalse($suffix->isIANA()); + self::assertSame('be', $suffix->domain()->toString()); + self::expectException(SyntaxError::class); + + Suffix::fromICANN(null); + } + + public function testFromPrivate(): void { + $suffix = Suffix::fromPrivate('be'); + + self::assertTrue($suffix->isKnown()); + self::assertTrue($suffix->isPublicSuffix()); + self::assertFalse($suffix->isICANN()); + self::assertTrue($suffix->isPrivate()); + self::assertFalse($suffix->isIANA()); + self::assertSame('be', $suffix->domain()->toString()); + self::expectException(SyntaxError::class); - Suffix::fromUnknown(Domain::fromIDNA2008('a⒈com')); + Suffix::fromPrivate(null); } - public function testToUnicodeThrowsException(): void + public function testFromIANA(): void { + $suffix = Suffix::fromIANA('be'); + + self::assertTrue($suffix->isKnown()); + self::assertFalse($suffix->isPublicSuffix()); + self::assertFalse($suffix->isICANN()); + self::assertFalse($suffix->isPrivate()); + self::assertTrue($suffix->isIANA()); + self::assertSame('be', $suffix->domain()->toString()); + self::expectException(SyntaxError::class); - Suffix::fromUnknown(Domain::fromIDNA2008('xn--a-ecp.ru'))->toUnicode(); + Suffix::fromIANA('ac.be'); } /** @@ -122,7 +101,7 @@ public function testToUnicodeThrowsException(): void */ public function testConversionReturnsTheSameInstance(?string $publicSuffix): void { - $instance = Suffix::fromUnknown(Domain::fromIDNA2008($publicSuffix)); + $instance = Suffix::fromUnknown($publicSuffix); self::assertEquals($instance->toUnicode(), $instance); self::assertEquals($instance->toAscii(), $instance); @@ -141,7 +120,7 @@ public function conversionReturnsTheSameInstanceProvider(): iterable public function testToUnicodeReturnsSameInstance(): void { - $instance = Suffix::fromUnknown(Domain::fromIDNA2008('食狮.公司.cn')); + $instance = Suffix::fromUnknown('食狮.公司.cn'); self::assertEquals($instance->toUnicode(), $instance); } @@ -152,7 +131,7 @@ public function testToUnicodeReturnsSameInstance(): void */ public function testCountable(?string $domain, int $nbLabels): void { - $domain = Suffix::fromUnknown(Domain::fromIDNA2008($domain)); + $domain = Suffix::fromUnknown($domain); self::assertCount($nbLabels, $domain); } @@ -168,62 +147,4 @@ public function countableProvider(): iterable 'unicode' => ['www.食狮.公司.cn', 4, ['cn', '公司', '食狮', 'www']], ]; } - - /** - * @dataProvider customIDNAProvider - */ - public function testResolveWithCustomIDNAOptions( - string $name, - string $expectedContent, - string $expectedAscii, - string $expectedUnicode - ): void { - $domain = Domain::fromIDNA2008($name); - $publicSuffix = Suffix::fromUnknown($domain); - - self::assertSame($expectedContent, $publicSuffix->value()); - self::assertSame($expectedAscii, $publicSuffix->toAscii()->value()); - self::assertSame($expectedUnicode, $publicSuffix->toUnicode()->value()); - } - - /** - * @return iterable - */ - public function customIDNAProvider(): iterable - { - return [ - 'without deviation characters' => [ - 'example.com', - 'example.com', - 'example.com', - 'example.com', - ], - 'without deviation characters with label' => [ - 'www.example.com', - 'www.example.com', - 'www.example.com', - 'www.example.com', - ], - 'with deviation in domain' => [ - 'www.faß.de', - 'www.faß.de', - 'www.xn--fa-hia.de', - 'www.faß.de', - ], - 'with deviation in label' => [ - 'faß.test.de', - 'faß.test.de', - 'xn--fa-hia.test.de', - 'faß.test.de', - ], - ]; - } - - public function testWithIDNAOptions(): void - { - self::assertNotEquals( - Suffix::fromUnknown(Domain::fromIDNA2008('com')), - Suffix::fromUnknown(Domain::fromIDNA2003('com')) - ); - } } diff --git a/src/SyntaxError.php b/src/SyntaxError.php index 045121c6..7fb116ed 100644 --- a/src/SyntaxError.php +++ b/src/SyntaxError.php @@ -27,9 +27,13 @@ public static function dueToIDNAError(string $domain, string $message = ''): sel return new self('The host `'.$domain.'` is invalid : '.$message); } - public static function dueToInvalidPublicSuffix(Host $publicSuffix): self + public static function dueToInvalidSuffix(Host $publicSuffix, string $type = ''): self { - return new self('The public suffix `"'.$publicSuffix->value() ?? 'NULL'.'"` is invalid.'); + if ('' === $type) { + return new self('The suffix `"'.$publicSuffix->value() ?? 'NULL'.'"` is invalid.'); + } + + return new self('The suffix `"'.$publicSuffix->value() ?? 'NULL'.'"` is an invalid `'.$type.'` suffix.'); } public static function dueToUnsupportedType(string $domain): self diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index ba18ea50..a56cbd0d 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -256,11 +256,11 @@ public function resolve($host): ResolvedDomainName if ($this->containsTopLevelDomain($domain)) { return ResolvedDomain::fromIANA($domain); } - return ResolvedDomain::fromNone($domain); + return ResolvedDomain::fromUnknown($domain); } catch (UnableToResolveDomain $exception) { - return ResolvedDomain::fromNone($exception->getDomain()); + return ResolvedDomain::fromUnknown($exception->getDomain()); } catch (SyntaxError $exception) { - return ResolvedDomain::fromNone(null); + return ResolvedDomain::fromUnknown(null); } } From 8b70551f7982bc1d56b8e8ac96eb2638f6b107d7 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 10 Dec 2020 16:57:37 +0100 Subject: [PATCH 363/461] Refactor tests --- .github/workflows/quality-assurance.yaml | 6 +- README.md | 2 +- src/Domain.php | 102 ++++++------- src/DomainTest.php | 15 +- src/ResolvedDomain.php | 34 +---- src/ResolvedDomainTest.php | 139 ++++++++++-------- src/Rules.php | 6 +- src/RulesTest.php | 112 +++++++------- .../PublicSuffixListPsr16CacheTest.php | 30 ++++ .../PublicSuffixListPsr18ClientTest.php | 10 +- .../RootZoneDatabasePsr16CacheTest.php | 42 +++++- .../RootZoneDatabasePsr18ClientTest.php | 10 +- src/Storage/TopLevelDomainsStorageTest.php | 35 +++++ src/Suffix.php | 12 +- src/SuffixTest.php | 17 ++- src/SyntaxError.php | 6 +- src/TopLevelDomains.php | 15 +- src/TopLevelDomainsTest.php | 65 ++++---- src/UnableToResolveDomain.php | 8 - 19 files changed, 380 insertions(+), 286 deletions(-) diff --git a/.github/workflows/quality-assurance.yaml b/.github/workflows/quality-assurance.yaml index f397f6a0..f0ab9db9 100644 --- a/.github/workflows/quality-assurance.yaml +++ b/.github/workflows/quality-assurance.yaml @@ -10,13 +10,9 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - php: [ '7.4' ] + php: [ '7.4', '8.0' ] composer-flags: [ '' ] phpunit-flags: [ '--coverage-text' ] - include: - - php: '8.0' - composer-flags: '--ignore-platform-req=php' - phpunit-flags: '--no-coverage' steps: - uses: actions/checkout@v2 - uses: shivammathur/setup-php@v2 diff --git a/README.md b/README.md index 0299ba11..636b7681 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ PHP Domain Parser is compliant around: ### Composer ~~~ -$ composer require jeremykendall/php-domain-parser:^6.0 +$ composer require jeremykendall/php-domain-parser ~~~ ### System Requirements diff --git a/src/Domain.php b/src/Domain.php index 0f688016..3a325f71 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -29,9 +29,20 @@ final class Domain implements DomainName { - private const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/'; private const IDNA_2003 = 'IDNA_2003'; private const IDNA_2008 = 'IDNA_2008'; + private const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/'; + + // Note that unreserved is purposely missing . as it is used to separate labels. + private const REGEXP_REGISTERED_NAME = '/(?(DEFINE) + (?[a-z0-9_~\-]) + (?[!$&\'()*+,;=]) + (?%[A-F0-9]{2}) + (?(?:(?&unreserved)|(?&sub_delims)|(?&encoded)){1,63}) + ) + ^(?:(?®_name)\.){0,126}(?®_name)\.?$/ix'; + + private const REGEXP_URI_DELIMITERS = '/[:\/?#\[\]@ ]/'; /** * @var array @@ -45,10 +56,11 @@ final class Domain implements DomainName /** * @param null|mixed $domain */ - private function __construct($domain, string $type) + private function __construct(string $type, $domain) { $this->type = $type; - [$this->domain, $this->labels] = $this->parseDomain($domain); + $this->domain = $this->parseDomain($domain); + $this->labels = null === $this->domain ? [] : array_reverse(explode('.', $this->domain)); } /** @@ -56,7 +68,7 @@ private function __construct($domain, string $type) */ public static function __set_state(array $properties): self { - return new self($properties['domain'], $properties['type']); + return new self($properties['type'], $properties['domain']); } /** @@ -64,7 +76,7 @@ public static function __set_state(array $properties): self */ public static function fromIDNA2003($domain): self { - return new self($domain, self::IDNA_2003); + return new self(self::IDNA_2003, $domain); } /** @@ -72,29 +84,23 @@ public static function fromIDNA2003($domain): self */ public static function fromIDNA2008($domain): self { - return new self($domain, self::IDNA_2008); + return new self(self::IDNA_2008, $domain); } /** * @param mixed $domain a domain - * - * @return array{0:string|null, 1:array} */ - private function parseDomain($domain): array + private function parseDomain($domain): ?string { if ($domain instanceof DomainNameProvider) { $domain = $domain->domain(); } - if (!$domain instanceof DomainName) { - if ($domain instanceof Host) { - $domain = $domain->toUnicode()->value(); - } - - return $this->parseValue($domain); + if ($domain instanceof Host) { + return $this->parseValue($domain->toUnicode()->value()); } - return $this->parseValue($domain->toUnicode()->value()); + return $this->parseValue($domain); } /** @@ -108,13 +114,11 @@ private function parseDomain($domain): array * * @throws SyntaxError If the host is not a domain * @throws SyntaxError If the domain is not a host - * - * @return array{0:string|null, 1:array} */ - private function parseValue($domain): array + private function parseValue($domain): ?string { if (null === $domain) { - return [null, []]; + return null; } if (is_object($domain) && method_exists($domain, '__toString')) { @@ -127,7 +131,7 @@ private function parseValue($domain): array $domain = (string) $domain; if ('' === $domain) { - return ['', ['']]; + return ''; } $res = filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); @@ -136,24 +140,12 @@ private function parseValue($domain): array } $formattedDomain = rawurldecode($domain); - - // Note that unreserved is purposely missing . as it is used to separate labels. - static $domainName = '/(?(DEFINE) - (?[a-z0-9_~\-]) - (?[!$&\'()*+,;=]) - (?%[A-F0-9]{2}) - (?(?:(?&unreserved)|(?&sub_delims)|(?&encoded)){1,63}) - ) - ^(?:(?®_name)\.){0,126}(?®_name)\.?$/ix'; - if (1 === preg_match($domainName, $formattedDomain)) { - $formattedDomain = strtolower($formattedDomain); - - return [$formattedDomain, array_reverse(explode('.', $formattedDomain))]; + if (1 === preg_match(self::REGEXP_REGISTERED_NAME, $formattedDomain)) { + return strtolower($formattedDomain); } // a domain name can not contains URI delimiters or space - static $genDelimiters = '/[:\/?#\[\]@ ]/'; - if (1 === preg_match($genDelimiters, $formattedDomain)) { + if (1 === preg_match(self::REGEXP_URI_DELIMITERS, $formattedDomain)) { throw SyntaxError::dueToInvalidCharacters($domain); } @@ -162,11 +154,7 @@ private function parseValue($domain): array throw SyntaxError::dueToInvalidLength($domain); } - $formattedDomain = $this->domainToUnicode($this->domainToAscii($formattedDomain)); - - $labels = array_reverse(explode('.', $formattedDomain)); - - return [$formattedDomain, $labels]; + return $this->domainToUnicode($this->domainToAscii($formattedDomain)); } private function domainToAscii(string $domain): string @@ -206,7 +194,7 @@ public function isAscii(): bool public function jsonSerialize(): ?string { - return $this->value(); + return $this->domain; } public function count(): int @@ -221,7 +209,7 @@ public function value(): ?string public function toString(): string { - return (string) $this->value(); + return (string) $this->domain; } public function label(int $key): ?string @@ -264,7 +252,7 @@ public function toAscii(): self return $this; } - return new self($domain, $this->type); + return new self($this->type, $domain); } public function toUnicode(): self @@ -278,7 +266,7 @@ public function toUnicode(): self return $this; } - return new self($domain, $this->type); + return new self($this->type, $domain); } /** @@ -330,13 +318,13 @@ public function append($label): self public function withLabel(int $key, $label): self { - $nb_labels = count($this->labels); - if ($key < - $nb_labels - 1 || $key > $nb_labels) { + $nbLabels = count($this->labels); + if ($key < - $nbLabels - 1 || $key > $nbLabels) { throw SyntaxError::dueToInvalidLabelKey($this, $key); } if (0 > $key) { - $key = $nb_labels + $key; + $key = $nbLabels + $key; } $label = $this->normalize($label); @@ -349,28 +337,28 @@ public function withLabel(int $key, $label): self $labels[$key] = $label; ksort($labels); - return new self(implode('.', array_reverse($labels)), $this->type); + return new self($this->type, implode('.', array_reverse($labels))); } public function withoutLabel(int $key, int ...$keys): self { array_unshift($keys, $key); - $nb_labels = count($this->labels); + $nbLabels = count($this->labels); foreach ($keys as &$offset) { - if (- $nb_labels > $offset || $nb_labels - 1 < $offset) { + if (- $nbLabels > $offset || $nbLabels - 1 < $offset) { throw SyntaxError::dueToInvalidLabelKey($this, $key); } if (0 > $offset) { - $offset += $nb_labels; + $offset += $nbLabels; } } unset($offset); - $deleted_keys = array_keys(array_count_values($keys)); + $deletedKeys = array_keys(array_count_values($keys)); $labels = []; foreach ($this->labels as $offset => $label) { - if (!in_array($offset, $deleted_keys, true)) { + if (!in_array($offset, $deletedKeys, true)) { $labels[] = $label; } } @@ -388,13 +376,13 @@ public function clear(): self return $this; } - return new self(null, $this->type); + return new self($this->type, null); } public function slice(int $offset, int $length = null): self { - $nb_labels = count($this->labels); - if ($offset < - $nb_labels || $offset > $nb_labels) { + $nbLabels = count($this->labels); + if ($offset < - $nbLabels || $offset > $nbLabels) { throw SyntaxError::dueToInvalidLabelKey($this, $offset); } diff --git a/src/DomainTest.php b/src/DomainTest.php index 09bdbdd7..b9a4160c 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -18,7 +18,7 @@ final class DomainTest extends TestCase */ public function testToAsciiThrowsException(string $domain): void { - self::expectException(SyntaxError::class); + $this->expectException(SyntaxError::class); Domain::fromIDNA2008($domain); } @@ -37,7 +37,7 @@ public function invalidDomainProvider(): iterable public function testToUnicodeThrowsException(): void { - self::expectException(SyntaxError::class); + $this->expectException(SyntaxError::class); Domain::fromIDNA2008('xn--a-ecp.ru')->toUnicode(); } @@ -95,6 +95,7 @@ public function testOffsets(): void self::assertSame([0, 2], $domain->keys('com')); self::assertSame([], $domain->keys('toto')); + self::assertSame([0, 1, 2, 3], $domain->keys()); } public function testLabels(): void @@ -310,19 +311,19 @@ public function withLabelWorksProvider(): iterable public function testWithLabelFailsWithTypeError(): void { - self::expectException(TypeError::class); + $this->expectException(TypeError::class); Domain::fromIDNA2008('example.com')->withLabel(1, new \stdClass()); } public function testWithLabelFailsWithInvalidKey(): void { - self::expectException(SyntaxError::class); + $this->expectException(SyntaxError::class); Domain::fromIDNA2008('example.com')->withLabel(-4, 'www'); } public function testWithLabelFailsWithInvalidLabel2(): void { - self::expectException(SyntaxError::class); + $this->expectException(SyntaxError::class); Domain::fromIDNA2008('example.com')->withLabel(-1, ''); } @@ -411,7 +412,7 @@ public function withoutLabelWorksProvider(): iterable public function testwithoutLabelFailsWithInvalidKey(): void { - self::expectException(SyntaxError::class); + $this->expectException(SyntaxError::class); Domain::fromIDNA2008('example.com')->withoutLabel(-3); } @@ -502,7 +503,7 @@ public function testSlice(): void public function testSliceThrowsOnOverFlow(): void { - self::expectException(SyntaxError::class); + $this->expectException(SyntaxError::class); Domain::fromIDNA2008('ulb.ac.be')->slice(5); } diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 922c6103..6d4adcdb 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -5,7 +5,6 @@ namespace Pdp; use function count; -use function substr; final class ResolvedDomain implements ResolvedDomainName { @@ -25,7 +24,6 @@ private function __construct(DomainName $domain, EffectiveTopLevelDomain $suffix $this->suffix = $suffix; $this->validateState(); - $this->setComponents(); } /** @@ -99,7 +97,12 @@ private static function setDomainName($domain): DomainName */ private function validateState(): void { - if (null === $this->suffix->value()) { + $suffixValue = $this->suffix->value(); + if (null === $suffixValue) { + $nullDomain = $this->domain->clear(); + $this->registrableDomain = $nullDomain; + $this->secondLevelDomain = $nullDomain; + $this->subDomain = $nullDomain; return; } @@ -107,34 +110,11 @@ private function validateState(): void throw UnableToResolveDomain::dueToUnresolvableDomain($this->domain); } - if ('.' === substr($this->domain->toString(), -1, 1)) { - throw UnableToResolveDomain::dueToUnresolvableDomain($this->domain); - } - - if ($this->domain->value() === $this->suffix->value()) { + if ($this->domain->value() === $suffixValue) { throw UnableToResolveDomain::dueToIdenticalValue($this->domain); } - if ($this->domain->slice(0, count($this->suffix))->value() !== $this->suffix->value()) { - throw UnableToResolveDomain::dueToMismatchedSuffix($this->domain, $this->suffix); - } - } - - /** - * Compute resolved domain components. - */ - private function setComponents(): void - { $length = count($this->suffix); - if (0 === $length) { - $nullDomain = $this->domain->clear(); - $this->registrableDomain = $nullDomain; - $this->secondLevelDomain = $nullDomain; - $this->subDomain = $nullDomain; - - return; - } - $this->registrableDomain = $this->domain->slice(0, $length + 1); $this->secondLevelDomain = $this->domain->slice($length, 1); $this->subDomain = $this->domain->slice($length + 1); diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index bbbf9ec2..341b4e04 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -13,9 +13,18 @@ */ final class ResolvedDomainTest extends TestCase { + public function testItCanBeCreatedWithAnotherResolvedDomain(): void + { + $domain = ResolvedDomain::fromICANN('www.github.io', 1); + $newDomain = ResolvedDomain::fromPrivate($domain, 2); + + self::assertEquals($domain->domain(), $newDomain->domain()); + self::assertNotSame($domain->suffix()->value(), $newDomain->suffix()->value()); + } + public function testRegistrableDomainIsNullWithFoundDomain(): void { - $domain = ResolvedDomain::fromUnknown(Domain::fromIDNA2003('faketld')); + $domain = ResolvedDomain::fromUnknown('faketld'); self::assertNull($domain->suffix()->value()); self::assertNull($domain->registrableDomain()->value()); self::assertNull($domain->subDomain()->value()); @@ -26,9 +35,9 @@ public function testRegistrableDomainIsNullWithFoundDomain(): void * @dataProvider provideWrongConstructor * @param ?string $domain */ - public function testConstructorThrowsExceptionOnMisMatchPublicSuffixDomain(?string $domain, int $length): void + public function testItThrowsExceptionMisMatchPublicSuffixDomain(?string $domain, int $length): void { - self::expectException(UnableToResolveDomain::class); + $this->expectException(UnableToResolveDomain::class); ResolvedDomain::fromICANN($domain, $length); } @@ -50,9 +59,9 @@ public function provideWrongConstructor(): iterable ]; } - public function testDomainInternalPhpMethod(): void + public function testItCanBeUsedWithInternalPhpMethod(): void { - $domain = ResolvedDomain::fromICANN(Domain::fromIDNA2003('www.ulb.ac.be'), 2); + $domain = ResolvedDomain::fromICANN('www.ulb.ac.be', 2); $generateDomain = eval('return '.var_export($domain, true).';'); self::assertEquals($domain, $generateDomain); self::assertEquals('"www.ulb.ac.be"', json_encode($domain->jsonSerialize())); @@ -63,10 +72,9 @@ public function testDomainInternalPhpMethod(): void * @dataProvider countableProvider * @param ?string $domain */ - public function testCountable(?string $domain, int $nbLabels): void + public function testItImplementsCountable(?string $domain, int $nbLabels): void { - $domain = Domain::fromIDNA2003($domain); - self::assertCount($nbLabels, $domain); + self::assertCount($nbLabels, ResolvedDomain::fromUnknown($domain)); } /** @@ -91,7 +99,7 @@ public function countableProvider(): iterable * @param ?string $expectedIDNDomain * @param ?string $expectedIDNSuffix */ - public function testToIDN( + public function testItCanBeConvertedToUnicode( ?string $domain, ?string $publicSuffix, ?string $expectedDomain, @@ -99,9 +107,7 @@ public function testToIDN( ?string $expectedIDNDomain, ?string $expectedIDNSuffix ): void { - $objPublicSuffix = (null === $publicSuffix) ? Suffix::fromUnknown(Domain::fromIDNA2003(null)) : Suffix::fromICANN(Domain::fromIDNA2003($publicSuffix)); - - $domain = ResolvedDomain::fromUnknown(Domain::fromIDNA2003($domain), count($objPublicSuffix)); + $domain = ResolvedDomain::fromUnknown(Domain::fromIDNA2003($domain), count(Suffix::fromUnknown($publicSuffix))); self::assertSame($expectedDomain, $domain->value()); self::assertSame($expectedSuffix, $domain->suffix()->value()); @@ -185,7 +191,7 @@ public function toUnicodeProvider(): iterable * @param ?string $expectedAsciiDomain * @param ?string $expectedAsciiSuffix */ - public function testToAscii( + public function testItCanBeConvertedToAscii( ?string $domain, ?string $publicSuffix, ?string $expectedDomain, @@ -193,9 +199,7 @@ public function testToAscii( ?string $expectedAsciiDomain, ?string $expectedAsciiSuffix ): void { - $objPublicSuffix = (null === $publicSuffix) ? Suffix::fromUnknown(Domain::fromIDNA2003(null)) : Suffix::fromICANN(Domain::fromIDNA2003($publicSuffix)); - - $domain = ResolvedDomain::fromUnknown(Domain::fromIDNA2003($domain), count($objPublicSuffix)); + $domain = ResolvedDomain::fromUnknown(Domain::fromIDNA2003($domain), count(Domain::fromIDNA2003($publicSuffix))); self::assertSame($expectedDomain, $domain->value()); self::assertSame($expectedSuffix, $domain->suffix()->value()); @@ -260,7 +264,7 @@ public function toAsciiProvider(): iterable * @param mixed $subdomain the subdomain to add * @param ?string $expected */ - public function testWithSubDomainWorks(ResolvedDomain $domain, $subdomain, ?string $expected): void + public function testItCanHaveItsSubDomainChanged(ResolvedDomain $domain, $subdomain, ?string $expected): void { $result = $domain->withSubDomain($subdomain); @@ -276,7 +280,7 @@ public function withSubDomainWorksProvider(): iterable { return [ 'simple addition' => [ - 'domain' => ResolvedDomain::fromICANN(Domain::fromIDNA2003('example.com'), 1), + 'domain' => ResolvedDomain::fromICANN('example.com', 1), 'subdomain' => 'www', 'expected' => 'www', ], @@ -303,42 +307,32 @@ public function withSubDomainWorksProvider(): iterable ]; } - public function testWithSubDomainFailsWithNullDomain(): void + public function testItCanThrowsDuringSubDomainChangesIfItHasNoSuffix(): void { - self::expectException(UnableToResolveDomain::class); + $this->expectException(UnableToResolveDomain::class); - ResolvedDomain::fromUnknown(Domain::fromIDNA2008(null))->withSubDomain('www'); + ResolvedDomain::fromUnknown(null)->withSubDomain('www'); } - public function testWithSubDomainFailsWithOneLabelDomain(): void + public function testItCanThrowsDuringSubDomainChangesIfItHasOnlyOneLabel(): void { - self::expectException(UnableToResolveDomain::class); + $this->expectException(UnableToResolveDomain::class); - ResolvedDomain::fromUnknown(Domain::fromIDNA2003('localhost'))->withSubDomain('www'); + ResolvedDomain::fromUnknown('localhost')->withSubDomain('www'); } - public function testWithEmptySubdomain(): void + public function testItCanThrowsDuringSubDomainChangesIfTheSubDomainIsTheEmptyString(): void { - self::expectException(SyntaxError::class); + $this->expectException(SyntaxError::class); - $domain = ResolvedDomain::fromICANN(Domain::fromIDNA2003('www.example.com'), 1); - - $domain->withSubDomain(''); + ResolvedDomain::fromICANN('www.example.com', 1)->withSubDomain(''); } - public function testWithSubDomainFailsWithNonStringableObject(): void + public function testItCanThrowsDuringSubDomainChangesIfTheSubDomainIsNotStringable(): void { - self::expectException(TypeError::class); - $domain = ResolvedDomain::fromICANN(Domain::fromIDNA2003('www.example.com'), 1); + $this->expectException(TypeError::class); - $domain->withSubDomain(date_create()); - } - - public function testWithSubDomainWithoutPublicSuffixInfo(): void - { - self::expectException(UnableToResolveDomain::class); - - ResolvedDomain::fromUnknown(Domain::fromIDNA2003('www.example.com'))->withSubDomain('www'); + ResolvedDomain::fromICANN('www.example.com', 1)->withSubDomain(date_create()); } /** @@ -347,7 +341,7 @@ public function testWithSubDomainWithoutPublicSuffixInfo(): void * @param mixed $publicSuffix the public suffix * @param ?string $expected */ - public function testWithPublicSuffixWorks( + public function testItCanChangeItsSuffix( ResolvedDomain $domain, $publicSuffix, ?string $expected, @@ -369,11 +363,11 @@ public function testWithPublicSuffixWorks( */ public function withPublicSuffixWorksProvider(): iterable { - $base_domain = ResolvedDomain::fromICANN(Domain::fromIDNA2003('example.com'), 1); + $baseDomain = ResolvedDomain::fromICANN('example.com', 1); return [ 'simple update (1)' => [ - 'domain' => $base_domain, + 'domain' => $baseDomain, 'publicSuffix' => 'be', 'expected' => 'be', 'isKnown' => false, @@ -381,31 +375,31 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'simple update (2)' => [ - 'domain' => $base_domain, - 'publicSuffix' => Suffix::fromPrivate(Domain::fromIDNA2003('github.io')), + 'domain' => $baseDomain, + 'publicSuffix' => Suffix::fromPrivate('github.io'), 'expected' => 'github.io', 'isKnown' => true, 'isICANN' => false, 'isPrivate' => true, ], 'same public suffix but PSL info is changed' => [ - 'domain' => $base_domain, - 'publicSuffix' => Suffix::fromPrivate(Domain::fromIDNA2003('com')), + 'domain' => $baseDomain, + 'publicSuffix' => Suffix::fromPrivate('com'), 'expected' => 'com', 'isKnown' => true, 'isICANN' => false, 'isPrivate' => true, ], 'same public suffix but PSL info does not changed' => [ - 'domain' => $base_domain, - 'publicSuffix' => Suffix::fromICANN(Domain::fromIDNA2003('com')), + 'domain' => $baseDomain, + 'publicSuffix' => Suffix::fromICANN('com'), 'expected' => 'com', 'isKnown' => true, 'isICANN' => true, 'isPrivate' => false, ], 'simple update IDN (1)' => [ - 'domain' => $base_domain, + 'domain' => $baseDomain, 'publicSuffix' => Suffix::fromICANN(Domain::fromIDNA2008('рф')), 'expected' => 'xn--p1ai', 'isKnown' => true, @@ -421,7 +415,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'adding the public suffix to a single label domain' => [ - 'domain' => ResolvedDomain::fromUnknown(Domain::fromIDNA2003('localhost')), + 'domain' => ResolvedDomain::fromUnknown('localhost'), 'publicSuffix' => 'www', 'expected' => 'www', 'isKnown' => false, @@ -437,7 +431,7 @@ public function withPublicSuffixWorksProvider(): iterable 'isPrivate' => false, ], 'with custom IDNA domain options' =>[ - 'domain' => ResolvedDomain::fromICANN(Domain::fromIDNA2008('www.bébé.be'), 1), + 'domain' => ResolvedDomain::fromICANN('www.bébé.be', 1), 'publicSuffix' => null, 'expected' => null, 'isKnown' => false, @@ -447,11 +441,11 @@ public function withPublicSuffixWorksProvider(): iterable ]; } - public function testWithPublicSuffixFailsWithNullDomain(): void + public function testItCanThrowsDuringSuffixChangesIfTheDomainHasNotSuffix(): void { - self::expectException(UnableToResolveDomain::class); + $this->expectException(UnableToResolveDomain::class); - ResolvedDomain::fromUnknown(Domain::fromIDNA2008(null))->withSuffix('www'); + ResolvedDomain::fromUnknown(null)->withSuffix('www'); } /** @@ -462,7 +456,7 @@ public function testWithPublicSuffixFailsWithNullDomain(): void * @param ?string $expectedRegistrable * @param ?string $expectedSubDomain */ - public function testResolveWorksWithCustomIDNAOptions( + public function testItCanWorksWithIDNAOptions( string $domainName, string $publicSuffix, ?string $expectedContent, @@ -471,8 +465,7 @@ public function testResolveWorksWithCustomIDNAOptions( ?string $expectedRegistrable, ?string $expectedSubDomain ): void { - $host = Domain::fromIDNA2008($domainName); - $resolvedDomain = ResolvedDomain::fromICANN($host, count(Domain::fromIDNA2008($publicSuffix))); + $resolvedDomain = ResolvedDomain::fromICANN($domainName, count(Domain::fromIDNA2008($publicSuffix))); self::assertSame($expectedContent, $resolvedDomain->value()); self::assertSame($expectedAscii, $resolvedDomain->toAscii()->value()); @@ -541,7 +534,7 @@ public function testWithSecondLevelDomain( ?string $expectedSld, ?string $expectedHost ): void { - $domain = ResolvedDomain::fromICANN(Domain::fromIDNA2008($host), count(Domain::fromIDNA2008($publicSuffix))); + $domain = ResolvedDomain::fromICANN($host, count(Domain::fromIDNA2008($publicSuffix))); $newDomain = $domain->withSecondLevelDomain($sld); self::assertSame($expectedSld, $newDomain->secondLevelDomain()->value()); @@ -579,4 +572,32 @@ public function withSldWorksProvider(): iterable ], ]; } + + public function testItCanNotAppendAnEmptySLD(): void + { + $this->expectException(UnableToResolveDomain::class); + + ResolvedDomain::fromICANN('private.ulb.ac.be', 2)->withSecondLevelDomain(null); + } + + public function testItCanNotAppendASLDToAResolvedDomainWithoutSuffix(): void + { + $this->expectException(UnableToResolveDomain::class); + + ResolvedDomain::fromUnknown('private.ulb.ac.be')->withSecondLevelDomain('yes'); + } + + public function testItCanNotAppendAnInvalidSLDToAResolvedDomain(): void + { + $this->expectException(UnableToResolveDomain::class); + + ResolvedDomain::fromIANA('private.ulb.ac.be')->withSecondLevelDomain('foo.bar'); + } + + public function testItReturnsTheInstanceWhenTheSLDIsEqual(): void + { + $domain = ResolvedDomain::fromICANN('private.ulb.ac.be', 2); + + self::assertEquals($domain->withSecondLevelDomain('ulb'), $domain); + } } diff --git a/src/Rules.php b/src/Rules.php index fc532c17..80e16c38 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -27,9 +27,9 @@ final class Rules implements PublicSuffixList { private const ICANN_DOMAINS = 'ICANN_DOMAINS'; - private const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; + private const REGEX_PSL_SECTION = ',^// ===(?BEGIN|END) (?ICANN|PRIVATE) DOMAINS===,'; private const PSL_SECTION = [ 'ICANN' => [ 'BEGIN' => self::ICANN_DOMAINS, @@ -41,10 +41,8 @@ final class Rules implements PublicSuffixList ], ]; - private const REGEX_PSL_SECTION = ',^// ===(?BEGIN|END) (?ICANN|PRIVATE) DOMAINS===,'; - /** - * PSL rules as a multidimentional associative array. + * PSL rules as a multidimensional associative array. * * @var array> */ diff --git a/src/RulesTest.php b/src/RulesTest.php index 1c87b6ab..8381e25f 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -4,6 +4,7 @@ namespace Pdp; +use DateTimeImmutable; use PHPUnit\Framework\TestCase; use TypeError; use function array_fill; @@ -16,14 +17,14 @@ */ final class RulesTest extends TestCase { - private Rules $rules; + private static Rules $rules; - public function setUp(): void + public static function setUpBeforeClass(): void { /** @var string $string */ $string = file_get_contents(dirname(__DIR__).'/test_data/public_suffix_list.dat'); - $this->rules = Rules::fromString($string); + self::$rules = Rules::fromString($string); } public function testCreateFromPath(): void @@ -36,23 +37,30 @@ public function testCreateFromPath(): void ]); $rulesFromPath = Rules::fromPath(dirname(__DIR__).'/test_data/public_suffix_list.dat', $context); - self::assertEquals($this->rules, $rulesFromPath); + self::assertEquals(self::$rules, $rulesFromPath); } public function testCreateFromPathThrowsException(): void { - self::expectException(UnableToLoadPublicSuffixList::class); + $this->expectException(UnableToLoadPublicSuffixList::class); Rules::fromPath('/foo/bar.dat'); } public function testCreateFromPathThrowsExceptionIfTheContentIsInvalid(): void { - self::expectException(UnableToLoadPublicSuffixList::class); + $this->expectException(UnableToLoadPublicSuffixList::class); Rules::fromPath(dirname(__DIR__).'/test_data/invalid_suffix_list_content.dat'); } + public function testFromStringThrowsOnTypeError(): void + { + $this->expectException(TypeError::class); + + Rules::fromString(new DateTimeImmutable()); + } + /** * @covers ::jsonSerialize * @covers ::fromJsonString @@ -60,9 +68,9 @@ public function testCreateFromPathThrowsExceptionIfTheContentIsInvalid(): void public function testJsonMethods(): void { /** @var string $data */ - $data = json_encode($this->rules); + $data = json_encode(self::$rules); - self::assertEquals($this->rules, Rules::fromJsonString($data)); + self::assertEquals(self::$rules, Rules::fromJsonString($data)); } /** @@ -71,7 +79,7 @@ public function testJsonMethods(): void */ public function testJsonStringFailsWithInvalidJson(): void { - self::expectException(UnableToLoadPublicSuffixList::class); + $this->expectException(UnableToLoadPublicSuffixList::class); Rules::fromJsonString(''); } @@ -82,42 +90,42 @@ public function testJsonStringFailsWithInvalidJson(): void */ public function testJsonStringFailsWithMissingIndexesCollection(): void { - self::expectException(UnableToLoadPublicSuffixList::class); + $this->expectException(UnableToLoadPublicSuffixList::class); Rules::fromJsonString('{"ICANN_DOMAINS":"foo","PRIVATE_DOMAINS":"bar"}'); } public function testDomainInternalPhpMethod(): void { - $generateRules = eval('return '.var_export($this->rules, true).';'); + $generateRules = eval('return '.var_export(self::$rules, true).';'); - self::assertEquals($this->rules, $generateRules); + self::assertEquals(self::$rules, $generateRules); } public function testNullWillReturnNullDomain(): void { - $domain = $this->rules->resolve('COM'); + $domain = self::$rules->resolve('COM'); self::assertFalse($domain->suffix()->isKnown()); } public function testThrowsTypeErrorOnWrongInput(): void { - self::expectException(TypeError::class); + $this->expectException(TypeError::class); - $this->rules->resolve(date_create()); + self::$rules->resolve(date_create()); } public function testIsSuffixValidFalse(): void { - $domain = $this->rules->resolve('www.example.faketld'); + $domain = self::$rules->resolve('www.example.faketld'); self::assertFalse($domain->suffix()->isKnown()); } public function testIsSuffixValidTrue(): void { - $domain = $this->rules->resolve('www.example.com'); + $domain = self::$rules->resolve('www.example.com'); self::assertTrue($domain->suffix()->isKnown()); self::assertTrue($domain->suffix()->isICANN()); @@ -126,7 +134,7 @@ public function testIsSuffixValidTrue(): void public function testIsSuffixValidFalseWithPunycoded(): void { - $domain = $this->rules->resolve('www.example.xn--85x722f'); + $domain = self::$rules->resolve('www.example.xn--85x722f'); self::assertFalse($domain->suffix()->isKnown()); self::assertFalse($domain->suffix()->isICANN()); @@ -135,7 +143,7 @@ public function testIsSuffixValidFalseWithPunycoded(): void public function testSubDomainIsNull(): void { - $domain = $this->rules->resolve('ulb.ac.be'); + $domain = self::$rules->resolve('ulb.ac.be'); self::assertTrue($domain->suffix()->isKnown()); self::assertTrue($domain->suffix()->isICANN()); @@ -144,14 +152,14 @@ public function testSubDomainIsNull(): void public function testWithExceptionName(): void { - $domain = $this->rules->resolve('_b%C3%A9bé.be-'); + $domain = self::$rules->resolve('_b%C3%A9bé.be-'); self::assertNull($domain->value()); } public function testWithPrivateDomain(): void { - $domain = $this->rules->resolve('thephpleague.github.io'); + $domain = self::$rules->resolve('thephpleague.github.io'); self::assertTrue($domain->suffix()->isKnown()); self::assertFalse($domain->suffix()->isICANN()); @@ -161,7 +169,7 @@ public function testWithPrivateDomain(): void public function testWithAbsoluteHostInvalid(): void { - $domain = $this->rules->resolve('private.ulb.ac.be.'); + $domain = self::$rules->resolve('private.ulb.ac.be.'); self::assertSame('private.ulb.ac.be.', $domain->value()); self::assertFalse($domain->suffix()->isKnown()); @@ -174,25 +182,25 @@ public function testWithICANNDomainInvalid(): void { $domain = 'example.invalidICANNTLD'; - self::expectException(UnableToResolveDomain::class); - self::expectExceptionMessage('The domain "'.strtolower($domain).'" does not contain a "ICANN" TLD.'); + $this->expectException(UnableToResolveDomain::class); + $this->expectExceptionMessage('The domain "'.strtolower($domain).'" does not contain a "ICANN" TLD.'); - $this->rules->getICANNDomain($domain); + self::$rules->getICANNDomain($domain); } public function testWithPrivateDomainInvalid(): void { $domain = 'private.ulb.ac.be'; - self::expectException(UnableToResolveDomain::class); - self::expectExceptionMessage('The domain "'.$domain.'" does not contain a "private" TLD.'); + $this->expectException(UnableToResolveDomain::class); + $this->expectExceptionMessage('The domain "'.$domain.'" does not contain a "private" TLD.'); - $this->rules->getPrivateDomain($domain); + self::$rules->getPrivateDomain($domain); } public function testWithPrivateDomainValid(): void { - $domain = $this->rules->getPrivateDomain('thephpleague.github.io'); + $domain = self::$rules->getPrivateDomain('thephpleague.github.io'); self::assertSame('thephpleague.github.io', $domain->value()); self::assertTrue($domain->suffix()->isKnown()); @@ -203,7 +211,7 @@ public function testWithPrivateDomainValid(): void public function testResolvingICANNDomainInvalid(): void { - $domain = $this->rules->resolve('private.ulb.ac.be'); + $domain = self::$rules->resolve('private.ulb.ac.be'); self::assertSame('private.ulb.ac.be', $domain->value()); self::assertTrue($domain->suffix()->isKnown()); @@ -214,9 +222,9 @@ public function testResolvingICANNDomainInvalid(): void public function testWithDomainObject(): void { - $domain = ResolvedDomain::fromICANN(Domain::fromIDNA2008('private.ulb.ac.be'), 2); + $domain = ResolvedDomain::fromICANN('private.ulb.ac.be', 2); - $newDomain = $this->rules->resolve($domain); + $newDomain = self::$rules->resolve($domain); self::assertSame('private.ulb.ac.be', $domain->value()); self::assertTrue($domain->suffix()->isKnown()); @@ -232,7 +240,7 @@ public function testWithDomainInterfaceObject(): void self::assertSame( 'ac.be', - $this->rules->getCookieDomain($domain)->suffix()->value() + self::$rules->getCookieDomain($domain)->suffix()->value() ); } @@ -244,9 +252,7 @@ public function testWithDomainInterfaceObject(): void */ public function testGetRegistrableDomain(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { - $foundRegistrableDomain = $this->rules->resolve($domain)->registrableDomain(); - - self::assertSame($registrableDomain, $foundRegistrableDomain->value()); + self::assertSame($registrableDomain, self::$rules->resolve($domain)->registrableDomain()->value()); } /** @@ -257,9 +263,7 @@ public function testGetRegistrableDomain(?string $publicSuffix, ?string $registr */ public function testGetPublicSuffix(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { - $effectiveTLD = $this->rules->resolve($domain)->suffix(); - - self::assertSame($publicSuffix, $effectiveTLD->value()); + self::assertSame($publicSuffix, self::$rules->resolve($domain)->suffix()->value()); } /** @@ -270,7 +274,7 @@ public function testGetPublicSuffix(?string $publicSuffix, ?string $registrableD */ public function testGetDomain(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { - self::assertSame($expectedDomain, $this->rules->resolve($domain)->value()); + self::assertSame($expectedDomain, self::$rules->resolve($domain)->value()); } /** @@ -377,9 +381,9 @@ public function parseDataProvider(): iterable */ public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix(): void { - self::expectException(UnableToResolveDomain::class); + $this->expectException(UnableToResolveDomain::class); - $this->rules->getICANNDomain('localhost'); + self::$rules->getICANNDomain('localhost'); } /** @@ -391,9 +395,9 @@ public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix(): void */ public function testGetPublicSuffixThrowsInvalidDomainException(string $domain): void { - self::expectException(SyntaxError::class); + $this->expectException(SyntaxError::class); - $this->rules->getICANNDomain($domain); + self::$rules->getICANNDomain($domain); } /** @@ -417,9 +421,9 @@ public function invalidDomainParseProvider(): iterable */ public function testGetPublicSuffixThrowsInvalidHostException(string $domain): void { - self::expectException(SyntaxError::class); + $this->expectException(SyntaxError::class); - $this->rules->getICANNDomain($domain); + self::$rules->getICANNDomain($domain); } /** @@ -427,13 +431,13 @@ public function testGetPublicSuffixThrowsInvalidHostException(string $domain): v */ public function invalidHostParseProvider(): iterable { - $long_label = implode('.', array_fill(0, 62, 'a')); + $longLabel = implode('.', array_fill(0, 62, 'a')); return [ 'multiple label with URI delimiter' => ['local.ho/st'], 'invalid host: invalid label according to RFC3986' => ['www.fußball.com-'], 'invalid host: host contains space' => ['re view.com'], - 'invalid host: host too long' => ["$long_label.$long_label.$long_label. $long_label.$long_label"], + 'invalid host: host too long' => ["$longLabel.$longLabel.$longLabel. $longLabel.$longLabel"], ]; } @@ -448,8 +452,7 @@ public function invalidHostParseProvider(): iterable */ public function testPublicSuffixSection(?string $domain, ?string $expected): void { - $publicSuffix = $this->rules->getCookieDomain($domain)->suffix(); - self::assertSame($expected, $publicSuffix->value()); + self::assertSame($expected, self::$rules->getCookieDomain($domain)->suffix()->value()); } /** @@ -487,7 +490,7 @@ public function validPublicSectionProvider(): iterable */ public function checkPublicSuffix(?string $input, ?string $expected): void { - self::assertSame($expected, $this->rules->resolve($input)->registrableDomain()->value()); + self::assertSame($expected, self::$rules->resolve($input)->registrableDomain()->value()); } /** @@ -587,7 +590,6 @@ public function testPublicSuffixSpec(): void $this->checkPublicSuffix('www.食狮.中国', '食狮.中国'); $this->checkPublicSuffix('shishi.中国', 'shishi.中国'); $this->checkPublicSuffix('中国', null); - $this->checkPublicSuffix('www.faß.de', 'faß.de'); // changed to honour IDNA2008 by default not part of the standard test // Same as above, but punycoded. $this->checkPublicSuffix('xn--85x722f.com.cn', 'xn--85x722f.com.cn'); $this->checkPublicSuffix('xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn'); @@ -605,9 +607,9 @@ public function testPublicSuffixSpec(): void */ public function testEffectiveTLDResolution(string $host, string $cookieETLD, string $icannETLD, string $privateETLD): void { - self::assertSame($cookieETLD, $this->rules->getCookieDomain($host)->suffix()->toString()); - self::assertSame($icannETLD, $this->rules->getICANNDomain($host)->suffix()->toString()); - self::assertSame($privateETLD, $this->rules->getPrivateDomain($host)->suffix()->toString()); + self::assertSame($cookieETLD, self::$rules->getCookieDomain($host)->suffix()->toString()); + self::assertSame($icannETLD, self::$rules->getICANNDomain($host)->suffix()->toString()); + self::assertSame($privateETLD, self::$rules->getPrivateDomain($host)->suffix()->toString()); } /** diff --git a/src/Storage/PublicSuffixListPsr16CacheTest.php b/src/Storage/PublicSuffixListPsr16CacheTest.php index e4283149..45957c72 100644 --- a/src/Storage/PublicSuffixListPsr16CacheTest.php +++ b/src/Storage/PublicSuffixListPsr16CacheTest.php @@ -4,11 +4,14 @@ namespace Pdp\Storage; +use InvalidArgumentException; use Pdp\Rules; use PHPUnit\Framework\TestCase; use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; use RuntimeException; +use stdClass; +use TypeError; use function dirname; /** @@ -90,4 +93,31 @@ public function testItReturnsFalseIfItCantCacheAPublicSuffixListInstance(): void self::assertFalse($pslCache->remember('http://www.example.com', $psl)); } + + public function testItCanDeleteTheCachedDatabase(): void + { + $uri = 'http://www.example.com'; + + $cache = $this->createStub(CacheInterface::class); + $cache->method('delete')->willReturn(true); + + $instance = new PublicSuffixListPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + self::assertTrue($instance->forget($uri)); + } + + public function testItWillThrowIfTheTTLIsNotParsable(): void + { + $this->expectException(InvalidArgumentException::class); + + $cache = $this->createStub(CacheInterface::class); + new PublicSuffixListPsr16Cache($cache, 'pdp_', 'foobar'); + } + + public function testItWillThrowIfTheTTLIsInvalid(): void + { + $this->expectException(TypeError::class); + + $cache = $this->createStub(CacheInterface::class); + new PublicSuffixListPsr16Cache($cache, 'pdp_', new stdClass()); + } } diff --git a/src/Storage/PublicSuffixListPsr18ClientTest.php b/src/Storage/PublicSuffixListPsr18ClientTest.php index e6972622..37370756 100644 --- a/src/Storage/PublicSuffixListPsr18ClientTest.php +++ b/src/Storage/PublicSuffixListPsr18ClientTest.php @@ -62,8 +62,8 @@ public function createRequest(string $method, $uri): RequestInterface } }; - self::expectException(UnableToLoadPublicSuffixList::class); - self::expectExceptionMessage('Could not access the Public Suffix List URI: `http://www.example.com`.'); + $this->expectException(UnableToLoadPublicSuffixList::class); + $this->expectExceptionMessage('Could not access the Public Suffix List URI: `http://www.example.com`.'); $storage = new PublicSuffixListPsr18Client($client, $requestFactory); $storage->get('http://www.example.com'); @@ -85,9 +85,9 @@ public function createRequest(string $method, $uri): RequestInterface } }; - self::expectException(UnableToLoadPublicSuffixList::class); - self::expectExceptionMessage('Invalid response from Public Suffix List URI: `http://www.example.com`.'); - self::expectExceptionCode(404); + $this->expectException(UnableToLoadPublicSuffixList::class); + $this->expectExceptionMessage('Invalid response from Public Suffix List URI: `http://www.example.com`.'); + $this->expectExceptionCode(404); $storage = new PublicSuffixListPsr18Client($client, $requestFactory); $storage->get('http://www.example.com'); diff --git a/src/Storage/RootZoneDatabasePsr16CacheTest.php b/src/Storage/RootZoneDatabasePsr16CacheTest.php index 96492b6b..5cfa7244 100644 --- a/src/Storage/RootZoneDatabasePsr16CacheTest.php +++ b/src/Storage/RootZoneDatabasePsr16CacheTest.php @@ -4,11 +4,16 @@ namespace Pdp\Storage; +use DateInterval; +use DateTimeImmutable; +use InvalidArgumentException; use Pdp\TopLevelDomains; use PHPUnit\Framework\TestCase; use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; use RuntimeException; +use stdClass; +use TypeError; use function dirname; /** @@ -42,7 +47,7 @@ public function testItReturnsNullIfTheCacheContentContainsInvalidJsonData(): voi $cache = $this->createStub(CacheInterface::class); $cache->method('get')->willReturn('foobar'); - $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', 86400); + $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new DateInterval('P1D')); self::assertNull($instance->fetch('http://www.example.com')); } @@ -52,7 +57,7 @@ public function testItReturnsNullIfTheCacheContentCannotBeConvertedToTheCorrectI $cache = $this->createStub(CacheInterface::class); $cache->method('get')->willReturn('{"foo":"bar"}'); - $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', 86400); + $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new DateTimeImmutable('+1 DAY')); self::assertNull($instance->fetch('http://www.example.com')); } @@ -63,7 +68,7 @@ public function testItCanStoreAPublicSuffixListInstance(): void $cache->method('set')->willReturn(true); $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new DateInterval('P1D')); self::assertTrue($instance->remember('http://www.example.com', $rzd)); } @@ -74,7 +79,7 @@ public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void $cache->method('set')->willReturn(false); $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new DateInterval('P1D')); self::assertFalse($instance->remember('http://www.example.com', $rzd)); } @@ -87,8 +92,35 @@ public function testItReturnsFalseIfItCantCacheAPublicSuffixListInstance(): void $cache->method('set')->will(self::throwException($exception)); $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new DateInterval('P1D')); self::assertFalse($instance->remember('http://www.example.com', $rzd)); } + + public function testItCanDeleteTheCachedDatabase(): void + { + $uri = 'http://www.example.com'; + + $cache = $this->createStub(CacheInterface::class); + $cache->method('delete')->willReturn(true); + + $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new DateInterval('P1D')); + self::assertTrue($instance->forget($uri)); + } + + public function testItWillThrowIfTheTTLIsNotParsable(): void + { + $this->expectException(InvalidArgumentException::class); + + $cache = $this->createStub(CacheInterface::class); + new RootZoneDatabasePsr16Cache($cache, 'pdp_', 'foobar'); + } + + public function testItWillThrowIfTheTTLIsInvalid(): void + { + $this->expectException(TypeError::class); + + $cache = $this->createStub(CacheInterface::class); + new RootZoneDatabasePsr16Cache($cache, 'pdp_', new stdClass()); + } } diff --git a/src/Storage/RootZoneDatabasePsr18ClientTest.php b/src/Storage/RootZoneDatabasePsr18ClientTest.php index abe29f76..1e37aa9e 100644 --- a/src/Storage/RootZoneDatabasePsr18ClientTest.php +++ b/src/Storage/RootZoneDatabasePsr18ClientTest.php @@ -63,8 +63,8 @@ public function createRequest(string $method, $uri): RequestInterface } }; - self::expectException(UnableToLoadRootZoneDatabase::class); - self::expectExceptionMessage('Could not access the Root Zone Database URI: `http://www.example.com`.'); + $this->expectException(UnableToLoadRootZoneDatabase::class); + $this->expectExceptionMessage('Could not access the Root Zone Database URI: `http://www.example.com`.'); $storage = new RootZoneDatabasePsr18Client($client, $requestFactory); $storage->get('http://www.example.com'); @@ -86,9 +86,9 @@ public function createRequest(string $method, $uri): RequestInterface } }; - self::expectException(UnableToLoadRootZoneDatabase::class); - self::expectExceptionMessage('Invalid response from Root Zone Database URI: `http://www.example.com`.'); - self::expectExceptionCode(404); + $this->expectException(UnableToLoadRootZoneDatabase::class); + $this->expectExceptionMessage('Invalid response from Root Zone Database URI: `http://www.example.com`.'); + $this->expectExceptionCode(404); $storage = new RootZoneDatabasePsr18Client($client, $requestFactory); $storage->get('http://www.example.com'); diff --git a/src/Storage/TopLevelDomainsStorageTest.php b/src/Storage/TopLevelDomainsStorageTest.php index 64d794a5..5fbd9e2f 100644 --- a/src/Storage/TopLevelDomainsStorageTest.php +++ b/src/Storage/TopLevelDomainsStorageTest.php @@ -4,7 +4,9 @@ namespace Pdp\Storage; +use Pdp\PublicSuffixList; use Pdp\RootZoneDatabase; +use Pdp\Rules; use Pdp\TopLevelDomains; use PHPUnit\Framework\TestCase; use function dirname; @@ -75,4 +77,37 @@ public function get(string $uri): RootZoneDatabase self::assertInstanceOf(TopLevelDomains::class, $storage->get('http://www.example.com')); } + + public function testIsCanDeleteARootZoneDatabaseInstanceFromTheInnerStorage(): void + { + $cache = new class() implements RootZoneDatabaseCache { + public function fetch(string $uri): ?RootZoneDatabase + { + return null; + } + + public function remember(string $uri, RootZoneDatabase $publicSuffixList): bool + { + return true; + } + + public function forget(string $uri): bool + { + return 'http://www.example.com' === $uri; + } + }; + + $client = new class() implements RootZoneDatabaseClient { + public function get(string $uri): RootZoneDatabase + { + return TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); + } + }; + + $storage = new TopLevelDomainsStorage($cache, $client); + $storage->get('http://www.example.com'); + + self::assertTrue($storage->delete('http://www.example.com')); + self::assertFalse($storage->delete('https://www.example.com')); + } } diff --git a/src/Suffix.php b/src/Suffix.php index d8fe0ba7..c613f4fd 100644 --- a/src/Suffix.php +++ b/src/Suffix.php @@ -38,7 +38,7 @@ public static function fromICANN($domain): self { $domain = self::setDomainName($domain); if (1 > count($domain)) { - throw SyntaxError::dueToInvalidSuffix($domain, 'ICANN'); + throw SyntaxError::dueToInvalidSuffix($domain, self::ICANN); } return new self($domain, self::ICANN); @@ -51,7 +51,7 @@ public static function fromPrivate($domain): self { $domain = self::setDomainName($domain); if (1 > count($domain)) { - throw SyntaxError::dueToInvalidSuffix($domain, 'Private'); + throw SyntaxError::dueToInvalidSuffix($domain, self::PRIVATE); } return new self($domain, self::PRIVATE); @@ -64,7 +64,7 @@ public static function fromIANA($domain): self { $domain = self::setDomainName($domain); if (1 !== count($domain)) { - throw SyntaxError::dueToInvalidSuffix($domain, 'IANA'); + throw SyntaxError::dueToInvalidSuffix($domain, self::IANA); } return new self($domain, self::IANA); @@ -166,13 +166,13 @@ public function toUnicode(): self public function normalize(DomainName $domain): self { - $newSuffix = $domain->clear()->append($this->toUnicode()); + $newDomain = $domain->clear()->append($this->toUnicode()); if ($domain->isAscii()) { - $newSuffix = $newSuffix->toAscii(); + $newDomain = $newDomain->toAscii(); } $clone = clone $this; - $clone->domain = $newSuffix; + $clone->domain = $newDomain; return $clone; } diff --git a/src/SuffixTest.php b/src/SuffixTest.php index 6ba4671d..827198d7 100644 --- a/src/SuffixTest.php +++ b/src/SuffixTest.php @@ -12,6 +12,15 @@ */ final class SuffixTest extends TestCase { + public function testItCanBeCreatedWithAnotherResolvedDomain(): void + { + $domain = Suffix::fromICANN('ac.be'); + $newDomain = Suffix::fromPrivate($domain); + + self::assertEquals($domain->domain(), $newDomain->domain()); + self::assertNotEquals($domain->isICANN(), $newDomain->isICANN()); + } + public function testInternalPhpMethod(): void { $publicSuffix = Suffix::fromICANN('ac.be'); @@ -32,7 +41,7 @@ public function testPSToUnicodeWithUrlEncode(): void */ public function testConstructorThrowsException(string $publicSuffix): void { - self::expectException(SyntaxError::class); + $this->expectException(SyntaxError::class); Suffix::fromUnknown($publicSuffix); } @@ -58,7 +67,7 @@ public function testFromICANN(): void self::assertFalse($suffix->isPrivate()); self::assertFalse($suffix->isIANA()); self::assertSame('be', $suffix->domain()->toString()); - self::expectException(SyntaxError::class); + $this->expectException(SyntaxError::class); Suffix::fromICANN(null); } @@ -74,7 +83,7 @@ public function testFromPrivate(): void self::assertFalse($suffix->isIANA()); self::assertSame('be', $suffix->domain()->toString()); - self::expectException(SyntaxError::class); + $this->expectException(SyntaxError::class); Suffix::fromPrivate(null); } @@ -90,7 +99,7 @@ public function testFromIANA(): void self::assertTrue($suffix->isIANA()); self::assertSame('be', $suffix->domain()->toString()); - self::expectException(SyntaxError::class); + $this->expectException(SyntaxError::class); Suffix::fromIANA('ac.be'); } diff --git a/src/SyntaxError.php b/src/SyntaxError.php index 7fb116ed..ea9e1b8d 100644 --- a/src/SyntaxError.php +++ b/src/SyntaxError.php @@ -20,11 +20,9 @@ public static function dueToInvalidLength(string $domain): self public static function dueToIDNAError(string $domain, string $message = ''): self { - if ('' === $message) { - return new self('The host `'.$domain.'` is invalid.'); - } + $str = '' === $message ? 'The host `'.$domain.'` is invalid.' : 'The host `'.$domain.'` is invalid : '.$message; - return new self('The host `'.$domain.'` is invalid : '.$message); + return new self($str); } public static function dueToInvalidSuffix(Host $publicSuffix, string $type = ''): self diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index a56cbd0d..b1744bc0 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -171,10 +171,6 @@ private static function extractRootZone(string $content): string throw UnableToLoadRootZoneDatabase::dueToInvalidRootZoneDomain($content, $exception); } - if (1 !== $tld->count() || '' === $tld->value()) { - throw UnableToLoadRootZoneDatabase::dueToInvalidRootZoneDomain($content); - } - return $tld->toString(); } @@ -278,20 +274,21 @@ private function validateDomain($domain): DomainName $domain = $domain->domain(); } - if (!($domain instanceof DomainName)) { + if (!$domain instanceof DomainName) { $domain = Domain::fromIDNA2008($domain); } + $label = $domain->label(0); + if (in_array($label, [null, ''], true)) { + throw UnableToResolveDomain::dueToUnresolvableDomain($domain); + } + return $domain; } private function containsTopLevelDomain(DomainName $domain): bool { $label = $domain->toAscii()->label(0); - if (in_array($label, [null, ''], true)) { - return false; - } - foreach ($this as $tld) { if ($tld->value() === $label) { return true; diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 06763132..2445ff32 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -16,11 +16,11 @@ */ final class TopLevelDomainsTest extends TestCase { - private TopLevelDomains $topLevelDomains; + private static TopLevelDomains $topLevelDomains; - public function setUp(): void + public static function setUpBeforeClass(): void { - $this->topLevelDomains = TopLevelDomains::fromPath(dirname(__DIR__).'/test_data/tlds-alpha-by-domain.txt'); + self::$topLevelDomains = TopLevelDomains::fromPath(dirname(__DIR__).'/test_data/tlds-alpha-by-domain.txt'); } /** @@ -39,7 +39,7 @@ public function testCreateFromPath(): void $topLevelDomains = TopLevelDomains::fromPath(dirname(__DIR__).'/test_data/tlds-alpha-by-domain.txt', $context); - self::assertEquals($this->topLevelDomains, $topLevelDomains); + self::assertEquals(self::$topLevelDomains, $topLevelDomains); } /** @@ -48,17 +48,24 @@ public function testCreateFromPath(): void */ public function testCreateFromPathThrowsException(): void { - self::expectException(UnableToLoadRootZoneDatabase::class); + $this->expectException(UnableToLoadRootZoneDatabase::class); TopLevelDomains::fromPath('/foo/bar.dat'); } + public function testFromStringThrowsOnTypeError(): void + { + $this->expectException(TypeError::class); + + TopLevelDomains::fromString(new DateTimeImmutable()); + } + /** * @dataProvider invalidContentProvider */ public function testConverterThrowsException(string $content): void { - self::expectException(UnableToLoadRootZoneDatabase::class); + $this->expectException(UnableToLoadRootZoneDatabase::class); TopLevelDomains::fromString($content); } @@ -133,9 +140,9 @@ public function invalidContentProvider(): iterable */ public function testSetState(): void { - $topLevelDomains = eval('return '.var_export($this->topLevelDomains, true).';'); + $topLevelDomains = eval('return '.var_export(self::$topLevelDomains, true).';'); - self::assertEquals($this->topLevelDomains, $topLevelDomains); + self::assertEquals(self::$topLevelDomains, $topLevelDomains); } /** @@ -145,9 +152,9 @@ public function testSetState(): void public function testJsonMethods(): void { /** @var string $data */ - $data = json_encode($this->topLevelDomains); + $data = json_encode(self::$topLevelDomains); - self::assertEquals($this->topLevelDomains, TopLevelDomains::fromJsonString($data)); + self::assertEquals(self::$topLevelDomains, TopLevelDomains::fromJsonString($data)); } /** @@ -156,7 +163,7 @@ public function testJsonMethods(): void */ public function testJsonStringFailsWithInvalidJson(): void { - self::expectException(UnableToLoadRootZoneDatabase::class); + $this->expectException(UnableToLoadRootZoneDatabase::class); TopLevelDomains::fromJsonString(''); } @@ -167,7 +174,7 @@ public function testJsonStringFailsWithInvalidJson(): void */ public function testJsonStringFailsWithMissingIndexes(): void { - self::expectException(UnableToLoadRootZoneDatabase::class); + $this->expectException(UnableToLoadRootZoneDatabase::class); TopLevelDomains::fromJsonString('{"foo":"bar"}'); } @@ -198,7 +205,7 @@ public function testResolve($tld): void { self::assertSame( Domain::fromIDNA2008($tld)->label(0), - $this->topLevelDomains->resolve($tld)->suffix()->value() + self::$topLevelDomains->resolve($tld)->suffix()->value() ); } @@ -211,7 +218,7 @@ public function testGetTopLevelDomain($tld): void { self::assertSame( Domain::fromIDNA2008($tld)->label(0), - $this->topLevelDomains->getIANADomain($tld)->suffix()->value() + self::$topLevelDomains->getIANADomain($tld)->suffix()->value() ); } @@ -243,35 +250,43 @@ public function __toString(): string public function testTopLevelDomainThrowsTypeError(): void { - self::expectException(TypeError::class); + $this->expectException(TypeError::class); - $this->topLevelDomains->getIANADomain(new DateTimeImmutable()); + self::$topLevelDomains->getIANADomain(new DateTimeImmutable()); } public function testTopLevelDomainWithInvalidDomain(): void { - self::expectException(SyntaxError::class); + $this->expectException(SyntaxError::class); - $this->topLevelDomains->getIANADomain('###'); + self::$topLevelDomains->getIANADomain('###'); } public function testResolveWithInvalidDomain(): void { - $result = $this->topLevelDomains->resolve('###'); + $result = self::$topLevelDomains->resolve('###'); self::assertFalse($result->suffix()->isIANA()); self::assertNull($result->value()); } + public function testResolveWithAbsoluteDomainName(): void + { + $result = self::$topLevelDomains->resolve('example.com.'); + self::assertSame('example.com.', $result->value()); + self::assertFalse($result->suffix()->isIANA()); + self::assertNull($result->suffix()->value()); + } + public function testTopLevelDomainWithUnResolvableDomain(): void { - self::expectException(UnableToResolveDomain::class); + $this->expectException(UnableToResolveDomain::class); - $this->topLevelDomains->getIANADomain('localhost'); + self::$topLevelDomains->getIANADomain('localhost'); } public function testResolveWithUnResolvableDomain(): void { - $result = $this->topLevelDomains->resolve('localhost'); + $result = self::$topLevelDomains->resolve('localhost'); self::assertSame($result->toString(), 'localhost'); self::assertNull($result->suffix()->value()); @@ -280,9 +295,9 @@ public function testResolveWithUnResolvableDomain(): void public function testGetTopLevelDomainWithUnResolvableDomain(): void { - self::expectException(UnableToResolveDomain::class); + $this->expectException(UnableToResolveDomain::class); - $this->topLevelDomains->getIANADomain('localhost'); + self::$topLevelDomains->getIANADomain('localhost'); } public function testResolveWithUnregisteredTLD(): void @@ -294,7 +309,7 @@ public function testResolveWithUnregisteredTLD(): void public function testGetTopLevelDomainWithUnregisteredTLD(): void { - self::expectException(UnableToResolveDomain::class); + $this->expectException(UnableToResolveDomain::class); $collection = TopLevelDomains::fromPath(dirname(__DIR__).'/test_data/root_zones.dat'); $collection->getIANADomain('localhost.locale'); diff --git a/src/UnableToResolveDomain.php b/src/UnableToResolveDomain.php index ef637d72..7a3c811f 100644 --- a/src/UnableToResolveDomain.php +++ b/src/UnableToResolveDomain.php @@ -31,14 +31,6 @@ public static function dueToIdenticalValue(DomainName $domain): self return $exception; } - public static function dueToMismatchedSuffix(DomainName $domain, EffectiveTopLevelDomain $effectiveTLD): self - { - $exception = new self('The public suffix `'.$effectiveTLD->value().'` can not be assign to the domain name `'.$domain->toString().'`'); - $exception->domain = $domain; - - return $exception; - } - public static function dueToMissingSuffix(DomainName $domain, string $type): self { $exception = new self('The domain "'.$domain->value().'" does not contain a "'.$type.'" TLD.'); From 6cf71184ad301c8b62bfc05d5fb943222b195af6 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 11 Dec 2020 11:56:12 +0100 Subject: [PATCH 364/461] Introducing IdnaResult --- src/Domain.php | 4 +- src/IdnaResult.php | 134 +++++++++++++++++++++ src/IdnaResultTest.php | 44 +++++++ src/IntlIdna.php | 123 +++++-------------- src/Rules.php | 2 +- src/Storage/PsrStorageFactoryTest.php | 38 ++++++ src/Storage/TopLevelDomainsStorageTest.php | 2 - src/SyntaxError.php | 14 ++- 8 files changed, 261 insertions(+), 100 deletions(-) create mode 100644 src/IdnaResult.php create mode 100644 src/IdnaResultTest.php create mode 100644 src/Storage/PsrStorageFactoryTest.php diff --git a/src/Domain.php b/src/Domain.php index 3a325f71..922e94c7 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -164,7 +164,7 @@ private function domainToAscii(string $domain): string $option = IntlIdna::IDNA2003_ASCII_OPTIONS; } - return IntlIdna::toAscii($domain, $option); + return IntlIdna::toAscii($domain, $option)->result(); } private function domainToUnicode(string $domain): string @@ -174,7 +174,7 @@ private function domainToUnicode(string $domain): string $option = IntlIdna::IDNA2003_UNICODE_OPTIONS; } - return IntlIdna::toUnicode($domain, $option); + return IntlIdna::toUnicode($domain, $option)->result(); } /** diff --git a/src/IdnaResult.php b/src/IdnaResult.php new file mode 100644 index 00000000..a7a75214 --- /dev/null +++ b/src/IdnaResult.php @@ -0,0 +1,134 @@ + 'a non-final domain name label (or the whole domain name) is empty', + self::ERROR_LABEL_TOO_LONG => 'a domain name label is longer than 63 bytes', + self::ERROR_DOMAIN_NAME_TOO_LONG => 'a domain name is longer than 255 bytes in its storage form', + self::ERROR_LEADING_HYPHEN => 'a label starts with a hyphen-minus ("-")', + self::ERROR_TRAILING_HYPHEN => 'a label ends with a hyphen-minus ("-")', + self::ERROR_HYPHEN_3_4 => 'a label contains hyphen-minus ("-") in the third and fourth positions', + self::ERROR_LEADING_COMBINING_MARK => 'a label starts with a combining mark', + self::ERROR_DISALLOWED => 'a label or domain name contains disallowed characters', + self::ERROR_PUNYCODE => 'a label starts with "xn--" but does not contain valid Punycode', + self::ERROR_LABEL_HAS_DOT => 'a label contains a dot=full stop', + self::ERROR_INVALID_ACE_LABEL => 'An ACE label does not contain a valid label string', + self::ERROR_BIDI => 'a label does not meet the IDNA BiDi requirements (for right-to-left characters)', + self::ERROR_CONTEXTJ => 'a label does not meet the IDNA CONTEXTJ requirements', + self::ERROR_CONTEXTO_DIGITS => 'a label does not meet the IDNA CONTEXTO requirements for digits', + self::ERROR_CONTEXTO_PUNCTUATION => 'a label does not meet the IDNA CONTEXTO requirements for punctuation characters. Some punctuation characters "Would otherwise have been DISALLOWED" but are allowed in certain contexts', + ]; + + private string $result; + + private bool $isTransitionalDifferent; + + /** + * @var array + */ + private array $errors; + + /** + * @param array $error + */ + private function __construct(string $result, bool $isTransitionalDifferent, array $error) + { + $this->result = $result; + $this->errors = $error; + $this->isTransitionalDifferent = $isTransitionalDifferent; + } + + /** + * @param array{result:string, isTransitionalDifferent:bool, errors:int} $infos + */ + public static function fromIntl(array $infos): self + { + return new self( + $infos['result'], + $infos['isTransitionalDifferent'], + array_filter( + self::ERRORS, + fn (int $errorByte): bool => 0 !== ($errorByte & $infos['errors']), + ARRAY_FILTER_USE_KEY + ) + ); + } + + /** + * @param array{result:string, isTransitionalDifferent:bool, errors:array} $properties + */ + public static function __set_state(array $properties): self + { + return new self($properties['result'], $properties['isTransitionalDifferent'], $properties['errors']); + } + + public function result(): string + { + return $this->result; + } + + public function isTransitionalDifferent(): bool + { + return $this->isTransitionalDifferent; + } + + /** + * @return array + */ + public function errors(): array + { + return $this->errors; + } + + public function error(int $error): ?string + { + return $this->errors[$error] ?? null; + } + + /** + * @return array{result:string, isTransitionalDifferent:bool, errors:int} + */ + public function toIntl(): array + { + return [ + 'result' => $this->result, + 'isTransitionalDifferent' => $this->isTransitionalDifferent, + 'errors' => array_reduce( + array_keys($this->errors), + fn (int $curry, int $errorByte): int => $curry | $errorByte, + 0 + ), + ]; + } +} diff --git a/src/IdnaResultTest.php b/src/IdnaResultTest.php new file mode 100644 index 00000000..756907b2 --- /dev/null +++ b/src/IdnaResultTest.php @@ -0,0 +1,44 @@ + 'foo.bar', 'isTransitionalDifferent' => false, 'errors' => 0]; + $result = IdnaResult::fromIntl($infos); + $generateResult = eval('return '.var_export($result, true).';'); + + self::assertEquals($result, $generateResult); + self::assertSame($infos, $generateResult->toIntl()); + } + + public function testItCanBeInstantiatedFromArray(): void + { + $infos = ['result' => '', 'isTransitionalDifferent' => false, 'errors' => 0]; + $result = IdnaResult::fromIntl($infos); + + self::assertSame('', $result->result()); + self::assertFalse($result->isTransitionalDifferent()); + self::assertCount(0, $result->errors()); + self::assertNull($result->error(IdnaResult::ERROR_BIDI)); + } + + public function testInvalidSyntaxAfterIDNConversion(): void + { + try { + IntlIdna::toAscii('%00.com', IntlIdna::IDNA2008_ASCII); + } catch (SyntaxError $exception) { + $result = $exception->fetchIdnaResult(); + self::assertInstanceOf(IdnaResult::class, $result); + self::assertCount(1, $result->errors()); + self::assertNotEmpty($result->error(IdnaResult::ERROR_DISALLOWED)); + } + } +} diff --git a/src/IntlIdna.php b/src/IntlIdna.php index 6a74267a..e91c10e5 100644 --- a/src/IntlIdna.php +++ b/src/IntlIdna.php @@ -4,10 +4,8 @@ namespace Pdp; -use UnexpectedValueException; use function idn_to_ascii; use function idn_to_utf8; -use function implode; use function preg_match; use function rawurldecode; use function strpos; @@ -15,19 +13,6 @@ use const IDNA_CHECK_BIDI; use const IDNA_CHECK_CONTEXTJ; use const IDNA_DEFAULT; -use const IDNA_ERROR_BIDI; -use const IDNA_ERROR_CONTEXTJ; -use const IDNA_ERROR_DISALLOWED; -use const IDNA_ERROR_DOMAIN_NAME_TOO_LONG; -use const IDNA_ERROR_EMPTY_LABEL; -use const IDNA_ERROR_HYPHEN_3_4; -use const IDNA_ERROR_INVALID_ACE_LABEL; -use const IDNA_ERROR_LABEL_HAS_DOT; -use const IDNA_ERROR_LABEL_TOO_LONG; -use const IDNA_ERROR_LEADING_COMBINING_MARK; -use const IDNA_ERROR_LEADING_HYPHEN; -use const IDNA_ERROR_PUNYCODE; -use const IDNA_ERROR_TRAILING_HYPHEN; use const IDNA_NONTRANSITIONAL_TO_ASCII; use const IDNA_NONTRANSITIONAL_TO_UNICODE; use const IDNA_USE_STD3_RULES; @@ -35,57 +20,21 @@ final class IntlIdna { - public const IDNA2008_ASCII_OPTIONS = IDNA_NONTRANSITIONAL_TO_ASCII + public const IDNA2008_ASCII = IDNA_NONTRANSITIONAL_TO_ASCII | IDNA_CHECK_BIDI | IDNA_USE_STD3_RULES | IDNA_CHECK_CONTEXTJ; - public const IDNA2008_UNICODE_OPTIONS = IDNA_NONTRANSITIONAL_TO_UNICODE + public const IDNA2008_UNICODE = IDNA_NONTRANSITIONAL_TO_UNICODE | IDNA_CHECK_BIDI | IDNA_USE_STD3_RULES | IDNA_CHECK_CONTEXTJ; - public const IDNA2003_ASCII_OPTIONS = IDNA_DEFAULT; - public const IDNA2003_UNICODE_OPTIONS = IDNA_DEFAULT; - - /** - * IDNA errors. - * - * @see http://icu-project.org/apiref/icu4j/com/ibm/icu/text/IDNA.Error.html - */ - private const IDNA_ERRORS = [ - IDNA_ERROR_EMPTY_LABEL => 'a non-final domain name label (or the whole domain name) is empty', - IDNA_ERROR_LABEL_TOO_LONG => 'a domain name label is longer than 63 bytes', - IDNA_ERROR_DOMAIN_NAME_TOO_LONG => 'a domain name is longer than 255 bytes in its storage form', - IDNA_ERROR_LEADING_HYPHEN => 'a label starts with a hyphen-minus ("-")', - IDNA_ERROR_TRAILING_HYPHEN => 'a label ends with a hyphen-minus ("-")', - IDNA_ERROR_HYPHEN_3_4 => 'a label contains hyphen-minus ("-") in the third and fourth positions', - IDNA_ERROR_LEADING_COMBINING_MARK => 'a label starts with a combining mark', - IDNA_ERROR_DISALLOWED => 'a label or domain name contains disallowed characters', - IDNA_ERROR_PUNYCODE => 'a label starts with "xn--" but does not contain valid Punycode', - IDNA_ERROR_LABEL_HAS_DOT => 'a label contains a dot=full stop', - IDNA_ERROR_INVALID_ACE_LABEL => 'An ACE label does not contain a valid label string', - IDNA_ERROR_BIDI => 'a label does not meet the IDNA BiDi requirements (for right-to-left characters)', - IDNA_ERROR_CONTEXTJ => 'a label does not meet the IDNA CONTEXTJ requirements', - ]; + public const IDNA2003_ASCII = IDNA_DEFAULT; + public const IDNA2003_UNICODE = IDNA_DEFAULT; private const REGEXP_IDNA_PATTERN = '/[^\x20-\x7f]/'; - /** - * Get and format IDN conversion error message. - */ - private static function getIDNAErrors(int $errorByte): string - { - $res = []; - foreach (self::IDNA_ERRORS as $error => $reason) { - if ($error === ($errorByte & $error)) { - $res[] = $reason; - } - } - - return [] === $res ? 'Unknown IDNA conversion error.' : implode(', ', $res).'.'; - } - /** * Converts the input to its IDNA ASCII form. * @@ -93,33 +42,20 @@ private static function getIDNAErrors(int $errorByte): string * * @throws SyntaxError if the string can not be converted to ASCII using IDN UTS46 algorithm */ - public static function toAscii(string $domain, int $option): string + public static function toAscii(string $domain, int $option): IdnaResult { $domain = rawurldecode($domain); if (1 !== preg_match(self::REGEXP_IDNA_PATTERN, $domain)) { - return strtolower($domain); - } - - $output = idn_to_ascii($domain, $option, INTL_IDNA_VARIANT_UTS46, $infos); - if ([] === $infos) { - throw SyntaxError::dueToIDNAError($domain); - } - - if (0 !== $infos['errors']) { - throw SyntaxError::dueToIDNAError($domain, self::getIDNAErrors($infos['errors'])); + return IdnaResult::fromIntl([ + 'result' => strtolower($domain), + 'isTransitionalDifferent' => false, + 'errors' => 0, + ]); } - // @codeCoverageIgnoreStart - if (false === $output) { - throw new UnexpectedValueException('The Intl extension is misconfigured for '.PHP_OS.', please correct this issue before proceeding.'); - } - // @codeCoverageIgnoreEnd - - if (false === strpos($output, '%')) { - return $output; - } + idn_to_ascii($domain, $option, INTL_IDNA_VARIANT_UTS46, $infos); - throw SyntaxError::dueToInvalidCharacters($domain); + return self::createIdnaResult($domain, $infos); } /** @@ -127,30 +63,33 @@ public static function toAscii(string $domain, int $option): string * * This method returns the string converted to IDN UNICODE form * - * @throws SyntaxError if the string can not be converted to UNICODE using IDN UTS46 algorithm - * @throws UnexpectedValueException if the intl extension is misconfigured + * @throws SyntaxError if the string can not be converted to UNICODE using IDN UTS46 algorithm */ - public static function toUnicode(string $domain, int $option): string + public static function toUnicode(string $domain, int $option): IdnaResult { if (false === strpos($domain, 'xn--')) { - return $domain; + return IdnaResult::fromIntl([ + 'result' => $domain, + 'isTransitionalDifferent' => false, + 'errors' => 0, + ]); } - $output = idn_to_utf8($domain, $option, INTL_IDNA_VARIANT_UTS46, $info); - if ([] === $info) { - throw SyntaxError::dueToIDNAError($domain); - } + idn_to_utf8($domain, $option, INTL_IDNA_VARIANT_UTS46, $infos); - if (0 !== $info['errors']) { - throw SyntaxError::dueToIDNAError($domain, self::getIDNAErrors($info['errors'])); - } + return self::createIdnaResult($domain, $infos); + } - // @codeCoverageIgnoreStart - if (false === $output) { - throw new UnexpectedValueException('The Intl extension for '.PHP_OS.' is misconfigured. Please correct this issue before proceeding.'); + /** + * @param array{result:string, isTransitionalDifferent:bool, errors:int} $infos + */ + private static function createIdnaResult(string $domain, array $infos): IdnaResult + { + $result = IdnaResult::fromIntl($infos); + if ([] !== $result->errors()) { + throw SyntaxError::dueToIDNAError($domain, $result); } - // @codeCoverageIgnoreEnd - return $output; + return $result; } } diff --git a/src/Rules.php b/src/Rules.php index 80e16c38..52253c6d 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -162,7 +162,7 @@ private static function addRule(array $list, array $ruleParts): array try { /** @var string $line */ $line = array_pop($ruleParts); - $rule = IntlIdna::toAscii($line, IntlIdna::IDNA2008_ASCII_OPTIONS); + $rule = IntlIdna::toAscii($line, IntlIdna::IDNA2008_ASCII_OPTIONS)->result(); } catch (CannotProcessHost $exception) { throw UnableToLoadPublicSuffixList::dueToInvalidRule($line ?? null, $exception); } diff --git a/src/Storage/PsrStorageFactoryTest.php b/src/Storage/PsrStorageFactoryTest.php new file mode 100644 index 00000000..9567df96 --- /dev/null +++ b/src/Storage/PsrStorageFactoryTest.php @@ -0,0 +1,38 @@ +createStub(CacheInterface::class); + $requestFactory = $this->createStub(RequestFactoryInterface::class); + $client = $this->createStub(ClientInterface::class); + + $this->factory = new PsrStorageFactory($cache, $client, $requestFactory); + } + + public function testItCanReturnARootZoneDatabaseStorageInstance(): void + { + $instance = $this->factory->createRootZoneDatabaseStorage('foobar', '1 DAY'); + + self::assertInstanceOf(TopLevelDomainsStorage::class, $instance); + } + + public function testItCanReturnAPublicSuffixListStorageInstance(): void + { + $instance = $this->factory->createPublicSuffixListStorage('foobar', '1 DAY'); + + self::assertInstanceOf(RulesStorage::class, $instance); + } +} diff --git a/src/Storage/TopLevelDomainsStorageTest.php b/src/Storage/TopLevelDomainsStorageTest.php index 5fbd9e2f..9d49a3e1 100644 --- a/src/Storage/TopLevelDomainsStorageTest.php +++ b/src/Storage/TopLevelDomainsStorageTest.php @@ -4,9 +4,7 @@ namespace Pdp\Storage; -use Pdp\PublicSuffixList; use Pdp\RootZoneDatabase; -use Pdp\Rules; use Pdp\TopLevelDomains; use PHPUnit\Framework\TestCase; use function dirname; diff --git a/src/SyntaxError.php b/src/SyntaxError.php index ea9e1b8d..c8cae43d 100644 --- a/src/SyntaxError.php +++ b/src/SyntaxError.php @@ -8,6 +8,13 @@ class SyntaxError extends InvalidArgumentException implements CannotProcessHost { + private ?IdnaResult $idnaResult; + + public function fetchIdnaResult(): ?IdnaResult + { + return $this->idnaResult; + } + public static function dueToInvalidCharacters(string $domain): self { return new self('The host `'.$domain.'` is invalid: it contains invalid characters.'); @@ -18,11 +25,12 @@ public static function dueToInvalidLength(string $domain): self return new self('The host `'.$domain.'` is invalid: its length is longer than 255 bytes in its storage form.'); } - public static function dueToIDNAError(string $domain, string $message = ''): self + public static function dueToIDNAError(string $domain, IdnaResult $result): self { - $str = '' === $message ? 'The host `'.$domain.'` is invalid.' : 'The host `'.$domain.'` is invalid : '.$message; + $exception = new self('The host `'.$domain.'` is invalid for IDN conversion.'); + $exception->idnaResult = $result; - return new self($str); + return $exception; } public static function dueToInvalidSuffix(Host $publicSuffix, string $type = ''): self From 848bc23e5fb2f047d24d395cf8cbb1ef8619edb6 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 11 Dec 2020 14:46:16 +0100 Subject: [PATCH 365/461] Symplify code --- src/Domain.php | 10 ++-------- src/RootZoneDatabase.php | 4 ++-- src/Rules.php | 2 +- src/TopLevelDomains.php | 8 ++++---- src/TopLevelDomainsTest.php | 3 --- 5 files changed, 9 insertions(+), 18 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 922e94c7..92ec43b7 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -159,20 +159,14 @@ private function parseValue($domain): ?string private function domainToAscii(string $domain): string { - $option = IntlIdna::IDNA2008_ASCII_OPTIONS; - if (self::IDNA_2003 === $this->type) { - $option = IntlIdna::IDNA2003_ASCII_OPTIONS; - } + $option = self::IDNA_2003 === $this->type ? IntlIdna::IDNA2003_ASCII : IntlIdna::IDNA2008_ASCII; return IntlIdna::toAscii($domain, $option)->result(); } private function domainToUnicode(string $domain): string { - $option = IntlIdna::IDNA2008_UNICODE_OPTIONS; - if (self::IDNA_2003 === $this->type) { - $option = IntlIdna::IDNA2003_UNICODE_OPTIONS; - } + $option = self::IDNA_2003 === $this->type ? IntlIdna::IDNA2003_UNICODE : IntlIdna::IDNA2008_UNICODE; return IntlIdna::toUnicode($domain, $option)->result(); } diff --git a/src/RootZoneDatabase.php b/src/RootZoneDatabase.php index ba890729..b5351ef6 100644 --- a/src/RootZoneDatabase.php +++ b/src/RootZoneDatabase.php @@ -11,7 +11,7 @@ use JsonSerializable; /** - * @extends IteratorAggregate + * @extends IteratorAggregate */ interface RootZoneDatabase extends Countable, DomainNameResolver, IteratorAggregate, JsonSerializable { @@ -36,7 +36,7 @@ public function count(): int; public function isEmpty(): bool; /** - * @return Iterator + * @return Iterator */ public function getIterator(): Iterator; diff --git a/src/Rules.php b/src/Rules.php index 52253c6d..6ea72be2 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -162,7 +162,7 @@ private static function addRule(array $list, array $ruleParts): array try { /** @var string $line */ $line = array_pop($ruleParts); - $rule = IntlIdna::toAscii($line, IntlIdna::IDNA2008_ASCII_OPTIONS)->result(); + $rule = IntlIdna::toAscii($line, IntlIdna::IDNA2008_ASCII)->result(); } catch (CannotProcessHost $exception) { throw UnableToLoadPublicSuffixList::dueToInvalidRule($line ?? null, $exception); } diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index b1744bc0..a7886545 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -166,7 +166,7 @@ private static function extractHeader(string $content): array private static function extractRootZone(string $content): string { try { - $tld = Suffix::fromIANA($content)->toAscii(); + $tld = Suffix::fromIANA($content); } catch (CannotProcessHost $exception) { throw UnableToLoadRootZoneDatabase::dueToInvalidRootZoneDomain($content, $exception); } @@ -221,12 +221,12 @@ public function isEmpty(): bool } /** - * @return Iterator + * @return Iterator */ public function getIterator(): Iterator { foreach ($this->records as $tld) { - yield Suffix::fromIANA($tld)->toAscii(); + yield $tld; } } @@ -290,7 +290,7 @@ private function containsTopLevelDomain(DomainName $domain): bool { $label = $domain->toAscii()->label(0); foreach ($this as $tld) { - if ($tld->value() === $label) { + if ($tld === $label) { return true; } } diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 2445ff32..b06df079 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -191,9 +191,6 @@ public function testGetterProperties(): void ); self::assertFalse($topLevelDomains->isEmpty()); self::assertArrayHasKey('lastUpdated', $topLevelDomains->jsonSerialize()); - foreach ($topLevelDomains as $tld) { - self::assertInstanceOf(Suffix::class, $tld); - } } /** From d91310726ca753ab6a65f57a07d2bd68bd12538b Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 11 Dec 2020 16:18:20 +0100 Subject: [PATCH 366/461] Update Implementation to comply to ICU --- src/{IdnaResult.php => IdnaInfo.php} | 60 +++++++------------- src/{IdnaResultTest.php => IdnaInfoTest.php} | 19 ++++--- src/IntlIdna.php | 14 ++--- src/SyntaxError.php | 6 +- 4 files changed, 39 insertions(+), 60 deletions(-) rename src/{IdnaResult.php => IdnaInfo.php} (72%) rename src/{IdnaResultTest.php => IdnaInfoTest.php} (62%) diff --git a/src/IdnaResult.php b/src/IdnaInfo.php similarity index 72% rename from src/IdnaResult.php rename to src/IdnaInfo.php index a7a75214..d7802626 100644 --- a/src/IdnaResult.php +++ b/src/IdnaInfo.php @@ -5,16 +5,15 @@ namespace Pdp; use function array_filter; -use function array_keys; -use function array_reduce; use const ARRAY_FILTER_USE_KEY; -final class IdnaResult +/** + * @see https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/uidna_8h.html + */ +final class IdnaInfo { /** * IDNA errors. - * - * @see https://unicode-org.github.io/icu-docs/apidoc/dev/icu4j/ */ public const ERROR_EMPTY_LABEL = 1; public const ERROR_LABEL_TOO_LONG = 2; @@ -54,18 +53,12 @@ final class IdnaResult private bool $isTransitionalDifferent; - /** - * @var array - */ - private array $errors; + private int $errors; - /** - * @param array $error - */ - private function __construct(string $result, bool $isTransitionalDifferent, array $error) + private function __construct(string $result, bool $isTransitionalDifferent, int $errors) { $this->result = $result; - $this->errors = $error; + $this->errors = $errors; $this->isTransitionalDifferent = $isTransitionalDifferent; } @@ -74,23 +67,15 @@ private function __construct(string $result, bool $isTransitionalDifferent, arra */ public static function fromIntl(array $infos): self { - return new self( - $infos['result'], - $infos['isTransitionalDifferent'], - array_filter( - self::ERRORS, - fn (int $errorByte): bool => 0 !== ($errorByte & $infos['errors']), - ARRAY_FILTER_USE_KEY - ) - ); + return new self($infos['result'], $infos['isTransitionalDifferent'], $infos['errors']); } /** - * @param array{result:string, isTransitionalDifferent:bool, errors:array} $properties + * @param array{result:string, isTransitionalDifferent:bool, errors:int} $properties */ public static function __set_state(array $properties): self { - return new self($properties['result'], $properties['isTransitionalDifferent'], $properties['errors']); + return self::fromIntl($properties); } public function result(): string @@ -103,32 +88,25 @@ public function isTransitionalDifferent(): bool return $this->isTransitionalDifferent; } - /** - * @return array - */ - public function errors(): array + public function errors(): int { return $this->errors; } public function error(int $error): ?string { - return $this->errors[$error] ?? null; + return 0 === ($this->errors & $error) ? null : self::ERRORS[$error]; } /** - * @return array{result:string, isTransitionalDifferent:bool, errors:int} + * @return array */ - public function toIntl(): array + public function errorList(): array { - return [ - 'result' => $this->result, - 'isTransitionalDifferent' => $this->isTransitionalDifferent, - 'errors' => array_reduce( - array_keys($this->errors), - fn (int $curry, int $errorByte): int => $curry | $errorByte, - 0 - ), - ]; + return array_filter( + self::ERRORS, + fn (int $errorByte): bool => 0 !== ($errorByte & $this->errors), + ARRAY_FILTER_USE_KEY + ); } } diff --git a/src/IdnaResultTest.php b/src/IdnaInfoTest.php similarity index 62% rename from src/IdnaResultTest.php rename to src/IdnaInfoTest.php index 756907b2..5c4ec0b9 100644 --- a/src/IdnaResultTest.php +++ b/src/IdnaInfoTest.php @@ -7,27 +7,27 @@ use PHPUnit\Framework\TestCase; use function var_export; -final class IdnaResultTest extends TestCase +final class IdnaInfoTest extends TestCase { public function testDomainInternalPhpMethod(): void { $infos = ['result' => 'foo.bar', 'isTransitionalDifferent' => false, 'errors' => 0]; - $result = IdnaResult::fromIntl($infos); + $result = IdnaInfo::fromIntl($infos); $generateResult = eval('return '.var_export($result, true).';'); self::assertEquals($result, $generateResult); - self::assertSame($infos, $generateResult->toIntl()); } public function testItCanBeInstantiatedFromArray(): void { $infos = ['result' => '', 'isTransitionalDifferent' => false, 'errors' => 0]; - $result = IdnaResult::fromIntl($infos); + $result = IdnaInfo::fromIntl($infos); self::assertSame('', $result->result()); self::assertFalse($result->isTransitionalDifferent()); - self::assertCount(0, $result->errors()); - self::assertNull($result->error(IdnaResult::ERROR_BIDI)); + self::assertSame(0, $result->errors()); + self::assertNull($result->error(IdnaInfo::ERROR_BIDI)); + self::assertCount(0, $result->errorList()); } public function testInvalidSyntaxAfterIDNConversion(): void @@ -36,9 +36,10 @@ public function testInvalidSyntaxAfterIDNConversion(): void IntlIdna::toAscii('%00.com', IntlIdna::IDNA2008_ASCII); } catch (SyntaxError $exception) { $result = $exception->fetchIdnaResult(); - self::assertInstanceOf(IdnaResult::class, $result); - self::assertCount(1, $result->errors()); - self::assertNotEmpty($result->error(IdnaResult::ERROR_DISALLOWED)); + self::assertInstanceOf(IdnaInfo::class, $result); + self::assertSame(IdnaInfo::ERROR_DISALLOWED, $result->errors()); + self::assertIsString($result->error(IdnaInfo::ERROR_DISALLOWED)); + self::assertCount(1, $result->errorList()); } } } diff --git a/src/IntlIdna.php b/src/IntlIdna.php index e91c10e5..332754e6 100644 --- a/src/IntlIdna.php +++ b/src/IntlIdna.php @@ -42,11 +42,11 @@ final class IntlIdna * * @throws SyntaxError if the string can not be converted to ASCII using IDN UTS46 algorithm */ - public static function toAscii(string $domain, int $option): IdnaResult + public static function toAscii(string $domain, int $option): IdnaInfo { $domain = rawurldecode($domain); if (1 !== preg_match(self::REGEXP_IDNA_PATTERN, $domain)) { - return IdnaResult::fromIntl([ + return IdnaInfo::fromIntl([ 'result' => strtolower($domain), 'isTransitionalDifferent' => false, 'errors' => 0, @@ -65,10 +65,10 @@ public static function toAscii(string $domain, int $option): IdnaResult * * @throws SyntaxError if the string can not be converted to UNICODE using IDN UTS46 algorithm */ - public static function toUnicode(string $domain, int $option): IdnaResult + public static function toUnicode(string $domain, int $option): IdnaInfo { if (false === strpos($domain, 'xn--')) { - return IdnaResult::fromIntl([ + return IdnaInfo::fromIntl([ 'result' => $domain, 'isTransitionalDifferent' => false, 'errors' => 0, @@ -83,10 +83,10 @@ public static function toUnicode(string $domain, int $option): IdnaResult /** * @param array{result:string, isTransitionalDifferent:bool, errors:int} $infos */ - private static function createIdnaResult(string $domain, array $infos): IdnaResult + private static function createIdnaResult(string $domain, array $infos): IdnaInfo { - $result = IdnaResult::fromIntl($infos); - if ([] !== $result->errors()) { + $result = IdnaInfo::fromIntl($infos); + if (0 !== $result->errors()) { throw SyntaxError::dueToIDNAError($domain, $result); } diff --git a/src/SyntaxError.php b/src/SyntaxError.php index c8cae43d..3fb6e55f 100644 --- a/src/SyntaxError.php +++ b/src/SyntaxError.php @@ -8,9 +8,9 @@ class SyntaxError extends InvalidArgumentException implements CannotProcessHost { - private ?IdnaResult $idnaResult; + private ?IdnaInfo $idnaResult; - public function fetchIdnaResult(): ?IdnaResult + public function fetchIdnaResult(): ?IdnaInfo { return $this->idnaResult; } @@ -25,7 +25,7 @@ public static function dueToInvalidLength(string $domain): self return new self('The host `'.$domain.'` is invalid: its length is longer than 255 bytes in its storage form.'); } - public static function dueToIDNAError(string $domain, IdnaResult $result): self + public static function dueToIDNAError(string $domain, IdnaInfo $result): self { $exception = new self('The host `'.$domain.'` is invalid for IDN conversion.'); $exception->idnaResult = $result; From 95bbff5634ac57f02dce56972a48706590f31b91 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 11 Dec 2020 20:12:24 +0100 Subject: [PATCH 367/461] Making Idna implementation less dependent of ext-intl --- README.md | 8 +-- src/Domain.php | 8 +-- src/Idna.php | 140 +++++++++++++++++++++++++++++++++++++++++++ src/IdnaInfo.php | 49 +++++---------- src/IdnaInfoTest.php | 8 +-- src/IntlIdna.php | 95 ----------------------------- src/Rules.php | 2 +- 7 files changed, 167 insertions(+), 143 deletions(-) create mode 100644 src/Idna.php delete mode 100644 src/IntlIdna.php diff --git a/README.md b/README.md index 636b7681..70c1b8fc 100644 --- a/README.md +++ b/README.md @@ -47,8 +47,8 @@ You need: This library can resolve a domain against: -- The [Public Suffix List](http://publicsuffix.org/) -- The [IANA Root Zone Database](https://data.iana.org/TLD/tlds-alpha-by-domain.txt) +- The [Public Suffix List](https://publicsuffix.org/) +- The [IANA Root Zone Database](https://www.iana.org/domains/root/files) In both cases this is done using the `resolve` method implemented on the resource instance. The method returns a `Pdp\ResolvedDomain` object which represents the @@ -72,7 +72,7 @@ echo $result->suffix()->toString(); //display 'okinawa.jp'; $result->suffix()->isICANN(); //return true; ~~~ -For the [IANA Root Zone Database](https://data.iana.org/TLD/tlds-alpha-by-domain.txt), +For the [IANA Root Zone Database](https://www.iana.org/domains/root/files), the `Pdp\TopLevelDomains` class is use instead: ~~~php @@ -318,8 +318,6 @@ $newDomain = $domain ->append('www') ->prepend('docs.example'); - - echo $domain->toString(); //display 'www.example.com' echo $newDomain->toString(); //display 'docs.example.com.www' $newDomain->clear()->labels(); //return [] diff --git a/src/Domain.php b/src/Domain.php index 92ec43b7..b82ad28f 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -159,16 +159,16 @@ private function parseValue($domain): ?string private function domainToAscii(string $domain): string { - $option = self::IDNA_2003 === $this->type ? IntlIdna::IDNA2003_ASCII : IntlIdna::IDNA2008_ASCII; + $option = self::IDNA_2003 === $this->type ? Idna::IDNA2003_ASCII : Idna::IDNA2008_ASCII; - return IntlIdna::toAscii($domain, $option)->result(); + return Idna::toAscii($domain, $option)->result(); } private function domainToUnicode(string $domain): string { - $option = self::IDNA_2003 === $this->type ? IntlIdna::IDNA2003_UNICODE : IntlIdna::IDNA2008_UNICODE; + $option = self::IDNA_2003 === $this->type ? Idna::IDNA2003_UNICODE : Idna::IDNA2008_UNICODE; - return IntlIdna::toUnicode($domain, $option)->result(); + return Idna::toUnicode($domain, $option)->result(); } /** diff --git a/src/Idna.php b/src/Idna.php new file mode 100644 index 00000000..8f6322f2 --- /dev/null +++ b/src/Idna.php @@ -0,0 +1,140 @@ + strtolower($domain), + 'isTransitionalDifferent' => false, + 'errors' => 0, + ]); + } + + self::supportIdna(); + + idn_to_ascii($domain, $options, INTL_IDNA_VARIANT_UTS46, $idnaInfo); + + return self::createIdnaInfo($domain, $idnaInfo); + } + + /** + * Converts the input to its IDNA UNICODE form. + * + * This method returns the string converted to IDN UNICODE form + * + * @throws SyntaxError if the string can not be converted to UNICODE using IDN UTS46 algorithm + */ + public static function toUnicode(string $domain, int $options): IdnaInfo + { + if (false === strpos($domain, 'xn--')) { + return IdnaInfo::fromIntl([ + 'result' => $domain, + 'isTransitionalDifferent' => false, + 'errors' => 0, + ]); + } + + self::supportIdna(); + + idn_to_utf8($domain, $options, INTL_IDNA_VARIANT_UTS46, $idnaInfo); + + return self::createIdnaInfo($domain, $idnaInfo); + } + + /** + * @param array{result:string, isTransitionalDifferent:bool, errors:int} $infos + */ + private static function createIdnaInfo(string $domain, array $infos): IdnaInfo + { + $result = IdnaInfo::fromIntl($infos); + if (0 !== $result->errors()) { + throw SyntaxError::dueToIDNAError($domain, $result); + } + + return $result; + } +} diff --git a/src/IdnaInfo.php b/src/IdnaInfo.php index d7802626..8ca8ed29 100644 --- a/src/IdnaInfo.php +++ b/src/IdnaInfo.php @@ -12,41 +12,22 @@ */ final class IdnaInfo { - /** - * IDNA errors. - */ - public const ERROR_EMPTY_LABEL = 1; - public const ERROR_LABEL_TOO_LONG = 2; - public const ERROR_DOMAIN_NAME_TOO_LONG = 4; - public const ERROR_LEADING_HYPHEN = 8; - public const ERROR_TRAILING_HYPHEN = 0x10; - public const ERROR_HYPHEN_3_4 = 0x20; - public const ERROR_LEADING_COMBINING_MARK = 0x40; - public const ERROR_DISALLOWED = 0x80; - public const ERROR_PUNYCODE = 0x100; - public const ERROR_LABEL_HAS_DOT = 0x200; - public const ERROR_INVALID_ACE_LABEL = 0x400; - public const ERROR_BIDI = 0x800; - public const ERROR_CONTEXTJ = 0x1000; - public const ERROR_CONTEXTO_PUNCTUATION = 0x2000; - public const ERROR_CONTEXTO_DIGITS = 0x4000; - private const ERRORS = [ - self::ERROR_EMPTY_LABEL => 'a non-final domain name label (or the whole domain name) is empty', - self::ERROR_LABEL_TOO_LONG => 'a domain name label is longer than 63 bytes', - self::ERROR_DOMAIN_NAME_TOO_LONG => 'a domain name is longer than 255 bytes in its storage form', - self::ERROR_LEADING_HYPHEN => 'a label starts with a hyphen-minus ("-")', - self::ERROR_TRAILING_HYPHEN => 'a label ends with a hyphen-minus ("-")', - self::ERROR_HYPHEN_3_4 => 'a label contains hyphen-minus ("-") in the third and fourth positions', - self::ERROR_LEADING_COMBINING_MARK => 'a label starts with a combining mark', - self::ERROR_DISALLOWED => 'a label or domain name contains disallowed characters', - self::ERROR_PUNYCODE => 'a label starts with "xn--" but does not contain valid Punycode', - self::ERROR_LABEL_HAS_DOT => 'a label contains a dot=full stop', - self::ERROR_INVALID_ACE_LABEL => 'An ACE label does not contain a valid label string', - self::ERROR_BIDI => 'a label does not meet the IDNA BiDi requirements (for right-to-left characters)', - self::ERROR_CONTEXTJ => 'a label does not meet the IDNA CONTEXTJ requirements', - self::ERROR_CONTEXTO_DIGITS => 'a label does not meet the IDNA CONTEXTO requirements for digits', - self::ERROR_CONTEXTO_PUNCTUATION => 'a label does not meet the IDNA CONTEXTO requirements for punctuation characters. Some punctuation characters "Would otherwise have been DISALLOWED" but are allowed in certain contexts', + Idna::ERROR_EMPTY_LABEL => 'a non-final domain name label (or the whole domain name) is empty', + Idna::ERROR_LABEL_TOO_LONG => 'a domain name label is longer than 63 bytes', + Idna::ERROR_DOMAIN_NAME_TOO_LONG => 'a domain name is longer than 255 bytes in its storage form', + Idna::ERROR_LEADING_HYPHEN => 'a label starts with a hyphen-minus ("-")', + Idna::ERROR_TRAILING_HYPHEN => 'a label ends with a hyphen-minus ("-")', + Idna::ERROR_HYPHEN_3_4 => 'a label contains hyphen-minus ("-") in the third and fourth positions', + Idna::ERROR_LEADING_COMBINING_MARK => 'a label starts with a combining mark', + Idna::ERROR_DISALLOWED => 'a label or domain name contains disallowed characters', + Idna::ERROR_PUNYCODE => 'a label starts with "xn--" but does not contain valid Punycode', + Idna::ERROR_LABEL_HAS_DOT => 'a label contains a dot=full stop', + Idna::ERROR_INVALID_ACE_LABEL => 'An ACE label does not contain a valid label string', + Idna::ERROR_BIDI => 'a label does not meet the IDNA BiDi requirements (for right-to-left characters)', + Idna::ERROR_CONTEXTJ => 'a label does not meet the IDNA CONTEXTJ requirements', + Idna::ERROR_CONTEXTO_DIGITS => 'a label does not meet the IDNA CONTEXTO requirements for digits', + Idna::ERROR_CONTEXTO_PUNCTUATION => 'a label does not meet the IDNA CONTEXTO requirements for punctuation characters. Some punctuation characters "Would otherwise have been DISALLOWED" but are allowed in certain contexts', ]; private string $result; diff --git a/src/IdnaInfoTest.php b/src/IdnaInfoTest.php index 5c4ec0b9..4db9ea78 100644 --- a/src/IdnaInfoTest.php +++ b/src/IdnaInfoTest.php @@ -26,19 +26,19 @@ public function testItCanBeInstantiatedFromArray(): void self::assertSame('', $result->result()); self::assertFalse($result->isTransitionalDifferent()); self::assertSame(0, $result->errors()); - self::assertNull($result->error(IdnaInfo::ERROR_BIDI)); + self::assertNull($result->error(Idna::ERROR_BIDI)); self::assertCount(0, $result->errorList()); } public function testInvalidSyntaxAfterIDNConversion(): void { try { - IntlIdna::toAscii('%00.com', IntlIdna::IDNA2008_ASCII); + Idna::toAscii('%00.com', Idna::IDNA2008_ASCII); } catch (SyntaxError $exception) { $result = $exception->fetchIdnaResult(); self::assertInstanceOf(IdnaInfo::class, $result); - self::assertSame(IdnaInfo::ERROR_DISALLOWED, $result->errors()); - self::assertIsString($result->error(IdnaInfo::ERROR_DISALLOWED)); + self::assertSame(Idna::ERROR_DISALLOWED, $result->errors()); + self::assertIsString($result->error(Idna::ERROR_DISALLOWED)); self::assertCount(1, $result->errorList()); } } diff --git a/src/IntlIdna.php b/src/IntlIdna.php deleted file mode 100644 index 332754e6..00000000 --- a/src/IntlIdna.php +++ /dev/null @@ -1,95 +0,0 @@ - strtolower($domain), - 'isTransitionalDifferent' => false, - 'errors' => 0, - ]); - } - - idn_to_ascii($domain, $option, INTL_IDNA_VARIANT_UTS46, $infos); - - return self::createIdnaResult($domain, $infos); - } - - /** - * Converts the input to its IDNA UNICODE form. - * - * This method returns the string converted to IDN UNICODE form - * - * @throws SyntaxError if the string can not be converted to UNICODE using IDN UTS46 algorithm - */ - public static function toUnicode(string $domain, int $option): IdnaInfo - { - if (false === strpos($domain, 'xn--')) { - return IdnaInfo::fromIntl([ - 'result' => $domain, - 'isTransitionalDifferent' => false, - 'errors' => 0, - ]); - } - - idn_to_utf8($domain, $option, INTL_IDNA_VARIANT_UTS46, $infos); - - return self::createIdnaResult($domain, $infos); - } - - /** - * @param array{result:string, isTransitionalDifferent:bool, errors:int} $infos - */ - private static function createIdnaResult(string $domain, array $infos): IdnaInfo - { - $result = IdnaInfo::fromIntl($infos); - if (0 !== $result->errors()) { - throw SyntaxError::dueToIDNAError($domain, $result); - } - - return $result; - } -} diff --git a/src/Rules.php b/src/Rules.php index 6ea72be2..6f398df0 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -162,7 +162,7 @@ private static function addRule(array $list, array $ruleParts): array try { /** @var string $line */ $line = array_pop($ruleParts); - $rule = IntlIdna::toAscii($line, IntlIdna::IDNA2008_ASCII)->result(); + $rule = Idna::toAscii($line, Idna::IDNA2008_ASCII)->result(); } catch (CannotProcessHost $exception) { throw UnableToLoadPublicSuffixList::dueToInvalidRule($line ?? null, $exception); } From 6ec48e0bc8560402f02585bac6f72082038b4446 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 11 Dec 2020 20:23:03 +0100 Subject: [PATCH 368/461] Improve IdnaInfo --- src/IdnaInfo.php | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/IdnaInfo.php b/src/IdnaInfo.php index 8ca8ed29..9147b86a 100644 --- a/src/IdnaInfo.php +++ b/src/IdnaInfo.php @@ -36,11 +36,21 @@ final class IdnaInfo private int $errors; + /** + * @var array + */ + private array $errorList; + private function __construct(string $result, bool $isTransitionalDifferent, int $errors) { $this->result = $result; $this->errors = $errors; $this->isTransitionalDifferent = $isTransitionalDifferent; + $this->errorList = array_filter( + self::ERRORS, + fn (int $error): bool => 0 !== ($error & $this->errors), + ARRAY_FILTER_USE_KEY + ); } /** @@ -76,7 +86,7 @@ public function errors(): int public function error(int $error): ?string { - return 0 === ($this->errors & $error) ? null : self::ERRORS[$error]; + return $this->errorList[$error] ?? null; } /** @@ -84,10 +94,6 @@ public function error(int $error): ?string */ public function errorList(): array { - return array_filter( - self::ERRORS, - fn (int $errorByte): bool => 0 !== ($errorByte & $this->errors), - ARRAY_FILTER_USE_KEY - ); + return $this->errorList; } } From 8492efe8ec09cb0bbff19d77b2266dc9126e03f7 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 11 Dec 2020 20:23:16 +0100 Subject: [PATCH 369/461] Symplify composer scripts --- composer.json | 2 +- src/Idna.php | 12 ++---------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/composer.json b/composer.json index 7a794be2..85d4133c 100644 --- a/composer.json +++ b/composer.json @@ -69,7 +69,7 @@ }, "scripts": { "phpcs": "php-cs-fixer fix -vvv --diff --dry-run --allow-risky=yes --ansi", - "phpstan": "phpstan analyse -l max -c phpstan.neon src --ansi --memory-limit 192M", + "phpstan": "phpstan analyse -l max -c phpstan.neon src --ansi", "phpunit": "phpunit --coverage-text", "test": [ "@phpcs", diff --git a/src/Idna.php b/src/Idna.php index 8f6322f2..82a4c84b 100644 --- a/src/Idna.php +++ b/src/Idna.php @@ -87,11 +87,7 @@ public static function toAscii(string $domain, int $options): IdnaInfo { $domain = rawurldecode($domain); if (1 !== preg_match(self::REGEXP_IDNA_PATTERN, $domain)) { - return IdnaInfo::fromIntl([ - 'result' => strtolower($domain), - 'isTransitionalDifferent' => false, - 'errors' => 0, - ]); + return IdnaInfo::fromIntl(['result' => strtolower($domain), 'isTransitionalDifferent' => false, 'errors' => 0]); } self::supportIdna(); @@ -111,11 +107,7 @@ public static function toAscii(string $domain, int $options): IdnaInfo public static function toUnicode(string $domain, int $options): IdnaInfo { if (false === strpos($domain, 'xn--')) { - return IdnaInfo::fromIntl([ - 'result' => $domain, - 'isTransitionalDifferent' => false, - 'errors' => 0, - ]); + return IdnaInfo::fromIntl(['result' => $domain, 'isTransitionalDifferent' => false, 'errors' => 0]); } self::supportIdna(); From 36b27ff5d74596d0e343a858d1b1ab5b7d9cde5c Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 12 Dec 2020 10:38:53 +0100 Subject: [PATCH 370/461] Rename Interface name --- README.md | 74 +++++++++---------- src/EffectiveTopLevelDomain.php | 2 +- src/Storage/PsrStorageFactory.php | 10 +-- src/Storage/PsrStorageFactoryTest.php | 2 +- .../{RemoteStorageURL.php => ResourceUri.php} | 4 +- src/Storage/RootZoneDatabaseClient.php | 16 ---- .../RootZoneDatabaseStorageFactory.php | 14 ---- ...eCache.php => TopLevelDomainListCache.php} | 14 ++-- src/Storage/TopLevelDomainListClient.php | 16 ++++ ...e.php => TopLevelDomainListPsr16Cache.php} | 18 ++--- ...p => TopLevelDomainListPsr16CacheTest.php} | 30 ++++---- ....php => TopLevelDomainListPsr18Client.php} | 12 +-- ... => TopLevelDomainListPsr18ClientTest.php} | 20 ++--- ...rage.php => TopLevelDomainListStorage.php} | 2 +- .../TopLevelDomainListStorageFactory.php | 14 ++++ src/Storage/TopLevelDomainsStorage.php | 24 +++--- src/Storage/TopLevelDomainsStorageTest.php | 32 ++++---- ...oneDatabase.php => TopLevelDomainList.php} | 2 +- src/TopLevelDomains.php | 47 ++++++------ src/TopLevelDomainsTest.php | 14 ++-- ...php => UnableToLoadTopLevelDomainList.php} | 14 ++-- 21 files changed, 188 insertions(+), 193 deletions(-) rename src/Storage/{RemoteStorageURL.php => ResourceUri.php} (56%) delete mode 100644 src/Storage/RootZoneDatabaseClient.php delete mode 100644 src/Storage/RootZoneDatabaseStorageFactory.php rename src/Storage/{RootZoneDatabaseCache.php => TopLevelDomainListCache.php} (51%) create mode 100644 src/Storage/TopLevelDomainListClient.php rename src/Storage/{RootZoneDatabasePsr16Cache.php => TopLevelDomainListPsr16Cache.php} (83%) rename src/Storage/{RootZoneDatabasePsr16CacheTest.php => TopLevelDomainListPsr16CacheTest.php} (72%) rename src/Storage/{RootZoneDatabasePsr18Client.php => TopLevelDomainListPsr18Client.php} (67%) rename src/Storage/{RootZoneDatabasePsr18ClientTest.php => TopLevelDomainListPsr18ClientTest.php} (76%) rename src/Storage/{RootZoneDatabaseStorage.php => TopLevelDomainListStorage.php} (61%) create mode 100644 src/Storage/TopLevelDomainListStorageFactory.php rename src/{RootZoneDatabase.php => TopLevelDomainList.php} (91%) rename src/{UnableToLoadRootZoneDatabase.php => UnableToLoadTopLevelDomainList.php} (64%) diff --git a/README.md b/README.md index 70c1b8fc..11705138 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ You can't regex that. PHP Domain Parser is compliant around: - accurate Public Suffix List based parsing. -- accurate Root Zone Database parsing. +- accurate IANA Top Level Domain List parsing. ## Installation @@ -48,7 +48,7 @@ You need: This library can resolve a domain against: - The [Public Suffix List](https://publicsuffix.org/) -- The [IANA Root Zone Database](https://www.iana.org/domains/root/files) +- The [IANA Top Level Domain List](https://www.iana.org/domains/root/files) In both cases this is done using the `resolve` method implemented on the resource instance. The method returns a `Pdp\ResolvedDomain` object which represents the @@ -72,15 +72,15 @@ echo $result->suffix()->toString(); //display 'okinawa.jp'; $result->suffix()->isICANN(); //return true; ~~~ -For the [IANA Root Zone Database](https://www.iana.org/domains/root/files), +For the [IANA Top Level Domain List](https://www.iana.org/domains/root/files), the `Pdp\TopLevelDomains` class is use instead: ~~~php use Pdp\TopLevelDomains; -$rootZoneDatabase = TopLevelDomains::fromPath('/path/to/cache/tlds-alpha-by-domain.txt'); +$topLevelDomains = TopLevelDomains::fromPath('/path/to/cache/tlds-alpha-by-domain.txt'); -$result = $rootZoneDatabase->resolve('www.PreF.OkiNawA.jP'); +$result = $topLevelDomains->resolve('www.PreF.OkiNawA.jP'); echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; echo $result->suffix()->toString(); //display 'jp'; echo $result->secondLevelDomain()->toString(); //display 'okinawa'; @@ -100,8 +100,8 @@ namely: - `Rules::getICANNDomain` - `Rules::getPrivateDomain` -for the Public Suffix List and the following method for the Root Zone -Database: +for the Public Suffix List and the following method for the Top Level +Domain List: - `TopLevelDomains::getIANADomain` @@ -132,8 +132,8 @@ $result->suffix()->value(); // returns null $result->suffix()->isKnown(); // returns false // will not throw but its public suffix value equal to NULL -$rootZoneDatabase = TopLevelDomains::fromPath('/path/to/cache/public-suffix-list.dat'); -$rootZoneDatabase->getIANADomain('com'); +$topLevelDomains = TopLevelDomains::fromPath('/path/to/cache/public-suffix-list.dat'); +$topLevelDomains->getIANADomain('com'); // will not throw because the domain syntax is invalid (ie: does not support public suffix) ~~~ @@ -150,7 +150,7 @@ resolver exposes the `JsonSerialize` method. **WARNING:** -**You should never use resolve domain name this way in production, without, at +**You should never resolve domain name this way in production, without, at least, a caching mechanism to reduce PSL downloads.** **Using the Public Suffix List to determine what is a valid domain name and what @@ -158,8 +158,8 @@ isn't is dangerous, particularly in these days when new gTLDs are arriving at a rapid pace.** **If you are looking to know the validity of a Top Level Domain, the -IANA Root Zone Database is the proper source for this information or alternatively -consider using directly the DNS.** +IANA Top Level Domain List is the proper source for this information or +alternatively consider using directly the DNS.** **If you must use this library for any of the above purposes, please consider integrating an updating mechanism into your software.** @@ -172,13 +172,13 @@ Whichever methods chosen to resolve the domain on success, the package will return a `Pdp\ResolvedDomain` instance. The `Pdp\ResolvedDomain` decorates the `Pdp\Domain` class resolved but also -gives access as separate methods to the domain different components. +gives access as separate methods to the domain different components. ~~~php -use Pdp\RootZoneDatabase; +use Pdp\TopLevelDomains; -/** @var RootZoneDatabase $rootZoneDatabase */ -$result = $rootZoneDatabase->resolve('www.PreF.OkiNawA.jP'); +/** @var TopLevelDomains $topLevelDomains */ +$result = $topLevelDomains->resolve('www.PreF.OkiNawA.jP'); echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; echo $result->suffix()->toString(); //display 'jp'; echo $result->secondLevelDomain()->toString(); //display 'okinawa'; @@ -192,9 +192,9 @@ You can modify the returned `Pdp\ResolvedDomain` instance using the following me ~~~php resolve('shop.example.com'); $altResult = $result ->withSubDomain('foo.bar') @@ -221,9 +221,9 @@ origin. ~~~php resolve('example.github.io')->suffix(); echo $suffix->domain()->toString(); //display 'github.io'; @@ -237,7 +237,7 @@ $suffix->isKnown(); //will return true The public suffix state depends on its origin: - `isKnown` returns `true` if the value is present in the data resource. -- `isIANA` returns `true` if the value is present in the Root Zone Database. +- `isIANA` returns `true` if the value is present in the IANA Top Level Domain List. - `isPublicSuffix` returns `true` if the value is present in the Public Suffix List. - `isICANN` returns `true` if the value is present in the Public Suffix List ICANN section. - `isPrivate` returns `true` if the value is present in the Public Suffix List private section. @@ -279,9 +279,9 @@ manipulating domain labels. You can access the object using the following method ~~~php resolve('www.bbc.co.uk'); $domain = $result->domain(); echo $domain->toString(); // display 'www.bbc.co.uk' @@ -307,9 +307,9 @@ following methods: ~~~php resolve('www.ExAmpLE.cOM')->domain(); $newDomain = $domain @@ -353,9 +353,9 @@ IDNA Compatibility Processing. Domain objects expose a `toAscii` and a ~~~php resolve('bébé.be')->domain(); echo $unicodeDomain->toString(); // returns 'bébé.be' @@ -416,15 +416,15 @@ nevertheless, the library comes bundle with a **optional service** which enables resolving domain name without the constant network overhead of continuously downloading the remote databases. -The interfaces defined under the `Pdp\Storage` namespace enable -integrating a database managing system and provide an implementation example +The interfaces and classes defined under the `Pdp\Storage` namespace enable +integrating a resource managing system and provide an implementation example using PHP-FIG PSR interfaces. #### Using PHP-FIG interfaces The `Pdp\Storage\PsrStorageFactory` enables returning storage instances that -retrieve, convert and cache the Public Suffix List and the IANA Root -Zone Database using standard interfaces published by the PHP-FIG. +retrieve, convert and cache the Public Suffix List and the IANA Top Level +Domain List using standard interfaces published by the PHP-FIG. To work as intended, the `Pdp\Storage\PsrStorageFactory` constructor requires: @@ -465,7 +465,7 @@ For the purpose of this example we will use our PSR powered solution with: We will cache both external sources for 24 hours in a PostgreSQL database. You are free to use other libraries/solutions/settings as long as they -implement the required PSR interfaces. +implement the required PSR interfaces. ~~~php createPublicSuffixListStorage($cachePrefix, $cacheTtl); -$rzdStorage = $factory->createRootZoneDatabaseStorage($cachePrefix, $cacheTtl); +$rzdStorage = $factory->createTopLevelDomainListStorage($cachePrefix, $cacheTtl); // if you need to force refreshing the rules // before calling them (to use in a refresh script) @@ -507,8 +507,8 @@ $publicSuffixList = $pslStorage->get(PsrStorageFactory::PUBLIC_SUFFIX_LIST_URI); // if you need to force refreshing the rules // before calling them (to use in a refresh script) // uncomment this part or adapt it to you script logic -// $rzdStorage->delete(PsrStorageFactory::ROOT_ZONE_DATABASE_URI); -$rootZoneDatabase = $rzdStorage->get(PsrStorageFactory::ROOT_ZONE_DATABASE_URI); +// $rzdStorage->delete(PsrStorageFactory::TOP_LEVEL_DOMAIN_LIST_URI); +$topLevelDomains = $rzdStorage->get(PsrStorageFactory::TOP_LEVEL_DOMAIN_LIST_URI); ~~~ **Be sure to adapt the following code to your own application. @@ -520,8 +520,8 @@ code in your application.** ### Automatic Updates -It is important to always have an up to date Public Suffix List and Root Zone -Database. +It is important to always have an up to date Public Suffix List and Top Level +Domain List. This library no longer provide an out of the box script to do so as implementing such a job heavily depends on your application setup. You can use the above example script as a starting point to implement such a job. diff --git a/src/EffectiveTopLevelDomain.php b/src/EffectiveTopLevelDomain.php index 97850c50..29636cdb 100644 --- a/src/EffectiveTopLevelDomain.php +++ b/src/EffectiveTopLevelDomain.php @@ -12,7 +12,7 @@ interface EffectiveTopLevelDomain extends Host, DomainNameProvider public function isKnown(): bool; /** - * Tells whether the effective TLD has a matching rule in the IANA Root Zone Database. + * Tells whether the effective TLD has a matching rule in the IANA Top Level Domain List. */ public function isIANA(): bool; diff --git a/src/Storage/PsrStorageFactory.php b/src/Storage/PsrStorageFactory.php index 136ad571..313ece50 100644 --- a/src/Storage/PsrStorageFactory.php +++ b/src/Storage/PsrStorageFactory.php @@ -9,9 +9,9 @@ use Psr\SimpleCache\CacheInterface; final class PsrStorageFactory implements - RemoteStorageURL, + ResourceUri, PublicSuffixListStorageFactory, - RootZoneDatabaseStorageFactory + TopLevelDomainListStorageFactory { private CacheInterface $cache; @@ -40,11 +40,11 @@ public function createPublicSuffixListStorage(string $cachePrefix = '', $cacheTt /** * @param mixed $cacheTtl The cache TTL */ - public function createRootZoneDatabaseStorage(string $cachePrefix = '', $cacheTtl = null): RootZoneDatabaseStorage + public function createTopLevelDomainListStorage(string $cachePrefix = '', $cacheTtl = null): TopLevelDomainListStorage { return new TopLevelDomainsStorage( - new RootZoneDatabasePsr16Cache($this->cache, $cachePrefix, $cacheTtl), - new RootZoneDatabasePsr18Client($this->client, $this->requestFactory) + new TopLevelDomainListPsr16Cache($this->cache, $cachePrefix, $cacheTtl), + new TopLevelDomainListPsr18Client($this->client, $this->requestFactory) ); } } diff --git a/src/Storage/PsrStorageFactoryTest.php b/src/Storage/PsrStorageFactoryTest.php index 9567df96..b423fb4a 100644 --- a/src/Storage/PsrStorageFactoryTest.php +++ b/src/Storage/PsrStorageFactoryTest.php @@ -24,7 +24,7 @@ public function setUp(): void public function testItCanReturnARootZoneDatabaseStorageInstance(): void { - $instance = $this->factory->createRootZoneDatabaseStorage('foobar', '1 DAY'); + $instance = $this->factory->createTopLevelDomainListStorage('foobar', '1 DAY'); self::assertInstanceOf(TopLevelDomainsStorage::class, $instance); } diff --git a/src/Storage/RemoteStorageURL.php b/src/Storage/ResourceUri.php similarity index 56% rename from src/Storage/RemoteStorageURL.php rename to src/Storage/ResourceUri.php index 163c55a6..ffd2dec2 100644 --- a/src/Storage/RemoteStorageURL.php +++ b/src/Storage/ResourceUri.php @@ -4,9 +4,9 @@ namespace Pdp\Storage; -interface RemoteStorageURL +interface ResourceUri { public const PUBLIC_SUFFIX_LIST_URI = 'https://publicsuffix.org/list/public_suffix_list.dat'; - public const ROOT_ZONE_DATABASE_URI = 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt'; + public const TOP_LEVEL_DOMAIN_LIST_URI = 'https://data.iana.org/TLD/tlds-alpha-by-domain.txt'; } diff --git a/src/Storage/RootZoneDatabaseClient.php b/src/Storage/RootZoneDatabaseClient.php deleted file mode 100644 index 4bcfe58d..00000000 --- a/src/Storage/RootZoneDatabaseClient.php +++ /dev/null @@ -1,16 +0,0 @@ -cacheKey($uri); - $rootZoneDatabase = $this->cache->get($cacheKey); - if (null === $rootZoneDatabase) { + $topLevelDomainList = $this->cache->get($cacheKey); + if (null === $topLevelDomainList) { return null; } - if (!$rootZoneDatabase instanceof RootZoneDatabase) { + if (!$topLevelDomainList instanceof TopLevelDomainList) { $this->cache->delete($cacheKey); return null; } - return $rootZoneDatabase; + return $topLevelDomainList; } /** @@ -104,10 +104,10 @@ private function cacheKey(string $str): string return $this->cachePrefix.md5(strtolower($str)); } - public function remember(string $uri, RootZoneDatabase $rootZoneDatabase): bool + public function remember(string $uri, TopLevelDomainList $topLevelDomainList): bool { try { - return $this->cache->set($this->cacheKey($uri), $rootZoneDatabase, $this->cacheTtl); + return $this->cache->set($this->cacheKey($uri), $topLevelDomainList, $this->cacheTtl); } catch (CacheException $exception) { return false; } diff --git a/src/Storage/RootZoneDatabasePsr16CacheTest.php b/src/Storage/TopLevelDomainListPsr16CacheTest.php similarity index 72% rename from src/Storage/RootZoneDatabasePsr16CacheTest.php rename to src/Storage/TopLevelDomainListPsr16CacheTest.php index 5cfa7244..00f8ec6c 100644 --- a/src/Storage/RootZoneDatabasePsr16CacheTest.php +++ b/src/Storage/TopLevelDomainListPsr16CacheTest.php @@ -17,29 +17,29 @@ use function dirname; /** - * @coversDefaultClass \Pdp\Storage\RootZoneDatabasePsr16Cache + * @coversDefaultClass \Pdp\Storage\TopLevelDomainListPsr16Cache */ -final class RootZoneDatabasePsr16CacheTest extends TestCase +final class TopLevelDomainListPsr16CacheTest extends TestCase { public function testItReturnsNullIfTheCacheDoesNotExists(): void { $cache = $this->createStub(CacheInterface::class); $cache->method('get')->willReturn(null); - $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', '1 DAY'); + $instance = new TopLevelDomainListPsr16Cache($cache, 'pdp_', '1 DAY'); self::assertNull($instance->fetch('http://www.example.com')); } public function testItReturnsAnInstanceIfTheCorrectCacheExists(): void { - $rootZoneDB = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); + $topLevelDomainList = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); $cache = $this->createStub(CacheInterface::class); - $cache->method('get')->willReturn($rootZoneDB); + $cache->method('get')->willReturn($topLevelDomainList); - $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', 86400); + $instance = new TopLevelDomainListPsr16Cache($cache, 'pdp_', 86400); - self::assertEquals($rootZoneDB, $instance->fetch('http://www.example.com')); + self::assertEquals($topLevelDomainList, $instance->fetch('http://www.example.com')); } public function testItReturnsNullIfTheCacheContentContainsInvalidJsonData(): void @@ -47,7 +47,7 @@ public function testItReturnsNullIfTheCacheContentContainsInvalidJsonData(): voi $cache = $this->createStub(CacheInterface::class); $cache->method('get')->willReturn('foobar'); - $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new DateInterval('P1D')); + $instance = new TopLevelDomainListPsr16Cache($cache, 'pdp_', new DateInterval('P1D')); self::assertNull($instance->fetch('http://www.example.com')); } @@ -57,7 +57,7 @@ public function testItReturnsNullIfTheCacheContentCannotBeConvertedToTheCorrectI $cache = $this->createStub(CacheInterface::class); $cache->method('get')->willReturn('{"foo":"bar"}'); - $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new DateTimeImmutable('+1 DAY')); + $instance = new TopLevelDomainListPsr16Cache($cache, 'pdp_', new DateTimeImmutable('+1 DAY')); self::assertNull($instance->fetch('http://www.example.com')); } @@ -68,7 +68,7 @@ public function testItCanStoreAPublicSuffixListInstance(): void $cache->method('set')->willReturn(true); $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new DateInterval('P1D')); + $instance = new TopLevelDomainListPsr16Cache($cache, 'pdp_', new DateInterval('P1D')); self::assertTrue($instance->remember('http://www.example.com', $rzd)); } @@ -79,7 +79,7 @@ public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void $cache->method('set')->willReturn(false); $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new DateInterval('P1D')); + $instance = new TopLevelDomainListPsr16Cache($cache, 'pdp_', new DateInterval('P1D')); self::assertFalse($instance->remember('http://www.example.com', $rzd)); } @@ -92,7 +92,7 @@ public function testItReturnsFalseIfItCantCacheAPublicSuffixListInstance(): void $cache->method('set')->will(self::throwException($exception)); $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new DateInterval('P1D')); + $instance = new TopLevelDomainListPsr16Cache($cache, 'pdp_', new DateInterval('P1D')); self::assertFalse($instance->remember('http://www.example.com', $rzd)); } @@ -104,7 +104,7 @@ public function testItCanDeleteTheCachedDatabase(): void $cache = $this->createStub(CacheInterface::class); $cache->method('delete')->willReturn(true); - $instance = new RootZoneDatabasePsr16Cache($cache, 'pdp_', new DateInterval('P1D')); + $instance = new TopLevelDomainListPsr16Cache($cache, 'pdp_', new DateInterval('P1D')); self::assertTrue($instance->forget($uri)); } @@ -113,7 +113,7 @@ public function testItWillThrowIfTheTTLIsNotParsable(): void $this->expectException(InvalidArgumentException::class); $cache = $this->createStub(CacheInterface::class); - new RootZoneDatabasePsr16Cache($cache, 'pdp_', 'foobar'); + new TopLevelDomainListPsr16Cache($cache, 'pdp_', 'foobar'); } public function testItWillThrowIfTheTTLIsInvalid(): void @@ -121,6 +121,6 @@ public function testItWillThrowIfTheTTLIsInvalid(): void $this->expectException(TypeError::class); $cache = $this->createStub(CacheInterface::class); - new RootZoneDatabasePsr16Cache($cache, 'pdp_', new stdClass()); + new TopLevelDomainListPsr16Cache($cache, 'pdp_', new stdClass()); } } diff --git a/src/Storage/RootZoneDatabasePsr18Client.php b/src/Storage/TopLevelDomainListPsr18Client.php similarity index 67% rename from src/Storage/RootZoneDatabasePsr18Client.php rename to src/Storage/TopLevelDomainListPsr18Client.php index ed8c1d54..cd21a5d8 100644 --- a/src/Storage/RootZoneDatabasePsr18Client.php +++ b/src/Storage/TopLevelDomainListPsr18Client.php @@ -4,14 +4,14 @@ namespace Pdp\Storage; -use Pdp\RootZoneDatabase; +use Pdp\TopLevelDomainList; use Pdp\TopLevelDomains; -use Pdp\UnableToLoadRootZoneDatabase; +use Pdp\UnableToLoadTopLevelDomainList; use Psr\Http\Client\ClientExceptionInterface; use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestFactoryInterface; -final class RootZoneDatabasePsr18Client implements RootZoneDatabaseClient +final class TopLevelDomainListPsr18Client implements TopLevelDomainListClient { private ClientInterface $client; @@ -23,17 +23,17 @@ public function __construct(ClientInterface $client, RequestFactoryInterface $re $this->requestFactory = $requestFactory; } - public function get(string $uri): RootZoneDatabase + public function get(string $uri): TopLevelDomainList { $request = $this->requestFactory->createRequest('GET', $uri); try { $response = $this->client->sendRequest($request); } catch (ClientExceptionInterface $exception) { - throw UnableToLoadRootZoneDatabase::dueToUnavailableService($uri, $exception); + throw UnableToLoadTopLevelDomainList::dueToUnavailableService($uri, $exception); } if (400 <= $response->getStatusCode()) { - throw UnableToLoadRootZoneDatabase::dueToUnexpectedContent($uri, $response->getStatusCode()); + throw UnableToLoadTopLevelDomainList::dueToUnexpectedContent($uri, $response->getStatusCode()); } return TopLevelDomains::fromString($response->getBody()); diff --git a/src/Storage/RootZoneDatabasePsr18ClientTest.php b/src/Storage/TopLevelDomainListPsr18ClientTest.php similarity index 76% rename from src/Storage/RootZoneDatabasePsr18ClientTest.php rename to src/Storage/TopLevelDomainListPsr18ClientTest.php index 1e37aa9e..205b197e 100644 --- a/src/Storage/RootZoneDatabasePsr18ClientTest.php +++ b/src/Storage/TopLevelDomainListPsr18ClientTest.php @@ -8,7 +8,7 @@ use GuzzleHttp\Psr7\Request; use GuzzleHttp\Psr7\Response; use Pdp\TopLevelDomains; -use Pdp\UnableToLoadRootZoneDatabase; +use Pdp\UnableToLoadTopLevelDomainList; use PHPUnit\Framework\TestCase; use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestFactoryInterface; @@ -18,9 +18,9 @@ use function file_get_contents; /** - * @coversDefaultClass \Pdp\Storage\RootZoneDatabasePsr18Client + * @coversDefaultClass \Pdp\Storage\TopLevelDomainListPsr18Client */ -final class RootZoneDatabasePsr18ClientTest extends TestCase +final class TopLevelDomainListPsr18ClientTest extends TestCase { public function testIsCanReturnARootZoneDatabaseInstance(): void { @@ -41,7 +41,7 @@ public function createRequest(string $method, $uri): RequestInterface } }; - $storage = new RootZoneDatabasePsr18Client($client, $requestFactory); + $storage = new TopLevelDomainListPsr18Client($client, $requestFactory); $rzd = $storage->get('http://www.example.com'); self::assertInstanceOf(TopLevelDomains::class, $rzd); @@ -63,10 +63,10 @@ public function createRequest(string $method, $uri): RequestInterface } }; - $this->expectException(UnableToLoadRootZoneDatabase::class); - $this->expectExceptionMessage('Could not access the Root Zone Database URI: `http://www.example.com`.'); + $this->expectException(UnableToLoadTopLevelDomainList::class); + $this->expectExceptionMessage('Could not access the Top Level Domain List URI: `http://www.example.com`.'); - $storage = new RootZoneDatabasePsr18Client($client, $requestFactory); + $storage = new TopLevelDomainListPsr18Client($client, $requestFactory); $storage->get('http://www.example.com'); } @@ -86,11 +86,11 @@ public function createRequest(string $method, $uri): RequestInterface } }; - $this->expectException(UnableToLoadRootZoneDatabase::class); - $this->expectExceptionMessage('Invalid response from Root Zone Database URI: `http://www.example.com`.'); + $this->expectException(UnableToLoadTopLevelDomainList::class); + $this->expectExceptionMessage('Invalid response from Top Level Domain List URI: `http://www.example.com`.'); $this->expectExceptionCode(404); - $storage = new RootZoneDatabasePsr18Client($client, $requestFactory); + $storage = new TopLevelDomainListPsr18Client($client, $requestFactory); $storage->get('http://www.example.com'); } } diff --git a/src/Storage/RootZoneDatabaseStorage.php b/src/Storage/TopLevelDomainListStorage.php similarity index 61% rename from src/Storage/RootZoneDatabaseStorage.php rename to src/Storage/TopLevelDomainListStorage.php index 71ec2379..7fb312d1 100644 --- a/src/Storage/RootZoneDatabaseStorage.php +++ b/src/Storage/TopLevelDomainListStorage.php @@ -4,7 +4,7 @@ namespace Pdp\Storage; -interface RootZoneDatabaseStorage extends RootZoneDatabaseClient +interface TopLevelDomainListStorage extends TopLevelDomainListClient { public function delete(string $uri): bool; } diff --git a/src/Storage/TopLevelDomainListStorageFactory.php b/src/Storage/TopLevelDomainListStorageFactory.php new file mode 100644 index 00000000..60b26fe1 --- /dev/null +++ b/src/Storage/TopLevelDomainListStorageFactory.php @@ -0,0 +1,14 @@ +cache = $cache; $this->client = $client; } - public function get(string $uri): RootZoneDatabase + public function get(string $uri): TopLevelDomainList { - $rootZoneDatabase = $this->cache->fetch($uri); - if (null !== $rootZoneDatabase) { - return $rootZoneDatabase; + $topLevelDomains = $this->cache->fetch($uri); + if (null !== $topLevelDomains) { + return $topLevelDomains; } - $rootZoneDatabase = $this->client->get($uri); + $topLevelDomains = $this->client->get($uri); - $this->cache->remember($uri, $rootZoneDatabase); + $this->cache->remember($uri, $topLevelDomains); - return $rootZoneDatabase; + return $topLevelDomains; } public function delete(string $uri): bool diff --git a/src/Storage/TopLevelDomainsStorageTest.php b/src/Storage/TopLevelDomainsStorageTest.php index 9d49a3e1..e906e52f 100644 --- a/src/Storage/TopLevelDomainsStorageTest.php +++ b/src/Storage/TopLevelDomainsStorageTest.php @@ -4,7 +4,7 @@ namespace Pdp\Storage; -use Pdp\RootZoneDatabase; +use Pdp\TopLevelDomainList; use Pdp\TopLevelDomains; use PHPUnit\Framework\TestCase; use function dirname; @@ -16,13 +16,13 @@ final class TopLevelDomainsStorageTest extends TestCase { public function testIsCanReturnARootZoneDatabaseInstanceFromCache(): void { - $cache = new class() implements RootZoneDatabaseCache { - public function fetch(string $uri): ?RootZoneDatabase + $cache = new class() implements TopLevelDomainListCache { + public function fetch(string $uri): ?TopLevelDomainList { return TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); } - public function remember(string $uri, RootZoneDatabase $rootZoneDatabase): bool + public function remember(string $uri, TopLevelDomainList $topLevelDomainList): bool { return true; } @@ -33,8 +33,8 @@ public function forget(string $uri): bool } }; - $client = new class() implements RootZoneDatabaseClient { - public function get(string $uri): RootZoneDatabase + $client = new class() implements TopLevelDomainListClient { + public function get(string $uri): TopLevelDomainList { return TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); } @@ -47,13 +47,13 @@ public function get(string $uri): RootZoneDatabase public function testIsCanReturnARootZoneDatabaseInstanceFromTheInnerStorage(): void { - $cache = new class() implements RootZoneDatabaseCache { - public function fetch(string $uri): ?RootZoneDatabase + $cache = new class() implements TopLevelDomainListCache { + public function fetch(string $uri): ?TopLevelDomainList { return null; } - public function remember(string $uri, RootZoneDatabase $publicSuffixList): bool + public function remember(string $uri, TopLevelDomainList $publicSuffixList): bool { return true; } @@ -64,8 +64,8 @@ public function forget(string $uri): bool } }; - $client = new class() implements RootZoneDatabaseClient { - public function get(string $uri): RootZoneDatabase + $client = new class() implements TopLevelDomainListClient { + public function get(string $uri): TopLevelDomainList { return TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); } @@ -78,13 +78,13 @@ public function get(string $uri): RootZoneDatabase public function testIsCanDeleteARootZoneDatabaseInstanceFromTheInnerStorage(): void { - $cache = new class() implements RootZoneDatabaseCache { - public function fetch(string $uri): ?RootZoneDatabase + $cache = new class() implements TopLevelDomainListCache { + public function fetch(string $uri): ?TopLevelDomainList { return null; } - public function remember(string $uri, RootZoneDatabase $publicSuffixList): bool + public function remember(string $uri, TopLevelDomainList $publicSuffixList): bool { return true; } @@ -95,8 +95,8 @@ public function forget(string $uri): bool } }; - $client = new class() implements RootZoneDatabaseClient { - public function get(string $uri): RootZoneDatabase + $client = new class() implements TopLevelDomainListClient { + public function get(string $uri): TopLevelDomainList { return TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); } diff --git a/src/RootZoneDatabase.php b/src/TopLevelDomainList.php similarity index 91% rename from src/RootZoneDatabase.php rename to src/TopLevelDomainList.php index b5351ef6..0924f55a 100644 --- a/src/RootZoneDatabase.php +++ b/src/TopLevelDomainList.php @@ -13,7 +13,7 @@ /** * @extends IteratorAggregate */ -interface RootZoneDatabase extends Countable, DomainNameResolver, IteratorAggregate, JsonSerializable +interface TopLevelDomainList extends Countable, DomainNameResolver, IteratorAggregate, JsonSerializable { /** * Returns the Version ID. diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index a7886545..eed038ff 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -10,6 +10,8 @@ use JsonException; use SplTempFileObject; use TypeError; +use function array_flip; +use function array_keys; use function count; use function fclose; use function fopen; @@ -25,7 +27,7 @@ use function trim; use const JSON_THROW_ON_ERROR; -final class TopLevelDomains implements RootZoneDatabase +final class TopLevelDomains implements TopLevelDomainList { private const IANA_DATE_FORMAT = 'D M d H:i:s Y e'; @@ -55,7 +57,7 @@ private function __construct(array $records, string $version, DateTimeImmutable * * @param null|resource $context * - * @throws UnableToLoadRootZoneDatabase If the rules can not be loaded from the path + * @throws UnableToLoadTopLevelDomainList If the rules can not be loaded from the path */ public static function fromPath(string $path, $context = null): self { @@ -66,7 +68,7 @@ public static function fromPath(string $path, $context = null): self $resource = @fopen(...$args); if (false === $resource) { - throw UnableToLoadRootZoneDatabase::dueToInvalidPath($path); + throw UnableToLoadTopLevelDomainList::dueToInvalidPath($path); } /** @var string $content */ @@ -96,13 +98,13 @@ public static function fromString($content): self /** @var DateTimeImmutable $lastUpdated */ $lastUpdated = DateTimeImmutable::createFromFormat(DateTimeInterface::ATOM, $data['lastUpdated']); - return new self($data['records'], $data['version'], $lastUpdated); + return new self(array_flip($data['records']), $data['version'], $lastUpdated); } /** - * Converts the IANA Root Zone Database into a TopLevelDomains associative array. + * Converts the IANA Top Level Domain List into a TopLevelDomains associative array. * - * @throws UnableToLoadRootZoneDatabase if the content is invalid or can not be correctly parsed and converted + *@throws UnableToLoadTopLevelDomainList if the content is invalid or can not be correctly parsed and converted * * @return array{version:string, lastUpdated:string, records:array} */ @@ -126,27 +128,27 @@ public static function parse(string $content): array continue; } - throw UnableToLoadRootZoneDatabase::dueToInvalidLine($line); + throw UnableToLoadTopLevelDomainList::dueToInvalidLine($line); } if (isset($data['version'], $data['lastUpdated'], $data['records'])) { return $data; } - throw UnableToLoadRootZoneDatabase::dueToFailedConversion(); + throw UnableToLoadTopLevelDomainList::dueToFailedConversion(); } /** - * Extract IANA Root Zone Database header info. + * Extract IANA Top Level Domain List header info. * - * @throws UnableToLoadRootZoneDatabase if the Header line is invalid + * @throws UnableToLoadTopLevelDomainList if the Header line is invalid * * @return array{version:string, lastUpdated:string} */ private static function extractHeader(string $content): array { if (1 !== preg_match(self::REGEXP_HEADER_LINE, $content, $matches)) { - throw UnableToLoadRootZoneDatabase::dueToInvalidVersionLine($content); + throw UnableToLoadTopLevelDomainList::dueToInvalidVersionLine($content); } /** @var DateTimeImmutable $date */ @@ -161,14 +163,14 @@ private static function extractHeader(string $content): array /** * Extract IANA Root Zone. * - * @throws UnableToLoadRootZoneDatabase If the Root Zone is invalid + * @throws UnableToLoadTopLevelDomainList If the Root Zone is invalid */ private static function extractRootZone(string $content): string { try { $tld = Suffix::fromIANA($content); } catch (CannotProcessHost $exception) { - throw UnableToLoadRootZoneDatabase::dueToInvalidRootZoneDomain($content, $exception); + throw UnableToLoadTopLevelDomainList::dueToInvalidTopLevelDomain($content, $exception); } return $tld->toString(); @@ -179,17 +181,17 @@ public static function fromJsonString(string $jsonString): self try { $data = json_decode($jsonString, true, 512, JSON_THROW_ON_ERROR); } catch (JsonException $exception) { - throw UnableToLoadRootZoneDatabase::dueToInvalidJson($exception); + throw UnableToLoadTopLevelDomainList::dueToInvalidJson($exception); } if (!isset($data['records'], $data['version'], $data['lastUpdated'])) { - throw UnableToLoadRootZoneDatabase::dueToInvalidHashMap(); + throw UnableToLoadTopLevelDomainList::dueToInvalidHashMap(); } /** @var DateTimeImmutable $lastUpdated */ $lastUpdated = DateTimeImmutable::createFromFormat(DateTimeInterface::ATOM, $data['lastUpdated']); - return new self($data['records'], $data['version'], $lastUpdated); + return new self(array_flip($data['records']), $data['version'], $lastUpdated); } /** @@ -225,7 +227,7 @@ public function isEmpty(): bool */ public function getIterator(): Iterator { - foreach ($this->records as $tld) { + foreach ($this->records as $tld => $int) { yield $tld; } } @@ -237,7 +239,7 @@ public function jsonSerialize(): array { return [ 'version' => $this->version, - 'records' => $this->records, + 'records' => array_keys($this->records), 'lastUpdated' => $this->lastUpdated->format(DateTimeInterface::ATOM), ]; } @@ -288,14 +290,7 @@ private function validateDomain($domain): DomainName private function containsTopLevelDomain(DomainName $domain): bool { - $label = $domain->toAscii()->label(0); - foreach ($this as $tld) { - if ($tld === $label) { - return true; - } - } - - return false; + return isset($this->records[$domain->toAscii()->label(0)]); } /** diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index b06df079..6181a798 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -44,11 +44,11 @@ public function testCreateFromPath(): void /** * @covers ::fromPath - * @covers \Pdp\UnableToLoadRootZoneDatabase + * @covers \Pdp\UnableToLoadTopLevelDomainList */ public function testCreateFromPathThrowsException(): void { - $this->expectException(UnableToLoadRootZoneDatabase::class); + $this->expectException(UnableToLoadTopLevelDomainList::class); TopLevelDomains::fromPath('/foo/bar.dat'); } @@ -65,7 +65,7 @@ public function testFromStringThrowsOnTypeError(): void */ public function testConverterThrowsException(string $content): void { - $this->expectException(UnableToLoadRootZoneDatabase::class); + $this->expectException(UnableToLoadTopLevelDomainList::class); TopLevelDomains::fromString($content); } @@ -159,22 +159,22 @@ public function testJsonMethods(): void /** * @covers ::fromJsonString - * @covers \Pdp\UnableToLoadRootZoneDatabase + * @covers \Pdp\UnableToLoadTopLevelDomainList */ public function testJsonStringFailsWithInvalidJson(): void { - $this->expectException(UnableToLoadRootZoneDatabase::class); + $this->expectException(UnableToLoadTopLevelDomainList::class); TopLevelDomains::fromJsonString(''); } /** * @covers ::fromJsonString - * @covers \Pdp\UnableToLoadRootZoneDatabase + * @covers \Pdp\UnableToLoadTopLevelDomainList */ public function testJsonStringFailsWithMissingIndexes(): void { - $this->expectException(UnableToLoadRootZoneDatabase::class); + $this->expectException(UnableToLoadTopLevelDomainList::class); TopLevelDomains::fromJsonString('{"foo":"bar"}'); } diff --git a/src/UnableToLoadRootZoneDatabase.php b/src/UnableToLoadTopLevelDomainList.php similarity index 64% rename from src/UnableToLoadRootZoneDatabase.php rename to src/UnableToLoadTopLevelDomainList.php index 5c49082b..65bd61a0 100644 --- a/src/UnableToLoadRootZoneDatabase.php +++ b/src/UnableToLoadTopLevelDomainList.php @@ -7,16 +7,16 @@ use InvalidArgumentException; use Throwable; -final class UnableToLoadRootZoneDatabase extends InvalidArgumentException implements CannotProcessHost +final class UnableToLoadTopLevelDomainList extends InvalidArgumentException implements CannotProcessHost { public static function dueToInvalidHashMap(): self { return new self('The decoded hashmap structure is missing at least one of the required properties: `records`, `version` and/or `lastUpdated`.'); } - public static function dueToInvalidRootZoneDomain(string $content, Throwable $exception = null): self + public static function dueToInvalidTopLevelDomain(string $content, Throwable $exception = null): self { - return new self('Invalid Root zone: '.$content, 0, $exception); + return new self('Invalid Top Level Domain: '.$content, 0, $exception); } public static function dueToInvalidVersionLine(string $line): self @@ -26,7 +26,7 @@ public static function dueToInvalidVersionLine(string $line): self public static function dueToFailedConversion(): self { - return new self('Invalid content: TLD conversion failed.'); + return new self('Invalid content: Top Level Domain List conversion failed.'); } public static function dueToInvalidLine(string $line): self @@ -41,16 +41,16 @@ public static function dueToInvalidPath(string $path): self public static function dueToInvalidJson(Throwable $exception): self { - return new self('Failed to JSON decode the Root Zone Database string.', 0, $exception); + return new self('Failed to JSON decode the Top Level Domain List string.', 0, $exception); } public static function dueToUnavailableService(string $uri, Throwable $exception): self { - return new self('Could not access the Root Zone Database URI: `'.$uri.'`.', 0, $exception); + return new self('Could not access the Top Level Domain List URI: `'.$uri.'`.', 0, $exception); } public static function dueToUnexpectedContent(string $uri, int $statusCode): self { - return new self('Invalid response from Root Zone Database URI: `'.$uri.'`.', $statusCode); + return new self('Invalid response from Top Level Domain List URI: `'.$uri.'`.', $statusCode); } } From de59724d0ade98af5f8ad6c20ced2ca35a2f9425 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 12 Dec 2020 23:17:14 +0100 Subject: [PATCH 371/461] Adding Psalm as complementary static code analyzer --- .../{quality-assurance.yaml => build.yaml} | 10 +++-- README.md | 6 ++- composer.json | 11 +++-- psalm.xml | 18 +++++++++ src/DomainNameResolver.php | 4 +- src/DomainTest.php | 22 +++++----- src/IdnaInfoTest.php | 2 +- src/ResolvedDomainTest.php | 33 +++++++-------- src/Rules.php | 23 +++++++---- src/RulesTest.php | 10 ++--- src/Storage/PublicSuffixListPsr16Cache.php | 4 +- src/Storage/TopLevelDomainListPsr16Cache.php | 4 +- src/Storage/TopLevelDomainsStorageTest.php | 4 +- src/SuffixTest.php | 7 ++-- src/SyntaxError.php | 25 +++++++----- src/TopLevelDomains.php | 29 +++++++++----- src/TopLevelDomainsTest.php | 9 ++++- src/UnableToLoadPublicSuffixList.php | 2 +- src/UnableToResolveDomain.php | 40 ++++++------------- 19 files changed, 149 insertions(+), 114 deletions(-) rename .github/workflows/{quality-assurance.yaml => build.yaml} (73%) create mode 100644 psalm.xml diff --git a/.github/workflows/quality-assurance.yaml b/.github/workflows/build.yaml similarity index 73% rename from .github/workflows/quality-assurance.yaml rename to .github/workflows/build.yaml index f0ab9db9..a1908249 100644 --- a/.github/workflows/quality-assurance.yaml +++ b/.github/workflows/build.yaml @@ -1,5 +1,5 @@ --- -name: Quality Assurance +name: Build on: push: ~ pull_request: ~ @@ -21,8 +21,10 @@ jobs: coverage: pcov tools: composer:v2 - run: composer update --no-progress ${{ matrix.composer-flags }} - - run: vendor/bin/php-cs-fixer fix -vvv --diff --dry-run --allow-risky=yes --ansi + - run: composer phpunit + - run: composer phpstan if: ${{ matrix.php == '7.4' }} - - run: vendor/bin/phpstan analyse -l max -c phpstan.neon src --ansi + - run: composer psalm + if: ${{ matrix.php == '7.4' }} + - run: composer phpcs if: ${{ matrix.php == '7.4' }} - - run: vendor/bin/phpunit ${{ matrix.phpunit-flags }} diff --git a/README.md b/README.md index 11705138..9c86b941 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # PHP Domain Parser -**PHP Domain Parser** is domain parser implemented in PHP. +**PHP Domain Parser** is a resource based domain parser implemented in PHP. -![Quality Assurance](https://github.com/jeremykendall/php-domain-parser/workflows/Quality%20Assurance/badge.svg) +[![Build Status][ico-github-actions-build]][link-github-actions-build] [![Total Downloads][ico-packagist]][link-packagist] [![Latest Stable Version][ico-release]][link-release] [![Software License][ico-license]][link-license] @@ -579,10 +579,12 @@ Portions of the `Pdp\Converter` and `Pdp\Rules` are derivative works of the PHP Those parts of this codebase are heavily commented, and I've included a copy of the Apache Software Foundation License 2.0 in this project. +[ico-github-actions-build]: https://img.shields.io/github/workflow/status/jeremykendall/php-domain-parser/Build?style=flat-square [ico-packagist]: https://img.shields.io/packagist/dt/jeremykendall/php-domain-parser.svg?style=flat-square [ico-release]: https://img.shields.io/github/release/jeremykendall/php-domain-parser.svg?style=flat-square [ico-license]: https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square +[link-github-actions-build]: https://github.com/jeremykendall/php-domain-parser/actions?query=workflow%3ABuild [link-packagist]: https://packagist.org/packages/jeremykendall/php-domain-parser [link-release]: https://github.com/jeremykendall/php-domain-parser/releases [link-license]: https://github.com/jeremykendall/php-domain-parser/blob/master/LICENSE diff --git a/composer.json b/composer.json index 85d4133c..21134687 100644 --- a/composer.json +++ b/composer.json @@ -52,9 +52,11 @@ "phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan-strict-rules": "^0.12", "phpunit/phpunit": "^9.3", + "psalm/plugin-phpunit": "^0.15.0", "psr/http-factory": "^1.0", "psr/simple-cache": "^1.0", - "symfony/cache": "^v5.0" + "symfony/cache": "^v5.0", + "vimeo/psalm": "^4.3" }, "suggest": { "psr/http-client-implementation": "To use the storage functionnality which depends on PSR-18", @@ -70,16 +72,19 @@ "scripts": { "phpcs": "php-cs-fixer fix -vvv --diff --dry-run --allow-risky=yes --ansi", "phpstan": "phpstan analyse -l max -c phpstan.neon src --ansi", + "psalm": "psalm --show-info=true", "phpunit": "phpunit --coverage-text", "test": [ - "@phpcs", + "@phpunit", "@phpstan", - "@phpunit" + "@psalm", + "@phpcs" ] }, "scripts-descriptions": { "phpcs": "Runs coding style test suite", "phpstan": "Runs complete codebase static analysis", + "psalm": "Runs complete codebase static analysis", "phpunit": "Runs unit and functional testing", "test": "Runs the complete test suite" }, diff --git a/psalm.xml b/psalm.xml new file mode 100644 index 00000000..b22c0d57 --- /dev/null +++ b/psalm.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + diff --git a/src/DomainNameResolver.php b/src/DomainNameResolver.php index bc76f737..71058e0e 100644 --- a/src/DomainNameResolver.php +++ b/src/DomainNameResolver.php @@ -7,9 +7,9 @@ interface DomainNameResolver { /** - * Returns the effective TLD info for a given domain against an external data source. + * Returns the effective TLD info for a given domain against an data source. * - * If the effective TLD can not be resolved it returns a ResolvedDomainName with a null public suffix + * If the effective TLD can not be resolved it returns a ResolvedDomainName with a null suffix * If the host is not a valid domain it returns a ResolvedDomainName with a null Domain name */ public function resolve(Host $host): ResolvedDomainName; diff --git a/src/DomainTest.php b/src/DomainTest.php index b9a4160c..d62b8b74 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -24,7 +24,7 @@ public function testToAsciiThrowsException(string $domain): void } /** - * @return iterable + * @return iterable */ public function invalidDomainProvider(): iterable { @@ -66,7 +66,7 @@ public function testCountable(?string $domain, int $nbLabels, array $labels): vo } /** - * @return iterable + * @return iterable}> */ public function countableProvider(): iterable { @@ -131,7 +131,7 @@ public function testToIDN( } /** - * @return iterable + * @return iterable */ public function toUnicodeProvider(): iterable { @@ -194,7 +194,7 @@ public function testToAscii( } /** - * @return iterable + * @return iterable */ public function toAsciiProvider(): iterable { @@ -232,14 +232,14 @@ public function toAsciiProvider(): iterable * * @param ?string $expected */ - public function testWithLabelWorks(Domain $domain, int $key, string $label, ?string $expected): void + public function testWithLabelWorks(DomainName $domain, int $key, string $label, ?string $expected): void { $result = $domain->withLabel($key, $label); self::assertSame($expected, $result->value()); } /** - * @return iterable + * @return iterable */ public function withLabelWorksProvider(): iterable { @@ -337,7 +337,7 @@ public function testAppend(string $raw, string $append, string $expected): void } /** - * @return iterable + * @return iterable */ public function validAppend(): iterable { @@ -358,7 +358,7 @@ public function testPrepend(string $raw, string $prepend, string $expected): voi } /** - * @return iterable + * @return iterable */ public function validPrepend(): iterable { @@ -373,14 +373,14 @@ public function validPrepend(): iterable * @dataProvider withoutLabelWorksProvider * @param ?string $expected */ - public function testwithoutLabelWorks(Domain $domain, int $key, ?string $expected): void + public function testwithoutLabelWorks(DomainName $domain, int $key, ?string $expected): void { $result = $domain->withoutLabel($key); self::assertSame($expected, $result->value()); } /** - * @return iterable + * @return iterable */ public function withoutLabelWorksProvider(): iterable { @@ -444,7 +444,7 @@ public function testResolveWorksWithCustomIDNAOptions( } /** - * @return iterable + * @return iterable> */ public function resolveCustomIDNAOptionsProvider(): iterable { diff --git a/src/IdnaInfoTest.php b/src/IdnaInfoTest.php index 4db9ea78..0f9ca310 100644 --- a/src/IdnaInfoTest.php +++ b/src/IdnaInfoTest.php @@ -35,7 +35,7 @@ public function testInvalidSyntaxAfterIDNConversion(): void try { Idna::toAscii('%00.com', Idna::IDNA2008_ASCII); } catch (SyntaxError $exception) { - $result = $exception->fetchIdnaResult(); + $result = $exception->idnaInfo(); self::assertInstanceOf(IdnaInfo::class, $result); self::assertSame(Idna::ERROR_DISALLOWED, $result->errors()); self::assertIsString($result->error(Idna::ERROR_DISALLOWED)); diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 341b4e04..8bde6f4e 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -43,7 +43,7 @@ public function testItThrowsExceptionMisMatchPublicSuffixDomain(?string $domain, } /** - * @return iterable + * @return iterable */ public function provideWrongConstructor(): iterable { @@ -78,7 +78,7 @@ public function testItImplementsCountable(?string $domain, int $nbLabels): void } /** - * @return iterable + * @return iterable */ public function countableProvider(): iterable { @@ -118,7 +118,7 @@ public function testItCanBeConvertedToUnicode( } /** - * @return iterable + * @return iterable */ public function toUnicodeProvider(): iterable { @@ -210,7 +210,7 @@ public function testItCanBeConvertedToAscii( } /** - * @return iterable + * @return iterable */ public function toAsciiProvider(): iterable { @@ -261,10 +261,9 @@ public function toAsciiProvider(): iterable /** * @dataProvider withSubDomainWorksProvider * - * @param mixed $subdomain the subdomain to add - * @param ?string $expected + * @param DomainName|string|null $subdomain the subdomain to add */ - public function testItCanHaveItsSubDomainChanged(ResolvedDomain $domain, $subdomain, ?string $expected): void + public function testItCanHaveItsSubDomainChanged(ResolvedDomain $domain, $subdomain, string $expected = null): void { $result = $domain->withSubDomain($subdomain); @@ -274,7 +273,7 @@ public function testItCanHaveItsSubDomainChanged(ResolvedDomain $domain, $subdom } /** - * @return iterable + * @return iterable */ public function withSubDomainWorksProvider(): iterable { @@ -359,7 +358,7 @@ public function testItCanChangeItsSuffix( } /** - * @return iterable + * @return iterable */ public function withPublicSuffixWorksProvider(): iterable { @@ -450,19 +449,15 @@ public function testItCanThrowsDuringSuffixChangesIfTheDomainHasNotSuffix(): voi /** * @dataProvider resolveCustomIDNAOptionsProvider - * @param ?string $expectedContent - * @param ?string $expectedAscii - * @param ?string $expectedUnicode - * @param ?string $expectedRegistrable * @param ?string $expectedSubDomain */ public function testItCanWorksWithIDNAOptions( string $domainName, string $publicSuffix, - ?string $expectedContent, - ?string $expectedAscii, - ?string $expectedUnicode, - ?string $expectedRegistrable, + string $expectedContent, + string $expectedAscii, + string $expectedUnicode, + string $expectedRegistrable, ?string $expectedSubDomain ): void { $resolvedDomain = ResolvedDomain::fromICANN($domainName, count(Domain::fromIDNA2008($publicSuffix))); @@ -475,7 +470,7 @@ public function testItCanWorksWithIDNAOptions( } /** - * @return iterable + * @return iterable */ public function resolveCustomIDNAOptionsProvider(): iterable { @@ -544,7 +539,7 @@ public function testWithSecondLevelDomain( } /** - * @return iterable + * @return iterable */ public function withSldWorksProvider(): iterable { diff --git a/src/Rules.php b/src/Rules.php index 6f398df0..7223b5b4 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -65,12 +65,7 @@ private function __construct(array $rules) */ public static function fromPath(string $path, $context = null): self { - $args = [$path, 'r', false]; - if (null !== $context) { - $args[] = $context; - } - - $resource = @fopen(...$args); + $resource = self::getResource($path, $context); if (false === $resource) { throw UnableToLoadPublicSuffixList::dueToInvalidPath($path); } @@ -82,6 +77,20 @@ public static function fromPath(string $path, $context = null): self return self::fromString($content); } + /** + * @param null|resource $context + * + * @return false|resource + */ + private static function getResource(string $path, $context = null) + { + if (null === $context) { + return @fopen($path, 'r'); + } + + return @fopen($path, 'r', false, $context); + } + /** * Returns a new instance from a string. * @@ -220,7 +229,7 @@ public function resolve($host): ResolvedDomainName try { return $this->getCookieDomain($host); } catch (UnableToResolveDomain $exception) { - return ResolvedDomain::fromUnknown($exception->getDomain()); + return ResolvedDomain::fromUnknown($exception->domain()); } catch (SyntaxError $exception) { return ResolvedDomain::fromUnknown(Domain::fromIDNA2008(null)); } diff --git a/src/RulesTest.php b/src/RulesTest.php index 8381e25f..e707234c 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -278,7 +278,7 @@ public function testGetDomain(?string $publicSuffix, ?string $registrableDomain, } /** - * @return iterable + * @return iterable */ public function parseDataProvider(): iterable { @@ -401,7 +401,7 @@ public function testGetPublicSuffixThrowsInvalidDomainException(string $domain): } /** - * @return iterable + * @return iterable */ public function invalidDomainParseProvider(): iterable { @@ -427,7 +427,7 @@ public function testGetPublicSuffixThrowsInvalidHostException(string $domain): v } /** - * @return iterable + * @return iterable */ public function invalidHostParseProvider(): iterable { @@ -456,7 +456,7 @@ public function testPublicSuffixSection(?string $domain, ?string $expected): voi } /** - * @return iterable + * @return iterable */ public function validPublicSectionProvider(): iterable { @@ -613,7 +613,7 @@ public function testEffectiveTLDResolution(string $host, string $cookieETLD, str } /** - * @return iterable + * @return iterable */ public function effectiveTLDProvider(): iterable { diff --git a/src/Storage/PublicSuffixListPsr16Cache.php b/src/Storage/PublicSuffixListPsr16Cache.php index 8a28e3a6..927b87a8 100644 --- a/src/Storage/PublicSuffixListPsr16Cache.php +++ b/src/Storage/PublicSuffixListPsr16Cache.php @@ -10,8 +10,8 @@ use DateTimeZone; use InvalidArgumentException; use Pdp\PublicSuffixList; -use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; +use Throwable; use TypeError; use function filter_var; use function is_string; @@ -110,7 +110,7 @@ public function remember(string $uri, PublicSuffixList $publicSuffixList): bool { try { return $this->cache->set($this->cacheKey($uri), $publicSuffixList, $this->cacheTtl); - } catch (CacheException $exception) { + } catch (Throwable $exception) { return false; } } diff --git a/src/Storage/TopLevelDomainListPsr16Cache.php b/src/Storage/TopLevelDomainListPsr16Cache.php index 594d0109..ce7ed70c 100644 --- a/src/Storage/TopLevelDomainListPsr16Cache.php +++ b/src/Storage/TopLevelDomainListPsr16Cache.php @@ -10,8 +10,8 @@ use DateTimeZone; use InvalidArgumentException; use Pdp\TopLevelDomainList; -use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; +use Throwable; use TypeError; use function filter_var; use function is_string; @@ -108,7 +108,7 @@ public function remember(string $uri, TopLevelDomainList $topLevelDomainList): b { try { return $this->cache->set($this->cacheKey($uri), $topLevelDomainList, $this->cacheTtl); - } catch (CacheException $exception) { + } catch (Throwable $exception) { return false; } } diff --git a/src/Storage/TopLevelDomainsStorageTest.php b/src/Storage/TopLevelDomainsStorageTest.php index e906e52f..61ab96ae 100644 --- a/src/Storage/TopLevelDomainsStorageTest.php +++ b/src/Storage/TopLevelDomainsStorageTest.php @@ -53,7 +53,7 @@ public function fetch(string $uri): ?TopLevelDomainList return null; } - public function remember(string $uri, TopLevelDomainList $publicSuffixList): bool + public function remember(string $uri, TopLevelDomainList $topLevelDomainList): bool { return true; } @@ -84,7 +84,7 @@ public function fetch(string $uri): ?TopLevelDomainList return null; } - public function remember(string $uri, TopLevelDomainList $publicSuffixList): bool + public function remember(string $uri, TopLevelDomainList $topLevelDomainList): bool { return true; } diff --git a/src/SuffixTest.php b/src/SuffixTest.php index 827198d7..732c81c9 100644 --- a/src/SuffixTest.php +++ b/src/SuffixTest.php @@ -35,7 +35,6 @@ public function testPSToUnicodeWithUrlEncode(): void self::assertSame('bébe', Suffix::fromUnknown('b%C3%A9be')->toUnicode()->value()); } - /** * @dataProvider invalidPublicSuffixProvider */ @@ -47,7 +46,7 @@ public function testConstructorThrowsException(string $publicSuffix): void } /** - * @return iterable + * @return iterable> */ public function invalidPublicSuffixProvider(): iterable { @@ -117,7 +116,7 @@ public function testConversionReturnsTheSameInstance(?string $publicSuffix): voi } /** - * @return iterable + * @return iterable */ public function conversionReturnsTheSameInstanceProvider(): iterable { @@ -146,7 +145,7 @@ public function testCountable(?string $domain, int $nbLabels): void } /** - * @return iterable + * @return iterable}> */ public function countableProvider(): iterable { diff --git a/src/SyntaxError.php b/src/SyntaxError.php index 3fb6e55f..daca28ca 100644 --- a/src/SyntaxError.php +++ b/src/SyntaxError.php @@ -6,13 +6,14 @@ use InvalidArgumentException; -class SyntaxError extends InvalidArgumentException implements CannotProcessHost +final class SyntaxError extends InvalidArgumentException implements CannotProcessHost { - private ?IdnaInfo $idnaResult; + private ?IdnaInfo $idnaInfo; - public function fetchIdnaResult(): ?IdnaInfo + private function __construct(string $message, IdnaInfo $idnaInfo = null) { - return $this->idnaResult; + parent::__construct($message); + $this->idnaInfo = $idnaInfo; } public static function dueToInvalidCharacters(string $domain): self @@ -25,21 +26,18 @@ public static function dueToInvalidLength(string $domain): self return new self('The host `'.$domain.'` is invalid: its length is longer than 255 bytes in its storage form.'); } - public static function dueToIDNAError(string $domain, IdnaInfo $result): self + public static function dueToIDNAError(string $domain, IdnaInfo $idnaInfo): self { - $exception = new self('The host `'.$domain.'` is invalid for IDN conversion.'); - $exception->idnaResult = $result; - - return $exception; + return new self('The host `'.$domain.'` is invalid for IDN conversion.', $idnaInfo); } public static function dueToInvalidSuffix(Host $publicSuffix, string $type = ''): self { if ('' === $type) { - return new self('The suffix `"'.$publicSuffix->value() ?? 'NULL'.'"` is invalid.'); + return new self('The suffix `"'.($publicSuffix->value() ?? 'NULL').'"` is invalid.'); } - return new self('The suffix `"'.$publicSuffix->value() ?? 'NULL'.'"` is an invalid `'.$type.'` suffix.'); + return new self('The suffix `"'.($publicSuffix->value() ?? 'NULL').'"` is an invalid `'.$type.'` suffix.'); } public static function dueToUnsupportedType(string $domain): self @@ -51,4 +49,9 @@ public static function dueToInvalidLabelKey(Host $domain, int $key): self { return new self('the given key `'.$key.'` is invalid for the domain `'.($domain->value() ?? 'NULL').'`.'); } + + public function idnaInfo(): ?IdnaInfo + { + return $this->idnaInfo; + } } diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index eed038ff..8b1d7cb7 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -38,12 +38,12 @@ final class TopLevelDomains implements TopLevelDomainList private string $version; /** - * @var array + * @var array */ private array $records; /** - * @param array $records + * @param array $records */ private function __construct(array $records, string $version, DateTimeImmutable $lastUpdated) { @@ -61,12 +61,7 @@ private function __construct(array $records, string $version, DateTimeImmutable */ public static function fromPath(string $path, $context = null): self { - $args = [$path, 'r', false]; - if (null !== $context) { - $args[] = $context; - } - - $resource = @fopen(...$args); + $resource = self::getResource($path, $context); if (false === $resource) { throw UnableToLoadTopLevelDomainList::dueToInvalidPath($path); } @@ -78,6 +73,20 @@ public static function fromPath(string $path, $context = null): self return self::fromString($content); } + /** + * @param null|resource $context + * + * @return false|resource + */ + private static function getResource(string $path, $context = null) + { + if (null === $context) { + return @fopen($path, 'r'); + } + + return @fopen($path, 'r', false, $context); + } + /** * Returns a new instance from a string. * @@ -195,7 +204,7 @@ public static function fromJsonString(string $jsonString): self } /** - * @param array{records:array, version:string, lastUpdated:DateTimeImmutable} $properties + * @param array{records:array, version:string, lastUpdated:DateTimeImmutable} $properties */ public static function __set_state(array $properties): self { @@ -256,7 +265,7 @@ public function resolve($host): ResolvedDomainName } return ResolvedDomain::fromUnknown($domain); } catch (UnableToResolveDomain $exception) { - return ResolvedDomain::fromUnknown($exception->getDomain()); + return ResolvedDomain::fromUnknown($exception->domain()); } catch (SyntaxError $exception) { return ResolvedDomain::fromUnknown(null); } diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 6181a798..8fe37b57 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -71,7 +71,7 @@ public function testConverterThrowsException(string $content): void } /** - * @return iterable + * @return iterable */ public function invalidContentProvider(): iterable { @@ -193,6 +193,13 @@ public function testGetterProperties(): void self::assertArrayHasKey('lastUpdated', $topLevelDomains->jsonSerialize()); } + public function testIterator(): void + { + foreach (self::$topLevelDomains as $tld) { + self::assertStringNotContainsString($tld, '.'); + } + } + /** * @dataProvider validDomainProvider * diff --git a/src/UnableToLoadPublicSuffixList.php b/src/UnableToLoadPublicSuffixList.php index 193ef498..8ff06727 100644 --- a/src/UnableToLoadPublicSuffixList.php +++ b/src/UnableToLoadPublicSuffixList.php @@ -21,7 +21,7 @@ public static function dueToInvalidJson(Throwable $exception): self public static function dueToInvalidRule(?string $line, Throwable $exception): self { - return new self('The following rule "'.$line ?? 'NULL'.'" could not be processed because it is invalid.', 0, $exception); + return new self('The following rule "'.($line ?? 'NULL').'" could not be processed because it is invalid.', 0, $exception); } public static function dueToCorruptedSection(): self diff --git a/src/UnableToResolveDomain.php b/src/UnableToResolveDomain.php index 7a3c811f..496e052e 100644 --- a/src/UnableToResolveDomain.php +++ b/src/UnableToResolveDomain.php @@ -8,54 +8,40 @@ final class UnableToResolveDomain extends InvalidArgumentException implements CannotProcessHost { - private DomainName $domain; + private ?DomainName $domain; - public static function dueToInvalidSecondLevelDomain(DomainName $domain): self + private function __construct(string $message, ?DomainName $domain = null) { - $value = $domain->value(); - if (null === $value) { - $value = 'NULL'; - } - - $exception = new self('The submitted Second Level Domain is invalid `'.$value.'`; it should contains only one label.'); - $exception->domain = $domain; + parent::__construct($message); + $this->domain = $domain; + } - return $exception; + public static function dueToInvalidSecondLevelDomain(DomainName $domain): self + { + return new self('The submitted Second Level Domain is invalid `'.($domain->value() ?? 'NULL').'`; it should contains only one label.', $domain); } public static function dueToIdenticalValue(DomainName $domain): self { - $exception = new self('The public suffix and the domain name are is identical `'.$domain->toString().'`.'); - $exception->domain = $domain; - - return $exception; + return new self('The public suffix and the domain name are is identical `'.$domain->toString().'`.', $domain); } public static function dueToMissingSuffix(DomainName $domain, string $type): self { - $exception = new self('The domain "'.$domain->value().'" does not contain a "'.$type.'" TLD.'); - $exception->domain = $domain; - - return $exception; + return new self('The domain "'.($domain->value() ?? 'NULL').'" does not contain a "'.$type.'" TLD.', $domain); } public static function dueToUnresolvableDomain(DomainName $domain): self { - $exception = new self('The domain "'.$domain->value().'" can not contain a public suffix.'); - $exception->domain = $domain; - - return $exception; + return new self('The domain "'.($domain->value() ?? 'NULL').'" can not contain a public suffix.', $domain); } public static function dueToMissingRegistrableDomain(DomainName $domain): self { - $exception = new self('A subdomain can not be added to a domain "'.$domain->value().'" without a registrable domain part.'); - $exception->domain = $domain; - - return $exception; + return new self('A subdomain can not be added to a domain "'.($domain->value() ?? 'NULL').'" without a registrable domain part.', $domain); } - public function getDomain(): DomainName + public function domain(): ?DomainName { return $this->domain; } From 84c87c393763364af60906d6bf8bfb129a6d6745 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 13 Dec 2020 11:11:44 +0100 Subject: [PATCH 372/461] Remove JsonSerializable interface --- README.md | 4 ---- src/PublicSuffixList.php | 11 +--------- src/{Storage => }/ResourceUri.php | 2 +- src/Rules.php | 27 ----------------------- src/RulesTest.php | 34 ----------------------------- src/Storage/PsrStorageFactory.php | 1 + src/TopLevelDomainList.php | 10 +-------- src/TopLevelDomains.php | 34 ----------------------------- src/TopLevelDomainsTest.php | 36 ------------------------------- 9 files changed, 4 insertions(+), 155 deletions(-) rename src/{Storage => }/ResourceUri.php (91%) diff --git a/README.md b/README.md index 9c86b941..9ebb6932 100644 --- a/README.md +++ b/README.md @@ -140,14 +140,10 @@ $topLevelDomains->getIANADomain('com'); To instantiate each domain resolver you can use the following named constructor: - `fromString`: instantiate the resolver from a inline string representing the data source; -- `fromJsonString`: instantiate the resolver from a json string representing the data source; - `fromPath`: instantiate the resolver from a local path or online URL by relying on `fopen`; **If the instantiation does not work an exception will be thrown.** -Once instantiated, you can always convert the data source in a json encoded string as both -resolver exposes the `JsonSerialize` method. - **WARNING:** **You should never resolve domain name this way in production, without, at diff --git a/src/PublicSuffixList.php b/src/PublicSuffixList.php index 717e48be..b63b64c6 100644 --- a/src/PublicSuffixList.php +++ b/src/PublicSuffixList.php @@ -4,17 +4,8 @@ namespace Pdp; -use JsonSerializable; - -interface PublicSuffixList extends DomainNameResolver, JsonSerializable +interface PublicSuffixList extends DomainNameResolver { - /** - * Returns an array representation of the Public Suffix List Rules JSON serializable. - * - * @return array> - */ - public function jsonSerialize(): array; - /** * Returns PSL info for a given domain against the PSL rules for cookie domain detection. * diff --git a/src/Storage/ResourceUri.php b/src/ResourceUri.php similarity index 91% rename from src/Storage/ResourceUri.php rename to src/ResourceUri.php index ffd2dec2..1e57d8b2 100644 --- a/src/Storage/ResourceUri.php +++ b/src/ResourceUri.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Pdp\Storage; +namespace Pdp; interface ResourceUri { diff --git a/src/Rules.php b/src/Rules.php index 7223b5b4..f072bcf9 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -4,7 +4,6 @@ namespace Pdp; -use JsonException; use SplTempFileObject; use TypeError; use function array_pop; @@ -13,16 +12,13 @@ use function fclose; use function fopen; use function gettype; -use function is_array; use function is_object; use function is_string; -use function json_decode; use function method_exists; use function preg_match; use function stream_get_contents; use function strpos; use function substr; -use const JSON_THROW_ON_ERROR; final class Rules implements PublicSuffixList { @@ -190,21 +186,6 @@ private static function addRule(array $list, array $ruleParts): array return $list; } - public static function fromJsonString(string $jsonString): self - { - try { - $data = json_decode($jsonString, true, 512, JSON_THROW_ON_ERROR); - } catch (JsonException $exception) { - throw UnableToLoadPublicSuffixList::dueToInvalidJson($exception); - } - - if (!is_array($data[self::ICANN_DOMAINS]) || !is_array($data[self::PRIVATE_DOMAINS])) { - throw UnableToLoadPublicSuffixList::dueToCorruptedSection(); - } - - return new self($data); - } - /** * @param array{rules:array{ICANN_DOMAINS:array,PRIVATE_DOMAINS:array}} $properties */ @@ -213,14 +194,6 @@ public static function __set_state(array $properties): self return new self($properties['rules']); } - /** - * @return array> - */ - public function jsonSerialize(): array - { - return $this->rules; - } - /** * @param mixed $host a type that supports instantiating a Domain from. */ diff --git a/src/RulesTest.php b/src/RulesTest.php index e707234c..6b62c818 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -61,40 +61,6 @@ public function testFromStringThrowsOnTypeError(): void Rules::fromString(new DateTimeImmutable()); } - /** - * @covers ::jsonSerialize - * @covers ::fromJsonString - */ - public function testJsonMethods(): void - { - /** @var string $data */ - $data = json_encode(self::$rules); - - self::assertEquals(self::$rules, Rules::fromJsonString($data)); - } - - /** - * @covers ::fromJsonString - * @covers \Pdp\UnableToLoadPublicSuffixList - */ - public function testJsonStringFailsWithInvalidJson(): void - { - $this->expectException(UnableToLoadPublicSuffixList::class); - - Rules::fromJsonString(''); - } - - /** - * @covers ::fromJsonString - * @covers \Pdp\UnableToLoadPublicSuffixList - */ - public function testJsonStringFailsWithMissingIndexesCollection(): void - { - $this->expectException(UnableToLoadPublicSuffixList::class); - - Rules::fromJsonString('{"ICANN_DOMAINS":"foo","PRIVATE_DOMAINS":"bar"}'); - } - public function testDomainInternalPhpMethod(): void { $generateRules = eval('return '.var_export(self::$rules, true).';'); diff --git a/src/Storage/PsrStorageFactory.php b/src/Storage/PsrStorageFactory.php index 313ece50..253f7a96 100644 --- a/src/Storage/PsrStorageFactory.php +++ b/src/Storage/PsrStorageFactory.php @@ -4,6 +4,7 @@ namespace Pdp\Storage; +use Pdp\ResourceUri; use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestFactoryInterface; use Psr\SimpleCache\CacheInterface; diff --git a/src/TopLevelDomainList.php b/src/TopLevelDomainList.php index 0924f55a..cb1cb5a0 100644 --- a/src/TopLevelDomainList.php +++ b/src/TopLevelDomainList.php @@ -8,12 +8,11 @@ use DateTimeImmutable; use Iterator; use IteratorAggregate; -use JsonSerializable; /** * @extends IteratorAggregate */ -interface TopLevelDomainList extends Countable, DomainNameResolver, IteratorAggregate, JsonSerializable +interface TopLevelDomainList extends Countable, DomainNameResolver, IteratorAggregate { /** * Returns the Version ID. @@ -40,13 +39,6 @@ public function isEmpty(): bool; */ public function getIterator(): Iterator; - /** - * Returns an array representation of the list. - * - * @return array{version:string, records:array, lastUpdated:string} - */ - public function jsonSerialize(): array; - /** * Returns PSL info for a given domain against the PSL rules for ICANN domain detection. * diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 8b1d7cb7..68392bc3 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -7,11 +7,9 @@ use DateTimeImmutable; use DateTimeInterface; use Iterator; -use JsonException; use SplTempFileObject; use TypeError; use function array_flip; -use function array_keys; use function count; use function fclose; use function fopen; @@ -19,13 +17,11 @@ use function in_array; use function is_object; use function is_string; -use function json_decode; use function method_exists; use function preg_match; use function stream_get_contents; use function strpos; use function trim; -use const JSON_THROW_ON_ERROR; final class TopLevelDomains implements TopLevelDomainList { @@ -185,24 +181,6 @@ private static function extractRootZone(string $content): string return $tld->toString(); } - public static function fromJsonString(string $jsonString): self - { - try { - $data = json_decode($jsonString, true, 512, JSON_THROW_ON_ERROR); - } catch (JsonException $exception) { - throw UnableToLoadTopLevelDomainList::dueToInvalidJson($exception); - } - - if (!isset($data['records'], $data['version'], $data['lastUpdated'])) { - throw UnableToLoadTopLevelDomainList::dueToInvalidHashMap(); - } - - /** @var DateTimeImmutable $lastUpdated */ - $lastUpdated = DateTimeImmutable::createFromFormat(DateTimeInterface::ATOM, $data['lastUpdated']); - - return new self(array_flip($data['records']), $data['version'], $lastUpdated); - } - /** * @param array{records:array, version:string, lastUpdated:DateTimeImmutable} $properties */ @@ -241,18 +219,6 @@ public function getIterator(): Iterator } } - /** - * @return array{version:string, records:array, lastUpdated:string} - */ - public function jsonSerialize(): array - { - return [ - 'version' => $this->version, - 'records' => array_keys($this->records), - 'lastUpdated' => $this->lastUpdated->format(DateTimeInterface::ATOM), - ]; - } - /** * @param mixed $host a type that supports instantiating a Domain from. */ diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 8fe37b57..fb427ec5 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -9,7 +9,6 @@ use PHPUnit\Framework\TestCase; use TypeError; use function dirname; -use function json_encode; /** * @coversDefaultClass \Pdp\TopLevelDomains @@ -145,40 +144,6 @@ public function testSetState(): void self::assertEquals(self::$topLevelDomains, $topLevelDomains); } - /** - * @covers ::jsonSerialize - * @covers ::fromJsonString - */ - public function testJsonMethods(): void - { - /** @var string $data */ - $data = json_encode(self::$topLevelDomains); - - self::assertEquals(self::$topLevelDomains, TopLevelDomains::fromJsonString($data)); - } - - /** - * @covers ::fromJsonString - * @covers \Pdp\UnableToLoadTopLevelDomainList - */ - public function testJsonStringFailsWithInvalidJson(): void - { - $this->expectException(UnableToLoadTopLevelDomainList::class); - - TopLevelDomains::fromJsonString(''); - } - - /** - * @covers ::fromJsonString - * @covers \Pdp\UnableToLoadTopLevelDomainList - */ - public function testJsonStringFailsWithMissingIndexes(): void - { - $this->expectException(UnableToLoadTopLevelDomainList::class); - - TopLevelDomains::fromJsonString('{"foo":"bar"}'); - } - public function testGetterProperties(): void { $topLevelDomains = TopLevelDomains::fromPath(dirname(__DIR__).'/test_data/root_zones.dat'); @@ -190,7 +155,6 @@ public function testGetterProperties(): void $topLevelDomains->lastUpdated() ); self::assertFalse($topLevelDomains->isEmpty()); - self::assertArrayHasKey('lastUpdated', $topLevelDomains->jsonSerialize()); } public function testIterator(): void From 9e3bb336375fa13ef353387c1f86d3135ca0c667 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 13 Dec 2020 14:36:24 +0100 Subject: [PATCH 373/461] Update the UPGRADING guide --- UPGRADING.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/UPGRADING.md b/UPGRADING.md index ffc68204..a0a21d76 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -95,9 +95,9 @@ contains a syntax error. ```diff resolve('####'); //throws an Exception -+ $result = $rootZoneDatabase->resolve('####'); //returns a ResolvedDomain object +/** @var TopLevelDomains $topLevelDomain */ +- $result = $topLevelDomain->resolve('####'); //throws an Exception ++ $result = $topLevelDomain->resolve('####'); //returns a ResolvedDomain object ``` #### Strict domain resolution @@ -109,7 +109,7 @@ of returning a response object. ```diff getICANNDomain('toto.foobar')->isICANN(); //returns false - $rules->getPrivateDomain('ulb.ac.be')->isPrivate(); //returns false + $rules->getICANNDomain('toto.foobar'); //will throw an exception @@ -140,7 +140,7 @@ need to use on of the two (2) named constructor `Domain::fromIDNA2008` or #### Methods renamed - The `create` prefix is removed from all named constructors. -- The `get` prefix is removed from `RootZoneDatabase` methods. +- The `get` prefix is removed from `TopLevelDomains` methods. ```diff getVersion(); //returns 2018082200 -- $rootZoneDatabase->getModifiedDate(); //returns \DateTimeImmutable object +- $topLevelDomains = TopLevelDomains::createFromString($rootZoneInlineContent); +- $topLevelDomains->getVersion(); //returns 2018082200 +- $topLevelDomains->getModifiedDate(); //returns \DateTimeImmutable object + $publicSuffixList = Rules::fromPath('path/to/public-suffix-data.dat'); -+ $rootZoneDatabase = TopLevelDomains::fromString($rootZoneInlineContent); -+ $rootZoneDatabase->version(); //returns 2018082200 -+ $rootZoneDatabase->lastUpdated(); //returns \DateTimeImmutable object ++ $topLevelDomains = TopLevelDomains::fromString($rootZoneInlineContent); ++ $topLevelDomains->version(); //returns 2018082200 ++ $topLevelDomains->lastUpdated(); //returns \DateTimeImmutable object ``` #### Resource manager system @@ -177,7 +177,7 @@ The resource manager system (containing caching and refreshing resource) is remo - `DomainInterface` is removed use `DomainName` or `ResolvedDomainName` instead. - `Domain::isResolvable` is removed without replacement. - `Domain::resolve` is removed without replacement. -- `Rules::getPublicSuffix` is removed use `ResolvedDomain::publicSuffix` instead. +- `Rules::getPublicSuffix` is removed use `ResolvedDomain::suffix` instead. - All v5 IDNA related methods are removed, IDNA is fully handle within the `Domain` object. #### Methods return type changed From 12626462fef62d669675a92303933461364e01ad Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 13 Dec 2020 14:53:11 +0100 Subject: [PATCH 374/461] Improve decoupling resource retrieving and parsing --- src/Domain.php | 2 +- src/Rules.php | 33 ++---------- src/RulesTest.php | 2 +- src/Storage/PublicSuffixListPsr18Client.php | 6 +-- .../PublicSuffixListPsr18ClientTest.php | 10 ++-- src/Storage/TopLevelDomainListPsr18Client.php | 6 +-- .../TopLevelDomainListPsr18ClientTest.php | 10 ++-- src/Stream.php | 50 +++++++++++++++++++ src/SyntaxError.php | 4 +- src/TopLevelDomains.php | 46 ++++------------- src/TopLevelDomainsTest.php | 3 +- src/UnableToLoadPublicSuffixList.php | 25 ---------- src/UnableToLoadResource.php | 26 ++++++++++ src/UnableToLoadTopLevelDomainList.php | 25 ---------- 14 files changed, 114 insertions(+), 134 deletions(-) create mode 100644 src/Stream.php create mode 100644 src/UnableToLoadResource.php diff --git a/src/Domain.php b/src/Domain.php index b82ad28f..9e6ada35 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -151,7 +151,7 @@ private function parseValue($domain): ?string // if the domain name does not contains UTF-8 chars then it is malformed if (1 !== preg_match(self::REGEXP_IDN_PATTERN, $formattedDomain)) { - throw SyntaxError::dueToInvalidLength($domain); + throw SyntaxError::dueToMalformedValue($domain); } return $this->domainToUnicode($this->domainToAscii($formattedDomain)); diff --git a/src/Rules.php b/src/Rules.php index f072bcf9..34d622b5 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -9,14 +9,11 @@ use function array_pop; use function count; use function explode; -use function fclose; -use function fopen; use function gettype; use function is_object; use function is_string; use function method_exists; use function preg_match; -use function stream_get_contents; use function strpos; use function substr; @@ -57,40 +54,20 @@ private function __construct(array $rules) * * @param null|resource $context * - * @throws UnableToLoadPublicSuffixList If the rules can not be loaded from the path + * @throws UnableToLoadResource If the rules can not be loaded from the path + * @throws UnableToLoadPublicSuffixList If the rules contains in the resource are invalid */ public static function fromPath(string $path, $context = null): self { - $resource = self::getResource($path, $context); - if (false === $resource) { - throw UnableToLoadPublicSuffixList::dueToInvalidPath($path); - } - - /** @var string $content */ - $content = stream_get_contents($resource); - fclose($resource); - - return self::fromString($content); - } - - /** - * @param null|resource $context - * - * @return false|resource - */ - private static function getResource(string $path, $context = null) - { - if (null === $context) { - return @fopen($path, 'r'); - } - - return @fopen($path, 'r', false, $context); + return self::fromString(Stream::getContentAsString($path, $context)); } /** * Returns a new instance from a string. * * @param object|string $content a string or an object which exposes the __toString method + * + * @throws UnableToLoadPublicSuffixList If the rules contains in the resource are invalid */ public static function fromString($content): self { diff --git a/src/RulesTest.php b/src/RulesTest.php index 6b62c818..c9216a42 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -42,7 +42,7 @@ public function testCreateFromPath(): void public function testCreateFromPathThrowsException(): void { - $this->expectException(UnableToLoadPublicSuffixList::class); + $this->expectException(UnableToLoadResource::class); Rules::fromPath('/foo/bar.dat'); } diff --git a/src/Storage/PublicSuffixListPsr18Client.php b/src/Storage/PublicSuffixListPsr18Client.php index ae41b748..165254b0 100644 --- a/src/Storage/PublicSuffixListPsr18Client.php +++ b/src/Storage/PublicSuffixListPsr18Client.php @@ -6,7 +6,7 @@ use Pdp\PublicSuffixList; use Pdp\Rules; -use Pdp\UnableToLoadPublicSuffixList; +use Pdp\UnableToLoadResource; use Psr\Http\Client\ClientExceptionInterface; use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestFactoryInterface; @@ -29,11 +29,11 @@ public function get(string $uri): PublicSuffixList try { $response = $this->client->sendRequest($request); } catch (ClientExceptionInterface $exception) { - throw UnableToLoadPublicSuffixList::dueToUnavailableService($uri, $exception); + throw UnableToLoadResource::dueToUnavailableService($uri, $exception); } if (400 <= $response->getStatusCode()) { - throw UnableToLoadPublicSuffixList::dueToUnexpectedContent($uri, $response->getStatusCode()); + throw UnableToLoadResource::dueToUnexpectedStatusCode($uri, $response->getStatusCode()); } return Rules::fromString($response->getBody()); diff --git a/src/Storage/PublicSuffixListPsr18ClientTest.php b/src/Storage/PublicSuffixListPsr18ClientTest.php index 37370756..c90dd9e1 100644 --- a/src/Storage/PublicSuffixListPsr18ClientTest.php +++ b/src/Storage/PublicSuffixListPsr18ClientTest.php @@ -8,7 +8,7 @@ use GuzzleHttp\Psr7\Request; use GuzzleHttp\Psr7\Response; use Pdp\Rules; -use Pdp\UnableToLoadPublicSuffixList; +use Pdp\UnableToLoadResource; use PHPUnit\Framework\TestCase; use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestFactoryInterface; @@ -62,8 +62,8 @@ public function createRequest(string $method, $uri): RequestInterface } }; - $this->expectException(UnableToLoadPublicSuffixList::class); - $this->expectExceptionMessage('Could not access the Public Suffix List URI: `http://www.example.com`.'); + $this->expectException(UnableToLoadResource::class); + $this->expectExceptionMessage('Could not access the URI: `http://www.example.com`.'); $storage = new PublicSuffixListPsr18Client($client, $requestFactory); $storage->get('http://www.example.com'); @@ -85,8 +85,8 @@ public function createRequest(string $method, $uri): RequestInterface } }; - $this->expectException(UnableToLoadPublicSuffixList::class); - $this->expectExceptionMessage('Invalid response from Public Suffix List URI: `http://www.example.com`.'); + $this->expectException(UnableToLoadResource::class); + $this->expectExceptionMessage('Invalid response from URI: `http://www.example.com`.'); $this->expectExceptionCode(404); $storage = new PublicSuffixListPsr18Client($client, $requestFactory); diff --git a/src/Storage/TopLevelDomainListPsr18Client.php b/src/Storage/TopLevelDomainListPsr18Client.php index cd21a5d8..be288a63 100644 --- a/src/Storage/TopLevelDomainListPsr18Client.php +++ b/src/Storage/TopLevelDomainListPsr18Client.php @@ -6,7 +6,7 @@ use Pdp\TopLevelDomainList; use Pdp\TopLevelDomains; -use Pdp\UnableToLoadTopLevelDomainList; +use Pdp\UnableToLoadResource; use Psr\Http\Client\ClientExceptionInterface; use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestFactoryInterface; @@ -29,11 +29,11 @@ public function get(string $uri): TopLevelDomainList try { $response = $this->client->sendRequest($request); } catch (ClientExceptionInterface $exception) { - throw UnableToLoadTopLevelDomainList::dueToUnavailableService($uri, $exception); + throw UnableToLoadResource::dueToUnavailableService($uri, $exception); } if (400 <= $response->getStatusCode()) { - throw UnableToLoadTopLevelDomainList::dueToUnexpectedContent($uri, $response->getStatusCode()); + throw UnableToLoadResource::dueToUnexpectedStatusCode($uri, $response->getStatusCode()); } return TopLevelDomains::fromString($response->getBody()); diff --git a/src/Storage/TopLevelDomainListPsr18ClientTest.php b/src/Storage/TopLevelDomainListPsr18ClientTest.php index 205b197e..1b4dd555 100644 --- a/src/Storage/TopLevelDomainListPsr18ClientTest.php +++ b/src/Storage/TopLevelDomainListPsr18ClientTest.php @@ -8,7 +8,7 @@ use GuzzleHttp\Psr7\Request; use GuzzleHttp\Psr7\Response; use Pdp\TopLevelDomains; -use Pdp\UnableToLoadTopLevelDomainList; +use Pdp\UnableToLoadResource; use PHPUnit\Framework\TestCase; use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestFactoryInterface; @@ -63,8 +63,8 @@ public function createRequest(string $method, $uri): RequestInterface } }; - $this->expectException(UnableToLoadTopLevelDomainList::class); - $this->expectExceptionMessage('Could not access the Top Level Domain List URI: `http://www.example.com`.'); + $this->expectException(UnableToLoadResource::class); + $this->expectExceptionMessage('Could not access the URI: `http://www.example.com`.'); $storage = new TopLevelDomainListPsr18Client($client, $requestFactory); $storage->get('http://www.example.com'); @@ -86,8 +86,8 @@ public function createRequest(string $method, $uri): RequestInterface } }; - $this->expectException(UnableToLoadTopLevelDomainList::class); - $this->expectExceptionMessage('Invalid response from Top Level Domain List URI: `http://www.example.com`.'); + $this->expectException(UnableToLoadResource::class); + $this->expectExceptionMessage('Invalid response from URI: `http://www.example.com`.'); $this->expectExceptionCode(404); $storage = new TopLevelDomainListPsr18Client($client, $requestFactory); diff --git a/src/Stream.php b/src/Stream.php new file mode 100644 index 00000000..ca034b2a --- /dev/null +++ b/src/Stream.php @@ -0,0 +1,50 @@ +} + * @return array{version:string, lastUpdated:string, records:array} */ public static function parse(string $content): array { @@ -129,7 +105,7 @@ public static function parse(string $content): array if (false === strpos($line, '#')) { $data['records'] = $data['records'] ?? []; - $data['records'][] = self::extractRootZone($line); + $data['records'][self::extractRootZone($line)] = 1; continue; } @@ -168,7 +144,7 @@ private static function extractHeader(string $content): array /** * Extract IANA Root Zone. * - * @throws UnableToLoadTopLevelDomainList If the Root Zone is invalid + * @throws UnableToLoadTopLevelDomainList If the Top Level Domain is invalid */ private static function extractRootZone(string $content): string { @@ -178,7 +154,7 @@ private static function extractRootZone(string $content): string throw UnableToLoadTopLevelDomainList::dueToInvalidTopLevelDomain($content, $exception); } - return $tld->toString(); + return $tld->toAscii()->toString(); } /** diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index fb427ec5..42386fed 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -25,6 +25,7 @@ public static function setUpBeforeClass(): void /** * @covers ::fromPath * @covers ::fromString + * @covers \Pdp\Stream * @covers ::__construct */ public function testCreateFromPath(): void @@ -47,7 +48,7 @@ public function testCreateFromPath(): void */ public function testCreateFromPathThrowsException(): void { - $this->expectException(UnableToLoadTopLevelDomainList::class); + $this->expectException(UnableToLoadResource::class); TopLevelDomains::fromPath('/foo/bar.dat'); } diff --git a/src/UnableToLoadPublicSuffixList.php b/src/UnableToLoadPublicSuffixList.php index 8ff06727..442916b2 100644 --- a/src/UnableToLoadPublicSuffixList.php +++ b/src/UnableToLoadPublicSuffixList.php @@ -9,33 +9,8 @@ final class UnableToLoadPublicSuffixList extends InvalidArgumentException implements CannotProcessHost { - public static function dueToInvalidPath(string $path): self - { - return new self($path.': failed to open stream: No such file or directory.'); - } - - public static function dueToInvalidJson(Throwable $exception): self - { - return new self('Failed to JSON decode public suffix list string.', 0, $exception); - } - public static function dueToInvalidRule(?string $line, Throwable $exception): self { return new self('The following rule "'.($line ?? 'NULL').'" could not be processed because it is invalid.', 0, $exception); } - - public static function dueToCorruptedSection(): self - { - return new self('The public suffix list section data are corrupted.'); - } - - public static function dueToUnavailableService(string $uri, Throwable $exception): self - { - return new self('Could not access the Public Suffix List URI: `'.$uri.'`.', 0, $exception); - } - - public static function dueToUnexpectedContent(string $uri, int $statusCode): self - { - return new self('Invalid response from Public Suffix List URI: `'.$uri.'`.', $statusCode); - } } diff --git a/src/UnableToLoadResource.php b/src/UnableToLoadResource.php new file mode 100644 index 00000000..6bcb8aea --- /dev/null +++ b/src/UnableToLoadResource.php @@ -0,0 +1,26 @@ + Date: Sun, 13 Dec 2020 21:08:27 +0100 Subject: [PATCH 375/461] Improve Stream handling --- src/Stream.php | 10 +++++----- src/UnableToLoadResource.php | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Stream.php b/src/Stream.php index ca034b2a..8d252f99 100644 --- a/src/Stream.php +++ b/src/Stream.php @@ -22,14 +22,14 @@ final class Stream */ public static function getContentAsString(string $path, $context = null): string { - $resource = self::getResource($path, $context); - if (false === $resource) { + $stream = self::fromPath($path, $context); + if (false === $stream) { throw UnableToLoadResource::dueToInvalidUri($path); } /** @var string $content */ - $content = stream_get_contents($resource); - fclose($resource); + $content = stream_get_contents($stream); + fclose($stream); return $content; } @@ -39,7 +39,7 @@ public static function getContentAsString(string $path, $context = null): string * * @return false|resource */ - private static function getResource(string $path, $context = null) + private static function fromPath(string $path, $context = null) { if (null === $context) { return @fopen($path, 'r'); diff --git a/src/UnableToLoadResource.php b/src/UnableToLoadResource.php index 6bcb8aea..8bb66222 100644 --- a/src/UnableToLoadResource.php +++ b/src/UnableToLoadResource.php @@ -4,10 +4,10 @@ namespace Pdp; -use InvalidArgumentException; +use RuntimeException; use Throwable; -final class UnableToLoadResource extends InvalidArgumentException implements CannotProcessHost +final class UnableToLoadResource extends RuntimeException implements CannotProcessHost { public static function dueToInvalidUri(string $uri): self { From 0a50195f287e34f103297e4b9ee210de4aedbefc Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 13 Dec 2020 21:31:08 +0100 Subject: [PATCH 376/461] Improve infer types --- src/DomainTest.php | 1 + src/Idna.php | 31 +++++++++++++++++++------------ src/IdnaInfoTest.php | 1 + src/ResolvedDomainTest.php | 1 + src/Rules.php | 2 +- src/RulesTest.php | 1 + src/SuffixTest.php | 1 + src/TopLevelDomains.php | 20 ++++++++------------ src/TopLevelDomainsTest.php | 1 + 9 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/DomainTest.php b/src/DomainTest.php index d62b8b74..e8151dbe 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -45,6 +45,7 @@ public function testToUnicodeThrowsException(): void public function testDomainInternalPhpMethod(): void { $domain = Domain::fromIDNA2008('www.ulb.ac.be'); + /** @var Domain $generateDomain */ $generateDomain = eval('return '.var_export($domain, true).';'); self::assertEquals($domain, $generateDomain); self::assertSame(['be', 'ac', 'ulb', 'www'], iterator_to_array($domain)); diff --git a/src/Idna.php b/src/Idna.php index 82a4c84b..20bef739 100644 --- a/src/Idna.php +++ b/src/Idna.php @@ -5,6 +5,8 @@ namespace Pdp; use UnexpectedValueException; +use function defined; +use function function_exists; use function idn_to_ascii; use function idn_to_utf8; use function preg_match; @@ -67,11 +69,14 @@ final class Idna /** * @codeCoverageIgnore */ - private static function supportIdna(): void + private static function supportsIdna(): void { - static $idn_support = null; - $idn_support = $idn_support ?? function_exists('\idn_to_ascii') && defined('\INTL_IDNA_VARIANT_UTS46'); - if (!$idn_support) { + static $idnSupport; + if (null === $idnSupport) { + $idnSupport = function_exists('\idn_to_ascii') && defined('\INTL_IDNA_VARIANT_UTS46'); + } + + if (!$idnSupport) { throw new UnexpectedValueException('IDN host can not be processed. Verify that ext/intl is installed for IDN support and that ICU is at least version 4.6.'); } } @@ -90,10 +95,11 @@ public static function toAscii(string $domain, int $options): IdnaInfo return IdnaInfo::fromIntl(['result' => strtolower($domain), 'isTransitionalDifferent' => false, 'errors' => 0]); } - self::supportIdna(); + self::supportsIdna(); idn_to_ascii($domain, $options, INTL_IDNA_VARIANT_UTS46, $idnaInfo); + /* @var array{result:string, isTransitionalDifferent:bool, errors:int} $idnaInfo */ return self::createIdnaInfo($domain, $idnaInfo); } @@ -110,23 +116,24 @@ public static function toUnicode(string $domain, int $options): IdnaInfo return IdnaInfo::fromIntl(['result' => $domain, 'isTransitionalDifferent' => false, 'errors' => 0]); } - self::supportIdna(); + self::supportsIdna(); idn_to_utf8($domain, $options, INTL_IDNA_VARIANT_UTS46, $idnaInfo); + /* @var array{result:string, isTransitionalDifferent:bool, errors:int} $idnaInfo */ return self::createIdnaInfo($domain, $idnaInfo); } /** - * @param array{result:string, isTransitionalDifferent:bool, errors:int} $infos + * @param array{result:string, isTransitionalDifferent:bool, errors:int} $idnaInfo */ - private static function createIdnaInfo(string $domain, array $infos): IdnaInfo + private static function createIdnaInfo(string $domain, array $idnaInfo): IdnaInfo { - $result = IdnaInfo::fromIntl($infos); - if (0 !== $result->errors()) { - throw SyntaxError::dueToIDNAError($domain, $result); + $info = IdnaInfo::fromIntl($idnaInfo); + if (0 !== $info->errors()) { + throw SyntaxError::dueToIDNAError($domain, $info); } - return $result; + return $info; } } diff --git a/src/IdnaInfoTest.php b/src/IdnaInfoTest.php index 0f9ca310..8dd39356 100644 --- a/src/IdnaInfoTest.php +++ b/src/IdnaInfoTest.php @@ -13,6 +13,7 @@ public function testDomainInternalPhpMethod(): void { $infos = ['result' => 'foo.bar', 'isTransitionalDifferent' => false, 'errors' => 0]; $result = IdnaInfo::fromIntl($infos); + /** @var IdnaInfo $generateResult */ $generateResult = eval('return '.var_export($result, true).';'); self::assertEquals($result, $generateResult); diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 8bde6f4e..45f1a59f 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -62,6 +62,7 @@ public function provideWrongConstructor(): iterable public function testItCanBeUsedWithInternalPhpMethod(): void { $domain = ResolvedDomain::fromICANN('www.ulb.ac.be', 2); + /** @var ResolvedDomain $generateDomain */ $generateDomain = eval('return '.var_export($domain, true).';'); self::assertEquals($domain, $generateDomain); self::assertEquals('"www.ulb.ac.be"', json_encode($domain->jsonSerialize())); diff --git a/src/Rules.php b/src/Rules.php index 34d622b5..81b3ca25 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -164,7 +164,7 @@ private static function addRule(array $list, array $ruleParts): array } /** - * @param array{rules:array{ICANN_DOMAINS:array,PRIVATE_DOMAINS:array}} $properties + * @param array{rules:array>} $properties */ public static function __set_state(array $properties): self { diff --git a/src/RulesTest.php b/src/RulesTest.php index c9216a42..1df3859e 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -63,6 +63,7 @@ public function testFromStringThrowsOnTypeError(): void public function testDomainInternalPhpMethod(): void { + /** @var Rules $generateRules */ $generateRules = eval('return '.var_export(self::$rules, true).';'); self::assertEquals(self::$rules, $generateRules); diff --git a/src/SuffixTest.php b/src/SuffixTest.php index 732c81c9..6fa79353 100644 --- a/src/SuffixTest.php +++ b/src/SuffixTest.php @@ -24,6 +24,7 @@ public function testItCanBeCreatedWithAnotherResolvedDomain(): void public function testInternalPhpMethod(): void { $publicSuffix = Suffix::fromICANN('ac.be'); + /** @var Suffix $generatePublicSuffix */ $generatePublicSuffix = eval('return '.var_export($publicSuffix, true).';'); self::assertEquals($publicSuffix, $generatePublicSuffix); self::assertEquals('"ac.be"', json_encode($publicSuffix)); diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index ea701ea0..99740889 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -5,7 +5,6 @@ namespace Pdp; use DateTimeImmutable; -use DateTimeInterface; use Iterator; use SplTempFileObject; use TypeError; @@ -25,15 +24,15 @@ final class TopLevelDomains implements TopLevelDomainList private const REGEXP_HEADER_LINE = '/^\# Version (?\d+), Last Updated (?.*?)$/'; - private DateTimeImmutable $lastUpdated; - - private string $version; - /** * @var array */ private array $records; + private string $version; + + private DateTimeImmutable $lastUpdated; + /** * @param array $records */ @@ -76,10 +75,7 @@ public static function fromString($content): self $data = self::parse($content); - /** @var DateTimeImmutable $lastUpdated */ - $lastUpdated = DateTimeImmutable::createFromFormat(DateTimeInterface::ATOM, $data['lastUpdated']); - - return new self($data['records'], $data['version'], $lastUpdated); + return new self($data['records'], $data['version'], $data['lastUpdated']); } /** @@ -87,7 +83,7 @@ public static function fromString($content): self * * @throws UnableToLoadTopLevelDomainList if the content is invalid or can not be correctly parsed and converted * - * @return array{version:string, lastUpdated:string, records:array} + * @return array{version:string, lastUpdated:DateTimeImmutable, records:array} */ public static function parse(string $content): array { @@ -124,7 +120,7 @@ public static function parse(string $content): array * * @throws UnableToLoadTopLevelDomainList if the Header line is invalid * - * @return array{version:string, lastUpdated:string} + * @return array{version:string, lastUpdated:DateTimeImmutable} */ private static function extractHeader(string $content): array { @@ -137,7 +133,7 @@ private static function extractHeader(string $content): array return [ 'version' => $matches['version'], - 'lastUpdated' => $date->format(DateTimeInterface::ATOM), + 'lastUpdated' => $date, ]; } diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 42386fed..2b9d7301 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -140,6 +140,7 @@ public function invalidContentProvider(): iterable */ public function testSetState(): void { + /** @var TopLevelDomains $topLevelDomains */ $topLevelDomains = eval('return '.var_export(self::$topLevelDomains, true).';'); self::assertEquals(self::$topLevelDomains, $topLevelDomains); From d8a8db96bd0f0abf1a9ea53f494da9086d7b8ab1 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 13 Dec 2020 21:57:39 +0100 Subject: [PATCH 377/461] Adding a TimeToLive class --- src/Storage/PublicSuffixListPsr16Cache.php | 61 ++------------ .../PublicSuffixListPsr16CacheTest.php | 19 +++++ src/Storage/TimeToLive.php | 82 +++++++++++++++++++ src/Storage/TopLevelDomainListPsr16Cache.php | 59 ++----------- .../TopLevelDomainListPsr16CacheTest.php | 17 +++- 5 files changed, 131 insertions(+), 107 deletions(-) create mode 100644 src/Storage/TimeToLive.php diff --git a/src/Storage/PublicSuffixListPsr16Cache.php b/src/Storage/PublicSuffixListPsr16Cache.php index 927b87a8..3d1bd90f 100644 --- a/src/Storage/PublicSuffixListPsr16Cache.php +++ b/src/Storage/PublicSuffixListPsr16Cache.php @@ -5,19 +5,12 @@ namespace Pdp\Storage; use DateInterval; -use DateTimeImmutable; -use DateTimeInterface; -use DateTimeZone; -use InvalidArgumentException; use Pdp\PublicSuffixList; +use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; use Throwable; -use TypeError; -use function filter_var; -use function is_string; use function md5; use function strtolower; -use const FILTER_VALIDATE_INT; final class PublicSuffixListPsr16Cache implements PublicSuffixListCache { @@ -34,51 +27,7 @@ public function __construct(CacheInterface $cache, string $cachePrefix = '', $ca { $this->cache = $cache; $this->cachePrefix = $cachePrefix; - $this->cacheTtl = $this->setTtl($cacheTtl); - } - - /** - * Set the cache TTL. - * - * @param mixed $ttl the cache TTL - * - * @throws InvalidArgumentException if the value can not be computed - * @throws TypeError if the value type is not recognized - */ - private function setTtl($ttl): ?DateInterval - { - if ($ttl instanceof DateInterval || null === $ttl) { - return $ttl; - } - - if ($ttl instanceof DateTimeInterface) { - /** @var DateTimeZone $timezone */ - $timezone = $ttl->getTimezone(); - - $now = new DateTimeImmutable('NOW', $timezone); - /** @var DateInterval $ttl */ - $ttl = $now->diff($ttl, false); - - return $ttl; - } - - if (false !== ($res = filter_var($ttl, FILTER_VALIDATE_INT))) { - return new DateInterval('PT'.$res.'S'); - } - - if (!is_string($ttl)) { - throw new TypeError('The ttl must null, an integer, a string, a DateTimeInterface or a DateInterval object.'); - } - - /** @var DateInterval|false $date */ - $date = @DateInterval::createFromDateString($ttl); - if (!$date instanceof DateInterval) { - throw new InvalidArgumentException( - 'The ttl value "'.$ttl.'" can not be parsable by `DateInterval::createFromDateString`.' - ); - } - - return $date; + $this->cacheTtl = TimeToLive::convert($cacheTtl); } public function fetch(string $uri): ?PublicSuffixList @@ -111,7 +60,11 @@ public function remember(string $uri, PublicSuffixList $publicSuffixList): bool try { return $this->cache->set($this->cacheKey($uri), $publicSuffixList, $this->cacheTtl); } catch (Throwable $exception) { - return false; + if ($exception instanceof CacheException) { + return false; + } + + throw $exception; } } diff --git a/src/Storage/PublicSuffixListPsr16CacheTest.php b/src/Storage/PublicSuffixListPsr16CacheTest.php index 45957c72..3d992b0c 100644 --- a/src/Storage/PublicSuffixListPsr16CacheTest.php +++ b/src/Storage/PublicSuffixListPsr16CacheTest.php @@ -94,6 +94,25 @@ public function testItReturnsFalseIfItCantCacheAPublicSuffixListInstance(): void self::assertFalse($pslCache->remember('http://www.example.com', $psl)); } + public function testItWillThrowIfItCantCacheAPublicSuffixListInstance(): void + { + $exception = new class('Something went wrong.', 0) extends RuntimeException { + }; + $cache = $this->createStub(CacheInterface::class); + $cache->method('set')->will(self::throwException($exception)); + + $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); + $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new class() { + public function __toString(): string + { + return '1 DAY'; + } + }); + $this->expectException(RuntimeException::class); + + $pslCache->remember('http://www.example.com', $psl); + } + public function testItCanDeleteTheCachedDatabase(): void { $uri = 'http://www.example.com'; diff --git a/src/Storage/TimeToLive.php b/src/Storage/TimeToLive.php new file mode 100644 index 00000000..aa70977a --- /dev/null +++ b/src/Storage/TimeToLive.php @@ -0,0 +1,82 @@ +getTimezone(); + + $now = new DateTimeImmutable('NOW', $timezone); + + /** @var DateInterval $diff */ + $diff = $now->diff($ttl, false); + + return $diff; + } + + /** + * @param object|string|int $ttl the cache TTL the object must implement the __toString method + */ + public static function fromScalar($ttl): DateInterval + { + if (is_object($ttl) && method_exists($ttl, '__toString')) { + $ttl = (string) $ttl; + } + + if (false !== ($res = filter_var($ttl, FILTER_VALIDATE_INT))) { + return new DateInterval('PT'.$res.'S'); + } + + if (!is_string($ttl)) { + throw new TypeError('The ttl must null, an integer, a string, a DateTimeInterface or a DateInterval object.'); + } + + /** @var DateInterval|false $date */ + $date = @DateInterval::createFromDateString($ttl); + if (!$date instanceof DateInterval) { + throw new InvalidArgumentException( + 'The ttl value "'.$ttl.'" can not be parsable by `DateInterval::createFromDateString`.' + ); + } + + return $date; + } + + /** + * Set the cache TTL. + * + * @param mixed $ttl the cache TTL + * + * @throws InvalidArgumentException if the value can not be computed + * @throws TypeError if the value type is not recognized + */ + public static function convert($ttl): ?DateInterval + { + if ($ttl instanceof DateInterval || null === $ttl) { + return $ttl; + } + + if ($ttl instanceof DateTimeInterface) { + return self::fromDateTimeInterface($ttl); + } + + return self::fromScalar($ttl); + } +} diff --git a/src/Storage/TopLevelDomainListPsr16Cache.php b/src/Storage/TopLevelDomainListPsr16Cache.php index ce7ed70c..0c24755f 100644 --- a/src/Storage/TopLevelDomainListPsr16Cache.php +++ b/src/Storage/TopLevelDomainListPsr16Cache.php @@ -5,19 +5,12 @@ namespace Pdp\Storage; use DateInterval; -use DateTimeImmutable; -use DateTimeInterface; -use DateTimeZone; -use InvalidArgumentException; use Pdp\TopLevelDomainList; +use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; use Throwable; -use TypeError; -use function filter_var; -use function is_string; use function md5; use function strtolower; -use const FILTER_VALIDATE_INT; final class TopLevelDomainListPsr16Cache implements TopLevelDomainListCache { @@ -34,49 +27,7 @@ public function __construct(CacheInterface $cache, string $cachePrefix = '', $ca { $this->cache = $cache; $this->cachePrefix = $cachePrefix; - $this->cacheTtl = $this->setTtl($cacheTtl); - } - - /** - * Set the cache TTL. - * - * @param mixed $ttl the cache TTL - * - * @throws InvalidArgumentException if the value can not be computed - * @throws TypeError if the value type is not recognized - */ - private function setTtl($ttl): ?DateInterval - { - if ($ttl instanceof DateInterval || null === $ttl) { - return $ttl; - } - - if ($ttl instanceof DateTimeInterface) { - /** @var DateTimeZone $timezone */ - $timezone = $ttl->getTimezone(); - - $now = new DateTimeImmutable('NOW', $timezone); - /** @var DateInterval $ttl */ - $ttl = $now->diff($ttl, false); - - return $ttl; - } - - if (false !== ($res = filter_var($ttl, FILTER_VALIDATE_INT))) { - return new DateInterval('PT'.$res.'S'); - } - - if (!is_string($ttl)) { - throw new TypeError('The ttl must null, an integer, a string, a DateTimeInterface or a DateInterval object.'); - } - - /** @var DateInterval|false $date */ - $date = @DateInterval::createFromDateString($ttl); - if (!$date instanceof DateInterval) { - throw new InvalidArgumentException('The ttl value "'.$ttl.'" can not be parsable by `DateInterval::createFromDateString`.'); - } - - return $date; + $this->cacheTtl = TimeToLive::convert($cacheTtl); } public function fetch(string $uri): ?TopLevelDomainList @@ -109,7 +60,11 @@ public function remember(string $uri, TopLevelDomainList $topLevelDomainList): b try { return $this->cache->set($this->cacheKey($uri), $topLevelDomainList, $this->cacheTtl); } catch (Throwable $exception) { - return false; + if ($exception instanceof CacheException) { + return false; + } + + throw $exception; } } diff --git a/src/Storage/TopLevelDomainListPsr16CacheTest.php b/src/Storage/TopLevelDomainListPsr16CacheTest.php index 00f8ec6c..0590873e 100644 --- a/src/Storage/TopLevelDomainListPsr16CacheTest.php +++ b/src/Storage/TopLevelDomainListPsr16CacheTest.php @@ -84,7 +84,7 @@ public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void self::assertFalse($instance->remember('http://www.example.com', $rzd)); } - public function testItReturnsFalseIfItCantCacheAPublicSuffixListInstance(): void + public function testItReturnsFalseIfItCantCacheATopLevelDomainListInstance(): void { $exception = new class('Something went wrong.', 0) extends RuntimeException implements CacheException { }; @@ -97,6 +97,21 @@ public function testItReturnsFalseIfItCantCacheAPublicSuffixListInstance(): void self::assertFalse($instance->remember('http://www.example.com', $rzd)); } + public function testItThrowsIfItCantCacheATopLevelDomainListInstance(): void + { + $exception = new class('Something went wrong.', 0) extends RuntimeException { + }; + $cache = $this->createStub(CacheInterface::class); + $cache->method('set')->will(self::throwException($exception)); + + $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); + $instance = new TopLevelDomainListPsr16Cache($cache, 'pdp_', new DateInterval('P1D')); + + $this->expectException(RuntimeException::class); + + $instance->remember('http://www.example.com', $rzd); + } + public function testItCanDeleteTheCachedDatabase(): void { $uri = 'http://www.example.com'; From ef61cc3b8ea38a8e14a7ef400386240e6370afc8 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sun, 13 Dec 2020 22:07:37 +0100 Subject: [PATCH 378/461] prepare 6.0 relase --- .github/CONTRIBUTING.md | 4 ++-- CHANGELOG.md | 15 ++++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 30f3572d..ec9a71c7 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -10,7 +10,7 @@ We accept bug reports via issues created on [Github](https://github.com/jeremyke - **Always search the issue or pull request list first** - The odds are good that if you've found a problem, someone else has found it, too. -- **Always try the [developer branch](https://github.com/jeremykendall/php-domain-parser/tree/develop)** - to see if the reported bug has not already been fixed. +- **Always try the [master branch](https://github.com/jeremykendall/php-domain-parser/tree/master)** - to see if the reported bug has not already been fixed. ### When submitting your report @@ -24,7 +24,7 @@ We accept bug reports via issues created on [Github](https://github.com/jeremyke We accept contributions via Pull Requests on [Github](https://github.com/jeremykendall/php-domain-parser/pull). -- **Always make your Pull Request against the [developer branch](https://github.com/jeremykendall/php-domain-parser/tree/develop)** +- **Always make your Pull Request against the [master branch](https://github.com/jeremykendall/php-domain-parser/tree/master)** - **[PSR-2 Coding Standard](http://www.php-fig.org/psr/psr-2/)** - Your patch won't be accepted if it doesn't pass the package coding style test suite. diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b29aba8..fa99827a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will be documented in this file -## 6.0.0 - TBD +## 6.0.0 - 2020-12-13 ### Added @@ -11,10 +11,11 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - Added `Domain::slice` to easily slice a domain object - Added `ResolvedDomain` object to normalize Resolver results. - Added `Suffix` object to replace the `PublicSuffix` object from v5. -- Public Suffix List and IANA Root Zone Database are fully decoupled -- Added `IntlIdna`, IDN support has been completely revamped +- Public Suffix List and IANA Top Level Domain List are fully decoupled +- Added `Idna`, IDN support has been completely revamped +- Added internal `Stream` class, to improve path/stream resolution - Resolver uses by default UTS#46 IDNA2008 algorithm to convert domain names -- Storage capability is optional and can be based on PHP-FIG related interfaces to improve interoperability +- Storage capability is now optional and can be based on PHP-FIG related interfaces to improve interoperability - `Pdp\TopLevelDomains::getIANADomain` which throws on syntax error and if no effective TLD is found (behave like `Pdp\TopLevelDomains::resolve` in v5). ### Fixed @@ -46,11 +47,11 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - `Pdp\Domain::getSubDomain` replaced by `Pdp\ResolvedDomain::subDomain` - `Pdp\Domain::withPublicSuffix` replaced by `Pdp\ResolvedDomain::withSuffix` - `Pdp\Domain::getLabel` replaced by `Pdp\Domain::label` -- `Pdp\Domain::isTransitionalDifferent` without replacement +- `Pdp\Domain::isTransitionalDifferent` replaced by `Pdp\IdnaInfo::isTransitionalDifferent` - `Pdp\PublicSuffix` replaced by `Pdp\Suffix` -- Directly accessing suffix information from the `Pdp\Domain` object +- Accessing suffix information from the `Pdp\Domain` object is no longer possible you need to do it from `Pdp\Suffix` - `Pdp\TopLevelDomains::contains` without replacement -- Internal Converter classes to convert external resources into PHP array structures. +- Internal Converter classes (implementation details are no longer exposed). ## 5.7.2 - 2020-10-25 From f6b405c795568361dbfa8e533057dca0046ecd22 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 14 Dec 2020 09:53:30 +0100 Subject: [PATCH 379/461] Improve gitattributes --- .gitattributes | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitattributes b/.gitattributes index 37141d4d..7dd10a26 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5,9 +5,10 @@ /.github export-ignore /.gitignore export-ignore /.php_cs export-ignore -/phpstan.neon export-ignore -/.travis.yml export-ignore -/README.md export-ignore +/phpstan.neon export-ignore /phpunit.xml.dist export-ignore +/psalm.xml export-ignore /CHANGELOG.md export-ignore +/UPGRADING.md export-ignore +/README.md export-ignore /**/*Test.php export-ignore From f1e5823b090bfc99f66102d0a5b8053b67603124 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 14 Dec 2020 10:07:45 +0100 Subject: [PATCH 380/461] Improve TimeToLive class --- CHANGELOG.md | 21 +++++ README.md | 5 +- src/Storage/PsrStorageFactory.php | 6 +- src/Storage/PublicSuffixListPsr16Cache.php | 24 ++++- .../PublicSuffixListStorageFactory.php | 5 +- src/Storage/TimeToLive.php | 92 ++++++++++++++----- src/Storage/TopLevelDomainListPsr16Cache.php | 24 ++++- .../TopLevelDomainListStorageFactory.php | 5 +- 8 files changed, 147 insertions(+), 35 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa99827a..40542acd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,27 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will be documented in this file +## Next - TBD + +### Added + +- `TimeToLive::fromNow` +- `TimeToLive::fromDurationString` + +### Fixed + +- `.gitattributes` files to be filter out. + +### Deprecated + +- `TimeToLive::fromDateTimeInterface` use `TimeToLive::fromNow` +- `TimeToLive::fromScalar` use `TimeToLive::fromDurationString` +- `TimeToLive::convert` without replacement + +### Removed + +- None + ## 6.0.0 - 2020-12-13 ### Added diff --git a/README.md b/README.md index 9ebb6932..7afb63c9 100644 --- a/README.md +++ b/README.md @@ -540,8 +540,9 @@ Testing `pdp-domain-parser` has: - a [PHPUnit](https://phpunit.de) test suite -- a coding style compliance test suite using [PHP CS Fixer](http://cs.sensiolabs.org/). -- a code analysis compliance test suite using [PHPStan](https://github.com/phpstan/phpstan). +- a code analysis compliance test suite using [PHPStan](https://phpstan.org). +- a code analysis compliance test suite using [Psalm](https://psalm.dev). +- a coding style compliance test suite using [PHP CS Fixer](https://cs.symfony.com). To run the tests, run the following command from the project folder. diff --git a/src/Storage/PsrStorageFactory.php b/src/Storage/PsrStorageFactory.php index 253f7a96..365e811d 100644 --- a/src/Storage/PsrStorageFactory.php +++ b/src/Storage/PsrStorageFactory.php @@ -4,6 +4,8 @@ namespace Pdp\Storage; +use DateInterval; +use DateTimeInterface; use Pdp\ResourceUri; use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestFactoryInterface; @@ -28,7 +30,7 @@ public function __construct(CacheInterface $cache, ClientInterface $client, Requ } /** - * @param mixed $cacheTtl The cache TTL + * @param DateInterval|DateTimeInterface|object|int|string|null $cacheTtl storage TTL object should implement the __toString method */ public function createPublicSuffixListStorage(string $cachePrefix = '', $cacheTtl = null): PublicSuffixListStorage { @@ -39,7 +41,7 @@ public function createPublicSuffixListStorage(string $cachePrefix = '', $cacheTt } /** - * @param mixed $cacheTtl The cache TTL + * @param DateInterval|DateTimeInterface|object|int|string|null $cacheTtl storage TTL object should implement the __toString method */ public function createTopLevelDomainListStorage(string $cachePrefix = '', $cacheTtl = null): TopLevelDomainListStorage { diff --git a/src/Storage/PublicSuffixListPsr16Cache.php b/src/Storage/PublicSuffixListPsr16Cache.php index 3d1bd90f..f0190c5f 100644 --- a/src/Storage/PublicSuffixListPsr16Cache.php +++ b/src/Storage/PublicSuffixListPsr16Cache.php @@ -5,6 +5,8 @@ namespace Pdp\Storage; use DateInterval; +use DateTimeInterface; +use InvalidArgumentException; use Pdp\PublicSuffixList; use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; @@ -21,13 +23,31 @@ final class PublicSuffixListPsr16Cache implements PublicSuffixListCache private ?DateInterval $cacheTtl; /** - * @param mixed $cacheTtl cache TTL + * @param DateInterval|DateTimeInterface|object|int|string|null $cacheTtl storage TTL object should implement the __toString method */ public function __construct(CacheInterface $cache, string $cachePrefix = '', $cacheTtl = null) { $this->cache = $cache; $this->cachePrefix = $cachePrefix; - $this->cacheTtl = TimeToLive::convert($cacheTtl); + $this->cacheTtl = $this->setCacheTtl($cacheTtl); + } + + /** + * @param DateInterval|DateTimeInterface|object|int|string|null $cacheTtl storage TTL object should implement the __toString method + * + * @throws InvalidArgumentException if the value can not be computed + */ + private function setCacheTtl($cacheTtl): ?DateInterval + { + if ($cacheTtl instanceof DateInterval || null === $cacheTtl) { + return $cacheTtl; + } + + if ($cacheTtl instanceof DateTimeInterface) { + return TimeToLive::fromNow($cacheTtl); + } + + return TimeToLive::fromDurationString($cacheTtl); } public function fetch(string $uri): ?PublicSuffixList diff --git a/src/Storage/PublicSuffixListStorageFactory.php b/src/Storage/PublicSuffixListStorageFactory.php index b2e978bf..0bebfe0c 100644 --- a/src/Storage/PublicSuffixListStorageFactory.php +++ b/src/Storage/PublicSuffixListStorageFactory.php @@ -4,10 +4,13 @@ namespace Pdp\Storage; +use DateInterval; +use DateTimeInterface; + interface PublicSuffixListStorageFactory { /** - * @param mixed $cacheTtl The cache TTL + * @param DateInterval|DateTimeInterface|object|int|string|null $cacheTtl storage TTL object should implement the __toString method */ public function createPublicSuffixListStorage(string $cachePrefix = '', $cacheTtl = null): PublicSuffixListStorage; } diff --git a/src/Storage/TimeToLive.php b/src/Storage/TimeToLive.php index aa70977a..673a8f78 100644 --- a/src/Storage/TimeToLive.php +++ b/src/Storage/TimeToLive.php @@ -18,41 +18,30 @@ final class TimeToLive { - public static function fromDateTimeInterface(DateTimeInterface $ttl): DateInterval - { - /** @var DateTimeZone $timezone */ - $timezone = $ttl->getTimezone(); - - $now = new DateTimeImmutable('NOW', $timezone); - - /** @var DateInterval $diff */ - $diff = $now->diff($ttl, false); - - return $diff; - } - /** - * @param object|string|int $ttl the cache TTL the object must implement the __toString method + * Returns a DateInterval from string parsing. + * + * @param object|int|string $duration storage TTL object should implement the __toString method */ - public static function fromScalar($ttl): DateInterval + public static function fromDurationString($duration): DateInterval { - if (is_object($ttl) && method_exists($ttl, '__toString')) { - $ttl = (string) $ttl; + if (is_object($duration) && method_exists($duration, '__toString')) { + $duration = (string) $duration; } - if (false !== ($res = filter_var($ttl, FILTER_VALIDATE_INT))) { + if (false !== ($res = filter_var($duration, FILTER_VALIDATE_INT))) { return new DateInterval('PT'.$res.'S'); } - if (!is_string($ttl)) { + if (!is_string($duration)) { throw new TypeError('The ttl must null, an integer, a string, a DateTimeInterface or a DateInterval object.'); } /** @var DateInterval|false $date */ - $date = @DateInterval::createFromDateString($ttl); + $date = @DateInterval::createFromDateString($duration); if (!$date instanceof DateInterval) { throw new InvalidArgumentException( - 'The ttl value "'.$ttl.'" can not be parsable by `DateInterval::createFromDateString`.' + 'The ttl value "'.$duration.'" can not be parsable by `DateInterval::createFromDateString`.' ); } @@ -60,12 +49,65 @@ public static function fromScalar($ttl): DateInterval } /** - * Set the cache TTL. + * Returns a DateInterval relative to the current date and time. + */ + public static function fromNow(DateTimeInterface $date): DateInterval + { + /** @var DateTimeZone $timezone */ + $timezone = $date->getTimezone(); + + $now = new DateTimeImmutable('NOW', $timezone); + + /** @var DateInterval $diff */ + $diff = $now->diff($date, false); + + return $diff; + } + + /** + * Returns a DateInterval relative to the current date and time. + * + * DEPRECATION WARNING! This method will be removed in the next major point release + * + * @deprecated 6.1.0 deprecated + * @codeCoverageIgnore + * @see TimeToLive::fromNow + */ + public static function fromDateTimeInterface(DateTimeInterface $date): DateInterval + { + return self::fromNow($date); + } + + /** + * Returns a DateInterval from string parsing. + * + * @param object|int|string $duration storage TTL object should implement the __toString method * - * @param mixed $ttl the cache TTL + * @throws InvalidArgumentException if the value can not be parsable + * + * DEPRECATION WARNING! This method will be removed in the next major point release + * + * @deprecated 6.1.0 deprecated + * @codeCoverageIgnore + * @see TimeToLive::fromDurationString + */ + public static function fromScalar($duration): DateInterval + { + return self::fromDurationString($duration); + } + + /** + * Convert the input data into a DateInterval object or null. + * + * @param DateInterval|DateTimeInterface|object|int|string|null $ttl the object should implement the __toString method * * @throws InvalidArgumentException if the value can not be computed * @throws TypeError if the value type is not recognized + * + * DEPRECATION WARNING! This method will be removed in the next major point release + * + * @deprecated 6.1.0 deprecated + * @codeCoverageIgnore */ public static function convert($ttl): ?DateInterval { @@ -74,9 +116,9 @@ public static function convert($ttl): ?DateInterval } if ($ttl instanceof DateTimeInterface) { - return self::fromDateTimeInterface($ttl); + return self::fromNow($ttl); } - return self::fromScalar($ttl); + return self::fromDurationString($ttl); } } diff --git a/src/Storage/TopLevelDomainListPsr16Cache.php b/src/Storage/TopLevelDomainListPsr16Cache.php index 0c24755f..183bc348 100644 --- a/src/Storage/TopLevelDomainListPsr16Cache.php +++ b/src/Storage/TopLevelDomainListPsr16Cache.php @@ -5,6 +5,8 @@ namespace Pdp\Storage; use DateInterval; +use DateTimeInterface; +use InvalidArgumentException; use Pdp\TopLevelDomainList; use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; @@ -21,13 +23,31 @@ final class TopLevelDomainListPsr16Cache implements TopLevelDomainListCache private ?DateInterval $cacheTtl; /** - * @param mixed $cacheTtl storage TTL + * @param DateInterval|DateTimeInterface|object|int|string|null $cacheTtl storage TTL object should implement the __toString method */ public function __construct(CacheInterface $cache, string $cachePrefix = '', $cacheTtl = null) { $this->cache = $cache; $this->cachePrefix = $cachePrefix; - $this->cacheTtl = TimeToLive::convert($cacheTtl); + $this->cacheTtl = $this->setCacheTtl($cacheTtl); + } + + /** + * @param DateInterval|DateTimeInterface|object|int|string|null $cacheTtl storage TTL object should implement the __toString method + * + * @throws InvalidArgumentException if the value can not be computed + */ + private function setCacheTtl($cacheTtl): ?DateInterval + { + if ($cacheTtl instanceof DateInterval || null === $cacheTtl) { + return $cacheTtl; + } + + if ($cacheTtl instanceof DateTimeInterface) { + return TimeToLive::fromNow($cacheTtl); + } + + return TimeToLive::fromDurationString($cacheTtl); } public function fetch(string $uri): ?TopLevelDomainList diff --git a/src/Storage/TopLevelDomainListStorageFactory.php b/src/Storage/TopLevelDomainListStorageFactory.php index 60b26fe1..e66fba78 100644 --- a/src/Storage/TopLevelDomainListStorageFactory.php +++ b/src/Storage/TopLevelDomainListStorageFactory.php @@ -5,10 +5,13 @@ namespace Pdp\Storage; +use DateInterval; +use DateTimeInterface; + interface TopLevelDomainListStorageFactory { /** - * @param mixed $cacheTtl The cache TTL + * @param DateInterval|DateTimeInterface|object|int|string|null $cacheTtl storage TTL object should implement the __toString method */ public function createTopLevelDomainListStorage(string $cachePrefix = '', $cacheTtl = null): TopLevelDomainListStorage; } From d7ddb2adba4d6a766be86ef971605e46e425cfec Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 5 Apr 2021 09:07:40 +0200 Subject: [PATCH 381/461] Improve package documentation --- .github/workflows/build.yaml | 6 ++-- README.md | 55 +++++++++++++++++++++++------------- composer.json | 5 +++- phpstan.neon | 1 - src/Domain.php | 8 ++++++ src/Idna.php | 22 --------------- src/IdnaInfo.php | 48 +++++++++++++++++++++---------- src/IdnaInfoTest.php | 6 ++-- src/ResolvedDomain.php | 8 ++++++ src/Suffix.php | 8 ++++++ 10 files changed, 102 insertions(+), 65 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index a1908249..bc5da59a 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -23,8 +23,8 @@ jobs: - run: composer update --no-progress ${{ matrix.composer-flags }} - run: composer phpunit - run: composer phpstan - if: ${{ matrix.php == '7.4' }} + if: ${{ matrix.php == '8.0' }} - run: composer psalm - if: ${{ matrix.php == '7.4' }} + if: ${{ matrix.php == '8.0' }} - run: composer phpcs - if: ${{ matrix.php == '7.4' }} + if: ${{ matrix.php == '8.0' }} diff --git a/README.md b/README.md index 7afb63c9..60ee17f1 100644 --- a/README.md +++ b/README.md @@ -60,10 +60,12 @@ For the [Public Suffix List](http://publicsuffix.org/) you need to use the ~~~php resolve('www.PreF.OkiNawA.jP'); +$result = $publicSuffixList->resolve($domain); echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; echo $result->subDomain()->toString(); //display 'www'; echo $result->secondLevelDomain()->toString(); //display 'pref'; @@ -79,8 +81,9 @@ the `Pdp\TopLevelDomains` class is use instead: use Pdp\TopLevelDomains; $topLevelDomains = TopLevelDomains::fromPath('/path/to/cache/tlds-alpha-by-domain.txt'); +$domain = Domain::fromIDNA2008('www.PreF.OkiNawA.jP'); -$result = $topLevelDomains->resolve('www.PreF.OkiNawA.jP'); +$result = $topLevelDomains->resolve($domain); echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; echo $result->suffix()->toString(); //display 'jp'; echo $result->secondLevelDomain()->toString(); //display 'okinawa'; @@ -109,31 +112,38 @@ These methods resolve the domain against their respective data source using the same rules as the `resolve` method but will instead throw an exception if no valid effective TLD is found or if the submitted domain is invalid. +**All these methods expect as their sole argument a `Pdp\Host` implementing +object, but other types (ie: `string`, `null` and stringable objects) are +supported with predefined conditions as explained in the remaining document.** + ~~~php -getICANNDomain('qfdsf.unknownTLD'); +$publicSuffixList->getICANNDomain($domain); // will throw because `.unknownTLD` is not part of the ICANN section -$result = $publicSuffixList->getCookieDomain('qfdsf.unknownTLD'); +$result = $publicSuffixList->getCookieDomain($domain); $result->suffix()->value(); // returns 'unknownTLD' $result->suffix()->isKnown(); // returns false // will not throw because the domain syntax is correct. -$publicSuffixList->getCookieDomain('com'); +$publicSuffixList->getCookieDomain(Domain::fromIDNA2008('com')); // will not throw because the domain syntax is invalid (ie: does not support public suffix) -$result = $publicSuffixList->resolve('com'); +$result = $publicSuffixList->resolve(Domain::fromIDNA2008('com')); $result->suffix()->value(); // returns null $result->suffix()->isKnown(); // returns false // will not throw but its public suffix value equal to NULL $topLevelDomains = TopLevelDomains::fromPath('/path/to/cache/public-suffix-list.dat'); -$topLevelDomains->getIANADomain('com'); +$topLevelDomains->getIANADomain(Domain::fromIDNA2008('com')); // will not throw because the domain syntax is invalid (ie: does not support public suffix) ~~~ @@ -171,10 +181,12 @@ The `Pdp\ResolvedDomain` decorates the `Pdp\Domain` class resolved but also gives access as separate methods to the domain different components. ~~~php +use Pdp\Domain; use Pdp\TopLevelDomains; +$domain = Domain::fromIDNA2008('www.PreF.OkiNawA.jP'); /** @var TopLevelDomains $topLevelDomains */ -$result = $topLevelDomains->resolve('www.PreF.OkiNawA.jP'); +$result = $topLevelDomains->resolve($domain); echo $result->domain()->toString(); //display 'www.pref.okinawa.jp'; echo $result->suffix()->toString(); //display 'jp'; echo $result->secondLevelDomain()->toString(); //display 'okinawa'; @@ -188,14 +200,15 @@ You can modify the returned `Pdp\ResolvedDomain` instance using the following me ~~~php resolve('shop.example.com'); +$result = $publicSuffixList->resolve(Domain::fromIDNA2008('shop.example.com')); $altResult = $result - ->withSubDomain('foo.bar') - ->withSecondLevelDomain('test') - ->withSuffix('example'); + ->withSubDomain(Domain::fromIDNA2008('foo.bar')) + ->withSecondLevelDomain(Domain::fromIDNA2008('test')) + ->withSuffix(Domain::fromIDNA2008('example')); echo $result->domain()->toString(); //display 'shop.example.com'; $result->suffix()->isKnown(); //return true; @@ -217,10 +230,11 @@ origin. ~~~php resolve('example.github.io')->suffix(); +$suffix = $publicSuffixList->resolve(Domain::fromIDNA2008('example.github.io'))->suffix(); echo $suffix->domain()->toString(); //display 'github.io'; $suffix->isICANN(); //will return false @@ -274,11 +288,12 @@ manipulating domain labels. You can access the object using the following method `Domain` objects usage are explain in the next section. ~~~php -resolve('www.bbc.co.uk'); +$result = $publicSuffixList->resolve(Domain::from2008('www.bbc.co.uk')); $domain = $result->domain(); echo $domain->toString(); // display 'www.bbc.co.uk' count($domain); // returns 4 @@ -303,10 +318,11 @@ following methods: ~~~php resolve('www.ExAmpLE.cOM')->domain(); +$domain = $publicSuffixList->resolve(Domain::from2008('www.ExAmpLE.cOM'))->domain(); $newDomain = $domain ->withLabel(1, 'com') //replace 'example' by 'com' @@ -571,10 +587,9 @@ The MIT License (MIT). Please see [License File](LICENSE) for more information. Attribution ------- -Portions of the `Pdp\Converter` and `Pdp\Rules` are derivative works of the PHP +Portions of the `Pdp\Rules` class are derivative works of the PHP [registered-domain-libs](https://github.com/usrflo/registered-domain-libs). -Those parts of this codebase are heavily commented, and I've included a copy of -the Apache Software Foundation License 2.0 in this project. +I've included a copy of the Apache Software Foundation License 2.0 in this project. [ico-github-actions-build]: https://img.shields.io/github/workflow/status/jeremykendall/php-domain-parser/Build?style=flat-square [ico-packagist]: https://img.shields.io/packagist/dt/jeremykendall/php-domain-parser.svg?style=flat-square diff --git a/composer.json b/composer.json index 21134687..6d8667fb 100644 --- a/composer.json +++ b/composer.json @@ -41,6 +41,7 @@ ], "require": { "php": "^7.4 || ^8.0", + "ext-filter": "*", "ext-intl": "*", "ext-json": "*" }, @@ -71,7 +72,8 @@ }, "scripts": { "phpcs": "php-cs-fixer fix -vvv --diff --dry-run --allow-risky=yes --ansi", - "phpstan": "phpstan analyse -l max -c phpstan.neon src --ansi", + "phpcs:fix": "php-cs-fixer fix -vvv --allow-risky=yes --ansi", + "phpstan": "phpstan analyse -l max -c phpstan.neon src --memory-limit=256M --ansi", "psalm": "psalm --show-info=true", "phpunit": "phpunit --coverage-text", "test": [ @@ -83,6 +85,7 @@ }, "scripts-descriptions": { "phpcs": "Runs coding style test suite", + "phpcs:fix": "Fix the package coding style", "phpstan": "Runs complete codebase static analysis", "psalm": "Runs complete codebase static analysis", "phpunit": "Runs unit and functional testing", diff --git a/phpstan.neon b/phpstan.neon index 6db39376..d4747672 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -4,5 +4,4 @@ includes: - vendor/phpstan/phpstan-phpunit/rules.neon parameters: ignoreErrors: - - '#should be covariant with return type#' reportUnmatchedIgnoredErrors: true diff --git a/src/Domain.php b/src/Domain.php index 9e6ada35..b3a6ef84 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -235,6 +235,10 @@ public function labels(): array return $this->labels; } + /** + * @psalm-suppress MoreSpecificReturnType + * @psalm-suppress LessSpecificReturnStatement + */ public function toAscii(): self { if (null === $this->domain) { @@ -249,6 +253,10 @@ public function toAscii(): self return new self($this->type, $domain); } + /** + * @psalm-suppress MoreSpecificReturnType + * @psalm-suppress LessSpecificReturnStatement + */ public function toUnicode(): self { if (null === $this->domain) { diff --git a/src/Idna.php b/src/Idna.php index 20bef739..30d859b5 100644 --- a/src/Idna.php +++ b/src/Idna.php @@ -20,25 +20,6 @@ */ final class Idna { - /** - * IDNA errors. - */ - public const ERROR_EMPTY_LABEL = 1; - public const ERROR_LABEL_TOO_LONG = 2; - public const ERROR_DOMAIN_NAME_TOO_LONG = 4; - public const ERROR_LEADING_HYPHEN = 8; - public const ERROR_TRAILING_HYPHEN = 0x10; - public const ERROR_HYPHEN_3_4 = 0x20; - public const ERROR_LEADING_COMBINING_MARK = 0x40; - public const ERROR_DISALLOWED = 0x80; - public const ERROR_PUNYCODE = 0x100; - public const ERROR_LABEL_HAS_DOT = 0x200; - public const ERROR_INVALID_ACE_LABEL = 0x400; - public const ERROR_BIDI = 0x800; - public const ERROR_CONTEXTJ = 0x1000; - public const ERROR_CONTEXTO_PUNCTUATION = 0x2000; - public const ERROR_CONTEXTO_DIGITS = 0x4000; - /** * IDNA options. */ @@ -55,15 +36,12 @@ final class Idna | self::IDNA_CHECK_BIDI | self::IDNA_USE_STD3_RULES | self::IDNA_CHECK_CONTEXTJ; - public const IDNA2008_UNICODE = self::IDNA_NONTRANSITIONAL_TO_UNICODE | self::IDNA_CHECK_BIDI | self::IDNA_USE_STD3_RULES | self::IDNA_CHECK_CONTEXTJ; - public const IDNA2003_ASCII = self::IDNA_DEFAULT; public const IDNA2003_UNICODE = self::IDNA_DEFAULT; - private const REGEXP_IDNA_PATTERN = '/[^\x20-\x7f]/'; /** diff --git a/src/IdnaInfo.php b/src/IdnaInfo.php index 9147b86a..51a84bd2 100644 --- a/src/IdnaInfo.php +++ b/src/IdnaInfo.php @@ -12,22 +12,40 @@ */ final class IdnaInfo { + /** + * IDNA errors. + */ + public const ERROR_EMPTY_LABEL = 1; + public const ERROR_LABEL_TOO_LONG = 2; + public const ERROR_DOMAIN_NAME_TOO_LONG = 4; + public const ERROR_LEADING_HYPHEN = 8; + public const ERROR_TRAILING_HYPHEN = 0x10; + public const ERROR_HYPHEN_3_4 = 0x20; + public const ERROR_LEADING_COMBINING_MARK = 0x40; + public const ERROR_DISALLOWED = 0x80; + public const ERROR_PUNYCODE = 0x100; + public const ERROR_LABEL_HAS_DOT = 0x200; + public const ERROR_INVALID_ACE_LABEL = 0x400; + public const ERROR_BIDI = 0x800; + public const ERROR_CONTEXTJ = 0x1000; + public const ERROR_CONTEXTO_PUNCTUATION = 0x2000; + public const ERROR_CONTEXTO_DIGITS = 0x4000; private const ERRORS = [ - Idna::ERROR_EMPTY_LABEL => 'a non-final domain name label (or the whole domain name) is empty', - Idna::ERROR_LABEL_TOO_LONG => 'a domain name label is longer than 63 bytes', - Idna::ERROR_DOMAIN_NAME_TOO_LONG => 'a domain name is longer than 255 bytes in its storage form', - Idna::ERROR_LEADING_HYPHEN => 'a label starts with a hyphen-minus ("-")', - Idna::ERROR_TRAILING_HYPHEN => 'a label ends with a hyphen-minus ("-")', - Idna::ERROR_HYPHEN_3_4 => 'a label contains hyphen-minus ("-") in the third and fourth positions', - Idna::ERROR_LEADING_COMBINING_MARK => 'a label starts with a combining mark', - Idna::ERROR_DISALLOWED => 'a label or domain name contains disallowed characters', - Idna::ERROR_PUNYCODE => 'a label starts with "xn--" but does not contain valid Punycode', - Idna::ERROR_LABEL_HAS_DOT => 'a label contains a dot=full stop', - Idna::ERROR_INVALID_ACE_LABEL => 'An ACE label does not contain a valid label string', - Idna::ERROR_BIDI => 'a label does not meet the IDNA BiDi requirements (for right-to-left characters)', - Idna::ERROR_CONTEXTJ => 'a label does not meet the IDNA CONTEXTJ requirements', - Idna::ERROR_CONTEXTO_DIGITS => 'a label does not meet the IDNA CONTEXTO requirements for digits', - Idna::ERROR_CONTEXTO_PUNCTUATION => 'a label does not meet the IDNA CONTEXTO requirements for punctuation characters. Some punctuation characters "Would otherwise have been DISALLOWED" but are allowed in certain contexts', + self::ERROR_EMPTY_LABEL => 'a non-final domain name label (or the whole domain name) is empty', + self::ERROR_LABEL_TOO_LONG => 'a domain name label is longer than 63 bytes', + self::ERROR_DOMAIN_NAME_TOO_LONG => 'a domain name is longer than 255 bytes in its storage form', + self::ERROR_LEADING_HYPHEN => 'a label starts with a hyphen-minus ("-")', + self::ERROR_TRAILING_HYPHEN => 'a label ends with a hyphen-minus ("-")', + self::ERROR_HYPHEN_3_4 => 'a label contains hyphen-minus ("-") in the third and fourth positions', + self::ERROR_LEADING_COMBINING_MARK => 'a label starts with a combining mark', + self::ERROR_DISALLOWED => 'a label or domain name contains disallowed characters', + self::ERROR_PUNYCODE => 'a label starts with "xn--" but does not contain valid Punycode', + self::ERROR_LABEL_HAS_DOT => 'a label contains a dot=full stop', + self::ERROR_INVALID_ACE_LABEL => 'An ACE label does not contain a valid label string', + self::ERROR_BIDI => 'a label does not meet the IDNA BiDi requirements (for right-to-left characters)', + self::ERROR_CONTEXTJ => 'a label does not meet the IDNA CONTEXTJ requirements', + self::ERROR_CONTEXTO_DIGITS => 'a label does not meet the IDNA CONTEXTO requirements for digits', + self::ERROR_CONTEXTO_PUNCTUATION => 'a label does not meet the IDNA CONTEXTO requirements for punctuation characters. Some punctuation characters "Would otherwise have been DISALLOWED" but are allowed in certain contexts', ]; private string $result; diff --git a/src/IdnaInfoTest.php b/src/IdnaInfoTest.php index 8dd39356..bb62e782 100644 --- a/src/IdnaInfoTest.php +++ b/src/IdnaInfoTest.php @@ -27,7 +27,7 @@ public function testItCanBeInstantiatedFromArray(): void self::assertSame('', $result->result()); self::assertFalse($result->isTransitionalDifferent()); self::assertSame(0, $result->errors()); - self::assertNull($result->error(Idna::ERROR_BIDI)); + self::assertNull($result->error(IdnaInfo::ERROR_BIDI)); self::assertCount(0, $result->errorList()); } @@ -38,8 +38,8 @@ public function testInvalidSyntaxAfterIDNConversion(): void } catch (SyntaxError $exception) { $result = $exception->idnaInfo(); self::assertInstanceOf(IdnaInfo::class, $result); - self::assertSame(Idna::ERROR_DISALLOWED, $result->errors()); - self::assertIsString($result->error(Idna::ERROR_DISALLOWED)); + self::assertSame(IdnaInfo::ERROR_DISALLOWED, $result->errors()); + self::assertIsString($result->error(IdnaInfo::ERROR_DISALLOWED)); self::assertCount(1, $result->errorList()); } } diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 6d4adcdb..06eca8d7 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -165,11 +165,19 @@ public function suffix(): EffectiveTopLevelDomain return $this->suffix; } + /** + * @psalm-suppress MoreSpecificReturnType + * @psalm-suppress LessSpecificReturnStatement + */ public function toAscii(): self { return new self($this->domain->toAscii(), $this->suffix->toAscii()); } + /** + * @psalm-suppress MoreSpecificReturnType + * @psalm-suppress LessSpecificReturnStatement + */ public function toUnicode(): self { return new self($this->domain->toUnicode(), $this->suffix->toUnicode()); diff --git a/src/Suffix.php b/src/Suffix.php index c613f4fd..2fd68bbe 100644 --- a/src/Suffix.php +++ b/src/Suffix.php @@ -148,6 +148,10 @@ public function toString(): string return $this->domain->toString(); } + /** + * @psalm-suppress MoreSpecificReturnType + * @psalm-suppress LessSpecificReturnStatement + */ public function toAscii(): self { $clone = clone $this; @@ -156,6 +160,10 @@ public function toAscii(): self return $clone; } + /** + * @psalm-suppress MoreSpecificReturnType + * @psalm-suppress LessSpecificReturnStatement + */ public function toUnicode(): self { $clone = clone $this; From 283e458fd207f540cea736661e03f7675d93df33 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 7 Apr 2021 20:11:21 +0200 Subject: [PATCH 382/461] Improve PHP static analysis fix --- .php_cs | 2 +- psalm.xml | 2 +- src/Domain.php | 10 +++++----- src/DomainName.php | 8 ++++---- src/DomainTest.php | 4 ++-- src/Idna.php | 14 ++++++++++++-- src/ResolvedDomainTest.php | 2 +- src/Rules.php | 5 ++++- src/Storage/TimeToLive.php | 5 +---- src/TopLevelDomains.php | 2 +- 10 files changed, 32 insertions(+), 22 deletions(-) diff --git a/.php_cs b/.php_cs index ff29a34d..56145cef 100644 --- a/.php_cs +++ b/.php_cs @@ -24,7 +24,7 @@ return PhpCsFixer\Config::create() 'phpdoc_no_empty_return' => true, 'phpdoc_order' => true, 'phpdoc_scalar' => true, - 'phpdoc_to_comment' => true, + 'phpdoc_to_comment' => false, 'phpdoc_summary' => true, 'psr0' => true, 'psr4' => true, diff --git a/psalm.xml b/psalm.xml index b22c0d57..ad6be53d 100644 --- a/psalm.xml +++ b/psalm.xml @@ -1,6 +1,6 @@ + * @var array */ private array $labels; @@ -176,7 +176,7 @@ private function domainToUnicode(string $domain): string */ public function getIterator(): Iterator { - foreach ($this->labels as $offset => $label) { + foreach ($this->labels as $label) { yield $label; } } @@ -216,7 +216,7 @@ public function label(int $key): ?string } /** - * @return array + * @return list */ public function keys(string $label = null): array { @@ -228,7 +228,7 @@ public function keys(string $label = null): array } /** - * @return array + * @return array */ public function labels(): array { @@ -274,7 +274,7 @@ public function toUnicode(): self /** * Filter a subdomain to update the domain part. * - * @param string|object $domain a domain + * @param string|object|null $domain a domain * * @throws TypeError if the domain can not be converted */ diff --git a/src/DomainName.php b/src/DomainName.php index 2f458454..00496c2d 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -36,7 +36,7 @@ public function label(int $key): ?string; /** * Returns the object labels. * - * @return array + * @return array */ public function labels(): array; @@ -63,7 +63,7 @@ public function getIterator(): Iterator; * * @see ::withLabel * - * @param mixed $label a domain label + * @param string|null|object $label a domain label */ public function prepend($label): self; @@ -72,7 +72,7 @@ public function prepend($label): self; * * @see ::withLabel * - * @param mixed $label a domain label + * @param string|null|object $label a domain label */ public function append($label): self; @@ -85,7 +85,7 @@ public function append($label): self; * If $key is non-negative, the added label will be the label at $key position from the start. * If $key is negative, the added label will be the label at $key position from the end. * - * @param mixed $label a domain label + * @param string|null|object $label a domain label * * @throws CannotProcessHost If the key is out of bounds * @throws CannotProcessHost If the label is converted to the NULL value diff --git a/src/DomainTest.php b/src/DomainTest.php index e8151dbe..1c32a146 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -338,7 +338,7 @@ public function testAppend(string $raw, string $append, string $expected): void } /** - * @return iterable + * @return iterable */ public function validAppend(): iterable { @@ -359,7 +359,7 @@ public function testPrepend(string $raw, string $prepend, string $expected): voi } /** - * @return iterable + * @return iterable */ public function validPrepend(): iterable { diff --git a/src/Idna.php b/src/Idna.php index 30d859b5..b7096c99 100644 --- a/src/Idna.php +++ b/src/Idna.php @@ -75,9 +75,14 @@ public static function toAscii(string $domain, int $options): IdnaInfo self::supportsIdna(); + /** + * @param-out array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo + */ idn_to_ascii($domain, $options, INTL_IDNA_VARIANT_UTS46, $idnaInfo); - /* @var array{result:string, isTransitionalDifferent:bool, errors:int} $idnaInfo */ + /** + * @var array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo + */ return self::createIdnaInfo($domain, $idnaInfo); } @@ -96,9 +101,14 @@ public static function toUnicode(string $domain, int $options): IdnaInfo self::supportsIdna(); + /** + * @param-out array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo + */ idn_to_utf8($domain, $options, INTL_IDNA_VARIANT_UTS46, $idnaInfo); - /* @var array{result:string, isTransitionalDifferent:bool, errors:int} $idnaInfo */ + /** + * @var array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo + */ return self::createIdnaInfo($domain, $idnaInfo); } diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 45f1a59f..5a120fd3 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -540,7 +540,7 @@ public function testWithSecondLevelDomain( } /** - * @return iterable + * @return iterable */ public function withSldWorksProvider(): iterable { diff --git a/src/Rules.php b/src/Rules.php index 81b3ca25..6186f5ab 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -157,7 +157,9 @@ private static function addRule(array $list, array $ruleParts): array $list[$rule] = $list[$rule] ?? ($isDomain ? [] : ['!' => '']); if ($isDomain && [] !== $ruleParts) { - $list[$rule] = self::addRule($list[$rule], $ruleParts); + /** @var array $tmpList */ + $tmpList = $list[$rule]; + $list[$rule] = self::addRule($tmpList, $ruleParts); } return $list; @@ -307,6 +309,7 @@ private function getEffectiveTopLevelDomainFromSection(DomainName $domain, strin } $matches[] = $label; + /** @var array $rules */ $rules = $rules[$label]; } diff --git a/src/Storage/TimeToLive.php b/src/Storage/TimeToLive.php index 673a8f78..41b4682f 100644 --- a/src/Storage/TimeToLive.php +++ b/src/Storage/TimeToLive.php @@ -58,10 +58,7 @@ public static function fromNow(DateTimeInterface $date): DateInterval $now = new DateTimeImmutable('NOW', $timezone); - /** @var DateInterval $diff */ - $diff = $now->diff($date, false); - - return $diff; + return $now->diff($date, false); } /** diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 99740889..4623ad07 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -186,7 +186,7 @@ public function isEmpty(): bool */ public function getIterator(): Iterator { - foreach ($this->records as $tld => $int) { + foreach ($this->records as $tld => $_) { yield $tld; } } From 52a1b3b4742f43bdd195d149426508ada6b53178 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 7 Apr 2021 20:56:19 +0200 Subject: [PATCH 383/461] Improve TimeToLive codebase --- CHANGELOG.md | 2 +- src/Storage/PublicSuffixListPsr16Cache.php | 2 +- src/Storage/TimeToLive.php | 29 ++++---- src/Storage/TimeToLiveTest.php | 74 ++++++++++++++++++++ src/Storage/TopLevelDomainListPsr16Cache.php | 2 +- 5 files changed, 92 insertions(+), 17 deletions(-) create mode 100644 src/Storage/TimeToLiveTest.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 40542acd..abf87027 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will ### Added -- `TimeToLive::fromNow` +- `TimeToLive::until` - `TimeToLive::fromDurationString` ### Fixed diff --git a/src/Storage/PublicSuffixListPsr16Cache.php b/src/Storage/PublicSuffixListPsr16Cache.php index f0190c5f..03a5a3c9 100644 --- a/src/Storage/PublicSuffixListPsr16Cache.php +++ b/src/Storage/PublicSuffixListPsr16Cache.php @@ -44,7 +44,7 @@ private function setCacheTtl($cacheTtl): ?DateInterval } if ($cacheTtl instanceof DateTimeInterface) { - return TimeToLive::fromNow($cacheTtl); + return TimeToLive::until($cacheTtl); } return TimeToLive::fromDurationString($cacheTtl); diff --git a/src/Storage/TimeToLive.php b/src/Storage/TimeToLive.php index 41b4682f..3dadaef4 100644 --- a/src/Storage/TimeToLive.php +++ b/src/Storage/TimeToLive.php @@ -7,7 +7,6 @@ use DateInterval; use DateTimeImmutable; use DateTimeInterface; -use DateTimeZone; use InvalidArgumentException; use TypeError; use function filter_var; @@ -29,12 +28,19 @@ public static function fromDurationString($duration): DateInterval $duration = (string) $duration; } - if (false !== ($res = filter_var($duration, FILTER_VALIDATE_INT))) { - return new DateInterval('PT'.$res.'S'); + if (false !== ($seconds = filter_var($duration, FILTER_VALIDATE_INT))) { + if (-1 < $seconds) { + return new DateInterval('PT'.$seconds.'S'); + } + + $interval = new DateInterval('PT'.($seconds * -1).'S'); + $interval->invert = 1; + + return $interval; } if (!is_string($duration)) { - throw new TypeError('The ttl must null, an integer, a string, a DateTimeInterface or a DateInterval object.'); + throw new TypeError('The ttl must null, an integer, a string, or a stringable object.'); } /** @var DateInterval|false $date */ @@ -51,14 +57,9 @@ public static function fromDurationString($duration): DateInterval /** * Returns a DateInterval relative to the current date and time. */ - public static function fromNow(DateTimeInterface $date): DateInterval + public static function until(DateTimeInterface $date): DateInterval { - /** @var DateTimeZone $timezone */ - $timezone = $date->getTimezone(); - - $now = new DateTimeImmutable('NOW', $timezone); - - return $now->diff($date, false); + return (new DateTimeImmutable('NOW', $date->getTimezone()))->diff($date, false); } /** @@ -68,11 +69,11 @@ public static function fromNow(DateTimeInterface $date): DateInterval * * @deprecated 6.1.0 deprecated * @codeCoverageIgnore - * @see TimeToLive::fromNow + * @see TimeToLive::until */ public static function fromDateTimeInterface(DateTimeInterface $date): DateInterval { - return self::fromNow($date); + return self::until($date); } /** @@ -113,7 +114,7 @@ public static function convert($ttl): ?DateInterval } if ($ttl instanceof DateTimeInterface) { - return self::fromNow($ttl); + return self::until($ttl); } return self::fromDurationString($ttl); diff --git a/src/Storage/TimeToLiveTest.php b/src/Storage/TimeToLiveTest.php new file mode 100644 index 00000000..8e2ed4c2 --- /dev/null +++ b/src/Storage/TimeToLiveTest.php @@ -0,0 +1,74 @@ +invert); + self::assertSame(0, TimeToLive::until($tomorrow)->invert); + } + + /** + * @param object|string|int $input + * @dataProvider validDurationString + */ + public function testItCanBeInstantiatedFromDurationInput($input, DateInterval $expected): void + { + self::assertEquals($expected, TimeToLive::fromDurationString($input)); + } + + /** + * @return iterable + */ + public function validDurationString(): iterable + { + $threeDays = new DateInterval('P3D'); + + yield 'stringable object' => [ + 'input' => new class() { + public function __toString(): string + { + return '3 days'; + } + }, + 'expected' => $threeDays, + ]; + + yield 'string' => [ + 'input' => '3 days', + 'expected' => $threeDays, + ]; + + $seconds = new DateInterval('PT2345S'); + + yield 'stringable seconds' => [ + 'input' => '2345', + 'expected' => $seconds, + ]; + + yield 'seconds' => [ + 'input' => 2345, + 'expected' => $seconds, + ]; + + $negativeInterval = clone $seconds; + $negativeInterval->invert = 1; + + yield 'negative seconds' => [ + 'input' => '-2345', + 'expected' => $negativeInterval, + ]; + } +} diff --git a/src/Storage/TopLevelDomainListPsr16Cache.php b/src/Storage/TopLevelDomainListPsr16Cache.php index 183bc348..36e2195f 100644 --- a/src/Storage/TopLevelDomainListPsr16Cache.php +++ b/src/Storage/TopLevelDomainListPsr16Cache.php @@ -44,7 +44,7 @@ private function setCacheTtl($cacheTtl): ?DateInterval } if ($cacheTtl instanceof DateTimeInterface) { - return TimeToLive::fromNow($cacheTtl); + return TimeToLive::until($cacheTtl); } return TimeToLive::fromDurationString($cacheTtl); From 488fd66020bb7f19d522303b4df604a95fcbde7b Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 8 Apr 2021 23:43:21 +0200 Subject: [PATCH 384/461] Improve Rules internal implementation --- README.md | 3 +++ src/Idna.php | 16 ++++---------- src/Rules.php | 59 +++++++++++++++++++++++---------------------------- 3 files changed, 33 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 60ee17f1..e8e8589a 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,9 @@ For the [IANA Top Level Domain List](https://www.iana.org/domains/root/files), the `Pdp\TopLevelDomains` class is use instead: ~~~php +validateDomain($host); - [$length, $section] = $this->getEffectiveTopLevelDomain($domain, ''); + [$suffixLength, $section] = $this->resolveSuffix($domain, ''); if (self::ICANN_DOMAINS === $section) { - return ResolvedDomain::fromICANN($domain, $length); + return ResolvedDomain::fromICANN($domain, $suffixLength); } if (self::PRIVATE_DOMAINS === $section) { - return ResolvedDomain::fromPrivate($domain, $length); + return ResolvedDomain::fromPrivate($domain, $suffixLength); } - return ResolvedDomain::fromUnknown($domain, $length); + return ResolvedDomain::fromUnknown($domain, $suffixLength); } /** @@ -211,12 +210,12 @@ public function getCookieDomain($host): ResolvedDomainName public function getICANNDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); - [$length, $section] = $this->getEffectiveTopLevelDomain($domain, self::ICANN_DOMAINS); + [$suffixLength, $section] = $this->resolveSuffix($domain, self::ICANN_DOMAINS); if (self::ICANN_DOMAINS !== $section) { throw UnableToResolveDomain::dueToMissingSuffix($domain, 'ICANN'); } - return ResolvedDomain::fromICANN($domain, $length); + return ResolvedDomain::fromICANN($domain, $suffixLength); } /** @@ -225,12 +224,12 @@ public function getICANNDomain($host): ResolvedDomainName public function getPrivateDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); - [$length, $section] = $this->getEffectiveTopLevelDomain($domain, self::PRIVATE_DOMAINS); + [$suffixLength, $section] = $this->resolveSuffix($domain, self::PRIVATE_DOMAINS); if (self::PRIVATE_DOMAINS !== $section) { throw UnableToResolveDomain::dueToMissingSuffix($domain, 'private'); } - return ResolvedDomain::fromPrivate($domain, $length); + return ResolvedDomain::fromPrivate($domain, $suffixLength); } /** @@ -259,38 +258,36 @@ private function validateDomain($domain): DomainName } /** - * Returns the matched public suffix. + * Returns the length and the section of thhe resolved effective top level domain. * - * @return array{0:int, 1:string} + * @return array{0: int, 1:string} */ - private function getEffectiveTopLevelDomain(DomainName $domain, string $section): array + private function resolveSuffix(DomainName $domain, string $section): array { - $icann = $this->getEffectiveTopLevelDomainFromSection($domain, self::ICANN_DOMAINS); - if (self::ICANN_DOMAINS === $section) { - return $icann; + $icannSuffixLength = $this->getPublicSuffixLengthFromSection($domain, self::ICANN_DOMAINS); + if (1 > $icannSuffixLength) { + return [1, '']; } - $private = $this->getEffectiveTopLevelDomainFromSection($domain, self::PRIVATE_DOMAINS); - if ($private[0] > $icann[0]) { - return $private; + if (self::ICANN_DOMAINS === $section) { + return [$icannSuffixLength, self::ICANN_DOMAINS]; } - if ('' === $section) { - return $icann; + $privateSuffixLength = $this->getPublicSuffixLengthFromSection($domain, self::PRIVATE_DOMAINS); + if ($privateSuffixLength > $icannSuffixLength) { + return [$privateSuffixLength, self::PRIVATE_DOMAINS]; } - return [1, '']; + return [$icannSuffixLength, self::ICANN_DOMAINS]; } /** - * Returns the public suffix matched against a given PSL section. - * - * @return array{0:int, 1:string} + * Returns the public suffix label count for a domain name according to a PSL section. */ - private function getEffectiveTopLevelDomainFromSection(DomainName $domain, string $section): array + private function getPublicSuffixLengthFromSection(DomainName $domain, string $section): int { $rules = $this->rules[$section]; - $matches = []; + $labelCount = 0; foreach ($domain->toAscii() as $label) { //match exception rule if (isset($rules[$label], $rules[$label]['!'])) { @@ -299,7 +296,7 @@ private function getEffectiveTopLevelDomainFromSection(DomainName $domain, strin //match wildcard rule if (isset($rules['*'])) { - $matches[] = $label; + ++$labelCount; break; } @@ -308,15 +305,11 @@ private function getEffectiveTopLevelDomainFromSection(DomainName $domain, strin break; } - $matches[] = $label; + ++$labelCount; /** @var array $rules */ $rules = $rules[$label]; } - if ([] === $matches) { - return [1, '']; - } - - return [count($matches), $section]; + return $labelCount; } } From 5b513340dc0dc1bad4600baa35a56b08d27d8a67 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 10 Apr 2021 14:44:09 +0200 Subject: [PATCH 385/461] Improve TimeToLive --- CHANGELOG.md | 4 +- src/Idna.php | 26 ++++++- src/IdnaInfo.php | 49 ++++-------- src/IdnaInfoTest.php | 6 +- src/Storage/PublicSuffixListPsr16Cache.php | 21 +----- src/Storage/TimeToLive.php | 79 +++++++++----------- src/Storage/TimeToLiveTest.php | 61 ++++++++++----- src/Storage/TopLevelDomainListPsr16Cache.php | 21 +----- 8 files changed, 127 insertions(+), 140 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index abf87027..3dca7eee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,12 +12,12 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will ### Fixed - `.gitattributes` files to be filter out. +- `TimeToLive` marked as internal ### Deprecated - `TimeToLive::fromDateTimeInterface` use `TimeToLive::fromNow` -- `TimeToLive::fromScalar` use `TimeToLive::fromDurationString` -- `TimeToLive::convert` without replacement +- `TimeToLive::fromScalar` use `TimeToLive::convert` ### Removed diff --git a/src/Idna.php b/src/Idna.php index 61c0dd9c..d68e6795 100644 --- a/src/Idna.php +++ b/src/Idna.php @@ -16,10 +16,13 @@ use const INTL_IDNA_VARIANT_UTS46; /** + * @internal * @see https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/uidna_8h.html */ final class Idna { + private const REGEXP_IDNA_PATTERN = '/[^\x20-\x7f]/'; + /** * IDNA options. */ @@ -32,6 +35,28 @@ final class Idna public const IDNA_NONTRANSITIONAL_TO_UNICODE = 0x20; public const IDNA_CHECK_CONTEXTO = 0x40; + /** + * IDNA errors. + */ + public const ERROR_EMPTY_LABEL = 1; + public const ERROR_LABEL_TOO_LONG = 2; + public const ERROR_DOMAIN_NAME_TOO_LONG = 4; + public const ERROR_LEADING_HYPHEN = 8; + public const ERROR_TRAILING_HYPHEN = 0x10; + public const ERROR_HYPHEN_3_4 = 0x20; + public const ERROR_LEADING_COMBINING_MARK = 0x40; + public const ERROR_DISALLOWED = 0x80; + public const ERROR_PUNYCODE = 0x100; + public const ERROR_LABEL_HAS_DOT = 0x200; + public const ERROR_INVALID_ACE_LABEL = 0x400; + public const ERROR_BIDI = 0x800; + public const ERROR_CONTEXTJ = 0x1000; + public const ERROR_CONTEXTO_PUNCTUATION = 0x2000; + public const ERROR_CONTEXTO_DIGITS = 0x4000; + + /** + * IDNA default options. + */ public const IDNA2008_ASCII = self::IDNA_NONTRANSITIONAL_TO_ASCII | self::IDNA_CHECK_BIDI | self::IDNA_USE_STD3_RULES @@ -42,7 +67,6 @@ final class Idna | self::IDNA_CHECK_CONTEXTJ; public const IDNA2003_ASCII = self::IDNA_DEFAULT; public const IDNA2003_UNICODE = self::IDNA_DEFAULT; - private const REGEXP_IDNA_PATTERN = '/[^\x20-\x7f]/'; /** * @codeCoverageIgnore diff --git a/src/IdnaInfo.php b/src/IdnaInfo.php index 51a84bd2..e35bc159 100644 --- a/src/IdnaInfo.php +++ b/src/IdnaInfo.php @@ -8,44 +8,27 @@ use const ARRAY_FILTER_USE_KEY; /** + * @internal * @see https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/uidna_8h.html */ final class IdnaInfo { - /** - * IDNA errors. - */ - public const ERROR_EMPTY_LABEL = 1; - public const ERROR_LABEL_TOO_LONG = 2; - public const ERROR_DOMAIN_NAME_TOO_LONG = 4; - public const ERROR_LEADING_HYPHEN = 8; - public const ERROR_TRAILING_HYPHEN = 0x10; - public const ERROR_HYPHEN_3_4 = 0x20; - public const ERROR_LEADING_COMBINING_MARK = 0x40; - public const ERROR_DISALLOWED = 0x80; - public const ERROR_PUNYCODE = 0x100; - public const ERROR_LABEL_HAS_DOT = 0x200; - public const ERROR_INVALID_ACE_LABEL = 0x400; - public const ERROR_BIDI = 0x800; - public const ERROR_CONTEXTJ = 0x1000; - public const ERROR_CONTEXTO_PUNCTUATION = 0x2000; - public const ERROR_CONTEXTO_DIGITS = 0x4000; private const ERRORS = [ - self::ERROR_EMPTY_LABEL => 'a non-final domain name label (or the whole domain name) is empty', - self::ERROR_LABEL_TOO_LONG => 'a domain name label is longer than 63 bytes', - self::ERROR_DOMAIN_NAME_TOO_LONG => 'a domain name is longer than 255 bytes in its storage form', - self::ERROR_LEADING_HYPHEN => 'a label starts with a hyphen-minus ("-")', - self::ERROR_TRAILING_HYPHEN => 'a label ends with a hyphen-minus ("-")', - self::ERROR_HYPHEN_3_4 => 'a label contains hyphen-minus ("-") in the third and fourth positions', - self::ERROR_LEADING_COMBINING_MARK => 'a label starts with a combining mark', - self::ERROR_DISALLOWED => 'a label or domain name contains disallowed characters', - self::ERROR_PUNYCODE => 'a label starts with "xn--" but does not contain valid Punycode', - self::ERROR_LABEL_HAS_DOT => 'a label contains a dot=full stop', - self::ERROR_INVALID_ACE_LABEL => 'An ACE label does not contain a valid label string', - self::ERROR_BIDI => 'a label does not meet the IDNA BiDi requirements (for right-to-left characters)', - self::ERROR_CONTEXTJ => 'a label does not meet the IDNA CONTEXTJ requirements', - self::ERROR_CONTEXTO_DIGITS => 'a label does not meet the IDNA CONTEXTO requirements for digits', - self::ERROR_CONTEXTO_PUNCTUATION => 'a label does not meet the IDNA CONTEXTO requirements for punctuation characters. Some punctuation characters "Would otherwise have been DISALLOWED" but are allowed in certain contexts', + Idna::ERROR_EMPTY_LABEL => 'a non-final domain name label (or the whole domain name) is empty', + Idna::ERROR_LABEL_TOO_LONG => 'a domain name label is longer than 63 bytes', + Idna::ERROR_DOMAIN_NAME_TOO_LONG => 'a domain name is longer than 255 bytes in its storage form', + Idna::ERROR_LEADING_HYPHEN => 'a label starts with a hyphen-minus ("-")', + Idna::ERROR_TRAILING_HYPHEN => 'a label ends with a hyphen-minus ("-")', + Idna::ERROR_HYPHEN_3_4 => 'a label contains hyphen-minus ("-") in the third and fourth positions', + Idna::ERROR_LEADING_COMBINING_MARK => 'a label starts with a combining mark', + Idna::ERROR_DISALLOWED => 'a label or domain name contains disallowed characters', + Idna::ERROR_PUNYCODE => 'a label starts with "xn--" but does not contain valid Punycode', + Idna::ERROR_LABEL_HAS_DOT => 'a label contains a dot=full stop', + Idna::ERROR_INVALID_ACE_LABEL => 'An ACE label does not contain a valid label string', + Idna::ERROR_BIDI => 'a label does not meet the IDNA BiDi requirements (for right-to-left characters)', + Idna::ERROR_CONTEXTJ => 'a label does not meet the IDNA CONTEXTJ requirements', + Idna::ERROR_CONTEXTO_DIGITS => 'a label does not meet the IDNA CONTEXTO requirements for digits', + Idna::ERROR_CONTEXTO_PUNCTUATION => 'a label does not meet the IDNA CONTEXTO requirements for punctuation characters. Some punctuation characters "Would otherwise have been DISALLOWED" but are allowed in certain contexts', ]; private string $result; diff --git a/src/IdnaInfoTest.php b/src/IdnaInfoTest.php index bb62e782..8dd39356 100644 --- a/src/IdnaInfoTest.php +++ b/src/IdnaInfoTest.php @@ -27,7 +27,7 @@ public function testItCanBeInstantiatedFromArray(): void self::assertSame('', $result->result()); self::assertFalse($result->isTransitionalDifferent()); self::assertSame(0, $result->errors()); - self::assertNull($result->error(IdnaInfo::ERROR_BIDI)); + self::assertNull($result->error(Idna::ERROR_BIDI)); self::assertCount(0, $result->errorList()); } @@ -38,8 +38,8 @@ public function testInvalidSyntaxAfterIDNConversion(): void } catch (SyntaxError $exception) { $result = $exception->idnaInfo(); self::assertInstanceOf(IdnaInfo::class, $result); - self::assertSame(IdnaInfo::ERROR_DISALLOWED, $result->errors()); - self::assertIsString($result->error(IdnaInfo::ERROR_DISALLOWED)); + self::assertSame(Idna::ERROR_DISALLOWED, $result->errors()); + self::assertIsString($result->error(Idna::ERROR_DISALLOWED)); self::assertCount(1, $result->errorList()); } } diff --git a/src/Storage/PublicSuffixListPsr16Cache.php b/src/Storage/PublicSuffixListPsr16Cache.php index 03a5a3c9..a49445fc 100644 --- a/src/Storage/PublicSuffixListPsr16Cache.php +++ b/src/Storage/PublicSuffixListPsr16Cache.php @@ -6,7 +6,6 @@ use DateInterval; use DateTimeInterface; -use InvalidArgumentException; use Pdp\PublicSuffixList; use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; @@ -29,25 +28,7 @@ public function __construct(CacheInterface $cache, string $cachePrefix = '', $ca { $this->cache = $cache; $this->cachePrefix = $cachePrefix; - $this->cacheTtl = $this->setCacheTtl($cacheTtl); - } - - /** - * @param DateInterval|DateTimeInterface|object|int|string|null $cacheTtl storage TTL object should implement the __toString method - * - * @throws InvalidArgumentException if the value can not be computed - */ - private function setCacheTtl($cacheTtl): ?DateInterval - { - if ($cacheTtl instanceof DateInterval || null === $cacheTtl) { - return $cacheTtl; - } - - if ($cacheTtl instanceof DateTimeInterface) { - return TimeToLive::until($cacheTtl); - } - - return TimeToLive::fromDurationString($cacheTtl); + $this->cacheTtl = TimeToLive::convert($cacheTtl); } public function fetch(string $uri): ?PublicSuffixList diff --git a/src/Storage/TimeToLive.php b/src/Storage/TimeToLive.php index 3dadaef4..d4155fe7 100644 --- a/src/Storage/TimeToLive.php +++ b/src/Storage/TimeToLive.php @@ -11,52 +11,27 @@ use TypeError; use function filter_var; use function is_object; -use function is_string; use function method_exists; use const FILTER_VALIDATE_INT; +/** + * @internal + */ final class TimeToLive { - /** - * Returns a DateInterval from string parsing. - * - * @param object|int|string $duration storage TTL object should implement the __toString method - */ - public static function fromDurationString($duration): DateInterval + public static function fromDurationString(string $duration): DateInterval { - if (is_object($duration) && method_exists($duration, '__toString')) { - $duration = (string) $duration; - } - - if (false !== ($seconds = filter_var($duration, FILTER_VALIDATE_INT))) { - if (-1 < $seconds) { - return new DateInterval('PT'.$seconds.'S'); - } - - $interval = new DateInterval('PT'.($seconds * -1).'S'); - $interval->invert = 1; - - return $interval; - } - - if (!is_string($duration)) { - throw new TypeError('The ttl must null, an integer, a string, or a stringable object.'); - } - - /** @var DateInterval|false $date */ - $date = @DateInterval::createFromDateString($duration); - if (!$date instanceof DateInterval) { + /** @var DateInterval|false $interval */ + $interval = @DateInterval::createFromDateString($duration); + if (!$interval instanceof DateInterval) { throw new InvalidArgumentException( 'The ttl value "'.$duration.'" can not be parsable by `DateInterval::createFromDateString`.' ); } - return $date; + return $interval; } - /** - * Returns a DateInterval relative to the current date and time. - */ public static function until(DateTimeInterface $date): DateInterval { return (new DateTimeImmutable('NOW', $date->getTimezone()))->diff($date, false); @@ -79,19 +54,28 @@ public static function fromDateTimeInterface(DateTimeInterface $date): DateInter /** * Returns a DateInterval from string parsing. * - * @param object|int|string $duration storage TTL object should implement the __toString method - * - * @throws InvalidArgumentException if the value can not be parsable - * * DEPRECATION WARNING! This method will be removed in the next major point release * * @deprecated 6.1.0 deprecated - * @codeCoverageIgnore * @see TimeToLive::fromDurationString + * @codeCoverageIgnore + * + * @param object|int|string $duration storage TTL object should implement the __toString method + * + * @throws InvalidArgumentException if the value can not be parsable + * */ public static function fromScalar($duration): DateInterval { - return self::fromDurationString($duration); + if (is_object($duration) && method_exists($duration, '__toString')) { + $duration = (string) $duration; + } + + if (!is_scalar($duration)) { + throw new TypeError('The duration type is unsupported or is an non stringable object.'); + } + + return self::fromDurationString((string) $duration); } /** @@ -101,11 +85,6 @@ public static function fromScalar($duration): DateInterval * * @throws InvalidArgumentException if the value can not be computed * @throws TypeError if the value type is not recognized - * - * DEPRECATION WARNING! This method will be removed in the next major point release - * - * @deprecated 6.1.0 deprecated - * @codeCoverageIgnore */ public static function convert($ttl): ?DateInterval { @@ -117,6 +96,18 @@ public static function convert($ttl): ?DateInterval return self::until($ttl); } + if (is_object($ttl) && method_exists($ttl, '__toString')) { + $ttl = (string) $ttl; + } + + if (false !== ($seconds = filter_var($ttl, FILTER_VALIDATE_INT))) { + return self::fromDurationString($seconds.' seconds'); + } + + if (!is_string($ttl)) { + throw new TypeError('The duration type is unsupported or is an non stringable object.'); + } + return self::fromDurationString($ttl); } } diff --git a/src/Storage/TimeToLiveTest.php b/src/Storage/TimeToLiveTest.php index 8e2ed4c2..febb0fde 100644 --- a/src/Storage/TimeToLiveTest.php +++ b/src/Storage/TimeToLiveTest.php @@ -21,39 +21,69 @@ public function testItDoesNotReturnTheAbsoluteInterval(): void } /** - * @param object|string|int $input * @dataProvider validDurationString */ - public function testItCanBeInstantiatedFromDurationInput($input, DateInterval $expected): void + public function testItCanBeInstantiatedFromDurationInput(string $input, DateInterval $expected): void { self::assertEquals($expected, TimeToLive::fromDurationString($input)); } /** - * @return iterable + * @return iterable */ public function validDurationString(): iterable { $threeDays = new DateInterval('P3D'); + yield 'string' => [ + 'input' => '3 days', + 'expected' => $threeDays, + ]; + + yield 'stringable negative days' => [ + 'input' => '-3 days', + 'expected' => DateInterval::createFromDateString('-3 DAYS'), + ]; + } + + /** + * @param int|string|object|null|DateInterval $input + * @param ?DateInterval $expected + * @dataProvider validDurationInt + */ + public function testItCanBeInstantiatedFromSeconds($input, ?DateInterval $expected): void + { + self::assertEquals($expected, TimeToLive::convert($input)); + } + + /** + * @return iterable + */ + public function validDurationInt(): iterable + { + $seconds = new DateInterval('PT2345S'); + + yield 'DateInterval' => [ + 'input' => $seconds, + 'expected' => $seconds, + ]; + + yield 'null' => [ + 'input' => null, + 'expected' => null, + ]; + yield 'stringable object' => [ 'input' => new class() { public function __toString(): string { - return '3 days'; + return '2345'; } }, - 'expected' => $threeDays, - ]; - - yield 'string' => [ - 'input' => '3 days', - 'expected' => $threeDays, + 'expected' => $seconds, ]; - $seconds = new DateInterval('PT2345S'); - - yield 'stringable seconds' => [ + yield 'numeric string' => [ 'input' => '2345', 'expected' => $seconds, ]; @@ -63,12 +93,9 @@ public function __toString(): string 'expected' => $seconds, ]; - $negativeInterval = clone $seconds; - $negativeInterval->invert = 1; - yield 'negative seconds' => [ 'input' => '-2345', - 'expected' => $negativeInterval, + 'expected' => DateInterval::createFromDateString('-2345 seconds'), ]; } } diff --git a/src/Storage/TopLevelDomainListPsr16Cache.php b/src/Storage/TopLevelDomainListPsr16Cache.php index 36e2195f..e0838fac 100644 --- a/src/Storage/TopLevelDomainListPsr16Cache.php +++ b/src/Storage/TopLevelDomainListPsr16Cache.php @@ -6,7 +6,6 @@ use DateInterval; use DateTimeInterface; -use InvalidArgumentException; use Pdp\TopLevelDomainList; use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; @@ -29,25 +28,7 @@ public function __construct(CacheInterface $cache, string $cachePrefix = '', $ca { $this->cache = $cache; $this->cachePrefix = $cachePrefix; - $this->cacheTtl = $this->setCacheTtl($cacheTtl); - } - - /** - * @param DateInterval|DateTimeInterface|object|int|string|null $cacheTtl storage TTL object should implement the __toString method - * - * @throws InvalidArgumentException if the value can not be computed - */ - private function setCacheTtl($cacheTtl): ?DateInterval - { - if ($cacheTtl instanceof DateInterval || null === $cacheTtl) { - return $cacheTtl; - } - - if ($cacheTtl instanceof DateTimeInterface) { - return TimeToLive::until($cacheTtl); - } - - return TimeToLive::fromDurationString($cacheTtl); + $this->cacheTtl = TimeToLive::convert($cacheTtl); } public function fetch(string $uri): ?TopLevelDomainList From 753cae23f7518e053217f3d410de14b405de6457 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 18 Jun 2021 08:06:23 +0200 Subject: [PATCH 386/461] Fix UnableToResolveDomain exception messqge --- src/UnableToResolveDomain.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/UnableToResolveDomain.php b/src/UnableToResolveDomain.php index 496e052e..dd5278a9 100644 --- a/src/UnableToResolveDomain.php +++ b/src/UnableToResolveDomain.php @@ -23,7 +23,7 @@ public static function dueToInvalidSecondLevelDomain(DomainName $domain): self public static function dueToIdenticalValue(DomainName $domain): self { - return new self('The public suffix and the domain name are is identical `'.$domain->toString().'`.', $domain); + return new self('The public suffix and the domain name are identical `'.$domain->toString().'`.', $domain); } public static function dueToMissingSuffix(DomainName $domain, string $type): self From 421f199361f81ce098cf154841653aac1ce97edc Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 18 Jun 2021 08:07:10 +0200 Subject: [PATCH 387/461] Host::toUnicode must never throws according to RFC3490 --- src/DomainTest.php | 9 +++++---- src/Idna.php | 12 ++++++++++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/DomainTest.php b/src/DomainTest.php index 1c32a146..aece2374 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -35,11 +35,12 @@ public function invalidDomainProvider(): iterable ]; } - public function testToUnicodeThrowsException(): void + public function testToUnicodeNeverThrowsException(): void { - $this->expectException(SyntaxError::class); - - Domain::fromIDNA2008('xn--a-ecp.ru')->toUnicode(); + self::assertSame( + 'xn--a-ecp.ru', + Domain::fromIDNA2008('xN--a-eCp.rU')->toUnicode()->toString() + ); } public function testDomainInternalPhpMethod(): void diff --git a/src/Idna.php b/src/Idna.php index d68e6795..b3b03f27 100644 --- a/src/Idna.php +++ b/src/Idna.php @@ -124,8 +124,16 @@ public static function toUnicode(string $domain, int $options): IdnaInfo /** @param-out array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */ idn_to_utf8($domain, $options, INTL_IDNA_VARIANT_UTS46, $idnaInfo); - /** @var array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */ - return self::createIdnaInfo($domain, $idnaInfo); + try { + /** @var array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */ + return self::createIdnaInfo($domain, $idnaInfo); + } catch (SyntaxError $exception) { + if ($exception->idnaInfo() instanceof IdnaInfo) { + return IdnaInfo::fromIntl(['result' => $domain, 'isTransitionalDifferent' => false, 'errors' => 0]); + } + + throw $exception; + } } /** From 7e6eae561a20491c30afd6a864e2c5a0267126c8 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 18 Jun 2021 08:07:25 +0200 Subject: [PATCH 388/461] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3dca7eee..bdd83675 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - `.gitattributes` files to be filter out. - `TimeToLive` marked as internal +- `Host::toUnicode` method MUST never throw exceptions on conversion according to RFC3490. +- `UnableToResolveDomain` typo in the exception message ### Deprecated From d9b5435ca3db7f545e6612d21ee8316324af92d2 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 19 Jun 2021 08:28:03 +0200 Subject: [PATCH 389/461] Bugfix named parameter mismatch --- src/Idna.php | 31 +++++++++---------------------- src/TopLevelDomains.php | 6 +++--- 2 files changed, 12 insertions(+), 25 deletions(-) diff --git a/src/Idna.php b/src/Idna.php index b3b03f27..3867eb10 100644 --- a/src/Idna.php +++ b/src/Idna.php @@ -102,16 +102,19 @@ public static function toAscii(string $domain, int $options): IdnaInfo /** @param-out array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */ idn_to_ascii($domain, $options, INTL_IDNA_VARIANT_UTS46, $idnaInfo); - /** @var array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */ - return self::createIdnaInfo($domain, $idnaInfo); + /** @var array{result:string, isTransitionalDifferent:bool, errors:int} $idnaInfo */ + $info = IdnaInfo::fromIntl($idnaInfo); + if (0 !== $info->errors()) { + throw SyntaxError::dueToIDNAError($domain, $info); + } + + return $info; } /** * Converts the input to its IDNA UNICODE form. * * This method returns the string converted to IDN UNICODE form - * - * @throws SyntaxError if the string can not be converted to UNICODE using IDN UTS46 algorithm */ public static function toUnicode(string $domain, int $options): IdnaInfo { @@ -124,26 +127,10 @@ public static function toUnicode(string $domain, int $options): IdnaInfo /** @param-out array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */ idn_to_utf8($domain, $options, INTL_IDNA_VARIANT_UTS46, $idnaInfo); - try { - /** @var array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */ - return self::createIdnaInfo($domain, $idnaInfo); - } catch (SyntaxError $exception) { - if ($exception->idnaInfo() instanceof IdnaInfo) { - return IdnaInfo::fromIntl(['result' => $domain, 'isTransitionalDifferent' => false, 'errors' => 0]); - } - - throw $exception; - } - } - - /** - * @param array{result:string, isTransitionalDifferent:bool, errors:int} $idnaInfo - */ - private static function createIdnaInfo(string $domain, array $idnaInfo): IdnaInfo - { + /** @var array{result:string, isTransitionalDifferent:bool, errors:int} $idnaInfo */ $info = IdnaInfo::fromIntl($idnaInfo); if (0 !== $info->errors()) { - throw SyntaxError::dueToIDNAError($domain, $info); + return IdnaInfo::fromIntl(['result' => $domain, 'isTransitionalDifferent' => false, 'errors' => 0]); } return $info; diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 4623ad07..d97d0065 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -241,11 +241,11 @@ private function containsTopLevelDomain(DomainName $domain): bool } /** - * @param mixed $domain a domain in a type that can be converted into a DomainInterface instance + * @param mixed $host a domain in a type that can be converted into a DomainInterface instance */ - public function getIANADomain($domain): ResolvedDomainName + public function getIANADomain($host): ResolvedDomainName { - $domain = $this->validateDomain($domain); + $domain = $this->validateDomain($host); if (!$this->containsTopLevelDomain($domain)) { throw UnableToResolveDomain::dueToMissingSuffix($domain, 'IANA'); } From 2df74130b307284cc8266e78ec114b811d6c67c6 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 19 Jun 2021 08:28:29 +0200 Subject: [PATCH 390/461] Update package php-cs-fixer settings --- .php_cs => .php-cs-fixer.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) rename .php_cs => .php-cs-fixer.php (87%) diff --git a/.php_cs b/.php-cs-fixer.php similarity index 87% rename from .php_cs rename to .php-cs-fixer.php index 56145cef..5560b22f 100644 --- a/.php_cs +++ b/.php-cs-fixer.php @@ -4,7 +4,9 @@ ->in(__DIR__.'/src') ; -return PhpCsFixer\Config::create() +$config = new PhpCsFixer\Config(); + +return $config ->setRules([ '@PSR2' => true, 'array_syntax' => ['syntax' => 'short'], @@ -16,7 +18,6 @@ 'no_leading_import_slash' => true, 'no_superfluous_phpdoc_tags' => true, 'no_trailing_comma_in_singleline_array' => true, - 'no_superfluous_phpdoc_tags' => true, 'no_unused_imports' => true, 'ordered_imports' => ['imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha'], 'phpdoc_add_missing_param_annotation' => ['only_untyped' => false], @@ -26,14 +27,13 @@ 'phpdoc_scalar' => true, 'phpdoc_to_comment' => false, 'phpdoc_summary' => true, - 'psr0' => true, - 'psr4' => true, + 'psr_autoloading' => true, 'return_type_declaration' => ['space_before' => 'none'], 'single_blank_line_before_namespace' => true, 'single_quote' => true, 'space_after_semicolon' => true, 'ternary_operator_spaces' => true, - 'trailing_comma_in_multiline_array' => true, + 'trailing_comma_in_multiline' => true, 'trim_array_spaces' => true, 'whitespace_after_comma_in_array' => true, 'yoda_style' => true, From 8607e36e1e39ce9ceb4398dda69567beff724453 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 19 Jun 2021 09:47:13 +0200 Subject: [PATCH 391/461] Prepare 6.1.0 release --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bdd83675..84076d5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will be documented in this file -## Next - TBD +## 6.1.0 - 2021-06-19 ### Added From 31df0ce32bf558388f1627b861acfc8b08dafc3d Mon Sep 17 00:00:00 2001 From: Tomas Date: Wed, 25 Aug 2021 13:12:47 +0300 Subject: [PATCH 392/461] Allow guzzle/psr7 v2 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 6d8667fb..ee994dfc 100644 --- a/composer.json +++ b/composer.json @@ -48,7 +48,7 @@ "require-dev": { "friendsofphp/php-cs-fixer": "^2.16", "guzzlehttp/guzzle": "^7.0", - "guzzlehttp/psr7": "^1.6", + "guzzlehttp/psr7": "^1.6|^2.0", "phpstan/phpstan": "^0.12", "phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan-strict-rules": "^0.12", From 6752e76a62f8ba5ac345404cc5fffbf38a9792d5 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 25 Aug 2021 12:53:10 +0200 Subject: [PATCH 393/461] Update development dependencies --- .gitignore | 1 + composer.json | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 25babfa5..31b30660 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,6 @@ docs build .idea .php_cs.cache +.php-cs-fixer.cache .phpunit.result.cache composer.lock diff --git a/composer.json b/composer.json index ee994dfc..232e354e 100644 --- a/composer.json +++ b/composer.json @@ -46,13 +46,13 @@ "ext-json": "*" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.16", + "friendsofphp/php-cs-fixer": "^2.19||^3.0", "guzzlehttp/guzzle": "^7.0", - "guzzlehttp/psr7": "^1.6|^2.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^9.3", + "guzzlehttp/psr7": "^1.6||^2.0", + "phpstan/phpstan": "^0.12.89", + "phpstan/phpstan-phpunit": "^0.12.20", + "phpstan/phpstan-strict-rules": "^0.12.9", + "phpunit/phpunit": "^9.5", "psalm/plugin-phpunit": "^0.15.0", "psr/http-factory": "^1.0", "psr/simple-cache": "^1.0", From 23e8071aba65e90fdf9bb798d4937dd51eece8b8 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 25 Aug 2021 12:53:28 +0200 Subject: [PATCH 394/461] Improve Public Suffix List parsing --- src/Rules.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Rules.php b/src/Rules.php index a5b1830e..89e8df6a 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -290,18 +290,18 @@ private function getPublicSuffixLengthFromSection(DomainName $domain, string $se $labelCount = 0; foreach ($domain->toAscii() as $label) { //match exception rule - if (isset($rules[$label], $rules[$label]['!'])) { + if (isset($rules[$label]['!'])) { break; } //match wildcard rule - if (isset($rules['*'])) { + if (array_key_exists('*', $rules)) { ++$labelCount; break; } //no match found - if (!isset($rules[$label])) { + if (!array_key_exists($label, $rules)) { break; } From add17e60d14e8247be3bb5a102cef2c842b75776 Mon Sep 17 00:00:00 2001 From: Sergiy Petrov Date: Wed, 17 Nov 2021 21:17:58 +0200 Subject: [PATCH 395/461] Test against php 8.1 --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index bc5da59a..6afb0955 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - php: [ '7.4', '8.0' ] + php: [ '7.4', '8.0', '8.1' ] composer-flags: [ '' ] phpunit-flags: [ '--coverage-text' ] steps: From dccc92490d816c99f88f4709cc6b142541f271b4 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 18 Feb 2022 07:29:30 +0100 Subject: [PATCH 396/461] [#321] bugfix suffix resolution for private domain --- .github/workflows/build.yaml | 6 +- CHANGELOG.md | 18 + composer.json | 2 +- src/Rules.php | 5 + src/RulesTest.php | 11 + test_data/public_suffix_list.dat | 3385 ++++++++++++++++++++++-------- 6 files changed, 2509 insertions(+), 918 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 6afb0955..08c130ae 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -23,8 +23,8 @@ jobs: - run: composer update --no-progress ${{ matrix.composer-flags }} - run: composer phpunit - run: composer phpstan - if: ${{ matrix.php == '8.0' }} + if: ${{ matrix.php == '8.1' }} - run: composer psalm - if: ${{ matrix.php == '8.0' }} + if: ${{ matrix.php == '8.1' }} - run: composer phpcs - if: ${{ matrix.php == '8.0' }} + if: ${{ matrix.php == '8.1' }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 84076d5e..13b80827 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,24 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will be documented in this file +## 6.1.1 - 2022-02-18 + +### Added + +- None + +### Fixed + +- [#321](https://github.com/jeremykendall/php-domain-parser/issues/321) improve resolving private domain suffix + +### Deprecated + +- None + +### Removed + +- None + ## 6.1.0 - 2021-06-19 ### Added diff --git a/composer.json b/composer.json index 232e354e..72bbf6a6 100644 --- a/composer.json +++ b/composer.json @@ -46,7 +46,7 @@ "ext-json": "*" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.19||^3.0", + "friendsofphp/php-cs-fixer": "^2.19||~v3.4.0", "guzzlehttp/guzzle": "^7.0", "guzzlehttp/psr7": "^1.6||^2.0", "phpstan/phpstan": "^0.12.89", diff --git a/src/Rules.php b/src/Rules.php index 89e8df6a..a0e47cde 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -302,6 +302,11 @@ private function getPublicSuffixLengthFromSection(DomainName $domain, string $se //no match found if (!array_key_exists($label, $rules)) { + // for private domain suffix MUST be fully matched else no suffix is found + // https://github.com/jeremykendall/php-domain-parser/issues/321 + if (self::PRIVATE_DOMAINS === $section && [] !== $rules) { + $labelCount = 0; + } break; } diff --git a/src/RulesTest.php b/src/RulesTest.php index 1df3859e..5bf1322c 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -593,4 +593,15 @@ public function effectiveTLDProvider(): iterable ], ]; } + + public function testIssue321(): void + { + $result = self::$rules->resolve('node857-gelofesta.users.scale.virtualcloud.com.br'); + self::assertSame('users.scale.virtualcloud.com.br', $result->suffix()->value()); + self::assertTrue($result->suffix()->isPrivate()); + + $result = self::$rules->resolve('clientportal.virtualcloud.com.br'); + self::assertSame('com.br', $result->suffix()->value()); + self::assertTrue($result->suffix()->isICANN()); + } } diff --git a/test_data/public_suffix_list.dat b/test_data/public_suffix_list.dat index ebd88d4c..086b8dcc 100644 --- a/test_data/public_suffix_list.dat +++ b/test_data/public_suffix_list.dat @@ -79,7 +79,6 @@ exchange.aero express.aero federation.aero flight.aero -freight.aero fuel.aero gliding.aero government.aero @@ -155,8 +154,13 @@ mil.al net.al org.al -// am : https://en.wikipedia.org/wiki/.am +// am : https://www.amnic.net/policy/en/Policy_EN.pdf am +co.am +com.am +commune.am +net.am +org.am // ao : https://en.wikipedia.org/wiki/.ao // http://www.dns.ao/REGISTR.DOC @@ -171,17 +175,21 @@ it.ao // aq : https://en.wikipedia.org/wiki/.aq aq -// ar : https://nic.ar/nic-argentina/normativa-vigente +// ar : https://nic.ar/es/nic-argentina/normativa ar +bet.ar com.ar +coop.ar edu.ar gob.ar gov.ar int.ar mil.ar musica.ar +mutual.ar net.ar org.ar +senasa.ar tur.ar // arpa : https://en.wikipedia.org/wiki/.arpa @@ -208,6 +216,7 @@ ac.at co.at gv.at or.at +sth.ac.at // au : https://en.wikipedia.org/wiki/.au // http://www.auda.org.au/ @@ -235,6 +244,8 @@ vic.au wa.au // 3LDs act.edu.au +catholic.edu.au +// eq.edu.au - Removed at the request of the Queensland Department of Education nsw.edu.au nt.edu.au qld.edu.au @@ -250,6 +261,9 @@ sa.gov.au tas.gov.au vic.gov.au wa.gov.au +// 4LDs +// education.tas.edu.au - Removed at the request of the Department of Education Tasmania +schools.nsw.edu.au // aw : https://en.wikipedia.org/wiki/.aw aw @@ -381,42 +395,86 @@ gov.bm net.bm org.bm -// bn : https://en.wikipedia.org/wiki/.bn -*.bn +// bn : http://www.bnnic.bn/faqs +bn +com.bn +edu.bn +gov.bn +net.bn +org.bn -// bo : http://www.nic.bo/ +// bo : https://nic.bo/delegacion2015.php#h-1.10 bo com.bo edu.bo -gov.bo gob.bo int.bo org.bo net.bo mil.bo tv.bo +web.bo +// Social Domains +academia.bo +agro.bo +arte.bo +blog.bo +bolivia.bo +ciencia.bo +cooperativa.bo +democracia.bo +deporte.bo +ecologia.bo +economia.bo +empresa.bo +indigena.bo +industria.bo +info.bo +medicina.bo +movimiento.bo +musica.bo +natural.bo +nombre.bo +noticias.bo +patria.bo +politica.bo +profesional.bo +plurinacional.bo +pueblo.bo +revista.bo +salud.bo +tecnologia.bo +tksat.bo +transporte.bo +wiki.bo // br : http://registro.br/dominio/categoria.html // Submitted by registry br +9guacu.br abc.br adm.br adv.br agr.br aju.br am.br +anani.br aparecida.br +app.br arq.br art.br ato.br b.br +barueri.br belem.br bhz.br +bib.br bio.br blog.br bmd.br boavista.br bsb.br +campinagrande.br campinas.br caxias.br cim.br @@ -425,13 +483,19 @@ cnt.br com.br contagem.br coop.br +coz.br cri.br cuiaba.br +curitiba.br def.br +des.br +det.br +dev.br ecn.br eco.br edu.br emp.br +enf.br eng.br esp.br etc.br @@ -444,8 +508,10 @@ fm.br fnd.br fortal.br fot.br +foz.br fst.br g12.br +geo.br ggf.br goiania.br gov.br @@ -489,9 +555,12 @@ jor.br jus.br leg.br lel.br +log.br londrina.br macapa.br maceio.br +manaus.br +maringa.br mat.br med.br mil.br @@ -505,6 +574,7 @@ niteroi.br not.br ntr.br odo.br +ong.br org.br osasco.br palmas.br @@ -518,17 +588,26 @@ qsl.br radio.br rec.br recife.br +rep.br ribeirao.br rio.br riobranco.br +riopreto.br salvador.br sampa.br +santamaria.br +santoandre.br +saobernardo.br +saogonca.br +seg.br sjc.br slg.br slz.br sorocaba.br srv.br taxi.br +tc.br +tec.br teo.br the.br tmp.br @@ -656,11 +735,12 @@ gouv.ci *.ck !www.ck -// cl : https://en.wikipedia.org/wiki/.cl +// cl : https://www.nic.cl +// Confirmed by .CL registry cl -gov.cl -gob.cl co.cl +gob.cl +gov.cl mil.cl // cm : https://en.wikipedia.org/wiki/.cm plus bug 981927 @@ -762,7 +842,13 @@ gov.cu inf.cu // cv : https://en.wikipedia.org/wiki/.cv +// cv : http://www.dns.cv/tldcv_portal/do?com=DS;5446457100;111;+PAGE(4000018)+K-CAT-CODIGO(RDOM)+RCNT(100); <- registration rules cv +com.cv +edu.cv +int.cv +nome.cv +org.cv // cw : http://www.una.cw/cw_registry/ // Confirmed by registry 2013-03-26 @@ -779,6 +865,7 @@ gov.cx // cy : http://www.nic.cy/ // Submitted by registry Panayiotou Fotia +// namespace policies URL https://www.nic.cy/portal//sites/default/files/symfonia_gia_eggrafi.pdf cy ac.cy biz.cy @@ -786,10 +873,9 @@ com.cy ekloges.cy gov.cy ltd.cy -name.cy +mil.cy net.cy org.cy -parliament.cy press.cy pro.cy tm.cy @@ -830,16 +916,18 @@ org.do sld.do web.do -// dz : https://en.wikipedia.org/wiki/.dz +// dz : http://www.nic.dz/images/pdf_nic/charte.pdf dz +art.dz +asso.dz com.dz +edu.dz +gov.dz org.dz net.dz -gov.dz -edu.dz -asso.dz pol.dz -art.dz +soc.dz +tm.dz // ec : http://www.nic.ec/reg/paso1.asp // Submitted by registry @@ -919,30 +1007,44 @@ fi // TODO: Check for updates (expected to be phased out around Q1/2009) aland.fi -// fj : https://en.wikipedia.org/wiki/.fj -*.fj +// fj : http://domains.fj/ +// Submitted by registry 2020-02-11 +fj +ac.fj +biz.fj +com.fj +gov.fj +info.fj +mil.fj +name.fj +net.fj +org.fj +pro.fj // fk : https://en.wikipedia.org/wiki/.fk *.fk // fm : https://en.wikipedia.org/wiki/.fm +com.fm +edu.fm +net.fm +org.fm fm // fo : https://en.wikipedia.org/wiki/.fo fo // fr : http://www.afnic.fr/ -// domaines descriptifs : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-descriptifs +// domaines descriptifs : https://www.afnic.fr/medias/documents/Cadre_legal/Afnic_Naming_Policy_12122016_VEN.pdf fr -com.fr asso.fr +com.fr +gouv.fr nom.fr prd.fr -presse.fr tm.fr -// domaines sectoriels : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-sectoriels +// domaines sectoriels : https://www.afnic.fr/en/products-and-services/the-fr-tld/sector-based-fr-domains-4.html aeroport.fr -assedic.fr avocat.fr avoues.fr cci.fr @@ -950,7 +1052,6 @@ chambagri.fr chirurgiens-dentistes.fr experts-comptables.fr geometre-expert.fr -gouv.fr greta.fr huissier-justice.fr medecin.fr @@ -967,6 +1068,8 @@ ga gb // gd : https://en.wikipedia.org/wiki/.gd +edu.gd +gov.gd gd // ge : http://www.nic.net.ge/policy_en.pdf @@ -1058,7 +1161,7 @@ gov.gr // gs : https://en.wikipedia.org/wiki/.gs gs -// gt : http://www.gt/politicas_de_registro.html +// gt : https://www.gt/sitio/registration_policy.php?lang=en gt com.gt edu.gt @@ -1068,10 +1171,21 @@ mil.gt net.gt org.gt -// gu : http://gadao.gov.gu/registration.txt -*.gu +// gu : http://gadao.gov.gu/register.html +// University of Guam : https://www.uog.edu +// Submitted by uognoc@triton.uog.edu +gu +com.gu +edu.gu +gov.gu +guam.gu +info.gu +net.gu +org.gu +web.gu // gw : https://en.wikipedia.org/wiki/.gw +// gw : https://nic.gw/regras/ gw // gy : https://en.wikipedia.org/wiki/.gy @@ -1084,7 +1198,7 @@ gov.gy net.gy org.gy -// hk : https://www.hkdnr.hk +// hk : https://www.hkirc.hk // Submitted by registry hk com.hk @@ -1183,7 +1297,7 @@ tozsde.hu utazas.hu video.hu -// id : https://register.pandi.or.id/ +// id : https://pandi.id/en/domain/registration-requirements/ id ac.id biz.id @@ -1194,6 +1308,7 @@ mil.id my.id net.id or.id +ponpes.id sch.id web.id @@ -1295,10 +1410,8 @@ int.is it gov.it edu.it -// Reserved geo-names: -// http://www.nic.it/documenti/regolamenti-e-linee-guida/regolamento-assegnazione-versione-6.0.pdf -// There is also a list of reserved geo-names corresponding to Italian municipalities -// http://www.nic.it/documenti/appendice-c.pdf, but it is not included here. +// Reserved geo-names (regions and provinces): +// https://www.nic.it/sites/default/files/archivio/docs/Regulation_assignation_v7.1.pdf // Regions abr.it abruzzo.it @@ -1352,6 +1465,12 @@ sicily.it taa.it tos.it toscana.it +trentin-sud-tirol.it +trentin-süd-tirol.it +trentin-sudtirol.it +trentin-südtirol.it +trentin-sued-tirol.it +trentin-suedtirol.it trentino-a-adige.it trentino-aadige.it trentino-alto-adige.it @@ -1359,9 +1478,12 @@ trentino-altoadige.it trentino-s-tirol.it trentino-stirol.it trentino-sud-tirol.it +trentino-süd-tirol.it trentino-sudtirol.it +trentino-südtirol.it trentino-sued-tirol.it trentino-suedtirol.it +trentino.it trentinoa-adige.it trentinoaadige.it trentinoalto-adige.it @@ -1369,9 +1491,17 @@ trentinoaltoadige.it trentinos-tirol.it trentinostirol.it trentinosud-tirol.it +trentinosüd-tirol.it trentinosudtirol.it +trentinosüdtirol.it trentinosued-tirol.it trentinosuedtirol.it +trentinsud-tirol.it +trentinsüd-tirol.it +trentinsudtirol.it +trentinsüdtirol.it +trentinsued-tirol.it +trentinsuedtirol.it tuscany.it umb.it umbria.it @@ -1386,7 +1516,13 @@ valleaosta.it valled-aosta.it valledaosta.it vallee-aoste.it +vallée-aoste.it +vallee-d-aoste.it +vallée-d-aoste.it valleeaoste.it +valléeaoste.it +valleedaoste.it +valléedaoste.it vao.it vda.it ven.it @@ -1419,6 +1555,9 @@ at.it av.it avellino.it ba.it +balsan-sudtirol.it +balsan-südtirol.it +balsan-suedtirol.it balsan.it bari.it barletta-trani-andria.it @@ -1433,13 +1572,21 @@ bl.it bn.it bo.it bologna.it +bolzano-altoadige.it bolzano.it +bozen-sudtirol.it +bozen-südtirol.it +bozen-suedtirol.it bozen.it br.it brescia.it brindisi.it bs.it bt.it +bulsan-sudtirol.it +bulsan-südtirol.it +bulsan-suedtirol.it +bulsan.it bz.it ca.it cagliari.it @@ -1457,7 +1604,9 @@ catanzaro.it cb.it ce.it cesena-forli.it +cesena-forlì.it cesenaforli.it +cesenaforlì.it ch.it chieti.it ci.it @@ -1488,7 +1637,9 @@ florence.it fm.it foggia.it forli-cesena.it +forlì-cesena.it forlicesena.it +forlìcesena.it fr.it frosinone.it ge.it @@ -1619,6 +1770,7 @@ sp.it sr.it ss.it suedtirol.it +südtirol.it sv.it ta.it taranto.it @@ -1637,7 +1789,6 @@ trani-barletta-andria.it traniandriabarletta.it tranibarlettaandria.it trapani.it -trentino.it trento.it treviso.it trieste.it @@ -3492,8 +3643,17 @@ uenohara.yamanashi.jp yamanakako.yamanashi.jp yamanashi.yamanashi.jp -// ke : http://www.kenic.or.ke/index.php?option=com_content&task=view&id=117&Itemid=145 -*.ke +// ke : http://www.kenic.or.ke/index.php/en/ke-domains/ke-domains +ke +ac.ke +co.ke +go.ke +info.ke +me.ke +mobi.ke +ne.ke +or.ke +sc.ke // kg : http://www.domain.kg/dmn_n.html kg @@ -3591,17 +3751,24 @@ jeonnam.kr seoul.kr ulsan.kr -// kw : https://en.wikipedia.org/wiki/.kw -*.kw +// kw : https://www.nic.kw/policies/ +// Confirmed by registry +kw +com.kw +edu.kw +emb.kw +gov.kw +ind.kw +net.kw +org.kw // ky : http://www.icta.ky/da_ky_reg_dom.php // Confirmed by registry 2008-06-17 ky -edu.ky -gov.ky com.ky -org.ky +edu.ky net.ky +org.ky // kz : https://en.wikipedia.org/wiki/.kz // see also: http://www.nic.kz/rules/index.jsp @@ -3647,7 +3814,7 @@ gov.lc // li : https://en.wikipedia.org/wiki/.li li -// lk : http://www.nic.lk/seclevpr.html +// lk : https://www.nic.lk/index.php/domain-registration/lk-domain-naming-structure lk gov.lk sch.lk @@ -3674,10 +3841,18 @@ gov.lr org.lr net.lr -// ls : https://en.wikipedia.org/wiki/.ls +// ls : http://www.nic.ls/ +// Confirmed by registry ls +ac.ls +biz.ls co.ls +edu.ls +gov.ls +info.ls +net.ls org.ls +sc.ls // lt : https://en.wikipedia.org/wiki/.lt lt @@ -4206,8 +4381,6 @@ niepce.museum norfolk.museum north.museum nrw.museum -nuernberg.museum -nuremberg.museum nyc.museum nyny.museum oceanographic.museum @@ -4430,15 +4603,17 @@ gob.mx edu.mx net.mx -// my : http://www.mynic.net.my/ +// my : http://www.mynic.my/ +// Available strings: https://mynic.my/resources/domains/buying-a-domain/ my +biz.my com.my -net.my -org.my -gov.my edu.my +gov.my mil.my name.my +net.my +org.my // mz : http://www.uem.mz/ // Submitted by registry @@ -4535,16 +4710,13 @@ web.ni // ccTLD for the Netherlands nl -// BV.nl will be a registry for dutch BV's (besloten vennootschap) -bv.nl - -// no : http://www.norid.no/regelverk/index.en.html -// The Norwegian registry has declined to notify us of updates. The web pages -// referenced below are the official source of the data. There is also an -// announce mailing list: -// https://postlister.uninett.no/sympa/info/norid-diskusjon +// no : https://www.norid.no/en/om-domenenavn/regelverk-for-no/ +// Norid geographical second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-b/ +// Norid category second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-c/ +// Norid category second-level domains managed by parties other than Norid : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-d/ +// RSS feed: https://teknisk.norid.no/en/feed/ no -// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html +// Norid category second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-c/ fhs.no vgs.no fylkesbibl.no @@ -4552,13 +4724,13 @@ folkebibl.no museum.no idrett.no priv.no -// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html +// Norid category second-level domains managed by parties other than Norid : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-d/ mil.no stat.no dep.no kommune.no herad.no -// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html +// Norid geographical second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-b/ // counties aa.no ah.no @@ -5687,7 +5859,7 @@ com.ps org.ps net.ps -// pt : http://online.dns.pt/dns/start_dns +// pt : https://www.dns.pt/en/domain/pt-terms-and-conditions-registration-rules/ pt net.pt gov.pt @@ -5758,26 +5930,19 @@ gov.rs in.rs org.rs -// ru : https://cctld.ru/en/domains/domens_ru/reserved/ +// ru : https://cctld.ru/files/pdf/docs/en/rules_ru-rf.pdf +// Submitted by George Georgievsky ru -ac.ru -edu.ru -gov.ru -int.ru -mil.ru -test.ru -// rw : http://www.nic.rw/cgi-bin/policy.pl +// rw : https://www.ricta.org.rw/sites/default/files/resources/registry_registrar_contract_0.pdf rw -gov.rw -net.rw -edu.rw ac.rw -com.rw co.rw -int.rw +coop.rw +gov.rw mil.rw -gouv.rw +net.rw +org.rw // sa : http://www.nic.net.sa/ sa @@ -5912,15 +6077,30 @@ org.sn perso.sn univ.sn -// so : http://www.soregistry.com/ +// so : http://sonic.so/policies/ so com.so +edu.so +gov.so +me.so net.so org.so // sr : https://en.wikipedia.org/wiki/.sr sr +// ss : https://registry.nic.ss/ +// Submitted by registry +ss +biz.ss +com.ss +edu.ss +gov.ss +me.ss +net.ss +org.ss +sch.ss + // st : http://www.nic.st/html/policyrules/ st co.st @@ -5928,7 +6108,6 @@ com.st consulado.st edu.st embaixada.st -gov.st mil.st net.st org.st @@ -6033,29 +6212,22 @@ gov.tm mil.tm edu.tm -// tn : https://en.wikipedia.org/wiki/.tn -// http://whois.ati.tn/ +// tn : http://www.registre.tn/fr/ +// https://whois.ati.tn/ tn com.tn ens.tn fin.tn gov.tn ind.tn +info.tn intl.tn +mincom.tn nat.tn net.tn org.tn -info.tn perso.tn tourism.tn -edunet.tn -rnrt.tn -rns.tn -rnu.tn -mincom.tn -agrinet.tn -defense.tn -turen.tn // to : https://en.wikipedia.org/wiki/.to // Submitted by registry @@ -6067,40 +6239,36 @@ org.to edu.to mil.to -// subTLDs: https://www.nic.tr/forms/eng/policies.pdf -// and: https://www.nic.tr/forms/politikalar.pdf -// Submitted by +// tr : https://nic.tr/ +// https://nic.tr/forms/eng/policies.pdf +// https://nic.tr/index.php?USRACTN=PRICELST tr -com.tr -info.tr -biz.tr -net.tr -org.tr -web.tr -gen.tr -tv.tr av.tr -dr.tr bbs.tr -name.tr -tel.tr -gov.tr bel.tr -pol.tr +biz.tr +com.tr +dr.tr +edu.tr +gen.tr +gov.tr +info.tr mil.tr k12.tr -edu.tr kep.tr - +name.tr +net.tr +org.tr +pol.tr +tel.tr +tsk.tr +tv.tr +web.tr // Used by Northern Cyprus nc.tr - // Used by government agencies of Northern Cyprus gov.nc.tr -// travel : https://en.wikipedia.org/wiki/.travel -travel - // tt : http://www.nic.tt/ tt co.tt @@ -6184,7 +6352,6 @@ cv.ua dn.ua dnepropetrovsk.ua dnipropetrovsk.ua -dominic.ua donetsk.ua dp.ua if.ua @@ -6378,7 +6545,7 @@ k12.ok.us k12.or.us k12.pa.us k12.pr.us -k12.ri.us +// k12.ri.us Removed at request of Kim Cournoyer k12.sc.us // k12.sd.us Bug 934131 - Removed at request of James Booze k12.tn.us @@ -6550,9 +6717,10 @@ mil.vc edu.vc // ve : https://registro.nic.ve/ -// Submitted by registry +// Submitted by registry nic@nic.ve and nicve@conatel.gob.ve ve arts.ve +bib.ve co.ve com.ve e12.ve @@ -6564,7 +6732,9 @@ info.ve int.ve mil.ve net.ve +nom.ve org.ve +rar.ve rec.ve store.ve tec.ve @@ -6643,6 +6813,9 @@ yt // xn--90ae ("bg", Bulgarian) : BG бг +// xn--mgbcpq6gpa1a ("albahrain", Arabic) : BH +البحرين + // xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY // Operated by .by registry бел @@ -6665,8 +6838,16 @@ yt مصر // xn--e1a4c ("eu", Cyrillic) : EU +// https://eurid.eu ею +// xn--qxa6a ("eu", Greek) : EU +// https://eurid.eu +ευ + +// xn--mgbah1a3hjkrd ("Mauritania", Arabic) : MR +موريتانيا + // xn--node ("ge", Georgian Mkhedruli) : GE გე @@ -6675,8 +6856,16 @@ yt ελ // xn--j6w193g ("Hong Kong", Chinese) : HK -// https://www2.hkirc.hk/register/rules.jsp +// https://www.hkirc.hk +// Submitted by registry +// https://www.hkirc.hk/content.jsp?id=30#!/34 香港 +公司.香港 +教育.香港 +政府.香港 +個人.香港 +網絡.香港 +組織.香港 // xn--2scrj9c ("Bharat", Kannada) : IN // India @@ -6710,6 +6899,10 @@ yt // India भारत +// xn--mgbbh1a ("Bharat", Kashmiri) : IN +// India +بارت + // xn--mgbbh1a71e ("Bharat", Arabic) : IN // India بھارت @@ -6755,12 +6948,15 @@ yt // xn--80ao21a ("Kaz", Kazakh) : KZ қаз +// xn--q7ce6a ("Lao", Lao) : LA +ລາວ + // xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK -// http://nic.lk +// https://nic.lk ලංකා // xn--xkc2al3hye2a ("Ilangai", Tamil) : LK -// http://nic.lk +// https://nic.lk இலங்கை // xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA @@ -6808,7 +7004,8 @@ yt ак.срб // xn--p1ai ("rf", Russian-Cyrillic) : RU -// http://www.cctld.ru/en/docs/rulesrf.php +// https://cctld.ru/files/pdf/docs/en/rules_ru-rf.pdf +// Submitted by George Georgievsky рф // xn--wgbl6a ("Qatar", Arabic) : QA @@ -6879,9 +7076,15 @@ yt xxx // ye : http://www.y.net.ye/services/domain_name.htm -*.ye - -// za : http://www.zadna.org.za/content/page/domain-information +ye +com.ye +edu.ye +gov.ye +net.ye +mil.ye +org.ye + +// za : https://www.zadna.org.za/content/page/domain-information/ ac.za agric.za alt.za @@ -6893,6 +7096,7 @@ law.za mil.za net.za ngo.za +nic.za nis.za nom.za org.za @@ -6924,8 +7128,11 @@ gov.zw mil.zw org.zw -// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2017-02-23T00:46:09Z +// newGTLDs + +// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2022-02-02T15:12:37Z +// This list is auto-generated, don't edit it manually. // aaa : 2015-02-26 American Automobile Association, Inc. aaa @@ -6950,13 +7157,13 @@ abc // able : 2015-06-25 Able Inc. able -// abogado : 2014-04-24 Top Level Domain Holdings Limited +// abogado : 2014-04-24 Registry Services, LLC abogado // abudhabi : 2015-07-30 Abu Dhabi Systems and Information Centre abudhabi -// academy : 2013-11-07 Half Oaks, LLC +// academy : 2013-11-07 Binky Moon, LLC academy // accenture : 2014-08-15 Accenture plc @@ -6965,16 +7172,13 @@ accenture // accountant : 2014-11-20 dot Accountant Limited accountant -// accountants : 2014-03-20 Knob Town, LLC +// accountants : 2014-03-20 Binky Moon, LLC accountants // aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG aco -// active : 2014-05-01 The Active Network, Inc -active - -// actor : 2013-12-12 United TLD Holdco Ltd. +// actor : 2013-12-12 Dog Beach, LLC actor // adac : 2015-07-16 Allgemeiner Deutscher Automobil-Club e.V. (ADAC) @@ -6992,9 +7196,6 @@ aeg // aetna : 2015-05-21 Aetna Life Insurance Company aetna -// afamilycompany : 2015-07-23 Johnson Shareholdings, Inc. -afamilycompany - // afl : 2014-10-02 Australian Football League afl @@ -7004,19 +7205,16 @@ africa // agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) agakhan -// agency : 2013-11-14 Steel Falls, LLC +// agency : 2013-11-14 Binky Moon, LLC agency // aig : 2014-12-18 American International Group, Inc. aig -// aigo : 2015-08-06 aigo Digital Technology Co,Ltd. -aigo - // airbus : 2015-07-30 Airbus S.A.S. airbus -// airforce : 2014-03-06 United TLD Holdco Ltd. +// airforce : 2014-03-06 Dog Beach, LLC airforce // airtel : 2014-10-24 Bharti Airtel Limited @@ -7043,12 +7241,15 @@ allstate // ally : 2015-06-18 Ally Financial Inc. ally -// alsace : 2014-07-02 REGION D ALSACE +// alsace : 2014-07-02 Region Grand Est alsace // alstom : 2015-07-30 ALSTOM alstom +// amazon : 2019-12-19 Amazon Registry Services, Inc. +amazon + // americanexpress : 2015-07-31 American Express Travel Related Services Company, Inc. americanexpress @@ -7073,16 +7274,16 @@ analytics // android : 2014-08-07 Charleston Road Registry Inc. android -// anquan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +// anquan : 2015-01-08 Beijing Qihu Keji Co., Ltd. anquan // anz : 2015-07-31 Australia and New Zealand Banking Group Limited anz -// aol : 2015-09-17 AOL Inc. +// aol : 2015-09-17 Oath Inc. aol -// apartments : 2014-12-11 June Maple, LLC +// apartments : 2014-12-11 Binky Moon, LLC apartments // app : 2015-05-14 Charleston Road Registry Inc. @@ -7100,10 +7301,10 @@ arab // aramco : 2014-11-20 Aramco Services Company aramco -// archi : 2014-02-06 STARTING DOT LIMITED +// archi : 2014-02-06 Afilias Limited archi -// army : 2014-03-06 United TLD Holdco Ltd. +// army : 2014-03-06 Dog Beach, LLC army // art : 2016-03-24 UK Creative Ideas Limited @@ -7115,52 +7316,52 @@ arte // asda : 2015-07-31 Wal-Mart Stores, Inc. asda -// associates : 2014-03-06 Baxter Hill, LLC +// associates : 2014-03-06 Binky Moon, LLC associates // athleta : 2015-07-30 The Gap, Inc. athleta -// attorney : 2014-03-20 +// attorney : 2014-03-20 Dog Beach, LLC attorney -// auction : 2014-03-20 +// auction : 2014-03-20 Dog Beach, LLC auction // audi : 2015-05-21 AUDI Aktiengesellschaft audi -// audible : 2015-06-25 Amazon EU S.à r.l. +// audible : 2015-06-25 Amazon Registry Services, Inc. audible -// audio : 2014-03-20 Uniregistry, Corp. +// audio : 2014-03-20 UNR Corp. audio // auspost : 2015-08-13 Australian Postal Corporation auspost -// author : 2014-12-18 Amazon EU S.à r.l. +// author : 2014-12-18 Amazon Registry Services, Inc. author -// auto : 2014-11-13 +// auto : 2014-11-13 XYZ.COM LLC auto -// autos : 2014-01-09 DERAutos, LLC +// autos : 2014-01-09 XYZ.COM LLC autos -// avianca : 2015-01-08 Aerovias del Continente Americano S.A. Avianca +// avianca : 2015-01-08 Avianca Holdings S.A. avianca -// aws : 2015-06-25 Amazon EU S.à r.l. +// aws : 2015-06-25 AWS Registry LLC aws -// axa : 2013-12-19 AXA SA +// axa : 2013-12-19 AXA Group Operations SAS axa // azure : 2014-12-18 Microsoft Corporation azure -// baby : 2015-04-09 Johnson & Johnson Services, Inc. +// baby : 2015-04-09 XYZ.COM LLC baby // baidu : 2015-01-08 Baidu, Inc. @@ -7172,7 +7373,7 @@ banamex // bananarepublic : 2015-07-31 The Gap, Inc. bananarepublic -// band : 2014-06-12 +// band : 2014-06-12 Dog Beach, LLC band // bank : 2014-09-25 fTLD Registry Services LLC @@ -7193,7 +7394,7 @@ barclays // barefoot : 2015-06-11 Gallo Vineyards, Inc. barefoot -// bargains : 2013-11-14 Half Hallow, LLC +// bargains : 2013-11-14 Binky Moon, LLC bargains // baseball : 2015-10-29 MLB Advanced Media DH, LLC @@ -7226,10 +7427,10 @@ bcn // beats : 2015-05-14 Beats Electronics, LLC beats -// beauty : 2015-12-03 L'Oréal +// beauty : 2015-12-03 XYZ.COM LLC beauty -// beer : 2014-01-09 Top Level Domain Holdings Limited +// beer : 2014-01-09 Registry Services, LLC beer // bentley : 2014-12-18 Bentley Motors Limited @@ -7244,7 +7445,7 @@ best // bestbuy : 2015-07-31 BBY Solutions, Inc. bestbuy -// bet : 2015-05-07 Afilias plc +// bet : 2015-05-07 Afilias Limited bet // bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited @@ -7256,31 +7457,28 @@ bible // bid : 2013-12-19 dot Bid Limited bid -// bike : 2013-08-27 Grand Hollow, LLC +// bike : 2013-08-27 Binky Moon, LLC bike // bing : 2014-12-18 Microsoft Corporation bing -// bingo : 2014-12-04 Sand Cedar, LLC +// bingo : 2014-12-04 Binky Moon, LLC bingo -// bio : 2014-03-06 STARTING DOT LIMITED +// bio : 2014-03-06 Afilias Limited bio // black : 2014-01-16 Afilias Limited black -// blackfriday : 2014-01-16 Uniregistry, Corp. +// blackfriday : 2014-01-16 UNR Corp. blackfriday -// blanco : 2015-07-16 BLANCO GmbH + Co KG -blanco - // blockbuster : 2015-07-30 Dish DBS Corporation blockbuster -// blog : 2015-05-14 +// blog : 2015-05-14 Knock Knock WHOIS There, LLC blog // bloomberg : 2014-07-17 Bloomberg IP Holdings LLC @@ -7295,55 +7493,49 @@ bms // bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft bmw -// bnl : 2014-07-24 Banca Nazionale del Lavoro -bnl - // bnpparibas : 2014-05-29 BNP Paribas bnpparibas -// boats : 2014-12-04 DERBoats, LLC +// boats : 2014-12-04 XYZ.COM LLC boats // boehringer : 2015-07-09 Boehringer Ingelheim International GmbH boehringer -// bofa : 2015-07-31 NMS Services, Inc. +// bofa : 2015-07-31 Bank of America Corporation bofa // bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br bom -// bond : 2014-06-05 Bond University Limited +// bond : 2014-06-05 ShortDot SA bond // boo : 2014-01-30 Charleston Road Registry Inc. boo -// book : 2015-08-27 Amazon EU S.à r.l. +// book : 2015-08-27 Amazon Registry Services, Inc. book // booking : 2015-07-16 Booking.com B.V. booking -// boots : 2015-01-08 THE BOOTS COMPANY PLC -boots - // bosch : 2015-06-18 Robert Bosch GMBH bosch // bostik : 2015-05-28 Bostik SA bostik -// boston : 2015-12-10 +// boston : 2015-12-10 Registry Services, LLC boston -// bot : 2014-12-18 Amazon EU S.à r.l. +// bot : 2014-12-18 Amazon Registry Services, Inc. bot -// boutique : 2013-11-14 Over Galley, LLC +// boutique : 2013-11-14 Binky Moon, LLC boutique -// box : 2015-11-12 NS1 Limited +// box : 2015-11-12 Intercap Registry Inc. box // bradesco : 2014-12-18 Banco Bradesco S.A. @@ -7355,7 +7547,7 @@ bridgestone // broadway : 2014-12-22 Celebrate Broadway, Inc. broadway -// broker : 2014-12-11 IG Group Holdings PLC +// broker : 2014-12-11 Dog Beach, LLC broker // brother : 2015-01-29 Brother Industries, Ltd. @@ -7364,7 +7556,7 @@ brother // brussels : 2014-02-06 DNS.be vzw brussels -// budapest : 2013-11-21 Top Level Domain Holdings Limited +// budapest : 2013-11-21 Minds + Machines Group Limited budapest // bugatti : 2015-07-23 Bugatti International SA @@ -7373,13 +7565,13 @@ bugatti // build : 2013-11-07 Plan Bee LLC build -// builders : 2013-11-07 Atomic Madison, LLC +// builders : 2013-11-07 Binky Moon, LLC builders -// business : 2013-11-07 Spring Cross, LLC +// business : 2013-11-07 Binky Moon, LLC business -// buy : 2014-12-18 Amazon EU S.à r.l. +// buy : 2014-12-18 Amazon Registry Services, Inc. buy // buzz : 2013-10-02 DOTSTRATEGY CO. @@ -7388,28 +7580,28 @@ buzz // bzh : 2014-02-27 Association www.bzh bzh -// cab : 2013-10-24 Half Sunset, LLC +// cab : 2013-10-24 Binky Moon, LLC cab -// cafe : 2015-02-11 Pioneer Canyon, LLC +// cafe : 2015-02-11 Binky Moon, LLC cafe // cal : 2014-07-24 Charleston Road Registry Inc. cal -// call : 2014-12-18 Amazon EU S.à r.l. +// call : 2014-12-18 Amazon Registry Services, Inc. call // calvinklein : 2015-07-30 PVH gTLD Holdings LLC calvinklein -// cam : 2016-04-21 AC Webconnecting Holding B.V. +// cam : 2016-04-21 Cam Connecting SARL cam -// camera : 2013-08-27 Atomic Maple, LLC +// camera : 2013-08-27 Binky Moon, LLC camera -// camp : 2013-11-07 Delta Dynamite, LLC +// camp : 2013-11-07 Binky Moon, LLC camp // cancerresearch : 2014-05-15 Australian Cancer Research Foundation @@ -7421,52 +7613,46 @@ canon // capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry capetown -// capital : 2014-03-06 Delta Mill, LLC +// capital : 2014-03-06 Binky Moon, LLC capital // capitalone : 2015-08-06 Capital One Financial Corporation capitalone -// car : 2015-01-22 +// car : 2015-01-22 XYZ.COM LLC car // caravan : 2013-12-12 Caravan International, Inc. caravan -// cards : 2013-12-05 Foggy Hollow, LLC +// cards : 2013-12-05 Binky Moon, LLC cards -// care : 2014-03-06 Goose Cross +// care : 2014-03-06 Binky Moon, LLC care // career : 2013-10-09 dotCareer LLC career -// careers : 2013-10-02 Wild Corner, LLC +// careers : 2013-10-02 Binky Moon, LLC careers -// cars : 2014-11-13 +// cars : 2014-11-13 XYZ.COM LLC cars -// cartier : 2014-06-23 Richemont DNS Inc. -cartier - -// casa : 2013-11-21 Top Level Domain Holdings Limited +// casa : 2013-11-21 Registry Services, LLC casa -// case : 2015-09-03 CNH Industrial N.V. +// case : 2015-09-03 Helium TLDs Ltd case -// caseih : 2015-09-03 CNH Industrial N.V. -caseih - -// cash : 2014-03-06 Delta Lake, LLC +// cash : 2014-03-06 Binky Moon, LLC cash -// casino : 2014-12-18 Binky Sky, LLC +// casino : 2014-12-18 Binky Moon, LLC casino -// catering : 2013-12-05 New Falls. LLC +// catering : 2013-12-05 Binky Moon, LLC catering // catholic : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) @@ -7484,10 +7670,7 @@ cbre // cbs : 2015-08-06 CBS Domains Inc. cbs -// ceb : 2015-04-09 The Corporate Executive Board Company -ceb - -// center : 2013-11-07 Tin Mill, LLC +// center : 2013-11-07 Binky Moon, LLC center // ceo : 2013-11-07 CEOTLD Pty Ltd @@ -7499,7 +7682,7 @@ cern // cfa : 2014-08-28 CFA Institute cfa -// cfd : 2014-12-11 IG Group Holdings PLC +// cfd : 2014-12-11 ShortDot SA cfd // chanel : 2015-04-09 Chanel International B.V. @@ -7508,34 +7691,34 @@ chanel // channel : 2014-05-08 Charleston Road Registry Inc. channel -// chase : 2015-04-30 JPMorgan Chase & Co. +// charity : 2018-04-11 Binky Moon, LLC +charity + +// chase : 2015-04-30 JPMorgan Chase Bank, National Association chase -// chat : 2014-12-04 Sand Fields, LLC +// chat : 2014-12-04 Binky Moon, LLC chat -// cheap : 2013-11-14 Sand Cover, LLC +// cheap : 2013-11-14 Binky Moon, LLC cheap // chintai : 2015-06-11 CHINTAI Corporation chintai -// christmas : 2013-11-21 Uniregistry, Corp. +// christmas : 2013-11-21 UNR Corp. christmas // chrome : 2014-07-24 Charleston Road Registry Inc. chrome -// chrysler : 2015-07-30 FCA US LLC. -chrysler - -// church : 2014-02-06 Holly Fields, LLC +// church : 2014-02-06 Binky Moon, LLC church // cipriani : 2015-02-19 Hotel Cipriani Srl cipriani -// circle : 2014-12-18 Amazon EU S.à r.l. +// circle : 2014-12-18 Amazon Registry Services, Inc. circle // cisco : 2014-12-22 Cisco Technology, Inc. @@ -7550,52 +7733,52 @@ citi // citic : 2014-01-09 CITIC Group Corporation citic -// city : 2014-05-29 Snow Sky, LLC +// city : 2014-05-29 Binky Moon, LLC city // cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. cityeats -// claims : 2014-03-20 Black Corner, LLC +// claims : 2014-03-20 Binky Moon, LLC claims -// cleaning : 2013-12-05 Fox Shadow, LLC +// cleaning : 2013-12-05 Binky Moon, LLC cleaning -// click : 2014-06-05 Uniregistry, Corp. +// click : 2014-06-05 UNR Corp. click -// clinic : 2014-03-20 Goose Park, LLC +// clinic : 2014-03-20 Binky Moon, LLC clinic // clinique : 2015-10-01 The Estée Lauder Companies Inc. clinique -// clothing : 2013-08-27 Steel Lake, LLC +// clothing : 2013-08-27 Binky Moon, LLC clothing -// cloud : 2015-04-16 ARUBA S.p.A. +// cloud : 2015-04-16 Aruba PEC S.p.A. cloud -// club : 2013-11-08 .CLUB DOMAINS, LLC +// club : 2013-11-08 Registry Services, LLC club // clubmed : 2015-06-25 Club Méditerranée S.A. clubmed -// coach : 2014-10-09 Koko Island, LLC +// coach : 2014-10-09 Binky Moon, LLC coach -// codes : 2013-10-31 Puff Willow, LLC +// codes : 2013-10-31 Binky Moon, LLC codes -// coffee : 2013-10-17 Trixy Cover, LLC +// coffee : 2013-10-17 Binky Moon, LLC coffee // college : 2014-01-16 XYZ.COM LLC college -// cologne : 2014-02-05 NetCologne Gesellschaft für Telekommunikation mbH +// cologne : 2014-02-05 dotKoeln GmbH cologne // comcast : 2015-07-23 Comcast IP Holdings I, LLC @@ -7604,67 +7787,70 @@ comcast // commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA commbank -// community : 2013-12-05 Fox Orchard, LLC +// community : 2013-12-05 Binky Moon, LLC community -// company : 2013-11-07 Silver Avenue, LLC +// company : 2013-11-07 Binky Moon, LLC company -// compare : 2015-10-08 iSelect Ltd +// compare : 2015-10-08 Registry Services, LLC compare -// computer : 2013-10-24 Pine Mill, LLC +// computer : 2013-10-24 Binky Moon, LLC computer // comsec : 2015-01-08 VeriSign, Inc. comsec -// condos : 2013-12-05 Pine House, LLC +// condos : 2013-12-05 Binky Moon, LLC condos -// construction : 2013-09-16 Fox Dynamite, LLC +// construction : 2013-09-16 Binky Moon, LLC construction -// consulting : 2013-12-05 +// consulting : 2013-12-05 Dog Beach, LLC consulting -// contact : 2015-01-08 Top Level Spectrum, Inc. +// contact : 2015-01-08 Dog Beach, LLC contact -// contractors : 2013-09-10 Magic Woods, LLC +// contractors : 2013-09-10 Binky Moon, LLC contractors -// cooking : 2013-11-21 Top Level Domain Holdings Limited +// cooking : 2013-11-21 Registry Services, LLC cooking // cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. cookingchannel -// cool : 2013-11-14 Koko Lake, LLC +// cool : 2013-11-14 Binky Moon, LLC cool -// corsica : 2014-09-25 Collectivité Territoriale de Corse +// corsica : 2014-09-25 Collectivité de Corse corsica -// country : 2013-12-19 Top Level Domain Holdings Limited +// country : 2013-12-19 DotCountry LLC country -// coupon : 2015-02-26 Amazon EU S.à r.l. +// coupon : 2015-02-26 Amazon Registry Services, Inc. coupon -// coupons : 2015-03-26 Black Island, LLC +// coupons : 2015-03-26 Binky Moon, LLC coupons // courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD courses -// credit : 2014-03-20 Snow Shadow, LLC +// cpa : 2019-06-10 American Institute of Certified Public Accountants +cpa + +// credit : 2014-03-20 Binky Moon, LLC credit -// creditcard : 2014-03-20 Binky Frostbite, LLC +// creditcard : 2014-03-20 Binky Moon, LLC creditcard -// creditunion : 2015-01-22 CUNA Performance Resources, LLC +// creditunion : 2015-01-22 DotCooperation LLC creditunion // cricket : 2014-10-09 dot Cricket Limited @@ -7679,19 +7865,16 @@ crs // cruise : 2015-12-10 Viking River Cruises (Bermuda) Ltd. cruise -// cruises : 2013-12-05 Spring Way, LLC +// cruises : 2013-12-05 Binky Moon, LLC cruises -// csc : 2014-09-25 Alliance-One Services, Inc. -csc - -// cuisinella : 2014-04-03 SALM S.A.S. +// cuisinella : 2014-04-03 SCHMIDT GROUPE S.A.S. cuisinella // cymru : 2014-05-08 Nominet UK cymru -// cyou : 2015-01-22 Beijing Gamease Age Digital Technology Co., Ltd. +// cyou : 2015-01-22 ShortDot SA cyou // dabur : 2014-02-06 Dabur India Limited @@ -7700,7 +7883,7 @@ dabur // dad : 2014-01-23 Charleston Road Registry Inc. dad -// dance : 2013-10-24 United TLD Holdco Ltd. +// dance : 2013-10-24 Dog Beach, LLC dance // data : 2016-06-02 Dish DBS Corporation @@ -7709,7 +7892,7 @@ data // date : 2014-11-20 dot Date Limited date -// dating : 2013-12-05 Pine Fest, LLC +// dating : 2013-12-05 Binky Moon, LLC dating // datsun : 2014-03-27 NISSAN MOTOR CO., LTD. @@ -7721,22 +7904,22 @@ day // dclk : 2014-11-20 Charleston Road Registry Inc. dclk -// dds : 2015-05-07 Top Level Domain Holdings Limited +// dds : 2015-05-07 Registry Services, LLC dds -// deal : 2015-06-25 Amazon EU S.à r.l. +// deal : 2015-06-25 Amazon Registry Services, Inc. deal -// dealer : 2014-12-22 Dealer Dot Com, Inc. +// dealer : 2014-12-22 Intercap Registry Inc. dealer -// deals : 2014-05-22 Sand Sunset, LLC +// deals : 2014-05-22 Binky Moon, LLC deals -// degree : 2014-03-06 +// degree : 2014-03-06 Dog Beach, LLC degree -// delivery : 2014-09-11 Steel Station, LLC +// delivery : 2014-09-11 Binky Moon, LLC delivery // dell : 2014-10-24 Dell Inc. @@ -7748,19 +7931,19 @@ deloitte // delta : 2015-02-19 Delta Air Lines, Inc. delta -// democrat : 2013-10-24 United TLD Holdco Ltd. +// democrat : 2013-10-24 Dog Beach, LLC democrat -// dental : 2014-03-20 Tin Birch, LLC +// dental : 2014-03-20 Binky Moon, LLC dental -// dentist : 2014-03-20 +// dentist : 2014-03-20 Dog Beach, LLC dentist // desi : 2013-11-14 Desi Networks LLC desi -// design : 2014-11-07 Top Level Design, LLC +// design : 2014-11-07 Registry Services, LLC design // dev : 2014-10-16 Charleston Road Registry Inc. @@ -7769,22 +7952,22 @@ dev // dhl : 2015-07-23 Deutsche Post AG dhl -// diamonds : 2013-09-22 John Edge, LLC +// diamonds : 2013-09-22 Binky Moon, LLC diamonds -// diet : 2014-06-26 Uniregistry, Corp. +// diet : 2014-06-26 UNR Corp. diet -// digital : 2014-03-06 Dash Park, LLC +// digital : 2014-03-06 Binky Moon, LLC digital -// direct : 2014-04-10 Half Trail, LLC +// direct : 2014-04-10 Binky Moon, LLC direct -// directory : 2013-09-20 Extra Madison, LLC +// directory : 2013-09-20 Binky Moon, LLC directory -// discount : 2014-03-06 Holly Hill, LLC +// discount : 2014-03-06 Binky Moon, LLC discount // discover : 2015-07-23 Discover Financial Services @@ -7802,19 +7985,13 @@ dnp // docs : 2014-10-16 Charleston Road Registry Inc. docs -// doctor : 2016-06-02 Brice Trail, LLC +// doctor : 2016-06-02 Binky Moon, LLC doctor -// dodge : 2015-07-30 FCA US LLC. -dodge - -// dog : 2014-12-04 Koko Mill, LLC +// dog : 2014-12-04 Binky Moon, LLC dog -// doha : 2014-09-18 Communications Regulatory Authority (CRA) -doha - -// domains : 2013-10-17 Sugar Cross, LLC +// domains : 2013-10-17 Binky Moon, LLC domains // dot : 2015-05-21 Dish DBS Corporation @@ -7832,16 +8009,10 @@ dtv // dubai : 2015-01-01 Dubai Smart Government Department dubai -// duck : 2015-07-23 Johnson Shareholdings, Inc. -duck - // dunlop : 2015-07-02 The Goodyear Tire & Rubber Company dunlop -// duns : 2015-08-06 The Dun & Bradstreet Corporation -duns - -// dupont : 2015-06-25 E. I. du Pont de Nemours and Company +// dupont : 2015-06-25 DuPont Specialty Products USA, LLC dupont // durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry @@ -7850,7 +8021,7 @@ durban // dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG dvag -// dvr : 2016-05-26 Hughes Satellite Systems Corporation +// dvr : 2016-05-26 DISH Technologies L.L.C. dvr // earth : 2014-12-04 Interlink Co., Ltd. @@ -7865,34 +8036,31 @@ eco // edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. edeka -// education : 2013-11-07 Brice Way, LLC +// education : 2013-11-07 Binky Moon, LLC education -// email : 2013-10-31 Spring Madison, LLC +// email : 2013-10-31 Binky Moon, LLC email // emerck : 2014-04-03 Merck KGaA emerck -// energy : 2014-09-11 Binky Birch, LLC +// energy : 2014-09-11 Binky Moon, LLC energy -// engineer : 2014-03-06 United TLD Holdco Ltd. +// engineer : 2014-03-06 Dog Beach, LLC engineer -// engineering : 2014-03-06 Romeo Canyon +// engineering : 2014-03-06 Binky Moon, LLC engineering -// enterprises : 2013-09-20 Snow Oaks, LLC +// enterprises : 2013-09-20 Binky Moon, LLC enterprises -// epost : 2015-07-23 Deutsche Post AG -epost - // epson : 2014-12-04 Seiko Epson Corporation epson -// equipment : 2013-08-27 Corn Station, LLC +// equipment : 2013-08-27 Binky Moon, LLC equipment // ericsson : 2015-07-09 Telefonaktiebolaget L M Ericsson @@ -7904,12 +8072,9 @@ erni // esq : 2014-05-08 Charleston Road Registry Inc. esq -// estate : 2013-08-27 Trixy Park, LLC +// estate : 2013-08-27 Binky Moon, LLC estate -// esurance : 2015-07-23 Esurance Insurance Company -esurance - // etisalat : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) etisalat @@ -7919,22 +8084,19 @@ eurovision // eus : 2013-12-12 Puntueus Fundazioa eus -// events : 2013-12-05 Pioneer Maple, LLC +// events : 2013-12-05 Binky Moon, LLC events -// everbank : 2014-05-15 EverBank -everbank - -// exchange : 2014-03-06 Spring Falls, LLC +// exchange : 2014-03-06 Binky Moon, LLC exchange -// expert : 2013-11-21 Magic Pass, LLC +// expert : 2013-11-21 Binky Moon, LLC expert -// exposed : 2013-12-05 Victor Beach, LLC +// exposed : 2013-12-05 Binky Moon, LLC exposed -// express : 2015-02-11 Sea Sunset, LLC +// express : 2015-02-11 Binky Moon, LLC express // extraspace : 2015-05-14 Extra Space Storage LLC @@ -7943,7 +8105,7 @@ extraspace // fage : 2014-12-18 Fage International S.A. fage -// fail : 2014-03-06 Atomic Pipe, LLC +// fail : 2014-03-06 Binky Moon, LLC fail // fairwinds : 2014-11-13 FairWinds Partners, LLC @@ -7952,25 +8114,25 @@ fairwinds // faith : 2014-11-20 dot Faith Limited faith -// family : 2015-04-02 +// family : 2015-04-02 Dog Beach, LLC family -// fan : 2014-03-06 +// fan : 2014-03-06 Dog Beach, LLC fan -// fans : 2014-11-07 Asiamix Digital Limited +// fans : 2014-11-07 ZDNS International Limited fans -// farm : 2013-11-07 Just Maple, LLC +// farm : 2013-11-07 Binky Moon, LLC farm // farmers : 2015-07-09 Farmers Insurance Exchange farmers -// fashion : 2014-07-03 Top Level Domain Holdings Limited +// fashion : 2014-07-03 Registry Services, LLC fashion -// fast : 2014-12-18 Amazon EU S.à r.l. +// fast : 2014-12-18 Amazon Registry Services, Inc. fast // fedex : 2015-08-06 Federal Express Corporation @@ -7991,7 +8153,7 @@ fiat // fidelity : 2015-07-30 Fidelity Brokerage Services LLC fidelity -// fido : 2015-08-06 Rogers Communications Partnership +// fido : 2015-08-06 Rogers Communications Canada Inc. fido // film : 2015-01-08 Motion Picture Domain Registry Pty Ltd @@ -8000,46 +8162,46 @@ film // final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br final -// finance : 2014-03-20 Cotton Cypress, LLC +// finance : 2014-03-20 Binky Moon, LLC finance -// financial : 2014-03-06 Just Cover, LLC +// financial : 2014-03-06 Binky Moon, LLC financial -// fire : 2015-06-25 Amazon EU S.à r.l. +// fire : 2015-06-25 Amazon Registry Services, Inc. fire -// firestone : 2014-12-18 Bridgestone Corporation +// firestone : 2014-12-18 Bridgestone Licensing Services, Inc firestone // firmdale : 2014-03-27 Firmdale Holdings Limited firmdale -// fish : 2013-12-12 Fox Woods, LLC +// fish : 2013-12-12 Binky Moon, LLC fish -// fishing : 2013-11-21 Top Level Domain Holdings Limited +// fishing : 2013-11-21 Registry Services, LLC fishing -// fit : 2014-11-07 Top Level Domain Holdings Limited +// fit : 2014-11-07 Registry Services, LLC fit -// fitness : 2014-03-06 Brice Orchard, LLC +// fitness : 2014-03-06 Binky Moon, LLC fitness -// flickr : 2015-04-02 Yahoo! Domain Services Inc. +// flickr : 2015-04-02 Flickr, Inc. flickr -// flights : 2013-12-05 Fox Station, LLC +// flights : 2013-12-05 Binky Moon, LLC flights // flir : 2015-07-23 FLIR Systems, Inc. flir -// florist : 2013-11-07 Half Cypress, LLC +// florist : 2013-11-07 Binky Moon, LLC florist -// flowers : 2014-10-09 Uniregistry, Corp. +// flowers : 2014-10-09 UNR Corp. flowers // fly : 2014-05-08 Charleston Road Registry Inc. @@ -8054,28 +8216,28 @@ food // foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc. foodnetwork -// football : 2014-12-18 Foggy Farms, LLC +// football : 2014-12-18 Binky Moon, LLC football // ford : 2014-11-13 Ford Motor Company ford -// forex : 2014-12-11 IG Group Holdings PLC +// forex : 2014-12-11 Dog Beach, LLC forex -// forsale : 2014-05-22 +// forsale : 2014-05-22 Dog Beach, LLC forsale // forum : 2015-04-02 Fegistry, LLC forum -// foundation : 2013-12-05 John Dale, LLC +// foundation : 2013-12-05 Binky Moon, LLC foundation // fox : 2015-09-11 FOX Registry, LLC fox -// free : 2015-12-10 Amazon EU S.à r.l. +// free : 2015-12-10 Amazon Registry Services, Inc. free // fresenius : 2015-07-30 Fresenius Immobilien-Verwaltungs-GmbH @@ -8099,28 +8261,25 @@ ftr // fujitsu : 2015-07-30 Fujitsu Limited fujitsu -// fujixerox : 2015-07-23 Xerox DNHC LLC -fujixerox - -// fun : 2016-01-14 +// fun : 2016-01-14 Radix FZC fun -// fund : 2014-03-20 John Castle, LLC +// fund : 2014-03-20 Binky Moon, LLC fund -// furniture : 2014-03-20 Lone Fields, LLC +// furniture : 2014-03-20 Binky Moon, LLC furniture -// futbol : 2013-09-20 +// futbol : 2013-09-20 Dog Beach, LLC futbol -// fyi : 2015-04-02 Silver Tigers, LLC +// fyi : 2015-04-02 Binky Moon, LLC fyi // gal : 2013-11-07 Asociación puntoGAL gal -// gallery : 2013-09-13 Sugar House, LLC +// gallery : 2013-09-13 Binky Moon, LLC gallery // gallo : 2015-06-11 Gallo Vineyards, Inc. @@ -8129,18 +8288,21 @@ gallo // gallup : 2015-02-19 Gallup, Inc. gallup -// game : 2015-05-28 Uniregistry, Corp. +// game : 2015-05-28 UNR Corp. game -// games : 2015-05-28 +// games : 2015-05-28 Dog Beach, LLC games // gap : 2015-07-31 The Gap, Inc. gap -// garden : 2014-06-26 Top Level Domain Holdings Limited +// garden : 2014-06-26 Registry Services, LLC garden +// gay : 2019-05-23 Top Level Design, LLC +gay + // gbiz : 2014-07-17 Charleston Road Registry Inc. gbiz @@ -8150,7 +8312,7 @@ gdn // gea : 2014-12-04 GEA Group Aktiengesellschaft gea -// gent : 2014-01-23 COMBELL GROUP NV/SA +// gent : 2014-01-23 COMBELL NV gent // genting : 2015-03-12 Resorts World Inc Pte. Ltd. @@ -8162,28 +8324,25 @@ george // ggee : 2014-01-09 GMO Internet, Inc. ggee -// gift : 2013-10-17 Uniregistry, Corp. +// gift : 2013-10-17 DotGift, LLC gift -// gifts : 2014-07-03 Goose Sky, LLC +// gifts : 2014-07-03 Binky Moon, LLC gifts -// gives : 2014-03-06 United TLD Holdco Ltd. +// gives : 2014-03-06 Dog Beach, LLC gives // giving : 2014-11-13 Giving Limited giving -// glade : 2015-07-23 Johnson Shareholdings, Inc. -glade - -// glass : 2013-11-07 Black Cover, LLC +// glass : 2013-11-07 Binky Moon, LLC glass // gle : 2014-07-24 Charleston Road Registry Inc. gle -// global : 2014-04-17 Dot GLOBAL AS +// global : 2014-04-17 Dot Global Domain Registry Limited global // globo : 2013-12-19 Globo Comunicação e Participações S.A @@ -8192,7 +8351,7 @@ globo // gmail : 2014-05-01 Charleston Road Registry Inc. gmail -// gmbh : 2016-01-29 Extra Dynamite, LLC +// gmbh : 2016-01-29 Binky Moon, LLC gmbh // gmo : 2014-01-09 GMO Internet, Inc. @@ -8204,21 +8363,18 @@ gmx // godaddy : 2015-07-23 Go Daddy East, LLC godaddy -// gold : 2015-01-22 June Edge, LLC +// gold : 2015-01-22 Binky Moon, LLC gold // goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. goldpoint -// golf : 2014-12-18 Lone falls, LLC +// golf : 2014-12-18 Binky Moon, LLC golf // goo : 2014-12-18 NTT Resonant Inc. goo -// goodhands : 2015-07-31 Allstate Fire and Casualty Insurance Company -goodhands - // goodyear : 2015-07-02 The Goodyear Tire & Rubber Company goodyear @@ -8231,28 +8387,28 @@ google // gop : 2014-01-16 Republican State Leadership Committee, Inc. gop -// got : 2014-12-18 Amazon EU S.à r.l. +// got : 2014-12-18 Amazon Registry Services, Inc. got // grainger : 2015-05-07 Grainger Registry Services, LLC grainger -// graphics : 2013-09-13 Over Madison, LLC +// graphics : 2013-09-13 Binky Moon, LLC graphics -// gratis : 2014-03-20 Pioneer Tigers, LLC +// gratis : 2014-03-20 Binky Moon, LLC gratis // green : 2014-05-08 Afilias Limited green -// gripe : 2014-03-06 Corn Sunset, LLC +// gripe : 2014-03-06 Binky Moon, LLC gripe // grocery : 2016-06-16 Wal-Mart Stores, Inc. grocery -// group : 2014-08-15 Romeo Town, LLC +// group : 2014-08-15 Binky Moon, LLC group // guardian : 2015-07-30 The Guardian Life Insurance Company of America @@ -8264,16 +8420,16 @@ gucci // guge : 2014-08-28 Charleston Road Registry Inc. guge -// guide : 2013-09-13 Snow Moon, LLC +// guide : 2013-09-13 Binky Moon, LLC guide -// guitars : 2013-11-14 Uniregistry, Corp. +// guitars : 2013-11-14 UNR Corp. guitars -// guru : 2013-08-27 Pioneer Cypress, LLC +// guru : 2013-08-27 Binky Moon, LLC guru -// hair : 2015-12-03 L'Oréal +// hair : 2015-12-03 XYZ.COM LLC hair // hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH @@ -8282,7 +8438,7 @@ hamburg // hangout : 2014-11-13 Charleston Road Registry Inc. hangout -// haus : 2013-12-05 +// haus : 2013-12-05 Dog Beach, LLC haus // hbo : 2015-07-30 HBO Registry Services, Inc. @@ -8297,10 +8453,10 @@ hdfcbank // health : 2015-02-11 DotHealth, LLC health -// healthcare : 2014-06-12 Silver Glen, LLC +// healthcare : 2014-06-12 Binky Moon, LLC healthcare -// help : 2014-06-26 Uniregistry, Corp. +// help : 2014-06-26 UNR Corp. help // helsinki : 2015-02-05 City of Helsinki @@ -8315,7 +8471,7 @@ hermes // hgtv : 2015-07-02 Lifestyle Domain Holdings, Inc. hgtv -// hiphop : 2014-03-06 Uniregistry, Corp. +// hiphop : 2014-03-06 UNR Corp. hiphop // hisamitsu : 2015-07-16 Hisamitsu Pharmaceutical Co.,Inc. @@ -8324,28 +8480,28 @@ hisamitsu // hitachi : 2014-10-31 Hitachi, Ltd. hitachi -// hiv : 2014-03-13 +// hiv : 2014-03-13 UNR Corp. hiv // hkt : 2015-05-14 PCCW-HKT DataCom Services Limited hkt -// hockey : 2015-03-19 Half Willow, LLC +// hockey : 2015-03-19 Binky Moon, LLC hockey -// holdings : 2013-08-27 John Madison, LLC +// holdings : 2013-08-27 Binky Moon, LLC holdings -// holiday : 2013-11-07 Goose Woods, LLC +// holiday : 2013-11-07 Binky Moon, LLC holiday -// homedepot : 2015-04-02 Homer TLC, Inc. +// homedepot : 2015-04-02 Home Depot Product Authority, LLC homedepot // homegoods : 2015-07-16 The TJX Companies, Inc. homegoods -// homes : 2014-01-09 DERHomes, LLC +// homes : 2014-01-09 XYZ.COM LLC homes // homesense : 2015-07-16 The TJX Companies, Inc. @@ -8354,22 +8510,19 @@ homesense // honda : 2014-12-18 Honda Motor Co., Ltd. honda -// honeywell : 2015-07-23 Honeywell GTLD LLC -honeywell - -// horse : 2013-11-21 Top Level Domain Holdings Limited +// horse : 2013-11-21 Registry Services, LLC horse -// hospital : 2016-10-20 Ruby Pike, LLC +// hospital : 2016-10-20 Binky Moon, LLC hospital -// host : 2014-04-17 DotHost Inc. +// host : 2014-04-17 Radix FZC host -// hosting : 2014-05-29 Uniregistry, Corp. +// hosting : 2014-05-29 UNR Corp. hosting -// hot : 2015-08-27 Amazon EU S.à r.l. +// hot : 2015-08-27 Amazon Registry Services, Inc. hot // hoteles : 2015-03-05 Travel Reservations SRL @@ -8381,13 +8534,13 @@ hotels // hotmail : 2014-12-18 Microsoft Corporation hotmail -// house : 2013-11-07 Sugar Park, LLC +// house : 2013-11-07 Binky Moon, LLC house // how : 2014-01-23 Charleston Road Registry Inc. how -// hsbc : 2014-10-24 HSBC Holdings PLC +// hsbc : 2014-10-24 HSBC Global Services (UK) Limited hsbc // hughes : 2015-07-30 Hughes Satellite Systems Corporation @@ -8408,7 +8561,7 @@ icbc // ice : 2014-10-30 IntercontinentalExchange, Inc. ice -// icu : 2015-01-08 One.com A/S +// icu : 2015-01-08 ShortDot SA icu // ieee : 2015-07-23 IEEE Global LLC @@ -8423,16 +8576,19 @@ ikano // imamat : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) imamat -// imdb : 2015-06-25 Amazon EU S.à r.l. +// imdb : 2015-06-25 Amazon Registry Services, Inc. imdb -// immo : 2014-07-10 Auburn Bloom, LLC +// immo : 2014-07-10 Binky Moon, LLC immo -// immobilien : 2013-11-07 United TLD Holdco Ltd. +// immobilien : 2013-11-07 Dog Beach, LLC immobilien -// industries : 2013-12-05 Outer House, LLC +// inc : 2018-03-10 Intercap Registry Inc. +inc + +// industries : 2013-12-05 Binky Moon, LLC industries // infiniti : 2014-03-27 NISSAN MOTOR CO., LTD. @@ -8444,36 +8600,30 @@ ing // ink : 2013-12-05 Top Level Design, LLC ink -// institute : 2013-11-07 Outer Maple, LLC +// institute : 2013-11-07 Binky Moon, LLC institute // insurance : 2015-02-19 fTLD Registry Services LLC insurance -// insure : 2014-03-20 Pioneer Willow, LLC +// insure : 2014-03-20 Binky Moon, LLC insure -// intel : 2015-08-06 Intel Corporation -intel - -// international : 2013-11-07 Wild Way, LLC +// international : 2013-11-07 Binky Moon, LLC international // intuit : 2015-07-30 Intuit Administrative Services, Inc. intuit -// investments : 2014-03-20 Holly Glen, LLC +// investments : 2014-03-20 Binky Moon, LLC investments // ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. ipiranga -// irish : 2014-08-07 Dot-Irish LLC +// irish : 2014-08-07 Binky Moon, LLC irish -// iselect : 2015-02-11 iSelect Ltd -iselect - // ismaili : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) ismaili @@ -8489,12 +8639,6 @@ itau // itv : 2015-07-09 ITV Services Limited itv -// iveco : 2015-09-03 CNH Industrial N.V. -iveco - -// iwc : 2014-06-23 Richemont DNS Inc. -iwc - // jaguar : 2014-11-13 Jaguar Land Rover Ltd jaguar @@ -8504,24 +8648,18 @@ java // jcb : 2014-11-20 JCB Co., Ltd. jcb -// jcp : 2015-04-23 JCP Media, Inc. -jcp - // jeep : 2015-07-30 FCA US LLC. jeep -// jetzt : 2014-01-09 +// jetzt : 2014-01-09 Binky Moon, LLC jetzt -// jewelry : 2015-03-05 Wild Bloom, LLC +// jewelry : 2015-03-05 Binky Moon, LLC jewelry -// jio : 2015-04-02 Affinity Names, Inc. +// jio : 2015-04-02 Reliance Industries Limited jio -// jlc : 2014-12-04 Richemont DNS Inc. -jlc - // jll : 2015-04-02 Jones Lang LaSalle Incorporated jll @@ -8534,25 +8672,25 @@ jnj // joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry joburg -// jot : 2014-12-18 Amazon EU S.à r.l. +// jot : 2014-12-18 Amazon Registry Services, Inc. jot -// joy : 2014-12-18 Amazon EU S.à r.l. +// joy : 2014-12-18 Amazon Registry Services, Inc. joy -// jpmorgan : 2015-04-30 JPMorgan Chase & Co. +// jpmorgan : 2015-04-30 JPMorgan Chase Bank, National Association jpmorgan // jprs : 2014-09-18 Japan Registry Services Co., Ltd. jprs -// juegos : 2014-03-20 Uniregistry, Corp. +// juegos : 2014-03-20 UNR Corp. juegos // juniper : 2015-07-30 JUNIPER NETWORKS, INC. juniper -// kaufen : 2013-11-07 United TLD Holdco Ltd. +// kaufen : 2013-11-07 Dog Beach, LLC kaufen // kddi : 2014-09-12 KDDI CORPORATION @@ -8573,22 +8711,25 @@ kfh // kia : 2015-07-09 KIA MOTORS CORPORATION kia +// kids : 2021-08-13 DotKids Foundation Limited +kids + // kim : 2013-09-23 Afilias Limited kim // kinder : 2014-11-07 Ferrero Trading Lux S.A. kinder -// kindle : 2015-06-25 Amazon EU S.à r.l. +// kindle : 2015-06-25 Amazon Registry Services, Inc. kindle -// kitchen : 2013-09-20 Just Goodbye, LLC +// kitchen : 2013-09-20 Binky Moon, LLC kitchen // kiwi : 2013-09-20 DOT KIWI LIMITED kiwi -// koeln : 2014-01-09 NetCologne Gesellschaft für Telekommunikation mbH +// koeln : 2014-01-09 dotKoeln GmbH koeln // komatsu : 2015-01-08 Komatsu Ltd. @@ -8615,12 +8756,9 @@ kuokgroup // kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen kyoto -// lacaixa : 2014-01-09 CAIXA D'ESTALVIS I PENSIONS DE BARCELONA +// lacaixa : 2014-01-09 Fundación Bancaria Caixa d’Estalvis i Pensions de Barcelona, “la Caixa” lacaixa -// ladbrokes : 2015-08-06 LADBROKES INTERNATIONAL PLC -ladbrokes - // lamborghini : 2015-06-04 Automobili Lamborghini S.p.A. lamborghini @@ -8633,10 +8771,7 @@ lancaster // lancia : 2015-07-31 Fiat Chrysler Automobiles N.V. lancia -// lancome : 2015-07-23 L'Oréal -lancome - -// land : 2013-09-10 Pine Moon, LLC +// land : 2013-09-10 Binky Moon, LLC land // landrover : 2014-11-13 Jaguar Land Rover Ltd @@ -8657,16 +8792,16 @@ latino // latrobe : 2014-06-16 La Trobe University latrobe -// law : 2015-01-22 Minds + Machines Group Limited +// law : 2015-01-22 Registry Services, LLC law -// lawyer : 2014-03-20 +// lawyer : 2014-03-20 Dog Beach, LLC lawyer -// lds : 2014-03-20 IRI Domain Management, LLC ("Applicant") +// lds : 2014-03-20 IRI Domain Management, LLC lds -// lease : 2014-03-06 Victor Trail, LLC +// lease : 2014-03-06 Binky Moon, LLC lease // leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc @@ -8675,7 +8810,7 @@ leclerc // lefrak : 2015-07-16 LeFrak Organization, Inc. lefrak -// legal : 2014-10-16 Blue Falls, LLC +// legal : 2014-10-16 Binky Moon, LLC legal // lego : 2015-07-16 LEGO Juris A/S @@ -8687,13 +8822,10 @@ lexus // lgbt : 2014-05-08 Afilias Limited lgbt -// liaison : 2014-10-02 Liaison Technologies, Incorporated -liaison - // lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG lidl -// life : 2014-02-06 Trixy Oaks, LLC +// life : 2014-02-06 Binky Moon, LLC life // lifeinsurance : 2015-01-15 American Council of Life Insurers @@ -8702,19 +8834,19 @@ lifeinsurance // lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc. lifestyle -// lighting : 2013-08-27 John McCook, LLC +// lighting : 2013-08-27 Binky Moon, LLC lighting -// like : 2014-12-18 Amazon EU S.à r.l. +// like : 2014-12-18 Amazon Registry Services, Inc. like // lilly : 2015-07-31 Eli Lilly and Company lilly -// limited : 2014-03-06 Big Fest, LLC +// limited : 2014-03-06 Binky Moon, LLC limited -// limo : 2013-10-17 Hidden Frostbite, LLC +// limo : 2013-10-17 Binky Moon, LLC limo // lincoln : 2014-11-13 Ford Motor Company @@ -8723,25 +8855,28 @@ lincoln // linde : 2014-12-04 Linde Aktiengesellschaft linde -// link : 2013-11-14 Uniregistry, Corp. +// link : 2013-11-14 UNR Corp. link // lipsy : 2015-06-25 Lipsy Ltd lipsy -// live : 2014-12-04 +// live : 2014-12-04 Dog Beach, LLC live // living : 2015-07-30 Lifestyle Domain Holdings, Inc. living -// lixil : 2015-03-19 LIXIL Group Corporation -lixil +// llc : 2017-12-14 Afilias Limited +llc + +// llp : 2019-08-26 UNR Corp. +llp // loan : 2014-11-20 dot Loan Limited loan -// loans : 2014-03-20 June Woods, LLC +// loans : 2014-03-20 Binky Moon, LLC loans // locker : 2015-06-04 Dish DBS Corporation @@ -8753,7 +8888,7 @@ locus // loft : 2015-07-30 Annco, Inc. loft -// lol : 2015-01-30 Uniregistry, Corp. +// lol : 2015-01-30 UNR Corp. lol // london : 2013-11-14 Dot London Domains Limited @@ -8774,19 +8909,16 @@ lpl // lplfinancial : 2015-07-30 LPL Holdings, Inc. lplfinancial -// ltd : 2014-09-25 Over Corner, LLC +// ltd : 2014-09-25 Binky Moon, LLC ltd -// ltda : 2014-04-17 DOMAIN ROBOT SERVICOS DE HOSPEDAGEM NA INTERNET LTDA +// ltda : 2014-04-17 InterNetX, Corp ltda // lundbeck : 2015-08-06 H. Lundbeck A/S lundbeck -// lupin : 2014-11-07 LUPIN LIMITED -lupin - -// luxe : 2014-01-09 Top Level Domain Holdings Limited +// luxe : 2014-01-09 Registry Services, LLC luxe // luxury : 2013-10-17 Luxury Partners, LLC @@ -8801,16 +8933,16 @@ madrid // maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF) maif -// maison : 2013-12-05 Victor Frostbite, LLC +// maison : 2013-12-05 Binky Moon, LLC maison -// makeup : 2015-01-15 L'Oréal +// makeup : 2015-01-15 XYZ.COM LLC makeup // man : 2014-12-04 MAN SE man -// management : 2013-11-07 John Goodbye, LLC +// management : 2013-11-07 Binky Moon, LLC management // mango : 2013-10-24 PUNTO FA S.L. @@ -8819,13 +8951,13 @@ mango // map : 2016-06-09 Charleston Road Registry Inc. map -// market : 2014-03-06 +// market : 2014-03-06 Dog Beach, LLC market -// marketing : 2013-11-07 Fern Pass, LLC +// marketing : 2013-11-07 Binky Moon, LLC marketing -// markets : 2014-12-11 IG Group Holdings PLC +// markets : 2014-12-11 Dog Beach, LLC markets // marriott : 2014-10-09 Marriott Worldwide Corporation @@ -8840,7 +8972,7 @@ maserati // mattel : 2015-08-06 Mattel Sites, Inc. mattel -// mba : 2015-04-02 Lone Hollow, LLC +// mba : 2015-04-02 Binky Moon, LLC mba // mckinsey : 2015-07-31 McKinsey Holdings, Inc. @@ -8849,10 +8981,10 @@ mckinsey // med : 2015-08-06 Medistry LLC med -// media : 2014-03-06 Grand Glen, LLC +// media : 2014-03-06 Binky Moon, LLC media -// meet : 2014-01-16 +// meet : 2014-01-16 Charleston Road Registry Inc. meet // melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation @@ -8867,19 +8999,13 @@ memorial // men : 2015-02-26 Exclusive Registry Limited men -// menu : 2013-09-11 Wedding TLD2, LLC +// menu : 2013-09-11 Dot Menu Registry, LLC menu -// meo : 2014-11-07 PT Comunicacoes S.A. -meo - // merckmsd : 2016-07-14 MSD Registry Holdings, Inc. merckmsd -// metlife : 2015-05-07 MetLife Services and Solutions, LLC -metlife - -// miami : 2013-12-19 Top Level Domain Holdings Limited +// miami : 2013-12-19 Registry Services, LLC miami // microsoft : 2014-12-18 Microsoft Corporation @@ -8909,88 +9035,73 @@ mma // mobile : 2016-06-02 Dish DBS Corporation mobile -// mobily : 2014-12-18 GreenTech Consultancy Company W.L.L. -mobily - -// moda : 2013-11-07 United TLD Holdco Ltd. +// moda : 2013-11-07 Dog Beach, LLC moda // moe : 2013-11-13 Interlink Co., Ltd. moe -// moi : 2014-12-18 Amazon EU S.à r.l. +// moi : 2014-12-18 Amazon Registry Services, Inc. moi -// mom : 2015-04-16 Uniregistry, Corp. +// mom : 2015-04-16 UNR Corp. mom // monash : 2013-09-30 Monash University monash -// money : 2014-10-16 Outer McCook, LLC +// money : 2014-10-16 Binky Moon, LLC money -// monster : 2015-09-11 Monster Worldwide, Inc. +// monster : 2015-09-11 XYZ.COM LLC monster -// mopar : 2015-07-30 FCA US LLC. -mopar - -// mormon : 2013-12-05 IRI Domain Management, LLC ("Applicant") +// mormon : 2013-12-05 IRI Domain Management, LLC mormon -// mortgage : 2014-03-20 +// mortgage : 2014-03-20 Dog Beach, LLC mortgage // moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) moscow -// moto : 2015-06-04 +// moto : 2015-06-04 Motorola Trademark Holdings, LLC moto -// motorcycles : 2014-01-09 DERMotorcycles, LLC +// motorcycles : 2014-01-09 XYZ.COM LLC motorcycles // mov : 2014-01-30 Charleston Road Registry Inc. mov -// movie : 2015-02-05 New Frostbite, LLC +// movie : 2015-02-05 Binky Moon, LLC movie -// movistar : 2014-10-16 Telefónica S.A. -movistar - // msd : 2015-07-23 MSD Registry Holdings, Inc. msd // mtn : 2014-12-04 MTN Dubai Limited mtn -// mtpc : 2014-11-20 Mitsubishi Tanabe Pharma Corporation -mtpc - // mtr : 2015-03-12 MTR Corporation Limited mtr +// music : 2021-05-04 DotMusic Limited +music + // mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC mutual // nab : 2015-08-20 National Australia Bank Limited nab -// nadex : 2014-12-11 IG Group Holdings PLC -nadex - // nagoya : 2013-10-24 GMO Registry, Inc. nagoya -// nationwide : 2015-07-23 Nationwide Mutual Insurance Company -nationwide - // natura : 2015-03-12 NATURA COSMÉTICOS S.A. natura -// navy : 2014-03-06 United TLD Holdco Ltd. +// navy : 2014-03-06 Dog Beach, LLC navy // nba : 2015-07-31 NBA REGISTRY, LLC @@ -9005,7 +9116,7 @@ netbank // netflix : 2015-06-18 Netflix, Inc. netflix -// network : 2013-11-14 Trixy Manor, LLC +// network : 2013-11-14 Binky Moon, LLC network // neustar : 2013-12-05 NeuStar, Inc. @@ -9014,10 +9125,7 @@ neustar // new : 2014-01-30 Charleston Road Registry Inc. new -// newholland : 2015-09-03 CNH Industrial N.V. -newholland - -// news : 2014-12-18 +// news : 2014-12-18 Dog Beach, LLC news // next : 2015-06-18 Next plc @@ -9047,7 +9155,7 @@ nike // nikon : 2015-05-21 NIKON CORPORATION nikon -// ninja : 2013-11-07 United TLD Holdco Ltd. +// ninja : 2013-11-07 Dog Beach, LLC ninja // nissan : 2014-03-27 NISSAN MOTOR CO., LTD. @@ -9062,10 +9170,10 @@ nokia // northwesternmutual : 2015-06-18 Northwestern Mutual Registry, LLC northwesternmutual -// norton : 2014-12-04 Symantec Corporation +// norton : 2014-12-04 NortonLifeLock Inc. norton -// now : 2015-06-25 Amazon EU S.à r.l. +// now : 2015-06-25 Amazon Registry Services, Inc. now // nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. @@ -9089,16 +9197,13 @@ nyc // obi : 2014-09-25 OBI Group Holding SE & Co. KGaA obi -// observer : 2015-04-30 +// observer : 2015-04-30 Dog Beach, LLC observer -// off : 2015-07-23 Johnson Shareholdings, Inc. -off - // office : 2015-03-12 Microsoft Corporation office -// okinawa : 2013-12-05 BusinessRalliart Inc. +// okinawa : 2013-12-05 BRregistry, Inc. okinawa // olayan : 2015-05-14 Crescent Holding GmbH @@ -9122,16 +9227,13 @@ one // ong : 2014-03-06 Public Interest Registry ong -// onl : 2013-09-16 I-Registry Ltd. +// onl : 2013-09-16 iRegistry GmbH onl -// online : 2015-01-15 DotOnline Inc. +// online : 2015-01-15 Radix FZC online -// onyourside : 2015-07-23 Nationwide Mutual Insurance Company -onyourside - -// ooo : 2014-01-09 INFIBEAM INCORPORATION LIMITED +// ooo : 2014-01-09 INFIBEAM AVENUES LIMITED ooo // open : 2015-07-31 American Express Travel Related Services Company, Inc. @@ -9149,7 +9251,7 @@ organic // origins : 2015-10-01 The Estée Lauder Companies Inc. origins -// osaka : 2014-09-04 Interlink Co., Ltd. +// osaka : 2014-09-04 Osaka Registry Co., Ltd. osaka // otsuka : 2013-10-11 Otsuka Holdings Co., Ltd. @@ -9158,7 +9260,7 @@ otsuka // ott : 2015-06-04 Dish DBS Corporation ott -// ovh : 2014-01-16 OVH SAS +// ovh : 2014-01-16 MédiaBC ovh // page : 2014-12-04 Charleston Road Registry Inc. @@ -9167,19 +9269,16 @@ page // panasonic : 2015-07-30 Panasonic Corporation panasonic -// panerai : 2014-11-07 Richemont DNS Inc. -panerai - // paris : 2014-01-30 City of Paris paris // pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. pars -// partners : 2013-12-05 Magic Glen, LLC +// partners : 2013-12-05 Binky Moon, LLC partners -// parts : 2013-12-05 Sea Goodbye, LLC +// parts : 2013-12-05 Binky Moon, LLC parts // party : 2014-09-11 Blue Sky Registry Limited @@ -9188,13 +9287,13 @@ party // passagens : 2015-03-05 Travel Reservations SRL passagens -// pay : 2015-08-27 Amazon EU S.à r.l. +// pay : 2015-08-27 Amazon Registry Services, Inc. pay // pccw : 2015-05-14 PCCW Enterprises Limited pccw -// pet : 2015-05-07 Afilias plc +// pet : 2015-05-07 Afilias Limited pet // pfizer : 2015-09-11 Pfizer Inc. @@ -9212,34 +9311,31 @@ philips // phone : 2016-06-02 Dish DBS Corporation phone -// photo : 2013-11-14 Uniregistry, Corp. +// photo : 2013-11-14 UNR Corp. photo -// photography : 2013-09-20 Sugar Glen, LLC +// photography : 2013-09-20 Binky Moon, LLC photography -// photos : 2013-10-17 Sea Corner, LLC +// photos : 2013-10-17 Binky Moon, LLC photos // physio : 2014-05-01 PhysBiz Pty Ltd physio -// piaget : 2014-10-16 Richemont DNS Inc. -piaget - -// pics : 2013-11-14 Uniregistry, Corp. +// pics : 2013-11-14 UNR Corp. pics // pictet : 2014-06-26 Pictet Europe S.A. pictet -// pictures : 2014-03-06 Foggy Sky, LLC +// pictures : 2014-03-06 Binky Moon, LLC pictures // pid : 2015-01-08 Top Level Spectrum, Inc. pid -// pin : 2014-12-18 Amazon EU S.à r.l. +// pin : 2014-12-18 Amazon Registry Services, Inc. pin // ping : 2015-06-11 Ping Registry Provider, Inc. @@ -9251,22 +9347,22 @@ pink // pioneer : 2015-07-16 Pioneer Corporation pioneer -// pizza : 2014-06-26 Foggy Moon, LLC +// pizza : 2014-06-26 Binky Moon, LLC pizza -// place : 2014-04-24 Snow Galley, LLC +// place : 2014-04-24 Binky Moon, LLC place // play : 2015-03-05 Charleston Road Registry Inc. play -// playstation : 2015-07-02 Sony Computer Entertainment Inc. +// playstation : 2015-07-02 Sony Interactive Entertainment Inc. playstation -// plumbing : 2013-09-10 Spring Tigers, LLC +// plumbing : 2013-09-10 Binky Moon, LLC plumbing -// plus : 2015-02-05 Sugar Mill, LLC +// plus : 2015-02-05 Binky Moon, LLC plus // pnc : 2015-07-02 PNC Domain Co., LLC @@ -9275,7 +9371,7 @@ pnc // pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG pohl -// poker : 2014-07-03 Afilias Domains No. 5 Limited +// poker : 2014-07-03 Afilias Limited poker // politie : 2015-08-20 Politie Nederland @@ -9290,16 +9386,16 @@ pramerica // praxi : 2013-12-05 Praxi S.p.A. praxi -// press : 2014-04-03 DotPress Inc. +// press : 2014-04-03 Radix FZC press -// prime : 2015-06-25 Amazon EU S.à r.l. +// prime : 2015-06-25 Amazon Registry Services, Inc. prime // prod : 2014-01-23 Charleston Road Registry Inc. prod -// productions : 2013-12-05 Magic Birch, LLC +// productions : 2013-12-05 Binky Moon, LLC productions // prof : 2014-07-24 Charleston Road Registry Inc. @@ -9308,16 +9404,16 @@ prof // progressive : 2015-07-23 Progressive Casualty Insurance Company progressive -// promo : 2014-12-18 +// promo : 2014-12-18 Afilias Limited promo -// properties : 2013-12-05 Big Pass, LLC +// properties : 2013-12-05 Binky Moon, LLC properties -// property : 2014-05-22 Uniregistry, Corp. +// property : 2014-05-22 UNR Corp. property -// protection : 2015-04-23 +// protection : 2015-04-23 XYZ.COM LLC protection // pru : 2015-07-30 Prudential Financial, Inc. @@ -9326,7 +9422,7 @@ pru // prudential : 2015-07-30 Prudential Financial, Inc. prudential -// pub : 2013-12-12 United TLD Holdco Ltd. +// pub : 2013-12-12 Dog Beach, LLC pub // pwc : 2015-10-29 PricewaterhouseCoopers LLP @@ -9338,22 +9434,16 @@ qpon // quebec : 2013-12-19 PointQuébec Inc quebec -// quest : 2015-03-26 Quest ION Limited +// quest : 2015-03-26 XYZ.COM LLC quest -// qvc : 2015-07-30 QVC, Inc. -qvc - // racing : 2014-12-04 Premier Registry Limited racing // radio : 2016-07-21 European Broadcasting Union (EBU) radio -// raid : 2015-07-23 Johnson Shareholdings, Inc. -raid - -// read : 2014-12-18 Amazon EU S.à r.l. +// read : 2014-12-18 Amazon Registry Services, Inc. read // realestate : 2015-09-11 dotRealEstate LLC @@ -9362,10 +9452,10 @@ realestate // realtor : 2014-05-29 Real Estate Domains LLC realtor -// realty : 2015-03-19 Fegistry, LLC +// realty : 2015-03-19 Dog Beach, LLC realty -// recipes : 2013-10-17 Grand Island, LLC +// recipes : 2013-10-17 Binky Moon, LLC recipes // red : 2013-11-07 Afilias Limited @@ -9377,13 +9467,13 @@ redstone // redumbrella : 2015-03-26 Travelers TLD, LLC redumbrella -// rehab : 2014-03-06 United TLD Holdco Ltd. +// rehab : 2014-03-06 Dog Beach, LLC rehab -// reise : 2014-03-13 +// reise : 2014-03-13 Binky Moon, LLC reise -// reisen : 2014-03-06 New Cypress, LLC +// reisen : 2014-03-06 Binky Moon, LLC reisen // reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc. @@ -9392,40 +9482,40 @@ reit // reliance : 2015-04-02 Reliance Industries Limited reliance -// ren : 2013-12-12 Beijing Qianxiang Wangjing Technology Development Co., Ltd. +// ren : 2013-12-12 ZDNS International Limited ren -// rent : 2014-12-04 DERRent, LLC +// rent : 2014-12-04 XYZ.COM LLC rent -// rentals : 2013-12-05 Big Hollow,LLC +// rentals : 2013-12-05 Binky Moon, LLC rentals -// repair : 2013-11-07 Lone Sunset, LLC +// repair : 2013-11-07 Binky Moon, LLC repair -// report : 2013-12-05 Binky Glen, LLC +// report : 2013-12-05 Binky Moon, LLC report -// republican : 2014-03-20 United TLD Holdco Ltd. +// republican : 2014-03-20 Dog Beach, LLC republican // rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable rest -// restaurant : 2014-07-03 Snow Avenue, LLC +// restaurant : 2014-07-03 Binky Moon, LLC restaurant // review : 2014-11-20 dot Review Limited review -// reviews : 2013-09-13 +// reviews : 2013-09-13 Dog Beach, LLC reviews // rexroth : 2015-06-18 Robert Bosch GMBH rexroth -// rich : 2013-11-21 I-Registry Ltd. +// rich : 2013-11-21 iRegistry GmbH rich // richardli : 2015-05-14 Pacific Century Asset Management (HK) Limited @@ -9434,34 +9524,28 @@ richardli // ricoh : 2014-11-20 Ricoh Company, Ltd. ricoh -// rightathome : 2015-07-23 Johnson Shareholdings, Inc. -rightathome - // ril : 2015-04-02 Reliance Industries Limited ril // rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO rio -// rip : 2014-07-10 United TLD Holdco Ltd. +// rip : 2014-07-10 Dog Beach, LLC rip -// rmit : 2015-11-19 Royal Melbourne Institute of Technology -rmit - // rocher : 2014-12-18 Ferrero Trading Lux S.A. rocher -// rocks : 2013-11-14 +// rocks : 2013-11-14 Dog Beach, LLC rocks -// rodeo : 2013-12-19 Top Level Domain Holdings Limited +// rodeo : 2013-12-19 Registry Services, LLC rodeo -// rogers : 2015-08-06 Rogers Communications Partnership +// rogers : 2015-08-06 Rogers Communications Canada Inc. rogers -// room : 2014-12-18 Amazon EU S.à r.l. +// room : 2014-12-18 Amazon Registry Services, Inc. room // rsvp : 2014-05-08 Charleston Road Registry Inc. @@ -9473,19 +9557,19 @@ rugby // ruhr : 2013-10-02 regiodot GmbH & Co. KG ruhr -// run : 2015-03-19 Snow Park, LLC +// run : 2015-03-19 Binky Moon, LLC run // rwe : 2015-04-02 RWE AG rwe -// ryukyu : 2014-01-09 BusinessRalliart Inc. +// ryukyu : 2014-01-09 BRregistry, Inc. ryukyu // saarland : 2013-12-12 dotSaarland GmbH saarland -// safe : 2014-12-18 Amazon EU S.à r.l. +// safe : 2014-12-18 Amazon Registry Services, Inc. safe // safety : 2015-01-08 Safety Registry Services, LLC. @@ -9494,10 +9578,10 @@ safety // sakura : 2014-12-18 SAKURA Internet Inc. sakura -// sale : 2014-10-16 +// sale : 2014-10-16 Dog Beach, LLC sale -// salon : 2014-12-11 Outer Orchard, LLC +// salon : 2014-12-11 Binky Moon, LLC salon // samsclub : 2015-07-31 Wal-Mart Stores, Inc. @@ -9518,16 +9602,13 @@ sanofi // sap : 2014-03-27 SAP AG sap -// sapo : 2014-11-07 PT Comunicacoes S.A. -sapo - -// sarl : 2014-07-03 Delta Orchard, LLC +// sarl : 2014-07-03 Binky Moon, LLC sarl // sas : 2015-04-02 Research IP LLC sas -// save : 2015-06-25 Amazon EU S.à r.l. +// save : 2015-06-25 Amazon Registry Services, Inc. save // saxo : 2014-10-31 Saxo Bank A/S @@ -9536,7 +9617,7 @@ saxo // sbi : 2015-03-12 STATE BANK OF INDIA sbi -// sbs : 2014-11-07 SPECIAL BROADCASTING SERVICE CORPORATION +// sbs : 2014-11-07 ShortDot SA sbs // sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ) @@ -9548,16 +9629,16 @@ scb // schaeffler : 2015-08-06 Schaeffler Technologies AG & Co. KG schaeffler -// schmidt : 2014-04-03 SALM S.A.S. +// schmidt : 2014-04-03 SCHMIDT GROUPE S.A.S. schmidt // scholarships : 2014-04-24 Scholarships.com, LLC scholarships -// school : 2014-12-18 Little Galley, LLC +// school : 2014-12-18 Binky Moon, LLC school -// schule : 2014-03-06 Outer Moon, LLC +// schule : 2014-03-06 Binky Moon, LLC schule // schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG @@ -9566,12 +9647,6 @@ schwarz // science : 2014-09-11 dot Science Limited science -// scjohnson : 2015-07-23 Johnson Shareholdings, Inc. -scjohnson - -// scor : 2014-10-31 SCOR SE -scor - // scot : 2014-01-23 Dot Scot Registry Limited scot @@ -9581,22 +9656,22 @@ search // seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) seat -// secure : 2015-08-27 Amazon EU S.à r.l. +// secure : 2015-08-27 Amazon Registry Services, Inc. secure -// security : 2015-05-14 +// security : 2015-05-14 XYZ.COM LLC security // seek : 2014-12-04 Seek Limited seek -// select : 2015-10-08 iSelect Ltd +// select : 2015-10-08 Registry Services, LLC select // sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A. sener -// services : 2014-02-27 Fox Castle, LLC +// services : 2014-02-27 Binky Moon, LLC services // ses : 2015-07-23 SES @@ -9611,7 +9686,7 @@ sew // sex : 2014-11-13 ICM Registry SX LLC sex -// sexy : 2013-09-11 Uniregistry, Corp. +// sexy : 2013-09-11 UNR Corp. sexy // sfr : 2015-08-13 Societe Francaise du Radiotelephone - SFR @@ -9635,85 +9710,82 @@ shia // shiksha : 2013-11-14 Afilias Limited shiksha -// shoes : 2013-10-02 Binky Galley, LLC +// shoes : 2013-10-02 Binky Moon, LLC shoes // shop : 2016-04-08 GMO Registry, Inc. shop -// shopping : 2016-03-31 +// shopping : 2016-03-31 Binky Moon, LLC shopping -// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +// shouji : 2015-01-08 Beijing Qihu Keji Co., Ltd. shouji -// show : 2015-03-05 Snow Beach, LLC +// show : 2015-03-05 Binky Moon, LLC show // showtime : 2015-08-06 CBS Domains Inc. showtime -// shriram : 2014-01-23 Shriram Capital Ltd. -shriram - -// silk : 2015-06-25 Amazon EU S.à r.l. +// silk : 2015-06-25 Amazon Registry Services, Inc. silk // sina : 2015-03-12 Sina Corporation sina -// singles : 2013-08-27 Fern Madison, LLC +// singles : 2013-08-27 Binky Moon, LLC singles -// site : 2015-01-15 DotSite Inc. +// site : 2015-01-15 Radix FZC site -// ski : 2015-04-09 STARTING DOT LIMITED +// ski : 2015-04-09 Afilias Limited ski -// skin : 2015-01-15 L'Oréal +// skin : 2015-01-15 XYZ.COM LLC skin -// sky : 2014-06-19 Sky IP International Ltd, a company incorporated in England and Wales, operating via its registered Swiss branch +// sky : 2014-06-19 Sky International AG sky // skype : 2014-12-18 Microsoft Corporation skype -// sling : 2015-07-30 Hughes Satellite Systems Corporation +// sling : 2015-07-30 DISH Technologies L.L.C. sling // smart : 2015-07-09 Smart Communications, Inc. (SMART) smart -// smile : 2014-12-18 Amazon EU S.à r.l. +// smile : 2014-12-18 Amazon Registry Services, Inc. smile // sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F sncf -// soccer : 2015-03-26 Foggy Shadow, LLC +// soccer : 2015-03-26 Binky Moon, LLC soccer -// social : 2013-11-07 United TLD Holdco Ltd. +// social : 2013-11-07 Dog Beach, LLC social -// softbank : 2015-07-02 SoftBank Corp. +// softbank : 2015-07-02 SoftBank Group Corp. softbank -// software : 2014-03-20 +// software : 2014-03-20 Dog Beach, LLC software // sohu : 2013-12-19 Sohu.com Limited sohu -// solar : 2013-11-07 Ruby Town, LLC +// solar : 2013-11-07 Binky Moon, LLC solar -// solutions : 2013-11-07 Silver Cover, LLC +// solutions : 2013-11-07 Binky Moon, LLC solutions -// song : 2015-02-26 Amazon EU S.à r.l. +// song : 2015-02-26 Amazon Registry Services, Inc. song // sony : 2015-01-08 Sony Corporation @@ -9722,24 +9794,21 @@ sony // soy : 2014-01-23 Charleston Road Registry Inc. soy -// space : 2014-04-03 DotSpace Inc. +// spa : 2019-09-19 Asia Spa and Wellness Promotion Council Limited +spa + +// space : 2014-04-03 Radix FZC space -// spiegel : 2014-02-05 SPIEGEL-Verlag Rudolf Augstein GmbH & Co. KG -spiegel +// sport : 2017-11-16 Global Association of International Sports Federations (GAISF) +sport -// spot : 2015-02-26 Amazon EU S.à r.l. +// spot : 2015-02-26 Amazon Registry Services, Inc. spot -// spreadbetting : 2014-12-11 IG Group Holdings PLC -spreadbetting - -// srl : 2015-05-07 mySRL GmbH +// srl : 2015-05-07 InterNetX, Corp srl -// srt : 2015-07-30 FCA US LLC. -srt - // stada : 2014-11-13 STADA Arzneimittel AG stada @@ -9749,18 +9818,12 @@ staples // star : 2015-01-08 Star India Private Limited star -// starhub : 2015-02-05 StarHub Ltd -starhub - // statebank : 2015-03-12 STATE BANK OF INDIA statebank // statefarm : 2015-07-30 State Farm Mutual Automobile Insurance Company statefarm -// statoil : 2014-12-04 Statoil ASA -statoil - // stc : 2014-10-09 Saudi Telecom Company stc @@ -9770,16 +9833,16 @@ stcgroup // stockholm : 2014-12-18 Stockholms kommun stockholm -// storage : 2014-12-22 Self Storage Company LLC +// storage : 2014-12-22 XYZ.COM LLC storage -// store : 2015-04-09 DotStore Inc. +// store : 2015-04-09 Radix FZC store // stream : 2016-01-08 dot Stream Limited stream -// studio : 2015-02-11 +// studio : 2015-02-11 Dog Beach, LLC studio // study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD @@ -9788,22 +9851,22 @@ study // style : 2014-12-04 Binky Moon, LLC style -// sucks : 2014-12-22 Vox Populi Registry Inc. +// sucks : 2014-12-22 Vox Populi Registry Ltd. sucks -// supplies : 2013-12-19 Atomic Fields, LLC +// supplies : 2013-12-19 Binky Moon, LLC supplies -// supply : 2013-12-19 Half Falls, LLC +// supply : 2013-12-19 Binky Moon, LLC supply -// support : 2013-10-24 Grand Orchard, LLC +// support : 2013-10-24 Binky Moon, LLC support -// surf : 2014-01-09 Top Level Domain Holdings Limited +// surf : 2014-01-09 Registry Services, LLC surf -// surgery : 2014-03-20 Tin Avenue, LLC +// surgery : 2014-03-20 Binky Moon, LLC surgery // suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION @@ -9812,19 +9875,13 @@ suzuki // swatch : 2015-01-08 The Swatch Group Ltd swatch -// swiftcover : 2015-07-23 Swiftcover Insurance Services Limited -swiftcover - // swiss : 2014-10-16 Swiss Confederation swiss // sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet sydney -// symantec : 2014-12-04 Symantec Corporation -symantec - -// systems : 2013-11-07 Dash Cypress, LLC +// systems : 2013-11-07 Binky Moon, LLC systems // tab : 2014-12-04 Tabcorp Holdings Limited @@ -9833,7 +9890,7 @@ tab // taipei : 2014-07-10 Taipei City Government taipei -// talk : 2015-04-09 Amazon EU S.à r.l. +// talk : 2015-04-09 Amazon Registry Services, Inc. talk // taobao : 2015-01-15 Alibaba Group Holding Limited @@ -9848,13 +9905,13 @@ tatamotors // tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" tatar -// tattoo : 2013-08-30 Uniregistry, Corp. +// tattoo : 2013-08-30 UNR Corp. tattoo -// tax : 2014-03-20 Storm Orchard, LLC +// tax : 2014-03-20 Binky Moon, LLC tax -// taxi : 2015-03-19 Pine Falls, LLC +// taxi : 2015-03-19 Binky Moon, LLC taxi // tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. @@ -9863,55 +9920,49 @@ tci // tdk : 2015-06-11 TDK Corporation tdk -// team : 2015-03-05 Atomic Lake, LLC +// team : 2015-03-05 Binky Moon, LLC team -// tech : 2015-01-30 Dot Tech LLC +// tech : 2015-01-30 Radix FZC tech -// technology : 2013-09-13 Auburn Falls +// technology : 2013-09-13 Binky Moon, LLC technology -// telecity : 2015-02-19 TelecityGroup International Limited -telecity - -// telefonica : 2014-10-16 Telefónica S.A. -telefonica - // temasek : 2014-08-07 Temasek Holdings (Private) Limited temasek -// tennis : 2014-12-04 Cotton Bloom, LLC +// tennis : 2014-12-04 Binky Moon, LLC tennis // teva : 2015-07-02 Teva Pharmaceutical Industries Limited teva -// thd : 2015-04-02 Homer TLC, Inc. +// thd : 2015-04-02 Home Depot Product Authority, LLC thd -// theater : 2015-03-19 Blue Tigers, LLC +// theater : 2015-03-19 Binky Moon, LLC theater -// theatre : 2015-05-07 +// theatre : 2015-05-07 XYZ.COM LLC theatre // tiaa : 2015-07-23 Teachers Insurance and Annuity Association of America tiaa -// tickets : 2015-02-05 Accent Media Limited +// tickets : 2015-02-05 XYZ.COM LLC tickets -// tienda : 2013-11-14 Victor Manor, LLC +// tienda : 2013-11-14 Binky Moon, LLC tienda // tiffany : 2015-01-30 Tiffany and Company tiffany -// tips : 2013-09-20 Corn Willow, LLC +// tips : 2013-09-20 Binky Moon, LLC tips -// tires : 2014-11-07 Dog Edge, LLC +// tires : 2014-11-07 Binky Moon, LLC tires // tirol : 2014-04-24 punkt Tirol GmbH @@ -9929,16 +9980,16 @@ tkmaxx // tmall : 2015-01-15 Alibaba Group Holding Limited tmall -// today : 2013-09-20 Pearl Woods, LLC +// today : 2013-09-20 Binky Moon, LLC today // tokyo : 2013-11-13 GMO Registry, Inc. tokyo -// tools : 2013-11-21 Pioneer North, LLC +// tools : 2013-11-21 Binky Moon, LLC tools -// top : 2014-03-20 Jiangsu Bangning Science & Technology Co.,Ltd. +// top : 2014-03-20 .TOP Registry top // toray : 2014-12-18 Toray Industries, Inc. @@ -9950,27 +10001,30 @@ toshiba // total : 2015-08-06 Total SA total -// tours : 2015-01-22 Sugar Station, LLC +// tours : 2015-01-22 Binky Moon, LLC tours -// town : 2014-03-06 Koko Moon, LLC +// town : 2014-03-06 Binky Moon, LLC town // toyota : 2015-04-23 TOYOTA MOTOR CORPORATION toyota -// toys : 2014-03-06 Pioneer Orchard, LLC +// toys : 2014-03-06 Binky Moon, LLC toys // trade : 2014-01-23 Elite Registry Limited trade -// trading : 2014-12-11 IG Group Holdings PLC +// trading : 2014-12-11 Dog Beach, LLC trading -// training : 2013-11-07 Wild Willow, LLC +// training : 2013-11-07 Binky Moon, LLC training +// travel : 2015-10-09 Dog Beach, LLC +travel + // travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. travelchannel @@ -9980,7 +10034,7 @@ travelers // travelersinsurance : 2015-03-26 Travelers TLD, LLC travelersinsurance -// trust : 2014-10-16 +// trust : 2014-10-16 UNR Corp. trust // trv : 2015-03-26 Travelers TLD, LLC @@ -9992,10 +10046,10 @@ tube // tui : 2014-07-03 TUI AG tui -// tunes : 2015-02-26 Amazon EU S.à r.l. +// tunes : 2015-02-26 Amazon Registry Services, Inc. tunes -// tushu : 2014-12-18 Amazon EU S.à r.l. +// tushu : 2014-12-18 Amazon Registry Services, Inc. tushu // tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED @@ -10007,16 +10061,13 @@ ubank // ubs : 2014-12-11 UBS AG ubs -// uconnect : 2015-07-30 FCA US LLC. -uconnect - // unicom : 2015-10-15 China United Network Communications Corporation Limited unicom -// university : 2014-03-06 Little Station, LLC +// university : 2014-03-06 Binky Moon, LLC university -// uno : 2013-09-11 Dot Latin LLC +// uno : 2013-09-11 Radix FZC uno // uol : 2014-05-01 UBN INTERNET LTDA. @@ -10025,7 +10076,7 @@ uol // ups : 2015-06-25 UPS Market Driver, Inc. ups -// vacations : 2013-12-05 Atomic Tigers, LLC +// vacations : 2013-12-05 Binky Moon, LLC vacations // vana : 2014-12-11 Lifestyle Domain Holdings, Inc. @@ -10037,22 +10088,22 @@ vanguard // vegas : 2014-01-16 Dot Vegas, Inc. vegas -// ventures : 2013-08-27 Binky Lake, LLC +// ventures : 2013-08-27 Binky Moon, LLC ventures // verisign : 2015-08-13 VeriSign, Inc. verisign -// versicherung : 2014-03-20 +// versicherung : 2014-03-20 tldbox GmbH versicherung -// vet : 2014-03-06 +// vet : 2014-03-06 Dog Beach, LLC vet -// viajes : 2013-10-17 Black Madison, LLC +// viajes : 2013-10-17 Binky Moon, LLC viajes -// video : 2014-10-16 +// video : 2014-10-16 Dog Beach, LLC video // vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe @@ -10061,13 +10112,13 @@ vig // viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd. viking -// villas : 2013-12-05 New Sky, LLC +// villas : 2013-12-05 Binky Moon, LLC villas -// vin : 2015-06-18 Holly Shadow, LLC +// vin : 2015-06-18 Binky Moon, LLC vin -// vip : 2015-01-22 Minds + Machines Group Limited +// vip : 2015-01-22 Registry Services, LLC vip // virgin : 2014-09-25 Virgin Enterprises Limited @@ -10076,15 +10127,9 @@ virgin // visa : 2015-07-30 Visa Worldwide Pte. Limited visa -// vision : 2013-12-05 Koko Station, LLC +// vision : 2013-12-05 Binky Moon, LLC vision -// vista : 2014-09-18 Vistaprint Limited -vista - -// vistaprint : 2014-09-18 Vistaprint Limited -vistaprint - // viva : 2014-11-07 Saudi Telecom Company viva @@ -10094,7 +10139,7 @@ vivo // vlaanderen : 2014-02-06 DNS.be vzw vlaanderen -// vodka : 2013-12-19 Top Level Domain Holdings Limited +// vodka : 2013-12-19 Registry Services, LLC vodka // volkswagen : 2015-05-14 Volkswagen Group of America Inc. @@ -10112,7 +10157,7 @@ voting // voto : 2013-11-21 Monolith Registry LLC voto -// voyage : 2013-08-27 Ruby House, LLC +// voyage : 2013-08-27 Binky Moon, LLC voyage // vuelos : 2015-03-05 Travel Reservations SRL @@ -10127,25 +10172,22 @@ walmart // walter : 2014-11-13 Sandvik AB walter -// wang : 2013-10-24 Zodiac Leo Limited +// wang : 2013-10-24 Zodiac Wang Limited wang -// wanggou : 2014-12-18 Amazon EU S.à r.l. +// wanggou : 2014-12-18 Amazon Registry Services, Inc. wanggou -// warman : 2015-06-18 Weir Group IP Limited -warman - -// watch : 2013-11-14 Sand Shadow, LLC +// watch : 2013-11-14 Binky Moon, LLC watch -// watches : 2014-12-22 Richemont DNS Inc. +// watches : 2014-12-22 Afilias Limited watches -// weather : 2015-01-08 The Weather Channel, LLC +// weather : 2015-01-08 International Business Machines Corporation weather -// weatherchannel : 2015-03-12 The Weather Channel, LLC +// weatherchannel : 2015-03-12 International Business Machines Corporation weatherchannel // webcam : 2014-01-23 dot Webcam Limited @@ -10154,13 +10196,10 @@ webcam // weber : 2015-06-04 Saint-Gobain Weber SA weber -// website : 2014-04-03 DotWebsite Inc. +// website : 2014-04-03 Radix FZC website -// wed : 2013-10-01 Atgron, Inc. -wed - -// wedding : 2014-04-24 Top Level Domain Holdings Limited +// wedding : 2014-04-24 Registry Services, LLC wedding // weibo : 2015-03-05 Sina Corporation @@ -10187,7 +10226,7 @@ win // windows : 2014-12-18 Microsoft Corporation windows -// wine : 2015-06-18 June Station, LLC +// wine : 2015-06-18 Binky Moon, LLC wine // winners : 2015-07-16 The TJX Companies, Inc. @@ -10202,22 +10241,22 @@ wolterskluwer // woodside : 2015-07-09 Woodside Petroleum Limited woodside -// work : 2013-12-19 Top Level Domain Holdings Limited +// work : 2013-12-19 Registry Services, LLC work -// works : 2013-11-14 Little Dynamite, LLC +// works : 2013-11-14 Binky Moon, LLC works -// world : 2014-06-12 Bitter Fields, LLC +// world : 2014-06-12 Binky Moon, LLC world -// wow : 2015-10-08 Amazon EU S.à r.l. +// wow : 2015-10-08 Amazon Registry Services, Inc. wow // wtc : 2013-12-19 World Trade Centers Association, Inc. wtc -// wtf : 2014-03-06 Hidden Way, LLC +// wtf : 2014-03-06 Binky Moon, LLC wtf // xbox : 2014-12-18 Microsoft Corporation @@ -10229,7 +10268,7 @@ xerox // xfinity : 2015-07-09 Comcast IP Holdings I, LLC xfinity -// xihuan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +// xihuan : 2015-01-08 Beijing Qihu Keji Co., Ltd. xihuan // xin : 2014-12-11 Elegant Leader Limited @@ -10238,7 +10277,7 @@ xin // xn--11b4c3d : 2015-01-15 VeriSign Sarl कॉम -// xn--1ck2e1b : 2015-02-26 Amazon EU S.à r.l. +// xn--1ck2e1b : 2015-02-26 Amazon Registry Services, Inc. セール // xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd. @@ -10250,28 +10289,25 @@ xin // xn--3bst00m : 2013-09-13 Eagle Horizon Limited 集团 -// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED +// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED OY 在线 -// xn--3oq18vl8pn36a : 2015-07-02 Volkswagen (China) Investment Co., Ltd. -大众汽车 - // xn--3pxu8k : 2015-01-15 VeriSign Sarl 点看 // xn--42c2d9a : 2015-01-15 VeriSign Sarl คอม -// xn--45q11c : 2013-11-21 Zodiac Scorpio Limited +// xn--45q11c : 2013-11-21 Zodiac Gemini Ltd 八卦 -// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment +// xn--4gbrim : 2013-10-04 Helium TLDs Ltd موقع // xn--55qw42g : 2013-11-08 China Organizational Name Administration Center 公益 -// xn--55qx5d : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) +// xn--55qx5d : 2013-11-14 China Internet Network Information Center (CNNIC) 公司 // xn--5su34j936bgsg : 2015-09-03 Shangri‐La International Hotel Management Limited @@ -10313,7 +10349,7 @@ xin // xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited 淡马锡 -// xn--bck1b9a5dre4c : 2015-02-26 Amazon EU S.à r.l. +// xn--bck1b9a5dre4c : 2015-02-26 Amazon Registry Services, Inc. ファッション // xn--c1avg : 2013-11-14 Public Interest Registry @@ -10322,46 +10358,46 @@ xin // xn--c2br7g : 2015-01-15 VeriSign Sarl नेट -// xn--cck2b3b : 2015-02-26 Amazon EU S.à r.l. +// xn--cck2b3b : 2015-02-26 Amazon Registry Services, Inc. ストア +// xn--cckwcxetd : 2019-12-19 Amazon Registry Services, Inc. +アマゾン + // xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD 삼성 -// xn--czr694b : 2014-01-16 Dot Trademark TLD Holding Company Limited +// xn--czr694b : 2014-01-16 Internet DotTrademark Organisation Limited 商标 -// xn--czrs0t : 2013-12-19 Wild Island, LLC +// xn--czrs0t : 2013-12-19 Binky Moon, LLC 商店 -// xn--czru2d : 2013-11-21 Zodiac Capricorn Limited +// xn--czru2d : 2013-11-21 Zodiac Aquarius Limited 商城 // xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet” дети -// xn--eckvdtc9d : 2014-12-18 Amazon EU S.à r.l. +// xn--eckvdtc9d : 2014-12-18 Amazon Registry Services, Inc. ポイント -// xn--efvy88h : 2014-08-22 Xinhua News Agency Guangdong Branch 新华通讯社广东分社 +// xn--efvy88h : 2014-08-22 Guangzhou YU Wei Information Technology Co., Ltd. 新闻 -// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited -工行 - -// xn--fct429k : 2015-04-09 Amazon EU S.à r.l. +// xn--fct429k : 2015-04-09 Amazon Registry Services, Inc. 家電 // xn--fhbei : 2015-01-15 VeriSign Sarl كوم -// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED +// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED OY 中文网 // xn--fiq64b : 2013-10-14 CITIC Group Corporation 中信 -// xn--fjq720a : 2014-05-22 Will Bloom, LLC +// xn--fjq720a : 2014-05-22 Binky Moon, LLC 娱乐 // xn--flw351e : 2014-07-31 Charleston Road Registry Inc. @@ -10370,42 +10406,42 @@ xin // xn--fzys8d69uvgm : 2015-05-14 PCCW Enterprises Limited 電訊盈科 -// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited +// xn--g2xx48c : 2015-01-30 Nawang Heli(Xiamen) Network Service Co., LTD. 购物 -// xn--gckr3f0f : 2015-02-26 Amazon EU S.à r.l. +// xn--gckr3f0f : 2015-02-26 Amazon Registry Services, Inc. クラウド -// xn--gk3at1e : 2015-10-08 Amazon EU S.à r.l. +// xn--gk3at1e : 2015-10-08 Amazon Registry Services, Inc. 通販 -// xn--hxt814e : 2014-05-15 Zodiac Libra Limited +// xn--hxt814e : 2014-05-15 Zodiac Taurus Limited 网店 // xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry संगठन -// xn--imr513n : 2014-12-11 Dot Trademark TLD Holding Company Limited +// xn--imr513n : 2014-12-11 Internet DotTrademark Organisation Limited 餐厅 -// xn--io0a7i : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) +// xn--io0a7i : 2013-11-14 China Internet Network Information Center (CNNIC) 网络 // xn--j1aef : 2015-01-15 VeriSign Sarl ком +// xn--jlq480n2rg : 2019-12-19 Amazon Registry Services, Inc. +亚马逊 + // xn--jlq61u9w7b : 2015-01-08 Nokia Corporation 诺基亚 -// xn--jvr189m : 2015-02-26 Amazon EU S.à r.l. +// xn--jvr189m : 2015-02-26 Amazon Registry Services, Inc. 食品 // xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V. 飞利浦 -// xn--kpu716f : 2014-12-22 Richemont DNS Inc. -手表 - // xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd 手机 @@ -10421,9 +10457,6 @@ xin // xn--mgbab2bd : 2013-10-31 CORE Association بازار -// xn--mgbb9fbpob : 2014-12-18 GreenTech Consultancy Company W.L.L. -موبايلي - // xn--mgbca7dzdo : 2015-07-30 Abu Dhabi Systems and Information Centre ابوظبي @@ -10457,12 +10490,12 @@ xin // xn--nyqy26a : 2014-11-07 Stable Tone Limited 健康 +// xn--otu796d : 2017-08-06 Jiang Yu Liang Cai Technology Company Limited +招聘 + // xn--p1acf : 2013-12-12 Rusnames Limited рус -// xn--pbt977c : 2014-12-22 Richemont DNS Inc. -珠宝 - // xn--pssy2u : 2015-01-15 VeriSign Sarl 大拿 @@ -10475,10 +10508,10 @@ xin // xn--rhqv96g : 2013-09-11 Stable Tone Limited 世界 -// xn--rovu88b : 2015-02-26 Amazon EU S.à r.l. +// xn--rovu88b : 2015-02-26 Amazon Registry Services, Inc. 書籍 -// xn--ses554g : 2014-01-16 +// xn--ses554g : 2014-01-16 KNET Co., Ltd. 网址 // xn--t60b56a : 2015-01-15 VeriSign Sarl @@ -10490,7 +10523,7 @@ xin // xn--tiq49xqyj : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) 天主教 -// xn--unup4y : 2013-07-14 Spring Fields, LLC +// xn--unup4y : 2013-07-14 Binky Moon, LLC 游戏 // xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG @@ -10499,7 +10532,7 @@ vermögensberater // xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG vermögensberatung -// xn--vhquv : 2013-08-27 Dash McCook, LLC +// xn--vhquv : 2013-08-27 Binky Moon, LLC 企业 // xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd. @@ -10517,58 +10550,52 @@ vermögensberatung // xn--zfr164b : 2013-11-08 China Organizational Name Administration Center 政务 -// xperia : 2015-05-14 Sony Mobile Communications AB -xperia - // xyz : 2013-12-05 XYZ.COM LLC xyz -// yachts : 2014-01-09 DERYachts, LLC +// yachts : 2014-01-09 XYZ.COM LLC yachts -// yahoo : 2015-04-02 Yahoo! Domain Services Inc. +// yahoo : 2015-04-02 Oath Inc. yahoo -// yamaxun : 2014-12-18 Amazon EU S.à r.l. +// yamaxun : 2014-12-18 Amazon Registry Services, Inc. yamaxun -// yandex : 2014-04-10 YANDEX, LLC +// yandex : 2014-04-10 Yandex Europe B.V. yandex // yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. yodobashi -// yoga : 2014-05-29 Top Level Domain Holdings Limited +// yoga : 2014-05-29 Registry Services, LLC yoga // yokohama : 2013-12-12 GMO Registry, Inc. yokohama -// you : 2015-04-09 Amazon EU S.à r.l. +// you : 2015-04-09 Amazon Registry Services, Inc. you // youtube : 2014-05-01 Charleston Road Registry Inc. youtube -// yun : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +// yun : 2015-01-08 Beijing Qihu Keji Co., Ltd. yun -// zappos : 2015-06-25 Amazon EU S.à r.l. +// zappos : 2015-06-25 Amazon Registry Services, Inc. zappos // zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) zara -// zero : 2014-12-18 Amazon EU S.à r.l. +// zero : 2014-12-18 Amazon Registry Services, Inc. zero // zip : 2014-05-08 Charleston Road Registry Inc. zip -// zippo : 2015-07-02 Zadco Company -zippo - -// zone : 2013-11-14 Outer Falls, LLC +// zone : 2013-11-14 Binky Moon, LLC zone // zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich) @@ -10585,18 +10612,50 @@ cc.ua inf.ua ltd.ua +// 611coin : https://611project.org/ +611.to + +// Aaron Marais' Gitlab pages: https://lab.aaronleem.co.za +// Submitted by Aaron Marais +graphox.us + +// accesso Technology Group, plc. : https://accesso.com/ +// Submitted by accesso Team +*.devcdnaccesso.com + +// Adobe : https://www.adobe.com/ +// Submitted by Ian Boston and Lars Trieloff +adobeaemcloud.com +*.dev.adobeaemcloud.com +hlx.live +adobeaemcloud.net +hlx.page +hlx3.page + // Agnat sp. z o.o. : https://domena.pl // Submitted by Przemyslaw Plewa beep.pl +// alboto.ca : http://alboto.ca +// Submitted by Anton Avramov +barsy.ca + // Alces Software Ltd : http://alces-software.com // Submitted by Mark J. Titorenko *.compute.estate *.alces.network +// all-inkl.com : https://all-inkl.com +// Submitted by Werner Kaltofen +kasserver.com + +// Altervista: https://www.altervista.org +// Submitted by Carlo Cannas +altervista.org + // alwaysdata : https://www.alwaysdata.com // Submitted by Cyril -*.alwaysdata.net +alwaysdata.net // Amazon CloudFront : https://aws.amazon.com/cloudfront/ // Submitted by Donavan Miller @@ -10612,9 +10671,11 @@ us-east-1.amazonaws.com // Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ // Submitted by Luke Wells cn-north-1.eb.amazonaws.com.cn +cn-northwest-1.eb.amazonaws.com.cn elasticbeanstalk.com ap-northeast-1.elasticbeanstalk.com ap-northeast-2.elasticbeanstalk.com +ap-northeast-3.elasticbeanstalk.com ap-south-1.elasticbeanstalk.com ap-southeast-1.elasticbeanstalk.com ap-southeast-2.elasticbeanstalk.com @@ -10622,6 +10683,7 @@ ca-central-1.elasticbeanstalk.com eu-central-1.elasticbeanstalk.com eu-west-1.elasticbeanstalk.com eu-west-2.elasticbeanstalk.com +eu-west-3.elasticbeanstalk.com sa-east-1.elasticbeanstalk.com us-east-1.elasticbeanstalk.com us-east-2.elasticbeanstalk.com @@ -10634,6 +10696,10 @@ us-west-2.elasticbeanstalk.com *.elb.amazonaws.com *.elb.amazonaws.com.cn +// Amazon Global Accelerator : https://aws.amazon.com/global-accelerator/ +// Submitted by Daniel Massaguer +awsglobalaccelerator.com + // Amazon S3 : https://aws.amazon.com/s3/ // Submitted by Luke Wells s3.amazonaws.com @@ -10646,6 +10712,7 @@ s3-ca-central-1.amazonaws.com s3-eu-central-1.amazonaws.com s3-eu-west-1.amazonaws.com s3-eu-west-2.amazonaws.com +s3-eu-west-3.amazonaws.com s3-external-1.amazonaws.com s3-fips-us-gov-west-1.amazonaws.com s3-sa-east-1.amazonaws.com @@ -10659,6 +10726,7 @@ s3.cn-north-1.amazonaws.com.cn s3.ca-central-1.amazonaws.com s3.eu-central-1.amazonaws.com s3.eu-west-2.amazonaws.com +s3.eu-west-3.amazonaws.com s3.us-east-2.amazonaws.com s3.dualstack.ap-northeast-1.amazonaws.com s3.dualstack.ap-northeast-2.amazonaws.com @@ -10669,6 +10737,7 @@ s3.dualstack.ca-central-1.amazonaws.com s3.dualstack.eu-central-1.amazonaws.com s3.dualstack.eu-west-1.amazonaws.com s3.dualstack.eu-west-2.amazonaws.com +s3.dualstack.eu-west-3.amazonaws.com s3.dualstack.sa-east-1.amazonaws.com s3.dualstack.us-east-1.amazonaws.com s3.dualstack.us-east-2.amazonaws.com @@ -10685,6 +10754,7 @@ s3-website.ap-south-1.amazonaws.com s3-website.ca-central-1.amazonaws.com s3-website.eu-central-1.amazonaws.com s3-website.eu-west-2.amazonaws.com +s3-website.eu-west-3.amazonaws.com s3-website.us-east-2.amazonaws.com // Amune : https://amune.org/ @@ -10692,10 +10762,33 @@ s3-website.us-east-2.amazonaws.com t3l3p0rt.net tele.amune.org +// Apigee : https://apigee.com/ +// Submitted by Apigee Security Team +apigee.io + +// Apphud : https://apphud.com +// Submitted by Alexander Selivanov +siiites.com + +// Appspace : https://www.appspace.com +// Submitted by Appspace Security Team +appspacehosted.com +appspaceusercontent.com + +// Appudo UG (haftungsbeschränkt) : https://www.appudo.com +// Submitted by Alexander Hochbaum +appudo.net + // Aptible : https://www.aptible.com/ // Submitted by Thomas Orozco on-aptible.com +// ASEINet : https://www.aseinet.com/ +// Submitted by Asei SEKIGUCHI +user.aseinet.ne.jp +gv.vc +d.gv.vc + // Asociación Amigos de la Informática "Euskalamiga" : http://encounter.eus/ // Submitted by Hector Martin user.party.eus @@ -10711,19 +10804,67 @@ sweetpepper.org // Submitted by Vincent Tseng myasustor.com +// Atlassian : https://atlassian.com +// Submitted by Sam Smyth +cdn.prod.atlassian-dev.net + // AVM : https://avm.de // Submitted by Andreas Weise myfritz.net +// AVStack Pte. Ltd. : https://avstack.io +// Submitted by Jasper Hugo +onavstack.net + // AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com // Submitted by James Kennedy *.awdev.ca *.advisor.ws +// AZ.pl sp. z.o.o: https://az.pl +// Submited by Krzysztof Wolski +ecommerce-shop.pl + +// b-data GmbH : https://www.b-data.io +// Submitted by Olivier Benz +b-data.io + // backplane : https://www.backplane.io // Submitted by Anthony Voutas backplaneapp.io +// Balena : https://www.balena.io +// Submitted by Petros Angelatos +balena-devices.com + +// University of Banja Luka : https://unibl.org +// Domains for Republic of Srpska administrative entity. +// Submitted by Marko Ivanovic +rs.ba + +// Banzai Cloud +// Submitted by Janos Matyas +*.banzai.cloud +app.banzaicloud.io +*.backyards.banzaicloud.io + +// BASE, Inc. : https://binc.jp +// Submitted by Yuya NAGASAWA +base.ec +official.ec +buyshop.jp +fashionstore.jp +handcrafted.jp +kawaiishop.jp +supersale.jp +theshop.jp +shopselect.net +base.shop + +// Beget Ltd +// Submitted by Lev Nekrasov +*.beget.app + // BetaInABox // Submitted by Adrian betainabox.com @@ -10732,10 +10873,30 @@ betainabox.com // Submitted by Nathan O'Sullivan bnr.la +// Bitbucket : http://bitbucket.org +// Submitted by Andy Ortlieb +bitbucket.io + +// Blackbaud, Inc. : https://www.blackbaud.com +// Submitted by Paul Crowder +blackbaudcdn.net + +// Blatech : http://www.blatech.net +// Submitted by Luke Bratch +of.je + +// Blue Bite, LLC : https://bluebite.com +// Submitted by Joshua Weiss +bluebite.io + // Boomla : https://boomla.com // Submitted by Tibor Halter boomla.net +// Boutir : https://www.boutir.com +// Submitted by Eric Ng Ka Ka +boutir.com + // Boxfuse : https://boxfuse.com // Submitted by Axel Fontaine boxfuse.io @@ -10749,45 +10910,68 @@ square7.de bplaced.net square7.net +// Brendly : https://brendly.rs +// Submitted by Dusan Radovanovic +shop.brendly.rs + // BrowserSafetyMark // Submitted by Dave Tharp browsersafetymark.io +// Bytemark Hosting : https://www.bytemark.co.uk +// Submitted by Paul Cammish +uk0.bigv.io +dh.bytemark.co.uk +vm.bytemark.co.uk + +// Caf.js Labs LLC : https://www.cafjs.com +// Submitted by Antonio Lain +cafjs.com + // callidomus : https://www.callidomus.com/ // Submitted by Marcus Popp mycd.eu +// Carrd : https://carrd.co +// Submitted by AJ +drr.ac +uwu.ai +carrd.co +crd.co +ju.mp + // CentralNic : http://www.centralnic.com/names/domains // Submitted by registry ae.org -ar.com br.com cn.com com.de com.se de.com eu.com -gb.com gb.net -hu.com hu.net jp.net jpn.com -kr.com mex.com -no.com -qc.com ru.com sa.com -se.com se.net uk.com uk.net us.com -uy.com za.bz za.com +// No longer operated by CentralNic, these entries should be adopted and/or removed by current operators +// Submitted by Gavin Brown +ar.com +hu.com +kr.com +no.com +qc.com +uy.com + // Africa.com Web Solutions Ltd : https://registry.africa.com // Submitted by Gavin Brown africa.com @@ -10799,6 +10983,7 @@ gr.com // Radix FZC : http://domains.in.net // Submitted by Gavin Brown in.net +web.in // US REGISTRY LLC : http://us.org // Submitted by Gavin Brown @@ -10808,6 +10993,16 @@ us.org // Submitted by Gavin Brown co.com +// Roar Domains LLC : https://roar.basketball/ +// Submitted by Gavin Brown +aus.basketball +nz.basketball + +// BRS Media : https://brsmedia.com/ +// Submitted by Gavin Brown +radio.am +radio.fm + // c.la : http://www.c.la/ c.la @@ -10815,17 +11010,37 @@ c.la // Submitted by B. Blechschmidt certmgr.org -// Citrix : https://citrix.com -// Submitted by Alex Stoddard -xenapponazure.com +// Cityhost LLC : https://cityhost.ua +// Submitted by Maksym Rivtin +cx.ua + +// Civilized Discourse Construction Kit, Inc. : https://www.discourse.org/ +// Submitted by Rishabh Nambiar & Michael Brown +discourse.group +discourse.team + +// Clever Cloud : https://www.clever-cloud.com/ +// Submitted by Quentin Adam +cleverapps.io + +// Clerk : https://www.clerk.dev +// Submitted by Colin Sidoti +clerk.app +clerkstage.app +*.lcl.dev +*.lclstage.dev +*.stg.dev +*.stgstage.dev -// ClearVox : http://www.clearvox.nl/ -// Submitted by Leon Rowland -virtueeldomein.nl +// ClickRising : https://clickrising.com/ +// Submitted by Umut Gumeli +clickrising.net // Cloud66 : https://www.cloud66.com/ // Submitted by Khash Sajadi c66.me +cloud66.ws +cloud66.zone // CloudAccess.net : https://www.cloudaccess.net/ // Submitted by Pawel Panek @@ -10840,9 +11055,27 @@ cloudaccess.net cloudcontrolled.com cloudcontrolapp.com +// Cloudera, Inc. : https://www.cloudera.com/ +// Submitted by Kedarnath Waikar +*.cloudera.site + +// Cloudflare, Inc. : https://www.cloudflare.com/ +// Submitted by Cloudflare Team +pages.dev +trycloudflare.com +workers.dev + +// Clovyr : https://clovyr.io +// Submitted by Patrick Nielsen +wnext.app + // co.ca : http://registry.co.ca/ co.ca +// Co & Co : https://co-co.nl/ +// Submitted by Govert Versluis +*.otap.co + // i-registry s.r.o. : http://www.i-registry.cz/ // Submitted by Martin Semrad co.cz @@ -10869,10 +11102,32 @@ cloudns.pro cloudns.pw cloudns.us +// CNPY : https://cnpy.gdn +// Submitted by Angelo Gladding +cnpy.gdn + +// Codeberg e. V. : https://codeberg.org +// Submitted by Moritz Marquardt +codeberg.page + // CoDNS B.V. co.nl co.no +// Combell.com : https://www.combell.com +// Submitted by Thomas Wouters +webhosting.be +hosting-cluster.nl + +// Coordination Center for TLD RU and XN--P1AI : https://cctld.ru/en/domains/domens_ru/reserved/ +// Submitted by George Georgievsky +ac.ru +edu.ru +gov.ru +int.ru +mil.ru +test.ru + // COSIMO GmbH : http://www.cosimo.de // Submitted by Rene Marticke dyn.cosidns.de @@ -10897,16 +11152,43 @@ realm.cz // Submitted by Jonathan Rudenberg cupcake.is +// Curv UG : https://curv-labs.de/ +// Submitted by Marvin Wiesner +curv.dev + +// Customer OCI - Oracle Dyn https://cloud.oracle.com/home https://dyn.com/dns/ +// Submitted by Gregory Drake +// Note: This is intended to also include customer-oci.com due to wildcards implicitly including the current label +*.customer-oci.com +*.oci.customer-oci.com +*.ocp.customer-oci.com +*.ocs.customer-oci.com + // cyon GmbH : https://www.cyon.ch/ // Submitted by Dominic Luechinger cyon.link cyon.site +// Danger Science Group: https://dangerscience.com/ +// Submitted by Skylar MacDonald +fnwk.site +folionetwork.site +platform0.app + // Daplie, Inc : https://daplie.com // Submitted by AJ ONeal daplie.me localhost.daplie.me +// Datto, Inc. : https://www.datto.com/ +// Submitted by Philipp Heckel +dattolocal.com +dattorelay.com +dattoweb.com +mydatto.com +dattolocal.net +mydatto.net + // Dansk.net : http://www.dansk.net/ // Submitted by Anani Voule biz.dk @@ -10915,22 +11197,71 @@ firm.dk reg.dk store.dk +// dappnode.io : https://dappnode.io/ +// Submitted by Abel Boldu / DAppNode Team +dyndns.dappnode.io + +// dapps.earth : https://dapps.earth/ +// Submitted by Daniil Burdakov +*.dapps.earth +*.bzz.dapps.earth + +// Dark, Inc. : https://darklang.com +// Submitted by Paul Biggar +builtwithdark.com + +// DataDetect, LLC. : https://datadetect.com +// Submitted by Andrew Banchich +demo.datadetect.com +instance.datadetect.com + +// Datawire, Inc : https://www.datawire.io +// Submitted by Richard Li +edgestack.me + +// DDNS5 : https://ddns5.com +// Submitted by Cameron Elliott +ddns5.com + // Debian : https://www.debian.org/ // Submitted by Peter Palfrader / Debian Sysadmin Team debian.net +// Deno Land Inc : https://deno.com/ +// Submitted by Luca Casonato +deno.dev +deno-staging.dev + // deSEC : https://desec.io/ // Submitted by Peter Thomassen dedyn.io +// Diher Solutions : https://diher.solutions +// Submitted by Didi Hermawan +*.rss.my.id +*.diher.solutions + +// DNS Africa Ltd https://dns.business +// Submitted by Calvin Browne +jozi.biz + // DNShome : https://www.dnshome.de/ // Submitted by Norbert Auler dnshome.de +// DotArai : https://www.dotarai.com/ +// Submitted by Atsadawat Netcharadsang +online.th +shop.th + // DrayTek Corp. : https://www.draytek.com/ // Submitted by Paul Fang drayddns.com +// DreamCommerce : https://shoper.pl/ +// Submitted by Konrad Kotarba +shoparena.pl + // DreamHost : http://www.dreamhost.com/ // Submitted by Andrew Farmer dreamhosters.com @@ -10948,6 +11279,13 @@ drud.us // Submitted by Richard Harper duckdns.org +// Bip : https://bip.sh +// Submitted by Joel Kennedy +bip.sh + +// bitbridge.net : Submitted by Craig Welch, abeliidev@gmail.com +bitbridge.net + // dy.fi : http://dy.fi/ // Submitted by Heikki Hannikainen dy.fi @@ -11251,6 +11589,18 @@ ddnss.org definima.net definima.io +// DigitalOcean App Platform : https://www.digitalocean.com/products/app-platform/ +// Submitted by Braxton Huggins +ondigitalocean.app + +// DigitalOcean Spaces : https://www.digitalocean.com/products/spaces/ +// Submitted by Robin H. Johnson +*.digitaloceanspaces.com + +// dnstrace.pro : https://dnstrace.pro/ +// Submitted by Chris Partridge +bci.dnstrace.pro + // Dynu.com : https://www.dynu.com/ // Submitted by Sue Ye ddnsfree.com @@ -11279,14 +11629,33 @@ dynv6.net // Submitted by Vladimir Dudr e4.cz +// eero : https://eero.com/ +// Submitted by Yue Kang +eero.online +eero-stage.online + +// Elementor : Elementor Ltd. +// Submitted by Anton Barkan +elementor.cloud +elementor.cool + +// En root‽ : https://en-root.org +// Submitted by Emmanuel Raviart +en-root.fr + // Enalean SAS: https://www.enalean.com // Submitted by Thomas Cottier mytuleap.com +tuleap-partners.com + +// ECG Robotics, Inc: https://ecgrobotics.org +// Submitted by +onred.one +staging.onred.one -// Enonic : http://enonic.com/ -// Submitted by Erik Kaareng-Sunde -enonic.io -customer.enonic.io +// encoway GmbH : https://www.encoway.de +// Submitted by Marcel Daus +eu.encoway.cloud // EU.org https://eu.org/ // Submitted by Pierre Beyssac @@ -11347,6 +11716,10 @@ tr.eu.org uk.eu.org us.eu.org +// Eurobyte : https://eurobyte.ru +// Submitted by Evgeniy Subbotin +eurodir.ru + // Evennode : http://www.evennode.com/ // Submitted by Michal Kralik eu-1.evennode.com @@ -11366,6 +11739,10 @@ twmail.org mymailer.com.tw url.tw +// Fabrica Technologies, Inc. : https://www.fabrica.dev/ +// Submitted by Eric Jiang +onfabrica.com + // Facebook, Inc. // Submitted by Peter Ruibal apps.fbsbx.com @@ -11449,9 +11826,12 @@ vologda.su // Fancy Bits, LLC : http://getchannels.com // Submitted by Aman Gupta channelsdvr.net +u.channelsdvr.net // Fastly Inc. : http://www.fastly.com/ // Submitted by Fastly Security +edgecompute.app +fastly-terrarium.com fastlylb.net map.fastlylb.net freetls.fastly.net @@ -11462,29 +11842,97 @@ a.ssl.fastly.net b.ssl.fastly.net global.ssl.fastly.net -// Featherhead : https://featherhead.xyz/ -// Submitted by Simon Menke -fhapp.xyz +// FASTVPS EESTI OU : https://fastvps.ru/ +// Submitted by Likhachev Vasiliy +fastvps-server.com +fastvps.host +myfast.host +fastvps.site +myfast.space // Fedora : https://fedoraproject.org/ // submitted by Patrick Uiterwijk fedorainfracloud.org fedorapeople.org cloud.fedoraproject.org +app.os.fedoraproject.org +app.os.stg.fedoraproject.org + +// FearWorks Media Ltd. : https://fearworksmedia.co.uk +// submitted by Keith Fairley +couk.me +ukco.me +conn.uk +copro.uk +hosp.uk + +// Fermax : https://fermax.com/ +// submitted by Koen Van Isterdael +mydobiss.com + +// FH Muenster : https://www.fh-muenster.de +// Submitted by Robin Naundorf +fh-muenster.io // Filegear Inc. : https://www.filegear.com // Submitted by Jason Zhu filegear.me +filegear-au.me +filegear-de.me +filegear-gb.me +filegear-ie.me +filegear-jp.me +filegear-sg.me // Firebase, Inc. // Submitted by Chris Raynor firebaseapp.com +// Firewebkit : https://www.firewebkit.com +// Submitted by Majid Qureshi +fireweb.app + +// FLAP : https://www.flap.cloud +// Submitted by Louis Chemineau +flap.id + +// FlashDrive : https://flashdrive.io +// Submitted by Eric Chan +onflashdrive.app +fldrv.com + +// fly.io: https://fly.io +// Submitted by Kurt Mackey +fly.dev +edgeapp.net +shw.io + // Flynn : https://flynn.io // Submitted by Jonathan Rudenberg -flynnhub.com flynnhosting.net +// Forgerock : https://www.forgerock.com +// Submitted by Roderick Parr +forgeblocks.com +id.forgerock.io + +// Framer : https://www.framer.com +// Submitted by Koen Rouwhorst +framer.app +framercanvas.com + +// Frusky MEDIA&PR : https://www.frusky.de +// Submitted by Victor Pupynin +*.frusky.de + +// RavPage : https://www.ravpage.co.il +// Submitted by Roni Horowitz +ravpage.co.il + +// Frederik Braun https://frederik-braun.com +// Submitted by Frederik Braun +0e.vc + // Freebox : http://www.freebox.fr // Submitted by Romain Fliedel freebox-os.com @@ -11494,32 +11942,105 @@ fbxos.fr freebox-os.fr freeboxos.fr -// Fusion Intranet : https://www.fusion-intranet.com -// Submitted by Matthias Burtscher -myfusion.cloud +// freedesktop.org : https://www.freedesktop.org +// Submitted by Daniel Stone +freedesktop.org + +// freemyip.com : https://freemyip.com +// Submitted by Cadence +freemyip.com + +// FunkFeuer - Verein zur Förderung freier Netze : https://www.funkfeuer.at +// Submitted by Daniel A. Maierhofer +wien.funkfeuer.at // Futureweb OG : http://www.futureweb.at // Submitted by Andreas Schnederle-Wagner *.futurecms.at +*.ex.futurecms.at +*.in.futurecms.at futurehosting.at futuremailing.at *.ex.ortsinfo.at *.kunden.ortsinfo.at *.statics.cloud -// GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains -// Submitted by David Illsley +// GDS : https://www.gov.uk/service-manual/technology/managing-domain-names +// Submitted by Stephen Ford +independent-commission.uk +independent-inquest.uk +independent-inquiry.uk +independent-panel.uk +independent-review.uk +public-inquiry.uk +royal-commission.uk service.gov.uk +// CDDO : https://www.gov.uk/guidance/get-an-api-domain-on-govuk +// Submitted by Jamie Tanna +api.gov.uk + +// Gehirn Inc. : https://www.gehirn.co.jp/ +// Submitted by Kohei YOSHIDA +gehirn.ne.jp +usercontent.jp + +// Gentlent, Inc. : https://www.gentlent.com +// Submitted by Tom Klein +gentapps.com +gentlentapis.com +lab.ms +cdn-edges.net + +// Ghost Foundation : https://ghost.org +// Submitted by Matt Hanley +ghost.io + +// GignoSystemJapan: http://gsj.bz +// Submitted by GignoSystemJapan +gsj.bz + // GitHub, Inc. // Submitted by Patrick Toomey -github.io githubusercontent.com +githubpreview.dev +github.io // GitLab, Inc. // Submitted by Alex Hanselka gitlab.io +// Gitplac.si - https://gitplac.si +// Submitted by Aljaž Starc +gitapp.si +gitpage.si + +// Glitch, Inc : https://glitch.com +// Submitted by Mads Hartmann +glitch.me + +// Global NOG Alliance : https://nogalliance.org/ +// Submitted by Sander Steffann +nog.community + +// Globe Hosting SRL : https://www.globehosting.com/ +// Submitted by Gavin Brown +co.ro +shop.ro + +// GMO Pepabo, Inc. : https://pepabo.com/ +// Submitted by dojineko +lolipop.io + +// GOV.UK Platform as a Service : https://www.cloud.service.gov.uk/ +// Submitted by Tom Whitwell +cloudapps.digital +london.cloudapps.digital + +// GOV.UK Pay : https://www.payments.service.gov.uk/ +// Submitted by Richard Baker +pymnt.uk + // UKHomeOffice : https://www.gov.uk/government/organisations/home-office // Submitted by Jon Shanks homeoffice.gov.uk @@ -11527,7 +12048,6 @@ homeoffice.gov.uk // GlobeHosting, Inc. // Submitted by Zoltan Egresi ro.im -shop.ro // GoIP DNS Services : http://www.goip.de // Submitted by Christian Poulter @@ -11535,8 +12055,24 @@ goip.de // Google, Inc. // Submitted by Eduardo Vela +run.app +a.run.app +web.app *.0emm.com appspot.com +*.r.appspot.com +codespot.com +googleapis.com +googlecode.com +pagespeedmobilizer.com +publishproxy.com +withgoogle.com +withyoutube.com +*.gateway.dev +cloud.goog +translate.goog +*.usercontent.goog +cloudfunctions.net blogspot.ae blogspot.al blogspot.am @@ -11611,23 +12147,45 @@ blogspot.td blogspot.tw blogspot.ug blogspot.vn -cloudfunctions.net -cloud.goog -codespot.com -googleapis.com -googlecode.com -pagespeedmobilizer.com -publishproxy.com -withgoogle.com -withyoutube.com + +// Goupile : https://goupile.fr +// Submitted by Niels Martignene +goupile.fr + +// Group 53, LLC : https://www.group53.com +// Submitted by Tyler Todd +awsmppl.com + +// GünstigBestellen : https://günstigbestellen.de +// Submitted by Furkan Akkoc +günstigbestellen.de +günstigliefern.de + +// Hakaran group: http://hakaran.cz +// Submited by Arseniy Sokolov +fin.ci +free.hr +caa.li +ua.rs +conf.se + +// Handshake : https://handshake.org +// Submitted by Mike Damm +hs.zone +hs.run // Hashbang : https://hashbang.sh hashbang.sh // Hasura : https://hasura.io // Submitted by Shahidh K Muhammed +hasura.app hasura-app.io +// Heilbronn University of Applied Sciences - Faculty Informatics (GitLab Pages): https://www.hs-heilbronn.de +// Submitted by Richard Zowalla +pages.it.hs-heilbronn.de + // Hepforge : https://www.hepforge.org // Submitted by David Grellscheid hepforge.org @@ -11637,14 +12195,83 @@ hepforge.org herokuapp.com herokussl.com +// Hibernating Rhinos +// Submitted by Oren Eini +ravendb.cloud +myravendb.com +ravendb.community +ravendb.me +development.run +ravendb.run + +// home.pl S.A.: https://home.pl +// Submited by Krzysztof Wolski +homesklep.pl + +// Hong Kong Productivity Council: https://www.hkpc.org/ +// Submitted by SECaaS Team +secaas.hk + +// Hoplix : https://www.hoplix.com +// Submitted by Danilo De Franco +hoplix.shop + + +// HOSTBIP REGISTRY : https://www.hostbip.com/ +// Submitted by Atanunu Igbunuroghene +orx.biz +biz.gl +col.ng +firm.ng +gen.ng +ltd.ng +ngo.ng +edu.scot +sch.so +org.yt + +// HostyHosting (hostyhosting.com) +hostyhosting.io + +// Häkkinen.fi +// Submitted by Eero Häkkinen +häkkinen.fi + // Ici la Lune : http://www.icilalune.com/ // Submitted by Simon Morvan +*.moonscale.io moonscale.net // iki.fi // Submitted by Hannu Aronsson iki.fi +// Impertrix Solutions : +// Submitted by Zhixiang Zhao +impertrixcdn.com +impertrix.com + +// Incsub, LLC: https://incsub.com/ +// Submitted by Aaron Edwards +smushcdn.com +wphostedmail.com +wpmucdn.com +tempurl.host +wpmudev.host + +// Individual Network Berlin e.V. : https://www.in-berlin.de/ +// Submitted by Christian Seitz +dyn-berlin.de +in-berlin.de +in-brb.de +in-butter.de +in-dsl.de +in-dsl.net +in-dsl.org +in-vpn.de +in-vpn.net +in-vpn.org + // info.at : http://www.info.at/ biz.at info.at @@ -11687,10 +12314,127 @@ to.leg.br // Submitted by Wolfgang Schwarz pixolino.com +// Internet-Pro, LLP: https://netangels.ru/ +// Submited by Vasiliy Sheredeko +na4u.ru + +// iopsys software solutions AB : https://iopsys.eu/ +// Submitted by Roman Azarenko +iopsys.se + // IPiFony Systems, Inc. : https://www.ipifony.com/ // Submitted by Matthew Hardeman ipifony.net +// IServ GmbH : https://iserv.eu +// Submitted by Kim-Alexander Brodowski +mein-iserv.de +schulserver.de +test-iserv.de +iserv.dev + +// I-O DATA DEVICE, INC. : http://www.iodata.com/ +// Submitted by Yuji Minagawa +iobb.net + +// Jelastic, Inc. : https://jelastic.com/ +// Submited by Ihor Kolodyuk +mel.cloudlets.com.au +cloud.interhostsolutions.be +users.scale.virtualcloud.com.br +mycloud.by +alp1.ae.flow.ch +appengine.flow.ch +es-1.axarnet.cloud +diadem.cloud +vip.jelastic.cloud +jele.cloud +it1.eur.aruba.jenv-aruba.cloud +it1.jenv-aruba.cloud +keliweb.cloud +cs.keliweb.cloud +oxa.cloud +tn.oxa.cloud +uk.oxa.cloud +primetel.cloud +uk.primetel.cloud +ca.reclaim.cloud +uk.reclaim.cloud +us.reclaim.cloud +ch.trendhosting.cloud +de.trendhosting.cloud +jele.club +amscompute.com +clicketcloud.com +dopaas.com +hidora.com +paas.hosted-by-previder.com +rag-cloud.hosteur.com +rag-cloud-ch.hosteur.com +jcloud.ik-server.com +jcloud-ver-jpc.ik-server.com +demo.jelastic.com +kilatiron.com +paas.massivegrid.com +jed.wafaicloud.com +lon.wafaicloud.com +ryd.wafaicloud.com +j.scaleforce.com.cy +jelastic.dogado.eu +fi.cloudplatform.fi +demo.datacenter.fi +paas.datacenter.fi +jele.host +mircloud.host +paas.beebyte.io +sekd1.beebyteapp.io +jele.io +cloud-fr1.unispace.io +jc.neen.it +cloud.jelastic.open.tim.it +jcloud.kz +upaas.kazteleport.kz +cloudjiffy.net +fra1-de.cloudjiffy.net +west1-us.cloudjiffy.net +jls-sto1.elastx.net +jls-sto2.elastx.net +jls-sto3.elastx.net +faststacks.net +fr-1.paas.massivegrid.net +lon-1.paas.massivegrid.net +lon-2.paas.massivegrid.net +ny-1.paas.massivegrid.net +ny-2.paas.massivegrid.net +sg-1.paas.massivegrid.net +jelastic.saveincloud.net +nordeste-idc.saveincloud.net +j.scaleforce.net +jelastic.tsukaeru.net +sdscloud.pl +unicloud.pl +mircloud.ru +jelastic.regruhosting.ru +enscaled.sg +jele.site +jelastic.team +orangecloud.tn +j.layershift.co.uk +phx.enscaled.us +mircloud.us + +// Jino : https://www.jino.ru +// Submitted by Sergey Ulyashin +myjino.ru +*.hosting.myjino.ru +*.landing.myjino.ru +*.spectrum.myjino.ru +*.vps.myjino.ru + +// Jotelulu S.L. : https://jotelulu.com +// Submitted by Daniel Fariña +jotelulu.cloud + // Joyent : https://www.joyent.com/ // Submitted by Brian Bennett *.triton.zone @@ -11700,52 +12444,210 @@ ipifony.net // Submitted by Stefan Keim js.org +// KaasHosting : http://www.kaashosting.nl/ +// Submitted by Wouter Bakker +kaas.gg +khplay.nl + // Keyweb AG : https://www.keyweb.de // Submitted by Martin Dannehl keymachine.de +// KingHost : https://king.host +// Submitted by Felipe Keller Braz +kinghost.net +uni5.net + // KnightPoint Systems, LLC : http://www.knightpoint.com/ // Submitted by Roy Keene knightpoint.systems +// KoobinEvent, SL: https://www.koobin.com +// Submitted by Iván Oliva +koobin.events + +// KUROKU LTD : https://kuroku.ltd/ +// Submitted by DisposaBoy +oya.to + +// Katholieke Universiteit Leuven: https://www.kuleuven.be +// Submitted by Abuse KU Leuven +kuleuven.cloud +ezproxy.kuleuven.be + // .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf co.krd edu.krd +// Krellian Ltd. : https://krellian.com +// Submitted by Ben Francis +krellian.net +webthings.io + // LCube - Professional hosting e.K. : https://www.lcube-webhosting.de // Submitted by Lars Laehn git-repos.de lcube-server.de svn-repos.de +// Leadpages : https://www.leadpages.net +// Submitted by Greg Dallavalle +leadpages.co +lpages.co +lpusercontent.com + +// Lelux.fi : https://lelux.fi/ +// Submitted by Lelux Admin +lelux.site + +// Lifetime Hosting : https://Lifetime.Hosting/ +// Submitted by Mike Fillator +co.business +co.education +co.events +co.financial +co.network +co.place +co.technology + +// Lightmaker Property Manager, Inc. : https://app.lmpm.com/ +// Submitted by Greg Holland +app.lmpm.com + +// linkyard ldt: https://www.linkyard.ch/ +// Submitted by Mario Siegenthaler +linkyard.cloud +linkyard-cloud.ch + +// Linode : https://linode.com +// Submitted by +members.linode.com +*.nodebalancer.linode.com +*.linodeobjects.com +ip.linodeusercontent.com + // LiquidNet Ltd : http://www.liquidnetlimited.com/ // Submitted by Victor Velchev we.bs +// localzone.xyz +// Submitted by Kenny Niehage +localzone.xyz + +// Log'in Line : https://www.loginline.com/ +// Submitted by Rémi Mach +loginline.app +loginline.dev +loginline.io +loginline.services +loginline.site + +// Lokalized : https://lokalized.nl +// Submitted by Noah Taheij +servers.run + +// Lõhmus Family, The +// Submitted by Heiki Lõhmus +lohmus.me + +// LubMAN UMCS Sp. z o.o : https://lubman.pl/ +// Submitted by Ireneusz Maliszewski +krasnik.pl +leczna.pl +lubartow.pl +lublin.pl +poniatowa.pl +swidnik.pl + +// Lug.org.uk : https://lug.org.uk +// Submitted by Jon Spriggs +glug.org.uk +lug.org.uk +lugs.org.uk + // Lukanet Ltd : https://lukanet.com // Submitted by Anton Avramov barsy.bg +barsy.co.uk +barsyonline.co.uk +barsycenter.com barsyonline.com +barsy.club barsy.de barsy.eu barsy.in +barsy.info +barsy.io +barsy.me +barsy.menu +barsy.mobi barsy.net barsy.online +barsy.org +barsy.pro +barsy.pub +barsy.ro +barsy.shop +barsy.site barsy.support +barsy.uk // Magento Commerce // Submitted by Damien Tournoud *.magentosite.cloud +// May First - People Link : https://mayfirst.org/ +// Submitted by Jamie McClelland +mayfirst.info +mayfirst.org + // Mail.Ru Group : https://hb.cldmail.ru // Submitted by Ilya Zaretskiy hb.cldmail.ru +// Mail Transfer Platform : https://www.neupeer.com +// Submitted by Li Hui +cn.vu + +// Maze Play: https://www.mazeplay.com +// Submitted by Adam Humpherys +mazeplay.com + +// mcpe.me : https://mcpe.me +// Submitted by Noa Heyl +mcpe.me + +// McHost : https://mchost.ru +// Submitted by Evgeniy Subbotin +mcdir.me +mcdir.ru +mcpre.ru +vps.mcdir.ru + +// Mediatech : https://mediatech.by +// Submitted by Evgeniy Kozhuhovskiy +mediatech.by +mediatech.dev + +// Medicom Health : https://medicomhealth.com +// Submitted by Michael Olson +hra.health + +// Memset hosting : https://www.memset.com +// Submitted by Tom Whitwell +miniserver.com +memset.net + // MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ // Submitted by Zdeněk Šustr -cloud.metacentrum.cz +*.cloud.metacentrum.cz custom.metacentrum.cz +// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ +// Submitted by Radim Janča +flt.cloud.muni.cz +usr.cloud.muni.cz + // Meteor Development Group : https://www.meteor.com/hosting // Submitted by Pierre Carrier meteorapp.com @@ -11754,11 +12656,34 @@ eu.meteorapp.com // Michau Enterprises Limited : http://www.co.pl/ co.pl -// Microsoft : http://microsoft.com -// Submitted by Barry Dorrans +// Microsoft Corporation : http://microsoft.com +// Submitted by Mitch Webster +*.azurecontainer.io azurewebsites.net azure-mobile.net cloudapp.net +azurestaticapps.net +centralus.azurestaticapps.net +eastasia.azurestaticapps.net +eastus2.azurestaticapps.net +westeurope.azurestaticapps.net +westus2.azurestaticapps.net + +// minion.systems : http://minion.systems +// Submitted by Robert Böttinger +csx.cc + +// Mintere : https://mintere.com/ +// Submitted by Ben Aubin +mintere.site + +// MobileEducation, LLC : https://joinforte.com +// Submitted by Grayson Martin +forte.id + +// Mozilla Corporation : https://mozilla.com +// Submitted by Ben Francis +mozilla-iot.org // Mozilla Foundation : https://mozilla.org/ // Submitted by glob @@ -11770,10 +12695,52 @@ net.ru org.ru pp.ru +// Mythic Beasts : https://www.mythic-beasts.com +// Submitted by Paul Cammish +hostedpi.com +customer.mythic-beasts.com +caracal.mythic-beasts.com +fentiger.mythic-beasts.com +lynx.mythic-beasts.com +ocelot.mythic-beasts.com +oncilla.mythic-beasts.com +onza.mythic-beasts.com +sphinx.mythic-beasts.com +vs.mythic-beasts.com +x.mythic-beasts.com +yali.mythic-beasts.com +cust.retrosnub.co.uk + +// Nabu Casa : https://www.nabucasa.com +// Submitted by Paulus Schoutsen +ui.nabu.casa + +// Names.of.London : https://names.of.london/ +// Submitted by James Stevens or +pony.club +of.fashion +in.london +of.london +from.marketing +with.marketing +for.men +repair.men +and.mom +for.mom +for.one +under.one +for.sale +that.win +from.work +to.work + +// Net at Work Gmbh : https://www.netatwork.de +// Submitted by Jan Jaeschke +cloud.nospamproxy.com + // Netlify : https://www.netlify.com // Submitted by Jessica Parsons -bitballoon.com -netlify.com +netlify.app // Neustar Inc. // Submitted by Trung Tran @@ -11783,10 +12750,56 @@ netlify.com // Submitted by Alan Shreve ngrok.io +// Nimbus Hosting Ltd. : https://www.nimbushosting.co.uk/ +// Submitted by Nicholas Ford +nh-serv.co.uk + // NFSN, Inc. : https://www.NearlyFreeSpeech.NET/ // Submitted by Jeff Wheelhouse nfshost.com +// Noop : https://noop.app +// Submitted by Nathaniel Schweinberg +*.developer.app +noop.app + +// Northflank Ltd. : https://northflank.com/ +// Submitted by Marco Suter +*.northflank.app +*.code.run + +// Noticeable : https://noticeable.io +// Submitted by Laurent Pellegrino +noticeable.news + +// Now-DNS : https://now-dns.com +// Submitted by Steve Russell +dnsking.ch +mypi.co +n4t.co +001www.com +ddnslive.com +myiphost.com +forumz.info +16-b.it +32-b.it +64-b.it +soundcast.me +tcp4.me +dnsup.net +hicam.net +now-dns.net +ownip.net +vpndns.net +dynserv.org +now-dns.org +x443.pw +now-dns.top +ntdll.top +freeddns.us +crafting.xyz +zapto.xyz + // nsupdate.info : https://www.nsupdate.info/ // Submitted by Thomas Waldmann nsupdate.info @@ -11884,78 +12897,85 @@ zapto.org // Submitted by Konstantin Nosov stage.nodeart.io -// Nodum B.V. : https://nodum.io/ -// Submitted by Wietse Wind -nodum.co -nodum.io +// Nucleos Inc. : https://nucleos.com +// Submitted by Piotr Zduniak +pcloud.host // NYC.mn : http://www.information.nyc.mn // Submitted by Matthew Brown nyc.mn -// NymNom : https://nymnom.com/ -// Submitted by Dave McCormack -nom.ae -nom.ai -nom.al -nym.by -nym.bz -nom.cl -nom.gd -nom.gl -nym.gr -nom.gt -nom.hn -nom.im -nym.kz -nym.la -nom.li -nym.li -nym.lt -nym.lu -nym.me -nom.mk -nym.mx -nom.nu -nym.nz -nym.pe -nym.pt -nom.pw -nom.qa -nom.rs -nom.si -nym.sk -nym.su -nym.sx -nym.tw -nom.ug -nom.uy -nom.vc -nom.vg +// Observable, Inc. : https://observablehq.com +// Submitted by Mike Bostock +static.observableusercontent.com // Octopodal Solutions, LLC. : https://ulterius.io/ // Submitted by Andrew Sampson cya.gg +// OMG.LOL : +// Submitted by Adam Newbold +omg.lol + +// Omnibond Systems, LLC. : https://www.omnibond.com +// Submitted by Cole Estep +cloudycluster.net + +// OmniWe Limited: https://omniwe.com +// Submitted by Vicary Archangel +omniwe.site + +// One.com: https://www.one.com/ +// Submitted by Jacob Bunk Nielsen +service.one + // One Fold Media : http://www.onefoldmedia.com/ // Submitted by Eddie Jones nid.io +// Open Social : https://www.getopensocial.com/ +// Submitted by Alexander Varwijk +opensocial.site + // OpenCraft GmbH : http://opencraft.com/ // Submitted by Sven Marnach opencraft.hosting +// OpenResearch GmbH: https://openresearch.com/ +// Submitted by Philipp Schmid +orsites.com + // Opera Software, A.S.A. // Submitted by Yngve Pettersen operaunite.com +// Oursky Limited : https://authgear.com/, https://skygear.io/ +// Submited by Authgear Team , Skygear Developer +authgear-staging.com +authgearapps.com +skygearapp.com + // OutSystems // Submitted by Duarte Santos outsystemscloud.com -// OwnProvider : http://www.ownprovider.com +// OVHcloud: https://ovhcloud.com +// Submitted by Vincent Cassé +*.webpaas.ovh.net +*.hosting.ovh.net + +// OwnProvider GmbH: http://www.ownprovider.com // Submitted by Jan Moennich ownprovider.com +own.pm + +// OwO : https://whats-th.is/ +// Submitted by Dean Sheather +*.owo.codes + +// OX : http://www.ox.rs +// Submitted by Adam Grand +ox.rs // oy.lc // Submitted by Charly Coste @@ -11969,6 +12989,21 @@ pgfog.com // Submitted by Jason Kriss pagefrontapp.com +// PageXL : https://pagexl.com +// Submitted by Yann Guichard +pagexl.com + +// Paywhirl, Inc : https://paywhirl.com/ +// Submitted by Daniel Netzer +*.paywhirl.com + +// pcarrier.ca Software Inc: https://pcarrier.ca/ +// Submitted by Pierre Carrier +bar0.net +bar1.net +bar2.net +rdv.to + // .pl domains (grandfathered) art.pl gliwice.pl @@ -11986,14 +13021,57 @@ gotpantheon.com // Submitted by Steve Leung mypep.link +// Perspecta : https://perspecta.com/ +// Submitted by Kenneth Van Alstyne +perspecta.cloud + +// PE Ulyanov Kirill Sergeevich : https://airy.host +// Submitted by Kirill Ulyanov +lk3.ru + // Planet-Work : https://www.planet-work.com/ // Submitted by Frédéric VANNIÈRE on-web.fr // Platform.sh : https://platform.sh // Submitted by Nikola Kotur -*.platform.sh +bc.platform.sh +ent.platform.sh +eu.platform.sh +us.platform.sh *.platformsh.site +*.tst.site + +// Platter: https://platter.dev +// Submitted by Patrick Flor +platter-app.com +platter-app.dev +platterp.us + +// Plesk : https://www.plesk.com/ +// Submitted by Anton Akhtyamov +pdns.page +plesk.page +pleskns.com + +// Port53 : https://port53.io/ +// Submitted by Maximilian Schieder +dyn53.io + +// Positive Codes Technology Company : http://co.bn/faq.html +// Submitted by Zulfais +co.bn + +// Postman, Inc : https://postman.com +// Submitted by Rahul Dhawan +postman-echo.com +pstmn.io +mock.pstmn.io +httpbin.org + +//prequalifyme.today : https://prequalifyme.today +//Submitted by DeepakTiwari deepak@ivylead.io +prequalifyme.today // prgmr.com : https://prgmr.com/ // Submitted by Sarah Newman @@ -12003,6 +13081,14 @@ xen.prgmr.com // Submitted by registry priv.at +// privacytools.io : https://www.privacytools.io/ +// Submitted by Jonah Aragon +prvcy.page + +// Protocol Labs : https://protocol.ai/ +// Submitted by Michael Burns +*.dweb.link + // Protonet GmbH : http://protonet.io // Submitted by Martin Meier protonet.io @@ -12012,10 +13098,52 @@ protonet.io chirurgiens-dentistes-en-france.fr byen.site +// pubtls.org: https://www.pubtls.org +// Submitted by Kor Nielsen +pubtls.org + +// PythonAnywhere LLP: https://www.pythonanywhere.com +// Submitted by Giles Thomas +pythonanywhere.com +eu.pythonanywhere.com + +// QOTO, Org. +// Submitted by Jeffrey Phillips Freeman +qoto.io + +// Qualifio : https://qualifio.com/ +// Submitted by Xavier De Cock +qualifioapp.com + +// QuickBackend: https://www.quickbackend.com +// Submitted by Dani Biro +qbuser.com + +// Rad Web Hosting: https://radwebhosting.com +// Submitted by Scott Claeys +cloudsite.builders + +// Redgate Software: https://red-gate.com +// Submitted by Andrew Farries +instances.spawn.cc + +// Redstar Consultants : https://www.redstarconsultants.com/ +// Submitted by Jons Slemmer +instantcloud.cn + +// Russian Academy of Sciences +// Submitted by Tech Support +ras.ru + // QA2 // Submitted by Daniel Dent (https://www.danieldent.com/) qa2.com +// QCX +// Submitted by Cassandra Beelen +qcx.io +*.sys.qcx.io + // QNAP System Inc : https://www.qnap.com // Submitted by Nick Chang dev-myqnapcloud.com @@ -12036,10 +13164,40 @@ vaporcloud.io rackmaze.com rackmaze.net +// Rakuten Games, Inc : https://dev.viberplay.io +// Submitted by Joshua Zhang +g.vbrplsbx.io + +// Rancher Labs, Inc : https://rancher.com +// Submitted by Vincent Fiduccia +*.on-k3s.io +*.on-rancher.cloud +*.on-rio.io + +// Read The Docs, Inc : https://www.readthedocs.org +// Submitted by David Fischer +readthedocs.io + // Red Hat, Inc. OpenShift : https://openshift.redhat.com/ // Submitted by Tim Kramer rhcloud.com +// Render : https://render.com +// Submitted by Anurag Goel +app.render.com +onrender.com + +// Repl.it : https://repl.it +// Submitted by Mason Clayton +repl.co +id.repl.co +repl.run + +// Resin.io : https://resin.io +// Submitted by Tim Perry +resindevice.io +devices.resinstaging.io + // RethinkDB : https://www.rethinkdb.com/ // Submitted by Chris Kastorff hzc.io @@ -12047,9 +13205,33 @@ hzc.io // Revitalised Limited : http://www.revitalised.co.uk // Submitted by Jack Price wellbeingzone.eu -ptplus.fit wellbeingzone.co.uk +// Rico Developments Limited : https://adimo.co +// Submitted by Colin Brown +adimo.co.uk + +// Riseup Networks : https://riseup.net +// Submitted by Micah Anderson +itcouldbewor.se + +// Rochester Institute of Technology : http://www.rit.edu/ +// Submitted by Jennifer Herting +git-pages.rit.edu + +// Rusnames Limited: http://rusnames.ru/ +// Submitted by Sergey Zotov +биз.рус +ком.рус +крым.рус +мир.рус +мск.рус +орг.рус +самара.рус +сочи.рус +спб.рус +я.рус + // Sandstorm Development Group, Inc. : https://sandcats.io/ // Submitted by Asheesh Laroia sandcats.io @@ -12059,6 +13241,19 @@ sandcats.io logoip.de logoip.com +// schokokeks.org GbR : https://schokokeks.org/ +// Submitted by Hanno Böck +schokokeks.net + +// Scottish Government: https://www.gov.scot +// Submitted by Martin Ellis +gov.scot +service.gov.scot + +// Scry Security : http://www.scrysec.com +// Submitted by Shante Adam +scrysec.com + // Securepoint GmbH : https://www.securepoint.de // Submitted by Erik Anders firewall-gateway.com @@ -12072,9 +13267,25 @@ my-firewall.org myfirewall.org spdns.org -// SensioLabs, SAS : https://sensiolabs.com/ -// Submitted by Fabien Potencier -*.sensiosite.cloud +// Seidat : https://www.seidat.com +// Submitted by Artem Kondratev +seidat.net + +// Sellfy : https://sellfy.com +// Submitted by Yuriy Romadin +sellfy.store + +// Senseering GmbH : https://www.senseering.de +// Submitted by Felix Mönckemeyer +senseering.net + +// Sendmsg: https://www.sendmsg.co.il +// Submitted by Assaf Stern +minisite.ms + +// Service Magnet : https://myservicemagnet.com +// Submitted by Dave Sanders +magnet.page // Service Online LLC : http://drs.ua/ // Submitted by Serhii Bulakh @@ -12082,6 +13293,11 @@ biz.ua co.ua pp.ua +// Shift Crypto AG : https://shiftcrypto.ch +// Submitted by alex +shiftcrypto.dev +shiftcrypto.io + // ShiftEdit : https://shiftedit.net/ // Submitted by Adam Jimenez shiftedit.io @@ -12090,6 +13306,22 @@ shiftedit.io // Submitted by Alex Bowers myshopblocks.com +// Shopify : https://www.shopify.com +// Submitted by Alex Richter +myshopify.com + +// Shopit : https://www.shopitcommerce.com/ +// Submitted by Craig McMahon +shopitsite.com + +// shopware AG : https://shopware.com +// Submitted by Jens Küper +shopware.store + +// Siemens Mobility GmbH +// Submitted by Oliver Graebner +mo-siemens.io + // SinaAppEngine : http://sae.sina.com.cn/ // Submitted by SinaAppEngine 1kapp.com @@ -12098,18 +13330,61 @@ applinzi.com sinaapp.com vipsinaapp.com +// Siteleaf : https://www.siteleaf.com/ +// Submitted by Skylar Challand +siteleaf.net + // Skyhat : http://www.skyhat.io // Submitted by Shante Adam bounty-full.com alpha.bounty-full.com beta.bounty-full.com +// Small Technology Foundation : https://small-tech.org +// Submitted by Aral Balkan +small-web.org + +// Smoove.io : https://www.smoove.io/ +// Submitted by Dan Kozak +vp4.me + +// Snowplow Analytics : https://snowplowanalytics.com/ +// Submitted by Ian Streeter +try-snowplow.com + +// SourceHut : https://sourcehut.org +// Submitted by Drew DeVault +srht.site + +// Stackhero : https://www.stackhero.io +// Submitted by Adrien Gillon +stackhero-network.com + +// Staclar : https://staclar.com +// Submitted by Matthias Merkel +novecore.site + // staticland : https://static.land // Submitted by Seth Vincent static.land dev.static.land sites.static.land +// Storebase : https://www.storebase.io +// Submitted by Tony Schirmer +storebase.store + +// Strategic System Consulting (eApps Hosting): https://www.eapps.com/ +// Submitted by Alex Oancea +vps-host.net +atl.jelastic.vps-host.net +njs.jelastic.vps-host.net +ric.jelastic.vps-host.net + +// Sony Interactive Entertainment LLC : https://sie.com/ +// Submitted by David Coles +playstation-cloud.com + // SourceLair PC : https://www.sourcelair.com // Submitted by Antonis Kalipetis apps.lair.io @@ -12119,18 +13394,69 @@ apps.lair.io // Submitted by Reza Akhavan spacekit.io -// Stackspace : https://www.stackspace.io/ -// Submitted by Lina He -stackspace.space +// SpeedPartner GmbH: https://www.speedpartner.de/ +// Submitted by Stefan Neufeind +customer.speedpartner.de + +// Spreadshop (sprd.net AG) : https://www.spreadshop.com/ +// Submitted by Martin Breest +myspreadshop.at +myspreadshop.com.au +myspreadshop.be +myspreadshop.ca +myspreadshop.ch +myspreadshop.com +myspreadshop.de +myspreadshop.dk +myspreadshop.es +myspreadshop.fi +myspreadshop.fr +myspreadshop.ie +myspreadshop.it +myspreadshop.net +myspreadshop.nl +myspreadshop.no +myspreadshop.pl +myspreadshop.se +myspreadshop.co.uk + +// Standard Library : https://stdlib.com +// Submitted by Jacob Lee +api.stdlib.com // Storj Labs Inc. : https://storj.io/ // Submitted by Philip Hutchins storj.farm +// Studenten Net Twente : http://www.snt.utwente.nl/ +// Submitted by Silke Hofstra +utwente.io + +// Student-Run Computing Facility : https://www.srcf.net/ +// Submitted by Edwin Balani +soc.srcf.net +user.srcf.net + // Sub 6 Limited: http://www.sub6.com // Submitted by Dan Miller temp-dns.com +// Supabase : https://supabase.io +// Submitted by Inian Parameshwaran +supabase.co +supabase.in +supabase.net +su.paba.se + +// Symfony, SAS : https://symfony.com/ +// Submitted by Fabien Potencier +*.s5y.io +*.sensiosite.cloud + +// Syncloud : https://syncloud.org +// Submitted by Boris Rybalkin +syncloud.it + // Synology, Inc. : https://www.synology.com/ // Submitted by Rony Weng diskstation.me @@ -12147,11 +13473,21 @@ i234.me myds.me synology.me vpnplus.to +direct.quickconnect.to + +// Tabit Technologies Ltd. : https://tabit.cloud/ +// Submitted by Oren Agiv +tabitorder.co.il // TAIFUN Software AG : http://taifun-software.de // Submitted by Bjoern Henke taifun-dns.de +// Tailscale Inc. : https://www.tailscale.com +// Submitted by David Anderson +beta.tailscale.net +ts.net + // TASK geographical domains (www.task.gda.pl/uslugi/dns) gda.pl gdansk.pl @@ -12159,18 +13495,63 @@ gdynia.pl med.pl sopot.pl +// team.blue https://team.blue +// Submitted by Cedric Dubois +site.tb-hosting.com + +// Teckids e.V. : https://www.teckids.org +// Submitted by Dominik George +edugit.io +s3.teckids.org + +// Telebit : https://telebit.cloud +// Submitted by AJ ONeal +telebit.app +telebit.io +*.telebit.xyz + +// The Gwiddle Foundation : https://gwiddlefoundation.org.uk +// Submitted by Joshua Bayfield +gwiddle.co.uk + // Thingdust AG : https://thingdust.com/ // Submitted by Adrian Imboden +*.firenet.ch +*.svc.firenet.ch +reservd.com +thingdustdata.com cust.dev.thingdust.io cust.disrec.thingdust.io cust.prod.thingdust.io cust.testing.thingdust.io +reservd.dev.thingdust.io +reservd.disrec.thingdust.io +reservd.testing.thingdust.io + +// ticket i/O GmbH : https://ticket.io +// Submitted by Christian Franke +tickets.io + +// Tlon.io : https://tlon.io +// Submitted by Mark Staarink +arvo.network +azimuth.network +tlon.network + +// Tor Project, Inc. : https://torproject.org +// Submitted by Antoine Beaupré bloxcms.com townnews-staging.com +// TradableBits: https://tradablebits.com +// Submitted by Dmitry Khrisanov dmitry@tradablebits.com +tbits.me + // TrafficPlex GmbH : https://www.trafficplex.de/ // Submitted by Phillipp Röll 12hp.at @@ -12193,7 +13574,7 @@ lima-city.rocks webspace.rocks lima.zone -// TransIP : htts://www.transip.nl +// TransIP : https://www.transip.nl // Submitted by Rory Breuk *.transurl.be *.transurl.eu @@ -12219,9 +13600,14 @@ syno-ds.de synology-diskstation.de synology-ds.de +// Typeform : https://www.typeform.com +// Submitted by Sergi Ferriz +pro.typeform.com + // Uberspace : https://uberspace.de // Submitted by Moritz Werner uber.space +*.uberspace.de // UDR Limited : http://www.udr.hk.com // Submitted by registry @@ -12230,10 +13616,34 @@ hk.org ltd.hk inc.hk +// United Gameserver GmbH : https://united-gameserver.de +// Submitted by Stefan Schwarz +virtualuser.de +virtual-user.de + +// Upli : https://upli.io +// Submitted by Lenny Bakkalian +upli.io + +// urown.net : https://urown.net +// Submitted by Hostmaster +urown.cloud +dnsupdate.info + // .US // Submitted by Ed Moore lib.de.us +// VeryPositive SIA : http://very.lv +// Submitted by Danko Aleksejevs +2038.io + +// Vercel, Inc : https://vercel.com/ +// Submitted by Connor Davis +vercel.app +vercel.dev +now.sh + // Viprinet Europe GmbH : http://www.viprinet.com // Submitted by Simon Kissel router.management @@ -12242,6 +13652,84 @@ router.management // Submitted by Adnan RIHAN v-info.info +// Voorloper.com: https://voorloper.com +// Submitted by Nathan van Bakel +voorloper.cloud + +// Voxel.sh DNS : https://voxel.sh/dns/ +// Submitted by Mia Rehlinger +neko.am +nyaa.am +be.ax +cat.ax +es.ax +eu.ax +gg.ax +mc.ax +us.ax +xy.ax +nl.ci +xx.gl +app.gp +blog.gt +de.gt +to.gt +be.gy +cc.hn +blog.kg +io.kg +jp.kg +tv.kg +uk.kg +us.kg +de.ls +at.md +de.md +jp.md +to.md +indie.porn +vxl.sh +ch.tc +me.tc +we.tc +nyan.to +at.vg +blog.vu +dev.vu +me.vu + +// V.UA Domain Administrator : https://domain.v.ua/ +// Submitted by Serhii Rostilo +v.ua + +// Vultr Objects : https://www.vultr.com/products/object-storage/ +// Submitted by Niels Maumenee +*.vultrobjects.com + +// Waffle Computer Inc., Ltd. : https://docs.waffleinfo.com +// Submitted by Masayuki Note +wafflecell.com + +// WapBlog.ID : https://www.wapblog.id +// Submitted by Fajar Sodik +idnblogger.com +indowapblog.com +bloger.id +wblog.id +wbq.me +fastblog.net + +// WebHare bv: https://www.webhare.com/ +// Submitted by Arnold Hendriks +*.webhare.dev + +// WebHotelier Technologies Ltd: https://www.webhotelier.net/ +// Submitted by Apostolos Tsakpinis +reserve-online.net +reserve-online.com +bookonline.app +hotelwithflight.com + // WeDeploy by Liferay, Inc. : https://www.wedeploy.com // Submitted by Henrique Vicente wedeploy.io @@ -12252,9 +13740,56 @@ wedeploy.sh // Submitted by Jung Jin remotewd.com +// WIARD Enterprises : https://wiardweb.com +// Submitted by Kidd Hustle +pages.wiardweb.com + // Wikimedia Labs : https://wikitech.wikimedia.org -// Submitted by Yuvi Panda +// Submitted by Arturo Borrero Gonzalez wmflabs.org +toolforge.org +wmcloud.org + +// WISP : https://wisp.gg +// Submitted by Stepan Fedotov +panel.gg +daemon.panel.gg + +// WoltLab GmbH : https://www.woltlab.com +// Submitted by Tim Düsterhus +woltlab-demo.com +myforum.community +community-pro.de +diskussionsbereich.de +community-pro.net +meinforum.net + +// Woods Valldata : https://www.woodsvalldata.co.uk/ +// Submitted by Chris Whittle +affinitylottery.org.uk +raffleentry.org.uk +weeklylottery.org.uk + +// WP Engine : https://wpengine.com/ +// Submitted by Michael Smith +// Submitted by Brandon DuRette +wpenginepowered.com +js.wpenginepowered.com + +// Wix.com, Inc. : https://www.wix.com +// Submitted by Shahar Talmi +wixsite.com +editorx.io + +// XenonCloud GbR: https://xenoncloud.net +// Submitted by Julian Uphoff +half.host + +// XnBay Technology : http://www.xnbay.com/ +// Submitted by XnBay Developer +xnbay.com +u2.xnbay.com +u2-local.xnbay.com // XS4ALL Internet bv : https://www.xs4all.nl/ // Submitted by Daniel Mostertman @@ -12262,6 +13797,16 @@ cistron.nl demon.nl xs4all.space +// Yandex.Cloud LLC: https://cloud.yandex.com +// Submitted by Alexander Lodin +yandexcloud.net +storage.yandexcloud.net +website.yandexcloud.net + +// YesCourse Pty Ltd : https://yescourse.com +// Submitted by Atul Bhouraskar +official.academy + // Yola : https://www.yola.com/ // Submitted by Stefano Rivera yolasite.com @@ -12276,13 +13821,25 @@ ybo.review ybo.science ybo.trade +// Yunohost : https://yunohost.org +// Submitted by Valentin Grimaud +ynh.fr +nohost.me +noho.st + // ZaNiC : http://www.za.net/ // Submitted by registry za.net za.org -// Zeit, Inc. : https://zeit.domains/ -// Submitted by Olli Vanhoja -now.sh +// Zine EOOD : https://zine.bg/ +// Submitted by Martin Angelov +bss.design + +// Zitcom A/S : https://www.zitcom.dk +// Submitted by Emil Stahl +basicserver.io +virtualserver.io +enterprisecloud.nu // ===END PRIVATE DOMAINS=== From c0e175dcca1ee8cd52b25b812958ede7d64b9817 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 18 Feb 2022 10:52:32 +0100 Subject: [PATCH 397/461] Update testing dependencies --- composer.json | 14 +++++++------- phpstan.neon | 8 ++++++++ src/DomainName.php | 1 - src/Rules.php | 8 ++++---- src/TopLevelDomainsTest.php | 6 +++--- 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/composer.json b/composer.json index 72bbf6a6..4804a40d 100644 --- a/composer.json +++ b/composer.json @@ -46,18 +46,18 @@ "ext-json": "*" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.19||~v3.4.0", + "friendsofphp/php-cs-fixer": "^v3.5.0", "guzzlehttp/guzzle": "^7.0", "guzzlehttp/psr7": "^1.6||^2.0", - "phpstan/phpstan": "^0.12.89", - "phpstan/phpstan-phpunit": "^0.12.20", - "phpstan/phpstan-strict-rules": "^0.12.9", - "phpunit/phpunit": "^9.5", - "psalm/plugin-phpunit": "^0.15.0", + "phpstan/phpstan": "^1.4.6.", + "phpstan/phpstan-phpunit": "^1.0.0", + "phpstan/phpstan-strict-rules": "^1.1.0", + "phpunit/phpunit": "^9.5.13", + "psalm/plugin-phpunit": "^0.15.2", "psr/http-factory": "^1.0", "psr/simple-cache": "^1.0", "symfony/cache": "^v5.0", - "vimeo/psalm": "^4.3" + "vimeo/psalm": "^4.20" }, "suggest": { "psr/http-client-implementation": "To use the storage functionnality which depends on PSR-18", diff --git a/phpstan.neon b/phpstan.neon index d4747672..caa678b5 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -4,4 +4,12 @@ includes: - vendor/phpstan/phpstan-phpunit/rules.neon parameters: ignoreErrors: + - message: '#has no value type specified in iterable type array.#' + path: src/Rules.php + - message: '#has parameter \$(properties|rules|list|tmpList) with no value type specified in iterable type array.#' + path: src/Rules.php + - message: "#Cannot access offset '!' on mixed.#" + path: src/Rules.php + - message: '#Variable \$line on left side of \?\? always exists and is not nullable.#' + path: src/Rules.php reportUnmatchedIgnoredErrors: true diff --git a/src/DomainName.php b/src/DomainName.php index 00496c2d..1469d57c 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -101,7 +101,6 @@ public function withLabel(int $key, $label): self; * If $key is non-negative, the removed label will be the label at $key position from the start. * If $key is negative, the removed label will be the label at $key position from the end. * - * @param int ...$keys * * @throws CannotProcessHost If the key is out of bounds */ diff --git a/src/Rules.php b/src/Rules.php index a0e47cde..326cfbe7 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -36,12 +36,12 @@ final class Rules implements PublicSuffixList /** * PSL rules as a multidimensional associative array. * - * @var array> + * @var array{ICANN_DOMAINS: array, PRIVATE_DOMAINS: array} */ private array $rules; /** - * @param array> $rules + * @param array{ICANN_DOMAINS: array, PRIVATE_DOMAINS: array} $rules */ private function __construct(array $rules) { @@ -84,7 +84,7 @@ public static function fromString($content): self /** * Convert the Public Suffix List into an associative, multidimensional array. * - * @return array> + * @return array{ICANN_DOMAINS: array, PRIVATE_DOMAINS: array} */ private static function parse(string $content): array { @@ -165,7 +165,7 @@ private static function addRule(array $list, array $ruleParts): array } /** - * @param array{rules:array>} $properties + * @param array{rules:array{ICANN_DOMAINS: array, PRIVATE_DOMAINS: array}} $properties */ public static function __set_state(array $properties): self { diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 2b9d7301..3a2aff37 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -193,7 +193,7 @@ public function testGetTopLevelDomain($tld): void } /** - * @return iterable + * @return iterable> */ public function validDomainProvider(): iterable { @@ -286,7 +286,7 @@ public function testGetTopLevelDomainWithUnregisteredTLD(): void } /** - * @return iterable + * @return iterable> */ public function validTldProvider(): iterable { @@ -312,7 +312,7 @@ public function __toString(): string } /** - * @return iterable + * @return iterable> */ public function invalidTldProvider(): iterable { From 0cff0a4c2b8f0e804bbb8be8048a7accb73b650e Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 18 Feb 2022 14:12:14 +0100 Subject: [PATCH 398/461] Improve package coding style --- .php-cs-fixer.php | 20 +++++++++++++------ src/DomainTest.php | 3 ++- src/Idna.php | 4 ++-- .../PublicSuffixListPsr16CacheTest.php | 12 ++++++----- src/TopLevelDomainList.php | 4 +--- 5 files changed, 26 insertions(+), 17 deletions(-) diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php index 5560b22f..a70bd078 100644 --- a/.php-cs-fixer.php +++ b/.php-cs-fixer.php @@ -11,21 +11,31 @@ '@PSR2' => true, 'array_syntax' => ['syntax' => 'short'], 'concat_space' => ['spacing' => 'none'], + 'global_namespace_import' => [ + 'import_classes' => true, + 'import_constants' => true, + 'import_functions' => true, + ], + 'list_syntax' => ['syntax' => 'short'], 'new_with_braces' => true, 'no_blank_lines_after_phpdoc' => true, 'no_empty_phpdoc' => true, 'no_empty_comment' => true, 'no_leading_import_slash' => true, - 'no_superfluous_phpdoc_tags' => true, + 'no_superfluous_phpdoc_tags' => [ + 'allow_mixed' => true, + 'remove_inheritdoc' => true, + 'allow_unused_params' => false, + ], 'no_trailing_comma_in_singleline_array' => true, 'no_unused_imports' => true, 'ordered_imports' => ['imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha'], - 'phpdoc_add_missing_param_annotation' => ['only_untyped' => false], + 'phpdoc_add_missing_param_annotation' => ['only_untyped' => true], 'phpdoc_align' => true, 'phpdoc_no_empty_return' => true, 'phpdoc_order' => true, 'phpdoc_scalar' => true, - 'phpdoc_to_comment' => false, + 'phpdoc_to_comment' => true, 'phpdoc_summary' => true, 'psr_autoloading' => true, 'return_type_declaration' => ['space_before' => 'none'], @@ -36,7 +46,5 @@ 'trailing_comma_in_multiline' => true, 'trim_array_spaces' => true, 'whitespace_after_comma_in_array' => true, - 'yoda_style' => true, ]) - ->setFinder($finder) -; + ->setFinder($finder); diff --git a/src/DomainTest.php b/src/DomainTest.php index aece2374..11a84e41 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -5,6 +5,7 @@ namespace Pdp; use PHPUnit\Framework\TestCase; +use stdClass; use TypeError; /** @@ -314,7 +315,7 @@ public function withLabelWorksProvider(): iterable public function testWithLabelFailsWithTypeError(): void { $this->expectException(TypeError::class); - Domain::fromIDNA2008('example.com')->withLabel(1, new \stdClass()); + Domain::fromIDNA2008('example.com')->withLabel(1, new stdClass()); } public function testWithLabelFailsWithInvalidKey(): void diff --git a/src/Idna.php b/src/Idna.php index 3867eb10..47ceddba 100644 --- a/src/Idna.php +++ b/src/Idna.php @@ -99,7 +99,7 @@ public static function toAscii(string $domain, int $options): IdnaInfo self::supportsIdna(); - /** @param-out array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */ + /* @param-out array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */ idn_to_ascii($domain, $options, INTL_IDNA_VARIANT_UTS46, $idnaInfo); /** @var array{result:string, isTransitionalDifferent:bool, errors:int} $idnaInfo */ @@ -124,7 +124,7 @@ public static function toUnicode(string $domain, int $options): IdnaInfo self::supportsIdna(); - /** @param-out array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */ + /* @param-out array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */ idn_to_utf8($domain, $options, INTL_IDNA_VARIANT_UTS46, $idnaInfo); /** @var array{result:string, isTransitionalDifferent:bool, errors:int} $idnaInfo */ diff --git a/src/Storage/PublicSuffixListPsr16CacheTest.php b/src/Storage/PublicSuffixListPsr16CacheTest.php index 3d992b0c..0061c6d2 100644 --- a/src/Storage/PublicSuffixListPsr16CacheTest.php +++ b/src/Storage/PublicSuffixListPsr16CacheTest.php @@ -4,6 +4,8 @@ namespace Pdp\Storage; +use DateInterval; +use DateTimeImmutable; use InvalidArgumentException; use Pdp\Rules; use PHPUnit\Framework\TestCase; @@ -54,7 +56,7 @@ public function testItReturnsNullIfTheCacheContentCannotBeConvertedToTheCorrectI $cache = $this->createStub(CacheInterface::class); $cache->method('get')->willReturn('{"foo":"bar"}'); - $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new \DateTimeImmutable('+1 DAY')); + $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new DateTimeImmutable('+1 DAY')); self::assertNull($pslCache->fetch('http://www.example.com')); } @@ -65,7 +67,7 @@ public function testItCanStoreAPublicSuffixListInstance(): void $cache->method('set')->willReturn(true); $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new DateInterval('P1D')); self::assertTrue($pslCache->remember('http://www.example.com', $psl)); } @@ -76,7 +78,7 @@ public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void $cache->method('set')->willReturn(false); $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new DateInterval('P1D')); self::assertFalse($pslCache->remember('http://www.example.com', $psl)); } @@ -89,7 +91,7 @@ public function testItReturnsFalseIfItCantCacheAPublicSuffixListInstance(): void $cache->method('set')->will(self::throwException($exception)); $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new DateInterval('P1D')); self::assertFalse($pslCache->remember('http://www.example.com', $psl)); } @@ -120,7 +122,7 @@ public function testItCanDeleteTheCachedDatabase(): void $cache = $this->createStub(CacheInterface::class); $cache->method('delete')->willReturn(true); - $instance = new PublicSuffixListPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + $instance = new PublicSuffixListPsr16Cache($cache, 'pdp_', new DateInterval('P1D')); self::assertTrue($instance->forget($uri)); } diff --git a/src/TopLevelDomainList.php b/src/TopLevelDomainList.php index cb1cb5a0..51e9b0fa 100644 --- a/src/TopLevelDomainList.php +++ b/src/TopLevelDomainList.php @@ -24,9 +24,7 @@ public function version(): string; */ public function lastUpdated(): DateTimeImmutable; - /** - * {@inheritdoc} - */ + public function count(): int; /** From bb05800ad9c275ddca179e9a3b00f30cd51dc4fc Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 18 Feb 2022 14:31:29 +0100 Subject: [PATCH 399/461] Update testing suite --- CHANGELOG.md | 2 +- src/RulesTest.php | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13b80827..b427278c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will ### Fixed -- [#321](https://github.com/jeremykendall/php-domain-parser/issues/321) improve resolving private domain suffix +- [#321](https://github.com/jeremykendall/php-domain-parser/issues/321) improve resolving private domain suffix. `Rules::getPrivateDomain` will now throw if the domain name does not contain a "private" TLD. ### Deprecated diff --git a/src/RulesTest.php b/src/RulesTest.php index 5bf1322c..5f8d0be2 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -594,7 +594,7 @@ public function effectiveTLDProvider(): iterable ]; } - public function testIssue321(): void + public function testIssue321Success(): void { $result = self::$rules->resolve('node857-gelofesta.users.scale.virtualcloud.com.br'); self::assertSame('users.scale.virtualcloud.com.br', $result->suffix()->value()); @@ -604,4 +604,11 @@ public function testIssue321(): void self::assertSame('com.br', $result->suffix()->value()); self::assertTrue($result->suffix()->isICANN()); } + + public function testIssue321Failure(): void + { + $this->expectException(UnableToResolveDomain::class); + + self::$rules->getPrivateDomain('clientportal.virtualcloud.com.br'); + } } From d8724b85459b60fcec8bfcc5ecdc93299ef4b496 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 30 May 2022 21:52:40 +0200 Subject: [PATCH 400/461] Drop php7 requirement and update development dependencies --- .github/workflows/build.yaml | 2 +- composer.json | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 08c130ae..3383fc9b 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - php: [ '7.4', '8.0', '8.1' ] + php: ['8.1'] composer-flags: [ '' ] phpunit-flags: [ '--coverage-text' ] steps: diff --git a/composer.json b/composer.json index 4804a40d..056e0d6c 100644 --- a/composer.json +++ b/composer.json @@ -40,24 +40,24 @@ "psl" ], "require": { - "php": "^7.4 || ^8.0", + "php": "^8.1", "ext-filter": "*", "ext-intl": "*", "ext-json": "*" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^v3.5.0", - "guzzlehttp/guzzle": "^7.0", - "guzzlehttp/psr7": "^1.6||^2.0", - "phpstan/phpstan": "^1.4.6.", - "phpstan/phpstan-phpunit": "^1.0.0", - "phpstan/phpstan-strict-rules": "^1.1.0", - "phpunit/phpunit": "^9.5.13", - "psalm/plugin-phpunit": "^0.15.2", + "friendsofphp/php-cs-fixer": "^v3.8.0", + "guzzlehttp/guzzle": "^7.4.3", + "guzzlehttp/psr7": "^1.6 || ^2.2.1", + "phpstan/phpstan": "^1.7.3", + "phpstan/phpstan-phpunit": "^1.1.1", + "phpstan/phpstan-strict-rules": "^1.2.3", + "phpunit/phpunit": "^9.5.20", + "psalm/plugin-phpunit": "^0.16.1", "psr/http-factory": "^1.0", "psr/simple-cache": "^1.0", - "symfony/cache": "^v5.0", - "vimeo/psalm": "^4.20" + "symfony/cache": "^v5.0.0 || ^v6.0.0", + "vimeo/psalm": "^4.23.0" }, "suggest": { "psr/http-client-implementation": "To use the storage functionnality which depends on PSR-18", @@ -75,7 +75,7 @@ "phpcs:fix": "php-cs-fixer fix -vvv --allow-risky=yes --ansi", "phpstan": "phpstan analyse -l max -c phpstan.neon src --memory-limit=256M --ansi", "psalm": "psalm --show-info=true", - "phpunit": "phpunit --coverage-text", + "phpunit": "XDEBUG_MODE=coverage phpunit --coverage-text", "test": [ "@phpunit", "@phpstan", From e9eb903df2229d0e33a01de9e297aef9b7bca0f1 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 18 Jun 2022 10:41:46 +0200 Subject: [PATCH 401/461] Dropping support for PHP7 and PHP8.0 --- .github/workflows/build.yaml | 4 - composer.json | 7 +- src/Domain.php | 86 +++++-------------- src/DomainName.php | 13 ++- src/DomainTest.php | 2 +- src/IdnaInfo.php | 24 ++---- src/IdnaInfoTest.php | 12 +-- src/ResolvedDomain.php | 75 ++++------------ src/ResolvedDomainTest.php | 7 +- src/Rules.php | 57 ++++-------- src/RulesTest.php | 10 +-- src/Storage/PsrStorageFactory.php | 21 ++--- src/Storage/PublicSuffixListPsr16Cache.php | 17 ++-- .../PublicSuffixListPsr16CacheTest.php | 10 --- src/Storage/PublicSuffixListPsr18Client.php | 12 +-- .../PublicSuffixListStorageFactory.php | 3 +- src/Storage/RulesStorage.php | 12 +-- src/Storage/TimeToLive.php | 54 ++++-------- src/Storage/TimeToLiveTest.php | 5 +- src/Storage/TopLevelDomainListPsr16Cache.php | 17 ++-- .../TopLevelDomainListPsr16CacheTest.php | 10 --- src/Storage/TopLevelDomainListPsr18Client.php | 12 +-- .../TopLevelDomainListStorageFactory.php | 3 +- src/Storage/TopLevelDomainsStorage.php | 12 +-- src/Stream.php | 10 ++- src/Suffix.php | 46 +++------- src/SyntaxError.php | 5 +- src/TopLevelDomains.php | 48 +++-------- src/TopLevelDomainsTest.php | 18 +--- 29 files changed, 171 insertions(+), 441 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 3383fc9b..d828ead2 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -23,8 +23,4 @@ jobs: - run: composer update --no-progress ${{ matrix.composer-flags }} - run: composer phpunit - run: composer phpstan - if: ${{ matrix.php == '8.1' }} - - run: composer psalm - if: ${{ matrix.php == '8.1' }} - run: composer phpcs - if: ${{ matrix.php == '8.1' }} diff --git a/composer.json b/composer.json index 056e0d6c..6ca2d681 100644 --- a/composer.json +++ b/composer.json @@ -53,11 +53,9 @@ "phpstan/phpstan-phpunit": "^1.1.1", "phpstan/phpstan-strict-rules": "^1.2.3", "phpunit/phpunit": "^9.5.20", - "psalm/plugin-phpunit": "^0.16.1", "psr/http-factory": "^1.0", "psr/simple-cache": "^1.0", - "symfony/cache": "^v5.0.0 || ^v6.0.0", - "vimeo/psalm": "^4.23.0" + "symfony/cache": "^v5.0.0 || ^v6.0.0" }, "suggest": { "psr/http-client-implementation": "To use the storage functionnality which depends on PSR-18", @@ -74,12 +72,10 @@ "phpcs": "php-cs-fixer fix -vvv --diff --dry-run --allow-risky=yes --ansi", "phpcs:fix": "php-cs-fixer fix -vvv --allow-risky=yes --ansi", "phpstan": "phpstan analyse -l max -c phpstan.neon src --memory-limit=256M --ansi", - "psalm": "psalm --show-info=true", "phpunit": "XDEBUG_MODE=coverage phpunit --coverage-text", "test": [ "@phpunit", "@phpstan", - "@psalm", "@phpcs" ] }, @@ -87,7 +83,6 @@ "phpcs": "Runs coding style test suite", "phpcs:fix": "Fix the package coding style", "phpstan": "Runs complete codebase static analysis", - "psalm": "Runs complete codebase static analysis", "phpunit": "Runs unit and functional testing", "test": "Runs the complete test suite" }, diff --git a/src/Domain.php b/src/Domain.php index f939d6c1..7cea4b26 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -5,7 +5,7 @@ namespace Pdp; use Iterator; -use TypeError; +use Stringable; use function array_count_values; use function array_keys; use function array_reverse; @@ -14,13 +14,9 @@ use function count; use function explode; use function filter_var; -use function gettype; use function implode; use function in_array; -use function is_object; -use function is_scalar; use function ksort; -use function method_exists; use function preg_match; use function rawurldecode; use function strtolower; @@ -44,19 +40,11 @@ final class Domain implements DomainName private const REGEXP_URI_DELIMITERS = '/[:\/?#\[\]@ ]/'; - /** - * @var array - */ + /** @var array */ private array $labels; - private ?string $domain; - private string $type; - - /** - * @param null|mixed $domain - */ - private function __construct(string $type, $domain) + private function __construct(private string $type, DomainNameProvider|Host|Stringable|string|int|null $domain) { $this->type = $type; $this->domain = $this->parseDomain($domain); @@ -71,26 +59,17 @@ public static function __set_state(array $properties): self return new self($properties['type'], $properties['domain']); } - /** - * @param null|mixed $domain - */ - public static function fromIDNA2003($domain): self + public static function fromIDNA2003(DomainNameProvider|Host|Stringable|string|int|null $domain): self { return new self(self::IDNA_2003, $domain); } - /** - * @param null|mixed $domain - */ - public static function fromIDNA2008($domain): self + public static function fromIDNA2008(DomainNameProvider|Host|Stringable|string|int|null $domain): self { return new self(self::IDNA_2008, $domain); } - /** - * @param mixed $domain a domain - */ - private function parseDomain($domain): ?string + private function parseDomain(DomainNameProvider|Host|Stringable|string|int|null $domain): ?string { if ($domain instanceof DomainNameProvider) { $domain = $domain->domain(); @@ -110,25 +89,19 @@ private function parseDomain($domain): ?string * * For example: parse('wWw.uLb.Ac.be') should return ['www.ulb.ac.be', ['be', 'ac', 'ulb', 'www']];. * - * @param mixed $domain a domain - * * @throws SyntaxError If the host is not a domain * @throws SyntaxError If the domain is not a host */ - private function parseValue($domain): ?string + private function parseValue(Stringable|string|int|null $domain): ?string { if (null === $domain) { return null; } - if (is_object($domain) && method_exists($domain, '__toString')) { + if ($domain instanceof Stringable) { $domain = (string) $domain; } - if (!is_scalar($domain)) { - throw new TypeError('The domain must be a string, a stringable object, a Host object or NULL; `'.gettype($domain).'` given.'); - } - $domain = (string) $domain; if ('' === $domain) { return ''; @@ -235,10 +208,6 @@ public function labels(): array return $this->labels; } - /** - * @psalm-suppress MoreSpecificReturnType - * @psalm-suppress LessSpecificReturnStatement - */ public function toAscii(): self { if (null === $this->domain) { @@ -253,10 +222,6 @@ public function toAscii(): self return new self($this->type, $domain); } - /** - * @psalm-suppress MoreSpecificReturnType - * @psalm-suppress LessSpecificReturnStatement - */ public function toUnicode(): self { if (null === $this->domain) { @@ -273,12 +238,8 @@ public function toUnicode(): self /** * Filter a subdomain to update the domain part. - * - * @param string|object|null $domain a domain - * - * @throws TypeError if the domain can not be converted */ - private function normalize($domain): ?string + private function normalize(DomainNameProvider|Host|Stringable|string|null $domain): ?string { if ($domain instanceof DomainNameProvider) { $domain = $domain->domain(); @@ -292,33 +253,32 @@ private function normalize($domain): ?string return $domain; } - if ((!is_string($domain) && !method_exists($domain, '__toString'))) { - throw new TypeError('The label must be a '.Host::class.', a stringable object or a string, `'.gettype($domain).'` given.'); - } - $domain = (string) $domain; - if (null === $this->domain) { - return $domain; - } - - if (!$this->isAscii()) { - return $this->domainToUnicode($domain); - } - return $this->domainToAscii($domain); + return match (true) { + null === $this->domain => $domain, + $this->isAscii() => $this->domainToAscii($domain), + default => $this->domainToUnicode($domain), + }; } - public function prepend($label): self + /** + * @throws CannotProcessHost + */ + public function prepend(DomainNameProvider|Host|string|Stringable|null $label): self { return $this->withLabel(count($this->labels), $label); } - public function append($label): self + /** + * @throws CannotProcessHost + */ + public function append(DomainNameProvider|Host|string|Stringable|null $label): self { return $this->withLabel(- count($this->labels) - 1, $label); } - public function withLabel(int $key, $label): self + public function withLabel(int $key, DomainNameProvider|Host|string|Stringable|null $label): self { $nbLabels = count($this->labels); if ($key < - $nbLabels - 1 || $key > $nbLabels) { diff --git a/src/DomainName.php b/src/DomainName.php index 1469d57c..fc407c32 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -6,6 +6,7 @@ use Iterator; use IteratorAggregate; +use Stringable; /** * @see https://tools.ietf.org/html/rfc1034#section-3.5 @@ -62,19 +63,15 @@ public function getIterator(): Iterator; * Prepends a label to the domain. * * @see ::withLabel - * - * @param string|null|object $label a domain label */ - public function prepend($label): self; + public function prepend(DomainNameProvider|Host|string|Stringable|null $label): self; /** * Appends a label to the domain. * * @see ::withLabel - * - * @param string|null|object $label a domain label */ - public function append($label): self; + public function append(DomainNameProvider|Host|string|Stringable|null $label): self; /** * Returns an instance with the specified label added at the specified key. @@ -85,12 +82,12 @@ public function append($label): self; * If $key is non-negative, the added label will be the label at $key position from the start. * If $key is negative, the added label will be the label at $key position from the end. * - * @param string|null|object $label a domain label + * @param string|null|Stringable|Host|DomainNameProvider $label a domain label * * @throws CannotProcessHost If the key is out of bounds * @throws CannotProcessHost If the label is converted to the NULL value */ - public function withLabel(int $key, $label): self; + public function withLabel(int $key, DomainNameProvider|Host|string|Stringable|null $label): self; /** * Returns an instance with the label at the specified key removed. diff --git a/src/DomainTest.php b/src/DomainTest.php index 11a84e41..445d3071 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -315,7 +315,7 @@ public function withLabelWorksProvider(): iterable public function testWithLabelFailsWithTypeError(): void { $this->expectException(TypeError::class); - Domain::fromIDNA2008('example.com')->withLabel(1, new stdClass()); + Domain::fromIDNA2008('example.com')->withLabel(1, new stdClass()); /* @phpstan-ignore-line */ } public function testWithLabelFailsWithInvalidKey(): void diff --git a/src/IdnaInfo.php b/src/IdnaInfo.php index e35bc159..5724c6f8 100644 --- a/src/IdnaInfo.php +++ b/src/IdnaInfo.php @@ -31,22 +31,14 @@ final class IdnaInfo Idna::ERROR_CONTEXTO_PUNCTUATION => 'a label does not meet the IDNA CONTEXTO requirements for punctuation characters. Some punctuation characters "Would otherwise have been DISALLOWED" but are allowed in certain contexts', ]; - private string $result; - - private bool $isTransitionalDifferent; - - private int $errors; - - /** - * @var array - */ - private array $errorList; - - private function __construct(string $result, bool $isTransitionalDifferent, int $errors) - { - $this->result = $result; - $this->errors = $errors; - $this->isTransitionalDifferent = $isTransitionalDifferent; + /** @var array */ + public readonly array $errorList; + + private function __construct( + public readonly string $result, + public readonly bool $isTransitionalDifferent, + public readonly int $errors + ) { $this->errorList = array_filter( self::ERRORS, fn (int $error): bool => 0 !== ($error & $this->errors), diff --git a/src/IdnaInfoTest.php b/src/IdnaInfoTest.php index 8dd39356..cd2fcded 100644 --- a/src/IdnaInfoTest.php +++ b/src/IdnaInfoTest.php @@ -24,11 +24,11 @@ public function testItCanBeInstantiatedFromArray(): void $infos = ['result' => '', 'isTransitionalDifferent' => false, 'errors' => 0]; $result = IdnaInfo::fromIntl($infos); - self::assertSame('', $result->result()); - self::assertFalse($result->isTransitionalDifferent()); - self::assertSame(0, $result->errors()); + self::assertSame('', $result->result); + self::assertFalse($result->isTransitionalDifferent); + self::assertSame(0, $result->errors); self::assertNull($result->error(Idna::ERROR_BIDI)); - self::assertCount(0, $result->errorList()); + self::assertCount(0, $result->errorList); } public function testInvalidSyntaxAfterIDNConversion(): void @@ -38,9 +38,9 @@ public function testInvalidSyntaxAfterIDNConversion(): void } catch (SyntaxError $exception) { $result = $exception->idnaInfo(); self::assertInstanceOf(IdnaInfo::class, $result); - self::assertSame(Idna::ERROR_DISALLOWED, $result->errors()); + self::assertSame(Idna::ERROR_DISALLOWED, $result->errors); self::assertIsString($result->error(Idna::ERROR_DISALLOWED)); - self::assertCount(1, $result->errorList()); + self::assertCount(1, $result->errorList); } } } diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 06eca8d7..95ce4d51 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -4,62 +4,44 @@ namespace Pdp; +use Stringable; use function count; final class ResolvedDomain implements ResolvedDomainName { - private DomainName $domain; - - private EffectiveTopLevelDomain $suffix; - private DomainName $secondLevelDomain; - private DomainName $registrableDomain; - private DomainName $subDomain; - private function __construct(DomainName $domain, EffectiveTopLevelDomain $suffix) - { - $this->domain = $domain; - $this->suffix = $suffix; - + private function __construct( + private DomainName $domain, + private EffectiveTopLevelDomain $suffix + ) { $this->validateState(); } - /** - * @param mixed $domain the domain to be resolved - */ - public static function fromICANN($domain, int $suffixLength): self + public static function fromICANN(int|DomainNameProvider|Host|string|Stringable|null $domain, int $suffixLength): self { $domain = self::setDomainName($domain); return new self($domain, Suffix::fromICANN($domain->slice(0, $suffixLength))); } - /** - * @param mixed $domain the domain to be resolved - */ - public static function fromPrivate($domain, int $suffixLength): self + public static function fromPrivate(int|DomainNameProvider|Host|string|Stringable|null $domain, int $suffixLength): self { $domain = self::setDomainName($domain); return new self($domain, Suffix::fromPrivate($domain->slice(0, $suffixLength))); } - /** - * @param mixed $domain the domain to be resolved - */ - public static function fromIANA($domain): self + public static function fromIANA(int|DomainNameProvider|Host|string|Stringable|null $domain): self { $domain = self::setDomainName($domain); return new self($domain, Suffix::fromIANA($domain->label(0))); } - /** - * @param mixed $domain the domain to be resolved - */ - public static function fromUnknown($domain, int $suffixLength = 0): self + public static function fromUnknown(int|DomainNameProvider|Host|string|Stringable|null $domain, int $suffixLength = 0): self { $domain = self::setDomainName($domain); @@ -74,20 +56,13 @@ public static function __set_state(array $properties): self return new self($properties['domain'], $properties['suffix']); } - /** - * @param mixed $domain The domain to be resolved - */ - private static function setDomainName($domain): DomainName + private static function setDomainName(int|DomainNameProvider|Host|string|Stringable|null $domain): DomainName { - if ($domain instanceof DomainNameProvider) { - return $domain->domain(); - } - - if ($domain instanceof DomainName) { - return $domain; - } - - return Domain::fromIDNA2008($domain); + return match (true) { + $domain instanceof DomainNameProvider => $domain->domain(), + $domain instanceof DomainName => $domain, + default => Domain::fromIDNA2008($domain), + }; } /** @@ -165,28 +140,17 @@ public function suffix(): EffectiveTopLevelDomain return $this->suffix; } - /** - * @psalm-suppress MoreSpecificReturnType - * @psalm-suppress LessSpecificReturnStatement - */ public function toAscii(): self { return new self($this->domain->toAscii(), $this->suffix->toAscii()); } - /** - * @psalm-suppress MoreSpecificReturnType - * @psalm-suppress LessSpecificReturnStatement - */ public function toUnicode(): self { return new self($this->domain->toUnicode(), $this->suffix->toUnicode()); } - /** - * @param mixed $suffix the suffix - */ - public function withSuffix($suffix): self + public function withSuffix(int|DomainNameProvider|Host|string|Stringable|null $suffix): self { if (!$suffix instanceof EffectiveTopLevelDomain) { $suffix = Suffix::fromUnknown($suffix); @@ -198,10 +162,7 @@ public function withSuffix($suffix): self ); } - /** - * @param mixed $subDomain the sub domain - */ - public function withSubDomain($subDomain): self + public function withSubDomain(int|DomainNameProvider|Host|string|Stringable|null $subDomain): self { if (null === $this->suffix->value()) { throw UnableToResolveDomain::dueToMissingRegistrableDomain($this->domain); @@ -216,7 +177,7 @@ public function withSubDomain($subDomain): self } /** - * @param mixed $label the second level domain + * @param int|DomainNameProvider|Host|string|Stringable|null $label the second level domain */ public function withSecondLevelDomain($label): self { diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 5a120fd3..4e6be530 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -332,18 +332,15 @@ public function testItCanThrowsDuringSubDomainChangesIfTheSubDomainIsNotStringab { $this->expectException(TypeError::class); - ResolvedDomain::fromICANN('www.example.com', 1)->withSubDomain(date_create()); + ResolvedDomain::fromICANN('www.example.com', 1)->withSubDomain(date_create()); /* @phpstan-ignore-line */ } /** * @dataProvider withPublicSuffixWorksProvider - * - * @param mixed $publicSuffix the public suffix - * @param ?string $expected */ public function testItCanChangeItsSuffix( ResolvedDomain $domain, - $publicSuffix, + EffectiveTopLevelDomain|string|null $publicSuffix, ?string $expected, bool $isKnown, bool $isICANN, diff --git a/src/Rules.php b/src/Rules.php index 326cfbe7..60072442 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -5,13 +5,9 @@ namespace Pdp; use SplTempFileObject; -use TypeError; +use Stringable; use function array_pop; use function explode; -use function gettype; -use function is_object; -use function is_string; -use function method_exists; use function preg_match; use function strpos; use function substr; @@ -33,19 +29,11 @@ final class Rules implements PublicSuffixList ], ]; - /** - * PSL rules as a multidimensional associative array. - * - * @var array{ICANN_DOMAINS: array, PRIVATE_DOMAINS: array} - */ - private array $rules; - /** * @param array{ICANN_DOMAINS: array, PRIVATE_DOMAINS: array} $rules */ - private function __construct(array $rules) + private function __construct(private array $rules) { - $this->rules = $rules; } /** @@ -64,21 +52,11 @@ public static function fromPath(string $path, $context = null): self /** * Returns a new instance from a string. * - * @param object|string $content a string or an object which exposes the __toString method - * * @throws UnableToLoadPublicSuffixList If the rules contains in the resource are invalid */ - public static function fromString($content): self + public static function fromString(Stringable|string $content): self { - if (is_object($content) && method_exists($content, '__toString')) { - $content = (string) $content; - } - - if (!is_string($content)) { - throw new TypeError('The content to be converted should be a string or a Stringable object, `'.gettype($content).'` given.'); - } - - return new self(self::parse($content)); + return new self(self::parse((string) $content)); } /** @@ -149,7 +127,7 @@ private static function addRule(array $list, array $ruleParts): array } $isDomain = true; - if (0 === strpos($rule, '!')) { + if (str_starts_with($rule, '!')) { $rule = substr($rule, 1); $isDomain = false; } @@ -173,7 +151,7 @@ public static function __set_state(array $properties): self } /** - * @param mixed $host a type that supports instantiating a Domain from. + * @param int|DomainNameProvider|Host|string|Stringable|null $host a type that supports instantiating a Domain from. */ public function resolve($host): ResolvedDomainName { @@ -187,25 +165,22 @@ public function resolve($host): ResolvedDomainName } /** - * @param mixed $host the domain value + * @param int|DomainNameProvider|Host|string|Stringable|null $host the domain value */ public function getCookieDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); [$suffixLength, $section] = $this->resolveSuffix($domain, ''); - if (self::ICANN_DOMAINS === $section) { - return ResolvedDomain::fromICANN($domain, $suffixLength); - } - if (self::PRIVATE_DOMAINS === $section) { - return ResolvedDomain::fromPrivate($domain, $suffixLength); - } - - return ResolvedDomain::fromUnknown($domain, $suffixLength); + return match (true) { + self::ICANN_DOMAINS === $section => ResolvedDomain::fromICANN($domain, $suffixLength), + self::PRIVATE_DOMAINS === $section => ResolvedDomain::fromPrivate($domain, $suffixLength), + default => ResolvedDomain::fromUnknown($domain, $suffixLength), + }; } /** - * @param mixed $host a type that supports instantiating a Domain from. + * @param int|DomainNameProvider|Host|string|Stringable|null $host a type that supports instantiating a Domain from. */ public function getICANNDomain($host): ResolvedDomainName { @@ -219,7 +194,7 @@ public function getICANNDomain($host): ResolvedDomainName } /** - * @param mixed $host a type that supports instantiating a Domain from. + * @param int|DomainNameProvider|Host|string|Stringable|null $host a type that supports instantiating a Domain from. */ public function getPrivateDomain($host): ResolvedDomainName { @@ -235,12 +210,10 @@ public function getPrivateDomain($host): ResolvedDomainName /** * Assert the domain is valid and is resolvable. * - * @param mixed $domain a type that supports instantiating a Domain from. - * * @throws SyntaxError If the domain is invalid * @throws UnableToResolveDomain If the domain can not be resolved */ - private function validateDomain($domain): DomainName + private function validateDomain(int|DomainNameProvider|Host|string|Stringable|null $domain): DomainName { if ($domain instanceof DomainNameProvider) { $domain = $domain->domain(); diff --git a/src/RulesTest.php b/src/RulesTest.php index 5f8d0be2..5d36c328 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -4,7 +4,6 @@ namespace Pdp; -use DateTimeImmutable; use PHPUnit\Framework\TestCase; use TypeError; use function array_fill; @@ -54,13 +53,6 @@ public function testCreateFromPathThrowsExceptionIfTheContentIsInvalid(): void Rules::fromPath(dirname(__DIR__).'/test_data/invalid_suffix_list_content.dat'); } - public function testFromStringThrowsOnTypeError(): void - { - $this->expectException(TypeError::class); - - Rules::fromString(new DateTimeImmutable()); - } - public function testDomainInternalPhpMethod(): void { /** @var Rules $generateRules */ @@ -80,7 +72,7 @@ public function testThrowsTypeErrorOnWrongInput(): void { $this->expectException(TypeError::class); - self::$rules->resolve(date_create()); + self::$rules->resolve(date_create()); /* @phpstan-ignore-line */ } public function testIsSuffixValidFalse(): void diff --git a/src/Storage/PsrStorageFactory.php b/src/Storage/PsrStorageFactory.php index 365e811d..86406248 100644 --- a/src/Storage/PsrStorageFactory.php +++ b/src/Storage/PsrStorageFactory.php @@ -10,27 +10,22 @@ use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestFactoryInterface; use Psr\SimpleCache\CacheInterface; +use Stringable; final class PsrStorageFactory implements ResourceUri, PublicSuffixListStorageFactory, TopLevelDomainListStorageFactory { - private CacheInterface $cache; - - private ClientInterface $client; - - private RequestFactoryInterface $requestFactory; - - public function __construct(CacheInterface $cache, ClientInterface $client, RequestFactoryInterface $requestFactory) - { - $this->cache = $cache; - $this->client = $client; - $this->requestFactory = $requestFactory; + public function __construct( + private CacheInterface $cache, + private ClientInterface $client, + private RequestFactoryInterface $requestFactory + ) { } /** - * @param DateInterval|DateTimeInterface|object|int|string|null $cacheTtl storage TTL object should implement the __toString method + * @param DateInterval|DateTimeInterface|Stringable|int|string|null $cacheTtl */ public function createPublicSuffixListStorage(string $cachePrefix = '', $cacheTtl = null): PublicSuffixListStorage { @@ -41,7 +36,7 @@ public function createPublicSuffixListStorage(string $cachePrefix = '', $cacheTt } /** - * @param DateInterval|DateTimeInterface|object|int|string|null $cacheTtl storage TTL object should implement the __toString method + * @param DateInterval|DateTimeInterface|Stringable|int|string|null $cacheTtl */ public function createTopLevelDomainListStorage(string $cachePrefix = '', $cacheTtl = null): TopLevelDomainListStorage { diff --git a/src/Storage/PublicSuffixListPsr16Cache.php b/src/Storage/PublicSuffixListPsr16Cache.php index a49445fc..3070afda 100644 --- a/src/Storage/PublicSuffixListPsr16Cache.php +++ b/src/Storage/PublicSuffixListPsr16Cache.php @@ -9,25 +9,20 @@ use Pdp\PublicSuffixList; use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; +use Stringable; use Throwable; use function md5; use function strtolower; final class PublicSuffixListPsr16Cache implements PublicSuffixListCache { - private CacheInterface $cache; - - private string $cachePrefix; - private ?DateInterval $cacheTtl; - /** - * @param DateInterval|DateTimeInterface|object|int|string|null $cacheTtl storage TTL object should implement the __toString method - */ - public function __construct(CacheInterface $cache, string $cachePrefix = '', $cacheTtl = null) - { - $this->cache = $cache; - $this->cachePrefix = $cachePrefix; + public function __construct( + private CacheInterface $cache, + private string $cachePrefix = '', + DateInterval|DateTimeInterface|Stringable|int|string|null $cacheTtl = null + ) { $this->cacheTtl = TimeToLive::convert($cacheTtl); } diff --git a/src/Storage/PublicSuffixListPsr16CacheTest.php b/src/Storage/PublicSuffixListPsr16CacheTest.php index 0061c6d2..57212a74 100644 --- a/src/Storage/PublicSuffixListPsr16CacheTest.php +++ b/src/Storage/PublicSuffixListPsr16CacheTest.php @@ -12,8 +12,6 @@ use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; use RuntimeException; -use stdClass; -use TypeError; use function dirname; /** @@ -133,12 +131,4 @@ public function testItWillThrowIfTheTTLIsNotParsable(): void $cache = $this->createStub(CacheInterface::class); new PublicSuffixListPsr16Cache($cache, 'pdp_', 'foobar'); } - - public function testItWillThrowIfTheTTLIsInvalid(): void - { - $this->expectException(TypeError::class); - - $cache = $this->createStub(CacheInterface::class); - new PublicSuffixListPsr16Cache($cache, 'pdp_', new stdClass()); - } } diff --git a/src/Storage/PublicSuffixListPsr18Client.php b/src/Storage/PublicSuffixListPsr18Client.php index 165254b0..3cad6212 100644 --- a/src/Storage/PublicSuffixListPsr18Client.php +++ b/src/Storage/PublicSuffixListPsr18Client.php @@ -13,14 +13,10 @@ final class PublicSuffixListPsr18Client implements PublicSuffixListClient { - private ClientInterface $client; - - private RequestFactoryInterface $requestFactory; - - public function __construct(ClientInterface $client, RequestFactoryInterface $requestFactory) - { - $this->client = $client; - $this->requestFactory = $requestFactory; + public function __construct( + private ClientInterface $client, + private RequestFactoryInterface $requestFactory + ) { } public function get(string $uri): PublicSuffixList diff --git a/src/Storage/PublicSuffixListStorageFactory.php b/src/Storage/PublicSuffixListStorageFactory.php index 0bebfe0c..c3b29dfc 100644 --- a/src/Storage/PublicSuffixListStorageFactory.php +++ b/src/Storage/PublicSuffixListStorageFactory.php @@ -6,11 +6,12 @@ use DateInterval; use DateTimeInterface; +use Stringable; interface PublicSuffixListStorageFactory { /** - * @param DateInterval|DateTimeInterface|object|int|string|null $cacheTtl storage TTL object should implement the __toString method + * @param DateInterval|DateTimeInterface|Stringable|int|string|null $cacheTtl storage TTL object should implement the __toString method */ public function createPublicSuffixListStorage(string $cachePrefix = '', $cacheTtl = null): PublicSuffixListStorage; } diff --git a/src/Storage/RulesStorage.php b/src/Storage/RulesStorage.php index 73b4a2f0..2a20b9ea 100644 --- a/src/Storage/RulesStorage.php +++ b/src/Storage/RulesStorage.php @@ -8,14 +8,10 @@ final class RulesStorage implements PublicSuffixListStorage { - private PublicSuffixListCache $cache; - - private PublicSuffixListClient $client; - - public function __construct(PublicSuffixListCache $cache, PublicSuffixListClient $client) - { - $this->cache = $cache; - $this->client = $client; + public function __construct( + private PublicSuffixListCache $cache, + private PublicSuffixListClient $client + ) { } public function get(string $uri): PublicSuffixList diff --git a/src/Storage/TimeToLive.php b/src/Storage/TimeToLive.php index d4155fe7..5d24cf2a 100644 --- a/src/Storage/TimeToLive.php +++ b/src/Storage/TimeToLive.php @@ -8,10 +8,8 @@ use DateTimeImmutable; use DateTimeInterface; use InvalidArgumentException; -use TypeError; +use Stringable; use function filter_var; -use function is_object; -use function method_exists; use const FILTER_VALIDATE_INT; /** @@ -21,9 +19,10 @@ final class TimeToLive { public static function fromDurationString(string $duration): DateInterval { - /** @var DateInterval|false $interval */ - $interval = @DateInterval::createFromDateString($duration); - if (!$interval instanceof DateInterval) { + set_error_handler(fn () => true); + $interval = DateInterval::createFromDateString($duration); + restore_error_handler(); + if (!$interval instanceof DateInterval) { /* @phpstan-ignore-line */ throw new InvalidArgumentException( 'The ttl value "'.$duration.'" can not be parsable by `DateInterval::createFromDateString`.' ); @@ -60,54 +59,31 @@ public static function fromDateTimeInterface(DateTimeInterface $date): DateInter * @see TimeToLive::fromDurationString * @codeCoverageIgnore * - * @param object|int|string $duration storage TTL object should implement the __toString method - * * @throws InvalidArgumentException if the value can not be parsable * */ - public static function fromScalar($duration): DateInterval + public static function fromScalar(Stringable|int|string $duration): DateInterval { - if (is_object($duration) && method_exists($duration, '__toString')) { - $duration = (string) $duration; - } - - if (!is_scalar($duration)) { - throw new TypeError('The duration type is unsupported or is an non stringable object.'); - } - return self::fromDurationString((string) $duration); } /** * Convert the input data into a DateInterval object or null. * - * @param DateInterval|DateTimeInterface|object|int|string|null $ttl the object should implement the __toString method - * * @throws InvalidArgumentException if the value can not be computed - * @throws TypeError if the value type is not recognized */ - public static function convert($ttl): ?DateInterval + public static function convert(DateInterval|DateTimeInterface|Stringable|int|string|null $ttl): ?DateInterval { - if ($ttl instanceof DateInterval || null === $ttl) { - return $ttl; - } - - if ($ttl instanceof DateTimeInterface) { - return self::until($ttl); - } - - if (is_object($ttl) && method_exists($ttl, '__toString')) { + if ($ttl instanceof Stringable) { $ttl = (string) $ttl; } - if (false !== ($seconds = filter_var($ttl, FILTER_VALIDATE_INT))) { - return self::fromDurationString($seconds.' seconds'); - } - - if (!is_string($ttl)) { - throw new TypeError('The duration type is unsupported or is an non stringable object.'); - } - - return self::fromDurationString($ttl); + return match (true) { + $ttl instanceof DateInterval || null === $ttl => $ttl, + $ttl instanceof DateTimeInterface => self::until($ttl), + is_int($ttl) => self::fromDurationString($ttl.' seconds'), + false !== ($seconds = filter_var($ttl, FILTER_VALIDATE_INT)) => self::fromDurationString($seconds.' seconds'), + default => self::fromDurationString($ttl), + }; } } diff --git a/src/Storage/TimeToLiveTest.php b/src/Storage/TimeToLiveTest.php index febb0fde..f5c6cbba 100644 --- a/src/Storage/TimeToLiveTest.php +++ b/src/Storage/TimeToLiveTest.php @@ -8,6 +8,7 @@ use DateTimeImmutable; use DateTimeZone; use PHPUnit\Framework\TestCase; +use Stringable; final class TimeToLiveTest extends TestCase { @@ -47,8 +48,8 @@ public function validDurationString(): iterable } /** - * @param int|string|object|null|DateInterval $input - * @param ?DateInterval $expected + * @param int|string|Stringable|null|DateInterval $input + * @param ?DateInterval $expected * @dataProvider validDurationInt */ public function testItCanBeInstantiatedFromSeconds($input, ?DateInterval $expected): void diff --git a/src/Storage/TopLevelDomainListPsr16Cache.php b/src/Storage/TopLevelDomainListPsr16Cache.php index e0838fac..0e3541a5 100644 --- a/src/Storage/TopLevelDomainListPsr16Cache.php +++ b/src/Storage/TopLevelDomainListPsr16Cache.php @@ -9,25 +9,20 @@ use Pdp\TopLevelDomainList; use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; +use Stringable; use Throwable; use function md5; use function strtolower; final class TopLevelDomainListPsr16Cache implements TopLevelDomainListCache { - private CacheInterface $cache; - - private string $cachePrefix; - private ?DateInterval $cacheTtl; - /** - * @param DateInterval|DateTimeInterface|object|int|string|null $cacheTtl storage TTL object should implement the __toString method - */ - public function __construct(CacheInterface $cache, string $cachePrefix = '', $cacheTtl = null) - { - $this->cache = $cache; - $this->cachePrefix = $cachePrefix; + public function __construct( + private CacheInterface $cache, + private string $cachePrefix = '', + DateInterval|DateTimeInterface|Stringable|int|string|null $cacheTtl = null + ) { $this->cacheTtl = TimeToLive::convert($cacheTtl); } diff --git a/src/Storage/TopLevelDomainListPsr16CacheTest.php b/src/Storage/TopLevelDomainListPsr16CacheTest.php index 0590873e..58af4922 100644 --- a/src/Storage/TopLevelDomainListPsr16CacheTest.php +++ b/src/Storage/TopLevelDomainListPsr16CacheTest.php @@ -12,8 +12,6 @@ use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; use RuntimeException; -use stdClass; -use TypeError; use function dirname; /** @@ -130,12 +128,4 @@ public function testItWillThrowIfTheTTLIsNotParsable(): void $cache = $this->createStub(CacheInterface::class); new TopLevelDomainListPsr16Cache($cache, 'pdp_', 'foobar'); } - - public function testItWillThrowIfTheTTLIsInvalid(): void - { - $this->expectException(TypeError::class); - - $cache = $this->createStub(CacheInterface::class); - new TopLevelDomainListPsr16Cache($cache, 'pdp_', new stdClass()); - } } diff --git a/src/Storage/TopLevelDomainListPsr18Client.php b/src/Storage/TopLevelDomainListPsr18Client.php index be288a63..8ef0d0e6 100644 --- a/src/Storage/TopLevelDomainListPsr18Client.php +++ b/src/Storage/TopLevelDomainListPsr18Client.php @@ -13,14 +13,10 @@ final class TopLevelDomainListPsr18Client implements TopLevelDomainListClient { - private ClientInterface $client; - - private RequestFactoryInterface $requestFactory; - - public function __construct(ClientInterface $client, RequestFactoryInterface $requestFactory) - { - $this->client = $client; - $this->requestFactory = $requestFactory; + public function __construct( + private ClientInterface $client, + private RequestFactoryInterface $requestFactory + ) { } public function get(string $uri): TopLevelDomainList diff --git a/src/Storage/TopLevelDomainListStorageFactory.php b/src/Storage/TopLevelDomainListStorageFactory.php index e66fba78..5c25ca1f 100644 --- a/src/Storage/TopLevelDomainListStorageFactory.php +++ b/src/Storage/TopLevelDomainListStorageFactory.php @@ -7,11 +7,12 @@ use DateInterval; use DateTimeInterface; +use Stringable; interface TopLevelDomainListStorageFactory { /** - * @param DateInterval|DateTimeInterface|object|int|string|null $cacheTtl storage TTL object should implement the __toString method + * @param DateInterval|DateTimeInterface|Stringable|int|string|null $cacheTtl storage TTL object should implement the __toString method */ public function createTopLevelDomainListStorage(string $cachePrefix = '', $cacheTtl = null): TopLevelDomainListStorage; } diff --git a/src/Storage/TopLevelDomainsStorage.php b/src/Storage/TopLevelDomainsStorage.php index d0d70c4e..9e1141ed 100644 --- a/src/Storage/TopLevelDomainsStorage.php +++ b/src/Storage/TopLevelDomainsStorage.php @@ -8,14 +8,10 @@ final class TopLevelDomainsStorage implements TopLevelDomainListStorage { - private TopLevelDomainListCache $cache; - - private TopLevelDomainListClient $client; - - public function __construct(TopLevelDomainListCache $cache, TopLevelDomainListClient $client) - { - $this->cache = $cache; - $this->client = $client; + public function __construct( + private TopLevelDomainListCache $cache, + private TopLevelDomainListClient $client + ) { } public function get(string $uri): TopLevelDomainList diff --git a/src/Stream.php b/src/Stream.php index 8d252f99..253b9b69 100644 --- a/src/Stream.php +++ b/src/Stream.php @@ -41,10 +41,14 @@ public static function getContentAsString(string $path, $context = null): string */ private static function fromPath(string $path, $context = null) { - if (null === $context) { - return @fopen($path, 'r'); + $args = [$path, 'r']; + if (null !== $context) { + $args = [...$args, false, $context]; } + set_error_handler(fn (int $errno, string $errstr, string $errfile, int $errline) => true); + $stream = fopen(...$args); + restore_error_handler(); - return @fopen($path, 'r', false, $context); + return $stream; } } diff --git a/src/Suffix.php b/src/Suffix.php index 2fd68bbe..d67f3047 100644 --- a/src/Suffix.php +++ b/src/Suffix.php @@ -4,6 +4,7 @@ namespace Pdp; +use Stringable; use function count; use function in_array; @@ -13,14 +14,10 @@ final class Suffix implements EffectiveTopLevelDomain private const PRIVATE = 'PRIVATE'; private const IANA = 'IANA'; - private DomainName $domain; - - private string $section; - - private function __construct(DomainName $domain, string $section) - { - $this->domain = $domain; - $this->section = $section; + private function __construct( + private DomainName $domain, + private string $section + ) { } /** @@ -31,10 +28,7 @@ public static function __set_state(array $properties): self return new self($properties['domain'], $properties['section']); } - /** - * @param mixed $domain the public suffix domain information - */ - public static function fromICANN($domain): self + public static function fromICANN(int|DomainNameProvider|Host|string|Stringable|null $domain): self { $domain = self::setDomainName($domain); if (1 > count($domain)) { @@ -44,10 +38,7 @@ public static function fromICANN($domain): self return new self($domain, self::ICANN); } - /** - * @param mixed $domain the public suffix domain information - */ - public static function fromPrivate($domain): self + public static function fromPrivate(int|DomainNameProvider|Host|string|Stringable|null $domain): self { $domain = self::setDomainName($domain); if (1 > count($domain)) { @@ -57,10 +48,7 @@ public static function fromPrivate($domain): self return new self($domain, self::PRIVATE); } - /** - * @param mixed $domain the public suffix domain information - */ - public static function fromIANA($domain): self + public static function fromIANA(int|DomainNameProvider|Host|string|Stringable|null $domain): self { $domain = self::setDomainName($domain); if (1 !== count($domain)) { @@ -70,18 +58,12 @@ public static function fromIANA($domain): self return new self($domain, self::IANA); } - /** - * @param mixed $domain the public suffix domain information - */ - public static function fromUnknown($domain): self + public static function fromUnknown(int|DomainNameProvider|Host|string|Stringable|null $domain): self { return new self(self::setDomainName($domain), ''); } - /** - * @param mixed $domain The domain to be resolved - */ - private static function setDomainName($domain): DomainName + private static function setDomainName(int|DomainNameProvider|Host|string|Stringable|null $domain): DomainName { if ($domain instanceof DomainNameProvider) { $domain = $domain->domain(); @@ -148,10 +130,6 @@ public function toString(): string return $this->domain->toString(); } - /** - * @psalm-suppress MoreSpecificReturnType - * @psalm-suppress LessSpecificReturnStatement - */ public function toAscii(): self { $clone = clone $this; @@ -160,10 +138,6 @@ public function toAscii(): self return $clone; } - /** - * @psalm-suppress MoreSpecificReturnType - * @psalm-suppress LessSpecificReturnStatement - */ public function toUnicode(): self { $clone = clone $this; diff --git a/src/SyntaxError.php b/src/SyntaxError.php index ffdb2d73..1c19bdef 100644 --- a/src/SyntaxError.php +++ b/src/SyntaxError.php @@ -8,12 +8,9 @@ final class SyntaxError extends InvalidArgumentException implements CannotProcessHost { - private ?IdnaInfo $idnaInfo; - - private function __construct(string $message, IdnaInfo $idnaInfo = null) + private function __construct(string $message, private IdnaInfo|null $idnaInfo = null) { parent::__construct($message); - $this->idnaInfo = $idnaInfo; } public static function dueToInvalidCharacters(string $domain): self diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index d97d0065..69f6a317 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -7,13 +7,9 @@ use DateTimeImmutable; use Iterator; use SplTempFileObject; -use TypeError; +use Stringable; use function count; -use function gettype; use function in_array; -use function is_object; -use function is_string; -use function method_exists; use function preg_match; use function strpos; use function trim; @@ -21,26 +17,16 @@ final class TopLevelDomains implements TopLevelDomainList { private const IANA_DATE_FORMAT = 'D M d H:i:s Y e'; - private const REGEXP_HEADER_LINE = '/^\# Version (?\d+), Last Updated (?.*?)$/'; - /** - * @var array - */ - private array $records; - - private string $version; - - private DateTimeImmutable $lastUpdated; - /** * @param array $records */ - private function __construct(array $records, string $version, DateTimeImmutable $lastUpdated) - { - $this->records = $records; - $this->version = $version; - $this->lastUpdated = $lastUpdated; + private function __construct( + private array $records, + private string $version, + private DateTimeImmutable $lastUpdated + ) { } /** @@ -59,21 +45,11 @@ public static function fromPath(string $path, $context = null): self /** * Returns a new instance from a string. * - * @param object|string $content a string or an object which exposes the __toString method - * * @throws UnableToLoadTopLevelDomainList if the content is invalid or can not be correctly parsed and converted */ - public static function fromString($content): self + public static function fromString(Stringable|string $content): self { - if (is_object($content) && method_exists($content, '__toString')) { - $content = (string) $content; - } - - if (!is_string($content)) { - throw new TypeError('The content to be converted should be a string or a Stringable object, `'.gettype($content).'` given.'); - } - - $data = self::parse($content); + $data = self::parse((string) $content); return new self($data['records'], $data['version'], $data['lastUpdated']); } @@ -192,7 +168,7 @@ public function getIterator(): Iterator } /** - * @param mixed $host a type that supports instantiating a Domain from. + * @param int|DomainNameProvider|Host|string|Stringable|null $host a type that supports instantiating a Domain from. */ public function resolve($host): ResolvedDomainName { @@ -212,12 +188,10 @@ public function resolve($host): ResolvedDomainName /** * Assert the domain is valid and is resolvable. * - * @param mixed $domain a type that supports instantiating a Domain from. - * * @throws SyntaxError If the domain is invalid * @throws UnableToResolveDomain If the domain can not be resolved */ - private function validateDomain($domain): DomainName + private function validateDomain(int|DomainNameProvider|Host|string|Stringable|null $domain): DomainName { if ($domain instanceof DomainNameProvider) { $domain = $domain->domain(); @@ -241,7 +215,7 @@ private function containsTopLevelDomain(DomainName $domain): bool } /** - * @param mixed $host a domain in a type that can be converted into a DomainInterface instance + * @param int|DomainNameProvider|Host|string|Stringable|null $host a domain in a type that can be converted into a DomainInterface instance */ public function getIANADomain($host): ResolvedDomainName { diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 3a2aff37..2b13f280 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -7,6 +7,7 @@ use DateTimeImmutable; use DateTimeZone; use PHPUnit\Framework\TestCase; +use Stringable; use TypeError; use function dirname; @@ -53,13 +54,6 @@ public function testCreateFromPathThrowsException(): void TopLevelDomains::fromPath('/foo/bar.dat'); } - public function testFromStringThrowsOnTypeError(): void - { - $this->expectException(TypeError::class); - - TopLevelDomains::fromString(new DateTimeImmutable()); - } - /** * @dataProvider invalidContentProvider */ @@ -168,10 +162,8 @@ public function testIterator(): void /** * @dataProvider validDomainProvider - * - * @param mixed $tld the tld */ - public function testResolve($tld): void + public function testResolve(DomainNameProvider|Host|Stringable|string|int|null $tld): void { self::assertSame( Domain::fromIDNA2008($tld)->label(0), @@ -181,10 +173,8 @@ public function testResolve($tld): void /** * @dataProvider validDomainProvider - * - * @param mixed $tld the tld */ - public function testGetTopLevelDomain($tld): void + public function testGetTopLevelDomain(DomainNameProvider|Host|Stringable|string|int|null $tld): void { self::assertSame( Domain::fromIDNA2008($tld)->label(0), @@ -222,7 +212,7 @@ public function testTopLevelDomainThrowsTypeError(): void { $this->expectException(TypeError::class); - self::$topLevelDomains->getIANADomain(new DateTimeImmutable()); + self::$topLevelDomains->getIANADomain(new DateTimeImmutable()); /* @phpstan-ignore-line */ } public function testTopLevelDomainWithInvalidDomain(): void From 88c1ba8d34e77ec20e788d55fd14cfb8694ece75 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 18 Jun 2022 12:01:21 +0200 Subject: [PATCH 402/461] fix https links --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 6ca2d681..63395ca6 100644 --- a/composer.json +++ b/composer.json @@ -10,12 +10,12 @@ "authors": [ { "name": "Jeremy Kendall", - "homepage": "http://about.me/jeremykendall", + "homepage": "https://about.me/jeremykendall", "role": "Developer" }, { "name": "Ignace Nyamagana Butera", - "homepage": "http://nyamsprod.com", + "homepage": "https://nyamsprod.com", "role": "Developer" }, { From ab6baae5ed94a99ecfa0ef93fb00f7e796e672a0 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 27 Sep 2022 11:20:03 +0200 Subject: [PATCH 403/461] Update TopLevelDomais codebase --- composer.json | 14 +++++++------- src/TopLevelDomains.php | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/composer.json b/composer.json index 63395ca6..15586130 100644 --- a/composer.json +++ b/composer.json @@ -47,14 +47,14 @@ }, "require-dev": { "friendsofphp/php-cs-fixer": "^v3.8.0", - "guzzlehttp/guzzle": "^7.4.3", - "guzzlehttp/psr7": "^1.6 || ^2.2.1", - "phpstan/phpstan": "^1.7.3", + "guzzlehttp/guzzle": "^7.5", + "guzzlehttp/psr7": "^1.6 || ^2.4.1", + "phpstan/phpstan": "^1.8.6", "phpstan/phpstan-phpunit": "^1.1.1", - "phpstan/phpstan-strict-rules": "^1.2.3", - "phpunit/phpunit": "^9.5.20", - "psr/http-factory": "^1.0", - "psr/simple-cache": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^9.5.25", + "psr/http-factory": "^1.0.1", + "psr/simple-cache": "^1.0.1", "symfony/cache": "^v5.0.0 || ^v6.0.0" }, "suggest": { diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 69f6a317..802fb324 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -75,8 +75,8 @@ public static function parse(string $content): array continue; } - if (false === strpos($line, '#')) { - $data['records'] = $data['records'] ?? []; + $data['records'] = $data['records'] ?? []; + if (!str_contains($line, '#')) { $data['records'][self::extractRootZone($line)] = 1; continue; } From 0daa3be42fe65d4149baba109d0053f7c768dfb1 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 27 Sep 2022 13:13:31 +0200 Subject: [PATCH 404/461] Improve bugfix for #321 and fixes #334 --- .php-cs-fixer.php | 2 +- src/Rules.php | 3 ++- src/RulesTest.php | 15 +++++++++++++++ src/TopLevelDomains.php | 4 +--- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php index a70bd078..e771f589 100644 --- a/.php-cs-fixer.php +++ b/.php-cs-fixer.php @@ -27,7 +27,7 @@ 'remove_inheritdoc' => true, 'allow_unused_params' => false, ], - 'no_trailing_comma_in_singleline_array' => true, + 'no_trailing_comma_in_singleline' => true, 'no_unused_imports' => true, 'ordered_imports' => ['imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha'], 'phpdoc_add_missing_param_annotation' => ['only_untyped' => true], diff --git a/src/Rules.php b/src/Rules.php index 60072442..b7645968 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -277,7 +277,8 @@ private function getPublicSuffixLengthFromSection(DomainName $domain, string $se if (!array_key_exists($label, $rules)) { // for private domain suffix MUST be fully matched else no suffix is found // https://github.com/jeremykendall/php-domain-parser/issues/321 - if (self::PRIVATE_DOMAINS === $section && [] !== $rules) { + // https://github.com/jeremykendall/php-domain-parser/issues/334 + if (self::PRIVATE_DOMAINS === $section && [] !== $rules && [] !== reset($rules)) { $labelCount = 0; } break; diff --git a/src/RulesTest.php b/src/RulesTest.php index 5d36c328..c62a6526 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -603,4 +603,19 @@ public function testIssue321Failure(): void self::$rules->getPrivateDomain('clientportal.virtualcloud.com.br'); } + + public function testWithMultiLevelPrivateDomain(): void + { + $domain = self::$rules->resolve('test-domain.eu.org'); + + self::assertFalse($domain->suffix()->isICANN()); + self::assertTrue($domain->suffix()->isPrivate()); + self::assertSame('eu.org', $domain->suffix()->value()); + + $domain = self::$rules->resolve('test-domain.lt.eu.org'); + + self::assertFalse($domain->suffix()->isICANN()); + self::assertTrue($domain->suffix()->isPrivate()); + self::assertSame('lt.eu.org', $domain->suffix()->value()); + } } diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 802fb324..39882c13 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -11,7 +11,6 @@ use function count; use function in_array; use function preg_match; -use function strpos; use function trim; final class TopLevelDomains implements TopLevelDomainList @@ -71,11 +70,10 @@ public static function parse(string $content): array foreach ($file as $line) { $line = trim($line); if ([] === $data) { - $data = self::extractHeader($line); + $data = self::extractHeader($line) + ['records' => []]; continue; } - $data['records'] = $data['records'] ?? []; if (!str_contains($line, '#')) { $data['records'][self::extractRootZone($line)] = 1; continue; From 31462d1e3af189941e6099b7f96f265b50c61228 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 27 Sep 2022 19:58:00 +0200 Subject: [PATCH 405/461] Improve internal codebase --- src/Domain.php | 42 +++++++++++++++++------------------------- src/Idna.php | 2 +- 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 7cea4b26..459706d8 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -46,7 +46,6 @@ final class Domain implements DomainName private function __construct(private string $type, DomainNameProvider|Host|Stringable|string|int|null $domain) { - $this->type = $type; $this->domain = $this->parseDomain($domain); $this->labels = null === $this->domain ? [] : array_reverse(explode('.', $this->domain)); } @@ -113,35 +112,30 @@ private function parseValue(Stringable|string|int|null $domain): ?string } $formattedDomain = rawurldecode($domain); - if (1 === preg_match(self::REGEXP_REGISTERED_NAME, $formattedDomain)) { - return strtolower($formattedDomain); - } - - // a domain name can not contains URI delimiters or space - if (1 === preg_match(self::REGEXP_URI_DELIMITERS, $formattedDomain)) { - throw SyntaxError::dueToInvalidCharacters($domain); - } - - // if the domain name does not contains UTF-8 chars then it is malformed - if (1 !== preg_match(self::REGEXP_IDN_PATTERN, $formattedDomain)) { - throw SyntaxError::dueToMalformedValue($domain); - } - - return $this->domainToUnicode($this->domainToAscii($formattedDomain)); + return match (true) { + 1 === preg_match(self::REGEXP_REGISTERED_NAME, $formattedDomain) => strtolower($formattedDomain), + // a domain name can not contain URI delimiters or space + 1 === preg_match(self::REGEXP_URI_DELIMITERS, $formattedDomain) => throw SyntaxError::dueToInvalidCharacters($domain), + // if the domain name does not contain UTF-8 chars then it is malformed + 1 !== preg_match(self::REGEXP_IDN_PATTERN, $formattedDomain) => throw SyntaxError::dueToMalformedValue($domain), + default => $this->domainToUnicode($this->domainToAscii($formattedDomain)), + }; } private function domainToAscii(string $domain): string { - $option = self::IDNA_2003 === $this->type ? Idna::IDNA2003_ASCII : Idna::IDNA2008_ASCII; - - return Idna::toAscii($domain, $option)->result(); + return Idna::toAscii( + $domain, + self::IDNA_2003 === $this->type ? Idna::IDNA2003_ASCII : Idna::IDNA2008_ASCII + )->result(); } private function domainToUnicode(string $domain): string { - $option = self::IDNA_2003 === $this->type ? Idna::IDNA2003_UNICODE : Idna::IDNA2008_UNICODE; - - return Idna::toUnicode($domain, $option)->result(); + return Idna::toUnicode( + $domain, + self::IDNA_2003 === $this->type ? Idna::IDNA2003_UNICODE : Idna::IDNA2008_UNICODE + )->result(); } /** @@ -149,9 +143,7 @@ private function domainToUnicode(string $domain): string */ public function getIterator(): Iterator { - foreach ($this->labels as $label) { - yield $label; - } + yield from $this->labels; } public function isAscii(): bool diff --git a/src/Idna.php b/src/Idna.php index 47ceddba..54b4a9cf 100644 --- a/src/Idna.php +++ b/src/Idna.php @@ -118,7 +118,7 @@ public static function toAscii(string $domain, int $options): IdnaInfo */ public static function toUnicode(string $domain, int $options): IdnaInfo { - if (false === strpos($domain, 'xn--')) { + if (!str_contains($domain, 'xn--')) { return IdnaInfo::fromIntl(['result' => $domain, 'isTransitionalDifferent' => false, 'errors' => 0]); } From 189c99eee76872061c5ec80a562d14ee280824c3 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Tue, 27 Sep 2022 20:03:14 +0200 Subject: [PATCH 406/461] Improve internal codebase --- src/Idna.php | 1 - src/TopLevelDomains.php | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Idna.php b/src/Idna.php index 54b4a9cf..725f9f3d 100644 --- a/src/Idna.php +++ b/src/Idna.php @@ -11,7 +11,6 @@ use function idn_to_utf8; use function preg_match; use function rawurldecode; -use function strpos; use function strtolower; use const INTL_IDNA_VARIANT_UTS46; diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 802fb324..39882c13 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -11,7 +11,6 @@ use function count; use function in_array; use function preg_match; -use function strpos; use function trim; final class TopLevelDomains implements TopLevelDomainList @@ -71,11 +70,10 @@ public static function parse(string $content): array foreach ($file as $line) { $line = trim($line); if ([] === $data) { - $data = self::extractHeader($line); + $data = self::extractHeader($line) + ['records' => []]; continue; } - $data['records'] = $data['records'] ?? []; if (!str_contains($line, '#')) { $data['records'][self::extractRootZone($line)] = 1; continue; From 723391d4cc476ea7528b0d57003ee008172cc393 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 28 Sep 2022 03:06:44 +0200 Subject: [PATCH 407/461] Clean up internal codebase for tests --- src/DomainTest.php | 15 --------------- src/ResolvedDomainTest.php | 24 +----------------------- src/RulesTest.php | 13 ------------- src/Storage/TimeToLiveTest.php | 4 +--- src/SuffixTest.php | 1 - 5 files changed, 2 insertions(+), 55 deletions(-) diff --git a/src/DomainTest.php b/src/DomainTest.php index 445d3071..066eef91 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -59,7 +59,6 @@ public function testDomainInternalPhpMethod(): void * @dataProvider countableProvider * * @param string[] $labels - * @param ?string $domain */ public function testCountable(?string $domain, int $nbLabels, array $labels): void { @@ -115,10 +114,6 @@ public function testLabels(): void /** * @dataProvider toUnicodeProvider - * - * @param ?string $domain - * @param ?string $expectedDomain - * @param ?string $expectedIDNDomain */ public function testToIDN( ?string $domain, @@ -179,9 +174,6 @@ public function toUnicodeProvider(): iterable /** * @dataProvider toAsciiProvider - * @param ?string $domain - * @param ?string $expectedDomain - * @param ?string $expectedAsciiDomain */ public function testToAscii( ?string $domain, @@ -232,8 +224,6 @@ public function toAsciiProvider(): iterable /** * @dataProvider withLabelWorksProvider - * - * @param ?string $expected */ public function testWithLabelWorks(DomainName $domain, int $key, string $label, ?string $expected): void { @@ -374,7 +364,6 @@ public function validPrepend(): iterable /** * @dataProvider withoutLabelWorksProvider - * @param ?string $expected */ public function testwithoutLabelWorks(DomainName $domain, int $key, ?string $expected): void { @@ -426,10 +415,6 @@ public function testwithoutLabelWorksWithMultipleKeys(): void /** * @dataProvider resolveCustomIDNAOptionsProvider - * @param ?string $expectedContent - * @param ?string $expectedAscii - * @param ?string $expectedUnicode - * @param ?string $expectedWithLabel */ public function testResolveWorksWithCustomIDNAOptions( string $domainName, diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 4e6be530..75b798e9 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -33,7 +33,6 @@ public function testRegistrableDomainIsNullWithFoundDomain(): void /** * @dataProvider provideWrongConstructor - * @param ?string $domain */ public function testItThrowsExceptionMisMatchPublicSuffixDomain(?string $domain, int $length): void { @@ -71,7 +70,6 @@ public function testItCanBeUsedWithInternalPhpMethod(): void /** * @dataProvider countableProvider - * @param ?string $domain */ public function testItImplementsCountable(?string $domain, int $nbLabels): void { @@ -93,12 +91,6 @@ public function countableProvider(): iterable /** * @dataProvider toUnicodeProvider - * @param ?string $domain - * @param ?string $publicSuffix - * @param ?string $expectedDomain - * @param ?string $expectedSuffix - * @param ?string $expectedIDNDomain - * @param ?string $expectedIDNSuffix */ public function testItCanBeConvertedToUnicode( ?string $domain, @@ -185,12 +177,6 @@ public function toUnicodeProvider(): iterable /** * @dataProvider toAsciiProvider - * @param ?string $domain - * @param ?string $publicSuffix - * @param ?string $expectedDomain - * @param ?string $expectedSuffix - * @param ?string $expectedAsciiDomain - * @param ?string $expectedAsciiSuffix */ public function testItCanBeConvertedToAscii( ?string $domain, @@ -261,10 +247,8 @@ public function toAsciiProvider(): iterable /** * @dataProvider withSubDomainWorksProvider - * - * @param DomainName|string|null $subdomain the subdomain to add */ - public function testItCanHaveItsSubDomainChanged(ResolvedDomain $domain, $subdomain, string $expected = null): void + public function testItCanHaveItsSubDomainChanged(ResolvedDomain $domain, DomainName|string|null $subdomain, string $expected = null): void { $result = $domain->withSubDomain($subdomain); @@ -447,7 +431,6 @@ public function testItCanThrowsDuringSuffixChangesIfTheDomainHasNotSuffix(): voi /** * @dataProvider resolveCustomIDNAOptionsProvider - * @param ?string $expectedSubDomain */ public function testItCanWorksWithIDNAOptions( string $domainName, @@ -514,11 +497,6 @@ public function resolveCustomIDNAOptionsProvider(): iterable /** * @dataProvider withSldWorksProvider - * @param ?string $host - * @param ?string $publicSuffix - * @param ?string $sld - * @param ?string $expectedSld - * @param ?string $expectedHost */ public function testWithSecondLevelDomain( ?string $host, diff --git a/src/RulesTest.php b/src/RulesTest.php index 5d36c328..a0561981 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -205,9 +205,6 @@ public function testWithDomainInterfaceObject(): void /** * @dataProvider parseDataProvider - * @param ?string $publicSuffix - * @param ?string $registrableDomain - * @param ?string $expectedDomain */ public function testGetRegistrableDomain(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { @@ -216,9 +213,6 @@ public function testGetRegistrableDomain(?string $publicSuffix, ?string $registr /** * @dataProvider parseDataProvider - * @param ?string $publicSuffix - * @param ?string $registrableDomain - * @param ?string $expectedDomain */ public function testGetPublicSuffix(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { @@ -227,9 +221,6 @@ public function testGetPublicSuffix(?string $publicSuffix, ?string $registrableD /** * @dataProvider parseDataProvider - * @param ?string $publicSuffix - * @param ?string $registrableDomain - * @param ?string $expectedDomain */ public function testGetDomain(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { @@ -406,8 +397,6 @@ public function invalidHostParseProvider(): iterable * @covers \Pdp\Domain::parseValue * * @dataProvider validPublicSectionProvider - * @param ?string $domain - * @param ?string $expected */ public function testPublicSuffixSection(?string $domain, ?string $expected): void { @@ -444,8 +433,6 @@ public function validPublicSectionProvider(): iterable * on the domain name and checks the result is the public suffix expected." * * @see http://publicsuffix.org/list/ - * @param ?string $input - * @param ?string $expected */ public function checkPublicSuffix(?string $input, ?string $expected): void { diff --git a/src/Storage/TimeToLiveTest.php b/src/Storage/TimeToLiveTest.php index f5c6cbba..72230f37 100644 --- a/src/Storage/TimeToLiveTest.php +++ b/src/Storage/TimeToLiveTest.php @@ -48,11 +48,9 @@ public function validDurationString(): iterable } /** - * @param int|string|Stringable|null|DateInterval $input - * @param ?DateInterval $expected * @dataProvider validDurationInt */ - public function testItCanBeInstantiatedFromSeconds($input, ?DateInterval $expected): void + public function testItCanBeInstantiatedFromSeconds(int|string|Stringable|null|DateInterval $input, ?DateInterval $expected): void { self::assertEquals($expected, TimeToLive::convert($input)); } diff --git a/src/SuffixTest.php b/src/SuffixTest.php index 6fa79353..1bd1b820 100644 --- a/src/SuffixTest.php +++ b/src/SuffixTest.php @@ -106,7 +106,6 @@ public function testFromIANA(): void /** * @dataProvider conversionReturnsTheSameInstanceProvider - * @param ?string $publicSuffix */ public function testConversionReturnsTheSameInstance(?string $publicSuffix): void { From 4a76d50ac9574f7b18b2a9ef78a5adc3c8cec9d5 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Wed, 28 Sep 2022 16:03:40 +0200 Subject: [PATCH 408/461] Iterate over all remaining labels to avoid missing suffix --- src/Rules.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Rules.php b/src/Rules.php index b7645968..1078a485 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -278,7 +278,7 @@ private function getPublicSuffixLengthFromSection(DomainName $domain, string $se // for private domain suffix MUST be fully matched else no suffix is found // https://github.com/jeremykendall/php-domain-parser/issues/321 // https://github.com/jeremykendall/php-domain-parser/issues/334 - if (self::PRIVATE_DOMAINS === $section && [] !== $rules && [] !== reset($rules)) { + if (self::PRIVATE_DOMAINS === $section && self::hasRemainingRuleLabels($rules)) { $labelCount = 0; } break; @@ -291,4 +291,15 @@ private function getPublicSuffixLengthFromSection(DomainName $domain, string $se return $labelCount; } + + private static function hasRemainingRuleLabels(array $rules): bool + { + foreach ($rules as $rule) { + if ([] !== $rule) { + return true; + } + } + + return false; + } } From 63cab52b4ee8cb10ea727000681119cb2e9f6b34 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 29 Sep 2022 05:26:03 +0200 Subject: [PATCH 409/461] Makes services readonly --- .php-cs-fixer.php | 2 +- src/Rules.php | 2 +- src/Suffix.php | 17 ++++------------- src/TopLevelDomains.php | 6 +++--- 4 files changed, 9 insertions(+), 18 deletions(-) diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php index a70bd078..e771f589 100644 --- a/.php-cs-fixer.php +++ b/.php-cs-fixer.php @@ -27,7 +27,7 @@ 'remove_inheritdoc' => true, 'allow_unused_params' => false, ], - 'no_trailing_comma_in_singleline_array' => true, + 'no_trailing_comma_in_singleline' => true, 'no_unused_imports' => true, 'ordered_imports' => ['imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha'], 'phpdoc_add_missing_param_annotation' => ['only_untyped' => true], diff --git a/src/Rules.php b/src/Rules.php index 60072442..ecc36a63 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -32,7 +32,7 @@ final class Rules implements PublicSuffixList /** * @param array{ICANN_DOMAINS: array, PRIVATE_DOMAINS: array} $rules */ - private function __construct(private array $rules) + private function __construct(private readonly array $rules) { } diff --git a/src/Suffix.php b/src/Suffix.php index d67f3047..7a8d28b3 100644 --- a/src/Suffix.php +++ b/src/Suffix.php @@ -16,7 +16,7 @@ final class Suffix implements EffectiveTopLevelDomain private function __construct( private DomainName $domain, - private string $section + private readonly string $section ) { } @@ -132,18 +132,12 @@ public function toString(): string public function toAscii(): self { - $clone = clone $this; - $clone->domain = $this->domain->toAscii(); - - return $clone; + return new self($this->domain->toAscii(), $this->section); } public function toUnicode(): self { - $clone = clone $this; - $clone->domain = $this->domain->toUnicode(); - - return $clone; + return new self($this->domain->toUnicode(), $this->section); } public function normalize(DomainName $domain): self @@ -153,9 +147,6 @@ public function normalize(DomainName $domain): self $newDomain = $newDomain->toAscii(); } - $clone = clone $this; - $clone->domain = $newDomain; - - return $clone; + return new self($newDomain, $this->section); } } diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 39882c13..f0eb687b 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -22,9 +22,9 @@ final class TopLevelDomains implements TopLevelDomainList * @param array $records */ private function __construct( - private array $records, - private string $version, - private DateTimeImmutable $lastUpdated + private readonly array $records, + private readonly string $version, + private readonly DateTimeImmutable $lastUpdated ) { } From 19f449e45e29837075b98d171cef887a413d11ce Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 18 Feb 2022 07:29:30 +0100 Subject: [PATCH 410/461] [#321] bugfix suffix resolution for private domain --- .github/workflows/build.yaml | 6 +- CHANGELOG.md | 18 + composer.json | 2 +- src/Rules.php | 5 + src/RulesTest.php | 11 + test_data/public_suffix_list.dat | 3385 ++++++++++++++++++++++-------- 6 files changed, 2509 insertions(+), 918 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 6afb0955..08c130ae 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -23,8 +23,8 @@ jobs: - run: composer update --no-progress ${{ matrix.composer-flags }} - run: composer phpunit - run: composer phpstan - if: ${{ matrix.php == '8.0' }} + if: ${{ matrix.php == '8.1' }} - run: composer psalm - if: ${{ matrix.php == '8.0' }} + if: ${{ matrix.php == '8.1' }} - run: composer phpcs - if: ${{ matrix.php == '8.0' }} + if: ${{ matrix.php == '8.1' }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 84076d5e..13b80827 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,24 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will be documented in this file +## 6.1.1 - 2022-02-18 + +### Added + +- None + +### Fixed + +- [#321](https://github.com/jeremykendall/php-domain-parser/issues/321) improve resolving private domain suffix + +### Deprecated + +- None + +### Removed + +- None + ## 6.1.0 - 2021-06-19 ### Added diff --git a/composer.json b/composer.json index 232e354e..72bbf6a6 100644 --- a/composer.json +++ b/composer.json @@ -46,7 +46,7 @@ "ext-json": "*" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.19||^3.0", + "friendsofphp/php-cs-fixer": "^2.19||~v3.4.0", "guzzlehttp/guzzle": "^7.0", "guzzlehttp/psr7": "^1.6||^2.0", "phpstan/phpstan": "^0.12.89", diff --git a/src/Rules.php b/src/Rules.php index 89e8df6a..a0e47cde 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -302,6 +302,11 @@ private function getPublicSuffixLengthFromSection(DomainName $domain, string $se //no match found if (!array_key_exists($label, $rules)) { + // for private domain suffix MUST be fully matched else no suffix is found + // https://github.com/jeremykendall/php-domain-parser/issues/321 + if (self::PRIVATE_DOMAINS === $section && [] !== $rules) { + $labelCount = 0; + } break; } diff --git a/src/RulesTest.php b/src/RulesTest.php index 1df3859e..5bf1322c 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -593,4 +593,15 @@ public function effectiveTLDProvider(): iterable ], ]; } + + public function testIssue321(): void + { + $result = self::$rules->resolve('node857-gelofesta.users.scale.virtualcloud.com.br'); + self::assertSame('users.scale.virtualcloud.com.br', $result->suffix()->value()); + self::assertTrue($result->suffix()->isPrivate()); + + $result = self::$rules->resolve('clientportal.virtualcloud.com.br'); + self::assertSame('com.br', $result->suffix()->value()); + self::assertTrue($result->suffix()->isICANN()); + } } diff --git a/test_data/public_suffix_list.dat b/test_data/public_suffix_list.dat index ebd88d4c..086b8dcc 100644 --- a/test_data/public_suffix_list.dat +++ b/test_data/public_suffix_list.dat @@ -79,7 +79,6 @@ exchange.aero express.aero federation.aero flight.aero -freight.aero fuel.aero gliding.aero government.aero @@ -155,8 +154,13 @@ mil.al net.al org.al -// am : https://en.wikipedia.org/wiki/.am +// am : https://www.amnic.net/policy/en/Policy_EN.pdf am +co.am +com.am +commune.am +net.am +org.am // ao : https://en.wikipedia.org/wiki/.ao // http://www.dns.ao/REGISTR.DOC @@ -171,17 +175,21 @@ it.ao // aq : https://en.wikipedia.org/wiki/.aq aq -// ar : https://nic.ar/nic-argentina/normativa-vigente +// ar : https://nic.ar/es/nic-argentina/normativa ar +bet.ar com.ar +coop.ar edu.ar gob.ar gov.ar int.ar mil.ar musica.ar +mutual.ar net.ar org.ar +senasa.ar tur.ar // arpa : https://en.wikipedia.org/wiki/.arpa @@ -208,6 +216,7 @@ ac.at co.at gv.at or.at +sth.ac.at // au : https://en.wikipedia.org/wiki/.au // http://www.auda.org.au/ @@ -235,6 +244,8 @@ vic.au wa.au // 3LDs act.edu.au +catholic.edu.au +// eq.edu.au - Removed at the request of the Queensland Department of Education nsw.edu.au nt.edu.au qld.edu.au @@ -250,6 +261,9 @@ sa.gov.au tas.gov.au vic.gov.au wa.gov.au +// 4LDs +// education.tas.edu.au - Removed at the request of the Department of Education Tasmania +schools.nsw.edu.au // aw : https://en.wikipedia.org/wiki/.aw aw @@ -381,42 +395,86 @@ gov.bm net.bm org.bm -// bn : https://en.wikipedia.org/wiki/.bn -*.bn +// bn : http://www.bnnic.bn/faqs +bn +com.bn +edu.bn +gov.bn +net.bn +org.bn -// bo : http://www.nic.bo/ +// bo : https://nic.bo/delegacion2015.php#h-1.10 bo com.bo edu.bo -gov.bo gob.bo int.bo org.bo net.bo mil.bo tv.bo +web.bo +// Social Domains +academia.bo +agro.bo +arte.bo +blog.bo +bolivia.bo +ciencia.bo +cooperativa.bo +democracia.bo +deporte.bo +ecologia.bo +economia.bo +empresa.bo +indigena.bo +industria.bo +info.bo +medicina.bo +movimiento.bo +musica.bo +natural.bo +nombre.bo +noticias.bo +patria.bo +politica.bo +profesional.bo +plurinacional.bo +pueblo.bo +revista.bo +salud.bo +tecnologia.bo +tksat.bo +transporte.bo +wiki.bo // br : http://registro.br/dominio/categoria.html // Submitted by registry br +9guacu.br abc.br adm.br adv.br agr.br aju.br am.br +anani.br aparecida.br +app.br arq.br art.br ato.br b.br +barueri.br belem.br bhz.br +bib.br bio.br blog.br bmd.br boavista.br bsb.br +campinagrande.br campinas.br caxias.br cim.br @@ -425,13 +483,19 @@ cnt.br com.br contagem.br coop.br +coz.br cri.br cuiaba.br +curitiba.br def.br +des.br +det.br +dev.br ecn.br eco.br edu.br emp.br +enf.br eng.br esp.br etc.br @@ -444,8 +508,10 @@ fm.br fnd.br fortal.br fot.br +foz.br fst.br g12.br +geo.br ggf.br goiania.br gov.br @@ -489,9 +555,12 @@ jor.br jus.br leg.br lel.br +log.br londrina.br macapa.br maceio.br +manaus.br +maringa.br mat.br med.br mil.br @@ -505,6 +574,7 @@ niteroi.br not.br ntr.br odo.br +ong.br org.br osasco.br palmas.br @@ -518,17 +588,26 @@ qsl.br radio.br rec.br recife.br +rep.br ribeirao.br rio.br riobranco.br +riopreto.br salvador.br sampa.br +santamaria.br +santoandre.br +saobernardo.br +saogonca.br +seg.br sjc.br slg.br slz.br sorocaba.br srv.br taxi.br +tc.br +tec.br teo.br the.br tmp.br @@ -656,11 +735,12 @@ gouv.ci *.ck !www.ck -// cl : https://en.wikipedia.org/wiki/.cl +// cl : https://www.nic.cl +// Confirmed by .CL registry cl -gov.cl -gob.cl co.cl +gob.cl +gov.cl mil.cl // cm : https://en.wikipedia.org/wiki/.cm plus bug 981927 @@ -762,7 +842,13 @@ gov.cu inf.cu // cv : https://en.wikipedia.org/wiki/.cv +// cv : http://www.dns.cv/tldcv_portal/do?com=DS;5446457100;111;+PAGE(4000018)+K-CAT-CODIGO(RDOM)+RCNT(100); <- registration rules cv +com.cv +edu.cv +int.cv +nome.cv +org.cv // cw : http://www.una.cw/cw_registry/ // Confirmed by registry 2013-03-26 @@ -779,6 +865,7 @@ gov.cx // cy : http://www.nic.cy/ // Submitted by registry Panayiotou Fotia +// namespace policies URL https://www.nic.cy/portal//sites/default/files/symfonia_gia_eggrafi.pdf cy ac.cy biz.cy @@ -786,10 +873,9 @@ com.cy ekloges.cy gov.cy ltd.cy -name.cy +mil.cy net.cy org.cy -parliament.cy press.cy pro.cy tm.cy @@ -830,16 +916,18 @@ org.do sld.do web.do -// dz : https://en.wikipedia.org/wiki/.dz +// dz : http://www.nic.dz/images/pdf_nic/charte.pdf dz +art.dz +asso.dz com.dz +edu.dz +gov.dz org.dz net.dz -gov.dz -edu.dz -asso.dz pol.dz -art.dz +soc.dz +tm.dz // ec : http://www.nic.ec/reg/paso1.asp // Submitted by registry @@ -919,30 +1007,44 @@ fi // TODO: Check for updates (expected to be phased out around Q1/2009) aland.fi -// fj : https://en.wikipedia.org/wiki/.fj -*.fj +// fj : http://domains.fj/ +// Submitted by registry 2020-02-11 +fj +ac.fj +biz.fj +com.fj +gov.fj +info.fj +mil.fj +name.fj +net.fj +org.fj +pro.fj // fk : https://en.wikipedia.org/wiki/.fk *.fk // fm : https://en.wikipedia.org/wiki/.fm +com.fm +edu.fm +net.fm +org.fm fm // fo : https://en.wikipedia.org/wiki/.fo fo // fr : http://www.afnic.fr/ -// domaines descriptifs : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-descriptifs +// domaines descriptifs : https://www.afnic.fr/medias/documents/Cadre_legal/Afnic_Naming_Policy_12122016_VEN.pdf fr -com.fr asso.fr +com.fr +gouv.fr nom.fr prd.fr -presse.fr tm.fr -// domaines sectoriels : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-sectoriels +// domaines sectoriels : https://www.afnic.fr/en/products-and-services/the-fr-tld/sector-based-fr-domains-4.html aeroport.fr -assedic.fr avocat.fr avoues.fr cci.fr @@ -950,7 +1052,6 @@ chambagri.fr chirurgiens-dentistes.fr experts-comptables.fr geometre-expert.fr -gouv.fr greta.fr huissier-justice.fr medecin.fr @@ -967,6 +1068,8 @@ ga gb // gd : https://en.wikipedia.org/wiki/.gd +edu.gd +gov.gd gd // ge : http://www.nic.net.ge/policy_en.pdf @@ -1058,7 +1161,7 @@ gov.gr // gs : https://en.wikipedia.org/wiki/.gs gs -// gt : http://www.gt/politicas_de_registro.html +// gt : https://www.gt/sitio/registration_policy.php?lang=en gt com.gt edu.gt @@ -1068,10 +1171,21 @@ mil.gt net.gt org.gt -// gu : http://gadao.gov.gu/registration.txt -*.gu +// gu : http://gadao.gov.gu/register.html +// University of Guam : https://www.uog.edu +// Submitted by uognoc@triton.uog.edu +gu +com.gu +edu.gu +gov.gu +guam.gu +info.gu +net.gu +org.gu +web.gu // gw : https://en.wikipedia.org/wiki/.gw +// gw : https://nic.gw/regras/ gw // gy : https://en.wikipedia.org/wiki/.gy @@ -1084,7 +1198,7 @@ gov.gy net.gy org.gy -// hk : https://www.hkdnr.hk +// hk : https://www.hkirc.hk // Submitted by registry hk com.hk @@ -1183,7 +1297,7 @@ tozsde.hu utazas.hu video.hu -// id : https://register.pandi.or.id/ +// id : https://pandi.id/en/domain/registration-requirements/ id ac.id biz.id @@ -1194,6 +1308,7 @@ mil.id my.id net.id or.id +ponpes.id sch.id web.id @@ -1295,10 +1410,8 @@ int.is it gov.it edu.it -// Reserved geo-names: -// http://www.nic.it/documenti/regolamenti-e-linee-guida/regolamento-assegnazione-versione-6.0.pdf -// There is also a list of reserved geo-names corresponding to Italian municipalities -// http://www.nic.it/documenti/appendice-c.pdf, but it is not included here. +// Reserved geo-names (regions and provinces): +// https://www.nic.it/sites/default/files/archivio/docs/Regulation_assignation_v7.1.pdf // Regions abr.it abruzzo.it @@ -1352,6 +1465,12 @@ sicily.it taa.it tos.it toscana.it +trentin-sud-tirol.it +trentin-süd-tirol.it +trentin-sudtirol.it +trentin-südtirol.it +trentin-sued-tirol.it +trentin-suedtirol.it trentino-a-adige.it trentino-aadige.it trentino-alto-adige.it @@ -1359,9 +1478,12 @@ trentino-altoadige.it trentino-s-tirol.it trentino-stirol.it trentino-sud-tirol.it +trentino-süd-tirol.it trentino-sudtirol.it +trentino-südtirol.it trentino-sued-tirol.it trentino-suedtirol.it +trentino.it trentinoa-adige.it trentinoaadige.it trentinoalto-adige.it @@ -1369,9 +1491,17 @@ trentinoaltoadige.it trentinos-tirol.it trentinostirol.it trentinosud-tirol.it +trentinosüd-tirol.it trentinosudtirol.it +trentinosüdtirol.it trentinosued-tirol.it trentinosuedtirol.it +trentinsud-tirol.it +trentinsüd-tirol.it +trentinsudtirol.it +trentinsüdtirol.it +trentinsued-tirol.it +trentinsuedtirol.it tuscany.it umb.it umbria.it @@ -1386,7 +1516,13 @@ valleaosta.it valled-aosta.it valledaosta.it vallee-aoste.it +vallée-aoste.it +vallee-d-aoste.it +vallée-d-aoste.it valleeaoste.it +valléeaoste.it +valleedaoste.it +valléedaoste.it vao.it vda.it ven.it @@ -1419,6 +1555,9 @@ at.it av.it avellino.it ba.it +balsan-sudtirol.it +balsan-südtirol.it +balsan-suedtirol.it balsan.it bari.it barletta-trani-andria.it @@ -1433,13 +1572,21 @@ bl.it bn.it bo.it bologna.it +bolzano-altoadige.it bolzano.it +bozen-sudtirol.it +bozen-südtirol.it +bozen-suedtirol.it bozen.it br.it brescia.it brindisi.it bs.it bt.it +bulsan-sudtirol.it +bulsan-südtirol.it +bulsan-suedtirol.it +bulsan.it bz.it ca.it cagliari.it @@ -1457,7 +1604,9 @@ catanzaro.it cb.it ce.it cesena-forli.it +cesena-forlì.it cesenaforli.it +cesenaforlì.it ch.it chieti.it ci.it @@ -1488,7 +1637,9 @@ florence.it fm.it foggia.it forli-cesena.it +forlì-cesena.it forlicesena.it +forlìcesena.it fr.it frosinone.it ge.it @@ -1619,6 +1770,7 @@ sp.it sr.it ss.it suedtirol.it +südtirol.it sv.it ta.it taranto.it @@ -1637,7 +1789,6 @@ trani-barletta-andria.it traniandriabarletta.it tranibarlettaandria.it trapani.it -trentino.it trento.it treviso.it trieste.it @@ -3492,8 +3643,17 @@ uenohara.yamanashi.jp yamanakako.yamanashi.jp yamanashi.yamanashi.jp -// ke : http://www.kenic.or.ke/index.php?option=com_content&task=view&id=117&Itemid=145 -*.ke +// ke : http://www.kenic.or.ke/index.php/en/ke-domains/ke-domains +ke +ac.ke +co.ke +go.ke +info.ke +me.ke +mobi.ke +ne.ke +or.ke +sc.ke // kg : http://www.domain.kg/dmn_n.html kg @@ -3591,17 +3751,24 @@ jeonnam.kr seoul.kr ulsan.kr -// kw : https://en.wikipedia.org/wiki/.kw -*.kw +// kw : https://www.nic.kw/policies/ +// Confirmed by registry +kw +com.kw +edu.kw +emb.kw +gov.kw +ind.kw +net.kw +org.kw // ky : http://www.icta.ky/da_ky_reg_dom.php // Confirmed by registry 2008-06-17 ky -edu.ky -gov.ky com.ky -org.ky +edu.ky net.ky +org.ky // kz : https://en.wikipedia.org/wiki/.kz // see also: http://www.nic.kz/rules/index.jsp @@ -3647,7 +3814,7 @@ gov.lc // li : https://en.wikipedia.org/wiki/.li li -// lk : http://www.nic.lk/seclevpr.html +// lk : https://www.nic.lk/index.php/domain-registration/lk-domain-naming-structure lk gov.lk sch.lk @@ -3674,10 +3841,18 @@ gov.lr org.lr net.lr -// ls : https://en.wikipedia.org/wiki/.ls +// ls : http://www.nic.ls/ +// Confirmed by registry ls +ac.ls +biz.ls co.ls +edu.ls +gov.ls +info.ls +net.ls org.ls +sc.ls // lt : https://en.wikipedia.org/wiki/.lt lt @@ -4206,8 +4381,6 @@ niepce.museum norfolk.museum north.museum nrw.museum -nuernberg.museum -nuremberg.museum nyc.museum nyny.museum oceanographic.museum @@ -4430,15 +4603,17 @@ gob.mx edu.mx net.mx -// my : http://www.mynic.net.my/ +// my : http://www.mynic.my/ +// Available strings: https://mynic.my/resources/domains/buying-a-domain/ my +biz.my com.my -net.my -org.my -gov.my edu.my +gov.my mil.my name.my +net.my +org.my // mz : http://www.uem.mz/ // Submitted by registry @@ -4535,16 +4710,13 @@ web.ni // ccTLD for the Netherlands nl -// BV.nl will be a registry for dutch BV's (besloten vennootschap) -bv.nl - -// no : http://www.norid.no/regelverk/index.en.html -// The Norwegian registry has declined to notify us of updates. The web pages -// referenced below are the official source of the data. There is also an -// announce mailing list: -// https://postlister.uninett.no/sympa/info/norid-diskusjon +// no : https://www.norid.no/en/om-domenenavn/regelverk-for-no/ +// Norid geographical second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-b/ +// Norid category second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-c/ +// Norid category second-level domains managed by parties other than Norid : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-d/ +// RSS feed: https://teknisk.norid.no/en/feed/ no -// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html +// Norid category second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-c/ fhs.no vgs.no fylkesbibl.no @@ -4552,13 +4724,13 @@ folkebibl.no museum.no idrett.no priv.no -// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html +// Norid category second-level domains managed by parties other than Norid : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-d/ mil.no stat.no dep.no kommune.no herad.no -// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html +// Norid geographical second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-b/ // counties aa.no ah.no @@ -5687,7 +5859,7 @@ com.ps org.ps net.ps -// pt : http://online.dns.pt/dns/start_dns +// pt : https://www.dns.pt/en/domain/pt-terms-and-conditions-registration-rules/ pt net.pt gov.pt @@ -5758,26 +5930,19 @@ gov.rs in.rs org.rs -// ru : https://cctld.ru/en/domains/domens_ru/reserved/ +// ru : https://cctld.ru/files/pdf/docs/en/rules_ru-rf.pdf +// Submitted by George Georgievsky ru -ac.ru -edu.ru -gov.ru -int.ru -mil.ru -test.ru -// rw : http://www.nic.rw/cgi-bin/policy.pl +// rw : https://www.ricta.org.rw/sites/default/files/resources/registry_registrar_contract_0.pdf rw -gov.rw -net.rw -edu.rw ac.rw -com.rw co.rw -int.rw +coop.rw +gov.rw mil.rw -gouv.rw +net.rw +org.rw // sa : http://www.nic.net.sa/ sa @@ -5912,15 +6077,30 @@ org.sn perso.sn univ.sn -// so : http://www.soregistry.com/ +// so : http://sonic.so/policies/ so com.so +edu.so +gov.so +me.so net.so org.so // sr : https://en.wikipedia.org/wiki/.sr sr +// ss : https://registry.nic.ss/ +// Submitted by registry +ss +biz.ss +com.ss +edu.ss +gov.ss +me.ss +net.ss +org.ss +sch.ss + // st : http://www.nic.st/html/policyrules/ st co.st @@ -5928,7 +6108,6 @@ com.st consulado.st edu.st embaixada.st -gov.st mil.st net.st org.st @@ -6033,29 +6212,22 @@ gov.tm mil.tm edu.tm -// tn : https://en.wikipedia.org/wiki/.tn -// http://whois.ati.tn/ +// tn : http://www.registre.tn/fr/ +// https://whois.ati.tn/ tn com.tn ens.tn fin.tn gov.tn ind.tn +info.tn intl.tn +mincom.tn nat.tn net.tn org.tn -info.tn perso.tn tourism.tn -edunet.tn -rnrt.tn -rns.tn -rnu.tn -mincom.tn -agrinet.tn -defense.tn -turen.tn // to : https://en.wikipedia.org/wiki/.to // Submitted by registry @@ -6067,40 +6239,36 @@ org.to edu.to mil.to -// subTLDs: https://www.nic.tr/forms/eng/policies.pdf -// and: https://www.nic.tr/forms/politikalar.pdf -// Submitted by +// tr : https://nic.tr/ +// https://nic.tr/forms/eng/policies.pdf +// https://nic.tr/index.php?USRACTN=PRICELST tr -com.tr -info.tr -biz.tr -net.tr -org.tr -web.tr -gen.tr -tv.tr av.tr -dr.tr bbs.tr -name.tr -tel.tr -gov.tr bel.tr -pol.tr +biz.tr +com.tr +dr.tr +edu.tr +gen.tr +gov.tr +info.tr mil.tr k12.tr -edu.tr kep.tr - +name.tr +net.tr +org.tr +pol.tr +tel.tr +tsk.tr +tv.tr +web.tr // Used by Northern Cyprus nc.tr - // Used by government agencies of Northern Cyprus gov.nc.tr -// travel : https://en.wikipedia.org/wiki/.travel -travel - // tt : http://www.nic.tt/ tt co.tt @@ -6184,7 +6352,6 @@ cv.ua dn.ua dnepropetrovsk.ua dnipropetrovsk.ua -dominic.ua donetsk.ua dp.ua if.ua @@ -6378,7 +6545,7 @@ k12.ok.us k12.or.us k12.pa.us k12.pr.us -k12.ri.us +// k12.ri.us Removed at request of Kim Cournoyer k12.sc.us // k12.sd.us Bug 934131 - Removed at request of James Booze k12.tn.us @@ -6550,9 +6717,10 @@ mil.vc edu.vc // ve : https://registro.nic.ve/ -// Submitted by registry +// Submitted by registry nic@nic.ve and nicve@conatel.gob.ve ve arts.ve +bib.ve co.ve com.ve e12.ve @@ -6564,7 +6732,9 @@ info.ve int.ve mil.ve net.ve +nom.ve org.ve +rar.ve rec.ve store.ve tec.ve @@ -6643,6 +6813,9 @@ yt // xn--90ae ("bg", Bulgarian) : BG бг +// xn--mgbcpq6gpa1a ("albahrain", Arabic) : BH +البحرين + // xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY // Operated by .by registry бел @@ -6665,8 +6838,16 @@ yt مصر // xn--e1a4c ("eu", Cyrillic) : EU +// https://eurid.eu ею +// xn--qxa6a ("eu", Greek) : EU +// https://eurid.eu +ευ + +// xn--mgbah1a3hjkrd ("Mauritania", Arabic) : MR +موريتانيا + // xn--node ("ge", Georgian Mkhedruli) : GE გე @@ -6675,8 +6856,16 @@ yt ελ // xn--j6w193g ("Hong Kong", Chinese) : HK -// https://www2.hkirc.hk/register/rules.jsp +// https://www.hkirc.hk +// Submitted by registry +// https://www.hkirc.hk/content.jsp?id=30#!/34 香港 +公司.香港 +教育.香港 +政府.香港 +個人.香港 +網絡.香港 +組織.香港 // xn--2scrj9c ("Bharat", Kannada) : IN // India @@ -6710,6 +6899,10 @@ yt // India भारत +// xn--mgbbh1a ("Bharat", Kashmiri) : IN +// India +بارت + // xn--mgbbh1a71e ("Bharat", Arabic) : IN // India بھارت @@ -6755,12 +6948,15 @@ yt // xn--80ao21a ("Kaz", Kazakh) : KZ қаз +// xn--q7ce6a ("Lao", Lao) : LA +ລາວ + // xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK -// http://nic.lk +// https://nic.lk ලංකා // xn--xkc2al3hye2a ("Ilangai", Tamil) : LK -// http://nic.lk +// https://nic.lk இலங்கை // xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA @@ -6808,7 +7004,8 @@ yt ак.срб // xn--p1ai ("rf", Russian-Cyrillic) : RU -// http://www.cctld.ru/en/docs/rulesrf.php +// https://cctld.ru/files/pdf/docs/en/rules_ru-rf.pdf +// Submitted by George Georgievsky рф // xn--wgbl6a ("Qatar", Arabic) : QA @@ -6879,9 +7076,15 @@ yt xxx // ye : http://www.y.net.ye/services/domain_name.htm -*.ye - -// za : http://www.zadna.org.za/content/page/domain-information +ye +com.ye +edu.ye +gov.ye +net.ye +mil.ye +org.ye + +// za : https://www.zadna.org.za/content/page/domain-information/ ac.za agric.za alt.za @@ -6893,6 +7096,7 @@ law.za mil.za net.za ngo.za +nic.za nis.za nom.za org.za @@ -6924,8 +7128,11 @@ gov.zw mil.zw org.zw -// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2017-02-23T00:46:09Z +// newGTLDs + +// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2022-02-02T15:12:37Z +// This list is auto-generated, don't edit it manually. // aaa : 2015-02-26 American Automobile Association, Inc. aaa @@ -6950,13 +7157,13 @@ abc // able : 2015-06-25 Able Inc. able -// abogado : 2014-04-24 Top Level Domain Holdings Limited +// abogado : 2014-04-24 Registry Services, LLC abogado // abudhabi : 2015-07-30 Abu Dhabi Systems and Information Centre abudhabi -// academy : 2013-11-07 Half Oaks, LLC +// academy : 2013-11-07 Binky Moon, LLC academy // accenture : 2014-08-15 Accenture plc @@ -6965,16 +7172,13 @@ accenture // accountant : 2014-11-20 dot Accountant Limited accountant -// accountants : 2014-03-20 Knob Town, LLC +// accountants : 2014-03-20 Binky Moon, LLC accountants // aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG aco -// active : 2014-05-01 The Active Network, Inc -active - -// actor : 2013-12-12 United TLD Holdco Ltd. +// actor : 2013-12-12 Dog Beach, LLC actor // adac : 2015-07-16 Allgemeiner Deutscher Automobil-Club e.V. (ADAC) @@ -6992,9 +7196,6 @@ aeg // aetna : 2015-05-21 Aetna Life Insurance Company aetna -// afamilycompany : 2015-07-23 Johnson Shareholdings, Inc. -afamilycompany - // afl : 2014-10-02 Australian Football League afl @@ -7004,19 +7205,16 @@ africa // agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) agakhan -// agency : 2013-11-14 Steel Falls, LLC +// agency : 2013-11-14 Binky Moon, LLC agency // aig : 2014-12-18 American International Group, Inc. aig -// aigo : 2015-08-06 aigo Digital Technology Co,Ltd. -aigo - // airbus : 2015-07-30 Airbus S.A.S. airbus -// airforce : 2014-03-06 United TLD Holdco Ltd. +// airforce : 2014-03-06 Dog Beach, LLC airforce // airtel : 2014-10-24 Bharti Airtel Limited @@ -7043,12 +7241,15 @@ allstate // ally : 2015-06-18 Ally Financial Inc. ally -// alsace : 2014-07-02 REGION D ALSACE +// alsace : 2014-07-02 Region Grand Est alsace // alstom : 2015-07-30 ALSTOM alstom +// amazon : 2019-12-19 Amazon Registry Services, Inc. +amazon + // americanexpress : 2015-07-31 American Express Travel Related Services Company, Inc. americanexpress @@ -7073,16 +7274,16 @@ analytics // android : 2014-08-07 Charleston Road Registry Inc. android -// anquan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +// anquan : 2015-01-08 Beijing Qihu Keji Co., Ltd. anquan // anz : 2015-07-31 Australia and New Zealand Banking Group Limited anz -// aol : 2015-09-17 AOL Inc. +// aol : 2015-09-17 Oath Inc. aol -// apartments : 2014-12-11 June Maple, LLC +// apartments : 2014-12-11 Binky Moon, LLC apartments // app : 2015-05-14 Charleston Road Registry Inc. @@ -7100,10 +7301,10 @@ arab // aramco : 2014-11-20 Aramco Services Company aramco -// archi : 2014-02-06 STARTING DOT LIMITED +// archi : 2014-02-06 Afilias Limited archi -// army : 2014-03-06 United TLD Holdco Ltd. +// army : 2014-03-06 Dog Beach, LLC army // art : 2016-03-24 UK Creative Ideas Limited @@ -7115,52 +7316,52 @@ arte // asda : 2015-07-31 Wal-Mart Stores, Inc. asda -// associates : 2014-03-06 Baxter Hill, LLC +// associates : 2014-03-06 Binky Moon, LLC associates // athleta : 2015-07-30 The Gap, Inc. athleta -// attorney : 2014-03-20 +// attorney : 2014-03-20 Dog Beach, LLC attorney -// auction : 2014-03-20 +// auction : 2014-03-20 Dog Beach, LLC auction // audi : 2015-05-21 AUDI Aktiengesellschaft audi -// audible : 2015-06-25 Amazon EU S.à r.l. +// audible : 2015-06-25 Amazon Registry Services, Inc. audible -// audio : 2014-03-20 Uniregistry, Corp. +// audio : 2014-03-20 UNR Corp. audio // auspost : 2015-08-13 Australian Postal Corporation auspost -// author : 2014-12-18 Amazon EU S.à r.l. +// author : 2014-12-18 Amazon Registry Services, Inc. author -// auto : 2014-11-13 +// auto : 2014-11-13 XYZ.COM LLC auto -// autos : 2014-01-09 DERAutos, LLC +// autos : 2014-01-09 XYZ.COM LLC autos -// avianca : 2015-01-08 Aerovias del Continente Americano S.A. Avianca +// avianca : 2015-01-08 Avianca Holdings S.A. avianca -// aws : 2015-06-25 Amazon EU S.à r.l. +// aws : 2015-06-25 AWS Registry LLC aws -// axa : 2013-12-19 AXA SA +// axa : 2013-12-19 AXA Group Operations SAS axa // azure : 2014-12-18 Microsoft Corporation azure -// baby : 2015-04-09 Johnson & Johnson Services, Inc. +// baby : 2015-04-09 XYZ.COM LLC baby // baidu : 2015-01-08 Baidu, Inc. @@ -7172,7 +7373,7 @@ banamex // bananarepublic : 2015-07-31 The Gap, Inc. bananarepublic -// band : 2014-06-12 +// band : 2014-06-12 Dog Beach, LLC band // bank : 2014-09-25 fTLD Registry Services LLC @@ -7193,7 +7394,7 @@ barclays // barefoot : 2015-06-11 Gallo Vineyards, Inc. barefoot -// bargains : 2013-11-14 Half Hallow, LLC +// bargains : 2013-11-14 Binky Moon, LLC bargains // baseball : 2015-10-29 MLB Advanced Media DH, LLC @@ -7226,10 +7427,10 @@ bcn // beats : 2015-05-14 Beats Electronics, LLC beats -// beauty : 2015-12-03 L'Oréal +// beauty : 2015-12-03 XYZ.COM LLC beauty -// beer : 2014-01-09 Top Level Domain Holdings Limited +// beer : 2014-01-09 Registry Services, LLC beer // bentley : 2014-12-18 Bentley Motors Limited @@ -7244,7 +7445,7 @@ best // bestbuy : 2015-07-31 BBY Solutions, Inc. bestbuy -// bet : 2015-05-07 Afilias plc +// bet : 2015-05-07 Afilias Limited bet // bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited @@ -7256,31 +7457,28 @@ bible // bid : 2013-12-19 dot Bid Limited bid -// bike : 2013-08-27 Grand Hollow, LLC +// bike : 2013-08-27 Binky Moon, LLC bike // bing : 2014-12-18 Microsoft Corporation bing -// bingo : 2014-12-04 Sand Cedar, LLC +// bingo : 2014-12-04 Binky Moon, LLC bingo -// bio : 2014-03-06 STARTING DOT LIMITED +// bio : 2014-03-06 Afilias Limited bio // black : 2014-01-16 Afilias Limited black -// blackfriday : 2014-01-16 Uniregistry, Corp. +// blackfriday : 2014-01-16 UNR Corp. blackfriday -// blanco : 2015-07-16 BLANCO GmbH + Co KG -blanco - // blockbuster : 2015-07-30 Dish DBS Corporation blockbuster -// blog : 2015-05-14 +// blog : 2015-05-14 Knock Knock WHOIS There, LLC blog // bloomberg : 2014-07-17 Bloomberg IP Holdings LLC @@ -7295,55 +7493,49 @@ bms // bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft bmw -// bnl : 2014-07-24 Banca Nazionale del Lavoro -bnl - // bnpparibas : 2014-05-29 BNP Paribas bnpparibas -// boats : 2014-12-04 DERBoats, LLC +// boats : 2014-12-04 XYZ.COM LLC boats // boehringer : 2015-07-09 Boehringer Ingelheim International GmbH boehringer -// bofa : 2015-07-31 NMS Services, Inc. +// bofa : 2015-07-31 Bank of America Corporation bofa // bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br bom -// bond : 2014-06-05 Bond University Limited +// bond : 2014-06-05 ShortDot SA bond // boo : 2014-01-30 Charleston Road Registry Inc. boo -// book : 2015-08-27 Amazon EU S.à r.l. +// book : 2015-08-27 Amazon Registry Services, Inc. book // booking : 2015-07-16 Booking.com B.V. booking -// boots : 2015-01-08 THE BOOTS COMPANY PLC -boots - // bosch : 2015-06-18 Robert Bosch GMBH bosch // bostik : 2015-05-28 Bostik SA bostik -// boston : 2015-12-10 +// boston : 2015-12-10 Registry Services, LLC boston -// bot : 2014-12-18 Amazon EU S.à r.l. +// bot : 2014-12-18 Amazon Registry Services, Inc. bot -// boutique : 2013-11-14 Over Galley, LLC +// boutique : 2013-11-14 Binky Moon, LLC boutique -// box : 2015-11-12 NS1 Limited +// box : 2015-11-12 Intercap Registry Inc. box // bradesco : 2014-12-18 Banco Bradesco S.A. @@ -7355,7 +7547,7 @@ bridgestone // broadway : 2014-12-22 Celebrate Broadway, Inc. broadway -// broker : 2014-12-11 IG Group Holdings PLC +// broker : 2014-12-11 Dog Beach, LLC broker // brother : 2015-01-29 Brother Industries, Ltd. @@ -7364,7 +7556,7 @@ brother // brussels : 2014-02-06 DNS.be vzw brussels -// budapest : 2013-11-21 Top Level Domain Holdings Limited +// budapest : 2013-11-21 Minds + Machines Group Limited budapest // bugatti : 2015-07-23 Bugatti International SA @@ -7373,13 +7565,13 @@ bugatti // build : 2013-11-07 Plan Bee LLC build -// builders : 2013-11-07 Atomic Madison, LLC +// builders : 2013-11-07 Binky Moon, LLC builders -// business : 2013-11-07 Spring Cross, LLC +// business : 2013-11-07 Binky Moon, LLC business -// buy : 2014-12-18 Amazon EU S.à r.l. +// buy : 2014-12-18 Amazon Registry Services, Inc. buy // buzz : 2013-10-02 DOTSTRATEGY CO. @@ -7388,28 +7580,28 @@ buzz // bzh : 2014-02-27 Association www.bzh bzh -// cab : 2013-10-24 Half Sunset, LLC +// cab : 2013-10-24 Binky Moon, LLC cab -// cafe : 2015-02-11 Pioneer Canyon, LLC +// cafe : 2015-02-11 Binky Moon, LLC cafe // cal : 2014-07-24 Charleston Road Registry Inc. cal -// call : 2014-12-18 Amazon EU S.à r.l. +// call : 2014-12-18 Amazon Registry Services, Inc. call // calvinklein : 2015-07-30 PVH gTLD Holdings LLC calvinklein -// cam : 2016-04-21 AC Webconnecting Holding B.V. +// cam : 2016-04-21 Cam Connecting SARL cam -// camera : 2013-08-27 Atomic Maple, LLC +// camera : 2013-08-27 Binky Moon, LLC camera -// camp : 2013-11-07 Delta Dynamite, LLC +// camp : 2013-11-07 Binky Moon, LLC camp // cancerresearch : 2014-05-15 Australian Cancer Research Foundation @@ -7421,52 +7613,46 @@ canon // capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry capetown -// capital : 2014-03-06 Delta Mill, LLC +// capital : 2014-03-06 Binky Moon, LLC capital // capitalone : 2015-08-06 Capital One Financial Corporation capitalone -// car : 2015-01-22 +// car : 2015-01-22 XYZ.COM LLC car // caravan : 2013-12-12 Caravan International, Inc. caravan -// cards : 2013-12-05 Foggy Hollow, LLC +// cards : 2013-12-05 Binky Moon, LLC cards -// care : 2014-03-06 Goose Cross +// care : 2014-03-06 Binky Moon, LLC care // career : 2013-10-09 dotCareer LLC career -// careers : 2013-10-02 Wild Corner, LLC +// careers : 2013-10-02 Binky Moon, LLC careers -// cars : 2014-11-13 +// cars : 2014-11-13 XYZ.COM LLC cars -// cartier : 2014-06-23 Richemont DNS Inc. -cartier - -// casa : 2013-11-21 Top Level Domain Holdings Limited +// casa : 2013-11-21 Registry Services, LLC casa -// case : 2015-09-03 CNH Industrial N.V. +// case : 2015-09-03 Helium TLDs Ltd case -// caseih : 2015-09-03 CNH Industrial N.V. -caseih - -// cash : 2014-03-06 Delta Lake, LLC +// cash : 2014-03-06 Binky Moon, LLC cash -// casino : 2014-12-18 Binky Sky, LLC +// casino : 2014-12-18 Binky Moon, LLC casino -// catering : 2013-12-05 New Falls. LLC +// catering : 2013-12-05 Binky Moon, LLC catering // catholic : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) @@ -7484,10 +7670,7 @@ cbre // cbs : 2015-08-06 CBS Domains Inc. cbs -// ceb : 2015-04-09 The Corporate Executive Board Company -ceb - -// center : 2013-11-07 Tin Mill, LLC +// center : 2013-11-07 Binky Moon, LLC center // ceo : 2013-11-07 CEOTLD Pty Ltd @@ -7499,7 +7682,7 @@ cern // cfa : 2014-08-28 CFA Institute cfa -// cfd : 2014-12-11 IG Group Holdings PLC +// cfd : 2014-12-11 ShortDot SA cfd // chanel : 2015-04-09 Chanel International B.V. @@ -7508,34 +7691,34 @@ chanel // channel : 2014-05-08 Charleston Road Registry Inc. channel -// chase : 2015-04-30 JPMorgan Chase & Co. +// charity : 2018-04-11 Binky Moon, LLC +charity + +// chase : 2015-04-30 JPMorgan Chase Bank, National Association chase -// chat : 2014-12-04 Sand Fields, LLC +// chat : 2014-12-04 Binky Moon, LLC chat -// cheap : 2013-11-14 Sand Cover, LLC +// cheap : 2013-11-14 Binky Moon, LLC cheap // chintai : 2015-06-11 CHINTAI Corporation chintai -// christmas : 2013-11-21 Uniregistry, Corp. +// christmas : 2013-11-21 UNR Corp. christmas // chrome : 2014-07-24 Charleston Road Registry Inc. chrome -// chrysler : 2015-07-30 FCA US LLC. -chrysler - -// church : 2014-02-06 Holly Fields, LLC +// church : 2014-02-06 Binky Moon, LLC church // cipriani : 2015-02-19 Hotel Cipriani Srl cipriani -// circle : 2014-12-18 Amazon EU S.à r.l. +// circle : 2014-12-18 Amazon Registry Services, Inc. circle // cisco : 2014-12-22 Cisco Technology, Inc. @@ -7550,52 +7733,52 @@ citi // citic : 2014-01-09 CITIC Group Corporation citic -// city : 2014-05-29 Snow Sky, LLC +// city : 2014-05-29 Binky Moon, LLC city // cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. cityeats -// claims : 2014-03-20 Black Corner, LLC +// claims : 2014-03-20 Binky Moon, LLC claims -// cleaning : 2013-12-05 Fox Shadow, LLC +// cleaning : 2013-12-05 Binky Moon, LLC cleaning -// click : 2014-06-05 Uniregistry, Corp. +// click : 2014-06-05 UNR Corp. click -// clinic : 2014-03-20 Goose Park, LLC +// clinic : 2014-03-20 Binky Moon, LLC clinic // clinique : 2015-10-01 The Estée Lauder Companies Inc. clinique -// clothing : 2013-08-27 Steel Lake, LLC +// clothing : 2013-08-27 Binky Moon, LLC clothing -// cloud : 2015-04-16 ARUBA S.p.A. +// cloud : 2015-04-16 Aruba PEC S.p.A. cloud -// club : 2013-11-08 .CLUB DOMAINS, LLC +// club : 2013-11-08 Registry Services, LLC club // clubmed : 2015-06-25 Club Méditerranée S.A. clubmed -// coach : 2014-10-09 Koko Island, LLC +// coach : 2014-10-09 Binky Moon, LLC coach -// codes : 2013-10-31 Puff Willow, LLC +// codes : 2013-10-31 Binky Moon, LLC codes -// coffee : 2013-10-17 Trixy Cover, LLC +// coffee : 2013-10-17 Binky Moon, LLC coffee // college : 2014-01-16 XYZ.COM LLC college -// cologne : 2014-02-05 NetCologne Gesellschaft für Telekommunikation mbH +// cologne : 2014-02-05 dotKoeln GmbH cologne // comcast : 2015-07-23 Comcast IP Holdings I, LLC @@ -7604,67 +7787,70 @@ comcast // commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA commbank -// community : 2013-12-05 Fox Orchard, LLC +// community : 2013-12-05 Binky Moon, LLC community -// company : 2013-11-07 Silver Avenue, LLC +// company : 2013-11-07 Binky Moon, LLC company -// compare : 2015-10-08 iSelect Ltd +// compare : 2015-10-08 Registry Services, LLC compare -// computer : 2013-10-24 Pine Mill, LLC +// computer : 2013-10-24 Binky Moon, LLC computer // comsec : 2015-01-08 VeriSign, Inc. comsec -// condos : 2013-12-05 Pine House, LLC +// condos : 2013-12-05 Binky Moon, LLC condos -// construction : 2013-09-16 Fox Dynamite, LLC +// construction : 2013-09-16 Binky Moon, LLC construction -// consulting : 2013-12-05 +// consulting : 2013-12-05 Dog Beach, LLC consulting -// contact : 2015-01-08 Top Level Spectrum, Inc. +// contact : 2015-01-08 Dog Beach, LLC contact -// contractors : 2013-09-10 Magic Woods, LLC +// contractors : 2013-09-10 Binky Moon, LLC contractors -// cooking : 2013-11-21 Top Level Domain Holdings Limited +// cooking : 2013-11-21 Registry Services, LLC cooking // cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. cookingchannel -// cool : 2013-11-14 Koko Lake, LLC +// cool : 2013-11-14 Binky Moon, LLC cool -// corsica : 2014-09-25 Collectivité Territoriale de Corse +// corsica : 2014-09-25 Collectivité de Corse corsica -// country : 2013-12-19 Top Level Domain Holdings Limited +// country : 2013-12-19 DotCountry LLC country -// coupon : 2015-02-26 Amazon EU S.à r.l. +// coupon : 2015-02-26 Amazon Registry Services, Inc. coupon -// coupons : 2015-03-26 Black Island, LLC +// coupons : 2015-03-26 Binky Moon, LLC coupons // courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD courses -// credit : 2014-03-20 Snow Shadow, LLC +// cpa : 2019-06-10 American Institute of Certified Public Accountants +cpa + +// credit : 2014-03-20 Binky Moon, LLC credit -// creditcard : 2014-03-20 Binky Frostbite, LLC +// creditcard : 2014-03-20 Binky Moon, LLC creditcard -// creditunion : 2015-01-22 CUNA Performance Resources, LLC +// creditunion : 2015-01-22 DotCooperation LLC creditunion // cricket : 2014-10-09 dot Cricket Limited @@ -7679,19 +7865,16 @@ crs // cruise : 2015-12-10 Viking River Cruises (Bermuda) Ltd. cruise -// cruises : 2013-12-05 Spring Way, LLC +// cruises : 2013-12-05 Binky Moon, LLC cruises -// csc : 2014-09-25 Alliance-One Services, Inc. -csc - -// cuisinella : 2014-04-03 SALM S.A.S. +// cuisinella : 2014-04-03 SCHMIDT GROUPE S.A.S. cuisinella // cymru : 2014-05-08 Nominet UK cymru -// cyou : 2015-01-22 Beijing Gamease Age Digital Technology Co., Ltd. +// cyou : 2015-01-22 ShortDot SA cyou // dabur : 2014-02-06 Dabur India Limited @@ -7700,7 +7883,7 @@ dabur // dad : 2014-01-23 Charleston Road Registry Inc. dad -// dance : 2013-10-24 United TLD Holdco Ltd. +// dance : 2013-10-24 Dog Beach, LLC dance // data : 2016-06-02 Dish DBS Corporation @@ -7709,7 +7892,7 @@ data // date : 2014-11-20 dot Date Limited date -// dating : 2013-12-05 Pine Fest, LLC +// dating : 2013-12-05 Binky Moon, LLC dating // datsun : 2014-03-27 NISSAN MOTOR CO., LTD. @@ -7721,22 +7904,22 @@ day // dclk : 2014-11-20 Charleston Road Registry Inc. dclk -// dds : 2015-05-07 Top Level Domain Holdings Limited +// dds : 2015-05-07 Registry Services, LLC dds -// deal : 2015-06-25 Amazon EU S.à r.l. +// deal : 2015-06-25 Amazon Registry Services, Inc. deal -// dealer : 2014-12-22 Dealer Dot Com, Inc. +// dealer : 2014-12-22 Intercap Registry Inc. dealer -// deals : 2014-05-22 Sand Sunset, LLC +// deals : 2014-05-22 Binky Moon, LLC deals -// degree : 2014-03-06 +// degree : 2014-03-06 Dog Beach, LLC degree -// delivery : 2014-09-11 Steel Station, LLC +// delivery : 2014-09-11 Binky Moon, LLC delivery // dell : 2014-10-24 Dell Inc. @@ -7748,19 +7931,19 @@ deloitte // delta : 2015-02-19 Delta Air Lines, Inc. delta -// democrat : 2013-10-24 United TLD Holdco Ltd. +// democrat : 2013-10-24 Dog Beach, LLC democrat -// dental : 2014-03-20 Tin Birch, LLC +// dental : 2014-03-20 Binky Moon, LLC dental -// dentist : 2014-03-20 +// dentist : 2014-03-20 Dog Beach, LLC dentist // desi : 2013-11-14 Desi Networks LLC desi -// design : 2014-11-07 Top Level Design, LLC +// design : 2014-11-07 Registry Services, LLC design // dev : 2014-10-16 Charleston Road Registry Inc. @@ -7769,22 +7952,22 @@ dev // dhl : 2015-07-23 Deutsche Post AG dhl -// diamonds : 2013-09-22 John Edge, LLC +// diamonds : 2013-09-22 Binky Moon, LLC diamonds -// diet : 2014-06-26 Uniregistry, Corp. +// diet : 2014-06-26 UNR Corp. diet -// digital : 2014-03-06 Dash Park, LLC +// digital : 2014-03-06 Binky Moon, LLC digital -// direct : 2014-04-10 Half Trail, LLC +// direct : 2014-04-10 Binky Moon, LLC direct -// directory : 2013-09-20 Extra Madison, LLC +// directory : 2013-09-20 Binky Moon, LLC directory -// discount : 2014-03-06 Holly Hill, LLC +// discount : 2014-03-06 Binky Moon, LLC discount // discover : 2015-07-23 Discover Financial Services @@ -7802,19 +7985,13 @@ dnp // docs : 2014-10-16 Charleston Road Registry Inc. docs -// doctor : 2016-06-02 Brice Trail, LLC +// doctor : 2016-06-02 Binky Moon, LLC doctor -// dodge : 2015-07-30 FCA US LLC. -dodge - -// dog : 2014-12-04 Koko Mill, LLC +// dog : 2014-12-04 Binky Moon, LLC dog -// doha : 2014-09-18 Communications Regulatory Authority (CRA) -doha - -// domains : 2013-10-17 Sugar Cross, LLC +// domains : 2013-10-17 Binky Moon, LLC domains // dot : 2015-05-21 Dish DBS Corporation @@ -7832,16 +8009,10 @@ dtv // dubai : 2015-01-01 Dubai Smart Government Department dubai -// duck : 2015-07-23 Johnson Shareholdings, Inc. -duck - // dunlop : 2015-07-02 The Goodyear Tire & Rubber Company dunlop -// duns : 2015-08-06 The Dun & Bradstreet Corporation -duns - -// dupont : 2015-06-25 E. I. du Pont de Nemours and Company +// dupont : 2015-06-25 DuPont Specialty Products USA, LLC dupont // durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry @@ -7850,7 +8021,7 @@ durban // dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG dvag -// dvr : 2016-05-26 Hughes Satellite Systems Corporation +// dvr : 2016-05-26 DISH Technologies L.L.C. dvr // earth : 2014-12-04 Interlink Co., Ltd. @@ -7865,34 +8036,31 @@ eco // edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. edeka -// education : 2013-11-07 Brice Way, LLC +// education : 2013-11-07 Binky Moon, LLC education -// email : 2013-10-31 Spring Madison, LLC +// email : 2013-10-31 Binky Moon, LLC email // emerck : 2014-04-03 Merck KGaA emerck -// energy : 2014-09-11 Binky Birch, LLC +// energy : 2014-09-11 Binky Moon, LLC energy -// engineer : 2014-03-06 United TLD Holdco Ltd. +// engineer : 2014-03-06 Dog Beach, LLC engineer -// engineering : 2014-03-06 Romeo Canyon +// engineering : 2014-03-06 Binky Moon, LLC engineering -// enterprises : 2013-09-20 Snow Oaks, LLC +// enterprises : 2013-09-20 Binky Moon, LLC enterprises -// epost : 2015-07-23 Deutsche Post AG -epost - // epson : 2014-12-04 Seiko Epson Corporation epson -// equipment : 2013-08-27 Corn Station, LLC +// equipment : 2013-08-27 Binky Moon, LLC equipment // ericsson : 2015-07-09 Telefonaktiebolaget L M Ericsson @@ -7904,12 +8072,9 @@ erni // esq : 2014-05-08 Charleston Road Registry Inc. esq -// estate : 2013-08-27 Trixy Park, LLC +// estate : 2013-08-27 Binky Moon, LLC estate -// esurance : 2015-07-23 Esurance Insurance Company -esurance - // etisalat : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat) etisalat @@ -7919,22 +8084,19 @@ eurovision // eus : 2013-12-12 Puntueus Fundazioa eus -// events : 2013-12-05 Pioneer Maple, LLC +// events : 2013-12-05 Binky Moon, LLC events -// everbank : 2014-05-15 EverBank -everbank - -// exchange : 2014-03-06 Spring Falls, LLC +// exchange : 2014-03-06 Binky Moon, LLC exchange -// expert : 2013-11-21 Magic Pass, LLC +// expert : 2013-11-21 Binky Moon, LLC expert -// exposed : 2013-12-05 Victor Beach, LLC +// exposed : 2013-12-05 Binky Moon, LLC exposed -// express : 2015-02-11 Sea Sunset, LLC +// express : 2015-02-11 Binky Moon, LLC express // extraspace : 2015-05-14 Extra Space Storage LLC @@ -7943,7 +8105,7 @@ extraspace // fage : 2014-12-18 Fage International S.A. fage -// fail : 2014-03-06 Atomic Pipe, LLC +// fail : 2014-03-06 Binky Moon, LLC fail // fairwinds : 2014-11-13 FairWinds Partners, LLC @@ -7952,25 +8114,25 @@ fairwinds // faith : 2014-11-20 dot Faith Limited faith -// family : 2015-04-02 +// family : 2015-04-02 Dog Beach, LLC family -// fan : 2014-03-06 +// fan : 2014-03-06 Dog Beach, LLC fan -// fans : 2014-11-07 Asiamix Digital Limited +// fans : 2014-11-07 ZDNS International Limited fans -// farm : 2013-11-07 Just Maple, LLC +// farm : 2013-11-07 Binky Moon, LLC farm // farmers : 2015-07-09 Farmers Insurance Exchange farmers -// fashion : 2014-07-03 Top Level Domain Holdings Limited +// fashion : 2014-07-03 Registry Services, LLC fashion -// fast : 2014-12-18 Amazon EU S.à r.l. +// fast : 2014-12-18 Amazon Registry Services, Inc. fast // fedex : 2015-08-06 Federal Express Corporation @@ -7991,7 +8153,7 @@ fiat // fidelity : 2015-07-30 Fidelity Brokerage Services LLC fidelity -// fido : 2015-08-06 Rogers Communications Partnership +// fido : 2015-08-06 Rogers Communications Canada Inc. fido // film : 2015-01-08 Motion Picture Domain Registry Pty Ltd @@ -8000,46 +8162,46 @@ film // final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br final -// finance : 2014-03-20 Cotton Cypress, LLC +// finance : 2014-03-20 Binky Moon, LLC finance -// financial : 2014-03-06 Just Cover, LLC +// financial : 2014-03-06 Binky Moon, LLC financial -// fire : 2015-06-25 Amazon EU S.à r.l. +// fire : 2015-06-25 Amazon Registry Services, Inc. fire -// firestone : 2014-12-18 Bridgestone Corporation +// firestone : 2014-12-18 Bridgestone Licensing Services, Inc firestone // firmdale : 2014-03-27 Firmdale Holdings Limited firmdale -// fish : 2013-12-12 Fox Woods, LLC +// fish : 2013-12-12 Binky Moon, LLC fish -// fishing : 2013-11-21 Top Level Domain Holdings Limited +// fishing : 2013-11-21 Registry Services, LLC fishing -// fit : 2014-11-07 Top Level Domain Holdings Limited +// fit : 2014-11-07 Registry Services, LLC fit -// fitness : 2014-03-06 Brice Orchard, LLC +// fitness : 2014-03-06 Binky Moon, LLC fitness -// flickr : 2015-04-02 Yahoo! Domain Services Inc. +// flickr : 2015-04-02 Flickr, Inc. flickr -// flights : 2013-12-05 Fox Station, LLC +// flights : 2013-12-05 Binky Moon, LLC flights // flir : 2015-07-23 FLIR Systems, Inc. flir -// florist : 2013-11-07 Half Cypress, LLC +// florist : 2013-11-07 Binky Moon, LLC florist -// flowers : 2014-10-09 Uniregistry, Corp. +// flowers : 2014-10-09 UNR Corp. flowers // fly : 2014-05-08 Charleston Road Registry Inc. @@ -8054,28 +8216,28 @@ food // foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc. foodnetwork -// football : 2014-12-18 Foggy Farms, LLC +// football : 2014-12-18 Binky Moon, LLC football // ford : 2014-11-13 Ford Motor Company ford -// forex : 2014-12-11 IG Group Holdings PLC +// forex : 2014-12-11 Dog Beach, LLC forex -// forsale : 2014-05-22 +// forsale : 2014-05-22 Dog Beach, LLC forsale // forum : 2015-04-02 Fegistry, LLC forum -// foundation : 2013-12-05 John Dale, LLC +// foundation : 2013-12-05 Binky Moon, LLC foundation // fox : 2015-09-11 FOX Registry, LLC fox -// free : 2015-12-10 Amazon EU S.à r.l. +// free : 2015-12-10 Amazon Registry Services, Inc. free // fresenius : 2015-07-30 Fresenius Immobilien-Verwaltungs-GmbH @@ -8099,28 +8261,25 @@ ftr // fujitsu : 2015-07-30 Fujitsu Limited fujitsu -// fujixerox : 2015-07-23 Xerox DNHC LLC -fujixerox - -// fun : 2016-01-14 +// fun : 2016-01-14 Radix FZC fun -// fund : 2014-03-20 John Castle, LLC +// fund : 2014-03-20 Binky Moon, LLC fund -// furniture : 2014-03-20 Lone Fields, LLC +// furniture : 2014-03-20 Binky Moon, LLC furniture -// futbol : 2013-09-20 +// futbol : 2013-09-20 Dog Beach, LLC futbol -// fyi : 2015-04-02 Silver Tigers, LLC +// fyi : 2015-04-02 Binky Moon, LLC fyi // gal : 2013-11-07 Asociación puntoGAL gal -// gallery : 2013-09-13 Sugar House, LLC +// gallery : 2013-09-13 Binky Moon, LLC gallery // gallo : 2015-06-11 Gallo Vineyards, Inc. @@ -8129,18 +8288,21 @@ gallo // gallup : 2015-02-19 Gallup, Inc. gallup -// game : 2015-05-28 Uniregistry, Corp. +// game : 2015-05-28 UNR Corp. game -// games : 2015-05-28 +// games : 2015-05-28 Dog Beach, LLC games // gap : 2015-07-31 The Gap, Inc. gap -// garden : 2014-06-26 Top Level Domain Holdings Limited +// garden : 2014-06-26 Registry Services, LLC garden +// gay : 2019-05-23 Top Level Design, LLC +gay + // gbiz : 2014-07-17 Charleston Road Registry Inc. gbiz @@ -8150,7 +8312,7 @@ gdn // gea : 2014-12-04 GEA Group Aktiengesellschaft gea -// gent : 2014-01-23 COMBELL GROUP NV/SA +// gent : 2014-01-23 COMBELL NV gent // genting : 2015-03-12 Resorts World Inc Pte. Ltd. @@ -8162,28 +8324,25 @@ george // ggee : 2014-01-09 GMO Internet, Inc. ggee -// gift : 2013-10-17 Uniregistry, Corp. +// gift : 2013-10-17 DotGift, LLC gift -// gifts : 2014-07-03 Goose Sky, LLC +// gifts : 2014-07-03 Binky Moon, LLC gifts -// gives : 2014-03-06 United TLD Holdco Ltd. +// gives : 2014-03-06 Dog Beach, LLC gives // giving : 2014-11-13 Giving Limited giving -// glade : 2015-07-23 Johnson Shareholdings, Inc. -glade - -// glass : 2013-11-07 Black Cover, LLC +// glass : 2013-11-07 Binky Moon, LLC glass // gle : 2014-07-24 Charleston Road Registry Inc. gle -// global : 2014-04-17 Dot GLOBAL AS +// global : 2014-04-17 Dot Global Domain Registry Limited global // globo : 2013-12-19 Globo Comunicação e Participações S.A @@ -8192,7 +8351,7 @@ globo // gmail : 2014-05-01 Charleston Road Registry Inc. gmail -// gmbh : 2016-01-29 Extra Dynamite, LLC +// gmbh : 2016-01-29 Binky Moon, LLC gmbh // gmo : 2014-01-09 GMO Internet, Inc. @@ -8204,21 +8363,18 @@ gmx // godaddy : 2015-07-23 Go Daddy East, LLC godaddy -// gold : 2015-01-22 June Edge, LLC +// gold : 2015-01-22 Binky Moon, LLC gold // goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. goldpoint -// golf : 2014-12-18 Lone falls, LLC +// golf : 2014-12-18 Binky Moon, LLC golf // goo : 2014-12-18 NTT Resonant Inc. goo -// goodhands : 2015-07-31 Allstate Fire and Casualty Insurance Company -goodhands - // goodyear : 2015-07-02 The Goodyear Tire & Rubber Company goodyear @@ -8231,28 +8387,28 @@ google // gop : 2014-01-16 Republican State Leadership Committee, Inc. gop -// got : 2014-12-18 Amazon EU S.à r.l. +// got : 2014-12-18 Amazon Registry Services, Inc. got // grainger : 2015-05-07 Grainger Registry Services, LLC grainger -// graphics : 2013-09-13 Over Madison, LLC +// graphics : 2013-09-13 Binky Moon, LLC graphics -// gratis : 2014-03-20 Pioneer Tigers, LLC +// gratis : 2014-03-20 Binky Moon, LLC gratis // green : 2014-05-08 Afilias Limited green -// gripe : 2014-03-06 Corn Sunset, LLC +// gripe : 2014-03-06 Binky Moon, LLC gripe // grocery : 2016-06-16 Wal-Mart Stores, Inc. grocery -// group : 2014-08-15 Romeo Town, LLC +// group : 2014-08-15 Binky Moon, LLC group // guardian : 2015-07-30 The Guardian Life Insurance Company of America @@ -8264,16 +8420,16 @@ gucci // guge : 2014-08-28 Charleston Road Registry Inc. guge -// guide : 2013-09-13 Snow Moon, LLC +// guide : 2013-09-13 Binky Moon, LLC guide -// guitars : 2013-11-14 Uniregistry, Corp. +// guitars : 2013-11-14 UNR Corp. guitars -// guru : 2013-08-27 Pioneer Cypress, LLC +// guru : 2013-08-27 Binky Moon, LLC guru -// hair : 2015-12-03 L'Oréal +// hair : 2015-12-03 XYZ.COM LLC hair // hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH @@ -8282,7 +8438,7 @@ hamburg // hangout : 2014-11-13 Charleston Road Registry Inc. hangout -// haus : 2013-12-05 +// haus : 2013-12-05 Dog Beach, LLC haus // hbo : 2015-07-30 HBO Registry Services, Inc. @@ -8297,10 +8453,10 @@ hdfcbank // health : 2015-02-11 DotHealth, LLC health -// healthcare : 2014-06-12 Silver Glen, LLC +// healthcare : 2014-06-12 Binky Moon, LLC healthcare -// help : 2014-06-26 Uniregistry, Corp. +// help : 2014-06-26 UNR Corp. help // helsinki : 2015-02-05 City of Helsinki @@ -8315,7 +8471,7 @@ hermes // hgtv : 2015-07-02 Lifestyle Domain Holdings, Inc. hgtv -// hiphop : 2014-03-06 Uniregistry, Corp. +// hiphop : 2014-03-06 UNR Corp. hiphop // hisamitsu : 2015-07-16 Hisamitsu Pharmaceutical Co.,Inc. @@ -8324,28 +8480,28 @@ hisamitsu // hitachi : 2014-10-31 Hitachi, Ltd. hitachi -// hiv : 2014-03-13 +// hiv : 2014-03-13 UNR Corp. hiv // hkt : 2015-05-14 PCCW-HKT DataCom Services Limited hkt -// hockey : 2015-03-19 Half Willow, LLC +// hockey : 2015-03-19 Binky Moon, LLC hockey -// holdings : 2013-08-27 John Madison, LLC +// holdings : 2013-08-27 Binky Moon, LLC holdings -// holiday : 2013-11-07 Goose Woods, LLC +// holiday : 2013-11-07 Binky Moon, LLC holiday -// homedepot : 2015-04-02 Homer TLC, Inc. +// homedepot : 2015-04-02 Home Depot Product Authority, LLC homedepot // homegoods : 2015-07-16 The TJX Companies, Inc. homegoods -// homes : 2014-01-09 DERHomes, LLC +// homes : 2014-01-09 XYZ.COM LLC homes // homesense : 2015-07-16 The TJX Companies, Inc. @@ -8354,22 +8510,19 @@ homesense // honda : 2014-12-18 Honda Motor Co., Ltd. honda -// honeywell : 2015-07-23 Honeywell GTLD LLC -honeywell - -// horse : 2013-11-21 Top Level Domain Holdings Limited +// horse : 2013-11-21 Registry Services, LLC horse -// hospital : 2016-10-20 Ruby Pike, LLC +// hospital : 2016-10-20 Binky Moon, LLC hospital -// host : 2014-04-17 DotHost Inc. +// host : 2014-04-17 Radix FZC host -// hosting : 2014-05-29 Uniregistry, Corp. +// hosting : 2014-05-29 UNR Corp. hosting -// hot : 2015-08-27 Amazon EU S.à r.l. +// hot : 2015-08-27 Amazon Registry Services, Inc. hot // hoteles : 2015-03-05 Travel Reservations SRL @@ -8381,13 +8534,13 @@ hotels // hotmail : 2014-12-18 Microsoft Corporation hotmail -// house : 2013-11-07 Sugar Park, LLC +// house : 2013-11-07 Binky Moon, LLC house // how : 2014-01-23 Charleston Road Registry Inc. how -// hsbc : 2014-10-24 HSBC Holdings PLC +// hsbc : 2014-10-24 HSBC Global Services (UK) Limited hsbc // hughes : 2015-07-30 Hughes Satellite Systems Corporation @@ -8408,7 +8561,7 @@ icbc // ice : 2014-10-30 IntercontinentalExchange, Inc. ice -// icu : 2015-01-08 One.com A/S +// icu : 2015-01-08 ShortDot SA icu // ieee : 2015-07-23 IEEE Global LLC @@ -8423,16 +8576,19 @@ ikano // imamat : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) imamat -// imdb : 2015-06-25 Amazon EU S.à r.l. +// imdb : 2015-06-25 Amazon Registry Services, Inc. imdb -// immo : 2014-07-10 Auburn Bloom, LLC +// immo : 2014-07-10 Binky Moon, LLC immo -// immobilien : 2013-11-07 United TLD Holdco Ltd. +// immobilien : 2013-11-07 Dog Beach, LLC immobilien -// industries : 2013-12-05 Outer House, LLC +// inc : 2018-03-10 Intercap Registry Inc. +inc + +// industries : 2013-12-05 Binky Moon, LLC industries // infiniti : 2014-03-27 NISSAN MOTOR CO., LTD. @@ -8444,36 +8600,30 @@ ing // ink : 2013-12-05 Top Level Design, LLC ink -// institute : 2013-11-07 Outer Maple, LLC +// institute : 2013-11-07 Binky Moon, LLC institute // insurance : 2015-02-19 fTLD Registry Services LLC insurance -// insure : 2014-03-20 Pioneer Willow, LLC +// insure : 2014-03-20 Binky Moon, LLC insure -// intel : 2015-08-06 Intel Corporation -intel - -// international : 2013-11-07 Wild Way, LLC +// international : 2013-11-07 Binky Moon, LLC international // intuit : 2015-07-30 Intuit Administrative Services, Inc. intuit -// investments : 2014-03-20 Holly Glen, LLC +// investments : 2014-03-20 Binky Moon, LLC investments // ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. ipiranga -// irish : 2014-08-07 Dot-Irish LLC +// irish : 2014-08-07 Binky Moon, LLC irish -// iselect : 2015-02-11 iSelect Ltd -iselect - // ismaili : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation) ismaili @@ -8489,12 +8639,6 @@ itau // itv : 2015-07-09 ITV Services Limited itv -// iveco : 2015-09-03 CNH Industrial N.V. -iveco - -// iwc : 2014-06-23 Richemont DNS Inc. -iwc - // jaguar : 2014-11-13 Jaguar Land Rover Ltd jaguar @@ -8504,24 +8648,18 @@ java // jcb : 2014-11-20 JCB Co., Ltd. jcb -// jcp : 2015-04-23 JCP Media, Inc. -jcp - // jeep : 2015-07-30 FCA US LLC. jeep -// jetzt : 2014-01-09 +// jetzt : 2014-01-09 Binky Moon, LLC jetzt -// jewelry : 2015-03-05 Wild Bloom, LLC +// jewelry : 2015-03-05 Binky Moon, LLC jewelry -// jio : 2015-04-02 Affinity Names, Inc. +// jio : 2015-04-02 Reliance Industries Limited jio -// jlc : 2014-12-04 Richemont DNS Inc. -jlc - // jll : 2015-04-02 Jones Lang LaSalle Incorporated jll @@ -8534,25 +8672,25 @@ jnj // joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry joburg -// jot : 2014-12-18 Amazon EU S.à r.l. +// jot : 2014-12-18 Amazon Registry Services, Inc. jot -// joy : 2014-12-18 Amazon EU S.à r.l. +// joy : 2014-12-18 Amazon Registry Services, Inc. joy -// jpmorgan : 2015-04-30 JPMorgan Chase & Co. +// jpmorgan : 2015-04-30 JPMorgan Chase Bank, National Association jpmorgan // jprs : 2014-09-18 Japan Registry Services Co., Ltd. jprs -// juegos : 2014-03-20 Uniregistry, Corp. +// juegos : 2014-03-20 UNR Corp. juegos // juniper : 2015-07-30 JUNIPER NETWORKS, INC. juniper -// kaufen : 2013-11-07 United TLD Holdco Ltd. +// kaufen : 2013-11-07 Dog Beach, LLC kaufen // kddi : 2014-09-12 KDDI CORPORATION @@ -8573,22 +8711,25 @@ kfh // kia : 2015-07-09 KIA MOTORS CORPORATION kia +// kids : 2021-08-13 DotKids Foundation Limited +kids + // kim : 2013-09-23 Afilias Limited kim // kinder : 2014-11-07 Ferrero Trading Lux S.A. kinder -// kindle : 2015-06-25 Amazon EU S.à r.l. +// kindle : 2015-06-25 Amazon Registry Services, Inc. kindle -// kitchen : 2013-09-20 Just Goodbye, LLC +// kitchen : 2013-09-20 Binky Moon, LLC kitchen // kiwi : 2013-09-20 DOT KIWI LIMITED kiwi -// koeln : 2014-01-09 NetCologne Gesellschaft für Telekommunikation mbH +// koeln : 2014-01-09 dotKoeln GmbH koeln // komatsu : 2015-01-08 Komatsu Ltd. @@ -8615,12 +8756,9 @@ kuokgroup // kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen kyoto -// lacaixa : 2014-01-09 CAIXA D'ESTALVIS I PENSIONS DE BARCELONA +// lacaixa : 2014-01-09 Fundación Bancaria Caixa d’Estalvis i Pensions de Barcelona, “la Caixa” lacaixa -// ladbrokes : 2015-08-06 LADBROKES INTERNATIONAL PLC -ladbrokes - // lamborghini : 2015-06-04 Automobili Lamborghini S.p.A. lamborghini @@ -8633,10 +8771,7 @@ lancaster // lancia : 2015-07-31 Fiat Chrysler Automobiles N.V. lancia -// lancome : 2015-07-23 L'Oréal -lancome - -// land : 2013-09-10 Pine Moon, LLC +// land : 2013-09-10 Binky Moon, LLC land // landrover : 2014-11-13 Jaguar Land Rover Ltd @@ -8657,16 +8792,16 @@ latino // latrobe : 2014-06-16 La Trobe University latrobe -// law : 2015-01-22 Minds + Machines Group Limited +// law : 2015-01-22 Registry Services, LLC law -// lawyer : 2014-03-20 +// lawyer : 2014-03-20 Dog Beach, LLC lawyer -// lds : 2014-03-20 IRI Domain Management, LLC ("Applicant") +// lds : 2014-03-20 IRI Domain Management, LLC lds -// lease : 2014-03-06 Victor Trail, LLC +// lease : 2014-03-06 Binky Moon, LLC lease // leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc @@ -8675,7 +8810,7 @@ leclerc // lefrak : 2015-07-16 LeFrak Organization, Inc. lefrak -// legal : 2014-10-16 Blue Falls, LLC +// legal : 2014-10-16 Binky Moon, LLC legal // lego : 2015-07-16 LEGO Juris A/S @@ -8687,13 +8822,10 @@ lexus // lgbt : 2014-05-08 Afilias Limited lgbt -// liaison : 2014-10-02 Liaison Technologies, Incorporated -liaison - // lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG lidl -// life : 2014-02-06 Trixy Oaks, LLC +// life : 2014-02-06 Binky Moon, LLC life // lifeinsurance : 2015-01-15 American Council of Life Insurers @@ -8702,19 +8834,19 @@ lifeinsurance // lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc. lifestyle -// lighting : 2013-08-27 John McCook, LLC +// lighting : 2013-08-27 Binky Moon, LLC lighting -// like : 2014-12-18 Amazon EU S.à r.l. +// like : 2014-12-18 Amazon Registry Services, Inc. like // lilly : 2015-07-31 Eli Lilly and Company lilly -// limited : 2014-03-06 Big Fest, LLC +// limited : 2014-03-06 Binky Moon, LLC limited -// limo : 2013-10-17 Hidden Frostbite, LLC +// limo : 2013-10-17 Binky Moon, LLC limo // lincoln : 2014-11-13 Ford Motor Company @@ -8723,25 +8855,28 @@ lincoln // linde : 2014-12-04 Linde Aktiengesellschaft linde -// link : 2013-11-14 Uniregistry, Corp. +// link : 2013-11-14 UNR Corp. link // lipsy : 2015-06-25 Lipsy Ltd lipsy -// live : 2014-12-04 +// live : 2014-12-04 Dog Beach, LLC live // living : 2015-07-30 Lifestyle Domain Holdings, Inc. living -// lixil : 2015-03-19 LIXIL Group Corporation -lixil +// llc : 2017-12-14 Afilias Limited +llc + +// llp : 2019-08-26 UNR Corp. +llp // loan : 2014-11-20 dot Loan Limited loan -// loans : 2014-03-20 June Woods, LLC +// loans : 2014-03-20 Binky Moon, LLC loans // locker : 2015-06-04 Dish DBS Corporation @@ -8753,7 +8888,7 @@ locus // loft : 2015-07-30 Annco, Inc. loft -// lol : 2015-01-30 Uniregistry, Corp. +// lol : 2015-01-30 UNR Corp. lol // london : 2013-11-14 Dot London Domains Limited @@ -8774,19 +8909,16 @@ lpl // lplfinancial : 2015-07-30 LPL Holdings, Inc. lplfinancial -// ltd : 2014-09-25 Over Corner, LLC +// ltd : 2014-09-25 Binky Moon, LLC ltd -// ltda : 2014-04-17 DOMAIN ROBOT SERVICOS DE HOSPEDAGEM NA INTERNET LTDA +// ltda : 2014-04-17 InterNetX, Corp ltda // lundbeck : 2015-08-06 H. Lundbeck A/S lundbeck -// lupin : 2014-11-07 LUPIN LIMITED -lupin - -// luxe : 2014-01-09 Top Level Domain Holdings Limited +// luxe : 2014-01-09 Registry Services, LLC luxe // luxury : 2013-10-17 Luxury Partners, LLC @@ -8801,16 +8933,16 @@ madrid // maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF) maif -// maison : 2013-12-05 Victor Frostbite, LLC +// maison : 2013-12-05 Binky Moon, LLC maison -// makeup : 2015-01-15 L'Oréal +// makeup : 2015-01-15 XYZ.COM LLC makeup // man : 2014-12-04 MAN SE man -// management : 2013-11-07 John Goodbye, LLC +// management : 2013-11-07 Binky Moon, LLC management // mango : 2013-10-24 PUNTO FA S.L. @@ -8819,13 +8951,13 @@ mango // map : 2016-06-09 Charleston Road Registry Inc. map -// market : 2014-03-06 +// market : 2014-03-06 Dog Beach, LLC market -// marketing : 2013-11-07 Fern Pass, LLC +// marketing : 2013-11-07 Binky Moon, LLC marketing -// markets : 2014-12-11 IG Group Holdings PLC +// markets : 2014-12-11 Dog Beach, LLC markets // marriott : 2014-10-09 Marriott Worldwide Corporation @@ -8840,7 +8972,7 @@ maserati // mattel : 2015-08-06 Mattel Sites, Inc. mattel -// mba : 2015-04-02 Lone Hollow, LLC +// mba : 2015-04-02 Binky Moon, LLC mba // mckinsey : 2015-07-31 McKinsey Holdings, Inc. @@ -8849,10 +8981,10 @@ mckinsey // med : 2015-08-06 Medistry LLC med -// media : 2014-03-06 Grand Glen, LLC +// media : 2014-03-06 Binky Moon, LLC media -// meet : 2014-01-16 +// meet : 2014-01-16 Charleston Road Registry Inc. meet // melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation @@ -8867,19 +8999,13 @@ memorial // men : 2015-02-26 Exclusive Registry Limited men -// menu : 2013-09-11 Wedding TLD2, LLC +// menu : 2013-09-11 Dot Menu Registry, LLC menu -// meo : 2014-11-07 PT Comunicacoes S.A. -meo - // merckmsd : 2016-07-14 MSD Registry Holdings, Inc. merckmsd -// metlife : 2015-05-07 MetLife Services and Solutions, LLC -metlife - -// miami : 2013-12-19 Top Level Domain Holdings Limited +// miami : 2013-12-19 Registry Services, LLC miami // microsoft : 2014-12-18 Microsoft Corporation @@ -8909,88 +9035,73 @@ mma // mobile : 2016-06-02 Dish DBS Corporation mobile -// mobily : 2014-12-18 GreenTech Consultancy Company W.L.L. -mobily - -// moda : 2013-11-07 United TLD Holdco Ltd. +// moda : 2013-11-07 Dog Beach, LLC moda // moe : 2013-11-13 Interlink Co., Ltd. moe -// moi : 2014-12-18 Amazon EU S.à r.l. +// moi : 2014-12-18 Amazon Registry Services, Inc. moi -// mom : 2015-04-16 Uniregistry, Corp. +// mom : 2015-04-16 UNR Corp. mom // monash : 2013-09-30 Monash University monash -// money : 2014-10-16 Outer McCook, LLC +// money : 2014-10-16 Binky Moon, LLC money -// monster : 2015-09-11 Monster Worldwide, Inc. +// monster : 2015-09-11 XYZ.COM LLC monster -// mopar : 2015-07-30 FCA US LLC. -mopar - -// mormon : 2013-12-05 IRI Domain Management, LLC ("Applicant") +// mormon : 2013-12-05 IRI Domain Management, LLC mormon -// mortgage : 2014-03-20 +// mortgage : 2014-03-20 Dog Beach, LLC mortgage // moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) moscow -// moto : 2015-06-04 +// moto : 2015-06-04 Motorola Trademark Holdings, LLC moto -// motorcycles : 2014-01-09 DERMotorcycles, LLC +// motorcycles : 2014-01-09 XYZ.COM LLC motorcycles // mov : 2014-01-30 Charleston Road Registry Inc. mov -// movie : 2015-02-05 New Frostbite, LLC +// movie : 2015-02-05 Binky Moon, LLC movie -// movistar : 2014-10-16 Telefónica S.A. -movistar - // msd : 2015-07-23 MSD Registry Holdings, Inc. msd // mtn : 2014-12-04 MTN Dubai Limited mtn -// mtpc : 2014-11-20 Mitsubishi Tanabe Pharma Corporation -mtpc - // mtr : 2015-03-12 MTR Corporation Limited mtr +// music : 2021-05-04 DotMusic Limited +music + // mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC mutual // nab : 2015-08-20 National Australia Bank Limited nab -// nadex : 2014-12-11 IG Group Holdings PLC -nadex - // nagoya : 2013-10-24 GMO Registry, Inc. nagoya -// nationwide : 2015-07-23 Nationwide Mutual Insurance Company -nationwide - // natura : 2015-03-12 NATURA COSMÉTICOS S.A. natura -// navy : 2014-03-06 United TLD Holdco Ltd. +// navy : 2014-03-06 Dog Beach, LLC navy // nba : 2015-07-31 NBA REGISTRY, LLC @@ -9005,7 +9116,7 @@ netbank // netflix : 2015-06-18 Netflix, Inc. netflix -// network : 2013-11-14 Trixy Manor, LLC +// network : 2013-11-14 Binky Moon, LLC network // neustar : 2013-12-05 NeuStar, Inc. @@ -9014,10 +9125,7 @@ neustar // new : 2014-01-30 Charleston Road Registry Inc. new -// newholland : 2015-09-03 CNH Industrial N.V. -newholland - -// news : 2014-12-18 +// news : 2014-12-18 Dog Beach, LLC news // next : 2015-06-18 Next plc @@ -9047,7 +9155,7 @@ nike // nikon : 2015-05-21 NIKON CORPORATION nikon -// ninja : 2013-11-07 United TLD Holdco Ltd. +// ninja : 2013-11-07 Dog Beach, LLC ninja // nissan : 2014-03-27 NISSAN MOTOR CO., LTD. @@ -9062,10 +9170,10 @@ nokia // northwesternmutual : 2015-06-18 Northwestern Mutual Registry, LLC northwesternmutual -// norton : 2014-12-04 Symantec Corporation +// norton : 2014-12-04 NortonLifeLock Inc. norton -// now : 2015-06-25 Amazon EU S.à r.l. +// now : 2015-06-25 Amazon Registry Services, Inc. now // nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. @@ -9089,16 +9197,13 @@ nyc // obi : 2014-09-25 OBI Group Holding SE & Co. KGaA obi -// observer : 2015-04-30 +// observer : 2015-04-30 Dog Beach, LLC observer -// off : 2015-07-23 Johnson Shareholdings, Inc. -off - // office : 2015-03-12 Microsoft Corporation office -// okinawa : 2013-12-05 BusinessRalliart Inc. +// okinawa : 2013-12-05 BRregistry, Inc. okinawa // olayan : 2015-05-14 Crescent Holding GmbH @@ -9122,16 +9227,13 @@ one // ong : 2014-03-06 Public Interest Registry ong -// onl : 2013-09-16 I-Registry Ltd. +// onl : 2013-09-16 iRegistry GmbH onl -// online : 2015-01-15 DotOnline Inc. +// online : 2015-01-15 Radix FZC online -// onyourside : 2015-07-23 Nationwide Mutual Insurance Company -onyourside - -// ooo : 2014-01-09 INFIBEAM INCORPORATION LIMITED +// ooo : 2014-01-09 INFIBEAM AVENUES LIMITED ooo // open : 2015-07-31 American Express Travel Related Services Company, Inc. @@ -9149,7 +9251,7 @@ organic // origins : 2015-10-01 The Estée Lauder Companies Inc. origins -// osaka : 2014-09-04 Interlink Co., Ltd. +// osaka : 2014-09-04 Osaka Registry Co., Ltd. osaka // otsuka : 2013-10-11 Otsuka Holdings Co., Ltd. @@ -9158,7 +9260,7 @@ otsuka // ott : 2015-06-04 Dish DBS Corporation ott -// ovh : 2014-01-16 OVH SAS +// ovh : 2014-01-16 MédiaBC ovh // page : 2014-12-04 Charleston Road Registry Inc. @@ -9167,19 +9269,16 @@ page // panasonic : 2015-07-30 Panasonic Corporation panasonic -// panerai : 2014-11-07 Richemont DNS Inc. -panerai - // paris : 2014-01-30 City of Paris paris // pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. pars -// partners : 2013-12-05 Magic Glen, LLC +// partners : 2013-12-05 Binky Moon, LLC partners -// parts : 2013-12-05 Sea Goodbye, LLC +// parts : 2013-12-05 Binky Moon, LLC parts // party : 2014-09-11 Blue Sky Registry Limited @@ -9188,13 +9287,13 @@ party // passagens : 2015-03-05 Travel Reservations SRL passagens -// pay : 2015-08-27 Amazon EU S.à r.l. +// pay : 2015-08-27 Amazon Registry Services, Inc. pay // pccw : 2015-05-14 PCCW Enterprises Limited pccw -// pet : 2015-05-07 Afilias plc +// pet : 2015-05-07 Afilias Limited pet // pfizer : 2015-09-11 Pfizer Inc. @@ -9212,34 +9311,31 @@ philips // phone : 2016-06-02 Dish DBS Corporation phone -// photo : 2013-11-14 Uniregistry, Corp. +// photo : 2013-11-14 UNR Corp. photo -// photography : 2013-09-20 Sugar Glen, LLC +// photography : 2013-09-20 Binky Moon, LLC photography -// photos : 2013-10-17 Sea Corner, LLC +// photos : 2013-10-17 Binky Moon, LLC photos // physio : 2014-05-01 PhysBiz Pty Ltd physio -// piaget : 2014-10-16 Richemont DNS Inc. -piaget - -// pics : 2013-11-14 Uniregistry, Corp. +// pics : 2013-11-14 UNR Corp. pics // pictet : 2014-06-26 Pictet Europe S.A. pictet -// pictures : 2014-03-06 Foggy Sky, LLC +// pictures : 2014-03-06 Binky Moon, LLC pictures // pid : 2015-01-08 Top Level Spectrum, Inc. pid -// pin : 2014-12-18 Amazon EU S.à r.l. +// pin : 2014-12-18 Amazon Registry Services, Inc. pin // ping : 2015-06-11 Ping Registry Provider, Inc. @@ -9251,22 +9347,22 @@ pink // pioneer : 2015-07-16 Pioneer Corporation pioneer -// pizza : 2014-06-26 Foggy Moon, LLC +// pizza : 2014-06-26 Binky Moon, LLC pizza -// place : 2014-04-24 Snow Galley, LLC +// place : 2014-04-24 Binky Moon, LLC place // play : 2015-03-05 Charleston Road Registry Inc. play -// playstation : 2015-07-02 Sony Computer Entertainment Inc. +// playstation : 2015-07-02 Sony Interactive Entertainment Inc. playstation -// plumbing : 2013-09-10 Spring Tigers, LLC +// plumbing : 2013-09-10 Binky Moon, LLC plumbing -// plus : 2015-02-05 Sugar Mill, LLC +// plus : 2015-02-05 Binky Moon, LLC plus // pnc : 2015-07-02 PNC Domain Co., LLC @@ -9275,7 +9371,7 @@ pnc // pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG pohl -// poker : 2014-07-03 Afilias Domains No. 5 Limited +// poker : 2014-07-03 Afilias Limited poker // politie : 2015-08-20 Politie Nederland @@ -9290,16 +9386,16 @@ pramerica // praxi : 2013-12-05 Praxi S.p.A. praxi -// press : 2014-04-03 DotPress Inc. +// press : 2014-04-03 Radix FZC press -// prime : 2015-06-25 Amazon EU S.à r.l. +// prime : 2015-06-25 Amazon Registry Services, Inc. prime // prod : 2014-01-23 Charleston Road Registry Inc. prod -// productions : 2013-12-05 Magic Birch, LLC +// productions : 2013-12-05 Binky Moon, LLC productions // prof : 2014-07-24 Charleston Road Registry Inc. @@ -9308,16 +9404,16 @@ prof // progressive : 2015-07-23 Progressive Casualty Insurance Company progressive -// promo : 2014-12-18 +// promo : 2014-12-18 Afilias Limited promo -// properties : 2013-12-05 Big Pass, LLC +// properties : 2013-12-05 Binky Moon, LLC properties -// property : 2014-05-22 Uniregistry, Corp. +// property : 2014-05-22 UNR Corp. property -// protection : 2015-04-23 +// protection : 2015-04-23 XYZ.COM LLC protection // pru : 2015-07-30 Prudential Financial, Inc. @@ -9326,7 +9422,7 @@ pru // prudential : 2015-07-30 Prudential Financial, Inc. prudential -// pub : 2013-12-12 United TLD Holdco Ltd. +// pub : 2013-12-12 Dog Beach, LLC pub // pwc : 2015-10-29 PricewaterhouseCoopers LLP @@ -9338,22 +9434,16 @@ qpon // quebec : 2013-12-19 PointQuébec Inc quebec -// quest : 2015-03-26 Quest ION Limited +// quest : 2015-03-26 XYZ.COM LLC quest -// qvc : 2015-07-30 QVC, Inc. -qvc - // racing : 2014-12-04 Premier Registry Limited racing // radio : 2016-07-21 European Broadcasting Union (EBU) radio -// raid : 2015-07-23 Johnson Shareholdings, Inc. -raid - -// read : 2014-12-18 Amazon EU S.à r.l. +// read : 2014-12-18 Amazon Registry Services, Inc. read // realestate : 2015-09-11 dotRealEstate LLC @@ -9362,10 +9452,10 @@ realestate // realtor : 2014-05-29 Real Estate Domains LLC realtor -// realty : 2015-03-19 Fegistry, LLC +// realty : 2015-03-19 Dog Beach, LLC realty -// recipes : 2013-10-17 Grand Island, LLC +// recipes : 2013-10-17 Binky Moon, LLC recipes // red : 2013-11-07 Afilias Limited @@ -9377,13 +9467,13 @@ redstone // redumbrella : 2015-03-26 Travelers TLD, LLC redumbrella -// rehab : 2014-03-06 United TLD Holdco Ltd. +// rehab : 2014-03-06 Dog Beach, LLC rehab -// reise : 2014-03-13 +// reise : 2014-03-13 Binky Moon, LLC reise -// reisen : 2014-03-06 New Cypress, LLC +// reisen : 2014-03-06 Binky Moon, LLC reisen // reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc. @@ -9392,40 +9482,40 @@ reit // reliance : 2015-04-02 Reliance Industries Limited reliance -// ren : 2013-12-12 Beijing Qianxiang Wangjing Technology Development Co., Ltd. +// ren : 2013-12-12 ZDNS International Limited ren -// rent : 2014-12-04 DERRent, LLC +// rent : 2014-12-04 XYZ.COM LLC rent -// rentals : 2013-12-05 Big Hollow,LLC +// rentals : 2013-12-05 Binky Moon, LLC rentals -// repair : 2013-11-07 Lone Sunset, LLC +// repair : 2013-11-07 Binky Moon, LLC repair -// report : 2013-12-05 Binky Glen, LLC +// report : 2013-12-05 Binky Moon, LLC report -// republican : 2014-03-20 United TLD Holdco Ltd. +// republican : 2014-03-20 Dog Beach, LLC republican // rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable rest -// restaurant : 2014-07-03 Snow Avenue, LLC +// restaurant : 2014-07-03 Binky Moon, LLC restaurant // review : 2014-11-20 dot Review Limited review -// reviews : 2013-09-13 +// reviews : 2013-09-13 Dog Beach, LLC reviews // rexroth : 2015-06-18 Robert Bosch GMBH rexroth -// rich : 2013-11-21 I-Registry Ltd. +// rich : 2013-11-21 iRegistry GmbH rich // richardli : 2015-05-14 Pacific Century Asset Management (HK) Limited @@ -9434,34 +9524,28 @@ richardli // ricoh : 2014-11-20 Ricoh Company, Ltd. ricoh -// rightathome : 2015-07-23 Johnson Shareholdings, Inc. -rightathome - // ril : 2015-04-02 Reliance Industries Limited ril // rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO rio -// rip : 2014-07-10 United TLD Holdco Ltd. +// rip : 2014-07-10 Dog Beach, LLC rip -// rmit : 2015-11-19 Royal Melbourne Institute of Technology -rmit - // rocher : 2014-12-18 Ferrero Trading Lux S.A. rocher -// rocks : 2013-11-14 +// rocks : 2013-11-14 Dog Beach, LLC rocks -// rodeo : 2013-12-19 Top Level Domain Holdings Limited +// rodeo : 2013-12-19 Registry Services, LLC rodeo -// rogers : 2015-08-06 Rogers Communications Partnership +// rogers : 2015-08-06 Rogers Communications Canada Inc. rogers -// room : 2014-12-18 Amazon EU S.à r.l. +// room : 2014-12-18 Amazon Registry Services, Inc. room // rsvp : 2014-05-08 Charleston Road Registry Inc. @@ -9473,19 +9557,19 @@ rugby // ruhr : 2013-10-02 regiodot GmbH & Co. KG ruhr -// run : 2015-03-19 Snow Park, LLC +// run : 2015-03-19 Binky Moon, LLC run // rwe : 2015-04-02 RWE AG rwe -// ryukyu : 2014-01-09 BusinessRalliart Inc. +// ryukyu : 2014-01-09 BRregistry, Inc. ryukyu // saarland : 2013-12-12 dotSaarland GmbH saarland -// safe : 2014-12-18 Amazon EU S.à r.l. +// safe : 2014-12-18 Amazon Registry Services, Inc. safe // safety : 2015-01-08 Safety Registry Services, LLC. @@ -9494,10 +9578,10 @@ safety // sakura : 2014-12-18 SAKURA Internet Inc. sakura -// sale : 2014-10-16 +// sale : 2014-10-16 Dog Beach, LLC sale -// salon : 2014-12-11 Outer Orchard, LLC +// salon : 2014-12-11 Binky Moon, LLC salon // samsclub : 2015-07-31 Wal-Mart Stores, Inc. @@ -9518,16 +9602,13 @@ sanofi // sap : 2014-03-27 SAP AG sap -// sapo : 2014-11-07 PT Comunicacoes S.A. -sapo - -// sarl : 2014-07-03 Delta Orchard, LLC +// sarl : 2014-07-03 Binky Moon, LLC sarl // sas : 2015-04-02 Research IP LLC sas -// save : 2015-06-25 Amazon EU S.à r.l. +// save : 2015-06-25 Amazon Registry Services, Inc. save // saxo : 2014-10-31 Saxo Bank A/S @@ -9536,7 +9617,7 @@ saxo // sbi : 2015-03-12 STATE BANK OF INDIA sbi -// sbs : 2014-11-07 SPECIAL BROADCASTING SERVICE CORPORATION +// sbs : 2014-11-07 ShortDot SA sbs // sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ) @@ -9548,16 +9629,16 @@ scb // schaeffler : 2015-08-06 Schaeffler Technologies AG & Co. KG schaeffler -// schmidt : 2014-04-03 SALM S.A.S. +// schmidt : 2014-04-03 SCHMIDT GROUPE S.A.S. schmidt // scholarships : 2014-04-24 Scholarships.com, LLC scholarships -// school : 2014-12-18 Little Galley, LLC +// school : 2014-12-18 Binky Moon, LLC school -// schule : 2014-03-06 Outer Moon, LLC +// schule : 2014-03-06 Binky Moon, LLC schule // schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG @@ -9566,12 +9647,6 @@ schwarz // science : 2014-09-11 dot Science Limited science -// scjohnson : 2015-07-23 Johnson Shareholdings, Inc. -scjohnson - -// scor : 2014-10-31 SCOR SE -scor - // scot : 2014-01-23 Dot Scot Registry Limited scot @@ -9581,22 +9656,22 @@ search // seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) seat -// secure : 2015-08-27 Amazon EU S.à r.l. +// secure : 2015-08-27 Amazon Registry Services, Inc. secure -// security : 2015-05-14 +// security : 2015-05-14 XYZ.COM LLC security // seek : 2014-12-04 Seek Limited seek -// select : 2015-10-08 iSelect Ltd +// select : 2015-10-08 Registry Services, LLC select // sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A. sener -// services : 2014-02-27 Fox Castle, LLC +// services : 2014-02-27 Binky Moon, LLC services // ses : 2015-07-23 SES @@ -9611,7 +9686,7 @@ sew // sex : 2014-11-13 ICM Registry SX LLC sex -// sexy : 2013-09-11 Uniregistry, Corp. +// sexy : 2013-09-11 UNR Corp. sexy // sfr : 2015-08-13 Societe Francaise du Radiotelephone - SFR @@ -9635,85 +9710,82 @@ shia // shiksha : 2013-11-14 Afilias Limited shiksha -// shoes : 2013-10-02 Binky Galley, LLC +// shoes : 2013-10-02 Binky Moon, LLC shoes // shop : 2016-04-08 GMO Registry, Inc. shop -// shopping : 2016-03-31 +// shopping : 2016-03-31 Binky Moon, LLC shopping -// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +// shouji : 2015-01-08 Beijing Qihu Keji Co., Ltd. shouji -// show : 2015-03-05 Snow Beach, LLC +// show : 2015-03-05 Binky Moon, LLC show // showtime : 2015-08-06 CBS Domains Inc. showtime -// shriram : 2014-01-23 Shriram Capital Ltd. -shriram - -// silk : 2015-06-25 Amazon EU S.à r.l. +// silk : 2015-06-25 Amazon Registry Services, Inc. silk // sina : 2015-03-12 Sina Corporation sina -// singles : 2013-08-27 Fern Madison, LLC +// singles : 2013-08-27 Binky Moon, LLC singles -// site : 2015-01-15 DotSite Inc. +// site : 2015-01-15 Radix FZC site -// ski : 2015-04-09 STARTING DOT LIMITED +// ski : 2015-04-09 Afilias Limited ski -// skin : 2015-01-15 L'Oréal +// skin : 2015-01-15 XYZ.COM LLC skin -// sky : 2014-06-19 Sky IP International Ltd, a company incorporated in England and Wales, operating via its registered Swiss branch +// sky : 2014-06-19 Sky International AG sky // skype : 2014-12-18 Microsoft Corporation skype -// sling : 2015-07-30 Hughes Satellite Systems Corporation +// sling : 2015-07-30 DISH Technologies L.L.C. sling // smart : 2015-07-09 Smart Communications, Inc. (SMART) smart -// smile : 2014-12-18 Amazon EU S.à r.l. +// smile : 2014-12-18 Amazon Registry Services, Inc. smile // sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F sncf -// soccer : 2015-03-26 Foggy Shadow, LLC +// soccer : 2015-03-26 Binky Moon, LLC soccer -// social : 2013-11-07 United TLD Holdco Ltd. +// social : 2013-11-07 Dog Beach, LLC social -// softbank : 2015-07-02 SoftBank Corp. +// softbank : 2015-07-02 SoftBank Group Corp. softbank -// software : 2014-03-20 +// software : 2014-03-20 Dog Beach, LLC software // sohu : 2013-12-19 Sohu.com Limited sohu -// solar : 2013-11-07 Ruby Town, LLC +// solar : 2013-11-07 Binky Moon, LLC solar -// solutions : 2013-11-07 Silver Cover, LLC +// solutions : 2013-11-07 Binky Moon, LLC solutions -// song : 2015-02-26 Amazon EU S.à r.l. +// song : 2015-02-26 Amazon Registry Services, Inc. song // sony : 2015-01-08 Sony Corporation @@ -9722,24 +9794,21 @@ sony // soy : 2014-01-23 Charleston Road Registry Inc. soy -// space : 2014-04-03 DotSpace Inc. +// spa : 2019-09-19 Asia Spa and Wellness Promotion Council Limited +spa + +// space : 2014-04-03 Radix FZC space -// spiegel : 2014-02-05 SPIEGEL-Verlag Rudolf Augstein GmbH & Co. KG -spiegel +// sport : 2017-11-16 Global Association of International Sports Federations (GAISF) +sport -// spot : 2015-02-26 Amazon EU S.à r.l. +// spot : 2015-02-26 Amazon Registry Services, Inc. spot -// spreadbetting : 2014-12-11 IG Group Holdings PLC -spreadbetting - -// srl : 2015-05-07 mySRL GmbH +// srl : 2015-05-07 InterNetX, Corp srl -// srt : 2015-07-30 FCA US LLC. -srt - // stada : 2014-11-13 STADA Arzneimittel AG stada @@ -9749,18 +9818,12 @@ staples // star : 2015-01-08 Star India Private Limited star -// starhub : 2015-02-05 StarHub Ltd -starhub - // statebank : 2015-03-12 STATE BANK OF INDIA statebank // statefarm : 2015-07-30 State Farm Mutual Automobile Insurance Company statefarm -// statoil : 2014-12-04 Statoil ASA -statoil - // stc : 2014-10-09 Saudi Telecom Company stc @@ -9770,16 +9833,16 @@ stcgroup // stockholm : 2014-12-18 Stockholms kommun stockholm -// storage : 2014-12-22 Self Storage Company LLC +// storage : 2014-12-22 XYZ.COM LLC storage -// store : 2015-04-09 DotStore Inc. +// store : 2015-04-09 Radix FZC store // stream : 2016-01-08 dot Stream Limited stream -// studio : 2015-02-11 +// studio : 2015-02-11 Dog Beach, LLC studio // study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD @@ -9788,22 +9851,22 @@ study // style : 2014-12-04 Binky Moon, LLC style -// sucks : 2014-12-22 Vox Populi Registry Inc. +// sucks : 2014-12-22 Vox Populi Registry Ltd. sucks -// supplies : 2013-12-19 Atomic Fields, LLC +// supplies : 2013-12-19 Binky Moon, LLC supplies -// supply : 2013-12-19 Half Falls, LLC +// supply : 2013-12-19 Binky Moon, LLC supply -// support : 2013-10-24 Grand Orchard, LLC +// support : 2013-10-24 Binky Moon, LLC support -// surf : 2014-01-09 Top Level Domain Holdings Limited +// surf : 2014-01-09 Registry Services, LLC surf -// surgery : 2014-03-20 Tin Avenue, LLC +// surgery : 2014-03-20 Binky Moon, LLC surgery // suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION @@ -9812,19 +9875,13 @@ suzuki // swatch : 2015-01-08 The Swatch Group Ltd swatch -// swiftcover : 2015-07-23 Swiftcover Insurance Services Limited -swiftcover - // swiss : 2014-10-16 Swiss Confederation swiss // sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet sydney -// symantec : 2014-12-04 Symantec Corporation -symantec - -// systems : 2013-11-07 Dash Cypress, LLC +// systems : 2013-11-07 Binky Moon, LLC systems // tab : 2014-12-04 Tabcorp Holdings Limited @@ -9833,7 +9890,7 @@ tab // taipei : 2014-07-10 Taipei City Government taipei -// talk : 2015-04-09 Amazon EU S.à r.l. +// talk : 2015-04-09 Amazon Registry Services, Inc. talk // taobao : 2015-01-15 Alibaba Group Holding Limited @@ -9848,13 +9905,13 @@ tatamotors // tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" tatar -// tattoo : 2013-08-30 Uniregistry, Corp. +// tattoo : 2013-08-30 UNR Corp. tattoo -// tax : 2014-03-20 Storm Orchard, LLC +// tax : 2014-03-20 Binky Moon, LLC tax -// taxi : 2015-03-19 Pine Falls, LLC +// taxi : 2015-03-19 Binky Moon, LLC taxi // tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. @@ -9863,55 +9920,49 @@ tci // tdk : 2015-06-11 TDK Corporation tdk -// team : 2015-03-05 Atomic Lake, LLC +// team : 2015-03-05 Binky Moon, LLC team -// tech : 2015-01-30 Dot Tech LLC +// tech : 2015-01-30 Radix FZC tech -// technology : 2013-09-13 Auburn Falls +// technology : 2013-09-13 Binky Moon, LLC technology -// telecity : 2015-02-19 TelecityGroup International Limited -telecity - -// telefonica : 2014-10-16 Telefónica S.A. -telefonica - // temasek : 2014-08-07 Temasek Holdings (Private) Limited temasek -// tennis : 2014-12-04 Cotton Bloom, LLC +// tennis : 2014-12-04 Binky Moon, LLC tennis // teva : 2015-07-02 Teva Pharmaceutical Industries Limited teva -// thd : 2015-04-02 Homer TLC, Inc. +// thd : 2015-04-02 Home Depot Product Authority, LLC thd -// theater : 2015-03-19 Blue Tigers, LLC +// theater : 2015-03-19 Binky Moon, LLC theater -// theatre : 2015-05-07 +// theatre : 2015-05-07 XYZ.COM LLC theatre // tiaa : 2015-07-23 Teachers Insurance and Annuity Association of America tiaa -// tickets : 2015-02-05 Accent Media Limited +// tickets : 2015-02-05 XYZ.COM LLC tickets -// tienda : 2013-11-14 Victor Manor, LLC +// tienda : 2013-11-14 Binky Moon, LLC tienda // tiffany : 2015-01-30 Tiffany and Company tiffany -// tips : 2013-09-20 Corn Willow, LLC +// tips : 2013-09-20 Binky Moon, LLC tips -// tires : 2014-11-07 Dog Edge, LLC +// tires : 2014-11-07 Binky Moon, LLC tires // tirol : 2014-04-24 punkt Tirol GmbH @@ -9929,16 +9980,16 @@ tkmaxx // tmall : 2015-01-15 Alibaba Group Holding Limited tmall -// today : 2013-09-20 Pearl Woods, LLC +// today : 2013-09-20 Binky Moon, LLC today // tokyo : 2013-11-13 GMO Registry, Inc. tokyo -// tools : 2013-11-21 Pioneer North, LLC +// tools : 2013-11-21 Binky Moon, LLC tools -// top : 2014-03-20 Jiangsu Bangning Science & Technology Co.,Ltd. +// top : 2014-03-20 .TOP Registry top // toray : 2014-12-18 Toray Industries, Inc. @@ -9950,27 +10001,30 @@ toshiba // total : 2015-08-06 Total SA total -// tours : 2015-01-22 Sugar Station, LLC +// tours : 2015-01-22 Binky Moon, LLC tours -// town : 2014-03-06 Koko Moon, LLC +// town : 2014-03-06 Binky Moon, LLC town // toyota : 2015-04-23 TOYOTA MOTOR CORPORATION toyota -// toys : 2014-03-06 Pioneer Orchard, LLC +// toys : 2014-03-06 Binky Moon, LLC toys // trade : 2014-01-23 Elite Registry Limited trade -// trading : 2014-12-11 IG Group Holdings PLC +// trading : 2014-12-11 Dog Beach, LLC trading -// training : 2013-11-07 Wild Willow, LLC +// training : 2013-11-07 Binky Moon, LLC training +// travel : 2015-10-09 Dog Beach, LLC +travel + // travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. travelchannel @@ -9980,7 +10034,7 @@ travelers // travelersinsurance : 2015-03-26 Travelers TLD, LLC travelersinsurance -// trust : 2014-10-16 +// trust : 2014-10-16 UNR Corp. trust // trv : 2015-03-26 Travelers TLD, LLC @@ -9992,10 +10046,10 @@ tube // tui : 2014-07-03 TUI AG tui -// tunes : 2015-02-26 Amazon EU S.à r.l. +// tunes : 2015-02-26 Amazon Registry Services, Inc. tunes -// tushu : 2014-12-18 Amazon EU S.à r.l. +// tushu : 2014-12-18 Amazon Registry Services, Inc. tushu // tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED @@ -10007,16 +10061,13 @@ ubank // ubs : 2014-12-11 UBS AG ubs -// uconnect : 2015-07-30 FCA US LLC. -uconnect - // unicom : 2015-10-15 China United Network Communications Corporation Limited unicom -// university : 2014-03-06 Little Station, LLC +// university : 2014-03-06 Binky Moon, LLC university -// uno : 2013-09-11 Dot Latin LLC +// uno : 2013-09-11 Radix FZC uno // uol : 2014-05-01 UBN INTERNET LTDA. @@ -10025,7 +10076,7 @@ uol // ups : 2015-06-25 UPS Market Driver, Inc. ups -// vacations : 2013-12-05 Atomic Tigers, LLC +// vacations : 2013-12-05 Binky Moon, LLC vacations // vana : 2014-12-11 Lifestyle Domain Holdings, Inc. @@ -10037,22 +10088,22 @@ vanguard // vegas : 2014-01-16 Dot Vegas, Inc. vegas -// ventures : 2013-08-27 Binky Lake, LLC +// ventures : 2013-08-27 Binky Moon, LLC ventures // verisign : 2015-08-13 VeriSign, Inc. verisign -// versicherung : 2014-03-20 +// versicherung : 2014-03-20 tldbox GmbH versicherung -// vet : 2014-03-06 +// vet : 2014-03-06 Dog Beach, LLC vet -// viajes : 2013-10-17 Black Madison, LLC +// viajes : 2013-10-17 Binky Moon, LLC viajes -// video : 2014-10-16 +// video : 2014-10-16 Dog Beach, LLC video // vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe @@ -10061,13 +10112,13 @@ vig // viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd. viking -// villas : 2013-12-05 New Sky, LLC +// villas : 2013-12-05 Binky Moon, LLC villas -// vin : 2015-06-18 Holly Shadow, LLC +// vin : 2015-06-18 Binky Moon, LLC vin -// vip : 2015-01-22 Minds + Machines Group Limited +// vip : 2015-01-22 Registry Services, LLC vip // virgin : 2014-09-25 Virgin Enterprises Limited @@ -10076,15 +10127,9 @@ virgin // visa : 2015-07-30 Visa Worldwide Pte. Limited visa -// vision : 2013-12-05 Koko Station, LLC +// vision : 2013-12-05 Binky Moon, LLC vision -// vista : 2014-09-18 Vistaprint Limited -vista - -// vistaprint : 2014-09-18 Vistaprint Limited -vistaprint - // viva : 2014-11-07 Saudi Telecom Company viva @@ -10094,7 +10139,7 @@ vivo // vlaanderen : 2014-02-06 DNS.be vzw vlaanderen -// vodka : 2013-12-19 Top Level Domain Holdings Limited +// vodka : 2013-12-19 Registry Services, LLC vodka // volkswagen : 2015-05-14 Volkswagen Group of America Inc. @@ -10112,7 +10157,7 @@ voting // voto : 2013-11-21 Monolith Registry LLC voto -// voyage : 2013-08-27 Ruby House, LLC +// voyage : 2013-08-27 Binky Moon, LLC voyage // vuelos : 2015-03-05 Travel Reservations SRL @@ -10127,25 +10172,22 @@ walmart // walter : 2014-11-13 Sandvik AB walter -// wang : 2013-10-24 Zodiac Leo Limited +// wang : 2013-10-24 Zodiac Wang Limited wang -// wanggou : 2014-12-18 Amazon EU S.à r.l. +// wanggou : 2014-12-18 Amazon Registry Services, Inc. wanggou -// warman : 2015-06-18 Weir Group IP Limited -warman - -// watch : 2013-11-14 Sand Shadow, LLC +// watch : 2013-11-14 Binky Moon, LLC watch -// watches : 2014-12-22 Richemont DNS Inc. +// watches : 2014-12-22 Afilias Limited watches -// weather : 2015-01-08 The Weather Channel, LLC +// weather : 2015-01-08 International Business Machines Corporation weather -// weatherchannel : 2015-03-12 The Weather Channel, LLC +// weatherchannel : 2015-03-12 International Business Machines Corporation weatherchannel // webcam : 2014-01-23 dot Webcam Limited @@ -10154,13 +10196,10 @@ webcam // weber : 2015-06-04 Saint-Gobain Weber SA weber -// website : 2014-04-03 DotWebsite Inc. +// website : 2014-04-03 Radix FZC website -// wed : 2013-10-01 Atgron, Inc. -wed - -// wedding : 2014-04-24 Top Level Domain Holdings Limited +// wedding : 2014-04-24 Registry Services, LLC wedding // weibo : 2015-03-05 Sina Corporation @@ -10187,7 +10226,7 @@ win // windows : 2014-12-18 Microsoft Corporation windows -// wine : 2015-06-18 June Station, LLC +// wine : 2015-06-18 Binky Moon, LLC wine // winners : 2015-07-16 The TJX Companies, Inc. @@ -10202,22 +10241,22 @@ wolterskluwer // woodside : 2015-07-09 Woodside Petroleum Limited woodside -// work : 2013-12-19 Top Level Domain Holdings Limited +// work : 2013-12-19 Registry Services, LLC work -// works : 2013-11-14 Little Dynamite, LLC +// works : 2013-11-14 Binky Moon, LLC works -// world : 2014-06-12 Bitter Fields, LLC +// world : 2014-06-12 Binky Moon, LLC world -// wow : 2015-10-08 Amazon EU S.à r.l. +// wow : 2015-10-08 Amazon Registry Services, Inc. wow // wtc : 2013-12-19 World Trade Centers Association, Inc. wtc -// wtf : 2014-03-06 Hidden Way, LLC +// wtf : 2014-03-06 Binky Moon, LLC wtf // xbox : 2014-12-18 Microsoft Corporation @@ -10229,7 +10268,7 @@ xerox // xfinity : 2015-07-09 Comcast IP Holdings I, LLC xfinity -// xihuan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +// xihuan : 2015-01-08 Beijing Qihu Keji Co., Ltd. xihuan // xin : 2014-12-11 Elegant Leader Limited @@ -10238,7 +10277,7 @@ xin // xn--11b4c3d : 2015-01-15 VeriSign Sarl कॉम -// xn--1ck2e1b : 2015-02-26 Amazon EU S.à r.l. +// xn--1ck2e1b : 2015-02-26 Amazon Registry Services, Inc. セール // xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd. @@ -10250,28 +10289,25 @@ xin // xn--3bst00m : 2013-09-13 Eagle Horizon Limited 集团 -// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED +// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED OY 在线 -// xn--3oq18vl8pn36a : 2015-07-02 Volkswagen (China) Investment Co., Ltd. -大众汽车 - // xn--3pxu8k : 2015-01-15 VeriSign Sarl 点看 // xn--42c2d9a : 2015-01-15 VeriSign Sarl คอม -// xn--45q11c : 2013-11-21 Zodiac Scorpio Limited +// xn--45q11c : 2013-11-21 Zodiac Gemini Ltd 八卦 -// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment +// xn--4gbrim : 2013-10-04 Helium TLDs Ltd موقع // xn--55qw42g : 2013-11-08 China Organizational Name Administration Center 公益 -// xn--55qx5d : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) +// xn--55qx5d : 2013-11-14 China Internet Network Information Center (CNNIC) 公司 // xn--5su34j936bgsg : 2015-09-03 Shangri‐La International Hotel Management Limited @@ -10313,7 +10349,7 @@ xin // xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited 淡马锡 -// xn--bck1b9a5dre4c : 2015-02-26 Amazon EU S.à r.l. +// xn--bck1b9a5dre4c : 2015-02-26 Amazon Registry Services, Inc. ファッション // xn--c1avg : 2013-11-14 Public Interest Registry @@ -10322,46 +10358,46 @@ xin // xn--c2br7g : 2015-01-15 VeriSign Sarl नेट -// xn--cck2b3b : 2015-02-26 Amazon EU S.à r.l. +// xn--cck2b3b : 2015-02-26 Amazon Registry Services, Inc. ストア +// xn--cckwcxetd : 2019-12-19 Amazon Registry Services, Inc. +アマゾン + // xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD 삼성 -// xn--czr694b : 2014-01-16 Dot Trademark TLD Holding Company Limited +// xn--czr694b : 2014-01-16 Internet DotTrademark Organisation Limited 商标 -// xn--czrs0t : 2013-12-19 Wild Island, LLC +// xn--czrs0t : 2013-12-19 Binky Moon, LLC 商店 -// xn--czru2d : 2013-11-21 Zodiac Capricorn Limited +// xn--czru2d : 2013-11-21 Zodiac Aquarius Limited 商城 // xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet” дети -// xn--eckvdtc9d : 2014-12-18 Amazon EU S.à r.l. +// xn--eckvdtc9d : 2014-12-18 Amazon Registry Services, Inc. ポイント -// xn--efvy88h : 2014-08-22 Xinhua News Agency Guangdong Branch 新华通讯社广东分社 +// xn--efvy88h : 2014-08-22 Guangzhou YU Wei Information Technology Co., Ltd. 新闻 -// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited -工行 - -// xn--fct429k : 2015-04-09 Amazon EU S.à r.l. +// xn--fct429k : 2015-04-09 Amazon Registry Services, Inc. 家電 // xn--fhbei : 2015-01-15 VeriSign Sarl كوم -// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED +// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED OY 中文网 // xn--fiq64b : 2013-10-14 CITIC Group Corporation 中信 -// xn--fjq720a : 2014-05-22 Will Bloom, LLC +// xn--fjq720a : 2014-05-22 Binky Moon, LLC 娱乐 // xn--flw351e : 2014-07-31 Charleston Road Registry Inc. @@ -10370,42 +10406,42 @@ xin // xn--fzys8d69uvgm : 2015-05-14 PCCW Enterprises Limited 電訊盈科 -// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited +// xn--g2xx48c : 2015-01-30 Nawang Heli(Xiamen) Network Service Co., LTD. 购物 -// xn--gckr3f0f : 2015-02-26 Amazon EU S.à r.l. +// xn--gckr3f0f : 2015-02-26 Amazon Registry Services, Inc. クラウド -// xn--gk3at1e : 2015-10-08 Amazon EU S.à r.l. +// xn--gk3at1e : 2015-10-08 Amazon Registry Services, Inc. 通販 -// xn--hxt814e : 2014-05-15 Zodiac Libra Limited +// xn--hxt814e : 2014-05-15 Zodiac Taurus Limited 网店 // xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry संगठन -// xn--imr513n : 2014-12-11 Dot Trademark TLD Holding Company Limited +// xn--imr513n : 2014-12-11 Internet DotTrademark Organisation Limited 餐厅 -// xn--io0a7i : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) +// xn--io0a7i : 2013-11-14 China Internet Network Information Center (CNNIC) 网络 // xn--j1aef : 2015-01-15 VeriSign Sarl ком +// xn--jlq480n2rg : 2019-12-19 Amazon Registry Services, Inc. +亚马逊 + // xn--jlq61u9w7b : 2015-01-08 Nokia Corporation 诺基亚 -// xn--jvr189m : 2015-02-26 Amazon EU S.à r.l. +// xn--jvr189m : 2015-02-26 Amazon Registry Services, Inc. 食品 // xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V. 飞利浦 -// xn--kpu716f : 2014-12-22 Richemont DNS Inc. -手表 - // xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd 手机 @@ -10421,9 +10457,6 @@ xin // xn--mgbab2bd : 2013-10-31 CORE Association بازار -// xn--mgbb9fbpob : 2014-12-18 GreenTech Consultancy Company W.L.L. -موبايلي - // xn--mgbca7dzdo : 2015-07-30 Abu Dhabi Systems and Information Centre ابوظبي @@ -10457,12 +10490,12 @@ xin // xn--nyqy26a : 2014-11-07 Stable Tone Limited 健康 +// xn--otu796d : 2017-08-06 Jiang Yu Liang Cai Technology Company Limited +招聘 + // xn--p1acf : 2013-12-12 Rusnames Limited рус -// xn--pbt977c : 2014-12-22 Richemont DNS Inc. -珠宝 - // xn--pssy2u : 2015-01-15 VeriSign Sarl 大拿 @@ -10475,10 +10508,10 @@ xin // xn--rhqv96g : 2013-09-11 Stable Tone Limited 世界 -// xn--rovu88b : 2015-02-26 Amazon EU S.à r.l. +// xn--rovu88b : 2015-02-26 Amazon Registry Services, Inc. 書籍 -// xn--ses554g : 2014-01-16 +// xn--ses554g : 2014-01-16 KNET Co., Ltd. 网址 // xn--t60b56a : 2015-01-15 VeriSign Sarl @@ -10490,7 +10523,7 @@ xin // xn--tiq49xqyj : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication) 天主教 -// xn--unup4y : 2013-07-14 Spring Fields, LLC +// xn--unup4y : 2013-07-14 Binky Moon, LLC 游戏 // xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG @@ -10499,7 +10532,7 @@ vermögensberater // xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG vermögensberatung -// xn--vhquv : 2013-08-27 Dash McCook, LLC +// xn--vhquv : 2013-08-27 Binky Moon, LLC 企业 // xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd. @@ -10517,58 +10550,52 @@ vermögensberatung // xn--zfr164b : 2013-11-08 China Organizational Name Administration Center 政务 -// xperia : 2015-05-14 Sony Mobile Communications AB -xperia - // xyz : 2013-12-05 XYZ.COM LLC xyz -// yachts : 2014-01-09 DERYachts, LLC +// yachts : 2014-01-09 XYZ.COM LLC yachts -// yahoo : 2015-04-02 Yahoo! Domain Services Inc. +// yahoo : 2015-04-02 Oath Inc. yahoo -// yamaxun : 2014-12-18 Amazon EU S.à r.l. +// yamaxun : 2014-12-18 Amazon Registry Services, Inc. yamaxun -// yandex : 2014-04-10 YANDEX, LLC +// yandex : 2014-04-10 Yandex Europe B.V. yandex // yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. yodobashi -// yoga : 2014-05-29 Top Level Domain Holdings Limited +// yoga : 2014-05-29 Registry Services, LLC yoga // yokohama : 2013-12-12 GMO Registry, Inc. yokohama -// you : 2015-04-09 Amazon EU S.à r.l. +// you : 2015-04-09 Amazon Registry Services, Inc. you // youtube : 2014-05-01 Charleston Road Registry Inc. youtube -// yun : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. +// yun : 2015-01-08 Beijing Qihu Keji Co., Ltd. yun -// zappos : 2015-06-25 Amazon EU S.à r.l. +// zappos : 2015-06-25 Amazon Registry Services, Inc. zappos // zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) zara -// zero : 2014-12-18 Amazon EU S.à r.l. +// zero : 2014-12-18 Amazon Registry Services, Inc. zero // zip : 2014-05-08 Charleston Road Registry Inc. zip -// zippo : 2015-07-02 Zadco Company -zippo - -// zone : 2013-11-14 Outer Falls, LLC +// zone : 2013-11-14 Binky Moon, LLC zone // zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich) @@ -10585,18 +10612,50 @@ cc.ua inf.ua ltd.ua +// 611coin : https://611project.org/ +611.to + +// Aaron Marais' Gitlab pages: https://lab.aaronleem.co.za +// Submitted by Aaron Marais +graphox.us + +// accesso Technology Group, plc. : https://accesso.com/ +// Submitted by accesso Team +*.devcdnaccesso.com + +// Adobe : https://www.adobe.com/ +// Submitted by Ian Boston and Lars Trieloff +adobeaemcloud.com +*.dev.adobeaemcloud.com +hlx.live +adobeaemcloud.net +hlx.page +hlx3.page + // Agnat sp. z o.o. : https://domena.pl // Submitted by Przemyslaw Plewa beep.pl +// alboto.ca : http://alboto.ca +// Submitted by Anton Avramov +barsy.ca + // Alces Software Ltd : http://alces-software.com // Submitted by Mark J. Titorenko *.compute.estate *.alces.network +// all-inkl.com : https://all-inkl.com +// Submitted by Werner Kaltofen +kasserver.com + +// Altervista: https://www.altervista.org +// Submitted by Carlo Cannas +altervista.org + // alwaysdata : https://www.alwaysdata.com // Submitted by Cyril -*.alwaysdata.net +alwaysdata.net // Amazon CloudFront : https://aws.amazon.com/cloudfront/ // Submitted by Donavan Miller @@ -10612,9 +10671,11 @@ us-east-1.amazonaws.com // Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ // Submitted by Luke Wells cn-north-1.eb.amazonaws.com.cn +cn-northwest-1.eb.amazonaws.com.cn elasticbeanstalk.com ap-northeast-1.elasticbeanstalk.com ap-northeast-2.elasticbeanstalk.com +ap-northeast-3.elasticbeanstalk.com ap-south-1.elasticbeanstalk.com ap-southeast-1.elasticbeanstalk.com ap-southeast-2.elasticbeanstalk.com @@ -10622,6 +10683,7 @@ ca-central-1.elasticbeanstalk.com eu-central-1.elasticbeanstalk.com eu-west-1.elasticbeanstalk.com eu-west-2.elasticbeanstalk.com +eu-west-3.elasticbeanstalk.com sa-east-1.elasticbeanstalk.com us-east-1.elasticbeanstalk.com us-east-2.elasticbeanstalk.com @@ -10634,6 +10696,10 @@ us-west-2.elasticbeanstalk.com *.elb.amazonaws.com *.elb.amazonaws.com.cn +// Amazon Global Accelerator : https://aws.amazon.com/global-accelerator/ +// Submitted by Daniel Massaguer +awsglobalaccelerator.com + // Amazon S3 : https://aws.amazon.com/s3/ // Submitted by Luke Wells s3.amazonaws.com @@ -10646,6 +10712,7 @@ s3-ca-central-1.amazonaws.com s3-eu-central-1.amazonaws.com s3-eu-west-1.amazonaws.com s3-eu-west-2.amazonaws.com +s3-eu-west-3.amazonaws.com s3-external-1.amazonaws.com s3-fips-us-gov-west-1.amazonaws.com s3-sa-east-1.amazonaws.com @@ -10659,6 +10726,7 @@ s3.cn-north-1.amazonaws.com.cn s3.ca-central-1.amazonaws.com s3.eu-central-1.amazonaws.com s3.eu-west-2.amazonaws.com +s3.eu-west-3.amazonaws.com s3.us-east-2.amazonaws.com s3.dualstack.ap-northeast-1.amazonaws.com s3.dualstack.ap-northeast-2.amazonaws.com @@ -10669,6 +10737,7 @@ s3.dualstack.ca-central-1.amazonaws.com s3.dualstack.eu-central-1.amazonaws.com s3.dualstack.eu-west-1.amazonaws.com s3.dualstack.eu-west-2.amazonaws.com +s3.dualstack.eu-west-3.amazonaws.com s3.dualstack.sa-east-1.amazonaws.com s3.dualstack.us-east-1.amazonaws.com s3.dualstack.us-east-2.amazonaws.com @@ -10685,6 +10754,7 @@ s3-website.ap-south-1.amazonaws.com s3-website.ca-central-1.amazonaws.com s3-website.eu-central-1.amazonaws.com s3-website.eu-west-2.amazonaws.com +s3-website.eu-west-3.amazonaws.com s3-website.us-east-2.amazonaws.com // Amune : https://amune.org/ @@ -10692,10 +10762,33 @@ s3-website.us-east-2.amazonaws.com t3l3p0rt.net tele.amune.org +// Apigee : https://apigee.com/ +// Submitted by Apigee Security Team +apigee.io + +// Apphud : https://apphud.com +// Submitted by Alexander Selivanov +siiites.com + +// Appspace : https://www.appspace.com +// Submitted by Appspace Security Team +appspacehosted.com +appspaceusercontent.com + +// Appudo UG (haftungsbeschränkt) : https://www.appudo.com +// Submitted by Alexander Hochbaum +appudo.net + // Aptible : https://www.aptible.com/ // Submitted by Thomas Orozco on-aptible.com +// ASEINet : https://www.aseinet.com/ +// Submitted by Asei SEKIGUCHI +user.aseinet.ne.jp +gv.vc +d.gv.vc + // Asociación Amigos de la Informática "Euskalamiga" : http://encounter.eus/ // Submitted by Hector Martin user.party.eus @@ -10711,19 +10804,67 @@ sweetpepper.org // Submitted by Vincent Tseng myasustor.com +// Atlassian : https://atlassian.com +// Submitted by Sam Smyth +cdn.prod.atlassian-dev.net + // AVM : https://avm.de // Submitted by Andreas Weise myfritz.net +// AVStack Pte. Ltd. : https://avstack.io +// Submitted by Jasper Hugo +onavstack.net + // AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com // Submitted by James Kennedy *.awdev.ca *.advisor.ws +// AZ.pl sp. z.o.o: https://az.pl +// Submited by Krzysztof Wolski +ecommerce-shop.pl + +// b-data GmbH : https://www.b-data.io +// Submitted by Olivier Benz +b-data.io + // backplane : https://www.backplane.io // Submitted by Anthony Voutas backplaneapp.io +// Balena : https://www.balena.io +// Submitted by Petros Angelatos +balena-devices.com + +// University of Banja Luka : https://unibl.org +// Domains for Republic of Srpska administrative entity. +// Submitted by Marko Ivanovic +rs.ba + +// Banzai Cloud +// Submitted by Janos Matyas +*.banzai.cloud +app.banzaicloud.io +*.backyards.banzaicloud.io + +// BASE, Inc. : https://binc.jp +// Submitted by Yuya NAGASAWA +base.ec +official.ec +buyshop.jp +fashionstore.jp +handcrafted.jp +kawaiishop.jp +supersale.jp +theshop.jp +shopselect.net +base.shop + +// Beget Ltd +// Submitted by Lev Nekrasov +*.beget.app + // BetaInABox // Submitted by Adrian betainabox.com @@ -10732,10 +10873,30 @@ betainabox.com // Submitted by Nathan O'Sullivan bnr.la +// Bitbucket : http://bitbucket.org +// Submitted by Andy Ortlieb +bitbucket.io + +// Blackbaud, Inc. : https://www.blackbaud.com +// Submitted by Paul Crowder +blackbaudcdn.net + +// Blatech : http://www.blatech.net +// Submitted by Luke Bratch +of.je + +// Blue Bite, LLC : https://bluebite.com +// Submitted by Joshua Weiss +bluebite.io + // Boomla : https://boomla.com // Submitted by Tibor Halter boomla.net +// Boutir : https://www.boutir.com +// Submitted by Eric Ng Ka Ka +boutir.com + // Boxfuse : https://boxfuse.com // Submitted by Axel Fontaine boxfuse.io @@ -10749,45 +10910,68 @@ square7.de bplaced.net square7.net +// Brendly : https://brendly.rs +// Submitted by Dusan Radovanovic +shop.brendly.rs + // BrowserSafetyMark // Submitted by Dave Tharp browsersafetymark.io +// Bytemark Hosting : https://www.bytemark.co.uk +// Submitted by Paul Cammish +uk0.bigv.io +dh.bytemark.co.uk +vm.bytemark.co.uk + +// Caf.js Labs LLC : https://www.cafjs.com +// Submitted by Antonio Lain +cafjs.com + // callidomus : https://www.callidomus.com/ // Submitted by Marcus Popp mycd.eu +// Carrd : https://carrd.co +// Submitted by AJ +drr.ac +uwu.ai +carrd.co +crd.co +ju.mp + // CentralNic : http://www.centralnic.com/names/domains // Submitted by registry ae.org -ar.com br.com cn.com com.de com.se de.com eu.com -gb.com gb.net -hu.com hu.net jp.net jpn.com -kr.com mex.com -no.com -qc.com ru.com sa.com -se.com se.net uk.com uk.net us.com -uy.com za.bz za.com +// No longer operated by CentralNic, these entries should be adopted and/or removed by current operators +// Submitted by Gavin Brown +ar.com +hu.com +kr.com +no.com +qc.com +uy.com + // Africa.com Web Solutions Ltd : https://registry.africa.com // Submitted by Gavin Brown africa.com @@ -10799,6 +10983,7 @@ gr.com // Radix FZC : http://domains.in.net // Submitted by Gavin Brown in.net +web.in // US REGISTRY LLC : http://us.org // Submitted by Gavin Brown @@ -10808,6 +10993,16 @@ us.org // Submitted by Gavin Brown co.com +// Roar Domains LLC : https://roar.basketball/ +// Submitted by Gavin Brown +aus.basketball +nz.basketball + +// BRS Media : https://brsmedia.com/ +// Submitted by Gavin Brown +radio.am +radio.fm + // c.la : http://www.c.la/ c.la @@ -10815,17 +11010,37 @@ c.la // Submitted by B. Blechschmidt certmgr.org -// Citrix : https://citrix.com -// Submitted by Alex Stoddard -xenapponazure.com +// Cityhost LLC : https://cityhost.ua +// Submitted by Maksym Rivtin +cx.ua + +// Civilized Discourse Construction Kit, Inc. : https://www.discourse.org/ +// Submitted by Rishabh Nambiar & Michael Brown +discourse.group +discourse.team + +// Clever Cloud : https://www.clever-cloud.com/ +// Submitted by Quentin Adam +cleverapps.io + +// Clerk : https://www.clerk.dev +// Submitted by Colin Sidoti +clerk.app +clerkstage.app +*.lcl.dev +*.lclstage.dev +*.stg.dev +*.stgstage.dev -// ClearVox : http://www.clearvox.nl/ -// Submitted by Leon Rowland -virtueeldomein.nl +// ClickRising : https://clickrising.com/ +// Submitted by Umut Gumeli +clickrising.net // Cloud66 : https://www.cloud66.com/ // Submitted by Khash Sajadi c66.me +cloud66.ws +cloud66.zone // CloudAccess.net : https://www.cloudaccess.net/ // Submitted by Pawel Panek @@ -10840,9 +11055,27 @@ cloudaccess.net cloudcontrolled.com cloudcontrolapp.com +// Cloudera, Inc. : https://www.cloudera.com/ +// Submitted by Kedarnath Waikar +*.cloudera.site + +// Cloudflare, Inc. : https://www.cloudflare.com/ +// Submitted by Cloudflare Team +pages.dev +trycloudflare.com +workers.dev + +// Clovyr : https://clovyr.io +// Submitted by Patrick Nielsen +wnext.app + // co.ca : http://registry.co.ca/ co.ca +// Co & Co : https://co-co.nl/ +// Submitted by Govert Versluis +*.otap.co + // i-registry s.r.o. : http://www.i-registry.cz/ // Submitted by Martin Semrad co.cz @@ -10869,10 +11102,32 @@ cloudns.pro cloudns.pw cloudns.us +// CNPY : https://cnpy.gdn +// Submitted by Angelo Gladding +cnpy.gdn + +// Codeberg e. V. : https://codeberg.org +// Submitted by Moritz Marquardt +codeberg.page + // CoDNS B.V. co.nl co.no +// Combell.com : https://www.combell.com +// Submitted by Thomas Wouters +webhosting.be +hosting-cluster.nl + +// Coordination Center for TLD RU and XN--P1AI : https://cctld.ru/en/domains/domens_ru/reserved/ +// Submitted by George Georgievsky +ac.ru +edu.ru +gov.ru +int.ru +mil.ru +test.ru + // COSIMO GmbH : http://www.cosimo.de // Submitted by Rene Marticke dyn.cosidns.de @@ -10897,16 +11152,43 @@ realm.cz // Submitted by Jonathan Rudenberg cupcake.is +// Curv UG : https://curv-labs.de/ +// Submitted by Marvin Wiesner +curv.dev + +// Customer OCI - Oracle Dyn https://cloud.oracle.com/home https://dyn.com/dns/ +// Submitted by Gregory Drake +// Note: This is intended to also include customer-oci.com due to wildcards implicitly including the current label +*.customer-oci.com +*.oci.customer-oci.com +*.ocp.customer-oci.com +*.ocs.customer-oci.com + // cyon GmbH : https://www.cyon.ch/ // Submitted by Dominic Luechinger cyon.link cyon.site +// Danger Science Group: https://dangerscience.com/ +// Submitted by Skylar MacDonald +fnwk.site +folionetwork.site +platform0.app + // Daplie, Inc : https://daplie.com // Submitted by AJ ONeal daplie.me localhost.daplie.me +// Datto, Inc. : https://www.datto.com/ +// Submitted by Philipp Heckel +dattolocal.com +dattorelay.com +dattoweb.com +mydatto.com +dattolocal.net +mydatto.net + // Dansk.net : http://www.dansk.net/ // Submitted by Anani Voule biz.dk @@ -10915,22 +11197,71 @@ firm.dk reg.dk store.dk +// dappnode.io : https://dappnode.io/ +// Submitted by Abel Boldu / DAppNode Team +dyndns.dappnode.io + +// dapps.earth : https://dapps.earth/ +// Submitted by Daniil Burdakov +*.dapps.earth +*.bzz.dapps.earth + +// Dark, Inc. : https://darklang.com +// Submitted by Paul Biggar +builtwithdark.com + +// DataDetect, LLC. : https://datadetect.com +// Submitted by Andrew Banchich +demo.datadetect.com +instance.datadetect.com + +// Datawire, Inc : https://www.datawire.io +// Submitted by Richard Li +edgestack.me + +// DDNS5 : https://ddns5.com +// Submitted by Cameron Elliott +ddns5.com + // Debian : https://www.debian.org/ // Submitted by Peter Palfrader / Debian Sysadmin Team debian.net +// Deno Land Inc : https://deno.com/ +// Submitted by Luca Casonato +deno.dev +deno-staging.dev + // deSEC : https://desec.io/ // Submitted by Peter Thomassen dedyn.io +// Diher Solutions : https://diher.solutions +// Submitted by Didi Hermawan +*.rss.my.id +*.diher.solutions + +// DNS Africa Ltd https://dns.business +// Submitted by Calvin Browne +jozi.biz + // DNShome : https://www.dnshome.de/ // Submitted by Norbert Auler dnshome.de +// DotArai : https://www.dotarai.com/ +// Submitted by Atsadawat Netcharadsang +online.th +shop.th + // DrayTek Corp. : https://www.draytek.com/ // Submitted by Paul Fang drayddns.com +// DreamCommerce : https://shoper.pl/ +// Submitted by Konrad Kotarba +shoparena.pl + // DreamHost : http://www.dreamhost.com/ // Submitted by Andrew Farmer dreamhosters.com @@ -10948,6 +11279,13 @@ drud.us // Submitted by Richard Harper duckdns.org +// Bip : https://bip.sh +// Submitted by Joel Kennedy +bip.sh + +// bitbridge.net : Submitted by Craig Welch, abeliidev@gmail.com +bitbridge.net + // dy.fi : http://dy.fi/ // Submitted by Heikki Hannikainen dy.fi @@ -11251,6 +11589,18 @@ ddnss.org definima.net definima.io +// DigitalOcean App Platform : https://www.digitalocean.com/products/app-platform/ +// Submitted by Braxton Huggins +ondigitalocean.app + +// DigitalOcean Spaces : https://www.digitalocean.com/products/spaces/ +// Submitted by Robin H. Johnson +*.digitaloceanspaces.com + +// dnstrace.pro : https://dnstrace.pro/ +// Submitted by Chris Partridge +bci.dnstrace.pro + // Dynu.com : https://www.dynu.com/ // Submitted by Sue Ye ddnsfree.com @@ -11279,14 +11629,33 @@ dynv6.net // Submitted by Vladimir Dudr e4.cz +// eero : https://eero.com/ +// Submitted by Yue Kang +eero.online +eero-stage.online + +// Elementor : Elementor Ltd. +// Submitted by Anton Barkan +elementor.cloud +elementor.cool + +// En root‽ : https://en-root.org +// Submitted by Emmanuel Raviart +en-root.fr + // Enalean SAS: https://www.enalean.com // Submitted by Thomas Cottier mytuleap.com +tuleap-partners.com + +// ECG Robotics, Inc: https://ecgrobotics.org +// Submitted by +onred.one +staging.onred.one -// Enonic : http://enonic.com/ -// Submitted by Erik Kaareng-Sunde -enonic.io -customer.enonic.io +// encoway GmbH : https://www.encoway.de +// Submitted by Marcel Daus +eu.encoway.cloud // EU.org https://eu.org/ // Submitted by Pierre Beyssac @@ -11347,6 +11716,10 @@ tr.eu.org uk.eu.org us.eu.org +// Eurobyte : https://eurobyte.ru +// Submitted by Evgeniy Subbotin +eurodir.ru + // Evennode : http://www.evennode.com/ // Submitted by Michal Kralik eu-1.evennode.com @@ -11366,6 +11739,10 @@ twmail.org mymailer.com.tw url.tw +// Fabrica Technologies, Inc. : https://www.fabrica.dev/ +// Submitted by Eric Jiang +onfabrica.com + // Facebook, Inc. // Submitted by Peter Ruibal apps.fbsbx.com @@ -11449,9 +11826,12 @@ vologda.su // Fancy Bits, LLC : http://getchannels.com // Submitted by Aman Gupta channelsdvr.net +u.channelsdvr.net // Fastly Inc. : http://www.fastly.com/ // Submitted by Fastly Security +edgecompute.app +fastly-terrarium.com fastlylb.net map.fastlylb.net freetls.fastly.net @@ -11462,29 +11842,97 @@ a.ssl.fastly.net b.ssl.fastly.net global.ssl.fastly.net -// Featherhead : https://featherhead.xyz/ -// Submitted by Simon Menke -fhapp.xyz +// FASTVPS EESTI OU : https://fastvps.ru/ +// Submitted by Likhachev Vasiliy +fastvps-server.com +fastvps.host +myfast.host +fastvps.site +myfast.space // Fedora : https://fedoraproject.org/ // submitted by Patrick Uiterwijk fedorainfracloud.org fedorapeople.org cloud.fedoraproject.org +app.os.fedoraproject.org +app.os.stg.fedoraproject.org + +// FearWorks Media Ltd. : https://fearworksmedia.co.uk +// submitted by Keith Fairley +couk.me +ukco.me +conn.uk +copro.uk +hosp.uk + +// Fermax : https://fermax.com/ +// submitted by Koen Van Isterdael +mydobiss.com + +// FH Muenster : https://www.fh-muenster.de +// Submitted by Robin Naundorf +fh-muenster.io // Filegear Inc. : https://www.filegear.com // Submitted by Jason Zhu filegear.me +filegear-au.me +filegear-de.me +filegear-gb.me +filegear-ie.me +filegear-jp.me +filegear-sg.me // Firebase, Inc. // Submitted by Chris Raynor firebaseapp.com +// Firewebkit : https://www.firewebkit.com +// Submitted by Majid Qureshi +fireweb.app + +// FLAP : https://www.flap.cloud +// Submitted by Louis Chemineau +flap.id + +// FlashDrive : https://flashdrive.io +// Submitted by Eric Chan +onflashdrive.app +fldrv.com + +// fly.io: https://fly.io +// Submitted by Kurt Mackey +fly.dev +edgeapp.net +shw.io + // Flynn : https://flynn.io // Submitted by Jonathan Rudenberg -flynnhub.com flynnhosting.net +// Forgerock : https://www.forgerock.com +// Submitted by Roderick Parr +forgeblocks.com +id.forgerock.io + +// Framer : https://www.framer.com +// Submitted by Koen Rouwhorst +framer.app +framercanvas.com + +// Frusky MEDIA&PR : https://www.frusky.de +// Submitted by Victor Pupynin +*.frusky.de + +// RavPage : https://www.ravpage.co.il +// Submitted by Roni Horowitz +ravpage.co.il + +// Frederik Braun https://frederik-braun.com +// Submitted by Frederik Braun +0e.vc + // Freebox : http://www.freebox.fr // Submitted by Romain Fliedel freebox-os.com @@ -11494,32 +11942,105 @@ fbxos.fr freebox-os.fr freeboxos.fr -// Fusion Intranet : https://www.fusion-intranet.com -// Submitted by Matthias Burtscher -myfusion.cloud +// freedesktop.org : https://www.freedesktop.org +// Submitted by Daniel Stone +freedesktop.org + +// freemyip.com : https://freemyip.com +// Submitted by Cadence +freemyip.com + +// FunkFeuer - Verein zur Förderung freier Netze : https://www.funkfeuer.at +// Submitted by Daniel A. Maierhofer +wien.funkfeuer.at // Futureweb OG : http://www.futureweb.at // Submitted by Andreas Schnederle-Wagner *.futurecms.at +*.ex.futurecms.at +*.in.futurecms.at futurehosting.at futuremailing.at *.ex.ortsinfo.at *.kunden.ortsinfo.at *.statics.cloud -// GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains -// Submitted by David Illsley +// GDS : https://www.gov.uk/service-manual/technology/managing-domain-names +// Submitted by Stephen Ford +independent-commission.uk +independent-inquest.uk +independent-inquiry.uk +independent-panel.uk +independent-review.uk +public-inquiry.uk +royal-commission.uk service.gov.uk +// CDDO : https://www.gov.uk/guidance/get-an-api-domain-on-govuk +// Submitted by Jamie Tanna +api.gov.uk + +// Gehirn Inc. : https://www.gehirn.co.jp/ +// Submitted by Kohei YOSHIDA +gehirn.ne.jp +usercontent.jp + +// Gentlent, Inc. : https://www.gentlent.com +// Submitted by Tom Klein +gentapps.com +gentlentapis.com +lab.ms +cdn-edges.net + +// Ghost Foundation : https://ghost.org +// Submitted by Matt Hanley +ghost.io + +// GignoSystemJapan: http://gsj.bz +// Submitted by GignoSystemJapan +gsj.bz + // GitHub, Inc. // Submitted by Patrick Toomey -github.io githubusercontent.com +githubpreview.dev +github.io // GitLab, Inc. // Submitted by Alex Hanselka gitlab.io +// Gitplac.si - https://gitplac.si +// Submitted by Aljaž Starc +gitapp.si +gitpage.si + +// Glitch, Inc : https://glitch.com +// Submitted by Mads Hartmann +glitch.me + +// Global NOG Alliance : https://nogalliance.org/ +// Submitted by Sander Steffann +nog.community + +// Globe Hosting SRL : https://www.globehosting.com/ +// Submitted by Gavin Brown +co.ro +shop.ro + +// GMO Pepabo, Inc. : https://pepabo.com/ +// Submitted by dojineko +lolipop.io + +// GOV.UK Platform as a Service : https://www.cloud.service.gov.uk/ +// Submitted by Tom Whitwell +cloudapps.digital +london.cloudapps.digital + +// GOV.UK Pay : https://www.payments.service.gov.uk/ +// Submitted by Richard Baker +pymnt.uk + // UKHomeOffice : https://www.gov.uk/government/organisations/home-office // Submitted by Jon Shanks homeoffice.gov.uk @@ -11527,7 +12048,6 @@ homeoffice.gov.uk // GlobeHosting, Inc. // Submitted by Zoltan Egresi ro.im -shop.ro // GoIP DNS Services : http://www.goip.de // Submitted by Christian Poulter @@ -11535,8 +12055,24 @@ goip.de // Google, Inc. // Submitted by Eduardo Vela +run.app +a.run.app +web.app *.0emm.com appspot.com +*.r.appspot.com +codespot.com +googleapis.com +googlecode.com +pagespeedmobilizer.com +publishproxy.com +withgoogle.com +withyoutube.com +*.gateway.dev +cloud.goog +translate.goog +*.usercontent.goog +cloudfunctions.net blogspot.ae blogspot.al blogspot.am @@ -11611,23 +12147,45 @@ blogspot.td blogspot.tw blogspot.ug blogspot.vn -cloudfunctions.net -cloud.goog -codespot.com -googleapis.com -googlecode.com -pagespeedmobilizer.com -publishproxy.com -withgoogle.com -withyoutube.com + +// Goupile : https://goupile.fr +// Submitted by Niels Martignene +goupile.fr + +// Group 53, LLC : https://www.group53.com +// Submitted by Tyler Todd +awsmppl.com + +// GünstigBestellen : https://günstigbestellen.de +// Submitted by Furkan Akkoc +günstigbestellen.de +günstigliefern.de + +// Hakaran group: http://hakaran.cz +// Submited by Arseniy Sokolov +fin.ci +free.hr +caa.li +ua.rs +conf.se + +// Handshake : https://handshake.org +// Submitted by Mike Damm +hs.zone +hs.run // Hashbang : https://hashbang.sh hashbang.sh // Hasura : https://hasura.io // Submitted by Shahidh K Muhammed +hasura.app hasura-app.io +// Heilbronn University of Applied Sciences - Faculty Informatics (GitLab Pages): https://www.hs-heilbronn.de +// Submitted by Richard Zowalla +pages.it.hs-heilbronn.de + // Hepforge : https://www.hepforge.org // Submitted by David Grellscheid hepforge.org @@ -11637,14 +12195,83 @@ hepforge.org herokuapp.com herokussl.com +// Hibernating Rhinos +// Submitted by Oren Eini +ravendb.cloud +myravendb.com +ravendb.community +ravendb.me +development.run +ravendb.run + +// home.pl S.A.: https://home.pl +// Submited by Krzysztof Wolski +homesklep.pl + +// Hong Kong Productivity Council: https://www.hkpc.org/ +// Submitted by SECaaS Team +secaas.hk + +// Hoplix : https://www.hoplix.com +// Submitted by Danilo De Franco +hoplix.shop + + +// HOSTBIP REGISTRY : https://www.hostbip.com/ +// Submitted by Atanunu Igbunuroghene +orx.biz +biz.gl +col.ng +firm.ng +gen.ng +ltd.ng +ngo.ng +edu.scot +sch.so +org.yt + +// HostyHosting (hostyhosting.com) +hostyhosting.io + +// Häkkinen.fi +// Submitted by Eero Häkkinen +häkkinen.fi + // Ici la Lune : http://www.icilalune.com/ // Submitted by Simon Morvan +*.moonscale.io moonscale.net // iki.fi // Submitted by Hannu Aronsson iki.fi +// Impertrix Solutions : +// Submitted by Zhixiang Zhao +impertrixcdn.com +impertrix.com + +// Incsub, LLC: https://incsub.com/ +// Submitted by Aaron Edwards +smushcdn.com +wphostedmail.com +wpmucdn.com +tempurl.host +wpmudev.host + +// Individual Network Berlin e.V. : https://www.in-berlin.de/ +// Submitted by Christian Seitz +dyn-berlin.de +in-berlin.de +in-brb.de +in-butter.de +in-dsl.de +in-dsl.net +in-dsl.org +in-vpn.de +in-vpn.net +in-vpn.org + // info.at : http://www.info.at/ biz.at info.at @@ -11687,10 +12314,127 @@ to.leg.br // Submitted by Wolfgang Schwarz pixolino.com +// Internet-Pro, LLP: https://netangels.ru/ +// Submited by Vasiliy Sheredeko +na4u.ru + +// iopsys software solutions AB : https://iopsys.eu/ +// Submitted by Roman Azarenko +iopsys.se + // IPiFony Systems, Inc. : https://www.ipifony.com/ // Submitted by Matthew Hardeman ipifony.net +// IServ GmbH : https://iserv.eu +// Submitted by Kim-Alexander Brodowski +mein-iserv.de +schulserver.de +test-iserv.de +iserv.dev + +// I-O DATA DEVICE, INC. : http://www.iodata.com/ +// Submitted by Yuji Minagawa +iobb.net + +// Jelastic, Inc. : https://jelastic.com/ +// Submited by Ihor Kolodyuk +mel.cloudlets.com.au +cloud.interhostsolutions.be +users.scale.virtualcloud.com.br +mycloud.by +alp1.ae.flow.ch +appengine.flow.ch +es-1.axarnet.cloud +diadem.cloud +vip.jelastic.cloud +jele.cloud +it1.eur.aruba.jenv-aruba.cloud +it1.jenv-aruba.cloud +keliweb.cloud +cs.keliweb.cloud +oxa.cloud +tn.oxa.cloud +uk.oxa.cloud +primetel.cloud +uk.primetel.cloud +ca.reclaim.cloud +uk.reclaim.cloud +us.reclaim.cloud +ch.trendhosting.cloud +de.trendhosting.cloud +jele.club +amscompute.com +clicketcloud.com +dopaas.com +hidora.com +paas.hosted-by-previder.com +rag-cloud.hosteur.com +rag-cloud-ch.hosteur.com +jcloud.ik-server.com +jcloud-ver-jpc.ik-server.com +demo.jelastic.com +kilatiron.com +paas.massivegrid.com +jed.wafaicloud.com +lon.wafaicloud.com +ryd.wafaicloud.com +j.scaleforce.com.cy +jelastic.dogado.eu +fi.cloudplatform.fi +demo.datacenter.fi +paas.datacenter.fi +jele.host +mircloud.host +paas.beebyte.io +sekd1.beebyteapp.io +jele.io +cloud-fr1.unispace.io +jc.neen.it +cloud.jelastic.open.tim.it +jcloud.kz +upaas.kazteleport.kz +cloudjiffy.net +fra1-de.cloudjiffy.net +west1-us.cloudjiffy.net +jls-sto1.elastx.net +jls-sto2.elastx.net +jls-sto3.elastx.net +faststacks.net +fr-1.paas.massivegrid.net +lon-1.paas.massivegrid.net +lon-2.paas.massivegrid.net +ny-1.paas.massivegrid.net +ny-2.paas.massivegrid.net +sg-1.paas.massivegrid.net +jelastic.saveincloud.net +nordeste-idc.saveincloud.net +j.scaleforce.net +jelastic.tsukaeru.net +sdscloud.pl +unicloud.pl +mircloud.ru +jelastic.regruhosting.ru +enscaled.sg +jele.site +jelastic.team +orangecloud.tn +j.layershift.co.uk +phx.enscaled.us +mircloud.us + +// Jino : https://www.jino.ru +// Submitted by Sergey Ulyashin +myjino.ru +*.hosting.myjino.ru +*.landing.myjino.ru +*.spectrum.myjino.ru +*.vps.myjino.ru + +// Jotelulu S.L. : https://jotelulu.com +// Submitted by Daniel Fariña +jotelulu.cloud + // Joyent : https://www.joyent.com/ // Submitted by Brian Bennett *.triton.zone @@ -11700,52 +12444,210 @@ ipifony.net // Submitted by Stefan Keim js.org +// KaasHosting : http://www.kaashosting.nl/ +// Submitted by Wouter Bakker +kaas.gg +khplay.nl + // Keyweb AG : https://www.keyweb.de // Submitted by Martin Dannehl keymachine.de +// KingHost : https://king.host +// Submitted by Felipe Keller Braz +kinghost.net +uni5.net + // KnightPoint Systems, LLC : http://www.knightpoint.com/ // Submitted by Roy Keene knightpoint.systems +// KoobinEvent, SL: https://www.koobin.com +// Submitted by Iván Oliva +koobin.events + +// KUROKU LTD : https://kuroku.ltd/ +// Submitted by DisposaBoy +oya.to + +// Katholieke Universiteit Leuven: https://www.kuleuven.be +// Submitted by Abuse KU Leuven +kuleuven.cloud +ezproxy.kuleuven.be + // .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf co.krd edu.krd +// Krellian Ltd. : https://krellian.com +// Submitted by Ben Francis +krellian.net +webthings.io + // LCube - Professional hosting e.K. : https://www.lcube-webhosting.de // Submitted by Lars Laehn git-repos.de lcube-server.de svn-repos.de +// Leadpages : https://www.leadpages.net +// Submitted by Greg Dallavalle +leadpages.co +lpages.co +lpusercontent.com + +// Lelux.fi : https://lelux.fi/ +// Submitted by Lelux Admin +lelux.site + +// Lifetime Hosting : https://Lifetime.Hosting/ +// Submitted by Mike Fillator +co.business +co.education +co.events +co.financial +co.network +co.place +co.technology + +// Lightmaker Property Manager, Inc. : https://app.lmpm.com/ +// Submitted by Greg Holland +app.lmpm.com + +// linkyard ldt: https://www.linkyard.ch/ +// Submitted by Mario Siegenthaler +linkyard.cloud +linkyard-cloud.ch + +// Linode : https://linode.com +// Submitted by +members.linode.com +*.nodebalancer.linode.com +*.linodeobjects.com +ip.linodeusercontent.com + // LiquidNet Ltd : http://www.liquidnetlimited.com/ // Submitted by Victor Velchev we.bs +// localzone.xyz +// Submitted by Kenny Niehage +localzone.xyz + +// Log'in Line : https://www.loginline.com/ +// Submitted by Rémi Mach +loginline.app +loginline.dev +loginline.io +loginline.services +loginline.site + +// Lokalized : https://lokalized.nl +// Submitted by Noah Taheij +servers.run + +// Lõhmus Family, The +// Submitted by Heiki Lõhmus +lohmus.me + +// LubMAN UMCS Sp. z o.o : https://lubman.pl/ +// Submitted by Ireneusz Maliszewski +krasnik.pl +leczna.pl +lubartow.pl +lublin.pl +poniatowa.pl +swidnik.pl + +// Lug.org.uk : https://lug.org.uk +// Submitted by Jon Spriggs +glug.org.uk +lug.org.uk +lugs.org.uk + // Lukanet Ltd : https://lukanet.com // Submitted by Anton Avramov barsy.bg +barsy.co.uk +barsyonline.co.uk +barsycenter.com barsyonline.com +barsy.club barsy.de barsy.eu barsy.in +barsy.info +barsy.io +barsy.me +barsy.menu +barsy.mobi barsy.net barsy.online +barsy.org +barsy.pro +barsy.pub +barsy.ro +barsy.shop +barsy.site barsy.support +barsy.uk // Magento Commerce // Submitted by Damien Tournoud *.magentosite.cloud +// May First - People Link : https://mayfirst.org/ +// Submitted by Jamie McClelland +mayfirst.info +mayfirst.org + // Mail.Ru Group : https://hb.cldmail.ru // Submitted by Ilya Zaretskiy hb.cldmail.ru +// Mail Transfer Platform : https://www.neupeer.com +// Submitted by Li Hui +cn.vu + +// Maze Play: https://www.mazeplay.com +// Submitted by Adam Humpherys +mazeplay.com + +// mcpe.me : https://mcpe.me +// Submitted by Noa Heyl +mcpe.me + +// McHost : https://mchost.ru +// Submitted by Evgeniy Subbotin +mcdir.me +mcdir.ru +mcpre.ru +vps.mcdir.ru + +// Mediatech : https://mediatech.by +// Submitted by Evgeniy Kozhuhovskiy +mediatech.by +mediatech.dev + +// Medicom Health : https://medicomhealth.com +// Submitted by Michael Olson +hra.health + +// Memset hosting : https://www.memset.com +// Submitted by Tom Whitwell +miniserver.com +memset.net + // MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ // Submitted by Zdeněk Šustr -cloud.metacentrum.cz +*.cloud.metacentrum.cz custom.metacentrum.cz +// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ +// Submitted by Radim Janča +flt.cloud.muni.cz +usr.cloud.muni.cz + // Meteor Development Group : https://www.meteor.com/hosting // Submitted by Pierre Carrier meteorapp.com @@ -11754,11 +12656,34 @@ eu.meteorapp.com // Michau Enterprises Limited : http://www.co.pl/ co.pl -// Microsoft : http://microsoft.com -// Submitted by Barry Dorrans +// Microsoft Corporation : http://microsoft.com +// Submitted by Mitch Webster +*.azurecontainer.io azurewebsites.net azure-mobile.net cloudapp.net +azurestaticapps.net +centralus.azurestaticapps.net +eastasia.azurestaticapps.net +eastus2.azurestaticapps.net +westeurope.azurestaticapps.net +westus2.azurestaticapps.net + +// minion.systems : http://minion.systems +// Submitted by Robert Böttinger +csx.cc + +// Mintere : https://mintere.com/ +// Submitted by Ben Aubin +mintere.site + +// MobileEducation, LLC : https://joinforte.com +// Submitted by Grayson Martin +forte.id + +// Mozilla Corporation : https://mozilla.com +// Submitted by Ben Francis +mozilla-iot.org // Mozilla Foundation : https://mozilla.org/ // Submitted by glob @@ -11770,10 +12695,52 @@ net.ru org.ru pp.ru +// Mythic Beasts : https://www.mythic-beasts.com +// Submitted by Paul Cammish +hostedpi.com +customer.mythic-beasts.com +caracal.mythic-beasts.com +fentiger.mythic-beasts.com +lynx.mythic-beasts.com +ocelot.mythic-beasts.com +oncilla.mythic-beasts.com +onza.mythic-beasts.com +sphinx.mythic-beasts.com +vs.mythic-beasts.com +x.mythic-beasts.com +yali.mythic-beasts.com +cust.retrosnub.co.uk + +// Nabu Casa : https://www.nabucasa.com +// Submitted by Paulus Schoutsen +ui.nabu.casa + +// Names.of.London : https://names.of.london/ +// Submitted by James Stevens or +pony.club +of.fashion +in.london +of.london +from.marketing +with.marketing +for.men +repair.men +and.mom +for.mom +for.one +under.one +for.sale +that.win +from.work +to.work + +// Net at Work Gmbh : https://www.netatwork.de +// Submitted by Jan Jaeschke +cloud.nospamproxy.com + // Netlify : https://www.netlify.com // Submitted by Jessica Parsons -bitballoon.com -netlify.com +netlify.app // Neustar Inc. // Submitted by Trung Tran @@ -11783,10 +12750,56 @@ netlify.com // Submitted by Alan Shreve ngrok.io +// Nimbus Hosting Ltd. : https://www.nimbushosting.co.uk/ +// Submitted by Nicholas Ford +nh-serv.co.uk + // NFSN, Inc. : https://www.NearlyFreeSpeech.NET/ // Submitted by Jeff Wheelhouse nfshost.com +// Noop : https://noop.app +// Submitted by Nathaniel Schweinberg +*.developer.app +noop.app + +// Northflank Ltd. : https://northflank.com/ +// Submitted by Marco Suter +*.northflank.app +*.code.run + +// Noticeable : https://noticeable.io +// Submitted by Laurent Pellegrino +noticeable.news + +// Now-DNS : https://now-dns.com +// Submitted by Steve Russell +dnsking.ch +mypi.co +n4t.co +001www.com +ddnslive.com +myiphost.com +forumz.info +16-b.it +32-b.it +64-b.it +soundcast.me +tcp4.me +dnsup.net +hicam.net +now-dns.net +ownip.net +vpndns.net +dynserv.org +now-dns.org +x443.pw +now-dns.top +ntdll.top +freeddns.us +crafting.xyz +zapto.xyz + // nsupdate.info : https://www.nsupdate.info/ // Submitted by Thomas Waldmann nsupdate.info @@ -11884,78 +12897,85 @@ zapto.org // Submitted by Konstantin Nosov stage.nodeart.io -// Nodum B.V. : https://nodum.io/ -// Submitted by Wietse Wind -nodum.co -nodum.io +// Nucleos Inc. : https://nucleos.com +// Submitted by Piotr Zduniak +pcloud.host // NYC.mn : http://www.information.nyc.mn // Submitted by Matthew Brown nyc.mn -// NymNom : https://nymnom.com/ -// Submitted by Dave McCormack -nom.ae -nom.ai -nom.al -nym.by -nym.bz -nom.cl -nom.gd -nom.gl -nym.gr -nom.gt -nom.hn -nom.im -nym.kz -nym.la -nom.li -nym.li -nym.lt -nym.lu -nym.me -nom.mk -nym.mx -nom.nu -nym.nz -nym.pe -nym.pt -nom.pw -nom.qa -nom.rs -nom.si -nym.sk -nym.su -nym.sx -nym.tw -nom.ug -nom.uy -nom.vc -nom.vg +// Observable, Inc. : https://observablehq.com +// Submitted by Mike Bostock +static.observableusercontent.com // Octopodal Solutions, LLC. : https://ulterius.io/ // Submitted by Andrew Sampson cya.gg +// OMG.LOL : +// Submitted by Adam Newbold +omg.lol + +// Omnibond Systems, LLC. : https://www.omnibond.com +// Submitted by Cole Estep +cloudycluster.net + +// OmniWe Limited: https://omniwe.com +// Submitted by Vicary Archangel +omniwe.site + +// One.com: https://www.one.com/ +// Submitted by Jacob Bunk Nielsen +service.one + // One Fold Media : http://www.onefoldmedia.com/ // Submitted by Eddie Jones nid.io +// Open Social : https://www.getopensocial.com/ +// Submitted by Alexander Varwijk +opensocial.site + // OpenCraft GmbH : http://opencraft.com/ // Submitted by Sven Marnach opencraft.hosting +// OpenResearch GmbH: https://openresearch.com/ +// Submitted by Philipp Schmid +orsites.com + // Opera Software, A.S.A. // Submitted by Yngve Pettersen operaunite.com +// Oursky Limited : https://authgear.com/, https://skygear.io/ +// Submited by Authgear Team , Skygear Developer +authgear-staging.com +authgearapps.com +skygearapp.com + // OutSystems // Submitted by Duarte Santos outsystemscloud.com -// OwnProvider : http://www.ownprovider.com +// OVHcloud: https://ovhcloud.com +// Submitted by Vincent Cassé +*.webpaas.ovh.net +*.hosting.ovh.net + +// OwnProvider GmbH: http://www.ownprovider.com // Submitted by Jan Moennich ownprovider.com +own.pm + +// OwO : https://whats-th.is/ +// Submitted by Dean Sheather +*.owo.codes + +// OX : http://www.ox.rs +// Submitted by Adam Grand +ox.rs // oy.lc // Submitted by Charly Coste @@ -11969,6 +12989,21 @@ pgfog.com // Submitted by Jason Kriss pagefrontapp.com +// PageXL : https://pagexl.com +// Submitted by Yann Guichard +pagexl.com + +// Paywhirl, Inc : https://paywhirl.com/ +// Submitted by Daniel Netzer +*.paywhirl.com + +// pcarrier.ca Software Inc: https://pcarrier.ca/ +// Submitted by Pierre Carrier +bar0.net +bar1.net +bar2.net +rdv.to + // .pl domains (grandfathered) art.pl gliwice.pl @@ -11986,14 +13021,57 @@ gotpantheon.com // Submitted by Steve Leung mypep.link +// Perspecta : https://perspecta.com/ +// Submitted by Kenneth Van Alstyne +perspecta.cloud + +// PE Ulyanov Kirill Sergeevich : https://airy.host +// Submitted by Kirill Ulyanov +lk3.ru + // Planet-Work : https://www.planet-work.com/ // Submitted by Frédéric VANNIÈRE on-web.fr // Platform.sh : https://platform.sh // Submitted by Nikola Kotur -*.platform.sh +bc.platform.sh +ent.platform.sh +eu.platform.sh +us.platform.sh *.platformsh.site +*.tst.site + +// Platter: https://platter.dev +// Submitted by Patrick Flor +platter-app.com +platter-app.dev +platterp.us + +// Plesk : https://www.plesk.com/ +// Submitted by Anton Akhtyamov +pdns.page +plesk.page +pleskns.com + +// Port53 : https://port53.io/ +// Submitted by Maximilian Schieder +dyn53.io + +// Positive Codes Technology Company : http://co.bn/faq.html +// Submitted by Zulfais +co.bn + +// Postman, Inc : https://postman.com +// Submitted by Rahul Dhawan +postman-echo.com +pstmn.io +mock.pstmn.io +httpbin.org + +//prequalifyme.today : https://prequalifyme.today +//Submitted by DeepakTiwari deepak@ivylead.io +prequalifyme.today // prgmr.com : https://prgmr.com/ // Submitted by Sarah Newman @@ -12003,6 +13081,14 @@ xen.prgmr.com // Submitted by registry priv.at +// privacytools.io : https://www.privacytools.io/ +// Submitted by Jonah Aragon +prvcy.page + +// Protocol Labs : https://protocol.ai/ +// Submitted by Michael Burns +*.dweb.link + // Protonet GmbH : http://protonet.io // Submitted by Martin Meier protonet.io @@ -12012,10 +13098,52 @@ protonet.io chirurgiens-dentistes-en-france.fr byen.site +// pubtls.org: https://www.pubtls.org +// Submitted by Kor Nielsen +pubtls.org + +// PythonAnywhere LLP: https://www.pythonanywhere.com +// Submitted by Giles Thomas +pythonanywhere.com +eu.pythonanywhere.com + +// QOTO, Org. +// Submitted by Jeffrey Phillips Freeman +qoto.io + +// Qualifio : https://qualifio.com/ +// Submitted by Xavier De Cock +qualifioapp.com + +// QuickBackend: https://www.quickbackend.com +// Submitted by Dani Biro +qbuser.com + +// Rad Web Hosting: https://radwebhosting.com +// Submitted by Scott Claeys +cloudsite.builders + +// Redgate Software: https://red-gate.com +// Submitted by Andrew Farries +instances.spawn.cc + +// Redstar Consultants : https://www.redstarconsultants.com/ +// Submitted by Jons Slemmer +instantcloud.cn + +// Russian Academy of Sciences +// Submitted by Tech Support +ras.ru + // QA2 // Submitted by Daniel Dent (https://www.danieldent.com/) qa2.com +// QCX +// Submitted by Cassandra Beelen +qcx.io +*.sys.qcx.io + // QNAP System Inc : https://www.qnap.com // Submitted by Nick Chang dev-myqnapcloud.com @@ -12036,10 +13164,40 @@ vaporcloud.io rackmaze.com rackmaze.net +// Rakuten Games, Inc : https://dev.viberplay.io +// Submitted by Joshua Zhang +g.vbrplsbx.io + +// Rancher Labs, Inc : https://rancher.com +// Submitted by Vincent Fiduccia +*.on-k3s.io +*.on-rancher.cloud +*.on-rio.io + +// Read The Docs, Inc : https://www.readthedocs.org +// Submitted by David Fischer +readthedocs.io + // Red Hat, Inc. OpenShift : https://openshift.redhat.com/ // Submitted by Tim Kramer rhcloud.com +// Render : https://render.com +// Submitted by Anurag Goel +app.render.com +onrender.com + +// Repl.it : https://repl.it +// Submitted by Mason Clayton +repl.co +id.repl.co +repl.run + +// Resin.io : https://resin.io +// Submitted by Tim Perry +resindevice.io +devices.resinstaging.io + // RethinkDB : https://www.rethinkdb.com/ // Submitted by Chris Kastorff hzc.io @@ -12047,9 +13205,33 @@ hzc.io // Revitalised Limited : http://www.revitalised.co.uk // Submitted by Jack Price wellbeingzone.eu -ptplus.fit wellbeingzone.co.uk +// Rico Developments Limited : https://adimo.co +// Submitted by Colin Brown +adimo.co.uk + +// Riseup Networks : https://riseup.net +// Submitted by Micah Anderson +itcouldbewor.se + +// Rochester Institute of Technology : http://www.rit.edu/ +// Submitted by Jennifer Herting +git-pages.rit.edu + +// Rusnames Limited: http://rusnames.ru/ +// Submitted by Sergey Zotov +биз.рус +ком.рус +крым.рус +мир.рус +мск.рус +орг.рус +самара.рус +сочи.рус +спб.рус +я.рус + // Sandstorm Development Group, Inc. : https://sandcats.io/ // Submitted by Asheesh Laroia sandcats.io @@ -12059,6 +13241,19 @@ sandcats.io logoip.de logoip.com +// schokokeks.org GbR : https://schokokeks.org/ +// Submitted by Hanno Böck +schokokeks.net + +// Scottish Government: https://www.gov.scot +// Submitted by Martin Ellis +gov.scot +service.gov.scot + +// Scry Security : http://www.scrysec.com +// Submitted by Shante Adam +scrysec.com + // Securepoint GmbH : https://www.securepoint.de // Submitted by Erik Anders firewall-gateway.com @@ -12072,9 +13267,25 @@ my-firewall.org myfirewall.org spdns.org -// SensioLabs, SAS : https://sensiolabs.com/ -// Submitted by Fabien Potencier -*.sensiosite.cloud +// Seidat : https://www.seidat.com +// Submitted by Artem Kondratev +seidat.net + +// Sellfy : https://sellfy.com +// Submitted by Yuriy Romadin +sellfy.store + +// Senseering GmbH : https://www.senseering.de +// Submitted by Felix Mönckemeyer +senseering.net + +// Sendmsg: https://www.sendmsg.co.il +// Submitted by Assaf Stern +minisite.ms + +// Service Magnet : https://myservicemagnet.com +// Submitted by Dave Sanders +magnet.page // Service Online LLC : http://drs.ua/ // Submitted by Serhii Bulakh @@ -12082,6 +13293,11 @@ biz.ua co.ua pp.ua +// Shift Crypto AG : https://shiftcrypto.ch +// Submitted by alex +shiftcrypto.dev +shiftcrypto.io + // ShiftEdit : https://shiftedit.net/ // Submitted by Adam Jimenez shiftedit.io @@ -12090,6 +13306,22 @@ shiftedit.io // Submitted by Alex Bowers myshopblocks.com +// Shopify : https://www.shopify.com +// Submitted by Alex Richter +myshopify.com + +// Shopit : https://www.shopitcommerce.com/ +// Submitted by Craig McMahon +shopitsite.com + +// shopware AG : https://shopware.com +// Submitted by Jens Küper +shopware.store + +// Siemens Mobility GmbH +// Submitted by Oliver Graebner +mo-siemens.io + // SinaAppEngine : http://sae.sina.com.cn/ // Submitted by SinaAppEngine 1kapp.com @@ -12098,18 +13330,61 @@ applinzi.com sinaapp.com vipsinaapp.com +// Siteleaf : https://www.siteleaf.com/ +// Submitted by Skylar Challand +siteleaf.net + // Skyhat : http://www.skyhat.io // Submitted by Shante Adam bounty-full.com alpha.bounty-full.com beta.bounty-full.com +// Small Technology Foundation : https://small-tech.org +// Submitted by Aral Balkan +small-web.org + +// Smoove.io : https://www.smoove.io/ +// Submitted by Dan Kozak +vp4.me + +// Snowplow Analytics : https://snowplowanalytics.com/ +// Submitted by Ian Streeter +try-snowplow.com + +// SourceHut : https://sourcehut.org +// Submitted by Drew DeVault +srht.site + +// Stackhero : https://www.stackhero.io +// Submitted by Adrien Gillon +stackhero-network.com + +// Staclar : https://staclar.com +// Submitted by Matthias Merkel +novecore.site + // staticland : https://static.land // Submitted by Seth Vincent static.land dev.static.land sites.static.land +// Storebase : https://www.storebase.io +// Submitted by Tony Schirmer +storebase.store + +// Strategic System Consulting (eApps Hosting): https://www.eapps.com/ +// Submitted by Alex Oancea +vps-host.net +atl.jelastic.vps-host.net +njs.jelastic.vps-host.net +ric.jelastic.vps-host.net + +// Sony Interactive Entertainment LLC : https://sie.com/ +// Submitted by David Coles +playstation-cloud.com + // SourceLair PC : https://www.sourcelair.com // Submitted by Antonis Kalipetis apps.lair.io @@ -12119,18 +13394,69 @@ apps.lair.io // Submitted by Reza Akhavan spacekit.io -// Stackspace : https://www.stackspace.io/ -// Submitted by Lina He -stackspace.space +// SpeedPartner GmbH: https://www.speedpartner.de/ +// Submitted by Stefan Neufeind +customer.speedpartner.de + +// Spreadshop (sprd.net AG) : https://www.spreadshop.com/ +// Submitted by Martin Breest +myspreadshop.at +myspreadshop.com.au +myspreadshop.be +myspreadshop.ca +myspreadshop.ch +myspreadshop.com +myspreadshop.de +myspreadshop.dk +myspreadshop.es +myspreadshop.fi +myspreadshop.fr +myspreadshop.ie +myspreadshop.it +myspreadshop.net +myspreadshop.nl +myspreadshop.no +myspreadshop.pl +myspreadshop.se +myspreadshop.co.uk + +// Standard Library : https://stdlib.com +// Submitted by Jacob Lee +api.stdlib.com // Storj Labs Inc. : https://storj.io/ // Submitted by Philip Hutchins storj.farm +// Studenten Net Twente : http://www.snt.utwente.nl/ +// Submitted by Silke Hofstra +utwente.io + +// Student-Run Computing Facility : https://www.srcf.net/ +// Submitted by Edwin Balani +soc.srcf.net +user.srcf.net + // Sub 6 Limited: http://www.sub6.com // Submitted by Dan Miller temp-dns.com +// Supabase : https://supabase.io +// Submitted by Inian Parameshwaran +supabase.co +supabase.in +supabase.net +su.paba.se + +// Symfony, SAS : https://symfony.com/ +// Submitted by Fabien Potencier +*.s5y.io +*.sensiosite.cloud + +// Syncloud : https://syncloud.org +// Submitted by Boris Rybalkin +syncloud.it + // Synology, Inc. : https://www.synology.com/ // Submitted by Rony Weng diskstation.me @@ -12147,11 +13473,21 @@ i234.me myds.me synology.me vpnplus.to +direct.quickconnect.to + +// Tabit Technologies Ltd. : https://tabit.cloud/ +// Submitted by Oren Agiv +tabitorder.co.il // TAIFUN Software AG : http://taifun-software.de // Submitted by Bjoern Henke taifun-dns.de +// Tailscale Inc. : https://www.tailscale.com +// Submitted by David Anderson +beta.tailscale.net +ts.net + // TASK geographical domains (www.task.gda.pl/uslugi/dns) gda.pl gdansk.pl @@ -12159,18 +13495,63 @@ gdynia.pl med.pl sopot.pl +// team.blue https://team.blue +// Submitted by Cedric Dubois +site.tb-hosting.com + +// Teckids e.V. : https://www.teckids.org +// Submitted by Dominik George +edugit.io +s3.teckids.org + +// Telebit : https://telebit.cloud +// Submitted by AJ ONeal +telebit.app +telebit.io +*.telebit.xyz + +// The Gwiddle Foundation : https://gwiddlefoundation.org.uk +// Submitted by Joshua Bayfield +gwiddle.co.uk + // Thingdust AG : https://thingdust.com/ // Submitted by Adrian Imboden +*.firenet.ch +*.svc.firenet.ch +reservd.com +thingdustdata.com cust.dev.thingdust.io cust.disrec.thingdust.io cust.prod.thingdust.io cust.testing.thingdust.io +reservd.dev.thingdust.io +reservd.disrec.thingdust.io +reservd.testing.thingdust.io + +// ticket i/O GmbH : https://ticket.io +// Submitted by Christian Franke +tickets.io + +// Tlon.io : https://tlon.io +// Submitted by Mark Staarink +arvo.network +azimuth.network +tlon.network + +// Tor Project, Inc. : https://torproject.org +// Submitted by Antoine Beaupré bloxcms.com townnews-staging.com +// TradableBits: https://tradablebits.com +// Submitted by Dmitry Khrisanov dmitry@tradablebits.com +tbits.me + // TrafficPlex GmbH : https://www.trafficplex.de/ // Submitted by Phillipp Röll 12hp.at @@ -12193,7 +13574,7 @@ lima-city.rocks webspace.rocks lima.zone -// TransIP : htts://www.transip.nl +// TransIP : https://www.transip.nl // Submitted by Rory Breuk *.transurl.be *.transurl.eu @@ -12219,9 +13600,14 @@ syno-ds.de synology-diskstation.de synology-ds.de +// Typeform : https://www.typeform.com +// Submitted by Sergi Ferriz +pro.typeform.com + // Uberspace : https://uberspace.de // Submitted by Moritz Werner uber.space +*.uberspace.de // UDR Limited : http://www.udr.hk.com // Submitted by registry @@ -12230,10 +13616,34 @@ hk.org ltd.hk inc.hk +// United Gameserver GmbH : https://united-gameserver.de +// Submitted by Stefan Schwarz +virtualuser.de +virtual-user.de + +// Upli : https://upli.io +// Submitted by Lenny Bakkalian +upli.io + +// urown.net : https://urown.net +// Submitted by Hostmaster +urown.cloud +dnsupdate.info + // .US // Submitted by Ed Moore lib.de.us +// VeryPositive SIA : http://very.lv +// Submitted by Danko Aleksejevs +2038.io + +// Vercel, Inc : https://vercel.com/ +// Submitted by Connor Davis +vercel.app +vercel.dev +now.sh + // Viprinet Europe GmbH : http://www.viprinet.com // Submitted by Simon Kissel router.management @@ -12242,6 +13652,84 @@ router.management // Submitted by Adnan RIHAN v-info.info +// Voorloper.com: https://voorloper.com +// Submitted by Nathan van Bakel +voorloper.cloud + +// Voxel.sh DNS : https://voxel.sh/dns/ +// Submitted by Mia Rehlinger +neko.am +nyaa.am +be.ax +cat.ax +es.ax +eu.ax +gg.ax +mc.ax +us.ax +xy.ax +nl.ci +xx.gl +app.gp +blog.gt +de.gt +to.gt +be.gy +cc.hn +blog.kg +io.kg +jp.kg +tv.kg +uk.kg +us.kg +de.ls +at.md +de.md +jp.md +to.md +indie.porn +vxl.sh +ch.tc +me.tc +we.tc +nyan.to +at.vg +blog.vu +dev.vu +me.vu + +// V.UA Domain Administrator : https://domain.v.ua/ +// Submitted by Serhii Rostilo +v.ua + +// Vultr Objects : https://www.vultr.com/products/object-storage/ +// Submitted by Niels Maumenee +*.vultrobjects.com + +// Waffle Computer Inc., Ltd. : https://docs.waffleinfo.com +// Submitted by Masayuki Note +wafflecell.com + +// WapBlog.ID : https://www.wapblog.id +// Submitted by Fajar Sodik +idnblogger.com +indowapblog.com +bloger.id +wblog.id +wbq.me +fastblog.net + +// WebHare bv: https://www.webhare.com/ +// Submitted by Arnold Hendriks +*.webhare.dev + +// WebHotelier Technologies Ltd: https://www.webhotelier.net/ +// Submitted by Apostolos Tsakpinis +reserve-online.net +reserve-online.com +bookonline.app +hotelwithflight.com + // WeDeploy by Liferay, Inc. : https://www.wedeploy.com // Submitted by Henrique Vicente wedeploy.io @@ -12252,9 +13740,56 @@ wedeploy.sh // Submitted by Jung Jin remotewd.com +// WIARD Enterprises : https://wiardweb.com +// Submitted by Kidd Hustle +pages.wiardweb.com + // Wikimedia Labs : https://wikitech.wikimedia.org -// Submitted by Yuvi Panda +// Submitted by Arturo Borrero Gonzalez wmflabs.org +toolforge.org +wmcloud.org + +// WISP : https://wisp.gg +// Submitted by Stepan Fedotov +panel.gg +daemon.panel.gg + +// WoltLab GmbH : https://www.woltlab.com +// Submitted by Tim Düsterhus +woltlab-demo.com +myforum.community +community-pro.de +diskussionsbereich.de +community-pro.net +meinforum.net + +// Woods Valldata : https://www.woodsvalldata.co.uk/ +// Submitted by Chris Whittle +affinitylottery.org.uk +raffleentry.org.uk +weeklylottery.org.uk + +// WP Engine : https://wpengine.com/ +// Submitted by Michael Smith +// Submitted by Brandon DuRette +wpenginepowered.com +js.wpenginepowered.com + +// Wix.com, Inc. : https://www.wix.com +// Submitted by Shahar Talmi +wixsite.com +editorx.io + +// XenonCloud GbR: https://xenoncloud.net +// Submitted by Julian Uphoff +half.host + +// XnBay Technology : http://www.xnbay.com/ +// Submitted by XnBay Developer +xnbay.com +u2.xnbay.com +u2-local.xnbay.com // XS4ALL Internet bv : https://www.xs4all.nl/ // Submitted by Daniel Mostertman @@ -12262,6 +13797,16 @@ cistron.nl demon.nl xs4all.space +// Yandex.Cloud LLC: https://cloud.yandex.com +// Submitted by Alexander Lodin +yandexcloud.net +storage.yandexcloud.net +website.yandexcloud.net + +// YesCourse Pty Ltd : https://yescourse.com +// Submitted by Atul Bhouraskar +official.academy + // Yola : https://www.yola.com/ // Submitted by Stefano Rivera yolasite.com @@ -12276,13 +13821,25 @@ ybo.review ybo.science ybo.trade +// Yunohost : https://yunohost.org +// Submitted by Valentin Grimaud +ynh.fr +nohost.me +noho.st + // ZaNiC : http://www.za.net/ // Submitted by registry za.net za.org -// Zeit, Inc. : https://zeit.domains/ -// Submitted by Olli Vanhoja -now.sh +// Zine EOOD : https://zine.bg/ +// Submitted by Martin Angelov +bss.design + +// Zitcom A/S : https://www.zitcom.dk +// Submitted by Emil Stahl +basicserver.io +virtualserver.io +enterprisecloud.nu // ===END PRIVATE DOMAINS=== From 6339065c8d7ea7657a219202d41d47d017a0c8c7 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 18 Feb 2022 10:52:32 +0100 Subject: [PATCH 411/461] Update testing dependencies --- composer.json | 14 +++++++------- phpstan.neon | 8 ++++++++ src/DomainName.php | 1 - src/Rules.php | 8 ++++---- src/TopLevelDomainsTest.php | 6 +++--- 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/composer.json b/composer.json index 72bbf6a6..4804a40d 100644 --- a/composer.json +++ b/composer.json @@ -46,18 +46,18 @@ "ext-json": "*" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.19||~v3.4.0", + "friendsofphp/php-cs-fixer": "^v3.5.0", "guzzlehttp/guzzle": "^7.0", "guzzlehttp/psr7": "^1.6||^2.0", - "phpstan/phpstan": "^0.12.89", - "phpstan/phpstan-phpunit": "^0.12.20", - "phpstan/phpstan-strict-rules": "^0.12.9", - "phpunit/phpunit": "^9.5", - "psalm/plugin-phpunit": "^0.15.0", + "phpstan/phpstan": "^1.4.6.", + "phpstan/phpstan-phpunit": "^1.0.0", + "phpstan/phpstan-strict-rules": "^1.1.0", + "phpunit/phpunit": "^9.5.13", + "psalm/plugin-phpunit": "^0.15.2", "psr/http-factory": "^1.0", "psr/simple-cache": "^1.0", "symfony/cache": "^v5.0", - "vimeo/psalm": "^4.3" + "vimeo/psalm": "^4.20" }, "suggest": { "psr/http-client-implementation": "To use the storage functionnality which depends on PSR-18", diff --git a/phpstan.neon b/phpstan.neon index d4747672..caa678b5 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -4,4 +4,12 @@ includes: - vendor/phpstan/phpstan-phpunit/rules.neon parameters: ignoreErrors: + - message: '#has no value type specified in iterable type array.#' + path: src/Rules.php + - message: '#has parameter \$(properties|rules|list|tmpList) with no value type specified in iterable type array.#' + path: src/Rules.php + - message: "#Cannot access offset '!' on mixed.#" + path: src/Rules.php + - message: '#Variable \$line on left side of \?\? always exists and is not nullable.#' + path: src/Rules.php reportUnmatchedIgnoredErrors: true diff --git a/src/DomainName.php b/src/DomainName.php index 00496c2d..1469d57c 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -101,7 +101,6 @@ public function withLabel(int $key, $label): self; * If $key is non-negative, the removed label will be the label at $key position from the start. * If $key is negative, the removed label will be the label at $key position from the end. * - * @param int ...$keys * * @throws CannotProcessHost If the key is out of bounds */ diff --git a/src/Rules.php b/src/Rules.php index a0e47cde..326cfbe7 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -36,12 +36,12 @@ final class Rules implements PublicSuffixList /** * PSL rules as a multidimensional associative array. * - * @var array> + * @var array{ICANN_DOMAINS: array, PRIVATE_DOMAINS: array} */ private array $rules; /** - * @param array> $rules + * @param array{ICANN_DOMAINS: array, PRIVATE_DOMAINS: array} $rules */ private function __construct(array $rules) { @@ -84,7 +84,7 @@ public static function fromString($content): self /** * Convert the Public Suffix List into an associative, multidimensional array. * - * @return array> + * @return array{ICANN_DOMAINS: array, PRIVATE_DOMAINS: array} */ private static function parse(string $content): array { @@ -165,7 +165,7 @@ private static function addRule(array $list, array $ruleParts): array } /** - * @param array{rules:array>} $properties + * @param array{rules:array{ICANN_DOMAINS: array, PRIVATE_DOMAINS: array}} $properties */ public static function __set_state(array $properties): self { diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 2b9d7301..3a2aff37 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -193,7 +193,7 @@ public function testGetTopLevelDomain($tld): void } /** - * @return iterable + * @return iterable> */ public function validDomainProvider(): iterable { @@ -286,7 +286,7 @@ public function testGetTopLevelDomainWithUnregisteredTLD(): void } /** - * @return iterable + * @return iterable> */ public function validTldProvider(): iterable { @@ -312,7 +312,7 @@ public function __toString(): string } /** - * @return iterable + * @return iterable> */ public function invalidTldProvider(): iterable { From d5f29d57d6bdd8dfcca4cf49df7d516779187f0b Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 18 Feb 2022 14:12:14 +0100 Subject: [PATCH 412/461] Improve package coding style --- .php-cs-fixer.php | 20 +++++++++++++------ src/DomainTest.php | 3 ++- src/Idna.php | 4 ++-- .../PublicSuffixListPsr16CacheTest.php | 12 ++++++----- src/TopLevelDomainList.php | 4 +--- 5 files changed, 26 insertions(+), 17 deletions(-) diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php index 5560b22f..a70bd078 100644 --- a/.php-cs-fixer.php +++ b/.php-cs-fixer.php @@ -11,21 +11,31 @@ '@PSR2' => true, 'array_syntax' => ['syntax' => 'short'], 'concat_space' => ['spacing' => 'none'], + 'global_namespace_import' => [ + 'import_classes' => true, + 'import_constants' => true, + 'import_functions' => true, + ], + 'list_syntax' => ['syntax' => 'short'], 'new_with_braces' => true, 'no_blank_lines_after_phpdoc' => true, 'no_empty_phpdoc' => true, 'no_empty_comment' => true, 'no_leading_import_slash' => true, - 'no_superfluous_phpdoc_tags' => true, + 'no_superfluous_phpdoc_tags' => [ + 'allow_mixed' => true, + 'remove_inheritdoc' => true, + 'allow_unused_params' => false, + ], 'no_trailing_comma_in_singleline_array' => true, 'no_unused_imports' => true, 'ordered_imports' => ['imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha'], - 'phpdoc_add_missing_param_annotation' => ['only_untyped' => false], + 'phpdoc_add_missing_param_annotation' => ['only_untyped' => true], 'phpdoc_align' => true, 'phpdoc_no_empty_return' => true, 'phpdoc_order' => true, 'phpdoc_scalar' => true, - 'phpdoc_to_comment' => false, + 'phpdoc_to_comment' => true, 'phpdoc_summary' => true, 'psr_autoloading' => true, 'return_type_declaration' => ['space_before' => 'none'], @@ -36,7 +46,5 @@ 'trailing_comma_in_multiline' => true, 'trim_array_spaces' => true, 'whitespace_after_comma_in_array' => true, - 'yoda_style' => true, ]) - ->setFinder($finder) -; + ->setFinder($finder); diff --git a/src/DomainTest.php b/src/DomainTest.php index aece2374..11a84e41 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -5,6 +5,7 @@ namespace Pdp; use PHPUnit\Framework\TestCase; +use stdClass; use TypeError; /** @@ -314,7 +315,7 @@ public function withLabelWorksProvider(): iterable public function testWithLabelFailsWithTypeError(): void { $this->expectException(TypeError::class); - Domain::fromIDNA2008('example.com')->withLabel(1, new \stdClass()); + Domain::fromIDNA2008('example.com')->withLabel(1, new stdClass()); } public function testWithLabelFailsWithInvalidKey(): void diff --git a/src/Idna.php b/src/Idna.php index 3867eb10..47ceddba 100644 --- a/src/Idna.php +++ b/src/Idna.php @@ -99,7 +99,7 @@ public static function toAscii(string $domain, int $options): IdnaInfo self::supportsIdna(); - /** @param-out array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */ + /* @param-out array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */ idn_to_ascii($domain, $options, INTL_IDNA_VARIANT_UTS46, $idnaInfo); /** @var array{result:string, isTransitionalDifferent:bool, errors:int} $idnaInfo */ @@ -124,7 +124,7 @@ public static function toUnicode(string $domain, int $options): IdnaInfo self::supportsIdna(); - /** @param-out array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */ + /* @param-out array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */ idn_to_utf8($domain, $options, INTL_IDNA_VARIANT_UTS46, $idnaInfo); /** @var array{result:string, isTransitionalDifferent:bool, errors:int} $idnaInfo */ diff --git a/src/Storage/PublicSuffixListPsr16CacheTest.php b/src/Storage/PublicSuffixListPsr16CacheTest.php index 3d992b0c..0061c6d2 100644 --- a/src/Storage/PublicSuffixListPsr16CacheTest.php +++ b/src/Storage/PublicSuffixListPsr16CacheTest.php @@ -4,6 +4,8 @@ namespace Pdp\Storage; +use DateInterval; +use DateTimeImmutable; use InvalidArgumentException; use Pdp\Rules; use PHPUnit\Framework\TestCase; @@ -54,7 +56,7 @@ public function testItReturnsNullIfTheCacheContentCannotBeConvertedToTheCorrectI $cache = $this->createStub(CacheInterface::class); $cache->method('get')->willReturn('{"foo":"bar"}'); - $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new \DateTimeImmutable('+1 DAY')); + $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new DateTimeImmutable('+1 DAY')); self::assertNull($pslCache->fetch('http://www.example.com')); } @@ -65,7 +67,7 @@ public function testItCanStoreAPublicSuffixListInstance(): void $cache->method('set')->willReturn(true); $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new DateInterval('P1D')); self::assertTrue($pslCache->remember('http://www.example.com', $psl)); } @@ -76,7 +78,7 @@ public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void $cache->method('set')->willReturn(false); $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new DateInterval('P1D')); self::assertFalse($pslCache->remember('http://www.example.com', $psl)); } @@ -89,7 +91,7 @@ public function testItReturnsFalseIfItCantCacheAPublicSuffixListInstance(): void $cache->method('set')->will(self::throwException($exception)); $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new DateInterval('P1D')); self::assertFalse($pslCache->remember('http://www.example.com', $psl)); } @@ -120,7 +122,7 @@ public function testItCanDeleteTheCachedDatabase(): void $cache = $this->createStub(CacheInterface::class); $cache->method('delete')->willReturn(true); - $instance = new PublicSuffixListPsr16Cache($cache, 'pdp_', new \DateInterval('P1D')); + $instance = new PublicSuffixListPsr16Cache($cache, 'pdp_', new DateInterval('P1D')); self::assertTrue($instance->forget($uri)); } diff --git a/src/TopLevelDomainList.php b/src/TopLevelDomainList.php index cb1cb5a0..51e9b0fa 100644 --- a/src/TopLevelDomainList.php +++ b/src/TopLevelDomainList.php @@ -24,9 +24,7 @@ public function version(): string; */ public function lastUpdated(): DateTimeImmutable; - /** - * {@inheritdoc} - */ + public function count(): int; /** From 59a1d2c3c375020bef5315123d065adfde0cf570 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Fri, 18 Feb 2022 14:31:29 +0100 Subject: [PATCH 413/461] Update testing suite --- CHANGELOG.md | 2 +- src/RulesTest.php | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13b80827..b427278c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will ### Fixed -- [#321](https://github.com/jeremykendall/php-domain-parser/issues/321) improve resolving private domain suffix +- [#321](https://github.com/jeremykendall/php-domain-parser/issues/321) improve resolving private domain suffix. `Rules::getPrivateDomain` will now throw if the domain name does not contain a "private" TLD. ### Deprecated diff --git a/src/RulesTest.php b/src/RulesTest.php index 5bf1322c..5f8d0be2 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -594,7 +594,7 @@ public function effectiveTLDProvider(): iterable ]; } - public function testIssue321(): void + public function testIssue321Success(): void { $result = self::$rules->resolve('node857-gelofesta.users.scale.virtualcloud.com.br'); self::assertSame('users.scale.virtualcloud.com.br', $result->suffix()->value()); @@ -604,4 +604,11 @@ public function testIssue321(): void self::assertSame('com.br', $result->suffix()->value()); self::assertTrue($result->suffix()->isICANN()); } + + public function testIssue321Failure(): void + { + $this->expectException(UnableToResolveDomain::class); + + self::$rules->getPrivateDomain('clientportal.virtualcloud.com.br'); + } } From 8cf9c4753142b7f0ee9f7551069aea2bbacbf8c2 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 29 Sep 2022 05:37:32 +0200 Subject: [PATCH 414/461] Fix regression in private domain detection #334 --- .github/workflows/build.yaml | 2 -- CHANGELOG.md | 18 ++++++++++++++++++ composer.json | 6 +----- psalm.xml | 18 ------------------ src/Rules.php | 14 +++++++++++++- src/RulesTest.php | 15 +++++++++++++++ src/TopLevelDomains.php | 3 +-- 7 files changed, 48 insertions(+), 28 deletions(-) delete mode 100644 psalm.xml diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 08c130ae..450e339e 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -24,7 +24,5 @@ jobs: - run: composer phpunit - run: composer phpstan if: ${{ matrix.php == '8.1' }} - - run: composer psalm - if: ${{ matrix.php == '8.1' }} - run: composer phpcs if: ${{ matrix.php == '8.1' }} diff --git a/CHANGELOG.md b/CHANGELOG.md index b427278c..3401f0ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,24 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will be documented in this file +## 6.1.2 - 2022-09-29 + +### Added + +- None + +### Fixed + +- [#321](https://github.com/jeremykendall/php-domain-parser/issues/334) remove regression to resolving private domain suffix. + +### Deprecated + +- None + +### Removed + +- None + ## 6.1.1 - 2022-02-18 ### Added diff --git a/composer.json b/composer.json index 4804a40d..222c6a0e 100644 --- a/composer.json +++ b/composer.json @@ -53,11 +53,9 @@ "phpstan/phpstan-phpunit": "^1.0.0", "phpstan/phpstan-strict-rules": "^1.1.0", "phpunit/phpunit": "^9.5.13", - "psalm/plugin-phpunit": "^0.15.2", "psr/http-factory": "^1.0", "psr/simple-cache": "^1.0", - "symfony/cache": "^v5.0", - "vimeo/psalm": "^4.20" + "symfony/cache": "^v5.0" }, "suggest": { "psr/http-client-implementation": "To use the storage functionnality which depends on PSR-18", @@ -79,7 +77,6 @@ "test": [ "@phpunit", "@phpstan", - "@psalm", "@phpcs" ] }, @@ -87,7 +84,6 @@ "phpcs": "Runs coding style test suite", "phpcs:fix": "Fix the package coding style", "phpstan": "Runs complete codebase static analysis", - "psalm": "Runs complete codebase static analysis", "phpunit": "Runs unit and functional testing", "test": "Runs the complete test suite" }, diff --git a/psalm.xml b/psalm.xml deleted file mode 100644 index ad6be53d..00000000 --- a/psalm.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - diff --git a/src/Rules.php b/src/Rules.php index 326cfbe7..8993f9a7 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -304,7 +304,8 @@ private function getPublicSuffixLengthFromSection(DomainName $domain, string $se if (!array_key_exists($label, $rules)) { // for private domain suffix MUST be fully matched else no suffix is found // https://github.com/jeremykendall/php-domain-parser/issues/321 - if (self::PRIVATE_DOMAINS === $section && [] !== $rules) { + // https://github.com/jeremykendall/php-domain-parser/issues/334 + if (self::PRIVATE_DOMAINS === $section && self::hasRemainingRuleLabels($rules)) { $labelCount = 0; } break; @@ -317,4 +318,15 @@ private function getPublicSuffixLengthFromSection(DomainName $domain, string $se return $labelCount; } + + private static function hasRemainingRuleLabels(array $rules): bool + { + foreach ($rules as $rule) { + if ([] !== $rule) { + return true; + } + } + + return false; + } } diff --git a/src/RulesTest.php b/src/RulesTest.php index 5f8d0be2..358cba37 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -611,4 +611,19 @@ public function testIssue321Failure(): void self::$rules->getPrivateDomain('clientportal.virtualcloud.com.br'); } + + public function testWithMultiLevelPrivateDomain(): void + { + $domain = self::$rules->resolve('test-domain.eu.org'); + + self::assertFalse($domain->suffix()->isICANN()); + self::assertTrue($domain->suffix()->isPrivate()); + self::assertSame('eu.org', $domain->suffix()->value()); + + $domain = self::$rules->resolve('test-domain.lt.eu.org'); + + self::assertFalse($domain->suffix()->isICANN()); + self::assertTrue($domain->suffix()->isPrivate()); + self::assertSame('lt.eu.org', $domain->suffix()->value()); + } } diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index d97d0065..ed25ebc2 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -95,12 +95,11 @@ public static function parse(string $content): array foreach ($file as $line) { $line = trim($line); if ([] === $data) { - $data = self::extractHeader($line); + $data = self::extractHeader($line) + ['records' => []]; continue; } if (false === strpos($line, '#')) { - $data['records'] = $data['records'] ?? []; $data['records'][self::extractRootZone($line)] = 1; continue; } From e482ecaf3d8cb014c805452ad91928132fbadfb3 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 29 Sep 2022 05:51:56 +0200 Subject: [PATCH 415/461] Fix coding style --- .php-cs-fixer.php | 2 +- composer.json | 2 +- src/Rules.php | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php index a70bd078..e771f589 100644 --- a/.php-cs-fixer.php +++ b/.php-cs-fixer.php @@ -27,7 +27,7 @@ 'remove_inheritdoc' => true, 'allow_unused_params' => false, ], - 'no_trailing_comma_in_singleline_array' => true, + 'no_trailing_comma_in_singleline' => true, 'no_unused_imports' => true, 'ordered_imports' => ['imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha'], 'phpdoc_add_missing_param_annotation' => ['only_untyped' => true], diff --git a/composer.json b/composer.json index 7f3727d9..52811db5 100644 --- a/composer.json +++ b/composer.json @@ -77,7 +77,7 @@ "test": [ "@phpunit", "@phpstan", - "@phpcs" + "@phpcs:fix" ] }, "scripts-descriptions": { diff --git a/src/Rules.php b/src/Rules.php index 86bcfb69..8993f9a7 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -306,7 +306,6 @@ private function getPublicSuffixLengthFromSection(DomainName $domain, string $se // https://github.com/jeremykendall/php-domain-parser/issues/321 // https://github.com/jeremykendall/php-domain-parser/issues/334 if (self::PRIVATE_DOMAINS === $section && self::hasRemainingRuleLabels($rules)) { - $labelCount = 0; } break; From 3a57f09680ecd3d23faa7c0cfb5fe687fd96e016 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 29 Sep 2022 07:14:22 +0200 Subject: [PATCH 416/461] update github actions tu add PHP8.2 support --- .github/workflows/build.yaml | 60 ++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index d828ead2..1fb27c3d 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,26 +1,60 @@ --- -name: Build +name: build on: push: ~ pull_request: ~ jobs: - phpunit: - name: PHPUnit tests on ${{ matrix.php }} ${{ matrix.composer-flags }} - runs-on: ubuntu-latest + linux_tests: + name: PHP on ${{ matrix.php }} - ${{ matrix.stability }} - ${{ matrix.composer-flags }} + runs-on: ubuntu-20.04 strategy: matrix: php: ['8.1'] - composer-flags: [ '' ] - phpunit-flags: [ '--coverage-text' ] + stability: [prefer-lowest, prefer-stable] + include: + - php: '8.2' + flags: "--ignore-platform-req=php" + phpunit-flags: '--no-coverage' + stability: prefer-stable steps: - - uses: actions/checkout@v2 - - uses: shivammathur/setup-php@v2 + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} - coverage: pcov + coverage: xdebug tools: composer:v2 - - run: composer update --no-progress ${{ matrix.composer-flags }} - - run: composer phpunit - - run: composer phpstan - - run: composer phpcs + - name: Check PHP Version + run: php -v + + - name: Validate composer files + run: composer validate --strict + + - name: Get Composer Cache Directory + id: composer-cache + run: | + echo "::set-output name=dir::$(composer config cache-files-dir)" + - uses: actions/cache@v2 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ matrix.stability }}-${{ matrix.flags }}-${{ hashFiles('**/composer.lock') }} + restore-keys: | + ${{ runner.os }}-composer-${{ matrix.stability }}-${{ matrix.flags }}- + ${{ runner.os }}-composer- + + - name: Install dependencies + run: composer update --${{ matrix.stability }} --prefer-dist --no-interaction --no-progress ${{ matrix.flags }} + + - name: Run Unit tests with coverage + run: composer phpunit -- ${{ matrix.phpunit-flags }} + + - name: Run static analysis + run: composer phpstan + if: ${{ matrix.php == '8.1' && matrix.stability == 'prefer-stable'}} + + - name: Run Coding style rules + run: composer phpcs:fix + if: ${{ matrix.php == '8.1' && matrix.stability == 'prefer-stable'}} From 343f4adc6e58f22100d3c9895b8b56bef8881046 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 29 Sep 2022 07:28:07 +0200 Subject: [PATCH 417/461] Update test to be PHP8.2 compatible --- src/Storage/TimeToLiveTest.php | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/Storage/TimeToLiveTest.php b/src/Storage/TimeToLiveTest.php index 72230f37..3d865bde 100644 --- a/src/Storage/TimeToLiveTest.php +++ b/src/Storage/TimeToLiveTest.php @@ -7,6 +7,7 @@ use DateInterval; use DateTimeImmutable; use DateTimeZone; +use mysql_xdevapi\CollectionModify; use PHPUnit\Framework\TestCase; use Stringable; @@ -26,7 +27,9 @@ public function testItDoesNotReturnTheAbsoluteInterval(): void */ public function testItCanBeInstantiatedFromDurationInput(string $input, DateInterval $expected): void { - self::assertEquals($expected, TimeToLive::fromDurationString($input)); + $now = new DateTimeImmutable(); + + self::assertEquals($now->add($expected), $now->add(TimeToLive::fromDurationString($input))); } /** @@ -47,16 +50,25 @@ public function validDurationString(): iterable ]; } + public function testItCastToNullWithNull(): void + { + self::assertNull(TimeToLive::convert(null)); + } + /** * @dataProvider validDurationInt */ - public function testItCanBeInstantiatedFromSeconds(int|string|Stringable|null|DateInterval $input, ?DateInterval $expected): void + public function testItCanBeInstantiatedFromSeconds(int|string|Stringable|DateInterval $input, DateInterval $expected): void { - self::assertEquals($expected, TimeToLive::convert($input)); + /** @var DateInterval $ttl */ + $ttl = TimeToLive::convert($input); + $now = new DateTimeImmutable(); + + self::assertEquals($now->add($expected), $now->add($ttl)); } /** - * @return iterable + * @return iterable */ public function validDurationInt(): iterable { @@ -67,11 +79,6 @@ public function validDurationInt(): iterable 'expected' => $seconds, ]; - yield 'null' => [ - 'input' => null, - 'expected' => null, - ]; - yield 'stringable object' => [ 'input' => new class() { public function __toString(): string From 2da11679d94ae7476a4fc44d067e5ad0d0648efa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Tue, 4 Oct 2022 11:29:12 +0200 Subject: [PATCH 418/461] Update .gitattributes for PHP CS Fixer configuration --- .gitattributes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 7dd10a26..8570594b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4,7 +4,7 @@ /.gitattributes export-ignore /.github export-ignore /.gitignore export-ignore -/.php_cs export-ignore +/.php-cs-fixer.php export-ignore /phpstan.neon export-ignore /phpunit.xml.dist export-ignore /psalm.xml export-ignore From 62e1692d0cf9c5ac2060dfaba43fa70883723d63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Tue, 4 Oct 2022 11:34:38 +0200 Subject: [PATCH 419/461] Update .gitattributes to exclude test_data/ Resolves jeremykendall/php-domain-parser#341 --- .gitattributes | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitattributes b/.gitattributes index 7dd10a26..fa67f5ee 100644 --- a/.gitattributes +++ b/.gitattributes @@ -8,6 +8,7 @@ /phpstan.neon export-ignore /phpunit.xml.dist export-ignore /psalm.xml export-ignore +/test_data/ export-ignore /CHANGELOG.md export-ignore /UPGRADING.md export-ignore /README.md export-ignore From 755e3819f435909f104ffbffff279dbdaa767188 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Sat, 29 Oct 2022 08:27:25 +0200 Subject: [PATCH 420/461] Improve coding style and remove dead code --- src/Domain.php | 2 -- src/Idna.php | 2 -- src/Storage/TimeToLiveTest.php | 1 - src/Storage/TopLevelDomainListStorageFactory.php | 1 - 4 files changed, 6 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 459706d8..8b8d226c 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -28,7 +28,6 @@ final class Domain implements DomainName private const IDNA_2003 = 'IDNA_2003'; private const IDNA_2008 = 'IDNA_2008'; private const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/'; - // Note that unreserved is purposely missing . as it is used to separate labels. private const REGEXP_REGISTERED_NAME = '/(?(DEFINE) (?[a-z0-9_~\-]) @@ -37,7 +36,6 @@ final class Domain implements DomainName (?(?:(?&unreserved)|(?&sub_delims)|(?&encoded)){1,63}) ) ^(?:(?®_name)\.){0,126}(?®_name)\.?$/ix'; - private const REGEXP_URI_DELIMITERS = '/[:\/?#\[\]@ ]/'; /** @var array */ diff --git a/src/Idna.php b/src/Idna.php index 725f9f3d..cf33ca0f 100644 --- a/src/Idna.php +++ b/src/Idna.php @@ -21,7 +21,6 @@ final class Idna { private const REGEXP_IDNA_PATTERN = '/[^\x20-\x7f]/'; - /** * IDNA options. */ @@ -33,7 +32,6 @@ final class Idna public const IDNA_NONTRANSITIONAL_TO_ASCII = 0x10; public const IDNA_NONTRANSITIONAL_TO_UNICODE = 0x20; public const IDNA_CHECK_CONTEXTO = 0x40; - /** * IDNA errors. */ diff --git a/src/Storage/TimeToLiveTest.php b/src/Storage/TimeToLiveTest.php index 3d865bde..b8083d12 100644 --- a/src/Storage/TimeToLiveTest.php +++ b/src/Storage/TimeToLiveTest.php @@ -7,7 +7,6 @@ use DateInterval; use DateTimeImmutable; use DateTimeZone; -use mysql_xdevapi\CollectionModify; use PHPUnit\Framework\TestCase; use Stringable; diff --git a/src/Storage/TopLevelDomainListStorageFactory.php b/src/Storage/TopLevelDomainListStorageFactory.php index 5c25ca1f..00ca241f 100644 --- a/src/Storage/TopLevelDomainListStorageFactory.php +++ b/src/Storage/TopLevelDomainListStorageFactory.php @@ -1,6 +1,5 @@ Date: Sun, 30 Oct 2022 14:25:06 +0100 Subject: [PATCH 421/461] Prepare next release --- .gitignore | 1 + CHANGELOG.md | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/.gitignore b/.gitignore index 31b30660..fdae76c9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ data vendor docs build +pdp .idea .php_cs.cache .php-cs-fixer.cache diff --git a/CHANGELOG.md b/CHANGELOG.md index 3401f0ab..e011fd6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,24 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will be documented in this file +## 6.2.0 - 2022-10-30 + +### Added + +- None + +### Fixed + +- None + +### Deprecated + +- None + +### Removed + +- PHP7 and PHP8.0 support + ## 6.1.2 - 2022-09-29 ### Added From 99a63b8cfb2f6d0ef5636f276345bb5aa6894f19 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Thu, 3 Nov 2022 23:20:59 +0100 Subject: [PATCH 422/461] Improve PHP domain classes implementation --- composer.json | 8 ++-- src/Domain.php | 18 ++++----- src/ResolvedDomain.php | 39 ++++++++++++------- src/Rules.php | 8 ++-- src/Storage/PsrStorageFactory.php | 6 +-- src/Storage/PublicSuffixListPsr16Cache.php | 6 +-- src/Storage/PublicSuffixListPsr18Client.php | 4 +- src/Storage/RulesStorage.php | 4 +- src/Storage/TopLevelDomainListPsr16Cache.php | 6 +-- src/Storage/TopLevelDomainListPsr18Client.php | 4 +- src/Storage/TopLevelDomainsStorage.php | 4 +- src/Suffix.php | 2 +- src/SyntaxError.php | 2 +- src/TopLevelDomains.php | 7 ++-- 14 files changed, 61 insertions(+), 57 deletions(-) diff --git a/composer.json b/composer.json index de2994d9..ba969588 100644 --- a/composer.json +++ b/composer.json @@ -48,11 +48,11 @@ "require-dev": { "friendsofphp/php-cs-fixer": "^v3.8.0", "guzzlehttp/guzzle": "^7.5", - "guzzlehttp/psr7": "^1.6 || ^2.4.1", - "phpstan/phpstan": "^1.8.6", - "phpstan/phpstan-phpunit": "^1.1.1", + "guzzlehttp/psr7": "^1.6 || ^2.4.3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-phpunit": "^1.2.2", "phpstan/phpstan-strict-rules": "^1.4.4", - "phpunit/phpunit": "^9.5.25", + "phpunit/phpunit": "^9.5.26", "psr/http-factory": "^1.0.1", "psr/simple-cache": "^1.0.1", "symfony/cache": "^v5.0.0 || ^v6.0.0" diff --git a/src/Domain.php b/src/Domain.php index 8b8d226c..fa8319cf 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -39,8 +39,8 @@ final class Domain implements DomainName private const REGEXP_URI_DELIMITERS = '/[:\/?#\[\]@ ]/'; /** @var array */ - private array $labels; - private ?string $domain; + private readonly array $labels; + private readonly ?string $domain; private function __construct(private string $type, DomainNameProvider|Host|Stringable|string|int|null $domain) { @@ -315,11 +315,11 @@ public function withoutLabel(int $key, int ...$keys): self } } - $clone = clone $this; - $clone->labels = $labels; - $clone->domain = [] === $labels ? null : implode('.', array_reverse($labels)); + if ($labels === $this->labels) { + return $this; + } - return $clone; + return new self($this->type, [] === $labels ? null : implode('.', array_reverse($labels))); } public function clear(): self @@ -343,10 +343,6 @@ public function slice(int $offset, int $length = null): self return $this; } - $clone = clone $this; - $clone->labels = $labels; - $clone->domain = [] === $labels ? null : implode('.', array_reverse($labels)); - - return $clone; + return new self($this->type, [] === $labels ? null : implode('.', array_reverse($labels))); } } diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 95ce4d51..870f62ac 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -9,15 +9,19 @@ final class ResolvedDomain implements ResolvedDomainName { - private DomainName $secondLevelDomain; - private DomainName $registrableDomain; - private DomainName $subDomain; + private readonly DomainName $secondLevelDomain; + private readonly DomainName $registrableDomain; + private readonly DomainName $subDomain; private function __construct( - private DomainName $domain, - private EffectiveTopLevelDomain $suffix + private readonly DomainName $domain, + private readonly EffectiveTopLevelDomain $suffix ) { - $this->validateState(); + [ + 'registrableDomain' => $this->registrableDomain, + 'secondLevelDomain' => $this->secondLevelDomain, + 'subDomain' => $this->subDomain, + ] = $this->parse(); } public static function fromICANN(int|DomainNameProvider|Host|string|Stringable|null $domain, int $suffixLength): self @@ -69,16 +73,20 @@ private static function setDomainName(int|DomainNameProvider|Host|string|Stringa * Make sure the Value Object is always in a valid state. * * @throws UnableToResolveDomain If the suffix can not be attached to the domain + * + * @return array{registrableDomain: DomainName, secondLevelDomain: DomainName, subDomain: DomainName} */ - private function validateState(): void + private function parse(): array { $suffixValue = $this->suffix->value(); if (null === $suffixValue) { $nullDomain = $this->domain->clear(); - $this->registrableDomain = $nullDomain; - $this->secondLevelDomain = $nullDomain; - $this->subDomain = $nullDomain; - return; + + return [ + 'registrableDomain' => $nullDomain, + 'secondLevelDomain' => $nullDomain, + 'subDomain' => $nullDomain, + ]; } if (2 > count($this->domain)) { @@ -90,9 +98,12 @@ private function validateState(): void } $length = count($this->suffix); - $this->registrableDomain = $this->domain->slice(0, $length + 1); - $this->secondLevelDomain = $this->domain->slice($length, 1); - $this->subDomain = $this->domain->slice($length + 1); + + return [ + 'registrableDomain' => $this->domain->slice(0, $length + 1), + 'secondLevelDomain' => $this->domain->slice($length, 1), + 'subDomain' => $this->domain->slice($length + 1), + ]; } public function count(): int diff --git a/src/Rules.php b/src/Rules.php index 1fca9c99..7c49cd96 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -275,10 +275,8 @@ private function getPublicSuffixLengthFromSection(DomainName $domain, string $se //no match found if (!array_key_exists($label, $rules)) { - // for private domain suffix MUST be fully matched else no suffix is found - // https://github.com/jeremykendall/php-domain-parser/issues/321 - // https://github.com/jeremykendall/php-domain-parser/issues/334 - if (self::PRIVATE_DOMAINS === $section && self::hasRemainingRuleLabels($rules)) { + // Suffix MUST be fully matched else no suffix is found for private domain + if (self::PRIVATE_DOMAINS === $section && self::hasRemainingRules($rules)) { $labelCount = 0; } break; @@ -292,7 +290,7 @@ private function getPublicSuffixLengthFromSection(DomainName $domain, string $se return $labelCount; } - private static function hasRemainingRuleLabels(array $rules): bool + private static function hasRemainingRules(array $rules): bool { foreach ($rules as $rule) { if ([] !== $rule) { diff --git a/src/Storage/PsrStorageFactory.php b/src/Storage/PsrStorageFactory.php index 86406248..5245f7de 100644 --- a/src/Storage/PsrStorageFactory.php +++ b/src/Storage/PsrStorageFactory.php @@ -18,9 +18,9 @@ final class PsrStorageFactory implements TopLevelDomainListStorageFactory { public function __construct( - private CacheInterface $cache, - private ClientInterface $client, - private RequestFactoryInterface $requestFactory + private readonly CacheInterface $cache, + private readonly ClientInterface $client, + private readonly RequestFactoryInterface $requestFactory ) { } diff --git a/src/Storage/PublicSuffixListPsr16Cache.php b/src/Storage/PublicSuffixListPsr16Cache.php index 3070afda..b8753afe 100644 --- a/src/Storage/PublicSuffixListPsr16Cache.php +++ b/src/Storage/PublicSuffixListPsr16Cache.php @@ -16,11 +16,11 @@ final class PublicSuffixListPsr16Cache implements PublicSuffixListCache { - private ?DateInterval $cacheTtl; + private readonly ?DateInterval $cacheTtl; public function __construct( - private CacheInterface $cache, - private string $cachePrefix = '', + private readonly CacheInterface $cache, + private readonly string $cachePrefix = '', DateInterval|DateTimeInterface|Stringable|int|string|null $cacheTtl = null ) { $this->cacheTtl = TimeToLive::convert($cacheTtl); diff --git a/src/Storage/PublicSuffixListPsr18Client.php b/src/Storage/PublicSuffixListPsr18Client.php index 3cad6212..aea583f0 100644 --- a/src/Storage/PublicSuffixListPsr18Client.php +++ b/src/Storage/PublicSuffixListPsr18Client.php @@ -14,8 +14,8 @@ final class PublicSuffixListPsr18Client implements PublicSuffixListClient { public function __construct( - private ClientInterface $client, - private RequestFactoryInterface $requestFactory + private readonly ClientInterface $client, + private readonly RequestFactoryInterface $requestFactory ) { } diff --git a/src/Storage/RulesStorage.php b/src/Storage/RulesStorage.php index 2a20b9ea..402e04b7 100644 --- a/src/Storage/RulesStorage.php +++ b/src/Storage/RulesStorage.php @@ -9,8 +9,8 @@ final class RulesStorage implements PublicSuffixListStorage { public function __construct( - private PublicSuffixListCache $cache, - private PublicSuffixListClient $client + private readonly PublicSuffixListCache $cache, + private readonly PublicSuffixListClient $client ) { } diff --git a/src/Storage/TopLevelDomainListPsr16Cache.php b/src/Storage/TopLevelDomainListPsr16Cache.php index 0e3541a5..e2b2c6b6 100644 --- a/src/Storage/TopLevelDomainListPsr16Cache.php +++ b/src/Storage/TopLevelDomainListPsr16Cache.php @@ -16,11 +16,11 @@ final class TopLevelDomainListPsr16Cache implements TopLevelDomainListCache { - private ?DateInterval $cacheTtl; + private readonly ?DateInterval $cacheTtl; public function __construct( - private CacheInterface $cache, - private string $cachePrefix = '', + private readonly CacheInterface $cache, + private readonly string $cachePrefix = '', DateInterval|DateTimeInterface|Stringable|int|string|null $cacheTtl = null ) { $this->cacheTtl = TimeToLive::convert($cacheTtl); diff --git a/src/Storage/TopLevelDomainListPsr18Client.php b/src/Storage/TopLevelDomainListPsr18Client.php index 8ef0d0e6..90c9d752 100644 --- a/src/Storage/TopLevelDomainListPsr18Client.php +++ b/src/Storage/TopLevelDomainListPsr18Client.php @@ -14,8 +14,8 @@ final class TopLevelDomainListPsr18Client implements TopLevelDomainListClient { public function __construct( - private ClientInterface $client, - private RequestFactoryInterface $requestFactory + private readonly ClientInterface $client, + private readonly RequestFactoryInterface $requestFactory ) { } diff --git a/src/Storage/TopLevelDomainsStorage.php b/src/Storage/TopLevelDomainsStorage.php index 9e1141ed..5f8398e1 100644 --- a/src/Storage/TopLevelDomainsStorage.php +++ b/src/Storage/TopLevelDomainsStorage.php @@ -9,8 +9,8 @@ final class TopLevelDomainsStorage implements TopLevelDomainListStorage { public function __construct( - private TopLevelDomainListCache $cache, - private TopLevelDomainListClient $client + private readonly TopLevelDomainListCache $cache, + private readonly TopLevelDomainListClient $client ) { } diff --git a/src/Suffix.php b/src/Suffix.php index 7a8d28b3..9f073b71 100644 --- a/src/Suffix.php +++ b/src/Suffix.php @@ -15,7 +15,7 @@ final class Suffix implements EffectiveTopLevelDomain private const IANA = 'IANA'; private function __construct( - private DomainName $domain, + private readonly DomainName $domain, private readonly string $section ) { } diff --git a/src/SyntaxError.php b/src/SyntaxError.php index 1c19bdef..b8827d53 100644 --- a/src/SyntaxError.php +++ b/src/SyntaxError.php @@ -8,7 +8,7 @@ final class SyntaxError extends InvalidArgumentException implements CannotProcessHost { - private function __construct(string $message, private IdnaInfo|null $idnaInfo = null) + private function __construct(string $message, private readonly ?IdnaInfo $idnaInfo = null) { parent::__construct($message); } diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index f0eb687b..8f956cf2 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -6,6 +6,7 @@ use DateTimeImmutable; use Iterator; +use SplFileObject; use SplTempFileObject; use Stringable; use function count; @@ -65,7 +66,7 @@ public static function parse(string $content): array $data = []; $file = new SplTempFileObject(); $file->fwrite($content); - $file->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); + $file->setFlags(SplFileObject::DROP_NEW_LINE | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY); /** @var string $line */ foreach ($file as $line) { $line = trim($line); @@ -160,9 +161,7 @@ public function isEmpty(): bool */ public function getIterator(): Iterator { - foreach ($this->records as $tld => $_) { - yield $tld; - } + yield from array_keys($this->records); } /** From 29d95cbf97a2d51dd0c7852af24593d3898e7955 Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 19 Dec 2022 07:15:51 +0100 Subject: [PATCH 423/461] Improve install documentation --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e8e8589a..219fb3dd 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ PHP Domain Parser is compliant around: ### Composer ~~~ -$ composer require jeremykendall/php-domain-parser +composer require jeremykendall/php-domain-parser:^6.0 ~~~ ### System Requirements From 975fc664904fca14ee75613ce03faaabc300050f Mon Sep 17 00:00:00 2001 From: Ignace Nyamagana Butera Date: Mon, 19 Dec 2022 10:32:20 +0100 Subject: [PATCH 424/461] update shields URI in documentation --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 219fb3dd..8cd87562 100644 --- a/README.md +++ b/README.md @@ -594,7 +594,7 @@ Portions of the `Pdp\Rules` class are derivative works of the PHP [registered-domain-libs](https://github.com/usrflo/registered-domain-libs). I've included a copy of the Apache Software Foundation License 2.0 in this project. -[ico-github-actions-build]: https://img.shields.io/github/workflow/status/jeremykendall/php-domain-parser/Build?style=flat-square +[ico-github-actions-build]: https://img.shields.io/github/actions/workflow/status/jeremykendall/php-domain-parser/build.yaml?branch=develop&style=flat-square [ico-packagist]: https://img.shields.io/packagist/dt/jeremykendall/php-domain-parser.svg?style=flat-square [ico-release]: https://img.shields.io/github/release/jeremykendall/php-domain-parser.svg?style=flat-square [ico-license]: https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square From fe22f702fd208753f998d1e7d2cf02a4d2658d61 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 4 Jan 2023 07:30:17 +0100 Subject: [PATCH 425/461] Update github actions and dependencies --- .github/workflows/build.yaml | 15 +++++---------- composer.json | 14 +++++++------- src/Storage/TimeToLive.php | 2 +- 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 1fb27c3d..c5e55a24 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -10,16 +10,11 @@ jobs: runs-on: ubuntu-20.04 strategy: matrix: - php: ['8.1'] + php: ['8.1', '8.2'] stability: [prefer-lowest, prefer-stable] - include: - - php: '8.2' - flags: "--ignore-platform-req=php" - phpunit-flags: '--no-coverage' - stability: prefer-stable steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Setup PHP uses: shivammathur/setup-php@v2 @@ -36,8 +31,8 @@ jobs: - name: Get Composer Cache Directory id: composer-cache run: | - echo "::set-output name=dir::$(composer config cache-files-dir)" - - uses: actions/cache@v2 + echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT + - uses: actions/cache@v3 with: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-composer-${{ matrix.stability }}-${{ matrix.flags }}-${{ hashFiles('**/composer.lock') }} @@ -53,7 +48,7 @@ jobs: - name: Run static analysis run: composer phpstan - if: ${{ matrix.php == '8.1' && matrix.stability == 'prefer-stable'}} + if: ${{ matrix.php == '8.2' && matrix.stability == 'prefer-stable'}} - name: Run Coding style rules run: composer phpcs:fix diff --git a/composer.json b/composer.json index ba969588..43ef1812 100644 --- a/composer.json +++ b/composer.json @@ -46,13 +46,13 @@ "ext-json": "*" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^v3.8.0", + "friendsofphp/php-cs-fixer": "^v3.13.2", "guzzlehttp/guzzle": "^7.5", "guzzlehttp/psr7": "^1.6 || ^2.4.3", - "phpstan/phpstan": "^1.9", - "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan": "^1.9.6", + "phpstan/phpstan-phpunit": "^1.3.3", "phpstan/phpstan-strict-rules": "^1.4.4", - "phpunit/phpunit": "^9.5.26", + "phpunit/phpunit": "^9.5.27", "psr/http-factory": "^1.0.1", "psr/simple-cache": "^1.0.1", "symfony/cache": "^v5.0.0 || ^v6.0.0" @@ -69,14 +69,14 @@ } }, "scripts": { - "phpcs": "php-cs-fixer fix -vvv --diff --dry-run --allow-risky=yes --ansi", + "phpcs": "PHP_CS_FIXER_IGNORE_ENV=1 php-cs-fixer fix -vvv --diff --dry-run --allow-risky=yes --ansi", "phpcs:fix": "php-cs-fixer fix -vvv --allow-risky=yes --ansi", - "phpstan": "phpstan analyse -l max -c phpstan.neon src --memory-limit=256M --ansi", + "phpstan": "phpstan analyse -l max -c phpstan.neon src --xdebug --memory-limit=256M --ansi", "phpunit": "XDEBUG_MODE=coverage phpunit --coverage-text", "test": [ "@phpunit", "@phpstan", - "@phpcs:fix" + "@phpcs" ] }, "scripts-descriptions": { diff --git a/src/Storage/TimeToLive.php b/src/Storage/TimeToLive.php index 5d24cf2a..5182f09d 100644 --- a/src/Storage/TimeToLive.php +++ b/src/Storage/TimeToLive.php @@ -22,7 +22,7 @@ public static function fromDurationString(string $duration): DateInterval set_error_handler(fn () => true); $interval = DateInterval::createFromDateString($duration); restore_error_handler(); - if (!$interval instanceof DateInterval) { /* @phpstan-ignore-line */ + if (!$interval instanceof DateInterval) { throw new InvalidArgumentException( 'The ttl value "'.$duration.'" can not be parsable by `DateInterval::createFromDateString`.' ); From 87b2ca909f7937c1d03a86d2dfd18e2ae5316c17 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sat, 11 Feb 2023 22:15:37 +0100 Subject: [PATCH 426/461] Using PHPUnit 10 --- .gitignore | 2 +- composer.json | 8 +-- phpunit.xml.dist | 12 ++-- src/DomainTest.php | 60 +++++++------------ src/ResolvedDomainTest.php | 52 ++++++---------- src/RulesTest.php | 59 ++++-------------- .../PublicSuffixListPsr16CacheTest.php | 3 - .../PublicSuffixListPsr18ClientTest.php | 3 - src/Storage/RulesStorageTest.php | 3 - src/Storage/TimeToLiveTest.php | 9 ++- .../TopLevelDomainListPsr16CacheTest.php | 3 - .../TopLevelDomainListPsr18ClientTest.php | 3 - src/Storage/TopLevelDomainsStorageTest.php | 3 - src/SuffixTest.php | 23 +++---- src/TopLevelDomainsTest.php | 38 +++--------- 15 files changed, 79 insertions(+), 202 deletions(-) diff --git a/.gitignore b/.gitignore index fdae76c9..61906c3e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ docs build pdp .idea +.phpunit.cache .php_cs.cache .php-cs-fixer.cache -.phpunit.result.cache composer.lock diff --git a/composer.json b/composer.json index 43ef1812..b3f7a192 100644 --- a/composer.json +++ b/composer.json @@ -49,10 +49,10 @@ "friendsofphp/php-cs-fixer": "^v3.13.2", "guzzlehttp/guzzle": "^7.5", "guzzlehttp/psr7": "^1.6 || ^2.4.3", - "phpstan/phpstan": "^1.9.6", - "phpstan/phpstan-phpunit": "^1.3.3", - "phpstan/phpstan-strict-rules": "^1.4.4", - "phpunit/phpunit": "^9.5.27", + "phpstan/phpstan": "^1.9.17", + "phpstan/phpstan-phpunit": "^1.3.4", + "phpstan/phpstan-strict-rules": "^1.4.5", + "phpunit/phpunit": "^10.0.7", "psr/http-factory": "^1.0.1", "psr/simple-cache": "^1.0.1", "symfony/cache": "^v5.0.0 || ^v6.0.0" diff --git a/phpunit.xml.dist b/phpunit.xml.dist index e0050e50..4a02ebfc 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,17 +1,15 @@ + stopOnFailure="false" + cacheDirectory=".phpunit.cache" + backupStaticProperties="false" +> src diff --git a/src/DomainTest.php b/src/DomainTest.php index 066eef91..076baee4 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -4,19 +4,14 @@ namespace Pdp; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use stdClass; use TypeError; -/** - * @coversDefaultClass \Pdp\Domain - */ final class DomainTest extends TestCase { - /** - * @covers \Pdp\SyntaxError - * @dataProvider invalidDomainProvider - */ + #[DataProvider('invalidDomainProvider')] public function testToAsciiThrowsException(string $domain): void { $this->expectException(SyntaxError::class); @@ -27,7 +22,7 @@ public function testToAsciiThrowsException(string $domain): void /** * @return iterable */ - public function invalidDomainProvider(): iterable + public static function invalidDomainProvider(): iterable { return [ 'invalid IDN domain' => ['a⒈com'], @@ -56,10 +51,9 @@ public function testDomainInternalPhpMethod(): void } /** - * @dataProvider countableProvider - * - * @param string[] $labels + * @param array $labels */ + #[DataProvider('countableProvider')] public function testCountable(?string $domain, int $nbLabels, array $labels): void { $domain = Domain::fromIDNA2008($domain); @@ -70,7 +64,7 @@ public function testCountable(?string $domain, int $nbLabels, array $labels): vo /** * @return iterable}> */ - public function countableProvider(): iterable + public static function countableProvider(): iterable { return [ 'null' => [null, 0, []], @@ -112,9 +106,7 @@ public function testLabels(): void self::assertSame([], Domain::fromIDNA2008(null)->labels()); } - /** - * @dataProvider toUnicodeProvider - */ + #[DataProvider('toUnicodeProvider')] public function testToIDN( ?string $domain, ?string $expectedDomain, @@ -131,7 +123,7 @@ public function testToIDN( /** * @return iterable */ - public function toUnicodeProvider(): iterable + public static function toUnicodeProvider(): iterable { return [ 'simple domain' => [ @@ -172,9 +164,7 @@ public function toUnicodeProvider(): iterable ]; } - /** - * @dataProvider toAsciiProvider - */ + #[DataProvider('toAsciiProvider')] public function testToAscii( ?string $domain, ?string $expectedDomain, @@ -191,7 +181,7 @@ public function testToAscii( /** * @return iterable */ - public function toAsciiProvider(): iterable + public static function toAsciiProvider(): iterable { return [ 'simple domain' => [ @@ -222,9 +212,7 @@ public function toAsciiProvider(): iterable ]; } - /** - * @dataProvider withLabelWorksProvider - */ + #[DataProvider('withLabelWorksProvider')] public function testWithLabelWorks(DomainName $domain, int $key, string $label, ?string $expected): void { $result = $domain->withLabel($key, $label); @@ -234,7 +222,7 @@ public function testWithLabelWorks(DomainName $domain, int $key, string $label, /** * @return iterable */ - public function withLabelWorksProvider(): iterable + public static function withLabelWorksProvider(): iterable { $base_domain = Domain::fromIDNA2008('www.example.com'); @@ -321,9 +309,7 @@ public function testWithLabelFailsWithInvalidLabel2(): void Domain::fromIDNA2008('example.com')->withLabel(-1, ''); } - /** - * @dataProvider validAppend - */ + #[DataProvider('validAppend')] public function testAppend(string $raw, string $append, string $expected): void { self::assertSame($expected, Domain::fromIDNA2008($raw)->append($append)->toString()); @@ -332,7 +318,7 @@ public function testAppend(string $raw, string $append, string $expected): void /** * @return iterable */ - public function validAppend(): iterable + public static function validAppend(): iterable { return [ ['secure.example.com', '8.8.8.8', 'secure.example.com.8.8.8.8'], @@ -342,9 +328,7 @@ public function validAppend(): iterable ]; } - /** - * @dataProvider validPrepend - */ + #[DataProvider('validPrepend')] public function testPrepend(string $raw, string $prepend, string $expected): void { self::assertSame($expected, Domain::fromIDNA2008($raw)->prepend($prepend)->toString()); @@ -353,7 +337,7 @@ public function testPrepend(string $raw, string $prepend, string $expected): voi /** * @return iterable */ - public function validPrepend(): iterable + public static function validPrepend(): iterable { return [ ['secure.example.com', 'master', 'master.secure.example.com'], @@ -362,9 +346,7 @@ public function validPrepend(): iterable ]; } - /** - * @dataProvider withoutLabelWorksProvider - */ + #[DataProvider('withoutLabelWorksProvider')] public function testwithoutLabelWorks(DomainName $domain, int $key, ?string $expected): void { $result = $domain->withoutLabel($key); @@ -374,7 +356,7 @@ public function testwithoutLabelWorks(DomainName $domain, int $key, ?string $exp /** * @return iterable */ - public function withoutLabelWorksProvider(): iterable + public static function withoutLabelWorksProvider(): iterable { $base_domain = Domain::fromIDNA2008('www.example.com'); @@ -413,9 +395,7 @@ public function testwithoutLabelWorksWithMultipleKeys(): void self::assertNull(Domain::fromIDNA2008('www.example.com')->withoutLabel(0, 1, 2)->value()); } - /** - * @dataProvider resolveCustomIDNAOptionsProvider - */ + #[DataProvider('resolveCustomIDNAOptionsProvider')] public function testResolveWorksWithCustomIDNAOptions( string $domainName, string $withLabel, @@ -434,7 +414,7 @@ public function testResolveWorksWithCustomIDNAOptions( /** * @return iterable> */ - public function resolveCustomIDNAOptionsProvider(): iterable + public static function resolveCustomIDNAOptionsProvider(): iterable { return [ 'without deviation characters' => [ diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 75b798e9..0fb4ca18 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -4,13 +4,11 @@ namespace Pdp; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use TypeError; use function date_create; -/** - * @coversDefaultClass \Pdp\ResolvedDomain - */ final class ResolvedDomainTest extends TestCase { public function testItCanBeCreatedWithAnotherResolvedDomain(): void @@ -31,9 +29,7 @@ public function testRegistrableDomainIsNullWithFoundDomain(): void self::assertNull($domain->secondLevelDomain()->value()); } - /** - * @dataProvider provideWrongConstructor - */ + #[DataProvider('provideWrongConstructor')] public function testItThrowsExceptionMisMatchPublicSuffixDomain(?string $domain, int $length): void { $this->expectException(UnableToResolveDomain::class); @@ -44,7 +40,7 @@ public function testItThrowsExceptionMisMatchPublicSuffixDomain(?string $domain, /** * @return iterable */ - public function provideWrongConstructor(): iterable + public static function provideWrongConstructor(): iterable { return [ 'domain and public suffix are the same' => [ @@ -68,9 +64,7 @@ public function testItCanBeUsedWithInternalPhpMethod(): void self::assertSame('www.ulb.ac.be', $domain->toString()); } - /** - * @dataProvider countableProvider - */ + #[DataProvider('countableProvider')] public function testItImplementsCountable(?string $domain, int $nbLabels): void { self::assertCount($nbLabels, ResolvedDomain::fromUnknown($domain)); @@ -79,7 +73,7 @@ public function testItImplementsCountable(?string $domain, int $nbLabels): void /** * @return iterable */ - public function countableProvider(): iterable + public static function countableProvider(): iterable { return [ 'null' => [null, 0], @@ -89,9 +83,7 @@ public function countableProvider(): iterable ]; } - /** - * @dataProvider toUnicodeProvider - */ + #[DataProvider('toUnicodeProvider')] public function testItCanBeConvertedToUnicode( ?string $domain, ?string $publicSuffix, @@ -113,7 +105,7 @@ public function testItCanBeConvertedToUnicode( /** * @return iterable */ - public function toUnicodeProvider(): iterable + public static function toUnicodeProvider(): iterable { return [ 'simple domain' => [ @@ -175,9 +167,7 @@ public function toUnicodeProvider(): iterable ]; } - /** - * @dataProvider toAsciiProvider - */ + #[DataProvider('toAsciiProvider')] public function testItCanBeConvertedToAscii( ?string $domain, ?string $publicSuffix, @@ -199,7 +189,7 @@ public function testItCanBeConvertedToAscii( /** * @return iterable */ - public function toAsciiProvider(): iterable + public static function toAsciiProvider(): iterable { return [ 'simple domain' => [ @@ -245,9 +235,7 @@ public function toAsciiProvider(): iterable ]; } - /** - * @dataProvider withSubDomainWorksProvider - */ + #[DataProvider('withSubDomainWorksProvider')] public function testItCanHaveItsSubDomainChanged(ResolvedDomain $domain, DomainName|string|null $subdomain, string $expected = null): void { $result = $domain->withSubDomain($subdomain); @@ -260,7 +248,7 @@ public function testItCanHaveItsSubDomainChanged(ResolvedDomain $domain, DomainN /** * @return iterable */ - public function withSubDomainWorksProvider(): iterable + public static function withSubDomainWorksProvider(): iterable { return [ 'simple addition' => [ @@ -319,9 +307,7 @@ public function testItCanThrowsDuringSubDomainChangesIfTheSubDomainIsNotStringab ResolvedDomain::fromICANN('www.example.com', 1)->withSubDomain(date_create()); /* @phpstan-ignore-line */ } - /** - * @dataProvider withPublicSuffixWorksProvider - */ + #[DataProvider('withPublicSuffixWorksProvider')] public function testItCanChangeItsSuffix( ResolvedDomain $domain, EffectiveTopLevelDomain|string|null $publicSuffix, @@ -342,7 +328,7 @@ public function testItCanChangeItsSuffix( /** * @return iterable */ - public function withPublicSuffixWorksProvider(): iterable + public static function withPublicSuffixWorksProvider(): iterable { $baseDomain = ResolvedDomain::fromICANN('example.com', 1); @@ -429,9 +415,7 @@ public function testItCanThrowsDuringSuffixChangesIfTheDomainHasNotSuffix(): voi ResolvedDomain::fromUnknown(null)->withSuffix('www'); } - /** - * @dataProvider resolveCustomIDNAOptionsProvider - */ + #[DataProvider('resolveCustomIDNAOptionsProvider')] public function testItCanWorksWithIDNAOptions( string $domainName, string $publicSuffix, @@ -453,7 +437,7 @@ public function testItCanWorksWithIDNAOptions( /** * @return iterable */ - public function resolveCustomIDNAOptionsProvider(): iterable + public static function resolveCustomIDNAOptionsProvider(): iterable { return [ 'without deviation characters' => [ @@ -495,9 +479,7 @@ public function resolveCustomIDNAOptionsProvider(): iterable ]; } - /** - * @dataProvider withSldWorksProvider - */ + #[DataProvider('withSldWorksProvider')] public function testWithSecondLevelDomain( ?string $host, ?string $publicSuffix, @@ -517,7 +499,7 @@ public function testWithSecondLevelDomain( /** * @return iterable */ - public function withSldWorksProvider(): iterable + public static function withSldWorksProvider(): iterable { return [ [ diff --git a/src/RulesTest.php b/src/RulesTest.php index cbcaf037..b8e4838f 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -4,6 +4,7 @@ namespace Pdp; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use TypeError; use function array_fill; @@ -11,9 +12,6 @@ use function file_get_contents; use function implode; -/** - * @coversDefaultClass \Pdp\Rules - */ final class RulesTest extends TestCase { private static Rules $rules; @@ -203,25 +201,19 @@ public function testWithDomainInterfaceObject(): void ); } - /** - * @dataProvider parseDataProvider - */ + #[DataProvider('parseDataProvider')] public function testGetRegistrableDomain(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { self::assertSame($registrableDomain, self::$rules->resolve($domain)->registrableDomain()->value()); } - /** - * @dataProvider parseDataProvider - */ + #[DataProvider('parseDataProvider')] public function testGetPublicSuffix(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { self::assertSame($publicSuffix, self::$rules->resolve($domain)->suffix()->value()); } - /** - * @dataProvider parseDataProvider - */ + #[DataProvider('parseDataProvider')] public function testGetDomain(?string $publicSuffix, ?string $registrableDomain, string $domain, ?string $expectedDomain): void { self::assertSame($expectedDomain, self::$rules->resolve($domain)->value()); @@ -230,7 +222,7 @@ public function testGetDomain(?string $publicSuffix, ?string $registrableDomain, /** * @return iterable */ - public function parseDataProvider(): iterable + public static function parseDataProvider(): iterable { return [ // public suffix, registrable domain, domain @@ -324,11 +316,6 @@ public function parseDataProvider(): iterable ]; } - /** - * @covers ::validateDomain - * @covers \Pdp\Domain::parseDomain - * @covers \Pdp\Domain::parseValue - */ public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix(): void { $this->expectException(UnableToResolveDomain::class); @@ -336,13 +323,7 @@ public function testGetPublicSuffixThrowsCouldNotResolvePublicSuffix(): void self::$rules->getICANNDomain('localhost'); } - /** - * @covers ::getICANNDomain - * @covers \Pdp\Domain::parseDomain - * @covers \Pdp\Domain::parseValue - * - * @dataProvider invalidDomainParseProvider - */ + #[DataProvider('invalidDomainParseProvider')] public function testGetPublicSuffixThrowsInvalidDomainException(string $domain): void { $this->expectException(SyntaxError::class); @@ -353,7 +334,7 @@ public function testGetPublicSuffixThrowsInvalidDomainException(string $domain): /** * @return iterable */ - public function invalidDomainParseProvider(): iterable + public static function invalidDomainParseProvider(): iterable { return [ 'IPv6' => ['[::1]'], @@ -362,13 +343,7 @@ public function invalidDomainParseProvider(): iterable ]; } - /** - * @covers ::getICANNDomain - * @covers \Pdp\Domain::parseDomain - * @covers \Pdp\Domain::parseValue - * - * @dataProvider invalidHostParseProvider - */ + #[DataProvider('invalidHostParseProvider')] public function testGetPublicSuffixThrowsInvalidHostException(string $domain): void { $this->expectException(SyntaxError::class); @@ -379,7 +354,7 @@ public function testGetPublicSuffixThrowsInvalidHostException(string $domain): v /** * @return iterable */ - public function invalidHostParseProvider(): iterable + public static function invalidHostParseProvider(): iterable { $longLabel = implode('.', array_fill(0, 62, 'a')); @@ -391,13 +366,7 @@ public function invalidHostParseProvider(): iterable ]; } - /** - * @covers ::getCookieDomain - * @covers \Pdp\Domain::parseDomain - * @covers \Pdp\Domain::parseValue - * - * @dataProvider validPublicSectionProvider - */ + #[DataProvider('validPublicSectionProvider')] public function testPublicSuffixSection(?string $domain, ?string $expected): void { self::assertSame($expected, self::$rules->getCookieDomain($domain)->suffix()->value()); @@ -406,7 +375,7 @@ public function testPublicSuffixSection(?string $domain, ?string $expected): voi /** * @return iterable */ - public function validPublicSectionProvider(): iterable + public static function validPublicSectionProvider(): iterable { return [ 'idn domain' => [ @@ -548,9 +517,7 @@ public function testPublicSuffixSpec(): void $this->checkPublicSuffix('xn--fiqs8s', null); } - /** - * @dataProvider effectiveTLDProvider - */ + #[DataProvider('effectiveTLDProvider')] public function testEffectiveTLDResolution(string $host, string $cookieETLD, string $icannETLD, string $privateETLD): void { self::assertSame($cookieETLD, self::$rules->getCookieDomain($host)->suffix()->toString()); @@ -561,7 +528,7 @@ public function testEffectiveTLDResolution(string $host, string $cookieETLD, str /** * @return iterable */ - public function effectiveTLDProvider(): iterable + public static function effectiveTLDProvider(): iterable { return [ 'private domain effective TLD' => [ diff --git a/src/Storage/PublicSuffixListPsr16CacheTest.php b/src/Storage/PublicSuffixListPsr16CacheTest.php index 57212a74..c9c8989c 100644 --- a/src/Storage/PublicSuffixListPsr16CacheTest.php +++ b/src/Storage/PublicSuffixListPsr16CacheTest.php @@ -14,9 +14,6 @@ use RuntimeException; use function dirname; -/** - * @coversDefaultClass \Pdp\Storage\PublicSuffixListPsr16Cache - */ final class PublicSuffixListPsr16CacheTest extends TestCase { public function testItReturnsNullIfTheCacheDoesNotExists(): void diff --git a/src/Storage/PublicSuffixListPsr18ClientTest.php b/src/Storage/PublicSuffixListPsr18ClientTest.php index c90dd9e1..1117abb0 100644 --- a/src/Storage/PublicSuffixListPsr18ClientTest.php +++ b/src/Storage/PublicSuffixListPsr18ClientTest.php @@ -17,9 +17,6 @@ use function dirname; use function file_get_contents; -/** - * @coversDefaultClass \Pdp\Storage\PublicSuffixListPsr18Client - */ final class PublicSuffixListPsr18ClientTest extends TestCase { public function testIsCanReturnAPublicSuffixListInstance(): void diff --git a/src/Storage/RulesStorageTest.php b/src/Storage/RulesStorageTest.php index 7671ffcb..723628e7 100644 --- a/src/Storage/RulesStorageTest.php +++ b/src/Storage/RulesStorageTest.php @@ -9,9 +9,6 @@ use PHPUnit\Framework\TestCase; use function dirname; -/** - * @coversDefaultClass \Pdp\Storage\RulesStorage - */ final class RulesStorageTest extends TestCase { public function testIsCanReturnAPublicSuffixListInstanceFromCache(): void diff --git a/src/Storage/TimeToLiveTest.php b/src/Storage/TimeToLiveTest.php index b8083d12..1604d3df 100644 --- a/src/Storage/TimeToLiveTest.php +++ b/src/Storage/TimeToLiveTest.php @@ -7,6 +7,7 @@ use DateInterval; use DateTimeImmutable; use DateTimeZone; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Stringable; @@ -34,7 +35,7 @@ public function testItCanBeInstantiatedFromDurationInput(string $input, DateInte /** * @return iterable */ - public function validDurationString(): iterable + public static function validDurationString(): iterable { $threeDays = new DateInterval('P3D'); @@ -54,9 +55,7 @@ public function testItCastToNullWithNull(): void self::assertNull(TimeToLive::convert(null)); } - /** - * @dataProvider validDurationInt - */ + #[DataProvider('validDurationInt')] public function testItCanBeInstantiatedFromSeconds(int|string|Stringable|DateInterval $input, DateInterval $expected): void { /** @var DateInterval $ttl */ @@ -69,7 +68,7 @@ public function testItCanBeInstantiatedFromSeconds(int|string|Stringable|DateInt /** * @return iterable */ - public function validDurationInt(): iterable + public static function validDurationInt(): iterable { $seconds = new DateInterval('PT2345S'); diff --git a/src/Storage/TopLevelDomainListPsr16CacheTest.php b/src/Storage/TopLevelDomainListPsr16CacheTest.php index 58af4922..59a0a76b 100644 --- a/src/Storage/TopLevelDomainListPsr16CacheTest.php +++ b/src/Storage/TopLevelDomainListPsr16CacheTest.php @@ -14,9 +14,6 @@ use RuntimeException; use function dirname; -/** - * @coversDefaultClass \Pdp\Storage\TopLevelDomainListPsr16Cache - */ final class TopLevelDomainListPsr16CacheTest extends TestCase { public function testItReturnsNullIfTheCacheDoesNotExists(): void diff --git a/src/Storage/TopLevelDomainListPsr18ClientTest.php b/src/Storage/TopLevelDomainListPsr18ClientTest.php index 1b4dd555..9f4b0b69 100644 --- a/src/Storage/TopLevelDomainListPsr18ClientTest.php +++ b/src/Storage/TopLevelDomainListPsr18ClientTest.php @@ -17,9 +17,6 @@ use function dirname; use function file_get_contents; -/** - * @coversDefaultClass \Pdp\Storage\TopLevelDomainListPsr18Client - */ final class TopLevelDomainListPsr18ClientTest extends TestCase { public function testIsCanReturnARootZoneDatabaseInstance(): void diff --git a/src/Storage/TopLevelDomainsStorageTest.php b/src/Storage/TopLevelDomainsStorageTest.php index 61ab96ae..0e299e9c 100644 --- a/src/Storage/TopLevelDomainsStorageTest.php +++ b/src/Storage/TopLevelDomainsStorageTest.php @@ -9,9 +9,6 @@ use PHPUnit\Framework\TestCase; use function dirname; -/** - * @coversDefaultClass \Pdp\Storage\TopLevelDomainsStorage - */ final class TopLevelDomainsStorageTest extends TestCase { public function testIsCanReturnARootZoneDatabaseInstanceFromCache(): void diff --git a/src/SuffixTest.php b/src/SuffixTest.php index 1bd1b820..ca728c80 100644 --- a/src/SuffixTest.php +++ b/src/SuffixTest.php @@ -4,12 +4,10 @@ namespace Pdp; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use function json_encode; -/** - * @coversDefaultClass \Pdp\Suffix - */ final class SuffixTest extends TestCase { public function testItCanBeCreatedWithAnotherResolvedDomain(): void @@ -36,9 +34,7 @@ public function testPSToUnicodeWithUrlEncode(): void self::assertSame('bébe', Suffix::fromUnknown('b%C3%A9be')->toUnicode()->value()); } - /** - * @dataProvider invalidPublicSuffixProvider - */ + #[DataProvider('invalidPublicSuffixProvider')] public function testConstructorThrowsException(string $publicSuffix): void { $this->expectException(SyntaxError::class); @@ -49,7 +45,7 @@ public function testConstructorThrowsException(string $publicSuffix): void /** * @return iterable> */ - public function invalidPublicSuffixProvider(): iterable + public static function invalidPublicSuffixProvider(): iterable { return [ 'empty string' => [''], @@ -104,9 +100,7 @@ public function testFromIANA(): void Suffix::fromIANA('ac.be'); } - /** - * @dataProvider conversionReturnsTheSameInstanceProvider - */ + #[DataProvider('conversionReturnsTheSameInstanceProvider')] public function testConversionReturnsTheSameInstance(?string $publicSuffix): void { $instance = Suffix::fromUnknown($publicSuffix); @@ -118,7 +112,7 @@ public function testConversionReturnsTheSameInstance(?string $publicSuffix): voi /** * @return iterable */ - public function conversionReturnsTheSameInstanceProvider(): iterable + public static function conversionReturnsTheSameInstanceProvider(): iterable { return [ 'ascii only domain' => ['ac.be'], @@ -133,10 +127,7 @@ public function testToUnicodeReturnsSameInstance(): void self::assertEquals($instance->toUnicode(), $instance); } - /** - * @dataProvider countableProvider - * @param ?string $domain - */ + #[DataProvider('countableProvider')] public function testCountable(?string $domain, int $nbLabels): void { $domain = Suffix::fromUnknown($domain); @@ -147,7 +138,7 @@ public function testCountable(?string $domain, int $nbLabels): void /** * @return iterable}> */ - public function countableProvider(): iterable + public static function countableProvider(): iterable { return [ 'null' => [null, 0, []], diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index 2b13f280..ca86e115 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -6,14 +6,12 @@ use DateTimeImmutable; use DateTimeZone; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Stringable; use TypeError; use function dirname; -/** - * @coversDefaultClass \Pdp\TopLevelDomains - */ final class TopLevelDomainsTest extends TestCase { private static TopLevelDomains $topLevelDomains; @@ -23,12 +21,6 @@ public static function setUpBeforeClass(): void self::$topLevelDomains = TopLevelDomains::fromPath(dirname(__DIR__).'/test_data/tlds-alpha-by-domain.txt'); } - /** - * @covers ::fromPath - * @covers ::fromString - * @covers \Pdp\Stream - * @covers ::__construct - */ public function testCreateFromPath(): void { $context = stream_context_create([ @@ -43,10 +35,6 @@ public function testCreateFromPath(): void self::assertEquals(self::$topLevelDomains, $topLevelDomains); } - /** - * @covers ::fromPath - * @covers \Pdp\UnableToLoadTopLevelDomainList - */ public function testCreateFromPathThrowsException(): void { $this->expectException(UnableToLoadResource::class); @@ -54,9 +42,7 @@ public function testCreateFromPathThrowsException(): void TopLevelDomains::fromPath('/foo/bar.dat'); } - /** - * @dataProvider invalidContentProvider - */ + #[DataProvider('invalidContentProvider')] public function testConverterThrowsException(string $content): void { $this->expectException(UnableToLoadTopLevelDomainList::class); @@ -67,7 +53,7 @@ public function testConverterThrowsException(string $content): void /** * @return iterable */ - public function invalidContentProvider(): iterable + public static function invalidContentProvider(): iterable { $doubleHeader = <<> */ - public function validDomainProvider(): iterable + public static function validDomainProvider(): iterable { $resolvedDomain = ResolvedDomain::fromICANN(Domain::fromIDNA2008('www.example.com'), 1); @@ -278,7 +256,7 @@ public function testGetTopLevelDomainWithUnregisteredTLD(): void /** * @return iterable> */ - public function validTldProvider(): iterable + public static function validTldProvider(): iterable { return [ 'simple TLD' => ['COM'], @@ -304,7 +282,7 @@ public function __toString(): string /** * @return iterable> */ - public function invalidTldProvider(): iterable + public static function invalidTldProvider(): iterable { return [ 'invalid TLD (1)' => ['COMM'], From e606fec0cba5731dff42c42cb8e1d068b06b41eb Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 20 Feb 2023 17:16:45 +0100 Subject: [PATCH 427/461] Introduce RegisteredName class to allow iplike subdomain --- CHANGELOG.md | 18 +++ src/Domain.php | 266 ++++--------------------------- src/Host.php | 2 + src/RegisteredName.php | 353 +++++++++++++++++++++++++++++++++++++++++ src/ResolvedDomain.php | 2 +- 5 files changed, 408 insertions(+), 233 deletions(-) create mode 100644 src/RegisteredName.php diff --git a/CHANGELOG.md b/CHANGELOG.md index e011fd6e..f2681c25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,24 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will be documented in this file +## Next - TBD + +### Added + +- `RegisteredName` class to allow subdomain with IP-like labels [#347](https://github.com/jeremykendall/php-domain-parser/issues/347) + +### Fixed + +- Using PHPUnit 10 + +### Deprecated + +- None + +### Removed + +- None + ## 6.2.0 - 2022-10-30 ### Added diff --git a/src/Domain.php b/src/Domain.php index fa8319cf..46760da3 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -6,134 +6,32 @@ use Iterator; use Stringable; -use function array_count_values; -use function array_keys; -use function array_reverse; -use function array_slice; -use function array_unshift; -use function count; -use function explode; -use function filter_var; -use function implode; -use function in_array; -use function ksort; -use function preg_match; -use function rawurldecode; -use function strtolower; -use const FILTER_FLAG_IPV4; -use const FILTER_VALIDATE_IP; final class Domain implements DomainName { - private const IDNA_2003 = 'IDNA_2003'; - private const IDNA_2008 = 'IDNA_2008'; - private const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/'; - // Note that unreserved is purposely missing . as it is used to separate labels. - private const REGEXP_REGISTERED_NAME = '/(?(DEFINE) - (?[a-z0-9_~\-]) - (?[!$&\'()*+,;=]) - (?%[A-F0-9]{2}) - (?(?:(?&unreserved)|(?&sub_delims)|(?&encoded)){1,63}) - ) - ^(?:(?®_name)\.){0,126}(?®_name)\.?$/ix'; - private const REGEXP_URI_DELIMITERS = '/[:\/?#\[\]@ ]/'; - - /** @var array */ - private readonly array $labels; - private readonly ?string $domain; - - private function __construct(private string $type, DomainNameProvider|Host|Stringable|string|int|null $domain) + private function __construct(private RegisteredName $registeredName) { - $this->domain = $this->parseDomain($domain); - $this->labels = null === $this->domain ? [] : array_reverse(explode('.', $this->domain)); + if ($this->registeredName->isIpv4()) { + throw SyntaxError::dueToUnsupportedType($this->registeredName->toString()); + } } /** - * @param array{domain:string|null, type:string} $properties + * @param array{registeredName: RegisteredName} $properties */ public static function __set_state(array $properties): self { - return new self($properties['type'], $properties['domain']); + return new self($properties['registeredName']); } public static function fromIDNA2003(DomainNameProvider|Host|Stringable|string|int|null $domain): self { - return new self(self::IDNA_2003, $domain); + return new self(RegisteredName::fromIDNA2003($domain)); } public static function fromIDNA2008(DomainNameProvider|Host|Stringable|string|int|null $domain): self { - return new self(self::IDNA_2008, $domain); - } - - private function parseDomain(DomainNameProvider|Host|Stringable|string|int|null $domain): ?string - { - if ($domain instanceof DomainNameProvider) { - $domain = $domain->domain(); - } - - if ($domain instanceof Host) { - return $this->parseValue($domain->toUnicode()->value()); - } - - return $this->parseValue($domain); - } - - /** - * Parse and format the domain to ensure it is valid. - * Returns an array containing the formatted domain name labels - * and the domain transitional information. - * - * For example: parse('wWw.uLb.Ac.be') should return ['www.ulb.ac.be', ['be', 'ac', 'ulb', 'www']];. - * - * @throws SyntaxError If the host is not a domain - * @throws SyntaxError If the domain is not a host - */ - private function parseValue(Stringable|string|int|null $domain): ?string - { - if (null === $domain) { - return null; - } - - if ($domain instanceof Stringable) { - $domain = (string) $domain; - } - - $domain = (string) $domain; - if ('' === $domain) { - return ''; - } - - $res = filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); - if (false !== $res) { - throw SyntaxError::dueToUnsupportedType($domain); - } - - $formattedDomain = rawurldecode($domain); - return match (true) { - 1 === preg_match(self::REGEXP_REGISTERED_NAME, $formattedDomain) => strtolower($formattedDomain), - // a domain name can not contain URI delimiters or space - 1 === preg_match(self::REGEXP_URI_DELIMITERS, $formattedDomain) => throw SyntaxError::dueToInvalidCharacters($domain), - // if the domain name does not contain UTF-8 chars then it is malformed - 1 !== preg_match(self::REGEXP_IDN_PATTERN, $formattedDomain) => throw SyntaxError::dueToMalformedValue($domain), - default => $this->domainToUnicode($this->domainToAscii($formattedDomain)), - }; - } - - private function domainToAscii(string $domain): string - { - return Idna::toAscii( - $domain, - self::IDNA_2003 === $this->type ? Idna::IDNA2003_ASCII : Idna::IDNA2008_ASCII - )->result(); - } - - private function domainToUnicode(string $domain): string - { - return Idna::toUnicode( - $domain, - self::IDNA_2003 === $this->type ? Idna::IDNA2003_UNICODE : Idna::IDNA2008_UNICODE - )->result(); + return new self(RegisteredName::fromIDNA2008($domain)); } /** @@ -141,41 +39,37 @@ private function domainToUnicode(string $domain): string */ public function getIterator(): Iterator { - yield from $this->labels; + yield from $this->registeredName; } public function isAscii(): bool { - return null === $this->domain || 1 !== preg_match(self::REGEXP_IDN_PATTERN, $this->domain); + return $this->registeredName->isAscii(); } public function jsonSerialize(): ?string { - return $this->domain; + return $this->registeredName->jsonSerialize(); } public function count(): int { - return count($this->labels); + return count($this->registeredName); } public function value(): ?string { - return $this->domain; + return $this->registeredName->value(); } public function toString(): string { - return (string) $this->domain; + return $this->registeredName->toString(); } public function label(int $key): ?string { - if ($key < 0) { - $key += count($this->labels); - } - - return $this->labels[$key] ?? null; + return $this->registeredName->label($key); } /** @@ -183,11 +77,7 @@ public function label(int $key): ?string */ public function keys(string $label = null): array { - if (null === $label) { - return array_keys($this->labels); - } - - return array_keys($this->labels, $label, true); + return $this->registeredName->keys($label); } /** @@ -195,61 +85,31 @@ public function keys(string $label = null): array */ public function labels(): array { - return $this->labels; + return $this->registeredName->labels(); } - public function toAscii(): self + public function isIpv4(): bool { - if (null === $this->domain) { - return $this; - } - - $domain = $this->domainToAscii($this->domain); - if ($domain === $this->domain) { - return $this; - } - - return new self($this->type, $domain); + return $this->registeredName->isIpv4(); } - public function toUnicode(): self + private function newInstance(RegisteredName $registeredName): self { - if (null === $this->domain) { + if ($registeredName->value() === $this->registeredName->value()) { return $this; } - $domain = $this->domainToUnicode($this->domain); - if ($domain === $this->domain) { - return $this; - } - - return new self($this->type, $domain); + return new self($registeredName); } - /** - * Filter a subdomain to update the domain part. - */ - private function normalize(DomainNameProvider|Host|Stringable|string|null $domain): ?string + public function toAscii(): self { - if ($domain instanceof DomainNameProvider) { - $domain = $domain->domain(); - } - - if ($domain instanceof Host) { - $domain = $domain->value(); - } - - if (null === $domain) { - return $domain; - } - - $domain = (string) $domain; + return $this->newInstance($this->registeredName->toAscii()); + } - return match (true) { - null === $this->domain => $domain, - $this->isAscii() => $this->domainToAscii($domain), - default => $this->domainToUnicode($domain), - }; + public function toUnicode(): self + { + return $this->newInstance($this->registeredName->toUnicode()); } /** @@ -257,7 +117,7 @@ private function normalize(DomainNameProvider|Host|Stringable|string|null $domai */ public function prepend(DomainNameProvider|Host|string|Stringable|null $label): self { - return $this->withLabel(count($this->labels), $label); + return $this->newInstance($this->registeredName->prepend($label)); } /** @@ -265,84 +125,26 @@ public function prepend(DomainNameProvider|Host|string|Stringable|null $label): */ public function append(DomainNameProvider|Host|string|Stringable|null $label): self { - return $this->withLabel(- count($this->labels) - 1, $label); + return $this->newInstance($this->registeredName->append($label)); } public function withLabel(int $key, DomainNameProvider|Host|string|Stringable|null $label): self { - $nbLabels = count($this->labels); - if ($key < - $nbLabels - 1 || $key > $nbLabels) { - throw SyntaxError::dueToInvalidLabelKey($this, $key); - } - - if (0 > $key) { - $key = $nbLabels + $key; - } - - $label = $this->normalize($label); - - if (($this->labels[$key] ?? null) === $label) { - return $this; - } - - $labels = $this->labels; - $labels[$key] = $label; - ksort($labels); - - return new self($this->type, implode('.', array_reverse($labels))); + return $this->newInstance($this->registeredName->withLabel($key, $label)); } public function withoutLabel(int $key, int ...$keys): self { - array_unshift($keys, $key); - $nbLabels = count($this->labels); - foreach ($keys as &$offset) { - if (- $nbLabels > $offset || $nbLabels - 1 < $offset) { - throw SyntaxError::dueToInvalidLabelKey($this, $key); - } - - if (0 > $offset) { - $offset += $nbLabels; - } - } - unset($offset); - - $deletedKeys = array_keys(array_count_values($keys)); - $labels = []; - foreach ($this->labels as $offset => $label) { - if (!in_array($offset, $deletedKeys, true)) { - $labels[] = $label; - } - } - - if ($labels === $this->labels) { - return $this; - } - - return new self($this->type, [] === $labels ? null : implode('.', array_reverse($labels))); + return $this->newInstance($this->registeredName->withoutLabel($key, ...$keys)); } public function clear(): self { - if (null === $this->domain) { - return $this; - } - - return new self($this->type, null); + return $this->newInstance($this->registeredName->clear()); } public function slice(int $offset, int $length = null): self { - $nbLabels = count($this->labels); - if ($offset < - $nbLabels || $offset > $nbLabels) { - throw SyntaxError::dueToInvalidLabelKey($this, $offset); - } - - $labels = array_slice($this->labels, $offset, $length, true); - if ($labels === $this->labels) { - return $this; - } - - return new self($this->type, [] === $labels ? null : implode('.', array_reverse($labels))); + return $this->newInstance($this->registeredName->slice($offset, $length)); } } diff --git a/src/Host.php b/src/Host.php index 87945e91..2ca70483 100644 --- a/src/Host.php +++ b/src/Host.php @@ -11,6 +11,8 @@ * @see https://tools.ietf.org/html/rfc1034#section-3.5 * @see https://tools.ietf.org/html/rfc1123#section-2.1 * @see https://tools.ietf.org/html/rfc5890 + * + * @method bool isIpv4() */ interface Host extends Countable, JsonSerializable { diff --git a/src/RegisteredName.php b/src/RegisteredName.php new file mode 100644 index 00000000..145de078 --- /dev/null +++ b/src/RegisteredName.php @@ -0,0 +1,353 @@ +[a-z0-9_~\-]) + (?[!$&\'()*+,;=]) + (?%[A-F0-9]{2}) + (?(?:(?&unreserved)|(?&sub_delims)|(?&encoded)){1,63}) + ) + ^(?:(?®_name)\.){0,126}(?®_name)\.?$/ix'; + private const REGEXP_URI_DELIMITERS = '/[:\/?#\[\]@ ]/'; + + /** @var array */ + private readonly array $labels; + private readonly ?string $domain; + + private function __construct(private string $type, DomainNameProvider|Host|Stringable|string|int|null $domain) + { + $this->domain = $this->parseDomain($domain); + $this->labels = null === $this->domain ? [] : array_reverse(explode('.', $this->domain)); + } + + /** + * @param array{domain:string|null, type:string} $properties + */ + public static function __set_state(array $properties): self + { + return new self($properties['type'], $properties['domain']); + } + + public static function fromIDNA2003(DomainNameProvider|Host|Stringable|string|int|null $domain): self + { + return new self(self::IDNA_2003, $domain); + } + + public static function fromIDNA2008(DomainNameProvider|Host|Stringable|string|int|null $domain): self + { + return new self(self::IDNA_2008, $domain); + } + + private function parseDomain(DomainNameProvider|Host|Stringable|string|int|null $domain): ?string + { + if ($domain instanceof DomainNameProvider) { + $domain = $domain->domain(); + } + + if ($domain instanceof Host) { + return $this->parseValue($domain->toUnicode()->value()); + } + + return $this->parseValue($domain); + } + + /** + * Parse and format the domain to ensure it is valid. + * Returns an array containing the formatted domain name labels + * and the domain transitional information. + * + * For example: parse('wWw.uLb.Ac.be') should return ['www.ulb.ac.be', ['be', 'ac', 'ulb', 'www']];. + * + * @throws SyntaxError If the host is not a domain + * @throws SyntaxError If the domain is not a host + */ + private function parseValue(Stringable|string|int|null $domain): ?string + { + if (null === $domain) { + return null; + } + + if ($domain instanceof Stringable) { + $domain = (string) $domain; + } + + $domain = (string) $domain; + if ('' === $domain) { + return ''; + } + + $res = filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); + if (false !== $res) { + return $res; + } + + $formattedDomain = rawurldecode($domain); + return match (true) { + 1 === preg_match(self::REGEXP_REGISTERED_NAME, $formattedDomain) => strtolower($formattedDomain), + // a domain name can not contain URI delimiters or space + 1 === preg_match(self::REGEXP_URI_DELIMITERS, $formattedDomain) => throw SyntaxError::dueToInvalidCharacters($domain), + // if the domain name does not contain UTF-8 chars then it is malformed + 1 !== preg_match(self::REGEXP_IDN_PATTERN, $formattedDomain) => throw SyntaxError::dueToMalformedValue($domain), + default => $this->domainToUnicode($this->domainToAscii($formattedDomain)), + }; + } + + private function domainToAscii(string $domain): string + { + return Idna::toAscii( + $domain, + self::IDNA_2003 === $this->type ? Idna::IDNA2003_ASCII : Idna::IDNA2008_ASCII + )->result(); + } + + private function domainToUnicode(string $domain): string + { + return Idna::toUnicode( + $domain, + self::IDNA_2003 === $this->type ? Idna::IDNA2003_UNICODE : Idna::IDNA2008_UNICODE + )->result(); + } + + public function isIpv4(): bool + { + return false !== filter_var($this->domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); + } + + /** + * @return Iterator + */ + public function getIterator(): Iterator + { + yield from $this->labels; + } + + public function isAscii(): bool + { + return null === $this->domain || 1 !== preg_match(self::REGEXP_IDN_PATTERN, $this->domain); + } + + public function jsonSerialize(): ?string + { + return $this->domain; + } + + public function count(): int + { + return count($this->labels); + } + + public function value(): ?string + { + return $this->domain; + } + + public function toString(): string + { + return (string) $this->domain; + } + + public function label(int $key): ?string + { + if ($key < 0) { + $key += count($this->labels); + } + + return $this->labels[$key] ?? null; + } + + /** + * @return list + */ + public function keys(string $label = null): array + { + if (null === $label) { + return array_keys($this->labels); + } + + return array_keys($this->labels, $label, true); + } + + /** + * @return array + */ + public function labels(): array + { + return $this->labels; + } + + public function toAscii(): self + { + if (null === $this->domain) { + return $this; + } + + $domain = $this->domainToAscii($this->domain); + if ($domain === $this->domain) { + return $this; + } + + return new self($this->type, $domain); + } + + public function toUnicode(): self + { + if (null === $this->domain) { + return $this; + } + + $domain = $this->domainToUnicode($this->domain); + if ($domain === $this->domain) { + return $this; + } + + return new self($this->type, $domain); + } + + /** + * Filter a subdomain to update the domain part. + */ + private function normalize(DomainNameProvider|Host|Stringable|string|null $domain): ?string + { + if ($domain instanceof DomainNameProvider) { + $domain = $domain->domain(); + } + + if ($domain instanceof Host) { + $domain = $domain->value(); + } + + if (null === $domain) { + return $domain; + } + + $domain = (string) $domain; + + return match (true) { + null === $this->domain => $domain, + $this->isAscii() => $this->domainToAscii($domain), + default => $this->domainToUnicode($domain), + }; + } + + /** + * @throws CannotProcessHost + */ + public function prepend(DomainNameProvider|Host|string|Stringable|null $label): self + { + return $this->withLabel(count($this->labels), $label); + } + + /** + * @throws CannotProcessHost + */ + public function append(DomainNameProvider|Host|string|Stringable|null $label): self + { + return $this->withLabel(- count($this->labels) - 1, $label); + } + + public function withLabel(int $key, DomainNameProvider|Host|string|Stringable|null $label): self + { + $nbLabels = count($this->labels); + if ($key < - $nbLabels - 1 || $key > $nbLabels) { + throw SyntaxError::dueToInvalidLabelKey($this, $key); + } + + if (0 > $key) { + $key = $nbLabels + $key; + } + + $label = $this->normalize($label); + + if (($this->labels[$key] ?? null) === $label) { + return $this; + } + + $labels = $this->labels; + $labels[$key] = $label; + ksort($labels); + + return new self($this->type, implode('.', array_reverse($labels))); + } + + public function withoutLabel(int $key, int ...$keys): self + { + array_unshift($keys, $key); + $nbLabels = count($this->labels); + foreach ($keys as &$offset) { + if (- $nbLabels > $offset || $nbLabels - 1 < $offset) { + throw SyntaxError::dueToInvalidLabelKey($this, $key); + } + + if (0 > $offset) { + $offset += $nbLabels; + } + } + unset($offset); + + $deletedKeys = array_keys(array_count_values($keys)); + $labels = []; + foreach ($this->labels as $offset => $label) { + if (!in_array($offset, $deletedKeys, true)) { + $labels[] = $label; + } + } + + if ($labels === $this->labels) { + return $this; + } + + return new self($this->type, [] === $labels ? null : implode('.', array_reverse($labels))); + } + + public function clear(): self + { + if (null === $this->domain) { + return $this; + } + + return new self($this->type, null); + } + + public function slice(int $offset, int $length = null): self + { + $nbLabels = count($this->labels); + if ($offset < - $nbLabels || $offset > $nbLabels) { + throw SyntaxError::dueToInvalidLabelKey($this, $offset); + } + + $labels = array_slice($this->labels, $offset, $length, true); + if ($labels === $this->labels) { + return $this; + } + + return new self($this->type, [] === $labels ? null : implode('.', array_reverse($labels))); + } +} diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 870f62ac..3849b6d2 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -102,7 +102,7 @@ private function parse(): array return [ 'registrableDomain' => $this->domain->slice(0, $length + 1), 'secondLevelDomain' => $this->domain->slice($length, 1), - 'subDomain' => $this->domain->slice($length + 1), + 'subDomain' => RegisteredName::fromIDNA2008($this->domain->value())->slice($length + 1), ]; } From fd11f5783e0b23ed72b6c823d376d054542a0f7a Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Mon, 20 Feb 2023 21:54:09 +0100 Subject: [PATCH 428/461] remove iterator_to_array usage --- src/DomainTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DomainTest.php b/src/DomainTest.php index 076baee4..1b3e357b 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -45,7 +45,7 @@ public function testDomainInternalPhpMethod(): void /** @var Domain $generateDomain */ $generateDomain = eval('return '.var_export($domain, true).';'); self::assertEquals($domain, $generateDomain); - self::assertSame(['be', 'ac', 'ulb', 'www'], iterator_to_array($domain)); + self::assertSame(['be', 'ac', 'ulb', 'www'], [...$domain]); self::assertEquals('"www.ulb.ac.be"', json_encode($domain)); self::assertSame('www.ulb.ac.be', $domain->toString()); } @@ -58,7 +58,7 @@ public function testCountable(?string $domain, int $nbLabels, array $labels): vo { $domain = Domain::fromIDNA2008($domain); self::assertCount($nbLabels, $domain); - self::assertSame($labels, iterator_to_array($domain)); + self::assertSame($labels, [...$domain]); } /** From e9eb70ff3e9de356270bffbf147f72de6a6c417b Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Tue, 21 Feb 2023 06:17:52 +0100 Subject: [PATCH 429/461] Improve internal codebase --- CHANGELOG.md | 3 ++- composer.json | 4 ++-- src/Domain.php | 13 +++++-------- src/DomainName.php | 2 +- src/Host.php | 2 -- src/RegisteredName.php | 35 ++++++++++++++++++++++++----------- 6 files changed, 34 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2681c25..17449e64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,11 +6,12 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will ### Added -- `RegisteredName` class to allow subdomain with IP-like labels [#347](https://github.com/jeremykendall/php-domain-parser/issues/347) +- `RegisteredName` class to allow subdomain with IP-like labels ### Fixed - Using PHPUnit 10 +- `Domain` decorates the new `RegisteredName` class [#347](https://github.com/jeremykendall/php-domain-parser/issues/347) ### Deprecated diff --git a/composer.json b/composer.json index b3f7a192..27de40dc 100644 --- a/composer.json +++ b/composer.json @@ -49,10 +49,10 @@ "friendsofphp/php-cs-fixer": "^v3.13.2", "guzzlehttp/guzzle": "^7.5", "guzzlehttp/psr7": "^1.6 || ^2.4.3", - "phpstan/phpstan": "^1.9.17", + "phpstan/phpstan": "^1.9.18", "phpstan/phpstan-phpunit": "^1.3.4", "phpstan/phpstan-strict-rules": "^1.4.5", - "phpunit/phpunit": "^10.0.7", + "phpunit/phpunit": "^10.0.11", "psr/http-factory": "^1.0.1", "psr/simple-cache": "^1.0.1", "symfony/cache": "^v5.0.0 || ^v6.0.0" diff --git a/src/Domain.php b/src/Domain.php index 46760da3..cc7a5b74 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -6,12 +6,14 @@ use Iterator; use Stringable; +use const FILTER_FLAG_IPV4; +use const FILTER_VALIDATE_IP; final class Domain implements DomainName { private function __construct(private RegisteredName $registeredName) { - if ($this->registeredName->isIpv4()) { + if (false !== filter_var($this->registeredName->value(), FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { throw SyntaxError::dueToUnsupportedType($this->registeredName->toString()); } } @@ -88,11 +90,6 @@ public function labels(): array return $this->registeredName->labels(); } - public function isIpv4(): bool - { - return $this->registeredName->isIpv4(); - } - private function newInstance(RegisteredName $registeredName): self { if ($registeredName->value() === $this->registeredName->value()) { @@ -133,9 +130,9 @@ public function withLabel(int $key, DomainNameProvider|Host|string|Stringable|nu return $this->newInstance($this->registeredName->withLabel($key, $label)); } - public function withoutLabel(int $key, int ...$keys): self + public function withoutLabel(int ...$keys): self { - return $this->newInstance($this->registeredName->withoutLabel($key, ...$keys)); + return $this->newInstance($this->registeredName->withoutLabel(...$keys)); } public function clear(): self diff --git a/src/DomainName.php b/src/DomainName.php index fc407c32..c98c063e 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -101,7 +101,7 @@ public function withLabel(int $key, DomainNameProvider|Host|string|Stringable|nu * * @throws CannotProcessHost If the key is out of bounds */ - public function withoutLabel(int $key, int ...$keys): self; + public function withoutLabel(int ...$keys): self; /** * Returns an instance with all labels removed. diff --git a/src/Host.php b/src/Host.php index 2ca70483..87945e91 100644 --- a/src/Host.php +++ b/src/Host.php @@ -11,8 +11,6 @@ * @see https://tools.ietf.org/html/rfc1034#section-3.5 * @see https://tools.ietf.org/html/rfc1123#section-2.1 * @see https://tools.ietf.org/html/rfc5890 - * - * @method bool isIpv4() */ interface Host extends Countable, JsonSerializable { diff --git a/src/RegisteredName.php b/src/RegisteredName.php index 145de078..33135196 100644 --- a/src/RegisteredName.php +++ b/src/RegisteredName.php @@ -10,7 +10,6 @@ use function array_keys; use function array_reverse; use function array_slice; -use function array_unshift; use function count; use function explode; use function filter_var; @@ -42,7 +41,10 @@ final class RegisteredName implements DomainName private readonly array $labels; private readonly ?string $domain; - private function __construct(private string $type, DomainNameProvider|Host|Stringable|string|int|null $domain) + /** + * @throws CannotProcessHost + */ + private function __construct(private readonly string $type, DomainNameProvider|Host|Stringable|string|int|null $domain) { $this->domain = $this->parseDomain($domain); $this->labels = null === $this->domain ? [] : array_reverse(explode('.', $this->domain)); @@ -50,22 +52,33 @@ private function __construct(private string $type, DomainNameProvider|Host|Strin /** * @param array{domain:string|null, type:string} $properties + * + * @throws CannotProcessHost */ public static function __set_state(array $properties): self { return new self($properties['type'], $properties['domain']); } + /** + * @throws CannotProcessHost + */ public static function fromIDNA2003(DomainNameProvider|Host|Stringable|string|int|null $domain): self { return new self(self::IDNA_2003, $domain); } + /** + * @throws CannotProcessHost + */ public static function fromIDNA2008(DomainNameProvider|Host|Stringable|string|int|null $domain): self { return new self(self::IDNA_2008, $domain); } + /** + * @throws CannotProcessHost + */ private function parseDomain(DomainNameProvider|Host|Stringable|string|int|null $domain): ?string { if ($domain instanceof DomainNameProvider) { @@ -136,11 +149,6 @@ private function domainToUnicode(string $domain): string )->result(); } - public function isIpv4(): bool - { - return false !== filter_var($this->domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); - } - /** * @return Iterator */ @@ -245,7 +253,7 @@ private function normalize(DomainNameProvider|Host|Stringable|string|null $domai } if (null === $domain) { - return $domain; + return null; } $domain = (string) $domain; @@ -297,13 +305,12 @@ public function withLabel(int $key, DomainNameProvider|Host|string|Stringable|nu return new self($this->type, implode('.', array_reverse($labels))); } - public function withoutLabel(int $key, int ...$keys): self + public function withoutLabel(int ...$keys): self { - array_unshift($keys, $key); $nbLabels = count($this->labels); foreach ($keys as &$offset) { if (- $nbLabels > $offset || $nbLabels - 1 < $offset) { - throw SyntaxError::dueToInvalidLabelKey($this, $key); + throw SyntaxError::dueToInvalidLabelKey($this, $offset); } if (0 > $offset) { @@ -327,6 +334,9 @@ public function withoutLabel(int $key, int ...$keys): self return new self($this->type, [] === $labels ? null : implode('.', array_reverse($labels))); } + /** + * @throws CannotProcessHost + */ public function clear(): self { if (null === $this->domain) { @@ -336,6 +346,9 @@ public function clear(): self return new self($this->type, null); } + /** + * @throws CannotProcessHost + */ public function slice(int $offset, int $length = null): self { $nbLabels = count($this->labels); From 313072375ae0238f4bf61e484a998e8076285f63 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Tue, 21 Feb 2023 06:26:34 +0100 Subject: [PATCH 430/461] Improve internal codebase --- CHANGELOG.md | 1 + src/DomainTest.php | 7 +++++++ src/RegisteredName.php | 14 +++++--------- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17449e64..656cd744 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - Using PHPUnit 10 - `Domain` decorates the new `RegisteredName` class [#347](https://github.com/jeremykendall/php-domain-parser/issues/347) +- `Host::withoutLabel` works without arguments. ### Deprecated diff --git a/src/DomainTest.php b/src/DomainTest.php index 1b3e357b..3ea53151 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -395,6 +395,13 @@ public function testwithoutLabelWorksWithMultipleKeys(): void self::assertNull(Domain::fromIDNA2008('www.example.com')->withoutLabel(0, 1, 2)->value()); } + public function testWithoutLabelWorksWithoutArgument(): void + { + $domain = Domain::fromIDNA2008('www.example.com'); + + self::assertSame($domain, $domain->withoutLabel()); + } + #[DataProvider('resolveCustomIDNAOptionsProvider')] public function testResolveWorksWithCustomIDNAOptions( string $domainName, diff --git a/src/RegisteredName.php b/src/RegisteredName.php index 33135196..64602dd5 100644 --- a/src/RegisteredName.php +++ b/src/RegisteredName.php @@ -81,15 +81,11 @@ public static function fromIDNA2008(DomainNameProvider|Host|Stringable|string|in */ private function parseDomain(DomainNameProvider|Host|Stringable|string|int|null $domain): ?string { - if ($domain instanceof DomainNameProvider) { - $domain = $domain->domain(); - } - - if ($domain instanceof Host) { - return $this->parseValue($domain->toUnicode()->value()); - } - - return $this->parseValue($domain); + return $this->parseValue(match (true) { + $domain instanceof DomainNameProvider => $domain->domain()->value(), + $domain instanceof Host => $domain->toUnicode()->value(), + default => $domain, + }); } /** From 1f28803b98e6a5f9d16c37502ae7dd6fc075a714 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Tue, 21 Feb 2023 17:40:01 +0100 Subject: [PATCH 431/461] Use RegisteredName to improve ResolvedDomain --- src/Domain.php | 8 ++--- src/DomainName.php | 12 +++---- src/RegisteredName.php | 12 +++---- src/ResolvedDomain.php | 70 ++++++++++++++++++++++---------------- src/ResolvedDomainName.php | 6 ++-- src/ResolvedDomainTest.php | 16 +++++++++ src/Rules.php | 23 +++++++------ src/Suffix.php | 17 ++++----- src/SuffixTest.php | 1 + 9 files changed, 99 insertions(+), 66 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index cc7a5b74..5fc535e6 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -83,7 +83,7 @@ public function keys(string $label = null): array } /** - * @return array + * @return list */ public function labels(): array { @@ -112,7 +112,7 @@ public function toUnicode(): self /** * @throws CannotProcessHost */ - public function prepend(DomainNameProvider|Host|string|Stringable|null $label): self + public function prepend(DomainNameProvider|Host|Stringable|string|int|null $label): self { return $this->newInstance($this->registeredName->prepend($label)); } @@ -120,12 +120,12 @@ public function prepend(DomainNameProvider|Host|string|Stringable|null $label): /** * @throws CannotProcessHost */ - public function append(DomainNameProvider|Host|string|Stringable|null $label): self + public function append(DomainNameProvider|Host|Stringable|string|int|null $label): self { return $this->newInstance($this->registeredName->append($label)); } - public function withLabel(int $key, DomainNameProvider|Host|string|Stringable|null $label): self + public function withLabel(int $key, DomainNameProvider|Host|Stringable|string|int|null $label): self { return $this->newInstance($this->registeredName->withLabel($key, $label)); } diff --git a/src/DomainName.php b/src/DomainName.php index c98c063e..c4a4aaf9 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -37,7 +37,7 @@ public function label(int $key): ?string; /** * Returns the object labels. * - * @return array + * @return list */ public function labels(): array; @@ -47,7 +47,7 @@ public function labels(): array; * If a value is specified only the keys associated with * the given value will be returned * - * @return array + * @return list */ public function keys(string $label = null): array; @@ -64,14 +64,14 @@ public function getIterator(): Iterator; * * @see ::withLabel */ - public function prepend(DomainNameProvider|Host|string|Stringable|null $label): self; + public function prepend(DomainNameProvider|Host|Stringable|string|int|null $label): self; /** * Appends a label to the domain. * * @see ::withLabel */ - public function append(DomainNameProvider|Host|string|Stringable|null $label): self; + public function append(DomainNameProvider|Host|Stringable|string|int|null $label): self; /** * Returns an instance with the specified label added at the specified key. @@ -82,12 +82,12 @@ public function append(DomainNameProvider|Host|string|Stringable|null $label): s * If $key is non-negative, the added label will be the label at $key position from the start. * If $key is negative, the added label will be the label at $key position from the end. * - * @param string|null|Stringable|Host|DomainNameProvider $label a domain label + * @param DomainNameProvider|Host|Stringable|string|int|null $label a domain label * * @throws CannotProcessHost If the key is out of bounds * @throws CannotProcessHost If the label is converted to the NULL value */ - public function withLabel(int $key, DomainNameProvider|Host|string|Stringable|null $label): self; + public function withLabel(int $key, DomainNameProvider|Host|Stringable|string|int|null $label): self; /** * Returns an instance with the label at the specified key removed. diff --git a/src/RegisteredName.php b/src/RegisteredName.php index 64602dd5..4350932e 100644 --- a/src/RegisteredName.php +++ b/src/RegisteredName.php @@ -37,7 +37,7 @@ final class RegisteredName implements DomainName ^(?:(?®_name)\.){0,126}(?®_name)\.?$/ix'; private const REGEXP_URI_DELIMITERS = '/[:\/?#\[\]@ ]/'; - /** @var array */ + /** @var list */ private readonly array $labels; private readonly ?string $domain; @@ -200,7 +200,7 @@ public function keys(string $label = null): array } /** - * @return array + * @return list */ public function labels(): array { @@ -238,7 +238,7 @@ public function toUnicode(): self /** * Filter a subdomain to update the domain part. */ - private function normalize(DomainNameProvider|Host|Stringable|string|null $domain): ?string + private function normalize(DomainNameProvider|Host|Stringable|string|int|null $domain): ?string { if ($domain instanceof DomainNameProvider) { $domain = $domain->domain(); @@ -264,7 +264,7 @@ private function normalize(DomainNameProvider|Host|Stringable|string|null $domai /** * @throws CannotProcessHost */ - public function prepend(DomainNameProvider|Host|string|Stringable|null $label): self + public function prepend(DomainNameProvider|Host|Stringable|string|int|null $label): self { return $this->withLabel(count($this->labels), $label); } @@ -272,12 +272,12 @@ public function prepend(DomainNameProvider|Host|string|Stringable|null $label): /** * @throws CannotProcessHost */ - public function append(DomainNameProvider|Host|string|Stringable|null $label): self + public function append(DomainNameProvider|Host|Stringable|string|int|null $label): self { return $this->withLabel(- count($this->labels) - 1, $label); } - public function withLabel(int $key, DomainNameProvider|Host|string|Stringable|null $label): self + public function withLabel(int $key, DomainNameProvider|Host|Stringable|string|int|null $label): self { $nbLabels = count($this->labels); if ($key < - $nbLabels - 1 || $key > $nbLabels) { diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 3849b6d2..1ead1f40 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -13,6 +13,9 @@ final class ResolvedDomain implements ResolvedDomainName private readonly DomainName $registrableDomain; private readonly DomainName $subDomain; + /** + * @throws CannotProcessHost + */ private function __construct( private readonly DomainName $domain, private readonly EffectiveTopLevelDomain $suffix @@ -24,28 +27,40 @@ private function __construct( ] = $this->parse(); } - public static function fromICANN(int|DomainNameProvider|Host|string|Stringable|null $domain, int $suffixLength): self + /** + * @throws CannotProcessHost + */ + public static function fromICANN(DomainNameProvider|Host|Stringable|string|int|null $domain, int $suffixLength): self { $domain = self::setDomainName($domain); return new self($domain, Suffix::fromICANN($domain->slice(0, $suffixLength))); } - public static function fromPrivate(int|DomainNameProvider|Host|string|Stringable|null $domain, int $suffixLength): self + /** + * @throws CannotProcessHost + */ + public static function fromPrivate(DomainNameProvider|Host|Stringable|string|int|null $domain, int $suffixLength): self { $domain = self::setDomainName($domain); return new self($domain, Suffix::fromPrivate($domain->slice(0, $suffixLength))); } - public static function fromIANA(int|DomainNameProvider|Host|string|Stringable|null $domain): self + /** + * @throws CannotProcessHost + */ + public static function fromIANA(DomainNameProvider|Host|Stringable|string|int|null $domain): self { $domain = self::setDomainName($domain); return new self($domain, Suffix::fromIANA($domain->label(0))); } - public static function fromUnknown(int|DomainNameProvider|Host|string|Stringable|null $domain, int $suffixLength = 0): self + /** + * @throws CannotProcessHost + */ + public static function fromUnknown(DomainNameProvider|Host|Stringable|string|int|null $domain, int $suffixLength = 0): self { $domain = self::setDomainName($domain); @@ -60,19 +75,19 @@ public static function __set_state(array $properties): self return new self($properties['domain'], $properties['suffix']); } - private static function setDomainName(int|DomainNameProvider|Host|string|Stringable|null $domain): DomainName + private static function setDomainName(DomainNameProvider|Host|Stringable|string|int|null $domain): DomainName { return match (true) { $domain instanceof DomainNameProvider => $domain->domain(), $domain instanceof DomainName => $domain, - default => Domain::fromIDNA2008($domain), + default => RegisteredName::fromIDNA2008($domain), }; } /** * Make sure the Value Object is always in a valid state. * - * @throws UnableToResolveDomain If the suffix can not be attached to the domain + * @throws UnableToResolveDomain|CannotProcessHost If the suffix can not be attached to the domain * * @return array{registrableDomain: DomainName, secondLevelDomain: DomainName, subDomain: DomainName} */ @@ -116,39 +131,39 @@ public function domain(): DomainName return $this->domain; } - public function jsonSerialize(): ?string + public function registrableDomain(): DomainName { - return $this->domain->jsonSerialize(); + return $this->registrableDomain; } - public function value(): ?string + public function secondLevelDomain(): DomainName { - return $this->domain->value(); + return $this->secondLevelDomain; } - public function toString(): string + public function subDomain(): DomainName { - return $this->domain->toString(); + return $this->subDomain; } - public function registrableDomain(): DomainName + public function suffix(): EffectiveTopLevelDomain { - return $this->registrableDomain; + return $this->suffix; } - public function secondLevelDomain(): DomainName + public function jsonSerialize(): ?string { - return $this->secondLevelDomain; + return $this->domain->jsonSerialize(); } - public function subDomain(): DomainName + public function value(): ?string { - return $this->subDomain; + return $this->domain->value(); } - public function suffix(): EffectiveTopLevelDomain + public function toString(): string { - return $this->suffix; + return $this->domain->toString(); } public function toAscii(): self @@ -161,7 +176,7 @@ public function toUnicode(): self return new self($this->domain->toUnicode(), $this->suffix->toUnicode()); } - public function withSuffix(int|DomainNameProvider|Host|string|Stringable|null $suffix): self + public function withSuffix(DomainNameProvider|Host|Stringable|string|int|null $suffix): self { if (!$suffix instanceof EffectiveTopLevelDomain) { $suffix = Suffix::fromUnknown($suffix); @@ -173,13 +188,13 @@ public function withSuffix(int|DomainNameProvider|Host|string|Stringable|null $s ); } - public function withSubDomain(int|DomainNameProvider|Host|string|Stringable|null $subDomain): self + public function withSubDomain(DomainNameProvider|Host|Stringable|string|int|null $subDomain): self { if (null === $this->suffix->value()) { throw UnableToResolveDomain::dueToMissingRegistrableDomain($this->domain); } - $subDomain = $this->domain->clear()->append(self::setDomainName($subDomain)); + $subDomain = RegisteredName::fromIDNA2008($subDomain); if ($this->subDomain->value() === $subDomain->value()) { return $this; } @@ -187,16 +202,13 @@ public function withSubDomain(int|DomainNameProvider|Host|string|Stringable|null return new self($this->registrableDomain->prepend($subDomain), $this->suffix); } - /** - * @param int|DomainNameProvider|Host|string|Stringable|null $label the second level domain - */ - public function withSecondLevelDomain($label): self + public function withSecondLevelDomain(DomainNameProvider|Host|Stringable|string|int|null $label): self { if (null === $this->suffix->value()) { throw UnableToResolveDomain::dueToMissingRegistrableDomain($this->domain); } - $label = self::setDomainName($label); + $label = RegisteredName::fromIDNA2008($label); if (1 !== count($label)) { throw UnableToResolveDomain::dueToInvalidSecondLevelDomain($label); } diff --git a/src/ResolvedDomainName.php b/src/ResolvedDomainName.php index 631d3473..33d606fb 100644 --- a/src/ResolvedDomainName.php +++ b/src/ResolvedDomainName.php @@ -22,15 +22,15 @@ public function secondLevelDomain(): DomainName; public function registrableDomain(): DomainName; /** - * Returns the sub domain component. + * Returns the subdomain component. */ public function subDomain(): DomainName; /** - * Returns an instance with the specified sub domain added. + * Returns an instance with the specified subdomain added. * * This method MUST retain the state of the current instance, and return - * an instance that contains the new sub domain + * an instance that contains the new subdomain * * @throws CannotProcessHost If the Sub domain can not be added to the current Domain */ diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 0fb4ca18..e6f15f26 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -553,4 +553,20 @@ public function testItReturnsTheInstanceWhenTheSLDIsEqual(): void self::assertEquals($domain->withSecondLevelDomain('ulb'), $domain); } + + public function testSubDomainCanHandleIpLikeValue(): void + { + self::assertSame( + '1.1.1.1.cloudflare-dns.com', + ResolvedDomain::fromICANN('cloudflare-dns.com', 1)->withSubDomain('1.1.1.1')->toString() + ); + } + + public function testSuffixCanHandleIpLikeValue(): void + { + self::assertSame( + 'cloudflare-dns.com.1.1.1.1', + ResolvedDomain::fromICANN('cloudflare-dns.com.1.1.1.1', 4)->toString() + ); + } } diff --git a/src/Rules.php b/src/Rules.php index 7c49cd96..6c26b491 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -4,18 +4,19 @@ namespace Pdp; +use SplFileObject; use SplTempFileObject; use Stringable; use function array_pop; use function explode; use function preg_match; -use function strpos; use function substr; final class Rules implements PublicSuffixList { private const ICANN_DOMAINS = 'ICANN_DOMAINS'; private const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; + private const UNKNOWN_DOMAINS = 'UNKNOWN_DOMAINS'; private const REGEX_PSL_SECTION = ',^// ===(?BEGIN|END) (?ICANN|PRIVATE) DOMAINS===,'; private const PSL_SECTION = [ @@ -42,7 +43,7 @@ private function __construct(private readonly array $rules) * @param null|resource $context * * @throws UnableToLoadResource If the rules can not be loaded from the path - * @throws UnableToLoadPublicSuffixList If the rules contains in the resource are invalid + * @throws UnableToLoadPublicSuffixList If the rules contain in the resource are invalid */ public static function fromPath(string $path, $context = null): self { @@ -52,7 +53,7 @@ public static function fromPath(string $path, $context = null): self /** * Returns a new instance from a string. * - * @throws UnableToLoadPublicSuffixList If the rules contains in the resource are invalid + * @throws UnableToLoadPublicSuffixList If the rules contain in the resource are invalid */ public static function fromString(Stringable|string $content): self { @@ -70,11 +71,11 @@ private static function parse(string $content): array $section = ''; $file = new SplTempFileObject(); $file->fwrite($content); - $file->setFlags(SplTempFileObject::DROP_NEW_LINE | SplTempFileObject::READ_AHEAD | SplTempFileObject::SKIP_EMPTY); + $file->setFlags(SplFileObject::DROP_NEW_LINE | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY); /** @var string $line */ foreach ($file as $line) { $section = self::getSection($section, $line); - if (in_array($section, [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS], true) && false === strpos($line, '//')) { + if (in_array($section, [self::PRIVATE_DOMAINS, self::ICANN_DOMAINS], true) && !str_contains($line, '//')) { $rules[$section] = self::addRule($rules[$section], explode('.', $line)); } } @@ -159,7 +160,7 @@ public function resolve($host): ResolvedDomainName return $this->getCookieDomain($host); } catch (UnableToResolveDomain $exception) { return ResolvedDomain::fromUnknown($exception->domain()); - } catch (SyntaxError $exception) { + } catch (SyntaxError) { return ResolvedDomain::fromUnknown(Domain::fromIDNA2008(null)); } } @@ -170,7 +171,7 @@ public function resolve($host): ResolvedDomainName public function getCookieDomain($host): ResolvedDomainName { $domain = $this->validateDomain($host); - [$suffixLength, $section] = $this->resolveSuffix($domain, ''); + [$suffixLength, $section] = $this->resolveSuffix($domain, self::UNKNOWN_DOMAINS); return match (true) { self::ICANN_DOMAINS === $section => ResolvedDomain::fromICANN($domain, $suffixLength), @@ -231,15 +232,17 @@ private function validateDomain(int|DomainNameProvider|Host|string|Stringable|nu } /** - * Returns the length and the section of thhe resolved effective top level domain. + * Returns the length and the section of the resolved effective top level domain. * - * @return array{0: int, 1:string} + * @param Rules::UNKNOWN_DOMAINS|Rules::ICANN_DOMAINS|Rules::PRIVATE_DOMAINS $section + * + * @return array{0: int, 1:Rules::UNKNOWN_DOMAINS|Rules::ICANN_DOMAINS|Rules::PRIVATE_DOMAINS} */ private function resolveSuffix(DomainName $domain, string $section): array { $icannSuffixLength = $this->getPublicSuffixLengthFromSection($domain, self::ICANN_DOMAINS); if (1 > $icannSuffixLength) { - return [1, '']; + return [1, self::UNKNOWN_DOMAINS]; } if (self::ICANN_DOMAINS === $section) { diff --git a/src/Suffix.php b/src/Suffix.php index 9f073b71..4e0b8d8c 100644 --- a/src/Suffix.php +++ b/src/Suffix.php @@ -13,6 +13,7 @@ final class Suffix implements EffectiveTopLevelDomain private const ICANN = 'ICANN'; private const PRIVATE = 'PRIVATE'; private const IANA = 'IANA'; + private const UNKNOWN = 'UNKNOWN'; private function __construct( private readonly DomainName $domain, @@ -21,14 +22,14 @@ private function __construct( } /** - * @param array{domain:DomainName, section:string} $properties + * @param array{domain:DomainName, section:Suffix::ICANN|Suffix::PRIVATE|Suffix::IANA|Suffix::UNKNOWN} $properties */ public static function __set_state(array $properties): self { return new self($properties['domain'], $properties['section']); } - public static function fromICANN(int|DomainNameProvider|Host|string|Stringable|null $domain): self + public static function fromICANN(DomainNameProvider|Host|Stringable|string|int|null $domain): self { $domain = self::setDomainName($domain); if (1 > count($domain)) { @@ -38,7 +39,7 @@ public static function fromICANN(int|DomainNameProvider|Host|string|Stringable|n return new self($domain, self::ICANN); } - public static function fromPrivate(int|DomainNameProvider|Host|string|Stringable|null $domain): self + public static function fromPrivate(DomainNameProvider|Host|Stringable|string|int|null $domain): self { $domain = self::setDomainName($domain); if (1 > count($domain)) { @@ -48,7 +49,7 @@ public static function fromPrivate(int|DomainNameProvider|Host|string|Stringable return new self($domain, self::PRIVATE); } - public static function fromIANA(int|DomainNameProvider|Host|string|Stringable|null $domain): self + public static function fromIANA(DomainNameProvider|Host|Stringable|string|int|null $domain): self { $domain = self::setDomainName($domain); if (1 !== count($domain)) { @@ -58,9 +59,9 @@ public static function fromIANA(int|DomainNameProvider|Host|string|Stringable|nu return new self($domain, self::IANA); } - public static function fromUnknown(int|DomainNameProvider|Host|string|Stringable|null $domain): self + public static function fromUnknown(DomainNameProvider|Host|Stringable|string|int|null $domain): self { - return new self(self::setDomainName($domain), ''); + return new self(self::setDomainName($domain), self::UNKNOWN); } private static function setDomainName(int|DomainNameProvider|Host|string|Stringable|null $domain): DomainName @@ -70,7 +71,7 @@ private static function setDomainName(int|DomainNameProvider|Host|string|Stringa } if (!$domain instanceof DomainName) { - $domain = Domain::fromIDNA2008($domain); + $domain = RegisteredName::fromIDNA2008($domain); } if ('' === $domain->label(0)) { @@ -82,7 +83,7 @@ private static function setDomainName(int|DomainNameProvider|Host|string|Stringa public function isKnown(): bool { - return '' !== $this->section; + return self::UNKNOWN !== $this->section; } public function isIANA(): bool diff --git a/src/SuffixTest.php b/src/SuffixTest.php index ca728c80..b3e6d56a 100644 --- a/src/SuffixTest.php +++ b/src/SuffixTest.php @@ -144,6 +144,7 @@ public static function countableProvider(): iterable 'null' => [null, 0, []], 'simple' => ['foo.bar.baz', 3, ['baz', 'bar', 'foo']], 'unicode' => ['www.食狮.公司.cn', 4, ['cn', '公司', '食狮', 'www']], + 'ipv4 like' => ['1.2.3.4', 4, ['1', '2', '3', '4']], ]; } } From df277d68c46f26b90c9e52dc4f25fe25b3e019d5 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sat, 25 Feb 2023 17:24:22 +0100 Subject: [PATCH 432/461] Prepare 6.3.0 release --- CHANGELOG.md | 52 ++++++++++++++++++++++++++++-------------- composer.json | 8 +++---- src/Domain.php | 17 +++++++++++++- src/ResolvedDomain.php | 14 ++++++++++++ src/Suffix.php | 18 +++++++++++++++ 5 files changed, 87 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 656cd744..965c3922 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,11 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will be documented in this file -## Next - TBD +## [6.3.0] - 2023-02-25 ### Added -- `RegisteredName` class to allow subdomain with IP-like labels +- `RegisteredName` class to allow domain with IP4-like labels ### Fixed @@ -22,7 +22,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - None -## 6.2.0 - 2022-10-30 +## [6.2.0] - 2022-10-30 ### Added @@ -40,7 +40,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - PHP7 and PHP8.0 support -## 6.1.2 - 2022-09-29 +## [6.1.2] - 2022-09-29 ### Added @@ -58,7 +58,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - None -## 6.1.1 - 2022-02-18 +## [6.1.1] - 2022-02-18 ### Added @@ -76,7 +76,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - None -## 6.1.0 - 2021-06-19 +## [6.1.0] - 2021-06-19 ### Added @@ -99,7 +99,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - None -## 6.0.0 - 2020-12-13 +## [6.0.0] - 2020-12-13 ### Added @@ -150,7 +150,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - `Pdp\TopLevelDomains::contains` without replacement - Internal Converter classes (implementation details are no longer exposed). -## 5.7.2 - 2020-10-25 +## [5.7.2] - 2020-10-25 ### Added @@ -168,7 +168,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - None -## 5.7.1 - 2020-08-24 +## [5.7.1] - 2020-08-24 ### Added @@ -186,7 +186,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - None -## 5.7.0 - 2020-08-02 +## [5.7.0] - 2020-08-02 ### Added @@ -210,7 +210,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - Support for PHP7.0 and PHP7.1 - The external data from IANA and mozilla is no longer part of the package and will be downloaded only on demand on composer update/install. -## 5.6.0 - 2019-12-29 +## [5.6.0] - 2019-12-29 ### Added @@ -229,7 +229,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - None -## 5.5.0 - 2019-04-14 +## [5.5.0] - 2019-04-14 ### Added @@ -252,7 +252,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - None -## 5.4.0 - 2018-11-22 +## [5.4.0] - 2018-11-22 ### Added @@ -279,7 +279,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - None -## 5.3.0 - 2018-05-22 +## [5.3.0] - 2018-05-22 ### Added @@ -314,7 +314,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - None -## 5.2.0 - 2018-02-23 +## [5.2.0] - 2018-02-23 ### Added @@ -340,7 +340,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - None -## 5.1.0 - 2017-12-18 +## [5.1.0] - 2017-12-18 ### Added @@ -359,7 +359,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - None -## 5.0.0 - 2017-12-13 +## [5.0.0] - 2017-12-13 ### Added @@ -389,3 +389,21 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - `Pdp\PublicSuffixManager` class replaced by the `Pdp\Manager` class - `Pdp\HttpAdapter\HttpAdapterInterface` interface replaced by the `Pdp\HttpClient` interface - `Pdp\HttpAdapter\CurlHttpAdapter` class replaced by the `Pdp\CurlHttpClient` class + +[6.3.0]: https://github.com/jeremykendall/php-domain-parser/compare/6.2.0...6.3.0 +[6.2.0]: https://github.com/jeremykendall/php-domain-parser/compare/6.1.2...6.2.0 +[6.1.2]: https://github.com/jeremykendall/php-domain-parser/compare/6.1.1...6.1.2 +[6.1.1]: https://github.com/jeremykendall/php-domain-parser/compare/6.1.0...6.1.1 +[6.1.0]: https://github.com/jeremykendall/php-domain-parser/compare/6.0.0...6.1.0 +[6.0.0]: https://github.com/jeremykendall/php-domain-parser/compare/5.7.2...6.0.0 +[6.0.0]: https://github.com/jeremykendall/php-domain-parser/compare/5.7.2...6.0.0 +[5.7.2]: https://github.com/jeremykendall/php-domain-parser/compare/5.7.1...5.7.2 +[5.7.1]: https://github.com/jeremykendall/php-domain-parser/compare/5.7.0...5.7.1 +[5.7.0]: https://github.com/jeremykendall/php-domain-parser/compare/5.6.0...5.7.0 +[5.6.0]: https://github.com/jeremykendall/php-domain-parser/compare/5.5.0...5.6.0 +[5.5.0]: https://github.com/jeremykendall/php-domain-parser/compare/5.4.0...5.5.0 +[5.4.0]: https://github.com/jeremykendall/php-domain-parser/compare/5.3.0...5.4.0 +[5.3.0]: https://github.com/jeremykendall/php-domain-parser/compare/5.2.0...5.3.0 +[5.2.0]: https://github.com/jeremykendall/php-domain-parser/compare/5.1.0...5.3.0 +[5.1.0]: https://github.com/jeremykendall/php-domain-parser/compare/5.0.0...5.1.0 +[5.0.0]: https://github.com/jeremykendall/php-domain-parser/compare/3.0.0...5.0.0 diff --git a/composer.json b/composer.json index 27de40dc..66aafde9 100644 --- a/composer.json +++ b/composer.json @@ -49,10 +49,10 @@ "friendsofphp/php-cs-fixer": "^v3.13.2", "guzzlehttp/guzzle": "^7.5", "guzzlehttp/psr7": "^1.6 || ^2.4.3", - "phpstan/phpstan": "^1.9.18", - "phpstan/phpstan-phpunit": "^1.3.4", - "phpstan/phpstan-strict-rules": "^1.4.5", - "phpunit/phpunit": "^10.0.11", + "phpstan/phpstan": "^1.10.3", + "phpstan/phpstan-phpunit": "^1.3.8", + "phpstan/phpstan-strict-rules": "^1.5.0", + "phpunit/phpunit": "^10.0.12", "psr/http-factory": "^1.0.1", "psr/simple-cache": "^1.0.1", "symfony/cache": "^v5.0.0 || ^v6.0.0" diff --git a/src/Domain.php b/src/Domain.php index 5fc535e6..358ebdcc 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -11,7 +11,10 @@ final class Domain implements DomainName { - private function __construct(private RegisteredName $registeredName) + /** + * @throws SyntaxError + */ + private function __construct(private readonly RegisteredName $registeredName) { if (false !== filter_var($this->registeredName->value(), FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { throw SyntaxError::dueToUnsupportedType($this->registeredName->toString()); @@ -26,11 +29,17 @@ public static function __set_state(array $properties): self return new self($properties['registeredName']); } + /** + * @throws CannotProcessHost + */ public static function fromIDNA2003(DomainNameProvider|Host|Stringable|string|int|null $domain): self { return new self(RegisteredName::fromIDNA2003($domain)); } + /** + * @throws CannotProcessHost + */ public static function fromIDNA2008(DomainNameProvider|Host|Stringable|string|int|null $domain): self { return new self(RegisteredName::fromIDNA2008($domain)); @@ -135,11 +144,17 @@ public function withoutLabel(int ...$keys): self return $this->newInstance($this->registeredName->withoutLabel(...$keys)); } + /** + * @throws CannotProcessHost + */ public function clear(): self { return $this->newInstance($this->registeredName->clear()); } + /** + * @throws CannotProcessHost + */ public function slice(int $offset, int $length = null): self { return $this->newInstance($this->registeredName->slice($offset, $length)); diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 1ead1f40..f4fb87c1 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -69,12 +69,17 @@ public static function fromUnknown(DomainNameProvider|Host|Stringable|string|int /** * @param array{domain:DomainName, suffix:EffectiveTopLevelDomain} $properties + * + * @throws CannotProcessHost */ public static function __set_state(array $properties): self { return new self($properties['domain'], $properties['suffix']); } + /** + * @throws CannotProcessHost + */ private static function setDomainName(DomainNameProvider|Host|Stringable|string|int|null $domain): DomainName { return match (true) { @@ -176,6 +181,9 @@ public function toUnicode(): self return new self($this->domain->toUnicode(), $this->suffix->toUnicode()); } + /** + * @throws CannotProcessHost + */ public function withSuffix(DomainNameProvider|Host|Stringable|string|int|null $suffix): self { if (!$suffix instanceof EffectiveTopLevelDomain) { @@ -188,6 +196,9 @@ public function withSuffix(DomainNameProvider|Host|Stringable|string|int|null $s ); } + /** + * @throws CannotProcessHost|UnableToResolveDomain + */ public function withSubDomain(DomainNameProvider|Host|Stringable|string|int|null $subDomain): self { if (null === $this->suffix->value()) { @@ -202,6 +213,9 @@ public function withSubDomain(DomainNameProvider|Host|Stringable|string|int|null return new self($this->registrableDomain->prepend($subDomain), $this->suffix); } + /** + * @throws CannotProcessHost|UnableToResolveDomain + */ public function withSecondLevelDomain(DomainNameProvider|Host|Stringable|string|int|null $label): self { if (null === $this->suffix->value()) { diff --git a/src/Suffix.php b/src/Suffix.php index 4e0b8d8c..da397280 100644 --- a/src/Suffix.php +++ b/src/Suffix.php @@ -29,6 +29,9 @@ public static function __set_state(array $properties): self return new self($properties['domain'], $properties['section']); } + /** + * @throws CannotProcessHost + */ public static function fromICANN(DomainNameProvider|Host|Stringable|string|int|null $domain): self { $domain = self::setDomainName($domain); @@ -39,6 +42,9 @@ public static function fromICANN(DomainNameProvider|Host|Stringable|string|int|n return new self($domain, self::ICANN); } + /** + * @throws CannotProcessHost + */ public static function fromPrivate(DomainNameProvider|Host|Stringable|string|int|null $domain): self { $domain = self::setDomainName($domain); @@ -49,6 +55,9 @@ public static function fromPrivate(DomainNameProvider|Host|Stringable|string|int return new self($domain, self::PRIVATE); } + /** + * @throws CannotProcessHost + */ public static function fromIANA(DomainNameProvider|Host|Stringable|string|int|null $domain): self { $domain = self::setDomainName($domain); @@ -59,11 +68,17 @@ public static function fromIANA(DomainNameProvider|Host|Stringable|string|int|nu return new self($domain, self::IANA); } + /** + * @throws CannotProcessHost + */ public static function fromUnknown(DomainNameProvider|Host|Stringable|string|int|null $domain): self { return new self(self::setDomainName($domain), self::UNKNOWN); } + /** + * @throws CannotProcessHost + */ private static function setDomainName(int|DomainNameProvider|Host|string|Stringable|null $domain): DomainName { if ($domain instanceof DomainNameProvider) { @@ -141,6 +156,9 @@ public function toUnicode(): self return new self($this->domain->toUnicode(), $this->section); } + /** + * @throws CannotProcessHost + */ public function normalize(DomainName $domain): self { $newDomain = $domain->clear()->append($this->toUnicode()); From b997751f94c1a0b63d9ca2c22eba1f7089f73600 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 29 Mar 2023 07:29:34 +0200 Subject: [PATCH 433/461] Improve requirements section --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8cd87562..f4ca82d4 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ You need: - **PHP >= 7.4** but the latest stable version of PHP is recommended - the `intl` extension +- a copy of the [Public Suffix List](https://publicsuffix.org/) data and/or a copy of the [IANA Top Level Domain List](https://www.iana.org/domains/root/files). Please refer to the [Managing external data source section](#managing-the-package-external-resources) for more information when using this package in production. ## Usage From 6e287ab74124395071114db136f04f2c7c636e2c Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 29 Mar 2023 07:37:23 +0200 Subject: [PATCH 434/461] Improve documentation warning on resource usage --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index f4ca82d4..af9ff723 100644 --- a/README.md +++ b/README.md @@ -160,18 +160,18 @@ To instantiate each domain resolver you can use the following named constructor: **WARNING:** -**You should never resolve domain name this way in production, without, at +**You SHOULD never resolve domain name this way in production, without, at least, a caching mechanism to reduce PSL downloads.** **Using the Public Suffix List to determine what is a valid domain name and what -isn't is dangerous, particularly in these days when new gTLDs are arriving at a -rapid pace.** +isn't is dangerous, and MAY lead to errors because of new gTLDs being registered +on a regular basis.** -**If you are looking to know the validity of a Top Level Domain, the -IANA Top Level Domain List is the proper source for this information or -alternatively consider using directly the DNS.** +**If you are looking to know the validity of a Top Level Domain, you MUST use +the IANA Top Level Domain List as the proper source for this information or +alternatively the DNS.** -**If you must use this library for any of the above purposes, please consider +**If you MUST use this library for any of the above purposes, you SHOULD consider integrating an updating mechanism into your software.** **For more information go to the [Managing external data source section](#managing-the-package-external-resources)** From 4b148d7ee68aea5de83d5b97421be2d22d1c7a21 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 29 Mar 2023 07:38:54 +0200 Subject: [PATCH 435/461] Improve documentation warning on resource usage --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index af9ff723..53556708 100644 --- a/README.md +++ b/README.md @@ -161,7 +161,7 @@ To instantiate each domain resolver you can use the following named constructor: **WARNING:** **You SHOULD never resolve domain name this way in production, without, at -least, a caching mechanism to reduce PSL downloads.** +least, a caching mechanism to reduce external resource downloads.** **Using the Public Suffix List to determine what is a valid domain name and what isn't is dangerous, and MAY lead to errors because of new gTLDs being registered From 43bddffb6b0c8a98f75c356479ce464136cb97bb Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 29 Mar 2023 07:42:42 +0200 Subject: [PATCH 436/461] Remove psalm from the documentation --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 53556708..194c660d 100644 --- a/README.md +++ b/README.md @@ -561,7 +561,6 @@ Testing - a [PHPUnit](https://phpunit.de) test suite - a code analysis compliance test suite using [PHPStan](https://phpstan.org). -- a code analysis compliance test suite using [Psalm](https://psalm.dev). - a coding style compliance test suite using [PHP CS Fixer](https://cs.symfony.com). To run the tests, run the following command from the project folder. From 253c7544faf66307882a2a7168b23488a4fcb50a Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Tue, 17 Oct 2023 22:25:11 +0200 Subject: [PATCH 437/461] Update test suite to supports PHP8.3 (#354) Update package to work in PHP8.3 --- .github/workflows/build.yaml | 4 +-- .php-cs-fixer.php | 4 +-- composer.json | 20 ++++++------- phpunit.xml.dist | 26 ++++++----------- src/Storage/PsrStorageFactoryTest.php | 6 ++-- .../PublicSuffixListPsr16CacheTest.php | 20 ++++++------- src/Storage/TimeToLive.php | 28 ++++++++++++++----- .../TopLevelDomainListPsr16CacheTest.php | 20 ++++++------- 8 files changed, 67 insertions(+), 61 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index c5e55a24..9444048a 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-20.04 strategy: matrix: - php: ['8.1', '8.2'] + php: ['8.1', '8.2', '8.3'] stability: [prefer-lowest, prefer-stable] steps: - name: Checkout code @@ -52,4 +52,4 @@ jobs: - name: Run Coding style rules run: composer phpcs:fix - if: ${{ matrix.php == '8.1' && matrix.stability == 'prefer-stable'}} + if: ${{ matrix.php == '8.2' && matrix.stability == 'prefer-stable'}} diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php index e771f589..0b41a311 100644 --- a/.php-cs-fixer.php +++ b/.php-cs-fixer.php @@ -17,7 +17,7 @@ 'import_functions' => true, ], 'list_syntax' => ['syntax' => 'short'], - 'new_with_braces' => true, + 'new_with_parentheses' => true, 'no_blank_lines_after_phpdoc' => true, 'no_empty_phpdoc' => true, 'no_empty_comment' => true, @@ -39,7 +39,7 @@ 'phpdoc_summary' => true, 'psr_autoloading' => true, 'return_type_declaration' => ['space_before' => 'none'], - 'single_blank_line_before_namespace' => true, + 'blank_lines_before_namespace' => true, 'single_quote' => true, 'space_after_semicolon' => true, 'ternary_operator_spaces' => true, diff --git a/composer.json b/composer.json index 66aafde9..25138d2a 100644 --- a/composer.json +++ b/composer.json @@ -46,16 +46,16 @@ "ext-json": "*" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^v3.13.2", - "guzzlehttp/guzzle": "^7.5", - "guzzlehttp/psr7": "^1.6 || ^2.4.3", - "phpstan/phpstan": "^1.10.3", - "phpstan/phpstan-phpunit": "^1.3.8", - "phpstan/phpstan-strict-rules": "^1.5.0", - "phpunit/phpunit": "^10.0.12", - "psr/http-factory": "^1.0.1", + "friendsofphp/php-cs-fixer": "^v3.35.1", + "guzzlehttp/guzzle": "^7.8", + "guzzlehttp/psr7": "^1.6 || ^2.6.1", + "phpstan/phpstan": "^1.10.39", + "phpstan/phpstan-phpunit": "^1.3.15", + "phpstan/phpstan-strict-rules": "^1.5.1", + "phpunit/phpunit": "^10.4.1", + "psr/http-factory": "^1.0.2", "psr/simple-cache": "^1.0.1", - "symfony/cache": "^v5.0.0 || ^v6.0.0" + "symfony/cache": "^v5.0.0 || ^v6.3.5" }, "suggest": { "psr/http-client-implementation": "To use the storage functionnality which depends on PSR-18", @@ -71,7 +71,7 @@ "scripts": { "phpcs": "PHP_CS_FIXER_IGNORE_ENV=1 php-cs-fixer fix -vvv --diff --dry-run --allow-risky=yes --ansi", "phpcs:fix": "php-cs-fixer fix -vvv --allow-risky=yes --ansi", - "phpstan": "phpstan analyse -l max -c phpstan.neon src --xdebug --memory-limit=256M --ansi", + "phpstan": "phpstan analyse -l max -c phpstan.neon src --memory-limit=256M --ansi", "phpunit": "XDEBUG_MODE=coverage phpunit --coverage-text", "test": [ "@phpunit", diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 4a02ebfc..2403d4e9 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,22 +1,6 @@ - + - - src - - - src - @@ -31,4 +15,12 @@ + + + src + + + src + + diff --git a/src/Storage/PsrStorageFactoryTest.php b/src/Storage/PsrStorageFactoryTest.php index b423fb4a..efa782f9 100644 --- a/src/Storage/PsrStorageFactoryTest.php +++ b/src/Storage/PsrStorageFactoryTest.php @@ -15,9 +15,9 @@ final class PsrStorageFactoryTest extends TestCase public function setUp(): void { - $cache = $this->createStub(CacheInterface::class); - $requestFactory = $this->createStub(RequestFactoryInterface::class); - $client = $this->createStub(ClientInterface::class); + $cache = self::createStub(CacheInterface::class); + $requestFactory = self::createStub(RequestFactoryInterface::class); + $client = self::createStub(ClientInterface::class); $this->factory = new PsrStorageFactory($cache, $client, $requestFactory); } diff --git a/src/Storage/PublicSuffixListPsr16CacheTest.php b/src/Storage/PublicSuffixListPsr16CacheTest.php index c9c8989c..18b0cf31 100644 --- a/src/Storage/PublicSuffixListPsr16CacheTest.php +++ b/src/Storage/PublicSuffixListPsr16CacheTest.php @@ -18,7 +18,7 @@ final class PublicSuffixListPsr16CacheTest extends TestCase { public function testItReturnsNullIfTheCacheDoesNotExists(): void { - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('get')->willReturn(null); $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', '1 DAY'); @@ -29,7 +29,7 @@ public function testItReturnsNullIfTheCacheDoesNotExists(): void public function testItReturnsAnInstanceIfTheCorrectCacheExists(): void { $rules = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('get')->willReturn($rules); $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', 86400); @@ -39,7 +39,7 @@ public function testItReturnsAnInstanceIfTheCorrectCacheExists(): void public function testItReturnsNullIfTheCacheContentContainsInvalidJsonData(): void { - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('get')->willReturn('foobar'); $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', 86400); @@ -48,7 +48,7 @@ public function testItReturnsNullIfTheCacheContentContainsInvalidJsonData(): voi public function testItReturnsNullIfTheCacheContentCannotBeConvertedToTheCorrectInstance(): void { - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('get')->willReturn('{"foo":"bar"}'); $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new DateTimeImmutable('+1 DAY')); @@ -58,7 +58,7 @@ public function testItReturnsNullIfTheCacheContentCannotBeConvertedToTheCorrectI public function testItCanStoreAPublicSuffixListInstance(): void { - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('set')->willReturn(true); $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); @@ -69,7 +69,7 @@ public function testItCanStoreAPublicSuffixListInstance(): void public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void { - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('set')->willReturn(false); $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); @@ -82,7 +82,7 @@ public function testItReturnsFalseIfItCantCacheAPublicSuffixListInstance(): void { $exception = new class('Something went wrong.', 0) extends RuntimeException implements CacheException { }; - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('set')->will(self::throwException($exception)); $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); @@ -95,7 +95,7 @@ public function testItWillThrowIfItCantCacheAPublicSuffixListInstance(): void { $exception = new class('Something went wrong.', 0) extends RuntimeException { }; - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('set')->will(self::throwException($exception)); $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); @@ -114,7 +114,7 @@ public function testItCanDeleteTheCachedDatabase(): void { $uri = 'http://www.example.com'; - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('delete')->willReturn(true); $instance = new PublicSuffixListPsr16Cache($cache, 'pdp_', new DateInterval('P1D')); @@ -125,7 +125,7 @@ public function testItWillThrowIfTheTTLIsNotParsable(): void { $this->expectException(InvalidArgumentException::class); - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); new PublicSuffixListPsr16Cache($cache, 'pdp_', 'foobar'); } } diff --git a/src/Storage/TimeToLive.php b/src/Storage/TimeToLive.php index 5182f09d..3bbe04a7 100644 --- a/src/Storage/TimeToLive.php +++ b/src/Storage/TimeToLive.php @@ -9,6 +9,7 @@ use DateTimeInterface; use InvalidArgumentException; use Stringable; +use Throwable; use function filter_var; use const FILTER_VALIDATE_INT; @@ -19,13 +20,26 @@ final class TimeToLive { public static function fromDurationString(string $duration): DateInterval { - set_error_handler(fn () => true); - $interval = DateInterval::createFromDateString($duration); - restore_error_handler(); - if (!$interval instanceof DateInterval) { - throw new InvalidArgumentException( - 'The ttl value "'.$duration.'" can not be parsable by `DateInterval::createFromDateString`.' - ); + try { + set_error_handler(fn () => true); + $interval = DateInterval::createFromDateString($duration); + restore_error_handler(); + if (!$interval instanceof DateInterval) { + throw new InvalidArgumentException( + 'The ttl value "'.$duration.'" can not be parsable by `DateInterval::createFromDateString`.' + ); + } + + } catch (Throwable $exception) { + if (!$exception instanceof InvalidArgumentException) { + throw new InvalidArgumentException( + 'The ttl value "'.$duration.'" can not be parsable by `DateInterval::createFromDateString`.', + 0, + $exception + ); + } + + throw $exception; } return $interval; diff --git a/src/Storage/TopLevelDomainListPsr16CacheTest.php b/src/Storage/TopLevelDomainListPsr16CacheTest.php index 59a0a76b..9d4275bb 100644 --- a/src/Storage/TopLevelDomainListPsr16CacheTest.php +++ b/src/Storage/TopLevelDomainListPsr16CacheTest.php @@ -18,7 +18,7 @@ final class TopLevelDomainListPsr16CacheTest extends TestCase { public function testItReturnsNullIfTheCacheDoesNotExists(): void { - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('get')->willReturn(null); $instance = new TopLevelDomainListPsr16Cache($cache, 'pdp_', '1 DAY'); @@ -29,7 +29,7 @@ public function testItReturnsNullIfTheCacheDoesNotExists(): void public function testItReturnsAnInstanceIfTheCorrectCacheExists(): void { $topLevelDomainList = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('get')->willReturn($topLevelDomainList); $instance = new TopLevelDomainListPsr16Cache($cache, 'pdp_', 86400); @@ -39,7 +39,7 @@ public function testItReturnsAnInstanceIfTheCorrectCacheExists(): void public function testItReturnsNullIfTheCacheContentContainsInvalidJsonData(): void { - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('get')->willReturn('foobar'); $instance = new TopLevelDomainListPsr16Cache($cache, 'pdp_', new DateInterval('P1D')); @@ -49,7 +49,7 @@ public function testItReturnsNullIfTheCacheContentContainsInvalidJsonData(): voi public function testItReturnsNullIfTheCacheContentCannotBeConvertedToTheCorrectInstance(): void { - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('get')->willReturn('{"foo":"bar"}'); $instance = new TopLevelDomainListPsr16Cache($cache, 'pdp_', new DateTimeImmutable('+1 DAY')); @@ -59,7 +59,7 @@ public function testItReturnsNullIfTheCacheContentCannotBeConvertedToTheCorrectI public function testItCanStoreAPublicSuffixListInstance(): void { - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('set')->willReturn(true); $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); @@ -70,7 +70,7 @@ public function testItCanStoreAPublicSuffixListInstance(): void public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void { - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('set')->willReturn(false); $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); @@ -83,7 +83,7 @@ public function testItReturnsFalseIfItCantCacheATopLevelDomainListInstance(): vo { $exception = new class('Something went wrong.', 0) extends RuntimeException implements CacheException { }; - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('set')->will(self::throwException($exception)); $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); @@ -96,7 +96,7 @@ public function testItThrowsIfItCantCacheATopLevelDomainListInstance(): void { $exception = new class('Something went wrong.', 0) extends RuntimeException { }; - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('set')->will(self::throwException($exception)); $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); @@ -111,7 +111,7 @@ public function testItCanDeleteTheCachedDatabase(): void { $uri = 'http://www.example.com'; - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('delete')->willReturn(true); $instance = new TopLevelDomainListPsr16Cache($cache, 'pdp_', new DateInterval('P1D')); @@ -122,7 +122,7 @@ public function testItWillThrowIfTheTTLIsNotParsable(): void { $this->expectException(InvalidArgumentException::class); - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); new TopLevelDomainListPsr16Cache($cache, 'pdp_', 'foobar'); } } From 92709ef1e58ef57e24571a1129b112f58b596976 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 16 Nov 2023 20:27:37 +0100 Subject: [PATCH 438/461] Improve documentation --- README.md | 64 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 194c660d..68dc1b3f 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,8 @@ You need: ## Usage -**If you are upgrading from version 5 please check the [upgrading guide](UPGRADING.md) for known issues.** +> [!WARNING] +> If you are upgrading from version 5 please check the [upgrading guide](UPGRADING.md) for known issues. ### Resolving Domains @@ -116,9 +117,10 @@ These methods resolve the domain against their respective data source using the same rules as the `resolve` method but will instead throw an exception if no valid effective TLD is found or if the submitted domain is invalid. -**All these methods expect as their sole argument a `Pdp\Host` implementing +> [!CAUTION] +> All these methods expect as their sole argument a `Pdp\Host` implementing object, but other types (ie: `string`, `null` and stringable objects) are -supported with predefined conditions as explained in the remaining document.** +supported with predefined conditions as explained in the remaining document. ~~~php [!WARNING] +> You SHOULD never resolve domain name this way in production, without, at +least, a caching mechanism to reduce external resource downloads. +> Using the Public Suffix List to determine what is a valid domain name and what isn't is dangerous, and MAY lead to errors because of new gTLDs being registered -on a regular basis.** - -**If you are looking to know the validity of a Top Level Domain, you MUST use +on a regular basis. +> If you are looking to know the validity of a Top Level Domain, you MUST use the IANA Top Level Domain List as the proper source for this information or -alternatively the DNS.** - -**If you MUST use this library for any of the above purposes, you SHOULD consider -integrating an updating mechanism into your software.** - -**For more information go to the [Managing external data source section](#managing-the-package-external-resources)** +alternatively the DNS. +> If you MUST use this library for any of the above purposes, you SHOULD consider +integrating an updating mechanism into your software. +> For more information go to the [Managing external data source section](#managing-the-package-external-resources)** ### Resolved domain information. @@ -221,10 +218,11 @@ echo $altResult->domain()->toString(); //display 'foo.bar.test.example'; $altResult->suffix()->isKnown(); //return false; ~~~ -**TIP: Always favor submitting a `Pdp\Suffix` object rather that any other +> [!TIP] +> Always favor submitting a `Pdp\Suffix` object rather that any other supported type to avoid unexpected results. By default, if the input is not a `Pdp\Suffix` instance, the resulting public suffix will be labelled as -being unknown. For more information go to the [Public Suffix section](#public-suffix)** +being unknown. For more information go to the [Public Suffix section](#public-suffix) ### Domain Suffix @@ -340,7 +338,8 @@ $newDomain->clear()->labels(); //return [] echo $domain->slice(2)->toString(); //display 'www' ~~~ -**WARNING: Because of its definition, a domain name can be `null` or a string.** +> [!WARNING] +> Because of its definition, a domain name can be `null` or a string. To distinguish this possibility the object exposes two (2) formatting methods `Domain::value` which can be `null` or a `string` and `Domain::toString` which @@ -397,8 +396,9 @@ is done via two (2) named constructors: At any given moment the `Pdp\Domain` instance can tell you whether it is in `ASCII` mode or not. -**Once instantiated there's no way to tell which algorithm is used to convert -the object from ascii to unicode and vice-versa** +> [!WARNING] +> Once instantiated there's no way to tell which algorithm is used to convert +the object from ascii to unicode and vice-versa ~~~php use Pdp\Domain; @@ -420,10 +420,11 @@ echo $asciiDomain->value(); // display 'fass.de' $asciiDomain->isAscii(); // returns true ~~~ -**TIP: Always favor submitting a `Pdp\Domain` object for resolution rather that a +> [!TIP] +> Always favor submitting a `Pdp\Domain` object for resolution rather that a string or an object that can be cast to a string to avoid unexpected format conversion errors/results. By default, and with lack of information conversion -is done using IDNA 2008 rules.** +is done using IDNA 2008 rules. ### Managing the package external resources @@ -470,7 +471,8 @@ on packagist. #### Refreshing the resource using the provided factories -**THIS IS THE RECOMMENDED WAY OF USING THE LIBRARY** +> [!NOTE] +> THIS IS THE RECOMMENDED WAY OF USING THE LIBRARY For the purpose of this example we will use our PSR powered solution with: @@ -527,12 +529,14 @@ $publicSuffixList = $pslStorage->get(PsrStorageFactory::PUBLIC_SUFFIX_LIST_URI); $topLevelDomains = $rzdStorage->get(PsrStorageFactory::TOP_LEVEL_DOMAIN_LIST_URI); ~~~ -**Be sure to adapt the following code to your own application. +> [!NOTE] +> Be sure to adapt the following code to your own application. The following code is an example given without warranty of it working -out of the box.** +out of the box. -**You should use your dependency injection container to avoid repeating this -code in your application.** +> [!WARNING] +> You should use your dependency injection container to avoid repeating this +code in your application. ### Automatic Updates From bf4783dfff8961eb9373bcf73d845ab0fee1dc54 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Fri, 22 Mar 2024 11:46:15 +0100 Subject: [PATCH 439/461] Handles PHP8.4 nullable type deprecations --- .php-cs-fixer.php | 1 + composer.json | 16 ++++++++-------- src/Domain.php | 4 ++-- src/DomainName.php | 4 ++-- src/RegisteredName.php | 4 ++-- src/ResolvedDomainTest.php | 2 +- src/UnableToLoadTopLevelDomainList.php | 2 +- 7 files changed, 17 insertions(+), 16 deletions(-) diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php index 0b41a311..99023a23 100644 --- a/.php-cs-fixer.php +++ b/.php-cs-fixer.php @@ -29,6 +29,7 @@ ], 'no_trailing_comma_in_singleline' => true, 'no_unused_imports' => true, + 'nullable_type_declaration_for_default_null_value' => true, 'ordered_imports' => ['imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha'], 'phpdoc_add_missing_param_annotation' => ['only_untyped' => true], 'phpdoc_align' => true, diff --git a/composer.json b/composer.json index 25138d2a..c2be172e 100644 --- a/composer.json +++ b/composer.json @@ -46,16 +46,16 @@ "ext-json": "*" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^v3.35.1", - "guzzlehttp/guzzle": "^7.8", - "guzzlehttp/psr7": "^1.6 || ^2.6.1", - "phpstan/phpstan": "^1.10.39", - "phpstan/phpstan-phpunit": "^1.3.15", - "phpstan/phpstan-strict-rules": "^1.5.1", - "phpunit/phpunit": "^10.4.1", + "friendsofphp/php-cs-fixer": "^3.52.1", + "guzzlehttp/guzzle": "^7.8.1", + "guzzlehttp/psr7": "^1.6 || ^2.6.2", + "phpstan/phpstan": "^1.10.64", + "phpstan/phpstan-phpunit": "^1.3.16", + "phpstan/phpstan-strict-rules": "^1.5.2", + "phpunit/phpunit": "^10.5.15", "psr/http-factory": "^1.0.2", "psr/simple-cache": "^1.0.1", - "symfony/cache": "^v5.0.0 || ^v6.3.5" + "symfony/cache": "^v5.0.0 || ^6.4.4" }, "suggest": { "psr/http-client-implementation": "To use the storage functionnality which depends on PSR-18", diff --git a/src/Domain.php b/src/Domain.php index 358ebdcc..1d0bbf74 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -86,7 +86,7 @@ public function label(int $key): ?string /** * @return list */ - public function keys(string $label = null): array + public function keys(?string $label = null): array { return $this->registeredName->keys($label); } @@ -155,7 +155,7 @@ public function clear(): self /** * @throws CannotProcessHost */ - public function slice(int $offset, int $length = null): self + public function slice(int $offset, ?int $length = null): self { return $this->newInstance($this->registeredName->slice($offset, $length)); } diff --git a/src/DomainName.php b/src/DomainName.php index c4a4aaf9..fd6e3b91 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -49,7 +49,7 @@ public function labels(): array; * * @return list */ - public function keys(string $label = null): array; + public function keys(?string $label = null): array; /** * The external iterator iterates over the DomainInterface labels @@ -119,5 +119,5 @@ public function clear(): self; * * If $length is null it returns all elements from $offset to the end of the Domain. */ - public function slice(int $offset, int $length = null): self; + public function slice(int $offset, ?int $length = null): self; } diff --git a/src/RegisteredName.php b/src/RegisteredName.php index 4350932e..cd12eea9 100644 --- a/src/RegisteredName.php +++ b/src/RegisteredName.php @@ -190,7 +190,7 @@ public function label(int $key): ?string /** * @return list */ - public function keys(string $label = null): array + public function keys(?string $label = null): array { if (null === $label) { return array_keys($this->labels); @@ -345,7 +345,7 @@ public function clear(): self /** * @throws CannotProcessHost */ - public function slice(int $offset, int $length = null): self + public function slice(int $offset, ?int $length = null): self { $nbLabels = count($this->labels); if ($offset < - $nbLabels || $offset > $nbLabels) { diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index e6f15f26..e0b14660 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -236,7 +236,7 @@ public static function toAsciiProvider(): iterable } #[DataProvider('withSubDomainWorksProvider')] - public function testItCanHaveItsSubDomainChanged(ResolvedDomain $domain, DomainName|string|null $subdomain, string $expected = null): void + public function testItCanHaveItsSubDomainChanged(ResolvedDomain $domain, DomainName|string|null $subdomain, ?string $expected = null): void { $result = $domain->withSubDomain($subdomain); diff --git a/src/UnableToLoadTopLevelDomainList.php b/src/UnableToLoadTopLevelDomainList.php index 94ed824a..d2f4e937 100644 --- a/src/UnableToLoadTopLevelDomainList.php +++ b/src/UnableToLoadTopLevelDomainList.php @@ -9,7 +9,7 @@ final class UnableToLoadTopLevelDomainList extends InvalidArgumentException implements CannotProcessHost { - public static function dueToInvalidTopLevelDomain(string $content, Throwable $exception = null): self + public static function dueToInvalidTopLevelDomain(string $content, ?Throwable $exception = null): self { return new self('Invalid Top Level Domain: '.$content, 0, $exception); } From c4c8528f4fe71a86b5305aabfdc57cf5c49adbd2 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sat, 13 Apr 2024 12:39:44 +0200 Subject: [PATCH 440/461] Add support for PHPUnit 11 --- composer.json | 10 ++--- phpstan.neon | 1 + src/DomainTest.php | 4 +- src/ResolvedDomainTest.php | 8 ++-- .../PublicSuffixListPsr16CacheTest.php | 35 ++++++++++++++++++ src/Storage/TimeToLiveTest.php | 4 +- .../TopLevelDomainListPsr16CacheTest.php | 37 +++++++++++++++++++ 7 files changed, 85 insertions(+), 14 deletions(-) diff --git a/composer.json b/composer.json index c2be172e..65f30e63 100644 --- a/composer.json +++ b/composer.json @@ -46,16 +46,16 @@ "ext-json": "*" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.52.1", + "friendsofphp/php-cs-fixer": "^3.53.0", "guzzlehttp/guzzle": "^7.8.1", "guzzlehttp/psr7": "^1.6 || ^2.6.2", - "phpstan/phpstan": "^1.10.64", + "phpstan/phpstan": "^1.10.66", "phpstan/phpstan-phpunit": "^1.3.16", - "phpstan/phpstan-strict-rules": "^1.5.2", - "phpunit/phpunit": "^10.5.15", + "phpstan/phpstan-strict-rules": "^1.5.3", + "phpunit/phpunit": "^10.5.15 || ^11.1.1", "psr/http-factory": "^1.0.2", "psr/simple-cache": "^1.0.1", - "symfony/cache": "^v5.0.0 || ^6.4.4" + "symfony/cache": "^v5.0.0 || ^6.4.6" }, "suggest": { "psr/http-client-implementation": "To use the storage functionnality which depends on PSR-18", diff --git a/phpstan.neon b/phpstan.neon index caa678b5..0332b88a 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -12,4 +12,5 @@ parameters: path: src/Rules.php - message: '#Variable \$line on left side of \?\? always exists and is not nullable.#' path: src/Rules.php + - '#^Parameter \#1 \$callback of function set_error_handler expects#' reportUnmatchedIgnoredErrors: true diff --git a/src/DomainTest.php b/src/DomainTest.php index 3ea53151..e3ea7c0f 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -168,14 +168,14 @@ public static function toUnicodeProvider(): iterable public function testToAscii( ?string $domain, ?string $expectedDomain, - ?string $expectedAsciiDomain + ?string $expectedIDNDomain ): void { $domain = Domain::fromIDNA2008($domain); self::assertSame($expectedDomain, $domain->value()); /** @var Domain $domainIDN */ $domainIDN = $domain->toAscii(); - self::assertSame($expectedAsciiDomain, $domainIDN->value()); + self::assertSame($expectedIDNDomain, $domainIDN->value()); } /** diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index e0b14660..12c777b1 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -173,8 +173,8 @@ public function testItCanBeConvertedToAscii( ?string $publicSuffix, ?string $expectedDomain, ?string $expectedSuffix, - ?string $expectedAsciiDomain, - ?string $expectedAsciiSuffix + ?string $expectedIDNDomain, + ?string $expectedIDNSuffix ): void { $domain = ResolvedDomain::fromUnknown(Domain::fromIDNA2003($domain), count(Domain::fromIDNA2003($publicSuffix))); self::assertSame($expectedDomain, $domain->value()); @@ -182,8 +182,8 @@ public function testItCanBeConvertedToAscii( /** @var ResolvedDomain $domainIDN */ $domainIDN = $domain->toAscii(); - self::assertSame($expectedAsciiDomain, $domainIDN->value()); - self::assertSame($expectedAsciiSuffix, $domainIDN->suffix()->value()); + self::assertSame($expectedIDNDomain, $domainIDN->value()); + self::assertSame($expectedIDNSuffix, $domainIDN->suffix()->value()); } /** diff --git a/src/Storage/PublicSuffixListPsr16CacheTest.php b/src/Storage/PublicSuffixListPsr16CacheTest.php index 18b0cf31..f41cfb5c 100644 --- a/src/Storage/PublicSuffixListPsr16CacheTest.php +++ b/src/Storage/PublicSuffixListPsr16CacheTest.php @@ -9,6 +9,7 @@ use InvalidArgumentException; use Pdp\Rules; use PHPUnit\Framework\TestCase; +use PHPUnit\Runner\ErrorHandler; use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; use RuntimeException; @@ -128,4 +129,38 @@ public function testItWillThrowIfTheTTLIsNotParsable(): void $cache = self::createStub(CacheInterface::class); new PublicSuffixListPsr16Cache($cache, 'pdp_', 'foobar'); } + + protected function restoreExceptionHandler(): void + { + while (true) { + $previousHandler = set_exception_handler(static fn () => null); + restore_exception_handler(); + if (null === $previousHandler) { + break; + } + + restore_exception_handler(); + } + } + + protected function restoreErrorHandler(): void + { + while (true) { + $previousHandler = set_error_handler(static fn (int $errno, string $errstr, ?string $errfile = null, ?int $errline = null) => null); + restore_error_handler(); + $isPhpUnitErrorHandler = ($previousHandler instanceof ErrorHandler); + if (null === $previousHandler || $isPhpUnitErrorHandler) { + break; + } + restore_error_handler(); + } + } + + protected function tearDown(): void + { + parent::tearDown(); + + $this->restoreErrorHandler(); + $this->restoreExceptionHandler(); + } } diff --git a/src/Storage/TimeToLiveTest.php b/src/Storage/TimeToLiveTest.php index 1604d3df..9ca00b75 100644 --- a/src/Storage/TimeToLiveTest.php +++ b/src/Storage/TimeToLiveTest.php @@ -22,9 +22,7 @@ public function testItDoesNotReturnTheAbsoluteInterval(): void self::assertSame(0, TimeToLive::until($tomorrow)->invert); } - /** - * @dataProvider validDurationString - */ + #[DataProvider('validDurationString')] public function testItCanBeInstantiatedFromDurationInput(string $input, DateInterval $expected): void { $now = new DateTimeImmutable(); diff --git a/src/Storage/TopLevelDomainListPsr16CacheTest.php b/src/Storage/TopLevelDomainListPsr16CacheTest.php index 9d4275bb..2eb8cb44 100644 --- a/src/Storage/TopLevelDomainListPsr16CacheTest.php +++ b/src/Storage/TopLevelDomainListPsr16CacheTest.php @@ -9,6 +9,7 @@ use InvalidArgumentException; use Pdp\TopLevelDomains; use PHPUnit\Framework\TestCase; +use PHPUnit\Runner\ErrorHandler; use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; use RuntimeException; @@ -125,4 +126,40 @@ public function testItWillThrowIfTheTTLIsNotParsable(): void $cache = self::createStub(CacheInterface::class); new TopLevelDomainListPsr16Cache($cache, 'pdp_', 'foobar'); } + + + + protected function restoreExceptionHandler(): void + { + while (true) { + $previousHandler = set_exception_handler(static fn () => null); + restore_exception_handler(); + if (null === $previousHandler) { + break; + } + + restore_exception_handler(); + } + } + + protected function restoreErrorHandler(): void + { + while (true) { + $previousHandler = set_error_handler(static fn (int $errno, string $errstr, ?string $errfile = null, ?int $errline = null) => null); + restore_error_handler(); + $isPhpUnitErrorHandler = ($previousHandler instanceof ErrorHandler); + if (null === $previousHandler || $isPhpUnitErrorHandler) { + break; + } + restore_error_handler(); + } + } + + protected function tearDown(): void + { + parent::tearDown(); + + $this->restoreErrorHandler(); + $this->restoreExceptionHandler(); + } } From 4ae7743be46d657a4f7d27c5a358c2d06b8356f5 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sat, 9 Nov 2024 21:50:33 +0100 Subject: [PATCH 441/461] Update codebase test suite --- .github/workflows/build.yaml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 9444048a..31e3a97e 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -12,6 +12,11 @@ jobs: matrix: php: ['8.1', '8.2', '8.3'] stability: [prefer-lowest, prefer-stable] + include: + - php: '8.4' + flags: "--ignore-platform-req=php" + phpunit-flags: '--no-coverage' + stability: prefer-stable steps: - name: Checkout code uses: actions/checkout@v3 @@ -45,11 +50,16 @@ jobs: - name: Run Unit tests with coverage run: composer phpunit -- ${{ matrix.phpunit-flags }} + if: ${{ matrix.php == '8.3' || matrix.php == '8.2' || matrix.php == '8.1'}} + + - name: Run Unit tests without coverage + run: composer phpunit:min + if: ${{ matrix.php == '8.4'}} - name: Run static analysis run: composer phpstan - if: ${{ matrix.php == '8.2' && matrix.stability == 'prefer-stable'}} + if: ${{ matrix.php == '8.3' && matrix.stability == 'prefer-stable'}} - name: Run Coding style rules run: composer phpcs:fix - if: ${{ matrix.php == '8.2' && matrix.stability == 'prefer-stable'}} + if: ${{ matrix.php == '8.3' && matrix.stability == 'prefer-stable'}} From 26cbafd2baf9fab6a92d2d7ec60333a59cc1c602 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 10 Nov 2024 10:10:02 +0100 Subject: [PATCH 442/461] Update codebase test suite --- composer.json | 3 ++- phpstan.neon | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 65f30e63..558f769b 100644 --- a/composer.json +++ b/composer.json @@ -71,8 +71,9 @@ "scripts": { "phpcs": "PHP_CS_FIXER_IGNORE_ENV=1 php-cs-fixer fix -vvv --diff --dry-run --allow-risky=yes --ansi", "phpcs:fix": "php-cs-fixer fix -vvv --allow-risky=yes --ansi", - "phpstan": "phpstan analyse -l max -c phpstan.neon src --memory-limit=256M --ansi", + "phpstan": "phpstan analyse -c phpstan.neon --ansi --memory-limit=192M", "phpunit": "XDEBUG_MODE=coverage phpunit --coverage-text", + "phpunit:min": "phpunit --no-coverage", "test": [ "@phpunit", "@phpstan", diff --git a/phpstan.neon b/phpstan.neon index 0332b88a..19ea5e3e 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -3,6 +3,9 @@ includes: - vendor/phpstan/phpstan-phpunit/extension.neon - vendor/phpstan/phpstan-phpunit/rules.neon parameters: + level: max + paths: + - src ignoreErrors: - message: '#has no value type specified in iterable type array.#' path: src/Rules.php From aa1f9bf2617c9863f2286595403f7dbffe2786ea Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sun, 10 Nov 2024 10:18:36 +0100 Subject: [PATCH 443/461] Prepare PHP8.4 compatible release (#359) Add support for PHP8.3+ and clean up documentation --- .github/workflows/build.yaml | 16 ++++- .php-cs-fixer.php | 5 +- README.md | 70 ++++++++++--------- composer.json | 21 +++--- phpstan.neon | 4 ++ phpunit.xml.dist | 26 +++---- src/Domain.php | 4 +- src/DomainName.php | 4 +- src/DomainTest.php | 4 +- src/RegisteredName.php | 4 +- src/ResolvedDomainTest.php | 10 +-- src/Storage/PsrStorageFactoryTest.php | 6 +- .../PublicSuffixListPsr16CacheTest.php | 55 ++++++++++++--- src/Storage/TimeToLive.php | 28 ++++++-- src/Storage/TimeToLiveTest.php | 4 +- .../TopLevelDomainListPsr16CacheTest.php | 57 ++++++++++++--- src/UnableToLoadTopLevelDomainList.php | 2 +- 17 files changed, 208 insertions(+), 112 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index c5e55a24..31e3a97e 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -10,8 +10,13 @@ jobs: runs-on: ubuntu-20.04 strategy: matrix: - php: ['8.1', '8.2'] + php: ['8.1', '8.2', '8.3'] stability: [prefer-lowest, prefer-stable] + include: + - php: '8.4' + flags: "--ignore-platform-req=php" + phpunit-flags: '--no-coverage' + stability: prefer-stable steps: - name: Checkout code uses: actions/checkout@v3 @@ -45,11 +50,16 @@ jobs: - name: Run Unit tests with coverage run: composer phpunit -- ${{ matrix.phpunit-flags }} + if: ${{ matrix.php == '8.3' || matrix.php == '8.2' || matrix.php == '8.1'}} + + - name: Run Unit tests without coverage + run: composer phpunit:min + if: ${{ matrix.php == '8.4'}} - name: Run static analysis run: composer phpstan - if: ${{ matrix.php == '8.2' && matrix.stability == 'prefer-stable'}} + if: ${{ matrix.php == '8.3' && matrix.stability == 'prefer-stable'}} - name: Run Coding style rules run: composer phpcs:fix - if: ${{ matrix.php == '8.1' && matrix.stability == 'prefer-stable'}} + if: ${{ matrix.php == '8.3' && matrix.stability == 'prefer-stable'}} diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php index e771f589..99023a23 100644 --- a/.php-cs-fixer.php +++ b/.php-cs-fixer.php @@ -17,7 +17,7 @@ 'import_functions' => true, ], 'list_syntax' => ['syntax' => 'short'], - 'new_with_braces' => true, + 'new_with_parentheses' => true, 'no_blank_lines_after_phpdoc' => true, 'no_empty_phpdoc' => true, 'no_empty_comment' => true, @@ -29,6 +29,7 @@ ], 'no_trailing_comma_in_singleline' => true, 'no_unused_imports' => true, + 'nullable_type_declaration_for_default_null_value' => true, 'ordered_imports' => ['imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha'], 'phpdoc_add_missing_param_annotation' => ['only_untyped' => true], 'phpdoc_align' => true, @@ -39,7 +40,7 @@ 'phpdoc_summary' => true, 'psr_autoloading' => true, 'return_type_declaration' => ['space_before' => 'none'], - 'single_blank_line_before_namespace' => true, + 'blank_lines_before_namespace' => true, 'single_quote' => true, 'space_after_semicolon' => true, 'ternary_operator_spaces' => true, diff --git a/README.md b/README.md index 8cd87562..68dc1b3f 100644 --- a/README.md +++ b/README.md @@ -38,10 +38,12 @@ You need: - **PHP >= 7.4** but the latest stable version of PHP is recommended - the `intl` extension +- a copy of the [Public Suffix List](https://publicsuffix.org/) data and/or a copy of the [IANA Top Level Domain List](https://www.iana.org/domains/root/files). Please refer to the [Managing external data source section](#managing-the-package-external-resources) for more information when using this package in production. ## Usage -**If you are upgrading from version 5 please check the [upgrading guide](UPGRADING.md) for known issues.** +> [!WARNING] +> If you are upgrading from version 5 please check the [upgrading guide](UPGRADING.md) for known issues. ### Resolving Domains @@ -115,9 +117,10 @@ These methods resolve the domain against their respective data source using the same rules as the `resolve` method but will instead throw an exception if no valid effective TLD is found or if the submitted domain is invalid. -**All these methods expect as their sole argument a `Pdp\Host` implementing +> [!CAUTION] +> All these methods expect as their sole argument a `Pdp\Host` implementing object, but other types (ie: `string`, `null` and stringable objects) are -supported with predefined conditions as explained in the remaining document.** +supported with predefined conditions as explained in the remaining document. ~~~php [!WARNING] +> You SHOULD never resolve domain name this way in production, without, at +least, a caching mechanism to reduce external resource downloads. +> Using the Public Suffix List to determine what is a valid domain name and what +isn't is dangerous, and MAY lead to errors because of new gTLDs being registered +on a regular basis. +> If you are looking to know the validity of a Top Level Domain, you MUST use +the IANA Top Level Domain List as the proper source for this information or +alternatively the DNS. +> If you MUST use this library for any of the above purposes, you SHOULD consider +integrating an updating mechanism into your software. +> For more information go to the [Managing external data source section](#managing-the-package-external-resources)** ### Resolved domain information. @@ -220,10 +218,11 @@ echo $altResult->domain()->toString(); //display 'foo.bar.test.example'; $altResult->suffix()->isKnown(); //return false; ~~~ -**TIP: Always favor submitting a `Pdp\Suffix` object rather that any other +> [!TIP] +> Always favor submitting a `Pdp\Suffix` object rather that any other supported type to avoid unexpected results. By default, if the input is not a `Pdp\Suffix` instance, the resulting public suffix will be labelled as -being unknown. For more information go to the [Public Suffix section](#public-suffix)** +being unknown. For more information go to the [Public Suffix section](#public-suffix) ### Domain Suffix @@ -339,7 +338,8 @@ $newDomain->clear()->labels(); //return [] echo $domain->slice(2)->toString(); //display 'www' ~~~ -**WARNING: Because of its definition, a domain name can be `null` or a string.** +> [!WARNING] +> Because of its definition, a domain name can be `null` or a string. To distinguish this possibility the object exposes two (2) formatting methods `Domain::value` which can be `null` or a `string` and `Domain::toString` which @@ -396,8 +396,9 @@ is done via two (2) named constructors: At any given moment the `Pdp\Domain` instance can tell you whether it is in `ASCII` mode or not. -**Once instantiated there's no way to tell which algorithm is used to convert -the object from ascii to unicode and vice-versa** +> [!WARNING] +> Once instantiated there's no way to tell which algorithm is used to convert +the object from ascii to unicode and vice-versa ~~~php use Pdp\Domain; @@ -419,10 +420,11 @@ echo $asciiDomain->value(); // display 'fass.de' $asciiDomain->isAscii(); // returns true ~~~ -**TIP: Always favor submitting a `Pdp\Domain` object for resolution rather that a +> [!TIP] +> Always favor submitting a `Pdp\Domain` object for resolution rather that a string or an object that can be cast to a string to avoid unexpected format conversion errors/results. By default, and with lack of information conversion -is done using IDNA 2008 rules.** +is done using IDNA 2008 rules. ### Managing the package external resources @@ -469,7 +471,8 @@ on packagist. #### Refreshing the resource using the provided factories -**THIS IS THE RECOMMENDED WAY OF USING THE LIBRARY** +> [!NOTE] +> THIS IS THE RECOMMENDED WAY OF USING THE LIBRARY For the purpose of this example we will use our PSR powered solution with: @@ -526,12 +529,14 @@ $publicSuffixList = $pslStorage->get(PsrStorageFactory::PUBLIC_SUFFIX_LIST_URI); $topLevelDomains = $rzdStorage->get(PsrStorageFactory::TOP_LEVEL_DOMAIN_LIST_URI); ~~~ -**Be sure to adapt the following code to your own application. +> [!NOTE] +> Be sure to adapt the following code to your own application. The following code is an example given without warranty of it working -out of the box.** +out of the box. -**You should use your dependency injection container to avoid repeating this -code in your application.** +> [!WARNING] +> You should use your dependency injection container to avoid repeating this +code in your application. ### Automatic Updates @@ -560,7 +565,6 @@ Testing - a [PHPUnit](https://phpunit.de) test suite - a code analysis compliance test suite using [PHPStan](https://phpstan.org). -- a code analysis compliance test suite using [Psalm](https://psalm.dev). - a coding style compliance test suite using [PHP CS Fixer](https://cs.symfony.com). To run the tests, run the following command from the project folder. diff --git a/composer.json b/composer.json index 66aafde9..558f769b 100644 --- a/composer.json +++ b/composer.json @@ -46,16 +46,16 @@ "ext-json": "*" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^v3.13.2", - "guzzlehttp/guzzle": "^7.5", - "guzzlehttp/psr7": "^1.6 || ^2.4.3", - "phpstan/phpstan": "^1.10.3", - "phpstan/phpstan-phpunit": "^1.3.8", - "phpstan/phpstan-strict-rules": "^1.5.0", - "phpunit/phpunit": "^10.0.12", - "psr/http-factory": "^1.0.1", + "friendsofphp/php-cs-fixer": "^3.53.0", + "guzzlehttp/guzzle": "^7.8.1", + "guzzlehttp/psr7": "^1.6 || ^2.6.2", + "phpstan/phpstan": "^1.10.66", + "phpstan/phpstan-phpunit": "^1.3.16", + "phpstan/phpstan-strict-rules": "^1.5.3", + "phpunit/phpunit": "^10.5.15 || ^11.1.1", + "psr/http-factory": "^1.0.2", "psr/simple-cache": "^1.0.1", - "symfony/cache": "^v5.0.0 || ^v6.0.0" + "symfony/cache": "^v5.0.0 || ^6.4.6" }, "suggest": { "psr/http-client-implementation": "To use the storage functionnality which depends on PSR-18", @@ -71,8 +71,9 @@ "scripts": { "phpcs": "PHP_CS_FIXER_IGNORE_ENV=1 php-cs-fixer fix -vvv --diff --dry-run --allow-risky=yes --ansi", "phpcs:fix": "php-cs-fixer fix -vvv --allow-risky=yes --ansi", - "phpstan": "phpstan analyse -l max -c phpstan.neon src --xdebug --memory-limit=256M --ansi", + "phpstan": "phpstan analyse -c phpstan.neon --ansi --memory-limit=192M", "phpunit": "XDEBUG_MODE=coverage phpunit --coverage-text", + "phpunit:min": "phpunit --no-coverage", "test": [ "@phpunit", "@phpstan", diff --git a/phpstan.neon b/phpstan.neon index caa678b5..19ea5e3e 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -3,6 +3,9 @@ includes: - vendor/phpstan/phpstan-phpunit/extension.neon - vendor/phpstan/phpstan-phpunit/rules.neon parameters: + level: max + paths: + - src ignoreErrors: - message: '#has no value type specified in iterable type array.#' path: src/Rules.php @@ -12,4 +15,5 @@ parameters: path: src/Rules.php - message: '#Variable \$line on left side of \?\? always exists and is not nullable.#' path: src/Rules.php + - '#^Parameter \#1 \$callback of function set_error_handler expects#' reportUnmatchedIgnoredErrors: true diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 4a02ebfc..2403d4e9 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,22 +1,6 @@ - + - - src - - - src - @@ -31,4 +15,12 @@ + + + src + + + src + + diff --git a/src/Domain.php b/src/Domain.php index 358ebdcc..1d0bbf74 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -86,7 +86,7 @@ public function label(int $key): ?string /** * @return list */ - public function keys(string $label = null): array + public function keys(?string $label = null): array { return $this->registeredName->keys($label); } @@ -155,7 +155,7 @@ public function clear(): self /** * @throws CannotProcessHost */ - public function slice(int $offset, int $length = null): self + public function slice(int $offset, ?int $length = null): self { return $this->newInstance($this->registeredName->slice($offset, $length)); } diff --git a/src/DomainName.php b/src/DomainName.php index c4a4aaf9..fd6e3b91 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -49,7 +49,7 @@ public function labels(): array; * * @return list */ - public function keys(string $label = null): array; + public function keys(?string $label = null): array; /** * The external iterator iterates over the DomainInterface labels @@ -119,5 +119,5 @@ public function clear(): self; * * If $length is null it returns all elements from $offset to the end of the Domain. */ - public function slice(int $offset, int $length = null): self; + public function slice(int $offset, ?int $length = null): self; } diff --git a/src/DomainTest.php b/src/DomainTest.php index 3ea53151..e3ea7c0f 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -168,14 +168,14 @@ public static function toUnicodeProvider(): iterable public function testToAscii( ?string $domain, ?string $expectedDomain, - ?string $expectedAsciiDomain + ?string $expectedIDNDomain ): void { $domain = Domain::fromIDNA2008($domain); self::assertSame($expectedDomain, $domain->value()); /** @var Domain $domainIDN */ $domainIDN = $domain->toAscii(); - self::assertSame($expectedAsciiDomain, $domainIDN->value()); + self::assertSame($expectedIDNDomain, $domainIDN->value()); } /** diff --git a/src/RegisteredName.php b/src/RegisteredName.php index 4350932e..cd12eea9 100644 --- a/src/RegisteredName.php +++ b/src/RegisteredName.php @@ -190,7 +190,7 @@ public function label(int $key): ?string /** * @return list */ - public function keys(string $label = null): array + public function keys(?string $label = null): array { if (null === $label) { return array_keys($this->labels); @@ -345,7 +345,7 @@ public function clear(): self /** * @throws CannotProcessHost */ - public function slice(int $offset, int $length = null): self + public function slice(int $offset, ?int $length = null): self { $nbLabels = count($this->labels); if ($offset < - $nbLabels || $offset > $nbLabels) { diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index e6f15f26..12c777b1 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -173,8 +173,8 @@ public function testItCanBeConvertedToAscii( ?string $publicSuffix, ?string $expectedDomain, ?string $expectedSuffix, - ?string $expectedAsciiDomain, - ?string $expectedAsciiSuffix + ?string $expectedIDNDomain, + ?string $expectedIDNSuffix ): void { $domain = ResolvedDomain::fromUnknown(Domain::fromIDNA2003($domain), count(Domain::fromIDNA2003($publicSuffix))); self::assertSame($expectedDomain, $domain->value()); @@ -182,8 +182,8 @@ public function testItCanBeConvertedToAscii( /** @var ResolvedDomain $domainIDN */ $domainIDN = $domain->toAscii(); - self::assertSame($expectedAsciiDomain, $domainIDN->value()); - self::assertSame($expectedAsciiSuffix, $domainIDN->suffix()->value()); + self::assertSame($expectedIDNDomain, $domainIDN->value()); + self::assertSame($expectedIDNSuffix, $domainIDN->suffix()->value()); } /** @@ -236,7 +236,7 @@ public static function toAsciiProvider(): iterable } #[DataProvider('withSubDomainWorksProvider')] - public function testItCanHaveItsSubDomainChanged(ResolvedDomain $domain, DomainName|string|null $subdomain, string $expected = null): void + public function testItCanHaveItsSubDomainChanged(ResolvedDomain $domain, DomainName|string|null $subdomain, ?string $expected = null): void { $result = $domain->withSubDomain($subdomain); diff --git a/src/Storage/PsrStorageFactoryTest.php b/src/Storage/PsrStorageFactoryTest.php index b423fb4a..efa782f9 100644 --- a/src/Storage/PsrStorageFactoryTest.php +++ b/src/Storage/PsrStorageFactoryTest.php @@ -15,9 +15,9 @@ final class PsrStorageFactoryTest extends TestCase public function setUp(): void { - $cache = $this->createStub(CacheInterface::class); - $requestFactory = $this->createStub(RequestFactoryInterface::class); - $client = $this->createStub(ClientInterface::class); + $cache = self::createStub(CacheInterface::class); + $requestFactory = self::createStub(RequestFactoryInterface::class); + $client = self::createStub(ClientInterface::class); $this->factory = new PsrStorageFactory($cache, $client, $requestFactory); } diff --git a/src/Storage/PublicSuffixListPsr16CacheTest.php b/src/Storage/PublicSuffixListPsr16CacheTest.php index c9c8989c..f41cfb5c 100644 --- a/src/Storage/PublicSuffixListPsr16CacheTest.php +++ b/src/Storage/PublicSuffixListPsr16CacheTest.php @@ -9,6 +9,7 @@ use InvalidArgumentException; use Pdp\Rules; use PHPUnit\Framework\TestCase; +use PHPUnit\Runner\ErrorHandler; use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; use RuntimeException; @@ -18,7 +19,7 @@ final class PublicSuffixListPsr16CacheTest extends TestCase { public function testItReturnsNullIfTheCacheDoesNotExists(): void { - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('get')->willReturn(null); $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', '1 DAY'); @@ -29,7 +30,7 @@ public function testItReturnsNullIfTheCacheDoesNotExists(): void public function testItReturnsAnInstanceIfTheCorrectCacheExists(): void { $rules = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('get')->willReturn($rules); $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', 86400); @@ -39,7 +40,7 @@ public function testItReturnsAnInstanceIfTheCorrectCacheExists(): void public function testItReturnsNullIfTheCacheContentContainsInvalidJsonData(): void { - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('get')->willReturn('foobar'); $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', 86400); @@ -48,7 +49,7 @@ public function testItReturnsNullIfTheCacheContentContainsInvalidJsonData(): voi public function testItReturnsNullIfTheCacheContentCannotBeConvertedToTheCorrectInstance(): void { - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('get')->willReturn('{"foo":"bar"}'); $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new DateTimeImmutable('+1 DAY')); @@ -58,7 +59,7 @@ public function testItReturnsNullIfTheCacheContentCannotBeConvertedToTheCorrectI public function testItCanStoreAPublicSuffixListInstance(): void { - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('set')->willReturn(true); $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); @@ -69,7 +70,7 @@ public function testItCanStoreAPublicSuffixListInstance(): void public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void { - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('set')->willReturn(false); $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); @@ -82,7 +83,7 @@ public function testItReturnsFalseIfItCantCacheAPublicSuffixListInstance(): void { $exception = new class('Something went wrong.', 0) extends RuntimeException implements CacheException { }; - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('set')->will(self::throwException($exception)); $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); @@ -95,7 +96,7 @@ public function testItWillThrowIfItCantCacheAPublicSuffixListInstance(): void { $exception = new class('Something went wrong.', 0) extends RuntimeException { }; - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('set')->will(self::throwException($exception)); $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); @@ -114,7 +115,7 @@ public function testItCanDeleteTheCachedDatabase(): void { $uri = 'http://www.example.com'; - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('delete')->willReturn(true); $instance = new PublicSuffixListPsr16Cache($cache, 'pdp_', new DateInterval('P1D')); @@ -125,7 +126,41 @@ public function testItWillThrowIfTheTTLIsNotParsable(): void { $this->expectException(InvalidArgumentException::class); - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); new PublicSuffixListPsr16Cache($cache, 'pdp_', 'foobar'); } + + protected function restoreExceptionHandler(): void + { + while (true) { + $previousHandler = set_exception_handler(static fn () => null); + restore_exception_handler(); + if (null === $previousHandler) { + break; + } + + restore_exception_handler(); + } + } + + protected function restoreErrorHandler(): void + { + while (true) { + $previousHandler = set_error_handler(static fn (int $errno, string $errstr, ?string $errfile = null, ?int $errline = null) => null); + restore_error_handler(); + $isPhpUnitErrorHandler = ($previousHandler instanceof ErrorHandler); + if (null === $previousHandler || $isPhpUnitErrorHandler) { + break; + } + restore_error_handler(); + } + } + + protected function tearDown(): void + { + parent::tearDown(); + + $this->restoreErrorHandler(); + $this->restoreExceptionHandler(); + } } diff --git a/src/Storage/TimeToLive.php b/src/Storage/TimeToLive.php index 5182f09d..3bbe04a7 100644 --- a/src/Storage/TimeToLive.php +++ b/src/Storage/TimeToLive.php @@ -9,6 +9,7 @@ use DateTimeInterface; use InvalidArgumentException; use Stringable; +use Throwable; use function filter_var; use const FILTER_VALIDATE_INT; @@ -19,13 +20,26 @@ final class TimeToLive { public static function fromDurationString(string $duration): DateInterval { - set_error_handler(fn () => true); - $interval = DateInterval::createFromDateString($duration); - restore_error_handler(); - if (!$interval instanceof DateInterval) { - throw new InvalidArgumentException( - 'The ttl value "'.$duration.'" can not be parsable by `DateInterval::createFromDateString`.' - ); + try { + set_error_handler(fn () => true); + $interval = DateInterval::createFromDateString($duration); + restore_error_handler(); + if (!$interval instanceof DateInterval) { + throw new InvalidArgumentException( + 'The ttl value "'.$duration.'" can not be parsable by `DateInterval::createFromDateString`.' + ); + } + + } catch (Throwable $exception) { + if (!$exception instanceof InvalidArgumentException) { + throw new InvalidArgumentException( + 'The ttl value "'.$duration.'" can not be parsable by `DateInterval::createFromDateString`.', + 0, + $exception + ); + } + + throw $exception; } return $interval; diff --git a/src/Storage/TimeToLiveTest.php b/src/Storage/TimeToLiveTest.php index 1604d3df..9ca00b75 100644 --- a/src/Storage/TimeToLiveTest.php +++ b/src/Storage/TimeToLiveTest.php @@ -22,9 +22,7 @@ public function testItDoesNotReturnTheAbsoluteInterval(): void self::assertSame(0, TimeToLive::until($tomorrow)->invert); } - /** - * @dataProvider validDurationString - */ + #[DataProvider('validDurationString')] public function testItCanBeInstantiatedFromDurationInput(string $input, DateInterval $expected): void { $now = new DateTimeImmutable(); diff --git a/src/Storage/TopLevelDomainListPsr16CacheTest.php b/src/Storage/TopLevelDomainListPsr16CacheTest.php index 59a0a76b..2eb8cb44 100644 --- a/src/Storage/TopLevelDomainListPsr16CacheTest.php +++ b/src/Storage/TopLevelDomainListPsr16CacheTest.php @@ -9,6 +9,7 @@ use InvalidArgumentException; use Pdp\TopLevelDomains; use PHPUnit\Framework\TestCase; +use PHPUnit\Runner\ErrorHandler; use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; use RuntimeException; @@ -18,7 +19,7 @@ final class TopLevelDomainListPsr16CacheTest extends TestCase { public function testItReturnsNullIfTheCacheDoesNotExists(): void { - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('get')->willReturn(null); $instance = new TopLevelDomainListPsr16Cache($cache, 'pdp_', '1 DAY'); @@ -29,7 +30,7 @@ public function testItReturnsNullIfTheCacheDoesNotExists(): void public function testItReturnsAnInstanceIfTheCorrectCacheExists(): void { $topLevelDomainList = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('get')->willReturn($topLevelDomainList); $instance = new TopLevelDomainListPsr16Cache($cache, 'pdp_', 86400); @@ -39,7 +40,7 @@ public function testItReturnsAnInstanceIfTheCorrectCacheExists(): void public function testItReturnsNullIfTheCacheContentContainsInvalidJsonData(): void { - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('get')->willReturn('foobar'); $instance = new TopLevelDomainListPsr16Cache($cache, 'pdp_', new DateInterval('P1D')); @@ -49,7 +50,7 @@ public function testItReturnsNullIfTheCacheContentContainsInvalidJsonData(): voi public function testItReturnsNullIfTheCacheContentCannotBeConvertedToTheCorrectInstance(): void { - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('get')->willReturn('{"foo":"bar"}'); $instance = new TopLevelDomainListPsr16Cache($cache, 'pdp_', new DateTimeImmutable('+1 DAY')); @@ -59,7 +60,7 @@ public function testItReturnsNullIfTheCacheContentCannotBeConvertedToTheCorrectI public function testItCanStoreAPublicSuffixListInstance(): void { - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('set')->willReturn(true); $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); @@ -70,7 +71,7 @@ public function testItCanStoreAPublicSuffixListInstance(): void public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void { - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('set')->willReturn(false); $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); @@ -83,7 +84,7 @@ public function testItReturnsFalseIfItCantCacheATopLevelDomainListInstance(): vo { $exception = new class('Something went wrong.', 0) extends RuntimeException implements CacheException { }; - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('set')->will(self::throwException($exception)); $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); @@ -96,7 +97,7 @@ public function testItThrowsIfItCantCacheATopLevelDomainListInstance(): void { $exception = new class('Something went wrong.', 0) extends RuntimeException { }; - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('set')->will(self::throwException($exception)); $rzd = TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); @@ -111,7 +112,7 @@ public function testItCanDeleteTheCachedDatabase(): void { $uri = 'http://www.example.com'; - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); $cache->method('delete')->willReturn(true); $instance = new TopLevelDomainListPsr16Cache($cache, 'pdp_', new DateInterval('P1D')); @@ -122,7 +123,43 @@ public function testItWillThrowIfTheTTLIsNotParsable(): void { $this->expectException(InvalidArgumentException::class); - $cache = $this->createStub(CacheInterface::class); + $cache = self::createStub(CacheInterface::class); new TopLevelDomainListPsr16Cache($cache, 'pdp_', 'foobar'); } + + + + protected function restoreExceptionHandler(): void + { + while (true) { + $previousHandler = set_exception_handler(static fn () => null); + restore_exception_handler(); + if (null === $previousHandler) { + break; + } + + restore_exception_handler(); + } + } + + protected function restoreErrorHandler(): void + { + while (true) { + $previousHandler = set_error_handler(static fn (int $errno, string $errstr, ?string $errfile = null, ?int $errline = null) => null); + restore_error_handler(); + $isPhpUnitErrorHandler = ($previousHandler instanceof ErrorHandler); + if (null === $previousHandler || $isPhpUnitErrorHandler) { + break; + } + restore_error_handler(); + } + } + + protected function tearDown(): void + { + parent::tearDown(); + + $this->restoreErrorHandler(); + $this->restoreExceptionHandler(); + } } diff --git a/src/UnableToLoadTopLevelDomainList.php b/src/UnableToLoadTopLevelDomainList.php index 94ed824a..d2f4e937 100644 --- a/src/UnableToLoadTopLevelDomainList.php +++ b/src/UnableToLoadTopLevelDomainList.php @@ -9,7 +9,7 @@ final class UnableToLoadTopLevelDomainList extends InvalidArgumentException implements CannotProcessHost { - public static function dueToInvalidTopLevelDomain(string $content, Throwable $exception = null): self + public static function dueToInvalidTopLevelDomain(string $content, ?Throwable $exception = null): self { return new self('Invalid Top Level Domain: '.$content, 0, $exception); } From c6fb031fe52ee1b3943867eb079c91476e28c9e1 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 19 Dec 2024 11:12:35 +0100 Subject: [PATCH 444/461] Update develop dependencies --- composer.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/composer.json b/composer.json index 558f769b..e497097f 100644 --- a/composer.json +++ b/composer.json @@ -46,16 +46,16 @@ "ext-json": "*" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.53.0", - "guzzlehttp/guzzle": "^7.8.1", - "guzzlehttp/psr7": "^1.6 || ^2.6.2", - "phpstan/phpstan": "^1.10.66", - "phpstan/phpstan-phpunit": "^1.3.16", - "phpstan/phpstan-strict-rules": "^1.5.3", - "phpunit/phpunit": "^10.5.15 || ^11.1.1", - "psr/http-factory": "^1.0.2", - "psr/simple-cache": "^1.0.1", - "symfony/cache": "^v5.0.0 || ^6.4.6" + "friendsofphp/php-cs-fixer": "^3.65.0", + "guzzlehttp/guzzle": "^7.9.2", + "guzzlehttp/psr7": "^1.6 || ^2.7.0", + "phpstan/phpstan": "^1.12.13", + "phpstan/phpstan-phpunit": "^1.4.2", + "phpstan/phpstan-strict-rules": "^1.6.1", + "phpunit/phpunit": "^10.5.15 || ^11.5.1", + "psr/http-factory": "^1.1.0", + "psr/simple-cache": "^1.0.1 || ^2.0.0", + "symfony/cache": "^v5.0.0 || ^6.4.16" }, "suggest": { "psr/http-client-implementation": "To use the storage functionnality which depends on PSR-18", From 5a5cb792d3b897382832cd30d63f72b5f9313a27 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 19 Dec 2024 11:14:37 +0100 Subject: [PATCH 445/461] Update github actions and dependencies --- .github/workflows/build.yaml | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 31e3a97e..d0f89e8c 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -10,13 +10,8 @@ jobs: runs-on: ubuntu-20.04 strategy: matrix: - php: ['8.1', '8.2', '8.3'] + php: ['8.1', '8.2', '8.3', '8.4'] stability: [prefer-lowest, prefer-stable] - include: - - php: '8.4' - flags: "--ignore-platform-req=php" - phpunit-flags: '--no-coverage' - stability: prefer-stable steps: - name: Checkout code uses: actions/checkout@v3 @@ -50,11 +45,6 @@ jobs: - name: Run Unit tests with coverage run: composer phpunit -- ${{ matrix.phpunit-flags }} - if: ${{ matrix.php == '8.3' || matrix.php == '8.2' || matrix.php == '8.1'}} - - - name: Run Unit tests without coverage - run: composer phpunit:min - if: ${{ matrix.php == '8.4'}} - name: Run static analysis run: composer phpstan From ac15896fdcb868eba4d366d820531bdc9baaed74 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 19 Dec 2024 20:59:47 +0100 Subject: [PATCH 446/461] Fix typo in composer manifest --- composer.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index e497097f..b258858f 100644 --- a/composer.json +++ b/composer.json @@ -58,9 +58,9 @@ "symfony/cache": "^v5.0.0 || ^6.4.16" }, "suggest": { - "psr/http-client-implementation": "To use the storage functionnality which depends on PSR-18", - "psr/http-factory-implementation": "To use the storage functionnality which depends on PSR-17", - "psr/simple-cache-implementation": "To use the storage functionnality which depends on PSR-16", + "psr/http-client-implementation": "To use the storage functionality which depends on PSR-18", + "psr/http-factory-implementation": "To use the storage functionality which depends on PSR-17", + "psr/simple-cache-implementation": "To use the storage functionality which depends on PSR-16", "league/uri": "To parse URL and validate host" }, "autoload": { From 2d0caeac505ba7ecf5a56cc0b7c2d1653ed4608c Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 19 Dec 2024 21:00:26 +0100 Subject: [PATCH 447/461] remove ext-json requirement which is always loaded in PHP8.1+ --- composer.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/composer.json b/composer.json index b258858f..b76532d4 100644 --- a/composer.json +++ b/composer.json @@ -42,8 +42,7 @@ "require": { "php": "^8.1", "ext-filter": "*", - "ext-intl": "*", - "ext-json": "*" + "ext-intl": "*" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.65.0", From e4f8435650bb4b8bc1ef9136a34c568d6938972b Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 23 Apr 2025 00:12:08 +0200 Subject: [PATCH 448/461] #361 Adding the ability to use absolute domain (#362) Allow absolute domain name to be resolved --- .github/workflows/build.yaml | 4 +- .php-cs-fixer.php | 15 ++++---- CHANGELOG.md | 19 ++++++++++ README.md | 8 +++- composer.json | 10 +++-- src/Domain.php | 24 ++++++++++++ src/DomainName.php | 6 +++ src/DomainTest.php | 8 ---- src/Idna.php | 2 + src/IdnaInfo.php | 1 + src/IdnaInfoTest.php | 1 + src/PublicSuffixList.php | 6 +-- src/RegisteredName.php | 25 +++++++++++++ src/ResolvedDomain.php | 17 ++++++--- src/ResolvedDomainTest.php | 11 +----- src/Rules.php | 37 ++++++------------- src/RulesTest.php | 17 +++------ src/Storage/PublicSuffixListPsr16Cache.php | 1 + .../PublicSuffixListPsr16CacheTest.php | 7 ++-- .../PublicSuffixListPsr18ClientTest.php | 13 ++++--- src/Storage/RulesStorageTest.php | 13 ++++--- src/Storage/TimeToLive.php | 2 + src/Storage/TimeToLiveTest.php | 2 +- src/Storage/TopLevelDomainListPsr16Cache.php | 1 + .../TopLevelDomainListPsr16CacheTest.php | 5 ++- .../TopLevelDomainListPsr18ClientTest.php | 13 ++++--- src/Storage/TopLevelDomainsStorageTest.php | 13 ++++--- src/Suffix.php | 1 + src/SuffixTest.php | 1 + src/TopLevelDomainList.php | 4 +- src/TopLevelDomains.php | 25 +++++-------- src/TopLevelDomainsTest.php | 28 +++++++------- 32 files changed, 197 insertions(+), 143 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index d0f89e8c..6fbc4a24 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -7,7 +7,7 @@ on: jobs: linux_tests: name: PHP on ${{ matrix.php }} - ${{ matrix.stability }} - ${{ matrix.composer-flags }} - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 strategy: matrix: php: ['8.1', '8.2', '8.3', '8.4'] @@ -32,7 +32,7 @@ jobs: id: composer-cache run: | echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-composer-${{ matrix.stability }}-${{ matrix.flags }}-${{ hashFiles('**/composer.lock') }} diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php index 99023a23..c17d0c98 100644 --- a/.php-cs-fixer.php +++ b/.php-cs-fixer.php @@ -1,5 +1,7 @@ in(__DIR__.'/src') ; @@ -7,8 +9,9 @@ $config = new PhpCsFixer\Config(); return $config + ->setParallelConfig(ParallelConfigFactory::detect()) ->setRules([ - '@PSR2' => true, + '@PSR12' => true, 'array_syntax' => ['syntax' => 'short'], 'concat_space' => ['spacing' => 'none'], 'global_namespace_import' => [ @@ -16,23 +19,18 @@ 'import_constants' => true, 'import_functions' => true, ], - 'list_syntax' => ['syntax' => 'short'], 'new_with_parentheses' => true, 'no_blank_lines_after_phpdoc' => true, 'no_empty_phpdoc' => true, 'no_empty_comment' => true, 'no_leading_import_slash' => true, - 'no_superfluous_phpdoc_tags' => [ - 'allow_mixed' => true, - 'remove_inheritdoc' => true, - 'allow_unused_params' => false, - ], + 'no_superfluous_phpdoc_tags' => true, 'no_trailing_comma_in_singleline' => true, 'no_unused_imports' => true, 'nullable_type_declaration_for_default_null_value' => true, 'ordered_imports' => ['imports_order' => ['class', 'function', 'const'], 'sort_algorithm' => 'alpha'], 'phpdoc_add_missing_param_annotation' => ['only_untyped' => true], - 'phpdoc_align' => true, + 'phpdoc_align' => ['align' => 'left'], 'phpdoc_no_empty_return' => true, 'phpdoc_order' => true, 'phpdoc_scalar' => true, @@ -47,5 +45,6 @@ 'trailing_comma_in_multiline' => true, 'trim_array_spaces' => true, 'whitespace_after_comma_in_array' => true, + 'yoda_style' => true, ]) ->setFinder($finder); diff --git a/CHANGELOG.md b/CHANGELOG.md index 965c3922..12cf2a8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,25 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will be documented in this file +## [6.4.0] - 2025-04-22 + +### Added + +- `DomainName::withRootLabel`, `DomainName::withoutRootLabel`, `DomainName::isAbsolute` methods to handle absolute domain names. + +### Fixed + +- Absolute domain name can now also be resolved by the package see issue [#361](https://github.com/jeremykendall/php-domain-parser/issues/361) prior to this release an exception was thrown. +- Since we no longer support PHP7 type hint and return type are improved. + +### Deprecated + +- None + +### Removed + +- None + ## [6.3.0] - 2023-02-25 ### Added diff --git a/README.md b/README.md index 68dc1b3f..80f892d7 100644 --- a/README.md +++ b/README.md @@ -36,10 +36,14 @@ composer require jeremykendall/php-domain-parser:^6.0 You need: -- **PHP >= 7.4** but the latest stable version of PHP is recommended -- the `intl` extension +- **PHP >= 8.1** but the latest stable version of PHP is recommended - a copy of the [Public Suffix List](https://publicsuffix.org/) data and/or a copy of the [IANA Top Level Domain List](https://www.iana.org/domains/root/files). Please refer to the [Managing external data source section](#managing-the-package-external-resources) for more information when using this package in production. +Handling of an IDN host requires the presence of the `intl` extension or +a polyfill for the `intl` IDN functions like the `symfony/polyfill-intl-idn` +otherwise an exception will be thrown when attempting to validate or interact +with such a host. + ## Usage > [!WARNING] diff --git a/composer.json b/composer.json index b76532d4..245e9d22 100644 --- a/composer.json +++ b/composer.json @@ -41,8 +41,7 @@ ], "require": { "php": "^8.1", - "ext-filter": "*", - "ext-intl": "*" + "ext-filter": "*" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.65.0", @@ -54,13 +53,16 @@ "phpunit/phpunit": "^10.5.15 || ^11.5.1", "psr/http-factory": "^1.1.0", "psr/simple-cache": "^1.0.1 || ^2.0.0", - "symfony/cache": "^v5.0.0 || ^6.4.16" + "symfony/cache": "^v5.0.0 || ^6.4.16", + "symfony/var-dumper": "^v6.4.18 || ^7.2" }, "suggest": { "psr/http-client-implementation": "To use the storage functionality which depends on PSR-18", "psr/http-factory-implementation": "To use the storage functionality which depends on PSR-17", "psr/simple-cache-implementation": "To use the storage functionality which depends on PSR-16", - "league/uri": "To parse URL and validate host" + "league/uri": "To parse and extract the host from an URL using a RFC3986/RFC3987 URI parser", + "rowbot/url": "To parse and extract the host from an URL using a WHATWG URL parser", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "autoload": { "psr-4": { diff --git a/src/Domain.php b/src/Domain.php index 1d0bbf74..6764ff2b 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -6,6 +6,7 @@ use Iterator; use Stringable; + use const FILTER_FLAG_IPV4; use const FILTER_VALIDATE_IP; @@ -159,4 +160,27 @@ public function slice(int $offset, ?int $length = null): self { return $this->newInstance($this->registeredName->slice($offset, $length)); } + + public function withRootLabel(): self + { + if ('' === $this->label(0)) { + return $this; + } + + return $this->append(''); + } + + public function withoutRootLabel(): self + { + if ('' === $this->label(0)) { + return $this->slice(1); + } + + return $this; + } + + public function isAbsolute(): bool + { + return '' === $this->label(0); + } } diff --git a/src/DomainName.php b/src/DomainName.php index fd6e3b91..d2610b28 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -14,6 +14,10 @@ * @see https://tools.ietf.org/html/rfc5890 * * @extends IteratorAggregate + * + * @method bool isAbsolute() tells whether the domain is absolute or not. + * @method self withRootLabel() returns an instance with its Root label. (see https://tools.ietf.org/html/rfc3986#section-3.2.2) + * @method self withoutRootLabel() returns an instance without its Root label. (see https://tools.ietf.org/html/rfc3986#section-3.2.2) */ interface DomainName extends Host, IteratorAggregate { @@ -120,4 +124,6 @@ public function clear(): self; * If $length is null it returns all elements from $offset to the end of the Domain. */ public function slice(int $offset, ?int $length = null): self; + + } diff --git a/src/DomainTest.php b/src/DomainTest.php index e3ea7c0f..da13679f 100644 --- a/src/DomainTest.php +++ b/src/DomainTest.php @@ -6,8 +6,6 @@ use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; -use stdClass; -use TypeError; final class DomainTest extends TestCase { @@ -290,12 +288,6 @@ public static function withLabelWorksProvider(): iterable ]; } - public function testWithLabelFailsWithTypeError(): void - { - $this->expectException(TypeError::class); - Domain::fromIDNA2008('example.com')->withLabel(1, new stdClass()); /* @phpstan-ignore-line */ - } - public function testWithLabelFailsWithInvalidKey(): void { $this->expectException(SyntaxError::class); diff --git a/src/Idna.php b/src/Idna.php index cf33ca0f..f09f72a4 100644 --- a/src/Idna.php +++ b/src/Idna.php @@ -5,6 +5,7 @@ namespace Pdp; use UnexpectedValueException; + use function defined; use function function_exists; use function idn_to_ascii; @@ -12,6 +13,7 @@ use function preg_match; use function rawurldecode; use function strtolower; + use const INTL_IDNA_VARIANT_UTS46; /** diff --git a/src/IdnaInfo.php b/src/IdnaInfo.php index 5724c6f8..7afd6b24 100644 --- a/src/IdnaInfo.php +++ b/src/IdnaInfo.php @@ -5,6 +5,7 @@ namespace Pdp; use function array_filter; + use const ARRAY_FILTER_USE_KEY; /** diff --git a/src/IdnaInfoTest.php b/src/IdnaInfoTest.php index cd2fcded..1ecd93b0 100644 --- a/src/IdnaInfoTest.php +++ b/src/IdnaInfoTest.php @@ -5,6 +5,7 @@ namespace Pdp; use PHPUnit\Framework\TestCase; + use function var_export; final class IdnaInfoTest extends TestCase diff --git a/src/PublicSuffixList.php b/src/PublicSuffixList.php index b63b64c6..ecbd75a2 100644 --- a/src/PublicSuffixList.php +++ b/src/PublicSuffixList.php @@ -9,7 +9,7 @@ interface PublicSuffixList extends DomainNameResolver /** * Returns PSL info for a given domain against the PSL rules for cookie domain detection. * - * @throws SyntaxError if the domain is invalid + * @throws SyntaxError if the domain is invalid * @throws UnableToResolveDomain if the effective TLD can not be resolved */ public function getCookieDomain(Host $host): ResolvedDomainName; @@ -17,7 +17,7 @@ public function getCookieDomain(Host $host): ResolvedDomainName; /** * Returns PSL info for a given domain against the PSL rules for ICANN domain detection. * - * @throws SyntaxError if the domain is invalid + * @throws SyntaxError if the domain is invalid * @throws UnableToResolveDomain if the domain does not contain a ICANN Effective TLD */ public function getICANNDomain(Host $host): ResolvedDomainName; @@ -25,7 +25,7 @@ public function getICANNDomain(Host $host): ResolvedDomainName; /** * Returns PSL info for a given domain against the PSL rules for private domain detection. * - * @throws SyntaxError if the domain is invalid + * @throws SyntaxError if the domain is invalid * @throws UnableToResolveDomain if the domain does not contain a private Effective TLD */ public function getPrivateDomain(Host $host): ResolvedDomainName; diff --git a/src/RegisteredName.php b/src/RegisteredName.php index cd12eea9..ac6d68a5 100644 --- a/src/RegisteredName.php +++ b/src/RegisteredName.php @@ -6,6 +6,7 @@ use Iterator; use Stringable; + use function array_count_values; use function array_keys; use function array_reverse; @@ -19,6 +20,7 @@ use function preg_match; use function rawurldecode; use function strtolower; + use const FILTER_FLAG_IPV4; use const FILTER_VALIDATE_IP; @@ -359,4 +361,27 @@ public function slice(int $offset, ?int $length = null): self return new self($this->type, [] === $labels ? null : implode('.', array_reverse($labels))); } + + public function withRootLabel(): self + { + if ('' === $this->label(0)) { + return $this; + } + + return $this->append(''); + } + + public function withoutRootLabel(): self + { + if ('' === $this->label(0)) { + return $this->slice(1); + } + + return $this; + } + + public function isAbsolute(): bool + { + return '' === $this->label(0); + } } diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index f4fb87c1..19945319 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -5,6 +5,7 @@ namespace Pdp; use Stringable; + use function count; final class ResolvedDomain implements ResolvedDomainName @@ -34,7 +35,7 @@ public static function fromICANN(DomainNameProvider|Host|Stringable|string|int|n { $domain = self::setDomainName($domain); - return new self($domain, Suffix::fromICANN($domain->slice(0, $suffixLength))); + return new self($domain, Suffix::fromICANN($domain->withoutRootLabel()->slice(0, $suffixLength))); } /** @@ -44,7 +45,7 @@ public static function fromPrivate(DomainNameProvider|Host|Stringable|string|int { $domain = self::setDomainName($domain); - return new self($domain, Suffix::fromPrivate($domain->slice(0, $suffixLength))); + return new self($domain, Suffix::fromPrivate($domain->withoutRootLabel()->slice(0, $suffixLength))); } /** @@ -54,7 +55,7 @@ public static function fromIANA(DomainNameProvider|Host|Stringable|string|int|nu { $domain = self::setDomainName($domain); - return new self($domain, Suffix::fromIANA($domain->label(0))); + return new self($domain, Suffix::fromIANA($domain->withoutRootLabel()->label(0))); } /** @@ -118,11 +119,15 @@ private function parse(): array } $length = count($this->suffix); + $offset = 0; + if ($this->domain->isAbsolute()) { + $offset = 1; + } return [ - 'registrableDomain' => $this->domain->slice(0, $length + 1), - 'secondLevelDomain' => $this->domain->slice($length, 1), - 'subDomain' => RegisteredName::fromIDNA2008($this->domain->value())->slice($length + 1), + 'registrableDomain' => $this->domain->slice($offset, $length + 1), + 'secondLevelDomain' => $this->domain->slice($length + $offset, 1), + 'subDomain' => RegisteredName::fromIDNA2008($this->domain->value())->slice($length + 1 + $offset), ]; } diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 12c777b1..0c391c93 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -6,8 +6,6 @@ use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; -use TypeError; -use function date_create; final class ResolvedDomainTest extends TestCase { @@ -300,13 +298,6 @@ public function testItCanThrowsDuringSubDomainChangesIfTheSubDomainIsTheEmptyStr ResolvedDomain::fromICANN('www.example.com', 1)->withSubDomain(''); } - public function testItCanThrowsDuringSubDomainChangesIfTheSubDomainIsNotStringable(): void - { - $this->expectException(TypeError::class); - - ResolvedDomain::fromICANN('www.example.com', 1)->withSubDomain(date_create()); /* @phpstan-ignore-line */ - } - #[DataProvider('withPublicSuffixWorksProvider')] public function testItCanChangeItsSuffix( ResolvedDomain $domain, @@ -397,7 +388,7 @@ public static function withPublicSuffixWorksProvider(): iterable 'isICANN' => false, 'isPrivate' => false, ], - 'with custom IDNA domain options' =>[ + 'with custom IDNA domain options' => [ 'domain' => ResolvedDomain::fromICANN('www.bébé.be', 1), 'publicSuffix' => null, 'expected' => null, diff --git a/src/Rules.php b/src/Rules.php index 6c26b491..cdd4d4b3 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -7,6 +7,7 @@ use SplFileObject; use SplTempFileObject; use Stringable; + use function array_pop; use function explode; use function preg_match; @@ -42,7 +43,7 @@ private function __construct(private readonly array $rules) * * @param null|resource $context * - * @throws UnableToLoadResource If the rules can not be loaded from the path + * @throws UnableToLoadResource If the rules can not be loaded from the path * @throws UnableToLoadPublicSuffixList If the rules contain in the resource are invalid */ public static function fromPath(string $path, $context = null): self @@ -104,8 +105,8 @@ private static function getSection(string $section, string $line): string * A copy of the Apache License, Version 2.0, is provided with this * distribution * - * @param array $list Initially an empty array, this eventually becomes the array representation of a - * Public Suffix List section + * @param array $list Initially an empty array, this eventually becomes the array representation of a + * Public Suffix List section * @param array $ruleParts One line (rule) from the Public Suffix List exploded on '.', or the remaining * portion of that array during recursion * @@ -151,10 +152,7 @@ public static function __set_state(array $properties): self return new self($properties['rules']); } - /** - * @param int|DomainNameProvider|Host|string|Stringable|null $host a type that supports instantiating a Domain from. - */ - public function resolve($host): ResolvedDomainName + public function resolve(DomainNameProvider|Host|Stringable|string|int|null $host): ResolvedDomainName { try { return $this->getCookieDomain($host); @@ -165,13 +163,10 @@ public function resolve($host): ResolvedDomainName } } - /** - * @param int|DomainNameProvider|Host|string|Stringable|null $host the domain value - */ - public function getCookieDomain($host): ResolvedDomainName + public function getCookieDomain(DomainNameProvider|Host|Stringable|string|int|null $host): ResolvedDomainName { $domain = $this->validateDomain($host); - [$suffixLength, $section] = $this->resolveSuffix($domain, self::UNKNOWN_DOMAINS); + [$suffixLength, $section] = $this->resolveSuffix($domain->withoutRootLabel(), self::UNKNOWN_DOMAINS); return match (true) { self::ICANN_DOMAINS === $section => ResolvedDomain::fromICANN($domain, $suffixLength), @@ -180,10 +175,7 @@ public function getCookieDomain($host): ResolvedDomainName }; } - /** - * @param int|DomainNameProvider|Host|string|Stringable|null $host a type that supports instantiating a Domain from. - */ - public function getICANNDomain($host): ResolvedDomainName + public function getICANNDomain(DomainNameProvider|Host|Stringable|string|int|null $host): ResolvedDomainName { $domain = $this->validateDomain($host); [$suffixLength, $section] = $this->resolveSuffix($domain, self::ICANN_DOMAINS); @@ -194,10 +186,7 @@ public function getICANNDomain($host): ResolvedDomainName return ResolvedDomain::fromICANN($domain, $suffixLength); } - /** - * @param int|DomainNameProvider|Host|string|Stringable|null $host a type that supports instantiating a Domain from. - */ - public function getPrivateDomain($host): ResolvedDomainName + public function getPrivateDomain(DomainNameProvider|Host|Stringable|string|int|null $host): ResolvedDomainName { $domain = $this->validateDomain($host); [$suffixLength, $section] = $this->resolveSuffix($domain, self::PRIVATE_DOMAINS); @@ -211,10 +200,10 @@ public function getPrivateDomain($host): ResolvedDomainName /** * Assert the domain is valid and is resolvable. * - * @throws SyntaxError If the domain is invalid + * @throws SyntaxError If the domain is invalid * @throws UnableToResolveDomain If the domain can not be resolved */ - private function validateDomain(int|DomainNameProvider|Host|string|Stringable|null $domain): DomainName + private function validateDomain(DomainNameProvider|Host|Stringable|string|int|null $domain): DomainName { if ($domain instanceof DomainNameProvider) { $domain = $domain->domain(); @@ -224,10 +213,6 @@ private function validateDomain(int|DomainNameProvider|Host|string|Stringable|nu $domain = Domain::fromIDNA2008($domain); } - if ('' === $domain->label(0)) { - throw UnableToResolveDomain::dueToUnresolvableDomain($domain); - } - return $domain; } diff --git a/src/RulesTest.php b/src/RulesTest.php index b8e4838f..be4f25eb 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -6,7 +6,7 @@ use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; -use TypeError; + use function array_fill; use function dirname; use function file_get_contents; @@ -27,7 +27,7 @@ public static function setUpBeforeClass(): void public function testCreateFromPath(): void { $context = stream_context_create([ - 'http'=> [ + 'http' => [ 'method' => 'GET', 'header' => "Accept-language: en\r\nCookie: foo=bar\r\n", ], @@ -66,13 +66,6 @@ public function testNullWillReturnNullDomain(): void self::assertFalse($domain->suffix()->isKnown()); } - public function testThrowsTypeErrorOnWrongInput(): void - { - $this->expectException(TypeError::class); - - self::$rules->resolve(date_create()); /* @phpstan-ignore-line */ - } - public function testIsSuffixValidFalse(): void { $domain = self::$rules->resolve('www.example.faketld'); @@ -129,10 +122,10 @@ public function testWithAbsoluteHostInvalid(): void $domain = self::$rules->resolve('private.ulb.ac.be.'); self::assertSame('private.ulb.ac.be.', $domain->value()); - self::assertFalse($domain->suffix()->isKnown()); - self::assertFalse($domain->suffix()->isICANN()); + self::assertTrue($domain->suffix()->isKnown()); + self::assertTrue($domain->suffix()->isICANN()); self::assertFalse($domain->suffix()->isPrivate()); - self::assertNull($domain->suffix()->value()); + self::assertSame('ac.be', $domain->suffix()->value()); } public function testWithICANNDomainInvalid(): void diff --git a/src/Storage/PublicSuffixListPsr16Cache.php b/src/Storage/PublicSuffixListPsr16Cache.php index b8753afe..676c1643 100644 --- a/src/Storage/PublicSuffixListPsr16Cache.php +++ b/src/Storage/PublicSuffixListPsr16Cache.php @@ -11,6 +11,7 @@ use Psr\SimpleCache\CacheInterface; use Stringable; use Throwable; + use function md5; use function strtolower; diff --git a/src/Storage/PublicSuffixListPsr16CacheTest.php b/src/Storage/PublicSuffixListPsr16CacheTest.php index f41cfb5c..686294b8 100644 --- a/src/Storage/PublicSuffixListPsr16CacheTest.php +++ b/src/Storage/PublicSuffixListPsr16CacheTest.php @@ -13,6 +13,7 @@ use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; use RuntimeException; + use function dirname; final class PublicSuffixListPsr16CacheTest extends TestCase @@ -81,7 +82,7 @@ public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void public function testItReturnsFalseIfItCantCacheAPublicSuffixListInstance(): void { - $exception = new class('Something went wrong.', 0) extends RuntimeException implements CacheException { + $exception = new class ('Something went wrong.', 0) extends RuntimeException implements CacheException { }; $cache = self::createStub(CacheInterface::class); $cache->method('set')->will(self::throwException($exception)); @@ -94,13 +95,13 @@ public function testItReturnsFalseIfItCantCacheAPublicSuffixListInstance(): void public function testItWillThrowIfItCantCacheAPublicSuffixListInstance(): void { - $exception = new class('Something went wrong.', 0) extends RuntimeException { + $exception = new class ('Something went wrong.', 0) extends RuntimeException { }; $cache = self::createStub(CacheInterface::class); $cache->method('set')->will(self::throwException($exception)); $psl = Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); - $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new class() { + $pslCache = new PublicSuffixListPsr16Cache($cache, 'pdp_', new class () { public function __toString(): string { return '1 DAY'; diff --git a/src/Storage/PublicSuffixListPsr18ClientTest.php b/src/Storage/PublicSuffixListPsr18ClientTest.php index 1117abb0..eb4b2373 100644 --- a/src/Storage/PublicSuffixListPsr18ClientTest.php +++ b/src/Storage/PublicSuffixListPsr18ClientTest.php @@ -14,6 +14,7 @@ use Psr\Http\Message\RequestFactoryInterface; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; + use function dirname; use function file_get_contents; @@ -21,7 +22,7 @@ final class PublicSuffixListPsr18ClientTest extends TestCase { public function testIsCanReturnAPublicSuffixListInstance(): void { - $client = new class() implements ClientInterface { + $client = new class () implements ClientInterface { public function sendRequest(RequestInterface $request): ResponseInterface { /** @var string $body */ @@ -30,7 +31,7 @@ public function sendRequest(RequestInterface $request): ResponseInterface } }; - $requestFactory = new class() implements RequestFactoryInterface { + $requestFactory = new class () implements RequestFactoryInterface { public function createRequest(string $method, $uri): RequestInterface { return new Request($method, $uri); @@ -45,14 +46,14 @@ public function createRequest(string $method, $uri): RequestInterface public function testItWillThrowIfTheClientCanNotConnectToTheRemoteURI(): void { - $client = new class() implements ClientInterface { + $client = new class () implements ClientInterface { public function sendRequest(RequestInterface $request): ResponseInterface { throw new ConnectException('foobar', $request, null); } }; - $requestFactory = new class() implements RequestFactoryInterface { + $requestFactory = new class () implements RequestFactoryInterface { public function createRequest(string $method, $uri): RequestInterface { return new Request($method, $uri); @@ -68,14 +69,14 @@ public function createRequest(string $method, $uri): RequestInterface public function testItWillThrowIfTheReturnedStatusCodeIsNotOK(): void { - $client = new class() implements ClientInterface { + $client = new class () implements ClientInterface { public function sendRequest(RequestInterface $request): ResponseInterface { return new Response(404); } }; - $requestFactory = new class() implements RequestFactoryInterface { + $requestFactory = new class () implements RequestFactoryInterface { public function createRequest(string $method, $uri): RequestInterface { return new Request($method, $uri); diff --git a/src/Storage/RulesStorageTest.php b/src/Storage/RulesStorageTest.php index 723628e7..8606ffe3 100644 --- a/src/Storage/RulesStorageTest.php +++ b/src/Storage/RulesStorageTest.php @@ -7,13 +7,14 @@ use Pdp\PublicSuffixList; use Pdp\Rules; use PHPUnit\Framework\TestCase; + use function dirname; final class RulesStorageTest extends TestCase { public function testIsCanReturnAPublicSuffixListInstanceFromCache(): void { - $cache = new class() implements PublicSuffixListCache { + $cache = new class () implements PublicSuffixListCache { public function fetch(string $uri): ?PublicSuffixList { return Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); @@ -30,7 +31,7 @@ public function forget(string $uri): bool } }; - $client = new class() implements PublicSuffixListClient { + $client = new class () implements PublicSuffixListClient { public function get(string $uri): PublicSuffixList { return Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); @@ -45,7 +46,7 @@ public function get(string $uri): PublicSuffixList public function testIsCanReturnAPublicSuffixListInstanceFromTheInnerStorage(): void { - $cache = new class() implements PublicSuffixListCache { + $cache = new class () implements PublicSuffixListCache { public function fetch(string $uri): ?PublicSuffixList { return null; @@ -62,7 +63,7 @@ public function forget(string $uri): bool } }; - $client = new class() implements PublicSuffixListClient { + $client = new class () implements PublicSuffixListClient { public function get(string $uri): PublicSuffixList { return Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); @@ -77,7 +78,7 @@ public function get(string $uri): PublicSuffixList public function testIsCanDeleteAPublicSuffixListInstanceFromTheInnerStorage(): void { - $cache = new class() implements PublicSuffixListCache { + $cache = new class () implements PublicSuffixListCache { public function fetch(string $uri): ?PublicSuffixList { return null; @@ -94,7 +95,7 @@ public function forget(string $uri): bool } }; - $client = new class() implements PublicSuffixListClient { + $client = new class () implements PublicSuffixListClient { public function get(string $uri): PublicSuffixList { return Rules::fromPath(dirname(__DIR__, 2).'/test_data/public_suffix_list.dat'); diff --git a/src/Storage/TimeToLive.php b/src/Storage/TimeToLive.php index 3bbe04a7..6d0289fc 100644 --- a/src/Storage/TimeToLive.php +++ b/src/Storage/TimeToLive.php @@ -10,7 +10,9 @@ use InvalidArgumentException; use Stringable; use Throwable; + use function filter_var; + use const FILTER_VALIDATE_INT; /** diff --git a/src/Storage/TimeToLiveTest.php b/src/Storage/TimeToLiveTest.php index 9ca00b75..43d7bff8 100644 --- a/src/Storage/TimeToLiveTest.php +++ b/src/Storage/TimeToLiveTest.php @@ -76,7 +76,7 @@ public static function validDurationInt(): iterable ]; yield 'stringable object' => [ - 'input' => new class() { + 'input' => new class () { public function __toString(): string { return '2345'; diff --git a/src/Storage/TopLevelDomainListPsr16Cache.php b/src/Storage/TopLevelDomainListPsr16Cache.php index e2b2c6b6..2e76284b 100644 --- a/src/Storage/TopLevelDomainListPsr16Cache.php +++ b/src/Storage/TopLevelDomainListPsr16Cache.php @@ -11,6 +11,7 @@ use Psr\SimpleCache\CacheInterface; use Stringable; use Throwable; + use function md5; use function strtolower; diff --git a/src/Storage/TopLevelDomainListPsr16CacheTest.php b/src/Storage/TopLevelDomainListPsr16CacheTest.php index 2eb8cb44..fc911446 100644 --- a/src/Storage/TopLevelDomainListPsr16CacheTest.php +++ b/src/Storage/TopLevelDomainListPsr16CacheTest.php @@ -13,6 +13,7 @@ use Psr\SimpleCache\CacheException; use Psr\SimpleCache\CacheInterface; use RuntimeException; + use function dirname; final class TopLevelDomainListPsr16CacheTest extends TestCase @@ -82,7 +83,7 @@ public function testItReturnsFalseIfItCantStoreAPublicSuffixListInstance(): void public function testItReturnsFalseIfItCantCacheATopLevelDomainListInstance(): void { - $exception = new class('Something went wrong.', 0) extends RuntimeException implements CacheException { + $exception = new class ('Something went wrong.', 0) extends RuntimeException implements CacheException { }; $cache = self::createStub(CacheInterface::class); $cache->method('set')->will(self::throwException($exception)); @@ -95,7 +96,7 @@ public function testItReturnsFalseIfItCantCacheATopLevelDomainListInstance(): vo public function testItThrowsIfItCantCacheATopLevelDomainListInstance(): void { - $exception = new class('Something went wrong.', 0) extends RuntimeException { + $exception = new class ('Something went wrong.', 0) extends RuntimeException { }; $cache = self::createStub(CacheInterface::class); $cache->method('set')->will(self::throwException($exception)); diff --git a/src/Storage/TopLevelDomainListPsr18ClientTest.php b/src/Storage/TopLevelDomainListPsr18ClientTest.php index 9f4b0b69..eb5a5b47 100644 --- a/src/Storage/TopLevelDomainListPsr18ClientTest.php +++ b/src/Storage/TopLevelDomainListPsr18ClientTest.php @@ -14,6 +14,7 @@ use Psr\Http\Message\RequestFactoryInterface; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; + use function dirname; use function file_get_contents; @@ -21,7 +22,7 @@ final class TopLevelDomainListPsr18ClientTest extends TestCase { public function testIsCanReturnARootZoneDatabaseInstance(): void { - $client = new class() implements ClientInterface { + $client = new class () implements ClientInterface { public function sendRequest(RequestInterface $request): ResponseInterface { /** @var string $body */ @@ -31,7 +32,7 @@ public function sendRequest(RequestInterface $request): ResponseInterface } }; - $requestFactory = new class() implements RequestFactoryInterface { + $requestFactory = new class () implements RequestFactoryInterface { public function createRequest(string $method, $uri): RequestInterface { return new Request($method, $uri); @@ -46,14 +47,14 @@ public function createRequest(string $method, $uri): RequestInterface public function testItWillThrowIfTheClientCanNotConnectToTheRemoteURI(): void { - $client = new class() implements ClientInterface { + $client = new class () implements ClientInterface { public function sendRequest(RequestInterface $request): ResponseInterface { throw new ConnectException('foobar', $request, null); } }; - $requestFactory = new class() implements RequestFactoryInterface { + $requestFactory = new class () implements RequestFactoryInterface { public function createRequest(string $method, $uri): RequestInterface { return new Request($method, $uri); @@ -69,14 +70,14 @@ public function createRequest(string $method, $uri): RequestInterface public function testItWillThrowIfTheReturnedStatusCodeIsNotOK(): void { - $client = new class() implements ClientInterface { + $client = new class () implements ClientInterface { public function sendRequest(RequestInterface $request): ResponseInterface { return new Response(404); } }; - $requestFactory = new class() implements RequestFactoryInterface { + $requestFactory = new class () implements RequestFactoryInterface { public function createRequest(string $method, $uri): RequestInterface { return new Request($method, $uri); diff --git a/src/Storage/TopLevelDomainsStorageTest.php b/src/Storage/TopLevelDomainsStorageTest.php index 0e299e9c..2da00d18 100644 --- a/src/Storage/TopLevelDomainsStorageTest.php +++ b/src/Storage/TopLevelDomainsStorageTest.php @@ -7,13 +7,14 @@ use Pdp\TopLevelDomainList; use Pdp\TopLevelDomains; use PHPUnit\Framework\TestCase; + use function dirname; final class TopLevelDomainsStorageTest extends TestCase { public function testIsCanReturnARootZoneDatabaseInstanceFromCache(): void { - $cache = new class() implements TopLevelDomainListCache { + $cache = new class () implements TopLevelDomainListCache { public function fetch(string $uri): ?TopLevelDomainList { return TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); @@ -30,7 +31,7 @@ public function forget(string $uri): bool } }; - $client = new class() implements TopLevelDomainListClient { + $client = new class () implements TopLevelDomainListClient { public function get(string $uri): TopLevelDomainList { return TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); @@ -44,7 +45,7 @@ public function get(string $uri): TopLevelDomainList public function testIsCanReturnARootZoneDatabaseInstanceFromTheInnerStorage(): void { - $cache = new class() implements TopLevelDomainListCache { + $cache = new class () implements TopLevelDomainListCache { public function fetch(string $uri): ?TopLevelDomainList { return null; @@ -61,7 +62,7 @@ public function forget(string $uri): bool } }; - $client = new class() implements TopLevelDomainListClient { + $client = new class () implements TopLevelDomainListClient { public function get(string $uri): TopLevelDomainList { return TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); @@ -75,7 +76,7 @@ public function get(string $uri): TopLevelDomainList public function testIsCanDeleteARootZoneDatabaseInstanceFromTheInnerStorage(): void { - $cache = new class() implements TopLevelDomainListCache { + $cache = new class () implements TopLevelDomainListCache { public function fetch(string $uri): ?TopLevelDomainList { return null; @@ -92,7 +93,7 @@ public function forget(string $uri): bool } }; - $client = new class() implements TopLevelDomainListClient { + $client = new class () implements TopLevelDomainListClient { public function get(string $uri): TopLevelDomainList { return TopLevelDomains::fromPath(dirname(__DIR__, 2).'/test_data/tlds-alpha-by-domain.txt'); diff --git a/src/Suffix.php b/src/Suffix.php index da397280..3f0a6156 100644 --- a/src/Suffix.php +++ b/src/Suffix.php @@ -5,6 +5,7 @@ namespace Pdp; use Stringable; + use function count; use function in_array; diff --git a/src/SuffixTest.php b/src/SuffixTest.php index b3e6d56a..bf472667 100644 --- a/src/SuffixTest.php +++ b/src/SuffixTest.php @@ -6,6 +6,7 @@ use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; + use function json_encode; final class SuffixTest extends TestCase diff --git a/src/TopLevelDomainList.php b/src/TopLevelDomainList.php index 51e9b0fa..1ca3eb5b 100644 --- a/src/TopLevelDomainList.php +++ b/src/TopLevelDomainList.php @@ -24,7 +24,7 @@ public function version(): string; */ public function lastUpdated(): DateTimeImmutable; - + public function count(): int; /** @@ -40,7 +40,7 @@ public function getIterator(): Iterator; /** * Returns PSL info for a given domain against the PSL rules for ICANN domain detection. * - * @throws SyntaxError if the domain is invalid + * @throws SyntaxError if the domain is invalid * @throws UnableToResolveDomain if the domain does not contain a IANA Effective TLD */ public function getIANADomain(Host $host): ResolvedDomainName; diff --git a/src/TopLevelDomains.php b/src/TopLevelDomains.php index 8f956cf2..98384c24 100644 --- a/src/TopLevelDomains.php +++ b/src/TopLevelDomains.php @@ -9,8 +9,8 @@ use SplFileObject; use SplTempFileObject; use Stringable; + use function count; -use function in_array; use function preg_match; use function trim; @@ -34,7 +34,7 @@ private function __construct( * * @param null|resource $context * - * @throws UnableToLoadResource If the rules can not be loaded from the path + * @throws UnableToLoadResource If the rules can not be loaded from the path * @throws UnableToLoadTopLevelDomainList If the content is invalid or can not be correctly parsed and converted */ public static function fromPath(string $path, $context = null): self @@ -164,14 +164,11 @@ public function getIterator(): Iterator yield from array_keys($this->records); } - /** - * @param int|DomainNameProvider|Host|string|Stringable|null $host a type that supports instantiating a Domain from. - */ - public function resolve($host): ResolvedDomainName + public function resolve(DomainNameProvider|Host|Stringable|string|int|null $host): ResolvedDomainName { try { $domain = $this->validateDomain($host); - if ($this->containsTopLevelDomain($domain)) { + if ($this->containsTopLevelDomain($domain->withoutRootLabel())) { return ResolvedDomain::fromIANA($domain); } return ResolvedDomain::fromUnknown($domain); @@ -185,10 +182,10 @@ public function resolve($host): ResolvedDomainName /** * Assert the domain is valid and is resolvable. * - * @throws SyntaxError If the domain is invalid + * @throws SyntaxError If the domain is invalid * @throws UnableToResolveDomain If the domain can not be resolved */ - private function validateDomain(int|DomainNameProvider|Host|string|Stringable|null $domain): DomainName + private function validateDomain(DomainNameProvider|Host|Stringable|string|int|null $domain): DomainName { if ($domain instanceof DomainNameProvider) { $domain = $domain->domain(); @@ -198,8 +195,7 @@ private function validateDomain(int|DomainNameProvider|Host|string|Stringable|nu $domain = Domain::fromIDNA2008($domain); } - $label = $domain->label(0); - if (in_array($label, [null, ''], true)) { + if (null === $domain->label(0)) { throw UnableToResolveDomain::dueToUnresolvableDomain($domain); } @@ -211,13 +207,10 @@ private function containsTopLevelDomain(DomainName $domain): bool return isset($this->records[$domain->toAscii()->label(0)]); } - /** - * @param int|DomainNameProvider|Host|string|Stringable|null $host a domain in a type that can be converted into a DomainInterface instance - */ - public function getIANADomain($host): ResolvedDomainName + public function getIANADomain(DomainNameProvider|Host|Stringable|string|int|null $host): ResolvedDomainName { $domain = $this->validateDomain($host); - if (!$this->containsTopLevelDomain($domain)) { + if (!$this->containsTopLevelDomain($domain->withoutRootLabel())) { throw UnableToResolveDomain::dueToMissingSuffix($domain, 'IANA'); } diff --git a/src/TopLevelDomainsTest.php b/src/TopLevelDomainsTest.php index ca86e115..e756c6c1 100644 --- a/src/TopLevelDomainsTest.php +++ b/src/TopLevelDomainsTest.php @@ -9,7 +9,7 @@ use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Stringable; -use TypeError; + use function dirname; final class TopLevelDomainsTest extends TestCase @@ -24,7 +24,7 @@ public static function setUpBeforeClass(): void public function testCreateFromPath(): void { $context = stream_context_create([ - 'http'=> [ + 'http' => [ 'method' => 'GET', 'header' => "Accept-language: en\r\nCookie: foo=bar\r\n", ], @@ -176,7 +176,7 @@ public static function validDomainProvider(): iterable 'Unicode domain (1)' => ['الاعلى-للاتصالات.قطر'], 'Unicode domain (2)' => ['кто.рф'], 'Unicode domain (3)' => ['Deutsche.Vermögensberatung.vermögensberater'], - 'object with __toString method' => [new class() { + 'object with __toString method' => [new class () { public function __toString(): string { return 'www.இந.இந்தியா'; @@ -186,13 +186,6 @@ public function __toString(): string ]; } - public function testTopLevelDomainThrowsTypeError(): void - { - $this->expectException(TypeError::class); - - self::$topLevelDomains->getIANADomain(new DateTimeImmutable()); /* @phpstan-ignore-line */ - } - public function testTopLevelDomainWithInvalidDomain(): void { $this->expectException(SyntaxError::class); @@ -211,8 +204,8 @@ public function testResolveWithAbsoluteDomainName(): void { $result = self::$topLevelDomains->resolve('example.com.'); self::assertSame('example.com.', $result->value()); - self::assertFalse($result->suffix()->isIANA()); - self::assertNull($result->suffix()->value()); + self::assertTrue($result->suffix()->isIANA()); + self::assertSame('com', $result->suffix()->value()); } public function testTopLevelDomainWithUnResolvableDomain(): void @@ -222,6 +215,13 @@ public function testTopLevelDomainWithUnResolvableDomain(): void self::$topLevelDomains->getIANADomain('localhost'); } + public function testTopLevelDomainWithUnResolvableDomain2(): void + { + $this->expectException(UnableToResolveDomain::class); + + self::$topLevelDomains->getIANADomain('localhost.'); + } + public function testResolveWithUnResolvableDomain(): void { $result = self::$topLevelDomains->resolve('localhost'); @@ -269,7 +269,7 @@ public static function validTldProvider(): iterable 'Unicode TLD (3)' => ['рф'], 'Unicode TLD (4)' => ['இந்தியா'], 'Unicode TLD (5)' => ['vermögensberater'], - 'object with __toString method' => [new class() { + 'object with __toString method' => [new class () { public function __toString(): string { return 'COM'; @@ -296,7 +296,7 @@ public static function invalidTldProvider(): iterable 'invalid IDN to ASCII' => ['XN--TTT'], 'invalid IDN to ASCII with leading dot' => ['.XN--TTT'], 'null' => [null], - 'object with __toString method' => [new class() { + 'object with __toString method' => [new class () { public function __toString(): string { return 'COMMM'; From 504828ee1dab2ab81a0d1719a02ab3c6f6295140 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 23 Apr 2025 09:32:59 +0200 Subject: [PATCH 449/461] Update documentation to add support for absolute domain --- README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/README.md b/README.md index 80f892d7..8e857387 100644 --- a/README.md +++ b/README.md @@ -228,6 +228,13 @@ supported type to avoid unexpected results. By default, if the input is not a `Pdp\Suffix` instance, the resulting public suffix will be labelled as being unknown. For more information go to the [Public Suffix section](#public-suffix) +> [!INFO] +> Since version `6.4` Domain resolution is also adapted so that absolute domain +can effectively be resolved. Prior to version `6.4` an exception was thrown. +The `ResolvedDomain` stays the same as with the equivalent non-absolute domain +but with the only difference being that the resolved domain will be absolute. +Everything else stays the same. + ### Domain Suffix The domain effective TLD is represented using the `Pdp\Suffix`. Depending on @@ -342,6 +349,26 @@ $newDomain->clear()->labels(); //return [] echo $domain->slice(2)->toString(); //display 'www' ~~~ +Starting with version `6.4` it is possible to specify and handle absolute domain +with the following methods. + +~~~php +resolve(Domain::from2008('www.ExAmpLE.cOM'))->domain(); +$newDomain = $domain->withRootLabel(); + +echo $domain->toString(); //display 'www.example.com' +echo $newDomain->toString(); //display 'www.example.com.www.' +$domain->isAbsolute(); //return false +$newDomain->isAbsolute() //return true + +$domain->value() === $newDomain->withoutRootLabel()->value(); +~~~ + > [!WARNING] > Because of its definition, a domain name can be `null` or a string. From 0a3902e9199705c339c5c20fc60347e8aebac53b Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 23 Apr 2025 09:36:57 +0200 Subject: [PATCH 450/461] Update documentation to add support for absolute domain --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index 8e857387..3dbc5db9 100644 --- a/README.md +++ b/README.md @@ -228,12 +228,9 @@ supported type to avoid unexpected results. By default, if the input is not a `Pdp\Suffix` instance, the resulting public suffix will be labelled as being unknown. For more information go to the [Public Suffix section](#public-suffix) -> [!INFO] +> [!TIP] > Since version `6.4` Domain resolution is also adapted so that absolute domain can effectively be resolved. Prior to version `6.4` an exception was thrown. -The `ResolvedDomain` stays the same as with the equivalent non-absolute domain -but with the only difference being that the resolved domain will be absolute. -Everything else stays the same. ### Domain Suffix From f6581fd7770eb9fe62d7db1d9b3ad210cdaf1ca4 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 23 Apr 2025 17:49:35 +0200 Subject: [PATCH 451/461] ResolvedDomain should handle domain with root label --- src/DomainName.php | 2 -- src/ResolvedDomain.php | 16 +++++++++++++--- src/ResolvedDomainTest.php | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/DomainName.php b/src/DomainName.php index d2610b28..b5c736de 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -124,6 +124,4 @@ public function clear(): self; * If $length is null it returns all elements from $offset to the end of the Domain. */ public function slice(int $offset, ?int $length = null): self; - - } diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 19945319..70d46446 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -10,17 +10,21 @@ final class ResolvedDomain implements ResolvedDomainName { + private readonly DomainName $domain; private readonly DomainName $secondLevelDomain; private readonly DomainName $registrableDomain; private readonly DomainName $subDomain; + private readonly EffectiveTopLevelDomain $suffix; /** * @throws CannotProcessHost */ private function __construct( - private readonly DomainName $domain, - private readonly EffectiveTopLevelDomain $suffix + DomainName $domain, + EffectiveTopLevelDomain $suffix ) { + $this->domain = $domain; + $this->suffix = $suffix; [ 'registrableDomain' => $this->registrableDomain, 'secondLevelDomain' => $this->secondLevelDomain, @@ -195,8 +199,10 @@ public function withSuffix(DomainNameProvider|Host|Stringable|string|int|null $s $suffix = Suffix::fromUnknown($suffix); } + $newDomain = $this->domain->withoutRootLabel()->slice(count($this->suffix))->append($suffix); + return new self( - $this->domain->slice(count($this->suffix))->append($suffix), + $this->domain->isAbsolute() ? $newDomain->withRootLabel() : $newDomain, $suffix->normalize($this->domain) ); } @@ -211,6 +217,10 @@ public function withSubDomain(DomainNameProvider|Host|Stringable|string|int|null } $subDomain = RegisteredName::fromIDNA2008($subDomain); + if ('' === $subDomain->withoutRootLabel()->value()) { + throw SyntaxError::dueToMalformedValue($subDomain->toString()); + } + if ($this->subDomain->value() === $subDomain->value()) { return $this; } diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 0c391c93..050a2a91 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -322,6 +322,7 @@ public function testItCanChangeItsSuffix( public static function withPublicSuffixWorksProvider(): iterable { $baseDomain = ResolvedDomain::fromICANN('example.com', 1); + $baseRootDomain = ResolvedDomain::fromICANN('example.com.', 1); return [ 'simple update (1)' => [ @@ -332,6 +333,14 @@ public static function withPublicSuffixWorksProvider(): iterable 'isICANN' => false, 'isPrivate' => false, ], + 'simple update with root-label (1)' => [ + 'domain' => $baseRootDomain, + 'publicSuffix' => 'be', + 'expected' => 'be', + 'isKnown' => false, + 'isICANN' => false, + 'isPrivate' => false, + ], 'simple update (2)' => [ 'domain' => $baseDomain, 'publicSuffix' => Suffix::fromPrivate('github.io'), @@ -340,6 +349,14 @@ public static function withPublicSuffixWorksProvider(): iterable 'isICANN' => false, 'isPrivate' => true, ], + 'simple update with root-label (2)' => [ + 'domain' => $baseRootDomain, + 'publicSuffix' => Suffix::fromPrivate('github.io'), + 'expected' => 'github.io', + 'isKnown' => true, + 'isICANN' => false, + 'isPrivate' => true, + ], 'same public suffix but PSL info is changed' => [ 'domain' => $baseDomain, 'publicSuffix' => Suffix::fromPrivate('com'), @@ -348,6 +365,14 @@ public static function withPublicSuffixWorksProvider(): iterable 'isICANN' => false, 'isPrivate' => true, ], + 'same public suffix but PSL info is changed with root domain' => [ + 'domain' => $baseRootDomain, + 'publicSuffix' => Suffix::fromPrivate('com'), + 'expected' => 'com', + 'isKnown' => true, + 'isICANN' => false, + 'isPrivate' => true, + ], 'same public suffix but PSL info does not changed' => [ 'domain' => $baseDomain, 'publicSuffix' => Suffix::fromICANN('com'), @@ -372,6 +397,14 @@ public static function withPublicSuffixWorksProvider(): iterable 'isICANN' => true, 'isPrivate' => false, ], + 'simple update IDN (2) with root domains' => [ + 'domain' => ResolvedDomain::fromICANN(Domain::fromIDNA2003('www.bébé.be.'), 1), + 'publicSuffix' => Suffix::fromICANN(Domain::fromIDNA2003('xn--p1ai')), + 'expected' => 'рф', + 'isKnown' => true, + 'isICANN' => true, + 'isPrivate' => false, + ], 'adding the public suffix to a single label domain' => [ 'domain' => ResolvedDomain::fromUnknown('localhost'), 'publicSuffix' => 'www', From d8069179ef40576f45c912de0a8e3e1e2bf0c5fc Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Wed, 23 Apr 2025 23:01:41 +0200 Subject: [PATCH 452/461] ResolvedDomain should handle domain with root label --- src/ResolvedDomain.php | 22 +++++++++++++++++----- src/ResolvedDomainTest.php | 35 +++++++++++++++++++++++++++++++++++ src/Suffix.php | 2 +- 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 70d46446..0d19bbc8 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -199,10 +199,10 @@ public function withSuffix(DomainNameProvider|Host|Stringable|string|int|null $s $suffix = Suffix::fromUnknown($suffix); } - $newDomain = $this->domain->withoutRootLabel()->slice(count($this->suffix))->append($suffix); + $domain = $this->domain->withoutRootLabel()->slice(count($this->suffix))->append($suffix); return new self( - $this->domain->isAbsolute() ? $newDomain->withRootLabel() : $newDomain, + $this->domain->isAbsolute() ? $domain->withRootLabel() : $domain, $suffix->normalize($this->domain) ); } @@ -217,15 +217,20 @@ public function withSubDomain(DomainNameProvider|Host|Stringable|string|int|null } $subDomain = RegisteredName::fromIDNA2008($subDomain); - if ('' === $subDomain->withoutRootLabel()->value()) { - throw SyntaxError::dueToMalformedValue($subDomain->toString()); + if ($subDomain->isAbsolute()) { + $subDomain = $subDomain->withoutRootLabel(); + if (null === $subDomain->value()) { + throw SyntaxError::dueToMalformedValue($subDomain->withRootLabel()->toString()); + } } if ($this->subDomain->value() === $subDomain->value()) { return $this; } - return new self($this->registrableDomain->prepend($subDomain), $this->suffix); + $domain = $this->registrableDomain->prepend($subDomain); + + return new self($this->domain->isAbsolute() ? $domain->withRootLabel() : $domain, $this->suffix); } /** @@ -238,6 +243,13 @@ public function withSecondLevelDomain(DomainNameProvider|Host|Stringable|string| } $label = RegisteredName::fromIDNA2008($label); + if ($label->isAbsolute()) { + if (2 !== count($label)) { + throw UnableToResolveDomain::dueToInvalidSecondLevelDomain($label); + } + $label = $label->withoutRootLabel(); + } + if (1 !== count($label)) { throw UnableToResolveDomain::dueToInvalidSecondLevelDomain($label); } diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 050a2a91..532531d8 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -533,6 +533,13 @@ public static function withSldWorksProvider(): iterable 'expectedSld' => 'www', 'expectedHost' => 'www.com', ], + [ + 'host' => 'example.com', + 'publicSuffix' => 'com', + 'sld' => 'www.', + 'expectedSld' => 'www', + 'expectedHost' => 'www.com', + ], [ 'host' => 'www.example.com', 'publicSuffix' => 'com', @@ -547,6 +554,13 @@ public static function withSldWorksProvider(): iterable 'expectedSld' => 'hamburger', 'expectedHost' => 'www.hamburger.co.uk', ], + [ + 'host' => 'www.bbc.co.uk', + 'publicSuffix' => 'co.uk', + 'sld' => 'hamburger.', + 'expectedSld' => 'hamburger', + 'expectedHost' => 'www.hamburger.co.uk', + ], ]; } @@ -557,6 +571,20 @@ public function testItCanNotAppendAnEmptySLD(): void ResolvedDomain::fromICANN('private.ulb.ac.be', 2)->withSecondLevelDomain(null); } + public function testItCanNotAppendAnEmptyRootLabelSLD(): void + { + $this->expectException(SyntaxError::class); + + ResolvedDomain::fromICANN('private.ulb.ac.be', 2)->withSecondLevelDomain('.'); + } + + public function testItCanNotAppendAnInvalidRootLabelSLD(): void + { + $this->expectException(UnableToResolveDomain::class); + + ResolvedDomain::fromICANN('private.ulb.ac.be', 2)->withSecondLevelDomain('toto.foo.'); + } + public function testItCanNotAppendASLDToAResolvedDomainWithoutSuffix(): void { $this->expectException(UnableToResolveDomain::class); @@ -571,6 +599,13 @@ public function testItCanNotAppendAnInvalidSLDToAResolvedDomain(): void ResolvedDomain::fromIANA('private.ulb.ac.be')->withSecondLevelDomain('foo.bar'); } + public function testItCanNotAppendAnInvalidSubDomainToAResolvedDomain(): void + { + $this->expectException(SyntaxError::class); + + ResolvedDomain::fromIANA('private.ulb.ac.be')->withSubDomain(''); + } + public function testItReturnsTheInstanceWhenTheSLDIsEqual(): void { $domain = ResolvedDomain::fromICANN('private.ulb.ac.be', 2); diff --git a/src/Suffix.php b/src/Suffix.php index 3f0a6156..6a4989dd 100644 --- a/src/Suffix.php +++ b/src/Suffix.php @@ -90,7 +90,7 @@ private static function setDomainName(int|DomainNameProvider|Host|string|Stringa $domain = RegisteredName::fromIDNA2008($domain); } - if ('' === $domain->label(0)) { + if ($domain->isAbsolute()) { throw SyntaxError::dueToInvalidSuffix($domain); } From f06c740e9622336e6ddd21e3cffed23542b50d01 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 24 Apr 2025 08:09:00 +0200 Subject: [PATCH 453/461] ResolvedDomain should handle domain with root label --- README.md | 2 +- src/DomainName.php | 4 ---- src/Host.php | 4 ++++ src/ResolvedDomain.php | 15 +++++++++++++++ src/ResolvedDomainTest.php | 15 +++++++++++++++ 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3dbc5db9..9a5fb53b 100644 --- a/README.md +++ b/README.md @@ -228,7 +228,7 @@ supported type to avoid unexpected results. By default, if the input is not a `Pdp\Suffix` instance, the resulting public suffix will be labelled as being unknown. For more information go to the [Public Suffix section](#public-suffix) -> [!TIP] +> [!NOTE] > Since version `6.4` Domain resolution is also adapted so that absolute domain can effectively be resolved. Prior to version `6.4` an exception was thrown. diff --git a/src/DomainName.php b/src/DomainName.php index b5c736de..fd6e3b91 100644 --- a/src/DomainName.php +++ b/src/DomainName.php @@ -14,10 +14,6 @@ * @see https://tools.ietf.org/html/rfc5890 * * @extends IteratorAggregate - * - * @method bool isAbsolute() tells whether the domain is absolute or not. - * @method self withRootLabel() returns an instance with its Root label. (see https://tools.ietf.org/html/rfc3986#section-3.2.2) - * @method self withoutRootLabel() returns an instance without its Root label. (see https://tools.ietf.org/html/rfc3986#section-3.2.2) */ interface DomainName extends Host, IteratorAggregate { diff --git a/src/Host.php b/src/Host.php index 87945e91..589e3bef 100644 --- a/src/Host.php +++ b/src/Host.php @@ -11,6 +11,10 @@ * @see https://tools.ietf.org/html/rfc1034#section-3.5 * @see https://tools.ietf.org/html/rfc1123#section-2.1 * @see https://tools.ietf.org/html/rfc5890 + * + * @method bool isAbsolute() tells whether the domain is absolute or not. + * @method static withRootLabel() returns an instance with its Root label. (see https://tools.ietf.org/html/rfc3986#section-3.2.2) + * @method static withoutRootLabel() returns an instance without its Root label. (see https://tools.ietf.org/html/rfc3986#section-3.2.2) */ interface Host extends Countable, JsonSerializable { diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index 0d19bbc8..de64b6ec 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -190,6 +190,21 @@ public function toUnicode(): self return new self($this->domain->toUnicode(), $this->suffix->toUnicode()); } + public function isAbsolute(): bool + { + return $this->domain->isAbsolute(); + } + + public function withoutRootLabel(): self + { + return new self($this->domain->withoutRootLabel(), $this->suffix); + } + + public function withRootLabel(): self + { + return new self($this->domain->withRootLabel(), $this->suffix); + } + /** * @throws CannotProcessHost */ diff --git a/src/ResolvedDomainTest.php b/src/ResolvedDomainTest.php index 532531d8..5f22839f 100644 --- a/src/ResolvedDomainTest.php +++ b/src/ResolvedDomainTest.php @@ -628,4 +628,19 @@ public function testSuffixCanHandleIpLikeValue(): void ResolvedDomain::fromICANN('cloudflare-dns.com.1.1.1.1', 4)->toString() ); } + + public function testWithAndWithoutRootLabelResult(): void + { + $withoutRootLabelResult = ResolvedDomain::fromICANN('cloudflare-dns.com', 1); + $withRootLabelResult = $withoutRootLabelResult->withRootLabel(); + + self::assertTrue($withRootLabelResult->isAbsolute()); + self::assertFalse($withoutRootLabelResult->isAbsolute()); + self::assertEquals($withoutRootLabelResult, $withRootLabelResult->withoutRootLabel()); + self::assertSame($withoutRootLabelResult->suffix()->value(), $withRootLabelResult->suffix()->value()); + self::assertSame($withoutRootLabelResult->subDomain()->value(), $withRootLabelResult->subDomain()->value()); + self::assertSame($withoutRootLabelResult->registrableDomain()->value(), $withRootLabelResult->registrableDomain()->value()); + self::assertSame($withoutRootLabelResult->secondLevelDomain()->value(), $withRootLabelResult->secondLevelDomain()->value()); + self::assertNotSame($withoutRootLabelResult->domain()->value(), $withRootLabelResult->domain()->value()); + } } From 77878b8f4a4357f2a5455d551e4d6b43ec6654b4 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 24 Apr 2025 08:19:36 +0200 Subject: [PATCH 454/461] Adding conditionable on Host interface --- src/Domain.php | 23 +++++++++++++++++++++++ src/Host.php | 1 + src/RegisteredName.php | 22 ++++++++++++++++++++++ src/ResolvedDomain.php | 26 ++++++++++++++++++++++++-- 4 files changed, 70 insertions(+), 2 deletions(-) diff --git a/src/Domain.php b/src/Domain.php index 6764ff2b..39fb0209 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -7,6 +7,8 @@ use Iterator; use Stringable; +use function is_bool; + use const FILTER_FLAG_IPV4; use const FILTER_VALIDATE_IP; @@ -183,4 +185,25 @@ public function isAbsolute(): bool { return '' === $this->label(0); } + + /** + * Apply the callback if the given "condition" is (or resolves to) true. + * + * @param (callable($this): bool)|bool $condition + * @param callable($this): (self|null) $onSuccess + * @param ?callable($this): (self|null) $onFail + * + */ + public function when(callable|bool $condition, callable $onSuccess, ?callable $onFail = null): self + { + if (!is_bool($condition)) { + $condition = $condition($this); + } + + return match (true) { + $condition => $onSuccess($this), + null !== $onFail => $onFail($this), + default => $this, + } ?? $this; + } } diff --git a/src/Host.php b/src/Host.php index 589e3bef..6b4de6bc 100644 --- a/src/Host.php +++ b/src/Host.php @@ -15,6 +15,7 @@ * @method bool isAbsolute() tells whether the domain is absolute or not. * @method static withRootLabel() returns an instance with its Root label. (see https://tools.ietf.org/html/rfc3986#section-3.2.2) * @method static withoutRootLabel() returns an instance without its Root label. (see https://tools.ietf.org/html/rfc3986#section-3.2.2) + * @method static when(callable|bool $condition, callable $onSuccess, ?callable $onFail = null) apply the callback if the given "condition" is (or resolves to) true. */ interface Host extends Countable, JsonSerializable { diff --git a/src/RegisteredName.php b/src/RegisteredName.php index ac6d68a5..4a08b412 100644 --- a/src/RegisteredName.php +++ b/src/RegisteredName.php @@ -16,6 +16,7 @@ use function filter_var; use function implode; use function in_array; +use function is_bool; use function ksort; use function preg_match; use function rawurldecode; @@ -384,4 +385,25 @@ public function isAbsolute(): bool { return '' === $this->label(0); } + + /** + * Apply the callback if the given "condition" is (or resolves to) true. + * + * @param (callable($this): bool)|bool $condition + * @param callable($this): (self|null) $onSuccess + * @param ?callable($this): (self|null) $onFail + * + */ + public function when(callable|bool $condition, callable $onSuccess, ?callable $onFail = null): self + { + if (!is_bool($condition)) { + $condition = $condition($this); + } + + return match (true) { + $condition => $onSuccess($this), + null !== $onFail => $onFail($this), + default => $this, + } ?? $this; + } } diff --git a/src/ResolvedDomain.php b/src/ResolvedDomain.php index de64b6ec..d687146a 100644 --- a/src/ResolvedDomain.php +++ b/src/ResolvedDomain.php @@ -7,6 +7,7 @@ use Stringable; use function count; +use function is_bool; final class ResolvedDomain implements ResolvedDomainName { @@ -217,7 +218,7 @@ public function withSuffix(DomainNameProvider|Host|Stringable|string|int|null $s $domain = $this->domain->withoutRootLabel()->slice(count($this->suffix))->append($suffix); return new self( - $this->domain->isAbsolute() ? $domain->withRootLabel() : $domain, + $domain->when($this->domain->isAbsolute(), fn (DomainName $domainName) => $domain->withRootLabel()), $suffix->normalize($this->domain) ); } @@ -245,7 +246,7 @@ public function withSubDomain(DomainNameProvider|Host|Stringable|string|int|null $domain = $this->registrableDomain->prepend($subDomain); - return new self($this->domain->isAbsolute() ? $domain->withRootLabel() : $domain, $this->suffix); + return new self($domain->when($this->domain->isAbsolute(), fn (DomainName $domainName) => $domain->withRootLabel()), $this->suffix); } /** @@ -276,4 +277,25 @@ public function withSecondLevelDomain(DomainNameProvider|Host|Stringable|string| return new self($newRegistrableDomain->prepend($this->subDomain), $this->suffix); } + + /** + * Apply the callback if the given "condition" is (or resolves to) true. + * + * @param (callable($this): bool)|bool $condition + * @param callable($this): (self|null) $onSuccess + * @param ?callable($this): (self|null) $onFail + * + */ + public function when(callable|bool $condition, callable $onSuccess, ?callable $onFail = null): self + { + if (!is_bool($condition)) { + $condition = $condition($this); + } + + return match (true) { + $condition => $onSuccess($this), + null !== $onFail => $onFail($this), + default => $this, + } ?? $this; + } } From fdec722844aaf8040af2fce88f2d77736236c1fd Mon Sep 17 00:00:00 2001 From: Clemens Krack <73299324+wikando-ck@users.noreply.github.com> Date: Thu, 24 Apr 2025 15:11:07 +0200 Subject: [PATCH 455/461] Fix #363 - domain and subdomain wildcard (#364) * test: private domain with subdomain wildcard When a private domain is listed, with an additional wildcard on a subdomain, the private domain itself is not resolved. Confirms #363 * fix: private domain with subdomain wildcard When a private domain is listed, with an additional wildcard on a subdomain, the private domain itself is not resolved. Fixes #363 --- src/Rules.php | 15 ++++++++++++++- src/RulesTest.php | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/Rules.php b/src/Rules.php index cdd4d4b3..331df48c 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -8,8 +8,10 @@ use SplTempFileObject; use Stringable; +use function array_key_exists; use function array_pop; use function explode; +use function in_array; use function preg_match; use function substr; @@ -19,6 +21,8 @@ final class Rules implements PublicSuffixList private const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; private const UNKNOWN_DOMAINS = 'UNKNOWN_DOMAINS'; + private const DOMAIN_RULE_MARKER = '?'; + private const REGEX_PSL_SECTION = ',^// ===(?BEGIN|END) (?ICANN|PRIVATE) DOMAINS===,'; private const PSL_SECTION = [ 'ICANN' => [ @@ -134,7 +138,13 @@ private static function addRule(array $list, array $ruleParts): array $isDomain = false; } - $list[$rule] = $list[$rule] ?? ($isDomain ? [] : ['!' => '']); + if (isset($list[$rule]) && [] === $list[$rule]) { + $list[$rule] = [self::DOMAIN_RULE_MARKER => '']; + } + if (!isset($list[$rule])) { + $list[$rule] = $isDomain ? [] : ['!' => '']; + } + if ($isDomain && [] !== $ruleParts) { /** @var array $tmpList */ $tmpList = $list[$rule]; @@ -264,6 +274,9 @@ private function getPublicSuffixLengthFromSection(DomainName $domain, string $se //no match found if (!array_key_exists($label, $rules)) { // Suffix MUST be fully matched else no suffix is found for private domain + if (self::PRIVATE_DOMAINS === $section && array_key_exists(self::DOMAIN_RULE_MARKER, $rules)) { + return $labelCount; + } if (self::PRIVATE_DOMAINS === $section && self::hasRemainingRules($rules)) { $labelCount = 0; } diff --git a/src/RulesTest.php b/src/RulesTest.php index be4f25eb..2b0bda9b 100644 --- a/src/RulesTest.php +++ b/src/RulesTest.php @@ -565,4 +565,39 @@ public function testWithMultiLevelPrivateDomain(): void self::assertTrue($domain->suffix()->isPrivate()); self::assertSame('lt.eu.org', $domain->suffix()->value()); } + + #[DataProvider('privateDomainWithWildcardProvider')] + public function testWithPrivateDomainThatHasWildcardSubdomain(string $inputDomain, string $expectedSuffix): void + { + $domain = self::$rules->getPrivateDomain($inputDomain); + + self::assertSame($expectedSuffix, $domain->suffix()->value()); + self::assertFalse($domain->suffix()->isICANN()); + self::assertTrue($domain->suffix()->isPrivate()); + } + + /** + * @return iterable + */ + public static function privateDomainWithWildcardProvider(): iterable + { + return [ + 'appspot subdomain' => [ + 'inputDomain' => 'test-domain.de.r.appspot.com', + 'expectedSuffix' => 'de.r.appspot.com', + ], + 'appspot root domain' => [ + 'inputDomain' => 'test-domain.appspot.com', + 'expectedSuffix' => 'appspot.com', + ], + 'qcx subdomain' => [ + 'inputDomain' => 'test-domain.de.sys.qcx.io', + 'expectedSuffix' => 'de.sys.qcx.io', + ], + 'qcx root domain' => [ + 'inputDomain' => 'test-domain.qcx.io', + 'expectedSuffix' => 'qcx.io', + ], + ]; + } } From 6d0878acf978df357f0898ad107a50da6c6435d5 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 24 Apr 2025 21:02:57 +0200 Subject: [PATCH 456/461] Adding information about 6.4 cache refresh requirement --- CHANGELOG.md | 3 +++ README.md | 4 ++++ src/Rules.php | 15 +++++++++++---- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12cf2a8f..b488d79c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,11 +7,14 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will ### Added - `DomainName::withRootLabel`, `DomainName::withoutRootLabel`, `DomainName::isAbsolute` methods to handle absolute domain names. +- `DomainName::when` to allow conditionable when building the domain. ### Fixed - Absolute domain name can now also be resolved by the package see issue [#361](https://github.com/jeremykendall/php-domain-parser/issues/361) prior to this release an exception was thrown. - Since we no longer support PHP7 type hint and return type are improved. +- Resolving private suffixes that have a wildcarded subdomain suffix [#363](https://github.com/jeremykendall/php-domain-parser/issues/363) by [@wikando-ck](https://github.com/wikando-ck) + (Once downloaded and installed you MUST refresh your cache to enable the fix to work.) ### Deprecated diff --git a/README.md b/README.md index 9a5fb53b..96d3519e 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,10 @@ a polyfill for the `intl` IDN functions like the `symfony/polyfill-intl-idn` otherwise an exception will be thrown when attempting to validate or interact with such a host. +> [!WARNING] +> When upgrading to version `6.4` you MUST refresh your local cache for the fix on +> private domain resolution to take effect. + ## Usage > [!WARNING] diff --git a/src/Rules.php b/src/Rules.php index 331df48c..f91cd084 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -273,13 +273,20 @@ private function getPublicSuffixLengthFromSection(DomainName $domain, string $se //no match found if (!array_key_exists($label, $rules)) { - // Suffix MUST be fully matched else no suffix is found for private domain - if (self::PRIVATE_DOMAINS === $section && array_key_exists(self::DOMAIN_RULE_MARKER, $rules)) { + if (self::PRIVATE_DOMAINS !== $section) { + break; + } + + // Suffix MATCHES default domain + if (array_key_exists(self::DOMAIN_RULE_MARKER, $rules)) { return $labelCount; } - if (self::PRIVATE_DOMAINS === $section && self::hasRemainingRules($rules)) { - $labelCount = 0; + + // Suffix MUST be fully matched else no suffix is found for private domain + if (self::hasRemainingRules($rules)) { + return 0; } + break; } From 548e1c854ee61da692c158fd8920caf1bd04e136 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 24 Apr 2025 21:08:17 +0200 Subject: [PATCH 457/461] Update changelog and prepare release --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b488d79c..64b25eec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will be documented in this file -## [6.4.0] - 2025-04-22 +## [6.4.0] - 2025-04-24 ### Added @@ -412,6 +412,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - `Pdp\HttpAdapter\HttpAdapterInterface` interface replaced by the `Pdp\HttpClient` interface - `Pdp\HttpAdapter\CurlHttpAdapter` class replaced by the `Pdp\CurlHttpClient` class +[6.4.0]: https://github.com/jeremykendall/php-domain-parser/compare/6.3.0...6.4.0 [6.3.0]: https://github.com/jeremykendall/php-domain-parser/compare/6.2.0...6.3.0 [6.2.0]: https://github.com/jeremykendall/php-domain-parser/compare/6.1.2...6.2.0 [6.1.2]: https://github.com/jeremykendall/php-domain-parser/compare/6.1.1...6.1.2 From 55246c1fe7f1e3493862aa5511fbd20fa42f9971 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Thu, 24 Apr 2025 21:26:10 +0200 Subject: [PATCH 458/461] Improve codebase --- src/Rules.php | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/Rules.php b/src/Rules.php index f91cd084..a9548449 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -20,9 +20,7 @@ final class Rules implements PublicSuffixList private const ICANN_DOMAINS = 'ICANN_DOMAINS'; private const PRIVATE_DOMAINS = 'PRIVATE_DOMAINS'; private const UNKNOWN_DOMAINS = 'UNKNOWN_DOMAINS'; - private const DOMAIN_RULE_MARKER = '?'; - private const REGEX_PSL_SECTION = ',^// ===(?BEGIN|END) (?ICANN|PRIVATE) DOMAINS===,'; private const PSL_SECTION = [ 'ICANN' => [ @@ -106,8 +104,7 @@ private static function getSection(string $section, string $line): string * This method is based heavily on the code found in generateEffectiveTLDs.php * * @see https://github.com/usrflo/registered-domain-libs/blob/master/generateEffectiveTLDs.php - * A copy of the Apache License, Version 2.0, is provided with this - * distribution + * A copy of the Apache License, Version 2.0, is provided with this distribution * * @param array $list Initially an empty array, this eventually becomes the array representation of a * Public Suffix List section @@ -141,14 +138,13 @@ private static function addRule(array $list, array $ruleParts): array if (isset($list[$rule]) && [] === $list[$rule]) { $list[$rule] = [self::DOMAIN_RULE_MARKER => '']; } + if (!isset($list[$rule])) { $list[$rule] = $isDomain ? [] : ['!' => '']; } if ($isDomain && [] !== $ruleParts) { - /** @var array $tmpList */ - $tmpList = $list[$rule]; - $list[$rule] = self::addRule($tmpList, $ruleParts); + $list[$rule] = self::addRule($list[$rule], $ruleParts); } return $list; From 9b344cf39488fdbe6cf713caad5d4dd4ff4e695f Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Fri, 25 Apr 2025 12:22:30 +0200 Subject: [PATCH 459/461] Improve Rules::getPublicSuffixLengthFromSection codebase with early return --- CHANGELOG.md | 2 ++ src/Rules.php | 9 +++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64b25eec..1068eb57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - `DomainName::withRootLabel`, `DomainName::withoutRootLabel`, `DomainName::isAbsolute` methods to handle absolute domain names. - `DomainName::when` to allow conditionable when building the domain. +- `Rules` can now be serialize and unserialize. +- `TopLevelDomains` can now be serialize and unserialize. ### Fixed diff --git a/src/Rules.php b/src/Rules.php index a9548449..edee031a 100644 --- a/src/Rules.php +++ b/src/Rules.php @@ -258,19 +258,20 @@ private function getPublicSuffixLengthFromSection(DomainName $domain, string $se foreach ($domain->toAscii() as $label) { //match exception rule if (isset($rules[$label]['!'])) { - break; + return $labelCount; } //match wildcard rule if (array_key_exists('*', $rules)) { ++$labelCount; - break; + + return $labelCount; } //no match found if (!array_key_exists($label, $rules)) { if (self::PRIVATE_DOMAINS !== $section) { - break; + return $labelCount; } // Suffix MATCHES default domain @@ -283,7 +284,7 @@ private function getPublicSuffixLengthFromSection(DomainName $domain, string $se return 0; } - break; + return $labelCount; } ++$labelCount; From d93d26400aefe4d56a4169abe97212a80684f894 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sat, 26 Apr 2025 13:15:15 +0200 Subject: [PATCH 460/461] prepare 6.4.0 release --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1068eb57..044e9c4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will be documented in this file -## [6.4.0] - 2025-04-24 +## [6.4.0] - 2025-04-26 ### Added From e07be63a9e647efa0e4e79a5d5a944e8ae841bf4 Mon Sep 17 00:00:00 2001 From: ignace nyamagana butera Date: Sat, 26 Apr 2025 13:15:51 +0200 Subject: [PATCH 461/461] prepare 6.4.0 release --- CHANGELOG.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 044e9c4a..50dc06fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,8 +8,6 @@ All Notable changes to `PHP Domain Parser` starting from the **5.x** series will - `DomainName::withRootLabel`, `DomainName::withoutRootLabel`, `DomainName::isAbsolute` methods to handle absolute domain names. - `DomainName::when` to allow conditionable when building the domain. -- `Rules` can now be serialize and unserialize. -- `TopLevelDomains` can now be serialize and unserialize. ### Fixed